news 2026/6/10 1:07:20

Docker 部署开源蜜罐Cowrie

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker 部署开源蜜罐Cowrie

这是一个非常棒的实战选择。Cowrie是目前最流行的开源中交互 SSH/Telnet 蜜罐。它不仅能记录黑客的暴力破解(账号密码),还能模拟一个假的 Shell 环境,记录黑客登录后敲下的所有命令,甚至还能把黑客上传的文件保存下来。

作为一个运维开发工程师,使用 Docker Compose 部署它是最快、最干净的方式。

以下是基于 Docker 的 Cowrie 快速部署教程。

⚠️以此为戒(安全警告)

  1. 不要在生产环境的核心业务服务器上直接通过端口映射部署,以免资源被耗尽或发生意外逃逸。建议在虚拟机、闲置 VPS 或内网隔离区测试。
  2. 端口冲突:你的宿主机 SSH 通常占用 22 端口。为了避免把自己锁在门外,本教程将蜜罐部署在2222端口。

第一步:准备工作目录

在你的 Linux 服务器上创建一个目录来存放配置文件和日志:

mkdir-p/opt/cowrie/var/log/cowriemkdir-p/opt/cowrie/etccd/opt/cowrie

第二步:编写 Docker Compose 文件

创建docker-compose.yml文件。我们将把蜜罐的 SSH 服务暴露在宿主机的2222端口上。

version:'3'services:cowrie:image:cowrie/cowrie:latestcontainer_name:cowrie_honeypotrestart:alwaysports:# 格式: "宿主机端口:容器端口"# Cowrie 默认在容器内监听 2222-"2222:2222"volumes:# 挂载日志目录,方便我们在宿主机查看黑客留下的痕迹-./var/log/cowrie:/cowrie/cowrie-git/var/log/cowrie# (可选) 挂载配置目录,如果你想自定义蜜罐的hostname等-./etc:/cowrie/cowrie-git/etcnetworks:-cowrie-netnetworks:cowrie-net:driver:bridge

第三步:启动蜜罐

docker-composeup-d

启动后,查看一下日志确保运行正常:

docker-composelogs-f

第四步:扮演“黑客”进行攻击测试

现在,你的蜜罐已经上线了。你可以用另一台机器,或者就在本机,尝试攻击(登录)它。

注意:默认情况下,Cowrie 允许大多数常用密码登录(如root/123456),或者允许任意密码登录(取决于默认配置)。

在终端执行:

