狠狠撸

狠狠撸Share a Scribd company logo
大和セキュリティ勉強会
?笔测迟丑辞苍でパケット解析?
株式会社神戸デジタル?ラボ
長山哲也
アジェンダ
1.自己紹介
2.ネットワークの基礎
3.環境の使い方
4.Scapyでやれること
4-1.パケットの送受信
4-2.通信のスニッフィング
4-3.PCAPファイルの読み書き
5.エクササイズ
(参考)Scapyでその他できること
(参考) リンク集
(参考)Pythonのコーディング
1
1.自己紹介
長山哲也 from 奈良
株式会社神戸デジタル?ラボ
セキュリティソリューション事業部 所属
セキュリティコンサルタント(お悩み相談室)
Pythonが好き
Python製Webサービス(SaaS)提供
DJ?作曲者?リミキサー(Crystal Lakeのリミックス担当)
2
2.ネットワークの基礎[1/2]
イーサネットヘッダ イーサネットデータ(ペイロード)
IPヘッダ IPデータ(ペイロード)
TCPヘッダ
TCPデータ
(ペイロード)
3
階層化されたパケットにより、各レイヤで必要なデータが切り分けされている
レイヤを超える時にヘッダが書き換えられる
2.ネットワークの基礎[2/2]
4
L2スイッチ/ハブ
L3スイッチ/ルータ
端末
判例
L2スイッチに接続された
端末同士はイーサネット
フレームの送受信により
MACアドレスでの端末
指定をした通信が可能
L3スイッチを介す場合は、
L3スイッチ上でイーサネットヘッダが
書き換えられ、目的の端末までIP
アドレスを元にIPパケットを届ける
端末同士が共通のサービスを
利用して継続的にデータ授受
するために、ポートの指定とコネ
クションの接続をTCPパケットに
よって実現
L2スイッチやL3スイッチによってネットワークを構成
端末同士がコネクションを確立することで様々なデータの授受が可能
3.環境の使い方[1/3]
OS Ubuntu 18.04LTS
アカウント ユーザ名:ubuntu
PW:ubuntu
ツール Wireshark
Python
関連
Python 3.5.5、Scapy、
Jupyter、etc
ubuntu/ubuntuでログイン
コンソールにて「~/yamasec」に移動
「~/yamasec」にてPython 3.5.5を使用可
5
3.環境の使い方[2/3]
複数人が今回のVMを同じネットワーク内で利用するとMACアドレスがぶつかって、
うまく通信できなくなる可能性があるため、VM起動前にMACアドレスを更新しておくこと
6
3.環境の使い方[3/3]
プログラムを利用したネットワーク通信では、OSが勝手にRSTパケットを送信して、
うまく通信できない場合があるため、iptablesを利用して
Scapyを使う前にRSTパケットの抑止しておく
7
4.Scapyでやれること
4-1.パケットの送受信
(1)ICMPパケットの送信
(2)Tracerouteの実装
(3)Tracerouteの可視化
(4)ポートスキャン(SYNスキャン)
(5)TCP3ウェイハンドシェイク
(6)HTTP通信
4-2.通信のスニッフィング
(1)スニッフィング
(2)フィルタリング
4-3.PCAPファイルの読書
(1)通信のPCAPファイル化
(2) PCAPファイルの読み込み
8
4-1.パケットの送受信(1)ICMPパケットの送信
ネットワークレイヤ毎にプロトコルを定義し、スラッシュで区切ってパケットを作成
sr1メソッドはSendとResponseを1回ずつ行う
9
4-1.パケットの送受信(2)Tracerouteの実装
Tracrouteはメソッドが用意されている
10
4-1.パケットの送受信(3)Tracerouteの可視化
tracerouteメソッドの戻り値に付属するgraphメソッドを呼び出すだけ
11
4-1.パケットの送受信(4)ポートスキャン(SYNスキャン)
TCPメソッドではflagsによってSYNパケット、SYN-ACKパケット等を使い分け可能
12
4-1.パケットの送受信(5)TCP3ウェイハンドシェイク[1/3]
TCP通信は、通信相手の応答があってはじめて通信を開始する「コネクション型プロトコル」
データ転送を行う前にコネクションを確立することを「3ウェイハンドシェイク」と呼ぶ
13
1.SYN:クライアントから
接続の開始連絡
SYNフラグ:1
ACKフラグ:0
シーケンス番号:0
2.SYN-ACK:サーバから接続の
開始連絡
SYNフラグ:1
ACKフラグ:1
シーケンス番号:0
確認応答番号:1
3.ACK:コネクション確立の連絡
SYNフラグ:0
ACKフラグ:1
シーケンス番号:1
確認応答番号:1
4-1.パケットの送受信(5)TCP3ウェイハンドシェイク[2/3]
Scapyのコンソールのみでは操作しにくいので、ブラウザ上でインタラクティブに
Pythonコードを実行可能なJupyter notebookを利用
14
①
②
③
4-1.パケットの送受信(5)TCP3ウェイハンドシェイク[3/3]
15
Scapyコンソールとは違い、プログラムとしてScapyをimport
Pythonコードを記述したらRunボタンで実行、結果すぐ下に表示
4-1.パケットの送受信(6)HTTP通信
TCPコネクション確立に続いて、HTTP通信のGETリクエストを送信
通信が終わったらTCPコネクションの切断をした方が、不具合が少ない
16
4-2.通信のスニッフィング(1)
SniffメソッドによってtcpdumpやWiresharkのキャプチャ機能と同様のことが可能
17
途中で止めたいときはこのボタン
4-2.通信のスニッフィング(2)フィルタリング
sniffメソッドにfilterの引数を与えることで、特定のプロトコルやホストだけを監視可能
analyzeでもペイロードの状態を確認してprintさせるかどうか決めることも可能
18
4-3.PCAPファイルの読書(1)通信のPCAPファイル化
sniffメソッドで読み取った通信をwrpcapメソッドでPCAPファイル化することが可能
例では、ICMPパケットを流した状態で通信を読み取ってPCAPファイル化
作成したPCAPファイルは、Wiresharkでも読み込むことが可能
19
4-3.PCAPファイルの読書(2) PCAPファイルの読み込み
rdpcapメソッドでPCAPファイルを読み込むことが可能
読み込んだパケットはfor文で一つずつに切り分けて処理可能
getlayerメソッドでプロトコルを絞って処理することも可能
20
5.エクササイズ(1)ICMPトンネリングの解析
PCAPファイル「ptunnel.pcap」の解析
? ICMPトンネリング通信とは、ICMP通信のペイロード部に
TCP通信内容を記述してTCP通信を行う技術
? PCAPファイルは、ICMPトンネリング通信が行われた通信ログ
? ScapyでICMP通信のペイロードを取り出して、TCP通信に戻し、
通信内容の確認とフラグを見つけてください
? WireSharkとかでもpcapファイルを読めますが、
? スクリプトを書いて答えを探してください
? 答えはランダムな文字列ではなく、読める文章です
21
5.エクササイズ(2)TCPコバートの解析
22
PCAPファイル「tcp-covert.pcap」の解析
? TCPコバートとは実際に送付したいデータをTCP通信の中に紛れさせた通信
? PCAPファイルは、TCPコバートが行われたTCP通信のログ
? このPCAPファイルでTCPコバートを実現したソース
「https://bit.ly/2uDd30q」 ※ソース自体はC言語
? ソースを読みながらScapyでTCP通信からコバートされたデータを
見つけてください(コンパイルして動作させても良いです)。
? 答えはランダムな文字列ではなく、読める文章です
5.エクササイズ(3)その他のエクササイズ
エクササイズ(1),(2)の答えらしきもの:
https://github.com/Euphoricwavism/python_packet_analysis/blob
/master/Exercise.ipynb
ネットワーク解析チャレンジ:
https://www.malware-traffic-analysis.net/training-exercises.html
マルウェア通信のPCAPファイル:
https://www.netresec.com/index.ashx?page=PcapFiles
23
(参考)Scapyでその他できること(ver2.4.1ではきっと、、)
通信の3Dでの可視化、バイナリとの対応、ジオロケーション情報との対応 etc..
24
(参考) リンク集
Pythonのコーディング方法: Python Boot Camp テキスト
http://pycamp.pycon.jp/textbook/index.html
Scapyの使い方1:SANS Scapyチートシート
https://blogs.sans.org/pen-
testing/files/2016/04/ScapyCheatSheet_v0.2.pdf
Scapyの使い方2:公式ドキュメント
http://scapy.readthedocs.io/en/latest/index.html
25
(参考)Pythonのコーディング
26
a.Hello World
b.変数宣言
c.数値の扱い
d.文字列の扱い
e.リスト(配列)の扱い
f.辞書の扱い
g.if文
h.for文
i.関数
27
(参考)Pythonのコーディング a.Hello world
(参考)Pythonのコーディング b.変数宣言
28
? 宣言だけだと怒られる
? 代入=宣言
(参考)Pythonのコーディング c.数値の扱い
29
? 一気に2つの変数に
代入することも可能
? インクリメントは
「+=」で実施
(参考)Pythonのコーディング d.文字列の扱い
30
? シングルクォートも
ダブルクォートも同じ意味
? 文中にシングルクォートを
入れる場合は、
バックスラッシュをつける
(参考)Pythonのコーディング d.文字列の扱い
31
? 改行は?nか三重の
クォートで
? 文字列連結は+で可能
? 配列としても使用可能
(参考)Pythonのコーディング e.リスト(配列)の扱い
32
(参考)Pythonのコーディング f.辞書の扱い
33
? {’キー’:’値’}で定義
? [キー]で値抽出
? keys()でキー一覧取得
? Items()でキーと値の組み合わせ一覧取得
? 「キー in 変数」でキーの有無を確認
(参考)Pythonのコーディング g.if文
34
(参考)Pythonのコーディング g.if文
35
( )
( )
( )
(参考)Pythonのコーディング g.if文
36
( )
( )
( )
(参考)Pythonのコーディング h.for文
37
( )
(参考)Pythonのコーディング h.for文
38
( )
(参考)Pythonのコーディング h.for文
39
( )
(参考)Pythonのコーディング h.for文
40
( )
(参考)Pythonのコーディング h.for文
41
( )
(参考)Pythonのコーディング i.関数
42
? 「def 関数名(引数):」で宣言
? 「return 戻り値」で戻り値指定
? 定義した関数は
「関数名(引数)」で呼び出し可能
@Euphoricwavism
お疲れ様でした!
43

More Related Content

笔测迟丑辞苍でパケット解析