「はじめて学ぶバイナリ解析 不正なコードからコンピュータを守るサイバーセキュリティ技術」 を読んだ

この本では、基本的なコンピュータアーキテクチャの話から始まって、アセンブリを読むための基礎知識、アセンブリの書き方を学習し、最終的には古典的なバッファオーバーフロー攻撃をお試しできるような構成になっていて非常にわかりやすかったです。 一年くらい前に、策謀本を読み始めてよく分からなくて積んでしまったんですが改めて理解したくてその基礎づくりとして読みました。

www.amazon.co.jp

特に良かったのは、4章から6章でメモリとスタック領域、レジスタアセンブリ基礎を手を動かしながら学習できるのでこの辺の座学っぽい所で眠くなってしまう自分にとっては良かったです。 それと、最終章の発展的なバッファオーバーフローの手法は単純に読んでいてワクワクしました。この本ではあえて攻撃を成立させるためにセキュリティ機能をオフにして実行したりしますがオンの場合でもそれを回避して攻撃を成立させるような手法が現在でも研究されていて、今後はそういう所にアプローチしていけると面白いなと思えました。

「Auth0」で作る!認証付きシングルページアプリケーションを読んだ

この本では、SPA構成のアプリケーションにおいてAuth0から取得したTokenでバックエンドサーバーの保護されたAPIを叩いてみるみたいな全体の流れをハンズオン形式で体験できてとても良かった。 夢中になってやったので仕事終わりの時間を使って二日くらいで読み終えたのでAuth0でPoCしてるみたいな人にはおすすめです。

www.amazon.co.jp

特に良かったのは、前半で改めて認証やJWTについて説明してくれているところが一つ

ハンズオンは言うまでもなく良い体験ですが、最後の方でAuth0で実行できるサーバーレスコードのサンプルが勉強になりました。Auth0では、ログイン時やユーザー登録時にフックしてカスタムコードを書けるので、例えば「ユーザー登録時に自前で立てているDBへも情報を同期する」ような事が可能です。本で紹介されているのはAuth0のRulesという機能でしたが、現在(2021-10-28時点)では、Auth0 Actionsという新しい機能もあって似たような事が実現できるので今後はおそらくAuth0 Actionsを使っていく事になりそうという事も知れて良かったです。

色々学べたのでまた違った構成で認証周りの実装を書いてみたいと思います。
個人的には、このスピード感で難しい認証周りを実装できるのはAuth0すごいなあと感じていて、もしユーザー数が数年は1000人いくかいかないだろうなみたいな社内アプリや個人開発のアプリを作るかとなったらもう個人的にはAuth0一択だなと思いました。

Autifyで作ったテストプランをデプロイ時に自動でスケジューリングさせたい

Autifyめちゃくちゃ便利なので、作成したテストプランをCI/CDに組み込んでデプロイのタイミングで自動でスケジュールして欲しくて、調べてみると簡単に出来たのでメモ。 アカウントページでアクセストークンを払い出せるので、作成し、スケジュールさせたいテストプランのIDを控えたらあとはcurlで叩くだけだった

curl -XPOST -H "Authorization: Bearer ${AUTIFY_PERSONAL_ACCESS_TOKEN}" https://app.autify.com/api/v1/schedules/${AUTIFY_TEST_PLAN_ID}

後はCDのスクリプトに組み込んであげればやりたいことはできそうだった

テストの結果取得もAPIでやろうと思えばやれると思いますが、テストが終わるまで定期的にcurlで見に行かないといけないので、そうするよりSlack連携させて、テストの完了通知を受け取るようにしたほうが容易でした。

APIドキュメント slack連携

職歴書管理はじめました

リモートワークも一年が過ぎて、日々の過ごし方が以前とガラッと変わったのもあったり最近モチベーションも低下してきたので副業でもやってみて、普段とは違う緊張感も味わうかと思って副業を探していました。 大体の企業さんが、「職歴書ください!」っていうところが多いのですが職歴書なんてもう数年書いてないし内容も古いしでこの時点で面倒になってしまうんですよね。 職歴書のフォーマットも色々ありすぎてどれがいいかとかテンプレダウンロードしてきてもなんか表示崩れとかしちゃったりでなんとかならんかな〜と思ってた所、プログラマーの仲間にマークダウンで書いてgithubリポジトリ置いてそこで管理しているという人を見つけました。

ということで、マークダウンで書いてgithubで管理してPDF化もできちゃえば楽だなと思ってPythonで実装されたmd2pdfを使ってPDF化できるように職歴書のテンプレを公開しました。

github.com

