淡々と備忘録を綴る

IT周りの行き詰まったところやメモを備忘録として記録します

picoCTF 2024[General Skills] 400pts SansAlpha WriteUp

概要

2024年3月に実施されたpicoCTFに参加してきたので、備忘録がてらwriteupを書きます。 今回はgeneral問題の一番点数の高かった400pts問題のwirteupです。

問題

The Multiverse is within your grasp! Unfortunately, the server that contains the secrets of the multiverse is in a universe where keyboards only have numbers and (most) symbols. Additional details will be available after launching your challenge instance.

多元宇宙はあなたの手の中にあります! 残念なことに、多元世界の秘密が含まれるサーバーは、キーボードに数字と (ほとんどの) 記号しかない世界にあります。

解法

ssh先のサーバーでは英文字が使えないらしい。
多分英文字を使わずにコマンドを打ってディレクトリを見たらflagのテキストかなんかがあるだろうと推測。
シェル芸という世界を耳にしたことはあったものの、全然詳しくなかったので以下のサイトを参考にペイロードを組み立てた。

zenn.dev

参考サイトとは違い、今回は数字の使用が許されているので多少助かった。

まず最初にlsを打ってみる。

.>&$
"$(<$)"
__="${_##*. ??}"

これは. コマンドの結果をファイル$に格納したあと、ファイルを読み出して変数__にトリミングしながら格納している。

これで__に文字列lename [arguments]が入る

___***=${__**:0:1}${*__: -2:1}

これでlsが作れた。__の文字列からlとsを抜き出して文字を作っている。

問題サーバーで実行してみる。

SansAlpha$ $___
'$'   blargh   on-calastran.txt

怪しいtxtがあるので、txtを見たい。あとblarghってなに?catとか打ちたいけど、あまりコマンドつくるのはだるいなと思案。とりあえずファイルの種類を見たいのでls -lを実行する(llは問題サーバー上で実行できなかった。)

$___ -${__:0:1}

これでls -lが打てた。

SansAlpha$ $___ -${__:0:1}
total 8
-rw-rw-r-- 1 ctf-player ctf-player   69 Mar 19 15:37 '$'
drwxr-xr-x 1 ctf-player ctf-player   22 Mar 12 00:10  blargh
-rw-r--r-- 1 root       root       1160 Feb  7 17:25  on-calastran.txt

ディレクトリだる。cd作ることも視野にいれる。

とりあえず引数にblarghやらon-calastran.txtやらを簡単に取れるようにしたいから、lsからなんとかしたい

変数__ にcの文字がないのでcatが作れない。nlコマンドで一旦代用する。

最終的には以下のコマンドを打ちたい。lsの結果を使ってnlするコマンド。

____=($(${___}))
$_____ "${____[2]}"

このとき

$___ = ls
$____ = ls結果の受け皿
$_____ = nl

を目指す。

実行してテキストファイルの中身を見ると以下だった。フラグここにないんかい。

SansAlpha$ .>&$
SansAlpha$ "$(<$)"
bash: $'bash: .: filename argument required\n.: usage: . filename [arguments]': command not found

SansAlpha$ __="${_##*. ??}"
SansAlpha$ ___=${__:0:1}${__: -2:1}
SansAlpha$ $___
'$'   blargh   on-calastran.txt

SansAlpha$ _____=${__:2:1}${__:0:1} ____=($(${___}))
SansAlpha$ _____=${__:2:1}${__:0:1} 
SansAlpha$ ____=($(${___}))
SansAlpha$ $_____ "${____[2]}"
     1    The Calastran multiverse is a complex and interconnected web of realities, each
     2    with its own distinct characteristics and rules. At its core is the Nexus, a
     3    cosmic hub that serves as the anchor point for countless universes and
     4    dimensions. These realities are organized into Layers, with each Layer
     5    representing a unique level of existence, ranging from the fundamental building
     6    blocks of reality to the most intricate and fantastical realms. Travel between
     7    Layers is facilitated by Quantum Bridges, mysterious conduits that allow
     8    individuals to navigate the multiverse. Notably, the Calastran multiverse
     9    exhibits a dynamic nature, with the Fabric of Reality continuously shifting and
    10    evolving. Within this vast tapestry, there exist Nexus Nodes, focal points of
    11    immense energy that hold sway over the destinies of entire universes. The
    12    enigmatic Watchers, ancient beings attuned to the ebb and flow of the
    13    multiverse, observe and influence key events. While the structure of Calastran
    14    embraces diversity, it also poses challenges, as the delicate balance between
    15    the Layers requires vigilance to prevent catastrophic breaches and maintain the
    16    cosmic harmony.

ここで、もう一個のディレクトリの中身をみたいのでcdを考える。

というかtreeでもいいかも。treeでええやん。

というわけで以下の形にして実行

$___ = ls
$____ = ls結果の受け皿
$_____ = nl
$______ = tree

treeはいってないやん。ふぁっきん。

SansAlpha$ ______=${__: -3:1}${__:9:1}${__:1:1}${__:1:1}
SansAlpha$ $______ 
bash: tree: command not found

よって、使える文字を追加してシェルを作り直す。目的はcdを使うこと。(これはローカルでテストしている。後述するが問題サーバーではこの方法はできなかった。)

┌──(kali㉿kali)-[~/ctf/pico]
└─$ .1>>&$
                                                                            
┌──(kali㉿kali)-[~/ctf/pico]
└─$ cat \$
bash: .: filename argument required
.: usage: . filename [arguments]
.1: command not found

