通過(guò)進(jìn)程監(jiān)控檢測(cè)SSH活動(dòng)
在進(jìn)行的許多滲透測(cè)試活動(dòng)中,我注意到有許多攻擊都是通過(guò)使用合法憑據(jù)的SSH訪問(wèn)開始的?,F(xiàn)在你可能會(huì)想,用戶究竟為什么要在macOS上啟用SSH服務(wù)。這對(duì)普通用戶來(lái)說(shuō)真的有必要嗎?當(dāng)然,對(duì)于普通用戶來(lái)說(shuō),答案是否定的。這完全沒(méi)有必要,但我認(rèn)為基于macOS的構(gòu)建服務(wù)器、測(cè)試服務(wù)器和開發(fā)人員系統(tǒng)經(jīng)常啟用SSH的可能性很大。不僅如此,一旦攻擊者通過(guò)任何方式獲得了對(duì)系統(tǒng)的訪問(wèn)權(quán),SSH就成了一種奇妙的“live of the land”技術(shù),用于在受到攻擊的網(wǎng)絡(luò)上進(jìn)行橫向移動(dòng)。
要理解如何最好地跟蹤不同的SSH行為,我們首先必須熟悉在創(chuàng)建SSH會(huì)話中發(fā)揮作用的不同二進(jìn)制文件。
- /usr/libexec/smd
smd二進(jìn)制文件(可能是服務(wù)管理守護(hù)進(jìn)程)實(shí)際上控制SSH是啟用還是禁用。隨著時(shí)間的推移,蘋果將更多的責(zé)任轉(zhuǎn)移到了這個(gè)守護(hù)進(jìn)程中。
- /usr/sbin/sshd
這是主要的SSH服務(wù)可執(zhí)行文件,當(dāng)你嘗試登錄到一個(gè)系統(tǒng)時(shí),會(huì)啟動(dòng)多個(gè)sshd實(shí)例,以便處理登錄過(guò)程和用戶會(huì)話,這可能是在處理SSH時(shí)想到的最常見(jiàn)的服務(wù)。
- /usr/libexec/sshd-keygen-wrapper
這個(gè)sshd幫助進(jìn)程在嘗試登錄時(shí)啟動(dòng),它通常立即執(zhí)行sshd服務(wù)。在一些用例中,SSH -keygen-wrapper會(huì)執(zhí)行一些不同的操作,但是在大多數(shù)SSH設(shè)置中,該進(jìn)程的操作行為與名稱完全一致。
- /usr/bin/ssh-agent (- l)
不管它的名字是什么,SSH -agent實(shí)際上并不是偵聽(tīng)SSH連接的服務(wù)。事實(shí)上,即使禁用了SSH,該進(jìn)程也可能在你的系統(tǒng)上運(yùn)行,它最以SSH密鑰的管理而聞名。實(shí)際上,用戶不需要通過(guò)用戶名和密碼登錄即可??梢栽?System/Library/LaunchAgents/com.openssh.ssh-agent.plist中找到啟動(dòng)程序,并在啟動(dòng)時(shí)使用未記錄的-l參數(shù)加載該啟動(dòng)程序。
- shell
身份驗(yàn)證過(guò)程結(jié)束后,在系統(tǒng)上生成一個(gè)交互式shell,它將根據(jù)用戶的請(qǐng)求執(zhí)行命令。這個(gè)shell是用戶設(shè)置為默認(rèn)的shell。對(duì)我來(lái)說(shuō),它是zsh。
一般的行為
為了更好地理解這些進(jìn)程是如何連接的,讓我們看看通過(guò)SSH登錄時(shí)使用的具體步驟。在macOS上,可以通過(guò)系統(tǒng)首選項(xiàng)>共享>遠(yuǎn)程登錄來(lái)啟用SSH登錄。注意,啟用這個(gè)特性實(shí)際上不會(huì)創(chuàng)建任何類型的任何新的sshd進(jìn)程。這有點(diǎn)令人失望,因?yàn)檫@意味著我們不能進(jìn)行簡(jiǎn)單的進(jìn)程監(jiān)視來(lái)確定SSH是啟用了還是禁用了,但是如果你使用SSH登錄并保持會(huì)話處于打開狀態(tài),你現(xiàn)在應(yīng)該擁有如下進(jìn)程樹。

