元記事: Auditing SSH Settings (some Blue Team, some Red Team) (SANS ISC Forum)

元記事URL: https://isc.sans.edu/forums/diary/Auditing+SSH+Settings+some+Blue+Team+some+Red+Team/22998/
参照URL(nmap): https://nmap.org/book/man-host-discovery.html
参照URL(ssh_scan): https://mozilla.github.io/ssh_scan/

 

意訳。

 

昨日はSSHの設定方法の再考、設定の更新についての話題だったね。組織全体への適用はもう終わっただろうから(アハハ冗談だぜアハハ)、じゃあこんどはそれをどうやって監査するかについて話そうか。そこにホストがあることや、SSHが動いていることすら知らないなんてことはよくあるよね。

 

初心者のみんな。nmapはグレイトな監査ツールなんだ。ポート22に対するシンプルなスキャンをしたいときはこんなふうにすればいい。

nmap -p 22 -Pn --open x.x.x0/24

(この例では22番ポートしかチェックしないことに注意。他のポートで動作しているSSHを見つけたいなら、お好みで222、2222、2323、場合によっては1-65535全部、といった具合でスキャンすれば良いんだ。)
訳注: "-Pn" は、PINGでのチェックをしない(No Ping)。つまり、PINGに反応しないホストでも「存在する」と想定する、という意味。そうしないと存在はするけどPingには反応しない設定になっているホストが対象の場合、「ホスト探索」フェーズで「ホストはダウンしてるか存在しない」と判断してしまい、スキャンフェーズに進まないまま終わってしまう。そして-P0や-PNと書くのは古くて、-Pnと書くのがナウい

サービスについての情報を得たい場合は(-sV)、OSについては(-O)をつけるともっと便利なスキャンになるね。

nmap -p 22 -Pn --open –sV –O x.x.x0/24

もしチェックしたいホストが数千と大量にあるよなら、一番最初の「オープンポートを探す」という部分についてはnmapの代わりんいMASSCANを使ってみると良い。めっちょ早いんだぜ。MASSCANはスピードに関しては素晴らしいんだけど、nmapやその他ツールはもっと複雑なことをしようとすると良い仕事しやがるんだ。

たとえばSSHバージョン1が稼働しているサーバーを探すには…

nmap -p 22 -Pn –-open x.x.x.0/24 --script sshv1.nse

SSHサーバーがサポートしている暗号スイート(アルゴリズム)が欲しければ…

nmap -p 22 -Pn --open x.x.x.0/24 --script ssh2-enum-algos.nse

 

それから先週くらいにいじってたツールもいい感じだったよ。Ssh-scanってやつなんだけど、ターゲットホストの、暗号スイートやリモートから推測できる設定がわかるし、さらにポリシーに基づいて推奨事項まで表示させることができる(デフォルトポリシーがいくつか、ツールに同梱されている)。こいつは単なるSSHスキャナーにあらず、だね。似たようなツールがたくさんあるけど、ssh_scanはTwitterでここ1カ月くらいで見つけたやつなんだ。NessusやOpenVASなんかもこういったチェックをするのに良いんだけどね。(やってみたよっていう人がいたらどうだったか教えてね!)

さてSsh_scanはインストールも超簡単。Kali上で以下のコマンドを実行するだけなんだ。(Rubyが入っているLinuxディストリビューションなら何でも良いよ。)

gem install ssh_scan

開発者のサイトにはDocker上での手順も載ってるよ。

一般的なホスト(ESXiでデフォルトのSSH設定)は以下のような感じになる。(赤いところが推奨事項の部分ね。)

