- Add YAML-based configuration loaded from config.yaml (CONFIG_LOCATION env var) - Add PyYAML dependency and install requirements in Dockerfile - Replace Config.from_env() with get_config() singleton pattern - Remove server_header from config (now randomized from wordlists only) - Update docker-compose.yaml to mount config.yaml read-only - Update Helm chart: restructure values.yaml, generate config.yaml in ConfigMap - Update Kubernetes manifests: ConfigMap now contains config.yaml, deployments mount it - Remove Helm secret.yaml (dashboard path now auto-generated in config.yaml)
194 lines
6.6 KiB
Python
194 lines
6.6 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""
|
|
Generators for creating random fake data (credentials, API keys, etc.)
|
|
"""
|
|
|
|
import random
|
|
import string
|
|
import json
|
|
from templates import html_templates
|
|
from wordlists import get_wordlists
|
|
|
|
def random_username() -> str:
|
|
"""Generate random username"""
|
|
wl = get_wordlists()
|
|
return random.choice(wl.username_prefixes) + random.choice(wl.username_suffixes)
|
|
|
|
|
|
def random_password() -> str:
|
|
"""Generate random password"""
|
|
wl = get_wordlists()
|
|
templates = [
|
|
lambda: ''.join(random.choices(string.ascii_letters + string.digits, k=12)),
|
|
lambda: f"{random.choice(wl.password_prefixes)}{random.randint(100, 999)}!",
|
|
lambda: f"{random.choice(wl.simple_passwords)}{random.randint(1000, 9999)}",
|
|
lambda: ''.join(random.choices(string.ascii_lowercase, k=8)),
|
|
]
|
|
return random.choice(templates)()
|
|
|
|
|
|
def random_email(username: str = None) -> str:
|
|
"""Generate random email"""
|
|
wl = get_wordlists()
|
|
if not username:
|
|
username = random_username()
|
|
return f"{username}@{random.choice(wl.email_domains)}"
|
|
|
|
def random_server_header() -> str:
|
|
"""Generate random server header from wordlists"""
|
|
wl = get_wordlists()
|
|
return random.choice(wl.server_headers)
|
|
|
|
def random_api_key() -> str:
|
|
"""Generate random API key"""
|
|
wl = get_wordlists()
|
|
key = ''.join(random.choices(string.ascii_letters + string.digits, k=32))
|
|
return random.choice(wl.api_key_prefixes) + key
|
|
|
|
|
|
def random_database_name() -> str:
|
|
"""Generate random database name"""
|
|
wl = get_wordlists()
|
|
return random.choice(wl.database_names)
|
|
|
|
|
|
def credentials_txt() -> str:
|
|
"""Generate fake credentials.txt with random data"""
|
|
content = "# Production Credentials\n\n"
|
|
for i in range(random.randint(3, 7)):
|
|
username = random_username()
|
|
password = random_password()
|
|
content += f"{username}:{password}\n"
|
|
return content
|
|
|
|
|
|
def passwords_txt() -> str:
|
|
"""Generate fake passwords.txt with random data"""
|
|
content = "# Password List\n"
|
|
content += f"Admin Password: {random_password()}\n"
|
|
content += f"Database Password: {random_password()}\n"
|
|
content += f"API Key: {random_api_key()}\n\n"
|
|
content += "User Passwords:\n"
|
|
for i in range(random.randint(5, 10)):
|
|
username = random_username()
|
|
password = random_password()
|
|
content += f"{username} = {password}\n"
|
|
return content
|
|
|
|
|
|
def users_json() -> str:
|
|
"""Generate fake users.json with random data"""
|
|
wl = get_wordlists()
|
|
users = []
|
|
for i in range(random.randint(3, 8)):
|
|
username = random_username()
|
|
users.append({
|
|
"id": i + 1,
|
|
"username": username,
|
|
"email": random_email(username),
|
|
"password": random_password(),
|
|
"role": random.choice(wl.user_roles),
|
|
"api_token": random_api_key()
|
|
})
|
|
return json.dumps({"users": users}, indent=2)
|
|
|
|
|
|
def api_keys_json() -> str:
|
|
"""Generate fake api_keys.json with random data"""
|
|
keys = {
|
|
"stripe": {
|
|
"public_key": "pk_live_" + ''.join(random.choices(string.ascii_letters + string.digits, k=24)),
|
|
"secret_key": random_api_key()
|
|
},
|
|
"aws": {
|
|
"access_key_id": "AKIA" + ''.join(random.choices(string.ascii_uppercase + string.digits, k=16)),
|
|
"secret_access_key": ''.join(random.choices(string.ascii_letters + string.digits + '+/', k=40))
|
|
},
|
|
"sendgrid": {
|
|
"api_key": "SG." + ''.join(random.choices(string.ascii_letters + string.digits, k=48))
|
|
},
|
|
"twilio": {
|
|
"account_sid": "AC" + ''.join(random.choices(string.ascii_lowercase + string.digits, k=32)),
|
|
"auth_token": ''.join(random.choices(string.ascii_lowercase + string.digits, k=32))
|
|
}
|
|
}
|
|
return json.dumps(keys, indent=2)
|
|
|
|
|
|
def api_response(path: str) -> str:
|
|
"""Generate fake API JSON responses with random data"""
|
|
wl = get_wordlists()
|
|
|
|
def random_users(count: int = 3):
|
|
users = []
|
|
for i in range(count):
|
|
username = random_username()
|
|
users.append({
|
|
"id": i + 1,
|
|
"username": username,
|
|
"email": random_email(username),
|
|
"role": random.choice(wl.user_roles)
|
|
})
|
|
return users
|
|
|
|
responses = {
|
|
'/api/users': json.dumps({
|
|
"users": random_users(random.randint(2, 5)),
|
|
"total": random.randint(50, 500)
|
|
}, indent=2),
|
|
'/api/v1/users': json.dumps({
|
|
"status": "success",
|
|
"data": [{
|
|
"id": random.randint(1, 100),
|
|
"name": random_username(),
|
|
"api_key": random_api_key()
|
|
}]
|
|
}, indent=2),
|
|
'/api/v2/secrets': json.dumps({
|
|
"database": {
|
|
"host": random.choice(wl.database_hosts),
|
|
"username": random_username(),
|
|
"password": random_password(),
|
|
"database": random_database_name()
|
|
},
|
|
"api_keys": {
|
|
"stripe": random_api_key(),
|
|
"aws": 'AKIA' + ''.join(random.choices(string.ascii_uppercase + string.digits, k=16))
|
|
}
|
|
}, indent=2),
|
|
'/api/config': json.dumps({
|
|
"app_name": random.choice(wl.application_names),
|
|
"debug": random.choice([True, False]),
|
|
"secret_key": random_api_key(),
|
|
"database_url": f"postgresql://{random_username()}:{random_password()}@localhost/{random_database_name()}"
|
|
}, indent=2),
|
|
'/.env': f"""APP_NAME={random.choice(wl.application_names)}
|
|
DEBUG={random.choice(['true', 'false'])}
|
|
APP_KEY=base64:{''.join(random.choices(string.ascii_letters + string.digits, k=32))}=
|
|
DB_CONNECTION=mysql
|
|
DB_HOST=127.0.0.1
|
|
DB_PORT=3306
|
|
DB_DATABASE={random_database_name()}
|
|
DB_USERNAME={random_username()}
|
|
DB_PASSWORD={random_password()}
|
|
AWS_ACCESS_KEY_ID=AKIA{''.join(random.choices(string.ascii_uppercase + string.digits, k=16))}
|
|
AWS_SECRET_ACCESS_KEY={''.join(random.choices(string.ascii_letters + string.digits + '+/', k=40))}
|
|
STRIPE_SECRET={random_api_key()}
|
|
"""
|
|
}
|
|
return responses.get(path, json.dumps({"error": "Not found"}, indent=2))
|
|
|
|
|
|
def directory_listing(path: str) -> str:
|
|
"""Generate fake directory listing using wordlists"""
|
|
wl = get_wordlists()
|
|
|
|
files = wl.directory_files
|
|
dirs = wl.directory_dirs
|
|
|
|
selected_files = [(f, random.randint(1024, 1024*1024))
|
|
for f in random.sample(files, min(6, len(files)))]
|
|
|
|
return html_templates.directory_listing(path, dirs, selected_files)
|