🚧
Автор статьи никого ни к чему не призывает!
Эта статья написана в образовательных целях.
Не воспринимайте написанное здесь всерьез и не повторяйте за автором.

Для начала, разберемся как работает распаковка через терминал и что мы будем использовать при написании скрипта.

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.exe
  • x - распаковать архив
  • -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

После выполнения этой команды, мы можем использовать:

1
2
echo %errorlevel%
2

И в ответ мы получим 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. Начинаем скрипт с:

1
@echo off

Чтобы скрыть лишний вывод.

Просим пользователя ввести путь до каталога с 7z:

1
echo - Path to 7z dir:

Записываем это в переменную z7dir:

1
set /p 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
)

Источник