Черная археология датамайнинга: что может быть эффективнее атаки по словарю?

Для тех, кому лениво читать дальше, сразу скажу ответ: атака «логин равен паролю». По статистике, логин равный паролю встречается чаще, чем самый распространенный пароль из словаря. Далее в статье будут некоторые статистические исследования на эту тему, и история, с которой всё началось.

89d69943a1f04dae9661aa1d99b29e5e.png

Начать такое исследование меня побудила одна история, произошедшая в далёком 2000 году с неким молодым человеком. Не будучи хакером, он захотел взломать почтовый ящик одной особы. Её логин заканчивался на две цифры, примерно так: masha86@mail.com. После тривиальных паролей, которые не подошли, парень предположил, что пароль может выглядеть следующим образом: mashaDD, где DD — это две произвольные цифры. Сложность этой атаки всего 100 попыток, и примерно на двадцатой попытке пароль подошел, ящик был взломан. Чего только не сделаешь в молодости из-за ревности и ради любви…

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

Для начала, кроме 6 млн. паролей от почтовых записей, я подключил к исследованию базу паролей с одного не-почтового сайта на 3.5 млн. записей. Это свежие записи (май 2015 года), содержащие достаточно мало невалидных паролей. Статистику по паролям с этого сайта я строил отдельно.

Пароль равен логину
Количество записей, где пароль равен логину: примерно 87 тысяч для почтовых паролей, 50 тысяч для паролей с сайта. Это много или мало? Для сравнения привожу два наиболее часто встречающиеся пароля (1 и 2 место в распределении). Также для удобства привожу значения в тысячных долях (‰) от общего количества паролей.

Почтовые пароли     Пароли с сайта
Количество Количество
Пароль равен логину 86908 14.3 Пароль равен логину 49327 14.0
Топ-1 »123456» 82830 13.6 Топ-1 «qwerty» 33322 9.5
Топ-2 «qwerty» 53144 8.7 Топ-2 »123456» 21775 6.2

Частичное совпадение
Далее посмотрим, насколько часто встречаются случаи, где пароль — это небольшая модификация логина. Такие случаи не столь часты, зато это компенсируется небольшой сложностью атаки.

Почтовые пароли Пароли с сайта
Вид атаки Сложность Количество Количество
Пароль и логин отличаются
на один последний символ
~70 1835 0.30 20869  (!) 5.93
Отличаются на два символа,
причем на числа:
100 1702 0.28 1226 0.35
Для пароля добавили один символ ~100 5508 0.90 1930 0.55
Или два ~10000 5087 0.84 3269 0.93
Добавили 4, но только цифры от 100
до 10000
7267 1.19 3252 0.92

По частоте, все эти случаи попадают в топ-50 наиболее распространенных паролей:

Топ-50 почтовых паролей
123456 82830
qwerty 53144
123456789 23286
111111 13831
qwertyuiop 12399
qwe123 9021
1234567890 8364
1234567 7452
12345 6420
password 6410
12345678 6374
123321 6170
7777777 5861
123123 5533
0 4977
666666 4197
1qaz2wsx 4181
qazwsx 4143
1q2w3e4r 3982
654321 3760
555555 3539
123qwe 2973
1q2w3e4r5t 2967
zxcvbnm 2832
qweqwe 2816
gfhjkm 2806
1q2w3e 2748
klaster 2695
112233 2565
121212 2445
987654321 2371
159753 2338
777777 2204
qwer1234 2015
1234qwer 1999
qwerty123 1846
1234 1801
asdfgh 1779
abc123 1722
123654 1568
222222 1557
iloveyou 1508
987654321 1432
samsung 1427
zxcvbn 1422
ghbdtn 1313
88888888 1311
marina 1284
131313 1268
asdfghjkl 1243


