LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 561|回复: 0

SuSE10.3 vpnc问题 (解决)

[复制链接]
发表于 2007-11-3 08:01:25 | 显示全部楼层 |阅读模式
VPNC 在suse 10.3上不能正常工作, 显示错误信息
Error: either "to" is duplicate, or "hoplimit" is a garbage.

原因是iproute 被更新了

解决方法如下
更改/usr/share/vpnc/vpnc-script
找到
if [ -n "$IPROUTE" ]; then
fix_ip_get_output () {
增加
sed 's/cache//;s/metric[ 0-9]\+//g;s/hoplimit [ 0-9]\+//g'
注释掉过去的
# sed 's/cache//;s/metric[0-9]\+ [0-9]\+//g'
}



vpnc.conf中使用的组密码需要解密为明文
解码程序如下


[PHP]
/* Decoder for password encoding of Cisco VPN client.
   Copyright (C) 2005 Maurice Massar
   Thanks to HAL-9000@evilscientists.de for decoding and posting the algorithm!

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

/*
   Requires libgcrypt version 1.1.90 or newer
   Compile with:
    gcc -Wall -o cisco-decrypt cisco-decrypt.c $(libgcrypt-config --libs --cflags)
   Usage:
    ./cisco-decrypt DEADBEEF...012345678 424242...7261
*/

#include <stdio.h>
#include <stdlib.h>
#include <gcrypt.h>
#include <errno.h>

int hex2bin_c(unsigned int c)
{
        if ((c >= '0')&&(c <= '9'))
                return c - '0';
        if ((c >= 'A')&&(c <= 'F'))
                return c - 'A' + 10;
        if ((c >= 'a')&&(c <= 'f'))
                return c - 'a' + 10;
        return -1;
}

int hex2bin(const char *str, char **bin, int *len)
{
        char *p;
        int i, l;
       
        if (!bin)
                return EINVAL;
       
        for (i = 0; str != '\0'; i++)
                if (hex2bin_c(str) == -1)
                        return EINVAL;
       
        l = i;
        if ((l & 1) != 0)
                return EINVAL;
        l /= 2;
       
        p = malloc(l);
        if (p == NULL)
                return ENOMEM;
       
        for (i = 0; i < l; i++)
                p = hex2bin_c(str[i*2]) << 4 | hex2bin_c(str[i*2+1]);
       
        *bin = p;
        if (len)
                *len = l;
       
        return 0;
}

int c_decrypt(char *ct, int len, char **resp, char *reslenp)
{
        const char *h1  = ct;
        const char *h4  = ct + 20;
        const char *enc = ct + 40;
       
        char ht[20], h2[20], h3[20], key[24];
        const char *iv = h1;
        char *res;
        gcry_cipher_hd_t ctx;
        int reslen;
       
        if (len < 48)
                return 0;
        len -= 40;
       
        memcpy(ht, h1, 20);
       
        ht[19]++;
        gcry_md_hash_buffer(GCRY_MD_SHA1, h2, ht, 20);
       
        ht[19] += 2;
        gcry_md_hash_buffer(GCRY_MD_SHA1, h3, ht, 20);
       
        memcpy(key, h2, 20);
        memcpy(key+20, h3, 4);
        /* who cares about parity anyway? */
       
        gcry_md_hash_buffer(GCRY_MD_SHA1, ht, enc, len);
       
        if (memcmp(h4, ht, 20) != 0)
                return -1;
       
        res = malloc(len);
        if (res == NULL)
                return -1;
       
        gcry_cipher_open(&ctx, GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC, 0);
        gcry_cipher_setkey(ctx, key, 24);
        gcry_cipher_setiv(ctx, iv, 8);
        gcry_cipher_decrypt(ctx, (unsigned char *)res, len, (unsigned char *)enc, len);
        gcry_cipher_close(ctx);
       
        reslen = len - res[len-1];
        res[reslen] = '\0';
       
        if (resp)
                *resp = res;
        if (reslenp)
                *reslenp = reslen;
        return 0;
}

int main(int argc, char *argv[])
{
        int i, len, ret = 0;
        char *bin, *pw;
       
        gcry_check_version(NULL);
       
        for (i = 1; i < argc; i++) {
                ret = hex2bin(argv, &bin, &len);
                if (ret != 0) {
                        perror("decoding input");
                        continue;
                }
                ret = c_decrypt(bin, len, &pw, NULL);
                free(bin);
                if (ret != 0) {
                        perror("decrypting input");
                        continue;
                }
                printf("%s\n", pw);
                free(pw);
        }
       
        exit(ret != 0);
}


[/PHP]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表