OSCP notesExtended library
Browse tracks

80, 443 - HTTP/S

Use one basic path-discovery pass after checking the application's host, path and missing-page response. AutoRecon captures HTTP/robots/TLS information; content discovery is a separate question. Retain deliberate recursive, vhost, parameter and authenticated tests when needed rather than repeating identical coverage with every tool.

Basic path discovery with ffuf

curl -i http://TARGET:PORT/nonexistent-check
ffuf -u http://TARGET:PORT/FUZZ -w /PATH/words.txt -rate 25 -t 20 -r=false -recursion=false -of json -o ffuf.json

Use an existing wordlist. Compare status, size and content with the nonexistent path; a 301 needs inspection of its destination. Read matches in ffuf.json and request errors in the console. This is basic GET discovery, not a vulnerability finding. Review any personal ffufrc for inherited headers, cookies, proxies or other request changes. ffuf options.

Reduce request rate or filter a uniform missing-page response
ffuf -u http://TARGET:PORT/FUZZ -w /PATH/words.txt -rate 10 -t 10 -r=false -recursion=false -maxtime 120 -of json -o ffuf-bounded.json
ffuf -u http://TARGET:PORT/FUZZ -w /PATH/words.txt -rate 25 -t 20 -r=false -recursion=false -ac -of json -o ffuf-calibrated.json

The time limit is seconds and can leave partial coverage. Use auto-calibration when uniform missing-page responses obscure results; inspect its filters because legitimate responses can resemble the baseline. Use the relevant authenticated/vhost/parameter or recursive method below when that is the missing context.

For login testing, choose HTTP Basic, HTTP Digest or the application POST form procedure. Use the actual failure response and required session/CSRF state rather than guessing against an unverified request.

Find a different virtual host

Use when redirects, certificates or application content reveal a domain. DOMAIN is the observed DNS suffix; the wordlist contains host labels.

curl -i http://TARGET:PORT/ -H 'Host: nonexistent-check.DOMAIN'
ffuf -u http://TARGET:PORT/ -H 'Host: FUZZ.DOMAIN' -w /PATH/hosts.txt -mc all -ac -rate 25 -o vhosts.json -of json

Compare candidates with the unknown-host response, then verify the selected hostname. A different size is a lead, not proof of a separate application. For HTTPS, the URL hostname also controls TLS SNI; changing only Host may miss the correct site:

curl -i --resolve HOST:443:TARGET https://HOST/

Replace HOST with the discovered full hostname. Resolve it to the in-scope address before browsing or scanning it. Inspect certificate errors separately rather than treating them as an absent site.

Discover paths inside an authenticated session or recurse into a found directory

Use the actual cookie from a valid session; check that a request returns protected content rather than a login page.

ffuf -u http://HOST:PORT/FUZZ -w /PATH/words.txt -b 'SESSION=VALUE' -mc all -ac -rate 25 -o authenticated.json -of json

For a request with custom headers or a body, save it with FUZZ only in the intended field. A raw request does not encode its transport:

ffuf -request request.txt -request-proto http -w /PATH/words.txt -mc all -ac -rate 25 -o request-results.json -of json

Use -request-proto https for TLS. Expired cookies and one-use CSRF tokens require a fresh request; a stale request does not establish absent content. For a remaining directory-depth question:

ffuf -u http://HOST:PORT/FUZZ -w /PATH/words.txt -recursion -recursion-depth 1 -rate 25 -o recursive.json -of json

This adds one level of recursive discovery, not another identical baseline pass. Review redirects and missing-page responses before expanding coverage. ffuf request and discovery options.

Automatic scanners

For the exam, use the current OffSec restrictions, not this inherited tool list as an approval list. Nikto is explicitly named as permitted; automatic exploitation and mass vulnerability scanning are restricted, including equivalent features inside other tools.

Inherited general-lab scanner examples — select and review features before use

