Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #115, ИЮЛЬ 2008 г.

Easy-Hack

Хакер, номер #115, стр. 115-036-1

Задача:

Выяснить максимальное количество информации о человеке, который передал тебе вордовский файл

Решение:

Подобные ситуации актуальны, когда перед твоими глазами оказывается «анонимка» или тебя просто разобрало любопытство.

Ты наверняка слышал о метаданных и метаописании. Они включаются во многие форматы и зачастую в них автоматически попадают: имя машины, OS, локальный путь до файла и т.п. Из этих данных можно с легкостью понять, кому принадлежал документ и кто его автор – в общем, ровно то, что нам нужно. Итак, представь, что перед тобой неизведанный вордовский файл, о котором нужно узнать все.

1. Сливаем программку для экспорта метаданных – meta-extractor.sourceforge.net.

2. Получаем нехитрый XML-отчетик, который сразу же и открываем.

3. Вчитываемся и видим примерно следующее:

<MetaDataRecordCreator>Михаил Анатольевич</<MetaDataRecordCreator>

<HardwareEnviroment>x86</HardwareEnviroment>

<SoftwareEnviroment>OS:Windows 2000, 5.0, JVM: Sun MicroSystems Inc.</SoftwareEnviroment>

4. Не забудем защититься от «утечки» со своей машины. Сливаем софтину rhdtool (Office 2003/XP Add-in: Remove Hidden Data) и убираем ей всяческие метатеги. Эту программу можно найти на официальном сайте Microsoft либо на нашем DVD.

Кстати! Metadata Extraction Tool применима не только к документам Office, но и к PDF, графическим и даже к видеофайлам. Помни это и возьми программу на вооружение.

Задача:

В несколько шагов максимально усложнить жизнь реверсера, исказив код программы до неузнаваемости

Решение:

Рассмотрим простую программу, которая выполняет единственное действие – выводит окошко с надписью «Simply Program». Дизассемблированный листинг программы предельно понятен:

00401000 PUSH 0

00401002 PUSH ex.00403000 program"

00401007 PUSH ex.0040300F

0040100C PUSH 0

0040100E CALL <JMP.&user32.MessageBoxA>

00401013 PUSH 0

00401015 CALL <JMP.&kernel32.ExitProcess>

0040101A JMP DWORD PTR DS:[<&kernel32.ExitProcess>]

00401020 JMP DWORD PTR DS:[<&user32.MessageBoxA>]

1. Первое, что мы сделаем, – заменим инструкцию, находящуюся по адресу 0040100E, на переход:

0040100E JMP 0040102F

По адресу 0040102F поместим функцию MessageBoxA, скопировав ее при помощи пункта меню правой кнопки мыши: «Binary -> Binary Copy». Перейти внутрь тела функции можно, нажав на клавишу <F7> и находясь в точке вызова. Возникает две проблемы: первая – вызов «апишки» MessageBoxExA по относительному адресу, который при вставке копии тела функции по адресу 0040102F становится недействительным. Решение очевидно: меняем инструкцию вызова по адресу 0040106F на явный вызов – выделяем команду, нажимаем пробел и в появившемся окошке вбиваем «call User32.MessageBoxExA». Вторая проблема – это операция возврата из функции, которая тоже оперирует относительным адресом, а не абсолютным. Тут еще проще – мы знаем адрес, по которому должна будет производиться передача управления после вызова. Адрес этот – 00401010. Значит, по адресу 00401075 вбиваем инструкцию «jmp 00401010».

И еще. Некоторые параметры для функции MessageBoxExA испортились. Код передачи параметров в стек выглядит так:

00401061 PUSH 0; id языка

00401063 PUSH DWORD PTR SS:[EBP+14]; стиль окна

00401066 PUSH DWORD PTR SS:[EBP+10]; заголовок

00401069 PUSH DWORD PTR SS:[EBP+C]; текст

0040106C PUSH DWORD PTR SS:[EBP+8]; владелец окна

0040106F CALL user32.MessageBoxExA; вызов функции

Как проще всего избавиться от недоразумений? Простое решение: обнулить некоторые параметры, а именно – первый, второй и пятый. Итак, заменяем первую, вторую и пятую инструкции на «push 0».

Проверяем. Все работает. Сохраняем программу под новым именем и двигаемся далее.

2. Теперь точно так же разместим тело API-функции MessageBoxExA в нашей программе (по адресу 0040107E) и заменим вызов по адресу 0040106F на инструкцию call 0040107E:

0040107E PUSH EBP

0040107F MOV EBP,ESP

00401081 PUSH -1

00401083 PUSH DWORD PTR SS:[EBP+18]

00401086 PUSH DWORD PTR SS:[EBP+14]

