Python案例做蜜罐?

wen 网络安全 41

本文目录导读:

Python案例做蜜罐?

  1. 目录导读
  2. 蜜罐技术核心概念与Python优势
  3. 环境搭建与基础监控脚本
  4. 实战案例:SSH弱口令诱捕蜜罐
  5. 进阶案例:Web应用虚假登录表单蜜罐
  6. 数据收集与攻击行为分析
  7. 安全部署与法律合规要点
  8. 常见问题问答(FAQ)

Python案例做蜜罐:从零构建企业级网络安全陷阱系统

目录导读

  • 蜜罐技术核心概念与Python优势

  • 环境搭建与基础监控脚本

  • 实战案例:SSH弱口令诱捕蜜罐

  • 进阶案例:Web应用虚假登录表单蜜罐

  • 数据收集与攻击行为分析

  • 安全部署与法律合规要点

  • 常见问题问答(FAQ)


蜜罐技术核心概念与Python优势

什么是蜜罐?
蜜罐是一种主动防御技术,通过模拟易受攻击的服务、系统或网络资源,诱使攻击者主动接触,从而记录其行为、手法和工具,与被动防御(如防火墙、IDS)不同,蜜罐核心价值在于欺骗、诱捕与溯源

为什么选择Python?

  • 快速原型:语法简洁,可7行代码实现一个监听端口
  • 丰富库支持:socket / http.server / scapy / paramiko
  • 跨平台:Linux/Windows/macOS均可运行
  • 社区资源:GitHub上已有大量开源蜜罐项目可直接二次开发

核心逻辑架构
监听端口 → 解析协议 → 记录IP/时间/数据包 → 触发告警 → 保存日志


环境搭建与基础监控脚本

环境要求:Python3.8+,基础网络知识,一台可被外部访问的云服务器(建议使用低配轻量云,避免高并发误伤业务)

基础脚本:全端口原始数据监听

import socket
import datetime
def raw_honeypot(host='0.0.0.0', port=2222):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((host, port))
    sock.listen(5)
    print(f"[*] 蜜罐已启动:监听 {host}:{port}")
    while True:
        client, addr = sock.accept()
        log_file = f"logs/{addr[0]}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
        with open(log_file, 'a') as f:
            f.write(f"时间:{datetime.datetime.now()}\nIP:{addr[0]}\n端口:{addr[1]}\n")
            try:
                data = client.recv(1024)
                f.write(f"原始数据:{data}\n")
                client.send(b"Welcome to Honeypot!\n")
            except:
                pass
            finally:
                client.close()
if __name__ == "__main__":
    raw_honeypot()

关键点

  • SO_REUSEADDR 防止端口被占用
  • 日志按IP+时间命名,防止覆盖
  • 后续可扩展为多线程处理并发连接

实战案例:SSH弱口令诱捕蜜罐

攻击场景:随机扫描SSH端口(22/2222)的自动化脚本,批量尝试root/123456等弱口令。

Python实现方案:模拟SSH握手但不提供真实shell

import paramiko
import threading
from paramiko import ServerInterface, Transport
class SSH_Honeypot(ServerInterface):
    def check_auth_password(self, username, password):
        log_attempt(username, password)
        return paramiko.AUTH_FAILED
def log_attempt(user, pwd):
    with open("ssh_attempts.csv", "a") as f:
        f.write(f"{datetime.now()},{client_ip},{user},{pwd}\n")
# 启动部分
server_socket = socket.socket()
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('0.0.0.0', 22))
server_socket.listen(100)
while True:
    client, addr = server_socket.accept()
    client_ip = addr[0]
    t = Transport(client)
    t.add_server_key(host_key)
    server = SSH_Honeypot()
    t.start_server(server=server)

细节优化

  • 返回随机延迟,混淆扫描工具(避免立刻断开被识别为蜜罐)
  • 记录密码本中高频率尝试的IP,加入黑名单告警
  • 设置host_key为伪造的真实长度,避免指纹异常

进阶案例:Web应用虚假登录表单蜜罐

