DNS反彈Shell

FLy_鵬程萬里發表於2018-06-08

0X01 引子

反彈Shell廣泛應用於遠端控制下的許可權維持,通過反轉攻(客戶端)和受(服務端)的角色,來實現條件限制,尤其是內網情況下的遠端連線。

反彈Shell的工具和實現方法多種多樣,只要能夠讓被控端通過網路傳送資料到控制端,並且實現資料的解析即可完成控制過程。

最近在繼續瞭解網路協議,於是突然想在DNS資料包中插入一些偽造的命令來實現解析,本來準備自己嘗試寫一個DNS伺服器和DNS請求程式來實現反彈,不過剛動筆就看到了別人開源的程式,於是直接使用別人的程式來學習了。

https://github.com/ahhh/Reverse_DNS_Shell

為了執行測試更方便,去掉了程式中的加解密功能,額外的Python包只需要dns和dnslib

0X02 DNS

為了關聯主機和IP地址對應關係而誕生的DNS本身,不需要我在這裡贅述了。跳過域名構成、查詢過程等可以輕鬆在網路查詢到的內容,我們直接來看看DNS的包構成


在smtp那篇文章中,我們提過一層一層洋蔥狀的協議包裹,在這裡,我們跳過以太、IP、UDP頭,直接到DNS資料的部分。

  • 標誌著資料開始的是Tran ID段,所有的問答資訊都需要一定的機制來保證對應,這部分應該就是對應機制中的一部分。
  • 緊接著的Flags,0x0100表明了一些查詢屬性。
  • Queries中是我們所要查詢的host,查詢型別。作為A型別查詢,得到的是host的IP,這裡也是我們做手腳的地方,不過TXT型別可以插入一些附加的資訊,更適合我們用來構造命令語句。

伺服器回應包如下:

  • 作為回應的Tran ID,它和查詢包相同。
  • Flags中標準回應標誌位
  • 重複顯示的Queries
  • 回應的Answers資訊。通過CNAME查取主機規範名,再通過規範名查取對應IP。

利用這種相互應答的特性,我們初步計劃通過以下流程來實現我們的反彈Shell


0X03 程式

原始的程式可以在上面的github中找到,這裡貼出我們去掉加解密的部分程式。

先說DNS伺服器的部分


這一部分封裝了對DNS的應答,payload裡是被控端發來的查詢資訊,也就是上一次命令執行後的回顯,而out是我們這一次的命令,封裝成了TXT的應答包


這部分對於被控端的查詢包進行解析,從中獲取到地址和資料,對於資料,解析出其中的命令回顯,並且初始化一個應答包。

主函式中使用socket監聽相關埠,對於監聽到的包按照預定流程進行處理。

再來看看被控端傳送的部分


首先是整個流程一覽,從程式中可以很清晰的看到建立連線,解析命令,執行命令,傳送回顯的過程。



構造的url,也就是命令回顯,對於沒有命令的,會返回nxt。利用回顯構造查詢語句。


這兩段程式對於收到的文字格式的命令進行解析和執行,沒有太多的東西可以講。只是注意格式的擷取,並且考慮對Linux和Windows的命令之間轉換。


這部分負責傳送DNS查詢,按照與伺服器約定的格式構造包並且進行傳送。

0X04 測試

我們需要先執行伺服器端程式,然後執行被控端程式。我的服務端程式在一臺Ubuntu主機上,被控端在我的Win10機器上。



這是被控端第一次連線時傳送的包,因為控制端還沒有指令,第一次連線傳送的是空包,其中Name的值bnh0就是我之前所說的NXT


而第二個包就是控制端傳送的指令,在TXT中傳送的就是指令whoami的base64編碼,

可以對比和我之前實際抓包的不同之處,對照可以看出我們在DNS包的哪些地方做過修改。

0X05 延伸

其實相關的DNS隧道技術原理應該差不多,都是在本來應該放DNS規定資訊的地方放入了其他的東西,來達到一些意想不到的結果。

當然,RFC還有許多協議可以讓我隨意構造去做測試,下一步考慮寫一個多協議支援的Fuzzing工具 :)



相關文章