[![Gleam Version](https://img.shields.io/badge/gleam-v1.17-ffaff3)](https://gleam.run/)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE.txt)

# Fuzzy 

Fuzzy is a concurrent web-content fuzzer written in [Gleam](https://gleam.run/) using BEAM processes.

It reads entries from a provided wordlist, inserts each entry into a target URL, sends concurrent HTTP requests, and prints responses matching the provided status codes. 

> [!WARNING]
> Only use Fuzzy against systems you own or have permission to test.

## Features 

- Concurrent HTTP requests using BEAM processes
- Configurable concurrency and request timeout
- Status-code filtering

## Requirements

Fuzzy currently targets only Erlang and has been tested with Gleam 1.17

## Installation 

Clone the repository: 

```bash
git clone https://github.com/MasMariusD/fuzzy.git
cd fuzzy
```

Run it directly with Gleam:

```bash
gleam run -- --help
```

Alternatively, build a standalone single-file Erlang escript: 

```bash 
gleam export escript 
./fuzzy --help
```

The escript still requires Erlang to be installed. 

## Usage

```bash
./fuzzy \
    --target=<URL> \
    --wordlist=<PATH> \
    [--status=<CODES>] \
    [--concurrency=<NUMBER>] \
    [--timeout=<MILLISECONDS>]
```

Example against a locally hosted application:

```bash
./fuzzy \
    --target=http://localhost:8080/pages/FZY \
    --wordlist=common.txt \
    --status=200,301,302,401,403 \
    --concurrency=50 \
    --timeout=3000
```

### Target Placeholder

Use `FZY` in the target URL to control where each wordlist entry is inserted:

`http://localhost:8080/api/FZY/details`

If the target does not contain `FZY`, Fuzzy appends `/FZY` to the target URL automatically. 

`http://localhost:8080`

becomes:

`http://localhost:8080/FZY`

### Options

| Option | Required | Default | Description |
| ------ | -------: | ------: | --------- | 
| --target | Yes | - | The target URI. Use FZY as the wordlist placeholder |
| --wordlist | Yes | - | Path to a newline-separated wordlist |
| --status | No | All | Comma-separated status response codes to print |
| --concurrency | No | 50 | Number of concurrent requests | 
| --timeout | No | 3000 | Request timeout in milliseconds | 
| --help | No | - | Display command help | 

## Wordlists 

Fuzzy accepts any text file containing one entry per line. Empty lines are ignored.

The repository includes the `common.txt` wordlist from the [SecLists](https://github.com/danielmiessler/SecLists) project. See [THIRD_PARTY_NOTICES.md](https://github.com/MasMariusD/fuzzy/blob/main/THIRD_PARTY_NOTICES.md).

## Current limitations

Fuzzy 0.1.0 is still an early release. It currently: 

- Sends GET requests only
- Filters results purely by HTTP status codes
- Does not support custom headers or authentication
- Does not perform recursive discovery

These features are planned as future expansions.

## License 

Fuzzy is available under the [MIT license](LICENSE.txt).

