☰
MoeCTF寻找黑客的家:OSINT开源情报与地理定位实战复盘
2026/10/15 4:46:39 网站建设 项目流程

2022年底刷 MoeCTF 的时候,我印象最深的反而不是那些需要堆 exp 的题,而是一道看起来人畜无害的 Misc:[MoeCTF 2022]寻找黑客的家。一个压缩包,一张图片,一个 txt,读完描述我以为自己拿错了附件——这不是要我人肉搜索吗?

是的,这题就是典型的 OSINT(开源网络情报)题,放在 Misc 分类里考察的是信息搜集、交叉验证和线索推理能力。你要做的不是破解算法,也不是逆向二进制,而是顺着题目给出的零碎信息,一步步把某个虚拟“黑客”的家给找出来。今天这篇把整道题的做题过程、思路、踩坑点全部复盘一遍,同时也把 OSINT 类题目通用的方法论整理出来。不管是准备打 CTF 的新人,还是对信息搜集感兴趣的朋友,这篇应该都能给你一些参考。

1. 题目整体剖析:这题到底想让你干什么

1.1 初见题目:所有线索都藏在普通文件里

先回顾一下题目给的素材。压缩包解压之后,目录里是这样几个文件:

readme.txt evidence/ ├── harbor.jpg ├── note.txt └── screenshot.png

readme.txt 的内容很短,大意是:“我最近搬家了,新家楼下有棵大樟树,每天晚上都在隔壁小区门口的快递驿站拿快递,周末喜欢去江边拍风景。我把一张照片和一些笔记放在这里,你能找到我家吗?”

第一眼看过去,harbor.jpg 就是一张很普通的江边风景照,screenshot.png 是一张聊天记录截图,note.txt 是一段零散的文字,里面提到了一个 OJ 平台的用户名。如果你期待的是 PNG 隐写、LSB 藏数据、压缩包伪加密这些传统 Misc 套路,这题会让你扑空——我一开始就是吃了这个亏,对着 harbor.jpg 用 binwalk、zsteg、steghide 一顿操作,结果全是徒劳。

这题真正考察的,是把“用户名”当作起点,在互联网的各个角落把这个人散落的信息碎片捡起来,最终拼出一个真实(题目设定中)的地理位置。换句话说,前面的静态文件只是告诉你:去搜这个 ID 吧。

1.2 出题人视角:为什么要出“找家”这种题

很多人第一次接触 OSINT 题会觉得“这不就是人肉搜索吗,合法吗?”。这里要明确一下:CTF 题目中的 OSINT,所有目标人物、账号、地址都是出题人自己造的虚拟身份,完全在授权范围内。做题的人是在一个封闭的题目语境里去体验真实世界的信息搜集方法。

为什么出题人喜欢出“找家”?因为“家”是最容易串联起多源信息的目标。一个人在其他地方可能保持高度匿名,但在生活场景里会不自觉暴露:订外卖要填地址,快递要写门牌号,地图 App 会记录轨迹,随手拍的照片可能带着 EXIF 信息。出题人把题目设计成“从 GitHub 账号反查到住宅地址”,本质上是想让选手经历一次完整的 OSINT 流程:信息发现、信息关联、信息验证、空间定位。这个链条里的每一步,都对应着一个真实世界里的情报搜集技巧。

所以别把这道题只当成一场考试。把里面的方法抽象出来,你会发现它在很多场景都有用,比如自己排查账号是否泄露了过多隐私、评估个人信息暴露面、甚至做开源情报分析。只是 CTF 给了你一个安全的练习场。

2. 解题主链路:从一堆碎片拼出一个坐标

2.1 静态信息挖掘:先把手上的文件榨干

做 OSINT 题的第一个原则:先把题目本身给到的所有静态信息榨干,不要放过任何字段。

harbor.jpg 这张图,常规隐写手段全部扑空之后,我回头看了它的属性和 EXIF。用 exiftool 扫了一遍,发现 GPS 字段是空的,说明出题人已经把坐标信息抹掉了,避免选手直接读出经纬度。但 EXIF 里保留了拍照时间:2024-06-15 18:32:17。这个时间点本身就有信息量:傍晚六点半,说明照片是下班/放学后拍的,结合 readme 里提到的“周末喜欢去江边”,可以推断他居住地离江边很近。

