最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

利用MS-SAMR協(xié)議修改/重置用戶密碼

2021-08-24 17:17 作者:北京中安網(wǎng)星  | 我要投稿

本文為Windows RPC利用系列文章的第一篇,主要介紹關(guān)于MS-SAMR的部分利用,在后續(xù)的文章中將繼續(xù)介紹RPC在滲透測(cè)試中的應(yīng)用

作者: Loong716@Amulab

在滲透測(cè)試過(guò)程中,經(jīng)常遇到拿到用戶的NTLM哈希但無(wú)法解密出明文密碼的情況。本文介紹并分析一種在僅知道域用戶密碼哈希時(shí)修改用戶密碼,并在使用完后恢復(fù)用戶原密碼的方法。完成相應(yīng)工具實(shí)現(xiàn),提出檢測(cè)方法和緩解措施。

PS:本文提出的場(chǎng)景在實(shí)戰(zhàn)中也有很多其他的解決辦法,但本文僅討論與changentlm、setntlm相關(guān)的內(nèi)容

0x00 利用

考慮以下幾個(gè)場(chǎng)景:

  1. 我們拿下域控后,經(jīng)常要搜集目標(biāo)架構(gòu)內(nèi)用戶的各種信息來(lái)尋找靶標(biāo),比如登錄郵箱服務(wù)器、OA、NAS等可能使用域身份認(rèn)證的系統(tǒng)

  2. 我們收集的攻擊路徑中的其中一環(huán)是利用某賬戶重置/修改目標(biāo)賬戶密碼

  3. 我們拿到某用戶hash后,同樣想通過(guò)該用戶賬戶登錄某系統(tǒng),但目標(biāo)系統(tǒng)不支持pth

我們雖然拿到了修改/重置密碼的權(quán)限,但我們又不想直接修改目標(biāo)用戶的密碼,因?yàn)檫@樣用戶在登錄時(shí)就會(huì)發(fā)現(xiàn)自己的密碼被修改了,此時(shí)有兩種情況:

  1. 如果我們有重置密碼權(quán)限就可以使用來(lái)將用戶密碼重置

  2. 如果有hash的話可以使用修改

登錄目標(biāo)系統(tǒng)后,再將目標(biāo)密碼還原

1. SetNTLM

該功能的效果是直接將域用戶的密碼或hash重置為新的密碼或hash

(1) 利用條件

當(dāng)前身份對(duì)要修改的用戶有權(quán)限

(2) Demo

假設(shè)我們此時(shí)拿到域控,想修改域內(nèi)用戶的密碼來(lái)登錄某系統(tǒng),先Dcsync看一下用戶當(dāng)前的hash:

由于我們是域管了,基本上對(duì)目標(biāo)用戶都是有重置密碼權(quán)限的,然后利用以下命令重置密碼:

登錄目標(biāo)系統(tǒng)以后,再通過(guò)以下命令還原密碼:

2. ChangeNTLM

(1) 利用條件

需要對(duì)目標(biāo)用戶有權(quán)限,但該權(quán)限一般是擁有的,所以基本上拿到目標(biāo)用戶的hash/密碼后都可以進(jìn)行密碼更改

(注意此處的更改密碼權(quán)限并不是說(shuō)可以直接任意改用戶密碼,而是在知道用戶的密碼的情況下更改一個(gè)新密碼)

該方法受到域內(nèi)密碼策略的限制,比如域內(nèi)默認(rèn)的“密碼最短使用期限”為1天,因此用戶每天只能修改一次自己的密碼

而且如果域內(nèi)存在“強(qiáng)制密碼歷史”規(guī)則時(shí),該方法在恢復(fù)原密碼時(shí)便不能成功,但如果沒(méi)有“密碼最短使用期限”的限制的話,我們多修改幾次密碼直到原密碼在歷史中清除,然后再修改為原密碼即可

(2) Demo

修改用戶test2密碼:

恢復(fù)原密碼:

?

0x01 原理

ChangeNTLM和SetNTLM的原理本質(zhì)都是調(diào)用MS-SAMR協(xié)議

不同的是ChangeNTLM是調(diào)用這一API來(lái)修改用戶密碼:

而SetNTLM是通過(guò)來(lái)重置用戶密碼

大體過(guò)程是差不多的,只不過(guò)核心操作調(diào)用API不同,這也是為什么兩種方法需要的參數(shù)、權(quán)限都不同,此處以分析ChangeNTLM為例

雖然原理本質(zhì)是通過(guò)調(diào)用RPC,但mimikatz并不是直接調(diào)用RPC來(lái)修改,而是使用了一組以開(kāi)頭的API,下圖所示為部分API:

Mimikatz – kuhl_m_lsadump.c#L2267

最終調(diào)用來(lái)修改用戶的密碼

Mimikatz – kuhl_m_lsadump.c#L2171

這些API由samlib.dll導(dǎo)出:

查看函數(shù)調(diào)用樹,可以看到調(diào)用了,是不是很熟悉?這明顯是進(jìn)行RPC調(diào)用的標(biāo)志(xpn在他的文章exploring-mimikatz-part-2里有提到過(guò))

我們?cè)倏匆幌抡{(diào)用處的反編譯代碼,參數(shù)剛好可以和的操作數(shù)對(duì)應(yīng)

其實(shí)從流量中也可以看出調(diào)用的是MS-SAMR協(xié)議:

?

0x02 實(shí)現(xiàn)

實(shí)現(xiàn)主要有兩種思路,一種是跟mimikatz一樣直接調(diào)用samlib.dll的導(dǎo)出函數(shù),第二種是直接調(diào)用SAMR協(xié)議的API

兩種方法原理一樣,但前者的調(diào)用要更加簡(jiǎn)單,因?yàn)閟amlib里的導(dǎo)出函數(shù)對(duì)應(yīng)了SAMR的API,其實(shí)相當(dāng)于SAMR的上層實(shí)現(xiàn),比如對(duì)應(yīng),并且參數(shù)更加簡(jiǎn)化