環境依存なく誰の環境でも動くようにPDF化の部分をDockerコンテナ内で処理させるようにしてて、レポジトリをcloneなりforkなりしてもらってdocs/README.mdに自身の職歴書を書いてもらいmake build_resume を実行してもらえればPDFファイルが出力されるようになってます。

docs/main.cssでスタイリングも可能なので、自身のキャラクターにあった感じにスタイリングしてもらえるとPDFにした時に見た目も綺麗だと思います。

テンプレから作られるPDFはこんな感じ。 f:id:keisuke_t:20210315021807p:plain

何でも管理しておくとフットワーク軽く生きていけると最近しみじみ感じたので誰かの役にたったら嬉しいです。 良い日を〜

夏休みにHackTheBoxを延々とやってた

世間は大変だし、どうせ家にいるなら何か興味のあることを勉強しようと思ってHackTheBoxのRetired Machineを延々とやりました。

www.hackthebox.eu

サーバーサイドのプログラムを書いて生活をしてますが、セキュリティに興味があって細々と勉強していました。そうすると、必然的に手を動かして攻撃にチャレンジしてみたいなと思ってくるのですが、当然そこら辺のサイトに対して練習するなんてことはできません(ポートスキャンですら危ないですね) ということで、HackTheBoxのVIP会員になってみて夏休みに12台のマシーンのroot権限まで取っていきました

チャレンジしたものは、Retired Machineに分類されているので、多くの人が攻略のwriteupを書いてくれていて、詰まったマシーンはwriteupを見て勉強させてもらいました。 今のところは難易度Mediumに満たないくらいの簡単なものをこなしてるだけなので、基礎的なCSの知識、ググる力、コード読んで何してるかさえある程度分かればそこまで困難ではないなという感じでした。 まだまだ難易度がこれから上がっていくのでツールに頼った知識だけでなく、自らペイロードを書ける力や攻撃の想像性が必要とされるんだろうなという感じで当分はHackTheBoxをやることと、Active Machineにもチャレンジしてみてランクもあげてみたいなと思いました。次はランクあがったら記事書こうかな。。。

やる上で意識してることは、終わったら次みたいにならないように例えば、何らかのWebサービスが80番に立っててsearchsploitで脆弱性探したらLFIやRCEがあって突いてみるとなんか成功したみたいな場合でも他の脆弱性のレポートは読んでみたり実行してみたりすると色々勉強になるので意識して取り組んでいます。この類のマシンだとXSSとかあってもpwnには使えないから触れないみたいな事はよくあるので、あえて触れてみたりする事で学習の幅が広がっていいなと思いました。せっかく攻撃し放題(?)なので、色々試してみるといいと思います。 例えば、Beepマシーンは様々なサービスがたっているかつ、色んな攻撃経路があったのでeasyの中でも非常に勉強になりました。

HackTheBoxやるにあたって参考にしたもの

最初にこれ読みました。HTBだとIPアドレスだけ表示されていて、あとはお好きに。。。というスタイルなので少なくともアプローチの仕方が分からないと手がでません。この本ではペネトレーションテストにおけるアプローチの仕方(Recon, Exploitation, Post Exploitation)が網羅されているのと、それぞれのフェーズでのツールが紹介されてるので最初に読む一冊としておすすめです。

www.amazon.co.jp

IppSecさんはHTBのRetired Machineのwriteupをあげてくださっています。Metasploitだけでなくマニュアルにexploitationする手法や色んな攻撃経路にチャレンジしてくれるので、非常に参考になります。

www.youtube.com

日本語記事が読みたい時は、Qiitaのタグを頼りにwriteupを探りました

qiita.com

Torからのアクセスをnginxでブロックする

はじめに

Torは、プライバシー保護という観点で自身は決して悪いものだとは思っていません。サービスを運用する上で個人の特定ができない事で起こりうる問題の予防のためにこのような対応の選択をせざるを得ないというだけで、Torそのものを否定したいわけではない事だけ始めに書いておきます。

本題

Torは、ざっくり言うと複数のサーバーを経由することで秘匿性を実現しています。一番最後に経由したノードからインターネットに接続し、接続先へ通信します。一番最後に経由したノードはTor出口ノードと呼ばれています。接続先のサーバーのログに残るIPアドレスはこの出口ノードのIPアドレスであるので、現在出口ノードになっているサーバーのIPアドレスさえ分かればそれらをnginxでブロックするのは容易です。

Torの出口ノードはtorprojectで管理されているので、このエンドポイントをcurlで叩いてIPを取得、nginxのdenyディレクティブにIPを追加するようなファイルを動的に生成するスクリプトをcronで定期的に実行させれば、出口ノードに変動があったとしてもなるべくリアルタイムに更新させることができます。

以下で、動的にIPを取得し、block_tor_ip.confに追加、nginxをリロードさせます。