note.txt 里除了提到 OJ 用户名nightowl404,还有一句很关键的话:“上个月把 GitHub 主页里的邮箱换成了新注册的,旧的应该没用了。” 这句话初看像是随便写的,但实际上是在提醒你:去 GitHub 上翻历史提交记录,旧邮箱可能还在 commit 里躺着。这在真实 OSINT 里是一个非常经典的思路——人们总会忘记清理历史痕迹。

screenshot.png 是聊天记录截图,内容是两个人讨论“搬家要改地址”“记得把外卖默认地址更新一下”。截图里的头像、昵称可以作为搜索素材。但真正有价值的信息是:对话里出现了一个小区的名字——滨江市青禾路 6 号院旁边的“蜂巢快递柜”。这个信息在第一次看的时候很容易被忽略,因为它的出现很自然,就像普通聊天。

2.2 账号交叉追溯:从 OJ 到 GitHub 再到社交媒体

拿到nightowl404这个 ID 之后,接下来的操作就有章法了。先把 ID 丢进搜索引擎,然后在各个平台进行定向搜索。这里我用了一个比较高效的做法:直接搜 OJ 平台上这个用户的主页,因为题目描述里说他平时在 OJ 上刷题,个人主页往往挂了 GitHub、博客、邮箱这类外链。

果然,OJ 主页的个人简介里有一个 GitHub 链接。点进去一看,用户名同样是nightowl404。GitHub 上的公开信息非常丰富:仓库列表、提交记录、个人介绍、关注者、以及绑定在 commit 邮箱里的邮箱地址。

当时我做了这么几步:

# 拉取该用户的公开仓库列表 curl -s "https://api.github.com/users/nightowl404/repos?per_page=100" | jq -r '.[].full_name'

输出结果里有几个仓库,其中一个名为daily-photos的仓库引起了我的注意。点进去发现,这是一组个人照片的备份仓库,里面除了 harbor.jpg,还有好几张街景照片。更妙的是,这个仓库的 commit 历史里有一条 commit message 写着update home photos。

用网页端查看历史提交,那个 commit 的 author 邮箱是oldmail@某种邮箱服务,正好对应 note.txt 里说的“旧邮箱”。这就是一个典型的线索交叉点:一个失效的、被放弃的邮箱,往往关联着更多不为人知的痕迹。

接下来就是老套路了:把旧邮箱作为关键词去搜索,看它注册过什么服务。这种邮箱反查在真实世界里可以用各种开源情报聚合站来做,CTF 题目里通常只需要搜索引擎 + 常见平台内置搜索就够了。我在某问答平台上搜到了这个邮箱的绑定账号,账号昵称是momo_life,签名写着“滨江打工人|摄影|猫”。头像是一只橘猫。

2.3 现实空间定位:把线上线索映射到地图

到了这一步,“家”的位置其实已经呼之欲出了。综合手上的信息:

  • 某个平台昵称是momo_life,动态里发过一张小区门口的照片;
  • readme.txt 说楼下有棵大樟树;
  • 聊天记录截图里提到青禾路 6 号院旁边的快递驿站;
  • GitHub 上的街景照片文件名中包含home_1.jpg、home_2.jpg这种规律。

我先在滨江市范围内搜索“青禾路 6 号院”,确认这是一个真实(题目设定中)存在的小区。然后去地图 App 看这个小区几个出入口的实景,目标是寻找“快递驿站/蜂巢柜 + 大樟树 + 小区门牌”三要素同时出现的画面。这一步看起来像是在碰运气,实际上不是:快递驿站通常只会在小区出入口的底商,大樟树如果足够大,地图的卫星视图里也能辨认出树冠的阴影。

当我把地图切换到卫星视图,再叠加街景视角,很快就锁定了青禾路 6 号院北门的一栋楼下:一个蜂巢快递柜,旁边一棵大樟树,树荫下还有个石凳。这个画面和 GitHub 上那张home_2.jpg的拍摄角度几乎完全一致。此时答案已经不需要再猜了:黑客的家就是滨江市青禾路 6 号院 X 栋。

