先确认系统glibc版本(如执行ldd --version),再根据版本下载匹配的河马二进制包,例如glibc 2.17选“for CentOS 7”版,避免GLIBC_2.28 not found报错。

确认系统架构和glibc版本再下载对应二进制
河马是静态编译的Go程序,但依然依赖系统glibc。在CentOS 7(glibc 2.17)或Ubuntu 18.04(glibc 2.27)上直接运行新版hm-linux-amd64.tgz可能报错GLIBC_2.28 not found。先执行ldd --version确认你的glibc主版本,再从shellpub.com下载匹配的包——比如glibc 2.17就选标注“for CentOS 7”的版本,别盲目用latest。
下载命令示例(注意URL中带?version=参数):
wget -O /opt/hm.tgz "http://dl.shellpub.com/hm/latest/hm-linux-amd64.tgz?version=1.7.0"
- 不要用
curl -L重定向下载,部分镜像会返回HTML而非tgz文件 - 解压路径建议固定为
/opt/hm,避免空格或中文路径导致./hm执行失败 - 解压后立即执行
file ./hm确认是ELF可执行文件,不是文本或损坏包
扫描前必须避开web目录运行
这是最容易被忽略的安全红线:./hm scan会在当前工作目录生成result.csv和临时缓存。如果cd进/var/www/html再执行,攻击者可通过http://yoursite.com/result.csv直接下载全部扫描结果——等于把后门列表主动交出去。
正确操作顺序:
- cd到非web可访问路径,例如
/root/hm-scan或/tmp/hm - 确保该目录有写权限:
chmod 755 . - 执行扫描时显式指定目标目录:
./hm scan /var/www/html,而非./hm scan . - 若需排除日志或上传目录,用
--exclude:./hm scan /var/www/html --exclude "/var/www/html/uploads,/var/www/html/logs"
普通扫描 vs deepscan:PHP混淆后门必须开深度解码
默认scan只做基础特征匹配(如eval(、base64_decode(),对常见混淆手法无效。真正的PHP一句话木马往往嵌套多层,例如:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
<?php $a = 'YXNzZXJ0'; $b = 'c3lzdGVt'; assert(base64_decode($a).base64_decode($b)); ?>
这种代码不会触发默认扫描。必须用deepscan:
-
./hm deepscan /var/www/html会启用语法树解析和动态解码,识别变量拼接、字符串拆分等绕过手法 - 代价是速度下降5–8倍,单核CPU下约80–120文件/秒,建议配合
--threads 2提升并发 - 如果扫描卡在某个PHP文件不动,大概率是该文件存在无限递归或超长字符串,加
--max-file-size 5M跳过超大文件
结果分析时重点看CSV里的Score和Reason字段
生成的result.csv不是简单黑白名单。关键列是:
-
Score:0–100分,70分以上基本可确认为Webshell,30–69分需人工复核 -
Reason:明确写出触发点,例如high entropy + gzinflate + eval或obfuscated function name -
Path:注意路径是否真实存在于web目录,有些结果可能是临时文件或备份文件(如index.php.bak)
别直接删所有高分文件——某些CMS插件(如WordPress的wp-content/plugins/wp-statistics/includes/class-wp-statistics-geoip.php)也会因使用gzinflate被误报。先用head -20看文件头,确认是否含且无合法业务逻辑。
真正危险的是那些Score≥85且Reason含dynamic code execution的PHP文件,它们通常没有注释、无缩进、函数名随机(如function a1b2c3() { ... }),这类必须隔离并溯源修改时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