#ssh_scan -t 192.168.122.50
[
  {
    "ssh_scan_version": "0.0.29",
    "ip": "192.168.122.50",
    "hostname": "",
    "port": 22,
    "server_banner": "SSH-2.0-OpenSSH_5.6",
    "ssh_version": 2.0,
    "os": "unknown",
    "os_cpe": "o:unknown",
    "ssh_lib": "openssh",
    "ssh_lib_cpe": "a:openssh:openssh:5.6",
    "key_algorithms": [
      "diffie-hellman-group-exchange-sha256",
      "diffie-hellman-group-exchange-sha1",
      "diffie-hellman-group14-sha1",
      "diffie-hellman-group1-sha1"
    ],
    "encryption_algorithms_client_to_server": [
      "aes128-ctr",
      "aes192-ctr",
      "aes256-ctr",
      "3des-cbc"
    ],
    "encryption_algorithms_server_to_client": [
      "aes128-ctr",
      "aes192-ctr",
      "aes256-ctr",
      "3des-cbc"
    ],
    "mac_algorithms_client_to_server": [
      "hmac-sha1",
      "hmac-sha1-96"
    ],
    "mac_algorithms_server_to_client": [
      "hmac-sha1",
      "hmac-sha1-96"
    ],
    "compression_algorithms_client_to_server": [
      "none",
      "zlib@openssh.com"
    ],
    "compression_algorithms_server_to_client": [
      "none",
      "zlib@openssh.com"
    ],
    "languages_client_to_server": [

    ],
    "languages_server_to_client": [

    ],
    "auth_methods": [
      "publickey",
      "keyboard-interactive"
    ],
    "fingerprints": {
      "dsa": {
        "known_bad": "false",
        "md5": "65:98:f9:e9:94:00:e4:21:d8:5a:d8:4e:b3:aa:d5:32",
        "sha1": "d8:c3:8b:da:3f:37:7e:f7:a3:d6:36:10:37:f5:6a:8d:df:e6:74:84",
        "sha256": "21:b0:70:98:0c:e3:1b:77:b3:fc:01:7c:dc:99:6a:ea:a9:57:f1:ef:90:8c:80:01:3e:17:6b:1e:51:22:c9:5a"
      },
      "rsa": {
        "known_bad": "false",
        "md5": "c4:6c:3b:22:f7:60:9a:57:9e:a1:df:84:66:53:15:92",
        "sha1": "ed:f4:d9:37:a6:be:8d:fc:de:dd:2a:68:a0:7e:08:cb:97:58:2c:d9",
        "sha256": "2b:37:be:45:7c:9c:c3:51:eb:15:54:97:54:9b:ab:6d:81:73:a1:94:66:62:e1:9b:4a:92:13:d7:92:f6:1d:84"
      }
    },
    "duplicate_host_key_ips": [

    ],
    "compliance": {
      "policy": "Mozilla Modern",
      "compliant": false,
      "recommendations": [
        "Add these key exchange algorithms: curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256",
        "Add these MAC algorithms: hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com",
        "Add these encryption ciphers: chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com",
        "Remove these key exchange algorithms: diffie-hellman-group-exchange-sha1, diffie-hellman-group14-sha1, diffie-hellman-group1-sha1",
        "Remove these MAC algorithms: hmac-sha1, hmac-sha1-96",
        "Remove these encryption ciphers: 3des-cbc",
        "Remove these authentication methods: keyboard-interactive"
      ],
      "references": [
        "https://wiki.mozilla.org/Security/Guidelines/OpenSSH"
      ]
    },
    "start_time": "2017-10-30 09:17:24 -0400",
    "end_time": "2017-10-30 09:17:25 -0400",
    "scan_duration_seconds": 1.034291524
  }
]

Note the recommendations section.  On ESXi especially, if you combine this with the advice from VMware and the CIS Hardening Guide, the guidance really boils down to “why did you enable SSH on that box anyway?” – for vSphere, really you are better off to use the API to script against the environment (which is usually why people enable SSH on that platform)

In another example, scanning a pfSense firewall (just the recommendations shown):
    "compliance": {
      "policy": "Mozilla Modern",
      "compliant": false,
      "recommendations": [
        "Add these key exchange algorithms: ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256",
        "Remove these MAC algorithms: hmac-ripemd160-etm@openssh.com, hmac-ripemd160",
        "Remove these authentication methods: password, keyboard-interactive"
      ],
      "references": [
        "https://wiki.mozilla.org/Security/Guidelines/OpenSSH"
      ]
    }

この例では、いくつか推奨事項があるけど、デフォルト設定の"password, keyboard interactive"という認証設定を削除すること、なんていうのが含まれているね。(つまりユーザーIDとパスワードの認証ではなくて鍵を使えということだね)。

もちろんNessusやOpenVASなんかですべてをスキャンするのは良いことなんだけど、そういうツールってアドバイスが重複の嵐だったりして冗長なんだよね。NessusやOpenVASもチョチョイといじればピンポイントの結果だけを出させることもできるけど、それ自体けっこう面倒だったしりてね。でも例えばもし「今日はインフラ全部のSSH直すぜ!」なんて日を決めたなら、nmapとssh_scanだけ使えば重要なポイントだけわかって仕事を終えて飲みに行けちゃうんだ。

もし他にオススメのSSH監査ツールがあったら、ぜひコメントに書いてほしい。

「SSH直しちゃうデー」を作ってやってみたとか、何か面白い話題があったらそれもコメントに書いてくれよな!

 

 

結論:投稿者の方がこんなに砕けてるかどうかはわかりません。