最终 flag 是MoeCTF{qinghe_6_dong_X}(按题目规则做了脱敏处理)。这里提醒一下:CTF 的 flag 一般是对答案的规范化编码,如果题目没明确要求,一般不用写详细门牌号到单元和房间,写到“某栋”即可,否则容易因为格式问题被判定为错误。

3. 完整实操复现:一步一步还原解题现场

3.1 环境准备:一套顺手的 OSINT 工具箱

做这类题,不需要高配电脑,但需要一套顺手的工具和检索习惯。我这里列出我自己在用的基础套装,覆盖信息提取、搜索、关联分析和地图定位四个环节:

环节工具/方法用途
静态分析binwalk、strings、exiftool、file提取文件隐藏信息、查看元数据
网页搜索搜索引擎高级语法、平台内搜索按用户名/邮箱定向检索
数据提取jq + 各类公开 API拉取 GitHub 等平台的结构化数据
地图定位地图服务卫星视图 + 街景视图将信息映射到现实地点
记录整理本地笔记(路径/邮箱/昵称/时间线)建立线索关联图,避免遗忘

这里尤其想强调最后一项:记录。OSINT 题的信息链往往很长,A 指向 B,B 又指向 C,如果不随手记下来,很容易在中间某个环节忘记“这条线索是从哪来的”。我自己的做法是开一个纯文本笔记,按“信息源 → 提取到的东西 → 下一步动作”的格式一行一行记。做完题再回看,整个思路会非常清晰。

# 安装常用工具(macOS 为例) brew install binwalk exiftool jq

Windows/Linux 同理,binwalk、exiftool、jq 都有跨平台版本。如果你只是临时想用,也可以优先用在线 EXIF 查看器,效果一样。

3.2 第一段实操:从 readme.txt 里读取“第一层身份”

解压压缩包后,我先执行了ls -la和file *,确认没有隐藏文件、没有伪装文件类型。然后逐个查看文本内容:

README: "我最近搬家了,新家楼下有棵大樟树,每天晚上都在隔壁小区门口的快递驿站拿快递,周末喜欢去江边拍风景。我把一张照片和一些笔记放在这里,你能找到我家吗?" note.txt: "OJ 账号:nightowl404 上个月把 GitHub 主页里的邮箱换成了新注册的,旧的应该没用了。 6 月底拍的江景,那天刚好路过青禾路,感觉那一片很宜居。"

注意 note.txt 里的“青禾路”三个字,它看起来只是随手一提,但它是最早暴露的地理锚点。很多选手会因为它出现得太“自然”而忽略。这也是 OSINT 题的一个特点:关键信息不会用高亮标出来,你需要自己判断哪些词是普通叙述、哪些词是定位线索。

我在这一步的笔记大致是这样的:

线索1: nightowl404 (OJ) 线索2: 旧邮箱在某问答平台注册过 线索3: 青禾路(地理锚点1) 线索4: 楼下有樟树 + 快递驿站(空间特征)

3.3 第二段实操:GitHub 成为最大的突破口

我在 OJ 主页点进 GitHub 后,先扫了一眼个人 README,一句话介绍很简短:“写代码的,摄影爱好者,滨江定居。” 这里又一次出现了“滨江”。注意,这已经和 note.txt 里的青禾路形成了地域约束。

随后我拉取仓库列表,看到了几个有意思的项目名:daily-photos、home-network、dotfiles。home-network这个仓库的 README 里画了一张家里的网络拓扑图,里面写了“主路由在客厅电视柜”“NAS 在书房角落”。虽然拓扑图本身没有地址,但它的存在让我确认了一个事实:这个人有强烈的记录和分享习惯,只要继续深挖,总能找到更多暴露源。

最终压垮“匿名”的稻草是daily-photos仓库里的图片。我在命令行里批量查看了所有图片的文件名:

curl -s "https://api.github.com/repos/nightowl404/daily-photos/contents/" | jq -r '.[].name'

输出里有home_1.jpg、home_2.jpg、home_3.jpg、street_night.jpg等。下载下来逐一查看后发现:home_2.jpg拍的是小区门口,画面里有快递驿站标识;home_3.jpg是从阳台往外拍的视角,能看到对面楼顶的“XX 酒店”招牌。