Топ-50 паролей с сайта
qwerty 33322
123456 21775
(пустой пароль) 20002
UsdopaA (боты) 16016
123456789 8298
1234567890 4117
qwertyuiop 2247
123321 2235
1234567 2214
1q2w3e4r5t 2142
111111 2004
1q2w3e4r 1682
123qwe 1554
123123 1364
qazwsx 1319
1q2w3e 1256
qazwsxedc 1196
qwe123 1186
qweasdzxc 1126
9379992 1020
0 1018
4815162342 1015
iloveyou 991
12345678 979
666666 977
zxcvbnm 957
asdfgh 930
Jskasgfdfjg 923
gfhjkm 914
qwertyuiop[] 904
1234qwer 899
1q2w3e4r5t6y 890
qwerty123 839
nastya 799
555555 770
987654321 755
ghbdtn 746
12345qwert 740
159753 737
loveyou 735
1234554321 716
7777777 711
1qaz2wsx 708
123123123 679
samsung 670
123qweasdzxc 662
adidas 642
asdfghjkl 641
789456123 636

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

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

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

R-код, если кому-то интересно
################################################

DATA <- readRDS( file = "ClearData.rds" )

################################################
################################################

# Всего записей: 3520000

nrow(DATA)

# Логин совпадает с паролем: 49327

length( which( DATA$login == DATA$passwd) )

################################################

# Для пароля добавили один символ: 1930

length( 
  which( 
    substr( DATA$login ,0, nchar(DATA$login) ) ==
      substr( DATA$passwd ,0, nchar(DATA$passwd)-1 ) 
  )
)

# Или два: 3269

length( 
  which( 
    substr( DATA$login ,0, nchar(DATA$login) ) ==
      substr( DATA$passwd ,0, nchar(DATA$passwd)-2 ) 
  )
)

################################################

# На четыре (но только на цифры): 3252

length( 
  which( 
    (
      substr( DATA$login ,0, nchar(DATA$login) ) ==
        substr( DATA$passwd ,0, nchar(DATA$passwd)-4 ) 
    ) & 
      (
        grepl(
          "\\d\\d\\d\\d",    
          substr( DATA$passwd ,nchar(DATA$passwd)-3,nchar(DATA$passwd) )
        )
      )
  )
)

################################################

# Пароль и логин отличаются на один последний символ: 20869

length( 
  which( 
          (
            substr( DATA$login ,0, nchar(DATA$login)-1 ) ==
            substr( DATA$passwd ,0, nchar(DATA$passwd)-1 ) 
          ) & ( DATA$login != DATA$passwd )
            
        )
)

################################################

# Отличаются на два символа (1477), причем на числа: 1226

length( 
  which( 
    (
      substr( DATA$login ,0, nchar(DATA$login)-2 ) ==
        substr( DATA$passwd ,0, nchar(DATA$passwd)-2 ) 
    ) & ( DATA$login != DATA$passwd ) &
      (
          substr( DATA$login ,0, nchar(DATA$login)-1 ) !=
          substr( DATA$passwd ,0, nchar(DATA$passwd)-1 ) 
      ) &
      (
        grepl(
          "\\d\\d",    
          substr( DATA$passwd ,nchar(DATA$passwd)-1,nchar(DATA$passwd) )
        )
      )
  )
)

################################################
################################################

### Строим топ паролей

library(dplyr)

tmpD <- DATA[,c(3,4)]

PASS_SUM <- summarise(group_by(tmpD,passwd), count = sum(count) )

PASS_SUM <- arrange(PASS_SUM,desc(count))

# Количество уникальных паролей: 2132935
nrow(subset(PASS_SUM, PASS_SUM$count==1))

# Количество невалидных паролей: 887
nrow(subset(PASS_SUM, PASS_SUM$count>64))

PASS_100 <- PASS_SUM[1:100,]

write.csv(PASS_100,file = "SpPassSum100.csv", row.names = F)

###########################################


Предыдущий выпуск: Черная археология дата майнинга

В следующем номере: сравнение базы почтовых паролей с базой паролей не-почтового сайта. Насколько полезны оказались утекшие в 2014 году почтовые пароли?

© Habrahabr.ru