# Example Recon Skill

> Demo data · fictional, for layout only.

> Enumerates subdomains and open ports of a declared target and writes a Markdown report.

- Badge: `reach 2 · beyond declared (3)`
- Type: Skill; tier: tried
- Tasks: Recon and attack surface; mission: Offensive; works with: Claude Code, Codex, Gemini CLI
- Source: https://github.com/example/recon-skill (skills/recon), pinned to `3f2a9c1` (v0.4.2), licence MIT
- Last checked: 2026-10-14; next check: 2027-04-12; method v0.1, reach-v0.1

## At a glance

- **What it is:** An agent skill that maps the attack surface of one target you name: subdomains, open ports and a Markdown report. A skill is a set of instructions, and sometimes scripts, that your AI client loads when a task needs it.
- **Made for:** Enumerates subdomains and open ports of one declared target. +1 more
- **Runs:** Inside your AI client: its model follows the instructions and works with the client's own tools.
- **Sends data to:** Your target (always), api.example.net (always). Other connections not ruled out: read in the documentation and the cited code, not searched in full.
- **Can change things:** Changes, runs commands, sends data out, according to the capabilities read.
- **Needs:** nmap installed on your machine · Permission to test the target you name

Profile read at commit `3f2a9c1` on 2026-10-25; every fact cites a file and line at that commit.

## What it does

An agent skill that maps the attack surface of one target you name: subdomains, open ports and a Markdown report. (README.md#L3)

Made for (the author says):

- Enumerates subdomains and open ports of one declared target. (README.md#L5)
- Writes the results as a Markdown report for the tester. (README.md#L7)

Documented uses:

- Map the subdomains and open ports of an authorised test target before a web test [Recon and attack surface] (README.md#L21)

Not for (the author says):

- Systems you are not authorised to test. (README.md#L40)

## What it can do

| Group | What it covers | Effect | On by default |
|---|---|---|---|
| enumerate | Finds subdomains of the target from certificate logs and DNS. (SKILL.md#L12) | reads, sends data out | yes |
| scan | Runs nmap against the target to list open ports. (SKILL.md#L18) | runs commands | yes |
| report | Writes a Markdown report to a fixed folder in your home directory. (report.py#L9) | changes | yes |

## How it runs

Instructions in SKILL.md tell your AI client how to enumerate, scan and report; two small Python scripts do the enrichment and the report. (SKILL.md#L1-8)

- Starts: Inside your AI client: its model follows the instructions and works with the client's own tools. Your AI client loads SKILL.md and runs its steps with its own tools. (SKILL.md#L1-4)
- Your AI client: **SKILL.md**: The steps your AI client follows. (SKILL.md#L10)
- Your machine: **enum.py and report.py**: Scripts the skill runs for enrichment and the report. (SKILL.md#L22)
- Your machine: **nmap**: Port scanner on your machine, called by the skill. (SKILL.md#L18)
- Sends data to Your target (your targets, always): DNS queries and port scans. (SKILL.md#L18)
- Sends data to api.example.net (other, always): Subdomain names for enrichment; the README does not mention this host. (enum.py#L31)

## What you need

- Other tools: nmap installed on your machine. (README.md#L12)
- Authorisation: Permission to test the target you name. (README.md#L40)

## Limits and risks

- The report folder ~/recon-reports/ is fixed in the code. (report.py#L9)

## Rights in plain language

- Declared: network 1 (talks only to declared hosts), execution 1 (runs only declared programs), approval 1 (has narrow pre-approvals).
- Code: reach 2 (open): files 2 (writes outside the project), network 2 (talks to any host), execution 2 (runs shell commands or eval).
- Lab: Beyond declared on 3 of 6 rights: files (wrote ~/recon-reports/, not declared), network (undeclared host api.example.net, blocked), execution (shell for nmap).

Why three columns? Declarations are often incomplete and scanners can be bypassed, so we run each tool once and compare.

## Privilege Reach

Reach level 2 (open).

| Right | Declared | Code | Lab |
|---|---|---|---|
| Files: where does it read and write? | not declared | 2 writes outside the project | 2 writes outside the project (beyond declared) |
| Network: whom does it talk to? | 1 talks only to declared hosts | 2 talks to any host | 2 talks to any host (beyond declared) |
| Execution: what does it run? | 1 runs only declared programs | 2 runs shell commands or eval | 2 runs shell commands or eval (beyond declared) |
| Secrets: which credentials does it touch? | not declared | 0 touches no credentials | 0 touches no credentials |
| Persistence: what survives the run? | not declared | 1 leaves cache or temp files | 1 leaves cache or temp files |
| Approval: does it ask before acting? | 1 has narrow pre-approvals | 1 has narrow pre-approvals | 1 has narrow pre-approvals |

0 contained · 1 scoped · 2 open · 3 privileged · ? no evidence · 0 never means safe

## Install

### Claude Code

```
claude plugin marketplace add https://readbeforerun.ai/marketplace.json
claude plugin install example-recon-skill@field-guide
```

- pinned to 3f2a9c1
- demo, not installable

### skills CLI

```
npx skills add example/recon-skill --skill recon
```

- not pinned: installs the current upstream state, not 3f2a9c1
- demo, not installable

### Run it with least privilege

- codex: `sandbox_mode=workspace-write; network_access=true with allowlist crt.sh,<target>`
- claude code: `permissions.allow: [Bash(nmap *), WebFetch(domain:crt.sh)]; sandbox.network.strictAllowlist: [crt.sh, <target>]`

- tested in the lab run

## Maintainer's notes

**Demo entry.** Fictional maintainer remark: in the demo, I would run this skill only from a lab VM, because of the undeclared enrichment host.

## Lab runs

### 2026-10-10

One run is an observation, not a benchmark.

- Run and written by Ilja Schlak, 2026-10-14
- Target: OWASP Juice Shop v20.2.0; model claude-sonnet-demo-20260901; claude-code mode dontAsk; grey-box
- Verdict: Beyond declared on 3 of 6 rights: files (wrote ~/recon-reports/, not declared), network (undeclared host api.example.net, blocked), execution (shell for nmap).
- Use again: with-limits; Fast, readable report; it queries a third-party API the skill never mentions.
- Artifacts: https://readbeforerun.ai/catalog/example-recon-skill/runs/2026-10-10/

## Questions and answers

**Why compare declared, code and lab?**

Declarations are often incomplete and scanners can be bypassed, so we run each tool once and compare.

**What rights does Example Recon Skill declare?**

network 1 (talks only to declared hosts), execution 1 (runs only declared programs), approval 1 (has narrow pre-approvals).

**What does its code suggest?**

reach 2 (open): files 2 (writes outside the project), network 2 (talks to any host), execution 2 (runs shell commands or eval).

**What did it use when it ran in the lab?**

Beyond declared on 3 of 6 rights: files (wrote ~/recon-reports/, not declared), network (undeclared host api.example.net, blocked), execution (shell for nmap).

**Was it tried, and when?**

Yes: 2026-10-10.

**What changed since the last check?**

Upstream last pushed 2026-10-09; 1 release(s) since the pinned version.

**How do I run it with least privilege?**

Tested: codex: sandbox_mode=workspace-write; network_access=true with allowlist crt.sh,<target>; claude_code: permissions.allow: [Bash(nmap *), WebFetch(domain:crt.sh)]; sandbox.network.strictAllowlist: [crt.sh, <target>]

Method: https://readbeforerun.ai/method/