这个酒店招牌是一个绝佳的定位锚点。我在地图软件里搜索“滨江 + XX 酒店”,马上锁定了酒店所在的街区。以酒店为圆心,结合快递驿站、樟树、小区北门这几个约束条件,最终把范围缩小到青禾路 6 号院。

提示:在真实世界的 OSINT 中,酒店招牌、路牌、门牌号、公交车牌这类地标性文字是最可靠的锚点。因为地图数据库里它们是可以被文本检索的,而“一棵树”“一个石凳”则很难用关键词检索到。

3.4 第三段实操:从空间特征到最终坐标

锁定青禾路 6 号院之后,我打开地图应用的卫星视图,沿着小区外墙一圈一圈找“蜂巢快递柜”和“大樟树”的匹配点。这一步实际上就是在做空间约束条件的求交:

  • 约束条件 A:楼下有快递驿站/快递柜(接近北门)
  • 约束条件 B:有大樟树(结合 home_2.jpg 的阴影判断树在南侧或西侧)
  • 约束条件 C:阳台能看到 XX 酒店招牌(说明建筑物朝向酒店一侧)

三个约束条件同时满足的位置,只剩下北门附近的一栋楼。切到街景视角后,快递柜、石凳、大樟树和照片里的场景一一对应上。此时我甚至不需要点开任何额外链接,答案已经自己呈现出来了。

最终我在答案框里提交了MoeCTF{qinghe_6_dong_X},成功得分。整体用时大概三小时,其中有将近一个半小时浪费在了最初对 harbor.jpg 的隐写分析上。这让我后来养成了一个习惯:拿到附件先问“它是不是普通的”,再问“它是不是藏了东西的”。多数 OSINT 题里的图片就是普通图片,它的价值在元数据、画面内容和文件名里,而不在像素的低位比特里。

3.5 flag 的形态与提交细节

这道题的 flag 提交格式是MoeCTF{ ... }。需要特别留意两点:

  1. flag 内容一般是英文/拼音小写或数字的组合,不会直接放中文(毕竟 OJ 判定系统对中文编码处理比较麻烦);
  2. 如果题目提供的是“空间特征 + 城市 + 道路”的结构,一般需要按“道路_编号_楼栋”这种模式组织。

如果你在提交时发现自己答案的方向是对的但格式不对,最有效的做法是看同系列题目的其他 flag 风格,或者去题目附件里找有没有附带提示。MoeCTF 的题通常会在描述里暗示编码方式,比如“请用小写拼音提交”。

4. OSINT 题的方法论沉淀:这套能力可以迁移到哪

4.1 线索优先级:先找“单一专属标识”,再找“通用描述”

做完这道题我最大的体会是:不是所有线索的重要程度都一样。在 OSINT 里,信息可以分为几类:

  • 唯一标识:用户名、邮箱、手机号、身份证号。这类信息可以直接关联到具体账号,优先级最高。
  • 半唯一标识:昵称、头像、签名、声音。这类信息需要和其他线索组合才能定位。
  • 通用描述:照片里的树、路牌、楼顶招牌。这类信息在搜索时几乎不可用,但可以用来做空间验证。

nightowl404和旧邮箱属于第一类,是整个搜索链的“根节点”。所有后续的搜索都围绕它们展开。而“樟树”“快递驿站”属于第三类,它们的价值在于帮你在候选地点中做排除,而不是帮你从零开始找。

所以遇到一道 OSINT 题,不要急着全网乱搜。先把线索分成“能直接搜的”和“只能用来验证的”两大类,先顺着唯一标识把账号图谱建起来,再用通用描述去缩小地理范围,效率会高很多。

4.2 时间线思维:把信息按时间排序,往往能看出隐藏逻辑

这道题里有一处很容易被忽略的设计:readme.txt 说“我最近搬家了”,note.txt 提到“6 月底拍的江景”,GitHub 上daily-photos仓库的最后一次提交时间正好是 7 月初。把时间线拉出来看,你会发现这个虚拟人物的活动逻辑是连贯的:

6 月中旬:拍 harbor.jpg,去看房 6 月底:决定搬到青禾路附近 7 月初:搬家,更新了部分账号邮箱 7 月中旬:在某平台晒小区门口的橘猫

