読者です 読者をやめる 読者になる 読者になる

ぎじゅつめも

とある工学系学生が学んだことをメモするだけのブログです。

Webサーバ立ち上げめも/iptables

固定IPアドレスを割り当ててサーバを外部へ公開する前に、サーバのFW(Firewall)の見直しを行います。間違っていたら指摘していただけると幸いです、

FWの設定

iptablesについて

ここで扱う純粋なFWは、トランスポート層以下のヘッダ内容を見てパケットの処理を決めるものです。LinuxではFWのプログラムとしてIPv4用にiptablesIPv6用にip6tablesが提供されており、今回はiptablesを利用します。設定ファイルは/etc/sysconfig/iptablesになります。

iptablesでは、パケットの処理の規則をルールと呼び、処理内容(受け入れ、遮断など)をtargetと呼びます。このルールを列挙したものをチェインと呼び、このチェインをまとめたものをテーブルと呼びます。デフォルトで用意されているテーブルにはフィルタ目的のfilterやIPマスカレードのためのnatなどがあります。パケットがFWに到達したら、まず適用するテーブルを選択し、その中で該当するチェインを選択し、その中の該当するルールに沿って処理を実行します。

パケットフィルタリングで標準的に使われるのはfilterテーブルですので、今回もfileterテーブルのチェインとルールを操作して、遮断するパケットと通過させるパケットを制御していきたいと思います。filterテーブルには、流入パケットを扱うINPUTチェイン、転送パケットを扱うFORWARDチェイン、流出パケットを扱うOUTPUTチェインがあります。また、それぞれのチェインには、ルールに該当しないパケットへの処理方針を表すPolicyというものがあります。

また、ルール設定を行う上で*1様が凄くわかりやすいのでおすすめです。

設定方針

ルールに欠陥があり不用意にパケットを受け入れてしまうことを懸念してINPUTのPolicyをDROPとします。また中継器として機能させる予定はないのでFORWARDのPolicyもDROPとしています。OUTPUTのPolicyのみACCEPTとしています。また、INPUTでスキャン活動や攻撃と思われるパケットを落とします。

設定内容

設定変更後、service iptables restartで適用できます。設定したiptablesの内容を以下に記述します。


# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
###############################################################
#ローカルホストI/F宛は通過

-A INPUT -i lo -j ACCEPT

###############################################################
#コネクション確立済みのパケットは通す

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

###############################################################
#Ping flood対策(icmp echo requestをhashlimitにより受信制限)
#ICMP echo requestは毎秒1個に制限

-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

#log
-A INPUT -p icmp --icmp-type echo-request -j LOG --log-prefix "ping_flood:"
-A INPUT -p icmp --icmp-type echo-request -j DROP

##############################################################
#HTTP Flood(F5)対策(HTTPパケットをhashlimitで制限)
#送信元IPアドレスごとにパケットカウント
#個数が50を越えると10/sの制限をかける,期間は120000ms

-A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW -m hashlimit --hashlimit-name t_http_flood --hashlimit 10/s --hashlimit-burst 50  --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

#log
-A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW -j LOG --log-prefix "ping_flood:"
-A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW -j DROP

###############################################################
#SYN flood対策(SYNパケットをlimitにより受信制限)
#SYNパケットが1個到着したらすぐに制限(ほぼ常に制限状態)
#制限状態では、サーバ宛のSYNパケットを毎秒50個へ制限

-A INPUT -p tcp --syn -m limit --limit 50/s --limit-burst 1 -j ACCEPT

#log
-A INPUT -p tcp --syn -j LOG --log-prefix "syn_flood:"
-A INPUT -p tcp --syn -j DROP

##############################################################
#ステルススキャン対策
#3wayハンドシェイクを完遂しない、コネクションの足がつかないスキャン
#nmapでありがちなスキャンパケットはとりあえず落としてログをとる
#該当ルールが多すぎるのでSTEALTH_SCANチェインを作成

-N STEALTH_SCAN 
-A STEALTH_SCAN -j LOG --log-prefix "stealth_scan: "
-A STEALTH_SCAN -j DROP

#ステルススキャンと思われるパケットは全てステルススキャンチェインへ
-A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags ALL NONE -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags ACK,FIN FIN -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags ACK,PSH PSH -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags ACK,URG URG -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags ALL FIN -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags ALL ACK -j STEALTH_SCAN
-A INPUT -p tcp --tcp-flags ALL FIN,ACK -j STEALTH_SCAN ######################################################### #DNS用 -A INPUT -p udp --sport 53 -j ACCEPT -A INPUT -p tcp --sport 53 -j ACCEPT ######################################################### #SSH #SSHログインを総当たり攻撃で突破することを先延ばしする #300秒間に5回までのアクセス制限 -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --set -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --rcheck --seconds 300 --hitcount 5 -j LOG --log-prefix "ssh_bruteforce:" -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --rcheck --seconds 300 --hitcount 5 -j DROP -A INPUT -p tcp --dport 22 -m tcp -j ACCEPT COMMIT

 

 

ステルススキャン時のフラグの組み合わせを網羅するのは骨が折れるので、一部*2様のやり方を流用させていただきました(いろいろな攻撃や偵察を考慮していらっしゃるのでとても参考になりました)。

ステルススキャンは、1番目がNULLスキャン、2番目と3番目と7番目、8番目は名称はわからないものの正規の手順ではありえない組み合わせによる挙動 を見るスキャン、4番目はFINスキャン、5番目と6番目も名称不明ですがコネクション確立前には送られないはずのフラグが立ったパケットによるスキャン かと思われます。9番目以降は独自に追加したルールで、それぞれ、クリスマスツリースキャン、FINスキャン、ACKスキャン、Maimonスキャンを検知するルールです。もっと様々なスキャン方法を網羅したい場合nmapのスキャンテクニック*3などを参考にすると良さそうです。

