_ _
_ _ ___| | | _____ __
| | | |/ _ \ | |/ _ \ \ /\ / /
| |_| | __/ | | (_) \ V V /
\__, |\___|_|_|\___/ \_/\_/
|___/
- Just add blue.
简单的二进制修改,当二进制文件被执行时会触发一个 canarytoken。
非常适合为生产系统布设陷阱,以防范攻击者。
目前有四种方法:
在 canarytokens 注册一个属于你自己的 DNS canary token。你可以在 文档 中阅读更多关于它们工作原理的内容。
它看起来会像这样:pz21qtyfsidipvrsuzs9n2udi.canarytokens.com
使用以下命令将它放入环境变量 TOKEN 中:
export TOKEN="c28y9l4dw0drj62un0cm4rwz6.canarytokens.com"
这些 Dockerfile 中包含了一个可用的示例 token,你可以在此处查看其活动历史。不过你真的应该使用自己的 token。
提供了实现这些构建方法中每一种的 Dockerfile。
如果你有一个合适的默认构建环境(例如基于 Debian 的系统上的 build-essential,或基于 Alpine 的系统上的 build-base),你可以非常简单地对 libyellow 或 yellow 进行编译。ldsoyellow 则复杂一些。
你可以在 Dockerfiles 中看到构建和安装 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
配置 glibc,禁用健全性检查,并指向正确的 libdir(假设是 64 位系统)
mkdir glibcbuild && cd glibcbuild
/glibc-*/configure --disable-sanity-checks --libdir=$(dirname $(find / -name "libc.so.6"|grep 64))
像平时一样构建
make
所有变体都使用 TOKEN 环境变量来指定 canary token URL。环境变量名称可以更改,如果你愿意,甚至可以硬编码。同样,每个变体都有对应的 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 的执行都会触发你的 canary token。
参见 Dockerfile.yellow
敏感进程执行方法使用与上述相同的技术,只不过它通过 shell 脚本而非二进制文件触发,并且附带一个安装程序。运行 spe_install.sh,将你的 DNS token 和你想要触发警报的二进制文件名称传给它。该二进制文件不一定需要存在。
例如:
./spe_install.sh "c28y9l4dw0drj62un0cm4rwz6.canarytokens.com" /bin/id
任何时候运行 id 都会创建一个警报。
这是此处描述的 Windows token 方法的一个副本。
libyellow 旨在对通过 LD_PRELOAD 注入的任何二进制文件触发,但只对你在代码中指定的二进制文件发出警报。可以通过设置 LD_PRELOAD 环境变量指向它来按会话生效,或者通过将其添加到 /etc/ld.so.preload 文件来全系统生效。如果库在该系统上无法正常工作,后者可能会破坏你的系统,因此建议你先使用 LD_PRELOAD 进行测试。
请记住,如上文“准备工作”所述,将你的 token 放入 TOKEN 环境变量中。
LD_PRELOAD 示例:
cp libyellow.so /usr/lib/
export LD_PRELOAD=/usr/lib/libyellow.so
然后运行一个目标二进制文件,检查其行为是否符合预期,你就会收到 canary 警报。
一旦你确认一切正常,你可以通过以下方式将其添加到全系统(这不适用于像 Alpine 这样基于 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 执行此操作。首先,将改装过的链接器复制到原始链接器旁边:
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,但也可以使用任何其他变体或全部变体。
它会对主机上那些不应该从容器中访问的二进制文件设置陷阱。