Хакеры из компании AirTight нашли уязвимость в WPA2, о которой они расскажут на Black Hat Arsenal и DEFCON18 в Лас-Вегасе 29 и 31 июля, соответственно.

А еще 4 августа в 11:00 PDT (время по Калифорнии) AirTight проведет вебинар вот тут.

Взято отсюда: http://www.airtightnetworks.com/WPA2-Hole196.

В этом посте описаны различные виды SQL-выражений, которые можно встретить в приложениях, работающих с базами данных: embedded, static, dynamic, prepared, parameterized (bind variables) SQL. Данные типы не являются непересекающимися множествами. Например, embedded является способом записи, а bind variables используется как в статических (неявно), так и в динамических (явно) запросах.

Допустим, обнаружено приложение на PHP+SQLITE3. Допустим, в нем имеются уязвимости LFI+SQLINJ. В этом посте хочу описать технику позволяющую в некоторых случаях подгрузить бэкдор на уязвимый сервер.

Utility for entropy calculation of 32-bit executable and binary files is released. It can be useful for express searching of a file blocks with a high entropy - encrypted chunks, encryption keys, etc. Utility can be built as a IDA plugin and as a standalone program.
It allows to calculate entropy of a sections of the file by utility launch, calculate entropy of any block of the file, build entropy map of a specified section.

ida-ent-gen.PNG

Double-click on the row in ListView copies Address and Length to appropriate fields on the form. Calculate button shows entropy for a data block from StartAddress to StartAddress + Length. Draw button allows to build entropy map of the data block. ChunksSize specifies a length of chunks used for entropy calculation in this mode. And StepSize field is used as a indent between current and next chunks. Double-click on the map in IDA plugin mode allows to go to the specified location in IDA listing.

ida-ent-graph.PNG

Deep Analyze button performs a lot of calculations from StartAddress to StartAddress + Length with a varying block size from 1 to ChunkSize and with StepSize indent. If calculated entropy value is greater than MaxEntropy for the chunk, it will be added to result report. Double-click on the row in IDA plugin mode allows to go to the specified location in IDA listing.

ida-ent-table.PNG

Launch feature in IDA plugin mode is IDA listing selection check. I.e. utility fills StartAddress, Length and pushes to Calculate button. To start utility as IDA plugin simply copy in to ./IDA/plugins/ and press F11 (default hotkey) or choose Edit -> Plugins ->Entropy plugin.

In standalone mode utility shows GetOpenFileName dialog when started without command-line parameters. Command line format is "ida-ent.exe [-sw] filename", where switches are one of the following: --binary (-b), --pe (-p), --elf (-e). By default utility tries to determine file format (PE, ELF) by checking signature.

UPD: Overlay (non-empty data block in the rest of file) detection was added in standalone mode for PE (checked) and ELF (not checked). Problem with a window focus in plugin mode was fixed. Also utility was released under GNU GPL.

Sources (for MS Visual C++ 2008 EE) and precompiled standalone utility, IDA Pro 5.5 plugin, IDA Free 4.9 plugin are available in the archive.

Binary500 является исполняемым ELF'ом для SPARC V9. Дизассемблированный листинг на первый взгляд похож на смесь IA32 + ESA/390 в синтаксисе AT&T. После знакомства с архитектурой и используемыми соглашениями, все становится на свои места:
Процессор имеет 32 64-х битных регистров общего назначения: global %g0-%g7, out %o0-%o7, local %l0-%l7, in %i0-%i7, 32 регистра FPU и систему быстрых, но простых команд длиной 32 бита каждая. Некоторые регистры имеют особое назначение: %g0 всегда содержит ноль, %o6 также известен как %sp (stack pointer), %i6 - %fp (frame pointer), %o7 содержит адрес текущей инструкции при выполнении вызова подпрограммы и используется для определения адреса возврата. Регистры %o0-%o5 используются для передачи аргументов в процедуры, команда, save сохраняет и меняет mapping регистров в процедуре, и %i0-%i5 будут содержать значения из %o, то есть, переданные аргументы. %o0 содержит возвращаемое значение из процедуры.
Также стоит отметить специфику выполнения циклов: инструкция, следующая за командой условного перехода исполняется всегда. Но если условный переход не был выполнен, ее результат аннулируется.
Можно приступать к разбору.

Binary200 представляет собой обычный 32-х битный ELF. Наверное его можно позапускать, но это не наш метод.
IDA подсказала, что на борту имеется 2 больших функции sub_B40 (содержит connect + write) и main (содержит printf). Коннект показался интереснее.
В sub_B40 видим копирование 4-х массивов из области глобальных переменных в стековый буфер. Далее 2 цикла расшифровки скопированных буферов. Единственная сложность - это заметить циклы расшифровки, разбавленные весьма своеобразной реализацией функции вроде return (str + strlen(str)).
Расшифровав строки, получаем 'http://is.gd/bWsIR' и '192.168.69.77'. Конечно, сразу же смутил сокет типа AF_UNIX, а этот адрес укрепил подозрение в мусорности этого кода.
В main видим похожий код расшифрования и сразу сразу получаем ссылку http://is.gd/bUBRD, ведущую на фильм про зоофилию в Колумбии. Название страницы и есть ответ. Скрипт прилагается.

