
실행 파일의 아이콘 파일에 페이로드를 내장하는 페이로드 전달 시스템!

Blenny는 실행 파일의 아이콘 안에 실행 가능한 페이로드 데이터를 숨기는 Windows용 개념 증명(PoC) 페이로드 난독화 도구입니다. 이름은 검치 블레니에서 따왔으며, 이 물고기는 청소 물고기의 행동과 모습을 흉내 내어 무심한 물고기를 잡아먹습니다.
정확한 경위는 기억나지 않지만, retr0id(@DavidBuchanan314)라는 해커가 실행 파일의 아이콘 안에 페이로드를 숨기는 아이디어를 제기했습니다. PNG 파일의 다양한 특성과 Windows 아이콘 파일이 내부에 PNG 데이터를 포함할 수 있다는 점 덕분에, 이 아이디어를 아주 쉽게 구현할 수 있으리라는 것을 깨달았습니다. 약간의 노력만 들이면 되었습니다. 바로 그 목적을 위해 PNG 파일에서 페이로드를 생성하는 용도로 특화된 Facade 라이브러리를 만들었습니다.
최종 결과물은 Windows용 기본 드로퍼/실행기 페이로드를 맞춤 설정하는 데 사용할 수 있는 컴팩트한 페이로드 파일과 빌드 시스템입니다.
Blenny는 아이콘 파일에서 페이로드를 생성하기 위해 Facade 라이브러리를 사용하므로, 저장소를 내려받을 때 서브모듈(및 그 하위 서브모듈)을 초기화해야 합니다:
$ git clone https://github.com/frank2/blenny.git
$ cd blenny
$ git submodule update --init --recursive
이것으로 빌드를 위한 저장소 초기화에 필요한 모든 작업이 끝납니다.
이 프로젝트는 문자 그대로 CMake를 염두에 두고 설계되었으므로, 이 프로젝트를 빌드하기 전에 CMake를 내려받아 설치하는 것이 절대적으로 필요합니다. 그렇지 않으면 작동하지 않을 것입니다(직접 모든 CMake 정의를 수동으로 설정하는 데 정말 전념하지 않는 한). 프로젝트를 컴파일하려면 Visual Studio 사본도 필요합니다.
이 프로젝트는 빌드 프로세스를 구성하기 위해 수많은 CMake 변수를 사용합니다. 사랑스러운 양 친구가 바탕 화면에 나타나는 기본 데모 페이로드를 얻으려면 프로젝트의 기본 디렉터리에서 다음을 실행하면 됩니다:
$ mkdir build
$ cd build
$ cmake -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
$ ./Release/blenny.exe
기본적으로 이 도구는 실행 파일의 아이콘에서 "blenny.exe"라는 실행 파일을 추출하여 현재 사용자의 임시 디렉터리에 넣은 다음 실행합니다. 기본 페이로드는 @AdrianoTiger의 DesktopPet으로, 90년대 클래식 esheep.exe를 전용으로 다시 빌드한 것입니다.
이 모든 것을 가능하게 하는 변수는 모두 사용자 지정할 수 있습니다! 하나의 페이로드 변수(BLENNY_TRAILING_PAYLOAD, BLENNY_TEXT_PAYLOAD, BLENNY_ZTEXT_PAYLOAD 또는 BLENNY_STEGO_PAYLOAD)를 반드시 설정해야 합니다. 이 변수는 페이로드가 최종적으로 아이콘에 채워지는 방식을 제어합니다. 이러한 기법에 대한 자세한 내용은 Facade 라이브러리를 참조하세요. 예를 들어, 자신만의 페이로드를 사용하려면 다음과 같이 하면 됩니다:
$ cmake -D BLENNY_PAYLOAD_FILE="path/to/your/payload.exe" -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
설정할 수 있는 다양한 구성 옵션, 기본값 및 기능을 정리한 표는 다음과 같습니다.
| 플래그 | 유형 | 기본값 | 용도 |
|---|
| BLENNY_PAYLOAD_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaultpayload.exe" | 아이콘 파일에 포함할 페이로드. 참고: 최종 실행 방식이 ShellExecuteA이므로 배치 스크립트처럼 탐색기에서 시작할 수 있는 모든 파일이 될 수 있습니다! |
| BLENNY_ICON_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaulticon.ico" | 실행 파일에 사용하고 페이로드를 포함할 아이콘. 참고: 모든 아이콘이 작동하는 것은 아닙니다! 아이콘 파일에는 PNG 섹션이 있어야 합니다. 대상 아이콘의 데이터를 헥사 편집기에서 확인하여 PNG 이미지가 포함되어 있는지 확인하세요! |
| BLENNY_TRAILING_PAYLOAD | Boolean | OFF | 아이콘의 PNG 파일 내에 트레일링 데이터 페이로드를 활성화합니다. |
| BLENNY_TEXT_PAYLOAD | Boolean | OFF | 아이콘의 PNG 파일 내에 tEXt 섹션 페이로드를 활성화합니다. |
| BLENNY_ZTEXT_PAYLOAD | Boolean | OFF | 아이콘의 PNG 파일 내에 zTXt 섹션 페이로드를 활성화합니다. 이는 압축된 tEXt 페이로드입니다. |
| BLENNY_STEGO_PAYLOAD | Boolean | OFF | 아이콘의 PNG 파일 내에 스테가노그래피 페이로드를 활성화합니다. 참고: 대부분의 아이콘 이미지 크기가 256x256으로 제한되므로 모든 페이로드가 이 옵션에 맞지는 않습니다! |
| BLENNY_PAYLOAD_KEYWORD | String | "blenny" | 텍스트/ztext 페이로드의 경우 페이로드 데이터를 표시하는 키워드를 설정합니다. |
| BLENNY_ADMIN | Boolean | OFF | runas 키워드를 활성화하여 페이로드를 관리자 권한으로 실행합니다. |
| BLENNY_PATH | String | "%TEMP%" | 실행 전에 페이로드를 저장할 경로. 환경 변수는 실행 시 확장됩니다. |
| BLENNY_FILENAME | String | "blenny" | 추출 시 페이로드에 부여할 파일 이름. |
| BLENNY_RANDOM_FILENAME | Boolean | OFF | 추출 시 페이로드에 대해 임의의 파일 이름이 생성되도록 활성화합니다. |
| BLENNY_RANDOM_FILENAME_LENGTH | Integer | 8 | 임의 파일 이름의 길이를 조정합니다. |
| BLENNY_RANDOM_FILENAME_RANDOM_LENGTH | Boolean | OFF | 추출 시 파일 이름에 임의의 길이를 부여합니다. |
| BLENNY_PAYLOAD_ARGS | String | "" | 실행 시 페이로드 파일에 전달할 인수. |
| BLENNY_FILE_ATTRIBUTES | Integer | 0x80 (일명 FILE_ATTRIBUTE_NORMAL) | 파일 생성 시 파일에 부여할 파일 속성. |
| BLENNY_CMD_SHOW | Integer | 5 (일명 SW_SHOW) | 실행 시 페이로드 파일의 표시 상태. 또 다른 예로는 0인 SW_HIDE가 있습니다. |