<style> .reveal { font-size: 36px; } </style> # Web App Pentest ## Authentication --- Вопросы по заданиям? --- ## OWASP A2: Broken Authentication Модули программных средств, связанные с аутентификацией и управлением сессиями, часто реализуются неправильно, что позволяет злоумышленникам взломать пароли, ключи или токены сессий или использовать другие недостатки реализации, чтобы получить идентификационные данные других пользователей. --- ## Определения Идентификация — процесс определения, что за человек перед нами. Аутентификация — процесс подтверждения, что этот человек именно тот, за кого себя выдает. Авторизация — процесс принятия решения о том, что именно этой аутентифицированной персоне разрешается делать. --- ## Факторы аутентификации * знание (пароль) * обладание (смарт карты, криптографические токены, телефон (SIM-карта)*) * биометрия ![](https://i.imgur.com/fKf8cem.png) --- ## О сессиях * Типы сессионной информации * Время жизни * Передача на серверную сторону --- ## Результат аутентификации В результате аутентификации веб-приложение может выдавать пользователю: * Случайные сессионные идентификаторы; * Подписанные сессионные данные (например, JWT). <демонстрация сессий PHP> <демонстрация jwt.io> --- ## Сравнение | | **Преимущества** | **Недоостатки** | | ------------------------- | -------------------------- | ------------------------------------------ | | **Сессионные идентификаторы** | Можно отзывать | Сессионную информацию нужно где то хранить | | **JWT** | На один запрос в БД меньше<br/>Встроенное "протухание" | Не могут быть отозваны<br/>Утечка секрета приводит к компрометации **всех** учетных записей | --- ## Сессионные идентификатооры Обычно реализуются фреймворком или средой (например, в PHP встроена поддержка 'PHPSESSID'). При самостоятельной реализации: * нужна достаточная энтропия (желательно > 256 бит); * использовать надежный генератор псевдослучайных чисел (в описании генераторов обычно что-то написано про возможность их использования для криптографии, если такое упоминание есть, значит годится). --- ## JWT При работе с JWT нужно: - использовать надежный секрет. Список ненадежных: https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list --- ## Время жизни сессий Зависит от приложения: * от 5 минут для критичных систем (например, ДБО); * до бесконечных (Google, yandex, интернет-магазины). Если вы используете длинные сессии (больше 1 суток), то рекомендуется периодически обновлять сессионный идентификатор пользователю. --- ## Передача сессий на серверную сторону Используются следующие подхода: * Cookie; * HTTP-заголовок Authorization: * Bearer * Basic (\*) (пример: tomcat) --- ## О паролях * Хранение пароля * Восстановление пароля * Брутфорс * Защита от онлайн подбора (bruteforce) --- ## Хранение пароля Пароли нельзя хранить в открытом виде. Когда говорим о том как лучше хранить пароль, считаем, что атакующий может получить доступ к базе данных с паролями, например, через SQL-инъекцию. --- ## Хранение пароля Пароли хранят в хешированном виде. Для хеширования паролей необходимо использовать "долгие" хеш функции: * bcrypt; * PBKDF2. Криптографические хеш функции (например, из семейства SHA) не подходят, так как они позволят атакующему выполнить быстрый оффлайн брутфорс. Для оффлайн брутфорса используется hashcat. --- ## Хранение пароля ### Соль Набор случайных символов, который добавляется к паролю перед его хешированием. Соль сохраняется в БД рядом с паролем. Использование соли не исключает возможности оффлайн брутфорса, но значительно увеличивает его время. --- ## Хранение пароля ### Перец Набор случайных символов, который добавляется к паролю и соли перед его хешированием. Перец может храниться в конфигурационных файлах приложения или может быть зашит в код. Использование перца исключает возможности оффлайн брутфорса, в том случае, если атакующий получил доступ только к БД (в БД нет перца). --- ## Хранение пароля ```php= $pepper = "fOifew8Hufehwifhea78feg29HUIFEhfewjfe*FHehaoefahwojfw"; function registerUser($username,$password) { $salt = openssl_random_pseudo_bytes(40); $hash = hash_pbkdf2 ( 'sha256' , $password.$pepper , $salt , 10000 ); $sql = "INSERT INTO users VALUES ('".$username,."','".$salt."','".$hash."')"; $conn->execute($sql); } ``` --- ## Brute Force --- ## User Enumeration --- ## User Enumeration Распространенная проблема, позволяющая атакующему проверить наличие учетной записи в системе. Возникает тогда, когда приложение по разному отвечает в случае ввода некорректного и корректного логина. Как правило встречается на страницах регистрации, входа и восстановления пароля. Позволяет атакующему сначала обнаружить учетные записи, а потом уже пытаться подбирать к ним пароли. --- ## User Enumeration Сам по себе уязвимостью не является. Тем не менее часто может помочь атакующему, поэтому рекомендуется все же отвечать одинаково для существующих и не существующих логинов. Если в приложении есть регистрация и бизнес не дает ставить CAPTCHA, то увы, user enumeration будет. Но так и на yandex и на google и еще много где. --- ## User Enumeration Допустим мы нашли `User Enumeration` в приложении, в котором логином является email. Чтобы провести атаку нам нужны листы email сотрудников. --- ## User Enumeration Специальные сервисы - вбиваем домен (example.com), получаем почты: * https://hunter.io * https://maildb.io ПО для поиска в Интернетах: https://github.com/laramies/theHarvester google: "@hackeru.com" --- ## User Enumeration - ищем людей Если мы знаем формат почты, то нам могут сгодиться и имена/фамилии сотрудников. google: `<hackeru> site:linkedin.com` google: `<hackeru> site:vk.com` ... --- ## User Enumeration - угадываем почты Если мы знаем формат почты, то мы можем сгенерировать множество возможных почт из имен, фамилий, отчеств. Словари: * https://github.com/Raven-SL/ru-pnames-list * https://github.com/sorokinpf/russian_names --- ## User Enumeration - если не почты https://github.com/danielmiessler/SecLists/tree/master/Usernames --- ## Password Bruteforce Листы паролей: * https://github.com/danielmiessler/SecLists/tree/master/Passwords * https://github.com/FlameOfIgnis/Pwdb-Public * https://github.com/sharsi1/russkiwlst - для русско говорящих --- ## SMS OTP Bruteforce Бывает что разработчики позволяют выполнить сколько угодно попыток ввести OTP. Также уязвимостью является если атакующий может запросить генерацию OTP сколько угодно раз - рано или поздно пароль будет угадан. Словарь тут - просто цифры. --- ## Bruteforce - утилиты ### Intruder ### patator --- ## Patator Установка ``` git clone https://github.com/lanjelot/patator cd patator pip install -r requirements.txt ``` На MacOS дополнительно: ``` pip uninstall pycurl PYCURL_SSL_LIBRARY=openssl LDFLAGS="-L/usr/local/opt/openssl/lib" CPPFLAGS="-I/usr/local/opt/openssl/include" pip install --no-cache-dir pycurl ``` check: `python patator.py http_fuzz` --- ## Patator ./patator.py http_fuzz url="https://example.com/sign_in?email=FILE0.FILE1@example.com&password=fefe" 0=~/tools/russian_names/russian_trans_surnames.txt 1=~/tools/russian_names/russian_firstmiddlename_2letter.txt method=POST body="{}" -x ignore:code=404,fgrep=Invalid -t 50 <демонстрация> --- ## Защита от брутфорса --- ## Защита от брутфорса Есть следующие возможности: * временно блокировать перебираемую учетную запись; * требовать ввода CAPTCHA; * временно блокировать IP-адрес перебирающего (неэффективно). --- ## Временная блокировка Подход с временной блокировкой учетной записи может привести к недоступности ресурса для легального пользователя. Немного улучшают ситуацию [Device Cookies](https://owasp.org/www-community/Slow_Down_Online_Guessing_Attacks_with_Device_Cookies) --- ## Защита от брутфорса CAPTCHA - подходы: * для каждого ввода пароля (хорошо защищает, но возможно бизнес не одобрит); * после нескольких неудачных попыток входа в учетную запись, для неё требовать CAPTCHA. --- ## Защита от брутфорса CAPTCHA не должен распознаваться с помощью систем распознавания текста (например, tesseract). ![](https://i.imgur.com/bN88EG1.png) Google reCaptcha - рекомендуется (хотя иногда бесит пользователей) --- ## Обход CAPTCHA с помощью tesseract ```python= import pytesseract pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files (x86)\Tesseract-OCR\tesseract.exe" from PIL import Image print(pytesseract.image_to_string(Image.open('captcha.jpeg'))) ``` Перед использовавнием: 1. Установить pytesseract (через pip) 2. Установить tesseract OCR - для Windows вот тут: https://github.com/tesseract-ocr/tesseract/wiki --- ## Восстановление пароля Рекомендуемый путь: * Используем вторичный канал связи с пользователем - лучше всего email * Генерируем случайный токен, отправляем на email * Если пользователь пришел с этим токеном, то позволяем ему установить новый пароль --- ## Восстановление пароля Плохо: * Отправлять новый пароль на почту * Делать токен с долгим сроком жизни или многоразовым * Использовать для генерации токена не случайную информацию --- ## Делегирование аутентификации Для делегирования аутентификации используются: - OpenID - OAuth Преимущества: * вы не храните пароли, а значит они не утекут; * пользователю не нужно придумывать новый пароль, запоминать или сохранять его. * пользователю не нужно проходить процедуру регистрации (это никто не любит). --- ## Задания - на CTFd (http://web-fund.hackeru.pro) - тест для самопроверки в LMS --- ---
{"metaMigratedAt":"2023-06-16T10:16:57.366Z","metaMigratedFrom":"YAML","title":"Web App Pentest - 5 Broken Authentication","breaks":true,"slideOptions":"{\"transition\":\"fade\",\"parallaxBackgroundImage\":\"https://i.imgur.com/YClZ1aY.jpg\"}","contributors":"[{\"id\":\"0c054233-c19a-4022-8ae1-7189582f00e1\",\"add\":9876,\"del\":0}]"}
    374 views