
Ein einfacher Binary-Wrapper für DNS-Canarytokens.
_ _
_ _ ___| | | _____ __
| | | |/ _ \ | |/ _ \ \ /\ / /
| |_| | __/ | | (_) \ V V /
\__, |\___|_|_|\___/ \_/\_/
|___/
- Just add blue.
Einfache Binärmodifikationen, die einen Canary-Token auslösen, wenn eine Binärdatei ausgeführt wird.
Ideal zum Präparieren von Produktionssystemen gegen Angreifer.
Derzeit gibt es vier Methoden:
Registrieren Sie unter canarytokens einen eigenen DNS-Canary-Token. Weitere Informationen zur Funktionsweise finden Sie in der Dokumentation.
Er sieht ungefähr so aus: pz21qtyfsidipvrsuzs9n2udi.canarytokens.com
Setzen Sie ihn in die Umgebungsvariable TOKEN mit:
export TOKEN="c28y9l4dw0drj62un0cm4rwz6.canarytokens.com"
Die Dockerfiles enthalten ein funktionierendes Beispiel-Token. Sie können seinen Aktivitätsverlauf hier einsehen. Sie sollten aber wirklich Ihren eigenen verwenden.
Für jede dieser Build-Methoden sind Dockerfiles verfügbar.
Wenn Sie eine geeignete Standard-Build-Umgebung haben (z. B. build-essential auf Debian-basierten Systemen oder build-base auf Alpine-basierten Systemen), können Sie libyellow oder yellow sehr einfach kompilieren. ldsoyellow ist aufwendiger.
Ein einfaches End-to-End-Beispiel für das Erstellen und Installieren von yellow finden Sie in den Dockerfiles.
gcc -o yellow yellow.c canary32.c
Siehe Dockerfile.yellow
Keine Kompilierung erforderlich.
Achten Sie darauf, die Liste der Binärdateien, für die Sie Benachrichtigungen erhalten möchten, im Array alert_list zu aktualisieren.
gcc -shared -fPIC libyellow.c canary32.c -o libyellow.so
Siehe Dockerfile.libyellow oder Dockerfile.libyellow.debian für Alpine- und Debian-Versionen.
Schauen Sie sich das Dockerfile.ldsoyellow für ein funktionierendes Beispiel an. Sie benötigen die glibc-Quellen (ich empfehle, die offizielle Paketversion zu verwenden, um so nah wie möglich am echten Linker zu sein).
apt-get source libc6
Wenden Sie den Patch rtld.c.patch an.
cd /glibc-*
patch < rtld.c.patch
Konfigurieren Sie glibc mit deaktivierten Sanity-Checks und Verweis auf das richtige libdir (unter der Annahme eines 64-Bit-Systems).
mkdir glibcbuild && cd glibcbuild
/glibc-*/configure --disable-sanity-checks --libdir=$(dirname $(find / -name "libc.so.6"|grep 64))
Wie gewohnt bauen
make
Alle Varianten verwenden die Umgebungsvariable TOKEN, um die Canary-Token-URL anzugeben. Der Name der Umgebungsvariable kann geändert oder bei Bedarf sogar fest verdrahtet werden. Auch hierfür existieren Dockerfiles für jede dieser Varianten.
yellow ist dafür gedacht, auf bestimmte Binärdateien zu reagieren, die Sie umbenennen und darauf aliasen, ähnlich wie busybox verwendet wird. Sie müssen die Binärdatei so umbenennen, dass sie die Erweiterung „.canary“ verwendet, und dann einen Symlink (oder eine Kopie) von yellow unter dem ursprünglichen Binärnamen erstellen. Zum Beispiel:
cp yellow /usr/bin
mv /usr/bin/id /usr/bin/id.canary
ln -s /usr/bin/yellow /usr/bin/id
Danach löst jede Ausführung von id Ihren Canary-Token aus.
Siehe Dockerfile.yellow
Die Methode zur Ausführung sensibler Prozesse (Sensitive Process Execution) verwendet dieselbe Technik wie oben, löst jedoch mit einem Shell-Skript statt einer Binärdatei aus und wird mit einem Installationsprogramm geliefert. Führen Sie spe_install.sh aus und übergeben Sie Ihr DNS-Token sowie den Namen der Binärdatei, bei der Sie den Token auslösen möchten. Die Binärdatei muss nicht existieren.
Zum Beispiel:
./spe_install.sh "c28y9l4dw0drj62un0cm4rwz6.canarytokens.com" /bin/id
Dadurch wird bei jeder Ausführung von id ein Alarm erstellt.
Dies ist eine Kopie der Windows-Token-Methode, die hier beschrieben wird.
libyellow ist dafür gedacht, auf jede Binärdatei zu reagieren, in die es über LD_PRELOAD injiziert wurde, aber nur die von Ihnen im Code angegebenen zu melden. Dies kann pro Sitzung erfolgen, indem die Umgebungsvariable LD_PRELOAD darauf zeigt, oder systemweit, indem es in die Datei /etc/ld.so.preload eingetragen wird. Letzteres kann Ihr System beschädigen, wenn die Bibliothek dort nicht funktioniert. Daher wird empfohlen, sie zuerst mit LD_PRELOAD zu testen.
Denken Sie daran, Ihren Token wie oben unter „Vorbereitung“ beschrieben in die Umgebungsvariable TOKEN zu setzen.
LD_PRELOAD-Beispiel:
cp libyellow.so /usr/lib/
export LD_PRELOAD=/usr/lib/libyellow.so
Führen Sie dann eine Zielbinärdatei aus, prüfen Sie, ob sie sich wie erwartet verhält, und Sie erhalten einen Canary-Alarm.
Sobald Sie zufrieden sind, dass alles funktioniert, können Sie es systemweit hinzufügen mit (dies funktioniert nicht auf musl-basierten Systemen wie Alpine, wo stattdessen die LD_PRELOAD-Methode verwendet wird):
cp libyellow.so /usr/lib
echo /usr/lib/libyellow.so >> /etc/ld.so.preload
Siehe Dockerfile.libyellow oder Dockerfile.libyellow.debian für Alpine- und Debian-Versionen.
ldsoyellow ist dafür gedacht, auf bestimmte Binärdateien zu reagieren, bei denen die Binärdatei so modifiziert wurde, dass sie es anstelle des Standard-Linkers verwendet. Sie könnten den Standard-Linker für eine systemweite Wirkung durch es ersetzen, aber das würde wahrscheinlich zu viele Meldungen erzeugen.
Das Beispiel in Dockerfile.ldsoyellow führt dies für /bin/cat durch. Zuerst wird der präparierte Linker neben den legitimen Linker kopiert:
cp <arm'd linker> /lib64/ld-linux-x86-64.so.3
Dann wird die Binärdatei so geändert, dass sie anstelle des legitimen Linkers diesen verwendet:
sed -i "s/\/lib64\/ld-linux-x86-64.so.2/\/lib64\/ld-linux-x86-64.so.3/" /bin/cat
Siehe Dockerfile.ldsoyellow.
Wenn Sie Docker in Docker ausführen möchten, zum Beispiel in einer Build-Umgebung, in der Sie nur begrenzte Kontrolle über die Build-Anweisungen haben, und benachrichtigt werden möchten, falls jemand ausbricht, könnten Sie etwas Ähnliches wie das Beispiel in Dockerfile.dind-rootless tun. Dieses Beispiel verwendet yellow, könnte aber jede oder alle anderen Varianten verwenden.
Es präpariert Binärdateien auf dem Host, die aus einem Container nicht zugänglich sein sollten.