参加させて頂きました。Python-paramiko」が面白かったのでそのメモです。osuetaとは何かOpenSSHでは、パスワード認証の際に長い文字列(目安で数万文字)を与えると、存在するユーザと存在しないユーザの場合で応答速度が変わってきます。存在しないユーザの場合は数秒で応答が返りました(この応答速度は目安です、もちろんマシンスペックによって違うでしょう)。これにより、複数のユーザでsshログイン試行をおこない、その応答時間を計測することでユーザがシステムに存在するのかしないのかを外部から判断することができます。Attack)と呼びます。https://cureblog.de/2013/07/openssh-user-enumeration-time-based-attack/sshによるブルートフォース攻撃をおこなう際に、事前にOSUETAにより存在するユーザを調べておくと、効率的に攻撃できることが期待されます。このように応答速度でユーザ列挙できてしまう件は、脆弱性ではなく仕様と解釈されているようです。おける有効なユーザ名を特定される脆弱性)のようです。http://jvndb.jvn.jp/ja/contents/2006/JVNDB-2006-002243.htmlそれから8年ほど経ちますが、問題はまだ残っていることから、やはりバグなどではなく「仕様」なのでしょう。脱線:UsePAMとPasswordAuthenticationここで、いきなりちょっと脱線してsshdの設定方法の確認をします。sshdの設定の際、鍵認証のみとしてパスワード認証を無効としたい場合には、以下のように/etc/ssh/sshd_configのPasswordAuthenticationをnoにする例がよく紹介されています。noしかしここにはちょっとした罠があります。実はこうしてPasswordAuthenticationをnoにしていても、PAMを利用するように設定していると、ChallengeResponseAuthenticationで結局PAMのパスワード認証が利用されるため、意図した「鍵認証のみとする」設定になりません。ややこしいので、以下の表にまとめました。できるそのため、UsePAMをyesに設定した状態でパスワード認証を潰したい場合には、sshd_configの以下3行を正しく設定する必要があります。(なお、ChallengeResponseAuthenticationはデフォルトがnoですが、明示的に書いた方が良いでしょう)。yes今回のOSUETA攻撃はパスワード認証を狙うため、上記のように設定していれば影響を受けません(鍵認証のみとする)。いうわけで、脱線終わり。Attackを試すために実装してみましょう。sshログインの際、長大なパスワードを手で投げつけるのは意外に面倒です。そのため、pythonのparamikoというモジュールを利用すると便利です。ここではクライアントOSとしてはUbuntuを用いました。paramikoのインストールpython-paramikoモジュールをインストールするだけです。python-paramiko攻撃スクリプトparamikoを使って、長いパスワードを投げつける簡単なスクリプトを書いてみましょう。40000)これで、コマンドライン引数から対象のIPアドレス、ユーザ名を指定して実行します。/dev/nullスクリプトの中身は、見ればなんとなく分かるでしょうが......paramikoをimportして、auth_passwordメソッドでsshパスワードに"A"を4万文字突っ込んでいます。上記スクリプトは認証に失敗するため常にエラーで終了しますが、先に述べたようにここでは応答速度を測りたいだけなので、これで問題ありません。そのため標準エラー出力も/dev/nullにリダイレクトして捨てています。timeコマンドで応答を測るOSUETAは応答速度の時間差でユーザの存在を探る手法なので、スクリプトの実行時間を計る必要があります。ストップウオッチ片手にやってもいいのですが、ここではシェルのtimeコマンドを使ってみましょう。/dev/nullなお、timeコマンドの出力はOSやシェルによって結構違うため(timeコマンドはシェルビルトインと外部コマンドの両方があるため)、出力をシェルスクリプトで扱おうとするとなかなか厄介です。そのため、後処理する場合には上記のように、POSIXフォーマットで出力する-pオプションを利用すると便利です。timeコマンドの-pオプションを利用すると、real/user/sysの3つが出力されます。ここでは応答時間を計りたいので、realの値を目安にしましょう。0.06上記のように、存在しないユーザ(aaaa)の応答速度は2.8秒ほどですが、存在するユーザ(ozuma)は15秒近くかかります。試してみたssmjpでtogakushiさんに質問したところ、Linuxのみで試されたとのことだったので、気になってFreeBSDやSolarisでも試してみました。Solarisで使われているsshはOpenSSHではなくSun_SSHという独自のものですが、元々このSun_SSHはOpenSSHの改造版と言われているので、同じような挙動を示すと推察されます。vulnerable上記が試した結果。いうわけで、私の周りのOSでは全てユーザ列挙ができました。CPU負荷OSUETAを叩くと、sshdのCPU使用率が一気に跳ね上がって100%に張り付きます。完全にCPUバウンドな処理なので、見た目ほど体感の処理速度に影響はしませんが、あまり軽視もできないですね。Kippo」が、「その発想は無かった」と面白いです。関する罪」の情報公開請求をしました月別アーカイブはてなブログをはじめよう!ozumaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。