sandfly-entropyscan 是一个实用工具,用于快速扫描文件或正在运行的进程,并报告它们的熵(随机性度量)以及是否为 Linux/Unix ELF 类型可执行文件。一些 Linux 恶意软件被打包或加密,显示出非常高的熵。该工具可以快速找到高熵的可执行文件和进程,这些通常都是恶意的。
熵是随机性的度量。对于二进制数据,0.0 表示不随机,8.0 表示完全随机。好的加密看起来像随机白噪声,熵值接近 8.0。良好的压缩会去除冗余数据,使其看起来比未压缩时更随机,通常熵值在 7.7 及以上。
许多恶意软件可执行文件被打包以逃避检测并使逆向工程更困难。大多数标准的 Linux 二进制文件没有打包,因为它们并不试图隐藏自己。搜索高熵文件是一种很好的方法,可以仅凭高熵和可执行这两个属性来发现可能是恶意的程序。
sandfly-entropyscan 的使用方法:
-csv
以 CSV 格式输出结果(文件名、路径、熵、elf_file [true|false]、MD5、SHA1、SHA256、SHA512)
-delim
将 CSV 文件的默认分隔符 "," 更改为您选择的某个分隔符("|" 等)
-dir string
要分析的目录名
-file string
要分析的单个文件的完整路径
-proc
检查正在运行的进程(默认为仅检查 ELF)
-elf
仅检查 ELF 可执行文件
-entropy float
显示熵大于或等于此值的任何文件/进程(最小值 0.0 - 最大值 8.0,默认 0 以显示所有文件)
-version
显示版本并退出
搜索 /tmp 下任何可执行文件:
sandfly-entropyscan -dir /tmp -elf
搜索 /var/www 下高熵(7.7 及以上)可执行文件(通常已打包或加密):
sandfly-entropyscan -dir /var/www -elf -entropy 7.7
以 CSV 格式生成所有正在运行进程的熵和加密哈希值:
sandfly-entropyscan -proc -csv
搜索熵值高于 7.7 的任何进程,表明可能已打包或加密:
sandfly-entropyscan -proc -entropy 7.7
生成 /bin 下所有文件的熵和加密哈希值,并以 CSV 格式输出(例如保存和比较哈希值):
sandfly-entropyscan -dir /bin -csv
扫描目录中熵值大于 7.7 的所有文件(无论是否为 ELF): (可能会有大量文件,如压缩文件、png、jpg、对象文件等)
sandfly-entropyscan -dir /path/to/dir -entropy 7.7
快速检查一个文件,生成熵、加密哈希值并显示是否为可执行文件:
sandfly-entropyscan -file /dev/shm/suspicious_file
对您怀疑存在恶意软件问题的系统进行抽查。或者,您可以自动化扫描,以便在发现某处出现高熵内容时获得输出。或者仅仅标记任何位于异常位置的可执行 ELF 类型文件(例如,在 /tmp 或用户 HTML 目录下)。例如:
系统 /var/www 目录下是否出现了高熵二进制文件?可能是有人在您的网站上放置了恶意软件投放器:
sandfly-entropyscan -dir /var/www -elf -entropy 7.7
设置一个 cron 任务,扫描您的 /tmp、/var/tmp 和 /dev/shm 目录,寻找任何类型的可执行文件,无论其熵值高低。tmp 目录下的可执行文件经常是恶意软件投放器。
sandfly-entropyscan -dir /tmp -elf
sandfly-entropyscan -dir /var/tmp -elf
sandfly-entropyscan -dir /dev/shm -elf
设置另一个 cron 或自动化安全扫描,抽查系统中是否存在正在运行的高压缩或加密二进制文件:
sandfly-entropyscan -proc -entropy 7.7
git clone https://github.com/sandflysecurity/sandfly-entropyscan.git
go build
./sandfly-entropyscan
有一些基本构建脚本,用于构建各种平台。您可以使用这些脚本进行构建或按需修改。对于事件响应者,在调查机器上保留预编译的二进制文件可能会很有用。
build.sh - 根据执行时您正在运行的操作系统进行构建。
我们使用一种简单的方法来判断文件是否可能是可执行的 ELF 类型。我们可以识别多种平台的 ELF 格式文件。即使恶意软件包含 Intel/AMD、MIPS 和 Arm 平台的投放器二进制文件,我们仍然能够识别它们。
有可能将合法的二进制文件标记为高熵,这可能是因为其编译方式,或者是因为出于合法原因被打包。其他文件如 .zip、.gz、.png、.jpg 等也具有非常高的熵,因为它们采用了压缩格式。压缩去除了文件中的冗余,使其看起来更随机,熵值更高。
在 Linux 上,如果您扫描库目录,可能会发现某些类型的库(.so 文件)被标记。
然而,根据我们的经验,具有高熵的可执行二进制文件通常是恶意的。如果您在通常不应出现可执行文件的区域(例如 tmp 或 html 目录)发现它们,情况尤其如此。
熵计算需要读取文件的所有字节并累计以得到最终数字。这会消耗大量 CPU 和磁盘 I/O,尤其是在非常大的文件系统或非常大的文件上。该程序有一个内部限制:它不会计算任何超过 2GB 的文件的熵,也不会尝试计算任何非常规文件类型的熵(例如,不会尝试计算像 /dev/zero 这样的设备的熵)。
然后我们计算 MD5、SHA1、SHA256 和 SHA512 哈希。每个哈希也需要遍历文件。在现代系统上速度尚可,但如果您正在遍历非常大的文件系统,则可能需要一些时间才能完成。
如果您告诉程序只查看 ELF 文件,则除非文件是 ELF 类型,否则不会进行熵/哈希计算,这将节省大量时间(例如,它将忽略非可执行的大型数据库文件)。
如果您想自动化此程序,最好不要让它遍历整个根文件系统,除非您特别需要。有针对性的方法更快,更适合抽查。此外,使用 ELF 标志可以大幅减少搜索时间,因为只处理可执行文件类型。
对于事件响应者来说,对整个顶级 "/" 目录运行 sandfly-entropyscan 可能是一个好主意,可以快速获取可能打包的候选文件列表以进行调查。这将导致 CPU 和磁盘 I/O 飙升。然而,到了那个时候您可能并不在意,因为管理员注意到时,这台机器已经挖了 598 小时的加密货币。
同样,使用 ELF 标志来定位可能的问题候选可执行文件,忽略无关信息。
有一个名为 scripts/testfiles.sh 的脚本,它将创建两个文件。一个充满随机数据,另一个完全不随机。运行该脚本时,它会创建文件并以可执行检测模式运行 sandfly-entropyscan。您应该看到两个文件。一个具有非常高的熵(接近 8.0),另一个充满非随机数据,熵值应为 0.00。示例:
./testfiles.sh
Creating high entropy random executable-like file in current directory.
Creating low entropy executable-like file in current directory.
high.entropy.test, entropy: 8.00, elf: true
low.entropy.test, entropy: 0.00, elf: true
您也可以加载 upx 工具,压缩一个可执行文件,然后查看它返回的值。
Sandfly Security 为 Linux 生产无代理端点检测和事件响应平台 (EDR)。自动熵检查只是我们在不加载任何软件到 Linux 端点的情况下搜索入侵者的数千种方法之一。
获取免费许可证并了解更多信息:
https://www.sandflysecurity.com @SandflySecurity