treeはいらないので以下の形にする。ついでにlsの-指定が崩れるので書き直す。

$___ = ls
$____ = ls結果の受け皿
$_____ = nl
$______ = cd

これを実現するためのコマンドを今一度改めてまとめる。これを実行すれば次に進めるはず。

**.>&$
.1>>&$
"$(<$)"
__="${_##*. ??}"
# このときの__の中身は以下
# $ echo $__          
# lename [arguments
# .1: command not found**
___***=${__**:0:1}${*__:16:1} # lsの作成
$___ -${__:0:1} # ls -lを実行してファイル確認
____=($(${___})) # ls結果を格納する配列の作成
_____=${__:2:1}${__:0:1} # nlの作成
$_____ "${____[2]}" # nlでファイルを表示
______=${__:23:1}${__:29:1} # cdの作成
$______ "${____[1]}" # cdの実行
$___ -${__:0:1} # ls -lを実行してファイル確認

$______ "${____[3]}"

ところがどっこい。問題サーバーでは>>が使えないらしい。よって別の変数を使って回避する。

**.1>&$
"$(<$)"
_______="${_##*.}"
# $ echo $_______     
# 1: command not found**

______=${**_______**:3:1}${**_______**:9:1} # cdの作成
$______ "${____[1]}" #cdの実行
$___ -${__:0:1} # ls -lを実行してファイル確認

これにともない、前段の手順を修正。

**.>&$
"$(<$)"
__="${_##*. ??}"
# このときの__の中身は以下
# $ echo $__          
# lename [arguments]**
___***=${__**:0:1}${*__:16:1} # lsの作成
$___ -${__:0:1} # ls -lを実行してファイル確認
____=($(${___})) # ls結果を格納する配列の作成
_____=${__:2:1}${__:0:1} # nlの作成
$_____ "${____[2]}" # nlでファイルを表示

現状の変数状況をまとめると以下。

$__ = **文字列「lename [arguments]」
$___ = ls
$____ = ls結果の受け皿
$_____ = nl
$______ = cd
$_______ = 文字列「1: command not found」

ディレクトリを見るとflagがあった。

SansAlpha$ $______ "${____[1]}" # cd blargh
SansAlpha$ $___ -${__:0:1} # ls -l
total 8
-rw-r--r-- 1 root root   53 Mar 12 00:10 flag.txt
-rw-r--r-- 1 root root 1090 Feb  7 17:25 on-alpha-9.txt

あとはさっき作ったlsの配列を更新してflagをみるだけ。

SansAlpha$ ____=($(${___}))
SansAlpha$ $_____ "${____[1]}"
     1    Alpha-9, a distinctive layer within the Calastran multiverse, stands as a
     2    sanctuary realm offering individuals a rare opportunity for rebirth and
     3    introspection. Positioned as a serene refuge between the higher and lower
     4    Layers, Alpha-9 serves as a cosmic haven where beings can start anew,
     5    unburdened by the complexities of their past lives. The realm is characterized
     6    by ethereal landscapes and soothing energies that facilitate healing and
     7    self-discovery. Quantum Resonance Wells, unique to Alpha-9, act as conduits for
     8    individuals to reflect on their past experiences from a safe and contemplative
     9    distance. Here, time flows differently, providing a respite for those seeking
    10    solace and renewal. Residents of Alpha-9 find themselves surrounded by an
    11    atmosphere of rejuvenation, encouraging personal growth and the exploration of
    12    untapped potential. While the layer offers a haven for introspection, it is not
    13    without its challenges, as individuals must confront their past and navigate
    14    the delicate equilibrium between redemption and self-acceptance within this
    15    tranquil cosmic retreat.

SansAlpha$ $_____ "${____[0]}"
     1    return 0 picoCTF{7h15_mu171v3r53_15_m4dn355_8b3d83ad}

ペイロードすべてをまとめると以下のようになる。

SansAlpha$ .
bash: .: filename argument required
.: usage: . filename [arguments]

SansAlpha$ .>&$
SansAlpha$ __="${_##*. ??}"
SansAlpha$ ___=${__:0:1}${__:16:1}
SansAlpha$ $___ 
bash: .: filename argument required
.: usage: . filename [arguments]

SansAlpha$ "$(<$)"
bash: $'bash: .: filename argument required\n.: usage: . filename [arguments]': command not found

SansAlpha$ ___=${__:0:1}${__:16:1}
SansAlpha$ $___ 
bash: .: filename argument required
.: usage: . filename [arguments]

SansAlpha$ $___ -${__:0:1}
bash: .: -.: invalid option
.: usage: . filename [arguments]

SansAlpha$ .>&$
SansAlpha$ "$(<$)"
bash: $'bash: .: filename argument required\n.: usage: . filename [arguments]': command not found

SansAlpha$ __="${_##*. ??}"
SansAlpha$ ___=${__:0:1}${__:16:1}
SansAlpha$ $___ -${__:0:1}
total 8
-rw-rw-r-- 1 ctf-player ctf-player   69 Mar 20 04:39 '$'
drwxr-xr-x 1 ctf-player ctf-player   22 Mar 12 00:10  blargh
-rw-r--r-- 1 root       root       1160 Feb  7 17:25  on-calastran.txt

SansAlpha$ $___ 
'$'   blargh   on-calastran.txt

