22 - Pentesting SSH/SFTP

Support HackTricks

Bug bounty tip: sign up for Intigriti, a premium bug bounty platform created by hackers, for hackers! Join us at https://go.intigriti.com/hacktricks today, and start earning bounties up to $100,000!

基本情報

SSH (Secure Shell or Secure Socket Shell) は、未保護のネットワークを介してコンピュータに安全に接続するためのネットワークプロトコルです。リモートシステムにアクセスする際のデータの機密性と完全性を維持するために不可欠です。

デフォルトポート: 22

22/tcp open  ssh     syn-ack

SSHサーバー:

  • openSSH – OpenBSD SSH、BSD、LinuxディストリビューションおよびWindows 10以降のWindowsに搭載

  • Dropbear – 低メモリおよびプロセッサリソースの環境向けのSSH実装、OpenWrtに搭載

  • PuTTY – Windows用のSSH実装、クライアントは一般的に使用されるが、サーバーの使用はまれ

  • CopSSH – Windows用のOpenSSHの実装

SSHライブラリ(サーバーサイドを実装):

  • libssh – SSHv2プロトコルを実装するマルチプラットフォームCライブラリ、PythonPerlおよびRのバインディングがある; KDEのsftpやGitHubのgit SSHインフラストラクチャで使用されている

  • wolfSSH – ANSI Cで書かれたSSHv2サーバーライブラリ、組み込み、RTOS、およびリソース制約のある環境向け

  • Apache MINA SSHD – Apache SSHD JavaライブラリはApache MINAに基づいている

  • paramiko – Python SSHv2プロトコルライブラリ

列挙

バナーグラビング

nc -vn <IP> 22

自動化されたssh-audit

ssh-auditは、sshサーバーとクライアントの設定監査のためのツールです。

https://github.com/jtesta/ssh-auditは、https://github.com/arthepsy/ssh-audit/からの更新されたフォークです。

特徴:

  • SSH1およびSSH2プロトコルサーバーのサポート;

  • SSHクライアント設定の分析;

  • バナーを取得し、デバイスまたはソフトウェアとオペレーティングシステムを認識し、圧縮を検出;

  • キー交換、ホストキー、暗号化およびメッセージ認証コードアルゴリズムを収集;

  • アルゴリズム情報を出力(利用可能な時期、削除/無効、危険/弱/レガシーなど);

  • アルゴリズムの推奨事項を出力(認識されたソフトウェアバージョンに基づいて追加または削除);

  • セキュリティ情報を出力(関連する問題、割り当てられたCVEリストなど);

  • アルゴリズム情報に基づいてSSHバージョンの互換性を分析;

  • OpenSSH、Dropbear SSHおよびlibsshからの履歴情報;

  • LinuxおよびWindowsで実行;

  • 依存関係なし

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)

サーバーの公開SSHキー

ssh-keyscan -t rsa <IP> -p <PORT>

弱い暗号アルゴリズム

これはデフォルトでnmapによって発見されます。しかし、sslcansslyzeを使用することもできます。

Nmapスクリプト

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

一般的なssh認証情報はこちらこちらおよび以下にあります。

プライベートキーのブルートフォース

使用できるsshプライベートキーをいくつか知っている場合... 試してみましょう。nmapスクリプトを使用できます:

https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html

またはMSF補助モジュール:

msf> use scanner/ssh/ssh_identify_pubkeys

Or use ssh-keybrute.py (ネイティブPython3、軽量でレガシーアルゴリズムが有効): snowdroppe/ssh-keybrute.

Known badkeys can be found here:

Weak SSH keys / Debian predictable PRNG

一部のシステムには、暗号材料を生成するために使用されるランダムシードに既知の欠陥があります。これにより、ブルートフォース攻撃が可能な大幅に減少したキー空間が生じる可能性があります。弱いPRNGの影響を受けたDebianシステムで生成された事前生成されたキーセットは、ここで入手可能です: 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は、上記の説明通りのことを正確に行います。

実際のMitMをキャプチャするためには、ARPスプーフィング、DNSスプーフィング、またはネットワークスプーフィング攻撃で説明されている他の技術を使用できます。

SSH-Snake

発見されたSSHプライベートキーを使用してネットワークを横断し、各システムの各プライベートキーを新しいホストに利用する場合、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 command execution

SFTPセットアップにおいて一般的な見落としが発生します。管理者はユーザーがリモートシェルアクセスを有効にせずにファイルを交換できるように意図していますが、非対話型シェル(例: /usr/bin/nologin)を設定し、特定のディレクトリに制限しても、セキュリティの抜け穴が残ります。ユーザーはログイン後すぐにコマンド(例: /bin/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サーバーにアクセスできる場合、一般的なポートフォワーディングを使用して、トラフィックをこの経由でトンネルすることもできます:

sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>

sftp には "symlink" コマンドがあります。したがって、特定のフォルダに 書き込み権限 がある場合、他のフォルダ/ファイルシンボリックリンク を作成できます。おそらく chroot 内に 閉じ込められている ため、これはあなたにとって特に役に立たないでしょうが、作成した シンボリックリンクno-chroot サービス からアクセスできる場合(たとえば、ウェブからシンボリックリンクにアクセスできる場合)、ウェブを通じてシンボリックリンクされたファイルを開く ことができます。

たとえば、新しいファイル "froot" から "/" への シンボリックリンク を作成するには:

sftp> symlink / froot

If you can access the file "froot" via web, you will be able to list the root ("/") folder of the system.

認証方法

高セキュリティ環境では、単純なパスワードベースの認証の代わりに、キーベースまたは二要素認証のみを有効にすることが一般的な慣行です。しかし、しばしば強力な認証方法が有効になっていても、弱い方法が無効になっていないことがあります。よくあるケースは、openSSHの設定でpublickeyを有効にし、デフォルトの方法として設定するが、passwordを無効にしないことです。そのため、SSHクライアントの詳細モードを使用すると、攻撃者は弱い方法が有効になっていることを見ることができます:

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オプションを使用してこのメソッドを強制的に使用させることができます。

ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password

SSHサーバーの設定を確認することは、予期される方法のみが承認されていることを確認するために必要です。クライアントで詳細モードを使用すると、設定の有効性を確認するのに役立ちます。

設定ファイル

ssh_config
sshd_config
authorized_keys
ssh_known_hosts
known_hosts
id_rsa

ファジング

参考文献

バグバウンティのヒント: Intigritiサインアップしてください。これはハッカーによって、ハッカーのために作られたプレミアムバグバウンティプラットフォームです!今日https://go.intigriti.com/hacktricksで私たちに参加し、最大**$100,000**のバウンティを獲得し始めましょう!

HackTricks 自動コマンド

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'
HackTricksをサポートする

Last updated