29 Jan 2015, 12:53

WireShark で SMB/CIFS のパケット解析をするときの便利 Tips

はじめに

仕事で SMB プロトコルのパケット解析ばかりするようになってきた.

少し Tips がたまってきたので, 忘れないうちにメモしようと思う. SMB2 限定.

かなりニッチな内容だけれども, いつかどこかで誰かの役に立つことを願う.

検索を利用する

Ctrl + F で検索窓か開くので, キーワードから検索.

Filter を利用する

素早く情報を検索するには, フィルタが有効.

  • ツールバーからフィルタのパターンを入力
  • よく利用するものは, save を押すと再利用可能
  • フィルタの追加, 削除は Edit > Preferences > Filter Expressions から.

以下, よく利用するものを列挙

smb プロトコルをフィルタする

<div class="outline-text-3" id="text-3-1">
  <p>
    これは基本.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb or smb2<br /> [/sourcecode]
  </p>
</div>

IP アドレスでフィルタリング

<div class="outline-text-3" id="text-3-2">
  <p>
    サーバのログをみるとき, たくさんのクライアントからのアクセスがある ので, ログが見づらい. 以下で, 送信元または送信先でフィルタリング.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> ip.addr == 10.0.0.1<br /> [/sourcecode]
  </p>

  <p>
    送信元と先を指定する.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> ip.addr == 10.0.0.1 and ip.addr == 10.0.0.0<br /> [/sourcecode]
  </p>
</div>

NT Status が エラーのものをフィルタリングする

<div class="outline-text-3" id="text-3-3">
  <p>
    エラーを素早くチェックするために.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb2.nt_status > 0<br /> [/sourcecode]
  </p>
</div>

Command Code でフィルタリング

<div class="outline-text-3" id="text-3-4">
  <p>
    コマンドコードで絞込み.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> # create でフィルタ<br /> smb2.cmd==5<br /> [/sourcecode]
  </p>

  <p>
    コマンドコード一覧
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://msdn.microsoft.com/en-us/library/cc246528.aspx">2.2.1.1 SMB2 Packet Header &#8211; ASYNC</a>
    </li>
  </ul>
</div>

FileId でフィルタリング

