2017-03-17 14 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