1. 从“混子”心态到“生存专家”的转变
“安心做awd混子”——这个标题,我第一眼看到时,会心一笑。在网络安全竞赛,尤其是AWD(Attack With Defense,攻防兼备)模式的国赛分区赛现场,这种心态太真实了。很多初次参赛的同学,面对高强度、快节奏的攻防对抗,看着大佬们手指翻飞、屏幕刷屏,自己却连靶机环境都还没摸熟,那种无力感和“躺平”的念头就会油然而生。但我想说,所谓的“混子”,恰恰是AWD生态中最具成长潜力的一群人。因为“混”不是目的,而是一种在高压环境下,基于自身能力边界,实现团队价值最大化和个人生存最优化的策略。这篇文章,我就从一个“老混子”的角度,复盘一下国赛分区赛AWD的生存法则,告诉你如何从一个被动挨打的“真混子”,进化成一个让对手头疼、让队友放心的“生存专家”。
AWD赛制,尤其是国赛级别的,其残酷性在于它的实时性和对抗性。你的系统在被打,同时你也要去打别人的系统。得分来源于防守(服务不被攻破)和攻击(获取对手的flag)。对于新手或非核心选手而言,盲目追求攻击得分往往死得更快。正确的思路是:先立于不败之地,再求战。你的核心KPI不是拿了多少攻击分,而是在比赛结束时,你的服务还在正常运行,并且为团队贡献了稳定的防守分。这就是“安心做awd混子”的哲学内核——认清定位,聚焦生存,在团队中扮演一块坚固的“基石”。
2. 赛前准备:你的“混子”生存包
上战场前,连装备都不熟悉,那只能是炮灰。对于立志“稳健混分”的选手,赛前准备比追求炫技更重要。这里没有高深的漏洞利用,只有确保你能活下来的基本功。
2.1 环境与工具标准化配置
比赛一开始,给你的一般是纯净的虚拟机镜像或者远程主机权限。前15分钟,是黄金准备期。你必须像肌肉记忆一样完成以下操作:
- 系统信息速查:第一时间执行
uname -a、cat /etc/issue、cat /proc/version,了解系统版本、内核信息。接着ps aux、netstat -antlp(或ss -tlnp),快速摸清当前运行的服务、开放端口和对应进程。这个清单就是你最初的“资产地图”。 - 备份!备份!备份!:这是“混子”第一铁律。在尝试任何修复或加固前,必须备份关键目录。通常包括:
- Web目录:
/var/www/html、/opt/下的项目等。 - 配置文件:
/etc/下相关服务的conf文件,如nginx/apache的配置、数据库my.cnf等。 - 网站源码:使用
tar -zcvf backup_$(date +%Y%m%d_%H%M%S).tar.gz /path/to/webroot进行打包。备份文件不要放在web目录下,最好放到/tmp或者自己的家目录,并修改权限为600。
- Web目录:
- 工具包预部署:在本地或跳板机准备好一个工具包,包含以下内容,并通过scp或sftp快速上传到比赛机器。
- 扫描与监控类:
nmap(端口扫描)、dirsearch/gobuster(目录扫描)、clamav(病毒查杀,但注意资源占用)。 - 文件分析类:
strings、file、binwalk(分析二进制文件)、radare2或cutter(简单反编译)。 - 流量分析类:
tcpdump(抓包)、wireshark(分析包,可先在本地装好)。 - Web辅助类:浏览器插件如HackBar、EditThisCookie、Wappalyzer。
- 脚本集合:自己整理的Python/Bash脚本,用于批量改密码、批量查找后门、监控文件变化等。
- 扫描与监控类:
注意:比赛环境可能限制外网访问,甚至禁止某些工具。因此,依赖离线包和静态编译的工具是关键。赛前应将常用工具的静态编译版本(如static build的nmap、busybox)放入工具包。
2.2 脆弱性快速自查清单
拿到服务后,不要急着去读复杂的业务代码。先进行一轮“表面体检”,解决那些显而易见的、会被自动化脚本瞬间打穿的问题。这能帮你守住最初的几轮攻击。
- 默认与弱口令:这是丢分重灾区。立即检查:
- 数据库(MySQL/Redis等):root/空密码、root/root、test/123456等。
- Web后台:admin/admin、admin/123456。
- 系统用户:检查
/etc/passwd和/etc/shadow,看是否有空口令(::)或弱口令用户。用hydra(谨慎使用,可能触发防护)或自己写脚本改。 - 实操心得:我通常准备一个Python脚本,读取一个常见的弱口令字典,通过SSH或者Web API接口(如果存在)去批量尝试修改密码。修改密码的命令也要复杂化,避免被逆向。例如,不用简单的
echo "newpass" | passwd --stdin user,而是用openssl生成随机密码:NEW_PASS=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16); echo "user:$NEW_PASS" | chpasswd,并立即将新密码记录到本地安全文件中。
- 不必要的服务:关掉一切非必需的服务。用
systemctl list-unit-files --type=service查看,将nginx、mysql、redis、tomcat等必需服务外的所有服务stop并disable。特别是ftp、telnet、rpcbind这些古董服务,往往是突破口。 - 权限最小化:
- Web目录权限:确保运行Web服务的用户(如www-data, nginx)对网站文件只有读和执行权限,没有写权限。上传目录单独设置,且禁用脚本执行。
- 数据库权限:撤销远程root登录,创建仅具有必要操作权限的专用用户。
- 踩坑记录:有一次比赛,PHP网站的上传目录设置了777权限,且没有禁用PHP执行。攻击者上传了一个
.user.ini文件,里面设置了auto_prepend_file为上传的Webshell,导致整个目录下的所有PHP文件都被污染。教训是:上传目录必须设置为755,用户为root,并通过nginx/apache配置location ~ ^/uploads/.*\.(php|php5|jsp)$ { deny all; }来直接禁止脚本执行。
3. 赛中防守:构建你的“混子”堡垒
比赛进入中盘,攻防节奏加快。此时你的目标不是找出所有漏洞,而是建立有效的监控和响应机制,确保已知漏洞被堵上,并能快速发现异常。
3.1 文件完整性监控与后门排查
攻击者一旦入侵,必然会留下后门。手动排查效率太低,必须借助自动化监控。
- 建立文件基线:在确认环境初步安全后(即完成2.2的检查),立即对关键目录建立哈希基线。
find /var/www/html -type f -name "*.php" -exec md5sum {} \; > /tmp/web_baseline.md5。将/tmp/web_baseline.md5备份到本地。 - 周期性对比与告警:写一个简单的Shell脚本,定期(如每2分钟)重新计算哈希,并与基线对比。
将脚本加入#!/bin/bash BASELINE="/tmp/web_baseline.md5" CURRENT="/tmp/web_current.md5" find /var/www/html -type f -name "*.php" -exec md5sum {} \; > $CURRENT diff $BASELINE $CURRENT if [ $? -ne 0 ]; then echo "[$(date)] 文件变更告警!" >> /tmp/alert.log diff -u $BASELINE $CURRENT >> /tmp/alert.log # 可以在这里加入自动恢复机制:从备份中还原被修改的文件 # tar -xzf /path/to/backup.tar.gz -C / var/www/html/path/to/changed/file ficrontab:*/2 * * * * /path/to/monitor.sh。 - 后门特征扫描:使用
grep、awk等命令快速扫描可疑内容。- 查找包含
eval(、assert(、system(、exec(、passthru(、shell_exec(、popen(等危险函数的文件:grep -r "eval\s*(" /var/www/html --include="*.php"。 - 查找包含
base64_decode且长度较长的字符串:grep -r "base64_decode" /var/www/html --include="*.php" | head -20。 - 查找最近被修改的文件:
find /var/www/html -type f -name "*.php" -mmin -5(查找5分钟内修改过的文件)。
- 查找包含
- 隐藏后门与进程排查:高手会隐藏后门。检查
/etc/init.d/、/etc/cron.hourly/、/etc/systemd/system/下是否有可疑的自启动脚本。用ps auxf查看进程树,注意异常父进程(如由apache启动的/bin/bash)。用lsof -p <pid>查看进程打开的文件和网络连接。
3.2 网络与日志监控
防守不能只盯着文件系统,网络流量和日志是发现攻击行为的另一双眼睛。
- 实时日志监控:
tail -f是你的好朋友。- Web日志:
tail -f /var/log/nginx/access.log | grep -v "\.(css|js|jpg|png)"过滤静态资源,关注动态请求。 - 认证日志:
tail -f /var/log/auth.log或/var/log/secure,关注SSH暴力破解和异常登录。 - 技巧:使用
grep过滤高频攻击payload,如tail -f access.log | grep -E "(union.*select|sleep\(|benchmark|\.\./)",可以快速发现SQL注入、路径遍历等攻击尝试。
- Web日志:
- 网络连接监控:使用
watch -n 1 'netstat -antp | grep ESTABLISHED'每秒刷新查看已建立的连接,注意异常的外联IP和端口。如果发现可疑外联(如连接到对手IP的奇怪端口),立即用iptables封禁:iptables -A OUTPUT -d <对手IP> -j DROP。 - 简易入侵检测:写一个脚本监控
/tmp、/dev/shm等可写目录下新增的可执行文件。监控/etc/passwd和/etc/shadow的变更(用inotifywait工具)。
3.3 漏洞应急响应:从“被打”到“修复”
即使监控再严密,也可能被突破。这时,一个标准的应急响应流程能帮你快速止损。
- 确认失陷:监控告警 or 发现服务异常 or 防守分持续下跌。
- 隔离与取证:
- 立即备份当前状态:在修复前,先对当前被攻破的环境进行快照(如果平台支持)或打包关键目录和日志,用于赛后分析。
- 对比文件基线:快速运行对比脚本,定位被修改、新增的文件。
- 分析异常进程与连接:用
netstat和ps找到可疑进程,记录其PID、执行路径、网络连接。
- 清除与恢复:
- 杀进程:
kill -9 <可疑PID>。 - 删后门:删除监控发现的所有可疑文件。注意检查文件是否设置了
immutable属性(lsattr,用chattr -i解除)。 - 恢复文件:从赛前或上一个健康备份中,还原被篡改的源文件。这是“混子”的核心技能——快速回滚到安全版本。
- 堵漏洞:根据攻击流量(日志)和后门特征,反推可能的漏洞点。如果是已知CMS,立即搜索公开漏洞和补丁。如果是代码审计发现的漏洞,临时修补(如增加输入过滤、禁用危险函数)。
- 杀进程:
- 加固与验证:
- 修改所有可能被爆破的密码。
- 复查权限设置。
- 重启相关服务,验证功能是否正常。
- 更新文件监控基线。
重要心得:在AWD中,“恢复”往往比“彻底修复漏洞”更高效。比赛时间有限,可能没有足够时间进行完整的代码审计和漏洞修补。只要你能在下一轮攻击到来前,将服务恢复到“干净”状态,并暂时堵住最明显的攻击路径(如改密码、删后门),就能稳住防守分。复杂的漏洞可以留到比赛中后期或赛后研究。
4. 进攻策略:混子的“捡漏”艺术
纯粹的防守只能保证不丢分,适当的进攻才能拉开差距。但对于“混子”而言,进攻的目标不是挑战高难度漏洞,而是高效地“捡漏”,攻击那些由对手疏忽造成的“低垂果实”。
4.1 信息收集:找到最弱的那个靶子
比赛通常有多个对手靶机。你的火力应该集中在最脆弱的几个上。
- 端口与服务扫描:用
nmap -sV -p 1-65535 <对手IP>快速扫描,识别开放端口和运行的服务版本。重点关注:- Web服务(80, 443, 8080等):是主要攻击面。
- 数据库(3306 MySQL, 6379 Redis, 5432 PostgreSQL):弱口令或未授权访问的重灾区。
- SSH(22):如果开放且能用弱口令爆破,就是直通车。
- 其他:21 FTP, 873 Rsync等,常因配置不当导致信息泄露。
- Web路径与漏洞扫描:使用
dirsearch、gobuster扫描对手Web目录,寻找后台登录页(/admin、/login)、备份文件(.bak、.zip、.tar.gz)、源码泄露(.git/、.svn/、.DS_Store)、配置文件(config.php、web.config)等。 - 版本比对与漏洞匹配:通过HTTP响应头、错误页面、特定文件(如
readme.txt)判断对手使用的CMS、框架、中间件版本。与你本地环境或知识库中的漏洞进行匹配。一个关键技巧:在比赛开始后的“和平期”,快速浏览所有对手的网站,看看是否有默认页面、报错信息,这能最快获得技术栈信息。
4.2 自动化与批量利用
手动攻击效率太低。你需要编写或使用简单的脚本,实现批量攻击。
- 弱口令爆破:针对扫描发现的登录接口(Web后台、数据库、SSH),使用
hydra或自编Python脚本进行爆破。但必须谨慎:过于频繁的爆破可能触发对手的防护或主办方的流量限制。策略是:使用精简的字典(top100密码),针对1-2个最可能的目标进行尝试。 - 已知漏洞利用:如果发现对手使用了存在公开漏洞的组件(如ThinkPHP RCE,Apache Struts2漏洞,Redis未授权访问),直接使用现有的Exp工具进行批量攻击。将目标IP列表放入文件,用
for循环或Python多线程批量执行。# 假设有一个利用脚本 exp.py,接收IP作为参数 for ip in $(cat targets.txt); do python3 exp.py $ip & sleep 0.5 # 避免请求过快 done - Flag提交自动化:攻击成功后,获取Flag并提交是得分关键。编写脚本自动从攻击结果中提取Flag(通常有固定格式),并模拟向比赛平台提交Flag的POST请求。这能节省大量时间。
import requests import re # 假设从攻击结果 result 中提取flag flag_pattern = r'flag\{[^}]+\}' flags = re.findall(flag_pattern, result) for flag in flags: data = {'flag': flag, 'token': 'your_team_token'} r = requests.post('http://比赛平台/submit', data=data) print(f'提交 {flag}: {r.text}')
4.3 攻击中的防守思维
即使是进攻,也要有防守意识,避免“杀敌一千,自损八百”。
- 隐藏攻击源:如果你的攻击流量特征明显(如大量扫描、爆破),可能被对手的监控发现并反制(封IP、反向攻击)。可以尝试使用代理池,或者在非关键时间点进行攻击。
- 避免破坏性攻击:除非赛制允许,否则不要使用会导致对手服务崩溃的攻击(如DDOS、删除数据库)。这可能导致被判违规扣分,也失去了一个可持续获取Flag的“肉鸡”。我们的目标是持续、稳定地获取Flag,而不是摧毁目标。
- 留后门与维持访问:在成功攻入一台主机后,除了获取当前Flag,可以考虑留下一个隐蔽的后门(如写入一个计划任务cron、或者一个隐藏在正常文件中的Webshell),以便下一轮可以快速再次进入,无需重新突破。但这需要极高的隐蔽技巧,否则容易被对手的监控发现并清除,得不偿失。对于“混子”而言,见好就收,拿到Flag就撤往往是更稳妥的策略。
5. 团队协作与心态管理:混子的自我修养
AWD是团队赛,“混子”的价值在于成为团队中可靠的后方。
- 分工明确:团队内应有自然分工。有人主攻代码审计和漏洞挖掘(“矛”),有人主防和运维加固(“盾”),有人负责自动化脚本和情报收集(“辅助”)。“混子”可以主动承担“盾”和“辅助”的角色,把基础防守做扎实,为“矛”创造稳定的输出环境。
- 信息共享:发现一个漏洞利用方式?立刻在团队内同步。发现对手某个服务存在通杀漏洞?立刻告知队友进行批量攻击。防守端发现一种新型后门?把特征和查杀方法分享出来。团队信息流通的速度直接决定得分效率。
- 沟通效率:使用简洁明了的语言。报点格式可以标准化:“目标:10.10.10.5,漏洞:ThinkPHP 5.0.23 RCE,Payload:xxx,已GetShell,Flag已提交”。防守告警:“我的机子(10.10.10.10)被上传Webshell,路径:/var/www/html/uploads/shell.php,已清除,疑似通过文件上传漏洞,大家检查类似功能。”
- 心态调整:比赛压力巨大,被连续攻击、服务宕机、分数下滑时容易心态崩溃。记住“混子”哲学:不求有功,但求无过。只要你的服务在比赛结束前还能正常运行,你就完成了核心任务。丢分是常态,快速恢复才是能力。喝口水,深呼吸,按照应急响应流程一步步来。你的稳健,就是团队信心的压舱石。
从“安心做awd混子”到成为团队不可或缺的“生存专家”,这条路的核心在于将有限的精力投入到收益最高的防守和基础攻击动作上,通过自动化提升效率,通过标准化流程应对混乱,通过团队协作放大个人价值。国赛分区赛的AWD战场,不仅是技术的比拼,更是策略、心态和团队协作的试炼场。当你不再为“混”而感到焦虑,而是能清晰地知道自己每一步该做什么,并能稳稳地守住阵地时,你会发现,这种“混”,其实是一种高级的竞技智慧。