实战指南:基于 HFish + Python + GitHub Pages 构建自动化威胁情报源
规划
蜜罐(Honeypot)最核心的特点是:没有任何正常的业务流量会访问它。因此,凡是进入蜜罐的数据,本质上都是“可疑”或“恶意”的。这使得蜜罐收集到的数据具有极高的信噪比(高保真)。
蜜罐可以捕获攻击者的基础信息,将其转化为入侵指标(IOCs):
攻击源 IP 地址:识别攻击者来自哪里(国家、ASN、代理池)。
恶意哈希值(File Hash):上传的恶意软件的 MD5/SHA256。
恶意域名/URL:恶意软件回连的 C2(命令与控制)服务器地址。
用途:将这些数据实时同步给防火墙(FW)、WAF 或入侵检测系统(IDS),实现**“一处被攻,全网封禁”**。
本文即是实现将Hifsh蜜罐获得的攻击信息,通过使用其自带的 API 接口进行自动化提取,并利用 GitHub/Gitee Pages 进行分发。(提取简单的攻击源 IP 地址为例)
架构设计
数据源:部署在内网或公网的 HFish 蜜罐。
部署教程:云服务器搭建HFish蜜罐全流程
处理中心:一个运行 Python 脚本的中间服务器(可以是 HFish 本机)。
发布平台:GitHub 或 Gitee(利用其 Pages 服务托管静态文本文件)。( GitHub)
最终产物:一个公网可访问的 URL(例如 https://yuexuan521.github.io/honeypot-blocklist/ip_list.txt)。
第一步:准备 HFish API
HFish 提供了 API 用于获取攻击数据。
登录 HFish 管理后台。
进入 “系统设置” -> “API 设置”。
获取 API Key和 管理端地址。
注意:如果你的 HFish 在内网,确保运行脚本的机器能访问到 HFish 的管理端口(默认 4433)。

第二步:编写自动化提取脚本 (Python)
我们需要编写一个 Python 脚本,完成“拉取数据 -> 过滤白名单 -> 格式化 -> 写入文件”的动作。
在 HFish 服务器或能访问 HFish 的机器上创建 /root/generate_feed.py:(需修改HFISH_HOST、API_KEY、OUTPUT_TXT的值,第10行)
import requests
import json
import ipaddress
import urllib3
import time
import sys
from datetime import datetime, timedelta
# ================= 配置区 =================
HFISH_HOST = "https://IP:4433" //!!填写你的Hish网址!!
API_KEY = "" //!!填写你的Hish API Key!!
OUTPUT_TXT = "/root/threat-feed/ip_list.txt" //!!填写你保存文件的地址!!
TIME_WINDOW_HOURS = 24
LOCAL_WHITELIST = [
"127.0.0.1", "192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12",
"8.8.8.8", "1.1.1.1", "60.204.200.232"
]
WHITELIST_URLS = {
"bing": "https://www.bing.com/toolbox/bingbot.json",
"github": "https://api.github.com/meta"
}
# =========================================
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
class WhitelistManager:
def __init__(self):
self.whitelist_cidrs = []
for ip in LOCAL_WHITELIST:
try:
self.whitelist_cidrs.append(ipaddress.ip_network(ip, strict=False))
except: pass
def fetch_remote_whitelists(self):
print("[-] Fetching remote whitelists...")
for name, url in WHITELIST_URLS.items():
try:
resp = requests.get(url, timeout=10)
if resp.status_code == 200:
data = resp.json()
prefixes = []
if "prefixes" in data: prefixes = [p.get("ipv4Prefix") for p in data["prefixes"]]
elif "web" in data: prefixes = data.get("web", [])
for p in prefixes:
if p and "." in p:
self.whitelist_cidrs.append(ipaddress.ip_network(p))
except: pass
def is_whitelisted(self, ip_str):
try:
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)

