Pentbox、Defnet与Cowrie:从假页面到假Shell蜜罐实战

发布时间:2026/11/3 3:00:08
Pentbox、Defnet与Cowrie:从假页面到假Shell蜜罐实战

简介:《三种蜜罐的搭建与使用方法》面向网络安全初学者、渗透测试学习者及实验教学人员,围绕低成本部署与观察蜜罐展开,帮助读者理解诱捕、监测和记录非授权访问的基本思路。资源包仅含 1 个 docx 文档,压缩后约 7.96MB,以图文笔记形式组织内容,便于按工具章节查阅和复现实验。文档分别梳理 Defnet、Pentbox 与 Cowrie 三类蜜罐:Defnet 部分涉及虚拟 Telnet、FTP、SMTP 等服务及监视记录;Pentbox 部分结合 Kali 环境说明端口监听、日志保存与告警设置;Cowrie 部分介绍中等交互 SSH 蜜罐的安装配置、攻击字典与命令捕获、恶意文件处置等要点。已有 3085 人学习,适合作为课程实验、靶场练习和蜜罐入门选型的参考材料。

1. 三种蜜罐摆在一起看:从 80 端口的假页面到 63333 端口的假 shell

把一台机器的 80 端口让出去,让扫描器以为这里有东西,听起来有点玄学,其实三个工具就能覆盖「装样子」到「陪聊」的完整区间。Pentbox 是 Ruby 写的单文件套件,一条命令就能在 80 端口立一块 Access denied 的牌子;Defnet 是 Windows 上的图形化仿真器,勾几个框就变出一台带盘符、卷标和 MAC 的假 Telnet 服务器;Cowrie 则是中交互 SSH 蜜罐,攻击者试的每个密码、敲的每条命令、传的每个文件都会落进日志。这三类蜜罐适合不同阶段:想快速验证「我这个网段有没有人在扫」,前两个足够;想攒字典、看真人上来第一步干什么,只能靠 Cowrie。下面按搭建顺序拆开,参数怎么填、日志在哪看、哪一步最容易翻车,都写进去。

2. Pentbox 单文件蜜罐:Ruby 脚本怎么在 80 和 23 端口上装样子

2.1 为什么先拿 Pentbox 练手

蜜罐按交互深度分低交互和中交互。低交互只做到传输层握手加一段伪造的应用层回应,攻击者能连上、能看到 banner、能拿到一个错误页面,但进不去任何真实服务;中交互会给你一个假 shell,让你敲命令、传文件,全程被记录。Pentbox 属于典型低交互,它的价值不在「骗得多深」,而在「起得多快」。

它的形态很讨巧:整个套件是一堆 Ruby 脚本,不编译、不装服务、不写系统配置,解压完直接./pentbox.rb就跑起来,Ctrl+C 就停,机器上不留残留。对刚接手一台测试机、想先看看内网扫描流量的人来说,这种「零部署成本」比功能多重要得多。反过来,它的短板也很明确:只能记录 TCP 连接事件和客户端发的第一批字节,记录不到攻击者后续敲的命令,也挡不住稍微懂行的人——连上 22 端口发现 SSH 版本协商对不上,立刻就知道这是个假货。

所以我的用法是把它当「探针」而不是「陷阱」:在几台不重要的机器上各开一个端口,一周看一次日志,先搞清楚有没有人扫、扫的是哪些端口,再决定要不要上 Cowrie 这种重家伙。Pentbox 面向 GNU/Linux 编写,同时支持 Windows、MacOS 以及任何装了 Ruby 的系统,这也是它跨平台好用的原因——同一份脚本拷到哪都能跑。

2.2 环境准备与启动路径

先确认 Ruby 在不在。Pentbox 1.8 是很老的脚本,新系统上的 Ruby 3.x 有时会因为它用了已废弃的语法而报警告,但基本功能还能跑;如果直接报语法错,装一个 compat 版本或者用容器里带的老 Ruby 更省事。