HTTP Floodは送信IPアドレスをスプーフィングできないのでhashlimitで送信元を取り、制限をかけるようにしています。これによって攻撃者は制限され正規ユーザは制限を受けません。

ホストのリソースを食いつぶすSYN Flood対策ですが、スプーフィング可能な攻撃なのでhashlimitを使って送信IPアドレス単位での制限は有用ではないんじゃないかなぁと考え、limitを用いています。これらhashlimitやlimitの制限パラメータは環境に合わせた改善の余地がありそうなので適宜チューニングしていこうと思います。また、万全を期して別途SYN Cookie法も有効にする予定です。

同様にICMP Floodも容易に送信IPアドレスを詐称できるのでlimitで制限をかけました。hashlimitをかけている方をたまに見かけますが、もしかしたらスプーフィングしていない純粋なpingを用いたfloodのみを対象にしているのかなぁと(pingコマンドは送信IPアドレスを指定できますが、確か未割り当てのアドレスを指定すると送ってくれないので…)。

ICMP Smurf攻撃ネットワーク管理者がルータでブロードキャストアドレス宛のリクエストパケットを破棄するなどの対策を行っていれば防げるので今回はiptablesに対策を記述していません。もし記述するならicmp echo replyの流入を制限したり、踏み台となるのを防ぐためにicmp echo replyの流出を制限するルールを記述すればよいと思います。

DNS amp対策の一貫として、dnsパケットの受信制限を追加するのもよいかもしれません。

もっとも、ここまでで登場した中で帯域型攻撃として働くものはエンドホストで落としてもエンドホストに至るまでのリンク/中継器に影響が出ているので根本的な解決にはなりません。しかしやらないよりはマシなので実装しています。

sshポートへの総当たり攻撃を回避するためにsshポートへも接続回数制限を設ける方が良いと思ったのでこれもhashlimitで設定しようと思ったのですが、*4様の手法の方が明解だったのでこちらを参考に記述しました。

ログについて

dmesgコマンドで取り急ぎメッセージログを見ることはできますが、rsyslogの設定を変更しないと/var/log/下にログファイルは生成されません。そこで*5様の記述に沿ってログの設定を行いました。

すなわち、/etc/rsyslog.confのRULES配下に

kern.info /var/log/iptables.log

を追記。設定変更後は/etc/init.d/rsyslog restartで変更適用。これでログを吐かせるようにしました。

また、ログの肥大化を防ぐためにログのローテーションも行おうと思います。まだ実行しておらず後で行う予定です。

実際のログ

閉じたローカルネットワーク環境で実際にSYN Floodを観測させました。この場合、/var/log/iptables.logに以下のようなログが大量に残ります。192.168.11.5はサーバのローカルIPアドレスです。

f:id:white-hawk:20170322020910p:plain

ただ、今回のこのログ、実は他ホストからTCPポートスキャン(SYNスキャン)をかけたものです。SYNスキャンはステルススキャンの中でも最もポートスキャンとして検知するのが難しいので今回はsyn_floodでログを出すようにしています。

また、スキャン実行を行うとともにiptables.logをtail -fコマンドでリアルタイム監視していたのですが、RTTを考慮してもログが出力されるまで4,5秒ほどレイテンシがありました。

ping floodも以下のようにちゃんとログを吐いてくれました。

f:id:white-hawk:20170322072713p:plain

ping floodは以下のようにシェルスクリプトを記述して実行しました。※悪用厳禁。

#!/bin/sh
COUNT=0
while [ $COUNT -lt 1000]
do
 ping 192.168.11.5 -n 1000 -s 1400 > /dev/null &
 COUNT=$(( $COUNT+1 ))
done

nmapを用いてFINスキャンを行った場合のログは以下のようになりました。

f:id:white-hawk:20170322225926p:plain

ログメッセージがstealth_scanだけでも、ログからフラグまで見えるのでどんなスキャンかが判別できますね。

sshポートについて

botのスキャン活動などではsshポートはよく標的になるので、他のポートへ変更するのが無難のようです。これも今後の予定です。

Ciscoルータ設定作業めも

ネットワーク技術

Ciscoルータをもつ友人宅で勉強会を行ってきました。Ciscoルータへ直接設定を行うのは某インターンで経験したりしていたのですが、結構忘れていたので復習の意味を込めてめもを残しておきます。

作業環境

用意した製品・道具類

Ciscoルータ 1812-J

・LANケーブル

・コンソールケーブル(D-Sub)

・D-Sub⇔USBシリアル変換ケーブル

・エンドホスト用ノートPC2台

・コンソール用ノートPC1台(Windows、Tera Termインストール済み)

Ciscoルータ 1812-Jについて

仕様書上、このルータは以下のポートを持っていました。

・WANポート(fa0,fa1)

・LANスイッチポート(fa2~fa9)

ここで、faはFast Ethernetの略称です。

L3スイッチ(及びL3スイッチ内臓ルータ)の構成は以下のように考えています。図ではVLANを分けて描きましたが、今回は全てのLANスイッチポートがVLAN1に属しています。SVIはVLAN(内部スイッチ)と内部ルータのインタフェースです。Ciscoの説明にあったWANポートが所謂ルーテッドポート、LANスイッチポートが所謂スイッチポートに当たる物と捉えています。また、今回はVLANの設定は省略して次回にまわそうと考えているので、スイッチポートは使用せず、エンドホスト側も、直接ポートにIPアドレスを振れるルーテッドポートを使用しました(詳細はネットワーク構成へ)。

