
"Bob the Smuggler": HTML Smuggling Attack를 활용하여 7z/zip 아카이브가 포함된 HTML 파일을 생성할 수 있는 도구입니다. 이 도구는 바이너리(EXE/DLL)를 7z/zip 파일 형식으로 압축한 다음, 아카이브를 XOR 암호화하고 PNG/GIF 이미지 파일 형식(Image Polyglots) 내에 숨깁니다.

2024년 1월 15일 - 다중 파일 압축 지원이 추가되었습니다. 최종 페이로드에 대해 여러 파일이 생성된 경우(예: DLL-Sideloading 파일 또는 다단계 전달 파일), 이제 '-i' 옵션을 사용하여 디렉터리 경로를 지정할 수 있습니다. 디렉터리 경로가 제공되면 BobTheSmuggler는 해당 디렉터리의 모든 파일을 자동으로 아카이브하고, XOR 암호화한 후 PNG/GIF 내부에 임베드합니다.
이 도구를 사용하는 방법에 대한 자세한 내용은 제 블로그 게시물을 참조하세요: BobTheSmuggler: 탐지 불가능한 페이로드 전달을 위한 은밀한 사이버 스위스 나이프.
"Bob the Smuggler" 는 HTML 밀반입 공격(HTML Smuggling Attack)을 활용하며, 7z/zip 아카이브가 포함된 HTML 파일을 생성할 수 있게 해주는 도구입니다. 이 도구는 바이너리(EXE/DLL)를 7z/zip 파일 형식으로 압축한 다음, 아카이브를 XOR 암호화하고 PNG/GIF 이미지 파일 형식(이미지 폴리글롯) 내에 숨깁니다. HTML에 포함된 JavaScript는 PNG/GIF 파일을 다운로드하여 캐시에 저장합니다. 그런 다음 JavaScript는 PNG/GIF에 포함된 데이터를 추출하고, 조립하며, XOR 복호화를 수행한 후 메모리 내 blob으로 저장합니다.

현재 이 도구는 다음과 같은 페이로드 전달 체인을 지원합니다:
도구를 실행하기 전에 다음 사전 요구 사항이 필요합니다:
pip install python-magic py7zr pyminizip
참고: python-magic을 설치하려면 시스템에 libmagic 라이브러리를 설치해야 합니다. libmagic 라이브러리 설치를 위해 다음 URL을 참조하세요: https://pypi.org/project/python-magic/
필요한 라이브러리를 설치한 후, 다음 명령어를 사용하여 도구 설치를 진행할 수 있습니다:
git clone https://github.com/TheCyb3rAlpha/BobTheSmuggler.git
cd BobTheSmuggler
설치 후, 다음 명령어를 실행하여 도구를 사용할 수 있습니다:
python3 BobTheSmuggler.py -h