如果你查看標(biāo)準(zhǔn)ps輸出,你會(huì)注意到這個(gè)樹看起來(lái)有點(diǎn)不同。事實(shí)上,使用TrueTree是我意識(shí)到smd在SSH管理中發(fā)揮作用的唯一途徑。這也是為什么在嘗試登錄之前,你的ps輸出中沒(méi)有任何SSH服務(wù)偵聽(tīng)器的跡象。smd服務(wù)處理多個(gè)不同的遠(yuǎn)程登錄服務(wù)以及通過(guò)系統(tǒng)首選項(xiàng)啟用或禁用的其他項(xiàng),上面截圖中smd下面的所有進(jìn)程在登錄嘗試發(fā)生后都將存在,但是zsh shell在登錄成功后出現(xiàn)。首先,我們看到創(chuàng)建了sshd-keygen-wrapper。這個(gè)小小的二進(jìn)制文件在執(zhí)行到sshd之前會(huì)快速處理一些檢查,是的,當(dāng)?shù)卿洶l(fā)生時(shí)將創(chuàng)建兩個(gè)sshd進(jìn)程。但是請(qǐng)注意,如果在此登錄過(guò)程中發(fā)生另一個(gè)登錄,將再次創(chuàng)建上面看到的所有相同進(jìn)程。我的意思是說(shuō),上面看到的兩個(gè)sshd服務(wù)都不會(huì)充當(dāng)額外登錄的“主服務(wù)器”。最后,第二個(gè)sshd實(shí)例將派生一個(gè)shell,用戶今后輸入的所有命令都將通過(guò)該shell派生。
在繼續(xù)之前,請(qǐng)務(wù)必注意,還有其他方法可以啟用SSHD服務(wù)。實(shí)際上,我認(rèn)為通過(guò)系統(tǒng)首選項(xiàng)啟用遠(yuǎn)程登錄要比通過(guò)命令行啟用更值得關(guān)注。用戶可以使用systemsetup命令從命令行啟用遠(yuǎn)程登錄,而不是加載LaunchDaemon。
- sudo systemsetup -setremotelogin on
為了使此命令起作用,需要root權(quán)限,好消息是,你應(yīng)該能夠在執(zhí)行此類命令時(shí)監(jiān)視任何類型的EDR。
嘗試登錄
有了上面討論的流程樹,你可能已經(jīng)知道我將在本節(jié)中進(jìn)行的工作。如上所述,我們最終通過(guò)SSH登錄嘗試生成了三個(gè)進(jìn)程:一個(gè)是sshd-keygen-wrapper,另一個(gè)是sshd。我們知道sshd-keygen-wrapper只存在一秒鐘,然后才執(zhí)行sshd,這是系統(tǒng)上可能進(jìn)行的三次登錄嘗試。

請(qǐng)注意,在上圖中,我們使用非TrueTree進(jìn)程視圖,因?yàn)檫@是EDR所提供的。這就是為什么將launchd顯示為父級(jí)而不是smd的原因。
在上圖中,你看到了三個(gè)嘗試的SSH登錄。有兩個(gè)失敗,因此從未生成shell(紅色),另一個(gè)成功(綠色)。不管登錄是否成功,sshd-keygen-wrapper總是按登錄嘗試的比例生成,這意味著我們可以通過(guò)跟蹤登錄執(zhí)行來(lái)跟蹤登錄嘗試。
獲取字典攻擊嘗試
非常奇怪的是,現(xiàn)在還有人用字典攻擊SSH。通常情況下,這是由Linux僵尸網(wǎng)絡(luò)發(fā)送大量的憑證,試圖以他們的方式進(jìn)入公共的SSH服務(wù)器。在macOS上面向公眾的SSH服務(wù)器也很少見(jiàn),具體原因是什么?顯然,我無(wú)法說(shuō)明你的具體設(shè)置和工具,因此我只使用一些通用的Splunk術(shù)語(yǔ),因?yàn)樗鞘录O(jiān)視的標(biāo)準(zhǔn)。在這里,你最好遵循上面的邏輯,尋找sshd-keygen-wrapper的大型分組嘗試。我發(fā)現(xiàn)使用Splunk的“bin”功能(也稱為bucket)最容易做到這一點(diǎn)。