f:id:white-hawk:20170319054358p:plain

ネットワーク構成

ルーティングを確認するため、最低限のネットワークとして以下のようなトポロジを考えました。エンドホストはそれぞれE1,E2であり、ルータはそれぞれR1,R2です。上述したように、便宜上今回はLAN側もルーテッドポートを使用しています(図中の※印インタフェース)。 

f:id:white-hawk:20170319061034p:plain

作業内容

基本的なコマンドや仕様の把握と、静的ルート設定、簡単な動的ルート設定を行いました。

ルータ設定のための接続

Cisco機器への接続方法は主にコンソール接続、VTY接続があります。以下のにその手法を記述します。物理的な接続を行った後はTera Term等を用いてIOSへアクセスします。

コンソール接続

ルータの初期設定がすむまではコンソール接続しかできません。従って今回はコンソール接続を行います。コンソール接続では、設定したいルータのコンソールポートとPCをコンソールケーブルを介して接続します。今回コンソール用端末側にD-Subポートがなかったため、D-Sub⇔USB変換ケーブルを介して接続しました。

VTY(仮想端末)接続

初期設定が済んでから使用可能な接続方法で、ネットワークを介してtelnetsshでリモートログインして設定を行います。Cisco機器とコンソール用端末がネットワークを介して接続されていれば物理的な接続は完了です。ちなみにエンドホストからCisco機器へのtelnet接続だけでなく、Cisco機器からCisco機器へのtelnet接続も可能です。

Cisco IOSとモード切り替え

Cisco製品上では、おおよそCisco IOSというCLIベースのOSが動作しており、このソフトウェアを介して機器への設定を行います。またIOS操作時は、いくつかのモードを切り替えながら設定を行っていきます。セキュリティの観点からアクセスレベルが設けてあり、主に以下のモードがあります。※ルータ名はRouterにしています。

モード 概要
ユーザモード

接続時の最初の状態。機器の一部の情報を見ることが出来ます。 端末での表示は以下のようにホスト名を”>”で区切るようになっています。

f:id:white-hawk:20170320041621p:plain

特権モード

ユーザモードからenableコマンドで権限者のみが移行できるモード。機器の全ての情報の参照やデバッグ、ツール(pingやtracerouteなど)の実行ができます。disableコマンドでユーザモードに戻れます。 端末ではホスト名に続き"#"が続きます。

f:id:white-hawk:20170320041857p:plain

グローバルコンフィギュレーションモード

特権モードからconfigure terminalコマンドで移行できるモードです。機器全体に関わる様々な設定(機器名やパスワードの設定など)が出来ます。exitコマンドで特権モードへ戻れます。端末では以下のように表示されます。

f:id:white-hawk:20170320041937p:plain

特定コンフィギュレーションモード

グローバルコンフィギュレーションから移行できるモードです。機器の特定の箇所に設定を行うためのモードです。特定コンフィギュレーションモードは、厳密にはインタフェースコンフィギュレーションモードやルータコンフィギュレーションモードなど、特定の箇所に応じたモードが存在します。exitでグローバルコンフィギュレーションモードに戻れます。

例えばインタフェースコンフィギュレーションモード時は以下のように表示されます。

f:id:white-hawk:20170320042354p:plain

コマンドの補完と省略

 各種コマンドは、コマンドが一意に判別できる文字列まで入力し終えたら、[tab]キーで補完することができます。また、補完可能な文字列だけでそのコマンドの実行も出来ます。例えば、enableコマンドはenでも実行可能ですしconfigure terminalコマンドは、conf tでも実行可能です。

I/F(ルーテッドポート)へのIPアドレス割り当て

まず、グローバルコンフィギュレーションモードにおいて、設定を行いたいインタフェースを指定してインタフェースコンフィギュレーションモードへ移行します。移行のためのコマンドは、interface [規格] [インタフェースの番号]となります。例えば、今回の場合、R2のFast Ethernetの1番目のポートに設定を行いたいため、以下のように入力します。fastethernetはfaと省略することも可能です。

f:id:white-hawk:20170320043630p:plain

※ちなみに、インタフェース番号の表記としてn/0/nというものがあります。これはスタック可能なボックス型スイッチにおいて適用されるもので、最初の数字がスタック位置、次の番号は0固定、最後の番号がインタフェースの位置となります。

次にインタフェースにIPアドレスを割り当てます。今回は192.168.3.254/24を割り当てたいので、ip addressコマンドを用いて以下のように行いました。今回用いたip addressコマンドの形式はip address [IPアドレス] [サブネットマスク]となっています。

f:id:white-hawk:20170320044518p:plain

最後に、I/Fを有効にするために、no shutdownコマンドでたちあげます。スイッチングポートはデフォルトでupですが、ルーテッドポートはデフォルトでdownなのでたちあげます。

f:id:white-hawk:20170320044603p:plain

これでI/FへのIPアドレス割り当てと有効化が完了しました。今回は各ルータにおいて4つのI/Fに設定が必要なので同様に行いました。

ルータからのツール実行

ルータに実装されているツールを特権モードから実行できます。例えばpingをエンドホストへ向けて送ってみた結果を以下に示します。

f:id:white-hawk:20170320045054p:plain