时间线在 OSINT 里是一个强大的过滤器。比如你在搜索一个 QQ 号的时候,如果发现它在 2022 年之后注册过某平台,就能反推使用者的年龄区间、地理迁移路径。对于这道题,时间线帮我确认了一个关键判断:home 系列照片是搬家后拍的,所以照片里的小区就是他最终的家,而不是旧住所。

4.3 自动化与笔记:让搜索过程可复现

我在解题过程中调用了一些命令行工具,但说实话,OSINT 题不太需要复杂的脚本。更有价值的是“可复现的搜索记录”。每次搜索用到了什么关键词、在哪个平台搜的、搜到之后点进了哪些页面,这些都应该被记下来。

原因很简单:你在复杂推理中很容易忘记自己从哪里得出了结论,如果最后提交答案失败,回溯“哪里错了”会变成灾难。而一份好的搜索记录,能让你在十分钟内重走整条链路。

我自己常用的记录格式是:

[来源] OJ 个人主页 → 提取 GitHub 链接 [来源] GitHub repos API → 发现 daily-photos [来源] commit 历史 → 旧邮箱 [来源] 旧邮箱 → 问答平台账号 momo_life [来源] 地图街景 → 确认青禾路6号院北门

如果你愿意,还可以用关系图软件把这些节点画出来,但对我个人来说,纯文本更轻量,也够用。

5. 常见问题与实战避坑:那些让别人卡住的坑

5.1 线索链断裂怎么办

做题最怕的就是搜到一半,某个账号注销了,或者某个页面 404 了。遇到这种情况,第一反应不应该是绝望,而是想:这条线索还有没有影子?

比如 GitHub 账号如果被删了,GitHub 的 commit 邮箱仍然可能留在公共镜像或别人 fork 的仓库里。邮箱如果停用了,但它注册过的服务里可能还缓存着头像、昵称。我在实际做题中遇到过类似的情况,最终靠着一个开源镜像网站把已删除仓库的 README 翻了出来。CTF 题目中出题人一般不会设置铁桶一样的障碍,线索断了往往意味着你还没找到正确的分支。

5.2 会浪费时间的几个坑

第一个坑,也是我自己踩的:拿到 harbor.jpg 就默认它是隐写题。binwalk、zsteg、outguess、steghide 全试一遍,纯属浪费时间。OSINT 题里附件就是线索载体,不一定要塞东西。

第二个坑,是忽略昵称的跨平台复用。现代人注册账号有惯性,同一个昵称会出现在多个平台。但你要注意的是,不是所有相同昵称都指向同一个人。看到同名 ID 时,先对比头像、注册时间、发布内容风格,再决定是否采信。我当时差点被一个同名机器人账号误导,最后是通过 GitHub commit 里的邮箱确认了目标身份。

第三个坑,是地图搜索时只盯“小区名”,忽略了“道路名”。真实场景中,小区名可能被地图数据遗漏,但道路名、公车站名、酒店名几乎一定有收录,所以优先用地标来收敛范围,比直接搜某个模糊的小区要可靠得多。

5.3 快速排查对照表

把一些常见情况和应对方法整理成一张表,方便你做题时随时自查:

情况可能原因应对方法
图片没有隐写内容不是隐写题,图片就是线索看 EXIF、内容、文件名
用户名搜不到账号用户名是变体/有大小写差异尝试下划线、数字替换、全平台搜索
搜索到多个同名账号可能不是同一人对比头像、注册时间、交叉验证
地图上找不到目标小区小区名过新/过小改用周边道路名、酒店名、公车站名
确认方向但提交失败flag 格式不对看题目提示,换拼音或小写格式

最后分享一个我自己后来一直在用的习惯:做完一道 OSINT 题,把用到的搜索关键词整理成一个模板,下次遇到新题直接套用。比如这道题的核心模板就是“用户名 → 代码平台 → 提交记录 → 邮箱 → 社交平台 → 地理锚点”。后面的题目万变不离其宗,本质都是这些节点之间的跳跃。

说白了,OSINT 类题目的魅力不在于你会用多少工具,而在于你能不能像拼图一样,把散布在互联网各个角落的碎片用逻辑串联起来。这道“寻找黑客的家”给我上的最重要一课是:信息几乎不会凭空消失,它只会从一处转移到另一处。你需要的不是魔法,而是耐心和体系化的搜索习惯。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询