EC2上にHoneypot : Dionaeaを建ててマルウェアを収集する話
はじめに
以前建てていたT-potがあまりにもお財布に優しくなかったため、Dionaeaのみを建てることにしました。 今回は、EC2を利用してDionaeaを構築してマルウェアを収集するまでになります。
Dionaeaとは
Dionaeaとは、日本語でハエトリグサを意味する名前のハニーポットで、 攻撃者からマルウェアのコピーを手に入れることを目的としたマルウェア収集用ハニーポットになります。
Dionaeaの必要要件
| Platform | Option |
|---|---|
| OS | - Ubuntu 18.04 LTS(推奨)(開発で利用) - Debian 10(推奨) |
| Python | - 3.9(推奨) - 3.8(推奨) |
今回はUbuntu18.04 LTSを利用して作成します。
EC2 インスタンスの準備
以下のボタンからインスタンスの作成・起動を行います。

今回は「dionaea」というインスタンス名にしました。

Ubuntu18.04 LTSはここでは出てこないので、検索バーに「Ubuntu」と入力して検索をします。

続いて、「AWS Marketplace AMI」を選択して、Ubuntu18.04 LTSを選択します。

そのまま「続行」を押して進むと以下のようにOSイメージが設定できました。

インスタンスタイプは無料利用枠の対象である「t2.micro」を選択しました。
今後ログの量などを鑑みて、より高性能なものに変更する予定ですが今回はテストとして行ったのでこちらを選びました。

キーペアは事前に作っていたものを設定しましが、もしキーペアがない場合は「新しいキーペアの作成」からキーペアを作成します。
キーペアは後にSSH接続する際に必要となるのでわかりやすいところに保存しておきます。

続いてネットワーク設定では、Dionaeaが攻撃されるための対象ポートをオープンにする必要があります。
今回は事前に作っていた既存のセキュリティグループを設定しましたが、無い場合はセキュリティグループを作成から新たにセキュリティグループを作成する必要があります。

私は以下のような形で設定しました。設定方法については今回は省略します。 赤枠で囲ってあるポート番号22番のSSHについては、以下のようなサイトで自分の使用しているIPアドレスを調べて「ソース」に設定する必要があります。

その他の項目についてはすべてデフォルトのままで「インスタンスを起動」を実行します。

インスタンスの生成・起動ができました。

SSH接続
生成したインスタンスを選択した状態で「接続」を選択します。

「EC2 Instance Connect」の赤枠で囲ってある部分のパブリックIPアドレスとユーザ名を確認しておきます。
恐らくこれまでの通りに設定していればユーザ名は「ubuntu」になっているかと思います。

続いて、ここからターミナルエミュレータなどを利用してSSH接続を行います。 今回はTeraTermを利用しました。
まず、先ほど確認したパブリックIPアドレスを指定して「OK」を押します。

このような画面が出てくるので「続行」を選択します。

「ユーザ名」に先ほど確認したものを入力し、事前に作成したキーペアを秘密鍵として選択し、「OK」を押すと接続できます。

