僕と技術とセキュリティ

セキュリティエンジニアの備忘録

Route53に設定したドメインが名前解決できない。

困ったこと

掲題の通り、Route53に設定したドメインが名前解決できなくなりました。 設定したばかりの頃は問題なく稼働していましたが、突然使用できなくなる事態に。

結論

Eメールの確認をする。 AWSのページにEメールの所持確認をしてねというお知らせが来ていた。Route53のダッシュボードではなく、Route53 > 登録済みドメイン >{ドメイン名}のリンク先にEメールの再送信ができる項目があるため、Eメールから所持確認を行って解決

挙動として

WHOISにはドメインとそのネームサーバが記録されており、そのネームサーバへ直接問い合わせると名前解決ができる状態だった。

dig @ns-1163.awsdns-17.org piyo.foo.com 

;; ANSWER SECTION:
piyo.foo.com . 60   IN  A   52.68.164.00

Route53で取得したドメインのネームサーバ

ns-1163.awsdns-17.org
ns-471.awsdns-58.com
ns-1631.awsdns-11.co.uk
ns-552.awsdns-05.net

ただ、digの+traceオプションで.comのトップレベルドメイン(e.gtld-servers.net等)で応答が返ってこないことが判明しネットワーク的な調査がここで行き詰まっていた。

dig @e.gtld-servers.net piyo.foo.com

;; QUESTION SECTION:
;piyo.foo.com.  IN  A

;; AUTHORITY SECTION:
com.            900 IN  SOA a.gtld-servers.net. nstld.verisign-grs.com. 1676035370 1800 900 604800 86400

色々検索したところ、AWSのヘルプページに書いていた内容で解決。

docs.aws.amazon.com

uninitialized constant User::SessionsControllerを解決した話

おそらく同じパターンで困っている人と、同じエラーで躓くであろう未来の自分のために書く。

Rails でDeviceを利用している際に遭遇。 発生するタイミングはCentOSUbuntuのDocker上でしか再現しないという奇妙なエラー (Mac OSWindowsでは問題なく動作する)

User クラスを使用するページへアクセスすると以下のエラーになる。

uninitialized constant User::SessionsController

結論

以下の様にして解決
config/initializers/requirements.rb

require Rails.root.join("app/models/user.rb")
require Rails.root.join("app/controllers/User/sessions_controller.rb")

解決までの流れ

uninitialized constant = 「定義したクラスを読むことができない」
なので
Railsのお作法に習って以下のファイルを追加する。
このconfig/initializers配下のファイルはRails起動時に勝手に読み込まれる

config/initializers/requirements.rb

Userクラスが読み込まれていないので中身は以下の様にする

require Rails.root.join("app/models/user.rb")

結果、同じエラーが出る

uninitialized constant User::SessionsController

このファイル実は読み込まれていないのではないかと思い、
ファイルの中身をエラーが発生するようにして、rails restartする

結果、当該ファイルでエラーが発生するので 読み込まれている様だ。

/usr/src/rails_build_docker/config/initializers/requirements.rb:1:in `<main>': undefined method `ressssquire' for main:Object (NoMethodError)
Did you mean?  require
ubuntu@ip-172-31-29-8:~/rails_broken_app$ 

尚更タチが悪い。

ここで、SessionsController が読み込まれていないのならconfig/initializersで読み込ませれば良いのでは? ということに気づく。

config/initializers/requirements.rb

require Rails.root.join("app/models/user.rb")
require Rails.root.join("app/controllers/User/sessions_controller.rb")

とすると、sign_inページにアクセスしても当該エラーが表示されなくなった。

情報処理安全確保支援士 2020 秋 解答

午後Ⅱ

午後Ⅱは問2を選択。 採点基準の参考にしていただければと思います。 追記: 試験センターの解答例が出たので振り返り。午後Ⅱは概ね想定通りだった

設問1

(1)イ (シェアードシークレット)
解説: 消去法。ディジタル署名とタイムスタンプの誤答を誘う問題、タイムスタンプはOTP生成時に使う情報。GoogleのTOTPではSecretKeyという名前で利用されている。 ちなみにこの手の消去法問題は例年出題される。前回(2019秋)は単語として初出の「コードサイニング証明書」を消去法で選択させる問題だった。

