【网络安全】brainpan-windows 缓冲区溢出详解
简介
渗透测试注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用 Kali Linux 作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
一、前言
缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。
项目十七:brainpan-1,专门考验缓冲区溢出知识,该项目仅仅开放了 10000 端口作为 web 端,经过简单的目录爆破就能发现存在 brainpan.exe 文件,该项目是乌班图环境并且安装了 win 的模块运行着 exe 文件,该文件启动了 9999 端口支撑服务,该环境就和 AWD 中的 PWN 题目一样,直播教学会有多种方法详细解释如何理解缓冲区溢出,如何发现缓冲区溢出,遇到缓冲区溢出如何利用,栈是什么等等问题详解。
接下来我分享其中方法一,欢迎大佬们指点。
测试是否存在缓冲区溢出:

【一>所有资源获取<一】1、网络安全学习路线 2、电子书籍(白帽子)3、安全大厂内部视频 4、100 份 src 文档 5、常见安全面试题 6、ctf 大赛经典题目解析 7、全套工具包 8、应急响应笔记
通过对程序发送 1~1500 位不等字符进行验证,提示程序崩溃,存在缓冲区溢出!
二、windows 缓冲区溢出
1、windows 10 打开 Immunity Debugger
Immunity Debugger-漏洞分析专用调试器,没有的百度到处是下载地址!
Immunity Debugger 安装参考:
开始利用操作:然后点击:File-C:/....程序

运行出数据后的界面:

该界面是最初始的程序开启界面,需要点击右箭头图标才可运行程序:


开启完程序后,EAX 值会清零,这时候本地程序会正常运行,并开启 9999 端口!
2、查询偏移量
1)利用 pattern_create.rb 生成 1000 位随机数值

2)修改脚本 brainpan1

3)发送 1000 位随机去覆盖程序

在 kali 执行对 44 的 windows9999 服务进行冲击。

可看到 ESP 已经被覆盖,得出 EIP 的值:35724134
4)EIP 查看偏移量

偏移量 524!
5)解析下如何得到的
首先要知道内存地址和平常书写地址是相反的,内存会把内存低地址放在高位,内存高地址放在低位,所以排列顺序是:
对比 ASCII 表:

对照 ASCII 表信息是:4Ar#

所以对照的就是 pattern_create.rb 生成的 1000 字符中 524 位的地方存在溢出,pattern_offset.rb 会自动计算在 1000 个字符中 4Ar5 位置在哪儿!
3、查看 shellcode 空间大小
思路:将 EIP 修改为 shellcode 代码的内存地址,将 shellcode 写入到该地址空间,程序读取 EIP 寄存器数值,将跳转到 shellcode 代码段并执行,接下来将寻找可存放 shellcode 的内存空间是多少!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bn73RK2F-1647250101863)(https://upload-images.jianshu.io/upload_images/26598771-fca1afbbb1f0031a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
这里将放入 472 个字节 C 去测试!


EBP 栈底指针已经被 524 个 A 覆盖,EIP 已经指出四个 B,ESP 已经覆盖了 472 个 C 字节。
在 ESP 位置右键选择:Follow in Dump

在左下视图右键选择:Hex-Hex/ASCII(16 bytes)

选择十六个字节一行显示去观察!

可看到起始位:005ff910,结束位:005FFAE0

1D0 是十六进制,转换十进制:

最少的 shellcode 需要 300 字节,现在寄存器的大小是 464,足以存放一个 shellcode!
4、查找坏字符
不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途:
思路:发送 0x00--0xff 256 个字符,查找所有坏字符例如:计算机都用 ASCII 编码不同的编码都表示不同的字符,一个字符一个字节 00000000---11111111=256 有 256 种可能的字符情况
接下来查看坏字符,重新运行程序:brainpan2



或者是查看:右键选择 Follow in Dump



可看到选择 16 字节显示后,最右边都是 1~9~F 说明没有坏字符!

对比发现除了 00 外,其余都很正常!接下来要找到跳转到 ESP 的指令指针寄存器的值!
5、漏洞利用开发
重定向数据流:
变通思路:

SafeSEH、ASLR、NXCompat 都是内存保护机制所保护的模块!要选择 JMP ESP 一定要选择这三项都未 False 的,正好有一项符合!

现在进入该模块去查找有没有 jmp esp 的命令!brainpan.exe0BADF00D
查找 JMP ESP:利用 nasm_shell.rb 查看 jmp esp 的地址!
可看到 jmp esp 地址:\xff\xe4
首先我们需要找到 EIP offset,也就是正好覆盖到 EIP 的偏移量以便我们精准的覆盖 EIP 寄存器。所以我们要知道哪 4 个 a 是放入到了 EIP 寄存器中,这就很复杂了,当然方法是有的,这里我们使用 Immunity Debugger 的插件 mona,这样我们就避免了平常复杂的寻找方法。
安装 mona:

将 mona.py 放在 Immunity Debugger 安装目录 PyCommands 下就行了!



获得 JMP ESP 地址:0x311712f3
shellcode 生成:

生成 shellcode 后进行脚本编写!
brainpan4:
将 shellcode 防止对端!
windows10 开启 brainpan.exe:

kali 运行脚本:

成功缓冲区溢出,获得反弹 shell:[图片上传中...(image.png-6a1393-1647249930375-0)]
这时候要反弹 linux 的 shellcode:brainpan5
然后替换脚本 shellcode:
替换后进行执行:
MSF 成功获得反弹 shell!
三、总结
今天学到 windows 缓冲区溢出中 windows 10 使用 Immunity Debugger 逆向分析工具,熟悉栈如何查找栈空间,如何查看坏字符,如何编写 EXP 利用等等操作,最后远程代码执行控制服务器等操作,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!来巩固告知企业单位的漏洞情况,并尽快进行加固巩固安全!
希望大家提高安全意识,没有网络安全就没有国家安全!
今天基础牢固就到这里,虽然基础,但是必须牢记于心。
评论