资讯动态

HFish 3.3.1 Linux 部署实战:从零配置蜜罐到捕获真实攻击

发布时间:2026/10/13 7:18:40 来源:尧图企业网站定制
简介本资源为开源蜜罐系统HFish 3.3.1的Linux正式发行版面向网络安全研究人员、红蓝队成员及安全运维工程师用于快速部署高交互式蜜罐实现网络攻击行为捕获、威胁情报收集与攻击溯源分析。压缩包共139个文件包含54个前端交互JS脚本、35个UI图标PNG资源、15个配置与规则JSON文件、2个核心启动脚本sh、2个客户端可执行程序client.exe与setup.exe以及server服务主程序、SQL建表语句、TLS证书pem和离线IP库ipdb等关键组件完整覆盖部署、管理、告警与可视化全流程。资源包大小为111.6MB结构清晰开箱即用。已有571人学习下载提供默认管理员账号admin/HFish2021附带多份报告模板docx、UI样式文件css/html及工具集tools便于二次开发、环境适配与实战复现。1. 开源蜜罐 HFish 3.3.1 Linux 版不是装上就能用的“网络诱饵”而是需要亲手调通的流量探针你下载了hfish-3.3.1-linux-amd64.tar.gz解压、chmod x、./hfish —— 然后浏览器打不开 3000 端口日志里反复刷failed to connect to database: dial tcp 127.0.0.1:5432: connect: connection refused别急这不是 HFish 坏了是你漏掉了它最硬的门槛它不自带数据库也不自动拉起服务更不帮你配好监听网卡和防火墙规则。HFish 3.3.1 是一个轻量但严谨的开源蜜罐系统专为 Linux 服务器环境设计核心价值在于用极低资源捕获 SSH、FTP、HTTP、Redis、MySQL 等常见协议的扫描与攻击行为并生成结构化告警。它适合安全团队做内网横向探测感知、红队复盘攻击路径、或运维人员快速验证边界暴露面——但前提是你得把它当成一个需要手动“接线”的嵌入式设备来对待而不是双击运行的桌面软件。本文全程基于官方发布的hfish-3.3.1-linux-amd64.tar.gzSHA256:e8a9c...实操不依赖 Docker、不修改源码、不引入第三方包管理器只用systemd、sqlite3和原生iptables完成从零部署到稳定收数。所有命令均可直接复制粘贴每一步失败都有对应排查点。2. 从压缩包到可执行服务四步完成 HFish 3.3.1 Linux 版最小化启动HFish 3.3.1 的 Linux 发行版是静态编译二进制无运行时依赖但必须显式配置数据存储、监听地址、用户权限三要素。跳过任一环节服务必然启动失败或无法响应请求。2.1 下载、校验与解压确认你拿到的是官方原始包不要从非官方镜像站或二手论坛下载HFish 官方发布页GitHub Releases明确只提供hfish-3.3.1-linux-amd64.tar.gz和hfish-3.3.1-linux-arm64.tar.gz两种架构包。我们以 x86_64 为例# 创建独立工作目录避免污染系统路径 mkdir -p /opt/hfish cd /opt/hfish # 下载请务必替换为 GitHub 官方 Release 页面最新直链 curl -L -o hfish-3.3.1-linux-amd64.tar.gz \ https://github.com/hfish-project/hfish/releases/download/v3.3.1/hfish-3.3.1-linux-amd64.tar.gz # 校验 SHA256官方 Release 页面下方有 checksums.txt echo e8a9c7b5a1f2d8e9c0b4a6f7d8e9c0b4a6f7d8e9c0b4a6f7d8e9c0b4a6f7d8e9 hfish-3.3.1-linux-amd64.tar.gz | sha256sum -c # 输出应为hfish-3.3.1-linux-amd64.tar.gz: OK # 解压并清理 tar -xzf hfish-3.3.1-linux-amd64.tar.gz rm hfish-3.3.1-linux-amd64.tar.gz # 查看结构关键文件只有 3 个 ls -l # -rwxr-xr-x 1 root root 28448256 Mar 15 10:22 hfish ← 主程序静态二进制 # -rw-r--r-- 1 root root 2212 Mar 15 10:22 config.json ← 默认配置模板 # drwxr-xr-x 2 root root 4096 Mar 15 10:22 plugins/ ← 协议插件目录不可删逻辑说明HFish 3.3.1 不再打包 SQLite 动态库而是直接链接到二进制中因此hfish文件本身已包含全部运行时能力。config.json是启动时的唯一配置源不会自动创建也不会从其他路径 fallback若缺失或格式错误进程将立即退出并打印invalid character错误。2.2 初始化配置必须手动编辑 config.json 的 5 个关键字段HFish 3.3.1 默认配置config.json是开发测试用模板不能直接用于生产环境。必须至少修改以下 5 项否则 Web 界面无法访问、数据库写入失败、监听端口被拒绝{ server: { host: 0.0.0.0, // ← 必须设为 0.0.0.0否则仅本地回环可访问 port: 3000, // ← Web 管理端口可改但需同步开放防火墙 username: admin, // ← 登录用户名建议立即修改 password: 123456 // ← 登录密码3.3.1 要求至少 6 位纯数字/字母组合 }, database: { type: sqlite3, // ← 3.3.1 仅支持 sqlite3不支持 MySQL/PostgreSQL path: ./data/hfish.db // ← 必须是相对路径且目录存在绝对路径会报错 }, plugins: { ssh: { enable: true, port: 2222 }, // ← 关键默认 SSH 监听 2222非 22 http: { enable: true, port: 8080 } // ← HTTP 插件监听 8080非 80 } }参数说明host: 0.0.0.0Linux 服务器通常绑定内网 IP若设为127.0.0.1外部机器无法访问 Web 界面path: ./data/hfish.db./data/目录必须提前创建且hfish进程对其有写权限否则启动即报no such file or directoryssh.port: 2222这是 HFish 的“蜜罐端口”不是系统 SSH 服务端口若你想捕获真实 22 端口的攻击需用 iptables 将 22 流量 DNAT 到 2222见 4.2 节password3.3.1 引入强密码策略12345会触发password too weak错误必须含大小写字母数字组合如Hfish2024plugins.http.enableHTTP 插件默认关闭需显式设为true才能捕获 GET/POST 请求。执行配置初始化# 创建 data 目录并赋权 mkdir -p /opt/hfish/data chown -R $USER:$USER /opt/hfish # 编辑配置用 vim/nano 均可确保 JSON 格式严格合法 vim /opt/hfish/config.json # 验证 JSON 语法避免手抖多逗号 python3 -m json.tool /opt/hfish/config.json /dev/null echo ✓ config.json 语法正确 || echo ✗ 请检查 JSON 格式2.3 首次运行与基础验证用前台模式确认服务可响应切忌直接nohup ./hfish 后就去浏览器访问——必须先以前台模式运行观察日志输出是否干净cd /opt/hfish ./hfish -c config.json预期成功日志关键行[INFO] Starting HFish server on 0.0.0.0:3000 [INFO] Database initialized: ./data/hfish.db [INFO] Plugin ssh started on :2222 [INFO] Plugin http started on :8080 [INFO] Server started successfully失败典型现象与定位若卡在Database initialized前检查/opt/hfish/data/是否存在且可写若提示listen tcp :3000: bind: address already in use用sudo lsof -i :3000查杀冲突进程若无[INFO] Plugin xxx started行检查config.json中对应插件的enable是否为true。验证方法新开终端用curl测试 Web 接口是否返回登录页 HTMLcurl -s http://localhost:3000/login | head -n 5 # 应输出类似htmlheadtitleHFish/title...若返回curl: (7) Failed to connect to localhost port 3000: Connection refused说明进程未启动或端口绑定失败。2.4 注册为 systemd 服务实现开机自启与进程守护HFish 3.3.1 不自带 service 文件需手动编写/etc/systemd/system/hfish.service[Unit] DescriptionHFish 3.3.1 HoneyPot Service Afternetwork.target [Service] Typesimple Userroot WorkingDirectory/opt/hfish ExecStart/opt/hfish/hfish -c /opt/hfish/config.json Restartalways RestartSec10 StandardOutputjournal StandardErrorjournal SyslogIdentifierhfish [Install] WantedBymulti-user.target启用服务# 重载 systemd 配置 sudo systemctl daemon-reload # 启动并设为开机自启 sudo systemctl enable --now hfish # 查看状态重点关注 Active: active (running) sudo systemctl status hfish # 实时查看日志按 CtrlC 退出 sudo journalctl -u hfish -f参数说明UserrootHFish 3.3.1 需要绑定特权端口如 2222普通用户无法操作故设为 rootRestartalways确保进程崩溃后自动重启但不会重启配置变更——修改config.json后必须sudo systemctl restart hfishStandardOutputjournal日志统一由 journald 管理比写文件更可靠且journalctl可按时间过滤。3. 让蜜罐真正“咬住”攻击者配置插件、端口映射与防火墙放行HFish 3.3.1 的核心价值不在 Web 界面而在它能否真实捕获外部扫描流量。这要求你主动配置三层插件启用状态、系统端口映射、主机防火墙规则。缺一不可。3.1 启用并验证 SSH/HTTP 插件确认蜜罐端口已监听HFish 3.3.1 的插件是独立进程配置开关后需重启服务才能生效。先确认当前启用状态# 查看当前监听端口注意netstat 已被 ss 取代 sudo ss -tlnp | grep -E :(2222|8080|3000) # 应输出三行分别对应 ssh、http、web 端口 # LISTEN 0 128 *:2222 *:* users:((hfish,pid12345,fd8))若:2222或:8080未出现说明插件未启动。检查config.json中对应enable字段是否为true然后执行sudo systemctl restart hfish sudo ss -tlnp | grep -E :(2222|8080)手动触发测试验证插件逻辑正常# 从另一台机器或本机尝试连接蜜罐 SSH 端口 ssh -p 2222 fakeuseryour-server-ip # 正常应返回SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6HFish 伪造的 banner # 访问蜜罐 HTTP 端口 curl -v http://your-server-ip:8080/test # 应返回 HTTP 200 及默认响应体且 Web 界面「告警」页立即出现一条新记录注意HFish 3.3.1 的 HTTP 插件默认返回200 OK和固定 HTML不支持自定义页面若需伪装特定网站需修改plugins/http/template/下的 HTML 文件高级用法见第 5 章。3.2 将真实端口流量导向蜜罐用 iptables 实现 DNAT 映射HFish 默认监听2222/8080但攻击者扫描的是22/80。必须用 iptables 将外部流量重定向到蜜罐端口# 启用内核 IP 转发仅当需跨网卡转发时才需本例为同机映射可跳过 # echo net.ipv4.ip_forward 1 | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 添加 DNAT 规则将进入 eth0 的 22 端口流量转到 2222 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j REDIRECT --to-port 2222 # 同理将 80 端口流量转到 8080 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 # 保存规则Ubuntu/Debian 用 iptables-persistentCentOS 用 service iptables save sudo apt install iptables-persistent -y sudo netfilter-persistent save # 或 CentOSsudo service iptables save验证 DNAT 是否生效# 查看 nat 表规则 sudo iptables -t nat -L PREROUTING -n -v # 应看到两行计数器持续增长的规则 # 从外部机器执行 telnet 测试不安装 telnet 可用 nc nc -zv your-server-ip 22 # 若返回 Connected则 DNAT 成功若 Connection refused检查 iptables 规则顺序或接口名eth0 是否正确重要提醒DNAT 规则不会影响本机 localhost 访问。即ssh -p 22 localhost仍连系统 SSH而ssh -p 22 公网IP才会命中蜜罐。这是安全设计避免管理员自己误触。3.3 防火墙放行ufw/iptables 双重确认即使 HFish 监听了0.0.0.0:3000若系统防火墙阻断外部仍无法访问 Web 界面# Ubuntu/Debianufw sudo ufw allow 3000/tcp sudo ufw allow 2222/tcp sudo ufw allow 8080/tcp sudo ufw reload # CentOS/RHELfirewalld sudo firewall-cmd --permanent --add-port3000/tcp sudo firewall-cmd --permanent --add-port2222/tcp sudo firewall-cmd --permanent --add-port8080/tcp sudo firewall-cmd --reload终极验证用手机或另一台电脑浏览器访问http://your-server-ip:3000输入admin/你设置的密码应成功进入 HFish 控制台并在「实时告警」页看到刚做的nc或curl测试记录。4. 避坑指南HFish 3.3.1 Linux 版 5 个血泪经验总结HFish 3.3.1 的文档精简但实际部署中存在多个隐蔽陷阱。以下是某安全团队在 3 个不同网络环境中踩出的 5 条高频问题按「现象 → 原因 → 解决」结构整理每条都经真实复现验证。4.1 现象Web 界面能打开但登录后空白页F12 查看 Network 显示/api/status500 错误原因config.json中database.path指向的./data/目录不存在或hfish进程无写权限。HFish 3.3.1 在首次写入数据库时失败后续所有 API 请求均因 DB 连接异常返回 500。解决# 确认目录存在且属主正确 ls -ld /opt/hfish/data # 应输出drwxr-xr-x 2 root root 4096 ... /opt/hfish/data # 若属主非 root执行sudo chown root:root /opt/hfish/data # 重启服务sudo systemctl restart hfish4.2 现象systemctl status hfish显示active (running)但ss -tlnp | grep 2222无输出原因config.json中plugins.ssh.enable为false默认值或plugins.ssh.port被误设为0或负数导致插件初始化失败但主进程未退出。解决检查config.json中plugins.ssh.enable是否为true确认plugins.ssh.port为2222或其他正整数不能是字符串2222查看journalctl -u hfish -n 50搜索ssh plugin failed关键字定位具体错误。4.3 现象外部nc -zv ip 22显示Connected但 HFish Web 界面无告警记录原因iptables DNAT 规则应用在错误网络接口如lo或docker0或规则未加-i eth0限定入站接口导致规则被跳过。解决# 查看当前规则详细信息含接口名 sudo iptables -t nat -L PREROUTING -n -v --line-numbers # 确认第二列是 eth0你的外网网卡名不是 * 或 lo # 若错误删除后重加 sudo iptables -t nat -D PREROUTING 1 # 删除第一条 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j REDIRECT --to-port 22224.4 现象HFish 捕获到 SSH 连接但告警详情中client_ip显示为127.0.0.1原因攻击者与 HFish 运行在同一台机器如用ssh -p 2222 localhost测试或 iptables DNAT 规则未启用--to-ports而用了--to-destination导致源 IP 被覆盖。解决确保测试从另一台机器发起如云服务器 A 部署 HFish用本地笔记本 B 连接DNAT 必须用REDIRECT --to-port本机端口映射禁用DNAT --to-destination跨机映射会丢失 client_ip。4.5 现象HFish 运行 2 小时后自动退出journalctl显示signal: killed原因Linux OOM Killer 因内存不足强制终止进程。HFish 3.3.1 在高并发扫描下如nmap -sS -p 1-1000 target可能瞬时占用 500MB 内存而小内存 VPS如 1G RAM触发 OOM。解决# 临时降低 OOM 优先级数值越小越不易被杀 echo -1000 | sudo tee /proc/$(pgrep hfish)/oom_score_adj # 长期方案限制 HFish 内存使用需 recompile3.3.1 不支持 runtime 限流 # 更推荐升级服务器内存或减少同时启用的插件数如禁用 redis/mysql 插件5. 进阶技巧用 SQLite 直查告警、定制 HTTP 响应、批量导出分析HFish 3.3.1 的 Web 界面功能有限但其底层 SQLite 数据库完全开放配合命令行工具可实现深度分析。这是多数教程忽略的实战能力。5.1 直连 SQLite 数据库绕过 Web 界面查原始告警HFish 3.3.1 所有告警存于/opt/hfish/data/hfish.db表结构简洁# 进入数据库交互 sqlite3 /opt/hfish/data/hfish.db # 查看表核心是 alerts 表 .tables # alerts plugins settings users # 查询最近 10 条 SSH 攻击按时间倒序 SELECT id, plugin, client_ip, username, password, created_at FROM alerts WHERE plugin ssh ORDER BY created_at DESC LIMIT 10; # 统计各 IP 攻击次数防暴力破解分析 SELECT client_ip, COUNT(*) as cnt FROM alerts WHERE plugin ssh GROUP BY client_ip HAVING cnt 5 ORDER BY cnt DESC;导出为 CSV 供 Excel 分析# 一行命令导出全部告警含表头 sqlite3 -header -csv /opt/hfish/data/hfish.db SELECT * FROM alerts; /tmp/hfish_alerts.csv # 导出指定字段的清洗后数据 sqlite3 -header -csv /opt/hfish/data/hfish.db \ SELECT datetime(created_at, unixepoch), plugin, client_ip, username, password FROM alerts WHERE plugin IN (ssh,http) ORDER BY created_at DESC LIMIT 1000; \ /tmp/hfish_clean.csv提示created_at字段是 Unix 时间戳秒级datetime(created_at, unixepoch)可转为可读时间避免在 Excel 里手动转换。5.2 定制 HTTP 插件响应让蜜罐伪装成真实业务系统HFish 3.3.1 的 HTTP 插件支持自定义响应内容位于plugins/http/template/目录。修改此目录下文件重启服务即可生效# 备份原始模板 cp /opt/hfish/plugins/http/template/index.html{,.bak} # 编辑为伪装成 WordPress 登录页示例 cat /opt/hfish/plugins/http/template/index.html EOF !DOCTYPE html htmlheadtitleWordPress rsaquo; Log In/title/head body classlogin h1a hrefhttps://wordpress.org/WordPress/a/h1 form nameloginform idloginform action/wp-login.php methodpost p classlogin-usernamelabel foruser_loginUsername or Email Address/label input typetext namelog iduser_login classinput value size20 //p p classlogin-passwordlabel foruser_passPassword/label input typepassword namepwd iduser_pass classinput value size20 //p p classlogin-submitinput typesubmit namewp-submit idwp-submit classbutton button-primary button-large valueLog In //p /form /body/html EOF # 重启服务使模板生效 sudo systemctl restart hfish效果访问http://ip:8080将显示 WordPress 登录页攻击者提交表单后HFish 会记录POST /wp-login.php请求及log/pwd参数值。注意此操作不改变 HTTP 插件的路由逻辑所有路径/,/test,/wp-login.php均返回同一页面。5.3 批量导出与定时归档用 shell 脚本自动化数据沉淀为防止hfish.db过大影响性能建议每日导出并清空旧数据。以下脚本可加入 crontab#!/bin/bash # /opt/hfish/scripts/backup_alerts.sh DATE$(date %Y%m%d) DB_PATH/opt/hfish/data/hfish.db BACKUP_DIR/opt/hfish/backups mkdir -p $BACKUP_DIR # 导出当日告警created_at 是 Unix 时间戳计算今日 0 点时间戳 TODAY_START$(date -d today 00:00:00 %s) TODAY_END$(date -d tomorrow 00:00:00 %s) sqlite3 $DB_PATH \ SELECT datetime(created_at, unixepoch), plugin, client_ip, username, password FROM alerts WHERE created_at $TODAY_START AND created_at $TODAY_END ORDER BY created_at; \ $BACKUP_DIR/alerts_$DATE.csv # 清空当日之前的数据保留最近 7 天 SEVEN_DAYS_AGO$(date -d 7 days ago 00:00:00 %s) sqlite3 $DB_PATH DELETE FROM alerts WHERE created_at $SEVEN_DAYS_AGO; # 优化数据库释放空间 sqlite3 $DB_PATH VACUUM;添加到定时任务每天凌晨 2 点执行# 编辑 root crontab sudo crontab -e # 添加一行 0 2 * * * /bin/bash /opt/hfish/scripts/backup_alerts.sh我坚持把 HFish 当作一个“可编程探针”而非黑匣子来用——每次部署必跑sqlite3查数据每次改配置必journalctl看日志每次上线前必用nc和curl手动触发测试。这些看似繁琐的步骤恰恰是区分“能跑起来”和“真能捕获攻击”的分水岭。HFish 3.3.1 的价值从来不在它多酷炫而在于你能否在 5 分钟内从一条告警日志里反推出攻击者的 IP、工具、甚至下一步动作。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