(2)インターネットからOTPアプリの初期設定が可能になる問題。
(3)ウエイアカオ
解説: dの会議ツールZ(Z社のクラウドサービス、記載はないがSaaS(p15)のサービスがヒントになっていた。このインプリシットフローでTokenの検証が必要になる。

設問2

(1) VD接続中のノートPCの画面録画を行い持ちだす方法。
解説: 情報処理試験の過去問にこの方法での指摘を問う設問があった。開催回がわかったら追記する。

設問3

(1) VD環境を操作して業務文書の内容をメールで送信する方法。
解説: 文脈から、マルウェアが感染したのがノートPCなのかVDなのかわかり辛い。どちらにしてもVDから行える操作は メールの送受信及びスケジュールの管理、業務文書の保存、閲覧、編集とあり(p15)メールに添付が可能かどうかまでは言及されていないため「メール添付」まで書くと誤答になる可能性がある。

(2) ア, ウ (DaaS-V, IDaaS-Y)
解説: T環境からアクセス許可が必要になる= T環境と直接通信が発生する必要のあるサービス。 DaaS-VはFW+認証に必要(p15)、IDaaS-Yは社内と同じ利用者IDとパスワードで認証できる様に〜認証情報を同期(p14)の記述より。他は必要がない。EDR-Uも項目に入りそうだが、これはDaaS-Vのオプションであり、E社FWと直接の通信の必要がない。また、設問内に設置と通信の必須が問われていないのでEDR-Uは含めてはいけない。

設問4

(1) 各CSPが取得しているセキュリティ管理策の認証を確認する。
解説: 直前に"ヒアリング"とあるが、この確認はクラウドサービスの公開情報を確認するのでヒアリングには入らない。また、"具体的に"と書かれていないので「ISO27017」と書くと誤答になる可能性がある。各CSPの所在国は言及されていないので「FedRAMP」や独自の認証基盤も視野にいれないといけないため。

設問5

(1) DaaS-Vではクライアント証明書によるデバイス認証を追加で行う対策。
解説: "DaaS-Vのフィッシングサイト"でその情報を悪用した不正アクセスとある。OTPによる2段階認証との誤答を誘う問題だが、"ユーザの入力"を全て盗聴された場合にはログイン認証時のOTPでは防げない。DaaS-Vのデバイス認証の件はp18に記載がある。

https://scan.netsecurity.ne.jp/article/2020/01/10/43512.html

xtech.nikkei.com

設問6

(1) ディスクを取りだし別のOSで起動する。
解説: これは正答かどうか微妙「全ディスク暗号化」とは書かれていないので正答のはず。また、悪意のある人物が"認証の総当たり試行"でも解読できるため加点になる可能性がある。
追記: 認証の総当たり試行の方が正解とされていた、試験センターの回答例は「パスワードの推測によってログイン」現実の手順がどうであれ、IPA試験は試験センターが期待する答えを書くことが求められる。結果が満点でなかったのでここと設問(3)-2が不正解になっていたと思われる。 https://www.ipa.go.jp/files/000035236.pdf

(2) 推測が容易なPINコードに毎回設定されてしまう問題。
解説: 000000など推測が容易なPIN / もしくは申請の都度同じPINを設定することが問題。「推測が容易なPIN」が正答だが、「同じPINを設定」することの想定外の解答を潰せていないので"毎回"を入れた。腑に落ちないことがあっても試験センターが発表する解答が絶対なのでそちらを待つ。 追記: あってた。試験センターの回答例は「容易に推測可能なPINコードを設定する。」

(3) クライアント証明書によるデバイス認証を追加する。
解説: 申請が許可された"利用者のノートPC"(p22)を"DaaS-V"と同等のセキュリティを実現ということは、p18にある通り、クライアント認証を追加する必要がある。設問5が解けていないと正答できない問題だった。ちなみに、FWにログイン認証を設けるという解答はp16の要件が満たせないので不正解

VMWare Fusion(Mac)で動かしているUbuntuにVMWare toolsをインストールする

経緯

公式のインストール方法だとインストールに失敗するためメモ
以前はisoのインストールのみで利用できたのに。。。

環境:

ホストOS
Mac OS Catalina 10.15.3
VMWare Fusion 11.0.3

ゲストOS
Ubuntu16.04 32bit

インストール方法

※事前にisoファイルは落としてある前提

VMWare

1. 仮装マシンはホストOSのローカルにあるISOファイルを選択

f:id:halkichi-web:20200614001712p:plain

2. インストール時に「簡易インストール」のチェックを外す

f:id:halkichi-web:20200614001635p:plain

3.ゲストOSのインストールは手動で実施する。

(ちょっと時間がかかるが、画面の指示通りに進めばOK)

f:id:halkichi-web:20200614001814p:plain

4. インストールが完了したら、

VMWareツールバーより > 仮想マシン > VMWare Toolsのインストールを選択

f:id:halkichi-web:20200614001928p:plain

※この際に、次のエラーが発生した場合はCDドライブを取り外す。

「ゲスト OS が CD-ROM ドアをロックし、CD-ROM を使用しているため、ゲストはメディアの変更を認識することができない可能性があります」

CDドライブの取り外し方(エラーが表示されなければ実施しなくてok)

ゲストOS(Ubuntu)から「ファイル」>当該CDドライブを取り外す。

画面赤枠の箇所をクリック

f:id:halkichi-web:20200614002210p:plain

VMWare Fusionが11.03以降の場合はumauntコマンドは利用しない方が吉。

5. 4が完了したら/media/{ユーザ名}/VMWare Tools/配下にVMWare toolsが置かれる。

※ユーザ名はゲストOSインストール時のユーザ名

VMWare toolsを確認したら下記のコマンドを実行する

cd /media/$(whoami)/VMWare Tools/
cp  VMwareTools-10.3.2-9925305.tar.gz ~/
cd ~
sudo tar -zxvf VMwareTools-10.3.2-9925305.tar.gz
cd vmware-tools-distrib
sudo ./vmware-install.pl 

これでVMware Toolsのインストールは完了する。 ただし、コピペにはまだ不具合があるようで、できたりできなかったりする。 共有フォルダはマウントできる。

このあたりが解決せず、VMWareのカスタマーサポートにも問合せをしてみたところ
カスタマー用のiso?をダウンロードするためのリンクが送付されてきて、指示された通り実行してもコピペや共有フォルダが作成できない問題が解決できなかった。

質問を繰り返しても再起動してくれ、Fusionを再インストールしてくれ、等の無意味に時間だけがすぎる応酬を繰り返した...。 結局VMWareのversionが上がって解決されるのを待つ他ない模様。。こういうケースはムズムズしますね...

同じ現象で詰まっている方の参考になれば幸いです。

Bug Huntの観点を聞いた話

皆さんBugBountyはご存知ですか。

アプリケーションの脆弱性に繋がるバグを発見して、企業に報告してお金をいただくという制度です。
日本では実施されている企業はほぼありませんが、
海外のプラットフォームでは HakcerOnebugcrowdなどが存在します。
登録したリサーチャーと企業とがお互い合意の上で、アプリケーションの問題を探すプログラムです。

隙間時間を見つけては参加していますが、
世界中のつよセキュリティエンジニアが四六時中バグハントしているのでもうたいていの脆弱性は掘り尽くされていて、非常にセキュアなアプリばかりです。

なのでXSSとかSQLiとか滅多に検出されない。本当に。

報告しても
「それはもう他のリサーチャーに報告されているよ!お金は払えないね!」
と言われてしまうのです。

なので、もう簡単に見つかるBugは諦めて、
少しトリッキーなやつの報告を狙っていたりします。

と、電車で隣に座っていたJKが話していました。


ここからもJKに聞いた話です。

もう試し尽くしてしまいましたので
そんな観点をいくつか展開するのだとか

なお、この内容がセキュリティに携わる方の知見に繋がり、
本記事が、読者自身のセキュリティ対策への理解と、各企業・組織の研修やセキュリティ教育等に活用されることにより、セキュリティ対策の普及の一助となることを期待して、記事を書きます

常識をあえて文字に起こしていますが、BugBountyプログラムを実施していないサイトに脆弱性の検査をしてはいけませんよ。

sqlmap使いの正義のホワイトハッカーの方、qiitaでXSS見つけました報告している方。 お願いしますね。

1. SSRF

身内の勉強会ではよく話すネタですが、
HTTPは問題になる場面が多いです。

サーバから外部リソースが行えるサイトの場合、SSRFの脆弱性を探したりしますが
サーバから送信されるリクエストを指定できる場合、以下のことに利用できたりします。 とJKが話していました。

リダイレクトループ

Slackに代表されるリンクプレビュー機能はURLを貼り付けると、その宛先のアイキャッチを取得します。

あの宛先がさらにリダイレクトしてループするとDoS攻撃に繋がる恐れがあります。

もちろん、wgetコマンドやPHPcurl_exec()はリダイレクト上限が存在しますが、HTTPの性質上、仕様によってはループが止まらなくなったりそもそもリダイレクト上限がない言語も存在する様です。

なお、SlackはHackerOneのBugBountyプログラムに登録があります。
さらに言うと、リダイレクト上限も考慮された実装でした。

halkichi-web.hatenablog.com

SSRFの調査

Webサーバ限定ですが、
SSRFが可能か調査する際に長いパスを送信してみる、という手法があります。

パス、もしくはパラメータの上限値にチェックがされておらず、490文字、990文字、とか変な文字長でエラーになる場合、アプリの裏側でリソースの呼び出しを行っている場合があるのだとか。

XS-Leaksとも呼ばれるそうです。

Hostヘッダ

HTTPのHostヘッダを宛先のFQDNから変更して送信し、レスポンスのBaseURLが変化する様なアプリケーションがある場合。

変更したFQDNを別のシステムに渡しているアプリをよく見かけます。

パスワードリマインダー機能でメールを送信する際に、TOKENつきURLに反映している場合は注意が必要かもしれません。

クラウドレンタルサーバを利用している場合は、Hostヘッダの改ざんが403応答になるのでそれだけでオンプレとの差別化になるかもですが、本質から逸れるのでまたいつか記事にしたいと思います。

終わりに

最近のJKはセキュリティの話ばかりしているので助かりますね、セキュリティに携わる身としてはサイバー技術者取締り強化月間が怖いところですが セキュリティエンジニアの皆様も

JKからセキュリティの知見を聞いた場合は是非共有してもらえませんか

どうぞご検討ください。

開発者の方は、上記の様な実装にはご注意ください。
決してBugBounty以外の用途で使用されることがなきようにお願いします。

???「こんなのサイト固有のロジックの不備じゃん、そんな実装あるわけないよ!」
私もそう思っていますが、人聞きの話なので。でもよく見つかるのだとか?

自分の中でDocker神話が崩壊してきた話

はじめに

Debian限定で書いていますが、どのプラットフォームにも当てはまる話だと思います。

apt-get install mysql-clientが失敗する

これは去年の9月頃にTwitterで話題になっていました。 Oraclemysqlに意地悪したのでmysql-clientパッケージはdefault-mysql-clientへ変更になりましたという話。 修正方法については下記ブログ様の記事を参照ください。

yourmystar-engineer.hatenablog.jp

自分のリポジトリも影響を受けたのでdefault-mysql-clientに変更することで対応しました。
が、その際に考えました
apt-get install xxxxだと、その時点のリポジトリの環境に左右されるので
直接リポジトリのURLを指定してビルドした方が良い かもしれない。」と。

(けれどもDockerfileの見通し悪くなることが嫌だなとも考えてました。依存関係pkgも同じ方法にでinstallする必要があるため)

であれば直接URL指定してpkgを取得すれば良いか。 と思って下記の様な感じで置き換えてました。
※1

# wget https://deb.debian.org/debian-debug/pool/main/n/pkg名/mysql-client_all.deb
# apt install ./mysql-client_xxxx_all.deb

すると、暫くの間は問題がなかったものの、また docker-compose up --buildの際にリポジトリ が404だったり503でビルドに失敗する様に。
ググったら似た様な事象の方を発見。

qiita.com

上記の例はリポジトリのlistの取得に失敗する例ですが、
pkgの場所が変わることを考慮していなかったため、取得するURLが変わると対応できなくなる。
(debianも自分等のリポジトリ内ならリダイレクトぐらいしてくれても良いのでは?)

結果どうしたか

  • 定期的にCIツールで監視して失敗の都度対応したりするのが良い...?

けれども個人開発のツール群等に割くリソースがあまりないので
ソースからビルドする作戦で当分はごまかすことに。。。
依存関係が多いpkgはURLが変わることが多い様なので、

  • どうしてもしくじりたくない時間のかかるライブラリ はソースから取得してきて、ビルドする。

のがまだましなのかな、という結論になりました。今の所。

参考までに、dockerhubに上がっている公式イメージのDockerfileの多くは apt install {パッケージ}としているので、私のしている事は時代に逆行しているかもしれません。

ところでDocker神話の理由

普段、様々なプラットフォームで仕事しているので
ツールを開発する際にまずdokcerイメージを作成してホストに依存しない環境作りをしています。 PC変えてもツールは動くのでまぁ便利。
Windowsだろうが、Macだろうがdocker-compose up --build して使いたいコマンドは execをすることでわざわざ環境構築をせずにいつでもどこでもちょこちょこ開発できていたのですね。
はじめに Dockerfileを作る手間がありますが、途中で依存関係につまずくことが少なくなるので逆に開発速度は向上しました。(体感)

注記

  • よわエンジニアなので依存関係の解消はDockerfileを作る前に手動で確認する。
  • 自分用のツールだし最新版の更新より依存関係解消に注力する。

pwnのお勉強に便利なテクニック(CTF)の話

Pwnのお勉強に便利なテクニックをご紹介

普段CTFでPwnに取り組む時、ちょっとした時短になるコマンドを書き留めておきます。つよエンジニアの皆さんやPwnerの方は普段から実践されているテクニックだと思うが、まとめられているところはあまりなかったのでメモです。

目次

  • バイナリを実行する際のテク
    • 変更監視で時短
  • 視覚化テクニック
    • アセンブリをお手軽に見る方法
    • ちょっとした手間をお手軽にする方法

バイナリを実行する際のテク

変更監視で時短

ちょっとしたCのファイルを実行して動きを確認したい時に便利です。通常だと、この関数はどういう動きだったっけ?などの少しだけ確認したい場合にファイル開いて->コンパイルして->実行となるパターンを繰り返していますが、この作業、なかなか煩わしい一手間です。 そこで、変更監視にしてしまえば良いかということで色々ためしてしっくり来たのがこちら

https://qiita.com/tamanobi/items/74b62e25506af394eae5

本来はファイルの変更後に下記のようなコマンドを実行する必要があります。 echo_hello

int main(){
  printf("hello");
}
gcc echo_hello.c -o echo_hello
./echo_hello
hello # 出力結果

やりたいこと Cで書いたファイルを保存した際に 1. コンパイルする 2. 実行する

を実現したいので

上記の記事のファイルと組み合わせて実施しているコマンドがこちら。 ターミナル1

./mywatch.sh echo_hello.c 'gcc echo_hello.c -o echo_hello'

ターミナル2

./mywatch.sh echo_hello './echo_hello && echo "\n"'
hello # Cのファイル変更の都度実行結果が表示される

mywatch.shは↑で参照させていただいた記事よりコピペしています。 ターミナルを2つ開いて実行するのが便利です。実行結果だけ追うようにしているとコンパイルの失敗時に気づけなくなるため。 node.jsでGulp watchしている時にCで簡単に実行する方法ないかなと考えた結果こちらの方法を思いつきました。 makeで実施する場合にはnodeとかrubyで良きツールがいくらでも出ているためそちらを利用する方が圧倒的に楽です。あくまでPwnのための勉強用途にどうぞ。

視覚化テクニック

アセンブラで出力する方法や、バイナリ解析時にあのコマンドどうするのだっけ集です。

アセンブリをお手軽に見る方法

アセンブラに通る時どうなるんだっけ..?というのをすぐに確認する方法。gdbやobjdumpを利用すればすぐ確認できますが、起動するのも面倒だよというものぐさな方の覚書用途に

※hello.cというファイルをダンプした場合、hello.sというファイルが作成されます。

gcc hello.c -S -masm=intel

## %bb.0:
    push rbp
    .cfi_def_cfa_offset 16
    .cfi_offset rbp, -16
    mov  rbp, rsp
    .cfi_def_cfa_register rbp
    sub  rsp, 16

AT&T記法が好きな方は-masm=intelオプションを外してください。

gcc hello.c -S -g -masm=intel

ちょっとした情報をお手軽に見る方法

ちょっとした方法がわからない時に。調べれば3秒でわかることだけれどもしっておくと時短になるかもしれないテクニック?集。

  • asciiコードを知りたい
man ascii

~~
    The hexadecimal set:
40  @    41  A    42  B    43  C    44  D    45  E    46  F    47  G
     48  H    49  I    4a  J    4b  K    4c  L    4d  M    4e  N

それぞれ8進,10進,16進で確認できます。
0x41 は 'A'

また思い出した際に追記します...!