× К оглавлению На главную Об авторе

Дата и время публикации   :

Проблема и решение


1. Суть проблемы

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

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

Поэтому здесь пойдет речь о том, как сделать пароли безопасными за счет тестирование их на стойкость и отсутствие в подобных базах. Такие пароли соответственно следует избегать использовать.

Внимание! Автор данной статьи рассматривает применение всех перечисленных утилит только с целью повышения безопасности серверных и домашних систем под управлением ОС GNU/Linux и просит не использовать полученные после её прочтения навыки в военных, секретных и/или преступных целях наносящие вред здоровью людей, их репутации, имуществу и иных действиях, предусматривающие ответственность за правонарушения в сфере информации, информационных технологий и защиты информации

И вообще, ребята хулиганить плохо. Давайте жить дружно!

2. Решение

2.1 Использование генератора паролей

Самым простым и известным для использования является pwgen [3.1], установка которого на Debain показана в дампе 2.1.1

Дамп 2.1.1

$ sudo apt install pwgen
...
Следующие НОВЫЕ пакеты будут установлены:
  pwgen
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 19,6 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 52,2 kB.
Пол:1 http://deb.debian.org/debian bullseye/main amd64 pwgen amd64 2.08-2 [19,6 kB]
Получено 19,6 kB за 0с (156 kB/s)  
Выбор ранее не выбранного пакета pwgen.
(Чтение базы данных … на данный момент установлено 223124 файла и каталога.)
Подготовка к распаковке …/pwgen_2.08-2_amd64.deb …
Распаковывается pwgen (2.08-2) …
Настраивается пакет pwgen (2.08-2) …
Обрабатываются триггеры для man-db (2.9.4-2) …
...

Генератор пароля pwgen позволяет создать достаточно стойкий пароль, как показано в дампе 2.1.2

Дамп 2.1.2

user@home:~$ pwgen -1 --symbols -n 8
Is!oh7ro

Где, как минимум один символ пароля является числовым, специальным символом из ряда ~!@#$%^&*()_+`[{}]\|/?><,./ (опция --symbols или -y), символом в верхнем/нижнем регистре и,наконец, c заданным числом символов в аргументе к опции -n . При этом, рекомендуется обязательно использовать опцию -v, которая предназначена для "замусоривания" специальными символами, чтобы не допустить генерации паролей, содержащие непристойный английский сленг или напоминающие о нем, как показано в дампе 2.1.3

Дамп 2.1.2

