【建議收藏】Windows注冊表運(yùn)行鍵安全攻防指南

Windows注冊表是一個(gè)龐大而復(fù)雜的話題,因此,我們根本不可能通過一篇文章講清楚。然而,從安全的角度來看,一個(gè)特別值得關(guān)注的領(lǐng)域是注冊表運(yùn)行鍵。在這篇文章中,我們將探討誰在使用運(yùn)行鍵,如何發(fā)現(xiàn)該鍵的濫用情況,以及如何根除系統(tǒng)中的惡意運(yùn)行鍵。

運(yùn)行鍵簡介

什么是注冊表運(yùn)行鍵?運(yùn)行鍵是注冊表的一種開機(jī)運(yùn)行機(jī)制:當(dāng)用戶登錄或機(jī)器啟動(dòng)時(shí),在Windows系統(tǒng)上執(zhí)行一些程序。

由于運(yùn)行鍵很容易引發(fā)安全問題,所以,它自然會(huì)成為攻擊者的研究對象。例如,Fancy Bear(也被稱為APT28)、TA456Group 123都喜歡用運(yùn)行鍵來實(shí)現(xiàn)對被攻擊網(wǎng)絡(luò)的權(quán)限維持。同時(shí),運(yùn)行鍵還可以包含各種形式的惡意內(nèi)容——從簡單的可執(zhí)行文件到充滿宏代碼的電子表格。

MITRE ATT&CK將這種特殊的權(quán)限維持戰(zhàn)術(shù)記為子技術(shù)T1547.001。在入侵活動(dòng)中,雖然這種技術(shù)并不常見,然而它卻可以實(shí)現(xiàn)權(quán)限維持——因此,我們更有理由進(jìn)一步探索這種“默默無聞”的技術(shù)。

雖然高級攻擊者偶爾會(huì)利用運(yùn)行鍵,但我發(fā)現(xiàn),關(guān)于這種機(jī)制的探討卻非常少見。實(shí)際上,之所以很少有文章討論這種注冊表功能,并不是因?yàn)檎麄€(gè)信息安全社區(qū)的技術(shù)差距。相反,運(yùn)行鍵是Windows注冊表“配置數(shù)據(jù)庫”的一個(gè)不太引人注目的可執(zhí)行組件。這意味著與更強(qiáng)大、更知名的攻擊技術(shù)和操作系統(tǒng)組件相比,它們往往沒有得到同等程度的關(guān)注。然而,我最近在信息安全社交圈中看到了下面的討論:

在我們介紹如何檢測惡意運(yùn)行鍵之前,讓我們先來簡單聊一下Windows注冊表。

Windows注冊表

Windows注冊表是一個(gè)迷宮般的系統(tǒng)。從表面上看,它是一個(gè)集中式數(shù)據(jù)庫,用于存儲(chǔ)與用戶和機(jī)器設(shè)置有關(guān)的信息。不過現(xiàn)實(shí)情況卻是,它更像是一個(gè)由古怪和奇妙的功能組成的系統(tǒng);盡管這些功能具有破壞性的潛力,但是,微軟對這些功能的說明并不詳盡。

我可以花幾個(gè)小時(shí)的時(shí)間,來講述關(guān)于Windows注冊表的不一致性和反復(fù)無常。同時(shí),試圖了解其潛力的限制和參數(shù)確實(shí)會(huì)令人抓狂。但是,注冊表的雜亂無章的特性,貌似對攻擊者特別有利,因?yàn)檫@便于藏匿其權(quán)限維護(hù)機(jī)制,并在網(wǎng)絡(luò)外潛伏,直到藍(lán)隊(duì)轉(zhuǎn)移視線。

通常情況下,要想?yún)^(qū)分windows注冊表中哪些是良性的,哪些是惡性的,通常是不可能的,特別是在安全事件發(fā)生時(shí)。

運(yùn)行鍵

我希望到目前為止,我已經(jīng)講清楚了馴服注冊表是多么的困難。更糟糕的是,微軟對運(yùn)行鍵的功能的介紹,也是少的令人發(fā)指,因?yàn)樗麄冎挥昧?a target="_blank">六段話來描述運(yùn)行鍵。

