红队打靶:holynix打靶思路详解(vulnhub)

目录

写在开头

第一步:主机发现与端口扫描

第二步:SQL注入登录界面

第三步:文件包含+SQL注入实现越权/直接越权

第四步:文件上传、文件解析漏洞利用

第五步:提权

写在最后

写在开头

 本篇博客根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本文的打靶过程涉及到关于SQL注入、POST型文件包含漏洞利用、越权漏洞、sudo权限利用提权等。完整打靶思路详见:「红队笔记」靶机精讲:Holynix - 巧用SQL注入,不用大杀器;手动拦截,让Burp Suite下岗。_哔哩哔哩_bilibili

 本文针对的靶机源于vulnhub,详情见:

 Holynix: v1 ~ VulnHub

 靶机下载链接见:

https://download.vulnhub.com/holynix/holynix-v1.tar.bz2

下载成功后用vmware打开,跳出提示框请选择“我已移动该虚拟机”,然后设置为NAT模式,否则无法扫描到靶机!

 靶机启动后的界面如下:

 第一步:主机发现与端口扫描

依旧是常规思路,本文不再详细解释。有关主机发现和端口扫描的命令详见我的这篇博客中关于nmap的部分:

渗透测试:主机发现和端口扫描的思路方法总结(nmap+ping命令+nc.traditional+伪设备连接)

nmap -sn 10.10.10.0/24
nmap --min-rate 10000 -p- 10.10.10.131 
nmap -sT -sV -O -p80 10.10.10.131
nmap -sU --min-rate 10000 -p- 10.10.10.131 
nmap --script=vuln -p80 10.10.10.131

 扫出来我的靶机ip是10.10.10.131 ,开放的端口只有Web的80端口

 漏洞扫描发现了有关SQL注入、目录枚举、csrf、dos等漏洞,我们重点关注SQL注入、目录枚举等。

第二步:SQL注入登录界面

