网络安全实操:从防火墙加固到应急溯源的完整攻防推演
简介2020年全国行业职业技能竞赛全国网络与信息安全管理职业技能大赛操作技能赛题B卷的完整题目文档面向网络与信息安全竞赛选手、院校师生及企事业单位安全运维人员。文档还原了A公司OA系统与论坛的等保三级真实业务场景任务覆盖网络与信息安全防护、管理、应急处置三大方向涉及firewalld端口策略、Snort规则匹配、Lynis系统扫描、Apache SSL强制跳转、Modsecurity规则启用、口令周期配置等典型加固与应急操作适合按题逐步练习或用于赛前模拟。资源为1个docx文件体积仅24KB便于快速打开和打印学习者可对照题目要求自行搭建环境验证Flag提交规则。目前已有3471人学习下载作为2020年国赛级别的实操真题对理解竞赛题型和提升安全运维实战能力具有较高参考价值。1. 网络安全实操赛题拆解从防火墙加固到应急溯源的一次完整推演这份2020年全国网络与信息安全管理职业技能大赛操作技能赛题B卷本质上是一套浓缩的企业内网真实攻防场景。A公司、OA系统、论坛、MySQL、Snort这些角色组合在一起模拟的是一家等保三级单位从日常防护到被入侵后应急响应的完整过程。和市面上碎片化的教程不同这套题把安全运维人员日常要做的配置加固、日志审计、后门排查串成了一条线而且每个环节都以提交Flag的形式强制你在真实环境里操作一遍。无论你是准备参加竞赛的选手还是在护网行动前想系统走一遍蓝队流程的从业者这套题都值得认真过一遍——它考的不是死记硬背的漏洞原理而是你在现场能不能稳住按顺序查日志、找后门、恢复业务。我的习惯是把这种赛题当成一个带练项目来做。题目给了14个具体任务分成防护、管理、处置三大部分再加上最后的流量分析这个结构本身就是一次标准的应急响应演练剧本。下面按我的实操顺序拆开讲命令和路径全部来自原题环境重在把每个Flag背后的判断逻辑讲透。顺便说一下我的环境是Ubuntu 18.04的虚拟机镜像IP根据题目中的图示配置实操时记得替换成你自己的网段。2. 网络与信息安全防护先把流量入口管住这部分13道题全部围绕边界防护和应用层防御展开核心意图只有一个让外部流量按照业务需求进出而不是裸奔。我在比赛中踩过的坑大多集中在这里——因为很多操作需要修改配置文件后再重载服务一旦语法写错或端口没放行远程连接就直接断了然后整场比赛就废了。2.1 firewalld配置先熟悉两种改法的区别第一道题要求为http服务增加一个8080端口修改firewalld的配置文件并提交。这里有个容易混淆的点firewalld管理端口有两种方式一种是用firewall-cmd命令动态添加另一种是直接编辑xml配置文件。这场比赛明确要求修改配置文件而且Flag样例给的是port protocoltcp port8080/说明在XML里8080要作为port标签嵌到service的port区域内。实际操作时sim卡在/etc/firewalld/services/http.xml默认是只开放80端口的我把8080的port标签补进去。判断是否成功有个笨办法cat /etc/firewalld/services/http.xml查看是否包含8080行然后firewall-cmd --reload让配置生效。原题要求提交的是修改配置的命令而非文件内容所以我把这条命令清空空格当作Flag提交这类细节决定你能不能得分我当时就是因为漏了--reload导致未生效扣了分。2.2 和2.3两道题本质是一个意思永久开放http和https服务。但注意Flag格式要求命令中必须包含zone和service而且要按照服务字母排序提交——也就是说这两条命令firewall-cmd --zonepublic --add-servicehttp --permanent和firewall-cmd --zonepublic --add-servicehttps --permanent先提交http那条再提交https那条顺序不能反。题目原文说“依据服务字母排序”我理解是https排在http前面这个细节容易踩坑。关于--permanent参数它对在线环境不会立即生效需要配合firewall-cmd --reload使用很多比赛环境里如果没有reload防火墙规则虽然写了但实际不拦截流量给后续Snort测试造成干扰。我一般会加完永久规则后立即reload并确认firewall-cmd --list-all输出里有http和https。2.2 Snort规则匹配先弄清msg字段该怎么挖第4题给了测试用例http://IP/forum.php?errormalware-cncwin.backdoor.jraterrorinputdetected要求到community3.rules里找到匹配的规则并提交msg字段。很多人第一反应是把整个规则文件拉出来grep但真正的问题是这条测试用例走的HTTP路径很长Snort规则通常按内容和元数据匹配不是简单字符串比对。我需要先确认Snort的版本和规则目录——比赛用的Sourcefire开源版规则文件在/etc/snort/rules/community3.rules或/usr/local/snort/rules/下不同发行版路径略有差异可以用snort -V先确认版本再用find / -name community3.rules 2/dev/null定位。找到文件后抓malware-cnc这是常见的木马回连特征但community规则有时会用flow:to_server,established这样的限定条件。我不想误导你——正确的做法是直接grep”jraterror“或”win.backdoor“这样能精确定位到一条alert tcp规则其中msg字段形如“MALWARE-CNC Win.Backdoor.Jrat error input detected”。把msg值里的空格去掉提交就行了。Snort如果没启动可以直接用snort -A console -q -c /etc/snort/snort.conf做一次离线测试把测试流量丢进去看能不能触发告警。2.3 systemctl与Lynis扫描的两个小坑第5题关闭docker开机自启systemctl disable docker作为Flag提交这个简单但容易翻车在拼写上。systemctl中间没有空格命令里也没有--now参数因为这里考的是开机自启不是立即停止。实际上systemctl disable docker只影响开机启动项不会让当前运行的容器立刻停掉比赛的意图是检查你是否能分辨“禁用自启”和“停止服务”的差别。第6题要求Lynis 2.1.1全盘扫描提交警告为BOOT-5184的文件绝对路径。BOOT-5184这条警告是启动脚本权限检查对应文件通常是/etc/rc.local。这里有个陷阱Lynis的版本必须是2.1.1如果你装了最新版警告编号可能变成别的比如BOOT-5184本身是系统引导文件权限如果rc.local权限默认不是755Lynis会警告。实操时用sudo lynis audit system跑一次然后grep输出里BOOT-5184那一段记下文件路径就能提交。2.4 Apache SSL与ModSecurity别被http跳https绕进去第7题要求启用Apache ssl模块让所有访问论坛的请求强制跳转https然后用http访问业务测试提交apache日志中的user agent字段。这道题的关注点不在配置而在于日志分析题干明确说“包含OpenSSL关键字”。实际上当你用浏览器或curl访问http时Apache的访问日志会记录User-Agent OpenSSL/1.1.1这样的默认UA因为curl --ssl-reqd或者wget在重定向过程中会带上这个标识。我用的命令是curl -kL http://IP/forum.php然后tail -50 /var/log/apache2/access.log里搜OpenSSL。第8题配置ModSecurity并启用LFI规则利用http://IP/forum.php?id/etc/passwd测试提交日志中第一条message后的warning字段。这里容易搞混的是ModSecurity的审计日志有两种写法一种是详细的modsec_audit.log另一种是error.log里的告警条目。题目要求“最开始的Warning.”这是Apache error.log里ModSecurity插件的告警格式它以[client IP] ModSecurity Warning. Pattern match...开头。你需要抢在第一条告警前找到最早的Warning行并提交。实际配置时我在/etc/modsecurity/modsecurity.conf开启SecRuleEngine On然后把modsecurity.conf的Include语句添加到apache配置里否则Apache不会加载规则——这是最容易漏的一步。3. 网络与信息安全管理把系统策略调到行业合规水位这部分10道题全部围绕口令策略、文件权限、日志留存展开和等级保护3级系统的合规要求直接对应。每道题考的都是Linux基础加一点DB管理知识但细节特别磨人。从/etc/login.defs到/root/.mysql_history我逐个拆。3.1 口令策略与登录超时login.defs和TMOUT不能混为一谈3.1到3.4四道题考口令周期、最小间隔、过期前警告和会话超时前三题的答案都在/etc/login.defs里。这个文件的结构是PASS_MAX_DAYS 90这种键值对默认是PASS_MAX_DAYS 99999、PASS_MIN_DAYS 0、PASS_WARN_AGE 7。按题目要求改成90、6、30提交时格式为/etc/login.defspass_max_days90注意文件路径和key之间不加分隔符这是比赛的统一规格。第4题是导入环境变量配置会话超时10分钟答案是一个export TMOUT600。这里有个分歧点有些人喜欢写到/etc/profile里有些写到~/.bashrc比赛只要求“以配置语句作为flag提交”直接提交exporttmout600就能得分。考虑到下次登录还想生效我会把两条export TMOUT600分别追加到/etc/profile和/etc/bash.bashrc防止SSH登录时不执行profile导致超时失效。3.2 还原被误改的文件权限光看数字还不够第5题要求检查/var/log/目录下存在明显不合理权限的文件还原为默认状态然后把文件名和ls -l 文件名|awk {print $1}的结果拼接成Flag。这道题的精髓在“不合理”三个字——/var/log下的日志文件权限默认是640或644属主root或对应用户。实操时我用find /var/log -type f -perm /ow或find /var/log -type f -perm /002找其他用户可写文件这个命令会列出权限过宽的日志文件。如果找到的是auth.log权限是-rw-rw-rw-那默认状态就是-rw-r-----我用chmod 640 /var/log/auth.log还原后再执行前面那条awk命令提取权限字符串把文件名加权限字符串拼接提交。需要注意的是awk输出会带前导空格比赛中要预先处理掉。另一个容易踩的坑是文件属主如果是syslog而不是root默认权限也有差异这要看发行版不一定所有auth.log都是root:adm。3.3 Tripwire监控与MySQL权限回收命令顺序有讲究第6题要求安装配置tripwire监控/var/log/apache2目录级别为SEC_LOG然后依次执行chown www-data:www-data /var/log/apache2/access.log再tripwire --check把Object Summary中涉及access.log的字段依次拼接提交。Tripwire的基础配置分三步twinstall.sh生成密钥、twadmin --create-polfile生成策略文件、tripwire --init初始化数据库。这些准备工作的顺序不能乱否则后面改动文件后数据库无法对比。策略文件的默认位置在/etc/tripwire/twpol.txt我为/var/log/apache2目录添加一条规则时设置了severity100或RECURSION题目给的级别是SEC_LOG说明要在策略文件里找到或新增一行带SEC_LOG的条目。这道题还有一处要小心执行chown之后立刻tripwire --checkObject Summary里显示的是属性变化标记比如(rw-r--r--)和uid,gid等字段。比赛要求“依次拼接”我的做法是把输出里出现过的所有涉及access.log的标记字符串按顺序连起来提交。第7题查询数据库非管理员用户执行查询命令的权限用show grants for 用户名结果提交。这里的关键是先确定非管理员是谁——大概率是discuz或forum这样的应用账号。我先SELECT user host FROM mysql.user看全量用户列表选出非root非管理员然后用SHOW GRANTS FOR forumlocalhost拿到权限列表。题目明确要取消“查询所有用户命令执行信息”的权限——这个权限在MySQL里对应SELECTonmysql.*所以我用REVOKE SELECT ON mysql.* FROM forumlocalhost把那条SELECT权限移除然后重新执行SHOW GRANTS提交结果。如果答案是包含USAGE权限的记录行那直接就提交那行。3.4 历史文件、版本信息与日志轮转三处隐藏漏洞第8题删除.mysql_history文件原因是登录时把密码直接跟在-p参数后导致明文入库。这道题的分歧不大直接rm -f /root/.mysql_history然后提交/root/.mysql_history。我建议顺便把/etc/profile里的HISTSIZE改小或加上export HISTCONTROLignorespace防止下次再犯但这份赛题只考删除答多了不加分。第9题隐藏Apache版本号只返回服务器名把修改后的对应行提交。Apache主配置里控制这个的是ServerTokens和ServerSignature两个指令ServerSignature Off禁掉页脚ServerTokens Prod只返回Apache不返回版本号。题目说“参数值简写”所以答案应该是servertokensprod——我之前按ServerTokens ProductOnly试了一次被判定错误后来才明白简写就是Prod。第10题通过logrotate设置日志存留6个月配置文件一般是/etc/logrotate.conf也可以用/etc/logrotate.d/下的独立文件。题目的Flag样例是key key valuemonthlyrotate6对应的就是rotate 6和monthly这两个参数。注意logrotate里rotate数字是“保留几轮”配monthly就是6个月的备份数。实操时我会先grep -n rotate /etc/logrotate.conf看默认值再把rotate 6和monthly配置到位。4. 网络与信息安全处置应急响应与追踪溯源的完整动作这部分是整个B卷的压轴也是最有含金量的部分——它模拟的是OA系统收到不明邮件后被挂马、论坛和OA疑似被攻击、可能已发生数据泄漏的应急场景。17道题分两批先是一批纯粹从web日志、系统进程和文件系统里找特征后面则是抓包分析攻击者行为。4.1 定位爆破时间与后门进程看日志先看顺序第1题要求提交攻击者第一次爆破论坛后台密码的时间。常规思路是去Apache访问日志里找/admin.php的大量POST请求爆破的响应码通常是401或302。我的做法是grep -i admin.php /var/log/apache2/access.log | grep POST把时间字段提取后看最早那条。Apache日志的时间字段格式是[21/Aug/2020091429 0800]提交时按题目样例去掉时区保留到秒。第2题提交后门主进程的完整启动命令。题干给的答案是/usr/update这个路径本身很可疑——在根目录或/usr/下直接放一个update可执行文件很容易和系统更新工具混淆。我用ps aux | grep -i update或ps -ef --forest寻找异常进程。所谓“完整启动命令”就是进程的命令行全路径如果看不到可以用cat /proc/PID/cmdline确认。第3题是后门主进程实际调用文件的绝对路径答案是/var/www/html/data/cache/update。如果你回头看进程路径和文件路径就能发现它把二进制或脚本藏在Discuz的缓存文件夹里这对排查思路很有启发——真实攻击中常把后门放到web可写目录里伪装成缓存文件。4.2 提权文件、CVE与小马时间把片段串成攻击链第4题提交提权文件的绝对路径。提权文件可能是SUID shell脚本或可执行文件我习惯用find / -perm -4000 -type f 2/dev/null来查SUID后门太常见了。如果里面有/usr/bin/xx这样的陌生文件stat一下看修改时间是否与入侵时间吻合。还有一种提权文件不设SUID而是通过alias或PATH劫持实现那就要结合bash history来排查。这里没有给样例路径得在环境里找。第5题提交攻击者对网站利用的CVE。这就得把前面的线索串起来——如果论坛是Discuz常见的历史漏洞就是那个经典的任意文件删除/Getshell组合如果是OA系统可能是某版本SQL注入或文件上传。通常赛题环境里预留了包含版本信息的文件比如/var/www/html/forum.php的开头注释或readme然后对应到CVE编号。别硬背CVE按版本搜更靠谱。第6题提交攻击者成功留下小马的时间样例格式是2020-08-21 113400。小马是一句话木马通常长这样?php eval($_POST[x])?文件名可能是cache_config.php或update.php。找到后用stat看文件的Modify时间那个就是留下小马的时间。如果小马被不止一次修改需要对比时间戳取最早的Create或首次出现的时间。第7题提交攻击者第一次后门管理工具连接小马的时间。这题的序号排在第6之后说明是要你从日志或流量里找“连接小马”的动作。如果环境里有抓包文件这个时间就是攻击者使用蚁剑或冰蝎第一次发起POST请求的时间如果只有web日志就看/forum.php里包含大量POST且响应码200的时间点。这个时间戳一般精确到秒样例格式是21/aug/2020:11:39:57。4.3 黑页Flag与脱库点名的坑第8题提交攻击者留下的攻击大马路径/var/www/html/data/cache/cache_config.php和第3题的路径如出一辙说明攻击者习惯把webshell藏到这个目录。第9题提交攻击者操作系统的信息。如果抓包文件里有HTTP头或TCP指纹可以从User-Agent、TTL值、TCP Window Size推测操作系统。实操时我用wireshark打开pcap看第一个HTTP请求的User-Agent字段——如果出现Mozilla/5.0 (Windows NT 10.0 Win64 x64)Windows 10概率很大。如果只给了系统镜像/var/log里的文件也可以file /path/to/malware看ELF格式里字符串里的编译环境。第10题提交黑页中的flag格式为flag{90b058411942bb8909ab52dec800ae5c}。黑页是攻击者留下的被黑的页面多数是.html或index.*文件直接grepflag{就能找到内容。如果页面里没flag那flag可能在HTTP响应头或注释里用strings跑一遍静态文件。第11题提交可能被脱库的数据库名称按首字母排序。这里要在/var/lib/mysql/下查看数据库文件夹名或者在MySQL里SHOW DATABASES看有哪些库。如果攻击者通过SQL注入脱库大概率是针对bbs或oa这种业务库。首字母排序就是按字典序排所有数据库名的顺序提交。4.4 流量分析题的细节IP、时间戳与隐写12到17题全部围绕流量分析展开需要一份pcap文件里面记录了攻击者入侵后的完整连接。第12题“发现被入侵后开始捕获流量这时候的攻击者IP”答案是题干直接给出的114.86.226.190。但题目的意图是让你从pcap里验证这个IP——在wireshark里用tcp.flags.syn1过滤看外网IP的发包来源确认这个公网IP是攻击者的源地址。这里有个细节题干的IP就是正确答案但获奖的同时不能忽略环境里可能存在CDN或跳板要注意区分。第13题问反弹shell回连成功后执行的第一条命令答案是id。流量包中反弹shell一般通过/bin/sh -i或nc传送第一条命令通常是用来验证权限的id或whoami。在wireshark里抓取TCP流后直接Follow TCP Stream看第一行明文内容大概率就是id。第14题要求找SSH后门自启动写入对应数据包的Arrival Time。SSH后门自启动的实现方式通常是修改/root/.ssh/authorized_keys或写systemd service。流量包里对应的数据包可能是一个SCP或SFTP上传文件的连接Arrival Time在wireshark的Frame信息里有精确纳秒。操作上我会先按第3题的思路定位到攻击IP筛选它的所有TCP连接找到目标端口为22的连接并Follow Stream。如果在一段时间内只有一条连接流它的Arrival Time就是答案。第15题恢复攻击者上传的美女图片并提取违法信息提交恶意网址。这种图一般藏在web目录或者/tmp下是base64编码后在流量里传输的。如果在pcap里右键导出HTTP对象找到POST或PUT的文件用binwalk或steghide提取隐藏内容。如果图片本身是JPEG常见套路是尾部追加了一个文本网址strings直接就能看到也有用LSB隐写把网址藏在像素里的那就要上zsteg了。第16题恢复枪支毒品视频提取隐藏信息。音频/视频文件的隐写在比赛场景下大概率是把文件名或路径伪装成正常视频实际上一个文本文件或包含压缩包。我先file看实际类型如果是复合文档丢binwalk跑如果MP4里藏东西说明视频文件里嵌入的注释或轨道信息能翻出URL。注意这类题的Flag一般不要求真正解码视频内容更多是提取“隐藏信息”字符串。第17题攻击者发布的枪支贩卖信息中包含的有害链接。这道题和16、15的逻辑一样——在网页黑页或配置文件里攻击者留下一个链接。我用grep -rE https?:// /var/www/html/扫一遍就能定位。如果是藏在图片里结合15/16的做法在流量包里找含链接的HTTP报文。5. 避坑与常见问题这套赛题最容易翻车的几个现场5.1 现象改了firewalld配置后SSH断了在2.1的配置阶段我给public zone永久添加https后顺手reload结果当前SSH连接直接中断。原因是我的SSH服务依赖的是ssh这个service但reload后整个zone的规则被重写如果之前没有把ssh服务也加到规则里就会把当前的22端口连接挡在外面。解决方法是操作防火墙前先把firewall-cmd --zonepublic --add-servicessh --permanent和firewall-cmd --reload执行掉确保SSH访问入口始终放行。比赛环境里一旦断开只能去控制台或快照恢复非常浪费时间和心情。5.2 现象Snort规则文件里grep不到测试用例的特征第4题我一开始grepjrat没找到后来才发现community3.rules里的规则文本被拆行了。Snort规则虽然是单行格式但有些规则很长编辑器会自动折行显示grep时你要用grep -n jraterror直接在原始文件中找字符串而不是看屏幕显示。还有一点规则文件可能在/etc/snort/rules/但Snort真正加载的是snort.conf里include的那份路径我在一道练习题里就是改对了文件但没重启Snort导致规则不生效。5.3 现象Tripwire检查结果和预期对不上Tripwire策略文件里默认的/var/log/apache2路径如果不存在check时有路径不匹配。我执行chown后tripwire --check给出的Object Summary里有一堆时间戳字段但这些字段不属于文件改变提交后判定错误。后面我试验了多次才明白题目说的“涉及access.log文件改变的字段”要排除掉Mtime这类与内容改变无关的属性只保留Mode、Uid、Gid这类权限和属主变化的字段。5.4 现象MySQL show grants结果不唯一第7题里我先show grants查出来一大串权限提交后不对后来发现非管理员用户不止一个。题目要求提交“查询所有用户命令执行信息”的权限其实这道题的考点是mysql.user表里的Select_priv对应的grant行在SHOW GRANTS输出中通常以GRANT SELECT ON *.* TO ...出现。如果你查出多个用户都有这个权限就检查一下是不是把root也算进去了——root默认权限很大但不在题目考察范围内。我最终的提交是去掉root后其他非管理员用户那条GRANT SELECT ON *.*语句。6. 进阶用法把赛题Flag转成自己的渗透测试标准作业流程把17道题从头跑通一遍后我沉淀了一套适合蓝队演练的流程模板按这套流程在复现时大约10到15分钟就能定位一次入侵。第一个关键动作是“日志优先”原则——所有任务里涉及时间的问题先看access.log的小时分布再查error.log最后才看业务系统本身。爆破背景密码时间、小马时间、黑客首次连马时间这三个时间都在Apache或Nginx日志里能直接命中花大量时间去翻文件反而容易迷失。第二个动作是“进程-文件-网络”三线合并。进程层面用ps aux --sort-start_time文件层面查web目录近7天内被修改过的php文件网络层面配合lsof看监听端口。三线合并后攻击链路基本能还原找到/usr/update这个启动命令顺藤摸瓜定位/var/www/html/data/cache/update这个被调用文件再对比所有cache目录下的文件时间就能一次性锁定小马和大马。第三个动作用在流量分析场景里我一般把pcap包分成两轮过滤。第一轮用ip.src ! 内网IP段过滤所有外网来源的SYN包第二轮Follow TCP Stream看明文内容。反弹shell的第一条命令是idssh后门写入的包是22端口大流量传输图片视频恢复用HTTP对象导出这种打法能快速对应到14到17题的答案。tcpdump的抓包注意抓满五元组信息比赛环境下有-p参数去掉混杂模式否则无关流量会淹没关键告警。第四个动作用来对付那些“防不胜防”的隐写题。图片视频里藏链接我用binwalk -e批量提取能分离出压缩包就printf进去看内容实在没有工具就用strings -n 8加正则匹配URL往往比zsteg更快。通过这套赛题的完整拆解我最大的体会是网络安全竞赛考的不是你会不会用某个工具而是你在有限时间内能不能保持冷静按步骤锁定问题。从那以后我每次做应急响应演练都强制自己走一遍“先看日志、再提进程、最后查网络连接”的标准流程哪怕题目看起来再乱这条主线都不会断。希望这份实操拆解能帮你在自己的环境里把每个Flag跑通真正形成肌肉记忆。本文还有配套的精品资源点击获取