運(yùn)行鍵存在于注冊表中。它們是可配置的,當(dāng)用戶登錄或開機(jī)時(shí),允許一個(gè)程序執(zhí)行。“但是等一下!”,我聽到你憤怒地喊道,“Windows已經(jīng)有一個(gè)任務(wù)調(diào)度器,這就是你安排任務(wù)的方式?。?!”

不過,與Windows的任務(wù)調(diào)度器相比,運(yùn)行鍵還是有一些重要的區(qū)別的,或者說它的功能更加有限。


與Windows任務(wù)調(diào)度器相比,注冊表運(yùn)行鍵具有下列特點(diǎn):

字符限制

運(yùn)行鍵只能存儲(chǔ)少于280個(gè)字符的命令。因此,攻擊者的one-liner命令的字符數(shù)不能超過這個(gè)限制。我希望微軟并不是想以此作為一種底層的防御機(jī)制,因?yàn)槟_本小子的許多反向shell的長度都少于50個(gè)字符。

此外,如果編譯惡意可執(zhí)行文件并通過運(yùn)行鍵執(zhí)行的話,只需用到很少的字符,卻能達(dá)到最大的效果。因此,盡管與其他系統(tǒng)防御機(jī)制相比,字符限制是獨(dú)特的,但其作用是微不足道的。

特殊字符的行為

運(yùn)行鍵的另一個(gè)特性是,特殊字符可以改變被調(diào)度命令的行為,尤其是感嘆號(hào)(!)和星號(hào)/通配符(*)。在默認(rèn)情況下,運(yùn)行鍵在執(zhí)行后會(huì)自我刪除——無論任務(wù)的執(zhí)行是否成功。這兩個(gè)特殊字符可以用來改變這一行為。

當(dāng)您將來處理事件響應(yīng)時(shí),如果看到一個(gè)感嘆號(hào),說明很可能遇到了一個(gè)運(yùn)行鍵:它將持續(xù)存在,直到運(yùn)行完指定的命令。如果由于某種原因,這個(gè)邪惡的命令沒有運(yùn)行,感嘆號(hào)能夠確保它不會(huì)刪除自己,直到它運(yùn)行成功為止。

我們可以通過在安全模式下引導(dǎo)計(jì)算機(jī)來消除運(yùn)行鍵的前綴感嘆號(hào)。為了確保無論啟動(dòng)模式如何都能執(zhí)行運(yùn)行鍵,攻擊者可以利用星號(hào)/通配符強(qiáng)制命令運(yùn)行。

默認(rèn)情況下,運(yùn)行鍵被配置為在運(yùn)行后自行擦除,這意味著除非您仔細(xì)檢查日志記錄,否則這些惡意活動(dòng)很可能會(huì)被忽視。

圍獵運(yùn)行鍵

這是您現(xiàn)在的表情嗎?反正這是我第一次遇到運(yùn)行鍵時(shí)的表情。說實(shí)話,這種表情一直持續(xù)至今。

雖然運(yùn)行鍵可能看起來很復(fù)雜和晦澀,但我向你保證它們并不復(fù)雜。它們非常引用檢測和監(jiān)控,而且當(dāng)攻擊者操縱它們的值時(shí),它們會(huì)在SIEM中顯示得非常清楚,這一點(diǎn)會(huì)在下面看到。

尋找運(yùn)行鍵

有許多地方可以部署惡意的運(yùn)行鍵。我們只是要關(guān)注前四個(gè)位置,但如果你閱讀一些紅隊(duì)的文檔,就會(huì)發(fā)現(xiàn)還有更多的注冊表位置可以實(shí)現(xiàn)運(yùn)行鍵的持久性。

總之,在Windows注冊表中,只需在HKey Local Machine和Current User目錄下尋找,只需越過幾個(gè)目錄,就能找到Run和RunOnce。?

"HKLM:\Software\Microsoft\Windows\CurrentVersion\Run"

"HKCU:\Software\Microsoft\Windows\CurrentVersion\Run"

"HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce"

"HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce"

目錄在這里很重要,因?yàn)檫\(yùn)行鍵的行為取決于它所在的注冊表位置:

如果被寫入到HKLM:\的話,這意味著這是作為一個(gè)高權(quán)限用戶(很可能是管理員)或SYSTEM寫入的。

寫在這里的運(yùn)行鍵可以在機(jī)器啟動(dòng)時(shí)執(zhí)行。

如果被寫入到HKCU:\中的話,這意味著這只是作為一個(gè)普通用戶寫入的。

