John the Ripperを使ってみる

セキュリティ

超大型の台風が日本を通過し少し安心しました。

今回は少し遅くなってしまいましたが、前回の勉強会時に発表した「John The Ripper」について解説していきます。

なお、内容については個人的なやり方でもあるため、あくまで使用方法の一例として見て頂ければと思います。

また、悪用は絶対にしないでください。

事前の情報収集

以前に以下で実施した環境を用いて検証します。(勉強会で話した環境とは異なります。)

metasploitを使ってみよう!metasploitによるハッキング実践

具体的にはKaliLinuxにて、metasploitable2のサーバ内のファイルを取得したのち、「John The Ripper」によるパスワードクラックを実施します。

まずは前回と同様に「msfconsole」を起動しvsftpdの脆弱性を使用して侵入します。

侵入すると分かりますが、以下のとおり侵入できたユーザは「root」となっています。

よって、以下のとおり「/etc/shadow」を取得することが可能です。

※shadowファイルはセキュリティ関係の仕事をしている人なら良く知っているかと思いますが、各ユーザのパスワードのハッシュ値が記載されているという、見られると大変危険なファイルです。攻撃者に発見された場合大変な事態に(これからやっていきますが)なりますので、取り扱いには注意してください。

また、もちろん「/etc/passwd」も取得することができるので、「/etc/shadow」と「/etc/passwd」の二つをファイルとして、KaliLinux上に保存します。

以下のとおり、「metasploitable2」のとpasswdファイルとshadowファイルをそれぞれ「passwdfile.txt」と「shadowfile.txt」として取得しました。

これを使用して「John The Ripper」でパスワードクラックを!と行きたいところですが、その前にunshadowというコマンドを使ってpasswdファイルとshadowファイルを結合する操作を行います。

$ unshadow  passwdfile.txt shadowfile.txt > cracktestfile.txt
#unshadowコマンドで「passwdfile.txt」と「shadowfile.txt」を結合させた「cracktestfile.txt」を作成

中身は以下のようになっています。

これで準備は完了しましたので、「John The Ripper」によるパスワードクラックをやっていきます。

「John The Ripper」によるパスワードクラック

ここからは非常に簡単です!動かすコマンドについては以下でOKです。

john cracktestfile.txt
#「cracktestfile.txt」に対してデフォルトでパスワードクラックを行う

すると以下のとおり、「John The Ripper」によってパスワードがどんどんクラックされていきます。

このまま放置していても良いのですが、時間がかかるので早々に切り上げます。

切り上げる際は画面上にも書いてあるとおり、「q」ボタンを押すことで切り上げることができます。

さて実際にクラックできたパスワードを確認してみます!

$ john cracktestfile.txt --show
#「--show」で「cracktestfile.txt」でクラッキングできたパスワードを確認
sys:batman:3:3:sys:/dev:/bin/sh
klog:123456789:103:104::/home/klog:/bin/false
msfadmin:msfadmin:1000:1000:msfadmin,,,:/home/msfadmin:/bin/bash
postgres:postgres:108:117:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
user:user:1001:1001:just a user,111,,:/home/user:/bin/bash
service:service:1002:1002:,,,:/home/service:/bin/bash

6 password hashes cracked, 1 left

このとおり、実施したのは5分弱ですが、6つのユーザのパスワードが判明しました。

johnコマンドで用意されているオプションは以下のとおりです。(–helpの結果をそのまま記載しています)

$ john --help
John the Ripper 1.8.0.13-jumbo-1-bleeding-973a245b96 2018-12-17 20:12:51 +0100 [linux-gnu 64-bit x86_64 AVX2 AC]
Copyright (c) 1996-2018 by Solar Designer and others
Homepage: http://www.openwall.com/john/

