ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

ngrokを使って、VirtualBox内の環境へインターネット経由でアクセスできるようにする

はじめに

自PC内のVirtualBoxに作った検証環境へ、ngrokを使ってインターネット越しにアクセスできるようにする手順を紹介します。

注意

記事中の説明はタイトルに記載している到達性の確保に重きを置いており、セキュリティ面の厳密な説明を省いています。以下のような工夫は各自でお願いします。

  • ngrokのカスタムドメインの利用
  • SSHにおける公開鍵認証の利用

モチベーション

メンバーのトレーニングがてら、Kali LinuxとMetasploitable2で学習環境を構築しようと思い立ちました。

当初は受講者からのアクセスしやすさを優先してAWSで構築しようとしましたが、Metasploitable2はvmdkしか手に入らず、AWSVM Importがちょっとめんどくさそうだったので、自分のPCのVirtualBoxを使って環境を構築することにしました。

受講者にどうやってVirtualBox内のVMにアクセスしてもらうかですが、リモートワーク全盛の昨今、受講者PCから自PCへの到達性を搦め手なしで確保するのは難しく、今回はngrokを使いました。

ngrok

インターネットにエンドポイントを生成して、そこに対する通信を事前に指定したローカルなエンドポイントへ転送してくれるサービスです。localhost:8080で実行しているWebアプリをインターネット経由で(一時的に)公開する、といったようなことができます。

ngrok.com

構成

こんな感じです。今回は受講者が2人だったので、Attacker(Kali Linux)とTarget(Metasploitable2)のVMを2セット作りました。

f:id:shinobe179:20211231024344j:plain

受講者PC(Trainee PC)がEC2インスタンスを中継しているのは、以下の理由からです。

  • ngrok(ドメイン?)へのアクセスを、アンチウイルスソフトファイアウォールなどがフィッシングサイトへのアクセスとして検知・遮断することがあるから
    • 今回はSSHなのでドメインも何もないのですが、念のため
  • ターミナルソフトがないなどの理由でSSHできなくても、Session Managerで操作できるから
    • Session Managerの説明(概要および構築手順)は省きます

VMの準備

トレーナーのPC(Trainer PC)内のVirtualBoxにAttackerとTargetのVMを立てます。全VMは同じホストオンリーアダプターを持っており、Attackerにはそれに加えてインターネットアクセスのためのNATアダプターを持たせます。

ngrok有料プラン契約(必要に応じて)

ngrokにはFreeプランがあります。ngrokの同時実行数が1つならFreeプランでいいのですが、今回は2つのサーバーで同時にngrokでトンネリングしたかったので、Proプランを契約しました。

ngrok.com

とここで、VirtualBox内に踏み台サーバーを立てればFreeプランで済んだことに今更気がつきました。急いでいたもので……。

Attackerにngrokのバイナリを配置

ngrok公式の手順に従って、Attackerにngrokのバイナリを配置します。

ngrok.com

ngrok認証トークンの取得と登録

有料プランの機能を使うには、ngrokアカウントの認証トークン(Authtoken)を取得し、各実行環境に登録する必要があります。取得はダッシュボード左ペインの「Getting Started」→「Your Authtoken」から取得できます。登録は各実行環境(今回はAttacker)で以下のコマンドを実行します。

$ ngrok authtoken <authtoken>

トンネリング開始

Attackerで以下のコマンドを実行し、トンネリングを開始します。これで、ngrokのエンドポイントにSSHすれば、各Attackerへ転送されるようになります。

$ ngrok tcp 22

Trainee PCからAttackerへの接続

踏み台EC2インスタンスを経由(SSHでもSession Managerでも、何でもいいです)して、ngrokのエンドポイントへSSHします。

$ ssh kali@xxx.tcp.ngrok.io -p <ポート番号>

おわりに

各PCの回線状況に依存しますが、コネクション遅延や切断もあまり起きず、比較的快適に実施できました。MetasploitableのAMIがあったらいいのに。

Burp Suiteを使ってGETとPOSTを相互変換する

はじめに

Burp Suiteには、GETをPOSTへ(またはその逆)変換して送信する機能があります。

使い方

リクエストをプロキシしたら、右クリックメニューから「Change request method」を選択します。

f:id:shinobe179:20211114171012p:plain

POSTになりました。

f:id:shinobe179:20211114171100p:plain

Repeaterでも同じことができます。リクエストボディを追加すると、送信時に自動でContent-Lengthを計算してくれます。

f:id:shinobe179:20211114171213p:plain

補足:経緯

先日開催されたWaniCTF2021を一瞬だけ覗いて、Webの「Post Challenge」という問題に挑戦しました。

wanictf.org

エンドポイントに指定されたPOSTリクエストを送るという問題でして。1からPOST作るの面倒だな、Burpでうまいことやってくれないかなと思ってググったら以下の記事が出てきました。