寫在這里的運(yùn)行鍵只有在用戶登錄時(shí)才會(huì)執(zhí)行。

如果被寫入到\RunOnce的話,它將在執(zhí)行后被刪除。

如果被寫入到\Run的話,它在執(zhí)行后并不會(huì)被刪除。

這些都會(huì)因?yàn)槲覀円呀?jīng)討論過的特殊字符行為而變得愈加復(fù)雜。

運(yùn)行鍵在現(xiàn)實(shí)生活中是什么樣子的?

在現(xiàn)實(shí)生活中,我們必須從注冊表過濾掉一些噪音后,才能看到運(yùn)行鍵的內(nèi)容。下面我們舉例說明,第一個(gè)例子是沒有經(jīng)過PowerShell的過濾,第二個(gè)例子則通過PowerShell進(jìn)行了相應(yīng)的過濾。

看看這一團(tuán)糟。這到底是什么?我們根本就不需要紅框中的東西,那些只是噪音。事后看,我們知道這里表示“HKLM”驅(qū)動(dòng)器和“Run”ChildName,但是,乍一看,的確是一言難盡……

下面,讓我們利用PowerShell過濾掉這些噪音:

Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run" | select -property * -exclude PS* | fl

看看這有多優(yōu)雅。想象一下,如果能夠通過類似方式讓數(shù)以千計(jì)的端點(diǎn)以這種清晰、無噪音的方式返回信息,這簡直就是藍(lán)隊(duì)的夢想。這種用于過濾的PowerShell非常適合在企業(yè)范圍內(nèi)運(yùn)行,以識(shí)別網(wǎng)絡(luò)中標(biāo)準(zhǔn)構(gòu)建之外的異常。

如果看一下運(yùn)行鍵,就會(huì)發(fā)現(xiàn)條目的名稱和附帶的命令。不過,運(yùn)行鍵的合法內(nèi)容可能有所不同,我們需要了解企業(yè)中什么東西是正常的,因?yàn)檫@樣才能知道哪些東西是不正常的。

在進(jìn)行安全審計(jì)時(shí),有時(shí)需要過濾掉注冊表運(yùn)行鍵中合法的啟動(dòng)項(xiàng)目。這其實(shí)很容易做到。為此,只需使用與上述相同的PowerShell,不過這次需要加上-exclude

標(biāo)志,然后是需要排除的PS*,后面加上一個(gè)逗號(hào),以及其他不想看到的運(yùn)行鍵名稱。

Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run" | select -property * -exclude PS*, Vmware*,bginfo*? | fl


惡意的運(yùn)行鍵

下面,讓我們模仿一下攻擊者的一些行為。我們將在一個(gè)運(yùn)行鍵中插入一些惡意的東西,同時(shí),我將向您展示:

第一,如何通過循環(huán)方式自動(dòng)找到它。

第二,如何在不破壞其他合法運(yùn)行鍵的情況下將其從機(jī)器上清除。

假設(shè)我們已經(jīng)入侵了一臺(tái)機(jī)器,并希望在這臺(tái)機(jī)器上面維持相應(yīng)的權(quán)限。為此,我們編譯了evilcommand.exe,它能夠繞過人類已知的所有反病毒軟件,并向我們一個(gè)反向shell。我們可以命令其中一個(gè)運(yùn)行鍵來執(zhí)行我們的惡意程序:

Set-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce" -Name '!Delete After Running' -Value "evilcommand.exe"

如果我們能夠在單行Powershell命令的末尾加上-whatif,它就不會(huì)真正運(yùn)行你的命令。相反,它將向您顯示如果您運(yùn)行它會(huì)產(chǎn)生什么效果。

當(dāng)您想真正運(yùn)行一些命令時(shí),請使用-verbose標(biāo)簽。

這就是我們強(qiáng)制運(yùn)行鍵為我們做的事情:創(chuàng)建了一個(gè)名為“Delete_After_Running”的運(yùn)行鍵,其執(zhí)行值為“evilcommand.exe”。注意前面這個(gè)感嘆號(hào),正如我們已經(jīng)討論過的,它將確保程序在自我刪除之前運(yùn)行,以歡迎我們再次光顧這臺(tái)被入侵的機(jī)器。

任務(wù)調(diào)度器不會(huì)注意到這一點(diǎn)。它不會(huì)也無法識(shí)別這個(gè)運(yùn)行鍵已被調(diào)度。如果我是微軟,我可能會(huì)在任務(wù)調(diào)度器中加入這一功能……

