🚧
Настоящий материал подготовлен исключительно в образовательных и исследовательских целях.
Он не содержит призывов к каким-либо действиям, нарушающим законодательство.
Автор(ы) не несут ответственности за последствия использования изложенной информации.
Использование/применение представленных сведений осуществляется на ваш страх и риск.
Информация предоставляется исключительно для законного изучения и анализа. Любое использование описанных методов для несанкционированного доступа к данным или системам является незаконным и строго запрещено.
Любое использование материала в незаконных целях нарушает закон и не одобряется авторами.
Для начала, разберемся как работает распаковка через терминал и что мы будем использовать при написании скрипта.
1
  | "path\to\7-Zip\7z.exe" x -pPASSWORD "path\to\someWinRARArchive.rar" -o"path\to\output" -y
  | 
path\to\7-Zip\7z.exe - это путь до 7z.exex - распаковать архив-p - использовать пароль при распаковкиpath\to\someWinRARArchive.rar - путь до WinRAR архива-o - указать куда будет распакован архивpath\to\output - путь куда будет распакован архив-y - Yes/Да подтвердить замену файлов, если они уже существуют.
📝
Указывать параметры после флагов -p и -o нужно без пробелов.
Итак, у нас есть архив с паролем: qwerty.
Если мы введем данную команду в терминал с неправильным паролем:
1
  | "path\to\7-Zip\7z.exe" x -p123 "path\to\someWinRARArchive.rar" -o"path\to\output" -y
  | 
То мы получим ошибку:
1
2
3
4
5
6
  | Can not open encrypted archive. Wrong password?
Can't open as archive: 1
Files: 0
Size:       0
Compressed: 0
  | 
После выполнения этой команды, мы можем использовать:
И в ответ мы получим 2. Это означает что команда была выполнена с ошибкой. Если мы снова введем команду, но уже с верным паролем, а потом проверим errorlevel, то мы получим 0.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  | "path\to\7-Zip\7z.exe" x -pqwerty "path\to\someWinRARArchive.rar" -o"path\to\output" -y
Everything is Ok
Folders: 1
Files: 1
Size:       12
Compressed: 334
echo %errorlevel%
0
  | 
Из этого следует, что мы можем использовать errorlevel в скрипте, для проверки был ли пароль верен, или же нет, и подбирать пароль дальше, пока errorlevel не будет равен 0.
Создаем файл с расширением .bat или .cmd. Начинаем скрипт с:
Чтобы скрыть лишний вывод.
Просим пользователя ввести путь до каталога с 7z:
Записываем это в переменную z7dir:
Проверяем существует ли каталог 7z, если нет, то выводим ошибку:
1
2
3
4
5
6
7
8
  | if not exist "%z7dir%" (
  echo.
  echo ERROR!
  echo 7z dir - "%z7dir%"
  echo Not be found...
  pause
  exit
)
  | 
Аналогично делаем с архивом:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  | echo - Path to archive:
set /p archive="#: "
if not exist "%archive%" (
  echo.
  echo ERROR!
  echo Archive "%archive%"
  echo Not be found...
  pause
  exit
)
  | 
Спрашиваем пользователя куда распаковать архив:
1
2
  | echo - Path to output:
set /p output="#: "
  | 
И тоже самое со словарем, где находятся пароли:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  | echo - Path to wordlist.txt:
set /p wordlist="#: "
if not exist "%wordlist%" (
  echo.
  echo ERROR!
  echo Wordlist - "%wordlist%"
  echo Not be found...
  pause
  exit
)
  | 
Далее пишем цикл, который будет построчно записывать данные из wordlist.txt в переменную, каждую итерацию:
1
2
3
4
5
6
7
8
  | for /f "tokens=*" %%a in ('type "%wordlist%"') do (
  set pwd=%%a
  call :try
)
echo.
echo Oh-uh... Password not be found...
pause
exit
  | 