Usage: john [OPTIONS] [PASSWORD-FILES]
--single[=SECTION[,..]] "single crack" mode, using default or named rules
--single=:rule[,..] same, using "immediate" rule(s)
--wordlist[=FILE] --stdin wordlist mode, read words from FILE or stdin
--pipe like --stdin, but bulk reads, and allows rules
--loopback[=FILE] like --wordlist, but extract words from a .pot file
--dupe-suppression suppress all dupes in wordlist (and force preload)
--prince[=FILE] PRINCE mode, read words from FILE
--encoding=NAME input encoding (eg. UTF-8, ISO-8859-1). See also
doc/ENCODINGS and --list=hidden-options.
--rules[=SECTION[,..]] enable word mangling rules (for wordlist or PRINCE
modes), using default or named rules
--rules=:rule[;..]] same, using "immediate" rule(s)
--rules-stack=SECTION[,..] stacked rules, applied after regular rules or to
modes that otherwise don't support rules
--rules-stack=:rule[;..] same, using "immediate" rule(s)
--incremental[=MODE] "incremental" mode [using section MODE]
--mask[=MASK] mask mode using MASK (or default from john.conf)
--markov[=OPTIONS] "Markov" mode (see doc/MARKOV)
--external=MODE external mode or word filter
--subsets[=CHARSET] "subsets" mode (see doc/SUBSETS)
--stdout[=LENGTH] just output candidate passwords [cut at LENGTH]
--restore[=NAME] restore an interrupted session [called NAME]
--session=NAME give a new session the NAME
--status[=NAME] print status of a session [called NAME]
--make-charset=FILE make a charset file. It will be overwritten
--show[=left] show cracked passwords [if =left, then uncracked]
--test[=TIME] run tests and benchmarks for TIME seconds each
--users=[-]LOGIN|UID[,..] [do not] load this (these) user(s) only
--groups=[-]GID[,..] load users [not] of this (these) group(s) only
--shells=[-]SHELL[,..] load users with[out] this (these) shell(s) only
--salts=[-]COUNT[:MAX] load salts with[out] COUNT [to MAX] hashes
--costs=[-]C[:M][,...] load salts with[out] cost value Cn [to Mn]. For
tunable cost parameters, see doc/OPTIONS
--save-memory=LEVEL enable memory saving, at LEVEL 1..3
--node=MIN[-MAX]/TOTAL this node's number range out of TOTAL count
--fork=N fork N processes
--pot=NAME pot file to use
--list=WHAT list capabilities, see --list=help or doc/OPTIONS
--format=NAME force hash of type NAME. The supported formats can
be seen with --list=formats and --list=subformats

今回はオプションを指定せずに実施しましたが、例えばオプションとして「–incremental」を指定することで、総当たり攻撃を行うことができ、ファイル自体は攻撃者のローカルにある場合、パスワードの長さによりますが、いつかは解かれてしまう可能性があります。
※パスワードの長さ等によってはクラックするのに数年から数万年以上かかる可能性もあります。

最後に

「John The Ripper」によるパスワードのクラックを実施しました。

実際のペネトレーションテストとかでは、解いたパスワードを用いて他のサーバに対してもログイン試行を行ったりします。

また、metasploitable2に侵入できた時点でrootだったので、DBの情報を確認したり、DBのdumpを取得したりと色々行う場合があります。

脆弱性診断とペネトレーションテストの違いを聞かれることもありますが、取得できた脆弱性、情報を用いて他サーバにアタックしたり、侵入したり試行するところがまずは大きな違いかと私は考えています。(その他にも色々ありますがここでは割愛します)

また、情報を取得するまでについても知っていればそこまで難しい話ではなく、動きを知っていていればコマンドを打つことで誰でもハッカー(またはクラッカー)になることができるので、セキュリティを守る側は大変です。

現在はエンジニアの地位(給料的な意味でも)も改善してきている感じはありますが、まだまだ地位をあげる必要があると私は考えています。

そうすれば日本でのエンジニア自体の人数も増え、技術力が高い国として復活できるのではないかと、大雑把にですが考えています。

不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。

最後に、今回勉強会の実施日からブログの公開まで日が大分開いてしまったことをお詫びいたします。

コメント