Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Майкл_Сикорски,_Эндрю_Хониг_Вскрытие_покажет!_Практический_анализ.pdf
Скачиваний:
15
Добавлен:
19.04.2024
Размер:
17.17 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

286  Часть IV  •  Возможности вредоносного ПО

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Прямое внедрение

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Прямое внедрение, как и внедрение DLL, подразумевает выделение и вставку кода в адресное пространство внешнего процесса. В нем используется похожий набор вызовов Windows API. Разница состоит в том, что вместо создания отдельной DLL и принуждения процесса ее загрузить вредоносный код вставляется непосредственно в сам процесс.

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

При прямом внедрении обычно встречаются три функции: VirtualAllocEx,

WriteProcessMemory и CreateRemoteThread. Как правило, выполняется два вызова —

VirtualAllocEx и WriteProcessMemory. Первый выделяет и записывает данные, которые нужны внешнему потоку выполнения, а второй выделяет и записывает сам код потока. Вызов CreateRemoteThread будет содержать местоположение кода внешнего потока (lpStartAddress) и его параметр (lpParameter).

Поскольку данные и функции, используемые внешним потоком, должны существовать в заражаемом процессе, обычная процедура компиляции здесь не подойдет. Например, строки не должны находиться в стандартном разделе .data, а для использования функций, которые еще не были загружены, придется применять вызовы LoadLibrary/GetProcAddress. Существуют и другие ограничения, в которые мы не станем углубляться. В сущности, для прямого внедрения автор вредоносного ПО должен либо владеть хорошими навыками написания ассемблерного кода, либо обходиться вставкой относительно простого кода командной оболочки.

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

Подмена процесса

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

Этот прием позволяет вредоносу получить те же привилегии, какие имеет подменяемый им процесс. Например, если бы вредоносная программа подменила процесс svchost.exe, в списке процессов остался бы тот же исполняемый файл svchost.exe, запущенный из каталога C:\Windows\System32, что, скорее всего, не вызвало бы никаких подозрений (это, к слову, распространенная атака).

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Глава 12. Скрытый запуск вредоносного ПО  287

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Ключевым аспектом данной методики является создание процесса в приостановленном состоянии, то есть процесса, который загружается в память, но ничего не делает, так как его главный поток не выполняется. Такая программа будет бездействовать, пока кто-то извне не запустит ее главный поток. В листинге 12.2 показано, как автор вредоносного ПО приостанавливает процесс, передавая значение CREATE_ SUSPENDED (0x4) в качестве аргумента dwCreationFlags для вызова CreateProcess.

Листинг 12.2. Ассемблерный код, демонстрирующий подмену процесса

00401535

push

edi

; lpProcessInformation

00401536

push

ecx

; lpStartupInfo

00401537

push

ebx

; lpCurrentDirectory

00401538

push

ebx

; lpEnvironment

00401539

push

CREATE_SUSPENDED ; dwCreationFlags

0040153B

push

ebx

; bInheritHandles

0040153C

push

ebx

; lpThreadAttributes

0040153D

lea

edx, [esp+94h+CommandLine]

00401541

push

ebx

; lpProcessAttributes

00401542

push

edx

; lpCommandLine

00401543

push

ebx

; lpApplicationName

00401544

mov

[esp+0A0h+StartupInfo.dwFlags], 101h

0040154F

mov

[esp+0A0h+StartupInfo.wShowWindow], bx

00401557

call

ds:CreateProcessA

 

Эта процедура плохо описана в официальной документации, но с ее помощью процесс можно загрузить в память и остановить на точке входа.

В листинге 12.3 показан псевдокод на языке C, выполняющий подмену процесса.

Листинг 12.3. Подмена процесса в виде псевдокода на языке C

CreateProcess(...,"svchost.exe",...,CREATE_SUSPEND,...);

ZwUnmapViewOfSection(...); VirtualAllocEx(...,ImageBase,SizeOfImage,...);

WriteProcessMemory(...,headers,...); for (i=0; i < NumberOfSections; i++) {

WriteProcessMemory(...,section,...);

}

SetThreadContext();

...

ResumeThread();

Закончив с приготовлениями, следует записать в адресное пространство заражаемого процесса вредоносный исполняемый файл. Обычно для этого используется функция ZwUnmapViewOfSection, освобождающая весь участок памяти, на который указывает переданный ей аргумент. Вслед за этим загрузчик выполняет операцию VirtualAllocEx, чтобы выделить новое адресное пространство для вредоносного кода, и вызывает WriteProcessMemory, чтобы записать туда каждый раздел вредоноса; обычно это делается в цикле, как показано в строке .

На завершающем этапе вредонос восстанавливает среду атакуемого процесса и связывает точку входа с вредоносным кодом, используя вызов SetThreadContext. В конце вызывает ResumeThread, чтобы вредонос, подменивший обычный процесс, смог начать свою работу.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

