スライド 1

Similar documents
取扱説明書 -詳細版- 液晶プロジェクター CP-AW3019WNJ

HITACHI 液晶プロジェクター CP-AX3505J/CP-AW3005J 取扱説明書 -詳細版- 【技術情報編】

HITACHI 液晶プロジェクター CP-EX301NJ/CP-EW301NJ 取扱説明書 -詳細版- 【技術情報編】 日本語

日立液晶プロジェクター CP-AW2519NJ 取扱説明書- 詳細版-

Netfilter Linux Kernel IPv4 IPv6 Ethernet iptables IPv4 ip6tables IPv6 ebtables Ethernet API Kernel

補足情報

IPsec徹底入門

WannaCry とは WannaCry はランサムウェアの一種 WannaCry は ランサムウェアと呼ばれる身代金要求型のマルウェアです WannaCryptor WanaCrypt Wcry といった呼ばれ方もします 一般的にランサムウェアに感染すると 以下のようなデータを使用できないように暗

シナリオ:サイトツーサイト VPN の設定

昨年度までの研究紹介 および 研究計画

<4D F736F F F696E74202D E656D6F73837D836C815B C B CC90DA91B182CC8E DD82F0979D89F082B582E682A F38DFC E >

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

Microsoft Word - SSL-VPN接続サービスの使い方

9.pdf


あさひ indd

アプリケーション インスペクションの特別なアクション(インスペクション ポリシー マップ)

007 0 ue ue b 6666 D

パケットモニター (Wireshark) の使い方 第 1 版 1.Wireshark とは ネットワーク上 (LAN ケーブルに流れている ) のパケットを取得して その中の情報を画面に表示するソフトウェア (LAN アナライザーまたはパケットモニター ) の 1 つに Wiresh

LAN Control Document

Cisco CSS HTTP キープアライブと ColdFusion サーバの連携


【注意事項】RXファミリ 組み込み用TCP/IP M3S-T4-Tiny

IPv6 リンクローカル アドレスについて

IPSEC(Si-RG)

MIRACLE LoadBalancerを使用したネットワーク構成と注意点

TCP_BP3591 の説明 V /03/28 ROHM 社製 WIFi モジュール BP3591 を使用して 無線 LAN により TCP/IP 通信を行うプログラムです 簡単な文字列によるコマンド ( 例 : LED0 ON ) を受信して LED の ON/OFF を行います 受

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Oracle DatabaseとIPv6 Statement of Direction

AquesTalk プログラミングガイド

