Shakedown
- Джеки, где в твоем сервисе флаги хранятся?
- Откуда я знаю.
iCTF2007, 3 AM
Shakedown располагался где-то в районе
http://10.x.0.1:4242/. Регистрировал пользователей двух типов: исполнителей и менеджеров. При регистрации указывался логин и пароль, после чего можно было перейти на страницу с профилем и (теоретически) как-то свои данные менять. А именно: получать гонорары, записывать свежие треки (для исполнителей) и финансировать исполнителя (для боссов). Очень похоже на
Therapy.
Все интересное лежало в
/home/shakedown/public_html/. На первый взгляд, обычный веб на PHP (artists.php, bosses.php). Ха, ну конечно. В каждом из пхпшников лежало что-то типа:
А в настройках веб-сервера – редиректы на содержимое
/home/shakedown/public_html/shakedown/. В этой директории лежал суровый компилированный код на Python, исходников не было.
С технической частью, пожалуй, все. Что происходило с сервисом на игре:
Все 9 часов наш сервис стабильно и непоколебимо лежал в дауне. Уж не знаю, с какими бубнами плясали Дима и Арт вокруг капризного веб-сервера (не помню, что был за сервер, черт), какие читали мантры и как молились с веником, но сервис устоял. Он был доступен через веб, он регистрировал и логинил, разве что рождественские гимны не пел. Но официально не работал.
Как он функционировал – я понятия не имею. Ну то есть совсем. Некоторую серьезную часть игры мы пытались получить исходники, решив все положенные квесты – но завалились на втором, самом, кстати, легком.
Но, как ни странно, баг в сервисе обнаруживался сходу. Профили любых пользователей были доступны по идентификатору, без всяких там логинов/паролей. Достаточно было зайти на
http://$ip:4242/artists/view/some_ID/ .
Сначала я этому багу даже не обрадовалась – было понятно, что крутые команды это дело сразу найдут и закроют (особенно We_0wn_y0u – у этих ребят почти с самого начала были два квеста из трех), так что баг был благополучно забыт.
Игра шла, сервис лежал, квесты не решались. Потом у меня случился момент неприятия (отторжения, отрицания, как угодно :) Захотелось тупо узнать, что там хоть происходит-то на этом сервисе? У одной из команд зашла на какой-то пользовательский профиль и – о, чудо! – он прекрасно открылся через идентификатор. На флаг там был очень похож так называемый Confirmation Number, видимо, коды платежной операции.
И началось :-) Исходник эксплоита выглядел как-то так. Мелкий, много лишнего – лепился на лету.
К сожалению, полностью автоматизироваться не удалось по нескольким причинам.
Во-первых, диапазоны идентификаторов, которые надо перебирать у команд сильно отличались, от 30±10 (если сервис долго лежал)и до 400±10 (у лидеров). За раунд постилось примерно
5–10 флагов. Понятно, что автоматизировать поиск нужного диапазона было нереально – слишком долго, сервис все же не летал. Поэтому это аккуратно делалось вручную и не для всех команд.
Во-вторых, на игре показалось, что эффективнее будет постить флаги вручную, чем учиться отлавливать баги scorebot'а. Интересных их было несколько: «Пожалуйста, не более 4х флагов в секунду от вашей команды», Internal Error и «Попробуйте запостить флаг позднее» – все три, как правило, позволяли через несколько попыток добиться от бота Flag accepted. Такая схема с ручной отсылкой флагов работала нормально, опять же из-за скорости, да и флаги портились не быстро.
Что в результате: как ни странно, такой очень несложный баг работал на всех командах, у кого shakedown был поднят – из тех, кого мы успели проверить, конечно. При этом scorebot ни разу не сообщил, что такой флаг уже запостили.