General purpose automatic scanners:

nikto -h <URL>
whatweb -a 4 <URL>
wapiti -u <URL>
zaproxy #You can use an API
nuclei -ut && nuclei -target <URL>

w3af is an inherited Python 2-era reference, not a supported current-Kali installation path. Its old launch command is omitted rather than recommending obsolete dependencies.

These broad examples are not the exam baseline. Do not run an unreviewed template/plugin set merely because a scanner is installed.

Spidering

List of spidering tools:

Open resource

Directories and Files Enumeration

Tools:

Gobuster

gobuster dir -t 30 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u https://10.0.0.3/
Parameters
  • dir: directory brute-forcing mode.
  • -t <n>: number of concurrent threads (default 10).
  • -w <wordlist>: path to the wordlist.
  • -u <URL>: target URL.

Note: Note:

Feroxbuster

feroxbuster --url http://<TARGET>:<PORT>/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -o <TARGET><PORT>.out

Dirb

dirb http://www.megacorpone.com -r -z 10

Nikto

nikto -host=http://www.megacorpone.com -maxtime=30s

Wfuzz

Fuzz parameters using injection payloads:

wfuzz -u https://<IP_ADDRESS>/index.php?url=FUZZ --hl 36 -w /usr/share/wfuzz/wordlist/Injections/All_attack.txt

Wordlists

Included in Kali’s wordlists package under /usr/share/wordlists.

Prepare tools used on this page

Run setup on Kali after preparing the shared workspace. Skip a clone when its checkout already exists; review/update it deliberately rather than cloning over it. Operational commands remain in the sections above.

Prepare Feroxbuster

Optional Kali alternative for recursive content discovery. Upstream.

sudo apt install feroxbuster

Check on Kali:

feroxbuster --version
Prepare dirsearch

Optional Kali alternative for path discovery. Upstream.

sudo apt install dirsearch

Check on Kali:

dirsearch --help
Prepare Chameleon

Optional Rust-based web discovery tool. The config and technology wordlists are required even when the binary builds successfully. The three filename corrections below align the upstream profile with its case-sensitive wordlist checkout. Preserve an existing ~/.config/chameleon installation and review its paths instead of overwriting it. Compilation requires a compatible Rust toolchain; do not use its installer as an opaque substitute for reviewing dependencies. Upstream.

sudo apt install cargo build-essential perl pkg-config
git clone --depth 1 https://github.com/iustin24/chameleon.git "$HOME/oscp/tools/repos/chameleon"
cargo build --release --manifest-path "$HOME/oscp/tools/repos/chameleon/Cargo.toml"
mkdir -p "$HOME/.config/chameleon"
git clone --depth 1 https://github.com/iustin24/chameleon-wordlists.git "$HOME/.config/chameleon/wordlists"
( set -o noclobber; sed -e 's@/GO.txt@/Golang.txt@g' -e 's@/umbraco.txt@/Umbraco.txt@g' -e 's@/Joommla.txt@/Joomla.txt@g' "$HOME/oscp/tools/repos/chameleon/config.toml" > "$HOME/.config/chameleon/config.toml" )

Check on Kali:

"$HOME/oscp/tools/repos/chameleon/target/release/chameleon" --help
python3 - <<'PY'
import pathlib, tomllib
config = pathlib.Path.home() / ".config/chameleon/config.toml"
data = tomllib.loads(config.read_text())
def check(value):
    if isinstance(value, dict):
        for child in value.values():
            check(child)
    elif isinstance(value, str) and value.startswith("~/"):
        path = pathlib.Path(value).expanduser()
        assert path.is_file(), f"Missing configured file: {path}"
check(data)
PY
Prepare ZAP

Optional general-lab web proxy/scanner. This does not approve active scanner/automation features for the exam; follow the feature-specific restrictions in the owning section. Upstream.

sudo apt install zaproxy

Check on Kali:

zaproxy -version