# 确认 ruby 可用,没有就先装 ruby --version || apt-get install -y ruby # 取发布包(地址以你实际拿到的 pentbox-1.8 下载链接为准) wget -O pentbox-1.8.tar.gz "<pentbox-1.8 下载地址>" # 解压并进入目录 tar -zxvf pentbox-1.8.tar.gz cd pentbox-1.8/ # 先看一眼目录,确认 pentbox.rb 在 ls # 直接执行;如果提示权限不足就 chmod +x pentbox.rb 或者用 ruby pentbox.rb 调 ./pentbox.rb

这段里唯一需要动脑的是最后一步。./pentbox.rb依赖文件本身有可执行位,从 tar 包里解出来的脚本有时会丢这个位,报Permission denied不是脚本坏了,是权限问题,chmod +x就好;用ruby pentbox.rb显式调用解释器则完全绕过这个问题,我一般图省事就直接这么写。

进入主菜单后路径是固定的:先选2(Network Tools),再选3(Honeypot)。到这里会分叉出两个选项,1是 Fast Auto Configuration,2是 Manual Configuration。快速模式做的事非常有限——把监听端口钉死在 80,直接开始 accept,错误信息用内置的默认值。适合「我就想现在马上有个东西在听」的场景,三十秒搞定,验证完就 Ctrl+C。

Manual 模式才是真正能用的那档,它会把四个参数逐个问一遍。下面是这四项该怎么填。

2.3 手动配置的四个参数

提示项建议值说明
开放端口21 / 23 / 80 / 443挑你所在网段最常被扫的端口,别用 8080 这种半吊子
错误信息Access denied / 404 Not Found浏览器直接显示这行字,写得太离谱反而显眼
是否保存 logy不落盘等于白干,务必开
log 文件名honey.log相对当前工作目录,别写到 /tmp 这种会被清的地方
蜂鸣报警n终端响铃只在本地会话有意义,后台跑就是纯噪音

端口这一项值得多说两句。伪装 Web 就用 80 或 443,伪装 FTP 用 21,伪装 Telnet 用 23;这几个端口在扫描器眼里属于「高价值」,连接量天然比 8000 之类的大。但要注意 Pentbox 在 22 端口上的效果是打折的:SSH 客户端连接后会先做版本协商,期待收到SSH-2.0-xxx这样的 banner,而 Pentbox 只会回你配置的那句错误信息,稍微懂一点的攻击者一眼就认出不是真 sshd。所以 22 端口适合「统计有多少人在扫 SSH」,不适合「骗人深入」。

错误信息那一项是纯社会工程学细节。默认的提示语偏「工具味」,我一般改成和目标机器上真实服务一致的文案,比如伪装 Web 就写403 Forbidden,伪装 FTP 就写530 Login incorrect。这一步不改变任何技术行为,但对自动化扫描器判断「这台是不是真机器」有影响,属于低成本收益。

日志文件名和蜂鸣这两项没什么可纠结的。蜂鸣在老式演示场景里很带感,屏上一响就知道有人来了,实际长期挂着的时候关掉,否则半夜响一次你得爬起来看是不是真出事。

2.4 验证:三个入口对应三条记录

配完之后终端会打出HONEYPOT ACTIVATED ON PORT 80,这行字出现就说明 socket 已经 bind 成功并在 accept。接下来从另一台机器上制造三次访问,每次回到 Pentbox 的终端看有没有对应的INTRUSION ATTEMPT DETECTED。

# 第一次:浏览器访问,预期看到 Access denied curl -i http://192.168.44.130/ # 第二次:打 80 端口的 TCP 握手,不产生应用层数据 nc -vz 192.168.44.130 80 # 第三次:换端口验证多实例,比如伪装 telnet telnet 192.168.44.130 23

这三条命令的差别在于触发层次。curl会走完 TCP 握手再发 HTTP 请求,Pentbox 记录到的连接里带应用层内容;nc -vz只做握手就断,记录里就是一条空连接——这恰好说明低交互蜜罐记的是「事件」而不是「会话内容」。telnet那条更典型,连上之后终端会卡住,因为 Pentbox 不实现 Telnet 协议协商,你得按Ctrl+]再敲quit才能退出,很多人第一次用以为程序挂了,其实是在正常等你的输入。