如何尋找惡意的運(yùn)行鍵

利用Powershell的for循環(huán),我們可以收集上述四個(gè)注冊表位置的內(nèi)容。

在構(gòu)思這個(gè)腳本時(shí),我設(shè)法通過確保代碼產(chǎn)生的輸出被預(yù)先過濾并添加顏色,以便于辨認(rèn)是否存在異常的東西及其所在的位置。

如果我們看得足夠仔細(xì),就會(huì)發(fā)現(xiàn)一些異常情況。一旦我們?nèi)〉每蓤?zhí)行文件并對其進(jìn)行逆向分析,我們就可以確定它是否是來自攻擊者的惡意可執(zhí)行文件。

如果發(fā)現(xiàn)惡意的運(yùn)行鍵,那么就需要將它從機(jī)器上刪除,具體方法將在后面介紹。

監(jiān)測惡意運(yùn)行鍵的行為

讓我們從檢測和監(jiān)控的角度討論一下惡意運(yùn)行鍵的行為。

在這里,我們將使用內(nèi)置的Windows事件查看器,并為Sysmon和Florian Roth配置相應(yīng)的規(guī)則來檢測惡意的運(yùn)行鍵。然后,你可以將這些Sysmon日志數(shù)據(jù)輸入SIEM,并監(jiān)控?cái)?shù)十萬個(gè)端點(diǎn)的運(yùn)行鍵惡意行為(以及其他東西)。

這里有大量的信息需要考察:

藍(lán)色的箭頭:事件信息

事件ID 13涉及注冊表值的修改,這個(gè)ID在任何環(huán)境下都是一致的。

EventType和Task Category也準(zhǔn)確地指出了這里發(fā)生的事情:一個(gè)注冊表值正在被設(shè)置。

紅色箭頭:具體信息

TargetObject顯示了我們正在改變的運(yùn)行鍵注冊表的完整路徑。它還顯示了我們給它起的名字,并包括改變行為的特殊字符

Details部分顯示了運(yùn)行鍵強(qiáng)制執(zhí)行的命令/可執(zhí)行文件

粉紅色的箭頭:MITRE ATT&CK參考

這個(gè)可能不是在每個(gè)symon配置中都有。然而,F(xiàn)lorian Roth將MITRE ATT&CK戰(zhàn)術(shù)編號(hào)列入了某個(gè)事件中。

與其為每個(gè)Event 13生成攻擊警報(bào),我建議你去了解一下環(huán)境中的運(yùn)行鍵通常做什么。

在整個(gè)企業(yè)中,它們是否有一致的內(nèi)容?

還是財(cái)務(wù)部門運(yùn)行的軟件合法地改變了運(yùn)行鍵?

你是否能夠以這個(gè)為基準(zhǔn),然后為財(cái)務(wù)部門的工作站的任何新的、不一致的運(yùn)行鍵變化創(chuàng)建一個(gè)小警報(bào)?

這比從一百萬個(gè)事件中抓住一個(gè)流氓Event 13更有價(jià)值。

交互式檢測

如果您想獲得更多的交互式檢測體驗(yàn),我會(huì)推薦使用Michael Cohen博士的Velociraptor這樣的工具。

Velocitaptor是一個(gè)非常棒的工具,但是,我們這里只做簡單的介紹。總的來說,Velociraptor就是一個(gè)端點(diǎn)響應(yīng)代理,我們可以把它安裝到企業(yè)中的所有端點(diǎn)上,并通過運(yùn)行在服務(wù)器上的Web應(yīng)用對其進(jìn)行協(xié)調(diào)。這種分布式工具使我們能夠同時(shí)查詢成千上萬的機(jī)器。

Velociraptor內(nèi)置了一個(gè)搜索功能,專門查詢每臺(tái)Windows機(jī)器的啟動(dòng)過程,而這個(gè)搜索功能的一部分就包括查詢運(yùn)行鍵。正如你所看到的,這個(gè)搜索功能的目標(biāo)就是一些注冊表的運(yùn)行鍵。此外,Velociraptor的目標(biāo)還有另外幾個(gè)運(yùn)行鍵,以及其他一些啟動(dòng)位置。

