Oct 11, 2011

Cisco's IOS 密碼加解密

前幾天跟為需要,剛在在研究 cisco ios 的密碼,它的主要加解密如下

利用一組 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 的方式。


Links