讓我們分解一下具體的流程:
- event=process_create path=/usr/libexec/sshd-keygen-wrapper
查找執(zhí)行sshd-keygen-wrapper的所有時(shí)間。
- bucket _time span=5m
將找到的sshd-keygen-wrapper進(jìn)程分組到兩分鐘的時(shí)間窗口中。
- eventstats dc(host_name) as attempts by _time
以現(xiàn)在進(jìn)行分類的進(jìn)程為例,并按主機(jī)進(jìn)行不同的計(jì)數(shù)以獲取發(fā)生了多少次嘗試,將這個(gè)新統(tǒng)計(jì)的字段命名為“attempts”。
- where attempts > 20
查找在一個(gè)兩分鐘的桶內(nèi)發(fā)生了超過(guò)20次嘗試的位置。
- stats values(host_name)
返回與上述條件匹配的主機(jī)名。
如果你的Splunk實(shí)例能夠訪問(wèn)這種類型的數(shù)據(jù),那么它將返回在兩分鐘內(nèi)發(fā)生20次登錄嘗試的實(shí)例。你可以隨心所欲地設(shè)置時(shí)間,但我懷疑兩分鐘內(nèi)進(jìn)行20次登錄嘗試可能表明存在惡意攻擊。
進(jìn)行單次登錄
捕獲成功的登錄也不會(huì)太復(fù)雜,實(shí)際上,我將使用與以前相同的圖像。

只要你的工具允許你通過(guò)父子關(guān)系建立連接,你需要做的就是在創(chuàng)建shell的任何時(shí)候都使用sshd作為該shell的父對(duì)象。請(qǐng)注意,在macOS上,默認(rèn)的內(nèi)置shell(如/ etc / shells中所示)為/ bin / bash,/ bin / csh,/ bin / dash,/ bin / ksh,/ bin / sh,/ bin / tcsh和/ bin / zsh。
從Splunk的角度來(lái)看,這里不應(yīng)該有任何太復(fù)雜的東西。只要在shell運(yùn)行時(shí)查找ppid路徑為“/usr/sbin/sshd”的位置即可。請(qǐng)注意,在某些情況下,如果有人選擇通過(guò)SSH運(yùn)行單個(gè)命令而不創(chuàng)建交互式登錄,這也會(huì)引起注意。例如:
ssh user@ip_address whoami
上面的命令不是創(chuàng)建交互式會(huì)話,而是通過(guò)SSH登錄,執(zhí)行whoami命令并將輸出返回給運(yùn)行它的客戶端。sshd可執(zhí)行文件通過(guò)將-c參數(shù)和發(fā)送方指定的命令一起傳遞給它創(chuàng)建的shell來(lái)執(zhí)行此操作。

如果你要查找交互式SSH登錄名,請(qǐng)查找在SSH下創(chuàng)建shell且命令行不包含其他參數(shù)(或CommandLine == Path)的時(shí)間。如果你只想通過(guò)SSH運(yùn)行一次性命令,請(qǐng)查找命令行包含多個(gè)參數(shù)的時(shí)間。
獲取根登錄
通過(guò)SSH進(jìn)行的登錄顯然不能保證發(fā)生了惡意事件,許多技術(shù)和開發(fā)人員都依靠SSH來(lái)激活它,以完成不同的任務(wù)。但是,這些技術(shù)和開發(fā)人員應(yīng)以正常權(quán)限登錄系統(tǒng),然后通過(guò)sudo升級(jí)。以超級(jí)用戶身份直接登錄到SSH服務(wù)器并不被視為最佳實(shí)踐。
許多進(jìn)程跟蹤技術(shù)提供了已執(zhí)行進(jìn)程的用戶ID,通常將其稱為uid。 Unix系統(tǒng)上的每個(gè)用戶都被分配了一個(gè)uid。在macOS上,第一個(gè)用戶的uid為501,根用戶為0。通過(guò)查看創(chuàng)建的shell進(jìn)程的uid,我們可以確定哪個(gè)用戶已登錄。這是使用基本權(quán)限登錄的用戶的樹形示例。

