John the Ripperによるパスワードクラッキング

オフラインでパスワードを総当り・辞書攻撃ができるツール、John the Ripperの基本的な使い方について書いてみます。
(もう一つ、hashcatというツールも有名だが今回は試していない)

インストール方法

https://github.com/openwall/john/tree/bleeding-jumbo/doc
ここにあるINSTALLファイルにインストール方法が書いてある。
Windowsなら「INSTALL-WINDOWS」、MACなら「INSTALL」を読むこと。
Linuxの場合は「INSTALL-FEDORA」か「INSTALL-UBUNTU」を参考にする。

ここでは「INSTALL-UBUNTU」に従った方法を書いておく。
※長々と書いてあるが、GPUサポートやOpenCLなどのオプションなどを無視すればそんなに複雑ではない。

mkdir -p ~/src
sudo apt-get -y install git build-essential libssl-dev zlib1g-dev
sudo apt-get -y install yasm pkg-config libgmp-dev libpcap-dev libbz2-dev
cd ~/src
git clone https://github.com/openwall/john -b bleeding-jumbo john
cd ~/src/john/src
./configure && make -s clean && make -sj4

これだけOK(上のコマンドでは、~/srcディレクトリの下にインストールする。名前は自由に変えて良い。)。
最後に

cd ~/src/john/run
./john --test=0

でテストを実行し、"All formats passed self-tests."みたいなメッセージが表示されたら成功。

基本的な使い方

上のコマンドでインストールした場合、~/src/john/run/johnがパスワードクラッカー本体の実行ファイルになっているはず。
ここからは、対象の形式に応じて主に2つの方法がある。

1.パスワードのハッシュファイルを対象にする場合

たとえば、Linuxだと/etc/shadowにハッシュ化したパスワードが保存してある。
このファイルをコピーしたshadowという名前があるとしたら、

~/src/john/run/john shadow

これだけで良い。

2.暗号化、鍵付きファイルなどを対象にする場合

この場合は一手間かける必要がある。

1.~/src/john/run内にある、〇〇2johnという名前のツールを使ってファイルを変換する。
2.変換したファイルをパスワードクラッカーにかける。

という手順になる。
たとえば、zipファイルの場合は「zip2john」、EXCELファイルの場合は「office2john.py」を使うことになる。

・暗号化zipファイルの場合

~/src/john/run/zip2john target.zip > hash
~/src/john/run/john hash

ワードリストの指定

John The Ripperにはワードリストが同梱されており、デフォルトだとそれを使用してクラッキングを行うが、これはワード数があまり多くない。
--wordlist=xxxxxxというオプションを実行時に使うことで、ネット上などからダウンロードしたワードリストに変更することができる。

~/src/john/run/john --wordlist=xxxxxx hash

ワードリストがダウンロードできるサイト

https://github.com/danielmiessler/SecLists/tree/master/Passwords
ここには多数のワードリストが置いてある。

過去の大規模なパスワード流出事件で有名な、RockYouのリストはhttps://github.com/danielmiessler/SecLists/raw/master/Passwords/Leaked-Databases/rockyou.txt.tar.gz(すぐにダウンロードが始まるので注意)からダウンロードできる。実際に流出したパスワードのリストで、1000万語以上のリストになる。



https://github.com/ohmybahgosh/RockYou2021.txt
https://weakpass.com/wordlist
上の2つのリンクには巨大なワードリストがある。実用性はあるんだろうか…?

参考リンク

John the Ripper公式サイト
https://www.openwall.com/john/
John the Ripper公式Wiki
https://openwall.info/wiki/john

・hashcat公式サイト
https://hashcat.net/hashcat/

PC内のデータを完全消去する方法

あとからデータを復旧されないために、データを完全消去する方法について調べてみました。

※基本的にArchWikiの記事に書いてあることを抜き出しただけです。
ディスクの完全消去 - ArchWiki
ソリッドステートドライブ/メモリセルの消去 - ArchWiki

最初に

