Mysql溯源反制-任意文件讀取👻


Mysql溯源-任意文件讀取👻

前言

讀了《MySQL蜜罐獲取攻擊者微信ID》的文章,文中說明了通過mysql蜜罐讀取攻擊者微信ID的過程,抱着學習的態度嘗試了一下

原理

mysql中有一個load data local infile函數能夠讀取本地文件到mysql數據庫中。當攻擊者用爆破mysql密碼的掃描器掃描到我們的mysql並連接上的時候,客戶端(攻擊者)會自動發起一個查詢,我們(服務端)會給與一個回應,我們在回應的數據包中加入load data local infile讀取攻擊者的本地文件到我們數據庫中,達到反制的目的。

image

具體過程

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服務器沒有開啟這個功能執行時會報錯:

image

我們可以通過如下命令查看功能狀態

show global variables like 'local_infile';

image

我們通過如下命令開啟這個功能:

set global local_infile=1;

然后我們通過如下命令嘗試讀取本地的C盤目錄下的1.txt文件

image

load data local infile 'C:/1.txt' into table test fields terminated by '\n';

image

通信過程

我們模擬一下攻擊者通過掃描器連接MySQL數據庫的通信過程
工具:Wireshark

首先我們通過Wireshark抓取通信流量查看一下通信過程

注意:
當自己電腦既是客戶端又是服務器時,互相訪問時流量並沒有經過網卡,windows系統又沒有提供本地回環網絡的接口,
wireshark在windows系統上默認使用的是WinPcap來抓包的,用它監控網絡的話只能看到經過網卡的流量,看不到訪問
localhost的流量,所以才會出現第一次連接始終沒有數據包的狀況。解決這個問題的兩種辦法是:要么服務器和客戶端
不要在同一台機器上,要么用Npcap來替換掉WinPcap,Npcap提供環回接口

1. 首先是Greeting包,返回了服務端的版本信息

image

2. 接着是客戶端發起連接請求

image

3. 然后經過TCP的三次握手之后,客戶端會自動發起一次查詢,服務端會給予一個回應

image

我們就是在上面的最后一步回應中插入讀取客戶端本地文件的語句,從而讀取客戶端的本地文件到數據庫表中。

漏洞復現

下載地址:https://github.com/allyshka/Rogue-MySql-Server

1. 解壓壓縮包

然后編輯rogue_mysql_server.py這個文件,修改里面的讀取文件的路徑(windows或者linux的路徑都行)

image

2. 用python啟動rogue_mysql_server.py

3. 查看數據庫端口是否開啟nmap -sS -p- 192.168.33.222

image

4. 我們用自己的數據庫連接軟件(例如Navicat)去連接我們剛剛創建的惡意mysql服務器

  • IP:192.168.33.222
  • PORT:3306
  • USERNAME:root
  • PASSWORD:(空的就行)

image

5. 然后我們會看到當前目錄下面多了一個mysql.log文件,我們發現本地的C:/1.txt文件被讀取到了mysql.log文件中

image

6. 我們通過Wireshark看看這個實驗過程通信的數據包

  • 首先Greeting包,服務器返回版本信息
  • 然后就是客戶端請求連接的登錄包
  • 接着就是服務器回應的一個數據包(ok)

image

  • 接下來我們重點分析后面分析后面三個數據包

這個數據包是像形如Navicat這種數據庫連接軟件在連接之前都會自動發送的一個請求查詢的。從查閱資料來看,大多數MySQL客戶端以及程序庫都會在握手之后至少發送一次請求,以探測目標平台的指紋信息

SET NAMES utf8mb4

image

接下來就是服務器端給出的回應包,但是這個數據包里面大有文章,包含了讀取本地C:/1.txt文件的命令

image

然后我們就發現接下來客戶端就把服務器請求的1.txt文件傳輸到了服務器。

image

實驗結束

參考文章

  1. https://blog.csdn.net/weixin_46164380/article/details/105230747
  2. https://blog.csdn.net/Java0258/article/details/112332367


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM