CTF MISC实战:路由器备份配置中提取宽带凭据
在 MISC 题里混久了你会发现真正拉开差距的从来不是会不会用某个工具而是拿到一个完全陌生的文件时能不能在五分钟内判断出它大概是什么、数据藏在哪一层、用什么姿势把它扒开。Bugku 的这道宽带信息泄露就是典型的这类题附件既不花哨也不大没有套娃、没有隐写、没有流量包可第一次做的人经常卡在这玩意儿到底是个啥上然后在百度里绕一大圈才找到那把钥匙。这篇就把我完整做过一遍的流程拆开从文件识别、到路由器备份配置的原理、再到 Windows 和 Linux 两套提取方案顺带把几个容易翻车的细节讲透保证你看完能自己复现也能把同样的思路迁移到后面遇到的其他配置文件泄露类题目上。1. 拿到附件先摸清它是什么文件识别三板斧的先后顺序1.1 file、xxd、binwalk 该按什么顺序上很多人做题的习惯是先 binwalk -e 一把梭这在附件是固件或者多层嵌套压缩包的时候很爽但在宽带信息泄露这题上其实用不上。我自己的固定顺序是三步先用file看系统怎么判断再用xxd看头部几十个字节的魔数最后才决定要不要上 binwalk。file con xxd con | head -n 4file的输出大概率是data。别慌data不是坏消息它只说明这个文件没有匹配到系统里已知的那几百种常见格式。这恰恰符合路由器备份配置的特征它是厂商自己定义的私有二进制结构不是通用格式所以 file 认不出来。接着用 xxd 看头部。这一步的价值在于排除法。如果开头是1f 8b那是 gzip50 4b 03 04是 zip42 5a 68是 bzip27f 45 4c 46是 ELF 可执行文件89 50 4e 47是 png。只要这些都不匹配而你又能在里面看到大片规律性的字节就可以初步判断这是个结构化的二进制配置而不是被压缩过的容器。1.2 为什么这题的第一个坑是以为它是压缩包这道题最常见的翻车开局是把文件名或者前几个字节误读成压缩包然后一直试图解压。附件有时候命名很朴素比如就叫con或者config.bin看起来人畜无害但也正因为太朴素反而让人下意识觉得肯定得先解压。这里有个判断诀窍用binwalk跑一遍看有没有可识别的嵌套结构。binwalk con如果输出只有孤零零一行、没有任何偏移量上的文件签名那基本可以断定它是个平铺的配置文件没有嵌套。反过来如果 binwalk 列出好几个偏移那才需要考虑binwalk -e或者手动dd切出来。把这步做完你心里就有底了这不是一个容器而是一份被厂商加工过的配置数据接下来要做的是解析而不是解压。2. 路由器里的宽带账号密码到底是怎么被备份出来的2.1 PPPoE 拨号凭据实际存放在哪里要理解这题得先知道家用宽带的上网流程。绝大多数家庭宽带走的是 PPPoE 拨号运营商给你一个宽带账号和密码路由器在 WAN 口用这组凭据发起认证认证通过后才拿到公网地址。这组凭据在路由器里是必须持久保存的否则每次断电重启都要手动重输用户体验直接崩盘。在基于嵌入式系统的路由器里这类需要掉电不丢的配置通常存在 NVRAM 里——你可以把它理解成一块专门给配置用的小存储区类似 PC 上的 BIOS 设置区。NVRAM 里存着 WAN 连接类型、宽带账号、宽带密码、WiFi 的 SSID 和密码、管理员登录口令等等。当用户在管理后台点击备份配置时路由器做的事就是把 NVRAM 里的这块数据整体打包导出一个文件方便日后恢复或者换机迁移。2.2 厂商把凭据写进配置文件的几种常见做法导出格式各家不一样但大致能归成三类我整理成一张表方便对照存储方式典型表现提取难度明文存储strings 直接能看到账号密码最低扫字符串即可固定异或混淆字段可读但值乱码整体像被翻过中等需要找到 XOR key私有加密/校验头部有 magic正文近似随机较高依赖厂商算法早期和低端型号偏爱明文或者简单异或因为便宜、省资源。中高端型号才会引入带校验的加密防止用户随便改配置文件绕过某些限制。宽带信息泄露这道题的附件就落在能被现成工具识别的区间里——也就是说它的格式恰好被 RouterPassView 支持不需要你自己逆算法。2.3 为什么信息泄露在现实里同样成立这题虽然是 CTF但它映射的是一个真实存在的风险场景。二手路由器转卖时如果没恢复出厂设置买家把配置导出来就能直接拿到卖家的宽带账号密码固件升级包或者调试用的配置备份被随手丢到公开的地方同样会造成泄露。我在实际排查中见过更离谱的有人把整台路由器的备份文件当成配置文件模板上传到论坛求人帮忙改结果宽带凭据、管理密码、WiFi 密码全在里面。所以这道题真正想训练的能力是看到一份设备备份文件时立刻意识到里面可能有敏感凭据。3. RouterPassView把路由器备份配置翻译成人话的利器3.1 工具的来源与使用边界RouterPassView 是 NirSoft 出品的一个小工具专门用来读取和解析各种家用路由器、光猫导出的配置文件把里面被编码或混淆过的密码字段还原成明文。它的核心价值在于内置了大量厂商的格式识别逻辑能自动嗅探你丢给它的文件属于哪种结构。获取渠道就走它的官方网站这一点很重要——这类专门读密码的工具在网上被二次打包投毒的案例非常多随便从网盘下一个 exe很可能没读出密码先中了个木马。我一般会在虚拟机里跑这类工具跑完就还原快照图个干净。注意工具本身只负责解析你自己合法持有的配置文件。用于分析自己设备的备份、或者 CTF 题目附件都没问题别拿去碰不属于你的数据。3.2 打开文件与结果页面的读法用法简单到有点无聊。打开 RouterPassView菜单里选File→Open Router Config File然后把附件选进去或者更省事直接把文件拖进窗口。解析完成后主界面会给你一张表格列大致是这么几类信息Entry Type条目的类型比如 PPPoE、Wireless、Admin 等Entry Name字段名比如 UserName、PasswordData/Value这一栏就是还原出来的明文值我拿到表格后的第一件事是在 Entry Type 那一列里找 PPPoE 或者 WAN 相关的行。因为题目叫宽带信息泄露答案几乎必然和宽带拨号凭据挂钩。找到之后展开看用户名和密码会各占一行那串密码就是你最后要交的东西。3.3 哪一栏才是本题要交的答案这一步是最容易自我怀疑的地方因为表格里往往不止一个密码。你可能会同时看到PPPoE 的宽带拨号密码Wireless 的 WiFi 密码Admin 的后台管理密码三个都是密码选错了就白干。判断依据是看它挂在哪个类型下面只有挂在 PPPoE 或 WAN 类型下的那一条才是宽带凭据。这也解释了为什么题名叫宽带信息泄露而不是WiFi 信息泄露或者后台密码泄露——出题人已经把答案的分类写在标题里了。我这次跑出来的结果就是 PPPoE 段里的那串拨号密码直接复制出来按题目要求的格式提交即可。不同镜像或者附件版本可能会有细微差异所以永远以你本地工具输出的明文为准别去背别人博客里的字符串。4. 手上没有 Windows用 Linux 和 Python 复现同样的提取过程4.1 strings 加关键词字典的暴力筛查现实做题环境里经常没有 Windows只有一台 Linux 虚拟机。这时候不要慌配置文件里但凡有一部分字段是明文或者近明文的用 strings 就能捞出来。strings -a con | grep -iE ppp|pass|user|admin|wan|dial|account这里有两个细节值得说。第一-a是强制扫描整个文件不因为某段看起来不像文本就跳过默认行为在某些版本上会漏掉东西。第二很多嵌入式固件内部用的是宽字符也就是 UTF-16这时候普通 strings 抓不到得加-e参数strings -a -e l con | grep -iE ppp|pass|user|admin strings -a -e b con | grep -iE ppp|pass|user|admin-e l是小端 UTF-16-e b是大端两个都试一遍。我踩过的坑就是只跑了默认的 ASCII 扫描结果一个字都没捞到还以为是加密文件其实数据就在那儿只是编码不对。4.2 一段三十行能跑完的 Python 排查脚本当字符串扫描结果太杂或者需要批量看上下文时我更倾向于写个小脚本把文件里所有长度合理的可打印串连同偏移打出来再人工挑。import re with open(con, rb) as f: data f.read() # 先扫 ASCII 可打印串长度 4 以上 for m in re.finditer(rb[\x20-\x7e]{4,}, data): print(hex(m.start()), m.group().decode(ascii, ignore))如果确认是 UTF-16把正则换成宽字节版本再跑一遍import re with open(con, rb) as f: data f.read() for m in re.finditer(rb(?:[\x20-\x7e]\x00){3,}, data): print(hex(m.start()), m.group().decode(utf-16le, ignore))脚本的价值不只是能扫出来而是给你偏移量。有了偏移你就能对着 xxd 看这一段的周边结构判断它是字段名还是字段值甚至能反推出字段之间的排列规律。这种带着上下文看数据的习惯比单纯 grep 出个结果有用得多。4.3 遇到加密配置时的三种应对思路如果附件不是明文字符串扫不出任何有意义的东西那就得考虑它被加密或强混淆了。这时候有三个方向可以试第一找已知明文。配置里通常会有固定的字段名或者 magic 头比如PPPoE、厂商标识、固定版本号。拿已知明文去和密文异或往往能把 XOR key 直接逼出来——尤其是单字节异或一段已知明文就够。第二查同型号固件的已知格式。路由器固件圈子里有大量公开的分析资料很多厂商的配置格式早就被逆过一遍你能找到对应的解析脚本或者文档。第三直接找现成解析器。除了 RouterPassView还有一些开源脚本针对特定厂商。用关键词搜厂商名 config decrypt通常能找到线索。当然这条路的效率取决于题目用的是不是主流型号出题人一般会选一个工具现成能识别的格式否则题目难度就失控了。5. 这道题最容易翻车的几个细节5.1 编码与乱码先排除终端问题再怀疑文件提取出来的明文出现乱码时很多人第一反应是加密了其实大部分情况是编码问题。RouterPassView 在 Windows 上显示中文一般没问题但如果你的系统区域设置不是中文某些 GBK 编码的字段名可能会显示成问号或者方块。Linux 侧的 strings 更明显终端 locale 不对的时候中文会被吞掉或者显示成乱码。我的一般做法是先用locale确认终端是 UTF-8然后用iconv试着转一下编码。strings -a -e l con | grep -i ppp | iconv -f GBK -t UTF-8如果转完能读通了那说明就是编码问题不是加密。这一步能省掉大量无谓的逆向时间。5.2 提交格式flag 包裹还是裸串大小写要不要保留Bugku 不同题目的提交格式并不统一有的要flag{xxx}有的直接填裸串。宽带信息泄露这类题通常是把你找到的那串凭据原样提交。判断方法很简单看题目描述里有没有给出格式示例。没有给的话先按裸串提交一次如果提示错误再试着包一层flag{}或者按照平台通用的格式补上。大小写和空格一定要原样保留。密码字段是逐字节敏感的我见过有人提取时不小心带了个尾部空格或者把全角括号当成半角输进去反复提交失败还以为是工具用错了。复制的时候尽量用原始的复制粘贴别手打。5.3 别把工具输出一股脑当成答案RouterPassView 的输出是一整张表不是单个答案。新手常见的做法是把整张表截图或者整段文本复制去提交必然失败。正确姿势是先定位到 PPPoE 那一类再取Data列里对应的值只拿这一个字段。同样的道理用 Python 脚本扫出来的字符串列表也只是一堆候选需要你根据字段名和上下文筛出真正那一条。提示找到候选值后先在本地把它和周边字段一起看一遍确认它紧挨着 PPPoE 或者 Password 这样的标识再做提交成功率高得多。6. 从这一题迁移出去配置文件泄露类题目的通用打法宽带信息泄露做完之后你会发现它其实是一类题的模板。类似的还有光猫配置备份、IP 摄像头配置文件、监控录像机的导出参数、甚至一些嵌入式设备的cfg文件。它们的共同特征是附件不遵循通用格式、体积不大、内部是结构化的键值数据而答案通常藏在某个密码或凭据字段里。我把这类题的通用流程固化成四步写下来方便你以后直接套识别filexxdbinwalk判断它是不是容器有没有嵌套。试探stringsASCII 和 UTF-16 都试扫关键词快速判断有没有明文。解析有现成工具就用工具没有就上脚本配合偏移量做人工分析。定位在解析结果里按字段类型缩小范围只取题目要求的那一个值。这套流程的关键在于第 2 步的快速判断它能在半分钟内告诉你这题是走工具流还是走逆流向避免在不该花力气的地方死磕。我给自己维护了一份关键词字典每次遇到新设备就往里加几个厂商名和字段名字典越厚后面 grep 一次命中的概率就越高。最后分享一个小习惯每做完一道配置文件类题目我都会把附件头部的前 64 字节、以及一个字段名列表记到自己的笔记里。做得多了你会发现很多厂商的字段命名高度雷同PPPoE、WAN、Dial、UserName、Passwd 翻来覆去就那几个。下次再拿到一个陌生文件还没开工具光看 xxd 里的字段名就能猜出个七八成。这道宽带信息泄露本质上就是在训练这种看一眼就知道该往哪儿挖的直觉。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →