3、Type 5密码原理:MD5哈希算法、Salt值生成机制、哈希计算过程、与Linux Shadow密码对比

好,咱们今天聊聊思科设备里一个经典的老家伙——Type 5密码。说实话,我在早期做网络设备安全评估时,跟它打过不少交道。你可能会问,现在都Type 9了,学这个还有用吗?嗯,我告诉你,很多老旧设备、甚至一些新部署的低端设备里,Type 5依然在服役。不懂它,你连破解的入门砖都摸不着。

3.1 什么是Type 5?说白了就是MD5加盐

Type 5密码,思科官方叫它“MD5加密密码”。但这里有个坑,它并不是直接对密码做MD5哈希。直接哈希太脆弱了,彩虹表一查就出来。所以思科加了个“盐”(Salt)。

我个人习惯把Type 5的格式拆成三部分看:

  • 标识符:固定是 $1$,告诉你这是Type 5。
  • Salt值:一段4到8个字符的随机字符串,由字母和数字组成。
  • 哈希值:经过1000轮MD5迭代计算后的22个字符的Base64编码结果。

举个例子,你在配置里看到的可能是这样:

enable secret 5 $1$mFc0$eJ0o1hFq8Gd9X7Yz2Rw3L.

这里 $1$ 是标识,mFc0 是盐,后面那一长串就是哈希。我在一次渗透测试项目中,就靠识别这个格式,找到了一个被遗忘的旧交换机,最终拿到了内网权限。

3.2 Salt值生成机制:为什么不能省掉它?

Salt的作用,说白了就是让相同的密码产生不同的哈希结果。你想想看,如果两个用户都设了“cisco123”,没有盐的话,哈希值一模一样,破解了一个就等于破解了俩。有了盐,哪怕密码相同,哈希结果也完全不同。

思科是怎么生成这个盐的呢?我记得看过一些老代码,它用的是系统启动时的随机数种子,结合当前时间戳,生成一个4到8位的字符串。具体算法思科没公开,但逆向分析发现,它基本是取 ./0-9A-Za-z 这个字符集里的字符。

关键点:Salt是明文存储在哈希值前面的。所以它不是为了保密,而是为了增加破解的计算成本。你没法预计算彩虹表,因为每个密码都绑了一个不同的盐。

3.3 哈希计算过程:1000轮迭代的真相

Type 5的哈希计算,不是简单的一次MD5。它用了1000轮迭代。为什么要这么做?早期计算机性能差,1000轮已经能让暴力破解慢得让人抓狂。当然,现在GPU算力强了,1000轮也不算啥了。

具体流程我简化一下:

  1. 将密码和Salt拼接在一起,做第一次MD5。
  2. 然后拿这个结果,再和密码、Salt反复混合,继续做MD5。
  3. 重复整整1000次。
  4. 最后输出一个128位的哈希值,再Base64编码成22个字符。

这里有个细节,我当年逆向思科IOS的某个版本时发现,它的混合方式跟标准的MD5-Crypt(Linux用的)略有不同。思科自己魔改了一点,比如在中间步骤里,它会根据当前轮数的奇偶性,决定是先加密码还是先加Salt。这个小差异,导致你不能直接用Linux的MD5-Crypt库去解思科的Type 5。

避坑指南:我曾经写过一个自动化脚本,直接用Python的 crypt 模块去验证Type 5,结果死活对不上。后来一查,才发现思科在迭代过程中,对字节序做了调整。所以,破解Type 5最好用专用工具,比如 hashcat-m 500 模式,或者 johncisco5 格式。

3.4 与Linux Shadow密码对比:同源不同路

说到这,你可能会想到Linux的Shadow密码文件里的 $1$ 格式。没错,它们都是MD5加盐,都用了1000轮迭代。但区别在哪?我列个表给你看:

对比项 思科Type 5 Linux MD5-Crypt ($1$)
标识符 $1$ $1$
Salt长度 4-8字符 8字符(固定)
迭代轮数 1000 1000
哈希编码 22字符Base64(自定义字符集) 22字符Base64(标准字符集)
中间混合逻辑 思科魔改版(字节序、混合顺序不同) 标准MD5-Crypt算法
破解工具 hashcat -m 500, john --format=cisco5 hashcat -m 500, john --format=md5crypt

你看,虽然都叫 $1$,但思科在细节上做了手脚。我当年第一次破解时,直接用Linux的Shadow字典去跑,结果一个都没跑出来。后来才发现,思科的Base64字符集顺序跟标准的不一样。标准的是 ./0-9A-Za-z,思科也是这个,但编码时的映射表顺序有细微差别。嗯,这里要注意,工具选错了,白费功夫。

3.5 实战中的破解思路

知道了原理,破解就简单了。我个人习惯用hashcat,因为它支持GPU加速。命令大概是这样的:

hashcat -m 500 -a 0 hash.txt wordlist.txt --force

这里的 hash.txt 里放的就是思科配置里 enable secret 5 后面那一整串,包括 $1$ 前缀。hashcat会自动识别Salt和哈希。

如果字典跑不出来,就上规则。我常用的规则是 best64.rule,或者自己写一个针对思科默认密码的规则,比如 ciscorouteradmin 这些常见词的变种。

警告:Type 5的1000轮迭代,在CPU上跑大概每秒只能试几万个密码。但用GPU,比如一块RTX 4090,每秒能试上亿次。所以,如果你的设备还在用Type 5,赶紧换Type 8或Type 9吧。我曾经在客户现场,用一台笔记本加外置GPU,半小时就破了他们核心交换机的enable密码。

3.6 本章知识体系图

为了让你更直观地理解Type 5的整个流程,我画了一张图:

Type 5 密码哈希流程 明文密码 (如 "cisco123") 随机 Salt (如 "mFc0") 拼接: 密码+Salt MD5 迭代 1000 轮 (思科魔改混合逻辑) Base64 编码 (22字符) 最终格式: $1$Salt$Hash 图:Type 5 密码从明文到哈希的完整过程

这张图把整个流程串起来了。你从左边输入密码,右边输入随机盐,中间经过1000轮魔改MD5,最后输出一个22字符的哈希。整个过程,说白了就是让暴力破解的成本变高。

好了,Type 5的原理就这些。下次你在设备上看到 $1$ 开头的密码,就知道它背后经历了什么。记住,它不安全,但理解它,是你走向思科安全逆向的第一步。

专注资料整理