2017-03-17 13 views
0

我在創建TACACS +客戶端腳本時遇到問題。 (7,0,57,0,b'10.163.255.107:無效的AUTHEN/START數據包(檢查鍵)',b''),但我可以得到迴應,表示我的密鑰與服務器不匹配解碼來自tac_plus服務器的密鑰確實匹配的地方。另外,我在調試模式下使用tac_plus服務器,並查看前四個或五個字節的相同值,然後數據發生變化。然而,腳本中的所有散列值都與服務器上的散列值相匹配。我想知道是否在字符串到字節轉換。下面是我生成taca_plus的散列的地方tacacs client scriipt md-5 ...再次

def encrypt(packet, tac_key): 
    seed = packet[4:8] + bytes(tac_key, 'utf-8') + packet[:1] + packet[2:3] 

    hash = None 
    while 1: 
     if hash is None: 
      hash = MD5.new(seed).digest() 
     else: 
      hash = MD5.new(seed + hash).digest() 
     for char in hash: 
      yield char 

我首先打包了tac_plus/tacacs主體。

def tac_body(user, data, rem_addr='10.163.255.201', port="TCP49"): 
    user_len = len(user) 
    port_len = len(port) 
    rem_addr_len = 0 
    data_len = len(data) 
    fmt = "! B B B B B B B B %ds %ds %ds" % (user_len, port_len, data_len) 
    body = struct.pack(fmt, TAC_AUTHEN_LOGIN, TAC_PLUS_PRIV_LVL_USER, TAC_PLUS_AUTHEN_TYPE_PAP, 
        TAC_PLUS_AUTHEN_SVC_LOGIN, user_len, port_len, rem_addr_len, data_len, 
        bytes(user, 'utf-8'), bytes(port, 'utf-8'), bytes(data, 'utf-8')) 
    return body 

然後用此加密...

encrypted_data = ''.join([chr(operator.xor(c[0], c[1])) for c in zip(body, encrypt(header, tac_key))]) 

我開始得到確信它有事情做與tac_key字符串,因爲我可以通過改變編碼改變的哈希值。

+0

爲什麼不先嚐試未加密? –

+0

以什麼方式?你的意思是完全刪除tacacs密鑰,並執行asiii登錄或你的意思是在加密數據上創建哈希值? –

+0

根據[RFC](https://tools.ietf.org/html/draft-grant-tacacs-02)(第6頁),「TACACS +」可以選擇發送未加密的數據包。 –

回答

-1

在此期間,我想到了一切。當我發送加密部分時,我不得不用latin-1編碼它。

msg = header + bytes(encrypted_data, encoding='latin-1')` 

去圖。

+0

請注意,值0-31和127-159不是拉丁-1,也不可顯示。真正需要使用處理所有值的編碼,十六進制和Base64是最常見的。或者,如果他們不需要頂部可顯示的話,就使用一個字節數組。參見[ISO/IEC 8859-1,拉丁字母](https://en.wikipedia.org/wiki/ISO/IEC_8859-1)。 – zaph