SansAlpha$ ____=($(${___}))
SansAlpha$ _____=${__:2:1}${__:0:1}
SansAlpha$ .1>&$
SansAlpha$ "$(<$)"
bash: bash: .1: command not found: command not found

SansAlpha$ _______="${_##*.}"
SansAlpha$ ______=${_______:3:1}${_______:9:1}
SansAlpha$ $______ "${____[2]}"
bash: cd: on-calastran.txt: Not a directory

SansAlpha$ $______ "${____[1]}"
SansAlpha$ $___ -${__:0:1}
total 8
-rw-r--r-- 1 root root   53 Mar 12 00:10 flag.txt
-rw-r--r-- 1 root root 1090 Feb  7 17:25 on-alpha-9.txt

SansAlpha$ ____=($(${___}))
SansAlpha$ $_____ "${____[1]}"
     1    Alpha-9, a distinctive layer within the Calastran multiverse, stands as a
     2    sanctuary realm offering individuals a rare opportunity for rebirth and
     3    introspection. Positioned as a serene refuge between the higher and lower
     4    Layers, Alpha-9 serves as a cosmic haven where beings can start anew,
     5    unburdened by the complexities of their past lives. The realm is characterized
     6    by ethereal landscapes and soothing energies that facilitate healing and
     7    self-discovery. Quantum Resonance Wells, unique to Alpha-9, act as conduits for
     8    individuals to reflect on their past experiences from a safe and contemplative
     9    distance. Here, time flows differently, providing a respite for those seeking
    10    solace and renewal. Residents of Alpha-9 find themselves surrounded by an
    11    atmosphere of rejuvenation, encouraging personal growth and the exploration of
    12    untapped potential. While the layer offers a haven for introspection, it is not
    13    without its challenges, as individuals must confront their past and navigate
    14    the delicate equilibrium between redemption and self-acceptance within this
    15    tranquil cosmic retreat.

SansAlpha$ $_____ "${____[0]}"
     1    return 0 picoCTF{7h15_mu171v3r53_15_m4dn355_8b3d83ad}

SansAlpha$  Connection to mimas.picoctf.net closed by remote host.
Connection to mimas.picoctf.net closed.
                                            

おわり。

BIND DNSサーバーのconfigあれこれ

自宅DNSサーバーを建てるに当たって、configの書き方を調べた&何回かエラーを起こしたので備忘録として記します。 bindはconfigの構文を間違っていると起動しないので注意しましょう。

主要な設定ファイル

  • named.conf: BINDの主設定ファイル。BINDサーバーの基本的な動作設定、ゾーンの定義、セキュリティポリシー、その他のオプションを含む。
  • named.conf.local: カスタムのゾーン定義など、ローカルで特有の設定を含むことが推奨される追加設定ファイル。これはnamed.confからインクルードされる。
  • named.conf.options: BINDサーバーのオプション設定を含むファイル。一般的には転送設定、リスニングポート、キャッシュの設定など。
  • named.conf.default-zones: デフォルトで提供されるゾーン(例えば、ルートヒントファイル、ローカルホストゾーンなど)の定義を含むファイル。これもnamed.confからインクルードされることが多い。

設定ファイルの構成要素

  • options { ... }: サーバー全体のオプションを設定します。ここにはディレクトリパス、転送設定、レートリミット、キャッシングポリシーなどが含まれます。
  • acl "name" { ... }; アクセスコントロールリスト(ACL)を定義します。特定のネットワークやホストへのアクセス許可や拒否を指定できます。
  • zone "name" { ... }; ゾーンを定義します。ゾーンはドメイン名に関連する情報(例えば、Aレコード、MXレコード)を含むDNSの単位です。ゾーンはプライマリ(マスター)またはセカンダリ(スレーブ)に設定できます。
  • key "name" { ... }; TSIG(Transaction SIGnature)キーまたはDNSSEC(DNS Security Extensions)のキー設定を含みます。これらはセキュリティ強化のために使用されます。
  • logging { ... }; ログ出力の設定を含みます。異なるカテゴリのログを異なるチャネルにルーティングするために使用されます。

ゾーンファイル

  • ゾーン定義の一部として、ゾーンデータファイルのパスが指定されます。これらのファイルには、ドメインに関連するレコード(A、MX、CNAME、NSレコードなど)が含まれます。

カテゴリの役割と使用方法

BIND DNSサーバーにおけるcategoryは、ログの種類やソースを分類するための概念です。ログをカテゴリごとに分けて管理することで、情報を適切にフィルタリングし、重要なイベントを見逃さないようにすることができます。

定義されているカテゴリ一覧

  • default: 特定のカテゴリに分類されない全てのメッセージ。
  • client: クライアントからのリクエストに関連するメッセージ。
  • network: ネットワーク関連のイベント。
  • queries: 受信したクエリに関するメッセージ。
  • lame-servers: Lame delegation(応答不能な名前サーバーからの応答)に関する警告。
  • config: 設定ファイルの読み込みや解析に関するメッセージ。
  • security: セキュリティ関連のイベントや警告。
  • resolver: 名前解決プロセスに関連するメッセージ。
  • xfer-in: ゾーン転送(受信)に関するメッセージ。
  • xfer-out: ゾーン転送(送信)に関するメッセージ。
  • notify: NOTIFYメッセージ処理に関するメッセージ。
  • update: ダイナミックアップデートに関するメッセージ。
  • dispatch: メッセージディスパッチシステムに関するメッセージ。
  • dnssec: DNSSEC(DNSセキュリティ拡張)操作に関するメッセージ。
  • delegation-only: "delegation-only" ゾーンに関する警告。
  • edns-disabled: EDNS(拡張DNS)が無効にされた際のメッセージ。
  • cname: CNAME関連の処理に関するメッセージ。
  • rate-limit: レートリミット機能に関するメッセージ。
  • rpz: 応答ポリシーゾーン(Response Policy Zone)に関するメッセージ。

