利用一組 byte array 當做轉換碼
char xlat[] = { 0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f, 0x41, 0x2c, 0x2e, 0x69, 0x79, 0x65, 0x77, 0x72, 0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44, 0x48, 0x53 , 0x55,
加密方式:
1. 先選出一個 seed number,做為 xlat 的起始字元,但此數字需為 0x0 ~ 0xF
2. 密碼字串每一個字與 xlat[seed++] 字 XOR,之後把字元轉成字串
cencrypt(char *dec_pw, char *enc_pw) { unsigned int seed = dec_pw[0] % 16; unsigned int p = 0; unsigned int i = 0; unsigned int val = 0; enc_pw[p++] = (seed >> 4 & 0xf) + '0'; enc_pw[p++] = (seed & 0xf) + '0'; for(i = 0; i < strlen(dec_pw); i++) { val = dec_pw[i] ^ xlat[seed++]; enc_pw[p] = (val >> 4 & 0xf) + '0'; if(enc_pw[p] > '9') { enc_pw[p] = enc_pw[p] - ':' + 'A'; } p++; enc_pw[p] = (val & 0xf) + '0'; if(enc_pw[p] > '9') { enc_pw[p] = enc_pw[p] - ':' + 'A'; } p++; } printf("%s\n", enc_pw); return 0; }範例:
$ ./cisco_encrypt -e Cisco
032752180500
第一組 03 為 seed number,此 number 為 'C' % 16 得到
第二組 27 為 'C' ^ xlat[0x3] 得到
第三組 52 為 'i' ^ xlat[0x4] 得到,之後以此類推
Conclution
雖然 cisco 的 password type 7 可被很容易的反解出來,而且早在 1997 就已被公開反解方式,但到目前 2011 年已過了十四年,cisco還是沒打算更改加密的方式,我想這有幾個可能的原因,首先,在古早的網路設備裡,大多數的 control plane 上的 CPU 都很慢,重點主要是 data plane 上的 FPGA or ASIC,為了減少 control plane 的負擔,用最簡單的方式,當然,我想,這因該不是主要的原因。另外,從目前手上的機器(Cisco Aironet 1260)來看,它的 Default Config,登入用的 username, password 與 enable password 都是大家所知道的 "Cisco",而它的 enable password 使用 MD5 而不是 reversible 的方式。enable secret 5 $1$50r.$jwGnU838Lega3wGEBCpZ30 ! username Cisco password 7 032752180500
另外,如你要拿到 running-config 一定要先進入 enable mode,所以原則上你是拿不到此機器的 config file,另外,除非對方剛好也有開 SNMP 而且你也剛好知道它的 community string,又剛好此 community 被設成有 read-write permission,那當然就有辨法拿到 config file,不過這時已不是 username password 的問題了,對方大可直接使用 SNMP 來對你的機器惡搞。
最後,從目前我所知道的知識裡,看來,cisco 對於 username 可使用 type 7 來加密對於安全上不太會有多大的問題,當然你也可使用 type 5 的方式。