
Detux は、Linux マルウェアのトラフィック分析と IOCs の取得を目的として開発されたサンドボックスです。QEMU ハイパーバイザーを使用して、さまざまな CPU アーキテクチャ向けに Linux (Debian) をエミュレートします。
現在、以下の CPU がサポートされています:
ライブバージョンを使用する: http://detux.org
この Detux のリリースには、指定された CPU アーキテクチャで Linux バイナリ/スクリプトを実行するためのスクリプトが含まれています。プラットフォームがわからなくても心配はいりません。スクリプト内で、Magic パッケージが CPU アーキテクチャを自動的に選択するのに役立ちます。x86 がデフォルトの CPU バージョンですが、設定ファイルで別のものに変更できます。
このリリースでは、分析レポートが DICT 形式で提供され、NOSQL データベースに挿入するために簡単にカスタマイズできます。
サンドボックスライブラリの使用方法を示すサンプルスクリプトが提供されています。
- 静的解析
-- バイナリから抽出された基本文字列
-- readelf コマンドで生成された ELF 情報
-- report.py を変更して、バイナリを解析するためのサードパーティコマンドを追加し、結果を DICT に追加できます。
- 動的解析
-- キャプチャされた pcap は DPKT で解析され、パケットから IOC と読み取り可能な情報が抽出されます。
システムパッケージ
Python ライブラリ (仮想環境の使用を推奨)
Detux を使用する前に、上記の要件が満たされていることを確認してください。依存関係は OS によって異なる場合があります。
- NIC1 : このインターフェースはホストへのアクセス用
- NIC2 : QEMU サンドボックス VM とブリッジされたインターフェース。このインターフェースからのトラフィックを WHONIX や REMNUX、またはカスタムゲートウェイにリダイレクトして、サンドボックス VM のインターネットアクセスをフィルタリング/許可できます。
すべての可能な CPU アーキテクチャ向けに事前構築された QEMU Debian VM イメージをアップロードしてくれた aurel に感謝します。 VM イメージは https://people.debian.org/~aurel32/qemu/ にあります。同じリンクには、VM イメージを起動するためのコマンド例も含まれています。
以下のスクリプトを使用して、VM イメージを Detux の 'qemu' フォルダに自動的にダウンロードできます。
#x86
wget https://people.debian.org/~aurel32/qemu/i386/debian_wheezy_i386_standard.qcow2 -P qemu/x86/1/
#x86-64
wget https://people.debian.org/~aurel32/qemu/amd64/debian_wheezy_amd64_standard.qcow2 -P qemu/x86-64/1/
#arm
wget https://people.debian.org/~aurel32/qemu/armel/debian_wheezy_armel_standard.qcow2 -P qemu/arm/1/
wget https://people.debian.org/~aurel32/qemu/armel/initrd.img-3.2.0-4-versatile -P qemu/arm/1/
wget https://people.debian.org/~aurel32/qemu/armel/vmlinuz-3.2.0-4-versatile -P qemu/arm/1/
#mips
wget https://people.debian.org/~aurel32/qemu/mips/vmlinux-3.2.0-4-4kc-malta -P qemu/mips/1/
wget https://people.debian.org/~aurel32/qemu/mips/debian_wheezy_mips_standard.qcow2 -P qemu/mips/1/
#mipsel
wget https://people.debian.org/~aurel32/qemu/mipsel/vmlinux-3.2.0-4-4kc-malta -P qemu/mipsel/1/
wget https://people.debian.org/~aurel32/qemu/mipsel/debian_wheezy_mipsel_standard.qcow2 -P qemu/mipsel/1/
Detux は SSH を使用して VM と通信するため、現在 VM にネットワーク機能を持たせるためにこれが必要です。リストされたバイナリが同じパスにある場合、/etc/sudoers に以下の行を追加してください (非 root ユーザーの場合のみ):
Cmnd_Alias QEMU_CMD = /usr/bin/qemu-*, /sbin/ip, /sbin/ifconfig, /sbin/brctl
<your detux username here> ALL = (ALL) NOPASSWD: QEMU_CMD
パスが異なる場合は、バイナリへのパスを変更してください。
以下の設定を /etc/qemu-ifup に追加してください。すでにある場合は元のファイルをバックアップしてください。
#! /bin/sh
# Script to bring a network (tap) device for qemu up.
# The idea is to add the tap device to the same bridge
# as we have default routing to.
# in order to be able to find brctl
PATH=$PATH:/sbin:/usr/sbin
ip=$(which ip)
ifconfig=$(which ifconfig)
echo "Starting" $1
if [ -n "$ip" ]; then
ip link set "$1" up
else
brctl=$(which brctl)
if [ ! "$ip" -o ! "$brctl" ]; then
echo "W: $0: not doing any bridge processing: neither ip nor brctl utility not found" >&2
exit 0
fi
ifconfig "$1" 0.0.0.0 up
fi
switch=$(ip route ls | \
awk '/^default / {
for(i=0;i<NF;i++) { if ($i == "dev") { print $(i+1); next; } }
}'
)
if [ -d /sys/class/net/br0/bridge/. ]; then
if [ -n "$ip" ]; then
ip link set "$1" master br0
else
brctl addif br0 "$1"
fi
exit # exit with status of the previous command
fi
echo "W: $0: no bridge for guest interface found" >&2
eth0 が VM とブリッジしたいインターフェースである場合、eth0 の設定を削除し、/etc/network/interfaces で以下の設定を使用してください。
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_maxwait 0
eth0 で使用していた静的アドレスを指定することもできます。
各 QEMU イメージの VM イメージが配置されているフォルダに移動します。例: ARM の場合:
<your detux folder>/qemu/arm/1/
各イメージについて、https://people.debian.org/~aurel32/ にある VM 起動手順に従って VM を起動してください。ただし、非 root ユーザーの場合、sudo を使用する必要があります。
VM 起動コマンド ( を希望の MAC アドレスに置き換えてください):
#x86
sudo qemu-system-i386 -hda qemu/x86/1/debian_wheezy_i386_standard.qcow2 -vnc 127.0.0.1:5901 -net nic,macaddr=<MACADDR> -net tap -monitor stdio
#x86-64
sudo qemu-system-x86_64 -hda qemu/x86-64/1/debian_wheezy_amd64_standard.qcow2 -vnc 127.0.0.1:5901 -net nic,macaddr=<MACADDR> -net tap -monitor stdio
#arm
sudo qemu-system-arm -M versatilepb -kernel qemu/arm/1/vmlinuz-3.2.0-4-versatile -initrd qemu/arm/1/initrd.img-3.2.0-4-versatile -hda qemu/arm/1/debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1" -vnc 127.0.0.1:5901 -net nic,macaddr=<MACADDR> -net tap -monitor stdio
#mips
sudo qemu-system-mips -M malta -kernel qemu/mips/1/vmlinux-3.2.0-4-4kc-malta -hda qemu/mips/1/debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -vnc 127.0.0.1:5901 -net nic,macaddr=<MACADDR> -net tap -monitor stdio
#mipsel
sudo qemu-system-mipsel -M malta -kernel qemu/mipsel/1/vmlinux-3.2.0-4-4kc-malta -hda qemu/mipsel/1/debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -vnc 127.0.0.1:5901 -net nic,macaddr=<MACADDR> -net tap -monitor stdio
Detux は、IP アドレスと ssh セットアップが設定済みの VM スナップショットを必要とします。
(qemu)
(qemu) savevm init
(qemu) q
-- すべての VM に対して手順 1 から繰り返します
非 root ユーザーがパケットをキャプチャできるようにするには、Dumpcap にキャプチャ権限が必要です。(https://wiki.wireshark.org/CaptureSetup/CapturePrivileges)
以下のコマンドで有効にできる場合があります:
sudo groupadd -g wireshark
sudo usermod -a -G wireshark <your user name>
sudo chmod 750 /usr/bin/dumpcap
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
権限を適用するには、ログアウトして再ログインするか、ホストを再起動する必要がある場合があることに注意してください。 パケットをキャプチャできない場合や dumpcap に関連するエラーが発生する場合は、ユーザーの権限が正しく設定されているか、dumpcap のパスが正しいかを確認する必要があります。
メインディレクトリにある detux.cfg ファイルを設定する必要があります。各 VM セクションには、正しいネットワークパラメータと SSH 認証情報を設定する必要があります。必要に応じて root/非 root ユーザーを選択できます。
core ディレクトリにある Detux ライブラリは、分析のニーズに合わせて使用できます。リポジトリには detux.py が含まれており、指定されたバイナリを解析して pcap を pcap フォルダに保存し、JSON 出力を指定されたファイルパスに書き込みます。
usage: detux.py [-h] --sample SAMPLE [--cpu {x86,x86-64,arm,mips,mipsel}]
[--int {python,perl,sh,bash}] --report REPORT
optional arguments:
-h, --help show this help message and exit
--sample SAMPLE Sample path (default: None)
--cpu {x86,x86-64,arm,mips,mipsel}
CPU type (default: auto)
--int {python,perl,sh,bash}
Architecture type (default: None)
--report REPORT JSON report output path (default: None)
例:
python detux.py --sample test_script/example_binary1 --report reports/example_report1.json
事前構築された VM イメージを提供してくれた Aurélien Jarno (@aurel32) (https://www.aurel32.net/) に感謝します。