308 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 22 - Pentesting SSH/SFTP
{{#include ../banners/hacktricks-training.md}}
## 基本情報
**SSH (セキュアシェルまたはセキュアソケットシェル)** は、未保護のネットワークを介してコンピュータに安全に接続するためのネットワークプロトコルです。リモートシステムにアクセスする際のデータの機密性と整合性を維持するために不可欠です。
**デフォルトポート:** 22
```
22/tcp open ssh syn-ack
```
**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実装
**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に基づいている
- [paramiko](https://github.com/paramiko/paramiko) Python SSHv2プロトコルライブラリ
## 列挙
### バナーグラビング
```bash
nc -vn <IP> 22
```
### 自動化されたssh-audit
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/)からの更新されたフォークです。
**特徴:**
- SSH1およびSSH2プロトコルサーバーのサポート;
- SSHクライアント設定の分析;
- バナーを取得し、デバイスまたはソフトウェアとオペレーティングシステムを認識し、圧縮を検出;
- キー交換、ホストキー、暗号化およびメッセージ認証コードアルゴリズムを収集;
- アルゴリズム情報を出力(利用可能な時期、削除/無効、危険/弱い/古いなど);
- アルゴリズムの推奨事項を出力(認識されたソフトウェアバージョンに基づいて追加または削除);
- セキュリティ情報を出力関連する問題、割り当てられたCVEリストなど;
- アルゴリズム情報に基づいてSSHバージョンの互換性を分析;
- OpenSSH、Dropbear SSHおよびlibsshからの履歴情報;
- LinuxおよびWindowsで動作;
- 依存関係なし
```bash
usage: ssh-audit.py [-1246pbcnjvlt] <host>
-1, --ssh1 force ssh version 1 only
-2, --ssh2 force ssh version 2 only
-4, --ipv4 enable IPv4 (order of precedence)
-6, --ipv6 enable IPv6 (order of precedence)
-p, --port=<port> port to connect
-b, --batch batch output
-c, --client-audit starts a server on port 2222 to audit client
software config (use -p to change port;
use -t to change timeout)
-n, --no-colors disable colors
-j, --json JSON output
-v, --verbose verbose output
-l, --level=<level> minimum output level (info|warn|fail)
-t, --timeout=<secs> timeout (in seconds) for connection and reading
(default: 5)
$ python3 ssh-audit <IP>
```
[See it in action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
### サーバーの公開SSHキー
```bash
ssh-keyscan -t rsa <IP> -p <PORT>
```
### 弱い暗号アルゴリズム
これはデフォルトで**nmap**によって発見されます。しかし、**sslcan**や**sslyze**を使用することもできます。
### Nmapスクリプト
```bash
nmap -p22 <ip> -sC # Send default nmap scripts for SSH
nmap -p22 <ip> -sV # Retrieve version
nmap -p22 <ip> --script ssh2-enum-algos # Retrieve supported algorythms
nmap -p22 <ip> --script ssh-hostkey --script-args ssh_hostkey=full # Retrieve weak keys
nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check authentication methods
```
### Shodan
- `ssh`
## ユーザー名、パスワード、プライベートキーのブルートフォース
### ユーザー名列挙
OpenSSHのいくつかのバージョンでは、タイミング攻撃を行ってユーザーを列挙することができます。これを利用するためにmetasploitモジュールを使用できます:
```
msf> use scanner/ssh/ssh_enumusers
```
### [ブルートフォース](../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プライベートキーをいくつか知っている場合... 試してみましょう。nmapスクリプトを使用できます:
```
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
```
またはMSF補助モジュール
```
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).
#### Known badkeys can be found here:
{{#ref}}
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
{{#endref}}
#### Weak SSH keys / Debian predictable PRNG
一部のシステムには、暗号材料を生成するために使用されるランダムシードに既知の欠陥があります。これにより、劇的に減少したキー空間が生じ、ブルートフォース攻撃が可能になります。弱いPRNGの影響を受けたDebianシステムで生成された事前生成されたキーセットは、ここで入手できます: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)。
被害者のマシンの有効なキーを検索するために、ここを確認する必要があります。
### Kerberos
**crackmapexec**は、`ssh`プロトコルを使用して、**kerberos経由で認証**するために`--kerberos`オプションを使用できます。\
詳細については、`crackmapexec ssh --help`を実行してください。
## Default Credentials
| **Vendor** | **Usernames** | **Passwords** |
| ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| APC | apc, device | apc |
| 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 |
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
| D-Link | admin, user | private, admin, user |
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
| EMC | admin, root, sysadmin | EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc |
| HP/3Com | admin, root, vcx, app, spvar, manage, hpsupport, opc_op | admin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin |
| Huawei | admin, root | 123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123 |
| IBM | USERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customer | PASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer |
| Juniper | netscreen | netscreen |
| NetApp | admin | netapp123 |
| Oracle | root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user | changeme, ilom-admin, ilom-operator, welcome1, oracle |
| VMware | vi-admin, root, hqadmin, vmware, admin | vmware, vmw@re, hqadmin, default |
## SSH-MitM
もしあなたが被害者と同じローカルネットワークにいて、ユーザー名とパスワードを使用してSSHサーバーに接続しようとしている場合、**MitM攻撃を実行してその認証情報を盗む**ことを試みることができます:
**攻撃経路:**
- **トラフィックのリダイレクト:** 攻撃者は被害者のトラフィックを自分のマシンに**転送**し、SSHサーバーへの接続試行を**傍受**します。
- **傍受とログ記録:** 攻撃者のマシンは**プロキシ**として機能し、正当なSSHサーバーを装ってユーザーのログイン情報を**キャプチャ**します。
- **コマンドの実行と中継:** 最後に、攻撃者のサーバーは**ユーザーの認証情報をログ記録し**、**コマンドを**実際のSSHサーバーに**転送し**、**実行**し、**結果をユーザーに返します**。これにより、プロセスがシームレスで正当なものに見えます。
[**SSH MITM**](https://github.com/jtesta/ssh-mitm)は、上記の説明通りのことを正確に行います。
実際のMitMをキャプチャするために、ARPスプーフィング、DNSスプーフィング、または[**ネットワークスプーフィング攻撃**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing)で説明されている他の技術を使用することができます。
## SSH-Snake
発見されたSSHプライベートキーを使用してネットワークを横断し、各システムの各プライベートキーを新しいホストに利用する場合、[**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake)が必要です。
SSH-Snakeは以下のタスクを自動的かつ再帰的に実行します:
1. 現在のシステムで、任意のSSHプライベートキーを見つける。
2. 現在のシステムで、プライベートキーが受け入れられる可能性のあるホストまたは宛先user@host)を見つける。
3. 発見されたすべてのプライベートキーを使用して、すべての宛先にSSH接続を試みる。
4. 宛先に正常に接続できた場合、接続したシステムでステップ#1 - #4を繰り返す
これは完全に自己複製し、自己伝播します -- そして完全にファイルレスです。
## Config Misconfigurations
### Root login
SSHサーバーがデフォルトでrootユーザーのログインを許可することは一般的であり、これは重大なセキュリティリスクをもたらします。**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`
### SFTP Brute Force
- [**SFTP Brute Force**](../generic-hacking/brute-force.md#sftp)
### SFTP command execution
SFTPセットアップでは、管理者がユーザーにリモートシェルアクセスを有効にせずにファイルを交換させることを意図している場合に一般的な見落としが発生します。ユーザーを非対話型シェル例: `/usr/bin/nologin`)に設定し、特定のディレクトリに制限しても、セキュリティの抜け穴が残ります。**ユーザーは、ログイン後すぐにコマンド(例: `/bin/bash`)の実行を要求することで、これらの制限を回避できます**。これにより、不正なコマンド実行が可能になり、意図されたセキュリティ対策が損なわれます。
[こちらからの例](https://community.turgensec.com/ssh-hacking-guide/):
```bash
ssh -v noraj@192.168.1.94 id
...
Password:
debug1: Authentication succeeded (keyboard-interactive).
Authenticated to 192.168.1.94 ([192.168.1.94]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug1: Sending command: id
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
uid=1000(noraj) gid=100(users) groups=100(users)
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 2412, received 2480 bytes, in 0.1 seconds
Bytes per second: sent 43133.4, received 44349.5
debug1: Exit status 0
$ ssh noraj@192.168.1.94 /bin/bash
```
以下は、ユーザー `noraj` のための安全な SFTP 構成の例です(`/etc/ssh/sshd_config` openSSH
```
Match User noraj
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
PermitTunnel no
X11Forwarding no
PermitTTY no
```
この設定では、SFTPのみを許可します開始コマンドを強制することでシェルアクセスを無効にし、TTYアクセスも無効にし、さらにすべての種類のポートフォワーディングやトンネリングを無効にします。
### SFTPトンネリング
SFTPサーバーにアクセスできる場合、一般的なポートフォワーディングを使用して、トラフィックをこの経由でトンネルすることもできます
```bash
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
```
### SFTP Symlink
**sftp** には "**symlink**" コマンドがあります。したがって、特定のフォルダに **書き込み権限** がある場合、**他のフォルダ/ファイル** の **シンボリックリンク** を作成できます。おそらく **chroot** 内に **閉じ込められている** ため、これは特に役に立たないでしょうが、作成した **シンボリックリンク****no-chroot** **サービス** からアクセスできる場合(例えば、ウェブからシンボリックリンクにアクセスできる場合)、ウェブを通じて **シンボリックリンクされたファイル****開く** ことができます。
例えば、新しいファイル "**_froot_**" から "**_/**" への **シンボリックリンク** を作成するには:
```bash
sftp> symlink / froot
```
もしウェブ経由でファイル "_froot_" にアクセスできれば、システムのルート ("/") フォルダーをリストすることができます。
### 認証方法
高セキュリティ環境では、単純なパスワードベースの認証の代わりに、キーベースまたは二要素認証のみを有効にすることが一般的な慣行です。しかし、しばしば強力な認証方法が有効になっていても、弱い方法が無効になっていないことがあります。よくあるケースは、openSSHの設定で `publickey` を有効にし、デフォルトの方法として設定するが、`password` を無効にしないことです。そのため、SSHクライアントの詳細モードを使用することで、攻撃者は弱い方法が有効になっていることを確認できます。
```bash
ssh -v 192.168.1.94
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
...
debug1: Authentications that can continue: publickey,password,keyboard-interactive
```
認証失敗の制限が設定されていて、パスワードメソッドに到達する機会がない場合、`PreferredAuthentications`オプションを使用してこのメソッドを強制的に使用することができます。
```bash
ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password
```
SSHサーバーの設定を確認することは、予期される方法のみが承認されていることを確認するために必要です。クライアントで詳細モードを使用すると、設定の効果を確認するのに役立ちます。
### 設定ファイル
```bash
ssh_config
sshd_config
authorized_keys
ssh_known_hosts
known_hosts
id_rsa
```
## Fuzzing
- [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
- 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)
## HackTricks Automatic Commands
```
Protocol_Name: SSH
Port_Number: 22
Protocol_Description: Secure Shell Hardening
Entry_1:
Name: Hydra Brute Force
Description: Need Username
Command: hydra -v -V -u -l {Username} -P {Big_Passwordlist} -t 1 {IP} ssh
Entry_2:
Name: consolesless mfs enumeration
Description: SSH enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/ssh/ssh_version; set RHOSTS {IP}; set RPORT 22; run; exit' && msfconsole -q -x 'use scanner/ssh/ssh_enumusers; set RHOSTS {IP}; set RPORT 22; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ssh/juniper_backdoor; set RHOSTS {IP}; set RPORT 22; run; exit'
```
{{#include ../banners/hacktricks-training.md}}