1. 从一道无从下手的题目说起
CTF 比赛里,最容易被低估的题型大概就是 OSINT(开源情报分析)了。Web 题有明确的漏洞点,Reverse 有清晰的执行流,Crypto 有严谨的数学结构,偏偏 OSINT 题往那一放,题干可能就一行字:“找出这张照片的拍摄地点,flag 是经纬度。”然后呢?没有然后了。很多人第一次碰到 OSINT 题目时,习惯性地掏出扫描器、Burp Suite、爆破字典,结果全都派不上用场,三分钟之后陷入迷茫。
我最初接触 OSINT 题型时也是这个状态,觉得它不像“黑客技术”,倒更像侦探游戏。后来刷了越来越多比赛,才意识到 OSINT 考察的不是某一种工具,而是一种信息检索、交叉验证和线索推理的综合能力。在真实世界里,安全人员做溯源分析、钓鱼定位、情报收集,本质上都是在做 OSINT 工作。所以我花了一段时间专门整理这类题型的套路,从几大赛事平台上的题目入手,把常见的考点、工具链和解题路径都梳理了一遍。这篇文章就是这份总结的完整版,给同样对 OSINT 一头雾水的人做一个参考。
这篇总结适合以下人群:准备打 CTF 但还没系统性接触过 OSINT 的新手;在团队里负责杂项(Misc)但经常被图片地理定位题卡住的选手;以及想借着 CTF 练一练真实信息搜集能力的安全从业者。文章不会局限于某一类题目,而是把 OSINT 题型中最高频出现的几大方向拆开讲透。
2. OSINT 题型的出题逻辑与考点拆解
2.1 出题人到底想考什么
理解 OSINT 题首先要理解出题人的视角。一道合格的 OSINT 题目,通常围绕这样几个能力点设计:第一是检索能力,也就是你能不能在海量信息中精准找到目标;第二是信息交叉验证能力,单条信息可能不可靠,但多个来源指向同一个结论时,可信度会大幅提升;第三是痕迹分析能力,照片、文档、社交媒体页面上的元数据往往比内容本身更有价值;第四是逻辑推理能力,拿到零散线索后,能否串成一条完整的信息链。
国内比赛中的 OSINT 题通常不会涉及特别敏感的领域,题材一般集中在风景地标、城市建筑、公共交通、日常生活场景、影视作品拍摄地这类信息公开度比较高的目标。题目设计时往往会给出一条“看似无关”的线索,需要选手顺着这条线一步一步挖下去。比如给你一张地铁车窗外的模糊照片,要推算出在哪里拍的;给你一段车辆行驶记录仪的音频,要识别出经过的桥梁名称。这种题说难也难,因为线索可能只有一张图;说简单也简单,因为答案一定存在于公开信息里。
2.2 OSINT 典型子分类
从我做过的题目来归纳,CTF 里的 OSINT 大体可以分成五个子类:
第一类是地理定位题,这是数量最多的一类。题干给一张照片或一段视频截图,要求确定拍摄地点的经纬度、行政区划或者地标名称。这类题考验的是对地理环境细节的敏感度,包括建筑风格、植被类型、路牌文字、交通标志、远处的地形轮廓等。
第二类是人物溯源题。给一个网名、一个 ID、一枚头像,要求找到这个人的真实身份、常用邮箱、注册过的网站或者现实中的活动范围。这类题来源于真实的情报收集过程,近些年在大赛中频繁出现。
第三类是时间线推理题。题目给出的事件发生在特定时间,需要根据各类公开记录推断准确的时间点。比如一张老照片,要通过翻拍照片中的报纸头条、车辆型号、服装款式、产品包装等特征判断拍摄年代。
第四类是跨平台信息整合题。同一个目标在不同平台上的信息是碎片化的,需要把这些碎片拼接起来。常见线索组合是 GitHub 用户名加上 Stack Overflow 提问记录加上 Twitter 发言内容,最后综合出一个完整信息画像。
第五类是综合场景题,融合了上述多种元素。例如一道题目给出几张看似毫无关联的图,其实每张图都指向同一个城市,最终 flag 就是这座城市名称加某个地标的组合。
理解这些子分类之后,再看任何一道 OSINT 题就有了一个初步判断框架:它到底在考地理还是人物还是时间?判断方向后,才能选择正确的工具和搜索策略。下面按这个框架逐步展开。
3. 信息检索的基础功:搜索引擎的正确打开姿势
3.1 不是会打字就能搜得到的
很多人搜索信息的方式,就是直接在搜索引擎里输入几个关键词然后翻前两页结果。这种做法在 OSINT 题里基本等于碰运气。真正有效的搜索需要逻辑化拆解,把一个大问题拆成多个小问题,每个小问题用精确的关键词组合去搜索。
拿地理定位举例。一张照片里有明显的蓝色路牌,上面写着“中山路”,远处有一座尖顶教堂。直接搜“中山路 教堂”可能出来的结果是某个城市的旅游攻略,无法定位到具体哪一座城市。但如果拆解成元素:中山路 + 尖顶教堂 + 蓝色路牌(城市风格特征)+ 路牌字体样式,再用高级搜索语法逐层筛选,就能大幅缩小范围。
搜索引擎有几个语法是 OSINT 里必须掌握的。site: 限定搜索某个网站内的内容,适合在目标平台内检索;filetype: 限定文件类型,经常用来找 PDF、Excel 表格这类文档;intitle: 和 inurl: 限定标题和 URL 中的关键词; “” 双引号做完全匹配;减号排除关键词。此外,部分搜索引擎支持通过 time 参数限定时间范围,对信息时效性要求高的题目很有效。
3.2 实操示例:用搜索语法缩小地理范围
举一个我印象深刻的例子。某次练习赛上有一道题,照片是一条老街,石板路,两侧是骑楼建筑,建筑上挂着红色灯笼,还隐约看到一块招牌写着“黄记杂货铺”。我最初搜“黄记杂货铺 骑楼”,结果搜出来一大堆无关的电商页面。后来换了思路,把影响范围限定在骑楼建筑密集的区域——这类建筑主要分布在福建、广东、广西、海南等地区。于是用 site: 加上可能的本地论坛和旅游社区,同时把“黄记杂货铺”加上双引号做精确匹配,再配合一些泉州、厦门、汕头、海口这类城市名进行排除式搜索。最终在一个地方新闻网站的历史报道里找到了这家店铺的地址。
这题给到我的启发是:搜索的每一步都要有目的性。搜索失败时不要盲目换词,而是要先分析是什么原因导致失败——是关键词太宽泛?还是方向上就有偏差?是有其他关键词干扰了结果?还是信息源本身就不在搜索引擎收录范围内?这些判断比多敲几次回车重要得多。当你需要验证某个特定细节时,最好的搜索表达式是组合条件,遵循从独有特征到共性特征的顺序:先搜索最独特的对象(店名、特定建筑名),再搜索具有地域属性的对象(骑楼、路牌颜色、植被类型),再搜索类型限定词(旅游攻略、新闻报道、论坛帖)。
4. 图片与元数据:一张照片携带的全部信息
4.1 EXIF 与文件隐藏信息
几乎每一道 OSINT 图片题,第一步都应该做文件信息检查。右键查看属性、用工具读取 EXIF 信息、检查文件尾部是否拼接了额外内容。虽然很多赛事平台在上传图片时会剥离 EXIF,但依然有出题人故意保留 GPS 信息或者干脆把 flag 写在 EXIF 的备注字段里。这种送分点错过非常可惜。
处理图片元数据的常用工具包括 exiftool、strings、binwalk 和十六进制编辑器。Exiftool 能读取图片的拍摄设备、拍摄时间、GPS 坐标、处理软件等大量信息。strings 则能从任何二进制文件里提取可打印字符串,有些出题人会把提示藏在图片的末尾。Binwalk 用来检测文件中是否嵌入了其他文件。
实操标准流程是这样的:拿到图片文件后,先复制一份备份,然后依次执行 exiftool 查看元数据、执行 strings 查看字符串内容、执行 binwalk 检测嵌入式文件。如果 binwalk 检测到了压缩包,就进行提取,提取出的文件再重复以上流程。有些题目的 flag 会藏在多层嵌套的文件里,第一层是一张图片,图片尾部藏了一个压缩包,压缩包里放了一个文本,文本里隐藏了一段经过编码的字符串。整个过程像是在拆俄罗斯套娃。
4.2 反向图片搜索的进阶用法
反向图片搜索是地理定位题的核心手段。常用的平台有 Google Images、Baidu Images、Yandex 和 Bing Images。比较个人反复测试的经验,Yandex 对于识别风景地标的表现最稳定,尤其处理经过压缩、裁剪、调色的图片时;Google Images 的优势在于覆盖面广,适合人文类和社会媒体类图片;Baidu 对中文语境下的信息有优势。
但反向搜索在实际使用中有很多坑。比如图片被大幅度裁剪过后,搜索引擎可能完全找不到匹配项。这时候可以先对图片做局部裁剪,只保留最独特的地标部分再去搜索。再比如图片经过了滤镜处理,颜色变化导致匹配失败,就需要先尝试调回原始色调。这些都属于经验积累。
反向图片搜索的另一个用途是找原图出处。有时候一张照片本身不包含地理信息,但发布这张照片的原始博客、新闻页面会附带拍摄地说明。用反向搜索找到源头页面,往往比直接分析照片内容更简单。来源信息蕴含的时间甚至还能帮我们定位季节,进而推导出拍摄时间。
4.3 从照片内容本身找线索
当反向搜索失效时,就只能靠人来观察照片了。这种观察不是随意地看一眼,而是按照层次拆解:地理环境(地形、气候带、植被)、人工建筑(建筑风格、材料、功能)、文字标识(路牌、广告牌、车牌、商标)、交通信息(车型、牌照格式)、人物细节(服饰风格、发型、携带物品)、文化符号(墙体涂鸦、公共设施设计)。每一条信息都可以变成一个搜索关键词。
建筑风格是特别有价值的信息。中国不同地区的传统建筑有显著差异:徽派建筑的白墙黛瓦马头墙、闽南的红砖古厝、岭南的骑楼、北方的四合院。一栋建筑的风格加上窗户形式、阳台围栏样式,往往就能锁定到相当具体的地理区域。植被也能辅助判断纬度,比如椰子树基本只出现在热带和南亚热带地区,针叶林多分布于高纬度或高海拔区域。
字体和文字标识也常是破局关键。不同地区的官方字体、招牌风格存在差异。港澳地区的繁体字招牌、上海的老式霓虹灯招牌、成都街头的方言招牌,甚至路牌的边框设计都有官方规范。一幅好的题目图片,往往会在角落藏着决定性的文字信息。
5. 常用 OSINT 工具与平台实战体验
5.1 地图类工具的正确用法
地理定位题最终需要落到地图上,所以地图工具的操作熟练度直接影响解题速度。Google Maps、Google Earth、百度地图、高德地图、Mapillary、街景地图配合使用才能覆盖大部分场景。
Google Earth 的历史影像功能对时间类定位题尤其好使。很多地标建筑在不同年份外观会发生变化,题目给老照片的话,可以直接在 Google Earth 中调整时间轴,对比哪一年的卫星图与照片吻合。Mapillary 是一个众包街景平台,很多偏僻街区的实景照片在 Google 街景中没有,但在 Mapillary 上有,上面还标注了拍摄时间。
当照片中只能看到远处地形轮廓时,可以使用地图软件的等高线或地形图层来比对。山体形状、河流走向、岛屿轮廓都可以作为匹配标识。有一个实际经验是:把照片里的山体轮廓截图后,在地图上逐个方向比对,先用明显的制高点缩小范围,再对比次要地形的相对位置关系。
5.2 社交媒体与人物查询平台
涉及人物溯源题和社交平台信息题时,需要用好各种公开数据源。用户名搜索可以用 whatsmyname.app 这类批量检查用户名在各平台注册情况的网站,namecheckr 也不错。邮箱查询可以用 hunter.io 的公开版、emailrep.io 检查邮箱信誉信息,也可以直接在搜索引擎里搜邮箱地址。
在 GitHub 上搜 username、email、真实姓名都是常见的破题手法,很多人的 GitHub 主页里会暴露网站链接、公司名甚至所在城市。如果目标用户名在一些论坛上发过帖子,可以通过 Google 的 site: 语法加用户名直接搜索论坛帖子内容。需要注意的是在真实环境中合法合规使用这些手段,但在 CTF 题目环境内,题目设计的查询目标往往本身就是虚构的,所以不必担心。
5.3 一款综合工具与浏览器插件
实际比赛过程中,我常用的浏览器插件和辅助工具包括:Wayback Machine 网页时光机,用于查看网站历史版本;Image Search Options 右键快速发起多个引擎的反向图片搜索;TabCopy 快速复制标签页 URL,方便批量搜索;Photopea 或 GIMP 对图片进行细节放大、调色和裁剪。
在国内 CTF 圈里,经常被提及的“随波逐流”更多是面向杂项题的编码解码工具,跟纯 OSINT 关系不大。OSINT 题更需要的是一套轻量、快速的搜索组合方案,而不是大而全的软件工具。我个人的工具组合是浏览器加上几个插件、一个 Python 脚本库(处理批量请求),加上 exiftool、binwalk 这类命令行工具,基本就能覆盖绝大部分题型。
6. 实战思路拆解:从一张图片到经纬度
6.1 一道典型地理定位题的全过程
用一个虚构但具有代表性的案例分析。假设题目给了一张图片:拍摄场景是一条窄巷两侧有高墙,墙上有些涂鸦,地面是水泥,远处露出一栋塔楼顶部,天空中电线交错。
拿到图片后的第一步,先做元数据检查。如果 EXIF 信息没被剥离且含有 GPS,直接就是送分。但比赛通常不会这么简单,所以继续做字符串检查,看图片里是否拼接了隐藏文本。若没有,进入人工观察阶段。
第二步,提取线索。塔楼顶部是一个明显的竖向制高点,这种塔楼在江南地区常出现在旧街区附近,可能是民国时期的水塔或教堂钟楼。墙面上涂鸦的文字若有明显的地域语言特征,比如粤语用字,就能锁定大致区域。电线交错的形态也能辅助判断是老城区还是新区。
第三步,使用反向图片搜索,裁剪出塔楼顶部的局部图进行搜索,看看是否有其他摄影师在不同角度拍过同一塔楼。街景地图搜索时,需要遍历照片拍摄方向对应的街道。
第四步,如果多次搜索都无法直接匹配,就换思路:把涂鸦文字拆开,在社交平台搜索同样涂鸦(涂鸦创作者会反复在不同区域创作)。这一步有时候效率极高。涂鸦艺术者通常会在多个作品中使用同一种签名标签,通过签名找到他的活跃区域,就间接锁定了拍摄地。
第五步,综合所有信息后回到地图验证。如果最终确认地点是某个具体城市的老街区,再用街景走一遍巷子,比对墙面细节。确认一致后,读取该位置的经纬度并按要求格式提交。
6.2 时间线推理题中的关键验证手段
时间线推理题常常和地理定位题结合,这里补充一个独立的案例。题目给出一张照片,里面的邮戳显示日期但年份模糊,需要推断具体年份。此时可以观察照片中出现的汽车型号、路灯样式、邮局柜台设计、墙上贴的标语、人物的衣着发型来综合判断。
关键验证手段是交叉比对。例如判断照片中的汽车属于某年代车型后,再用街景历史影像确认该地点在那个年代的路面状况是否与照片相符。如果照片中出现了当时热映电影的户外广告牌,搜索该广告的上映档期,就能把年份锁定到一个更小的区间。这类题目没有单一决定性线索,而是需要多条弱线索互相印证才能得到较可靠的答案。
6.3 多平台信息整合题的一个典型路径
假设题目给了一个 Telegram 用户名和一个邮箱地址,要求找出此人所在城市。第一步在搜索引擎搜索用户名和邮箱,看看有没有关联结果;第二步检查邮箱在 Gravatar 上是否注册过,Gravatar 头像的 URL 中有一个 MD5 哈希,可以通过 hash 工具进行碰撞查询;第三步搜索用户名在各社交平台的帖子,通过帖子中包含的天气、定位、本地内容推测城市;第四步如果找到其 GitHub 账号,查看提交记录中的时区信息和项目内容。
整个过程的路径就像拼图,每一块都能提供一点信息增量,慢慢把目标画像补齐。最终 flag 通常是一个具体地点或一串个人信息。解题关键在于不能让任何线索孤零零地躺在那里,线索与线索之间的逻辑关系才是答案所在。
7. 高频问题与踩坑经验整理
7.1 搜索引擎结果被干扰
有相当多的时间浪费在“搜不到”上。搜不到的原因常常不是信息不存在,而是关键词选择不对。例如目标照片中的路牌写的是“中山路”,但在当地叫“中山南路”,简称不同导致搜索失败,此时需要尝试搜索路牌的官方名称、当地人俗称、路段门牌号范围等更细节的关键词。
另一种常见干扰是重名。搜关键词“大东桥”可能会出来十个不同城市的同名桥梁。此时需要加入更多过滤条件,比如桥梁附近的地标建筑名、桥身上的雕刻文字、跨越的河流名称,用多个限定词把范围收缩到唯一目标。
7.2 反向图片搜索搜不出结果
反向图片搜索的失败通常是因为图片被大幅度修改。裁剪、缩放、压缩、增加滤镜、添加文字水印都会严重影响匹配率。应对方式是:恢复裁剪,只保留主体建筑的那一小块做搜索;把彩色图转成黑白试试;把图片进行水平翻转后再搜索(某些出题人会故意翻转图片增加难度);对图片中单独的建筑截图搜索而不是整图搜索。
7.3 地图软件中没有街景覆盖
很多三四线城市和乡镇在 Google 街景中没有覆盖,但百度地图、腾讯地图往往有部分街道实景。还可以试试 Mapillary 和 KartaView 这类众包街景平台,有时候摄影爱好者拍的旅游照片里恰好包含目标街道。还有一招终极方法:搜索目标区域的短视频平台地理位置标签,有些用户会在同一位置发布视频并带上定位信息。
7.4 时间线判断失误
最容易踩的坑是仅凭单一特征判断时间。比如只看汽车的年份,忽略了老款车可以长期使用,从而把拍摄时间判断得过早。正确做法是组合多个时间特征,取它们的交集。如果照片中同时有新款车型和已经停用的广告牌,那拍摄时间应该在新车上市之后、广告牌拆除之前。多特征交集区间越小,时间判断就越准。
7.5 忽视数据的时效性
OSINT 题中经常需要查询实时的公开信息,比如特殊事件的新闻报道、社交平台上的热点动态。这类信息变化很快,如果一个月前搜索到的内容已经失效,就可能会导致解题方向错误。每次比赛临近时应该有意识地重新确认关键信息的时效性,不能依赖记忆里的旧数据做判断。
8. 从 CTF 到真实场景的能力迁移
OSINT 题型练到后期,收获的不只是解题能力,而是一套完整的信息分析思维。在真实的网络安全工作中,这套思维会用在威胁情报分析、钓鱼邮件溯源、品牌仿冒监测、失陷资产定位等多个场景里。
举个日常案例:某企业收到一封钓鱼邮件,邮件中附带了一张截图。分析师可以提取邮件的元数据信息,查看来源 IP 的地理位置,搜索截图中的软件版本特征判断攻击者使用的技术栈,甚至通过附件中的 EXIF 信息推断攻击者所在时区。这套流程的本质和 CTF 中的 OSINT 题完全一致,只是目标换成了真实攻击者。
在合法的场景下,这类技术也能应用于寻人寻物和反诈等方向,但无论应用于哪种场景,都必须遵守当地法律法规,只使用完全公开、合法的信息渠道。CTF 题目是虚构的,可以为了解题无所不用其极,但真实环境中必须严格控制信息使用的边界。
如果想把 OSINT 能力继续往深处练,推荐的方式是:每周固定找 2 到 3 道 OSINT 题目练习,不限平台;每一道题做完后都记录自己的搜索路径和卡点;定期复盘这些记录,总结出个人常见的思维盲区;关注地理、建筑、交通、历史等方面的公开资料,储备背景知识。信息搜索是一项强积累型技能,练得越早积累越多,做题速度提升也会非常明显。
OSINT 可能是 CTF 里最不“炫技”的题型,但也是与现实结合最紧密、最实用的方向。如果你现在正被一张来路不明的图片卡住,可以从这篇文章里提到的任何一步开始尝试,坚持做完两三道完整的题目,很快就会打开一个新的世界。