CTF講習会 NetWork編 === --- ## 最初に:Wiresharkのインストール https://www.wireshark.org/download.html からいい感じにダウンロード&インストールしておいてください --- ## NetWork問とは何か? --- ## NetWork問とは何か? - Forensicsの一ジャンル(とされることが多い) - 通信の記録を解析するジャンル - ほとんどの場合、pcapファイル(もしくは、その改良版のpcapngファイル)を解析する --- ## フラグの場所 - 配布ファイルだけでフラグが分かる - 外部のサーバーにフラグが置かれている --- ## 配布ファイルだけでフラグが分かる問題 - pcapファイル/pcapngファイルを読むだけで解ける問題 - pcapファイルと、その通信に使われたソフトウェアのコードを読むことで解ける問題 - etc... --- ## 外部のサーバーにフラグが置かれている問題 - 接続先が問題文に置かれていて、接続の仕方の例のようなものがpcapファイルとして与えられている - pcapファイル/pcapngファイルに接続先やユーザー名・パスワードの情報が書かれていて、そこに接続するとフラグが取れる --- ### 配られるファイル - パケットキャプチャファイル - ある経路上を流れたデータがたくさん入っている --- ### どんな問題が出題されるの? - Ethernetの通信パケット - 無線LANの通信パケット - USBの通信パケット - Bluetoothの通信パケット --- ## pcapファイル - パケットが記録されたファイル - 生のパケットに加えて、各パケットが流れた時刻・パケットの長さが記録されている --- ## pcapngファイル - pcapファイルの上位互換 - pcapファイルに含まれる情報の他に、次のような情報を含めることが出来る - パケットキャプチャが行われたインターフェースの情報 - パケットキャプチャファイルやパケットに対するコメント - 名前解決の情報 --- ## pcapファイル・pcapngファイルを扱う方法 - GUI ソフトウェア - Wireshark - NetworkMiner - Pythonライブラリ - Scapy - dpkt --- ## Ethernet:イーサネット - 物理的に隣接した相手にデータを送りつける --- ## イーサネット通信の中身 - 宛先MACアドレス:6オクテット - 送信元MACアドレス:6オクテット - 通信のタイプ:2オクテット - 通信の本体:最大1500オクテット程度 --- ## 実際のイーサネット通信の例 ``` 00 15 5d ff 8a 4d 00 15 5d 75 d9 e5 08 00 45 00 ... ^ ^ ^ ^通信本体 宛先MACアドレス 送信元MACアドレス 通信のタイプ(0800=IPv4) ``` --- ## MACアドレスとは? - ネットワークにアクセスする機器が必ず持っているアドレス - 長さは6オクテット - `00:15:5D:FF:8A:4D`のように1オクテットずつコンマで区切った16進数で表記するのが普通 - MACアドレスの先頭3オクテットは**Organizationally Unique Identifier(OUI)** - メーカーに対して割り振られる --- ## 通信のタイプ - イーサネット通信のパケットを受け取ったプログラムは、「通信のタイプ」の値に応じてそれに続くデータを別のプログラムに渡す - タイプが`0800`(IPv4)ならIPv4を処理しているプログラムにデータを渡す - タイプが`86dd`(IPv6)ならIPv6を処理しているプログラムにデータを渡す --- ## 演習① - 次の通信はramdosがHTTPリクエストを飛ばしたときのパケットキャプチャの冒頭です。 - Q1.1 この通信の送信元MACアドレスは? - Q1.2 ramdosがこのリクエストを飛ばすのに使ったNICの製造元はどこだと推測できる? - ヒント: https://uic.jp/mac/ などを使ってみましょう ``` c0 9f 51 8a 5d b0 a8 5e 45 5e 0a 86 86 dd 60 05... ``` --- ## IP - 物理的につながって居ない相手にデータを送りつける - イーサネットのヘッダは機器を経由するたびに付け外しされるが、IPのヘッダは大抵送信元から送信先まで同じものが付けっぱなし - たまに書き換えられることもあるけど --- ## IPは(たいてい)ステートレス - IPを扱うプログラムは、どんなパケットを送ったかは(基本的には)覚えなくて良い - 断片化させた場合とかフローラベルが付いている場合とか、一部例外はある - 覚えなくて良いというだけで、覚えてはいけない訳ではない - 「ログを残したい」などの理由で覚えている場合もあるにはある - IPで送られたパケットは、どのような状況で送られても同じように扱われる - 前のパケットがこうだったから次のパケットはこう扱う、みたいなことは基本的にはしない --- ## IPアドレス - IPv4のアドレスは192.168.0.1のように8ビットごとに区切って10進数で表記し、ドットで繋ぐ - IPv6のアドレスは`2001:0db8:85a3:0000:0000:8a2e:0370:7334`のように16ビットごとに区切って16進数で表記し、コロンで繋ぐ - ただし、各区切りの先頭の0は省略して良い - 上の例なら`2001:db8:85a3:0:0:8a2e:370:7334` - :0:は::に省略して良い - 上の例は`2001:db8:85a3::8a2e:370:7334`と表記できる - ただし`::`は2回使ってはならない(アドレスが一意でなくなってしまうので) --- ## IPv4 - 次のようなヘッダを持つ ![](https://md.trap.jp/uploads/upload_ec631a98de735547e39cd026da322bdd.png) --- ## IPv6 - 次のようなヘッダを持つ ![](https://md.trap.jp/uploads/upload_466d61ed031870c973d1afd4dc135c45.png) <!-- ## IPヘッダの中身 - バージョン - IPv4なら4、IPv6なら6 それはそう - ヘッダ長 - ヘッダの長さ(4オクテット単位) - IPv4なら普通は5だけど、拡張情報がヘッダに含まれる場合もっと長くなる - IPv6のヘッダは常に40オクテットなのでヘッダにこの情報は含まれない ## IPヘッダの中身 - トラフィッククラス - IPv6で追加された - 上位6ビットはパケットの分類用だが、めったに使われない - 下位2ビットは明示的輻輳通知用 - サービス種別 - 優先度の指示とか - あんまり使われていなかったのでIPv6ではフローラベルに移行された - フローラベル - 同じフローラベル・送信元アドレス・宛先アドレスを持つパケットは同じ経路で流すという決まりがある - パケットが並び替えられると困るときに使う ## IPヘッダの中身 - 全長・ペイロード長 - このパケットの長さ - 識別子 - パケットの長さの上限は環境によって異なる - 1450~1500バイトであることが多いけど、環境によって異なる - 上限が超えた場合パケットは分割される --> --- ## 演習問題 Q2.1 次のIPヘッダを持つパケットのTTLはいくら?(10進数で答えてね) `45 00 00 3c 00 00 40 00 33 06 34 9f 5d b8 d7 0e ac 1d 32 39` --- ## TCP:トランスミッションコントロールプロトコル - IPは目的地までデータを送りつける - 「だいたい送ってくれる」ぐらいのことしか保証されていない - IPができない(やらない)こと - 送られたデータが抜け漏れ無く確実に届くこと - 送られたデータが送られた順番に届くこと - 約1500バイトを超えるデータを送ること - これを解決するのがTCP --- ## TCPヘッダ ![](https://md.trap.jp/uploads/upload_afc0da7bd30cce540cf1ffbaed74b79c.png) --- ## TCPにはシーケンス番号がある - さっき挙げたIPの3つの困りごとを解決するための仕組み - 1500バイトぐらいごとに上位プロトコルの通信を区切る - 通信に番号を振っておく - 抜け漏れ対策:ある番号のパケットだけ届かなかったら、そのパケットは送り直す - 順番違い対策:パケットは番号順に並び替える --- ## ACKパケット - TCPではパケットを受け取ったら「受け取りました」という返事を返す - Acknowledgeしたときに送られるパケットなので、ACKパケットと呼ばれる - もし返事が来なかったら送ったパケット (or ACKパケット)が失われている、ということなのでパケットを送り直す --- ## 3ウェイハンドシェイク - TCPでは、接続の開始時に3ウェイハンドシェイクと呼ばれるやりとりを行う - 次のような手順で行われる: - 1. クライアント側がSYNパケットを送信する - 2. サーバー側がSYN ACKパケットを送信する - 3. クライアント側がACKパケットを送信する --- ## TCP接続の終了 - TCPでは、接続の終了時に4つのメッセージがやりとりされる 1. 片方がFINパケットを送信する 2. もう片方がACKパケットを送信する 3. もう片方がさらにFINパケットを送信する 4. 片方がACKパケットを送信する - 教科書的な説明は上の通りなんですが、現実には2と3はまとめてFIN ACKパケットとして送られることがほとんどです。 --- ## HTTP - リクエストとレスポンスでデータをやりとりする仕組み - リソースを読み取ったり作ったり書き換えたり消したりするやりとりができる - 「この動画投稿したいです」「200(投稿しました)」 - 「このユーザーのデータください」「404(そんな人はいません)」 - 「このメッセージ消したいです」「403(権限がありません)」 --- ## HTTP リクエストの構造 ![](https://md.trap.jp/uploads/upload_625a4df030169b9b5499010d70c3c240.png) --- ## HTTP レスポンスの構造 ![](https://md.trap.jp/uploads/upload_de64fadac74b22882f3fcebbc6e01526.png) --- ## Wireshark演習 --- <!-- ---------------- --> ![](https://md.trap.jp/uploads/upload_018faaedbc9a50a830b0e83c0013ab20.png =1x)![](https://md.trap.jp/uploads/upload_8d88c322a43800bfb389c40fbd22a820.png =1x)![](https://md.trap.jp/uploads/upload_89476f1012132d9a214c44aef2c60502.png =1x)![](https://md.trap.jp/uploads/upload_87c469f429a84148037d45f0e6ee906a.png =1x)![](https://md.trap.jp/uploads/upload_1ac1a2154c5bdfcfc403cf7373221f25.png =1x)![](https://md.trap.jp/uploads/upload_06bda748cb0c5c9f97c2ff876e744603.png =1x)![](https://md.trap.jp/uploads/upload_3d8ab53ce0a599be1c29aabc771c954e.png =1x)![](https://md.trap.jp/uploads/upload_343c3a3ef143f70e6c9cada088dd11cd.png =1x) <!-- ---------------- --> <style> /* text */ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p { font-family: "游ゴシック体", YuGothic, "游ゴシック Medium", "Yu Gothic Medium", "游ゴシック", "Yu Gothic", sans-serif; color: #2d4459; line-height: 1.8; letter-spacing: normal; text-shadow: none; word-wrap: break-word; } .text-color2 { color: #809ca6; } /* background */ .reveal { position: relative; background: #f2f2f2; } .reveal::before, .reveal::after { content: ''; position: absolute; height: 3vw; width: 3vw; background-image: url(https://md.trap.jp/uploads/upload_018faaedbc9a50a830b0e83c0013ab20.png); background-size: contain; z-index: 5; } .reveal::before { top: 1.5vh; left: 1.5vw; } .reveal::after { bottom: 1.5vh; right: 1.5vw; } .reveal .backgrounds { position: relative; } .reveal .backgrounds::before, .reveal .backgrounds::after { content: ''; position: absolute; height: 30vh; width: 30vw; background-image: url(https://md.trap.jp/uploads/upload_8d88c322a43800bfb389c40fbd22a820.png); background-repeat: no-repeat; background-size: contain; z-index: 5; } .reveal .backgrounds::before { top: 1.5vh; right: 1.5vw; background-position: bottom right; transform: rotate(0.5turn); } .reveal .backgrounds::after { bottom: 1.5vh; left: 1.5vw; background-position: bottom left; } .reveal .slides::before { content: ''; position: absolute; bottom: 0; right: 0; height: 5vh; width: 30vw; background-image: url(https://md.trap.jp/uploads/upload_87c469f429a84148037d45f0e6ee906a.png); background-repeat: no-repeat; background-size: contain; background-position: bottom right; z-index: 5; } /* header */ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { font-weight: bold; } .reveal h1 { font-size: 7vmin; padding: 0.1em 0; margin: 0.3em 3vw; border-top: 0.05em solid #66ebea; border-bottom: 0.05em solid #66ebea; } .reveal h2 { font-size: 5vmin; padding: 0.1em 0; margin: 0.3em auto; border-bottom: 0.05em solid #66ebea; width: calc(100% - 3em); min-width: fit-content; } .reveal h1, .reveal h2 { text-align: center; } .reveal .title-h1 { margin-top: calc(50vh - 7 * 1.8vmin - 55px); } /* other */ .reveal .subtitle { text-align: end; font-size: 2.5vmin; margin-right: 10vw; } .reveal ul > li { list-style: none; background-image: url(https://md.trap.jp/uploads/upload_1ac1a2154c5bdfcfc403cf7373221f25.png); background-repeat: no-repeat; background-position: 0 0.45em; background-size: 0.6em; padding-left: 1em; } .reveal mark { color: inherit; background: #ff0c; } .reveal .footnotes li, .reveal .footnotes li p { color: #809ca6; } .reveal .alert { padding: 20px; } .reveal h1 code, .reveal h2 code, .reveal h3 code, .reveal h4 code, .reveal h5 code, .reveal h6 code { font-size: inherit; } .reveal section > div { max-height: 88vh; overflow: hidden; } .reveal .slides > section.stack { padding: 20px 0; } /* ここからはコピーしたもの */ .reveal th {background: #DDD;} .reveal section img {background:none; border:none; box-shadow:none; max-width: 95%; max-height: 95%;} .reveal blockquote {width: 90%; padding: 0.5vw 3.0vw;} .reveal table {margin: 1.0vw auto;} .reveal code {line-height: 1.2;} .reveal p, .reveal li {padding: 0vw; margin: 0vw;} .reveal .box {margin: -0.5vw 1.5vw 2.0vw -1.5vw; padding: 0.5vw 1.5vw 0.5vw 1.5vw; background: #EEE; border-radius: 1.5vw;} /* table design */ .reveal table {background: #f5f5f5;} .reveal th {background: #444; color: #fff;} .reveal td {position: relative; transition: all 300ms;} .reveal tbody:hover td { color: transparent; text-shadow: 0 0 3px #aaa;} .reveal tbody:hover tr:hover td {color: #444; text-shadow: 0 1px 0 #fff;} /* blockquote design */ .reveal blockquote { width: 90%; padding: 0.5vw 0 0.5vw 6.0vw; font-style: italic; background: #f5f5f5; } .reveal blockquote:before{ position: absolute; top: 0.1vw; left: 1vw; content: "\f10d"; font-family: FontAwesome; color: #2980b9; font-size: 3.0vw; } /* font size */ .reveal h3 {font-size: 2.8vw;} .reveal h4 {font-size: 2.6vw;} .reveal h5 {font-size: 2.4vw;} .reveal h6 {font-size: 2.2vw;} .reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {font-size: 2.2vw;} .reveal code {font-size: 1.6vw;} /* new color */ .red {color: #EE6557;} .blue {color: #16A6B6;} /* split slide */ #right {left: -18.33%; text-align: left; float: left; width: 50%; z-index: -10;} #left {left: 31.25%; text-align: left; float: left; width: 50%; z-index: -10;} </style>
{"title":"CTF講習会 NetWork編","type":"slide","slideOptions":{"theme":"white","slideNumber":"c/t","center":true,"transition":"none","keyboard":true,"width":"93%","height":"100%"}}