user@home:~$ pwgen -1 -v --symbols -n 8
xlFw[j3W

Для получения целого ряда паролей следует просто не указывать опцию -1, как показано в дампе 2.1.3, в обратном случае будет предложено около вариантов 160 паролей, как показано в дампе 2.1.3

Дамп 2.1.2

user@home:~$ pwgen -v --symbols -n 8
rQn&5.WQ `dDT;v35 \7@HSWt| J%5T[:l| M7g;v2HD T5//dd"H V*Tk%}53 3t._q%H9
*QJ7tT|+ T6bXs}@m !b]WVd6r +\nh(|J4 z3#7sHJ: #3=gm'MM BLV6w~|_ `6-NN?jF
st)K7J&r &*8Pk2h# ql&5&Bw] Z&)WW~8b %j5m8x/J PT+jLT*5 &.~>ZM&7 $:?]G7m>
*#SCk{g5 ZjC-+N2N PM@|sX3) P;lx?>2Z Z54c-v+W lj-J7~>f wj>%KT5t X+3G9Qn{
"@{2})B( z;+W3D~) Hw8RH7@n "-4"S^9] -n?vp5*H 3M&qnGw' ;)Frw4h# 4"q4sn*L
t2g!w5H= K@P$jls6 BW.2^Xd" 85zX29'# !nTB/$94 K#3>s\zv Pd;)-l7j &-V4B7@R
2#g`R8h; 7ZK8`gv# ;M]QQj5$ k5>@jW"2 :X6V`qvc gpRjx=6` \"5"\^@Q \R!7g[2s
~TQ~qc5D WXzgG96( CQq/%52x GCxNWP/4 sN;t4kx7 FvT#RFX8 -|kF?`7n 6#l`jF~-
cF:6d>q@ 4,gkW8|j fDff+7c@ }5?KS\(4 FnCfw;]8 >g54G3T& ')_77cJ_ &gGC583v
"~Fm5JPR N~6L&c5$ 2WFq5:Ql VLc9fg@f 6h:j-mS@ bZj(H8+H C[Lxs72m ?R9g`H:N
vJ3Zcb.q 3[m;C&`| z4``kM)- ]V{ZtB39 K/p"g7!6 n:3j^Lp" Hh2^*]xT }F6Dk^t]
)2/9mTP` nK'f\XS9 Hz82xM(Z l48;c)zS R.2BL~[\ {XK'96Sq 8mb#x2Qd HR2:L@)\
X@8B59jL q(JH7N(' mkC5#L3j [z[Zj`7J W`|D^d4d ;p`)Bm9) Dl#79D>H s("7gLkG
M(%3*}K& cz3Nv|8[ !q4V7@cW [Nl2(]bH wT`hv7%5 ?b3[9JZ+ }3w=|pVX *}3FcnR*
HwB7.BF# l6sJj~F\ Lk@r%g~5 2/2T8n|] <9l,Gb'6 *=.W-3s9 *mW}D4-q X-P*7!"l
k.DR-|G9 `7lCBKH^ 4)|JdXt& .>X88%L) sp?6+Xk? N9'?5#B' =#k2:VHD T}]5DBj|
D`'T*rK3 ;%Bw2x?# )<~.w7;F nKnr\2hV 2#%2?sHH bH8WPX[$ 5T'nQPT$ 8b6J:Fp2
D,v]4)[9 6VP.B$3? ]472.gKQ w'H2H[b= dJbVVk&7 |h[HD;5. !QK6P%5# L[2@x$Qc
r6F:S{c^ ],;6Xsz; ..68F}@f }W.\{4~Q *f9*DvzM )>H-C/6/ V)sLPb?2 "6,Kn6fP
*w92[NNd 3\r=V?FR bKbzWZ7\ ]$@5WP(V d'XK3$%_ j8G$GJ+m !4'\L|]_ 6`K^">jV  

2.2 Тестирование пароля на стойкость

Перед тем как назначить пароль учетной записи, особенно использующей широкоизвестное имя типа admin, предлагаю протестировать пароль. Для чего воспользоваться модулем Password Strength [3.2] набирающего свою бешеную популярность Python и который нужно доустановить, как показано в дампе 2.2.1

Дамп 2.2.1

$ pip install password-strength                    
Collecting password-strength                                                    
  Downloading password_strength-0.0.3.post2-py2.py3-none-any.whl (12 kB)        
Requirement already satisfied: six in /usr/lib/python3/dist-packages (from password-strength) (1.15.0)
Installing collected packages: password-strength
Successfully installed password-strength-0.0.3.post2
from password_strength import PasswordPolicy

После чего, можно выполнить скрипт check-password-safe.py,код которого показан в листинге 2.2.2

Листинг 2.2.2

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from password_strength import PasswordPolicy

''' You test your passwords using the Policy object that controls what kind of password is acceptable in your system.

First, create the Policy object and define the rules that apply to passwords in your system: '''

policy = PasswordPolicy.from_names(
    length=8,      # min length: 8
    uppercase=2,   # need min. 2 uppercase letters
    numbers=2,     # need min. 2 digits
    special=2,     # need min. 2 special characters
    nonletters=2,  # need min. 2 non-letter characters (digits, specials, anything)
) 

import sys
n = len(sys.argv)
if n == 2 : 

   print( 'What is missing? >>> ' + str(policy.test(sys.argv[n-1])) )
   sys.exit(0)

else:
   print ('Error: too many or missing arguments!')
   sys.exit(0)

Где проводится проверка на то, чтобы длинна пароля состояла не менее из 8-ми символов, а сам он содержал как минимум два символа: цифровых (digits), алфавитных в верхнем регистре (uppercase letters), специальных из ранее приводимого ряда (special) и не относящиеся к алфивитно-буквенным (non-letter characters).

Так, если брать пароль из 8-ми симоволов, сгененрированных pwgen, существует большая вероятность, что одного из каких-либо выше перечисленных символов не будет хвать, как показано в дампе 2.2.3

Дамп 2.2.3

$ ./check-password-safe.py 'BW.2!Xd"'
What is missing? >>> [Numbers(2)]
$ ./check-password-safe.py '&*8Pk2h#'
What is missing? >>> [Uppercase(2)]

Поэтому лучше делать пароль не менее 12, а лучше 16-ти или даже 19-ть символов, чтобы удовлетворять условиям стойкости пароля, как показано в дампе 2.2.4

Дамп 2.2.3

$ ./check-password-safe.py 'jX/2b4=nhPWM4?RB'
What is missing? >>> []

Также, можно проверить локально стойкость назначаемого пароля с помощью pw-inspector, который проверяет на пароль на соответствие требований:

Пример использования pw-inspector приводится в дампе 2.3.2

Дамп 2.3.2

$ pwgen -v --symbols -n 8 -1 | pw-inspector -l -u -n -p
$ pwgen -v --symbols -n 19 -1 | pw-inspector -l -u -n -p
qbZ&9{Jl($Cp5xXTpqT

В котором показано, что пароль сгенерированный pwgen из 8-ми символов не всегда может удовлетворять искомым требованиям, а вот из 19 практически на все сто процентов.

2.4 Проверка стойкости пароля к подбору cо стороны внешнего нарушителя

Когда речь заходит о стойкости пароля, то обычно имеют в виду ту малую долю вероятности, когда пароль можно подобрать, например по известным базам, так называемых плохих или простых паролей, состоящих не более чем из 5-ти символов. При этом, для паролей с длинной от 6-ти и более символов считается слишком долгой и мало перспективной задачей, выделено жирным в дампе 2.4.1a

Дамп 2.4.1a

$ hydra -f -V -t 64 -x 3:6:aA1% -l admin 192.168.7.2 ssh 
Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2021-03-07 09:44:55
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4

[ERROR] definition for password bruteforce (-x) generates more than 4 billion passwords - this is not a bug in the program, it is just not feasible to try so many attempts. Try a calculator how long that would take. duh.

При этом выделенная жирным ошибка говорит нам, что это не баг в программе, а генерация комбинаций более чем 4 миллиадов паролей слишком непосольная ноша...

Приведенная только что одна из известных утилит, которая позволяет выполнять такую проверку, называется Hydro,относящейся к классу опасных взломщиков сетевых аккаунтов и поддерживающая различные протоколы сетевых служб:

adam6500, afp, asterisk, cisco, cisco-enable, cvs, firebird, ftp, ftps, http[s]-{head|get|post}, http[s]-{get|post}-form, http-proxy, http-proxy-urlenum, icq imap[s], irc ldap2[s], ldap3[-{cram|di‐gest}md5][s], mssql, mysql(v4), mysql5, ncp, nntp, oracle, oracle-listener, oracle-sid, pcanywhere, pcnfs, pop3[s], postgres, rdp, radmin2, redis, rexec, rlogin, rpcap, rsh, rtsp, s7-300, sapr3, sip, smb, smtp[s], smtp-enum, snmp, socks5, ssh, sshkey, svn, teamspeak, telnet[s], vmauthd, vnc, xmpp

Так, в дампе 2.4.1б показана проверка на стойкость к несложным паролям, состоящих из 1-5 символов.

Дамп 2.4.1б

$ hydra -t 64 -f -V -x 3:5:aA1% -l admin 192.168.2.1 ssh

Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
...
[STATUS] 73.00 tries/min, 73 tries in 00:01h, 1008443510 to do in 230238:15h, 8 active
[ATTEMPT] target 192.168.88.254 - login "admin" - pass "aeu" - 273 of 1008439592 [child 57] (0/41)
[ATTEMPT] target 192.168.88.254 - login "admin" - pass "aev" - 274 of 1008439592 [child 22] (0/41)
[ATTEMPT] target 192.168.88.254 - login "admin" - pass "aew" - 275 of 1008439592 [child 56] (0/41)
[ATTEMPT] target 192.168.88.254 - login "admin" - pass "aex" - 276 of 1008439592 [child 58] (0/41)
[ATTEMPT] target 192.168.88.254 - login "admin" - pass "aey" - 277 of 1008439592 [child 62] (0/41)
[ATTEMPT] target 192.168.88.254 - login "admin" - pass "aez" - 278 of 1008439592 [child 7] (0/41)
[ATTEMPT] target 192.168.88.254 - login "admin" - pass "aeA" - 279 of 1008439592 [child 39] (0/41)
...

Где передаются следующие опции и аргументы к ним [3.4] :

При этом, в дампе 2.4.1 жирным выделено, что Hauser/THC & David Maciejak просит не использовать в военных, секретных и/или преступных целях их детище.

В виде отдельных аргументов указывается доменное имя / адрес IP и используемый протокол, в данном случае – SSH

Для проверки списком, например, из базы известных и засвеченных паролей Bruteforce Database, как показано в дампе 2.4.2

Дамп 2.4.2

$ hydra -f -V -t 64 -l admin -P 1000000-password-seclists.txt 192.168.2.1 ssh 

Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway)

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2021-03-04 15:44:19
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[WARNING] Restorefile (you have 10 seconds to abort... (use option -I to skip waiting)) from a previous session found, to prevent overwriting, ./hydra.restore
[DATA] max 64 tasks per 1 server, overall 64 tasks, 1000000 login tries (l:1/p:1000000), ~15625 tries per task
[DATA] attacking ssh://192.168.7.2:22/
[ATTEMPT] target 192.168.7.2 - login "admin" - pass "123456" - 1 of 1000000 [child 0] (0/0)
[ATTEMPT] target 192.168.7.2 - login "admin" - pass "password" - 2 of 1000000 [child 1] (0/0)
[ATTEMPT] target 192.168.7.2 - login "admin" - pass "12345678" - 3 of 1000000 [child 2] (0/0)
[ATTEMPT] target 192.168.7.2 - login "admin" - pass "qwerty" - 4 of 1000000 [child 3] (0/0)
[ATTEMPT] target 192.168.7.2 - login "admin" - pass "123456789" - 5 of 1000000 [child 4] (0/0)
[ATTEMPT] target 192.168.7.2 - login "admin" - pass "12345" - 6 of 1000000 [child 5] (0/0)
[ATTEMPT] target 192.168.7.2 - login "admin" - pass "1234" - 7 of 1000000 [child 6] (0/0)
[ATTEMPT] target 192.168.7.2 - login "admin" - pass "111111" - 8 of 1000000 [child 7] (0/0)
[ATTEMPT] target 192.168.7.2 - login "admin" - pass "1234567" - 9 of 1000000 [child 8] (0/0)
...

При этом для загрузки алфавитно-цифровых и иных последовательностей символов из файла для подачи на вход удаленно серверу SSH используется опция -P вместо опции -x

3. Библиография

3.1 It's Foss. 5 Useful Password Generators For Linux

3.2 PyPI. Module password-strength

3.3 Manual page. HYDRA

3.4 Security Tutorials. Brute Forcing Passwords with THC-Hydra

3.5 GitHub. Project bruteforce-database