Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.

Announcement

Collapse
No announcement yet.

Giải mã mật khẩu Cisco Type 7

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Giải mã mật khẩu Cisco Type 7

    Hi all,
    Chúng ta biết mật khẩu trong Router Cisco được lưu dưới 3 dạng:
    * Type 0: là dạng clear text, không có mã hóa
    * Type 7: mã hóa các mật khẩu khi sử dụng lệnh service password-encryption
    * Type 5: hash MD5 các mật khẩu khi sử dụng lện enable secret

    Chúng ta cũng biết mật khẩu dạng type 7 có thể được giải mã một cách dễ dàng sử dụng các tools trên mạng hoặc sử dụng lệnh key-chain để giải mã trong chính router.
    Trong bài viết này, tôi sẽ không hướng dẫn cách sử dụng tools để giải mã vì các bạn chỉ mất 5s tìm trên Google là có ngay đáp án, mà tôi sẽ tập trung vào phân tích thuật toán mà Cisco đã sử dụng để mã hóa cũng như giải mã mật khẩu type 7 cũng như viết demo một chương trình dùng để mã hóa và giải mã mật khẩu.

    Let's go

    Cisco mã hóa mật khẩu Type 7 sử dụng thuật toán Vigenere nên trước tiên ta tìm hiểu sơ qua về thuật toán này.
    Bảng mã hóa:
    Click image for larger version