USBブートなどで外部ディスクからOSを起動し、データ消去の対象となるデバイスをマウントします。
(当たり前ですが、内部ディスクを使って起動したOSからでは内部ディスクを完全消去はできません)
ここでは、Linux系のOSを使うことを前提にします。

lsblk

などのコマンドで、対象とするデバイス名を確認。(サイズを確認すればだいたい分かるはず)

HDDの場合

shredコマンドを使うのが分かりやすいでしょう。

shred -v -n 3 -z /dev/sdX

/dev/sdXの部分は、消したいデバイス名に変えてください。

上のコマンドで、

  1. ランダムデータをディスク全体に書き込む(3回)
  2. 最後にすべてゼロで上書きする

を実行します。
-nのあとの数字を変えれば、ランダムデータを書き込む回数を変えることができます。回数を増やすほど時間がかかりますが、安全度は増すはず。

SSDの場合

SSDは内部構造が違うため、上記の方法で上書きするのは有効でない可能性があるそうです。よって別の方法を使います。
SATA接続の場合の手順。NVMeの場合はまた別の方法になるようです。

1.ドライブのセキュリティをnot frozenにする

hdparm -I /dev/sdX | grep frozen

これでnot frozenと表示されたらOKです。
frozenと表示された場合、なんとかしてロック解除してnot frozenに変える必要があります。サスペンド→復帰を繰り返すとうまくいったりするらしいです。

2.ドライブにパスワードを設定する

hdparm --user-master u --security-set-pass PasSWorD /dev/sdX

PasSWorDの部分は設定したいパスワードに変えてください(次の作業で一時的に使うだけなので何でもいい)

3.Secure Eraseの実行

hdparm --user-master u --security-erase-enhanced PasSWorD /dev/sdX

もしくは

 hdparm --user-master u --security-erase PasSWorD /dev/sdX

を実行します。security-erase-enhancedのほうがより入念に削除するようなので、基本的にそちらを選べばいいでしょう(デバイス側が対応していなかったらsecurity-eraseを選ぶ)。これで終了です。

消したファイルをリカバリする方法(PhotoRec)


Photorecというオープンソースのツールを使えば、間違えて消してしまったファイルを元に戻せる可能性がある。


参考リンク

