本文目录导读:

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系统的凭证窃取攻击。
实现步骤:
- 用Flask/Django建立虚假登录页
- 表单提交时记录字段并进行欺骗性响应
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,形成“诱捕-识别-阻断”的防御链条。