Name:	vigenere-substitution-table.jpg
Views:	1
Size:	87.7 KB
ID:	208766
    Chuỗi cần mã hóa: ATTACKATDAWN
    Khóa: LEMON
    Lặp lại khóa cho đến khi chiều dài khóa bằng chiều dài của chuỗi cần mã hóa: LEMONLEMONLE
    Lấy cột A giao với dòng L, ta được L
    Lấy cột T giao với dòng E, ta được X
    ....
    Làm tương tự, ta sẽ có được chuỗi mã hóa tương ứng với ATTACKATDAWN là LXFOPVEFRNHR

    Vì thuật toán này khá đơn giản nên Cisco làm cho nó khó hơn 1 chút bằng cách chọn khóa là một chuỗi ngẫu nhiên các ký tự (nhưng giống nhau cho tất cả các phiên bản IOS), và thay vì so cột với hàng để lấy ra ký tự mã hóa thì sử dụng thuật toán XOR giữa 1 ký tự của chuỗi plain-text với 1 ký tự của khóa để ra được mã hex của chuỗi mã hóa. Nhưng nếu thế thì với cùng một chuỗi plain-text sẽ được cùng 1 chuỗi mã hóa nên Cisco làm cho khó hơn nữa bằng cách phát sinh 1 số ngẫu nhiên (từ 1 đến chiều dài của chuỗi khóa) làm vị trí bắt đầu cho khóa.

    Chuỗi khóa: dsfd;kfoA,.iyewrkldJKDHSUBsgvca69834ncxv9873254k;f g87 (chuỗi này người ta tìm được bằng cách reverse các IOS của Cisco)

    Ví dụ: Để mã hóa chuỗi cisco, router sẽ phát sinh 1 số ngẫu nhiên từ 0 đến 53 (là chiều dài của chuỗi khóa), giả sử là 4 (đếm từ 0 nha mọi người). Đây là vị trí bắt đầu cho khóa. Vì chiều dài khóa và chiều dài chuỗi plain-text bằng nhau nên khóa sẽ là ;kfoA
    Lấy mã ascii của c = 99 XOR với mã ascii của ; = 59 được 88, đổi sang Hexa là 0x58
    Tương tự, lấy ascii('i') XOR ascii('k') = 2 --> Hexa: 0x02
    ascii('s') XOR ascii('f') = 21 --> Hexa: 0x15
    ascii('c') XOR ascii('o') = 12 --> Hexa: 0x0c
    ascii('o') XOR ascii('A') = 46 --> Hexa: 2e
    Ta có được chuỗi mã hóa là 5802150c2e

    Để giải chuỗi trên, ta làm ngược lại bằng cách lấy chuỗi mã hóa XOR với khóa.
    0x58 XOR ascii(';') = 99 --> tra bảng mã ascii = c
    0x02 XOR ascii('k') = 105 --> tra bảng mã ascii = i
    Làm tương tự là sẽ được chuỗi plaintext ban đầu là cisco

    Vậy có bạn sẽ đặt câu hỏi rằng cho chuỗi mật khẩu Cisco đã mã hóa, làm sao biết sẽ XOR với ký tự nào để ra được chuỗi ban đầu vì khóa chỉ là một chuỗi con của chuỗi khóa? OK, rất thông minh. Dĩ nhiên là Cisco phải có cách của nó, đó là ghi luôn cái số ngẫu nhiên đó vào chuỗi mã hóa, nhưng dưới dạng số Decimal chứ không phải số Hexa.
    Ví dụ: Cho chuỗi mã hóa 0822455d0a16, thì 08 chính là vị trí bắt đầu của khóa trong chuỗi khóa.
    Chiều dài khóa = (chiều dài chuỗi mã hóa - 2)/2 vì mỗi ký tự trong chuỗi khóa ứng với 2 số Hexa
    ==> Chiều dài khóa = 5 ==> Khoá là: A,.iy
    Làm tương tự các bước trên, ta sẽ có được chuỗi plaintext ban đầu.

    Cuối cùng là phần demo tôi viết bằng Python. Nghĩ tới đâu viết tới đó nên có thể không tối ưu.
    '''
    Created on Apr 23, 2013
    @author: HOANBQ
    Purpose: decrypt Cisco type 7 password
    '''
    import random

    # Bảng xlat chứa mã ASCII của các ký tự trong chuỗi khóa
    xlat = (100, 115, 102, 100, 59, 107, 102, 111, 65, 44, 46, 105, 121, 101, 119, 114, 107, 108, 100, 74, 75, 68, 72, 83, 85, 66, 115, 103, 118, 99, 97, 54, 57, 56, 51, 52, 110, 99, 120, 118, 57, 56, 55, 51, 50, 53, 52, 107, 59, 102, 103, 56, 55)
    # Hàm giải mã
    def decrypt(ep):
    dp = ''
    s = int(ep[:2]) # Lấy ra 2 ký tự đầu tiên trong chuỗi mã hóa, đổi sang kiểu int
    for i in range(2, len(ep),2):
    dp += chr(xlat[s] ^ int('0x' + ep[i:i+2],16)) #Thực hiện phép toán XOR (^) giữa 1 số trong bảng xlat kể từ vị trí khởi tạo với 2 chữ số trong chuỗi ep
    s += 1
    if s % 53 ==0: # Nếu vượt quá 53 thì quay về đầu chuỗi khóa
    s = 0
    print(dp)
    #return dp

    # Hàm mã hóa
    def encrypt(dp):
    # Tạo số ngẫu nhiên từ 0 đến chiều dài chuỗi
    init_xlat = random.randint(0, len(xlat) + 1)
    if init_xlat < 10: #Nếu số này < 10 thì thêm số 0 ở đầu
    ep = '0'+str(init_xlat)
    else:
    ep = str(init_xlat)
    for s in dp:
    ep_temp = hex(ord(s) ^ xlat[init_xlat])[2:] #Vì hàm hex trả về 1 chuỗi có chữ 0x nên phải bỏ 2 ký tự này đi
    if len(ep_temp) == 1: #Nếu chiều dài chuỗi sau khi bỏ 0x = 1 thì thêm số 0 ở đầu
    ep_temp = '0' + ep_temp
    ep += ep_temp
    init_xlat += 1
    if init_xlat % 53 == 0: #Nếu vượt quá 53 thì quay về đầu chuỗi khóa
    init_xlat = 0
    print(ep)
    return ep

    if __name__ == '__main__':
    dp = 'cisco' #Dữ liệu thử nghiệm
    ep = encrypt(dp)
    decrypt(ep)
    Last edited by hoanbq; 26-04-2013, 06:57 PM.
    Từ nay quyết chí đi tu, ráng luyện công mong ngày thành chính quả. Nam mô a di đà phật. Thiện tai. Thiện tai.

  • #2
    Đánh dấu, rùi đọc sau, cái này chua à!
    Cám ơn anh BQ Hoan
    Cuộc sống có bao lâu mà hững hờ

    Comment


    • #3
      ***********************************************
      Last edited by hoanbq; 30-07-2013, 10:34 AM.
      Từ nay quyết chí đi tu, ráng luyện công mong ngày thành chính quả. Nam mô a di đà phật. Thiện tai. Thiện tai.

      Comment

      Working...
      X