カテゴリの使用方法

カテゴリはnamed.confloggingセクションで定義され、各カテゴリに対してどのログチャネルを使用するかを指定します。

logging {
    channel my_log_channel {
        file "path/to/logfile.log";
        severity info;
        print-time yes;
    };
    category queries {
        my_log_channel;
    };
};

チャネルの役割と定義方法

channelは、ログの出力方法や出力先を定義するための構成要素です。ログチャネルを使用することで、ログデータがどのように処理され、どこに記録されるかを細かく制御できます。

チャネルに指定できる項目

  • file: ログを記録するファイルのパス。
  • severity: 記録するログの重要度レベル。
  • print-time: ログエントリにタイムスタンプを含めるかどうか。
  • print-severity: ログエントリに重要度レベルを含めるかどうか。
  • print-category: ログエントリにカテゴリ情報を含めるかどうか。
  • versions: ログファイルのローテーションにおいて保持するファイルの数。
  • size: ログファイルがローテートされる前の最大サイズ。
  • syslog: システムログとして出力するかどうか。
  • stdout: 標準出力にログを出力するかどうか。
  • stderr: 標準エラーにログを出力するかどうか。

チャネルの定義方法

ログチャネルはnamed.confloggingセクションで定義します。

logging {
    channel example_channel {
        file "/var/log/named/example.log" versions 3 size 5m;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
    };
};

Severityの役割と使用方法

channel内で定義できるseverityは、ログエントリの重要度を指定するパラメータです。BINDで指定できるレベルは以下の通りです。
- critical: 致命的な問題が発生したことを示す。 - error: エラーが発生したが、サーバーは引き続き動作可能な状態。 - warning: 注意が必要な問題が発生した。 - notice: 通常の動作ですが、注目に値する事象が発生した。 - info: 情報提供のみ。 - debug: デバッグ情報。開発者やトラブルシューティング用。 - dynamic: ランタイムにおいて動的にログレベルを変更することができる。このレベルは、状況に応じてログの詳細度を調整する。

ログチャネルで指定されたレベル以上のメッセージのみが記録されます。

注意点

  • ログファイルは手動で作成し、BINDが実行されているユーザーがファイルに書き込めるように適切なパーミッションを設定しておく必要があります。
  • configファイルの構文が間違っているとbindの起動に失敗します。このとき、具体的にどこが間違っているかかがログに出ないのでトラブルシューティングに苦労しました。
  • configファイルの構文のチェックはnamed-checkconfコマンドや、named-checkzone [ゾーン名] /etc/bind/db.zone.pathコマンドで可能です。

結論

bindむずい。

CND(Certified Network Defender)に合格したので記録する

はじめに

CNDPassed

CND資格とは

CND(Certified Network Defender)資格は、ネットワークセキュリティの専門家としてのスキルと知識を証明する国際的な認証です。
CND資格はあまり取得している人が多い印象はないものの、特にセキュリティ業界での要件として急速に重要視されるようになっています。
実際に、最近はIPAの入札要項にも盛り込まれるようになり、その需要は確実に増加していると感じられます。
この資格を取得することで、Network防衛における網羅的な知識の整理が期待されるだけでなく、業界全体での信頼性と専門性を高める手段でもあります。

自身のバックグラウンド

自分はセキュリティエンジニアとして数年業務に従事しています。
経験のある業務種別は以下です。

  • EDR特化のインシデントレスポンス
  • SOCのアナリスト
  • EDR製品の設計構築
  • システムに対するセキュリティコンサル

資格取得への動機

大本の受験動機としては、会社がお金を払って研修に行かせてくれたからです。
とはいいつつ、EC-Council系の資格は最近話題になり始めているため、興味があったというのも大きいです。
ただ、試験の範囲があまりにも広かったため、しばらくは勉強する気力が湧きませんでした。
その結果研修から半年以上経過してからの受験となります。

学習計画について

使用した参考書、オンラインリソースなど

使用したリソースは主に以下です。

  • 公式の教科書(800ページ弱あります。。。)
  • Udemyの模擬問題
  • examTopicsの模擬問題

やったこと

CND資格の勉強を始めるにあたり、まずはEC-Council公式の教科書をベースにしました。
この教科書の内容がそのまま試験範囲となるので、全体感がつかみやすくなって効果的だったと思います。
さらに、模擬問題を使用し、公式教科書の根拠となる部分に手書きで追記を入れていました。
合計500問分くらい上記の作業を行いましたが、少し過剰だったような気もします。
しかし、前述の通り本試験は範囲が広く、一部のセクションは自分があまり触れてこなかったジャンルでもあったので、弱いセクションの補強という形では一定効果があったのではないかと感じています。
(特にRAID構成やUPSの構成、無線通信の規格などは、この試験対策をしないとしばらく通ることのなかった分野だと思います。)

学習期間

実際の勉強期間は3週間弱でした。

試験結果

