【Python】ブルートフォース攻撃をfor文で書いてみた

brute force eyecatch image

for文の勉強をしていたら、よく映画やドラマで見る4ケタの暗証番号を自動で割り出す機能の基礎となる部分を簡単に作れるのでは?と思ってしまったので、その内容について記します。あくまで初心者の発想なので、本当はもっと緻密なコードになっているかと思います。また、不正アクセスを助長するものではありません。不適切であれば非公開にしますので、コメント等頂ければと思います。

目次

ブルートフォース(brute force)攻撃とは?

日本語でいうと「総当たり攻撃」と言われるものです。パスワードや暗証番号を割り出すために使われる不正アクセスの手法で、今回、例として取り上げた4ケタの暗証番号だと0000から始まって00010002、…、9999とパスワードに使われる可能性のある文字の組み合わせを全て試す攻撃になります。

Step1:全体のアルゴリズムを考える

もっとスマートなやり方はあると思うのですが、for文で完結させたいので、次のように考えます。まず、次のように各桁の数値にそれぞれ変数を割り振ります。

そして、num13は数値固定(0のまま)でnum40129と変化していき、9まで代入されたら、次にnum40に変わり、num31に変わるようにします。そして、num4が再び01、…9と変化していき、num40に変わるタイミングでnum32に変わるようにします。

num2についても同様に、始めは0ですが、num39まで代入され、0に変わるタイミングでnum21に変わるようにします。num1についても同様に、num29まで代入され、0に変わるタイミングで、num11に変わるようにします。

こう考えるとfor文の入れ子の対応でできそうです。一番内側のループはnum4、次に内側のループはnum3、その次はnum2、一番外側はnum1となります(下図)。内側のループが90に変わるタイミングで、その外側のループは1つ番号が繰り上がるイメージです(わかりにくい?)。一番内側のループはかなりグルグル回る事になります。

Step2:変数num409の値を順に代入、9まで代入したら0に戻るようにする。

いきなり4つの変数を動かすコードを書くのは大変なので(間違える可能性もあるので)、まずは変数num4だけに着目します。num4の値を012…と変わっていくようにし、9まで終えたら0に戻るようにします。

09までの数値を出力

num409の値を代入します。基本的なfor文の使い方です。

Python
for num4 in range(10):
    print(num4)

'''
【実行結果】
0
1
2
3
4
5
6
7
8
9

9まで代入したら、0に戻るようにする

上記のコードで一度繰り返し(ループ)処理が終われば0に戻るので、大丈夫です。上記コードで9までの値が代入されれば繰り返し処理が終わるようになっているので、OKです。

Step3:num4のループが1回終了したら、num3の値を1つ繰り上げる。

num49まで代入されて、ループ処理が終わったらnum3の値を1つ繰り上げる(例:01)になるようにしたいと思います。

Python
for num3 in range(10):
    for num4 in range(10):
        print(str(num3) + str(num4))

'''
【実行結果】
00
01
02
03
04
05
06
07
08
09
10
11



96
97
98
99

Step4: num3のループが1回終了したら、num2の値を1つ繰り上げる。

ここは先ほどと同じ考え方でfor文の入れ子が1つ増えるだけです。そしてprint()関数の中にもstr(num2)を追加します。

Python
for num2 in range(10):
    for num3 in range(10):
        for num4 in range(10):
            print(str(num2) + str(num3) + str(num4))

'''
【実行結果】
000
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015



996
997
998
999

最終Step:num2のループが1回終了したら、num1の値を1つ繰り上げる。

ここも先程と同じ考え方です。入れ子が一つ増えます。そして、print()関数にもstr(num1)を追加します。

Python
for num1 in range(10):
    for num2 in range(10):
        for num3 in range(10):
            for num4 in range(10):
                print(str(num1) + str(num2) + str(num3) + str(num4))

'''
【実行結果】
0000
0001
0002
0003
0004
0005



9996
9997
9998
9999

0000から始まり9999まで順番に出力する事ができました。実際のブルートフォース攻撃では、これに加えて、パスワードと一致しているかどうかなどのコードも追記されていくのかなと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次