Dionaeaインストール
いよいよDionaeaのインストールです。 以下のコマンドを用いてDionaeaをインストールします。
# rootに変更
sudo su -
# パッケージアップデート
apt update -y
apt upgrade -y
# ソースコードダウンロード
git clone https://github.com/DinoTools/dionaea.git
cd dionaea
# 依存関係のインストール
apt install \
build-essential \
cmake \
check \
cython3 \
libcurl4-openssl-dev \
libemu-dev \
libev-dev \
libglib2.0-dev \
libloudmouth1-dev \
libnetfilter-queue-dev \
libnl-3-dev \
libpcap-dev \
libssl-dev \
libtool \
libudns-dev \
python3 \
python3-dev \
python3-bson \
python3-yaml \
python3-boto3 \
fonts-liberation -y
# ビルドディレクトリの作成、cmakeの実行
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/opt/dionaea ..
# makeの実行、make installの実行 ⇒ ハニーポットのインストール
make
make install
# Dionaeaの実行
/opt/dionaea/bin/dionaea -D -c /opt/dionaea/etc/dionaea/dionaea.cfg
データの確認
以下のディレクトリにて収集したデータの確認ができます。 ※一部のみの記載
/opt/dionaea/var/
| フォルダ | 内容 |
|---|---|
| lib/dionaea/binaries | マルウェアのハッシュ値 |
| lib/dionaea/bistream | 攻撃通信のデータ |
| log/dionaea/dionaea-errors.log | エラーログ |
| log/dionaea/dionaea.log | 通信ログ |
おわりに
今回はDionaeaの構築まででしたが、実際のログの量などから適切な要件を考えていきたいです。 また、近いうちにVirusTotalからレピュテーション情報を集めて、fluentdやKibanaを利用して可視化まで持っていきたいところです。
WaniCTF2023 Writeup
はじめに
5月4日~5月6日に開催されたWaniCTF2023に参加しましたので、数問ではありますがWriteupを残します。
Forensics
Just_mp4 [Beginner]
✨✨✨ Enjoy wani CTF ! ✨✨✨
mp4ファイルが配布されているのでexiftoolで調べたところ、Publisherの項目にBase64でエンコードされていると思われるFlagが見つかりました。
└─$ exiftool chall.mp4 ExifTool Version Number : 12.57 File Name : chall.mp4 Directory : . ... Video Frame Rate : 30 Handler Type : Metadata Publisher : flag_base64:RkxBR3tINHYxbl9mdW5fMW5uMXR9 ...
これをbase64でデコードしてみたところFlagを得ることができました。
└─$ echo RkxBR3tINHYxbl9mdW5fMW5uMXR9 | base64 -d
FLAG{H4v1n_fun_1nn1t}
whats_happening [Beginner]
あなたはとあるファイルを入手しましたが、どうも壊れているようです…… You got a certain file, but it seems to be corrupted...
渡されたファイルをfileコマンドで確認すると、"ISO 9660 CD-ROM filesystem data"という形式のファイルシステムのようです。 mountコマンドでマウントして中のファイルを確認すると2つのファイルが確認できます。
└─$ sudo mount -o loop updog /mnt/ctf mount: /mnt/ctf: WARNING: source write-protected, mounted read-only. └─$ ls /mnt/ctf FAKE_FLAG.txt FLAG.png
FLAG.pngを確認するとFlag{n0th1ng_much}を得ることができました。
lowkey_messedup [Easy]
誰も見てないよね……? No one is watching me, right...?
渡されたpcapファイルをwiresharkで見てみると、USB通信のようでした。 似たような問題がないか調べたところ、こちらのサイトで同様の問題を解くScriptを発見したため、 お借りして実行したところFlagを取得することができました。
└─$ python3 solve.py chall.pcap
[+] Found : FLAG{Big_br0ther_is_watching_y0ur_keyboard<DEL><DEL><DEL><DEL>0ard}<RET>
"DEL"はbackspaceとして考えるため、FlagはFLAG{Big_br0ther_is_watching_y0ur_keyb0ard}となります。
Reversing
Just_Passw0rd [Beginner]
ELFファイルはWSLやLinux等で./just_passwordと入力することで実行できます。 この問題のELFファイルは実行するとパスワードの入力を求められますが、パスワードが分からなくても中身を覗き見る方法はありますか? ELF file can be executed by typing ./just_password in WSL or Linux. In this challenge, The ELF file requires password. Is there a way to look inside without knowing the password?
渡されたファイルをfileコマンドで調べてみるとELF形式の実行ファイルでした。 とりあえずstringsコマンドを実行してみると、Flagを見つけることができました。
└─$ file just_password
just_password: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=e990f2bb14ee6e4e795426f11da51bf989ef1152, for GNU/Linux 3.2.0, not stripped
└─$ strings just_password
...
Input password >
Incorrect
Correct!
FLAG is FLAG{1234_P@ssw0rd_admin_toor_qwerty}
:*3$"
GCC: (Ubuntu 8.4.0-3ubuntu2) 8.4.0
...
javersing [Easy]
渡されたファイルはjar形式のファイルであったため、JD-GUIを用いて逆コンパイルしてみました。
import java.util.Scanner;
public class javersing {
public static void main(String[] paramArrayOfString) {
String str1 = "Fcn_yDlvaGpj_Logi}eias{iaeAm_s";
boolean bool = true;
Scanner scanner = new Scanner(System.in);
System.out.println("Input password: ");
String str2 = scanner.nextLine();
str2 = String.format("%30s", new Object[] { str2 }).replace(" ", "0");
for (byte b = 0; b < 30; b++) {
if (str2.charAt(b * 7 % 30) != str1.charAt(b))
bool = false;
}
if (bool) {
System.out.println("Correct!");
} else {
System.out.println("Incorrect...");
}
}
}
str2[b*7%30]=str1[b]を満たすように、str1の文字列を並び替えたものを入力するとCorrect!と表示されるプログラムのようです。 str1の文字列から、Correct!と表示させるための並び替えた文字列がFlagになりそうな雰囲気があります。
#include<iostream>
using namespace std;
int main(){
char a[31]="Fcn_yDlvaGpj_Logi}eias{iaeAm_s";
char b[31]="";
for(int i=0;i<30;i++){
b[i*7%30]=a[i];
}
for(int i=0;i<30;i++){
cout<<b[i];
}
return 0;
}
上記のソルバーを実行したところFlagを取得することができました。
└─$ ./a.out
FLAG{Decompiling_java_is_easy}
おわりに
今回は2時間ほどしか参加できず、思うように解くことができませんでしたが楽しく参加することができました! 他の方々のWriteupなどを参考に復習しつつ、全完目指して頑張っていきたいです。
機械学習によるマルウェア検出に入門してみた
この記事はIPFactory Advent Calendar 2022の21日目の記事です。
はじめに
今回は、遅ればせながら先日購入した『セキュリティエンジニアのための機械学習』を参考に機械学習によるマルウェア検出に入門してみました。
環境の準備
書籍で推奨されていたGoogle Colaboratoryを使用しました。
Google Colaboratoryは、ブラウザ上でPythonを記述・実行できるサービスです。 機械学習で利用する数多くの外部ライブラリがインストールされており、基本無料でGPUやTPUといったハードウェア機能を利用することができます。
機械学習アルゴリズム
今回はロジスティック回帰を利用してマルウェアの検出器を作成してみます。
探索的データ解析
早速マルウェア検出器の作成に移るのですが、まずは探索的データ解析を行います。 探索的データ解析とは、データの集計や可視化を行うことでデータの異常や特徴を調べることです。
データセット
データセットは研究等での使用を目的として、Webサイトからマルウェアの検体を入手することができますが、
今回は書籍のサンプルデータとしてGitHubに置かれているPrateek Lalwaniさんによって提供されているマルウェアのデータセットを利用しました。
pandasライブラリと探索的データ解析が素早くできるオープンソースのpandas_profilingパッケージを利用してデータの読み込みとデータセットの分析を行います。
# 必要なパッケージのロード import pandas as pd import pandas_profiling # csvファイルから"|"区切りでデータを読み込み MalwareDataset = pe.read_csv('MalwareDataset.csv', sep = '|') # 最小限の情報のみを出力 pandas_profiling.ProfileReport(MalwareDataset, minmal=True)
実行すると以下のように項目ごとに集計され出力され、
Variable typesから2項目がカテゴリ変数、55項目が数値型の項目であることが分かります。

