本文主要是介绍No.171-HackTheBox-Linux-Rope-Walkthrough渗透学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
**
HackTheBox-Linux-Rope-Walkthrough
**
¬
靶机地址:https://www.hackthebox.eu/home/machines/profile/200
靶机难度:疯狂(5.0/10)
靶机发布日期:2020年3月1日
靶机描述:
Rope is an insane difficulty Linux machine covering different aspects of binary exploitation. The
web server can be exploited to gain access to the file system and download the binary. The
binary is found to be vulnerable to format string exploitation, which is leveraged to get remote
code execution. After gaining foothold, the user is found to have access to a shared library, which
can be modified to execute code as another user. A service running on localhost can be exploited
via a ROP (Return Oriented Programming) attack to gain a root shell.
作者:大余
时间:2020-07-23
请注意:对于所有这些计算机,我是通过平台授权允许情况进行渗透的。我将使用Kali Linux作为解决该HTB的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,我概不负责。
一、信息收集
可以看到靶机的IP是10.10.10.147…
我这里利用Masscan快速的扫描出了22,9999端口,在利用nmap详细的扫描了两个端口情况…看图即可
脚本循环运行,并在httpserver二进制文件崩溃或退出时执行。 让我们
下载二进制文件并进行分析。
32位的elf…
NX开启,目前受保护状态…
NX位是:CPU中使用的一项技术,可确保某些内存区域(例如堆栈和堆)无法执行,而其他部分(例如一段代码)无法写入,这样可以防止我们将shellcode写入堆栈并执行它…
简单的测试,存在/的输出,和字符串有关系?
木有IDA,mac最新版系统没法安装IDA,只能用ghidra进行逆向分析了…
直接查看main,发现了其中的规律…
从main开始,还在底部看到一个输出accept…
初始设置后,二进制文件调用open_listenfd绑定到所需的端口(local)并启动监听请求,然后它打印一些信息,然后放入循环中,直到发出请求为止,最后通过accept()收到…
收到请求后,输入文件描述符local_12c传递给process()函数以及sockaddr结构,二进制文件调用fork()生成一个子进程,然后其余的执行继续在新产生的过程中,然后调用parse_request(),该文件将文件路径返回到local_xx缓冲区,进行open()syscall来访问文件并检查文件是否存在…
查看log_access,保留了sockaddr结构中的主机地址,并且调用printf()来打印日志。 第一个printf打印状态码和地址,第二个printf不使用%s格式字符串直接打印请求的文件,这里在二进制文件中就引发了格式字符串漏洞,会导致任意读取和写入访问…
这就是攻入点…
知道了格式字符串漏洞后,通过测试,从堆栈读取数据…
知道了41414141(AAAA)和42424242(BBBB)的偏移分别为53和54…(0x41414141-AAAA)
知道了控制内存地址的偏移量以及由写入的字节数printf,我们可以使用pwntools fmtstr_payload 生成格式字符串有效负载…写入EXP即可…
最后,程序加载的地址和程序使用的库…
有了565ad000和f7dac000,可以利用它来执行libc库的路径…
最后根据分析,我在EXP创建了一个命令,该命令将一些base64回显到中base64 -d中,可看到执行后的shell以base64进行写入执行…获得了反向外壳…
继续查看用户的sudo特权,发现可以以r4j用户身份运行readlogs…
这里不太稳定,直接利用ssh输入key,直接登录更放心稳定…
二进制文件在执行时打印出/var/log/auth.log的内容…
执行中查看下liblogs状态…
可以看到具有写入权限…写入个shell,他会自动带liblogs执行直接就能获得外壳了…GO
简单的gcc编写的shell(不陌生了),然后gcc编译后,通过ssh的scp上传覆盖即可…
然后执行该程序,获得了r4j用户权限…读取到了user_flag信息…
这真是太难了…
不多说,直接ssh-key继续利用ssh登录r4j用户…方便后面渗透…
由于该靶机就是二进制提权的靶机,我继续ps aux直接查看了所有root权限执行的程序…
发现了contact可以分析…开始吧
可看到靶机本地还开放了1337端口…
将文件下载下来后…开始检查…
Checksec显示所有保护机制均已启用…
这里堆栈金丝雀和PIE绝对是大麻烦…都开启了保护机制…
后面不得不绕过这两个保护机制来利用二进制文件提权…了解下
这就是金丝雀…百度百科…google也很多解释,自己查吧
下面思路就是,查找并溢出缓冲区位置,然后找到金丝雀的可利用处进行利用…
由于PIE已激活,需要找到有效的偏移量…这是最难点…就是查找内存泄漏以计算加载库的地址…
最后构建一个ROP植入shell…
IDA打算晚点windows虚拟机装…
目前没有IDA,只能勉强用Ghidra神器进行逆向分析…
可以看到最重要的点是FUN_0010140e,双击查看下该进程的怎么执行的…
这里包含我们在启动二进制文件时看到的printf,此功能很可能是主要功能…
它在端口1337上设置侦听器(0x539)…
该forkProcess()函数创建一个子进程以与客户端进行交互…
函数FUN_001014ee收到连接后立即用fd进行调用…
FUN_001014ee是处理功能,该函数执行fork()并生成一个子进程,然后使用write()函数
向客户端发送提示,然后调用另一个函数…
流程函数创建一个子流程来处理请求,这是有好处的,因为堆栈金丝雀对于子进程不会更改,程序中似乎存在实际的编程错误,可看到它不打印PID,而是调用getuid()并打印用户ID,然后通过多次连接到实例…
通过测试可看到显著的效果…
pid始终为0(进程由root运行,因此uid为0),fd为4(稍后将对此进行介绍)…
FUN_0010159a:此函数调用recv()函数并从客户端读取0x400,即128个字节,此输入被写入local_48缓冲区,该缓冲区的长度为56个字节…
如果输入发送的长度大于56会导致缓冲区溢出…但是由于以下原因,无法直接利用此溢出:
堆栈金丝雀的存在,堆栈金丝雀是一个包含8个随机字节的值,它位于在堆栈底部上方。 在该功能存在之前,将存储此值后并检查是否有更改…(重要)金丝雀的任何更改都将导致异常并退出流程…
recv_data()函数从用户接收多达1024(0x400)个字节,并将其写入56字节大缓冲区中,这是此二进制文件的攻击媒介,可以从这儿入手…
在开始利用漏洞之前,让我们下载使用的libc文件…以在本地运行拿权更方便…省的还要镜像1337过来网络不稳定…
https://made0x78.com/bseries-defeat-stack-cookies/
这张图很好解释了接下来的事情,利用蛮力逐字节堆栈金丝雀的原理在本文中有很好的解释…
基本思想是我们一次将堆栈中的值覆盖一个字节,如果我们得到完成的消息,知道被覆盖的值没有更改,并且我们有一个正确的字节,然后可以转到下一个字节,依此类推…
可以参考文章里的思路,但是EXP得自己编写…这里我就不多介绍了,都是无限测试中…
这里坚信只有自己知道,这里一定要libc.so文件下载到本地,先从本地跑测试,本地能拿shell了,在直接进行靶机即可…省很多时间…每次找金丝雀裂缝点,都要10多20分钟…
可看到获得了root权限和flag…
我还进一步的利用ssh,登录了root,稳定的外壳…然后进行了各种信息收集枚举…
这是个简单的系统…只有二进制漏洞可以利用,没有别的地方可以提权了…
好难,这是深入版的缓冲区溢出吗?花了我两三天时间…学到很多东西…需要继续脑补下代码审计写EXP的功率,和栈堆二进制的一些理论原理…
加油加油!!
最后我会在每篇NO文章后面注明,我不会在每个图片下面附上命令了,我没有心情像NO1~50一样去详细解释每个知识点了,望理解。
由于我们已经成功得到root权限查看user和root.txt,因此完成这台疯狂的靶机,希望你们喜欢这台机器,请继续关注大余后期会有更多具有挑战性的机器,一起练习学习。
如果你有其他的方法,欢迎留言。要是有写错了的地方,请你一定要告诉我。要是你觉得这篇博客写的还不错,欢迎分享给身边的人。
这篇关于No.171-HackTheBox-Linux-Rope-Walkthrough渗透学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!