総当たり攻撃を実験した話

/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と同じハッシュ値ができたらそれがパスワードです。

実行結果を貼ります。

f:id:kisaragi211:20190124212150p:plain

こんな感じでパスワードがわかります。

もし、他のユーザーのパスワードがわからなくなってもこれで安心??