Nick Security Log

securityを始めとしたNickのブログです

Apache Tomcat CVE-2020-9484 再現

※勉強目的のみ。悪用厳禁。
ローカルの検証環境で実行しています。

参考
www.redtimmy.com

情報

tomcat.apache.org www.jpcert.or.jp

再現

脆弱性が存在するTomcat 9.0.31を使用する。
f:id:NickShadows:20200620212856p:plain


脆弱な環境にするため、セッションの永続化のためにPersistenceManagerをFileStoreを使用するようにする。

設定前
f:id:NickShadows:20200620213851p:plain 設定後
f:id:NickShadows:20200620213902p:plain

コマンドを実行するために細工したシリアライズデータを作成する。
f:id:NickShadows:20200620214459p:plain

シリアライズデータを読み込めるようにGroovyの2.3.9をlibディレクトリに設置する。
f:id:NickShadows:20200620214713p:plain

シリアライズデータをtomcatディレクトリのトップに設置する。
f:id:NickShadows:20200620215045p:plain

これからコマンドを実行していく。
実行するコマンドは「touch /tmp/nick310」。
実行する前のtmpディレクトリを確認する。
f:id:NickShadows:20200620215908p:plain

burpで設置したセッションファイルを指定してリクエストを送信する。
すると、500エラーとなり、「ClassCastException」のスタックトレースが表示された。
f:id:NickShadows:20200620220653p:plain f:id:NickShadows:20200620220701p:plain

tmpディレクトリを確認すると、「nick310」が作成されている。
このことから、コマンド実行がされていることが確認できた。
f:id:NickShadows:20200620221158p:plain

修正後

脆弱性が修正されたtomcat9.0.36を使用する。
f:id:NickShadows:20200621120306p:plain

環境は同様に設定する。
f:id:NickShadows:20200621120328p:plain f:id:NickShadows:20200621120339p:plain f:id:NickShadows:20200621120353p:plain f:id:NickShadows:20200621120402p:plain

同様に実行したが、500エラーにならなかった。
f:id:NickShadows:20200621120752p:plain


修正点である、保管場所の確認が働いていると思われる。
github.com

おまけ デシリアライズ深堀り

windowsで電卓(calc.exe)を実行するようにシリアライズデータを作成した。
どこで電卓が実行されるのか追ってみた。

1.readObject()の使用  

f:id:NickShadows:20200621122523p:plain

2.ObjectInputStream:430 readObject0(false)  

f:id:NickShadows:20200621122613p:plain

3.ObjectInputStream:1694 checkResolve(readOrdinaryObject(unshared))  

f:id:NickShadows:20200621122927p:plain

4.ObjectInputStream:2087 readSerialData(obj,desc)

f:id:NickShadows:20200621123030p:plain

5.ObjectInputStream:2216 slotDesc.invokeReadObject(obj,this)

f:id:NickShadows:20200621123138p:plain

6.ObjectInputStream:1160 readObjectMethod.invoke(obj,new Object[]{in})

f:id:NickShadows:20200621123531p:plain

7.Method:566 ma.invoke(obj,args)

f:id:NickShadows:20200621123632p:plain

8.DelegatingMethodAccessorImpl:43 delegate.invoke(obj,args)

f:id:NickShadows:20200621123735p:plain

9.NativeMethodAccessorImpl:62 invoke0(method,obj,args)

f:id:NickShadows:20200621123827p:plain

10.AnnotationInvocationHandler:597 streamVals.entrySet()

f:id:NickShadows:20200621123928p:plain

10を実行後に電卓が起動した。

おまけのおまけ
10のあたりで作成された「streamVals」を変数タブで開くと電卓が起動する。
謎。
f:id:NickShadows:20200621124111p:plain f:id:NickShadows:20200621124122p:plain