Security and Trust are Priceless

Some articles about security and trust: セキュリティやトラストなどに関して、情報を共有することを目的としています

応用情報技術者試験に合格しました

2021年秋の応用情報技術者試験に合格しました。 午前I免除もらえるので次はネトスぺ、DB、セキスペあたりのどれかを受けようかなと考えています。

基本情報を全く受けずに、いきなり応用情報を受けた上に、勉強始めたのが2週間くらい前だったので正直受かると思ってませんでした。 一応使った参考書ベースでまとめときます。

開示結果

午前:75点

午後:76点

午後の手ごたえは60点下回りそうだったので、なんで76点ももらえたのかよくわかりません。 意外と採点は甘い??よくわかりません。

午前対策

www.amazon.co.jp

午前はこのテキストを何集かしました。とりあえずこれをちゃんとやっとけば合格圏内は簡単だと思いました。

午後対策

www.amazon.co.jp

午後は分野決めてこのテキストで過去問を解きました。

選択した分野は、システムアーキテクチャ、ネットワーク、組込システム開発、情報システム開発です。 本番も同じ分野解きました。 正直、もうちょっと多くの分野を安定して解けるようになっておいた方が午後の得点は安定するかなと思います。 特に今回のセキュリティは過去問でやったことないような物理セキュリティの話が出てきたからです。 私は「透明な袋」と答えた記憶しかないです。 何であんな問題が出たのかいまだに謎です。応用情報のテキストでも見た記憶がない話でした。

感想

勉強していく過程でビジネスサイド、マネジメント、開発手法の基礎知識とかも付いたので勉強になりました。 受かるにはとりあえず過去問周回するしかないと思いました。

Linuxエフェメラルポート番号を変えてみた

Linuxエフェメラルポート番号は簡単に変更できるようなので、実際に変更して、パケットキャプチャしてみたいなと思います。 参考サイト: sauravomar01.medium.com qiita.com

ちなみに、Linuxエフェメラルポート番号は一般的には般的に32768~61000で、WindowsはIANA準拠なので49152~65535を使っているそうです。

環境:ThinkPad + Ubuntu20.04 Desktop

まずは、変更するためのコマンド操作は下のようになります。

・現在のエフェメラルポート番号を確認(sudo無し)

:~$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999

まぁ、一般的な場合とほぼ同じですね

:~$ echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range
bash: /proc/sys/net/ipv4/ip_local_port_range: 許可がありません

sudo要るっぽい?

:~$ sudo echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range
bash: /proc/sys/net/ipv4/ip_local_port_range: 許可がありません

sudoでもあかんのか... ちなみにrootでもやってみましたがダメでした。 ので、別コマンド試しました。

:~$ sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
net.ipv4.ip_local_port_range = 1024 65535
:~$ cat /proc/sys/net/ipv4/ip_local_port_range
1024    65535
:~$ sudo sysctl -w net.ipv4.ip_local_port_range="32768 60999"
net.ipv4.ip_local_port_range = 32768 60999
:~$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999
:~$ 