00401089 PUSH DWORD PTR SS:[EBP+10]

0040108C PUSH DWORD PTR SS:[EBP+C]

0040108F PUSH DWORD PTR SS:[EBP+8]

00401092 CALL user32.MessageBoxTimeoutA

00401097 POP EBP

00401098 RETN 14

Сохраним программу под новым именем.

3. Запустим нашу программу под отладчиком еще раз и внимательно ее протрассируем по <F8>. Легко заметить, что инструкции, начиная с адреса 0040103D и заканчивая адресом 00401061, не получают управления, так как по адресу 0040103B находится условный переход, который выполняется всегда. Поэтому можно удалить эти инструкции, заполнив их нулями; выделяем их и выбираем из контекстного меню правой кнопки мыши: «Binary->Fill with 00's». Сохраняем файл и переходим к следующему шагу.

4. Последний, завершающий, шаг – удаление перехода на MessageBoxA по адресу 00401020. Можно заменить переход нулевыми байтами или инструкциями «nop». По собственной инициативе ты можешь удалить секции нулей, которые образовались в результате наших манипуляций.

Итог работы – код, в котором нигде не фигурируют инструкции, в явном виде указывающие на вызываемую API-функцию. Все этапы работы в виде измененного пошагово файла ты можешь увидеть на нашем DVD.

Рассмотренный метод переноса исполнимого кода API в PE-файл программы хорош, прежде всего, тем, что можно «спускаться в самый низ» системных библиотек, детализируя файл программы таким образом, чтобы его функциональность строилась на низкоуровневых API, обращающихся к ядру ОС. Работать с таким кодом в отладчике очень сложно.

Задача:

Узнать, доступен ли метод FTP-bounce для сканирования портов

Решение:

Идея, которую мы тебе предложим, позволяет выяснить, какие порты реально открыты даже на жутко зафаерволенном удаленном сервере. Сделать это можно путем использования некорректно сконфигурированного FTPD и команды PORT. Самый верный способ – пообщаться с FTP-сервером на его языке. Чтобы не заниматься «геморированием», воспользуемся новой фишкой старого сканера NMAP – скриптовым языком NSE. Для элегантного решения задачи нам нужно:

1. Скачать и установить последнюю версию NMAP.

2. Убедиться в наличии сценария ftpbounce.nse в /usr/local/share/scripts (либо взять скрипт с нашего DVD).

3. Запустить сканер в «особом режиме» –

nmap --script=ftpbounce.nse victim.com

4. Дождаться положительного ответа, который означает применимость метода FTP-bounce.

5. Воспользоваться методом сканирования, который покажет, открыт порт 8080 или нет –

nmap -b anonym@victim.com -p 8080 ip

6. Написать скрипт для автоматизации и перебора сканируемых портов. Строго опционально :).

В данный момент на официальном сайте NMAP появилась первая документация по NSE и куча наставлений по созданию собственных скриптов для NMAP (insecure.org/nmap/nse/). Как говорится, дерзай!

Задача:

Проверить целостность файлов на сервере

Решение:

Зачастую нам необходимо вести наблюдение за изменением файлов на том или ином сервере. Причем, не столь важно, какой сервер – легальный или хакнутый. Суть одна – убедиться в отсутствии залитых веб-шеллов и вредоносных файлов. Но проверить весь находящийся на сервере контент вручную иногда попросту невозможно. Лучше воспользоваться скриптом под названием «Site File Checker». Чтобы у тебя не возникало вопросов, давай разберемся с настройкой утилы и ее возможностями. Итак:

1. Открываем пхп-скрипт в блокноте и вписываем в указанные места логин и пароль админа (по дефолту - admin:admin).

2. Заливаем скрипт в нужную диру (если тебе необходимо прочекать весь веб-контент – смело лей скрипт в корень веб-каталога).

3. Обращаемся к скрипту, вбиваем указанные ранее логин/пасс и логинимся.

4. Выбираем пункт «Посчитать контрольные суммы». Будет отображен список всех вложенных каталогов и каталог, в котором находится скрипт. Здесь можно выбрать, какие директории нужно анализировать, а затем – нажать «Готово». Скрипт выдаст отчет анализа. Скопируй его и сохрани в какой-нибудь файл на локальном компьютере. Отчет выглядит примерно так:

-20.06.2008 21:20:49-

-all dirs-

/home/pzh/public_html/tst

/home/pzh/public_html/tst/tmp

-analyzed dirs-

/home/pzh/public_html/tst

/home/pzh/public_html/tst/tmp

-analyzed files-

/home/pzh/public_html/tst/index.html

0c5b2258d6b8929647a0b7dd00032793

1201852523

/home/pzh/public_html/tst/resl.php

556623bb3e5d1fcca991f1d5e2f2b594

