TACACS 植入服务器密钥错误

网络工程 思科-ios 塔卡克斯 cisco-nx-os
2021-07-23 17:53:03

在删除了我们不再拥有的旧 TACACS 服务器后,我正在我们的网络上实施一个新的 TACACS 服务器。我已经使用 NX-OS 设备进行了实现,但是在尝试添加tacacs-server host x.x.x.x key 7 ENCRYPTED_KEY命令时出现以下错误:

%无效的加密密钥:

我确实注意到 NX-OS 设备上的加密密钥以字母数字形式列出,但 IOS15 设备上的旧 tacacs 密钥以十六进制列出。我是否需要在 IOS15 设备的 TACACS 服务器上通过不同的散列算法运行密钥?

2个回答

回答你的问题:是的。;)

问题的解决实际上很简单,事实证明 - 我将引用我的发现:

The NX-OS password scheme is a normal rotation cipher. This is the sequence:

3 22 4 5 18 0 21 5 18 3 10 5 16 22 4 16 24 17 12 5 21 18 5 22 19 7

This means for 'cisco123'

c + 3 = f
i + 22 - 26 (i+22 is > 26) = i - 4 = e
s + 4 = w
c + 5 = h
o + 18 - 26 (o+18 is > 26) = o - 8 = g

Numbers and other non-alphabetic characters are unchanged.

来源:评论http://blog.ipspace.net/2007/11/type-7-decryption-in-cisco-ios.html

这样 - 解密密钥,在你的第一个 IOS 设备上输入它的明文,从中复制解密的密钥show run- 你就完成了。

以下 perl 代码将基于上述内容进行加密/解密。不是最优雅或最紧凑的代码,但它有效。

use Readonly;
Readonly my @nxseq => ( 3, 22, 4, 5, 18, 0, 21, 5, 18, 3, 10, 5, 16, 22, 4, 16, 24, 17, 12, 5, 21, 18, 5, 22, 19, 7 );

sub encrypt_nxos7 {
    my $ep = shift;
    my $dp = '';
    for ( my $i = 0; $i < length($ep); $i += 1 ) {
        my $char_p = substr( $ep, $i, 1 );
        if ( $char_p =~ /[a-z]/ ) {
            my $ord = ord($char_p);
            $ord -= 97;
            $ord += $nxseq[$i];
            $ord = $ord % 26;
            $ord += 97;
            $dp .= chr($ord);
        }
        elsif ( $char_p =~ /[A-Z]/ ) {
            my $ord = ord($char_p);
            $ord -= 65;
            $ord += $nxseq[$i];
            $ord = $ord % 26;
            $ord += 65;
            $dp .= chr($ord);
        }
        else {
            $dp .= $char_p;
        }
    }
    return $dp;
}

sub decrypt_nxos7 {
    my $ep = shift;
    my $dp = '';
    for ( my $i = 0; $i < length($ep); $i += 1 ) {
        my $char_p = substr( $ep, $i, 1 );
        if ( $char_p =~ /[a-z]/ ) {
            my $ord = ord($char_p);
            $ord -= 97;
            $ord -= $nxseq[$i];
            $ord += 26 if ( $ord < 0 );
            $ord += 97;
            $dp .= chr($ord);
        }
        elsif ( $char_p =~ /[A-Z]/ ) {
            my $ord = ord($char_p);
            $ord -= 65;
            $ord -= $nxseq[$i];
            $ord += 26 if ( $ord < 0 );
            $ord += 65;
            $dp .= chr($ord);
        }
        else {
            $dp .= $char_p;
        }
    }
    return $dp;
}