Binary300 - x86-64 ELF. IDA сказала, что он считает md5 от 256 байт по смещению 0 и смещению 17 от себя, проверят хеш по фильтру Блума и ксорит хеши с Encrypted Key, если хеш прошел проверку. Результат двух ксоров и есть Decrypted Key. Родилось предположение проверить хеши от всех смещений файла фильтром Блума, поксорить с Encrypted Key и получить флаг. Сначала была частично выдрана реализация фильтра из бинарника, но потом найдена здесь. В результате только хеши от 5 смещений проходили через фильтр. Высчитанные для них Decrypted Key не удовлетворили чекер.
Конвертация полученных Decrypted Key в строковое представление дало только одну корректную строку mYg0dthi$isD@k3y, которая и являлась флагом. К слову, этот Decrypted Key соответствует смещениям 0 и 17. То есть, для решения таска нужно было сконвертировать в строку Decrypted Key, который программа выводит при запуске. Скрипт прилагается.

Histograph... Сервис представляет из себя CGI-программу launch в виде ELF-бинарника. На вход принимает GET-параметры:
action - запрошенное действие, мини-программа на собственном языке в каталоге ./actions
arg - дополнительный параметр для определенных action'ов
in, out - имена входных и выходных файлов.

Флаги хранит в каталоге ./data в виде гистограмм-битмапов.

Соответственно, на каждый запрос подгружается нужная подпрограмма, и интерпретируется-выполняется.
Из полезных подпрограмм set (установить флаг - сгенерировать картинку по флагу), get (получить флаг-картинку), hint (типа подсказка).

Виртуальная машина представляет из себя 16-ти битный процессор с обычными командами типа MOV, PUSH, POP, CALL, RETN,... и необычными - печать значения переменной в консоль, читать / писать символ в файловый поток, system и т.д., всего 28 команд. Каждая команда - байт опкода + 1, 2 или 3 16-ти битных операнда. Зная это, несложно написать простой дизассемблер :)

Изучив подпрограмму get, можно узнать, что если запросить файл, состоящий из 111 и более букв o, можно выполнять произвольные команды, например, так:
launch?action=get&in=myfile&arg=echo 'Content-Type:text/plain\r\n';ls

Изучив hint, можно сделать
launch?action=hint&arg=3255
и получить подсказку в виде

struct registers{unsigned short ip;unsigned short sp;unsigned short bp;} reg;

enum opcodes{SET=0x0,MOV=0x1,ADD=0x2,SUB=0x3,MUL=0x4,
JMP=0x5,JE=0x6,JA=0x7,JB=0x8,CALL=0x9,RET=0xa,DIV=0xb,READ=0x10,WRITE=0x11,
PRINT=0x12,EXEC=0x13,PUSH=0x20,POP=0x21,ENTER=0x22,LEAVE=0x23,GETBP=0x24,PTR=0x25,MOVPTR=0x26,
END=0x30,DUMP=0x40,CONTTYPE=0x41,SHOWSHORT=0x42,GETSHORT=0x43};

Не знаю, как она поможет на этом этапе, когда дизассемблер уже написан.

Осталось 2 вопроса: как туда залить этот файл с oooo, чтобы потом получать список файлов-картинок, и как затем распознавать эти картинки. Вероятно, надо ковырять подпрограмму set. Собственно, проблема с картинками и заставила отступиться от сервиса во время игры.

Дизассемблер, launch, подпрограммы прилагаются.

UPD: Подпрограмма echo позволяет также создавать файлы, если указан параметр out. Таким образом, создать файл с ooo...ooo можно так:
launch?action=echo&out=myfile&arg=oooooo...ooo

UPD2: Генерация картинок, подпрограмма set.
0. Вывод заголовков битмапа в файл и stdout.
1. Вычисляется сумма по символам флага: Sum = flag[i] * (i + 1) mod 256, i =0,31
2. Флаг кодируется с учетом вычисленного значения Sum и таблицы, находящейся по смещению 0x04B3 в set:
index = (flag[i] + Sum) mod 256
flag[i] = table[index]
3. Формирование битмап-картинки.
Картинка представляет из себя изображение размера 500 x 300. По краям гистограммы белые поля, сама гистограмма расположена по x от 26 (0x1A) до 474 (0x1DA) и по y от 22 (0x16) до 278 (0x116).
Заполнение битмапа представляет собой два вложенных цикла по высоте и ширине картинки:
for (i = 0; i < 300; i++)
for (j =0; j < 500; j++)
draw(i,j)

Пиксели, координаты которых не попадают в границы гистограммы, выводятся белым. Оси гистограммы выводятся черным. Если же пиксель не попадает ни на оси, ни на поля, производится вычисление высоты рисуемого столбца гистограммы:
index2 = (j - 26 - 1) / 14
Так как значения j у нас в промежутке от 27 до 474, то index2 принимает значение от 0 до 31, как раз по длине флага.
Далее, вычисляется собственно высота: 278 - flag[index2]. Если полученное значение больше i (текущей отрисовываемой высоты битмапа), то заливаем белым, если равна - рисуем черную окантовку, и рисуем зеленым, если меньше.

