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

Easy-Hack

Задача:
Настроить аналог радмина на удаленном дедике

Решение

Зачастую в наши хорошие и заботливые руки попадают мощные забугорные дедики. Как и для чего их можно использовать, полагаю, напоминать не нужно. Рано или поздно админ может прикрыть наш доступ к серверу. Чтобы этого не произошло, лучше вовремя позаботиться о резервных лазейках в систему. Не так давно одним из популярных способов была установка радмина и последующее сокрытие его в системе. Но сейчас редко кого можно провести подобным маневром. Надежнее будет заюзать какой-либо аналог радмина с похожим функционалом. Неплохим вариантом является использование тулзы HideAdmin. У ее настройки в системе есть несколько нюансов, поэтому внимательно изучи алгоритм действий, описанный ниже:

  1. Логинимся на удаленный дедик и сливаем утилу HideAdmin с сайта hidadmin.ru
  2. Запускаем «hidadmin_setup.exe» и следуем инструкциям инсталлятора
  3. Запускаем серверную часть приложения на удаленном сервере – «Пуск -> Программы -> Hidden Administrator -> Hidden Administrator –> Сервер» и жмем комбинацию клавиш <Alt+Ctrl+F5> для вызова главного окна сервера
  4. При первом старте софтина автоматически указывает необходимый для работы IP-адрес. Для ручной настройки IP-адреса просто поставь флажок напротив нужного IP'ишника
  5. В настройках серверной части приложения не забудь установить пароль на соединение с клиентской частью («Настройки» -> «Смена пароля»)
  6. По дефолту, серверная часть программы устанавливается в автозагрузку, но при желании режим запуска серверной части можно изменить (запуск как системная служба, вместе с Windows, ручной запуск). Все это ты можешь сконфигурировать в разделе «Настройки» -> «Режимы запуска»
  7. После определения всех настроек желательно скрыть иконку приложения из области уведомлений, отметив опцию «Скрывать иконку приложения»

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

  • 233 МГц (рекомендуется: 500 МГц или выше);
  • 64 МБ RAM (рекомендуется: 128 МБ или выше);
  • Microsoft Windows 98/ME/NT/2000/XP/2003/Vista;
  • Выход в локальную сеть или в интернет по протоколу TCP/IP.

В общем, желаю твоим дедикам долгой и счастливой жизни! :).

Задача:
Получить полную информацию о системе

Решение

Как часто приходится задавать в проге директорию с Виндой или временную папку! Это, кстати, и является ошибкой начинающего программиста. Данные нужно получать, а не статически вводить. Воспользуемся API-шными функциями через С++ и посмотрим, как получить наиболее востребованные данные о системе.

1. Подключаем необходимые заголовки

#include <windows.h>
#include <stdio.h>

2. Объявляем и задаем переменные. Размер буфера для вывода (жадничать с размером не стоит):

#define BUFSIZE 1024

Сюда мы будем получать инфу:

LPTSTR SystemInfo;
DWORD Buff = 256;
TCHAR tchBuffer[BUFSIZE];
SystemInfo = tchBuffer;

3. Итак, подготовка закончена – можно приступать. Начнем с имени компьютера:

GetComputerName(SystemInfo, &Buff);

В переменной SystemInfo теперь находится имя компа в виде текста. Что с ним делать дальше (выводить, сохранять и т.п.) – оставляю на твое усмотрение.
Получаем имя пользователя:

GetUserName(SystemInfo, &Buff);

Не забывай: живем в России, и народ любит писать русские имена, которые лучше дополнительно обработать. Системная директория:

GetSystemDirectory(SystemInfo, MAX_PATH+1);

Как правило, это WINDOWS\system32, но лучше перестраховаться и получить ее из этой функции. Самая популярная папка:

GetWindowsDirectory(SystemInfo, MAX_PATH+1);

Далеко не у всех Винда стоит на диске C! Пройдемся по переменным окружения. Установленная ось:

ExpandEnvironmentStrings("%OS%", SystemInfo, BUFSIZE);

Не получим никакой дополнительной информации. Например – «Windows_NT». Далее – переменная окружения PATH:

ExpandEnvironmentStrings("%PATH%", SystemInfo, BUFSIZE);

И, наконец, полезная папка, куда можно кидать мусор, либо прятать инфу:

ExpandEnvironmentStrings("%TEMP%", SystemInfo, BUFSIZE);

Используя полученную из этих функций информацию, кодер обходит стороной кучу проблем. Удачи в начинаниях!

Задача:
Подобрать надежный руткит для Винды

Решение

Чтобы прочно закрепиться на поломанном виндовом сервере, мало одного желания. Нужен еще и хороший инструмент в виде руткита. Проблема в том, что большая часть качественной продукции – приватная, а значит, достать ее не так просто. Мы пойдем другим путем! Выбирать будем из зарекомендовавших себя продуктов, доступных всем (ну, или почти всем). Естественно, в этом случае придется прибегнуть к помощи криптера (чтобы антивирус на поломанном сервере не поднимал лишнего шума). Но сейчас речь не о том: нас интересует только надежный руткит для Винды!