試験結果は79/100点での合格となりました。
試験は日本語で受けたのですが、正直和訳が怪しいところが多々ありました。ComptiaやAWSの試験とは異なり、原文を表示する機能がないので選択肢の意図が汲み取れない問題も数点ありました。
かといって英語で受けても自分の英語力だと問題文に不安が出てくるので悩みどころです。

認定資格の有効化

試験が終わって数日経過すると、ASPENからメールが届きます。ASPENとは、EC-Councilが所轄する資格認定のプラットフォームです。登録料として80ドル要求されました。
また、EC-Councilの資格はECEというクレジットを3年以内に120ポイント貯めないと更新できない仕組みになっています。
RISSやCISSPと同じような仕組みと思って置けば問題ないです。
どうでもいいですけど、ここらへんの申請周り、もっと手軽にならないですかね。。。。

感想と今後の展望

CNDの資格は、深い知識を確認するようなものではなく、広く体系だった知識を整理するツールとして非常に効果的でした。
(その分、知っているカテゴリの研修中は集中力を維持するのが大変でしたが。。。)
試験に受かった事自体より、鈍器のような教科書を使って自分の知識を整理していた時間がとても有意義に感じました。
仕事で自社防衛に関わるのならチャレンジして損しない資格だと思います。
次は、CEHやComptia CASP+などの資格に挑戦してみたいと思います。

以上。

AWS WAFとAthenaを使って、リアルタイム攻撃ログ観測のためのやられサイトを作ってみた。

はじめに

直近でAWSのSpeciality資格を取得し、AWSを触ってみたくなったので、WEBページに対する攻撃ログを収集するやられサイトを簡単に構築してみることにしました。
筆者は業務でセキュリティに関わっており、世の中に飛び交っている攻撃ログを観測しておきたいと常々感じていたので、手元環境で持っておこうと思った次第です。
これにより、Log4jのときのような脆弱性が出てきたときに、生の攻撃ログを観測しながら対策に繋げたり、定常的に行われている攻撃の種類を推測することを目的としています。
(あと、最近業務周りでAWS WAFの話題が出ることが多かったので実際に触ってみたかったという理由もあります。)  

使用したリソースの説明

今回のやられサイトの構築には、AWSの以下の4つの主要リソースを活用しました。それぞれについて簡単に説明します。

  • S3
    Amazon Simple Storage Service(S3)は、ウェブからのアクセスを想定したオブジェクトストレージサービスです。おとりサイトは簡単な静的サイトなので、HTMLファイルのホスティングに使用しました。 また、アクセスログもここに保存し、後述のAthenaでクエリを発行できるようにしておきます。
  • CloudFront
    Amazon CloudFrontは、Amazonコンテンツ配信ネットワークCDN)サービスです。CloudFrontはAWS WAFのデプロイ先になるため、WAFの前提条件として利用しています。
  • AWS WAF
    AWS WAF(Web Application Firewall)は、サイトを不正アクセスから守るためのウェブアプリケーションファイアウォールです。
    特定のトラフィックパターンをブロックしたり、特定のIPアドレスからのリクエストを制御したりします。
    今回のケースでは、AWS WAFはやられサイトに対する不正なアクセスや攻撃の詳細を収集するために使用しています。
    また、AWS WAF自体の挙動を実機で確認することも目的の一つです。
  • Athena
    Amazon Athenaは、クエリサービスで、AWS S3に保存されたデータに対してSQLクエリを実行できます。
    サーバーの設定や管理は不要で、手元にある攻撃ログやIoCデータに対して直接クエリを投げることができます。
    これにより、収集したIoCデータの分析や検索が迅速かつ容易に行えます。

やられサイトの構成

今回構築するやられサイトのアーキテクチャ図は以下の通りです。
awsアーキテクチャ図 また、今回このサイトはCDNにCloudFrontにデプロイされているので、cloudfront.netドメインとしたURLを持っています。(単一のグローバルIPではありません。)
攻撃者がこのサイトに気づいてくれるように、Pastebinを使用しました。

Pastebinとは

Pastebinとは、ユーザーがテキストデータを投稿し、それを公開できるウェブサービスの一つです。
正規の利活用としては主にプログラマーコードスニペットを共有するために使用されますが、その手軽さから様々な情報の共有に広く利用されています。
また、悪意のある攻撃者がファイルレスマルウェアなどのC2サーバーとして利用していることでも非常に有名です。

この特性を利用し、やられサイトのURLをPastebinに投稿し、攻撃者がそのURLを見つけてアクセスしてくることを期待しています。
これは一種のハニーポット戦略で、攻撃者を誘引し、その行動を観察することを目的としています。

ロギングの設定

今回はAWS WAFのログを主に収集対象にします。ロギングの対象自体はAllow/Denyに関わらず行い、分析の際に任意でフィルタをかけることにしました。
レピュテーションサービスのクローラなどの情報も取れたら面白いかなと思ったからです。 使用するWebACLのルールは以下とします。

  • AWS-AWSManagedRulesAmazonIpReputationList  
  • AWS-AWSManagedRulesCommonRuleSet
  • AWS-AWSManagedRulesKnownBadInputsRuleSet
  • AWS-AWSManagedRulesBotControlRuleSet

今回はログの保存先をS3にしているので、CloudWatch Log Insightsを使用できませんでした。こちらについてはまたどこかで試してみたいと思います。

ログの分析について

今回の第一目的は攻撃通信のログを観測することなので、あまり条件を絞りきらずにログを整形するだけのクエリを用意しました。
特徴のある攻撃通信が流行ったときは適宜絞り込みをかけていくことを想定しています。
ただ、自分がAthena/SQLをあまり触ったことがないので、ちょっと概念の把握に手間取りました。以下に備忘録として残しておきます。

