2020年度セキュリティキャンプ応募課題

Enigamictです。今回はセキュリティキャンプに参加するに当たって応募した課題晒しします。応募したゼミはZ4  「独自セキュリティ機構を追加可能なモジューラブルなソフトウェアルータの開発」です

 

 

Z4.1.調査課題: ネットワークやパケットに関するプログラミングの経験や動機

 

----------------------------------------------------------------------------------------------------------------------

私はPythonで作られているScapyと言われるパケット操作ツールに興味を持ちPythonでネットワークプログラミングを始めました。
最初はソケット通信を使ったミニチャットツールを制作したりしました、今ではraw_socketを使ってICMPやUDPをScapyのような形で実装したり、最近ではPCAP、PCAPNGファイルのパーサーを自作している途中です。
今後はパケットの処理基盤、IPv6通信プロトコルについてを研究していきたいです。
私は今回の講義で作りたいものとして独自のルーティングプロトコルを作りたいと思っています。ルーティングプロトコルTCPUDPとはまた違い、直接ネットワークを操作出来るロマンを感じます。
ルーティングプロトコルを作って研究することによりさらなる通信手順が理解でき、ルーティングプロトコルはネットワークをもっと高速化、安定化させる必要性、将来性を感じます。

----------------------------------------------------------------------------------------------------------------------

 

ここはやってきたことをひたすらに書いたのとやりたいことをひたすら書きました。講義概要でルーティングプロトコル作れるって書いていたのでマジかよ!と思いルーティングプロトコルに対しての愛を語りました。

 

Z4.2.調査課題: ルーティングプロトコルとSDN

----------------------------------------------------------------------------------------------------------------------

ルーティングプロトコルは自律システムでダイナミックルーティングを行うために利用されるIGP(Interior Gateway Protocol)
そして自律システム間の経路制御を行うものがEGP(Exterior Gateway Protocol)

ルーティングプロトコルは二つの階層に分かれており、EGPが無ければ外部の組織と通信は出来ない、IGPが無ければ組織内部との通信が出来なくなることが分かります。
IGPには距離ベクトル型ルーティングプロトコルのRIP(Routing Information Protocol)やリンク状態型ルーティングプロトコルのOSPF(Open Shortest Path First)などが挙げられます。
EGPでは経路ベクトル型のルーティングプロトコルBGP(Border Gateway Protocol)になります。

ここで出てくる距離ベクトル型やリンク状態型や経路ベクトル型というのは経路制御のアルゴリズムのことになります。
距離ベクトル型は距離と方向によって目的のホスト、ネットワークの位置を決定するもの。
リンク状態型はルーターがネットワーク全体の接続状況を理解して経路制御表を作成し、目的のホスト、ネットワークの位置を決定するものとなります。
距離ベクトル型は処理が簡単なものであるが書いた通り距離と向きの情報しかなくてネットワークの構造が複雑なものになってしまうと経路制御情報が安定するまで時間がかかることが分かっています。
リンク状態型はすべてのルータが同じ情報を持つことになるため、各ルータが経路制御情報を早く同期させることに専念すればネットワークが複雑になっても素早く処理し安定した経路制御を行うことが出来ることが可能になります。
しかしネットワークトポロジーの計算がかなり複雑なため、トポロジー情報の管理や処理を行うために高いCPU能力が必要になることが分かっています。
経路ベクトル型は相手の自律システム(Autonomous System)に通信が到達するまでに通過する自律システム番号(AS番号)のリストを作り経路選択を行うものを言います。

SDN(Software Defined Network)とは単一のソフトウェアによりネットワーク機器を集中的に制御し
ネットワーク構成や設定などを柔軟に動的に変更することが可能になる技術の総称を指します。
SDNでは機器のデータ転送機能と制御機能を分離し、制御機能のことをSDNコントローラといいます。

SDNコントローラはソフトウェアであり、SDNコントローラで一か所の集中管理をすることにより、物理的な変更なしでどの機器にどのような動作をさせるのか柔軟に設定することが可能となります。
制御機能の事をコントロールプレーンといい、データ転送機能のことはデータプレーンといいます。
データプレーンでは受信したデータの転送処理を行い、コントロールプレーンでは、データプレーンにてデータの転送処理をするために必要な経路情報の作成など複雑な制御を行います。
往来のネットワークでは各ネットワーク機器にデータプレーンとコントロールプレーンが存在するため各ネットワーク機器に設定する必要がありました。
SDNでは各ネットワーク機器に存在していたコントロールプレーンをSDNコントローラにて集中管理するため個別に設定する必要は無くなります。
SDNコントローラによって目的に応じて複数の仮想的なネットワークを構築することが出来るが、他のVPNやVLANといったネットワーク仮想的化技術とは違うためソフトウェア定義ネットワークと呼ばれることとなります。

このSDNを実現させる技術の一つであるのがOpenFlowといいます、これはSDNの方式であるホップバイホップ方式、オーバーレイ方式の二つの一つであるホップバイホップ方式が前提で作られているプロトコルです。
SDNはこのようにソフトウェアによるネットワーク機器を集中的に制御させることを可能としました、しかしこのOpenFlowのネットワークインフラを導入するためには構成する全てのネットワーク機器を比較的コストの高いOpenFlow対応機器に新規導入する必要があるなど
複雑なネットワーク制御をするためには複雑なフロールールが必要となるため機器には負荷がかかってしまうことも懸念されます。
しかし、サーバ仮想化技術を使ってVM上にルータなどの機能を搭載させ、機器間をどのようにパケット転送するべきなのかOpenFlowやオーバーレイなどを用いて制御することで負荷を軽減させることが可能になることが分かっています。
この考え方はNFV(Network Function Virtualization)、SFC(Service Function Chaining)と呼ばれる考え方に繋がります。