For requests, you can automatically switch the request method between GET and POST, with all relevant request parameters suitably relocated within the request. This option can be used to quickly test the application's tolerance of parameter location, e.g. to bypass input filters or fine-tune a cross-site scripting attack.

portswigger.net

PortSwigger様様です。

「AWS GameDay Online – Security Edition」に参加した

AWS Security Roadshow Japan 2021」内で実施された、セキュリティ特化のGameDayに参加しました。

aws.amazon.com

内容については公言してくれるなとのことで、競技形式などは詳細には書けませんのであしからず……。

今年の頭にAWSセキュリティ専門知識認定を取得したんですが、その時に得たセキュリティ系サービスのぼんやりとしたイメージが、手を動かすことではっきりしました。月並みですがそんな感じです。

他の参加者さんとの交流も楽しかったです。競技時間終了後もChimeを繋げて、解けなかった問題にああでもないこうでもない言いながらトライしていました。

「ムダなく最短でセキュリティスキルを身につけたい"本気の"初心者向け『土曜日のアフタヌーンセミナー』」に参加した

こちらに参加してきました。

connpass.com

主催者のNeoさんのブログ「shikata ga nai」は、セキュリティ(特に脆弱性診断やペネトレ)に関するノウハウを非常に丁寧に、しかも高頻度に投稿してらっしゃいます。間違いなく只者ではない、話してみたいとずっと思っていました。

cysec148.hatenablog.com

課題

セキュリティはずっと趣味というか憧れで取り組んできましたが、徐々に仕事でもそういうことをするようになって、いつの間にか業務の大半をそれが占めていて。果たして私のやっているセキュリティは胸を張って給料袋受け取れるレベルにあるだろうか、いやない、ではどうやったらその壁を越えられるか、という悩みが一丁前にあって、それを解消する糸口にならないかと思って、新幹線に飛び乗って大阪へ向かいました。*1

結論、糸口は掴めた

ご自身の体験から、効率のよい学習ルートをご説明いただきましたが、結局は継続だと私は受け取りました。コース取りはそれを支える要素でしかないというか(もちろん、あんまり遠回りするのは違うけど)。

今はただ掴んだだけで、これから延々手繰り寄せる必要がありますが、たぶん一人では見て見ぬ振りするだろうなという気づきでした。普段読んでいるはずの「shikata ga nai」こそが継続そのものだろうに。参加してよかったです。

セミナー後

せっかく大阪まで来たのだから、参加者の方含め飲みに誘うとかできたらよかったけど勇気が出なくて(あと時世も時世だし)できなかったです。ホルモン買ってホテルで食べました。おいしかった。

*1:関係ないけど「いとぐち」って「緒」とも書くんですね。

MINI Hardening 4 AV Tokyoに参加した

これに参加してきました。

minihardening.connpass.com

あまり内容を公にしてくれるなということで大したこと書けないんですが、ソシャゲのチート対策が主ということで、事前準備としてインフラちょこっといじった以外はずっとコードとにらめっこでした。典型的なのをちょこっと対処したぐらいで、あっという間に競技終了。反省は以下の通り。

  • Webアプリ実装経験が足りない、絶望的に足りない
  • Webサーバーのアクセスログにリクエストボディを出すのがうまくいかなかった
    • ちゃんと出る時と "-" になる時がある
  • リクエストボディの内容に応じてレスポンスを変えるのがうまくいかなかかった
    • <script> が含まれていたら403、みたいなことができたら、簡易WAFとして使えると思った

通常版には通常版のよさがあると思いますが、MINIは個人戦であることや、技術的な部分が抽出されていることなど、色々気が楽なので、私はMINIのほうが性に合っているようです。

『ゼロトラスト導入指南書』を読んだ

はじめに

タイトルの通りです。ゼロトラストについては、オライリーの『ゼロトラストネットワーク』を読んだきりでした。コンセプト(すべて確認する)の再確認に加えて、それを支える製品群のユースケース、境界型防御との関係性あたりを学べてよかったです。

www.ipa.go.jp

書いてあること

  • ゼロトラストとは
  • 参考文献
    • NIST SP800-27からムックまで
  • ゼロトラストを支える製品群
    • SIEMとかCASBとかSASEとか、うさんくさい略語の紹介
  • こんなふうに導入するといいよ
  • 境界型防御とは共存できるよ

などなど

雑感

  • 「すべて確認する」ために必要なことは何か(→見通しのよいIT環境)、それをどう実現するか
  • 世の中がやたらとID管理ID管理うるさいなと思ったら、やっぱり大事らしい
  • 「ゼロトラスト≠ゼロトラストネットワーク」という論をどこかで見た気がして引っかかっていたが、気のせいだったかもしれない
  • 参考文献で紹介されてたやつ一通り目を通そう
  • ゼロトラストの進め方が書いてあるのがよかった

