標籤:sqlmap udf getshell sqlmap mysql root
情境介紹:
今天的情境是前一周在內網滲透的時候遇到過的,找到一個mysql資料庫弱口令。
帳號和密碼分別是root,也就是mysql中的dba。
這裡其實許可權很大了,首先mysql的root使用者具有檔案寫入權限,同時mysql5.0以上,提供一個system函數,而這個函數通常被攻擊者用作shell的介面。
那時在遇到這個弱口令時,我就在想怎樣快速的拿下這台主機,通過mysql的root帳號。是否有比較快速的方法,這時候,我當然想到了sqlmap。經過查詢github上的文檔,我發現了這樣的參數。
下面,讓我們一起來學習一下這個情境吧!
環境:
兩台機器,一台是kali linux,作為mysql伺服器,開放ssh服務以及mysql服務,ip地址為192.168.80.128。
另外一台是ubuntu,作為攻擊主機,安裝有nmap、sqlmap,ip地址為192.168.80.129。
1、首先我們對nmap掃描一下常見連接埠,
命令如下:nmap -A -n -T3 192.168.80.128
掃描結果如:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/77/B5/wKiom1ZsTUnBK6BWAAB5EbJy_iw700.png" border="0" width="700" />
2、第二步主要是通過爆破工具發現了mysql的弱口令,這一步忽略了。
3、現在來講主要內容,我們獲得mysql的root帳號和密碼之後怎樣利用
1)我們先來看一下github上的sqlmap文檔(ClickMe)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/77/B4/wKioL1ZsTU3BfB2zAACPYI0AZNg063.png" border="0" width="700" />
我們可以看到這是一個"-d"選項,用法在For example有
整一個的文法為:" DBMS://USER:[email protected]_IP:DBMS_PORT/DATABASE_NAME"或者是" DBMS://DATABASE_FILEPATH"。
[1]DBMS:代表所使用的資料庫,如我們這裡是mysql
[2]USER:對應我們資料庫的使用者,如我們這裡是root
[3]PASSWORD:對應我們資料的密碼,如我的伺服器為3erver
[4]DBMA_IP:資料庫伺服器對應的ip地址,如我這裡為192.168.80.128
[5]DBMS_PORT:資料服務器所使用的連接埠,不能省略。預設我們寫3306
[6]DATABASE_NAME:你要使用的資料庫名,因為mysql一般會有test資料庫,如我這裡使用test。假如沒有test,我們可以自己使用create database test;建立一個
2)下面我們開始利用,伺服器上我首先以root身份運行mysql資料庫。看看會發生什麼事情。在Mysql中,以什麼身份運行資料庫,會在/etc/mysql/my.cnf這個設定檔設定。所以下面我將使用者mysqld節點中的user修改為root。如:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/77/B4/wKioL1ZsTU3R2Dz3AAAy7O07SNM493.png" border="0" width="626" />
我們通過查看進程,可以看到在服務啟動的時候,mysqld已經帶上--user=root這個選項了。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/77/B5/wKiom1ZsTUqT8mtPAAArBz0ZrP8514.png" border="0" width="700" />
3)現在我開始根據sqlmap的選項在kali裡面對mysql伺服器進行串連。
sqlmap -d "mysql://root:[email protected]:3306/test" -f
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/77/B4/wKioL1ZsTU3jXctOAAA6_slSq4k666.png" border="0" width="700" />
上面-f參數是列印mysql伺服器的版本資訊。如
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/77/B5/wKiom1ZsTUqCsGshAABgzHcE4x4123.png" border="0" width="700" />
我們之後將-f參數更換成--os-shell參數
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/77/B5/wKiom1ZsTUqRbPDWAAA9xssY_eE655.png" border="0" width="700" />
之後sqlmap會讓我們選擇伺服器的位元,要是你不知道就猜一個,反正兩個選項,不是32位就是64位。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/77/B4/wKioL1ZsTU2wSZLEAADuDL0ufYc067.png" border="0" width="700" />
我這裡選擇64位,然後系統就會替我們上傳對應位元的動態連結程式庫檔案,這個檔案提供system函數以便我們可以執行系統命令。,
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/77/B5/wKiom1ZsTUrjLP32AAAXNtpC26k829.png" border="0" width="700" />
當我們輸入whoami命令時候,系統會詢問我們是否返回命令的輸出。我們這裡選擇"a",代表總是返回命令的輸出。可以看到這裡可以擷取到許可權與我們運行mysql伺服器使用者權限一致。也就是說我們這裡擷取root許可權所有,比如查看/etc/passwd,nc反彈shell、添加使用者等。
ifconfig資訊:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/77/B4/wKioL1ZsTU3S6wfoAAB1jw0cWTY421.png" border="0" width="700" />
查看/etc/passwd檔案,
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/77/B5/wKiom1ZsTUrw0Z5DAAA7X_JP7Sk469.png" border="0" width="597" />
nc反彈shell
(1)執行nc,在Mysql伺服器上2333連接埠進行監聽。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/77/B4/wKioL1ZsTU6j8oTyAAAGIvIlF14863.png" border="0" width="498" />
(2)我們查看我們攻擊機的ip,可以看到的確是192.168.80.129。
我們使用ncat 192.168.80.128 2333 來進行串連反彈shell。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/77/B5/wKiom1ZsTUrRvS7WAABdsz_BCw8061.png" border="0" width="700" />
(4)到這裡,我們已經將怎樣快速利用一個mysql的root帳號來擷取系統許可權的過程示範完畢。
4、局限性是什嗎?
(1)我們這裡提到過,運行mysql的使用者需要是root帳號。因為這裡整個利用流程是這樣的
[1]sqlmap通過root的帳號和密碼串連上遠端資料庫
[2]sqlmap將udf檔案夾下對應系統平台的64位或者32位的動態連結程式庫檔案上傳到遠端資料庫的
/usr/lib/mysql/plugin/目錄下
[3]sqlmap用過已經上傳的動態連結程式庫檔案來調用system函數來執行使用者輸入的命令。
(2)在上面提到,我們要將動態連結程式庫傳到/usr/lib/mysql/plugin/目錄下,但是這個目錄只有root帳號具有寫入權限。也就是說,要是運行mysqld的使用者不是root,那麼我們便無法通過這種方法來執行系統命令。
(3)一般windows上的mysql root帳號能執行系統命令的比較多,因為需要專門建立一個非管理員權限的使用者去運行mysql,所以有一部分系統管理員將mysql運行在管理員權限的帳號上,這個時候我們將擷取到它的許可權。
5、防禦策略
(1)linux的最小許可權原則,不要給mysql資料的plugin檔案夾賦予寫入權限,即使賦予了也要限制好擁有許可權的使用者。我們可以登入資料庫之後,使用
select @@plugin_dir;
來查看plugin的目錄,如,是我在windows上擷取到的plugin_dir
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/77/B4/wKioL1ZsTU6S6OOkAAAVRJpi0Do753.png" border="0" width="433" />
(2)最好只讓root在localhost上運行,而能夠遠端存取的資料庫使用者只分配增刪改查等許可權,不要分配FILE許可權。
6、這一篇文章是根據情境模式來寫的,然後介紹工具以及利用方法。
本文出自 “且行且欣賞” 部落格,請務必保留此出處http://skytina.blog.51cto.com/6834539/1722403
滲透學習筆記--情境篇--通過mysql的root帳號來get shell