Шаманим с "tokens=*" и 'type "%wordlist%"' для того, чтобы юзер мог использовать пути с пробелами.
И вызываем блок кода (подпрограмму) call: :try, который идет далее:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  | :try
"%z7dir%\7z.exe" x -p%pwd% "%archive%" -o"%output%" -y >nul 2>&1
echo Try: %pwd%
if /I %errorlevel% EQU 0 (
  echo.
  echo Archive was successfully unpacked!
  echo Password is: %pwd%
  pause
  exit
)
  | 
"%z7dir%\7z.exe" x -p%pwd% "%archive%" -o"%output%" -y - команда для распаковки архива, но с нашими переменными.
>nul 2>&1 - «выводит вывод» в никуда, дабы не спамить логами 7z.
echo Try: %pwd% - выводит перебираемые пароли.
if /I %errorlevel% EQU 0 () - если выпоенная команда распаковки архива, errorlevel = 0, значит команда выполнилась успешно.
Используя call :try мы вызываем подпрограмму (или же просто блок кода), который после выполнения возвращается обратно к тому месту в скрипте, где был сделан вызов, и продолжается выполнение следующих команд. В нашем случае:
1
2
3
4
  | echo.
echo Oh-uh... Password not be found...
pause
exit
  | 
Уведомление о том что пароль не был подобран. Но если условие оказывается верным, мы так же видим следующие уведомление:
1
2
3
4
5
  | echo.
echo Archive was successfully unpacked!
echo Password is: %pwd%
pause
exit
  | 
Полный код скрипта
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  | @echo off
:: 7z
echo - Path to 7z dir:
set /p z7dir="#: "
if not exist "%z7dir%" (
  echo.
  echo ERROR!
  echo 7z dir - "%z7dir%"
  echo Not be found...
  pause
  exit
)
echo Path to 7z: %z7dir%
echo OK!
echo.
:: WinRAR Archive
echo - Path to archive:
set /p archive="#: "
if not exist "%archive%" (
  echo.
  echo ERROR!
  echo Archive "%archive%"
  echo Not be found...
  pause
  exit
)
echo Path to archive: %archive%
echo OK!
echo.
:: Output
echo - Path to output:
set /p output="#: "
echo Path to output: %output%
echo.
:: Wordlist
echo - Path to wordlist.txt:
set /p wordlist="#: "
if not exist "%wordlist%" (
  echo.
  echo ERROR!
  echo Wordlist - "%wordlist%"
  echo Not be found...
  pause
  exit
)
echo Wordlist: %wordlist%
echo OK!
echo.
echo Starting bruting...
echo.
:: Wordlist for
for /f "tokens=*" %%a in ('type "%wordlist%"') do (
  set pwd=%%a
  call :try
)
echo.
echo Oh-uh... Password not be found...
pause
exit
:try
"%z7dir%\7z.exe" x -p%pwd% "%archive%" -o"%output%" -y >nul 2>&1
echo Try: %pwd%
if /I %errorlevel% EQU 0 (
  echo.
  echo Archive was successfully unpacked!
  echo Password is: %pwd%
  pause
  exit
)
  | 
Улучшения#
Давайте улучшим наш скрипт, и сделаем так, чтобы он в первую очередь брал значения из условного config.txt. А если файла config.txt нет, или он не полный, то скрипт будет запрашивать значения у юзера.
Для этого придется самую малость переписать скрипт и создать config.txt:
1
2
3
4
  | z7dir=path\to\
archive=path\to\
output=path\to\
wordlist=path\to\
  | 
Добавляем это в самое начало скрипта:
1
2
3
4
5
  | if exist "config.txt" (
  for /f "tokens=1,* delims==" %%a in (config.txt) do (
    set %%a=%%b
  )
)
  | 
if exist "config.txt" проверяет существует ли файл config.txt, если он не существует, то соответственно код внутри блока не выполняется.
Далее цикл, который перебирает все строки в файле:
1
2
3
  | for /f "tokens=1,* delims==" %%a in (config.txt) do (
  set %%a=%%b
)
  | 
