//あとで書く

です・ます調が記事によって違ったりするブログ

CVE-2015-5477の検証(&DNSに関する基礎知識)

本記事はCVE-2015-5477(BIND9.xの脆弱性)の検証に関するものです.

CVE-2015-5477の概要
攻撃者がサーバに不正なTKEYクエリを送信することでサーバのクラッシュ(正確にはnamedデーモンが落ちる)が発生する脆弱性です.調べたところ,世界中に存在する13のルートサーバの殆どがBINDを使用しているそうです.その点を考えるとこの脆弱性の危険性がおわかりいただけると思います.これは2015年7月に発見された脆弱性なので,2016年5月現在ではどのサーバも対策や修正がなされているでしょう.


DNSに関する基礎知識
DNSには「スタブリゾルバ・フルサービスリゾルバ(キャッシュサーバ)・コンテンツサーバ」という3種類の機能があります.

スタブリゾルバ
DNSの要求を始めに行うクライアントです.この要求を生成するコマンドとして「dig」等があります.

フルサービスリゾルバ
スタブリゾルバからの要求に対して自身のデータベース内に対応する答えがあればそれを返信し,なければ他のサーバに要求を行うサーバです.なおこの要求結果はスタブリゾルバに返信すると共に自身のデータベースにも格納するので「キャッシュサーバ」とも呼ばれます.この役割を行うサーバとしてISPのリゾルバ等があります.

コンテンツサーバ
自身の管理するゾーンにだけ応答し,自身のデータベースに要求の答えが存在しない場合,要求元に「存在しない」という返信を行うことです(つまり,他のサーバへ名前解決の要求を行いません).この役割を行うサーバとして各ゾーンの権威サーバがあります.

CVE-2015-5477では,BINDのフルサービスリゾルバとコンテンツサーバ双方が被害を受けます.


検証する
検証方法については,次の記事を参考にさせていただきました.
BIND9の脆弱性 (CVE-2015-5477)のPoCを書いて検証してみた - Qiita
仮想環境にサーバ(攻撃を受ける)とクライアント(攻撃を行う)を用意し,検証を行いました.

サーバ側でBINDを起動します.
f:id:epcnt19:20160528225329p:plain

起動されていることを確認します.今回はeth0(NAT)とeth1(Bridge)の2つが存在しているので,2つのアドレス(10.0.2.15,192.168.0.7)が対応しています. f:id:epcnt19:20160528225225p:plain f:id:epcnt19:20160528225614p:plain

では実際にサーバ(192.168.0.7)に向かって攻撃を行います.実際の攻撃コードについて深くは書きませんが,scapyを使えば非常に簡単に実現できます.クエリレコードタイプ249,クエリレコードと同じ名前を持つ追加レコード,これらを満たすDNSクエリをサーバへ送信します.
送信後,サーバ上でプロセスを確認すると,namedデーモンが落ちていることが確認できます.メッセージログ(/var/log/messages)からもrunning状態から異常終了していることがわかります.
f:id:epcnt19:20160528234110p:plainf:id:epcnt19:20160528234941p:plain


おわりに
本記事では,ひとまず検証のみを目的としているので,対策方法や検知方法についてはまた別の機会に書きたいと思います(色々諸事情がありまして...)

netmapを触ってみる(導入編)

先日の「第35回ネットワークパケットを読む会」にてnetmapについての話があり,面白そうだったので導入してみました.今回は導入編(というか設定しただけ)です.次回以降にnetmapを用いたソケットプログラミングについて記事を書いていきたいと思います.

はじめに
netmapについて知見を得るためにこの記事を開いた方には申し訳ありません.残念ながら当記事から得られるものは何もないので,以下のような素晴らしいスライド・記事を参照していただいた方が良いかと思います.

パケットジェネレータipgenから見るnetmap
超高速なパケットI/Oフレームワーク netmap について - ゆううきブログ


netmapについて
高速パケットIOフレームワークと呼ばれています.従来のソケットの送受信を高速化することができるそうです(ユーザプロセスとNIC間で様々な効率化がはかられている).netmapはユーザランドドライバです.また,現段階ではIntel製以外のNICには対応していません.

NICの種類を確認する方法としては,$dmesg | grep インタフェース名 等があります(適当)

環境
仮想マシン上で作業を行いました.

VirtualBox 5.0.12
FreeBSD 10.3(x86_64)

カーネル再構築
導入といっても,netmapは既に機能としてFreeBSDに取り込まれています.しかし,GENERICカーネル(FreeBSDをインストールした時点で動いているカーネル)には取り込まれていないのでカーネルを再構築します.カーネル再構築の一連の流れについて,次の記事に詳しく記載されているのでそちらを参照下さい.iij/ipgenを試してみる - Qiita

GENERICファイル(コンフィグレーションファイル)を適当に開き,最終行に一行追記した後にコンパイルします.以下の例では,GENERICファイルをコピーしてから追記しています.

$curl -O http://ftp.jaist.ac.jp/pub/FreeBSD/releases/amd64/10.3-RELEASE/src.txz
$tar Jxvf src.txz
$cd ./usr/src/sys/amd64/conf
$cp -p GENERIC hoge
$vim hoge

#最終行に追加
device         netmap

$config hoge
$cd ../compile/hoge
$make cleandepend
$make depend
$make
$sudo make install 


おわりに(次回以降の記事について)
最初にも触れましたが,次回以降は実際に既存のソケット通信との速度比較等を行いたいと思っています.(次回があるかはわかりませんが><)

第5回ICTSCに参加してきた

先に言わせていただきますが,問題の解説ではなく,ただの大会全体の感想です.
(解説はもっと文章力も技術力も高い方が書いてくれるはず・・・)

