网络欺骗防御体系中,蜜罐扮演了诱捕攻击者的角色。当企业内网部署多种蜜罐后,每天会收集到SSH暴力破解、Web漏洞探测、恶意载荷投放等海量日志。这些日志单独看价值有限,只有把不同探针的数据关联起来,才能还原攻击者的行为链路并勾勒出画像。R语言凭借强大的数据框处理与图分析能力,非常适合在安全运营中做这类离线溯源。

蜜罐日志的采集与结构化清洗
不同蜜罐输出的日志格式差异很大,例如Cowrie输出JSON、 Dionaea使用SQLite、自研TCP陷阱可能是纯文本。在R中我们可以先统一读入,再用jsonlite、DBI等包解析,最后合并为一个包含源IP、时间戳、协议、攻击类型、载荷摘要的数据框。清洗阶段最关键的是剔除自动化扫描器的噪声,比如只出现过一次且请求路径为根目录的IP,这类基本是互联网背景辐射流量。
具体处理时,可以用dplyr做分组过滤。下面示例展示如何标记出现次数小于3且未触发任何高危规则的IP为低信誉扫描器,并从分析集中排除。这样后续关联分析聚焦于真正有横向移动或多种攻击手法的源头,避免画像被爬虫扭曲。同时要把时间字段转为POSIXct类型,方便做时间窗滑动关联。
library(jsonlite)
library(dplyr)
# 读取Cowrie JSON日志
raw <- fromJSON("cowrie.json")
logs <- raw %>%
mutate(ts = as.POSIXct(timestamp, format="%Y-%m-%dT%H:%M:%OS")) %>%
select(ip = src_ip, ts, proto = protocol, atype = eventid, payload = message)
# 标记低频扫描器
ip_count <- logs %>% group_by(ip) %>% summarise(n = n())
low_rep <- ip_count %>% filter(n < 3) %>% pull(ip)
clean <- logs %>% filter(!ip %in% low_rep)
经过上述步骤,我们得到了相对干净的分析基础表。此时每一个IP对应的多条行为记录保留了原始语义,为后续关联提供了原料。实践中还要注意NAT出口或僵尸网络共用IP的情况,可结合User-Agent或证书指纹做二次聚合,但基础框架不变。
基于时间窗与攻击链的关联分析
攻击者画像的核心在于知道谁在什么时间做了什么组合动作。我们可以利用滑动时间窗,把同一IP在十分钟内产生的SSH登录失败、随后Web目录遍历、再后来下载恶意脚本视为一条攻击会话。R里用slider包或自写函数切割会话,再统计每会话的攻击多样性。多样性高的IP往往代表人工或半自动入侵,而单一重复动作多为僵尸程序。
更进一步,用igraph构建有向图:节点是IP与受攻击资产,边是攻击动作。通过社区发现算法,能找出协同攻击集群,例如一组IP轮流探测同一网段,说明背后有统一控制端。以下代码演示如何从清洗后日志生成边列表并绘图,帮助溯源者直观看到攻击拓扑。
library(igraph) edges <- clean %>% mutate(target = "HONEYPOT") %>% select(from = ip, to = target, weight = atype) g <- graph_from_data_frame(edges, directed = TRUE) wc <- cluster_walktrap(g) plot(g, vertex.color = membership(wc), main = " attacker-host graph ")
在关联结果上,我们可以提取每个IP的常用攻击类型序列,作为行为指纹。例如某IP总是先爆破Telnet再转向HTTP文件包含,这种顺序本身就能区分不同黑客团伙。关联分析不只看单点,而是把蜜罐当作整体传感器,用R快速试验多种窗口与权重,比手工翻日志效率高两个数量级。
从Payload特征抽取攻击者画像标签
日志中的Payload往往包含工具痕迹,比如特定的HTTP头、已知的恶意脚本名、或SQL注入模板。R可以用正则表达式在payload字段中搜索模式,给IP打上如“使用Hydra”“疑似Mirai”“中文环境操作者”等标签。画像不再是抽象分数,而是可解释的安全情报。
下面例子展示如何用stringr识别常见黑客工具并汇总每个IP的标签集合。这些标签可直接接入威胁平台,或用于比对历史攻击者。值得注意的是,有些攻击者会故意伪造Payload,因此标签应带置信度,而非绝对判定。结合前面关联出的攻击链,就能输出一份包含来源、活跃时段、偏好漏洞、工具库的完整画像报告。
library(stringr)
patterns <- list(
hydra = "Hydra",
mirai = "Mirai",
sqlmap = "sqlmap"
)
tag_ip <- function(p) {
res <- c()
for (name in names(patterns)) {
if (str_detect(p, patterns[[name]])) res <- c(res, name)
}
return(paste(res, collapse = ","))
}
clean <- clean %>%
rowwise() %>%
mutate(tags = tag_ip(payload)) %>%
ungroup()
profile <- clean %>%
group_by(ip) %>%
summarise(
sessions = n_distinct(ts %>% as.character()),
tool_tags = paste(unique(tags[tags != ""]), collapse = "|")
)
最终形成的攻击者画像可以指导防御策略,比如对频繁使用某Web漏洞的IP在前端WAF加规则,或把其活动时段列为重点监控窗口。R语言脚本可定时运行,让蜜罐日志从沉睡数据变为持续产出的溯源能力。整套方法不依赖商业SIEM,适合中小团队自建网络欺骗溯源体系。