1. Специально для тебя я сделал небольшую подборку, изучив которую, ты сможешь остановить свой выбор на понравившемся продукте:

  • Hacker Defender. Один из популярнейших и надежных руткитов (зарекомендовал себя на практике). Обладает стандартным набором функций и грамотно реализованным алгоритмом работы. Скачиваем и знакомимся: xfocus.net/tools/200401/621.html.
  • FU Rootkit. Довольно популярный руткит, умеющий скрывать процессы, поднимать права выполняемых процессов, а также прятать события, записываемые в Event Viewer. Админ не узнает из логов ничего нового о своей системе :). Работает исключительно по технологии «Direct Kernel Object Manipulation» и не использует стандартные функции перехвата API или Code Injection. Качаем отсюда: rootkit.com/vault/fuzen_op/FU_Rootkit.zip.
  • eEye BootRoot. Представляет собой NDIS-бэкдор, реализованный по принципу boot-вируса. Руткит работает в перехвате тринадцатого прерывания и внедрения в загрузчик Windows (в момент загрузки с диска). Архив лежит здесь: xfocus.net/tools/200509/1088.html.
  • NT Rootkit. Один из древнейших руткитов, не потерявший свою актуальность и в наши дни. Живет в системе, ожидает соединения на любой порт, а при коннекте выдает консоль. Умеет шифровать свой трафик с использованием алгоритма Blowfish, прятать свои и защищенные объекты (файлы, ключи реестра, службы, etc): rootkit.com/vault/fuzen_op/vice.zip.
  • AFX Rootkit 2005. Руткит, основанный на перехвате Windows API для сокрытия процессов, файлов, ключей реестра и портов. Работает в невидимом режиме, скрывая свою собственную папку. Качаем: rootkit.com/vault/therealaphex/AFXRootkit2005.zip.
  • He4Hook. Неплохой отечественный руткит, обладающий хорошим набором функций. Он инсталлится и обеспечивает тебя удаленной консолью, скрывая свои действия в системе. Лежит здесь: http://www.xfocus.net/tools/200502/993.html.

2. Выбрав руткит, не забудь сконфигурировать его и закриптовать. Иначе в ряде случаев результат может тебя огорчить.

3. И помни, использование и распространение вредоносных программ для ЭВМ карается законом... В общем, ты меня понял! :).

Задача:
Обмануть PEid таким образом, чтобы он определял ничем не запакованный файл как файл, покрытый пакером MoleBox

Решение

Естественно, начинающих реверсеров это может очень запутать, но бывалый крякер сразу заподозрит, в чем подвох. Впрочем, от слов к делу.

1. Запаковываем любую программу Molebox-ом (я выбрал блокнот).

2. Открываем запакованную программу отладчиком OllyDbg и смотрим на точку входа, где располагается следующий код:

01016253 > $ E8 00000000 CALL NOTEPAD_.01016258
01016258 $ 60 PUSHAD
01016259 . E8 4F000000 CALL NOTEPAD_.010162AD

Выделяем первые три инструкции и копируем их машинный код при помощи «Binary -> binary copy».

3. Открываем программу, которая будет «обманывать» PEid при помощи LordPE. Нажимаем на кнопку «PEEditor» и в поле «EntryPoint» меняем адрес, соответствующий точке входа программы, на адрес области, которая не содержит исполняемого кода. Этим адресом, к примеру, может быть начало массива нулей, необходимого для выравнивания секции (располагается сразу после основного кода секции .text). Если ты будешь отлаживать программу-дрозофилу, которую можно найти на нашем DVD, то меняй адрес точки входа на 1026 – именно отсюда и начинается массив ноликов. Сохраняй результат нажатием «Save».
Все эти действия необходимы, чтобы разместить на новой точке входа скопированный ранее машинный код сигнатуры пакера MoleBox.

4. Открывай программу с измененной OEP под отладчиком и смело вставляй на новую точку входа код сигнатуры при помощи «Binary -> Binary paste».

5. Необходимо передать управление основному коду программы. Для этого после кода сигнатуры вбей инструкцию jmp OEP (где OEP – адрес точки входа; в 90% случаев этот адрес будет равен 401000).

6. Сохраняй измененный файл при помощи команды «Copy to executable -> All modifications».
Теперь можешь смело проверять модифицированный файл при помощи PEid. Он лоханулся и показал следующее: «MoleBox V2.3X -> MoleStudio.com»!

Задача:
Увеличить размер шары в p2p-сети

Решение

Что нам это даст? С одной стороны, на многих хабах стоит ограничение: не расшаришь больше 20 гигов – не зайдешь на хаб. С другой, даже простые пользователи закрывают доступ к своим файлам, раздавая автобаны всем, кто мало предоставил своих. Можно, конечно, расшарить сотню гигов фильмов, но кому-то неохота захламлять винт, а кто-то просто не может позволить себе таких объемов.

Могу предложить два варианта решения. Для примера возьмем популярную сеть Direct Connect.

А) Этот вариант не очень любят админы, поэтому есть вероятность получить бан:

1. Качаем клиент greylink 5.17 или новее.

2. Шарим сколько не жалко инфы.

