⠀ ⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀![](https://i.imgur.com/l6GHi51.png) ⠀ ⠀ ### ⠀⠀⠀Особенности работы отдела безопасности сетевых (WEB) ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀приложений ⠀ :::spoiler #1 ⠀ Выполним сканирование хоста с помощью *NMAP* ⠀ Сначала просканируем целевой хост с помощью стандартного *TCP* сканирование с использованием *SYN* пакетов, использовав флаг *-sS*. Я также явно указал весь диапозон *TCP* портов 0-65536 с помощью флага *-p0-* и подробный вывод с помощью *verbosity 2*. UDP порты проверять не будем, т.к. это не относится к нашему заданию. ``` nmap -sS -p0- -vv 10.90.192.19 ``` Запускаем сканирование и видим 4 активных *TCP* порта ⠀ ![](https://i.imgur.com/hqtiwFj.png) ⠀ *NMAP* старается предоставлять точные результаты, но всегда следует учитвать, что эти результаты основаны на пакетах, возвращаемых целевыми машинами или файерволом, которые расположены перед ними. Хостам можно и не доверять - они могут отправлять ответы предназначенные для введения в заблуждение или дезинформации сканера. Весьма сильно распротранены хосты, работающие не по *RFC* стандартам, которые не отвечают на запросы *NMAP* так, как должны были бы. Хотя это больше относится *NULL*, *FIN* и *XMAS* сканированию. Мы отправили SYN пакеты на каждый порт и получили на 4-х из них SYN-ACK ответ. Разберем, какие порты открыты, и какие серисы чаще всего на них используются. > [color=lightgreen] 21 - ftp > 22 - ssh > 2200 - ici > 4433 - Versile Object Protocol Запустим *NMAP* с флагом *-sV*, чтобы узнать больше информации о запущенных сервисах ``` nmap -sV -vv -p21,22,2200,4433 10.90.192.19 ``` ⠀ ![](https://i.imgur.com/gVud3g5.png) ⠀ ![](https://i.imgur.com/B6639HS.png) ⠀ ![](https://i.imgur.com/HVDT3SY.png) ⠀ ![](https://i.imgur.com/j5neZpj.png) ⠀ ![](https://i.imgur.com/v6jh04w.png) ⠀ ``` 21 - ftp, Версия vsftpd с отключенной анонимной авторизацией 22 - ssh, Версия OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 2 версия протокола 2 2200 - ssh, Версия OpenSSH 5.9p1 Debian 5ubuntu1.4 версия протокола 2 4433 - http, Версия Apache httpd 2.4.41 ``` Мне удалось найти десятки уязвимостей на этих версиях OpenSSH и Apache даже при поверхностном поиске в интернете. Чтобы упростить процесс, я воспользуюсь инструментом NSE скриптинга от NMAP ниже. А пока обратим внимание, что на порту 4433 у нас расположен веб сервер. Просканируем 4433 порт с помощью сканера веб-серверов Nikto. Это может дать нам представление об ошибках конфигурации, показать возможные методы эксплуатирования уязвимостей, и предоставить больше информации об этом веб-сервере ``` nikto -h 19.90.192.19 -p 22 ``` ⠀ ![](https://i.imgur.com/NUullFK.png) ⠀ Мы видим, что на 4433 порту расположен NGINX версии 1.18.0. Пятый сервис найден! Рассмотрим подробнее вывод Nikto: > [color=lightgreen] *The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS* Это говорит нам о том, что заголовок *X-XSS-Protection* не определен, что потенциально позволит злоумышленнику применять атаки с использованием межсайтового скриптинга *(XSS)* Решение - установить заголовок *X-XSS-Protection* > [color=lightgreen] *The Content-Encoding header is set to "deflate" this may mean that the server is vulnerable to the BREACH attack* Заголовок *Content-Encoding* имеет значение *«deflate»* - это может означать, что сервер уязвим для атак *BREACH* *BREACH* это в основном атака на *HTTP*. Атака *BREACH* может извлечь токены входа, адреса электронной почты и другую конфиденциальную информацию из зашифрованного *TLS* веб-трафика. Выполним поиск уязвимостей с помощью *NSE* скриптов *NMAP*. На этом этапе мы также соберем более подробную информацию по каждому запущенному сервису, либо получим *fingerprint*, если *NMAP* не сможет определить его. Я буду использовать следующие скрипты: - *Vulscan* от *scipag* - Встроенный скрипт *Vulners.nse*. Пройдемся по каждому открытому порту отдельно. ``` nmap --script vulscan/vulscan.nse -sV -p21 10.90.192.19 nmap --script vulners.nse -sV -p21 10.90.192.19 ``` ⠀ ![](https://i.imgur.com/g8lkNBh.png) ⠀ ![](https://i.imgur.com/bc7dwg6.png) ⠀ ![](https://i.imgur.com/oBmrA8u.png) ⠀ ![](https://i.imgur.com/PsKFhQL.png) ⠀ Vulners ![](https://i.imgur.com/DkJFa0Z.png) ⠀ Дальше на скринах отображены найденные уязвимости только по базам CVE, а не по всем базам, поскольку вывод уязвимостей по другим базам занимает очень много места. ![](https://i.imgur.com/Sy3Ebx7.png) ⠀ Vulners ![](https://i.imgur.com/aLveaY1.png) ⠀ 2200 ![](https://i.imgur.com/rRLdg0n.png) ⠀ Vulners.nse ![](https://i.imgur.com/AFbErIb.png) ⠀ 4433 ![](https://i.imgur.com/JxeHtBr.png) ⠀ vulners.nse ![](https://i.imgur.com/qt88NUp.png) ⠀ Выше предоставлены уязвимости CVE, которые потенциально могут быть проэксплутированы на этих версиях активных сервисов. Можно также использовать связку NMAP+METASPLOIT, и далее попытаться проэкспултировать критические уязвимости. Следует обновиться до последних версий, внести корректировки в конфигурационные файлы как OpenSSH так и Nginx, установить внтуренний брандмауэр / системы предотвращения сканирования. Я не совсем понимаю, зачем используются 2 сервиса OpenSSH. Порт с 21-го желательно поменять, включить беспарольную авторизацию по ключу. ::: :::spoiler #2 ⠀ Недостаточная проверка пользовательского ввода позволяет удаленному злоумышленнику, не прошедшему проверку подлинности, выполнить произвольный код в системе. Это может привести к получению контроля над целевой системой. Решение: Обновить модуль "Polls, Votes" (vote) до версии 21.0.100. Уязвимость найдена Сергеем Близнюком (Positive Technologies)! ``` void Check1(host, port) # Создаем функцию Check1 с аргументами host и port { string iid; # Создаем локальную переменную iid string sess; # Создаем локальную переменную sess # В переменную reply запишем HTTP ответ по GET запросу на <целевой айпи>/bitrix/tools/composite_data.php # keep-alive — использование одного TCP-соединения для отправки и получения многократных HTTP-запросов и ответов вместо открытия нового соединения для каждой пары запрос-ответ HTTPReply reply = HTTPGETRequest(host, port, "/bitrix/tools/composite_data.php", "Connection: keep-alive"); if (reply.code == 200) # Если получаем ответ сервера '200' { boost::regex pattern; # Дальше следует регулярное выражение # PHPSESSID – это переменная сессии, посредством которой # происходит идентификация клиента (браузера). Этот уникальный # идентификатор присваивается клиенту (браузеру) с той целью, # чтобы он вернул ее при следующем запросе pattern = boost::regex(".*PHPSESSID=([\\d\\w]+).*'bitrix_sessid':'([\\d\\w]+?)'.*", boost::regex_constants::icase); boost::smatch what; if (boost::regex_match(reply.fullreply, what, pattern)) { sess = string(what[1].first, what[1].second); iid = string(what[2].first, what[2].second); } if (sess.empty() || iid.empty()) # Если sess или iid пусты - выход из функции { printf("Prereq fail %s", reply.fullreply.c_str()); return; } # POST запрос HTTPReply replyPost = HTTPPOSTRequest(plugin, GetServerName(plugin), "/bitrix/tools/vote/uf.php?attachId[ENTITY_TYPE]=CFileUploader&attachId[ENTITY_ID][events][onFileIsStarted][]=CAllAgent&attachId[ENTITY_ID][events][onFileIsStarted][]=Update&attachId[MODULE_ID]=vote&action=vote", "--db7314ff402791dd7fd88f6570d622c1\r\nContent-Disposition: form-data; name=\"sessid\"\r\n\r\n" + iid, "Cookie: PHPSESSID=" + sess + "\r\nContent-Type: multipart/form-data; boundary=db7314ff402791dd7fd88f6570d622c1"); if (replyPost.code == 200 && replyPost.fullreply.find("???????????????????????????") != string::npos) { printf("Vulnerable"); return; } else { printf("Not Vulnerable"); return; } } } DWORD Check2(ip, port) { UdpDtlsSocket udp_dtls_sock(ip, port); if (!udp_dtls_sock.DtlsConnect()) return false; Buffer notVulnRecv("\xff\xff\x00\x80"); Buffer sendValidProbe("\x05\x00\x06\x00\x00\x00\x41\x00\x01\x00"); Buffer sendVulnProbe("\x05\x00\x06\x00\x00\x00\x41\x00\x01\x00\x00"); Buffer recvMsg; printf("[*] Sending vulnerable package..."); if (!udp_dtls_sock.DtlsWrite(sendVulnProbe)) return false; bool rc = udp_dtls_sock.DtlsRead(recvMsg); if ((rc && recvMsg.Size() < 4) || (rc && recvMsg.SubBuf(recvMsg.Size() - 4, 4) != notVulnRecv)) { printf("Vulnerable"); return true; } if (rc && recvMsg.Size() >= 4 && recvMsg.SubBuf(recvMsg.Size() - 4, 4) == notVulnRecv) { return false; } printf("[*] Sending package..."); if (!udp_dtls_sock.DtlsWrite(sendValidProbe)) return false; recvMsg.Clear(); rc = udp_dtls_sock.DtlsRead(recvMsg); if (rc) { printf("Vulnerable"); return true; } return false; } ``` > [color=lightgreen] Какие еще методы можно использовать для поиска удаленных уязвимостей? Глобально - **Black Box | White Box** **SAST | DAST | IAST** *SAST* *(Static Application Security Testing)* — тестирование «белого ящика», существует уже более десяти лет. Позволяет разработчикам находить уязвимости безопасности в исходном коде приложения на ранних этапах жизненного цикла разработки ПО. *SAST* также обеспечивает соответствие руководствам и стандартам кодирования без фактического выполнения базового кода. *DAST (Dynamic Application Security Testing)* — тестирование «черного ящика», может обнаруживать уязвимости и слабые места в работающем приложении, обычно веб-приложениях. Это достигается за счет использования методов внедрения ошибок в приложении, таких как передача вредоносных данных в программное обеспечение, для выявления распространенных уязвимостей безопасности, например, *SQL*-инъекций и межсайтовых сценариев. *DAST* также может пролить свет на проблемы времени выполнения, такие как: - проблемы аутентификации и конфигурации сервера - недостатки, видимые только при входе известного пользователя Обнаружить это с помощью статистического анализа нельзя! *SAST* и *DAST* часто используются в тандеме, так как: *SAST* не будет обнаруживать ошибки времени выполнения *DAST* не будет отмечать ошибки кодирования, по крайней мере, до номера строки кода *SAST* хорошо работает, когда дело доходит до обнаружения ошибки в строке кода, например, слабой генерации случайных чисел, но обычно не очень эффективен при обнаружении недостатков потока данных. Кроме того, решения *SAST* известны большим количеством ложноположительных или ложноотрицательных результатов. (IAST и RASP не относится к удаленным методам)*, однако я все таки оставил их здесь *IAST (Interactive Application Security Testing)* — интерактивное тестирование безопасности приложений. *SAST* и *DAST* являются относительно старыми технологиями, поэтому бытует мнение, что они не лучший выбор для тестирования современных: - Веб-приложений - Мобильных приложений Например, *SAST* плохо работает с: - Библиотеками - Фреймворками *IAST* разработан для устранения недостатков *SAST* и *DAST* путем объединения элементов обоих подходов. *IAST* выполняет весь анализ в режиме реального времени: - в любом месте процесса разработки *IDE* - непрерывной интегрированной среде - производственной среде Поскольку *IAST* работает внутри приложения, он может анализировать: - код приложения - потоки данных - конфигурации - HTTP-запросы и ответы - библиотеки, фреймворки и другие компоненты - информацию о внутреннем подключении *RASP (Run-time Application Security Protection)* — защита безопасности приложений во время выполнения. Как и *IAST* работает внутри приложения, но это скорее инструмент безопасности, а не тестирования. Он подключается к приложению или его среде выполнения и может контролировать выполнение приложения. Это позволяет *RASP* защитить приложение, даже если защита периметра сети нарушена, а приложения содержат уязвимости безопасности. *RASP* позволяет приложению проводить непрерывные проверки безопасности и отвечать на атаки в реальном времени, завершая сеанс злоумышленника и предупреждая защитников об атаке. ::: ⠀ ###### tags: `Intesive`