# 尝试连接蜜罐的 2222 端口sshroot@localhost-p2222
  1. 输入密码(试一下123456password)。
  2. 你会发现你登录成功了!
  3. 你会看到一个看起来很像 Linux 的提示符(通常是root@svr04:~#之类的)。
  4. 试着输入一些命令:
  • uname -a(看看它伪装成什么系统)
  • wget http://example.com/malware(假装下载病毒,Cowrie 会记录这个动作)
  • exit(退出)

第五步:查看“战利品” (日志分析)

作为防御者,现在去看看蜜罐记录了什么。

Cowrie 会生成两种主要的日志文件(在你挂载的./var/log/cowrie/目录下):

  1. cowrie.json(结构化日志,最重要):
    这是详细的审计日志,包含时间戳、攻击者IP、尝试的用户名/密码、输入的指令等。
    查看刚才的攻击记录:
# 使用 jq 美化查看 (如果没装 jq,直接 cat 也可以)tail-n20var/log/cowrie/cowrie.json

你会看到类似这样的 JSON 数据(这正是你作为运维开发可能感兴趣的数据结构):

{"eventid":"cowrie.command.input","message":"CMD: uname -a","src_ip":"172.18.0.1","session":"a1b2c3d4","timestamp":"2025-12-31T12:00:00.123456Z","input":"uname -a"}
  1. cowrie.log(文本日志):
    传统的应用运行日志,适合排查蜜罐本身的报错。
  2. tty/(录像回放):
    这个目录下会保存.log文件,这些其实是会话录像。你可以使用playlog工具(Cowrie 自带)完全重放黑客在终端里的一举一动,就像看电影一样。

进阶玩法:如何让它看起来更像真的?

如果你想让它真正发挥作用(捕捉公网攻击),你需要做两件事:

  1. 端口转发:在你的防火墙或路由器上,把外网的22端口流量转发到这台机器的2222端口。
  • 注意:一定要把宿主机真实的 SSH 端口改到别的地方(比如 22022),否则你会把自己锁死!
  1. 自定义配置:修改挂载出来的etc/cowrie.cfg文件。你可以修改蜜罐的主机名(Hostname),甚至可以上传一些假的/etc/passwd文件让黑客觉得这台机器有很多用户。

总结

现在你拥有了一个属于自己的“捕鼠笼”。哪怕只是开在 2222 端口并暴露在公网一天,你可能会惊讶地发现,互联网上有多少自动化的僵尸网络在无休止地进行扫描和爆破。

延申:如果你擅长 Go 语言,可以写一个小工具(或者使用现有的 Logstash/Filebeat),读取cowrie.json并发送到钉钉/企业微信群里面。这样一旦有人攻入蜜罐,你手机上就能收到实时报警。

代码示例

packagemainimport("bytes""encoding/json""fmt""log""net/http""strings""time""github.com/hpcloud/tail")// Config 配置项const(// 修改为你的 Cowrie 日志实际路径LogFilePath="/opt/cowrie/var/log/cowrie/cowrie.json"// 修改为你的钉钉/企业微信/飞书 Webhook 地址// 这里演示的是钉钉机器人的格式WebhookURL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN_HERE")// CowrieLog 定义 Cowrie 日志的结构 (按需提取字段)typeCowrieLogstruct{EventIDstring`json:"eventid"`// 事件ID,如 cowrie.login.successSrcIPstring`json:"src_ip"`// 攻击者IPMessagestring`json:"message"`// 详细消息Timestampstring`json:"timestamp"`// 时间Usernamestring`json:"username,omitempty"`// 尝试的用户名Passwordstring`json:"password,omitempty"`// 尝试的密码}funcmain(){fmt.Printf("🛡️ Cowrie Watchdog started. Monitoring: %s\n",LogFilePath)// 配置 Tailt,err:=tail.TailFile(LogFilePath,tail.Config{Follow:true,// 实时跟随ReOpen:true,// 如果文件被轮转(logrotate),自动重新打开MustExist:true,// 文件必须存在Poll:true,// 使用轮询模式,兼容性更好})iferr!=nil{log.Fatalf("无法监听日志文件: %v",err)}// 循环读取每一行新日志forline:=ranget.Lines{processLogLine(line.Text)}}// processLogLine 处理单行日志funcprocessLogLine(textstring){varentry CowrieLog// 解析 JSONiferr:=json.Unmarshal([]byte(text),&entry);err!=nil{// 忽略解析错误的行(可能是非 JSON 格式的干扰)return}// === 核心逻辑:定义你关心的报警规则 ===// 规则 1: 黑客登录成功 (最危险!)ifentry.EventID=="cowrie.login.success"{alertMsg:=fmt.Sprintf("🚨 **入侵警报** 🚨\n黑客已成功登录蜜罐!\nIP: %s\n账号: %s\n密码: %s",entry.SrcIP,entry.Username,entry.Password)gosendAlert(alertMsg)fmt.Println("[ALERT] Login Success detected!")}// 规则 2: 黑客正在输入命令 (可以监控由于好奇产生的操作)// if entry.EventID == "cowrie.command.input" {// // 这里可以做一些简单的命令过滤,防止刷屏// fmt.Printf("[Monitor] %s 正在执行: %s\n", entry.SrcIP, entry.Message)// }}// sendAlert 发送 Webhook (以钉钉为例)funcsendAlert(contentstring){// 构造钉钉的消息体payload:=map[string]interface{}{"msgtype":"text","text":map[string]string{"content":content,},}payloadBytes,_:=json.Marshal(payload)// 发送 POST 请求resp,err:=http.Post(WebhookURL,"application/json",bytes.NewBuffer(payloadBytes))iferr!=nil{log.Printf("发送报警失败: %v",err)return}deferresp.Body.Close()}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 12:06:50

OpenPLC在工业自动化中的应用:入门必看指南

用树莓派和代码改变工控世界:OpenPLC实战入门全解析你有没有遇到过这样的困境?想学PLC编程,却被西门子、三菱的专用软件卡住;做个自动化小项目,一整套控制器动辄上千元;写个控制逻辑还要被厂商闭源系统“黑…

作者头像 李华
网站建设 2026/6/9 22:37:35

数字频率计入门必看:基本原理通俗解释

数字频率计入门必看:从零搞懂“测频”背后的硬核逻辑你有没有遇到过这种情况——手头一个信号发生器输出的波形,示波器上看周期挺稳,但就是不知道具体是多少Hz?或者做单片机项目时,想确认某个PWM频率是否准确&#xff…

作者头像 李华
网站建设 2026/6/9 21:14:36

信息速览:你的图表烂吗?

原文:towardsdatascience.com/information-at-a-glance-do-your-charts-suck-8b4167a18b88 让我们面对现实:你辛苦工作的那份报告——没有人真的会去读它。 在最佳情况下,人们可能会快速浏览,在色彩鲜艳的图表的吸引下短暂停留。…

作者头像 李华
网站建设 2026/6/9 21:15:12

OpenMV与CNN轻量网络集成实践指南

让摄像头学会思考:OpenMV上跑通轻量CNN的实战全记录 你有没有想过,一块不到50美元的小板子,配上一个微型摄像头,就能在毫秒内识别出眼前物体,并自主做出决策?这不是科幻,而是今天嵌入式AI已经能…

作者头像 李华
网站建设 2026/6/9 22:40:03

JFlash下载程序步骤在PLC系统中的操作指南

JFlash烧录实战:在PLC系统中高效完成固件写入的完整指南你有没有遇到过这样的场景?调试一个PLC板子,改了代码重新编译,结果下载失败;或者产线批量烧录时,总有几块板子“掉队”,反复提示校验错误…

作者头像 李华
网站建设 2026/6/9 22:40:09

精通ADF:巧用Filter活动条件过滤文件

在Azure Data Factory (ADF) 中,利用Get Metadata、Filter和Foreach活动来处理文件是一个常见的操作。当你需要从大量文件中挑选出特定的文件时,如何正确地设置Filter活动的条件就显得尤为重要。本文将通过实际案例来探讨如何在ADF中高效地使用Filter活动的条件。 案例背景 …

作者头像 李华