8割解けるCTF「WEST-SEC」

セキュリティ初心者の方でも楽しめるゲーム形式のセキュリティイベント。CTFや勉強会の依頼があればご相談ください。

暗号関連

暗号には、「共通鍵暗号」「公開鍵暗号」「ハッシュ関数」の3つがあります。※ハッシュ関数を暗号に含めることには、議論がありますが。

1.共通鍵暗号

(1)共通鍵暗号について

・暗号する鍵と復号する鍵が同じである方式
・ZIPのパスワードで暗号化し、復号するのも共通鍵暗号。暗号化と復号が同じ鍵だから。

(2)シーザー(Caesar)暗号

・古くはシーザー(Caesar)暗号で、鍵となる値を13にするとROT13。※ROTはRotationの略
https://ja.wikipedia.org/wiki/ROT13

(3)CyberChef

❶CyberChefでROT13をやってみよう。
RecipeにROT13とし、Inputに変換したい文字を入れ、Recipeに処理を入れます。
https://gchq.github.io/CyberChef/
 ROT13 Brute Forceを使うと、全てのパターン(26個)で実施してくれるので、CTF等で使うには便利でしょう。

❷Magic
Magicというのもあり、イイ感じに変換してくれる場合がある
たとえば、以下
72 101 108 108 111 --> hello
%E3%82%BD%E3%83%AB%E3%83%88 --> ソルト

2.ハッシュ関数

(1)ハッシュ関数

・暗号化の一つともいえる。ただし、不可逆性(元に戻せない)
・MD5やSHA-1など色々あるが、古い方式はコンピュータの進化により、解読される可能性が高い。SHA-256などをハッシュから元のデータを探す
・パスワードもハッシュ化して保存される。
ためしに、shadowファイルを見てみましょう。
 cat /etc/shadow
・パスワードを暗号化しておらず、情報漏えいした事件も発生
https://xtech.nikkei.com/atcl/nxt/column/18/00001/01661/

(2)ソルト

・ソルト(塩)を付加することで、復元を難しくしている。
・パスワードのファイル(shadowファイル)で確認しましょう。(管理者でしかできないと思います)

#ユーザを作成。パスワードは同じ
echo password | passwd --stdin user1 
echo password | passwd --stdin user2

#しかし、ハッシュ値が変わっています。
cat /etc/shadow
user1:$6$axBL.lN4$bVxFfRW./HXeVGOZrticDk94XZ6PNtKZ2V4AJXlqgxWpNrRla9./JwSxslhsmxUzeQ2SZ8HWyEcZLANNcsJ.h0:19374:0:99999:7:::
user2:$6$5ziXSyug$bhnd/dTczpgeGxTKM6G2FKY5ZFRUZxWZ3oYOVidcSe8/cwbOk8q3n0fm1WeFAehrmqv4ZofasZ0cfgccw2UWs/:19374:0:99999:7:::

自分のパスワードをpasswdコマンドで変更し、shadowファイルの中身を比較してみよう。 ※事前にchmod o+r+x /etc/shadow として、一般ユーザがログを閲覧できるようにしています。(本当はやってはいけません)
①shadowファイルの内容をメモしておく
②PWを変える ※簡単なのはダメです。8文字以上の複雑なのを設定してください。
③PWを元に戻す
④shadowファイルの内容を確認し、元の値と比較。

[user20]$ passwd
Changing password for user20.
(current) UNIX password:       #現在のパスワードを入れます。
New password:      #新しいパスワードですが、辞書にない、8文字以上の複雑なパスワードを入れます。    
Retype new password:
passwd: all authentication tokens updated successfully.

cat /etc/shadow

パスワードが同じでも、ソルトが違うので、違うハッシュ値になっているはずです。

また、ハッシュ値は、$を区切りとして、以下の順に並んでいます。

<ユーザ名>:$<ハッシュアルゴリズム>$<ソルト>$<ハッシュ値>

ハッシュアルゴリズムに関して、↑では$6とあるので、SHA-512でハッシュしていることがわかります。

ID ハッシュアルゴリズム
$1 MD5
$2a,$2b Blowfish(Bcrpyt)
$5 SHA-256
$6 SHA-512

余談ですが、上記の場合、パスワードは password であり、ソルトは $axBL.lN4 です。
cryptコマンドによって、crypt(パスワード、ソルト)の構文で実施すると、shadowファイルに記載されたハッシュ値が計算できます。

# perl -e 'print crypt("password", "\$6\$axBL.lN4");'
$6$axBL.lN4$bVxFfRW./HXeVGOZrticDk94XZ6PNtKZ2V4AJXlqgxWpNrRla9./JwSxslhsmxUzeQ2SZ8HWyEcZLANNcsJ.h0

3.公開鍵暗号

・秘密鍵と公開鍵を使った暗号方式。
・RSA暗号がその代表
・RSAの仕組みは少し複雑です。
https://it-trend.jp/encryption/article/64-0056

4.エンコード

(1)エンコードについて

・エンコードとは、文字やデータをルールに基づき変換することです。
❶パーセントエンコーディング
URLやHTTPヘッダには日本語や「<」などが使えないので、ASCIIコードに変換します。さらに、パーセントエンコーディングしたことを示すために%を付けます。URLエンコーディングとも言われます。

文字 ASCIIコード パーセントエンコード
1 31 1
3c %3c
2f %2f

たとえば、以下のURLをデコードすると、どうなるでしょうか。

https://west-sec.com/crypto#4%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89

❷BASE64エンコード
電子メールはもともと、ASCII文字を想定していて、日本語文字などは送れません。そこで、BASE64エンコードによって、英数記号と+、/に変換します。
たとえば、元データ west を、BASE64エンコードすると d2VzdA== になります。このように、最後に=が入ることがあるのがBASE64エンコードの特徴です。=は、文字埋めの処理です。

(2)エンコードツール

・エンコードは、Windowsのコマンドプロンプトから、標準のコマンドcertutilでもできます。まあ、Webツールを使うのが便利でしょう。たくさんのサイトがありますが、以下のCyberChefがCTF利用者には人気です。

https://gchq.github.io/CyberChef/

Inputに変換したい文字を入れ、Recipeに処理を入れます。複数の処理を入れることも可能です。
たとえば、UTF-16LE(Encoding Text)に変換して、Base64(To Base64)をする場合は、2つを並べます。すると、Outputに処理結果が表示されます。処理については、左上にSearchがあるので、そこで処理を検索すると便利です。

5.PKI

・PKIは、デジタル署名と、証明書の理解が必要です。
・WEST-SECの証明書を見てみましょう。
https://west-sec.com
証明書の階層から、署名したのはISRG(=Let’s Encrypt)、件名にwest-sec.comが
記載。また、サブジェクトの公開鍵をみると、west-sec.comの公開鍵がわかります。
さらに、SHA-256指紋というのが、ディジタル署名です。