如果我們啟動(dòng)了這個(gè)啟動(dòng)檢測搜索,我們將得到一個(gè)格式優(yōu)美的結(jié)果表。在真實(shí)的生產(chǎn)環(huán)境中,你會(huì)發(fā)現(xiàn)噪音會(huì)更多一些,所以請注意!現(xiàn)在,看看我們檢測到了什么:域中的一臺(tái)機(jī)器正在運(yùn)行C:\evil.exe,這個(gè)名字真是太嚇人了。

幸運(yùn)的是,現(xiàn)在我們已經(jīng)找到了惡意的運(yùn)行鍵,不僅如此,我們還可以從主機(jī)中刪除它。

鏟除惡意運(yùn)行鍵

現(xiàn)在,是時(shí)候鏟除惡意的運(yùn)行鍵了。

下面,我們開始外科手術(shù)。如果使用的命令不夠精確,則會(huì)意外地刪除合法的運(yùn)行鍵。重要的是,這里也要用-verbose完成刪除操作,并仔細(xì)檢查它是否已經(jīng)消失,以確保刪除對象的確已經(jīng)被清除了。

在PowerShell的for語句的后面,復(fù)制并粘貼前面檢測到的惡意運(yùn)行鍵的完整路徑,并再次檢查確認(rèn)。

Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce" | select -property * -exclude PS*| fl

然后,選擇要?jiǎng)h除的運(yùn)行鍵的確切名稱,然后復(fù)制粘貼該名稱。注意,這里必須包括相應(yīng)的特殊字符,但是,不要復(fù)制冒號(hào)后面的可執(zhí)行文件的詳細(xì)數(shù)據(jù)。

Remove-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce" -Name "*Run Safe Mode too" -verbose

這樣,就會(huì)返回詳盡的消息,以確認(rèn)刪除的的確是我們的目標(biāo)運(yùn)行鍵。

然后,讓我們再檢查一下,以確認(rèn)它的確已經(jīng)被清除。如果這里還有惡意運(yùn)行鍵的話,請仔細(xì)檢查復(fù)制和粘貼的內(nèi)容是否正確,因?yàn)榘l(fā)生誤操作也不是不可能的事情。

Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce" | select -property * -exclude PS*| fl

撥開運(yùn)行鍵的迷霧

運(yùn)行鍵是一種非常晦澀難懂的權(quán)限維持機(jī)制。但我希望這篇文章能讓我們對監(jiān)視、檢測、控制和清除涉及運(yùn)行鍵的任何惡意活動(dòng)有所幫助。

作為一個(gè)防御者,許多時(shí)候我們的角色與入侵者相比一直處于劣勢。他們可以利用zero-day漏洞,他們可以欺騙用戶,他們可以用更大的預(yù)算跨時(shí)區(qū)運(yùn)行。所以,這就要求我們進(jìn)行全方位的防護(hù),但對他們來說,只需要拿下一個(gè)突破口就行了。所有這些都是真實(shí)不虛的,但我發(fā)現(xiàn)有時(shí)我們可以把這種觀點(diǎn)顛倒一下,把重點(diǎn)放在我們與攻擊者相比所擁有的優(yōu)勢上。

環(huán)境是我們的,注冊表是我們的,運(yùn)行鍵也是我們的。同時(shí),我們知道這一切是如何運(yùn)作的,我們應(yīng)該在這里等待對手在我們的領(lǐng)域里打噴嚏。雖然這是我們的地盤,但我們并不天真,我們有時(shí)候的確會(huì)被攻陷。但是,我們會(huì)抓住入侵者,把他們踢出去,并提高入侵難度。

了解您的環(huán)境中什么是正常的,這樣您就可以知道注冊表運(yùn)行鍵操作何時(shí)不合適,并培植一個(gè)對抗性的網(wǎng)絡(luò),讓攻擊者寸步難行。

小結(jié)

當(dāng)然,還有許多其他古怪的注冊表項(xiàng),它們可以通過運(yùn)行鍵做一些奇怪的事情。例如,我們沒有提到整個(gè)文件夾是如何通過注冊表運(yùn)行鍵實(shí)現(xiàn)權(quán)限維護(hù)的!你可以在這里、這里和這里閱讀更多信息。此外,你可以在這里、這里和這里閱讀更多內(nèi)容。

有需要網(wǎng)絡(luò)安全資料的朋友可以關(guān)注私信我哦?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容