验证完端口就停在 80 和 23 上不动,别急着加更多。低交互蜜罐开得越多,误报越多——内网里正常的主机发现、资产扫描、打印机广播都可能打到这些端口上,日志很快就变成一锅粥。我一般同时只挂两到三个端口,跑一周,统计出来的源 IP 分布比一堆杂乱记录有用得多。

3. Defnet 的仿真面板:把假 Telnet 服务伪装到驱动器盘符

3.1 图形化蜜罐能做什么、不能做什么

Defnet 走的是另一条路:不做协议层伪造,直接给你一个面板,勾选要虚拟的服务,填好账号密码和一堆系统属性,然后点按钮开始监听。它的受众明显是教学和演示场景——没有命令行、没有依赖、没有配置文件,所有参数都在对话框里,适合在 Windows 上快速搭一个「看得见攻击者在干什么」的环境。

它的能力边界比 Pentbox 稍微宽一点,因为它能虚拟出 Web、FTP、SMTP、Finger、POP3、Telnet 六种服务,并且对 Telnet 这种交互式协议能走完「输用户名 → 输密码 → 给个 shell 提示符」的完整流程。攻击者以为自己登进了一台 Windows 服务器,实际上所有响应都是面板拼出来的。但它依然是低交互:假 shell 里能看的目录、盘符、磁盘空间都是预先设好的静态值,你敲cd进去也不会真的换目录。

这种「静态仿真」在实战里的定位很清楚:它拦不住老手,但能完整记录新手和自动化工具的探测路径。很多人第一次拿到一个 shell 会先敲whoami、dir、ipconfig,这三条命令的顺序本身就是有价值的情报——说明他用的什么工具、什么水平、下一步想干什么。

3.2 虚拟服务与弱口令诱饵

打开程序后点HoneyPot按钮进入设置对话框,服务列表里按需勾选。这里有个常见误区:以为勾得越多越好。实际上勾太多会让同一个 IP 上出现一堆不该同时存在的服务——一台机器开着 Web 又开着 Finger,稍微像样点的扫描器都会标红。我一般只勾一到两个,形成一个自洽的角色。

账号密码这一栏是故意设弱的。原文里的示例用root/123456,这个组合不是随意写的:弱口令本身就是诱饵的一部分,攻击者爆破成功后会产生「我进来了」的错觉,接下来的操作才最有记录价值。如果你设一个 20 位的强密码,爆破工具打不穿,连都连不上,等于什么都没录到。

虚拟服务常见端口伪装建议
Telnet23最推荐,交互链完整,能记录登录后操作
FTP21适合记录匿名登录尝试和目录遍历
Web80只回静态页,记录请求路径最有价值
SMTP25记录 EHLO 域名和发信尝试
POP3110记录账号枚举行为
Finger79老协议,现在几乎只有扫描器会碰

Telnet 那一栏填好用户名和密码之后,别急着点确定,右下角还有一个Advanced。这个按钮才是 Defnet 区别于普通端口监听的地方。

3.3 Advanced 里的六个伪装项

Advanced对话框里是一串用来「让假系统更真」的属性。这些字段攻击者登录后大概率会看,填得敷衍就是自曝。

参数作用填法建议
Drive伪装驱动器盘符填C:,和真实 Windows 一致
Volume卷标填System或OS,别用默认空白
目录创建时间假目录的时间戳设成半年以前,新建时间戳一眼假
目录名假目录结构放几个像业务目录的名字,别全是test
Free space in bytes剩余磁盘空间填一个合理数值,比如 32GB 上下
MAC 地址 / 网卡类型硬件指纹MAC 用常见厂商前缀,网卡选主流型号

这张表里最容易被忽略的是时间戳和磁盘空间。攻击者登录后敲dir,看到所有目录的创建时间都是今天,立刻就知道这是刚搭的蜜罐;看到剩余空间是 0 字节或者几个 TB,同样起疑。MAC 地址也一样,虚拟网卡默认的 MAC 前缀在公开的厂商库里查不到,属于典型的「虚拟机指纹」。

