如何使用命令行對無文件惡意軟件進行取證
前言
在最近的幾年,Linux面臨的一個日益嚴重的威脅—-基于無文件落地型的惡意軟件。無文件惡意軟件是指將自身注入到正在運行的Linux系統中,并且不會在磁盤上留下任何痕跡。現在已經有多種手法可以實現無文件攻擊:
1.執行二進制文件后從磁盤刪除自身。
2.在不寫入磁盤的情況下直接將代碼注入正在運行的服務器(例如,在PHP服務器通過易受攻擊的輸入來運行PHP代碼)。
3.使用諸如ptrace()之類的系統調用附加到正在運行的進程,并將代碼插入內存空間執行。
4.使用諸如memfd_create()之類的方法在RAM中創建一個可以運行的匿名文件。
在本篇文章中,我們將討論如何檢測最后一個攻擊向量。
memfd_create()無文件攻擊
首先,向大家介紹一個linux系統的底層調用函數memfd_create()。該函數允許您在RAM中創建駐留文件,將文件保存到RAM而不是文件系統本身。調用成功后,您就可以引用這個內存駐留文件,就像您操作磁盤目錄中的文件一樣。 在man中的描述:
memfd_create()創建一個匿名文件并返回引一個文件描述符。該文件的行為類似于常規文件,并可以進行修改,截斷,內存映射等。但是,與常規文件不同,它位于RAM中并且具有易失性。
您可以將其理解為并不是在Linux主機上直接調用/bin/ls,而是將ls加載到RAM中,可以將其稱為
發動進攻
關于memfd_create()的利用方式有很多種,它們都有相似的檢測模式,所以使用哪種并不重要,在本文我們使用的是:In Only Memory ELF Execution。
我們可以直接通過SSH傳輸二進制文件,這樣就沒有任何內容寫入磁盤,也沒有產生任何交互式shell,這樣做可以大大降低攻擊被檢測的可能。
攻擊通過SSH將bindshell后門發送到目標靶機并進行執行。運行后代碼將在靶機上駐留并打開一個偵聽端口等待連接,入侵者可以在遠程主機上執行的任意命令。
快速檢測無文件Linux攻擊
針對文章中演示的示例可以通過一個簡單的ls和grep命令進行檢測:ls -alR /proc/*/exe 2> /dev/null | grep memfd:.*(deleted)
此命令將遍歷/proc目錄中所有正在運行的進程,并檢查它們是否具有格式為memfd:(deleted)的可執行路徑。這個條目非??梢?,并且在無文件攻擊中很常見。
運行此命令后,正常情況下不應有任何回響。如果您看到有任何結果返回,則應立即調查該過程。當然有時會有誤報的風險,但是對于這種類型的攻擊,很少見到(如果有示例,請與我們聯系)。
執行命令后顯示了以下目錄條目:lrwxrwxrwx 1 root root 0 Jul 8 23:37 /proc/14667/exe -> /memfd: (deleted)在路徑中,進程的ID(PID)為14667,這是我們需要重點關注的對象。
如果攻擊者已經使用了完備的方案實現了對二進制文件的隱藏,那么以下的策略可能會失效。但是對于常見的攻擊,使用這種方法是快速有效的。
使用命令行進行攻擊取證
在本例中,bindshell啟動后會立即綁定到TCP 31337端口,執行反彈shell操作,開始發送盜取的敏感數據等。我們可以先使用netstat和ps命令收集攻擊信息。
通過netstat命令,我們注意到了一個反常的tcp端口,該端口的進程名也很奇怪:netstat -nalp
如上圖所示,該進程的PID為14667。下一步通過PS命令查看該進程一些具體信息:ps -auxw
我們在進程列表中,看到它的進程名為[kwerker/0:sandfly],這將幫助它隱藏在具有相似名稱的合法進程中。您可以在上面的列表中看到,如果不使用sandfly標識符進行命名,我們真的很難發現它。
現在我們已經找到了可疑進程,下一步就要想辦法獲取該進程的具體信息。由于接下來大多數操作將在/proc目錄中進行,讓我們先轉到/proc/
進程目錄列表
在進程目錄中,我們可以使用ls命令列出文件夾中的內容。Linux內核將實時構建目錄,并向我們顯示許多有價值的信息。ls -al
通過簡單的ls命令我們可以獲知:1.進程啟動時的日期戳。2.當前的工作目錄(用戶最有可能在/root下啟動進程)。3.EXE鏈接指向一個已刪除的二進制文件的位置。
最重要的一點是,在Linux上,除了少數用例外,具有deleted標記的二進制文件的進程通常是惡意的。而且,該進程不僅被刪除,還指向一個非常不尋常的位置了/memfd:這是攻擊所使用的內存文件描述符。
使用Comm和Cmdline參數查找隱藏的Linux進程
在/ proc目錄下的comm和cmdline文件會記錄進程的命令名和進程的完整命令行信息,這是一個很好的切入點。
當啟動進程時含有參數時,會在各個參數中使用字符’’進行分割。所以當我們使用cat命令查看cmdline文件內容時,只能打印出第一個參數,即進程名。所以我們可以使用cat命令查看comm文件,使用strings命令來查看cmdline文件。cat commstrings cmdline
comm和cmdline文件顯示以下內容:
在在Linux中,大多數情況下,文件應當顯示一個基本上相互匹配的二進制名稱。例如,如果您在nginx這樣的web服務器上運行此程序,您將在這兩個文件中的某個位置看到nginx名稱。但是在這個示例中,comm文件中只是一個數字“3”,這是進程偽裝的一種手段。同樣,cmdline文件夾中的內容也很奇怪。這兩個文件并未正確記錄進程名稱。
通過進程映射來驗證二進制名稱
/proc/[pid]/maps文件可以顯示進程的內存區域映射信息。在這里也可以找到二進制名稱,以及運行時正在使用的其他庫文件。通常,該文件的第一部分包含對正在運行的二進制文件的引用(例如/usr/bin/vi)。但是在文件中,我們再一次看到了對/memfd: (deleted)的奇怪引用。
cat maps
調查Linux進程環境
很多人可能會忽略在Linux上,當你啟動一個進程時,它通常會附加一系列環境變量。在大多數情況下,由用戶啟動的任何進程都會出現在這里。我們試圖通過查看/proc/
同樣,出于格式化的原因,我們將使用strings命令,這樣更易于閱讀。strings environ
既然我們的惡意軟件是通過SSH傳入的,縱使攻擊者設法清理的有關IP地址的日志,但是啟動進程時還是會留下蛛絲馬跡。
抓取二進制文件
即便二進制文件沒有在磁盤上存在,但是我們仍可以非常便捷的恢復注入的二進制文件。具體的操作細節我已經在關于恢復已刪除的二進制文件的文章中進行了全面介紹,在這里只進行簡述。
cp /proc/
該文件被恢復到/tmp/malware.recovered下。您可以像往常一樣對惡意樣本進行分析,還可以為二進制文件生成hash值:sha1sum exesha1sum /tmp/malware.recovered
收集到的信息
到目前為止,我們收集到了如下信息:
1.可疑的可執行文件的路徑。
2.進程使用的端口號。
3.進程名。
4.comm和cmdline文件中沒有引用相同的命令名。
5.comm文件內容只有一個字符長。
6.進程當前的工作目錄位于/ root下。
7.進程試圖鏈接已被刪除的/memfd位置,而不是合法的二進制路徑。
8.進程映射文件顯示相同的已刪除位置。
9.惡意軟件是通過SSH傳入的
事實上,Linux并不會刻意隱藏任何信息。它們就像屋檐上的觀察者一樣,或者就像我們在Sandfly上所說的那樣:試圖隱藏正是一種入侵的特征。