用OSINT技术找回失联8年的童年玩伴
OSINT,即开源情报,是网络安全领域中一项重要的技能。不仅是网络安全,情报界也广泛使用。对于网络安全人员,无论从事红队,还是蓝队,还是威胁狩猎/情报等,OSINT 都能发挥不同的作用。对于红队来说,OSINT 可以帮助操作员们在不与目标积极交互(漏洞扫描,目录爆破,社会工程学尝试等)的情况下了解目标的攻击面,掌握暴露的脆弱资产。对于蓝队以及威胁狩猎等更加偏向于主动与被动防御的角色来说,OSINT 可以帮助工程师们识别攻击者的技术栈,个人信息,基础设施,背后势力等。
作为一名红队操作员,在日常工作里,我主要利用 OSINT 在侦察阶段尽可能获取目标更多的攻击面,脆弱资产,人员信息等,即为进攻性安全服务。而今天,我想分享一个不是那么进攻性,能带来温暖和感动的 OSINT 案例。我帮助了一位学妹和朋友,主要凭借着她提供的姓名,联系到了失去联络8年之久的年少时的亲密玩伴。
在茫茫互联网中寻找一位特定的人,OSINT 绝不只是在 Google 等搜索引擎中检索特定的关键字,毕竟这谁都会,没有技术含量可言。OSINT 需要我们精炼已有的信息,对信息设置不同的优先级与重要性,对信息进行发散,对海量的信息筛选和过滤等。一些常见的技术有:搜索引擎的高级搜索,各类 Dorking,关键字变种与迁移,利用在线工具与 API,社交媒体检索,文件元数据提取,泄露数据查询,研究目标可能的人脉和圈子等。
背景与动机
作为一名网络安全从业人员,我一直希望能熟练掌握与应用一些既能在工作中大放异彩,也能在生活中实用的技术。你说攻击一个网站,挖掘软件的漏洞?算了吧,这很酷但不够实用。能让我想到的一些技术有:撬锁,Flipper Zero 的一些使用,OSINT。我在上文说了,OSINT 被多个领域所运用。网络安全之外,有一些内容创作者会挑战自己从一张看似普通的图片中提取大量的信息,最终得到例如图片中风景所在的地理位置,呼啸而过的列车的编号,几行模糊的文字所在的书籍。还有一些账号会追踪一些名人的踪迹,例如:(原帖链接 https://x.com/fs0c131y/status/1827828970856874115)
就寻找特定人员而言,虽然不能说百分百成功,但还算比较得心应手,例如想要联络到年少时的朋友对我来说不算是很困难。在几天前,我的一位好友兼学妹恳求我能否帮助她找到她童年时的玩伴,她说已经失去联络至少 8 年了,很思念这位伙伴。不过这位学妹也是早早地离开中国生活在海外,本来信息就很少,这么多年过去,很多事情都可能发生变化,那么我能最终帮助她找到嘛?
嘛,之所以大家能看到我写的这篇文章,说明最终是找到了。寻找的过程中,我意识到这个寻找的经历是一个很好的素材,因为这些原因:
- 没有一步到位的捷径
- 寻找难度适中
- 有曲折,但没有绝望的死路
- 涉及的技术具有多样性
- 存在多条可能的路径
- 一些软技能与非技术手段能起到作用并节省时间
以及,这个搜索最终让两个小姑娘在感动和温暖中重聚,而我也很有成就感,因为我用技术给她们带来了幸福和温暖。那么接下来,就从技术上分享一下这个过程。
被排除的捷径
这位学妹告诉了我她童年玩伴的姓名和出生年份。尽管她们小时候在一起玩耍,但不一定意味着这位伙伴(下文都用 ”目标“ 二字代替)的户籍就在本地,我的同学里就有好几位出生不久之后就来到了其他城市成长和生活。不过,暂且我先默认这位目标和我学妹的户籍相同,都在 ** 市,如果无果再说。
掌握了特定信息的话,如果运气好,最快速的方式是社工库。社工库是支持自定义查询,包含了过往泄露数据的数据库,往往在 Telegram 上由自动回复机器人运行。根据查询的信息的详细程度,以及查询的次数,可能需要付费。需要注意的是,这些社工库是脱离政府管辖的黑灰产,并且有较多欺诈和骗子,需要格外谨慎。
除去数据陈旧之外,我发现这些社工库对以下情形效果不佳:
- 目标出生或者接触电子设备/互联网较晚
- 目标早早地离开中国,或者移民其他国家了
- 目标十分注重隐私,或者很不热衷于各种App
- 目标年龄较大,不怎么使用电子设备
- 改过名字,改过身份证,改过户籍等特殊情况
不管怎么样,根据已有信息,我在能确定的最小范围里尝试了查询,出现了几个同名的记录,但其他信息都不符合。因此,这条捷径就被排除了。但是,也并非没有留下任何信息,例如我得知了与目标重名的人并不多。因此,如果出生年份能对上,很大概率就是目标。
除了社工库之外,黑产里还有提供内部信息的。一些政府与执法机构内部人员会因为利益原因对外出售信息。当然,作为黑产,这里面水也很深,价格昂贵,以及会包含欺诈。但即便假设这些内部信息至少真实,根据查询项目的不同,也需要不同的前置信息。例如,要查询目标的手机号(进而获得微信号,支付宝账号,QQ等),那么身份证号是需要的。而身份证的获得也并不容易。
谷歌Dorking的威力与关键字迁移
既然没有捷径的话,那么我们就脚踏实地地进行搜索与分析。这里,谷歌 Dorking 派上了很大的用途。我没有直接只搜索目标的名字,而是加上了她当时所在的城市,并且强制要求城市名出现在网页中。
intext:"<城市名>" <目标姓名>
经过筛选,我得到了如下 2 个疑似相关的记录:
第一个记录疑似是目标小学时候发表的作文,被搜集在这个网站上。第二个记录疑似是目标当前所在大学发布的关于英语竞赛考场分布的文档,里面包含了参赛考生的名字,学生ID(此时还尚未确认),座位编号等。
不管怎样,先访问第一个记录看看,能看到目标的名字,当时所在小学,小学毕业年份和班级。经过计算,目标确实应该在这年小学毕业,时间对的上。考虑到与目标重名的人很少,那么这个作文确实是目标小学时发表的了。
然后,我准备访问第二个记录,发现网页加载不出来。搜索记录页面的预览内容应该是缓存的,不过好在我至少知道目标可能就读的大学了。考虑到第二个记录并不是学校官方发布的,那么很可能是转载的,也意味着学校官网肯定发布过这个公告。
于是,我调整 Dorking 语句,以她可能就读的学校为新的关键字,搜索语句如下:
intext:"<目标可能所在学校>" <目标姓名>
果然在官网找到了关于该英语竞赛的公告。
在该公告里,有着考场分布信息的 XLS 文档,里面包含了考生的相关信息,以及疑似目标的学生信息,包括姓名,完整学号。
虽然我觉得很大概率就是目标,但我想获得更多证据。于是,我调整了搜索语句,如下:
inurl:"<xxx.edu.cn>" <目标姓名>
我得到了如图所示的一个记录,这是该校网络安全学院发布的关于实验班的录取通知,包含了目标的名字。到这里的时候,我有些震惊和兴奋,因为我自己就是网络安全从业者,没想到我正在搜索的人可能是行业里的后辈。
点进去之后,我看到了这批学生,当然也包括目标的入学年份。根据她的出生年份以及小学毕业年份做了简单计算,这个大学入学年份是吻合的。以及因为重名者很少,那么基本可以断定就是目标了。
现在,我们得知了以下这些信息:
- 目标在当地的一小学就读并毕业了
- 目标在当地的一大学就读网络安全专业,属于实验班
- 目标在该大学参与过英语竞赛
我们知道了目标的学号,和所在大学,并且大学网站往往都有学生登录入口。我想着,能否从学生登录入口找到存在于响应和报错中的更多信息。如下图所示,因为我不知道目标的密码,那么能否通过密码重置功能得到目标手机号的信息呢?
从响应中,我确实得到了目标的手机号码,但只是其中 6 位,开头 3 位和结尾 3 位,中间还有 5 位,即最多 99999 种可能。
我抱着试一试的态度,看看能否从校内站点找到包含默认密码的相关文档:
intext:"<默认|初始密码>" inurl:"xxx.edu.cn"
还真找到一个记录,得知所有学生账号的初始密码是 123456,但我觉得目标这种选择网络安全专业的学生肯定会早早修改了,事实也是如此。