🚧
Автор статьи никого ни к чему не призывает!
Эта статья написана в образовательных целях.
Не воспринимайте написанное здесь всерьез и не повторяйте за автором.
Для начала, разберемся как работает распаковка через терминал и что мы будем использовать при написании скрипта.
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
)
|
Источник