填完这些再回到主对话框,点Monitore开始监听。这时候程序进入被动等待状态,界面上会出现连接计数。

3.4 监视器怎么读三段记录

监听开起来之后,从另一台机器发起连接。原文里的拓扑是物理机跑 Defnet(192.168.44.1),虚拟机里发起 telnet(192.168.44.132)。这个方向要注意:Defnet 装在 Windows 上,测试机可以是同网段的任意 Linux 或另一台 Windows。

# 从测试机发起连接,观察 Defnet 监视器是否有反应 telnet 192.168.44.1 23

连接建立后监视器里会出现三段记录,三段的含义完全不同,混在一起看容易误判。

第一段是「连接建立」,只说明 TCP 握手成功,什么都不能证明——扫描器的探测也会留下这一段。第二段是「输入用户名密码」,这时候才有情报价值,你能看到攻击者用的字典长什么样,是admin/admin还是root/root。第三段分叉成两种:一种是「连接超时」,说明攻击者输完就挂在那里等,多半是脚本跑完了没后续动作;另一种是「登录成功」,说明他拿到了假 shell,接下来的每一条命令都会被记录下来。

我习惯把这三段的时间戳记下来,和同一时段的防火墙日志对一遍。有时候蜜罐上只有一条连接记录,防火墙那边却有几十条被拒的包,说明对方在批量扫端口,蜜罐只是恰好命中了其中一个——这种情况下单看蜜罐日志会严重低估攻击面。

4. Cowrie 中交互 SSH 蜜罐:虚拟环境、端口改号与流量重定向

4.1 它和前面两个不是一回事

前两个工具记录的是「连接」,Cowrie 记录的是「行为」。它是一个中交互 SSH 蜜罐,攻击者用 SSH 客户端连上来,会看到一个像模像样的登录提示,爆破成功之后进入一个假 shell,敲的每条命令、传的每个文件都被完整记下来。假 shell 里的命令是模拟执行的,攻击者上传的恶意文件即使被chmod +x再运行也不会真的生效,所以对蜜罐主机本身相对安全。

这个特性决定了它的用途:拿暴力破解字典、看攻击者上来先跑什么侦察命令、收集他上传的木马样本。这些都是低交互蜜罐给不了的。代价是部署麻烦——要建独立用户、装一堆 Python 依赖、改 SSH 端口、配 iptables 转发,每一步都有坑。

维度PentboxDefnetCowrie
交互深度低低中
记录内容连接事件连接 + 登录动作命令、字典、文件
部署成本一分钟十分钟半小时以上
主要风险几乎无几乎无端口配错会锁死自己

4.2 建独立用户与装依赖

第一件事不是装软件,是建一个专用低权限用户。蜜罐天生是「故意让人打」的服务,用 root 跑等于把整台机器的命运交给一个假 shell 的漏洞。

# 建一个不可登录系统账户之外的普通用户,专门跑蜜罐 useradd -r -m -s /bin/bash honey passwd honey # 老版本 Cowrie 依赖的 python2 组件,一次装齐 apt-get install -y python-twisted python-crypto python-pyasn1 \ python-gmpy2 python-mysqldb python-zope.interface # 虚拟环境工具 apt-get install -y virtualenv

这里的-r是建系统账户,-m强制创建家目录,-s /bin/bash给它一个能用的 shell。三个参数缺一个都可能出问题:不加-m的话家目录不存在,后面 chown 会失败;不给 shell 的话切过去执行脚本会报「此账户不可用」。

依赖清单里那些python-开头的包是历史遗留。老版本 Cowrie 跑在 Python 2 上,新一点的发行版已经把python-twisted这类包改名或者合并进别的包,直接apt-get install会报「无法定位软件包」。遇到这个不要硬扛,先确认你手上的 Cowrie 是哪个分支:新版走pip install -r requirements.txt加 Python 3,老版才需要这一串 apt 包。照抄老教程装不上,八成就是版本对不上。

4.3 虚拟环境与编译依赖报错

代码拉下来之后不要直接pip install,先建虚拟环境,避免把系统 Python 搞乱——这台机器上可能还有别的服务在用 Python。