"!"と表示されているのはecho replyが帰ってきてpingが成立したものです。ここでは5回中5回のpingに成功しています。逆にecho requestを送ったもののタイムアウト時間までにecho replyが帰ってこなければ".(ピリオド)"が表示されるようです。

※ちなみにコマンドの強制中止は[Ctrl]+[Shift]+[6]で行えるようです。

また、pingだけ打つと拡張pingとなり様々なオプションを指定できます。

f:id:white-hawk:20170320045443p:plain

tracerouteも実行可能。(1ホップしかないのでトレースの意味薄いですが実行できるという意味で掲載)

f:id:white-hawk:20170320045537p:plain

Interfaceの状態について

Interfaceの情報を表示すると、[インタフェース名] is upなど記載があります。これはInterfaceが搬送波を検出できる状態にあるか(レイヤ1接続が有効か)どうかを表しています。upの場合できる、downの場合できない、administratively downの場合設定上できなくなっていることを表します。

ラインプロトコルについて

Cisco機は定期的にキープアライブ信号のやり取りをしているようで、隣接ノードまで信号が届かなくなったり、届くようになったりするとその旨が端末上に表示されます。すなわち、論理的な接続の有効性がLine protocl is (up/down)の表記でわかるようになっています。論理的な接続が切れる原因はリンクの問題、ノードの問題に区別されます。

例えば意図的に隣接ノードの電源を落とすと下記のようなメッセージが表示されます。

f:id:white-hawk:20170320050805p:plain

再び立ち上げると下記のようなメッセージが表示され論理的な接続が回復したことがわかります。

f:id:white-hawk:20170320051028p:plain

※ちなみに

隣接ノードのMac bookをスリープモードにすると以下のようにLine protocolのdownとupが瞬時に表示されました。以下がその様子です。

f:id:white-hawk:20170320051546p:plain

これはスリープ中も通信ができるようにするために論理的な接続を有効にしているようで、恐らくMacのPower Nap機能によるものかと推測しました。ちなみにpingは通りませんでしたので、一部の通信のみ有効なのでしょうか...。

ホスト名の変更

今までルータにデフォルト名(Router)を用いていましたが、2台あってややこしいのでホスト名を変更します。ホスト名変更はグローバルコンフィギュレーションモードでhostname [ホスト名]を実行することで可能です。

f:id:white-hawk:20170320051944p:plain

各I/Fの情報表示

各I/Fに対するIPアドレスの割り当て状況や接続性をリスト表示するには例えばshow ip interface briefコマンドがあります。

f:id:white-hawk:20170320052332p:plain

BRIはISDN用のI/Fです。

DuplexやVLANなどのステータスを確認したい場合はshow interface statusで行えます。

f:id:white-hawk:20170320053200p:plain

また、各I/Fごとの詳細を見たい場合はshow interfaceで確認できます(実行結果略)。

スイッチポートへのIPアドレス割り当て

スイッチポートはルーテッドポートと異なりL2相当の役割を果たすためIPアドレスをそのまま割り当てることは出来ません。以下は割り当てを試みた場合のエラーメッセージ。

f:id:white-hawk:20170320053446p:plain

しかしスイッチポートにVLANを割り当て、VLANにIPアドレスを割り振ることで疑似的にスイッチポートがIPアドレスを持つように振る舞わせることができるはずなので、次回実際に行おうと思います。

設定した内容の保存

設定の内容は、不揮発性RAM(NVRAM)に書き込まなければ次回の起動時にも反映されません。従って設定を保存するには、copyコマンドを使ってNVRAMへ設定の書き込みを行います。

f:id:white-hawk:20170320054525p:plain

running-configはメモリ上にあり、startup-configはNVRAMにあります。copyコマンドは第一引数の内容を第二引数へコピーするものです。copy run startという省略形や、write memory、wrでも同じことが実行されるようです。

静的ルーティング

エンドホスト、ルータ共にI/Fに静的IPアドレスの割り当てを行いました。各エンド間で通信を行うためには、各ノードのルーティング設定を行う必要があります。今回はまず静的ルートを記述します。R2でグローバルコンフィギュレーションモードに入った後、静的ルートを以下のように記述します。

f:id:white-hawk:20170320054943p:plain

ip route [宛先ネットワークアドレス][宛先サブネット][隣接ノードのIPアドレス]という記述で静的ルートを追加できます。

機器のルーティングテーブルはshow ip routeコマンドで見ることが出来ます。

f:id:white-hawk:20170320055317p:plain

f:id:white-hawk:20170320055355p:plain

うまく反映されたようです。ちなみにSは静的ルート、Cは直接機器に設定してある接続を意味しています。他にもRIPで動的に割り当てられたならばR、OSPFならばOなどと記載されます。

この設定をR1にも行います。また、各エンドホストのデフォルトルートをそれぞれのルータに設定します。

その後、うまく静的ルートが働いているかを確認するためにE2からE1へpingを飛ばしてみました。

f:id:white-hawk:20170320055853p:plain

ちゃんと静的ルートでエンド間の通信ができました。traceroute実行結果も以下のように意図したものとなりました。

f:id:white-hawk:20170320055952p:plain

※ルートの消し方

動的ルーティングも試したいので、設定した静的ルートを手動で消します。

f:id:white-hawk:20170320060145p:plain

静的ルート追加時のコマンドにnoをつければ可能です。以下は実際に消えたことの確認です。

f:id:white-hawk:20170320061453p:plain

動的ルーティング(OSPF)

リンクステート型ルーティングプロトコルであるOSPFで動的にルートを生成したいと思います。R1では以下のようなコマンドを打ちました(友人がワイルドカードマスクをサブネットマスクと勘違いして入力したらしいので次回があれば修正して実験しなおしたものに画像を差し替え予定です。今回のトポロジが幸いし挙動としては変わりません)。