1201852841

.......

5. Когда тебе потребуется проверить целостность файлов на сервере, нужно выбрать пункт меню «Сравнить контрольные суммы». Затем указать сохраненный ранее файл отчета и нажать «Готово». Скрипт самостоятельно произведет сравнение файлов и директорий и выдаст все найденные отличия.

Кроме того, рекомендуется перед каждой проверкой перезаливать сценарий на сервер. Ведь он также может быть изменен недоброжелателями!

Задача:

Защититься от протроянивания Pinch'ем

Решение:

Повальное распространение Пинча повлекло за собой массу проблем. Утила «Antipinch» была написана специально, чтобы анализировать подозрительные exe файлы и определять в них наличие этого известного трояна. Разберемся с алгоритмом работы утилы:

1. Получаем адрес структуры PEB:

MOV EAX, FS:[30]

2. Получаем значение переменной NtGlobalFlag (оно находится по адресу EAX+68):

MOV EAX, DS:[EAX+68]

3. Сравниваем полученное значение с нулем:

TEST EAX,EAX

4. Если значение равно нулю, переходим к выполнению программы (отладчик не обнаружен), иначе – завершаем работу программы:

JE выполнение_программы

Применительно к стандартному «блокноту», код будет выглядеть следующим образом:

01006AE0 JMP 01007D72; переходим к области, заполненной нулями, где разместим наш антиотладочный код

...

01007D72 PUSH 70; первая инструкция, которая находилась по адресу 001006AE0 и которую мы заменили на инструкцию перехода

01007D74 PUSH 01001888; вторая замененная нами инструкция

01007D79 MOV EAX,FS:[30]; получаем указатель на PEB

01007D7F MOV EAX,DS:[EAX+68]; помещаем в eax значение NtGlobalFlag

01007D82 TEST EAX,EAX; проверяем eax на равенство нулю

01007D84 JE 01006AE7; если EAX равен нулю, переходим к выполнению программы

Теоретически, мы могли бы разместить сразу после инструкции JE 01006AE7 команду завершения процесса. Но мы не будем об этом заботиться, ведь при обычном запуске программы инструкция перехода обязательно сработает. Последствия выполнения случайного кода при запуске программы из-под отладчика нас совершенно не интересуют :).

Весь код забивается прямо под отладчиком OllyDbg, как мы это делали и раньше, с последующим сохранением программы (выбираем из меню правой кнопки мыши пункт «Copy to executable -> All modifications» и в появившемся окне из контекстного меню – пункт «Save»; сохраняем файл).

Попробуй запустить полученную программу под OllyDbg и оцени результат работы :).

Задача:

Восстановить утерянные данные с винчестера

Решение:

Рабочие данные, компромат на начальника или просто давно забытая фотка могут неожиданно порадовать или огорчить – все зависит от цели восстановления. Нас же интересуют средства ее достижения.

1. Первой под прицел попала GetDataBack (www.runtime.org). Эта утила может работать как с жесткими дисками, flash-накопителями, так и с файлами-образами (.img). Удобный интерфейс позволяет выбрать физические и логические диски, задать диапазон сканирования с точностью до сектора. Достоинствами GetDataBack являются приемлемая скорость поиска и возможность его остановки для дальнейшей работы с уже найденными файлами. Ждать полного скана 160 Гб винчестера, все же, утомительное занятие. Окно с выбором файлов для восстановления содержит дерево каталогов и полную статистику по файлам и папкам, оформленную в виде таблицы. Для удобства пользователя, удаленные, скрытые, системные, сжатые и read-only файлы выделены отдельными цветами. Поддерживается поиск по маске имени файла, диапазону дат изменения и диапазону кластеров. Работать с прогой легко и приятно.

2. Ее конкурентом в сфере восстановления данных является EasyRecovery (www.ontrack.com). Пользователю предоставляется ряд тестов (тест аппаратных проблем, SMART-тест и проверка файловой системы), возможность восстановления удаленных и реставрации поврежденных файлов. Фильтр позволяет отделять файлы с плохим размером, датой, именем, просто удаленные – либо с различными комбинациями этих флагов.

3. В отличие от предыдущих утилит, PC Inspector File Recovery (www.pcinspector.de) наиболее понятно отражает состояние файлов на носителе. В дереве каталогов четко разделяются имеющиеся на данный момент файлы, удаленные и поврежденные, причем прога находит и удаленные папки, подсвечивая их зеленым цветом. Поиск осуществляется по маске имени файла и диапазону кластеров (его физическому расположению).

С помощью этих трех прог можно решить проблему восстановления удаленных и поврежденных данных, но стоит иметь в виду, что софт не может творить чудеса. Из-за особенностей носителя не всю информацию возможно восстановить.

Содержание