cd /opt git clone <cowrie 仓库地址> cowrie cd /opt/cowrie # 建虚拟环境并激活,命令行前缀出现 (env) 才算成功 virtualenv env source env/bin/activate # 装运行时依赖 pip install twisted cryptography pyopenssl gmpy2

第二条命令是报错重灾区。pip install跑到cryptography或cffi时挂掉,报一堆ffi.h: No such file或者openssl/ssl.h: not found,这不是 pip 的问题,是系统缺 C 编译工具链和头文件。补三个包就好:

# cffi 和 cryptography 的编译依赖 apt-get install -y python-cffi libffi-dev libssl-dev # gmpy2 的数学库依赖 apt-get install -y libgmp-dev libmpfr-dev libmpc-dev

三组包对应三类报错,别混着装。libffi-dev解决的是cffi的头文件缺失,libssl-dev解决的是cryptography找不到 OpenSSL,libgmp-dev这一组解决gmpy2编译时找不到大数运算库。装完重新执行上一条pip install,通常会一次过。这条血泪经验适用于几乎所有需要编译的 Python 包,不只是 Cowrie。

4.4 目录归属、umask 与监听端口

依赖装完,接下来改三处配置,每处都有明确的失败后果。

# 目录归属交给 honey,否则运行时写日志会 permission denied chown -R honey:honey /opt/cowrie # 从模板生成配置文件,别直接改 .dist cp cowrie.cfg.dist cowrie.cfg # umask 从 0077 改成 0022,否则日志只有 owner 能读,采集脚本读不到 sed -i 's/umask 0077/umask 0022/' start.sh # 核对改动是否生效 grep -n umask start.sh

第一处是权限。Cowrie 启动时要在自己的目录下写日志、建临时文件,如果目录属于 root 而进程是 honey 跑的,启动瞬间就会因为写不了文件而退出,日志里只有一行看不出所以然的错误。第二处是配置文件,cowrie.cfg.dist是模板,很多教程让你直接改它,结果升级或者重装时被覆盖,改过的参数全丢——正确做法是复制一份成cowrie.cfg,程序优先读这个。

第三处是 umask。这是最隐蔽的一个:默认0077意味着新建的日志文件权限是600,只有 honey 用户自己能读。如果你后面想用一个采集脚本或者日志转发进程去读这些文件,会一直报权限不足,而文件明明就在那里。改成0022之后新建文件是644,别人能读不能写。已经生成的旧文件不会自动变,得手动chmod一次。

然后是监听端口。

# 蜜罐的 SSH 监听端口,选 60000 以上,避开扫描器默认关注的低位端口 sed -i 's/^listen_port.*/listen_port = 63333/' cowrie.cfg # 复核,别改错文件或者改错行 grep -n "^listen_port" cowrie.cfg

端口选高位是有讲究的。蜜罐自己的监听端口如果也用 22,就会和真实的 sshd 抢 socket,两者只能活一个;就算真 sshd 改了端口,把蜜罐挂在 22 上也容易被各种自动化工具的特殊探测打穿。选 60000 以上,日常扫描基本不会碰,日志干净很多。

4.5 重定向与真 SSH 挪位:三个数字必须自洽

这一步是整套部署里最容易翻车的,因为它涉及三个端口数字,任何一个填错,要么转发打空,要么把自己锁在门外。

# 22 端口进来的连接,改投给蜜罐的 63333 iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 63333 # 真实 sshd 挪到 62222,自己登录走这个端口 sed -i 's/^Port 22/Port 62222/' /etc/ssh/sshd_config systemctl restart ssh # 复核监听状态,确认 22 已经被腾出来 ss -tlnp | grep -E ':(22|62222|63333)'

三个数字的关系必须满足:--to-port等于cowrie.cfg里的listen_port,真 sshd 的端口必须从 22 挪走且不等于前两者。第一个等式不成立,转发目标没人监听,连接直接被拒;第二个条件不成立,sshd 还占着 22,iptables 的 REDIRECT 规则虽然生效,但你自己 ssh 进来也会被送进蜜罐——更糟的情况是规则顺序问题导致本地回环都被重定向,那就彻底失去远程访问。

