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
檔案傳輸到了伺服器。