f:id:white-hawk:20170320060445p:plain

router ospf [process id]で適当なプロセスを走らせます(1つのルータで複数のOSPFを走らせることができますが非推奨です)。

network [ネットワーク/IPアドレス] [ワイルドカードマスク] area [エリアID]で該当するI/Fにエリアを割り当てます。OSPFではリンクステートをエリアごとに集約します。また、原則としてバックボーンエリア(area 0)が必要ですので、今回これを割り当てています。ワイルドカードマスクは、一回のnetworkコマンドで複数のI/Fにエリアを割り当てるために指定するもので、2進数で”0”の部分は合致するかどうか検証し”1”の部分は検証しないと判断されます。従って上記のように192.168.1.0も192.168.2.0もどちらもエリア0に所属させたい場合network 192.168.0.0 0.0.255.255の方が効率的かつワイルドカードマスクの観点で正確と思われます。

R2でも同様の設定を行いルーティングテーブルを見てみる。

f:id:white-hawk:20170320062614p:plain

f:id:white-hawk:20170320062711p:plain

ちゃんとOSPFによりルートが追加されています。pingでの通信疎通テストは省略。

イベントの表示

試しにOSPFによるイベントを表示してみます。debugコマンドで指定したイベントを表示することができるようになります。

f:id:white-hawk:20170320063133p:plain

OSPFのHelloパケットのやりとりが観測されました。デバッグを停止するにはno debu allコマンドをつかいます。

終わりに

今回は簡単なCiscoルータの操作を行いました。今後友人宅を訪問する際に、友人が気乗りすればまた追加で実機を操作してそのめもを残すかもしれません。

【情報秘匿技術】ファイル偽装とマジックナンバー

バイナリ

バイナリとは

人間にとって意味のある文字の羅列をテキストといいます。対して、コンピュータにとって意味のある文字の羅列をバイナリといいます。厳密には0,1の2進数で表現されたデータ形式を指します。バイナリファイルには、音声ファイル、画像ファイル、実行ファイルなどがあります。

マジックナンバー

バイナリファイルには、そのファイルの種類を表す識別子が表記されています。これをマジックナンバーもしくはファイル識別子と呼びます。主要なマジックナンバーは以下サイト様などが調べてくださっています。

マジックナンバーまとめ - Qiita

バイナリエディタ

ファイルのバイナリ情報を閲覧するにはバイナリエディタを利用します。WindowsであればBZなどがあります。

ファイル偽装

ファイル偽装(File Camouflage)とは、あるファイル中に別のファイルを埋め込むもので、言わば情報を秘匿する手法(情報秘匿技術)です。これにより別ファイルが埋め込まれたファイルをインプラントファイルもしくは偽装ファイルと呼ぶこともあります。ファイル形式によっては、何が付加されていても問題を及ぼさない領域があり、ここに別のファイルを埋め込むことによって実現されます。このとき、埋め込むファイルを暗号化し専用のプログラムによって取りだすものもあれば、暗号化されず埋め込まれてバイナリファイル解読により人の手で取りだせる物もあります。

仲間内もしくは自身だけが埋め込まれたファイルを取りだせるような用途で用いられ、悪意のある用途としては、商用ソフトウェアや著作権画像などを、何の変哲もないファイルに埋め込むことで、一見、違法性の無いファイルに偽装することなどが挙げられます。商用ソフトウェアをインプラントファイルに埋め込み、非合法に配布する行為はWarezと呼ばれています。

非暗号化埋め込みデータを取りだす手法

 インプラントファイルをバイナリエディタで開きます。見かけ上のファイル形式を表すマジックナンバーが現れた後に、再びマジックナンバーが現れる箇所を探し出します。そこが埋め込みデータの先頭である可能性が高いので、そこから埋め込み末尾と思われる箇所までを別ファイルに保存し、マジックナンバーに沿った拡張子をつけます。

※時間がある際に実際の埋め込みデータの取り出しを追記しようと思います。

マルウェア解析等に役立つ評価サイト

セキュリティ技術

某社の方々に役立つサイトを教えていただいたので、まとめておきたいと思います。

 

疑わしいファイルをハッシュで検索したり、実際のファイルをアップロードすることでそのスキャン結果を表示してくれます。スキャンに用いられるのは既存の40種類以上ものウイルス対策製品で、主要なNortonやMaCafeeなども含まれています。また、URL、ドメインIPアドレスに対するスキャンも行ってくれます。

www.virustotal.com

 

  • Threatcrowd

ドメインIPアドレスマルウェアハッシュ値などから、関連するドメインマルウェアをグラフで可視化してくれます。

Threat Crowd | Threatcrowd.org Open Source Threat Intelligence

 

  • IBM X-Force Exchange

IBM X-Forceというセキュリティ調査チームによりサポートされたプラットフォーム。メインページにはトレンドであるbotnetの分布情報やIBM X-Forceからの勧告なども表示されるので、様々な脅威に関する知見が得られます。

IPアドレス、URL、ドメイン、疑わしいプログラムのハッシュ値などで検索をするとその評価情報を表示してくれます。IPアドレスからはwhois情報も表示してくれます。また、面白い機能として最近よく検索されているトレンドも表示されます。

exchange.xforce.ibmcloud.com

5G技術についてのメモ【無線技術/コアネットワーク技術】

情報通信技術

