Spyadmin — хорошо пиши код, но не сейчас

spy00123

На днях, мой одноклассник коллега скинул мне граммульку панельку очередной шпионской сборки, сделанной на основе TeamViewer. Авторы сего кибероружия уже давно в блеках (spyadmin aka vzlomov, не сочтите за рекламу), поэтому мы можем спокойно изучить кодес на предмет разного рода интересностей.

Как говорится, приступим.

Структура такая:

spy003

По файлам вкратце:

  • config.php - подключение к бд, настройки логина/пароля.
  • getinfo.php - гейт для ботов.
  • index.php - основной код панели.
  • install.php - редактирование настроек
  • lang.php - языки.
  • setcmd.php - отправка команд ботам.

В папках ничего особенного - стили, js, картинки.

И SQL-инъекции даже мало...

Для начала, было решено просмотреть код гейта. Как назло, практически все параметры фильтровались. Разработчик совершил только две ошибки:

Но и этих двух ошибок хватило нам с лихвой. Выполнение SQL-инъекции немного затруднял тот факт, что все данные идущие в гейт должны были быть зашифрованы с помощью RC4.

В итоге я набросал небольшой скрипт для работы с SQL-инъекцией:

В принципе, можно было бы дописать код для раскрутки time based скули, поиграть в угадайку пару часов и получить в итоге все Bot ID (больше ничего ценного в базе нет). Пароль по умолчанию, для всех ботов одинаковый - угоняй, веселись, мародерствуй.

У нас уже была возможность менять записи с помощью UPDATE, а данные из базы выводились в панели и мы плавно переходим к...

XSS. Активная XSS.

Почти как и в случае с SQLi, в панели (index.php) практически все переменные фильтровались. Исключение составляли лишь $bot_comment, $bot_username, $bot_compname (почему - непонятно). Немного меняем код в прошлом скрипте (чтобы вывести document.cookie):

Запускаем скрипт, заходим в админку:

spy001

Великолепно. По идее, остается только отправить куки на свой сниффер...
Но не тут то было:

Есть привязка к IP, а значит, просто воровать куки смысла нет. Необходимо получить значение переменной $cfg_secret_hash. Для этого мы обратимся с помощью ajax запроса к скрипту install.php, из которого и выдернем значение нужной нам переменной.

Берем такой вот кодес:

Пихаем все это на pastebin, и скармливаем с помощью SQLi админке.

Как только администратор ботнета зайдет в панель, нам придет секретный хеш. И теперь у нас есть все, чтобы зайти в админку - генерируем хеш, подставляем его в куку to_login и спокойненько заходим.

Шелл, который я залил

Теперь, когда мы знаем, как попасть в админку, посмотрим что внутри. И начнем (да и закончим на нем) с файла install.php. Код там просто потрясающий:

Мы редактируем конфиг:

spy002

В любое поле, после обычного значения, добавляем:

Сохраняем. Переходим по адресу upload.php и спокойно заливаем шелл.

Взболтать, но не смешивать.

Соединим все уязвимости вместе:

SQL-инъекция -> Активная XSS -> Заливка шелла.

Заливаем этот js-код на какой-нибудь шелл:

И внедряем его в базу ранее описанным методом. Стоит заметить, что не надо выбирать для хранения js-кода сайты с самоподписанными сертификатами или крупные сервисы (pastebin например) - в обоих случаях код может просто не сработать. Галимый копеечный шелл - самое то!

Как только ботовод зайдет на страничку, в корне будет лежать заливалка файлов. При желании можно совсем немного изменить код, и сразу лить шелл.

Заключение.

Я даже не упомянул о корявой LFI, нескольких CSRF и прочих мелочах, как мне кажется, вышеописанного и так достаточно. Вот так, легко и просто, можно попасть в админку бота, который продавался (и все еще продается) за 500$. Или, если посмотреть с другой стороны, за свои же деньги можно прикупить себе соседа - кидалу, мента, кребса, груб-ибебса. Я заранее соглашусь, что шанс такого расклада невелик, но зачем лишние риски?

Ириски кис-киски И риски действительно есть - достаточно пары запросов в гугл:

И далее:

%d0%b1%d0%b5%d0%b7%d1%8b%d0%bc%d1%8f%d0%bd%d0%bd%d1%8b%d0%b9

И спустя некоторое время:

%d0%b1%d0%b5%d0%b7%d1%8b%d0%bc%d1%8f%d0%bd%d0%bd%d1%8b22%d0%b9

И еще нашлось:

Веселья вам.