Mysql溯源-任意文件讀取👻
前言
讀了《MySQL蜜罐獲取攻擊者微信ID》的文章,文中說明了通過mysql蜜罐讀取攻擊者微信ID的過程,抱着學習的態度嘗試了一下
原理
mysql中有一個load data local infile
函數能夠讀取本地文件到mysql數據庫中。當攻擊者用爆破mysql密碼的掃描器掃描到我們的mysql並連接上的時候,客戶端(攻擊者)會自動發起一個查詢,我們(服務端)會給與一個回應,我們在回應的數據包中加入load data local infile
讀取攻擊者的本地文件到我們數據庫中,達到反制的目的。
具體過程
LOAD DATA INFILE
LOAD DATA INFILE語句用於高速地從一個文本文件中讀取行,並寫入一個表中。文件名稱必須為一個文字字符串。
LOAD DATA INFILE 是 SELECT ... INTO OUTFILE 的相對語句。把表的數據備份到文件使用SELECT ... INTO OUTFILE,從備份文件恢復表數據,使用 LOAD DATA INFILE。基本語法如下:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char' ]
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name = expr,...)]
這個功能默認是關閉的,當我們本地mysql服務器沒有開啟這個功能執行時會報錯:
我們可以通過如下命令查看功能狀態
show global variables like 'local_infile';
我們通過如下命令開啟這個功能:
set global local_infile=1;
然后我們通過如下命令嘗試讀取本地的C盤目錄下的1.txt文件
load data local infile 'C:/1.txt' into table test fields terminated by '\n';
通信過程
我們模擬一下攻擊者通過掃描器連接MySQL數據庫的通信過程
工具:Wireshark
首先我們通過Wireshark抓取通信流量查看一下通信過程
注意:
當自己電腦既是客戶端又是服務器時,互相訪問時流量並沒有經過網卡,windows系統又沒有提供本地回環網絡的接口,
wireshark在windows系統上默認使用的是WinPcap來抓包的,用它監控網絡的話只能看到經過網卡的流量,看不到訪問
localhost的流量,所以才會出現第一次連接始終沒有數據包的狀況。解決這個問題的兩種辦法是:要么服務器和客戶端
不要在同一台機器上,要么用Npcap來替換掉WinPcap,Npcap提供環回接口
1. 首先是Greeting包,返回了服務端的版本信息
2. 接着是客戶端發起連接請求
3. 然后經過TCP的三次握手之后,客戶端會自動發起一次查詢,服務端會給予一個回應
我們就是在上面的最后一步回應中插入讀取客戶端本地文件的語句,從而讀取客戶端的本地文件到數據庫表中。
漏洞復現
下載地址:https://github.com/allyshka/Rogue-MySql-Server
1. 解壓壓縮包
然后編輯rogue_mysql_server.py
這個文件,修改里面的讀取文件的路徑(windows或者linux的路徑都行)
2. 用python啟動rogue_mysql_server.py
3. 查看數據庫端口是否開啟nmap -sS -p- 192.168.33.222
4. 我們用自己的數據庫連接軟件(例如Navicat)去連接我們剛剛創建的惡意mysql服務器
- IP:192.168.33.222
- PORT:3306
- USERNAME:root
- PASSWORD:(空的就行)
5. 然后我們會看到當前目錄下面多了一個mysql.log文件,我們發現本地的C:/1.txt文件被讀取到了mysql.log文件中
6. 我們通過Wireshark看看這個實驗過程通信的數據包
- 首先Greeting包,服務器返回版本信息
- 然后就是客戶端請求連接的登錄包
- 接着就是服務器回應的一個數據包(ok)
- 接下來我們重點分析后面分析后面三個數據包
這個數據包是像形如Navicat這種數據庫連接軟件在連接之前都會自動發送的一個請求查詢的。從查閱資料來看,大多數MySQL客戶端以及程序庫都會在握手之后至少發送一次請求,以探測目標平台的指紋信息
SET NAMES utf8mb4
接下來就是服務器端給出的回應包,但是這個數據包里面大有文章,包含了讀取本地C:/1.txt
文件的命令
然后我們就發現接下來客戶端就把服務器請求的1.txt
文件傳輸到了服務器。