
C/C++로 재구성된 EternalBlue 스위트: MS17-010 익스플로잇, EternalBlue 취약점 탐지기, DoublePulsar 탐지기 및 DoublePulsar 셸코드 및 DLL 업로더 포함
C/C++로 재구성된 EternalBlue 스위트이며 다음을 포함합니다:



Recvbuff[18] -> Recvbuff[22]의 값들은 DoublePulsar XOR 키 계산기 함수에 전달되어 unsigned 정수 XOR 키를 생성합니다. 이 키는 DoublePulsar에 업로드할 셸코드 또는 DLL 페이로드를 암호화하는 데 사용됩니다. Windows 7 x64에서 테스트 완료.
샘플 스크린샷:

FUZZBUNCH의 원본 NSA 바이너리와 동일한 키

DoublePulsar_structure_ping.cpp - 이 프로그램은 4개의 SMB 패킷을 전송합니다: 1개의 협상, 1개의 세션 설정, 1개의 트리 연결 및 Trans2 SESSION_SETUP 패킷. doublepulsar_check.cpp와의 차이점은 이 프로그램이 Wannacry 샘플에서 가져온 하드코딩된 SMB 16진수 문자열 대신 구조체를 사용하여 Trans2 DoublePulsar PING 패킷을 생성한다는 점입니다. 또 다른 차이점은 이 프로그램이 Wannacry 샘플에 있는 하드코딩된 패킷 대신 TreeConnect 패킷을 동적으로 생성한다는 점입니다. 이 프로그램에서 생성된 ping 패킷은 원격 시스템에 DoublePulsar가 설치되어 있는지 알려줍니다.
DoublePulsar_structure_exec.cpp - 이 프로그램은 5개의 SMB 패킷을 전송합니다: 1개의 SMB 협상, 1개의 세션 설정, 1개의 트리 연결, 1개의 Doublepulsar Trans2 SESSION_SETUP Ping 패킷 및 1개의 Doublepulsar Trans2 SESSION_SETUP 실행 패킷. Doublepulsar_UploadShellcode.cpp와의 차이점은 이 프로그램이 Wannacry 샘플에서 가져온 하드코딩된 SMB 16진수 문자열 대신 구조체를 사용하여 Trans2 DoublePulsar 실행 패킷을 생성한다는 점입니다.
Doublepulsar_UploadDLL.cpp - 이 프로그램은 DLL용입니다. 이 프로그램은 4개의 SMB 패킷과 DLL 데이터를 포함한 SMB Trans2 패킷을 전송합니다: 1개의 협상, 1개의 세션 설정, 1개의 트리 연결, 1개의 Ping Trans2 SESSION_SETUP 요청 및 실행 Trans2 SESSION_SETUP 패킷. Ping Trans2 SESSION_SETUP 요청 패킷을 전송하여 Trans2 SESSION_SETUP 응답 패킷에서 SMB 서명을 얻습니다. 이 서명은 DoublePulsar XOR 키 계산기를 통해 처리됩니다. 그런 다음 프로그램은 DLL 파일을 읽고 64비트 커널 및 사용자랜드 셸코드와 결합하여 DLL을 실행하고, SMB 서명에서 계산된 DoublePulsar XOR 키로 버퍼를 XOR합니다. 메모리를 할당하고 Trans2 패킷을 복사하고 SMB 트랜잭션에 필요한 값(UserID, TreeID, TotalDataCount, DataCount, ByteCount)을 편집한 다음 XOR된 데이터(커널 셸코드 + DLL)를 끝에 복사하여 DoublePulsar에 한 번에 4096바이트씩 전송하는 패킷을 생성합니다. 총 패킷 길이 = 4178. 4096은 XOR 암호화 데이터용입니다. 향후 릴리스에서는 SMB 및 TRANSACTION2 구조체도 구현할 예정입니다.
Doublepulsar_UploadShellcode.cpp - 이 프로그램은 5개의 SMB 패킷을 전송합니다: 1개의 협상, 1개의 세션 설정, 1개의 트리 연결, 1개의 Ping Trans2 SESSION_SETUP 패킷 및 1개의 실행 Trans2 SESSION_SETUP 패킷. Trans2 SESSION_SETUP 요청 패킷을 전송하여 TRANS2 SESSION_SETUP 응답 패킷에서 SMB 서명을 얻습니다. 이 서명은 DoublePulsar XOR 키 계산기를 통해 처리됩니다. 그런 다음 프로그램은 커널 셸코드와 샘플 셸코드를 버퍼에 복사하고, SMB 서명에서 계산된 DoublePulsar XOR 키로 버퍼를 XOR합니다. 메모리를 할당하고 Trans2 실행 패킷을 복사하고 SMB 트랜잭션에 필요한 값(UserID, TreeID, TotalDataCount, DataCount, ByteCount)을 편집한 다음 SESSION_SETUP 매개변수와 4096바이트의 XOR된 셸코드 데이터를 끝에 복사하여 DoublePulsar에 총 패킷 길이 4178바이트로 전송합니다. 총 패킷 길이 = 4178. NetBIOS 헤더는 자체 크기를 계산하지 않으므로 NetBIOS 길이는 4174가 됩니다. 이 패킷 중 12바이트는 Doublepulsar SESSION_SETUP 매개변수용입니다. 4096은 XOR 암호화 데이터용입니다. 향후 릴리스에서는 SMB 및 TRANSACTION2 구조체를 사용할 예정입니다.