DB、テーブルの作成

AthenaでS3に保存されているデータを分析するためには、Athena上にRDSとして持ってくる必要があります。
そのために、以下の手順でクエリを発行しました。

  • DBの作成
CREATE DATABASE test;
  • テーブルの作成
CREATE EXTERNAL TABLE `waflogs`(
  `timestamp` bigint,
  `formatversion` int,
  `webaclid` string,
  `terminatingruleid` string,
  `terminatingruletype` string,
  `action` string,
  `terminatingRuleMatchDetails` array < struct <
    conditionType: string,
    location: string,
    matchedData: array < string >
    > >,
  `httpsourcename` string,
  `httpsourceid` string,
  `ruleGroupList` array < struct <
                    ruleGroupId: string,
                    terminatingRule: struct < ruleId: string, action: string >,
                    nonTerminatingMatchingRules: array < struct < action: string, ruleId: string > >,
                    excludedRules: array < struct < exclusionType: string, ruleId: string > 
   > >,
  `ratebasedrulelist` array<
                      struct<
                        ratebasedruleid:string,
                        limitkey:string,
                        maxrateallowed:int
                            >
                           >,
  `nonterminatingmatchingrules` array<
                                struct<
                                  ruleid:string,
                                  action:string
                                      >
                                     >,
  `httprequest` struct<
                      clientip:string,
                      country:string,
                      headers:array<
                              struct<
                                name:string,
                                value:string
                                    >
                                   >,
                      uri:string,
                      args:string,
                      httpversion:string,
                      httpmethod:string,
                      requestid:string
                      > 
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://<バケットID>/AWSLogs/'

サーチクエリの発行

Athenaには、任意のクエリを保存してあとからコールできる機能がありました。(便利!)
ただし、一度保存したクエリは編集できず、一度消して再度登録する必要があるみたいです。(不便!)
普段みるクエリと、何かあったとき用にWHERE句で条件指定できる準備だけ整えているクエリを用意しておきました。

  • 普段みるクエリ
SELECT from_unixtime(timestamp/1000, 'Asia/Tokyo') AS JST,
       httpsourcename,
       action,
       httpsourceid,
       httprequest.clientip,
       httprequest.country,
       httprequest.uri,
       httprequest.args,
       httprequest.httpmethod,
       httprequest.headers

FROM
       "waflogs"
ORDER by JST desc
;
  • 特定の痕跡を探すクエリ
SELECT from_unixtime(timestamp/1000, 'Asia/Tokyo') AS JST,
       httpsourcename,
       httpsourceid,
       httprequest.clientip,
       httprequest.country,
       httprequest.uri,
       httprequest.args,
       httprequest.httpmethod,
       httprequest.headers,
       header,
       header.value
FROM
       "waflogs",
       UNNEST(httprequest.headers) t(header)
WHERE
       header.value like '%<hoge>%'
;

また、Athenaでのクエリは以下のサイトを参考にしました。
https://dev.classmethod.jp/articles/waf-query-pattern-in-athena/
https://dev.classmethod.jp/articles/analyzing-waflogs-with-athena/
https://runble1.com/aws-waf-athena-array-struct-json/#toc14

まとめと今後の展望

以上が今回のやられサイト構築の概要となります。
AWSを使用することで短期間でやられサイトを構築し、実際の攻撃ログを収集することができました。
今後の展望としては、以下の実装を考えています。

  • アーキテクチャを変更して、グローバルIPを持たせてIPでのクロールの対象に入れる。
  • Athenaでログ状況のサマリを出力し、Lamda経由でDiscordBOTと連携する

以上。

AWS Certified Security - Specialty(SCS-C01)に実質一週間で合格した話

はじめに

今回、実質一週間の勉強時間でAWS Certified Security - Specialty(SCS-C01)に合格するという(自分の中では)快挙を成し遂げたので、合格体験記という形で残したいと思います。
なぜこんな無茶なスケジュールで挑戦したかというと、SCS-C01が2023年の7月に終了してSCS-C02に試験問題が変わるため、過去問が豊富なうちに取得してしまおうと思い立ったからです。
急にやる気が舞い降りてきたのが6月末。そこから(半額バウチャー目当てで)AWS認定クラウドラクティショナー(CLF)を受験するのに一週間。SCSの勉強に一週間。AWS周りの勉強期間という言う意味だと合計2週間でAWS Certified Security - Specialty(SCS-C01)に合格できました。

前提知識

  • AWSはほぼ触ったことがない。数年前に一度簡単なWebアプリケーションを作って遊んでいただけ。
  • Azureはちょっとだけ触った経験あり。ただ、オンプレのクラウド移行のアーキテクチャを検討したことがある程度。
  • セキュリティを生業にしている。インシデントレスポンスやハンドリングなどは慣れている(つもり)

AWS SCSとは何か?

AWS SCS、すなわちAWS Certified Security - Specialty(AWS認定 セキュリティ - スペシャリティ)は、Amazon Web Services (AWS)のセキュリティ技術とプラクティスに関する深い知識を持つプロフェッショナルを認定する試験です。

AWS SCSの概要とその重要性:

AWS SCSは、AWSでのデータ保護とセキュリティの実装に関して、深い理解とスキルを持つことを証明する認定試験です。
これは、AWSを使用する企業や組織でのセキュリティ関連の役割に従事する人々、特にセキュリティエンジニア、セキュリティアーキテクト、情報セキュリティ専門家などにとって重要です。
この認定を持つことで、AWS環境でのデータ保護とセキュリティプロトコルの専門的な知識とスキルを持っていることを示すことができます。

AWS SCSがカバーする主要なトピックと要件:

AWS SCSの試験は、以下の5つのドメインに焦点を当てています:

  • AWSワークロードのインシデントレスポンス
    AWS環境でのセキュリティインシデントに対応するための能力。  
  • AWSワークロードの脅威と脅威の軽減策
    AWSのワークロードに対する潜在的な脅威を理解し、それらを軽減するための戦略と手段。
  • AWSのセキュリティ運用とリスク管理
    AWSにおけるセキュリティプロトコルの運用と、リスクを評価および管理するための技術と戦略。
  • セキュアなアーキテクチャと自動化、ロギング、モニタリング
    セキュリティを考慮に入れたAWSアーキテクチャの設計と、自動化、ロギング、モニタリングを利用したセキュリティの維持。
  • AWSのデータ保護とデータプライバシー
    AWSのデータ保護メカニズムとプライバシー関連の概念に関する理解。

試験を受けるには、AWS Certified Cloud PractitionerまたはAssociate-level認定を既に取得していること、および最低2年以上のAWSのハンズオンセキュリティ経験が推奨されています。が、前述の通り筆者は2年も触ってない状態で受験しました。CLFについては一週間前に取得したから許してほしい。

学習計画

勉強に費やせる時間が実質一週間しかなかったので、毎朝1時間毎晩2-3時間を勉強に費やしました。
学習リソースとしては、UdemyのAWS SCS対策講座を選びました。
この講座は試験のすべてのドメインを網羅しているため、体系的な知識を得るための主要なリソースとしました。
また、この講座はlab問題も含まれており、labに沿う形で実機を触って確認できたのも良いポイントでした。
文章だけの詰め込みと比較して、実機の画面を触って学習した方がイメージが付きやすかったです。
試験対策で触るくらいなら、AWSの無料枠に収まると思うので金銭面でも気にすることはないでしょう。

結果と総評

問題文が長文なので、頭の中でアーキテクチャ図がイメージしきれない時はホワイトボードで書き出していました。
Speciality試験の何が一番やっかいかというと、この問題文の長さだった気がします。勉強しているときから体力を使いましたが、試験中はなおさら疲れました。
点数は、合格点が750点に対して、結果は840での余裕を持っての合格となりました。
これは正直、AWSの知識ではなく普段使っているセキュリティ分野の知識で選択肢を狭めることができた結果だと思います。
最後に、試験対策を経てよく聞かれるなーと感じたトピックを並べて合格体験記を締めたいと思います。  

  • ロールの信頼関係
  • CMKの管理方法。ローテーション期間などに対するベストプラクティス。
  • Amazon Configの対応範囲
  • Cloud WatchやCloud Trailを使ったログ追跡の実装

Intel NUC12WSHi50Z RNUC12WSHI50Z00 にESXiをインストールする

NUCの物理構成

追加で購入したのは以下。

BIOSのアップデート

工場出荷時のままだとBIOSが最新ではないので、諸々の操作を行う前にNUCのBIOSを最新版に更新しておく。

ESXiインストールイメージの作成

PowerCLIのインストール

Install-Module -Name VMware.PowerCLI -Scope CurrentUser

途中で聞かれる質問にはぜんぶy。
ここで、以下のようなエラーが発生した。

Import-Module : モジュール ディレクトリに有効なモジュール ファイルが見つからなかったため、指定されたモジュール 'VMware.
PowerCLI' は読み込まれませんでした。
発生場所 行:1 文字:1
+ Import-Module VMware.PowerCLI
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ResourceUnavailable: (VMware.PowerCLI:String) [Import-Module], FileNotFoundException
    + FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

PackageManagement\Install-Package : 以下のコマンドは、このシステムで既に使用可能になっています: 'Export-VM,Get-VM,Get-V
MHost,Move-VM,New-VM,Remove-VM,Restart-VM,Set-VM,Set-VMHost,Start-VM,Stop-VM,Suspend-VM'。このモジュール 'VMware.VimAut
omation.Core' では既存のコマンドが上書きされる可能性があります。このモジュール 'VMware.VimAutomation.Core' をインストー
ルする場合は、-AllowClobber パラメーターを使用してください。
発生場所 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1809 文字:21
+ ...          $null = PackageManagement\Install-Package @PSBoundParameters
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package]、E
    xception
    + FullyQualifiedErrorId : CommandAlreadyAvailable,Validate-ModuleCommandAlreadyAvailable,Microsoft.PowerShell.Pack
   ageManagement.Cmdlets.InstallPackage