======================================================================
██████╗ ██████╗ ██████╗ ████████╗██╗ ██╗███████╗
██╔══██╗██╔═══██╗██╔══██╗ ╚══██╔══╝██║ ██║██╔════╝
██████╔╝██║ ██║██████╔╝ ██║ ███████║█████╗
██╔══██╗██║ ██║██╔══██╗ ██║ ██╔══██║██╔══╝
██████╔╝╚██████╔╝██████╔╝ ██║ ██║ ██║███████╗
╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝
███████╗███╗ ███╗██╗ ██╗ ██████╗ ██████╗ ██╗ ███████╗██████╗
██╔════╝████╗ ████║██║ ██║██╔════╝ ██╔════╝ ██║ ██╔════╝██╔══██╗
███████╗██╔████╔██║██║ ██║██║ ███╗██║ ███╗██║ █████╗ ██████╔╝
╚════██║██║╚██╔╝██║██║ ██║██║ ██║██║ ██║██║ ██╔══╝ ██╔══██╗
███████║██║ ╚═╝ ██║╚██████╔╝╚██████╔╝╚██████╔╝███████╗███████╗██║ ██║
╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝
======================================================================
usage: BobTheSmuggler.py [-h] -i EXE_FILE [-p PASSWORD] -f OUTPUT_HTML -o OUTPUT_FILENAME -t {html,svg,png,gif} [-c {7z,zip}] [-u PNG_URL] [-png PNG_FILE] [-gif GIF_FILE] [-e CUSTOM_FILE] [-v]
EXE/DLL 파일을 HTML/SVG 파일 내부에 숨깁니다.
optional arguments:
-h, --help 이 도움말 메시지를 표시하고 종료합니다.
-i EXE_FILE EXE/DLL 파일의 경로입니다.
-p PASSWORD 압축을 위한 암호입니다.
-f OUTPUT_HTML HTML 밀반입 파일(.html)
-o OUTPUT_FILENAME 다운로드된 파일 이름 (페이로드가 이 파일에 있습니다.)
-t {html,svg,png,gif} 임베드 템플릿 유형입니다.
-c {7z,zip} 압축 형식: 7z 또는 zip (기본값: zip)
-u PNG_URL 임베드된 PNG 이미지의 URL입니다.
-png PNG_FILE EXE/DLL 임베딩을 위한 PNG 파일의 경로입니다.
-gif GIF_FILE EXE/DLL 임베딩을 위한 GIF 파일의 경로입니다.
-e CUSTOM_FILE 템플릿으로 복제할 HTML 파일입니다.
-v, --verbose 상세 로깅을 활성화합니다.
SharpHound.exe를 7z 형식으로 압축(암호 보호)하고 HTML 파일에 저장하려면 다음 명령어를 사용할 수 있습니다:
python3 BobTheSmuggler.py -i path/to/SharpHound.exe -p 123456 -c 7z -f SharpHound.html -o SharpHound.7z -t html

PNG 파일 내부에 숨겨진 페이로드가 포함된 HTML 파일을 생성하려면 다음 명령어를 사용할 수 있습니다:
python3 BobTheSmuggler.py -i <입력_파일_경로> -p <암호화할_암호> -f <출력_HTML_파일명> -o <HTML 내부에 저장된 출력 7z/zip 파일명> -t png test.png

참고: PNG/GIF 파일을 CDN에 호스팅해야 합니다. (권장: PNG/GIF 파일을 호스팅할 CDN URL을 제공하려면 -u 옵션을 사용해야 합니다). 테스트 목적으로 Flask 앱(app.py)을 사용하면 banner.gif와 banner.png를 localhost:8000에 호스팅할 수 있습니다.
마찬가지로 다음 명령어를 사용하여 GIF 파일 내부에 숨겨진 페이로드가 포함된 HTML 파일을 생성할 수 있습니다:
python3 BobTheSmuggler.py -i <입력_파일_경로> -p <암호화할_암호> -f <출력_HTML_파일명> -o <HTML 내부에 저장된 출력 7z/zip 파일명> -t gif test.gif

최종 이미지(PNG/GIF)가 생성되면 임베드된 파일이 포함되므로 이미지 크기가 증가합니다.

다른 접근 방식을 사용한 간단한 체인입니다. EXE/DLL이 .7z/.zip 파일로 압축된 다음 PNG/GIF 파일 내에 저장됩니다. PNG/GIF는 HTML 내에 임베드된 SVG 파일 내의 JS에 의해 호출됩니다. JS가 호출되면 PNG/ZIP 파일을 다운로드하고, 이미지 청크에서 XOR 처리된 압축 데이터를 추출한 후, 파일을 복호화하고 다운로드 기능을 호출합니다.
python3 BobTheSmuggler.py -i <입력_파일_경로> -p <암호화할_암호> -f <출력_HTML_파일명> -o <HTML 내부에 저장된 출력 7z/zip 파일명> -t svg -e <사용자_정의_SVG_템플릿>
다음 템플릿이 이 프로젝트에 추가되었습니다:

이 도구는 교육 목적으로만 사용됩니다. 사용자는 학습과 이해를 촉진하는 방식으로만 사용하는 것이 좋습니다. 이 도구의 작성자는 교육 이외의 맥락에서 사용하는 것에 대한 모든 책임을 명시적으로 부인합니다. 교육 이외의 목적으로 이 도구를 사용하기로 선택한 사용자는 전적인 책임과 위험을 감수하며, 작성자는 그러한 사용으로 인해 발생하는 어떤 결과에 대해서도 책임을 지지 않습니다.