zerosum0x0에서 생성한 셸코드 - zerosum0x0은 ETERNALBLUE용 사용자 정의 셸코드를 작성했으며, 약간의 수정을 통해 DOUBLEPULSAR에 재사용할 수 있습니다. 복사된 셸코드의 syscall 덮어쓰기가 이 사용 사례에 불필요했기 때문에 다음과 같이 정의 해제했습니다:
;%define SYSCALL_OVERWRITE ; to run at process IRQL in syscall
다음과 같이 재컴파일: nasm -w-other -o >(xxd -p -c 16 | sed 's/../\x&/g') external/source/shellcode/windows/multi_arch_kernel_queue_apc.asm
https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/multi_arch_kernel_queue_apc.asm
https://raw.githubusercontent.com/ninp0/eternalblue/master/eternalblue_kshellcode_x64.asm
https://raw.githubusercontent.com/ninp0/eternalblue/master/eternalblue_kshellcode_x86.asm
https://www.rapid7.com/blog/post/2019/10/02/open-source-command-and-control-of-the-doublepulsar-implant/
DoublePulsar_UploadExe.cpp -
이 프로그램은 실행 파일용입니다. 실행 파일을 메모리로 읽어들여 Wannacry 런처 DLL에 배치한 후 DoublePulsar를 통해 전송합니다. 1개의 협상, 1개의 세션 설정, 1개의 트리 연결, 1개의 Trans2 Ping 패킷 및 여러 개의 Trans2 exec SESSION_SETUP 패킷으로 구성됩니다. Trans2 Ping 요청 패킷을 전송하여 Trans2 응답 패킷에서 SMB 서명을 얻습니다. 이 서명은 DoublePulsar XOR 키 계산기를 통해 처리됩니다. 그런 다음 프로그램은 EXE 파일을 읽고 64비트 커널 및 사용자랜드 셸코드와 스켈레톤 DLL 파일과 결합한 후 SMB 서명에서 계산된 DoublePulsar XOR 키로 버퍼를 XOR합니다. 메모리를 할당하고 Trans2 실행 패킷을 복사하고 SMB 트랜잭션에 필요한 값(UserID, TreeID, TotalDataCount, DataCount, ByteCount)을 편집한 다음 XOR된 데이터(커널 셸코드 + DLL + 실행 파일)를 끝에 복사하여 DoublePulsar에 한 번에 4096바이트씩 전송하는 패킷을 생성합니다. 총 패킷 길이 = 4178. NetBIOS 헤더는 자체 크기를 계산하지 않으므로 NetBIOS 길이는 4174가 됩니다. 이 패킷 중 12바이트는 Doublepulsar SESSION_SETUP 매개변수용입니다. 4096은 XOR 암호화 데이터용입니다.
EternalBlue.cpp - 이 프로그램은 여러 SMB 패킷을 전송합니다: 협상, 세션 설정, 트리 연결 및 여러 NT trans 및 Trans2 패킷. 이 NT trans 패킷은 비정상적으로 구성되어 피해자 컴퓨터의 메모리에서 익스플로잇을 준비합니다. 더 많은 공백 또는 빈 SMB 패킷이 여러 소켓을 통해 피해자의 동일한 포트로 전송됩니다. EternalBlue의 base64 페이로드 대부분은 협상, 세션 설정 및 트리 연결 패킷이 전송된 소켓 1을 통해 전송됩니다. 그런 다음 20개의 추가 소켓이 생성되어 해당 소켓(소켓 321)으로 데이터가 전송됩니다. 이후 소켓 321에 DoublePulsar가 전송됩니다. 그런 다음 프로그램이 소켓을 닫으면 피해자 컴퓨터에서 EternalBlue와 DoublePulsar가 폭발합니다. SMB 연결 해제 및 SMB 로그오프 요청이 전송된 후 연결이 종료됩니다. 이 익스플로잇은 작동하며 Windows 7 x64에서 테스트되었습니다. 인터넷상의 EternalBlue 해설에서 이미 보고된 바와 같이 백도어가 완전히 작동하는 데 약 5초가 걸렸습니다. 더 많은 익스플로잇 시도가 필요할 수 있습니다. 그러나 현재 패킷에서 TreeID 및 UserID가 올바르게 설정되지 않는 버그가 있으며, 이후 릴리스에서 수정될 예정입니다. 이 버그는 TreeID와 UserID가 기본값으로 설정되어 있기 때문에 최근에 켜진 시스템에서는 작동합니다. 이 패킷들은 현재 기본값인 "08 00"으로 설정되어 있으므로 TreeID 및 UserID 값을 업데이트해야 합니다.
Metasploit의 오픈 소스 DoublePulsar RCE 모듈을 사용하여 기능하는 사용자 정의 Metasploit 모듈을 만들었습니다.
DoublePulsar가 DLL을 실행할 수 있도록 DLL을 생성하고 Wannacry에서 가져온 x64 커널 셸코드(앞에 추가)와 병합하는 로직으로 변경했습니다.

저장소에는 교육 목적으로 다음 파일도 포함되어 있으며, 이에 대한 지원은 제공되지 않습니다:
DoublePulsar x86/x64 DLL 업로드 Python 스크립트
EternalBlue 올인원 바이너리
다중 아키텍처 커널 큐 APC 어셈블리 코드 및 Windows x86/x64 다중 아키텍처 커널 링 0에서 링 3으로의 Queued APC 커널 코드
worawit의 EternalBlue x64/x86 커널 페이로드 셸코드
Eternalblue 재생 파일


