約5年前にaescryptを介してAESで暗号化したファイルがあります。私はいくつかの接頭辞と接尾辞が付いたパスワードについて多くのことを覚えています。私はプログラマーとしての経験がありますが、ブルートフォースパスワードを使用した経験はありません。
暗号化されたアーカイブをブルートフォースに強制するにはどうすればよいですか?
私が知っていると思うのは、レインボーテーブル(可能な単語のリスト)と、ツールをサフィックスや特殊文字の候補に導くための方法が必要だということです。
この特定のシナリオにどのツールが理想的であるかわからないし、それらがどのように設定されるのかもわかりません。私はUbuntuのパッケージ管理システムから利用できる多くのツールのmanページを読んでいますが、手順はさまざまなシナリオに焦点を当てており、何を示す必要があるかを示す方法を見つけることができないようです。
独自のソリューションをプログラムする場合、aescrypt
コマンドを使用して、推測されたパスワードをコマンドラインで直接渡すことができます。パスワードが失敗すると、ゼロ以外の終了ステータスが返されるので、簡単に確認できます。パフォーマンスのために、Rustで記述し、スレッド化された実装に亀裂を入れます。しかし、他のいくつかの文字を挿入する必要がある限り、順列を試してみること以外にあまり知りません。
このパスワードのルールは単純です。その中に2つのピリオドがあり、最大8つの可能性の高い単語とそれらの可能な接続詞、可能なダッシュまたはアンダースコア、およびそれらの単語の可能な省略形が混在しています。それが失敗した場合は、サフィックスを付けて通常のブルートフォースにフォールバックしたいと思います。
これにより、ファイルを取得できる可能性が最も高くなります。いくつかの入門のヒントと概要の説明で、これについて正しい方向に向けられることを本当に感謝しています。どうもありがとうございます!
ここで学んだことを後世に投稿します。自分がやりたいことをする方法を見つけましたが、タスクを完了するためのシステム能力があるとは思えません。
私が最初に試みたのは、私の推測が何であるかの可能なすべての組み合わせでした。まず、Rubyスクリプトを作成して、それを生成しました。
#!/usr/bin/env Ruby
JOINERS = ['', '-', '_', ' ']
PREFIX = %w[words for prefix]
CONJUNCTION = ['and', nil]
OPTIONAL = %w[words for optional]
SUFFIX = %w[.tar.gz .tgz .tar.gz.aes .tgz.aes]
def permute collection, length = nil
(1..(length || collection.length)).
flat_map {|qty| collection.permutation(qty).to_a }
end
def prefixer
permute(PREFIX, 3).each do |prf|
yield prf
end
end
def optionaler(pfx, j, s, cap = false)
permute(OPTIONAL, 3).each do |opt|
opt = opt.map(&:capitalize) if cap
CONJUNCTION.each do |cj|
puts [pfx.join(j), cj, opt.join(j)].compact.join(j) + s
end
end
end
SUFFIX.each do |s|
JOINERS.each do |j|
prefixer do |prf|
puts prf.join(j) + s
optionaler(prf, j, s)
prf = prf.map(&:capitalize)
puts prf.join(j) + s
optionaler(prf, j, s, true)
end
end
end
私はこのスクリプトを実行しましたが、出力では500,000エントリに恥ずかしがり屋でした。次に、FishShellを使用してそれらのそれぞれを反復処理し、パスワードを試しました。
for password in (Ruby script.rb)
aescrypt -d -p $password encrypted_file.aes 2>/dev/null
end
どれも動作しなかったため、ブルートフォースに切り替えなければなりません。
それで、マシューの提案に従ってcrunchを使用する方法を学び、xargsと組み合わせて、それはかなり素晴らしいです!
毎回ファイルを復号化しようとするシェルコマンドを実行しているので、ディスクドライブIOはパフォーマンスの考慮事項かもしれないので、tmpfsを作成しました=ファイルを配置し、RAM内からすべてを操作するためのファイルシステムフォルダー。
mkdir tmpfs
Sudo mount -t tmpfs -o size=800M,mode=0755 tmpfs tmpfs/
cp encrypted_file.aes tmpfs/
cd tmpfs
そして、これが私が考え出した最初のコマンドです。
crunch 3 26 abcdefhilmnoprstuvwyz0123456789\ -_. -d 1@ --stdout | \
xargs -r -P 4 -I PASSWORD bash -c \
"! aescrypt -d -p 'PASSWORD' encrypted_file.aes 2>/dev/null"
こちらがパーツです。 crunchは、以下のパラメーターのすべての可能性を生成します。最初の数字は最小文字数、次は最大文字数です。その後は、すべての試行で使用する文字リストです。含まれていないと確信している文字を除外したので、文字リストが短くなり、処理がはるかに速く完了します。次に私は-d 1 @を使用して、同じ文字が2つ隣り合わないことをクランチに伝えます。
次に、それをxargsにパイプします。これは、ストリーミングされた入力データをパラメーターとして次のコマンド/引数に渡すために一般的に使用されるNiceツールです。ただし、この場合は、置換するテキストを決定する-Iオプションを使用して、特定の場所にパイプを挿入しています。 -rオプションは、空の入力で実行しないことを示しています。 -P 4は、渡された4つの異なるパラメーターを使用して4つのインスタンスを並列に実行するように指示します(これは、システムの4つのコアすべてを利用します)。 1つではなく4つのコアを使用すると、時間のコストの約60%を削減できます。
次に、bashコマンドを使用してaescryptを実行しますbash -cそして[〜#〜] password [〜#〜]領域は個別の入力が渡されました。これを強打(!)で開始する理由は、-aescryptがファイルの復号化に失敗すると、STDERRに書き込まれ、失敗する終了が発生するためです。コマンド全体をすぐに停止するステータス。強打は結果を反転させ、失敗が発生するたびに実行を継続しますが、ファイルが最終的に復号化されると、肯定応答を無効にしてループを終了します。
これが最も効果的な方法ではないことに気づきましたが、十分な試練を与えています。私が見たいくつかの追加のパフォーマンスの遵守を提供します。
xargs並列パラメーターを使用する場合、どれだけ高くしても、コアの数と同じパフォーマンスが得られます。ただし、複数のシェルをxargsで実行して、それぞれが必要以上のコアを要求すると、コアが1つだけであるかのように、すべてのシェルのパフォーマンスが低下します。
私の推測の1つは、パスワードが.tar.gz
で終わることです。2つのコアを使用するように上記のコマンドを変更し、2番目のコマンドの文字リストをgz
を含まないように短くして、タスクを半分に分割しますまたは任意の番号(内線番号が存在する場合、このパスワードには番号が存在しないため)と'PASSWORD'
を'PASSWORD.tar.gz'
に置き換えました。 2番目のコマンドも2つの並列プロセスを提供しました。
私は盲目で飛んでいたので、どのような進歩があったのだろうと思ったので、パイプを通過しているものを読み取る方法を調べました。最初に、各クランチインスタンスのPIDをpidof crunchで取得できます。それができたら、次のようにして、個々のPIDを通じてストリーミングされているものを見ることができます。
Sudo strace -pPID_NUM_HERE -s99999 -e write
ここから、進行状況を書き留め、クランチプロセスを停止し、開始ポイントに-sオプションを追加して、中断したところからクランチコマンドを再開します。
2文字のパスワードでは1秒あたり約35個のパスワードが試行され、3文字のパスワードでは1秒あたり約12個のパスワードが試行されます。上記のコマンドの前にtime -v --output=somefile
を付けてテストしました。速くはありません。
パイプ、xargs、bashを使用してこれらのコマンドを実行すると、それぞれに独自のコストがかかるため、Rustで実装を記述して、実行されていることを正確に実行する方がはるかに便利です。上記のように AES Crypt のソースコードを取得し、ライブラリをRustにリンクして、Cコードを直接呼び出す必要があります。 クランチまたは、必要なパーツを手動で実装します(後者の方がおそらく優れています)。
ミドルウェアのShellのすべてを取り出して、純粋なRustを実行するだけで、確実にパフォーマンスが向上します。クールなGPUを活用できるかどうか。しかし、私がそこに到達するための学習曲線が少しあります。
この情報が他の人に役立つことを願っています。これと同じくらい賢明な答えを自由に共有してください。ありがとう!
Oriは、ハッピーパスが期待どおりに機能するかどうかをテストしたかどうか尋ねました。どちらの場合も、私はそれを考慮していませんでした。ここで、FishShellスクリプトの更新バージョンを取得しました。これは、ハッピーパスで機能します。
for password in (Ruby script.rb)
if test -s the_file
break
else
aescrypt -d -p $password the_file.aes 2>/dev/null
end
end
test -s
は、ファイルthe_fileが空白かどうかをテストします。 aescrypt
は、同じファイル名の空のファイルを同じディレクトリに.aes
拡張子なしで復号化して書き込みます。復号化を成功させるためにも同じ名前を使用します。これは、すべてのシナリオで考慮する必要があります。
更新された新しいcrunchおよびxargsのコードは正常に機能します。
crunch 3 26 abcdefhilmnoprstuvwyz0123456789\ -_. -d 1@ --stdout | \
xargs -r -P 4 -I PASSWORD bash -c \
"! aescrypt -d -p 'PASSWORD' -o 'PASSWORD' encrypted_file.aes \
2>/dev/null; if [[ -s \"PASSWORD\" ]]; then exit 255; fi"
これにより、現在のパスワードが何であれ、出力ファイルに名前が付けられます。ファイルが空でない場合は、正常に終了します。私はこれを例でテストしましたが、うまくいきます!
うまくいけば、今すぐファイルを復号化します。
abrute と呼ばれるマルチスレッドAESファイルのブルートフォース復号化ソフトウェアを作成しました。それが機能するためには、システムの実行可能パスに aescrypt が必要です。
コードを確認する代わりに、すぐに使えるソリューションです。
「インテリジェントな」辞書攻撃は、あなたが探しているものかもしれません。ただし、速度を上げるには十分なハードウェアが必要です。静的辞書攻撃は(実際にパスワードを覚えていない限り)探しているものではありませんが、Password Recovery Toolkit(PRTK)などの適切なソフトウェアが役立つ可能性があります。 PRTKのドキュメントには次の内容が記載されています。
辞書攻撃の際、PRTKとDNAは選択されたプロファイルの情報を使用して、伝記辞書とユーザー辞書のバリエーション、順列、および組み合わせを作成します。さらに、音声の変更を使用し、接頭辞または接尾辞を追加し、文字を置き換えます。
ソース: https:// ad-pdf .s3.amazonaws.com/PRTK_DNA_UserGuide.pdf