<div class="outline-text-3" id="text-3-5">
  <p>
    create response コマンドにある fileId を追跡する.
  </p>

  <p>
    [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> smb2.fid==00004001-0000-0000-0000-000000000000<br /> [/sourcecode]
  </p>
</div>

tshark を利用する

コマンドラインの tshark を利用したほうが, 操作が早いことに気付く. しかし, Detail をしっかりみるためには GUI 版の WireShark がいい.

smb でフィルタリンクしたものを吐き出し. これでログが軽くなる.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2’ -w foo.pcapng
[/sourcecode]

-Y でフィルタをかける. サブ画面でちょっとした grep をするのに便利.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2.cmd==5’
[/sourcecode]

エラーがないかなどを素早くチェックする.

[sourcecode language=”text” title=”” ]
tshark -r hoge.pcapng -Y ‘smb2.nt_status > 0’
[/sourcecode]

30 Oct 2014, 03:38

iPhone を CIFS サーバにするアプリ CIFS NQ

仕事で CIFS をつかっている.

たとえば, カフェでダラダラしているときに, 急に CIFS のパケットが気になってしょうがなくなったとしよう.

NotePC には Windows がはいっている. しかし, Windows のクライアントがあっても接続する CIFS サーバがないと, CIFS のパケットを見ることができない!

VirtualBox に CentOS を入れて, その上に Samba サービスを立ち上げるとい うことを以前やった.

しかし, 今は仮想マシンを立ち上げる容量がないという不幸な状況.

そんなもどかしさに悶え苦しんでいるひとのために朗報!

iPhone を CIFS サーバにすればよい

iPhone を CIFS サーバにするアプリ

GoodReader

<div class="outline-text-3" id="text-1-1">
  <p>
    仕事効率化の定番アプリ, GoodReader に エクスプローラからアクセスする ことができる.以下, リンク参照.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://samulife.com/iPhone/goodreader-webdav">iPhone GoodReader を PC のネットワークドライブに割り当てる方法!! ドラッグ&ドロップでファイル転送できる</a>
    </li>
  </ul>

  <p>
    しかし, この手順で Windows のエクスプローラからアクセスすると, 都合が わるいことに気づく.それは, GoodReader のサポートしている SMB のバージョ ンが 1 だったこと.
  </p>

  <p>
    自分は, SMB2 のパケットが見たかった&#x2026;.
  </p>
</div>

CIFS NQ

<div class="outline-text-3" id="text-1-2">
  <p>
    ということで, 次に探したのがこれ. CIFS NQ.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://itunes.apple.com/jp/app/id806015001">iTunes の App Store で配信中の iPhone, iPod touch, iPad 用 CIFS NQ</a>
    </li>
  </ul>

  <p>
    開発した会社は, CIFS/SMB のリーディングカンパニーとか.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.visualitynq.com/?lang=jp">Visuality Systems &#8211; ホーム</a>
    </li>
  </ul>

  <p>
    無料なので, さっそくインストールしてみた. 設定画面からサーバステータスを ON に設定することで, CIFS サーバ起動.
  </p>

  <p>
    エクスプローラの URL 欄に IP を打ち込んで乗り込む. WireShark でパケッ トキャプチャをすると, SMB2 だった.
  </p>

  <p>
    おもわずニヤリ.
  </p>

  <p>
    これで, カフェで SMB2 のパケットをみることができるよになった.
  </p>
</div>

さいごに

誰トクな記事なんだろう….

01 Oct 2014, 12:05

Windows で JCIFS を利用してみる

CIFS を Java から利用するためのライブラリ JCIFS を試してみたメモです.

JCIFS とは

JCIFS は Java で書かれた CIFS/SMB クライアントライブラリ.

File Read

code

<div class="outline-text-3" id="text-2-1">
  [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221; ]<br /> import java.io.BufferedReader;<br /> import java.io.IOException;<br /> import java.io.InputStreamReader;<br /> import java.io.PrintWriter;<br /> import java.util.Properties;</p> 

  <p>
    import jcifs.Config;<br /> import jcifs.smb.SmbFileInputStream;<br /> import jcifs.smb.SmbFileOutputStream;
  </p>

  <p>
    public class JCIFSSample {<br /> public static void main (String[] args) throws IOException {
  </p>

  <p>
    Properties prop = new Properties ();<br /> prop.setProperty (&#8220;jcifs.smb.client.username&#8221;, &#8220;TSUNEMICHI&#8221;);<br /> prop.setProperty (&#8220;jcifs.smb.client.password&#8221;, &#8220;****************&#8221;);<br /> Config.setProperties (prop);
  </p>

  <p>
    SmbFileInputStream sfis = new SmbFileInputStream (&#8220;smb://TSUNEMICHI-VAIO/Users/TSUNEMICHI/temp/test.txt&#8221;);<br /> BufferedReader br = new BufferedReader (new InputStreamReader (sfis));
  </p>

  <p>
    String line = null;
  </p>

  <p>
    while ((line = br.readLine ())!=null){<br /> System.out.println (line);<br /> }<br /> br.close ();<br /> }<br /> }<br /> [/sourcecode]
  </p>
</div>

compile and run

<div class="outline-text-3" id="text-2-2">
  [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> C:\cygwin64\home\tsu-nera\tmp>javac -cp .;jcifs-1.3.17.jar FileRead.java</p> 

  <p>
    C:\cygwin64\home\tsu-nera\tmp>java -cp .;jcifs-1.3.17.jar FileRead<br /> Hello CIFS!!<br /> [/sourcecode]
  </p>
</div>

WireShark

<div class="outline-text-3" id="text-2-3">
  [sourcecode language=&#8221;text&#8221; title=&#8221;&#8221; ]<br /> Negotiate Protocol Request<br /> Negotiate Protocol Response, ACCEPTOR_NEGO, ACCEPTOR_META_DATA<br /> Session Setup AndX Request, NTLMSSP_NEGOTIATE<br /> Session Setup AndX Response, NTLMSSP_CHALLENGE, Error: STATUS_MORE_PROCESSING_REQUIRED<br /> Session Setup AndX Request, NTLMSSP_AUTH, User: ?\TSUNEMICHI<br /> Session Setup AndX Response<br /> Tree Connect AndX Request, Path: \\TSUNEMICHI-VAIO\USERS<br /> Tree Connect AndX Response<br /> NT Create AndX Request, FID: 0x4000, Path: \TSUNEMICHI\temp\test.txt<br /> NT Create AndX Response, FID: 0x4000<br /> Read AndX Request, FID: 0x4000, 4286 bytes at offset 0<br /> Read AndX Response, FID: 0x4000, 12 bytes<br /> Read AndX Request, FID: 0x4000, 4286 bytes at offset 12<br /> Read AndX Response, FID: 0x4000, 0 bytes<br /> Read AndX Request, FID: 0x4000, 4286 bytes at offset 12<br /> Read AndX Response, FID: 0x4000, 0 bytes<br /> Close Request, FID: 0x4000<br /> Close Response, FID: 0x4000<br /> [/sourcecode]
</div>

File Write

code

<div class="outline-text-3" id="text-3-1">
  [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221; ]<br /> import java.io.BufferedReader;<br /> import java.io.IOException;<br /> import java.io.InputStreamReader;<br /> import java.io.PrintWriter;<br /> import java.util.Properties;</p> 

  <p>
    import jcifs.Config;<br /> import jcifs.smb.SmbFileOutputStream;
  </p>

  <p>
    public class FileWrite {<br /> public static void main (String[] args) throws IOException {
  </p>

  <p>
    Properties prop = new Properties ();<br /> prop.setProperty (&#8220;jcifs.smb.client.username&#8221;, &#8220;TSUNEMICHI&#8221;);<br /> prop.setProperty (&#8220;jcifs.smb.client.password&#8221;, &#8220;****************&#8221;);<br /> Config.setProperties (prop);
  </p>

  <p>
    SmbFileOutputStream sfos = new SmbFileOutputStream (&#8220;smb://TSUNEMICHI-VAIO/Users/TSUNEMICHI/temp/test.txt&#8221;);<br /> PrintWriter pw = new PrintWriter (sfos);<br /> pw.println (&#8220;GoodBye JCIFS&#8221;);<br /> pw.close ();<br /> }<br /> }<br /> [/sourcecode]
  </p>
</div>

WireShark

<div class="outline-text-3" id="text-3-2">
  [sourcecode language=&#8221;emacs-lisp&#8221; title=&#8221;&#8221; ]<br /> Negotiate Protocol Request<br /> Negotiate Protocol Response, ACCEPTOR_NEGO, ACCEPTOR_META_DATA<br /> Session Setup AndX Request, NTLMSSP_NEGOTIATE<br /> Session Setup AndX Response, NTLMSSP_CHALLENGE, Error: STATUS_MORE_PROCESSING_REQUIRED<br /> Session Setup AndX Request, NTLMSSP_AUTH, User: ?\TSUNEMICHI<br /> Session Setup AndX Response<br /> Tree Connect AndX Request, Path: \\TSUNEMICHI-VAIO\USERS<br /> Tree Connect AndX Response<br /> NT Create AndX Request, FID: 0x4000, Path: \TSUNEMICHI\temp\test.txt<br /> NT Create AndX Response, FID: 0x4000<br /> Write AndX Request, FID: 0x4000, 15 bytes at offset 0<br /> Write AndX Response, FID: 0x4000, 15 bytes<br /> Close Request, FID: 0x4000<br /> Close Response, FID: 0x4000<br /> [/sourcecode]
</div>

その他

ローカルファイルとネットワーク上のファイルを 同じように扱う方法がわからなかった.

以下のような方法があるようだが, 自分の環境では動作せず.

09 Jun 2013, 05:22

CentOS上でSAMBAサーバを立ちあげてWindowsからアクセスするためのメモ

前回、VMware上のCentOSからCygwinのディレクトリをマウントすることを記事にしました。

Cygwin(Windows)をCentOSからmountする方法 | Futurismo

今回は、その逆。CentOSのディレクトリをWindowsにマウントします。CentOSにSambaを導入することで、実現しようと思います。

CentOSでのSambaの設定

CentOS側での設定を書きます。ここでは、home配下を共有することを目的とします。

# Sambaのインストール
yum -y install samba

# ユーザの追加。ここでは、tsu-neraユーザを
pdbedit -a tsu-nera

# パスワードを聞かれる
new password:
retype new password:
Unix username:        tsu-nera
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-3434940687-3012143288-2006372190-1000
Primary Group SID:    S-1-5-21-3434940687-3012143288-2006372190-513
Full Name:
Home Directory:       \\centos\tsu-nera
HomeDir Drive:
Logon Script:
Profile Path:         \\centos\tsu-nera\profile
Domain:               CENTOS
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    日, 09  6月 2013 04:07:43 JST
Password can change:  日, 09  6月 2013 04:07:43 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF


 

#======================= Global Settings ==================
[global]
   # 文字コード設定 CentOS
   unix charset = UTF-8
  # 文字コード設定 Win
   dos charset = CP932
   display charset = UTF-8

# ----------------------- Network Related Options ----------
       # Widnows グループの設定 コンピュータのプロパティから調べる
        workgroup = WORKGROUP
 
        # Allow within local network
        hosts allow = 192.168.1. 127.

#============================ Share Definitions ==============
[homes]
        comment = Home Directories
        # ホームディレクトリをSAMBAで共有する
        path = %H
        browseable = no
        writable = yes

 

# Samba起動
bash-4.1# /etc/rc.d/init.d/smb start
SMB サービスを起動中:                                      [  OK  ]

# NMB起動
bash-4.1# /etc/rc.d/init.d/nmb start
NMB サービスを起動中:                                      [  OK  ]

# 起動時にサービスを起動するおまじない
chkconfig smb on 
chkconfig nmb on 

ファイアウォールの設定

SAMBAを利用するためには、tcp 139,445, udp 137,138のポートを開ける。 /etc/sysconfig/iptablesを編集する。

# for samba
 -A INPUT -p tcp --dport 139 -j ACCEPT
 -A INPUT -p udp --dport 137 -j ACCEPT
 -A INPUT -p udp --dport 138 -j ACCEPT
 -A INPUT -p tcp --dport 445 -j ACCEPT

 

service iptables restart で再起動する。

SELinuxの設定

ここでスゴイハマった。CentOSにはSELinuxというセキュリティ強化用ソフトがあって、この設定をいじらないと、SAMBAでhomeディレクトリ配下を共有できない。(smb.confの初めにほうにも書いてあった)以下のコマンドを実行

setsebool -P samba_enable_home_dirs on

このコマンド実行は時間がかかる。気長に待つこと。

Windowsでアクセスしてみる

(Windows) + r でファイル名を指定して実行を起動。

\(サーバのIP)(ユーザ名)

を入力する。パスワードが求められたら、パスワードを入力する。アクセス出来れば成功。

接続が確認できたら、ネットワークドライブの割り当てをしとく。

参考