首页 > 其他 > 详细

构建ROP链实现远程栈溢出

时间:2020-02-21 14:25:27      阅读:82      评论:0      收藏:0      [点我收藏+]

通常情况下栈溢出可能造成的后果有两种,一类是本地提权另一类则是远程执行任意命令,通常C/C++并没有提供智能化检查用户输入是否合法的功能,同时程序编写人员在编写代码时也很难始终检查栈是否会发生溢出,这就给恶意代码的溢出提供了的条件,利用溢出,攻击者可以控制程序的执行流,从而控制程序的执行过程并实施恶意行为,而微软的DEP保护机制则可使缓冲区溢出失效,不过利用ROP反导技术依然是可被绕过的,接下来将具体分析如何利用ROP技术绕过DEP保护机制。

课件下载地址:https://pan.baidu.com/s/1WwKp2GTVaCEQOLPUM49dUw 提取码:nk9h

缓冲区溢出的常用攻击方法是将恶意 shellcode 注入到远程服务的堆栈中,并利用 jmp esp 等跳板指令跳转到堆栈中执行恶意的代码片段,从而拿到目标主机的控制权。为了演示攻击的具体手法以及二进制漏洞挖掘的思路,这里作者编写了远程服务程序FTP Server该服务运行后会在本机开启 0.0.0.0:9999 端口,你可以通过nc命令远程连接到服务器并可以执行一些命令.

技术分享图片

如上图就是运行后的FTP服务器,通过nc工具链接服务端的地址nc 192.168.1.8 9999 可以得到一个FTP交互环境,此时可以执行send | hello world命令,来向服务器发送一段字符串,同时服务器会返回给你Data received successfully这样的提示信息,好了我们开始分析程序并挖掘漏洞吧。

模糊测试与分析

要执行模糊测试的第一步就是要确定发送数据包中包头的格式,这里我们可以使用Wireshark工具监控TCP流并且源地址是192.168.1.2目标地址是192.168.1.8之间的传输数据,从中得到数据传输的格式信息过滤语句 tcp.stream and ip.src_host==192.168.1.2 and ip.dst_host==192.168.1.8 该语句可以精确的过滤出我们所需要的数据。

技术分享图片

上图中我们可以直观的看出,数据包的格式仅仅是 send | hello lyshark 并没有添加任何的特殊符号,更没有加密传输,接下来就是要验证send函数是否存在缓冲区溢出了,这里我们需要编写一个模糊测试脚本来对目标服务进行测试,脚本内容如下,Python 脚本执行后会对目标FTP服务进行发包测试。

# coding:utf-8
import socket,time

def initCount(count,Inc):
    buffer = ["A"]
    while len(buffer)<=50:
        buffer.append("A" * count)
        count = count + Inc
    return buffer

def Fuzz(addr,port,buffer):
    try:
        for string in buffer:
            sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            connect = sock.connect((addr,port))
            sock.recv(1024)
            command = b'send |/.:/' + string.encode()
            sock.send(command)
            sock.close()
            time.sleep(1)
            print('Fuzzing Pass with {} bytes'.format(len(string)))
    except Exception:
        print('\n This buffer cannot exceed the maximum {} bytes'.format(len(string)))

if __name__ == "__main__":
    # initCount 10 说明从0开始递增,每次递增100
    buff = initCount(0,100)
    Fuzz("192.168.1.8",9999,buff)

上方的代码的构造需要具体分析数据包的形式得到,在漏洞模糊测试中上方代码中间部分的交互需要根据不同程序的交互方式进行修改与调整,这里测试脚本执行后当缓冲区填充为2200bytes时程序崩溃了,说明该程序的send函数确实存在缓冲区溢出漏洞,其次该程序缓冲区的大小应在2200字节以内。

技术分享图片

控制EIP寄存器

构建漏洞利用代码

ROP技术绕过DEP保护

将脚本集成到Metasploit

原创作品,转载请注明出处!

构建ROP链实现远程栈溢出

原文:https://www.cnblogs.com/LyShark/p/12340479.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!