Digital Picture and File Recovery(公式wiki
testdisk — testdisk 7.1 documentation(公式ドキュメント)
PhotoRec Step By Step - CGSecurity(公式wikiのPhotoRec使用手順)

手順

Linuxでの手順を書きますが、PhotoRecはWindowsでも使えるツールみたいです。

1.対象ディスクのコピー

対象ディスクが外部デバイスではない場合、まずPCの電源を消して、LiveOSでUSBブートします。
ddコマンドなどで、対象ディスク全体をコピーする(デバイスファイルから直接リカバリすることもできるが、こちらのほうがたぶん安全)。壊れたHDDからファイルを回復したい場合などは、ddrescueコマンドを使えばうまく行く可能性あり。

dd if=/dev/sda of=backup.img bs=1M status=progress

ddコマンドの使い方については詳しくは書きませんが、lsblkなどでディスク名を確認してコピーしましょう。

2.TestDiskをインストール

PhotoRecは、TestDiskというツールの一部なので、TestDiskをインストールします。
UbuntuDebianなら以下コマンドでインストールできるはず。

sudo apt install testdisk

公式サイトはここ(https://www.cgsecurity.org/wiki/TestDisk_Download)にあるので、ここからダウンロードもできる。

3.PhotoRecを起動

sudo photorec backup.img

1でディスクをコピーしたファイルを指定して起動。
これ以降は対話式で実行するので説明は要らない…はずなのですが、やや分かりにくいので書いておきます。

4.対象ディスクを選択


バックアップイメージを対象にする場合、これは一つしか表示されないはず。エンター押せばOK。

5.ファイルの種類の選択


パーティション選択の画面に移りますが、すぐにパーティションを選択せずに、右に行って[ File Opt ]を選択するのがオススメ(下部のメニューは左右ボタンで動かせる)。

リカバリしたいファイルの種類を選択できます。sで全消去して、xで目的のファイルの種類を有効化し、エンターを押して元に戻る。

6.パーティションの選択

さっきの画面に戻ります。対象のパーティションを選択し、下メニューを[ Search ]に戻してエンター。

7.ファイルシステムの種類の選択


対象パーティションファイルシステムext2ext3ext4の場合は[ ext2/ext3 ]を、それ以外の場合は[ Other ]を選択。(ext4も[ ext2/ext3 ]を選ぶのに注意)

8.未割り当ての領域だけをスキャンするか、全体をスキャンするかを選ぶ

https://www.cgsecurity.org/mw/images/PhotoRec_free.png
[ Free ]を選択した場合、現在使われていない領域だけからスキャンするようです。この場合、削除済みのファイルだけをリカバリし、未削除のファイルは無視されます。

9.出力先ディレクトリを選択


出力先を選択し、cを入力すればスタート。

10.PhotoRecを終了


終わったら[ Quit ]を選択していって終了。

11.その後

PhotoRecによってリカバリされるファイルは、ランダムなファイル名で大量に出力されます。ここから目的のファイルを見つけ出す必要がある訳です。
重複した中身のファイルがリカバリされる可能性があるので、まずはそれを消しておきましょう。
fdupesコマンドを使うと、

sudo fdupes -rfdN (出力したディレクトリ)

で重複消去できる。
そのあとはfindコマンドとか使って頑張ってください…。

ファイルの完全消去方法

bogamp.hatenablog.com
前記事の方法でファイルを暗号化したとしても、暗号化する前のファイルは残っています
元ファイルを消したいなら自分で消すことになりますが、単に消去するだけだと、ディスクからデータは消えません。
ファイルリカバリ - ArchWiki このあたりに載っている方法で復元される可能性あり。)

Linuxなら、coreutilsに入っている(つまり普通のLinux系OSなら最初から入っている)shredコマンドで、ファイルの完全消去ができます。

shred -uvz (ファイル名)

shredは、乱数データを何度も上書きすることで復元を難しくするコマンド。shredコマンドはデバイス全体のデータ消去によく使われますが、ファイル単体の消去もできるようです。

ただ、HDDではなくSSDを使っている場合、上記のshredだと消せない可能性があるとか?このあたりは難しくてよくわかってないです…


参考
ディスクの完全消去 - ArchWiki

yt-dlpで、チャンネルの更新差分だけダウンロードするときのオプション

yt-dlpの基本的な使い方

yt-dlp https://www.youtube.com/watch?v=xxxxxxxxxxxxxx
# プレイリスト
yt-dlp https://www.youtube.com/watch?v=xxxxxxxxxxx&list=xxxxxxxxxxxxxxxxxxxxxxxxxx
# あるユーザーの投稿動画すべて
yt-dlp https://www.youtube.com/@xxxxxxxxxx

ブラウザからURLをコピーして、yt-dlpコマンドのあとにペーストすればだいたいok。デフォルトで最高画質でダウンロードしてくれる。
別の画質を指定したいなら、

yt-dlp -f 'bestvideo[height<=1080]+bestaudio/best[height<=1080]'   

このように-fで指定する(上のオプションは、「1080p以下で最も良い画質と、最高音質でダウンロードする」という意味)。

使用可能な動画サイト一覧

https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md

※「generic-extractor」 という、他のサイトでも使える汎用抽出機能も備えている。
ここに載っていないサイトからもダウンロードできるかもしれない。

更新差分だけダウンロード

yt-dlp -a (URLリストを書いたファイル) --download-archive (アーカイブファイル)


-a(--bath-file)はダウンロードするURLを、指定したファイルから読み取るオプション。テキストファイルに一行に1つずつURLを書いておけば、全部読み取ってダウンロードしてくれる。
↓みたいに書いていって、そのファイル名を指定すれば良い。

https://www.youtube.com/@xxxxxxxxxxxxxxx/videos
https://www.youtube.com/@xxxxxxxxxxxxxx
https://www.youtube.com/@xxxxxxxxxxxxxx
https://www.youtube.com/@xxxxxxxxxxxxxx
https://www.youtube.com/playlist?list=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx


--download-archiveは、

  • ダウンロードしたファイルを、指定したアーカイブファイルにメモする
  • アーカイブファイル内にあるファイルは再度ダウンロードせず、スキップする

この2つをやってくれるオプション。
毎回同じファイルを指定する(間違って消さないこと!)ことで、重複してダウンロードするのを避けられる。

これで、毎回コマンドを打つごとに、新しい動画だけをダウンロードできるはず。



何らかの方法で、定期的に実行させるのも便利かもしれません。

yt-dlpのダウンローダーにaria2を使う

aria2は、分割ダウンロードができるCLIツール。curlやwgetの数倍速い 爆速ダウンローダー aria2を使う #Linux - Qiita
aria2を使えば、(条件次第だが)非常に高速なダウンロードが可能(サーバー側に負担をかける可能性があります。注意。)

※コマンドはaria2cという名前になる

aria2単体でファイルのダウンロード

aria2c -x 8 -s 8 -k 1M (URL)
  • -x(--max-connection-per-server) : 1つのサーバーへのコネクション数上限。デフォルト:1
  • -s(--split) : 1回のダウンロードに使うコネクション数。デフォルト:5

よく分からないけど()、-xと-sを設定すれば分割ダウンロードできる。

  • -k(-min-split-size) : ファイルの最小分割サイズ。分割後のファイルサイズがこれより小さくなる場合は分割しない。デフォルト:20M

-kを小さくする(1Mは設定できる最小値)ことで、ファイルサイズが小さくても分割してくれるようになる。
※サーバー側の制限に引っかかることも多い

yt-dlpでaria2を使う

yt-dlpを使うと、youtubeや、他にも様々な動画サイトから簡単に動画をダウンロードできる。
使用可能な動画サイト一覧: https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md
※generic-extractorというどのサイトでも使える汎用抽出機能も備えており、ここに載っていないサイトからもダウンロードできるかもしれない。

yt-dlpの基本的な使い方

yt-dlp https://www.youtube.com/watch?v=xxxxxxxxxxxxxx
# プレイリスト
yt-dlp https://www.youtube.com/watch?v=xxxxxxxxxxx&list=xxxxxxxxxxxxxxxxxxxxxxxxxx
# あるユーザーの投稿動画すべて
yt-dlp https://www.youtube.com/@xxxxxxxx

基本的に、引数にURLを書くだけでうまくやってくれるはず。画質はデフォルトだと最高画質になる。(オプションで-fを使うことで変更可能)

yt-dlpでaria2を使う

yt-dlp --downloader aria2c --downloader-args "-x 8 -s 8 -k 1M" https://www.youtube.com/watch?v=xxxxxxxxxxxxxx

外部ダウンローダーを指定すれば、aria2を使うことができる。downloader-argsで分割ダウンロード用オプションを設定すればOK。

公式サイト
https://github.com/yt-dlp/yt-dlp
https://aria2.github.io/index-ja.html


【追記】

実際に比較してみたら、aria2を使わないで素のyt-dlpを使っても、ダウンロードスピートはあんまり変わらなかった。(原因不明。yt-dlpが内部で色々と最適化してるか、サイト側の制限に引っかかっているか…)
ちなみに、yt-dlpのオプションで-N 3とかを使うと、yt-dlp内部で並行ダウンロードの処理をしてくれます。

yt-dlp -N 3 https://youtube.com/watch?v=xxxxxxxxxx

こっちもありかも。

ffmpegで動画、音声を切り取る

※動画、音声のどちらでも同じコマンドで良い。拡張子から自動判定される。

ffmpeg -ss 00:02:00 -t 00:03:30 -i (入力ファイル) (出力ファイル)

2分のところから3分30秒間の動画を切り取る(つまり、2分〜5分30秒の間を切り取る)
↑のコマンドだと、切り取る時間がやや不正確になる可能性がある。
正確に切り取りたいなら、

ffmpeg -i (入力ファイル) -ss 00:02:00 -t 00:03:30 (出力ファイル)

入力ファイルの後に時間を指定する。これだと動画全体を読み取ってから切り取るので、前述のコマンドより時間がかかる。