まずは、ロジスティック回帰を利用した検出器を作成してみます。
# 必要なパッケージをロード from sklearn.linear_model import LogisticRegression # ロジスティック回帰 from sklearn.metrics import accuracy_score # 検出器の正解率を出力 from sklearn.model_selection import train_test_split # データセットの分割 # カテゴリ変数の「Name」「md5」とラベルとなる「legitimate」を除いた列(axis=1) X = MalwareDataset.drop(['Name','md5','legitimate'], axis=1) # ラベル「legitimate」 y = MalwareDataset['legitimate'] # ソルバーにL-BFGS法を指定したロディスティック回帰を使った検出器を作成 detector= LogisticRegression() # 訓練用データで検出器を訓練 predictions = detector.predict(X_test) # 検出器の正解率を出力 accuracy = 100.0 * accuracy_score(y_test, predictions) print(accuracy)
# 出力結果 70.50344078232524
調べてみるとどうやらLogisticRegression()ではL-BFGS法以外のソルバーを選択することができるようだったので、色々と試してみました。
| solver | 詳細 | 正解率 |
|---|---|---|
| lbfgs | L-BFGS法 | 70.50344078232524 |
| newton-cg | ニュートン共役勾配法 | 95.63201738500543 |
| liblinear | liblinearライブラリ 小さなデータセットだと早い |
30.028975009054694 |
| sag(Stochastic Average Grandient) | 確率的勾配降下法(SAG)の進化したもの 大きなデータセットだと早い | 29.496559217674758 |
続いてL-BFGS法で交差検証を行ってみます。
交差検証は、まずデータを任意の数K個に分割して一つをテストデータとします。その他すべてを訓練データとし評価を行うことをテストデータが毎度異なるようにK回繰り返します。 これらの結果の平均を取ることでデータの方よりがあった場合の性能の低下を防ぎます。
# 必要なパッケージのロード from sklearn.model_selection import cross_validate # 交差検証 from sklearn.model_selection import cross_val_score # 交差検証(K=8) scores = cross_val_score(detector, X_train, y_train, cv=8) # 結果の出力 print(100*scores.mean())
# 出力結果 69.95662689197374
今回は8分割交差検証の結果を出してみましたが、こちらも約70%という結果になりました。
終わりに
今回はロジスティック回帰を利用した検出器の作成のみでしたが、近いうちにハイパーパラメータの最適化やその他のアルゴリズムを用いた検出器の構築もしてみたいと思います。 T-potで収集したマルウェアで実際に検出できるのか試してみるのも面白そうです。
参考記事・サイト
この記事はIPFactory Advent Calendar 2022の21日目の記事です。 昨日はn01e0先輩によるchromolyでした。明日はriiriiriiさんの記事です。
Amazon LighsailにT-pot 22.04.0を構築した
はじめに
今回は、Amazon LightsailにT-pot22.04.0をインストールしたので、その手順を本記事にまとめました。(2023/04/10更新)
インスタンスの準備
T-pot 22.04.0のシステム要件
T-pot 22.04.0のシステム要件についてはSystem requirementsに記載されています。
T-potのインストールには最低8〜16GBのRAMと128GBのディスク、及び動作可能なインターネット接続が必要になります。
また、インストールドキュメント(Tecnical Concept, Post install)には以下のように記載されており、Debian11で動作することを前提としています。
T-Pot is based on the Debian 11 (Bullseye) Netinstaller and utilizes docker and docker-compose to reach its goal of running as many tools as possible simultaneously and thus utilizing the host's hardware to its maximum.
In some cases it is necessary to install T-Pot after you install Debian.
インスタンスの生成
AWSのサービスからLightSailを選択し、「インスタンスの生成」ボタンを押します。