适用场景:拦截针对公司VPN、邮箱、OA系统的凭证窃取攻击。

实现步骤

  1. 用Flask/Django建立虚假登录页
  2. 表单提交时记录字段并进行欺骗性响应
from flask import Flask, request, render_template_string
app = Flask(__name__)
LOGIN_PAGE = '''
<form method="POST">
  <input type="text" name="username" placeholder="用户名">
  <input type="password" name="password" placeholder="密码">
  <input type="submit" value="登录">
</form>
'''
@app.route('/login', methods=['GET', 'POST'])
def fake_login():
    if request.method == 'POST':
        ip = request.remote_addr
        user_agent = request.headers.get('User-Agent')
        data = {
            'time': datetime.now(),
            'ip': ip,
            'username': request.form['username'],
            'password': request.form['password'],
            'user_agent': user_agent
        }
        # 记录到数据库或文件
        save_to_db(data)
        # 返回“密码错误”而非“账号不存在”,增加攻击者尝试次数
        return "密码错误,请重试", 401
    return render_template_string(LOGIN_PAGE)
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=443, ssl_context=('cert.pem', 'key.pem'))

SEO提示:部署时使用HTTPS(自签名证书即可),否则会被浏览器标识为不安全而劝退攻击者。


数据收集与攻击行为分析

必须采集的数据维度

  • 时间戳、源IP、目标端口、请求载荷(前512字节)
  • 连接频率(用于识别扫描僵尸网络)
  • 攻击payload中的C2地址/矿池地址

分析工具链组合

蜜罐日志 → Elasticsearch → Kibana可视化仪表盘

或轻量方案:

日志文件 → Python Pandas分析 → 输出Top10攻击IP/密码频率

示例分析代码

import pandas as pd
df = pd.read_csv('ssh_attempts.csv')
top_ips = df['IP'].value_counts().head(10)
top_passwords = df['password'].value_counts().head(10)
print("攻击频率最高IP:", top_ips)
print("最常用密码:", top_passwords)

检查是否存在同一IP在5分钟内尝试超过50个不同密码的情况——可判定为暴力破解工具。


安全部署与法律合规要点

  • 隔离网络:蜜罐应部署在单独VLAN或DMZ区域,严禁与生产网络直连
  • 资源限制:使用ulimit限制每个连接的文件描述符数量,防止被反制
  • 日志保护:日志服务器与蜜罐分离,使用只追加权限
  • 法律红线
    • 必须在蜜罐服务器显著位置标注“此为研究系统,未经授权进入将被记录”
    • 不得存放真实用户数据(如客户信息、员工密码)
    • 建议提前咨询公司法律团队,部分国家禁止诱捕技术(如德国部分判例)

常见问题问答(FAQ)

Q:蜜罐会不会被用于攻击真实网络?
A:存在“跳板”风险,建议仅监听,不转发任何连接,如果需高级功能,使用iptables限制只出不进。

Q:python蜜罐与商业蜜罐(如T-Pot)相比弱点在哪?
A:缺少高交互能力(无法模拟Windows域控、路由设备),但对于中小公司,足够发现扫描、爆破、PoC验证攻击。

Q:如何让蜜罐看起来很“真实”?
A:添加陷阱文件(如_vti_cnf/config.bak)、模拟Banner(SSH版本、HTTP Server字段)、设置随机响应延迟。

Q:蜜罐日志每天几十万条,怎么汇总分析?
A:使用ELK或Loki+Grafana,轻量方案:Python脚本每5分钟聚合一次,对同一IP的并发数进行降噪。

Q:部署蜜罐后,我的服务器被攻击者用来DDoS别人怎么办?
A:设置每IP最大连接数20个,限制单IP每秒发包数,在iptables中加入OUTPUT链限制。


通过以上实践,你可以搭建具备实用性、可扩展性的Python蜜罐系统,关键在于持续优化欺骗逻辑日志分析闭环——检测到异常后,及时联动WAF或路由器封禁IP,形成“诱捕-识别-阻断”的防御链条。

抱歉,评论功能暂时关闭!