tokens=1,* указывает, что нужно разделить каждую строку на два токена: первый токен до знака = и второй токен - все, что после.
delims== устанавливает знак = в качестве разделителя.
Для каждой строки в файле config.txt, %%a = имя переменной, а %%b = значения переменной.
set %%a=%%b соответственно присваивает значения переменной %%a = %%b.
То есть выглядит это так:
%%a | = | %%b | 
|---|
| z7dir | = | значение | 
| archive | = | значение | 
| output | = | значение | 
| wordlist | = | значение | 
И как можно догадаться, порядок строк в config.txt не имеет значения.
Теперь проверяем есть ли у переменной значение:
1
2
3
4
  | if not defined z7dir (
  echo - Path to 7z dir:
  set /p z7dir="#: "
)
  | 
Если переменная отсутствует в файле config.txt, или если нету самого config.txt, то значение у переменной соответственно нету, и скрипт запрашивает данные у юзера.
Если же все в порядке, то скрипт просто выполняется дальше.
Мы получаем, такой немного измененный код:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  | if not defined z7dir (
  echo - Path to 7z dir:
  set /p z7dir="#: "
)
if not exist "%z7dir%" (
  echo.
  echo ERROR!
  echo 7z dir - "%z7dir%"
  echo Not be found...
  pause
  exit
)
echo Path to 7z: %z7dir%
echo OK!
  | 
И тоже самое нужно сделать и с другими переменными.
И просто для галочки, сделаем чтобы юзеру нужно было подтвердить начало брута.
Но сделаем это сразу правильно, чтобы юзер вводя абракадабру, подтверждение выводилось повторно.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  | :yesornot
echo Start bruting? (y/n)
set /p yesornot="#: "
if /I "%yesornot%"=="y" (
  call :startbruting
) else if /I "%yesornot%"=="n" (
  echo OK!
  pause
  exit
) else (
  echo ERROR!
  echo.
  call :yesornot
)
  | 
А перед кодом, где начинается брут пишем: :startbruting.
Код
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  | @echo off
:: config.txt
if exist "config.txt" (
  for /f "tokens=1,* delims==" %%a in (config.txt) do (
    set %%a=%%b
  )
)
:: 7z
if not defined z7dir (
  echo - Path to 7z dir:
  set /p z7dir="#: "
)
if not exist "%z7dir%" (
  echo.
  echo ERROR!
  echo 7z dir - "%z7dir%"
  echo Not be found...
  pause
  exit
)
echo Path to 7z: %z7dir%
echo OK!
echo.
:: WinRAR Archive
if not defined archive (
  echo - Path to archive:
  set /p archive="#: "
)
if not exist "%archive%" (
  echo.
  echo ERROR!
  echo Archive - "%archive%"
  echo Not be found...
  pause
  exit
)
echo Path to archive: %archive%
echo OK!
echo.
:: Output
if not defined output (
  echo - Path to output:
  set /p output="#: "
)
echo Path to output: %output%
echo.
:: Wordlist
if not defined wordlist (
  echo - Path to wordlist.txt:
  set /p wordlist="#: "
)
if not exist "%wordlist%" (
  echo.
  echo ERROR!
  echo Wordlist - "%wordlist%"
  echo Not be found...
  pause
  exit
)
echo Wordlist: %wordlist%
echo OK!
echo.
:: Yes OR Not?
:yesornot
echo Start bruting? (y/n)
set /p yesornot="#: "
if /I "%yesornot%"=="y" (
  call :startbruting
) else if /I "%yesornot%"=="n" (
  echo OK!
  pause
  exit
) else (
  echo ERROR!
  echo.
  call :yesornot
)
:startbruting
echo .
echo Starting bruting...
echo.
:: Wordlist for
for /f "tokens=*" %%a in ('type "%wordlist%"') do (
  set pwd=%%a
  call :try
)
echo.
echo Oh-uh... Password not be found...
pause
exit
:try
"%z7dir%\7z.exe" x -p%pwd% "%archive%" -o"%output%" -y >nul 2>&1
echo Try: %pwd%
if /I %errorlevel% EQU 0 (
  echo.
  echo Archive was successfully unpacked!
  echo Password is: %pwd%
  pause
  exit
)
  | 
Источник