
Простая бинарная обёртка для DNS canarytokens.
_ _
_ _ | | | _____ __
| | | |/ _ \ | |/ _ \ \ /\ / /
| || | / | | () \ V V /
_, |_|||_/ _/_/
|___/
Простые модификации бинарных файлов, которые запускают canarytoken при выполнении бинарного файла.
Идеально для установки ловушек в production-системах против злоумышленников.
В настоящее время существует четыре метода:
Зарегистрируйте собственный DNS canarytoken на сайте canarytokens. Подробнее о том, как они работают, можно прочитать в документации.
Он будет выглядеть примерно так: pz21qtyfsidipvrsuzs9n2udi.canarytokens.com
Поместите его в переменную окружения TOKEN:
export TOKEN="c28y9l4dw0drj62un0cm4rwz6.canarytokens.com"
В Dockerfile-файлах есть пример рабочего токена; вы можете проверить историю его активности здесь. Но всё же лучше использовать собственный.
Доступны Dockerfile, реализующие каждый из этих методов сборки.
Если у вас есть подходящая стандартная среда сборки (например, build-essential в системах на основе Debian или build-base в системах на основе Alpine), вы можете очень просто скомпилировать libyellow или yellow. ldsoyellow более сложен.
Простой сквозной пример сборки и установки yellow можно увидеть в Dockerfiles.
gcc -o yellow yellow.c canary32.c
См. Dockerfile.yellow
Сборка не требуется.
Обязательно обновите список бинарных файлов, о которых вы хотите получать оповещения, в массиве alert_list.
gcc -shared -fPIC libyellow.c canary32.c -o libyellow.so
См. Dockerfile.libyellow или Dockerfile.libyellow.debian для версий Alpine и Debian.
Рабочий пример см. в Dockerfile.ldsoyellow. Вам понадобятся исходники glibc (рекомендую использовать официальную версию пакета, чтобы быть как можно ближе к настоящему линкеру).
apt-get source libc6
Примените патч rtld.c.patch
cd /glibc-*
patch < rtld.c.patch
Настройте glibc с отключёнными проверками корректности и указанием правильного libdir (для 64-битной системы)
mkdir glibcbuild && cd glibcbuild
/glibc-*/configure --disable-sanity-checks --libdir=$(dirname $(find / -name "libc.so.6"|grep 64))
Соберите как обычно
make
Все варианты используют переменную окружения TOKEN для указания URL canarytoken. Имя переменной окружения можно изменить или даже захардкодить, если хотите. Для каждого из них также есть Dockerfile.
yellow предназначен для срабатывания на конкретных бинарных файлах, которые вы переименовываете и связываете с ним через алиас, подобно тому, как используется busybox. Вам нужно переименовать бинарный файл, добавив расширение «.canary», а затем создать симлинк (или копию) yellow под исходным именем бинарного файла. Например:
cp yellow /usr/bin
mv /usr/bin/id /usr/bin/id.canary
ln -s /usr/bin/yellow /usr/bin/id
После этого любой запуск id приведёт к срабатыванию вашего canarytoken.
См. Dockerfile.yellow
Метод sensitive process execution использует ту же технику, что и выше, но срабатывает с помощью shell-скрипта, а не бинарного файла, и поставляется с установщиком. Запустите 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, таких как Alpine, где вместо этого используется метод LD_PRELOAD):
cp libyellow.so /usr/lib
echo /usr/lib/libyellow.so >> /etc/ld.so.preload
См. Dockerfile.libyellow или Dockerfile.libyellow.debian для версий Alpine и Debian.
ldsoyellow предназначен для срабатывания на конкретных бинарных файлах, которые изменены так, чтобы использовать его вместо стандартного линкера. Можно заменить стандартный линкер на него для эффекта на всю систему, но это, скорее всего, будет слишком шумно.
Пример Dockerfile.ldsoyellow включает это для /bin/cat. Сначала заряженный линкер копируется рядом с легитимным:
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 внутри Docker, например, в сборочном окружении, где у вас ограничен контроль над директивами сборки, и получать оповещения, если кто-то выберется наружу, вы можете сделать что-то вроде примера из Dockerfile.dind-rootless. В этом примере используется yellow, но можно использовать любой или все остальные варианты.
Он устанавливает ловушки на бинарные файлы хоста, которые не должны быть доступны из контейнера.