只开了80端口,那就浏览器访问靶机ip,结果就是一个简单的界面,有home和login两个界面:

 点击左侧Login跳转至登录界面:

 遇到登录框,常规思路:弱口令/默认口令/SQL注入/CMS漏洞利用/敏感信息寻找/字典爆破。这个看起来也不是cms,像是程序员自己搭建的网站,试试SQL注入吧,先把用户名和密码都输入单引号'试试

 点击Submit之后直接报错了,而且暴露了sql查询语句,可以看到这个sql查询语句对username字段的单引号进行了转义(\'),而password部分没有。因此我们只要username随便输,password用万能密码即可登录:

' or 1=1 #

 登录成功,进来之后有提示语,说着应该是alamo的用户:

 左侧有一系列栏目可以尝试,首先点击Directory,如下:

 是一大堆人的个人信息,注意观察url中存在参数page= ,我们可以尝试文件包含,企图读取/etc/passwd

 读取失败了,出现了一堆报错,先无视这些,继续在左边的栏目看看有没有可以代码执行或文件上传的地方。最后在Upload模块发现可以上传文件:

 随便上传个文件试试:

 提示:对于用户alamo来说,家目录上传是不被允许的。这句话暴露了两点信息,第一,文件上传之后的上传位置可能是用户的家目录,也就是/home/alamo,第二,alamo的权限不够,需要寻找更加高权限的用户。如何以更高权限的用户登录呢?我们可以试图找到存在其他用户的用户名,然后通过SQL注入登录进其他用户的账号。那么如何找到其他用户的用户名呢?可以通过寻找文件包含漏洞,读取/etc/passwd文件。

第三步:文件包含+SQL注入实现越权/直接越权

先去寻找文件包含,注意观察各个页面的url,发现只有参数page,这个我们也简单尝试过了。既然url中暴露的参数我们无法利用,不妨找找是否存在POST型的参数,即存在文件包含漏洞的参数有可能存在于请求体中。那么重点关注的页面应该就是可以提交信息的页面,比如Security界面:

 上图这个界面的下拉选项可以选择一些文本信息。很可能选择一项之后,点击Display File就会向后台发送请求,请求体中含有参数,参数的值就是下图中的这些选项(/Email/Acceptable Use/Internet Use等)这里当然可以用burpsuite抓个包看看。

 不过桀骜不羁的红队笔记大佬不想用图形化工具。那么我们也可以通过按F12查看网页源代码中元素的方式查看这个提交的参数:

 这里可以在源代码中看到,通过参数text_file_name的值的改变,实现不同的Display File,比如如果这里我们选择Email后点击Display File,发送的请求包的请求体中就含有text_file_name=ssp/email.txt,那么如果我们修改前端代码,把ssp/email.txt换成我们想读取的/etc/passwd,如果text_file_name这个参数存在文件包含漏洞的话,我们应该就能读取/etc/passwd了,试一试:

 如上图,果然存在文件包含漏洞,nice!那么我们可以根据/etc/passwd这个文件看看有啥其他有bash的账户,可以发现有个用户叫etenenbaum,那么我们尝试SQL注入用这个用户登录,看看他的权限咋样(尝试读取/etc/shadow文件失败)。点击左下角的Logout退出回过头来分析如何注入。在我们最开始尝试输入单引号注入的时候,报错回显了select查询语句:

SELECT * FROM accounts WHERE username='\'' AND password='''

 对username中的单引号做了过滤,我们尝试在password中构造闭合,试图使得username='etenenbaum',那么我们只要密码中填写如下的信息即可构造闭合:

' or username='etenenbaum' #

 这样的话,如果用户名随便输个aaa,password输入' or username='etenenbaum' #,则查询语句就是:

SELECT * FROM accounts WHERE username='aaa' AND password='' or username='etenenbaum' #'

 逻辑就是(假and假)or真 = 真,果然成功登录了etenebaum的账户:

不过这里还有另外一种方法实现登录其他账号,回到用户alamo,任意界面F12查看存储信息,可以发现在Cookies中存在一条信息,name为uid,Value为1,看起来好像和用户的id相关,说不定1对应用户alamo,2对应其他用户呢。

 那么我们把Value的位置修改为2,点击刷新,试试能否越权。发现成功了!看来cookie中存在越权漏洞

第四步:文件上传、文件解析漏洞利用

下面就是尝试这个用户有没有上传权限了,随便上传个文件helloworld,不勾选下面的Enable the automatic extraction of gzip archives.发现可以:

 看来etenenbaum这个用户的权限可以上传文件,那我们试图上传php的反弹shell文件,先构造shell。可以手动写,这回我们直接在kali中搜索并复制到当前目录

locate php-reverse
cp /usr/share/laudanum/php/php-reverse-shell.php .

 然后我们vim这个文件,修改反弹shell的ip和端口,ip设置为kali的ip,端口设置为1234:

 然后尝试上传文件php-reverse-shell,发现可以: 

 紧接着在etenenbaum的家目录http://10.10.10.131/~etenenbaum/寻找这个文件:

 非常完美,这个路径已经找到了。那么我们只要在kali中启动一个nc监听1234端口即可:

nc -lvnp 1234

 然后我很兴奋的点击php-reverse-shell,企图触发反弹shell的代码执行:

 结果权限尽然不够!无法触发代码执行!高兴的太早了。那么回到文件上传的页面,我们勾选下面的Enable the automatic extraction of gzip archives.这回上传个gzip文件试试,先把这个php反弹shell文件打包为gzip:

 点击提交后,回到家目录,再次发现这个.gz压缩文件并没有被解压:

 点击之后还是没有权限:

 此时貌似是陷入了僵局,此时可以尝试继续越权寻找权限更高的账号。但根据红队笔记大佬的思路提示,刚刚上传的gz文件理应解压自动解压才对,因为Enable the automatic extraction of gzip archives.的意思是自动从gzip压缩文件中提取出源文件。然而实际情况我们在http://10.10.10.131/~etenenbaum/路径下却并没有看到gz文件被解压缩,这有点奇怪。而进行文件上传的时候,上传成功的页面我们可以看到url的参数page=transfer.php:

 可能是transfer.php这个文件的逻辑有点问题,我们可以通过刚刚的text_file_name参数的文件包含漏洞,读取这个文件:
 

 看来进行压缩包转换的背后逻辑是用tar xzf解压,那么我们可以用tar czf打包文件,再进行上传:

tar czf shell.tar.gz php-reverse-shell.php 

 然后我们上传这个shell.tar.gz文件试试,看看后台能否自动提取其中的文件:

  见鬼了,尽然没有自动提取,依旧是打包文件

 后来我想起来,我忘了勾选Enable the automatic extraction of gzip archives.了,这回别忘了把这个选项勾选上,重新上传一个myshell.tar.gz文件:

 好像没有看到新的文件,不过有可能是后台已经从myshell.tar.gz中解压出了php-reverse-shell.php,并覆盖了之前的文件,因此我们这次再点击php-reverse-shell.php试试,看看能不能触发代码执行。

 回看nc监听的端口,成功拿到了反弹shell!

 一番垃圾操作下来,我感觉自己是小丑,读者操作的时候一定要注意命名的不同,防止混淆。

第五步:提权

先看看自己是谁,是www-data

 然后用python提高交互性:

python -c "import pty;pty.spawn('/bin/bash')"

 然后查看当前权限:

sudo -l

 可知,我们可以免密用sudo执行chown chgrp tar mv这几个命令。那么结合mv可以给文件改名的特点,我们只要选择chown chgrp tar三个指令中的任意一个(这里以tar为例)改名为其他名字(tar.orgi),然后再把用于提权的su命令改名为这三个中的一个(tar),然后运行sudo 指令(sudo tar)即可提权

sudo mv /bin/tar /bin/tar.orgi
sudo mv /bin/su /bin/tar
sudo tar

 运行sudo tar就相当于运行sudo su,因为su被我们改名成了tar,然后tar又可以被我们sudo免密运行,成功提权!如上图,至此打靶完成。

写在最后

这个靶机也感觉不算难,但发现POST型的文件包含参数还是需要进行深入理解,而且最后进行文件上传的时候,触发代码执行,上传合理的.tar.gz文件也是难点,必须勾选Enable the automatic extraction of gzip archives。在进行文件上传的时候,由于我命名的重复,导致了很多不必要的麻烦,读者以后每次进行文件上传漏洞测试的时候,最好保证上传的文件名不相同、如果上传的是压缩包,最好保证压缩前的文件的名字也不相同,这样进行重复上传时,就不会因为覆盖问题导致混淆。最后总结一下打靶过程:

1.主机发现和端口扫描

2.web渗透:SQL注入登录后台。得到账号alamo,但这个账户没有权限上传文件。

3.利用文件包含读取/etc/passwd,得到其他用户的用户名,再通过SQL注入重新登录其他账号,寻找有文件上传权限的账号。也可以F12通过修改cookie中的uid的值直接越权。

4.文件上传:直接上传反弹shell的文件,会发现路径没有权限访问,无法触发执行,最后通过勾选Enable the automatic extraction of gzip archives并上传.tar.gz的文件成功后台解压,最终访问路径后触发代码执行,反弹shell获得了初始www-data的shell。

5.提权:sudo -l查看权限,发现有mv指令的免密sudo权限,因此可以通过mv将提权指令su更名为其他任意的有sudo权限的指令即可。sudo运行su更名后的指令即可提权。

 靶机不难,总结不易,希望读者能够点赞关注多多支持!

猜你喜欢

转载自blog.csdn.net/Bossfrank/article/details/131503136