5G(第五世代移動通信システム)ではどんな技術が採用される予定なのか、先日某研究開発センタを訪問させていただいた折に教えていただきました。そこでお聞きした内容は全て公開情報だそうなので、ここで簡単にメモしておきたいと思います。

 

今後のICT社会に予期されること

IoTの普及・ユビキタス社会の推進により、全てのモノが無線でつながるようになると考えられます。また、情報端末数の増大により通信ネットワークが取り扱う情報量も大幅に増大することが考えられます。

 

無線アクセス技術

目標性能

今後のICT社会に予期されることを踏まえて、5Gで無線アクセス技術の目標は“大容量化(システム容量1000倍)”、“高速通信(体感100倍)”、“同時接続数の増強(現在の100倍を目指すそうです)”、“低遅延化(無線区間の遅延が現状5ms~10msなので1ms以下へ)”、”低コスト化/省電力化”なのだそうです。

技術コンセプト

比較的低い周波数(UHF)帯は飽和状態にあります。なので、今後は高周波数帯を使うことになります。しかし、高周波数になればなるほど、回折能力(障害物を回り込んで伝搬する能力)が低下して損失率が大きくなる欠点があります。

これを解決する技術が5Gには求められました。

Massive MIMO

これまでの基地局のアンテナ数は、例えばFDD(周波数分割多重)なLTEで2本、TDD(時分割多重)なLTEでも4本or8本程度であり、電波は上空から見て円状に吹かしていました。しかし、5Gでは前述の課題を克服するため、Massive MIMOという概念を導入しました。これはアンテナ数が最大128個にも及ぶ超多素子アンテナです。これにより、電波を言わばビーム状に引き延ばし、指向性を持たせ、情報端末を操作するユーザに直接電波を吹かします。このデジタルビームフォーミング(以下DBF)により損失を減らす試みが行われています。すなわち、今までは基地局を中心にセルを構成していましたが、今後はユーザを考慮した動的なセル(ダイナミック仮想セル)の構築を行うことで快適な通信環境を作り出そうとしているようです。

コアネットワーク技術

技術コンセプト

今まで全てのサービスを同一のアーキテクチャで実現していましたが、サービスごとに要求される品質などは様々です。しかし、サービスごとに通信基盤をいくつも用意するようでは膨大なコストがかかってしまいます。そこで、1つの通信基盤上で複数の要件を同時に満たす技術が求められました。

ネットワークスライス

ネットワークスライスという概念は、1つのネットワークに複数の論理的なネットワークを収容する仮想化技術により実現されるもので、論理的なネットワークをスライスと呼んでいます。仮想化を行う中継器ではスライスごとに異なるプログラムを走らせることができます。

ネットワークスライスにより、例えば低遅延のサービスを利用したいユーザがアクセスしてきた場合、低遅延のスライスにユーザを移動させることで要件を満たすことが出来ます。

インシデント解析のためのログ収集システム【SIEM/Cybereason】

セキュリティ技術

古典的なマルウェア感染等のインシデントの検知/解析は、エンドポイントや中継器といったそれぞれのノード単一での情報に基づいて行ってきました。しかし、DDoSや情報窃取などのマルウェアの振る舞いは、ネットワークを通じて複数のノードにまたがって行われますので、監視したいネットワークにおけるあらゆるノードのログを収集して、総合的に分析(相関分析)する方が好ましいです。これを実現する製品、サービスについて学んだので、後学のためにメモしておこうと思います。

 

ログ収集に基づく異常検知システムの目的

導入の目的は主に以下の2点です。

これらを実現するためには、ログ収集し分析する製品が必要となります。 

 

実際の製品/サービス

ログの収集を行い、分析に応用することができる実際の製品/サービスを紹介していこうと思います。ここで紹介するのはあくまで分析用のものであり、マルウェアを駆除する機能は別途確保する必要があります。

 

Cybereason

各エンドポイントのログデータを収集し、AIを用いた分析を行うことで、サイバー攻撃に加担するプロセスの兆候・現状などをリアルタイムで検出するサービスです。また、ログ収集のために各エンドポイントにはCybereasonセンサを導入する必要があります。

Cybereasonで可視化される情報を具体的に挙げると、マルウェアと疑われるプロセスのファイルのハッシュ値、ファイルへの署名の有無、プロセスの通信ログ、通信先及びファイルの信頼性評価(Reputation)等があります。

Cybereasonソリューションはクラウドベースで展開されており、ログやファイルの評価情報・分析結果などの詳細はブラウザを通してGUIベースで確認できます。

SIEMと違った利点として特に挙げられるのは、プロセスに焦点を置いた振る舞いの詳細を見ることができる点です。欠点としては、エンドポイントのログしか収集できないことが挙げられます。

▼参考リンク

www.softbank.jp

 

 

SIEM

SIEMはSecurity Information and Event Managementの略称です。

SIEM自体は特定のサービスやソフトウェアを指す用語では無く、サーバ、ネットワーク機器、セキュリティ機器、アプリケーション等から得られるログを収集し、異常があった際に管理者に通知する仕組み、機能を指します。実際にSIEMを実装している製品としてはMcAfee SIEMがあり、以後これについて解説します。

様々な製品のログから必要な情報を、統一フォーマットで抜き出して可視化します。主要なネットワーク製品のログ用パーサーはベンダが用意してくれていますが、マイナーな製品のログは運用側でパーサーを作成してログの切り分けを自前で行う必要があります。また、MaCafee SIEMの場合、ソフトウェアとハードウェア一式での提供となっていました。インシデントはその重要度ごとにランク付けされ、必要に応じて管理者にアラートを流すことができます。アラートを出すルールを管理者が設定することも出来る。

