※勉強目的のみ。悪用厳禁。
ローカルの検証環境で実行しています。
参考
https://www.redtimmy.com/java-hacking/apache-tomcat-rce-by-deserialization-cve-2020-9484-write-up-and-exploit/www.redtimmy.com
情報
tomcat.apache.org www.jpcert.or.jp
再現
脆弱性が存在するTomcat 9.0.31を使用する。
脆弱な環境にするため、セッションの永続化のためにPersistenceManagerをFileStoreを使用するようにする。
設定前
設定後
コマンドを実行するために細工したシリアライズデータを作成する。
シリアライズデータを読み込めるようにGroovyの2.3.9をlibディレクトリに設置する。
シリアライズデータをtomcatディレクトリのトップに設置する。
これからコマンドを実行していく。
実行するコマンドは「touch /tmp/nick310」。
実行する前のtmpディレクトリを確認する。
burpで設置したセッションファイルを指定してリクエストを送信する。
すると、500エラーとなり、「ClassCastException」のスタックトレースが表示された。
tmpディレクトリを確認すると、「nick310」が作成されている。
このことから、コマンド実行がされていることが確認できた。
修正後
脆弱性が修正されたtomcat9.0.36を使用する。
環境は同様に設定する。
同様に実行したが、500エラーにならなかった。
修正点である、保管場所の確認が働いていると思われる。
github.com
おまけ デシリアライズ深堀り
windowsで電卓(calc.exe)を実行するようにシリアライズデータを作成した。
どこで電卓が実行されるのか追ってみた。
1.readObject()の使用
2.ObjectInputStream:430 readObject0(false)
3.ObjectInputStream:1694 checkResolve(readOrdinaryObject(unshared))
4.ObjectInputStream:2087 readSerialData(obj,desc)
5.ObjectInputStream:2216 slotDesc.invokeReadObject(obj,this)
6.ObjectInputStream:1160 readObjectMethod.invoke(obj,new Object[]{in})
7.Method:566 ma.invoke(obj,args)
8.DelegatingMethodAccessorImpl:43 delegate.invoke(obj,args)
9.NativeMethodAccessorImpl:62 invoke0(method,obj,args)
10.AnnotationInvocationHandler:597 streamVals.entrySet()
10を実行後に電卓が起動した。
おまけのおまけ
10のあたりで作成された「streamVals」を変数タブで開くと電卓が起動する。
謎。