提示:改 sshd 端口之前,先确认手上还开着一个已经登录的会话,或者有带外控制台可用。这是唯一的后悔药。

改完用ss -tlnp复核是最省事的验证手段。理想输出里,22 应该没有进程在监听(或者只有一个 iptables 层面的转发,不显示进程),63333 是 honey 用户的进程,62222 是 sshd。

4.6 启动与首轮验证

切换成 honey 用户启动,别用 root。启动之后必须从另一台机器真实连一次,否则你不知道它到底在不在工作。

su honey cd /opt/cowrie bin/cowrie start # 缺依赖时按提示补,常见的是这几个 pip install configparser service_identity pycrypto tftpy # 盯日志,新连接进来会实时刷新 tail -f log/cowrie/cowrie.log

启动阶段报缺包很常见,因为虚拟环境里只装了核心依赖,configparser、service_identity这些是启动到某个模块时才动态引用的。按报错逐个pip install即可,不用一次装全。

验证分两步。第一步从外部ssh -p 63333 honey@<蜜罐IP>,看到登录提示后随便输个错密码,再去cowrie.log里找cowrie.login.failed事件,能找到就说明链路通了。第二步故意登录成功(用蜜罐里预设的弱口令),进去敲whoami、ls、cat /etc/passwd,然后在log/cowrie/cowrie.json里搜cowrie.command.input,你敲的每一条都应该在。顺带一提,假 shell 里ping一个外网地址,看到的也是蜜罐侧伪造的输出,别拿这个结果判断网络通不通。

5. 三种蜜罐的避坑与排查:端口占用、依赖报错和自锁风险

5.1 连 22 端口进去看到的是自己的真 shell

现象:按教程配完 iptables 和 cowrie.cfg,从另一台机器ssh到蜜罐的 22 端口,输完密码直接进了真实系统,whoami返回真实用户名,日志里也没有任何记录。

原因:listen_port和 iptables 的--to-port不是同一个数,或者真 sshd 的端口没改。原文里的示例在这处就埋了一个坑——转发写的是 62223,配置里的监听端口却是 63333,两个数字对不上,REDIRECT 把流量送到了一个没人监听的端口,实际连接要么被拒要么绕回真 sshd。

解决:先用ss -tlnp | grep -E ':(22|62222|63333)'把三个端口的实际监听状态打出来,确认哪个进程占着哪个端口,再回头对齐 iptables 规则、cowrie.cfg的listen_port、sshd_config的Port三处。改完iptables -t nat -L PREROUTING -n -v看一眼规则的包计数,有增长才说明真的命中了。

5.2 pip 装依赖报 ffi.h 或 ssl.h 找不到

现象:pip install cryptography编译到一半挂掉,错误信息里出现fatal error: ffi.h: No such file or directory或openssl/ssl.h,重试多少次都一样。

原因:这些包有 C 扩展,pip 只负责下载源码,编译要靠系统里的编译器和开发头文件。基础镜像为了瘦身通常不带-dev包,所以永远编不过。

解决:按报错关键词补包——libffi-dev对应 ffi.h,libssl-dev对应 ssl.h,libgmp-dev libmpfr-dev libmpc-dev对应 gmpy2。装完不要急着重新pip install,先pip cache purge清掉半成品缓存,否则可能继续用坏掉的中间产物。

5.3 蜜罐起来了但日志文件是空的

现象:bin/cowrie start显示成功,进程也在,ps能看到,但log/cowrie/下没有新文件,或者文件存在但一直是 0 字节。

原因:八成是目录归属问题。程序以 honey 用户运行,但/opt/cowrie的所有者是 root,写日志时被拒,异常被吞掉了。另一种可能是 umask 还是 0077,文件建出来了但权限是 600,你用别的账户cat看不见内容,误以为是空文件。

解决:ls -l log/cowrie/看文件权限和时间戳,stat看 owner。归属不对就chown -R honey:honey /opt/cowrie;umask 没改就回去改start.sh,改完重启进程,旧文件手动chmod 644一次。

