|
Chanel: #TGBR, #hack-psihoz, Service: irc.dalnet.ru, Port: 6667
Содержание
TGBR E-ZineS #1:
Автор: NeoN
Обзор WOW Loader
Седня будем мусолить косточки очередному супер нужному и полезному лоадеру всех времен и народов,
и имя ему Wow Loader. Стоит сие создание 200 у.ё. и написан он человеком с ником EvilPhreak. По
заявлениям автора там используется мощный 0дей способ чтобы обойти все фаерволы нафиг. Между тем
сами покупатели весьма иного мнения, лоадер не слишком корректно работает, малый отстук и вообще
странная штука. И кто же все-таки прав?
1. Общее впечатление
Криптовка присутствует, судить какого качества она не будем, так как всегда можно перекриптовать.
После распаковки видим что на борту лоадера поместилась еще и длл, зачем она нужна выясним позднее.
При исполнении лоадер создает 4 файла, один из них ernel32.dll и несколько файлов с рандомным названием
Не шибком то и беспалевно. Но всебы ничего.. если, например, фаерволл блокирует попытки
синжектится в процесс, или попросту нет инета - лоадер уходит в замечательный вечный цикл, из которого
выбратся ему не посилу, ибо не предусмотрено было сие создателем. Цикл тот содержит в себе sleep и
createfile который пытается открыть на чтение тот самый фаил со случайным именем. И если тот не создается -
лоадер будет долго зиять в списке процессов. Плюс ко всему - большинство антивирусов, да и некоторые
фаерволлы весьма критично относятся к файлам в system32 и просто так записать туда удастся не всегда.
Сам код потрясает, вродебы лоадер должен стремится сократить размер, так нет, в коде насчитывается
аж 3 цикла Process32First\Next, 1 повторное копирование одного и тогоже хендла процесса, большое количество
CreateFile, для которых не сделано никакой обертки, чтобы сократить размер. Полоска нупов также присутствует
- еще работает чтоли?
2. Обход фаерволлов
Собственно то из за чего и писался обзорчик - "0дей" обход фаерволлов. На самом деле в лоадере
предусмотрено аж два обхода, один из них при наличии установленного ZoneAlarm, а второй при его неналичии.
Для определения наличия зоналярма используется небольшая функция, состоящая из цикла Process32First\Next
и сравнения получаемых имен процессов с "zlclient.exe", собственно именем процесса зоналярма.
2.1. ZoneAlarm case
В случае наличия противного ZoneAlarm на компе, лоадер делает следующее:
- создает секции и выделяет память
- ищет хендл процесса explorer.exe, OpenProcess его
- делает DuplicateHandle для полученного хендла
- заполняет структурки и вызывает NtConnectPort
- GetThreadContext\SetThreadContext\ResumeThread
Последний пункт отчетливо бросается в глаза, ибо это самый заезженный способ создания потока исполнения
в другом процессе. Отличия от паблик версии присутствие DuplicateHandle, и то уже тоже не тру. А вот первые
строчки могут показатся неискушенным людям несусветным приватом. Но погодите радоваться, зайдите в гугл и
поищте немножко - и вуаля - статья на всеми любимом секюритилаб.ру на русском языке, с пояснениями и
огромной кучей исходников. По такому прекрасному описанию и горе сорцов не написать обход просто возмутительно.
Итого имеем что первый способ попахивает пабликом, притом 2006 года выпуска. С горечью разочарования посмотрим
второй способ.
2.2. Не ZoneAlarm case
Думаете тут намного лучше все? Хех, зря... В случае когда на компе зоналярма нет - лоадер создает файлик
с именем "ernel32.dll". Почему такое название сейчас выясним. Так вот после этого лоадер берет привелегии
с помощью функции RtlAdjustPrivilege:
.code:0040217E lea ecx, [ebp+var_4]
.code:00402181 push ecx
.code:00402182 push 0
.code:00402184 push 1
.code:00402186 push 14h
.code:00402188 call RtlAdjustPrivilege
Затем начинается цикл Process32First\Next с поиском svchost.exe, после нахождения оного лоадер открывает
фаил svchost.exe, и ищет там строку "ernel32.dll", естественно она там присутствует, так как svchost.exe
импортирует функции kernel32.dll. Именно поэтому такое странное название файла и было выбрано. Найдя оффсет
этого имени лоадер запускает цикл Thread32First\Next и для каждого потока выполняет следующий код:
.code:00401F11 push [ebp+dwThreadId] ; dwThreadId
.code:00401F14 push 0 ; bInheritHandle
.code:00401F16 push 10h ; dwDesiredAccess
.code:00401F18 call OpenThread ; Открытие потока svchost.exe
.code:00401F1E mov [ebp+hThread], eax
.code:00401F21 test eax, eax
.code:00401F23 jz short open_err ; ошибка открытия?
.code:00401F25 push 0
.code:00401F27 push 0
.code:00401F29 push [ebp+str_ernel32]; Смещение строки "ernel32.dll" в процессе svchost
.code:00401F2C push LoadLibraryExA ; Оффсет на лоадлибрари
.code:00401F32 push [ebp+hThread]
.code:00401F35 call NtQueueApcThread ; Добавление коллбека в очередь
.code:00401F3B push [ebp+hThread] ; hObject
.code:00401F3E call CloseHandle
.code:00401F44 open_err:
Как видно из кода, лоадер открывает поток, и выполняет для него фукнцию NtQueueApcThread, которая
добавляет заданный адрес в очередь. В данном случае будет выполнена фукнция LoadLibraryExA с параметром
"ernel32.dll". Что как вы уже понимаете, загрузит распакованную из лоадера длл и выполнит нужный код.
На этом обход фактически закончился. Приватный ли он? Ответ нет. Поиск в гугле по фразе "NtQueueApcThread"
опять дает положительные результаты. Тоже читаем и втыкаем, там весьма четко прописано, что делает эта
функция и какое её "неправильное" предназначение.
3. Инжектнутый код
Инжекнутый код исполняется либо в процессе в коорый удался инжект, либо прямо в процессе лоадера.
Код восстанавливает нужный ему импорт, затем начинается действо: лоадер перехватывает функцию
ZwCreateSection, для этого предварительно делает VirtualProtect для адресов ZwCreateSection и
ZwQuerySection, а после этого пишет конструкцию push \\ ret.
Перехватчик ZwCreateSection запоминает полученный хендл после вызова настоящей функции и
устанавливает хук на ZwQuerySection.
Перехватчик ZwQuerySection в свою очередь снимает хук с функции, и сверяет хендлы - запомненный и
тот что передали в ZwQuerySection. Если они совпадают, то перехватчик обнуляет базовый адрес секции.
Перехват функции реализован не шибком надежно - если хендлы не совпали, то функция ZwQuerySection
остается незахученой, и в следующий раз будет хукнута только в перехватчике ZwCreateSection.
Так вот после перехвата лоадер берет параметр реестра http\shell\open\command, где расположен
по обычаю путь до IE, и запускает процесс с замороженным потоком. Благодаря тому что CreateProcess
вызывает ZwCreateSection и ZwQuerySection, то перехватчики будут работать. Затем все возвращается
опять к VirtualProtect, повторяться снова, и теперь уже после очередного обнуления адреса секции
идет к следующему куску кода. Этот кусок создает временный фаил, в котором расположился код по
скачиванию ехе и его запуску. После создания файла создается секция с помощью ZwCreateSection
и мапится в процесс IE по его базовому адресу. В первый раз созданный таким образом процесс убивается с помощью
TerminateProcess, и возвращается опять к VirtualProtect. Уже со второго раза процесс оставляется в живых,
лоадер делает ResumeThread на потоке этого процесса и ожидает его завершения.
Итого, данный билд лоадера буквально собран из каких то кусочков, которые нестабильно работают, также
непонятны круголя вокруг ZwCreateSection. Все можно найти в гугле, и собрать в кучу. Так как
на носу праздник, в качестве подарка будет сам этот лоадер, база иды и на десерт - сорец на си.
Лежит тут - ../soft/wowloader.zip Вес - 115кб
Only for TGBR E-ZineS, by Neon, TGBR.ORG 27.12.07
С Новым Годом!
Содержание
|
|