目录
写在开头
第一步:主机发现与端口扫描
第二步:SQL注入登录界面
第三步:文件包含+SQL注入实现越权/直接越权
第四步:文件上传、文件解析漏洞利用
第五步:提权
写在最后
本篇博客根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本文的打靶过程涉及到关于SQL注入、POST型文件包含漏洞利用、越权漏洞、sudo权限利用提权等。完整打靶思路详见:「红队笔记」靶机精讲:Holynix - 巧用SQL注入,不用大杀器;手动拦截,让Burp Suite下岗。_哔哩哔哩_bilibili
本文针对的靶机源于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注入、目录枚举等。
只开了80端口,那就浏览器访问靶机ip,结果就是一个简单的界面,有home和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文件。
先去寻找文件包含,注意观察各个页面的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更名后的指令即可提权。
靶机不难,总结不易,希望读者能够点赞关注多多支持!