【Vulnhub】HarryPotter Fawkes(未完待续...)
【Vulnhub】HarryPotter:Fawkes
Description
Fawkes is the 3rd VM of 3-box HarryPotter VM series in which you need to find the last 3 horcruxes hidden inside the machine and defeat Voldemort.
信息收集
fscan 扫描内网目标 IP

确定目标 IP 为:192.168.1.2(这里 fscan 已经探测到 21端口 ftp 的文件了)
nmap 扫描目标全端口服务

发现开放了:21、22、80、2222、9898
dirsearch 扫描 80 端口 web 页面目录
没结果
尝试 21 端口 ftp 匿名登陆,尝试 账号/密码:anonymous/anonymous
直接登录上去了。。。

然后查看到目录里面有一个 server_hogwarts 文件
get 下来

直接执行发现没有权限

sudo chmod +x server_hogwarts
执行之后发现是一直处于执行状态的

那有可能目标使用这个可执行软件一直开启着某个服务
分别查看进程和端口开放
ps aux | grep server_hogwarts
netstat -tlnp | grep server

可以看到这个 473711 UID 的进程开放了 9898 端口,那不就说明该程序即为 9898 端口上运行的服务么
nc 连接 kali 本地 9898 端口
nc 127.0.0.1 9898

测试了一下,发现很符合缓冲区溢出漏洞的条件,输入不同的选择会有不同的反馈
使用 checksec 工具查看 server_hogwarts 文件开启了哪些保护机制

(这里讲明一下:checksec 用来检查可执行文件属性)
STACK_CANARY:在初始化堆栈时在栈底插入一个随机生成的 cookie,在函数返回前调用__stack_chk_fail检查 cookie 有没有发生变化,若发生变化则不返回,而直接终止程序。由于缓冲区溢出攻击时往往会覆盖掉 cookie 的值,故该保护机制开启时会导致常规的溢出攻击失效,程序会直接终止而不是跳转至攻击者注入的目标地址。NX:开启时栈中数据没有执行权限,即攻击者不能通过缓冲区溢出注入攻击代码;PIE:编译时将程序编译为位置无关, 即程序运行时各个段(如代码段等)加载的虚拟地址也是在装载时才确定,使程序的内存布局难以预料。
NX、PIE 关闭,我们可以尝试注入反弹 shell 的代码并使其被执行,从而获取反弹 shell。
STACK CANARY 被开启了,意味着注入时我们也许要针对其进行某种绕过,先不管它。
将 kali 上的 ALSR 安全机制关闭(注意使用root权限),该技术会导致地址空间随机化,不便于调试:
echo 0 > /proc/sys/kernel/randomize_va_space

使用 edb 对当前程序进行调试,探测注入点:
先 kali 安装
sudo apt-get install edb-debugger
sudo edb
点击 File -> Attach

输入 server,选择目标进程,点 OK

先直接使用 python 生成 500 个 A,复制粘贴到 nc 127.0.0.1 9898 的输入框里面(我这里随便打了一堆A)
python -c "print(500*'A')"

然后会看到,edb 触发报错提示 address 0x41414141 ,查看此时 EIP 寄存器的值:

发现变成了 0x41414141,而 '0x41' 为 'A' 的十六进制编码,说明我们输入的字符成功覆盖了函数返回地址,导致程序发生了错误跳转
[!IMPORTANT]
前面我们检查 server_hogwarts 文件的保护机制中
STACK CANARY是开启的,但是事实上,我们可以重新进行单步调试,会发现在调试追踪的过程中是没有调用__stack_chk_fail函数检查 cookie 的正确性。通过objdump查看其反汇编代码进一步确认,发现原来__stack_chk_fail只在一部分函数返回前被调用了,而在注入点所在的函数中未被调用,因此我们可以正常进行注入。因此,
Canary found仅代表程序中存在检查机制,而不一定在所有的ret语句前都做了检查。在进行渗透测试时应先尝试注入,不要被一些未验证的细节限制了思路。
这里先暂停一下,后面会重新创建环境再打一遍。。。中途电脑出了问题,靶机ip地址改变了之后,再次去尝试发现后面的结果很多都出现了偏差
使用 msf-pattern 工具进行溢出点在输入字符中位置的探测,生成 500 个特征字符串
msf-pattern_create -l 500

再次重复溢出操作(将生成的特征字符串填入),覆盖开始的便宜量。
edb 会弹出错误提示框,显示 EIP 的值
查找该段编码对应的字符串在模式字符串中的偏移量
msf-pattern_create -l 500 -q ********
结果显示 “Exact match at offset 112”
使用 python 生成一段自定义字符串进行验证:
python -c "print(112*'A' + 'BBBB' + 100*'c')"

浙公网安备 33010602011771号