Ethernet 開発支援ツール ACCEL ti2k (LastUpdate Mar 1, 2019) 概要ターミナルツール (1) TcpTermS.exe ターミナルツール (2) TcpTermM.exe ターミナルツール (3) UdpTermS.exe ターミナルツール (

SDC_SDIO_STM32F4 の説明 2013/09/17 SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです FAT でファイルアクセスするために FatFs( 汎用 FAT ファイルシステム モジュール ) を使用しています VCP(USB 仮想 C

bitvisor_summit.pptx

ユーティリティ 管理番号 内容 対象バージョン 157 管理情報バッチ登録コマンド (utliupdt) のメッセージ出力に対し リダイレクトまたはパイプを使用すると メッセージが途中までしか出 力されないことがある 267 転送集計コマンド (utllogcnt) でファイル ID とホスト名の組

TFTP serverの実装

1. ネットワーク経由でダウンロードする場合の注意事項 ダウンロード作業における確認事項 PC 上にファイアウォールの設定がされている場合は 必ずファイアウォールを無効にしてください また ウイルス検知ソフトウェアが起動している場合は 一旦その機能を無効にしてください プリンターは必ず停止状態 (

FileCapsule Slate ヘルプファイル

人工知能入門

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

USBメモリドングル説明書

目次 1. 概要 動作環境

Microsoft PowerPoint - CproNt02.ppt [互換モード]

取扱説明書 [F-12C]

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

形B5Z 画像型人感センサ(HVC-F) コマンド仕様書

VPN 接続の設定

スライド 1

Real4Dumps Real4dumps - Real Exam Dumps for IT Certification Exams

BizBrowser SmartDevice Android開発用スタートアップガイド

第1回 ネットワークとは

Nios II - PIO を使用した I2C-Bus (2ワイヤ)マスタの実装

Microsoft Word - JDBC検証 docx

‚å™J‚å−w“LŁñ›ÄP1-7_7/4

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

AquesTalk Win Manual

p_network-management_old-access_ras_faq_radius2.xlsx

無線LAN JRL-710/720シリーズ ファームウェアバージョンアップマニュアル 第2.1版


AquesTalk for WinCE プログラミングガイド

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

パススルー IPSecトンネル インターフェイスに AVC トラフィックを有効に する 回避策

サイボウズ Office「社外からアクセス」

電子13-06 エネメータ専用ソフト SAVER CAST for EneMeter Ver3.00設定方法.ppt

Microsoft PowerPoint - IPsec徹底入門.ppt

平成18年度電気関係学会東海支部連合大会

Transcription:

1 PacSec 2008 Conference Inside "Winnyp" - Winnypの内部動作とネットワーククローリングシステムの全貌 株式会社フォティーンフォティ技術研究所 http://www.fourteenforty.jp シニアソフトウェアエンジニア石山智祥

2 はじめに Winnyp とは 情報漏えいや著作権法違反などで社会問題となった Winny を改造した P2P 型ファイル交換ソフト Winnyp は Winny との互換性を持ち 設定を行うことで Winny との通信を行うことができる Winnyp 単体では 暗号鍵生成処理が Winny に比べて複雑になっている 今まで Winnyp を解析したという報告はあがっていない 今回は Winnyp の暗号アルゴリズムについての解析結果と クローリングシステム (WinnypRadar) の概要を報告

3 Agenda 1. Winnyp の内部動作 2. 匿名 P2P アプリケーションの静的解析アプローチ 3. WinnypRadar Winnyp ネットワーククローラ -

4 int packet_analysis(gddconfig *gddc,unsigned char *packet,unsigned long length) { struct ip *ip_header; /* IP header */ struct tcphdr *tcp_header; /* TCP header */ char *tcp_data; /* TCP data */ struct in_addr addr; /* IP address */ char sourceip[16]; /* Source IP address */ char destip[16]; /* Destination IP address */ unsigned short sourceport; /* Source Port */ unsigned short destport; /* Destination Port */ unsigned long len_data; /* Length of data part */ unsigned long iph_len; /* Length of IP header */ unsigned long tcph_len; /* Length of TCP header */ unsigned long sequence; /* Expected sequence */ int portindex; /* Indexnumber of port list */ int direction; /* Packet direction */ unsigned char logtype; /* Log type */ CONN_LIST *bcl,*ncl; /* Connection table list */ CONN_LIST *t; /* Temporary connection list */ static char datestr[512]; /* Buffer to store datetime */ time_t timeval; struct tm *timep=null; char *timesp=null; char *c; 1. Winnyp の静的解析 /* Get pointer of IP header and check length of IP */ if (length-size_of_ethhdr < MINSIZE_IP+MINSIZE_TCP) return(0); ip_header = (struct ip *)(packet+size_of_ethhdr); if (ip_header->ip_p!=ipproto_tcp ip_header->ip_v!=4) return(0); iph_len = ((unsigned long)(ip_header->ip_hl))*4; if (iph_len<minsize_ip) return(0); if ((unsigned long)ntohs(ip_header->ip_len) < MINSIZE_IP+MINSIZE_TCP) return(0); if ((unsigned long)ntohs(ip_header->ip_len) > length-size_of_ethhdr){ return(0); } /* Get pointer of TCP header and check length of TCP */ tcp_header = (struct tcphdr *)((char *)ip_header+iph_len); tcph_len = ((unsigned long)(tcp_header->th_off))*4; tcp_data = (char *)tcp_header+tcph_len; if (tcph_len<minsize_tcp) return(0); /* Get other parameter in TCP/IP header */ if ((long)ntohs(ip_header->ip_len)-(long)iph_len-(long)tcph_len<0) return(0); len_data = (unsigned long)ntohs(ip_header->ip_len) -iph_len-tcph_len; sourceport = ntohs(tcp_header->th_sport); destport = ntohs(tcp_header->th_dport); memcpy(&addr,&(ip_header->ip_src),sizeof(struct in_addr)); strcpy(sourceip,(char *)inet_ntoa(addr)); memcpy(&addr,&(ip_header->ip_dst),sizeof(struct in_addr)); strcpy(destip,(char *)inet_ntoa(addr)); if (!strcmp(sourceip,destip)) return(0); 00001B70 FF 15 F0 11 00 01 E9 CC 03 00 00 E8 7C 1C 00 00... 鯲... 閖... 00001B80 33 F6 56 E8 B1 FC FF FF 85 C0 0F 84 B7 03 00 00 3 雎....... 00001B90 56 6A 02 FF 35 6C 80 00 01 FF 35 D0 87 00 01 FF Vj..5l...5ミ... 00001BA0 15 CC 11 00 01 85 C0 75 1D 68 10 10 00 00 FF 35. フ... u.h...5 00001BB0 50 80 00 01 FF 35 44 80 00 01 FF 35 D0 87 00 01 P...5D...5ミ... 00001BC0 FF 15 04 12 00 01 FF 35 D0 87 00 01 FF 15 2C 12...5ミ...,. 00001BD0 00 01 FF 35 D4 8B 00 01 FF 15 58 10 00 01 E9 64...5ヤ...X... 馘 00001BE0 03 00 00 83 FE 1A 77 47 0F 84 59 03 00 00 83 FE...wG.Ш... 00001BF0 11 0F 85 16 01 00 00 33 F6 39 35 E8 87 00 01 74...3.95 閾..t 00001C00 22 8B 3D 28 12 00 01 56 FF D7 56 FF D7 68 00 10 ".=(...V. ラV. ラh.. 00001C10 00 00 FF 35 50 80 00 01 FF 35 88 80 00 01 E9 7D...5P...5.. 驀 00001C20 02 00 00 6A 01 E8 0F FC FF FF E9 1A 03 00 00 8B...j... 急 00001C30 7D 14 B8 11 01 00 00 3B F0 0F 87 8B 00 00 00 3B. ク...;.....; 00001C40 F0 0F 84 16 02 00 00 83 FE 1C 0F 85 BD 00 00 00...... 00001C50 33 F6 39 75 10 74 2F A1 EC 87 00 01 8B 0D F0 87 3.9u.t/... 00001C60 00 01 3B C6 75 08 3B CE 0F 84 D9 02 00 00 8B 3D..; ニu.; ホ....= 00001C70 14 12 00 01 51 50 68 B1 00 00 00 FF 35 D4 87 00...QPhア...5ヤ.. 00001C80 01 E9 56 01 00 00 8B 3D 14 12 00 01 68 F0 87 00. 餬...=...h. 00001C90 01 68 EC 87 00 01 68 B0 00 00 00 FF 35 D4 87 00.h..h ー...5ヤ.. 00001CA0 01 FF D7 A1 EC 87 00 01 8B 0D F0 87 00 01 3B C1.. ラ.....; チ 00001CB0 75 11 89 35 EC 87 00 01 89 35 F0 87 00 01 E9 84 u..5...5.. 驗 00001CC0 02 00 00 51 50 E9 07 01 00 00 8B CE B8 12 01 00...QP... 勤ク... 00001CD0 00 2B C8 0F 84 3C 02 00 00 83 E9 04 0F 84 29 02.+ ネ..<......). 00001CE0 00 00 49 0F 84 F9 01 00 00 81 E9 1C 01 00 00 0F..I....... 00001CF0 84 E0 01 00 00 81 E9 E6 00 00 00 0F 84 3D 01 00......=.. 00001D00 00 81 E9 E8 7C 00 00 0F 84 02 01 00 00 3B 35 5C. 閖...;5 00001D10 88 00 01 0F 85 EE 00 00 00 8B 45 14 8B 48 0C 8B...... 畿. 稀. 驚 00001D20 C1 8B D1 F7 D0 C1 EA 02 83 E0 01 83 E2 01 F6 C1 錦 チ....

Winnyp の動作概要 Winnyp は Winny.exe を改造することよって作成された P2P ファイル共有ソフト Winny と互換性を持ち Winny プロトコルを使用しているが パケットの暗号アルゴリズムに独自のアルゴリズムを使用している Winny プロトコル Winnyp アルゴリズムで暗号化 5

6 Winnyp の動作概要 Winnyp は Winny の実行ファイルに対して 独自に作成した Winnyp.dll を読み込ませることにより動作する 修正したファイルからは Winnyp.dll の init 関数のみを呼び出すようになっている

7 Winnyp の動作概要 Winnyp.exe から Winnyp.dll の init 関数をコールするために Winny に実装されいていた関数が削除されている

8 Winnyp の初期化処理 Winnyp 専用の設定ファイルを読み込み (disper.ini) 暗号鍵生成処理で使用するパラメータの生成 ( 固定値が生成 ) パケット送信時に使用するパラメータ生成 Winnyp.exe のコード領域へのパッチ処理

Winnyp の初期化処理 Winnyp.exe へのパッチ処理では 約 200 箇所の書き換え処理を実行 書き換え処理の大半は 参照する文字列の変更 例 ) Noderef.txt Noderefp.txt など 9

10 Winnyp の暗号鍵生成処理 Winny では 暗号鍵生成処理が簡単だったため (RC4 の初期化処理 ) 解析を行うことで簡単に暗号鍵生成処理を解明することができた Winnyp では パケットの暗号アルゴリズムとして RC4 を採用しているが 暗号鍵生成処理に複数の暗号アルゴリズムを使用し解析が困難になっている Winnyp 暗号鍵生成処理????? Winny 暗号鍵生成処理 RC4

11 Winnyp の暗号鍵生成処理 - 全体像 - Winnyp の暗号鍵生成処理メインルーチン 長い処理が複数続いていて複雑になっている

12 Winnyp の暗号鍵生成処理 - 全体像 - Winnyp の暗号鍵生成処理を処理ブロックごとに流れを図式化 Winny の場合の暗号鍵生成処理に比比べて複雑になっている

13 Winnyp の暗号鍵生成処理 - Stage 1-4byte SEED 固定値 4byte DES 128byte 独自アルゴリズム 1 24byte 独自アルゴリズム 2 92byte 64byte MD5 16byte

14 Winnyp の暗号鍵生成処理 - Stage 2-16byte 64byte CAST 124byte 独自アルゴリズム 3 72byte SHA1 20byte

15 Winnyp の暗号鍵生成処理 - Stage 3-20byte 1-31byte 独自アルゴリズム 4 固定値 256byte RC4 256byte 暗号鍵

16 Winnyp のパケット送信処理 Winnyp のパケット送信処理では 初期化時に生成したデータを使用して Winny パケットの後にダミーデータを付加する 暗号鍵の生成アルゴリズムは Winnyp の設定ファイルにより選択される (Winny 用なのか Winnyp 用なのか ) ダミーデータを付加するのは 接続確立, 切断時に送信されるいくつかのコマンドパケットのみ データ長 (4byte) データ部 データ長 (4byte) データ部ダミーデータ

17 Winnyp のパケット送信処理 Winnyp のダミーデータが付加された初期パケット

18 Winnyp のパケット受信処理 Winnyp のパケット受信処理では 初期パケット受信時に 3 つの暗号鍵を生成する (Winny v2.0b7.1, Winnyp v2.1b7.27, Winnyp v2.1b7.28) それぞれの暗号鍵を使用して接続ノードのバージョンを特定 これらの処理により 複数バージョンのノードとの接続が可能 v2.0b7.1 暗号鍵 v2.1b7.27 暗号鍵 v2.0b7.28 暗号鍵 Winnyp Winny/Winnyp

19 Winnyp の接続ノード特定処理 特定処理では 受信パケットの先頭 5byte を復号する 復号したデータに対していくつかのチェックを行う チェック1 チェック2 チェック3 チェック4 長さの部分が0 以上長さの部分が131,072 以下長さの部分 +4が受信パケット長以下コマンド番号が100 以下 チェックがすべて成功した場合 接続ノードの特定ができたと判定する 失敗した場合は 別の暗号鍵を使用して再度復号してチェックする

20 int packet_analysis(gddconfig *gddc,unsigned char *packet,unsigned long length) { struct ip *ip_header; /* IP header */ struct tcphdr *tcp_header; /* TCP header */ char *tcp_data; /* TCP data */ struct in_addr addr; /* IP address */ char sourceip[16]; /* Source IP address */ char destip[16]; /* Destination IP address */ unsigned short sourceport; /* Source Port */ unsigned short destport; /* Destination Port */ unsigned long len_data; /* Length of data part */ unsigned long iph_len; /* Length of IP header */ unsigned long tcph_len; /* Length of TCP header */ unsigned long sequence; /* Expected sequence */ int portindex; /* Indexnumber of port list */ int direction; /* Packet direction */ unsigned char logtype; /* Log type */ CONN_LIST *bcl,*ncl; ムの静的解析 /* Connection table list */ CONN_LIST *t; /* Temporary connection list */ static char datestr[512]; /* Buffer to store datetime */ time_t timeval; struct tm *timep=null; char *timesp=null; char *c; 2. 匿名 P2P ファイル共有システ /* Get pointer of IP header and check length of IP */ if (length-size_of_ethhdr < MINSIZE_IP+MINSIZE_TCP) return(0); ip_header = (struct ip *)(packet+size_of_ethhdr); if (ip_header->ip_p!=ipproto_tcp ip_header->ip_v!=4) return(0); iph_len = ((unsigned long)(ip_header->ip_hl))*4; if (iph_len<minsize_ip) return(0); if ((unsigned long)ntohs(ip_header->ip_len) < MINSIZE_IP+MINSIZE_TCP) return(0); if ((unsigned long)ntohs(ip_header->ip_len) > length-size_of_ethhdr){ return(0); } /* Get pointer of TCP header and check length of TCP */ tcp_header = (struct tcphdr *)((char *)ip_header+iph_len); tcph_len = ((unsigned long)(tcp_header->th_off))*4; tcp_data = (char *)tcp_header+tcph_len; if (tcph_len<minsize_tcp) return(0); /* Get other parameter in TCP/IP header */ if ((long)ntohs(ip_header->ip_len)-(long)iph_len-(long)tcph_len<0) return(0); len_data = (unsigned long)ntohs(ip_header->ip_len) -iph_len-tcph_len; sourceport = ntohs(tcp_header->th_sport); destport = ntohs(tcp_header->th_dport); memcpy(&addr,&(ip_header->ip_src),sizeof(struct in_addr)); strcpy(sourceip,(char *)inet_ntoa(addr)); memcpy(&addr,&(ip_header->ip_dst),sizeof(struct in_addr)); strcpy(destip,(char *)inet_ntoa(addr)); if (!strcmp(sourceip,destip)) return(0); 00001B70 FF 15 F0 11 00 01 E9 CC 03 00 00 E8 7C 1C 00 00... 鯲... 閖... 00001B80 33 F6 56 E8 B1 FC FF FF 85 C0 0F 84 B7 03 00 00 3 雎....... 00001B90 56 6A 02 FF 35 6C 80 00 01 FF 35 D0 87 00 01 FF Vj..5l...5ミ... 00001BA0 15 CC 11 00 01 85 C0 75 1D 68 10 10 00 00 FF 35. フ... u.h...5 00001BB0 50 80 00 01 FF 35 44 80 00 01 FF 35 D0 87 00 01 P...5D...5ミ... 00001BC0 FF 15 04 12 00 01 FF 35 D0 87 00 01 FF 15 2C 12...5ミ...,. 00001BD0 00 01 FF 35 D4 8B 00 01 FF 15 58 10 00 01 E9 64...5ヤ...X... 馘 00001BE0 03 00 00 83 FE 1A 77 47 0F 84 59 03 00 00 83 FE...wG.Ш... 00001BF0 11 0F 85 16 01 00 00 33 F6 39 35 E8 87 00 01 74...3.95 閾..t 00001C00 22 8B 3D 28 12 00 01 56 FF D7 56 FF D7 68 00 10 ".=(...V. ラV. ラh.. 00001C10 00 00 FF 35 50 80 00 01 FF 35 88 80 00 01 E9 7D...5P...5.. 驀 00001C20 02 00 00 6A 01 E8 0F FC FF FF E9 1A 03 00 00 8B...j... 急 00001C30 7D 14 B8 11 01 00 00 3B F0 0F 87 8B 00 00 00 3B. ク...;.....; 00001C40 F0 0F 84 16 02 00 00 83 FE 1C 0F 85 BD 00 00 00...... 00001C50 33 F6 39 75 10 74 2F A1 EC 87 00 01 8B 0D F0 87 3.9u.t/... 00001C60 00 01 3B C6 75 08 3B CE 0F 84 D9 02 00 00 8B 3D..; ニu.; ホ....= 00001C70 14 12 00 01 51 50 68 B1 00 00 00 FF 35 D4 87 00...QPhア...5ヤ.. 00001C80 01 E9 56 01 00 00 8B 3D 14 12 00 01 68 F0 87 00. 餬...=...h. 00001C90 01 68 EC 87 00 01 68 B0 00 00 00 FF 35 D4 87 00.h..h ー...5ヤ.. 00001CA0 01 FF D7 A1 EC 87 00 01 8B 0D F0 87 00 01 3B C1.. ラ.....; チ 00001CB0 75 11 89 35 EC 87 00 01 89 35 F0 87 00 01 E9 84 u..5...5.. 驗 00001CC0 02 00 00 51 50 E9 07 01 00 00 8B CE B8 12 01 00...QP... 勤ク... 00001CD0 00 2B C8 0F 84 3C 02 00 00 83 E9 04 0F 84 29 02.+ ネ..<......). 00001CE0 00 00 49 0F 84 F9 01 00 00 81 E9 1C 01 00 00 0F..I....... 00001CF0 84 E0 01 00 00 81 E9 E6 00 00 00 0F 84 3D 01 00......=.. 00001D00 00 81 E9 E8 7C 00 00 0F 84 02 01 00 00 3B 35 5C. 閖...;5 00001D10 88 00 01 0F 85 EE 00 00 00 8B 45 14 8B 48 0C 8B...... 畿. 稀. 驚 00001D20 C1 8B D1 F7 D0 C1 EA 02 83 E0 01 83 E2 01 F6 C1 錦 チ....

解析環境の構築 通常のネットワークに P2P アプリケーションを接続した場合 コネクションが多く 解析が困難 そのため 1 対 1 で通信を行うような環境を構築 インターネットとは切り離した環境 解析環境 接続ノード 21

22 デバッガ対策 難読化の回避 匿名 P2P アプリケーションには 匿名性を高めるためデバッグ対策や難読化が施されている これらを回避するため デバッガで起動させるのではなく P2P アプリケーション起動後にデバッガでアタッチさせる 通信処理を解析する場合は 初期化処理の解析はある程度飛ばしても問題ないため この方法での解析が可能

23 通信処理の解析 実行ファイルが IDA Pro で読み込むことができないので 通信処理を特定することが困難 API に対してブレークポイントを設定し スタックをトレースすることで 通信処理を行っている個所を特定する 同様の方法で ファイルアクセス箇所等の特定も可能

暗号アルゴリズムの推測 暗号アルゴリズムのアセンブリコードを解析しても アルゴリズムの特定は困難 暗号アルゴリズム内で使用されている特定の数値を用いてコードサーチエンジンを使用 24

25 int packet_analysis(gddconfig *gddc,unsigned char *packet,unsigned long length) { struct ip *ip_header; /* IP header */ struct tcphdr *tcp_header; /* TCP header */ char *tcp_data; /* TCP data */ struct in_addr addr; /* IP address */ char sourceip[16]; /* Source IP address */ char destip[16]; /* Destination IP address */ unsigned short sourceport; /* Source Port */ unsigned short destport; /* Destination Port */ unsigned long len_data; /* Length of data part */ unsigned long iph_len; /* Length of IP header */ unsigned long tcph_len; /* Length of TCP header */ unsigned long sequence; /* Expected sequence */ int portindex; /* Indexnumber of port list */ int direction; /* Packet direction */ unsigned char logtype; /* Log type */ CONN_LIST *bcl,*ncl; - /* Winnyp Connection table list */ ネットワーククローラ - CONN_LIST *t; /* Temporary connection list */ static char datestr[512]; /* Buffer to store datetime */ time_t timeval; struct tm *timep=null; char *timesp=null; char *c; 3. WinnypRadar /* Get pointer of IP header and check length of IP */ if (length-size_of_ethhdr < MINSIZE_IP+MINSIZE_TCP) return(0); ip_header = (struct ip *)(packet+size_of_ethhdr); if (ip_header->ip_p!=ipproto_tcp ip_header->ip_v!=4) return(0); iph_len = ((unsigned long)(ip_header->ip_hl))*4; if (iph_len<minsize_ip) return(0); if ((unsigned long)ntohs(ip_header->ip_len) < MINSIZE_IP+MINSIZE_TCP) return(0); if ((unsigned long)ntohs(ip_header->ip_len) > length-size_of_ethhdr){ return(0); } /* Get pointer of TCP header and check length of TCP */ tcp_header = (struct tcphdr *)((char *)ip_header+iph_len); tcph_len = ((unsigned long)(tcp_header->th_off))*4; tcp_data = (char *)tcp_header+tcph_len; if (tcph_len<minsize_tcp) return(0); /* Get other parameter in TCP/IP header */ if ((long)ntohs(ip_header->ip_len)-(long)iph_len-(long)tcph_len<0) return(0); len_data = (unsigned long)ntohs(ip_header->ip_len) -iph_len-tcph_len; sourceport = ntohs(tcp_header->th_sport); destport = ntohs(tcp_header->th_dport); memcpy(&addr,&(ip_header->ip_src),sizeof(struct in_addr)); strcpy(sourceip,(char *)inet_ntoa(addr)); memcpy(&addr,&(ip_header->ip_dst),sizeof(struct in_addr)); strcpy(destip,(char *)inet_ntoa(addr)); if (!strcmp(sourceip,destip)) return(0); 00001B70 FF 15 F0 11 00 01 E9 CC 03 00 00 E8 7C 1C 00 00... 鯲... 閖... 00001B80 33 F6 56 E8 B1 FC FF FF 85 C0 0F 84 B7 03 00 00 3 雎....... 00001B90 56 6A 02 FF 35 6C 80 00 01 FF 35 D0 87 00 01 FF Vj..5l...5ミ... 00001BA0 15 CC 11 00 01 85 C0 75 1D 68 10 10 00 00 FF 35. フ... u.h...5 00001BB0 50 80 00 01 FF 35 44 80 00 01 FF 35 D0 87 00 01 P...5D...5ミ... 00001BC0 FF 15 04 12 00 01 FF 35 D0 87 00 01 FF 15 2C 12...5ミ...,. 00001BD0 00 01 FF 35 D4 8B 00 01 FF 15 58 10 00 01 E9 64...5ヤ...X... 馘 00001BE0 03 00 00 83 FE 1A 77 47 0F 84 59 03 00 00 83 FE...wG.Ш... 00001BF0 11 0F 85 16 01 00 00 33 F6 39 35 E8 87 00 01 74...3.95 閾..t 00001C00 22 8B 3D 28 12 00 01 56 FF D7 56 FF D7 68 00 10 ".=(...V. ラV. ラh.. 00001C10 00 00 FF 35 50 80 00 01 FF 35 88 80 00 01 E9 7D...5P...5.. 驀 00001C20 02 00 00 6A 01 E8 0F FC FF FF E9 1A 03 00 00 8B...j... 急 00001C30 7D 14 B8 11 01 00 00 3B F0 0F 87 8B 00 00 00 3B. ク...;.....; 00001C40 F0 0F 84 16 02 00 00 83 FE 1C 0F 85 BD 00 00 00...... 00001C50 33 F6 39 75 10 74 2F A1 EC 87 00 01 8B 0D F0 87 3.9u.t/... 00001C60 00 01 3B C6 75 08 3B CE 0F 84 D9 02 00 00 8B 3D..; ニu.; ホ....= 00001C70 14 12 00 01 51 50 68 B1 00 00 00 FF 35 D4 87 00...QPhア...5ヤ.. 00001C80 01 E9 56 01 00 00 8B 3D 14 12 00 01 68 F0 87 00. 餬...=...h. 00001C90 01 68 EC 87 00 01 68 B0 00 00 00 FF 35 D4 87 00.h..h ー...5ヤ.. 00001CA0 01 FF D7 A1 EC 87 00 01 8B 0D F0 87 00 01 3B C1.. ラ.....; チ 00001CB0 75 11 89 35 EC 87 00 01 89 35 F0 87 00 01 E9 84 u..5...5.. 驗 00001CC0 02 00 00 51 50 E9 07 01 00 00 8B CE B8 12 01 00...QP... 勤ク... 00001CD0 00 2B C8 0F 84 3C 02 00 00 83 E9 04 0F 84 29 02.+ ネ..<......). 00001CE0 00 00 49 0F 84 F9 01 00 00 81 E9 1C 01 00 00 0F..I....... 00001CF0 84 E0 01 00 00 81 E9 E6 00 00 00 0F 84 3D 01 00......=.. 00001D00 00 81 E9 E8 7C 00 00 0F 84 02 01 00 00 3B 35 5C. 閖...;5 00001D10 88 00 01 0F 85 EE 00 00 00 8B 45 14 8B 48 0C 8B...... 畿. 稀. 驚 00001D20 C1 8B D1 F7 D0 C1 EA 02 83 E0 01 83 E2 01 F6 C1 錦 チ....

WinnypRadar Winnyp ノードのひとつとして Winnyp ネットワークに接続 Winnyp プロトコルを使用して 接続したノードからキー情報を収集 本クローラでは Winny ノード /Winnyp ノードの両方に接続することが可能 WinnypRadar WinnypRadar WinnypRadar 26

Winny ノードと Winnyp ノードの判別 Winnyp ネットワークには Winny との互換性があるため Winny ノードが含まれている可能性がある WinnypRadar では 接続したノードの初期パケットを元に接続ノードのバージョンを特定している WinnypRadar Winny 初期パケットから複数の鍵を生成 それぞれの鍵で復号を試み 接続ノードのバージョンを特定 Winnyp 27

収集情報 収集したキー情報には 公開しているファイルと公開元の IP アドレスが含まれる これらの情報を収集し どの IP アドレスがどんなファイルを公開しているかを調査することが可能 IPアドレスポート番号ファイルサイズ ( バイト数 ) ファイルタイムスタンプファイル名ハッシュ 28

クローリング キー情報の中から 公開元の IP アドレスを取得し 新しい接続先とする 新しい接続先に接続し キー情報を取得する これらの動作を繰り返し ネットワーク内をクローリングする WinnypRadar Winny Winnyp 29

観測結果 Winny ネットワーク内の Winnyp ノードの割合 Winnyp クローラが接続する際に 接続ノードが Winnyp かどうかを判定し 記録 全接続ノード数から Winnyp の割合を算出 WinnypRadar を使用し 1 日間計測した結果 ノード数 19.8 万ノード (Port0 を除く ) Winnyp ノードの割合 8%(1.6 万ノード ) P2P 研究会 クロスワープ社の調査結果より http://www.scat.or.jp/stnf/contents/p2p/p2p080910_4.pdf 30

31 まとめ 今回 Winnyp 2.1b7.28 の暗号鍵生成処理とパケット送受信処理についての解析を行った Winnyp では 解析を困難にさせるため暗号鍵生成処理が複雑となっている 解析結果をもとに Winnyp ネットワーククローラ WinnypRadar を開発 WinnypRadar を使用することにより 今まで検出できなかった Winnyp ノードに関する調査が可能になった

32 今後の課題 今回 十分なノード調査期間が取れなかったので 長期的にノード調査を行う必要がある 今回の調査では Winny ネットワークに接続可能な Winnyp ノードを調査したが Winnyp のみでの接続を行うノードの調査を行うことで Winnyp ノードのより正確な数が計測できると思われる

ありがとうございました 株式会社フォティーンフォティ技術研究所 http://www.fourteenforty.jp シニアソフトウェアエンジニア石山智祥 ishiyama@fourteenforty.jp 33