在上圖中,我們看到派生的sshd子對(duì)象和shell的uid與基本用戶501的uid匹配,因此我們知道登錄系統(tǒng)的用戶不具有root權(quán)限。同時(shí),我們看到登錄之前的所有進(jìn)程都由root用戶擁有,這很有意義,因?yàn)閟shd在系統(tǒng)上以root用戶身份運(yùn)行,并且在用戶登錄時(shí)根據(jù)用戶權(quán)限移交。當(dāng)然,如果有人以root身份登錄,所創(chuàng)建的shell將繼續(xù)為uid 0。因此,要檢測(cè)SSH上的root登錄,只需使用與上一節(jié)相同的方法,但是指定只關(guān)心在SSH下創(chuàng)建的shell的uid何時(shí)為0。
最后,我想簡(jiǎn)單地談?wù)勔粋€(gè)經(jīng)常被忽略的項(xiàng)目,這個(gè)項(xiàng)目是tty。每當(dāng)有人打開真正的交互式shell時(shí),tty或teletype終端就會(huì)被分配。也就是說(shuō),用戶可以輸入命令,shell可以返回提示。如果沒(méi)有tty,當(dāng)sudo命令要求你輸入密碼時(shí),你將無(wú)法與它進(jìn)行交互。你只需要在無(wú)效區(qū)域上操作,tty就會(huì)被分配給創(chuàng)建的Shell進(jìn)程,并將繼續(xù)用于該SSH會(huì)話期間創(chuàng)建的所有子進(jìn)程。

此時(shí),你可以看到在登錄時(shí)shell上的tty是/dev/ttys001。同樣,這將取決于你的工具以及你的輸入是實(shí)時(shí)檢測(cè)到的還是可追溯的,但這意味著如果你發(fā)現(xiàn)惡意的SSH登錄并能夠查看tty字段,則只需將所有內(nèi)容撤回即可,通過(guò)查找共享相同tty的進(jìn)程來(lái)在該SSH會(huì)話中執(zhí)行的命令。
唯一的問(wèn)題是,當(dāng)用戶關(guān)閉tty時(shí),它將在下一次需要時(shí)被重用。換句話說(shuō),如果該系統(tǒng)上的用戶經(jīng)常打開終端,則搜索使用/ dev / ttys001的所有進(jìn)程可能還會(huì)為你提供由用戶執(zhí)行的一些較舊但合法的操作。如果發(fā)生這種情況,你可能還必須依靠一些時(shí)間表(或完全不同的方法)來(lái)撤回所有惡意SSH命令。
總結(jié)
正如本文中多次提到的,上面看到的很多查詢都取決于你的技術(shù)和工具,但是最重要的是了解你的環(huán)境并了解哪些系統(tǒng)應(yīng)實(shí)際使用SSH。對(duì)于在小型公司工作的人來(lái)說(shuō),這很容易,他們可以輕松掌握誰(shuí)在哪里登錄,但是對(duì)于大公司來(lái)說(shuō),監(jiān)視這些項(xiàng)目也很重要。對(duì)于需要登錄系統(tǒng)以執(zhí)行操作的管理員來(lái)說(shuō),遠(yuǎn)程登錄是一個(gè)非常棒的工具,但是從安全角度來(lái)看,但是從安全的角度來(lái)看,它們會(huì)帶來(lái)三重威脅。
1.它們是內(nèi)置的;
2.它們可以用于初始輸入;
3.它們可以用于橫向運(yùn)動(dòng)和攻擊。
本文我們僅談到了與SSH相關(guān)的流程活動(dòng)是什么樣的,在鎖定SSH以及攻擊者如何利用SSH方面,仍然有大量的內(nèi)容需要探索。
本文翻譯自:https://themittenmac.com/detecting-ssh-activity-via-process-monitoring/如若轉(zhuǎn)載,請(qǐng)注明原文地址。