
ScareCrow - EDR 우회를 중심으로 설계된 페이로드 생성 프레임워크
ScareCrow의 최신 버전을 확인하거나 이슈를 제출하려면 https://github.com/Tylous/ScareCrow를 참조하십시오.
이 프레임워크에서 사용된 기술에 대해 더 자세히 알고 싶다면 Part 1 및 Part 2를 참조하십시오.
ScareCrow는 합법적인 Windows 프로세스에 사이드 로딩(주입이 아닌)을 위한 페이로드 생성 프레임워크입니다(애플리케이션 허용 목록 제어 우회). DLL 로더가 메모리에 로드되면, 프로세스 메모리에서 실행 중인 시스템 DLL에서 EDR의 후크를 제거하는 기술을 활용합니다. 이는 EDR의 후크가 프로세스가 생성될 때 배치된다는 사실을 이용하기 때문에 작동합니다.
ScareCrow는 이러한 DLL을 대상으로 하여 API 함수 VirtualProtect를 사용하여 메모리 내에서 조작할 수 있습니다. VirtualProtect는 프로세스 메모리의 특정 섹션 권한을 다른 값, 특히 Execute–Read에서 Read-Write-Execute로 변경합니다.
ScareCrow는 후크 해제를 위해 2가지 방법 중 하나를 사용합니다.
실행되면 ScareCrow는 C:\Windows\System32\에 디스크에 저장된 시스템 DLL의 바이트를 복사합니다. 이러한 DLL은 프로세스가 생성될 때 변경되지 않은 복사본을 새 프로세스에 로드하는 데 사용되기 때문에 디스크에 EDR 후크가 없는 상태로 저장됩니다. EDR은 메모리 내에서만 이러한 프로세스를 후킹하므로 디스크의 DLL은 변경되지 않습니다. ScareCrow는 전체 DLL 파일을 복사하지 않고 DLL의 .text 섹션에만 집중합니다. DLL의 이 섹션에는 실행 가능한 어셈블리가 포함되어 있으며, 이렇게 함으로써 ScareCrow는 전체 파일을 다시 읽으면 EDR이 시스템 리소스의 수정을 감지할 수 있기 때문에 탐지 가능성을 줄이는 데 도움이 됩니다. 그런 다음 각 함수의 오프셋을 사용하여 데이터를 올바른 메모리 영역에 복사합니다. 각 함수에는 함수가 위치한 기본 주소로부터의 정확한 바이트 수를 나타내는 오프셋이 있으며, 이를 통해 스택에서 함수의 위치를 제공합니다.
이를 위해 ScareCrow는 VirtualProtect를 사용하여 .text 메모리 영역의 권한을 변경합니다. 이는 시스템 DLL이지만 제어하는 프로세스에 로드되었으므로 상승된 권한 없이도 메모리 권한을 변경할 수 있습니다.
ScareCrow는 먼저 세 가지 암호화 방법(아래 설명) 중 하나로 암호화된 셸코드를 복호화한 후 메모리에 로드합니다. 복호화되어 로드되면 셸코드가 실행됩니다. 지정된 로더 옵션에 따라 ScareCrow는 DLL에 대해 다른 내보내기 함수를 설정합니다. 로드된 DLL에는 일반적으로 모든 DLL이 작동하는 데 필요한 표준 DLLMain 함수도 포함되어 있지 않습니다. DLL은 여전히 문제없이 실행됩니다. 로드되는 프로세스가 해당 내보내기 함수를 찾고 DLLMain의 존재 여부는 신경 쓰지 않기 때문입니다.
이후
KnownDLLs는 Windows가 시스템 시작 프로세스 중에 로드하는 DLL 목록입니다. 이러한 DLL은 운영 체제 기능에 필수적인 것으로 간주되므로 애플리케이션 시작 시 로드 시간을 줄이고 성능을 향상시키기 위해 캐시됩니다. KnownDLLs에는 kernel32.dll, kernelbase.dll 및 ntdll.dll과 같은 DLL이 포함됩니다.
이러한 KnownDlls를 활용하여 ScareCrow는 NtOpenSection과 NtMapViewOfSection의 조합을 사용하여 \KnownDlls\<dllname>에서 DLL의 복사본을 매핑하여 프로세스 메모리에 로드합니다. ScareCrow는 전체 DLL을 로드하지 않고 DLL의 .text 섹션만 로드합니다(이 섹션에는 모든 시스템 호출이 포함되어 있음). 그런 다음 ScareCrow는 간접 시스템 호출을 사용하여 NtProtectVirtualMemory를 호출하고 DLL의 .text 메모리 섹션 권한을 변경하여 ScareCrow가 EDR의 후크를 덮어쓴 후 권한을 복원할 수 있도록 합니다.
자세한 내용은 modexp의 상세 article를 읽을 수 있습니다.
후크가 제거되면 ScareCrow는 사용자 지정 시스템 호출을 사용하여 셸코드를 메모리에 로드하고 실행합니다. ScareCrow는 EDR 후크가 제거된 후에도 이 작업을 수행하여 Event Tracing for Windows (ETW) 또는 기타 이벤트 로깅 메커니즘과 같은 사용자 영역이 아닌 후크 기반 텔레메트리 수집 도구에 의한 탐지를 피하는 데 도움을 줍니다. 이러한 사용자 지정 시스템 호출은 위에서 설명한 EDR이 배치한 후크를 제거하기 위한 VirtualProtect 호출을 수행하는 데에도 사용되며, EDR의 변조 방지 제어에 의한 탐지를 피합니다. 이는 VirtualProtect 시스템 호출의 사용자 지정 버전인 NtProtectVirtualMemory를 호출하여 수행됩니다. ScareCrow는 Golang을 사용하여 이러한 로더를 생성한 다음 어셈블리를 사용하여 이러한 사용자 지정 시스템 호출 함수를 생성합니다.
로더 생성 과정에서 ScareCrow는 비콘이 홈 콜백한 후 백그라운드에 혼합되기 위한 라이브러리를 사용합니다. 이 라이브러리는 두 가지 작업을 수행합니다:
limelighter의 go 패키지 버전을 사용하여 pfx12 파일을 생성함으로써 이러한 인증서를 만듭니다. 이 패키지는 사용자가 지정한 도메인 이름을 입력받아 해당 도메인에 대한 코드 서명 인증서를 생성합니다. 필요한 경우 valid 명령줄 옵션을 사용하여 자체 코드 서명 인증서가 있는 경우 사용할 수도 있습니다. 로더를 microsoft.com으로 서명할 때 WINDOWS DEFENDER ATP 제품에 대해 사용하면 인증서가 Microsoft에 속하므로 검증할 수 있기 때문에 효과적이지 않을 수 있습니다. Windows 제품에 대해 로더를 사용하는 경우 다른 도메인을 사용하십시오.
이러한 파일과 go 코드를 사용하여 ScareCrow는 c-shared 라이브러리 옵션을 사용하여 DLL로 교차 컴파일합니다. DLL이 컴파일되면 깨진 base64 문자열로 난독화되어 파일에 임베드됩니다. 이를 통해 파일을 원격으로 가져오고, 액세스하고, 프로그래밍 방식으로 실행할 수 있습니다.
ScareCrow에는 광범위한 파일 속성 목록이 있지만 사용자 정의(환경별) 속성 집합이 필요한 경우도 있습니다. 이를 수용하기 위해 ScareCrow는 속성이 포함된 JSON 파일 입력을 허용합니다. -configfile 명령줄 옵션을 사용하면 ScareCrow는 기존 속성 대신 이러한 속성과 파일 이름을 사용합니다. main.json 파일에는 JSON 구조가 올바르게 작동하기 위해 필요한 샘플 템플릿이 포함되어 있습니다. "InternalName"으로 사용하는 것이 파일 이름이 됩니다.
ScareCrow는 이제 로더를 컴파일하기 위해 golang 1.19.1 이상이 필요합니다. 이전 버전을 실행 중인 경우 버전 1.19.1 이상을 사용하십시오.
새 버전은 https://golang.org/dl/에서 확인하십시오.
첫 번째 단계는 항상 그렇듯이 저장소를 클론하는 것입니다. ScareCrow를 컴파일하기 전에 종속성을 설치해야 합니다.
설치하려면 다음 명령어를 실행하십시오:``` go get github.com/fatih/color go get github.com/yeka/zip go get github.com/josephspurrier/goversioninfo go get github.com/Binject/debug/pe go get github.com/awgh/rawreader
운영 체제에 다음 항목들이 설치되어 있는지 확인하세요:```
openssl
osslsigncode
mingw-w64
그런 다음 빌드하세요.``` go build ScareCrow.go
또한, ScareCrow는 모든 로더를 난독화하기 위해 [Garble](https://github.com/burrowers/garble)을 사용합니다.
참고: 여러 종속성이 Windows에서 컴파일 시 제대로 작동하지 않습니다. 따라서 OSX 또는 Linux에서 로더를 컴파일하는 것이 좋습니다.
## 도움말```
./ScareCrow -h
_________ _________
/ _____/ ____ _____ _______ ____ \_ ___ \_______ ______ _ __
\_____ \_/ ___\\__ \\_ __ \_/ __ \/ \ \/\_ __ \/ _ \ \/ \/ /
/ \ \___ / __ \| | \/\ ___/\ \____| | \( <_> ) /
/_______ /\___ >____ /__| \___ >\______ /|__| \____/ \/\_/
\/ \/ \/ \/ \/
(@Tyl0us)
“Fear, you must understand is more than a mere obstacle.
Fear is a TEACHER. the first one you ever had.”
Usage of ./ScareCrow:
-Evasion string
Sets the type of EDR unhooking technique:
[*] Disk - Retrives a clean version of the DLLs ".text" field from files stored on disk.
[*] KnownDLL - Retrives a clean version of the DLLs ".text" field from the KnownDLLs directory in the object namespace.
[*] None - The Loader that WILL NOT removing the EDR hooks in system DLLs and only use custom syscalls. (default "Disk")
-Exec string
Set the template to execute the shellcode:
[*] RtlCopy - Using RtlCopy to move the shellcode into the allocated address in the current running process by making a Syscall.
[*] ProcessInjection - Process Injection Mode.
[*] NtQueueApcThreadEx - Executes the shellcode by creating an asynchronous procedure call (APC) to a target thread.
[*] VirtualAlloc - Allocates shellcode into the process using custom syscalls in the current running process (default "RtlCopy")
-I string
Path to the raw 64-bit shellcode.
-Loader string
Sets the type of process that will sideload the malicious payload:
[*] binary - Generates a binary based payload. (This type does not benefit from any sideloading)
[*] control - Loads a hidden control applet - the process name would be rundll32 if -O is specified a JScript loader will be generated.
[*] dll - Generates just a DLL file. Can be executed with commands such as rundll32 or regsvr32 with DllRegisterServer, DllGetClassObject as export functions.
[*] excel - Loads into a hidden Excel process using a JScript loader.
[*] msiexec - Loads into MSIexec process using a JScript loader.
[*] wscript - Loads into WScript process using a JScript loader. (default "binary")
-O string
Name of output file (e.g. loader.js or loader.hta). If Loader is set to dll or binary this option is not required.
-clone string
Path to the file containing the certificate you want to clone
-configfile string
The path to a json based configuration file to generate custom file attributes. This will not use the default ones.
-console
Only for Binary Payloads - Generates verbose console information when the payload is executed. This will disable the hidden window feature.
-delivery string
Generates a one-liner command to download and execute the payload remotely:
[*] bits - Generates a Bitsadmin one liner command to download, execute and remove the loader (Compatible with Binary, Control, Excel, and Wscript Loaders).
[*] hta - Generates a blank hta file containing the loader along with an MSHTA command to execute the loader remotely in the background (Compatible with Control and Excel Loaders).
[*] macro - Generates an office macro that will download and execute the loader remotely (Compatible with Control, Excel, and Wscript Loaders).
-domain string
The domain name to use for creating a fake code signing cert. (e.g. www.acme.com)
-encryptionmode string
Sets the type of encryption to encrypt the shellcode:
[*] AES - Enables AES 256 encryption.
[*] ELZMA - Enables ELZMA encryption.
[*] RC4 - Enables RC4 encryption. (default "ELZMA")
-export string
For DLL Loaders Only - Specify an Export function for a loader to have.
-injection string
Enables Process Injection Mode and specify the path to the process to create/inject into (use \ for the path).
-noamsi
Disables the AMSI patching that prevents AMSI BufferScanner.
-noetw
Disables the ETW patching that prevents ETW events from being generated.
-nosign
Disables file signing, making -domain/-valid/-password parameters not required.
-nosleep
Disables the sleep delay before the loader unhooks and executes the shellcode.
-obfu
Enables Garbles Literal flag replaces golang libray strings with more complex variants, resolving to the same value at run-time. This creates a larger loader and times longer to compile
-outpath string
The path to put the final Payload/Loader once it's compiled.
-password string
The password for code signing cert. Required when -valid is used.
-sandbox
Enables sandbox evasion using IsDomainJoined calls.
-url string
URL associated with the Delivery option to retrieve the payload. (e.g. https://acme.com/)
-valid string
The path to a valid code signing cert. Used instead -domain if a valid code signing cert is desired.
로더는 셸코드를 대상 시스템에 로드하는 데 사용되는 기술 유형을 결정합니다. 로더 옵션이 선택되지 않은 경우, ScareCrow는 rundll32, regsvr32 또는 DLL을 활용하는 다른 기술에서 사용할 수 있는 표준 DLL 파일을 컴파일합니다. ScareCrow는 세 가지 유형의 로더를 사용하여 셸코드를 메모리에 로드합니다:
.cpl 파일 확장자를 결합하면 제어판 프로세스(rundll32.exe)가 생성되고 로더가 메모리에 로드됩니다.ScareCrow는 -Loader 명령줄 옵션을 사용하여 필요한 경우 바이너리 기반 페이로드를 생성할 수도 있습니다. 이러한 바이너리는 side-by-side 로딩 기술의 이점을 받지 못하지만 상황에 따라 셸코드를 실행하는 추가 기술 역할을 합니다.
ScareCrow는 먼저 프로세스를 생성한 후 백그라운드로 이동시키는 기술을 사용합니다. 이는 두 가지 역할을 합니다. 첫째, 프로세스를 숨기는 데 도움이 되고, 둘째, EDR 제품에 탐지되지 않도록 합니다. 프로세스를 바로 백그라운드에서 생성하는 것은 매우 의심스럽고 악성 행위의 지표가 될 수 있습니다. ScareCrow는 프로세스가 생성되고 EDR의 후크가 로드된 후 GetConsoleWindow 및 ShowWindow Windows 함수를 호출한 다음 창 속성을 숨김으로 변경하여 이를 수행합니다. ScareCrow는 전통적인 -ldflags -H=windowsgui를 사용하는 대신 이러한 API를 사용합니다. 이는 대부분의 보안 제품에서 강력하게 시그니처링되어 손상 지표(IoC)로 분류되기 때문입니다.
-console 명령줄 옵션이 선택되면 ScareCrow는 프로세스를 백그라운드에 숨기지 않습니다. 대신 로더가 수행하는 작업을 표시하는 여러 디버그 메시지를 추가합니다.
ScareCrow는 셸코드를 실행하기 위해 다양한 템플릿을 사용합니다. 템플릿을 선택하려면 -Exec 명령줄 옵션을 사용하십시오. 템플릿은 다음과 같습니다:
ScareCrow는 프로세스 인젝션 공격을 수행할 수 있습니다. 로더 프로세스나 인젝션된 프로세스 자체에서 후킹이나 탐지를 피하기 위해 ScareCrow는 먼저 평소와 같이 로더 프로세스를 언후킹하여 프로세스에 후크가 없는지 확인합니다. 완료되면 로더는 생성 명령에 지정된 프로세스를 생성합니다. 생성되면 로더는 프로세스에 대한 핸들을 생성하여 로드된 DLL 목록을 검색합니다. DLL을 찾으면 원격 프로세스에서 각 DLL의 기본 주소를 열거합니다. WriteProcessMemory 함수를 사용하여 로더는 디스크에 저장된 시스템 DLL의 바이트(EDR 후크가 없으므로 "깨끗함")를 메모리 권한을 먼저 변경할 필요 없이 작성합니다. ScareCrow는 WriteProcessMemory를 사용하는데, 이 함수에는 디버깅에서 주로 사용되는 기능이 포함되어 있어 메모리 섹션이 읽기 전용이더라도 WriteProcessMemory 호출의 모든 조건이 올바르면 일시적으로 권한을 읽기-쓰기로 변경하고 메모리 섹션을 업데이트한 후 원래 권한을 복원합니다. 이렇게 완료되면 로더는 생성된 프로세스에 셸코드를 문제없이 인젝션할 수 있습니다. 두 프로세스 모두 EDR 후크가 없기 때문입니다.
이 옵션은 모든 로더 옵션과 함께 사용할 수 있습니다. 프로세스 인젝션을 활성화하려면 인젝션할 프로세스의 전체 경로와 함께 -injection 명령줄 옵션을 사용하십시오. 인수를 경로로 입력할 때는 전체 경로를 ""로 묶거나 각 디렉터리 경로에 이중 \를 사용하는 것이 중요합니다.
ScareCrow는 AMSI(Antimalware Scan Interface) 및 ETW 함수를 패치하여 프로세스에서 이벤트가 생성되지 않도록 방지하는 기능을 포함합니다.
AMSI는 Windows 네이티브 API로, Windows Defender(또는 기타 맬웨어 방지 제품)가 Windows 운영 체제에 깊이 통합되어 메모리 기반 공격에 대한 향상된 보호를 제공할 수 있게 합니다. AMSI를 사용하면 보안 제품이 악성 지표를 더 잘 탐지하고 위협을 차단하는 데 도움이 됩니다. AMSI는 Windows에 네이티브이므로 제품이 AMSI를 "후킹"할 필요 없이 필요한 DLL을 로드하여 프로세스에 대한 향상된 통찰력을 얻습니다. 이 때문에 ScareCrow는 AMSI.dll DLL을 로드한 후 패치하여 스캔 인터페이스의 모든 결과가 정상으로 반환되도록 합니다. AMSI 패치는 모든 로더에서 기본값입니다. 로더에서 AMSI를 패치하지 않으려면 -noamsi 명령줄 옵션을 사용하여 비활성화하십시오.
ETW는 내장된 시스템 콜을 사용하여 이 원격 측정을 생성합니다. ETW도 Windows에 내장된 네이티브 기능이므로 보안 제품은 ETW 시스템 콜을 "후킹"하여 정보를 얻을 필요가 없습니다. 결과적으로 ETW를 방지하기 위해 ScareCrow는 여러 ETW 시스템 콜을 패치하여 레지스터를 플러시하고 실행 흐름을 다음 명령어로 반환합니다. ETW 패치는 이제 모든 로더에서 기본값입니다. 로더에서 ETW를 패치하지 않으려면 -noetw 명령줄 옵션을 사용하여 비활성화하십시오.
현재 이 옵션들은 부모 프로세스에만 적용됩니다. -injection 명령줄 옵션을 사용하면 주 프로세스는 AMSI와 ETW를 패치하지만 인젝션된 프로세스는
셸코드 암호화는 EDR 및 기타 보안 제품에 의해 탐지 및 분석되는 것을 보호하는 중요한 기술입니다. ScareCrow는 셸코드를 암호화하는 여러 방법을 제공하며, 여기에는 AES, ELZMA 및 RC4가 포함됩니다.
AES(Advanced Encryption Standard)는 데이터 암호화에 널리 사용되는 대칭 암호화 알고리즘입니다. ScareCrow는 AES 256비트 크기를 사용하여 셸코드를 암호화합니다. AES를 사용하여 셸코드를 암호화하면 강력한 암호화를 제공하고 암호화 라이브러리에서 널리 지원된다는 장점이 있습니다. 그러나 고정 블록 크기를 사용하면 패딩 오라클 공격과 같은 특정 공격에 취약해질 수 있습니다.
ELZMA는 맬웨어에서 코드를 난독화하는 데 자주 사용되는 압축 및 암호화 알고리즘입니다. ELZMA를 사용하여 셸코드를 암호화하려면 먼저 셸코드를 ELZMA 알고리즘으로 압축합니다. 그런 다음 압축된 데이터를 임의의 키로 암호화합니다. 암호화된 데이터와 키는 익스플로잇 코드에 포함됩니다. ELZMA를 사용하여 셸코드를 암호화하면 단일 알고리즘으로 압축과 암호화를 모두 제공한다는 장점이 있습니다. 이는 익스플로잇 코드의 크기를 줄이고 탐지하기 더 어렵게 만드는 데 도움이 됩니다.
RC4는 맬웨어에서 셸코드를 암호화하는 데 자주 사용되는 대칭 암호화 알고리즘입니다. 가변 길이 키를 사용할 수 있는 스트림 암호로, 단순성과 속도로 유명합니다.
-obfu 명령줄 옵션을 사용하면 컴파일 과정 중 Garbles Literal 플래그가 활성화됩니다. 이는 모든 golang 라이브러리 참조와 문자열을 런타임에 동일한 값으로 확인되는 더 복잡한 버전으로 대체합니다. 이 과정은 완료하는 데 더 오랜 시간이 걸리며, 결과적으로 더 큰 GO 파일이 생성됩니다. 파일이 컴파일되면 ScareCrow는 새로 생성된 파일을 구문 분석하여 GO 문자열 기반 IoC를 제거합니다.
전달 명령줄 인수를 사용하면 원격 소스에서 파일을 가져와 피해자 호스트로 가져오는 명령 또는 코드 문자열(매크로의 경우)을 생성할 수 있습니다. 이러한 전달 방법은 다음과 같습니다: