
DNS canarytokens용 간단한 바이너리 래퍼
_ _
_ _ ___| | | _____ __
| | | |/ _ \ | |/ _ \ \ /\ / /
| |_| | __/ | | (_) \ V V /
\__, |\___|_|_|\___/ \_/\_/
|___/
- Just add blue.
바이너리가 실행될 때 canarytoken을 트리거하는 간단한 바이너리 변조 도구입니다.
공격자에 대비해 프로덕션 시스템에 부비트랩을 설치하는 데 이상적입니다.
현재 네 가지 방법이 있습니다:
canarytokens에서 자신만의 DNS canary token을 등록하세요. 작동 방식에 대한 자세한 내용은 문서에서 확인할 수 있습니다.
다음과 같은 형식입니다: pz21qtyfsidipvrsuzs9n2udi.canarytokens.com
다음과 같이 TOKEN 환경 변수에 넣으세요:
export TOKEN="c28y9l4dw0drj62un0cm4rwz6.canarytokens.com"
Dockerfile들에는 작동하는 예제 토큰이 포함되어 있으며, 여기에서 활동 기록을 확인할 수 있습니다. 하지만 가급적 자신만의 토큰을 사용하는 것이 좋습니다.
이러한 각 빌드 방법을 구현한 Dockerfile이 제공됩니다.
적합한 기본 빌드 환경(예: 데비안 계열 시스템의 build-essential 또는 알파인 계열 시스템의 build-base)이 있다면 libyellow 또는 yellow를 매우 간단하게 컴파일할 수 있습니다. ldsoyellow는 좀 더 복잡합니다.
Dockerfile에서 yellow의 빌드 및 설치에 대한 간단한 엔드투엔드 예제를 확인할 수 있습니다.
gcc -o yellow yellow.c canary32.c
Dockerfile.yellow 참조
빌드가 필요 없습니다.
alert_list 배열에서 알림을 받으려는 바이너리 목록을 반드시 업데이트하세요.
gcc -shared -fPIC libyellow.c canary32.c -o libyellow.so
Alpine 및 Debian 버전은 Dockerfile.libyellow 또는 Dockerfile.libyellow.debian을 참조하세요.
작동하는 예제는 Dockerfile.ldsoyellow를 확인하세요. glibc 소스가 필요합니다(실제 링커에 최대한 가깝게 하려면 공식 패키지 버전을 사용하는 것을 권장합니다).
apt-get source libc6
rtld.c.patch 패치를 적용하세요.
cd /glibc-*
patch < rtld.c.patch
정합성 검사(sanity checks)를 비활성화하고 올바른 libdir을 가리키도록 glibc를 구성합니다(64비트 시스템 기준).
mkdir glibcbuild && cd glibcbuild
/glibc-*/configure --disable-sanity-checks --libdir=$(dirname $(find / -name "libc.so.6"|grep 64))
평소처럼 빌드합니다.
make
모든 변형은 canary token URL을 지정하기 위해 TOKEN 환경 변수를 사용합니다. 환경 변수 이름은 변경할 수 있으며, 원한다면 하드코딩할 수도 있습니다. 마찬가지로 각각에 대한 Dockerfile이 존재합니다.
yellow는 busybox가 사용되는 방식과 유사하게, 이름을 바꾸고 yellow에 대한 별칭(alias)으로 지정한 특정 바이너리에서 트리거되도록 설계되었습니다. 바이너리 이름을 ".canary" 확장자로 바꾼 다음, 원래 바이너리 이름으로 yellow의 심볼릭 링크(또는 복사본)를 만들어야 합니다. 예를 들어:
cp yellow /usr/bin
mv /usr/bin/id /usr/bin/id.canary
ln -s /usr/bin/yellow /usr/bin/id
이후 id를 실행할 때마다 canary token이 트리거됩니다.
Dockerfile.yellow 참조
민감한 프로세스 실행(sensitive process execution) 방식은 바이너리 대신 셸 스크립트로 트리거된다는 점을 제외하면 위와 동일한 기법을 사용하며, 설치 프로그램이 함께 제공됩니다. spe_install.sh를 실행할 때 DNS 토큰과 트리거하려는 바이너리 이름을 전달하세요. 해당 바이너리는 존재할 필요가 없습니다.
예를 들어:
./spe_install.sh "c28y9l4dw0drj62un0cm4rwz6.canarytokens.com" /bin/id
id가 실행될 때마다 알림이 생성됩니다.
여기에 설명된 Windows 토큰 방식의 복제본입니다.
libyellow는 LD_PRELOAD를 통해 주입된 상태에서 사용되는 모든 바이너리에서 트리거되도록 설계되었지만, 코드에서 지정한 바이너리에 대해서만 알림을 보냅니다. 이는 LD_PRELOAD 환경 변수를 이 라이브러리를 가리키도록 설정하여 세션별로 수행하거나, /etc/ld.so.preload 파일에 추가하여 시스템 전체에 적용할 수 있습니다. 후자의 경우 라이브러리가 해당 시스템에서 작동하지 않으면 시스템이 손상될 수 있으므로, 먼저 LD_PRELOAD를 사용하여 테스트할 것을 권장합니다.
위의 "사전 작업"에서 설명한 대로 TOKEN 환경 변수에 토큰을 넣는 것을 잊지 마세요.
LD_PRELOAD 예제:
cp libyellow.so /usr/lib/
export LD_PRELOAD=/usr/lib/libyellow.so
그런 다음 대상 바이너리를 실행하여 예상대로 동작하는지 확인하면 canary 알림을 받게 됩니다.
모든 것이 정상적으로 작동한다면, 다음을 사용하여 시스템 전체에 추가할 수 있습니다(이 방법은 알파인과 같은 musl 기반 시스템에서는 작동하지 않으며, 해당 시스템에서는 LD_PRELOAD 방식을 대신 사용합니다):
cp libyellow.so /usr/lib
echo /usr/lib/libyellow.so >> /etc/ld.so.preload
Alpine 및 Debian 버전은 Dockerfile.libyellow 또는 Dockerfile.libyellow.debian을 참조하세요.
ldsoyellow는 기본 링커 대신 이를 사용하도록 수정된 특정 바이너리에서 트리거되도록 설계되었습니다. 시스템 전체에 적용하기 위해 기본 링커를 이 링커로 교체할 수도 있지만, 그러면 알림이 너무 많을 것입니다.
Dockerfile.ldsoyellow 예제에는 /bin/cat에 대해 이를 수행하는 방법이 포함되어 있습니다. 먼저 무장(arm'ed)된 링커를 정품 링커 옆에 복사합니다:
cp <arm'd linker> /lib64/ld-linux-x86-64.so.3
그런 다음 바이너리가 정품 링커 대신 이를 사용하도록 수정됩니다:
sed -i "s/\/lib64\/ld-linux-x86-64.so.2/\/lib64\/ld-linux-x86-64.so.3/" /bin/cat
Dockerfile.ldsoyellow 참조.
예를 들어 빌드 지시문을 제한적으로만 제어할 수 있는 빌드 환경에서 Docker in Docker를 실행하고, 누군가 탈출하면 알림을 받고 싶다면 Dockerfile.dind-rootless의 예제와 같은 방법을 사용할 수 있습니다. 이 예제는 yellow를 사용하지만 다른 변형 중 하나 또는 전부를 사용할 수도 있습니다.
컨테이너에서 접근할 수 없어야 하는 호스트의 바이너리에 부비트랩을 설치합니다.