288  Часть IV  •  Возможности вредоносного ПО

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Подмена процесса является эффективным способом маскировки вредоносных программ. Притворяясь обычным Windows-процессом, вредонос может избежать обнаружения со стороны брандмауэров и систем предотвращения вторжения (intrusion prevention systems, IPS). Кроме того, вредонос может обмануть даже опытного пользователя, который будет видеть в списке процессов путь к оригинальному исполняемому файлу, даже не подозревая, что тот был подменен.

Внедрение перехватчиков

Этот метод загрузки вредоносного кода основан на использовании перехватчиков Windows, которые перехватывают сообщения, направляемые приложениям. Злоумышленники могут внедрять перехватчики для достижения двух целей.

Сделать так, чтобы вредоносный код выполнялся при перехвате определенного сообщения.

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

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

Рис. 12.3. Поток событий и сообщений в Windows с внедрением перехватчиков и без него

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Глава 12. Скрытый запуск вредоносного ПО  289

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Локальные и внешние перехватчики

В Windows есть два вида перехватчиков.

Локальные. Используются для просмотра или изменения сообщений, направленных во внутренний процесс.

Внешние. Используются для просмотра или изменения сообщений, направленных во внешний процесс.

Существует две разновидности внешних перехватчиков: высоко- и низкоуровневые. Высокоуровневый внешний перехватчик требует, чтобы его функция экспортировалась и находилась в DLL — ОС свяжет ее с адресным пространством перехватываемого потока (или всех потоков сразу). Низкоуровневый внешний перехватчик требует, чтобы его функция находилась в процессе, который его устанавливает. Эта функция получает уведомление до того, как ОС сможет обработать событие.

Кейлогеры на основе перехватчиков

Внедрение перехватчиков часто используется в таких вредоносных приложениях, как кейлогеры, которые записывают нажатия клавиш. Информацию о нажатии можно получить путем регистрации обработчиков высокого (WH_KEYBOARD) или низкого (WH_KEYBOARD_LL) уровня.

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

Использование функции SetWindowsHookEx

SetWindowsHookEx является основной функцией для внешнего перехвата в Windows. Она принимает следующие аргументы.

idHook. Определяет тип устанавливаемой процедуры перехвата.lpfn. Указывает на процедуру перехвата.

hMod. В случае с высокоуровневыми перехватчиками определяет дескриптор библиотеки, в которой находится процедура перехвата (lpfn). В случае с низкоуровневыми перехватчиками определяет локальный модуль, в котором объявлена процедура lpfn.

dwThreadId. Определяет идентификатор потока, с которым будет связана процедура перехвата. Если этот аргумент равен нулю, перехватчик будет связан

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

w

 

 

to

 

 

290  Часть IV  •  Возможности вредоносного ПО

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

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

Атака на отдельные потоки

При атаке на поток с конкретным параметром dwThreadId вредонос обычно содержит инструкции для определения системного потока с подходящим идентификатором, но он также может атаковать все потоки подряд. Второй вариант применяется только кейлогерами и их аналогами, целью которых является перехват сообщений. Загрузка во все потоки сразу может замедлить ОС и спровоцировать срабатывание системы предотвращения вторжений (IPS). Поэтому, если вредоносу нужно лишь загрузить DLL во внешний процесс, он внедрится только в один поток, чтобы остаться незаметным.

Чтобы атаковать определенный поток, нужно сначала найти подходящий процесс и запустить его, если он в этот момент не работает. Перехват сообщений, которые часто используются Windows, повышает вероятность срабатывания IPS, поэтому вредоносные программы обычно устанавливают перехватчики для менее востребованных сообщений, таких как WH_CBT (относится к обучающим компьютерным программам).

В листинге 12.4 показан ассемблерный код, который выполняет внедрение перехватчика, чтобы загрузить DLL в адресное пространство другого процесса.

Листинг 12.4. Внедрение перехватчика: ассемблерный код

00401100

push

esi

 

00401101

push

edi

 

00401102

push

offset LibFileName

; "hook.dll"

00401107

call

LoadLibraryA

 

0040110D

mov

esi, eax

 

0040110F

push

offset ProcName

; "MalwareProc"

00401114

push

esi

; hModule

00401115

call

GetProcAddress

 

0040111B

mov

edi, eax

 

0040111D

call

GetNotepadThreadId

 

00401122

push

eax

; dwThreadId

00401123

push

esi

; hmod

00401124

push

edi

; lpfn

00401125

push

WH_CBT ; idHook

 

00401127

call

SetWindowsHookExA

 

Вредоносная программа загружает зараженную библиотеку (hook.dll), после чего получает адрес процедуры перехвата. Эта процедура, MalwareProc, делает лишь один вызов — CallNextHookEx. После этого из потока, принадлежащего процессу notepad.exe (будем считать, что он запущен), вызывается локальная функция

SetWindowsHookEx, которая получает идентификатор dwThreadId для notepad.exe.