エラーを読む限り、すでに一部のコマンドがインポートされているから上書きを許可しないといけないらしい。
おそらくHyper-Vをコマンドレッドから色々弄ったときに入ったコマンドだろう。
指示通り-AllowClobberオプションを指定して再度コマンドを実行したら無事インストールできた。

次に、Vmwareのパートナープログラムみたいな奴に加入する設定を投入する。 これはやってもやらなくてもいい。が、途中で色々聞かれるのがめんどくさいので加入しておく。

Set-PowerCLIConfiguration -Scope User -ParticipateInCEIP $true

最後にVMwareのイメージビルダーをインポートする。

Import-Module VMware.ImageBuilder

イメージファイルの作成

以下リソースをDLしてくる

  • VMware-ESXi-7.0U3g-20328353-depot.zip
    • イメージファイルのオフラインバンドル版。公式サイトよりDL。
  • Net-Community-Driver_1.2.7.0-1vmw.700.1.0.15843807_19480755.zip
    • コニュニティドライバ。Intel NUCは公式のイメージファイルだけではNICを認識しないため。
  • nvme-community-driver_1.0.1.0-3vmw.700.1.0.15843807-component-18902434.zip
    • コニュニティドライバ。おなじくNVMeを認識しない可能性があると聞いたので

以下手順で、各ドライバを内包したISOイメージを作成する。

