01 隱蔽持久駐留
1.1 背景
持久化是一個攻擊鏈周期中非常重要的環節,指用webshell、反彈shell、后門、rootkit長期控制失陷機器的一種技術,可能會涉及到dns隧道、http、icmp 隧道以及加密流量,從而達到一直控制失陷機器而不被發現的目標。
在攻擊者利用漏洞獲取到某臺機器的控制權限之后,會考慮將該機器作為一個持久化的據點,種植一個具備持久化的后門,即使在設備重啟、憑據修改或其他可能破壞當前惡意活動的操作發生后,也能夠隨時連接該被控機器進行深入滲透。
1.2 持久駐留方法

1.2.1 隱藏啟動
1.2.1.1 Systemd啟動
System默認從目錄/etc/systemd/system/讀取配置文件。但是里面存放的大部分文件都是符號鏈接,指向目錄/lib/systemd/system/,真正的配置文件存放于這個目錄中。
一般系統手工創建的單元文件建議存放在/etc/system/system/目錄下。
1. 首先編譯提前配置好的后門文件。
2. 在/etc/目錄下創建demo.local(名稱),里面寫入直接執行后門文件。
3. 修改權限。
4. 在/etc/system/system/目錄下創建一個demo.service文件。
5. 設置啟動鏈接。
6. 重啟獲得shell。
1.2.1.2二進制文件感染
基本流程
完成可用空間的后門代碼(添加區段);
劫持執行流程;
注入后門代碼;
恢復執行流程。
第一步:需要找到可用空間。
如何在PE文件中選擇合適的空間來插入后門代碼非常重要, 這將影響到后門被檢測到的風險系數。
借助于一個名為Cminer的工具,很容易枚舉二進制文件的所有代碼洞。
./Cminer putty.exe 300 命令枚舉Code Caves大于300字節。
在這種情況下,有5個好的Code Caves可以使用。起始地址給出了Caves的虛擬內存地址(VMA)。這是Caves的地址,當PE文件加載到內存中時,文件偏移量是以字節為單位的PE文件內的Caves地址。
由此可見大部分Caves都在數據段內,因為數據段沒有執行特權段標志, 這里需要更改。后門代碼大概400-500字節左右,所以5個Caves是足夠的。Caves的起始地址應該被保存,在將段特權更改為R/W/E后,第一步的后門過程就完成了。
第二步:通過修改目標可執行文件的指令,將執行流重定向到后門代碼。
這里有一個關于選擇將被修改的指令重要細節, 所有二進制指令具有字節大小,為了跳轉到后門代碼地址,將使用5或6字節的長跳躍。因此,當修補二進制時,將被修補的指令需要與長跳轉指令的大小相同,否則上一條或下一條指令將被破壞。
在putty啟動后的界面中, 點擊 “Open” 按鈕會啟動一個檢查IP地址是否有效的功能。
如果IP地址字段值不為空并且有效,則它啟動嘗試連接給定IP地址的連接功能。如果客戶端成功創建SSH會話,將彈出一個新窗口并請求憑據。
此處是重定向發生的點,因為AV產品不能夠復制這種復雜的環境,植入的后門將不會被自動化沙盒和動態分析機制檢測到。
使用基本的逆向方法,搜索下面的字符串和字符串引用,不難找到連接函數的地址,方法如下:客戶端建立與給定IP的連接后,有一個字符串 “login as:” 打印到出現的窗口。這個字符串可以幫助我們找到連接函數的地址,IDA Pro在這方面做得很好。
為了找到 “login as:” 字符串, 在IDA上依次打開 Views->Open Subviews->Strings
找到字符串后,雙擊轉到所在位置,在數據節內部IDA查找所有對字符串的交叉引用,按 “Ctrl+X”,顯示所有交叉引用,并這個引用在打印 “login as:” 字符串的函數內部。
這里是要修補的指令。在進行任何更改之前,請注意上下文的指令。
執行后門代碼后指令將再次使用。
通過將PUSH 467C7C指令改為JMP 0x47A478,完成后門過程的重定向階段。需要注意的是下一個指令地址。它將在執行后門代碼后用作返回地址。
第三步:后門代碼注入。
首先在執行后門之前保存寄存器中的內容。寄存器中的每個值對于程序的執行都是非常重要的。通過在代碼的OEP(程序入口點)放置PUSHED和PUSHED指令,把所有寄存器內的值和寄存器標志都存儲在堆棧中。這些值將在執行完后門代碼之后彈出,以便程序可以繼續執行不出錯。
使用的后門代碼是meterpreter反向TCP ShellCode。但是在ShellCode中需要做少量修改。通常反向TCP ShellCode會有嘗試連接到處理程序的次數或時間限定,如果連接失敗,則通過調用ExitProcess API調用關閉進程。
這里是問題所在,如果連接到處理程序失敗,putty客戶端的執行將停止。改變幾行ShellCode使其每次連接失敗時ShellCode重試連接處理器,這樣也會相應的減少ShellCode的體積。
在匯編代碼中進行更改后,使用nasm -f bin stager_reverse_tcp_nx.asm命令進行編譯。現在反向的TCP ShellCode已經可以使用了,但是它不會被直接放置。我們的目標是在新線程上執行ShellCode。
為了創建一個新的線程實例,需要另一個ShellCode,使CreateThreadAPI調用指向反向TCP ShellCode。這里使用Metasploit項目中創建線程的shellcode。
將 createthread.asm 文件中的代碼轉換為十六進制格式的ShellCode,使用nasm -f bin createthread.asm命令進行編譯。在這里,ShellCode準備插入到Caves中,但在插入ShellCode之前應該對其編碼,以便繞過AV產品的靜態/特征分析機制。因為Metasploit項目中的所有編碼器被大多數AV產品所知,所以強烈建議使用自定義編碼器。
在正確編碼ShellCode之后,就可以把它插入Code Caves。選擇在PUSHFD下的指令,然后在免調試器上按下 “Ctrl + E”,ShellCode將以十六進制格式粘貼。
使用xxd -ps createthread命令,以十六進制格式打印編碼創建線程的ShellCode或使用十六進制編輯器打開ShellCode并復制十六進制值。當將十六進制值粘貼到調試器時,需要注意字節限制,因為這些修補操作是用免試器進行的,免調試器在粘貼到編輯代碼窗口時有一個字節限制。粘貼的ShellCode可能會有遺漏。當所有ShellCode粘貼到Code Cave時后門代碼就插入完成。
第四步:恢復執行流程。
在創建后門代碼線程之后,程序需要恢復到其正常執行流程,這意味著EIP應該跳回到將執行重定向到Cave的函數。但是在跳回到該函數之前,應該檢索所有保存的寄存器。
通過在ShellCode的末尾放置POPFD和POPAD指令,所有保存的寄存器都以相同的順序從堆棧中彈出。在檢索寄存器后,還有一件事要做,即執行被劫持的指令。
為了將程序的執行重定向到Code Cave, 我們將PUSH 467C7C指令替換為了JMP 0x47A478。把PUSH 467C7C指令放在最后,此時被劫持的指令也被檢索。現在可以返回到通過插入JMP 0x41CB73指令將執行重定向到Cave的函數的時候,結果代碼應如下圖所示。
最后選擇所有修補和插入的指令,按右鍵單擊并復制到可執行文件。此操作需要對已修改的每個指令執行。當所有指令被復制并保存到文件時,關閉調試器并測試可執行文件,如果可執行文件運行順暢,則后門可以使用。
02 總結
隨著對抗手段日益復雜化,持久化技術也將演變得更加隱蔽,同時也對防守方提出了一個獨特的挑戰,由于它們可以隱蔽執行后門代碼,所以檢測和分析過程就更加具有挑戰性,需要采集大量的數據進行分析判別,如何在大量的日志中如何有效的進行檢測,避免過度消耗資源,都是安全運營人員要面臨的挑戰。
后續將繼續介紹隱蔽持久駐留的其他方法,敬請期待。
- 關鍵詞標簽:
- 天融信 檢測與防護 持久化