利点はネットワークのエンドポイントだけでなく中継ノードからも情報を収集できることです。これによって、インシデントの及ぼしている影響をネットワークの全体像を踏まえて観測できます。具体的にいうと、FW、IDS/IPS、Webプロキシなどの情報も相関的な分析に含めることができるので、攻撃者の偵察から攻撃までのプロセスを可視化できます。例で言うと、FWで空いていないポート群へのアクセス(ポートスキャン)を検知した後に、同様の送信IPアドレスからIDSでディレクトリトラバーサルを検知していれば、それぞれの通信の関連性が見えてきます。

▼参考リンク

www.mcafee.com

 

※補足:単一ノードのログ可視化サービス

CybereasonやSIEMなどは複数ノードのログを総合的に可視化しましたが、単一ノードのログ可視化サービスもあり、Mackerelなどが挙げられます。CPUやメモリの使用率などを時系列で可視化しパラメータが閾値を越えたら通知するアラート機能もあります。

mackerel.io

 

ログ収集システムの併用について

ここで紹介したSIEMとCybereasonのようなものは互いの欠点に補うように併用することもできます。

SIEMで怪しい通信の全体像を把握した後、対象ノード上の詳細なプロセスの振る舞いをCybereasonで観測するといった使い分けができます。

これらのログ収集システムが動的に連携を取る仕組みについては現在のところ把握していませんが、そのうち登場するかもしれません。

 

ログ収集の課題

ログ収集システムは、各所で得られたログを一元化することでその恩恵を得ます。そのため、あまりにもログの量が膨大だと、一元化する先のマシンの性能次第では処理が追い付かなくなってしまいます。そのため、運用者側でのログの取捨選択などが必要となってきます。このジレンマにより、企業によっては、取りたくても取れないログが出てきているようです。

 

ログの外部吐き出しの恩恵

クラッカーは潜入したエンドポイントの情報改ざんを行った場合、 その痕跡を消すべくログの改ざんも試みる場合があります。しかし、適切なタイミングでログを外部へ吐きだしていれば、エンドポイントの改ざん後のログと外部へ吐きだされた正規のログを見合わせることで、改ざんの痕跡発見につながることもあります。

ログ分析に基づくマルウェア解析の過程

セキュリティ技術

ログ収集システムを用いたマルウェア解析を実際に体験して学んだことをメモしておこうと思います。

解析環境はWindowsです。

 

セキュリティオペレーションの流れ

まず、マルウェア解析を含むセキュリティオペレーションの一連の流れを示します。

順序概要 
 1  アラートシステム(Cybereason,SIEM等)が異常検知
 2  異常と検知されたプロセス/ファイルの解析(Cybereason,SIEM等の示すログ情報と異常根拠を元に解析。必要に応じて感染ノードを回収して実ファイルの調査とユーザへの聴取。)
 3  分析後に対象がマルウェアか過検知かの判定
 4  マルウェアの場合、被害状況・現状の確認
 5  対応(マルウェア削除、システムのスキャン、再発防止の仕組み構築、注意勧告、上長や関係部署への通達)

 ここでは、上記の内の2~3に該当するマルウェア解析について述べて行きたいと思います。また、コードの解析はアラートシステムに任せ、ログ情報を元にした解析に焦点を当てます。

 

マルウェア解析

今回はアラートシステムにCybereasonを用いた場合の解析について述べます。

注視するべき要点 

ネットワークフォレンジックの観点から注視すべき要点は以下のものです。

単語概要
場所 IPアドレスと、それが存在する地域についての情報。攻撃の温床となるアドレスは偏っているので、怪しさの指標になる。C&CサーバやbotnetのIPアドレスはスキャンサービスのVirustotal等で調べられる。
時刻  攻撃・異常の発生時刻など。どのタイミングでどのような振る舞いをしているかは分析に重要。
期間 疑わしいプロセスが振る舞う期間。潜伏期間や攻撃期間などはマルウェアの動向を考察する上で参考になる。
方向性 通信が内向きか外向きかという方向性。外部通信であればC&C通信である可能性があり、内向きであれば横への展開(感染拡大)である可能性があるという推測ができる。
ポート トランスポート層でのポート番号。どのようなサービスにアクセスしようとしたか等を知る事が出来る。例えばポートスキャン実行時には複数の宛先ポートが検出される。
 データ量 通信量とも。不自然に大きなデータがやり取りされていれば、情報窃取やマルウェア注入などのインシデントを想起できる。 
頻度 振る舞いの頻度。通信頻度が正規ユーザが行う頻度とかけはなれていた場合、悪意のあるプロセスがバックグラウンドでC&C通信を行っている可能性などが考えられる。 また、不審な振る舞いの頻度が高ければマルウェアであるとの判断につながる。
評価 Reputation。マルウェアハッシュ値IPアドレスドメイン名、URLなどに対する評価。様々なマルウェアスキャン製品・サービスによって裏付けられた評価であり、分析対象がマルウェアか否かを判断する指標となる。 これを行うサービスとしてはVirustotalIBM X-Forceなどがある。
履歴  ログ情報。 プロセスが如何なる振る舞いをしているか、ある端末で起きている事象が他の端末でも起きていないか等の調査に役立てる。
プロセス プロセスの正当性の確認。異常なプロセスが親や子にいないか。プロセスの実行源となったファイルに署名はついているかなどを確認する。
状態

疑わしいプロセスが現段階でどのような状態にあるか。既にマルウェアとしての活動を停止しているのか、現在もまだ動作しているのかなど。 

 

