array(5) { ["chapterid"]=> string(8) "49409199" ["articleid"]=> string(7) "7300050" ["chaptername"]=> string(7) "第6章" ["content"]=> string(8564) "实验室的门被推开了。
推得很用力。不是那种试探性的"咚咚咚"再推门,是直接一把推开,门把手撞在墙上的挡块上,发出一声清脆的金属碰撞声。林墨和苏晚晴同时转头。
门口站着一个人。
男生,个子不高,一米七出头,穿一件印着"I VOID WARRANTIES"的黑色T恤——那种淘宝上二三十块钱一件的文化衫,字已经洗得有点裂开了。牛仔裤膝盖上有两块油渍,运动鞋的鞋带散着,左脚踩右脚的鞋跟。头发剃得很短,几乎是板寸,脸型偏圆,颧骨上有一道浅疤——像是被什么锐物划过,已经愈合了但疤还在。最引人注目的是他的左手:手腕上缠着一圈运动绷带,从虎口一直延伸到前臂中段,绷带的边缘已经卷起来了,显然是自己缠的,而且缠了好几天没换。
"你们就是CTF校队的?"男生开口,声音比他的个子有气势得多。
林墨看了一眼苏晚晴。她的反应是微微眯了一下眼睛,右手无意识地碰了一下口袋——那是她放瑞士军刀的口袋。林墨知道那把刀不大,红色外壳,主要是拧螺丝和拆快递用的,但这个动作说明她在评估威胁等级。
"这里不是CTF校队。"林墨说,"这是网络空间安全学院的实验室。你找谁?"
"我找你们。"男生走进来,毫不客气地拉开林墨旁边一把椅子坐了下来。椅子的气压杆发出一声泄气的闷响——比林墨坐那把还严重,他整个人往下沉了三厘米,然后自己拧了拧高度调节杆,把自己的视线跟林墨拉平。
"赵一鸣,计算机学院,大二。我听说校队要重组了,方远行方老师在招人。"
"谁告诉你的?"
"没人告诉我。"赵一鸣说,"我自己查的。"
他从口袋里掏出手机——屏幕碎了一角,左下角那一块完全黑了,不影响操作但看着触目惊心。他在手机上翻了几下,然后把屏幕转向林墨。
"方老师上周三在学院系统里开了一个新的实验室项目编号,项目名CTF竞赛训练与实践,经费来源是网络安全实验室的横向课题账户。这个项目编号前天出现在了教务系统的选课列表里——作为一门0学分的开放实验课。一门不需要上课的实验课。"
林墨看着那个手机屏幕。项目编号、经费来源、选课编号——赵一鸣把这些信息从学院系统的不同模块里翻出来,拼成了一条完整的线索链。
"你是怎么查到实验室项目编号的?"苏晚晴问。她的语气不重,但林墨听出了其中的审视——她在测试这个人的诚实程度。
"学院系统的项目查询接口有个越权漏洞。"赵一鸣说这话的时候语气极其随意,像是在说食堂今天有红烧肉。"普通学生只能看到自己学院的项目,但把请求里的college_id参数改一下,就能看到全校所有学院的。"
"你越权访问了学院系统。"林墨的语气没有波动,但他的坐姿变了——从靠回椅背变成了微微前倾。
"就是改了个参数。"赵一鸣耸了耸肩,"我又没改数据,就看了看。"
苏晚晴和林墨交换了一个眼神。不到半秒,但两个人都读懂了:技术天赋是真的,纪律性也是真的差。
"你报名了下周六的校内选拔赛?"林墨问。
"报了。"
"你之前参加过CTF比赛吗?"
"没有正式比赛。但我在网上刷过BUUCTF和攻防世界的题,Pwn方向做了大概三百多道。"
三百多道Pwn题。Pwn是CTF里门槛最高、最吃底层功底的方向之一,大部分参赛者在Pwn上的刷题量不超过一百。赵一鸣要么真的很热爱,要么真的很闲。也可能两者都是——大二暑假不回家留校刷题的人,通常是两者兼有。
"你左手的伤是怎么回事?"苏晚晴忽然问。她看东西很准——绷带下面的肿胀程度说明受伤时间不超过三天,而且伤的不是关节,是虎口到掌根那一带,像是砸在了什么硬物的棱角上。
赵一鸣低头看了看自己缠着绷带的左手,咧嘴笑了一下。"前天晚上练堆溢出的时候,键盘支架断了,手砸到桌角上。缝了四针。"
"你为了写一个exploit砸伤了手。"苏晚晴的语气听不出情绪。
"那个exploit差一行就通了,我太投入了。"赵一鸣的笑里有一种满不在乎的东西,但林墨注意到他说到"差一行就通了"的时候,嘴角往下一沉,很快又拉回来。不甘心。
赵一鸣的宿舍在计算机学院六号楼,四人间,暑期只住了他一个人。室友都回家了,空调坏了报修三次没人来,他白天泡在图书馆机房刷题,晚上回宿舍继续用自己那台2019年的ThinkPad写exploit。键盘支架是之前摔过一次用胶带粘回去的,那天晚上他调到凌晨三点,一拳砸下去——不是砸键盘,是兴奋地拍桌子,手滑了,正好拍在键盘支架断裂的尖角上。校医院值班医生给他缝针的时候问"怎么伤的",他说"写代码写的",医生以为他在开玩笑。
这些他没说。但林墨能猜到七八分——因为他自己的工位上也有类似的痕迹:桌角一道刻痕是去年调试SQL注入时用笔尖划的,键盘上的F5键磨得发亮是因为刷题时反复运行脚本。
"选拔赛下周六。"林墨说,"你先回去准备。如果成绩够好,我们会联系你。"
"你们不是就是校队吗?还等什么选拔赛?"赵一鸣站起来,椅子又发出一声闷响,"我直接加入不就行了?"
"选拔赛是公平筛选。"苏晚晴说,"没有人可以直接加入。"
赵一鸣看了她一眼,又看了看林墨。他的嘴角动了一下,像是想说什么,最后还是压回去了。
"行。下周六见。"
他走到门口,忽然停下来回头。
"对了——你们在查教务系统那个debug接口的事吧?"
林墨没有说话。但他的手指从键盘上抬了起来,搭在桌沿上。
"我上周也在追那条线。"赵一鸣靠在门框上,语气跟刚才说越权漏洞时一样随意,"debug参数的事,BUU的Pwn群里有人提过——说咱们学校教务系统有个调试后门,问能不能利用。我当时试了一下,发现有人在用,就没动。"
"你知道有人在用?"苏晚晴的声音变了,带上了一层锐度。
"我知道有人在查成绩数据。但我不知道是谁。"赵一鸣的目光从苏晚晴转到林墨,"不过我可以告诉你们一件事——那个人查数据的时候,偶尔会在请求里加一个不标准的header。`X-Trace-ID: ZDP-XXXX`。后面的XXXX是四位数字,每次不一样。"
ZDP。
林墨没有动。他控制住了——手指没有抖,呼吸没有变,表情没有变。但他的脑子里像有人拉了一下电闸,所有的灯同时亮了。
"你见过这个header?"赵一鸣注意到了什么——也许不是林墨的表情,也许是空气里某种微妙的变化。赵一鸣这个人观察力不差,只是选择性的。"看来你们也知道。那我就放心了。下周六选拔赛见。"
他挥了挥手,走出了实验室。门没关。走廊里传来他运动鞋踩在地砖上的声音——节奏不均匀,左脚重右脚轻,可能跟左手的伤有关,也可能他走路一直这样。
苏晚晴走过去把门关上。门锁咔哒一声。她转回身看着林墨。
"ZDP出现在HTTP请求头里。"
"不只是请求头。"林墨把手机递给她,屏幕上是电缆层迷你主机机箱上的蚀刻序列号照片——ZDP-0451。
苏晚晴看着照片。她没有立刻说话,把手机还给他,走到窗边站了一会儿。窗外的蝉鸣突然响了一阵,又突然停了,像是有人在远处按了一下静音键。
"攻击者用ZDP作为标识,贯穿了软件层和硬件层。"她说,"这不是个人行为。一个学生不会给自己的工具做统一的序列号体系。"
"方老师说的暗网锚点。"
"也许是。也许不止。"
林墨转回屏幕,把新规则加上去之后重新跑了一遍历史流量。十一条ZDP标记跳出来的速度比他眨眼还快——脚本比人快,机器比人快,在这个实验室里,他每天被提醒这个事实无数次。
"他在系统性地筛选目标。"苏晚晴回到他旁边,看着十一条标记,"十一次查询,每次查一个学号段。五百到一千人。"
"他在这一千个人里找什么?"
"也许方老师知道。"" ["create_time"]=> string(10) "1785963690" }