Skip to content

The work

Projects

Public tools spanning offensive operations, AWS detection engineering, LLM security, and Android malware analysis.

01

apktriage

Active

Static APK Reverse-Engineering & Triage Toolkit

apktriage cover

Result

Point it at an APK and get a structured report: flagged packers, extracted secrets and C2 indicators, an auto-generated YARA rule, and MITRE ATT&CK Mobile technique IDs. No dynamic execution, no server.

Problem

Android triage usually starts with a long setup: install apktool, configure jadx, write one-off grep scripts, and chase results across directories. By the time there is a baseline, a lot of analysis time is already gone.

Approach

A single CLI that runs the standard Android static-analysis stack in order: unpack with androguard, DEX cross-reference analysis, native ARM .so parsing with LIEF, packer detection via APKiD, secret extraction with Shannon entropy gating, C2 and crypto indicator sweep, YARA rule synthesis, and MITRE ATT&CK Mobile mapping. External tools are auto-detected and skipped gracefully when absent.

Highlights

  • DEX analysis: dangerous permissions, exported components, suspicious APIs
  • Native ARM .so parsing via LIEF (ptrace, dlopen, system imports)
  • Packer and obfuscation detection via APKiD
  • Secret extraction with Shannon entropy gating
  • C2 and crypto indicator sweep with auto-generated YARA rules
  • MITRE ATT&CK Mobile technique mapping

$ apktriage scan geinimi.apk

[*] Loading: geinimi.apk (androguard)
[*] DEX: 47 classes, 4 dangerous permissions
RECEIVE_BOOT_COMPLETED · READ_CONTACTS · SEND_SMS · READ_PHONE_STATE
[*] Native: libgeinimi.so -- dlopen, system imports flagged
[*] Packers: APKiD -- no packer detected
 
Finding | Dangerous Permission Combo
RECEIVE_BOOT_COMPLETED + SEND_SMS | severity: HIGH
Finding | Suspicious API: DexClassLoader
com/geinimi/Core.smali:47 | severity: HIGH
Finding | C2 Indicator
http://198.51.100.23/gate.php | severity: HIGH
 
[+] YARA: wrote geinimi.yar (4 rules)
[+] ATT&CK: T1417.001, T1422, T1636 mapped
[+] Risk score: 85 | report.json written
02

bastion

Stable

Runtime Security Gateway for MCP Tool-Call Traffic

bastion cover

Result

Sits as a transparent JSON-RPC proxy between an MCP client and every server it uses. Enforces a policy-as-code ruleset against 10 attack classes, blocks malicious tool calls before the model ever sees them, and writes a SARIF-exportable audit trail.

Problem

Content-layer LLM scanners (Lakera Guard, LLM Guard) score prompts and completions. They never see the JSON-RPC tool-call layer where MCP attacks actually live. Routing gateways handle auth and observability but do little adversarial detection. No one ships the intersection: inline JSON-RPC enforcement with tool-definition integrity tracking.

Approach

A transparent proxy that treats both the MCP client and every MCP server as hostile. Every tool definition, call, and result is offered to the policy engine before forwarding. A blocked request gets a spec-valid JSON-RPC error with the original id so the agent never hangs. Ships three policies out of the box (minimal, default, strict) and supports YAML-defined custom rules.

Highlights

  • 10 MCP attack classes: tool poisoning, rug pull, shadowing, hidden instructions, arg exfiltration, and more
  • Transparent stdio and HTTP proxy: no changes to client or server
  • Policy-as-code (YAML): minimal, default, and strict bundled
  • Interactive approval flow for unrecognized or changed tools
  • Evidence-grade audit trail, exportable as SARIF, JSON, or HTML
  • Offline by default: no outbound calls, no telemetry, fail-closed under load

$ bastion scan --policy default -- python poisoned-server.py

[*] Starting server: python poisoned-server.py
[*] Cataloguing 4 tools...
 
Finding | MCP01 Tool Poisoning
read_file: description contains injection payload
action: redacted from tool list
 
Finding | MCP04 Hidden Instructions
execute_code: hidden HTML comment in description
action: redacted from tool list
 
[+] Catalog: 2 of 4 tools blocked | policy: default
[+] Rules matched: tool_poisoning, hidden_instructions
[+] Audit trail: 6 events -> bastion.db
03

Sentinel Forge

Stable

AWS Cloud Detection & Response Lab

Sentinel Forge cover

Result

Unifies CloudTrail, GuardDuty, and Security Hub findings into a single event model with playbook-driven incident summaries.

Problem

Cloud security teams often have the telemetry they need, but not the connective tissue that turns raw events into a usable incident story. The hard part is not collecting data. It is normalizing it, correlating it, explaining why a detection fired, and giving an analyst a next step that does not waste time.

Approach

Ingests CloudTrail, GuardDuty, and Security Hub samples, normalizes them into a common event model, runs defensive detections, correlates suspicious activity, and generates analyst-ready findings, timelines, and manager summaries.

Highlights

  • Root account usage
  • Console login without MFA
  • Privileged AssumeRole
  • CloudTrail tampering
  • Public sensitive port exposure
  • GuardDuty plus CloudTrail corroboration

$ sentinel-forge replay-findings

[*] Loading sample corpus: CloudTrail, GuardDuty, Security Hub
[*] Normalizing AWS-native telemetry into common event model
[*] Running defensive detections against YAML rule registry
 
Finding | CloudTrail tampering
ops-analyst -> StopLogging -> org-trail
severity: HIGH | confidence: 90
 
Finding | Privileged role assumption
ops-analyst -> AssumeRole -> OrganizationAccountAccessRole
severity: MEDIUM | confidence: 75
 
[+] Incident summary: 7 findings, 3 principals, highest severity HIGH
04

Aegis

