adding more features inclided steg analysis, decoding engines, and more

tests
This commit is contained in:
venus
2026-07-19 00:13:13 -05:00
parent c48e4343dc
commit cd7ef151c4
20 changed files with 1360 additions and 48 deletions

49
src/ctf/steg.py Normal file
View File

@@ -0,0 +1,49 @@
# src/ctf/steg.py
# {{{ imports
import shutil
import subprocess
import tempfile
from dataclasses import dataclass
from pathlib import Path
# }}}
# {{{ SteghideCrackResult
@dataclass
class SteghideCrackResult:
success: bool
password: str | None = None
payload: bytes | None = None
error_message: str | None = None
# }}}
# {{{ crack_steghide
def crack_steghide(file_path: Path, wordlist: list[str]) -> SteghideCrackResult:
"""Tries to extract data from a file using steghide with a wordlist."""
if not shutil.which("steghide"):
return SteghideCrackResult(success=False, error_message="steghide executable not found on system PATH.")
file_path = Path(file_path).resolve()
if not file_path.exists():
return SteghideCrackResult(success=False, error_message=f"File not found: {file_path}")
for password in wordlist:
password = password.strip()
with tempfile.TemporaryDirectory() as tmpdir:
out_file = Path(tmpdir) / "extracted_payload"
cmd = ["steghide", "extract", "-sf", str(file_path), "-p", password, "-xf", str(out_file), "-f"]
try:
# Capture standard outputs; timeout to prevent indefinite hangs
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=5)
if result.returncode == 0 and out_file.exists():
return SteghideCrackResult(
success=True,
password=password,
payload=out_file.read_bytes()
)
except subprocess.TimeoutExpired:
pass
except Exception as e:
return SteghideCrackResult(success=False, error_message=str(e))
return SteghideCrackResult(success=False, error_message="Password not found in wordlist.")
# }}}