5.4 Defnet 监视器一片空白,telnet 却显示连接成功

现象:从测试机telnet 192.168.44.1 23能连上,也能看到登录提示,但 Defnet 的 Monitore 窗口里一条记录都没有。

原因:两种可能。一是测试机和 Defnet 主机不在同一网段,中间有设备做了地址转换,蜜罐看到的源 IP 全是网关地址,界面按会话聚合时看起来像没记录;二是 Windows 防火墙放行了入站但没放行程序本身,连接被系统层面接住了,没进到应用层。

解决:先在蜜罐主机上netstat -an | findstr :23确认是 Defnet 的进程在监听,不是系统服务。再临时关掉防火墙做一次对照测试,确认是不是防火墙导致。跨网段的情况就老实把测试机挪到同一广播域,别在 NAT 后面做蜜罐实验,看到的源 IP 没有分析价值。

5.5 蜜罐端口被别的服务先占了

现象:Pentbox 启动 80 端口时报 bind 失败,或者 Cowrie 启动后立刻退出,日志里只有一行Address already in use。

原因:系统上已经有 Web 服务、反向代理或者另一个蜜罐实例在监听同一端口。老系统里 Apache 和 nginx 默认就占 80,容器环境里更常见。

解决:ss -tlnp | grep :80找到占用进程,要么停掉它,要么把蜜罐换个端口。这里有个原则:不要为了跑蜜罐去停生产服务,蜜罐的优先级永远低于真实业务。换端口之后再验证一遍触发链路,别改了端口忘了同步 iptables 规则。

6. 三份日志并排看:一个二十行脚本和一条时间线习惯

三种蜜罐的日志格式完全不通:Pentbox 是纯文本行,Defnet 是图形界面里的表格,Cowrie 是每行一个 JSON。各看各的没问题,一旦想把「同一个源 IP 在三个蜜罐上的行为」串起来,手工翻就废了。我一般的做法是先统一成「时间、源 IP、事件、内容」四列,再排序。

# 把 cowrie 的 json 行日志压成四列,方便和其他蜜罐的文本日志并排看 import json, sys for line in open(sys.argv[1], encoding="utf-8", errors="ignore"): try: e = json.loads(line) except ValueError: continue # 非 json 行直接跳过,别让一行脏数据打断整批 eid = e.get("eventid", "") # 只保留有分析价值的三类事件,其余噪声(连接建立、断开)先扔掉 if eid in ("cowrie.command.input", "cowrie.login.success", "cowrie.login.failed"): print(e.get("timestamp", ""), e.get("src_ip", ""), eid.split(".")[-1], e.get("input", e.get("username", "")))

参数就一个:sys.argv[1]指向cowrie.json。errors="ignore"是必须的,攻击者上传的文件名里经常带非法字节,不加这个参数整个脚本会在某一行崩掉。eid.split(".")[-1]把cowrie.command.input截成input,输出窄一点,终端里一行放得下。

跑起来是这样:

python3 flatten.py log/cowrie/cowrie.json | sort -k1,1 > cowrie.tsv

sorted -k1,1按时间戳排,这一步的意义在于 Cowrie 的 JSON 是追加写的,多进程或者重定向场景下时间顺序可能是乱的。Pentbox 的honey.log和 Defnet 导出的记录用同样的四列手工对齐,sort一遍,三份文件并排打开,同一个 IP 在哪几个蜜罐上出现过、先碰的哪个端口、有没有登录成功,一眼就能看出来。

这套流程里唯一需要养成的习惯是时间同步。三台机器如果时区或者 NTP 不一致,日志对不上,前面的功夫全白费。我吃过这个亏——蜜罐日志显示凌晨三点有人爆破,防火墙日志里同一时段干干净净,查了半天才发现是蜜罐主机时区设错了,差了整整八小时。从那以后我每搭一台蜜罐,第一件事是timedatectl确认时区和 NTP 同步状态,第二件事才是改配置文件,宁可多花两分钟,也不想再对着一堆错位的时间戳排查。希望帮到你。

本文还有配套的精品资源,点击获取