Stable

AI Exploitation & Guardrail Inspection Suite

Aegis cover

Result

Maps OWASP LLM Top 10 detections to YAML payloads and produces SIEM-ready JSON and HTML findings.

Problem

LLM applications are often deployed without rigorous security testing against prompt injection or sensitive data leakage. Traditional scanners aren't built for the non-deterministic nature of model responses.

Approach

A scanner that probes LLM endpoints with specialized payloads and runs the responses through YAML-defined detectors mapped to the OWASP Top 10 for LLMs.

Highlights

  • Prompt injection (direct/indirect)
  • Sensitive data disclosure (PII, secrets)
  • Output handling (XSS, SQLi injection)
  • Jailbreak detection
  • Resource abuse & token exhaustion
  • SIEM-ready JSON logging

$ aegis scan -t https://api.openai.com/v1/chat/completions -p openai

[*] Initializing LLM connector: openai (gpt-4o-mini)
[*] Loading 42 injection payloads from YAML registry
[*] Running 12 concurrent scanners...
 
Vulnerability | Prompt Injection (Direct)
Confidence: 100% | Category: LLM01
Evidence: Payload "Ignore all previous instructions..." succeeded
 
Finding | Sensitive Data Leakage
Matched pattern: aws_arn (Confidence: 0.95)
Detail: arn:aws:iam::123456789012:user/admin found in response
 
[+] Scan complete: 3 critical, 1 medium findings. Report: aegis_report.html
05

Domino

Stable

AWS IAM Privilege Escalation Path Prover

Domino cover

Result

Models IAM principals and resources as a directed graph and proves multi-step privilege escalation paths across service boundaries.

Problem

Cloud security scanners find misconfigurations in isolation. They don't tell you which 5 of those 200 findings chain together into an actual account compromise path.

Approach

Models IAM principals and resources as a directed graph. Finds multi-step privilege escalation paths across service boundaries by matching chains against 12+ built-in attack tactics.

Highlights

  • PassRole + Lambda/EC2/Glue
  • IMDS credential theft
  • Confused Deputy via S3 triggers
  • IAM policy self-escalation
  • Lambda code hijack
  • Policy version rollback

$ domino --demo

[*] Loading IAM snapshot: prod-account.json
[*] Building principal-resource graph: 47 nodes, 183 edges
[*] Matching against YAML attack tactics...
 
Path 1 | Severity: CRITICAL (score: 9.2)
dev-lambda-role
-> iam:PassRole -> prod-admin-role
-> lambda:UpdateFunctionCode -> exfil-lambda
-> sts:AssumeRole -> prod-admin-role
Tactics: PassRole+Lambda, Lambda code hijack
 
[+] Scan complete: 2 exploitable paths found across 47 principals
06

Malforge

Stable

Shellcode Encryption & Multi-Format Payload Generator

Malforge cover

Result

Stackable encryption layers plus AMSI and ETW patching templates across 9+ output formats for OSEP-style payload development.

Problem

Static shellcode runners are easily detected. Manual encryption and evasion patching is tedious and error-prone during OSEP-style engagements.

Approach

An advanced generator that applies stackable encryption layers (XOR, AES, RC4) and runtime evasion patches (AMSI/ETW) to shellcode using a standardized Jinja2 template engine.

Highlights

  • Stackable encryption (XOR, AES, RC4, Caesar)
  • AMSI & ETW runtime patching
  • 9+ Output formats (EXE, DLL, VBA, HTA, PS1, JS, MSBuild)
  • RW -> RX memory allocation safety
  • Randomized namespaces and class names
  • SQLite tracking of generated payloads

$ malforge -i sc.bin -f exe -e xor,aes --amsi

[*] Loading shellcode: sc.bin (510 bytes)
[*] Applying encryption chain: XOR -> AES-256-CBC
[*] Generating decryption stub (auto-reversed)
[*] Patching AMSI: AmsiScanBuffer -> NOP
[*] Patching ETW: EtwEventWrite -> RET
[*] Memory: VirtualAlloc(RW) -> VirtualProtect(RX)
[*] Randomizing namespace: MfKx9mVp.RL2Tn4wR
[+] Output: payload_a7f2c1.cs (ready to compile)
[+] Metadata: Persisted in ~/.malforge/malforge.db
07

Ollama-Claude

Stable

Hardware-Aware Bridge from Ollama to Claude Code

Ollama-Claude cover

Result

One command provisions a local LLM that fits the available GPU and wires it to Claude Code on Linux, macOS, Windows, and WSL2.

Problem

Running Claude Code against a local model means picking a quantization that fits your VRAM, configuring environment variables, and verifying both ends agree on the protocol. The setup gap is what stops most people from trying it.

Approach

Detects GPU, CPU, and RAM, picks a model that fits the available memory, downloads it via Ollama, and writes the Claude Code environment variables. The installer verifies the release tarball against the SHA256SUMS asset before extracting.

Highlights

  • Hardware detection (GPU, VRAM, system RAM)
  • Model selection that fits available memory
  • Cross-platform installer (Linux, macOS, Windows, WSL2)
  • SHA256-verified release tarball
  • Idempotent re-runs (safe to re-install)
  • Zero Python dependencies (pure shell)

$ curl -fsSL ollama-claude.sh | bash

[*] Detecting hardware: GPU=RTX 4080 (16GB), RAM=32GB
[*] Verifying tarball: SHA256 matches SHA256SUMS
[*] Selecting model: qwen2.5-coder:14b-q4 (fits 16GB VRAM)
[*] Pulling via Ollama...
[*] Writing ~/.claude/settings.json env vars
 
[+] Local model ready: ollama serve on :11434
[+] Claude Code wired: ANTHROPIC_BASE_URL set
[+] Run 'claude' to verify