PS E:\VM\ESXi> Add-EsxSoftwareDepot -DepotUrl .\VMware-ESXi-7.0U3g-20328353-depot.zip

PS E:\VM\ESXi> Get-EsxImageProfile

Name                           Vendor          Last Modified   Acceptance Level
----                           ------          -------------   ----------------
ESXi-7.0U3g-20328353-no-tools  VMware, Inc.    2022/08/23 3... PartnerSupported
ESXi-7.0U3g-20328353-standard  VMware, Inc.    2022/09/01 0... PartnerSupported

PS E:\VM\ESXi> $ip = (Get-EsxImageProfile)[1]
PS E:\VM\ESXi> Add-EsxSoftwareDepot -DepotUrl .\nvme-community-driver_1.0.1.0-3vmw.700.1.0.15843807-component-18902434.zip
PS E:\VM\ESXi> Add-EsxSoftwareDepot -DepotUrl .\Net-Community-Driver_1.2.7.0-1vmw.700.1.0.15843807_19480755.zip
PS E:\VM\ESXi> $ip2 = New-EsxImageProfile -CloneProfile $ip -Name VMware-ESXi-7.0U3g -Vendor kwmtlab -AcceptanceLevel CommunitySupported
PS E:\VM\ESXi> Add-EsxSoftwarePackage -ImageProfile $ip2 -SoftwarePackage nvme-community,net-community

PS E:\VM\ESXi> Export-EsxImageProfile -ImageProfile $ip2 -FilePath .\VMware-ESXi-7.0U3g.zip -ExportToBundle
PS E:\VM\ESXi> Export-EsxImageProfile -ImageProfile $ip2 -FilePath .\VMware-ESXi-7.0U3g.iso -ExportToIso

ESXiをインストールするための準備はこれで終了。 ISOファイルをUSBに書き込んでNUCに挿した状態で起動する。

インストール

インストールを進めていると、途中でパープルスクリーンが出て作業が中断されてしまった。
内容を読んでいると、CPUのコアがどうのこうので怒られている様子。
今回購入したNUCはIntel第12世代のCPUを使用しているので、AlderLake特有のアーキテクチャによるものだと予想した。
以下サイトに同様の事象が存在したので、参考にして回避コマンドを追加してみる。 https://williamlam.com/2022/02/esxi-on-intel-nuc-12-extreme-dragon-canyon.html

cpuUniformityHardCheckPanic=FALSE

このコマンドによって、パープルスクリーンを突破してインストールが正常に完了した。

余談

ESXiがインストールされても、再起動を行うとまたパープルスクリーンが出現する。 永続的に回避するためには、以下コマンドを実行することが必要だった。

esxcli system settings kernel set -s cpuUniformityHardCheckPanic -v FALSE

古いPCをWindows11にアップデートする

Windows11に上げるための要件

  1. TPM2.0以上
  2. セキュアブートが有効であること

古いマザーボードでは、上記二機能が無効化されていることがあるのでUEFIメニューから有効化してあげる必要がある。

(そもそも当該機能が搭載されていないマザーボードの場合はどうしようもないので、諦めて買い換えるべし)


TPM

TPM(Trusted Platform Module)の有効化をUEFIメニューから有効化する。方法はマザーボードのメーカによって異なるので各メーカの公式サイトを参照するべし。

ついでに、マザーボードインテル系の場合、TPMではなくPPTという機能になっている場合がある。
PPTはファームウェア型のTPMであるので、この機能で代替できる。ただし、PPTを有効化すると次回起動時にWindowsのブートセクタに影響がでてブルースクリーンになることがある。
ファイルシステム全体が壊れているわけではないので、回復環境を経由すれば復旧するみたい。

セキュアブート

曲者。

UEFIメニューからセキュアブートを有効にする必要がある。
初期状態だとシステムモードという状態になっていてこの機能を有効化できないので、UEFIメニュー上でKeyを発行するとユーザモードに遷移してから設定を行う。

注意点

セキュアブートは「CSM」機能と競合を起こすため、セキュアブートを有効化したい場合CSMを無効化する必要がある。

CSMとは、レガシーモードのファイルシステムUEFI上で動かす為に必要な変換機能のこと。

ストレージのパーティションシステムにはMBR方式とGPT方式が存在し、現在はGPT方式が主流である。そしてMBR方式を採用しているファイルシステムをレガシーモードという(らしい)。

MBR方式はBIOS時代のパーティション方式であり、これはそのままではUEFI上では起動できない。

つまり、CSMが有効にないる状態から無効化すると、ファイルシステムを読み込めないことによりWindowsが起動すらしなくなる。

これの回避の為には、パーティションをGPT方式に変換してからCSMを無効化する必要がある。