整個(gè)過(guò)程調(diào)用的API作用如下:

  • SamrConnect5: 獲取Server對(duì)象的句柄

  • SamrEnumerateDomainsInSamServer: 枚舉Server上的域名

  • SamrLookupDomainInSamServer: 獲取域名對(duì)應(yīng)域的SID

  • SamrOpenDomain: 獲取Domain對(duì)象的句柄

  • SamrLookupNamesInDomain: 獲取指定用戶的RID

  • SamrOpenUser: 獲取User對(duì)象的句柄

  • SamrChangePasswordUser: 修改用戶對(duì)象的密碼

1. 調(diào)用samlib的導(dǎo)出函數(shù)

原理前面已經(jīng)提過(guò)了,直接調(diào)用samlib.dll里對(duì)應(yīng)的導(dǎo)出函數(shù)即可,直接嫖參考mimikatz的源碼即可實(shí)現(xiàn),源碼戳這里

2. 直接調(diào)用MS-SAMR

這里以實(shí)現(xiàn)changentlm為例,setntlm同理

(1) C語(yǔ)言

微軟官方已經(jīng)把MS-SAMR的IDL給我們了:[MS-SAMR] – Appendix A: Full IDL,直接拿下來(lái)使用midl生成.h和.c文件即可(使用時(shí)還需要稍作修改):

注意這里有一個(gè)坑點(diǎn),如果對(duì)只指定第5、6、7個(gè)參數(shù)的話,會(huì)產(chǎn)生錯(cuò)誤:

因此必須再指定這兩個(gè)參數(shù),而后者是用新密碼的NTLM Hash加密新密碼的LM Hash得到的,這里我一開(kāi)始很疑惑:從mimikatz的功能來(lái)看,并不需要我們傳遞新密碼LM Hash,那么它這個(gè)加密操作是怎么完成的呢?

由于LM Hash早已在高版本W(wǎng)indows中棄用,于是我猜測(cè)這個(gè)LM Hash可能跟新密碼并沒(méi)有關(guān)系(比如有些工具需要使用的格式來(lái)指定hash,但LM Hash的值是多少并沒(méi)有關(guān)系),于是我直接使用新密碼的NTLM Hash來(lái)加密空密碼對(duì)應(yīng)的LM Hash:

最終成功修改目標(biāo)用戶的密碼,Demo實(shí)現(xiàn)效果如下,源碼戳這里

(2) Impacket

既然是調(diào)用RPC,而且剛好impacket對(duì)SAMR協(xié)議也有實(shí)現(xiàn),所以也可以用impacket來(lái)寫

完成后我向impacket項(xiàng)目提交了Pull Request,源碼可以在commit中看到

效果如下,修改用戶的密碼:

恢復(fù)用戶原h(huán)ash:

?

0x03 檢測(cè)與緩解

1. ChangeNTLM

(1) 產(chǎn)生事件

ChangeNTLM會(huì)產(chǎn)生4723、4738兩條日志,并且日志中的使用者和目標(biāo)賬戶并不是同一個(gè)賬戶:


(2) 流量特征

這個(gè)操作中(操作數(shù)為34),標(biāo)志位被設(shè)置為1,在該步操作中還可以看到用戶對(duì)應(yīng)的RID:

以及調(diào)用(操作數(shù)為38):

2. SetNTLM

(1) 產(chǎn)生事件

SetNTLM會(huì)產(chǎn)生4724、4661、4738這三條日志:

(2) 流量特征

同樣在這個(gè)操作中(操作數(shù)為34),標(biāo)志位被設(shè)置為1,也可以看到用戶對(duì)應(yīng)的RID:

調(diào)用(操作數(shù)為37):

3. 緩解措施

對(duì)于ChangeNTLM,我們可以通過(guò)設(shè)置域內(nèi)密碼策略來(lái)增大攻擊者的利用難度:

  • “密碼最短使用期限” >= 1天

  • “強(qiáng)制密碼歷史” >= 5個(gè)

而對(duì)于SetNTLM,基本是攻擊者拿到較高權(quán)限時(shí)才會(huì)進(jìn)行的操作,因此主要靠我們前期的一些用戶實(shí)體行為來(lái)檢測(cè)攻擊者的行為,即使其拿到高權(quán)限,我們也可以通過(guò)事件迅速檢測(cè)出SetNTLM行為。

?

0x04 參考

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-samr/4df07fab-1bbc-452f-8e92-7853a3c7e380

https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/kuhl_m_lsadump.c#L2165

https://stealthbits.com/blog/manipulating-user-passwords-with-mimikatz/


利用MS-SAMR協(xié)議修改/重置用戶密碼的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
赣榆县| 民勤县| 松阳县| 长阳| 温泉县| 普洱| 冕宁县| 阳山县| 莱阳市| 肇东市| 青海省| 沙洋县| 海伦市| 夏津县| 南投县| 剑川县| 江陵县| 出国| 北京市| 霍林郭勒市| 大同市| 华阴市| 泰安市| 大埔区| 长泰县| 靖边县| 莱西市| 营山县| 延庆县| 九龙县| 香河县| 汉源县| 晋中市| 汝南县| 班戈县| 灌云县| 天镇县| 丹寨县| 平谷区| 定陶县| 内黄县|