Команда от Neuronspace.ru (Neuron Team) приняла участие в отборочных играх CTF PHDays 2012. По результатам мы заняли 64 место, но, учитывая что собрались первый раз не только все вместе, но и большинство членов команды вообще первый раз (как и я сам) играют в подобное, вполне неплохо =) Главное для нас было попробовать свои силы, посмотреть глазами участников, как проходит процесс игры, и понять затянет или нет. Правда, была еще маленькая меркантильная цель, в будущем организовать CTF от Московского Хакспейса ;-)

Далее идут небольшие writeup’ы к заданиям, решенными нами:

PWN 300

Предыстория у этого задания одна из самых веселых. Southpark’ом управляют чужаки, которые делают с жителями, что захотят: арестовывают, банкротят и убивают! И конечно там был Kenny на котором я все тестировал…

К заданию прилагались исходники сервиса southpark, но в них было отличие от тех, которые на рабочем. В оригинальном в комментариях исходного кода было написано, что флаг в /etc/passwd, а в скаченных в /WEBFLAG.

В архиве лежало два файла:

  • web.py
  • process.pyc

При открытии web.py в глаза сразу бросается, что при отправке POST запросов мы отсылаем их process и нам выводится результат. Идем дальше, декомпилируем утилитой unpyc (я скачивал исходники и запускал на BT5 R3) и получаем вполне читабельный код. В коде встречается байткод, который запускает глобально заданные функции по имени из массива actions, в choice передаем номер массива, а в name переменную для вызываемой функции. В моем любимом Python, как и в php, есть хорошая функция eval, воспользуемся ею. Запускаем FireFox с HackBar и делаем POST-запрос вида:

actions=eval&actions=arrested&name=open("/etc/passwd").read()&choice=%00

На выходе у нас содержимое файла с паролями в котором сразу видно md5 хэш у пользователя flag.

Powned!

Real World 300

Для задания выдали архив Blow_up_the_planet с большим количеством папок, поэтому первым дело был написан скрипт, который обходит директорию и вытаскивает файлы:

#! /usr/bin/python
# -*- coding: utf-8 -*- #

import os

dirname = "F:\works\PHDaysCtf2012\\task3_rw"

for (thisDir, subHere, filesHere) in os.walk(dirname):
    for filename in filesHere:
        fullname = os.path.join(thisDir, filename)
        fd = open("C:\\temp\\" + filename, "wb")
        print fullname
        fd.write(open(fullname, "rb").read())
        fd.close()

Получили:

g1.zip
g2.zip
g3.zip
g4.zip
SAM
SYSTEM
DEFAULT
edb.chk
ntds.dit
Reactor.zip
Blow up the planet.zip

Благо с файлом ntds.dit уже приходилось сталкиваться в ходе подготовки семинаров по пентесту для Esage Lab, поэтому заряжаем этот файл в утилиту libesedb, только надо собрать из исходников последнюю версию, так как атакуемая машина крутится под Windows Server 2008 R2, а первая версия этой утилита была рассчитана на 20002003 и проект теперь находится на google code.

esedbexport -l /tmp/esedbexport.log -t /tmp/ntds.dit ~/Desktop/PHD2012/pwn300/ntds.dit

Получаем много интересных таблиц с не менее интересными данными, далее обрабатываем их отдельными скриптами из программы NTDSxtract. Для этого задания пригодятся два из них:

  • dsusers.py
  • dstimeline.py

Первый ватаскивает хэши, а второй показывает изменения в журнале:

2012-12-14 01:32:58|Modified|3764|Generator  #4 053n14stg3n\nDEL:38d2982c-9b45-44f8-a93a-ef92884f13ff ()

Вот и первый пароль к архиву g4.zip: 053n14stg3n. А его содержимое: *#*#*#*#*#*#*]

Есть хорошая статья по работе с этой утилитой и есть перевод в журнале Хакер за Январь 2012, но лучше читать в оригинале.

Можно пойти более простым путем, запустить Windows Password Recovery, подать на вход файл ntds.dit и она сами вытащит все хэши и подберет хоть с помощью CPU, хоть с GPU. Но у нее есть минус, она платная — 65$, поэтому можно воспользоваться hashcat.

Сходу подобрали хэши к следующим пользователям:

Administrator: 217e50203a5aba59cefa863c724bf61b:P@ssw0rd!
Guest:31d6cfe0d16ae931b73c59d7e0c089c0:P@ssw0rd
Reactor:8833023b5bda9bc5fc96a617f09a8142:startme
SuperLaser:de2c9ace2cd4deefe80f95290ecd5c6b:Init

Вот на этом моменте, честно признаться, мы забросили, так как не у всех были мощные видеокарты и время брута занимало довольно большое количество времени. Но, спасибо Оргам, вчера вечером они выложили маски, по которым хэшики брутились на:

  • GTX 500 — по 40+ минут
  • GT 9600 — по 2.5 часа

Первым делом брутили хэши по второй и третей маске, так как было подозрение, что в первом архиве файл содержит зеркальное отображение содержимого четвертого (так и получилось).

generator2: c84d625f50c5629358a74a4080e4a960:tost4Rtre
generator3: 08fb6f6ab8e5a0ca45cfe9b04e28c7c2:anDsup3rl

Пробуем на Reactor пароль:[#*#*#*#*#*#*#++++CLEAR++++~~~~ENERGY~~~~*#*#*#*#*#*#*]

В нем лежит слово » SuperLaser!» Вспоминаем пароль к пользователю SL (да и по логике работы лазера Звезды Смерти, надо инициализировать наш объект ). Пробуем «Init SuperLaser!» и видим флаг и птичку из Angry Birds в ASCII коде.

Powned!

P.S. Спасибо оргам за интересные и сложные (хитро..сделанные) задания! P.S.S. Особенно за второе =)