大会と参加経緯
 2月27日から28日にシスコ合同本社にて開催された,第5回ICTトラブルシューティングコンテストに参加してきました. 以前からLinux上のサーバ構築や,OpenFlowを用いた自作コントローラの制作等,ネットワークインフラの技術に興味がありました.ですので,これらの問題解決を競技形式で行うこのコンテストは非常に多くの経験や知見が得られると思い,エントリーをしました.

チームについて
 私は「mi_chan」という名前のチームに所属していました.(年齢的にリーダーをやらせていただきました) コンテストは学校対抗で3人以上5人以下で編成されたチームで競技を行うとの事で、自分達のチームは3人でした.

競技結果
 競技の結果は残念ながら悲惨なものでした.原因が大体把握できていた問題もありましたが,上手な文章の組み立てや具体例/対策等の記述に苦労し,私自身はチケットを一度も送信できませんでした.リーダーでありながら,チーム内で最も人権がありませんでした. ですが,競技終了後のLT大会や他チームの方との話を通じて,得られた知見があったことや,解けそうだった問題について理解することができました.

問題に関するメモ・感想

  • iptables設定が関わる問題が多く出題されたが,普段からRHEL関連のOSしか触っていなかったため,UbuntuやvyOSのiptables設定がわからず苦労した.

  • SYN Floodを用いて帯域幅を狭めていた手法がとても面白かった.

  • DNSのTXTレコードを用いたマルウェアの話がやはり出てきて,興味深かった.

  • 「10.100+X.3.Y/24」が実際には「10.100+X.5.Y/24」だった.(ルータのconfigを見ればすぐにわかるものだが,これに数時間溶かしてしまった)

  • Cisco機器の設定自体の問題は1問だけだった(非対照通信)ので,ルーティングやネットワーク周りより,もう少しサーバ周りに事前勉強時間を割り当てればよかった.

  • GitLab,nginx,BINDについては完全に知識足らずだった.

  • サーバの再起動問題については,/var/log/以下の各ログファイルの役割について今一度把握しておく必要がある.

最後に
 このような素晴らしい大会を企画して下さった企業の方々や運営の方々に本当に感謝しています,ありがとうございました.mi_chan各位お疲れでした.来年は賞金狙っていきましょう.サバ缶ごちそうさまです(笑)

wxPython&Mecab

wxPythonMecabを使って文章の形態素解析(今回は名詞分け)を行うプログラムを作ってみました。とってもお粗末です。f:id:epcnt19:20141204173820p:plain

#coding:utf-8
import wx
import MeCab
def click(self):
    output_text.Clear()
    node = mecab.parseToNode(str(input_text.GetValue()))

    while node.next:
        if node.feature.split(",")[0] == ("名詞"):
            output_text.AppendText(node.surface)
            output_text.AppendText(",")

        node = node.next

if __name__ =='__main__':
    mecab = MeCab.Tagger('-Ochasen')
    app = wx.App()
    frame = wx.Frame(None,wx.ID_ANY,"形態素解析テスト",size=(600,260))

    panel = wx.Panel(frame,wx.ID_ANY)
    input_text = wx.TextCtrl(panel,wx.ID_ANY,style=wx.TE_MULTILINE,size=(100,100))
    input_text.SetLabel("文章入力")
    button_1 = wx.Button(panel,wx.ID_ANY,"形態素解析開始")
    button_1.Bind(wx.EVT_BUTTON,click)

    output_text = wx.TextCtrl(panel,wx.ID_ANY,"結果",style=wx.TE_MULTILINE,size=(100,100))

    layout = wx.BoxSizer(wx.VERTICAL)
    layout.Add(input_text,flag=wx.GROW)
    layout.Add(button_1,flag=wx.GROW)
    layout.Add(output_text,flag=wx.GROW)
    panel.SetSizer(layout)

    frame.Show()
    app.MainLoop()

Mecab

形態素解析についてメモしておきます。
形態素解析とは自然言語処理の技術のひとつで、文章や言葉を、辞書や文法上の情報を頼りに品詞分けすることです(多分
最近話題の「東ロボプロジェクト」でもこの形態素解析は使われています。

その中でも自分はMacab(めかぶ)という日本語形態素解析エンジンを使ってPythonと連携して色々遊んだりしてます。

ネットワーク系やらLinuxシステムコールプログラミングやら自然言語処理やら色々かじっていますが、どれも今ひとつの知識しかありません...的を絞りたい....

daytimeクライアント

今日はxinetdでdaytimeサーバを立てて、そこへアクセスするクライアントを作りましたー

サーバサイドはLAN内のCentOSでクライアントサイドはCygwinです。

CentOS6.5(i386)にはinetd・xinetdが入っていなかったのでyumで追加しました。

/etc/xinetd.d/daytime-streamの設定を弄りました。

daytime-dgramってのもあったけど、これはUDPの接続用なのだろうか・・・

ソケットはjavaではよく使うのですが、Cでやると中々難しい・・・

まだまだ完全な理解はしていませんが、UNIXのソケットの機構は色々面白いので、もう少し頑張りたいです。最終的な目標はhttp鯖。そしてNAT越えのプログラムを作ることです。

ではでは

 

Cygwin導入

今更ですが、Cygwinを導入しましたー

windows環境でlinuxが触れるのは嬉しいですね!(今まではラズパイをsshしてました)

とりあえず、gccを使ってhttp鯖の制作をしたいです。

UDPの方は全く進んでおらず・・・暗号化(hash)の方にも興味がでできてしまいまして(笑)

LMhashの解析プログラムをpythonで作りたいのですが、とりあえずは的を一つに絞ってやっていきますかね・・・