PacuとGuardDuty

## はじめに

### ざっくり言うと
- AWS攻撃ツール[**Pacu**](https://rhinosecuritylabs.com/aws/pacu-open-source-aws-exploitation-framework/)によるアクセスをAWSのセキュリティ機能[**Amazon GuardDuty**](https://aws.amazon.com/jp/guardduty/)で検知できるか試した


### 対象とする人
- AWSのアカウントの運用・管理を任されている
- クラウドセキュリティに興味がある人



### やること
- Pacuの概要と機能紹介
- Google ColabでPacuを動かす
- GuardDutyでPacuを検知できたか確認する

## Pacu

### 概要

>![](https://rhinosecuritylabs.com/wp-content/uploads/2018/08/PACU_NO-TEXT_Logo_Final-CopyE-1140x400.jpg)

>Pacu is an open source AWS exploitation framework, designed for offensive security testing against cloud environments. Created and maintained by Rhino Security Labs, Pacu allows penetration testers to exploit configuration flaws within an AWS account, using modules to easily expand its functionality. Current modules enable a range of attacks, including user privilege escalation, backdooring of IAM users, attacking vulnerable Lambda functions, and much more. 
 [GitHub - RhinoSecurityLabs/pacu](https://github.com/RhinoSecurityLabs/pacu)


PacuはオープンソースのAWSエクスプロイトフレームワークである。Pacuという名前は南米アマゾン川に生息するピラニアの仲間「Pacu」に因んでいる。開発元は米国シアトルのRhinoSecurityLabs。

Pacuを利用すれば **不正な権限昇格** や **脆弱なLambda関数への攻撃** などを行うことが可能であり、自分で自分のAWS環境を突いてセキュリティ上の抜け穴がないかどうかチェックすることができる。


大まかな機能を下記にまとめる。

機能|概要
---|---
confirm_permissions|現在のアカウントの権限周りの設定を調査する
privesc_scan|権限の不正昇格
cloudtrail_csv_injection|CloudTrailの出力csvファイルに不正な文字列を混入させる
disrupt_monitoring|CloudTrailやCloudWatchなどのログ、モニタリングを撹乱する
backdoor_users_[keys/passwords]|IAMアカウントに対してバックドアを仕掛ける
sysman_ec2_rce|SSM[^ssm]を不正利用しEC２で不正なコードを実行させる
backdoor_ec2_sec_groups|セキュリティグループにバックドアを仕掛ける


[^ssm]: System Security Manager 

このようなエクスプロイトツールは攻撃者のハッキングツールとなってしまうことがよくあるが、**利用する際にユーザ自身のアクセスキーを登録する必要がある**ためPacuが悪用される可能性はあまりないと思われる。

ただし、どこかでアクセスキーを不正に入手した攻撃者がPacuでアクセスしてくる可能性は存分に考えられるため、こういったツールによるアクセスを想定しておくのはセキュリティ向上のために非常に重要である。




### インストールと設定
公式サイトからそのまま引用

```shell
git clone https://github.com/RhinoSecurityLabs/pacu
cd pacu
bash install.sh
python3 pacu.py
```

LinuxとMacOSXをサポートと記載があったが、Windows用のinstall手順も紹介されている。
AWSのSDKが動作すれば環境はあまり関係なさそうだ。

サーバを立てるのもメンドくさいのでGoogle Colabからやってみた。


<img width="1437" alt="スクリーンショット 2019-01-15 20.22.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/319677/dfdf962e-1bb9-a566-2398-d977fad7f619.png">

普通にできた。各コマンドの先頭に"!"をつければそのまま実行可能。ただし、cdコマンドだけは"%"を付けるのに注意。

[【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory - Qiita](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)

Pacuを実行してみよう。

![pacu-test1.gif](https://qiita-image-store.s3.amazonaws.com/0/319677/ed37d615-727f-f9a8-6901-68b7401baace.gif)


ピラニアっぽいロゴが表示された。

初めて使う場合はセッション名をつけるかどうか聞かれるので適当に名前を付けておく。設定したアクセスキーやリージョンなどはセッションごとに保存されるため、次回以降はセッションを指定すれば設定が読み込まれる。


Pacuで実行できるコマンドの一覧はこちら。

```
Pacu command info:
    list/ls                             List all modules
    search [cat[egory]] <search term>   Search the list of available modules by name or category
    help                                Display this page of information
    help <module name>                  Display information about a module
    whoami                              Display information regarding to the active access keys
    data                                Display all data that is stored in this session. Only fields
                                          with values will be displayed
    data <service>|proxy                Display all data for a specified service or for PacuProxy
                                          in this session
    services                            Display a list of services that have collected data in the
                                          current session to use with the "data" command
    regions                             Display a list of all valid AWS regions
    update_regions                      Run a script to update the regions database to the newest
                                          version
    set_regions <region> [<region>...]  Set the default regions for this session. These space-separated
                                          regions will be used for modules where regions are required,
                                          but not supplied by the user. The default set of regions is
                                          every supported region for the service. Supply "all" to this
                                          command to reset the region set to the default of all
                                          supported regions
    run/exec <module name>              Execute a module
    set_keys                            Add a set of AWS keys to the session and set them as the
                                          default
    swap_keys                           Change the currently active AWS key to another key that has
                                          previously been set for this session
    exit/quit                           Exit Pacu

Other command info:
    aws <command>                       Run an AWS CLI command directly. Note: If Pacu detects "aws"
                                          as the first word of the command, the whole command will
                                          instead be run in a shell so that you can use the AWS CLI
                                          from within Pacu. Due to the command running in a shell,
                                          this enables you to pipe output where needed. An example
                                          would be to run an AWS CLI command and pipe it into "jq"
                                          to parse the data returned. Warning: The AWS CLI's
                                          authentication is not related to Pacu. Be careful to
                                          ensure that you are using the keys you want when using
                                          the AWS CLI. It is suggested to use AWS CLI profiles
                                          to solve this problem

[ADVANCED] PacuProxy command info:
    proxy [help]                        Control PacuProxy/display help
        start <ip> [port]                 Start the PacuProxy listener - port 80 by default.
                                            The listener will attempt to start on the IP
                                            supplied, but some hosts don't allow this. In
                                            this case, PacuProxy will listen on 0.0.0.0 and
                                            use the supplied IP to stage agents and it should
                                            work the same
        stop                              Stop the PacuProxy listener
        kill <agent_id>                   Kill an agent (stop it from running on the host)
        list/ls                           List info on remote agent(s)
        use none|<agent_id>               Use a remote agent, identified by unique integers
                                            (use "proxy list" to see them). Choose "none" to
                                            no longer use any proxy (route from the local
                                            host instead)
        shell <agent_id> <command>        Run a shell command on the remote agent
        fetch_ec2_keys <agent_id>         Try to read the meta-data of the target agent to
                                            request a set of temporary credentials for the
                                            attached instance profile (if there is one),
                                            then save them to the Pacu database and set
                                            them as the active key pair
        stager sh|ps                      Generate a PacuProxy stager. The "sh" format is
                                            for *sh shells in Unix (like bash), and the "ps"
                                            format is for PowerShell on Windows
 
```


`set_keys`コマンドでアクセスキーを登録しておく。


<img width="1038" alt="スクリーンショット 2019-01-17 9.27.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/319677/8cb9c9b8-143e-ecf1-fc33-f080296d50c6.png">

初期設定はここまで。

### 攻撃用モジュール一覧
攻撃用の機能はモジュールと呼ばれる。ソースコードを確認するとPythonSDKを使った[^gcloud]スクリプトのようだ。詳細は[Module Details](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details)にまとめられている。
Pacuのプロンプトに`ls`と入力すれば実行可能なモジュールを一覧表示することができる。

[^gcloud]: GCPでもSDKを上手く使えば同じようなツールが作れそうだなぁ




```
Pacu (pacu-test:pacu-test-key) > ls

[Category: RECON_UNAUTH]

  s3__bucket_finder
  iam__enum_assume_role
  iam__enum_users

[Category: ENUM]

  ec2__download_userdata
  codebuild__enum
  lambda__enum
  iam__enum_users_roles_policies_groups
  lightsail__enum
  aws__enum_account
  iam__enum_permissions
  aws__enum_spend
  iam__get_credential_report
  ec2__enum
  iam__detect_honeytokens
  iam__bruteforce_permissions
  inspector__get_reports
  ebs__enum_volumes_snapshots
  ec2__check_termination_protection
  glue__enum

[Category: ESCALATE]

  iam__privesc_scan

[Category: LATERAL_MOVE]

  cloudtrail__csv_injection
  vpc__enum_lateral_movement

[Category: EXPLOIT]

  ebs__explore_snapshots
  lightsail__generate_temp_access
  ec2__startup_shell_script
  systemsmanager__rce_ec2
  lightsail__download_ssh_keys
  api_gateway__create_api_keys
  lightsail__generate_ssh_keys

[Category: PERSIST]

  lambda__backdoor_new_roles
  iam__backdoor_users_keys
  lambda__backdoor_new_users
  ec2__backdoor_ec2_sec_groups
  iam__backdoor_assume_role
  iam__backdoor_users_password
  lambda__backdoor_new_sec_groups

[Category: EXFIL]

  s3__download_bucket
  rds__explore_snapshots

[Category: EVADE]

  waf__enum
  elb__enum_logging
  guardduty__whitelist_ip
  detection__disruption
  cloudwatch__download_logs
  detection__enum_services
  cloudtrail__download_event_history


```

この中から実行したいモノを選んで`run`コマンドで実行する。

### モジュールの実行

試しに南米リージョン(sa-east-1)のLambda関数を調べてみる。sa-east-1は普段使わないがテスト用にLambda関数を１つ作成しておいた。

```run lambda__enum --regions sa-east-1```

のように入力する。

![pacu-lambda.gif](https://qiita-image-store.s3.amazonaws.com/0/319677/81495289-846e-b6e9-f496-d70210988848.gif)


`pacu-test-dayo`というLambda関数が見つかった。もしこれがセキュリティグループを変更する関数だったとしたら悪用されてしまう可能性もある。

全リージョンのLambda関数を数え上げることも可能なので、うっかり作成して忘れ去られていたLambda関数を見つけるといった使い方もあるだろう。

このようにPacuによって自分で自分のAWS環境を調査したり、突いてみたりすることができる。


## AWS GuardDuty

一方、AWSには素晴らしいセキュリティツールがある。

### 概要

>![](https://d1.awsstatic.com/Security/Amazon-GuardDuty/GuardDuty-tile-1.18a4201c6e098730b17f683c8b86b630223b4cda.png)
>Amazon GuardDuty は、AWS アカウントとワークロードを保護するために悪意のある操作や不正な動作を継続的にモニタリングする脅威検出サービスです。アカウント侵害の可能性を示す異常な API コールや不正なデプロイなどのアクティビティをモニタリングします。インスタンスへの侵入の可能性や攻撃者による偵察も検出します。[Amazon GuardDuty（インテリジェントな脅威検出） | AWS](https://aws.amazon.com/jp/guardduty/)

要するにAWSの定めたルールや機械学習に基づいたスゴイ攻撃検知ツールである。

最近は「セキュリティ・オートメーション」という概念[^automation]が注目を集めているが、GuardDutyはそのトリガーとなる重要な機能である。re:Invent2018で発表されたSecurity Hubとも密接に関わってくるはずなので、是非とも使いこなせるようにな~~りたい~~らなければならない。

[^automation]: インシデントの検出から対応までを自動化しようという取り組み

[AWS によるセキュリティ・オートメーションの実践｜AWS Summit Tokyo 2018 - YouTube](https://www.youtube.com/watch?v=qRkLV4qoXAY&feature=youtu.be)


スライドは[ここ](https://d1.awsstatic.com/events/jp/2018/summit/tokyo/aws/38.pdf)

### 検知できる脅威一覧

GuardDutyによって検知できる脅威は下記の通りである。


結果タイプ|概要
---|---
Backdoor|C2サーバと通信をしている可能性がある
Behavior|リソースの振る舞いが異なる
CryptoCurrency|暗号通貨関連で不審な振る舞いをしている
PenTest|Kali Linuxからアクセスがあった
Persistence|今までなかったネットワークや権限などの設定変更があった
Recon|ポートスキャンやSGの設定を調査するような振る舞いをしている/されている
ResourceConsumption|APIによるEC2インスタンスの起動[^gpu]
Stealth|セキュリティポリシーの弱化やログ・モニタリングの撹乱
Trojan|マルウェアによる通信の可能性がある
UnauthorizedAccess|不正アクセス全般（ブルートフォースやTorからのアクセス）

[^recon]: reconnaissance:偵察
[^gpu]: GPUインスタンスで勝手に仮想通貨マイニングされているような場合


なるほど。これなら先ほどのPacuによるアクセスを検知できるのではなかろうか。


## Pacu VS GuardDuty

### 実験結果
AWSのセキュリティ機能「GuardDuty」はPacuによるアクセスを検知できるのか実験してみた。

少しガチな感じのIAM系のモジュールをいくつか実行した。詳細はほとんど見せられないため省略。

GuardDutyはリージョン単位のサービスなので自分が普段使っている東京リージョンで確認する。


![gd1.png](https://qiita-image-store.s3.amazonaws.com/0/319677/857688cb-88ab-7f86-bcb7-1563bd81fc8a.png)
![gd2.png](https://qiita-image-store.s3.amazonaws.com/0/319677/400bcded-72db-a095-27a0-745154eaca28.png)

おお。しっかりバレているではないか。（Mountaion Viewから突然APIが叩かれているのであからさまに怪しいが）

### 余談☕️ツンデレGuardDuty
これでは面白くないのでアクセス元のIPアドレスを色々変えて調べてみた。

自宅のPC…
AWSのEC2インスタンス…
GCPの国内リージョンのインスタンス…

色々やってみたがGuardDutyが反応することは…なかった。

GuardDutyはIAMアカウントの振る舞いを見ているのだろう。

察するに

「このIAMユーザは常日頃から怪しい行動をする」
↓
「これがこの人にとって普通なんだ。検知しなくていいよね。」
↓
「またいつものやつか。もう知らない。」

というように判断されているのではなかろうか。

僕のIAMアカウントはAWS認定不審ユーザリストに仲間入りしてしまったのかもしれない。

## おわりに

GuardDutyはPacuの怪しげなアクセスをしっかり検知してくれた。
調子に乗ってGuardDutyをつついて遊んでいると、僕のように見向きもされなくなってしまうのでご注意を…