Как высчитывать по картинке флаг. Определяем высоту столбца, вычитаем из 278. Получаем значение flag[index2]. Затем находим в таблице table это значение и запоминаем индекс index. Получаем 32 сравнения index = (flag[i] + Sum) mod 256 с двумя неизвестными flag[i] и Sum. Но для так как flag[31] = '=', вычисляем Sum и запросто решаем остальные уравнения.

Сервис сдался. Это было достаточно жестко.

UPD3: PoC - декодер картинок:
test-img : ABCDEFGHIJABCDEFGHIJABCDEFGHIJ1=
0087-4icm-7v79 : VIWW0KCUTYLFJ9TTQH05S0JX7V19WOJ=
Но почему-то не берет encrypted_src/default.

Рассмотрим еще один сервис, по которому никто не добыл ни одного флага. Это сервис svn. Невероятно, но на его анализ и поиск основной уязвимости у меня ушло ДЕСЯТЬ минут, и еще десять на написание эксплойта, который получает флаги с сервиса. В хаскеле я так и не разобрался, поэтому вероятно есть и другие уязвимости. Вероятно все посмотрели, что сервис написан на хаскеле и забили, так сделали и мы, а зря.

Все очень просто, сервис хранит флаги в файлах каталога /home/svn/repo/. Сервис поддерживает следующие команды:
l - получение списка файлов
+<filename> <char> - добавить в файл "+<char>"
-<filename> <char>  - добавить в файл "-<char>"
*<filename> <pos> <char>  - добавить в файл "*<pos> <char>"
<filename> <rev> - получить определенную ревизию файла
<filename> - получить последнюю ревизию файла

Эксплойт состоит в том, что бы сначала послать "l\n", а потом посылать имена файлов полученные на пред. этапе для получения флагов.

Итого:
  • хаскел я так и не знаю
  • команды испугалась незнакомого языка и упустили прекрасную возможность получить флаги.
  • exploit svn.py

В продолжение темы RuCTF2010, хочу рассмотреть еще один уязвимый сервис - CertificateAuthority. Во время игры, флаги с этого сервиса удалось получить только команде SiBears. Сервис CA (certificateauthority.tgz) написан на Java, но это не принципиально. Функционально он представляет собой сервис для выдачи сертификатов и хранения любых сообщений пользователей. Игровые чекеры получали сертификат и оставляли зашифрованное сообщение (флаг).

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

Еще гугла, еще кодинга и мы получили PoC (ca.py), но к сожалению игра уже несколько секунд как закончилась, успели только отправить адвайзори без эксплойта. Жаль, что мы взялись за этот сервис так поздно.

Патчинг состоит в использовании достаточно большого простого числа P, на котором генерируется сертификат.

На прошедшем 25 апреля контесте было замечено странное поведение vulnbox'a - глючил tcpdump, а также иногда на консоль валилось что-то типа
BUG: scheduling while atomic: swapper/0/0x10000100

В списке сервисов было нечто под именем GPLv4, которое, к сожалению, мы обнаружили только на следующий день после окончания соревнований: Антон заметил в логе трафика подозрительную UDP-активность - пакеты на произвольные порты, и, что самое забавное, ответы на них от vulnbox.

Как оказалось, это был модуль ядра m.ko, реализующий сетевой фильтр для UDP-трафика. Дизассемблер подсказал, что он принимает команды G (get), P (put), L (list) и хранит флаги в /proc/flags/. UDP-сообщения шифруются инструкцией XOR с ключом 'THINKPAD' первые 8 байт сообщения, следующие 8 байт - XOR с предыдущими 8 байтами этого же сообщения.

Чтобы получить список файлов с флагами, достаточно послать зашифрованную команду 'L', а затем сделать Gfile_name элементам полученного списка файлов.

Также в основной функции-фильтре есть утечка памяти под размер данных UDP-пакета. Вероятно, возможен DOS.

POC прилагается.

Pages

Recent Comments

  • Павел Збицкий: Зафиксить сервис можно, запретив получение списка картинок через ooo.. + read more
  • bay: Жгете!! Если интересно, то вот чекер к этому сервису - read more
  • Павел Збицкий: Визуализация всего файла есть - достаточно загрузить файл как бинарный. read more
  • izlesa: Энтропийные карты рулят =). Было бы неплохо, если бы вы read more
  • Антон Сапожников: может флагов и 15 вытащили, я за скорбордом внимательно не read more
  • Антон Сапожников: конечно интересно. а о каком таймауте идет речь? tcp соединение read more
  • XimaEra: Ну про "ни одного флага" -- это грубо :) Мы read more
  • Антон Сапожников: Любопытно узнать какое решение предложит автор данного сервиса. read more
  • Антон Сапожников: На самом деле не долго, фишка в том, что можно read more
  • hellman1908: Мы не забили, просто не додумались перебирать все ревизии (да read more

Find recent content on the main index or look in the archives to find all content.