怪しいプロセスの具体的な情報例

上記に記された要点に沿って、実際のマルウェアで観測されがちな特徴を記述します。

ファイルのハッシュが既知のマルウェアと一致

ファイル名は自由に決めることができるため、マルウェア配布者は、マルウェアに無害そうな名前をつけることがあります。しかし、そのファイルの内容までを悪意のないものに偽装するのは難しいことです。そこで、マルウェア解析者は、ファイルの内容を識別するためにハッシュを用います(※本筋から逸れるのでハッシュや衝突に関する説明は省略します)。既知のマルウェアのハッシュと、検知した疑わしいファイルのハッシュが一致すれば、ファイル名が異なっても中身が同じでマルウェアの可能性が高いと判断できます。ハッシュとしてはSHA1MD5がよく用いられるようです。

既知のマルウェアとハッシュが一致するものがあるか検索する際にはVirustotalなどを利用します。

ファイルパスが怪しい

例えば実行ファイルがユーザローカル領域のtempフォルダ配下から実行されている場合などは、ユーザの意図に関わらずマルウェアから実行されている場合があります。

例)Emdiviなど

また、おおよそ正規の実行ファイルはProgramFilesに置かれます。マルウェアの場合、すぐに発見されないようにフォルダの深い階層に設置するような場合があります。

アイコンや名前・拡張子がおかしい

拡張子が.pdf.exeのように2重になされている場合、2重拡張子といい、ユーザに実行ファイルではない偽装を行う意図が考えられます。2重拡張子には、.exeを表示領域から見切れさせるために、.pdf____________.exeと冗長な命名をするようなものもあります。また、実行ファイルにも関わらずドキュメントファイルのアイコンなどを装う場合もマルウェアの可能性があります。

実行ファイルが実行ファイルを作成している

ドロッパー(Dropper)と呼ばれるマルウェア等にありがちな挙動です。ドロッパーは、それ自体にC&C通信などの諜報機能を持ちませんが、実行されると、悪意のある挙動を行うマルウェアダウンローダー等)を作成して子プロセスとして実行します。

目立った諜報活動を行う子プロセスのマルウェアが削除されても、そのマルウェアを作成・実行するドロッパーが生きていればまたマルウェアが作成されるので、ドロッパーも特定して削除する必要があります。

ヒューリスティック分析(振る舞い検知)を行っているCybereason等では、実行ファイルを作成するような動作もマルウェアとして検知してくれるようです。また、仮にマルウェアが検知された場合、解析過程でその親プロセスを辿ることができればドロッパーに行きつくことがあるのでプロセスの親子関係も大事な要素です。

信頼できそうな製作者や製品名だが電子署名がない

ファイルにはその製作者や製品名を記述できますが、その他にも作成元を証明するための電子署名をつけることができます。

マルウェアの作成者は、この製作者や製品名を、偽装したアイコンやファイル名、ダウンロード時の状態に合わせてもっともらしいものに設定します。例えば、Flash Playerの脆弱性につけこんでダウンロードさせたマルウェアの場合、製作者をadobe systems incorporated、製品名をadobe flash player utilityなどとすることがあり、この情報だけだと一見安全そうに見えます。ただし、電子署名までは偽装できないので、この電子署名が無いという情報だけで一転してとても信頼性のないファイルとなります。

現状の把握

サイバー攻撃、特に標的型攻撃を、その手順ごとに段階化した考えをサイバー・キル・チェーンといいます。以下の表にその概要を示します。

名称概要 
偵察 あらゆる偵察行動を指します。企業のサイトや公開情報から、攻撃対象の情報を得る。また、攻撃の踏み台に出来そうな脆弱性のあるノードを探すなど。脆弱性の調査にはポートスキャンなどが行われる。
武器化 脆弱性のあるサイトに悪意のあるコードを埋め込んだり、攻撃ツール(rootkit,dropper)やマルウェアを作成する。
配送 なりすましメールなどにマルウェアを添付して攻撃対象に送り込んだり、悪意のあるコードを埋め込んだサイトに攻撃対象を誘導して、ドライブバイダウンロード(ユーザに気づかれないようにDL)させる。
エクスプロイト/攻撃 メールの添付ファイルを開かせたり、ダウンロードさせた実行ファイルを実行させる。
インストール エクスプロイトの結果としてマルウェアが設置される。
遠隔操作 C&Cサーバに接続させることにより、感染端末を遠隔操作する。
侵入拡大 通称、横への展開とも呼ばれ、ネットワーク内で脆弱性を探して侵入先を拡大する。
目的実行 目的の情報を窃取する。

現状を把握する場合、このサイバー・キル・チェーンがどの段階かを把握すると良いかもしれません。また、攻撃対策時には、このサイバー・キル・チェーンをどこで切れるかを考慮します。

過検知について

正規の正常なソフトウェアが誤ってマルウェアと検知されてしまうことを過検知といいます。とりあえず疑わしきは罰するという路線では業務がままならず、必要である正常なソフトウェアは削除しないようにしなくてはならないため、過検知かどうかを正しく判断する技術が重要になってきます。

対応

対応は技術的対応と業務的対応に分けられると思います。

技術的対応としては例えば

・C&Cサーバのアドレスをブラックリストに登録して通信させないようにする

マルウェアやその生成源を特定して削除する

・感染の疑われるノードのスキャン

・感染の疑われる端末の押収と実端末上での捜査

などが挙げられます。

業務的な対応としては例えば

・感染先ネットワークの管理者や上長、セキュリティチームへの報告

・インシデント関係者への聴取と警告

などが挙げられます。