#!/bin/bash

result=`curl -s https://check.torproject.org/torbulkexitlist?ip=1.1.1.1`

if [ $? -ne 0 ]; then
    echo "Cannot get address."
    exit 1
fi

echo "${result}" | sed '/^#/ !s/^/deny  /g; s/$/;/g' >> block_tor_ip.conf

nginx -t
nginx -s reload

ファイルは以下のように生成され、/etc/nginx/conf.d/*.confはデフォルトでincludeされるので、リロードされれば適用されます。 実際は、数百行ありますが、長いので割愛してます。

$ head conf.d/block_tor_ip.conf
deny  54.37.16.241;
deny  46.182.106.190;
deny  109.70.100.32;
deny  51.15.43.205;
deny  51.75.64.23;
deny  185.205.210.245;
deny  94.32.66.48;
deny  82.221.128.191;
deny  109.70.100.35;

検証

AWSインスタンスを立てて、試しに上記のスクリプトを動作させTorからアクセスしてみます。 nginxをstartさせると、デフォルト画面がレンダリングされます。

f:id:keisuke_t:20200817185940p:plain
nginx_default

スクリプトを発火させ、denyのIPが追加されているnginxを起動します。

Tor起動し、アクセスすると

f:id:keisuke_t:20200817190055p:plain
tor

403を返し、ブロックされました。

f:id:keisuke_t:20200817190250p:plain
block_nginx

最後に

本番環境で運用するならば、locationディレクティブを使って特定のURLの時だけ(例えば、決済画面とかユーザーの問合せ画面とか)denyを適用させるとかもありかなと思いました。

AWS ChatbotでAWSの障害をSlack通知させる

はじめに

AWSさんお世話になってます。 障害事にPersonal Health Dashboardを見にいくのもいいんですが、小さく使ってるサービスだとエラーや障害に気づかない事もあったりするので、せっかくだし自動で通知して欲しい。

CloudWatchを使ってメール送信させるくらいはやってる人多いと思います。ただ、メールも仕事中だとあまり見ないし、メールをSlackに通知させてもいいんですけど、いかんせん見辛いみたいのもあるので簡単にできるものないかな〜と考えてたらAWS Chatbotがあった。 Betaっぽいですが、Slackにも対応してるしお試しで使ってみました

下準備

Personal Health DashboardがCloudWatch Eventで検知されSNSでメール送信されるという部分が前提となってくるので、まずはそちらを設定します。 まずは、ルールの設定から。Healthサービスの全てのイベントを通知対象に f:id:keisuke_t:20200420233308p:plain

ターゲットとしては、AWS SNSで自身のメールアドレスをサブスクリプションにしているトピックを指定しました。 f:id:keisuke_t:20200420233313p:plain

ここまでで、障害検知されたらSNSで自身のメールアドレスへ検知通知が飛びますね。

AWS Chatbotの設定

今回の肝である、AWS Chatbotに触れていきます。

チャットクライアントとしてSlackを指定

f:id:keisuke_t:20200420233621p:plain

僕の勉強用Workspaceがあるので、そちらと紐付けました f:id:keisuke_t:20200420233625p:plain

紐付けを許可させると、ChatBotの設定へと遷移します。名前はお好きなものを、通知チャンネルも紐づいた時点で取得できるのでお好きなチャンネルを指定 f:id:keisuke_t:20200420233630p:plain

CloudWatchにアクセスし、通知アクションに応答できるIAMロールが必要になってくるので今回はテンプレートから作成しただけです。 SNSトピックはCloudWatch Eventで設定したのと同じトピックを使いました。 f:id:keisuke_t:20200420233634p:plain

ここまでで作成は終了です。めちゃ簡単ですね。ただ、障害が本当に起きないとCloudWatch Eventがキックされないので、CloudWatchでルールを作成するページでサンプルイベントを使って検知のテストを実行します。 こんな感じでサンプルイベントを本文に貼り付けて、テスト送信 f:id:keisuke_t:20200420234941p:plain

だーん

f:id:keisuke_t:20200420233639p:plain

awsからの通知になるので、日々流れるslackのタイムラインでも目について良い感じですね〜

期待したい部分

ポチポチもプライベートアカウントならいいんですが、仕事で使おうとするとコード化しておきたい、、、みたいのもあるので、Terraformあたりで書けるようになったら最高だな〜とか思ってました。(現時点でも最高なサービスです) issueを読んでみると、やはりまだBeta版なのでAWS SDKも用意されてなさそうでした。(2020/04/20時点)

github.com

PHDの通知意外にも色んな使い道ありそうだし、何よりセットアップに10分かからない手軽さで最高だったので色々考えていきたいですね

参考

aws.amazon.com