--------------------------------------------------------------------------------------------------------------------- 

 

ルーティングプロトコルとSDNついてここまで調べたぜ…みたいな感じで書きました

 

Z4.3. 調査課題: パケット転送技術 (DPDK/XDP/etc...)

----------------------------------------------------------------------------------------------------------------------

DPDKはユーザーランドのアプリケーションがNICに直接的にアクセスすることで高速処理を可能としています。つまりカーネル機能をバイパスした専用機能を提供しています。
カーネルは最低限の情報で制御することが可能となっており、ハードウェアなどを直接制御出来るライブラリやネットワークドライバをDPDKが用意しているということになります。
問題点としてはカーネルの機能はバイパスされるため、アプリケーションに対してカーネルの利用した操作が行うことが不可能となる。例:ゲームのチート対策に利用していたカーネルの機能が使えなくなるなど。
XDPはNICに最も一番近い場所でeBPF(extended Berkeley Packet Filter)を実行し、パケット処理を行っています。eBPFは作成したプログラムをカーネルに送り込みカーネル内部の仮想マシンで実行することが出来る機能になります。
違いとしてはDPDKはカーネルをバイパスしDPDKから提供されたもので処理しているのに対し、XDPはeBPFを使いネイティブなパケット処理を可能としています。 

----------------------------------------------------------------------------------------------------------------------

 

ここは難しかったです。色々調べて書き上げました

 

# Z.4.4. 調査課題: 希望調査

----------------------------------------------------------------------------------------------------------------------

興味のあること、やっていることとしてはネットワークプログラミング、パケット操作プログラムの作成、ファイルパーサーの作成、パケットキャプチャツールの作成です。
受け取ったパケットをヘッダ構造体にはめこむのが好きです。WireSharkを使いながらパケットを眺めたり、パケットのヘッダを見て定義されている部分を見ながら考えたりするのも好きです。
私は今回の講義で、ネットワークのさらなる部分についてを学び、実装していきさらなる知識を身に着けたいです。

----------------------------------------------------------------------------------------------------------------------

 

思ってることをそのまま書きました。

 

# Z.4.5. 演習課題: Virtual Network Playground

----------------------------------------------------------------------------------------------------------------------

環境 VirtualBox(Ubuntu 18.04)

まずNetworknamespaceの作成を行います。

sudo ip netns add r1
sudo ip netns add r3
sudo ip netns add r2

それぞれのインタフェースの作成を行います。

sudo ip link add name r1-veth1 type veth peer name r2-veth1
sudo ip link add name r2-veth2 type veth peer name r3-veth1

インターフェースとNamespaceを結び付けます。

sudo ip link set r1-veth1 netns r1
sudo ip link set r2-veth1 netns r2
sudo ip link set r2-veth2 netns r2
sudo ip link set r3-veth1 netns r3


割り当てたインターフェースにIPアドレスを定義します。

sudo ip netns exec r1 ip addr add 10.1.0.1/24 dev r1-veth1
sudo ip netns exec r2 ip addr add 10.1.0.2/24 dev r2-veth1
sudo ip netns exec r2 ip addr add 10.2.0.1/24 dev r2-veth2
sudo ip netns exec r3 ip addr add 10.2.0.2/24 dev r3-veth1

定義したすべてのインターフェースを起動させます。

sudo ip netns exec r1 ip link set r1-veth1 up
sudo ip netns exec r2 ip link set r2-veth1 up
sudo ip netns exec r2 ip link set r2-veth2 up
sudo ip netns exec r3 ip link set r3-veth1 up
sudo ip netns exec r1 ip link set lo up
sudo ip netns exec r2 ip link set lo up
sudo ip netns exec r3 ip link set lo up

r1、r3のデフォルトゲートウェイを設定し、ルータのルーティングを有効化します。
sudo ip netns exec r1 ip route add 0.0.0.0/0 via 10.1.0.2
sudo ip netns exec r3 ip route add 0.0.0.0/0 via 10.2.0.1
sudo ip netns exec r2 sysctl -w net.ipv4.ip_forward=1

最後に通信テストをします。
sudo ip netns exec r1 tracepath -n 10.2.0.2


以上の手順を踏み通信が成功しました。

----------------------------------------------------------------------------------------------------------------------

初めて見た時はこんな機能あるのか!という感じでした。素晴らしい機能だと思います。

 

## Z4.6. 演習課題: パケット解析プログラミング

----------------------------------------------------------------------------------------------------------------------

from scapy.all import *
import io
from PIL import Image


image_packet = b''
packet=rdpcap("000084577.pcap")
for i in range(0, 40, 2):
  image_packet += packet[i]['Raw'].load
img = Image.open(io.BytesIO(image_packet))
img.save("flag.jpg")

----------------------------------------------------------------------------------------------------------------------

pcapファイルから謎を解け!みたいな感じでした。中にはPINGでのやりとりが含まれたパケットデータでした。リクエスト、リプライのパケットデータを見てみるとICMPのデータ部に画像ファイルっぽいバイナリが!

リクエストとリプライはどちらも同じデータを送受信していたのであとはリクエストかリプライのICMPのデータ部を抜き取り画像バイナリを作り上げて、画像バイナリから画像を作ったら完成です。

この課題はとても面白かったです。

 

以上が応募課題となります。