|
1 | | -<div align="center"> |
2 | | - |
3 | 1 | <picture> |
4 | 2 | <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/Real-Fruit-Snacks/Whirlpool/main/docs/assets/logo-dark.svg"> |
5 | 3 | <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/Real-Fruit-Snacks/Whirlpool/main/docs/assets/logo-light.svg"> |
6 | | - <img alt="Whirlpool" src="https://raw.githubusercontent.com/Real-Fruit-Snacks/Whirlpool/main/docs/assets/logo-dark.svg" width="420"> |
| 4 | + <img alt="Whirlpool" src="https://raw.githubusercontent.com/Real-Fruit-Snacks/Whirlpool/main/docs/assets/logo-dark.svg" width="100%"> |
7 | 5 | </picture> |
8 | 6 |
|
9 | | - |
10 | | - |
11 | | - |
| 7 | +> [!IMPORTANT] |
| 8 | +> **Privilege escalation reasoning engine.** Parses LinPEAS/WinPEAS output and generates ranked exploitation playbooks. 329 GTFOBins entries, 86 LOLBAS binaries, 42 kernel exploits, 9 potato attacks with composite scoring and attack chain detection. |
12 | 9 |
|
13 | | -**Privilege escalation reasoning engine -- parses LinPEAS/WinPEAS output and generates ranked exploitation playbooks** |
| 10 | +> *A whirlpool is a swirling vortex that draws everything into its center, creating powerful currents from scattered elements. Perfect metaphor for a reasoning engine that takes fragmented enumeration findings and draws them together into focused, prioritized attack strategies.* |
14 | 11 |
|
15 | | -Feed it raw enumeration output, get back a prioritized attack plan with exact commands, confidence ratings, and multi-step attack chains. 329 GTFOBins entries, 86 LOLBAS binaries, 42 kernel exploits, 9 potato attacks. Everything runs offline -- no API calls, no internet required. |
| 12 | +--- |
16 | 13 |
|
17 | | -> **Authorization Required**: This tool is designed exclusively for authorized security testing with explicit written permission. Unauthorized access to computer systems is illegal and may result in criminal prosecution. |
| 14 | +## §1 / Premise |
18 | 15 |
|
19 | | -</div> |
| 16 | +Whirlpool is a **privilege escalation reasoning engine** that transforms raw enumeration output into ranked exploitation playbooks. Feed it LinPEAS, WinPEAS, or manual command output and receive prioritized attack plans with exact commands, confidence ratings, and multi-step attack chains. |
20 | 17 |
|
21 | | ---- |
| 18 | +The engine matches findings against comprehensive offline knowledge bases containing 329 GTFOBins entries, 86 LOLBAS binaries, 42 kernel exploits, and 9 potato attacks. Everything runs offline with no API calls or internet requirements—pure analysis of enumeration data. |
22 | 19 |
|
23 | | -## Quick Start |
| 20 | +**Authorization Required**: Designed exclusively for authorized security testing with explicit written permission. |
24 | 21 |
|
25 | | -### Prerequisites |
| 22 | +--- |
26 | 23 |
|
27 | | -- **Python** 3.9+ |
28 | | -- **pip** or **pipx** |
| 24 | +## §2 / Specs |
29 | 25 |
|
30 | | -### Install |
| 26 | +| KEY | VALUE | |
| 27 | +|-----------------|-----------------------------------------------------------------------------| |
| 28 | +| **PARSING** | **Auto-detection · LinPEAS · WinPEAS · manual commands** with format variants | |
| 29 | +| **KNOWLEDGE** | **329 GTFOBins · 86 LOLBAS · 42 kernel exploits · 9 potato attacks** | |
| 30 | +| **SCORING** | **Composite ranking** with 5 profiles (default, OSCP, CTF, stealth, safe) | |
| 31 | +| **CHAINS** | **12 attack chain types** for multi-step privilege escalation paths | |
| 32 | +| **ENGINE** | **Pure offline analysis** with no network calls or API dependencies | |
| 33 | +| **OUTPUT** | **Terminal UI · Markdown · JSON** with Catppuccin Mocha theming | |
| 34 | +| **FILTERING** | **Noise reduction** with purpose-built parsers and false-positive filtering | |
| 35 | +| **PLATFORM** | **Python 3.9+ · Linux/Windows/macOS** cross-platform compatibility | |
31 | 36 |
|
32 | | -```bash |
33 | | -# pipx (recommended -- isolated environment) |
34 | | -pipx install git+https://github.com/Real-Fruit-Snacks/Whirlpool.git |
| 37 | +--- |
35 | 38 |
|
36 | | -# Or from a local clone |
37 | | -git clone https://github.com/Real-Fruit-Snacks/Whirlpool.git |
38 | | -cd Whirlpool && pip install -e . |
39 | | -``` |
| 39 | +## §3 / Quickstart |
40 | 40 |
|
41 | | -### Run |
| 41 | +**Prerequisites:** Python 3.9+, pip or pipx |
42 | 42 |
|
43 | 43 | ```bash |
44 | | -# Analyze LinPEAS output (auto-detected) |
| 44 | +# Install reasoning engine |
| 45 | +pipx install git+https://github.com/Real-Fruit-Snacks/Whirlpool.git |
| 46 | + |
| 47 | +# Analyze enumeration output (auto-detected format) |
45 | 48 | whirlpool linpeas_output.txt |
| 49 | +whirlpool winpeas_output.txt |
46 | 50 |
|
47 | | -# Quick wins only |
| 51 | +# Generate focused playbook with top techniques |
48 | 52 | whirlpool enum.txt --quick-wins |
49 | 53 |
|
50 | | -# OSCP-optimized ranking |
| 54 | +# OSCP-optimized ranking for exam scenarios |
51 | 55 | whirlpool enum.txt --profile oscp |
52 | 56 |
|
53 | | -# Export to Markdown |
| 57 | +# Export structured analysis to markdown |
54 | 58 | whirlpool enum.txt --format markdown --output report.md |
55 | | - |
56 | | -# JSON with attacker IP substitution |
57 | | -whirlpool enum.txt --format json --lhost 10.10.14.1 --lport 4444 |
58 | | - |
59 | | -# Diff two scans |
60 | | -whirlpool first.txt --diff second.txt |
61 | 59 | ``` |
62 | 60 |
|
63 | 61 | --- |
64 | 62 |
|
65 | | -## Features |
66 | | - |
67 | | -### Auto-Detection |
68 | | - |
69 | | -Feed Whirlpool any enumeration file and it figures out the format. Handles LinPEAS `.sh` output (Unicode box headers), WinPEAS `.exe` output, `.bat` output, `.exe` beta format, and manual command output -- all automatically: |
70 | | - |
71 | | -```bash |
72 | | -# No --type flag needed |
73 | | -whirlpool linpeas_output.txt |
74 | | -whirlpool winpeas_output.txt |
75 | | -whirlpool manual_commands.txt |
76 | | -``` |
77 | | - |
78 | | -### Offline Knowledge Bases |
79 | | - |
80 | | -329 GTFOBins entries, 86 LOLBAS binaries, 42 kernel exploits with version ranges, and 9 potato attacks with OS compatibility matrices. All shipped as JSON in `whirlpool/data/`: |
81 | | - |
82 | | -```bash |
83 | | -# All matching happens locally -- zero network calls |
84 | | -whirlpool enum.txt |
85 | | -``` |
86 | | - |
87 | | -| File | Entries | Source | |
88 | | -|---|---|---| |
89 | | -| `gtfobins.json` | 329 binaries | GTFOBins | |
90 | | -| `kernel_exploits.json` | 42 CVEs | 23 Linux + 19 Windows | |
91 | | -| `lolbas.json` | 86 binaries | LOLBAS Project | |
92 | | -| `potato_matrix.json` | 9 attacks | OS compatibility matrix | |
93 | | - |
94 | | -### Composite Scoring |
95 | | - |
96 | | -Every technique scored across four dimensions with profile-specific weights: |
97 | | - |
98 | | -```bash |
99 | | -# Five ranking profiles |
100 | | -whirlpool enum.txt --profile default # Balanced (40/30/20/10) |
101 | | -whirlpool enum.txt --profile oscp # Reliable + documented |
102 | | -whirlpool enum.txt --profile ctf # Speed -- get root fast |
103 | | -whirlpool enum.txt --profile stealth # Low detection |
104 | | -whirlpool enum.txt --profile safe # System stability |
105 | | -``` |
106 | | - |
107 | | -Dimensions: reliability (likelihood of success), safety (system stability risk), simplicity (ease of execution), stealth (detection avoidance). |
108 | | - |
109 | | -### Attack Chain Detection |
110 | | - |
111 | | -Detects 12 multi-step privilege escalation paths that single-finding scanners miss: |
| 63 | +## §4 / Reference |
112 | 64 |
|
113 | 65 | ```bash |
114 | | -# Chains enabled by default, disable with --no-chains |
115 | | -whirlpool enum.txt |
116 | | -whirlpool enum.txt --no-chains |
117 | | -``` |
118 | | - |
119 | | -Chain types include cron PATH hijack, writable cron scripts, Docker/LXD escapes, NFS SUID planting, wildcard injection, LD_PRELOAD abuse, and writable /etc/passwd. |
120 | | - |
121 | | -### Noise Filtering |
122 | | - |
123 | | -Purpose-built parsers with aggressive false-positive filtering. The sudo parser rejects grep artifacts, version-like patterns, and common non-runas words. Tested against 22 HTB/Vulnhub samples with zero crashes and zero blank results. |
124 | | - |
125 | | -### Multiple Output Formats |
126 | | - |
127 | | -```bash |
128 | | -# Rich terminal with Catppuccin Mocha theme |
129 | | -whirlpool enum.txt |
130 | | - |
131 | | -# Markdown report |
132 | | -whirlpool enum.txt --format markdown --output report.md |
133 | | - |
134 | | -# Structured JSON for tool integration |
135 | | -whirlpool enum.txt --format json > results.json |
136 | | - |
137 | | -# Quick wins -- top 5 techniques |
138 | | -whirlpool enum.txt --quick-wins |
139 | | -``` |
140 | | - |
141 | | -### Python API |
142 | | - |
143 | | -```python |
144 | | -from whirlpool.parser.linpeas import LinPEASParser |
145 | | -from whirlpool.engine.analyzer import Analyzer |
146 | | -from whirlpool.engine.ranker import Ranker, RankingProfile |
147 | | - |
148 | | -parser = LinPEASParser() |
149 | | -results = parser.parse_file("linpeas_output.txt") |
150 | | - |
151 | | -analyzer = Analyzer() |
152 | | -paths = analyzer.analyze_linux(results) |
153 | | - |
154 | | -ranker = Ranker(profile=RankingProfile.OSCP) |
155 | | -ranked = ranker.rank(paths) |
156 | | -quick_wins = ranker.get_quick_wins(paths, top_n=5) |
| 66 | +# ANALYSIS & PROFILES |
| 67 | +whirlpool enum.txt # Auto-detect format, analyze |
| 68 | +whirlpool enum.txt --profile oscp # OSCP-optimized ranking |
| 69 | +whirlpool enum.txt --profile ctf # Speed-focused for CTFs |
| 70 | +whirlpool enum.txt --profile stealth # Low-detection techniques |
| 71 | +whirlpool enum.txt --profile safe # System stability priority |
| 72 | + |
| 73 | +# OUTPUT FORMATS |
| 74 | +whirlpool enum.txt --quick-wins # Top 5 techniques only |
| 75 | +whirlpool enum.txt --format markdown --output report.md # Markdown export |
| 76 | +whirlpool enum.txt --format json > results.json # Structured JSON |
| 77 | +whirlpool enum.txt --lhost 10.10.14.1 --lport 4444 # IP/port substitution |
| 78 | + |
| 79 | +# CHAIN ANALYSIS |
| 80 | +whirlpool enum.txt # Chains enabled (default) |
| 81 | +whirlpool enum.txt --no-chains # Disable multi-step detection |
| 82 | + |
| 83 | +# COMPARISON & DIFFING |
| 84 | +whirlpool first.txt --diff second.txt # Compare two scans |
| 85 | + |
| 86 | +# SUPPORTED FORMATS (auto-detected) |
| 87 | +# LinPEAS .sh output (Unicode box headers) |
| 88 | +# WinPEAS .exe output, .bat output, .exe beta format |
| 89 | +# Manual command output |
157 | 90 | ``` |
158 | 91 |
|
159 | 92 | --- |
160 | 93 |
|
161 | | -## Architecture |
| 94 | +## §5 / Architecture |
| 95 | + |
| 96 | +**Three-Stage Pipeline**: Parse enumeration → Analyze against knowledge bases → Rank with composite scoring |
162 | 97 |
|
163 | 98 | ``` |
164 | 99 | whirlpool/ |
165 | | -├── cli.py # Argparse entry point, auto-detection, output routing |
166 | | -├── parser/ # LinPEAS, WinPEAS, manual command parsers (3 format variants) |
| 100 | +├── cli.py # Argparse entry point, auto-detection, output routing |
| 101 | +├── parser/ # LinPEAS, WinPEAS, manual command parsers (3 variants) |
167 | 102 | ├── engine/ |
168 | | -│ ├── analyzer.py # Core analysis -- matches findings against knowledge bases |
169 | | -│ ├── ranker.py # Composite scoring with 5 ranking profiles |
170 | | -│ └── chain.py # Multi-step attack chain detection (12 chain types) |
171 | | -├── data/ # Offline JSON knowledge bases (GTFOBins, LOLBAS, kernel, potato) |
172 | | -├── output/ # Terminal (Catppuccin Mocha), Markdown, JSON renderers |
173 | | -└── tests/ # 237 tests |
| 103 | +│ ├── analyzer.py # Core analysis matches findings against databases |
| 104 | +│ ├── ranker.py # Composite scoring with 5 ranking profiles |
| 105 | +│ └── chain.py # Multi-step attack chain detection (12 types) |
| 106 | +├── data/ # Offline JSON knowledge bases (no network calls) |
| 107 | +│ ├── gtfobins.json # 329 binaries from GTFOBins |
| 108 | +│ ├── lolbas.json # 86 binaries from LOLBAS Project |
| 109 | +│ ├── kernel_exploits.json # 42 CVEs (23 Linux + 19 Windows) |
| 110 | +│ └── potato_matrix.json # 9 attacks with OS compatibility |
| 111 | +├── output/ # Terminal (Catppuccin), Markdown, JSON renderers |
| 112 | +└── tests/ # 237 tests with HTB/Vulnhub samples |
174 | 113 | ``` |
175 | 114 |
|
176 | | -Three-stage pipeline: parse enumeration output into structured data, analyze findings against knowledge bases to generate exploitation paths, rank paths using composite scoring. |
| 115 | +**Composite Scoring**: Every technique scored across reliability (success likelihood), safety (system stability), simplicity (execution ease), and stealth (detection avoidance). |
177 | 116 |
|
178 | 117 | --- |
179 | 118 |
|
180 | | -## Platform Support |
| 119 | +## §6 / Authorization |
181 | 120 |
|
182 | | -| Capability | Linux | macOS | Windows | |
183 | | -|---|---|---|---| |
184 | | -| CLI | Full | Full | Full | |
185 | | -| LinPEAS Parsing | Full | Full | Full | |
186 | | -| WinPEAS Parsing | Full | Full | Full | |
187 | | -| Rich Terminal UI | Full | Full | Full (Windows Terminal recommended) | |
188 | | -| Markdown/JSON Export | Full | Full | Full | |
189 | | - |
190 | | ---- |
| 121 | +Whirlpool is designed for **authorized security testing** with explicit written permission. The tool generates exploitation playbooks that should only be used against systems you own or have proper authorization to test. |
191 | 122 |
|
192 | | -## Security |
| 123 | +Security vulnerabilities should be reported via [GitHub Security Advisories](https://github.com/Real-Fruit-Snacks/Whirlpool/security/advisories) with 90-day responsible disclosure. |
193 | 124 |
|
194 | | -Report security issues via [GitHub Security Advisories](https://github.com/Real-Fruit-Snacks/Whirlpool/security/advisories/new) (preferred) or private disclosure to maintainers. Responsible disclosure timeline: 90 days. Do not open public issues for vulnerabilities. |
195 | | - |
196 | | -Whirlpool does **not**: |
197 | | - |
198 | | -- Execute generated commands -- outputs text for the operator to review |
199 | | -- Scan hosts or perform active reconnaissance |
200 | | -- Make network connections -- runs entirely offline |
201 | | -- Manage implants or maintain persistent access |
| 125 | +**Whirlpool does not**: execute generated commands, scan hosts, perform active reconnaissance, make network connections, or manage persistent access—it's purely an offline analysis engine. |
202 | 126 |
|
203 | 127 | --- |
204 | 128 |
|
205 | | -## License |
206 | | - |
207 | | -[MIT](LICENSE) -- Copyright 2026 Real-Fruit-Snacks |
| 129 | +**Real-Fruit-Snacks** — [All projects](https://real-fruit-snacks.github.io/) · [Security](https://github.com/Real-Fruit-Snacks/Whirlpool/security/advisories) · [License](LICENSE) |
0 commit comments