パッシブOSスキャンツール「p0f」

概要

p0fの使い方のメモです。

CEHの勉強をしていたら「パッシブOSスキャンツール」という言葉が出てきました。紹介されていたツール「p0f」の解説を読むに、受信したパケットを横から見て判断する(p0f自身はポートをリッスンしない)とのこと。

www.kali.org

インストール

※検証環境はKali Linux 2021.3です

apt でインストールできます。

$ sudo apt update
$ sudo apt install p0f

使い方

以下のような感じで、パケットを採取するインターフェイスと、採取するパケットの条件を指定します。tcpdumpみがありますね。

$ sudo p0f -i lo 'port 80'
[sudo] password for kali: 
--- p0f 3.09b by Michal Zalewski <lcamtuf@coredump.cx> ---

[+] Closed 1 file descriptor.
[+] Loaded 322 signatures from '/etc/p0f/p0f.fp'.
[+] Intercepting traffic on interface 'lo'.
[+] Custom filtering rule enabled: port 80 [+VLAN]
[+] Entered main event loop.

前述の通り、p0fはポートをリッスンしないので、80番ポートを開けて、そこに対する通信を発生させてみます。今回はPython3のhttpモジュールを使いました。

$ sudo python3 -m http.server --bind localhost 80
[sudo] password for kali: 
Serving HTTP on ::1 port 80 (http://[::1]:80/) ...

ブラウザからlocalhostへリクエストしてみると、p0f側にこんなログが出ました。ところどころ Linux 2.2.x-3.x とありますが……違くね?

.-[ 0:0:0:0:0:0:0:1/56094 -> 0:0:0:0:0:0:0:1/80 (syn) ]-
|
| client   = 0:0:0:0:0:0:0:1/56094
| os       = ???
| dist     = 0
| params   = none
| raw_sig  = 6:64+0:0:65476:mss*1,7:mss,sok,ts,nop,ws:flow:0
|
`----

.-[ 0:0:0:0:0:0:0:1/56094 -> 0:0:0:0:0:0:0:1/80 (mtu) ]-
|
| client   = 0:0:0:0:0:0:0:1/56094
| link     = ???
| raw_mtu  = 65536
|
`----

.-[ 127.0.0.1/58672 -> 127.0.0.1/80 (syn) ]-
|
| client   = 127.0.0.1/58672
| os       = Linux 2.2.x-3.x
| dist     = 0
| params   = generic
| raw_sig  = 4:64+0:0:65495:mss*1,7:mss,sok,ts,nop,ws:df,id+:0
|
`----

.-[ 127.0.0.1/58672 -> 127.0.0.1/80 (mtu) ]-
|
| client   = 127.0.0.1/58672
| link     = ???
| raw_mtu  = 65535
|
`----

.-[ 127.0.0.1/58674 -> 127.0.0.1/80 (syn) ]-
|
| client   = 127.0.0.1/58674
| os       = Linux 2.2.x-3.x
| dist     = 0
| params   = generic
| raw_sig  = 4:64+0:0:65495:mss*1,7:mss,sok,ts,nop,ws:df,id+:0
|
`----

.-[ 127.0.0.1/58674 -> 127.0.0.1/80 (mtu) ]-
|
| client   = 127.0.0.1/58674
| link     = ???
| raw_mtu  = 65535
|
`----

.-[ 0:0:0:0:0:0:0:1/56100 -> 0:0:0:0:0:0:0:1/80 (syn) ]-
|
| client   = 0:0:0:0:0:0:0:1/56100
| os       = ???
| dist     = 0
| params   = none
| raw_sig  = 6:64+0:0:65476:mss*1,7:mss,sok,ts,nop,ws:flow:0
|
`----

.-[ 0:0:0:0:0:0:0:1/56100 -> 0:0:0:0:0:0:0:1/80 (mtu) ]-
|
| client   = 0:0:0:0:0:0:0:1/56100
| link     = ???
| raw_mtu  = 65536
|
`----

.-[ 127.0.0.1/58678 -> 127.0.0.1/80 (syn) ]-
|
| client   = 127.0.0.1/58678
| os       = Linux 2.2.x-3.x
| dist     = 0
| params   = generic
| raw_sig  = 4:64+0:0:65495:mss*1,7:mss,sok,ts,nop,ws:df,id+:0
|
`----

.-[ 127.0.0.1/58678 -> 127.0.0.1/80 (mtu) ]-
|
| client   = 127.0.0.1/58678
| link     = ???
| raw_mtu  = 65535
|
`----

おわりに

私のOSスキャンのイメージはNmapの -O オプションで、たくさんパケットを投げてようやく成立するものだと思っていたので、パッシブなOSスキャンというのは新鮮でした。Windowsでも試したかったですが、あいにくライセンスを切らしているのでまたの機会に。