はい、sysctlだとちゃんと変更できてるっぽいですね。 ここで、エフェメラルポートの範囲をめっちゃ狭くしてやったらどうなるかと思ったので、それでパケットキャプチャしてみました。 例えば、1024~2050としてみると、1048までは使われているのですが、1049, 1050は使われていないので、ここらへんはLinuxカーネルの挙動だと思うので( ´_ゝ`)フーン って感じです。 あと、今時のサイト、みんなhttps化してるのでパケットキャプチャつれぇ...ってなりました。 逆に暗号化してないとブラウザからも怒られます。 なので、セキュリティミニキャンプオンライン2021の選考課題3みたいにcurlコマンドを試してみました。

コマンド:

curl http://yahoo.co.jp

Wireshrakフィルタ:http

結果としては、ポート番号は1024から1048の範囲で偶数番号ポートで変化しました。 コマンドを連打して、44, 46, 48と来ると次は24に戻りました。 その後は周期性が確認されて、24, 26, ....48と変化しました。

ここで、エフェメラルポートを1024~1025とすると1024と1025を交互に使う挙動になりました。 ちなみに、1024だけにすると、curlコマンドの場合は問題が無さげに見えるのですが、ブラウザ(Firefoxの場合)はどこのサイトにアクセスしようとしているサイトを見つけられませんと言われたので、ポート番号が不足してDNS名前解決すらできなくなるっぽい? 1024~1025にするとCSSとかJSのない、htmlファイルだけ送られてきました。 また、別サイトとか別タブがさっきのエラーを吐くので、TCPコネクションを張ったりするのにやっぱりポート番号が足りなくなるのかな? ポート番号増やしてあげたら何の問題もなかったので、やっぱりそれっぽいですね。

こんなことできるLinuxすげーという感想で終わりとします。(簡単に破壊的な設定変更できる危険性もある?)

ユーザーエージェント文字列の偽装可能性について

セキュリティ・ミニキャンプオンライン2021の選考課題3に関して、ユーザーエージェント文字列(以下UA)の偽装可能性などについて考察したのでその一部を残しておこうかなと思いました。

一番下にあるのが、当時提出した解答の大部分です。(満点プラス評価して頂けたので自己肯定感がバクシン)

長いので要約すると、UAの偽装可能性をその正しい形式(from MDN Web Docs)かどうか、そもそも偽装って簡単にできるよねってのを実際に偽装してみて考察しました。また、ポート番号の情報とUAの情報が一致するかなども推定の根拠として使いましたよという話です。

反省としては、そもそもLinuxエフェメラルポート番号の変更可能性についての観点がすっぽり抜けていました(そんなん一般に決まってるもんやし、変えれんやろと思い込んでました)。 あと、curlコマンドのパケットがほんまに一定周期なのかとかも検証したほうが良かったかなと思います。(自分の目で数字比較して大体でしか周期性を見てないので)

httpヘッダのUser-Agentヘッダはcurl/7.74.0 または Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0となっており、Linuxカーネルのマシン上でcurlコマンドを用いたプログラムまたはFirefoxを用いてhttp通信を行ったと考えられる。人がWebにアクセスしたというのはおそらくcurlコマンドを用いたプログラムによりhttp通信を行ったことではなく、ブラウザ(Firefox)を用いてWebサイトにアクセスしたという意味だと考えられるので、Wiresharkにおいて http.user_agent == "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0" というフィルタを用いてパケットを表示し、その際のクライアントのポート番号より、TCPポート番号が求まった。また、http.user_agent != "curl/7.74.0"というフィルタを用いても同様のパケットが表示されており、プログラムが自動的に発生させている通信がcurlコマンドを用いたプログラムの通信、人がWebサイトにアクセスする為にブラウザ(Firefox)を用いた際の通信の2つの通信が行われていたということがわかる。
ただし、これらの解答はユーザーエージェント文字列が偽装されていないという仮定がある。例えば、ブラウザにFirefoxを用いている場合、アドレスバーにabout:configと入力しgeneral.useragent.overrideという設定を追加し、その文字列の値に任意の文字列を入力して、通信を行えば簡単に偽装することができた。また、ブラウザの拡張機能としてユーザーエージェント文字列を偽装するようなものも存在する。このように、ユーザーエージェント文字列は簡単に偽装できるので、ユーザーエージェント文字列のみの情報から人がブラウザを用いてアクセスしているのかどうかを判定する方法では確信が持てない。
また、ユーザーエージェント文字列は標準化されておらず、歴史的な経緯により複雑なものになってしまっている。
ただ、今回の場合はそのような可能性は低いと考えられる。以下はその説明である。
今回のユーザーエージェント文字列はMozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0であり、この形式より、Linux上においてFirefoxを用いて通信が行われたことが推測される。このように考えられる根拠としては、今回の形式はMDN Web Docs(https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/User-Agent)において示されているFirefoxの場合のユーザーエージェント文字列の形式に従っているからである。
また、一般にLinuxカーネルにおいて割り当てられるダイナミックポート番号(エフェメラルポート)は32768~60999の範囲であり、IANAに準拠していない。また、IANA準拠の場合の範囲は49152~65535であり、今回求めたポート番号は全てこの範囲外にもあるのでIANAに準拠したプラットフォームではないことがわかり、Linuxカーネルであることが推測される。よって、ユーザーエージェント文字列から得られたプラットフォーム情報ではLinuxであり、ポート番号の範囲としてもLinuxと推測され、両者の情報が合致しているので、おそらくユーザーエージェント文字列は偽装されていないと推測される。
また、http通信によって送信されているファイルに関しても、人がブラウザ(Firefox)を用いてアクセスした場合は.html, .css, .js, .icoファイルが送信されており、Webページを表示するのに必要なファイル群が送信されているのに対して、curlコマンドの場合は同じ1つの.htmlファイルが連続して送信されているだけであり、時間的にも1秒間の間に約2回http通信がおそらく一定周期で行われており、人の手によって操作されているとは考えづらい。

セキュリティ・ミニキャンプオンライン 2021に参加しました

セキュリティ・ミニキャンプオンライン 2021に参加しての感想 選考課題編

ブログ開設したので、一発目の記事として先月参加したセキュリティミニキャンプオンライン2021の参加した感想や選考課題について感想を語ろうかなと思います。

ただし、講義などに関しては公開範囲などの問題がありますので感想程度にとどめ、具体的な内容に触れるのは避けようかなと思います。

まずは選考課題についてです。

形式としては5問中3問以上を解答し、4問以上解答した場合は得点上位3問の合計点を得点としたそうです。

また、選考課題は講義それぞれに対応したものであったので、講義の説明を見ればどのようなことをする為の知識や能力を聞いてきているのかや調べる際の参考になったと思います。ここらへんは全国大会とも同様なのかなと思います。ちなみにですが、私は年齢制限的に今年の夏の全国大会が最初で最後のチャンスでしたが見事落ちました。年齢制限緩和してほしいなぁ... セキュリティネクストキャンプはまだ年齢的にいけるので何が何でも全国大会行きたいならネクスト参加→全国大会のチューターという方法もあるそうです。ネクストも全国大会参加の踏み台などでは決してなく、普通に面白そうな内容です。個人的にはモブプロとかTDDあたりがめちゃくちゃおもろそうやなと思っています。 あと、SecHack365とかも興味あります。

問題1

FAT32の問題です。

これ見たときは調べても中々それらしきものが見つからなかったので半分諦めていました。一応参考になったサイトはこれです。 elm-chan.orgこのサイトを丁寧に読み込んでいけば解けたような気がするのですが、自分にとっては明らかに他の問題のほうが難易度が低そうだったので後回しにしました。大学のOSの授業は受けていたのですが、流石にここまでの内容は取り扱わなかったのでかなり困惑しました。この問題に関連した講義のほうはめちゃおもろかったです。

問題2

pcapファイルをフロー形式に変換して、解析するという問題だと思うのですが、当時はネイティブ環境のUbuntuが無く、推奨されているzeekも使ったことが無かったので、Wireshrakのフロー機能を利用しました。 あんまり自信もって解けてなかった気がするのと、講義(『マルウェアトラフィックを分析・検知してみよう』)との関連が他の問題ほど深くはなかった気がします。 一応わかることだけ書いて提出しました。

問題3

こちらもpcapファイルを解析する問題です。こっちのほうの問題はある一つのことに気付けば簡単に解ける問題でした。おそらくユーザーエージェント文字列です。例えば、Wireshrakでユーザーエージェント文字列を列に追加して、httpでフィルタリングした後にずらずらっと見ていくと途中で「curl/7.74.0」 から 「Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0」に変わっています。つまり、前者はcurlコマンドを用いたhttp通信、つまりプログラムが自動的に発生させた通信と考えられ、後者が人がWebサイトにアクセスした際に発生させた通信と考えられます。よって、後者のときのポート番号が求めるポート番号となります。

自信満々に解説してますが、間違っていたら怖すぎる。許して下さい。

追記:ユーザーエージェント文字列は改ざんすることができるので、その点についても触れたほうがいいです。 一応弁明?しておくと、私が提出した解答のほうではずっとその話してましたし忘れていたわけではありません。単に答えをもろ書くのを避けたかったので書きませんでした。

参考書籍:[パケットキャプチャ入門 第4版― LANアナライザWireshark活用術]

www.amazon.co.jp

この本を買って、Wireshrakの基本的な使い方を確認しました。

Wireshrakのことが結構丁寧に解説されているのでいい本やなと思いました。

統計とか分析のほうはどうやらこの本の応用編で取り扱っているらしいのですが、そちらのほうは買えませんでした(そこまでお金無かった)。

問題4

forkして子プロセスで実行してなんか色々やった記憶がありますが、かなり忘れています。よくよく自分のコード見てたらfopen関数使ってて、ダメかもしれんのに気付きました(システムコールのexec関数ファミリアを使うという制限は受け取ったパスの実行だけにかかっていると解釈したら問題ない?というかそういう意図だと思われる)。自分はexeclp使いました。

参考書籍:例解UNIX/Linuxプログラミング教室: システムコールを使いこなすための12講 www.amazon.co.jp

この本はある会社の対面インターンに長野から新宿に3日間行った際の帰りに池袋周辺の本屋で買った記憶があります。

Linuxプログラミングは大学のOSの授業でもやってはいるのですが、そこまでちゃんとした内容ではなかったのでこの本を一度ちゃんとやろうと思っています。一応、この本でexec関数ファミリーについて大体理解しました。

あと、最近流行り?の自作OSの本やりたいなぁとか思っています。

zero.osdev.jp

ただし、時間がない。

問題5

コンテナって名前は聞くし、Dockerは授業とか開発で使わされたことあるけどどういう技術なのかよくわからへんなぁ、という状態だったのでまずは

仮想化&コンテナがしっかりわかる教科書 www.amazon.co.jp

を読みました。これで仮想化、コンテナ、コンテナオーケストレーションツール、クラウドサービス(AWS, GCP, Azure等)の概要を理解しました。

次に、コンテナセキュリティに関する書籍「Docker/Kubernetes開発・運用のためのセキュリティ実践ガイド」が弊学工学部図書館にあったので、それを読みました。

www.amazon.co.jp

あと、Docker 実践ガイド 第二版も参考になりました。

www.amazon.co.jp

解答としてはDevOpsとコンテナの話など、調べた内容をさらさらっと書きました。

やはり、勉強になる内容の事前課題だったので非常に取り組みがいがありました。

特に問題3が好きです。ユーザーエージェント文字列に気付いた時の快感があったので。