リージョン
どこでも問題ないようですが、今回はTokyoを選択しました。

インスタンスイメージの選択
プラットフォームは「Linux/Unix」を選択、設計図は「OSのみ」「Debian10.8」「Debian11.4」を選択します。

インスタンスプランの選択
$80(CPU:4core、RAM:16GB、SSD:320GB、HDD:6TB)を選択します。$40でもインストールはできましたが、可視化ツールが正常に動作しませんでした。

インスタンス名の設定
インスタンス名は「T-pot」にしました。

インスタンスの生成が完了しました。
SSH接続
どのタイミングかは確認していませんが、途中でブラウザベースのSSH接続ができなくなってしまうため、Tera TermなどのターミナルエミュレータやコマンドからSSH接続して作業を行います。
まず、インスタンスの接続タブからsshキーファイルをダウンロードしておきます。
Tera Term
インストールはこちらから:https://ja.osdn.net/projects/ttssh2/releases/
この時点では、接続ポートは22です。
ユーザ名に「admin」を指定し、認証方式で「RDS/DSA/ECDSA/ED25519鍵を使う」を選択し、ダウンロードしたsshキーを指定して接続します。

sshコマンド
コマンドで接続する場合は以下のコマンドを実行します。
sudo su - chmod 600 <sshキーのパス> ssh -p 22 -l admin -i <sshキーのパス> <インスタンスのpublic IP>
Debian10からDebian11へアップグレード(現在はDebian11.4を選択できるためここは飛ばしてください。)
T-pot22.04.0はDebian11(bullseye)での動作が前提となっているので、T-potをインストールする前にアップグレードします。
バージョン確認
LInux,OSのバージョン
lsb_release -a
uname -mrs
Debianのバージョン
cat /etc/debian_version
既存のパッケージの更新
アップデートの過程でerrorを引き起こさないように、すべてのセキュリティパッチと保留中のアップグレードをDebian10に適応させ、システムを再起動します。
sudo apt-mark showhold | more sudo apt-mark unhold package_name sudo apt-get update sudo apt-get upgrade sudo apt-get full-upgrade sudo apt-get --purge autoremove sudo systemctl reboot
/etc/apt/souces.listの更新
/etc/apt/sources.listで指定されたサーバからパッケージを取得しているようなので、アップグレードする前にこちらを書き換える必要があります。
before
deb http://cdn-aws.deb.debian.org/debian buster main deb-src http://cdn-aws.deb.debian.org/debian buster main deb http://security.debian.org/debian-security buster/updates main deb-src http://security.debian.org/debian-security buster/updates main deb http://cdn-aws.deb.debian.org/debian buster-updates main deb-src http://cdn-aws.deb.debian.org/debian buster-updates main deb http://cdn-aws.deb.debian.org/debian buster-backports main deb-src http://cdn-aws.deb.debian.org/debian buster-backports main
after
deb http://cdn-aws.deb.debian.org/debian bullseye main deb-src http://cdn-aws.deb.debian.org/debian bullseye main deb http://security.debian.org/debian-security bullseye-security/updates main deb-src http://security.debian.org/debian-security bullseye-security/updates main deb http://cdn-aws.deb.debian.org/debian bullseye-updates main deb-src http://cdn-aws.deb.debian.org/debian bullseye-updates main deb http://cdn-aws.deb.debian.org/debian bullseye-backports main deb-src http://cdn-aws.deb.debian.org/debian bullseye-backports main
最小限のシステムアップグレード
まず、最小のシステムインストールを行います。
sudo apt update sudo apt upgrade --without-new-pkgs
こちらの画面が出てきた場合は「はい」を選択します。

