Черная археология датамайнинга: что может быть эффективнее атаки по словарю?
Для тех, кому лениво читать дальше, сразу скажу ответ: атака «логин равен паролю». По статистике, логин равный паролю встречается чаще, чем самый распространенный пароль из словаря. Далее в статье будут некоторые статистические исследования на эту тему, и история, с которой всё началось.
Начать такое исследование меня побудила одна история, произошедшая в далёком 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 наиболее распространенных паролей:
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 |
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 |
Вывод
Сейчас на многих почтовых порталах (но очень редко на обычных сайтах и форумах) нельзя задать пароль, равный логину. Однако, за всё время мне встретился только один сайт, в котором нельзя было задать пароль, прибавив один символ к логину. Сайт так и писал: «ваш пароль очень похож на логин». Однако такая ситуация в современном интернете скорее исключение.
Между тем, атаки с подбором пароля путём небольшой модификации логина оказываются достаточно эффективными по частоте встречаемости, и не требующими большой сложности по количеству вариантов.
Конечно, если сравнивать интегральную сложность — атака по словарю несколько выгоднее. Зато, атаки модификацией логина не учитываются в системах безопасности даже на крупных порталах.
################################################
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 году почтовые пароли?