3. Переходим File -> Settings ->General. Ставим галочку возле Enable faking и в поле Add to share в метрах вбиваем размер шары, которая будет добавлена к основной.

Естественно, она не займет на винте ни байта, но и риск спалиться тоже велик.

Б) Есть более мирная и вполне легальная альтернатива:

1. Любыми подручными средствами создаем файл (либо файлы) нужного размера. Для примера, накидаем файл в пол гига, забитый нулями. Париться с Блокнотом не рекомендую, так как он не вывозит и десяти метров. То ли дело старый добрый С++ :).

#include <fstream>
<...>
FILE *fat_file;
fat_file=fopen("C:\\TESTFILE","a+");
for (int t=0; t<=(1024*1024*500); t++) {
fputs("0",fat_file);
}
fclose(fat_file);

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

2. В свойствах папки, где лежит этот файл, выбираем «Сжимать содержимое для экономии места на диске». Применяем ко всем вложенным файлам и папкам. Ждем несколько минут, пока ужимается файл в директории, и заглядываем в его свойства: размер файла 500 Мб, а на диске он же занимает всего 31 метр (то есть в 16 раз меньше места).

3. Шарим папку в своем DC-клиенте и получаем плюс пол гига шары за 31 метр на винте.

Таким образом, за 1 Гб занятого места на винте мы получим 16 Гб расшареных файлов! И все это – абсолютно легально и безопасно.

Задача:
Получить код, определяющий адрес определенной инструкции и помещающий его в регистр процессора для последующего использования в программе

Решение

Предлагаю для решения этой тривиальной задачи воспользоваться свойствами замечательной процедуры call. Мы поместим в стек специальный код, который будет определять адрес целевой инструкции, затем передадим этому коду управление.

Чтобы понять, на чем основывается предложенный метод, необходим небольшой экскурс в теорию.

Если вкратце, инструкция call выполняет передачу управления другой части программы – так же, как и команда перехода (jmp) или ее аналоги. Единственное отличие – при выполнении данной инструкции происходит сохранение адреса команды, следующей сразу за call. Так что, после окончания выполнения части кода, вызванной при помощи инструкции ret, управление будет возвращено коду, который инициировал вызов. Это означает, что для успешного выполнения call в общем случае необходимо лишь получить адрес возврата в стеке. При выполнении call непосредственно перед переходом к вызываемому коду в стек сохраняется содержимое регистра EIP (который содержит адрес текущей команды). Это достигается путем неявного выполнения команды push. Естественно, для сохранения работоспособности кода необходимо восстановить стек – извлечь из него ровно столько байт данных, сколько было в него помещено во время выполнения процедуры. Для этих целей и служит инструкция возврата (ret). Она принимает параметр, указывающий на количество байт данных, которые необходимо извлечь из стека.

Итак, резюмируем полученные сведения: при вызове процедуры на вершину стека помещается адрес возврата. То есть, в регистре esp должен находиться адрес инструкции, следующей за вызовом. Если в теле вызванной процедуры будет выполняться код, который поместит в один из регистров значение esp, – мы получим средство для определения адреса некоторой инструкции, которая находится следом за call-ом. Приступим к практической части.

1. Откроем отладчик, подгрузим любую программу для отладки и попробуем написать код, который будет определять адрес инструкции. Договоримся, что будем помещать адрес целевой инструкции, находящийся на вершине стека (указателем на которую является esp), в регистр eax. Исполняемые инструкции кода, определяющего адрес, разместим в стеке. Немного позже для этого мы напишем окончательный код, который и будет отвечать за размещение машинного кода процедуры и передачу управления. Вот как выглядит сама процедура:

mov eax, [esp]
ret 8; Убираем из стека 8 байт - это размер кода, который будет в нем находиться, включая и саму инструкцию ret

2. Вбиваем этот код в отладчике по любому адресу, выделяем его и выбираем из контекстного меню правой кнопки мыши «Copy -> Binary copy». Теперь в буфере обмена находится машинный код выделенных инструкций. Он выглядит так:

8B 04 24 C2 08 00

Почему мы использовали в нашем коде команду «ret 8», хотя он состоит из шести байт? Дело в том, что процессор оперирует двойными словами, состоящими из четырех байт, и при помещении этого машинного кода в стек будет использовано два двойных слова. Код будет дополнен нулями справа. Кроме того, стоит учесть, что выполняться процессором он будет «задом наперед», а это значит, что мы должны его развернуть:

00 08 с2 24 04 8B

3. Машинные инструкции получены, осталось написать окончательный код, который будет помещать их в стек и передавать им управление. Применим команду push:

push 08; помещаем в стек первое двойное слово
push 0C224048b; помещаем в стек второе двойное слово
call esp; передаем управление на код, размещенный в стеке

Мы эксплуатировали команду call для получения адреса следующей за вызовом нашего кода инструкции. Что может быть проще? Единственный «подводный камень» – это DEP, который теперь встречается все чаще и чаще. В нашем случае код, находящийся в стеке, будет безжалостно зарублен и не получит управления. Избежать этого можно, заюзав функцию VirtualProtect.

Содержание