フルアップグレード
問題がなければ以下のコマンドでシステム全体のアップグレードを行います。
sudo apt full-upgrade
このような画面が出てきた場合は「keep the local version currently installed」を選択します。

Linuxシステムの再起動
システムの再起動を行い、アップグレードできていることを確認します。
sudo systemctl reboot lsb_release -a uname -mrs cat /etc/debian_version
T-pot 22.04.0のインストール
いよいよT-potのインストールに入ります。
Gitインストール
まずはじめにGitのインストールを行います。後に必要になるのでパスワードの設定も行います。
sudo su - apt-get update -y && apt-get upgrade -y passwd admin apt-get install git
T-potインストール
今回はこちらからクローンしました。
インストーラーのあるディレクトリに移動し、設定ファイルのdistributionを同名でコピーします。
管理画面のユーザ名とパスワードを設定する場合は、このファイルを編集します。
git clone https://github.com/telekom-security/tpotce cd tpotce/iso/installer/ cp tpot.conf.dist tpot.conf vim tpot.conf
default
myCONF_WEB_USER :webuser myCONF_WEB_PW :w3b$ecret
以下のコマンドでT-potをインストールします。
sudo ./install.sh --type=auto --conf=tpot.conf
※インストールの途中で中断してしまったり、エラーがでてしまった場合にはもう一度インスタンスを生成し直す必要があります。
インストールが完了すると再起動を促すメッセージが表示されるので、以下のコマンドで再起動を行います。
reboot
再起動するとT-potが起動できています。
アクセスポートの設定
管理用途のアクセス(管理画面、SSH接続、Cockpit)ができるように、Light SailのインスタンスのネットワーキングタブからIPv4ファイアウォールを編集します。
- 64294(Cockpit用ポート)
- 64295(SSH接続用ポート)
- 64297(webUI用ポート)
上記のポートは安全のため、DHCPサーバによって割り当てられているIPアドレスのみに限定すると良いかと思います。
DHCPにより割り当てられているIPアドレスはこちらのサイトから調べることができます。

※T-potのインストールを行い再起動すると、SSH接続のポートが変わっているので22番ポートでは接続できなくなります。
管理画面(webUI)の確認
Webブラウザでhttps://<インスタンスのpublic IP>:64297を開きます。
「この接続ではプライバシーが保護されません」もしくは「潜在的なセキュリティリスクあり」と表示されますが、 「詳細情報」から「<IPアドレス> にアクセスする(安全ではありません)」もしくは「危険性を承知で続行」を選択します。
ポップアップでWebユーザ名とパスワードを求められるので、tpot.confで設定したものを入力します。
成功すると以下のような画面が表示されます。

この時点ではポートを開いていないので攻撃は観測できません。
SSH接続
次に、SSH接続を行います。
Tera Term
ここでは接続ポートは64295に設定します。
ユーザ名、sshキーを選択して接続します。

sshコマンド
こちらも接続ポートを変更する以外は先程と同様です。
sudo su - #chmod 600 <SSHキーのパス> //permissionが変更されていなければ ssh -p 64295 -l admin -i <SSHキーのパス> <インスタンスのpublic IP>
Cockpitにアクセス
先程の管理画面からCockpitを選択すると、再びセキュリティのリスクがある旨のメッセージが表示されますが、 「詳細情報」から続行します。
以下のような画面が表示され、マシンのユーザ名とパスワードを求められるので入力します。

通るとこのようにマシンの状態を視覚的に確認できます。

アクセスポートの開放
最後に、攻撃を受けるために1-64000のアクセスポートを開放します。
詳しいアクセスポートについてはRequired Portから確認できます。

少し時間をおいてWebUIからkibanaを開くと以下の様に攻撃が観測できました。

参考記事・サイト
How to upgrade Debian 10 to Debian 11 Bullseye using the CLI - nixCraft