> ## Documentation Index
> Fetch the complete documentation index at: https://trickest.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Enumerate Hostnames via Recursive DNS Brute Force

> Enumerate sub-subdomains of a list of hostnames using DNS brute force on the most likely hostnames

export const ModuleOverview = ({category, inputs, outputs, author, createdDate, iframeUrl, long_description}) => <div style={{
  backgroundColor: 'var(--background-card)',
  borderRadius: '16px',
  padding: '32px',
  boxShadow: '0 8px 32px rgba(0, 0, 0, 0.08)'
}}>
    <div style={{
  width: '100%',
  height: '600px',
  backgroundColor: 'var(--background-default)',
  borderRadius: '16px',
  overflow: 'hidden',
  border: '1px solid var(--border-default)',
  marginBottom: '24px',
  position: 'relative'
}}>
      <div style={{
  width: '100%',
  height: '100%'
}}>
        <div className="p-2 not-prose relative bg-gray-50/50 rounded-xl overflow-hidden dark:bg-gray-800/25" style={{
  width: '100%',
  height: '100%'
}}>
          <div className="absolute inset-0 bg-grid-neutral-200/20 [mask-image:linear-gradient(0deg,#fff,rgba(255,255,255,0.6))] dark:bg-grid-white/5 dark:[mask-image:linear-gradient(0deg,rgba(255,255,255,0.1),rgba(255,255,255,0.5))]" style={{
  backgroundPosition: '10px 10px'
}}></div>
          <div className="relative rounded-lg overflow-hidden flex justify-center" style={{
  width: '100%',
  height: '100%'
}}>
            <iframe src={iframeUrl} scrolling="no" style={{
  position: 'absolute',
  top: 0,
  left: 0,
  width: '100%',
  height: '100%',
  border: 'none',
  overflow: 'hidden'
}} title="Module Preview" />
          </div>
          <div className="absolute inset-0 pointer-events-none border border-black/5 rounded-xl dark:border-white/5"></div>
        </div>
      </div>
    </div>

    <div style={{
  display: 'flex',
  justifyContent: 'space-between',
  alignItems: 'center',
  marginBottom: '24px'
}}>
      <div style={{
  display: 'flex',
  gap: '16px',
  alignItems: 'center'
}}>
        <span style={{
  background: 'linear-gradient(135deg, #00a3ff, #0065ff)',
  color: 'white',
  padding: '8px 16px',
  borderRadius: '24px',
  fontSize: '0.875rem',
  fontWeight: '600',
  textTransform: 'uppercase'
}}>
          {category}
        </span>
      </div>
      
      <div style={{
  display: 'flex',
  gap: '24px',
  alignItems: 'center'
}}>
        <div>
          <p style={{
  color: 'var(--text-secondary)',
  fontSize: '0.875rem',
  margin: 0
}}>Created by</p>
          <p style={{
  color: 'var(--text-primary)',
  fontWeight: '500',
  margin: 0
}}>{author}</p>
        </div>
        <div style={{
  width: '1px',
  height: '32px',
  backgroundColor: 'var(--border-default)'
}} />
        <div>
          <p style={{
  color: 'var(--text-secondary)',
  fontSize: '0.875rem',
  margin: 0
}}>Last updated</p>
          <p style={{
  color: 'var(--text-primary)',
  fontWeight: '500',
  margin: 0
}}>
            {new Date(createdDate).toLocaleDateString()}
          </p>
        </div>
      </div>
    </div>

    <p style={{
  color: 'rgba(163, 179, 188, 0.8)',
  fontSize: '1rem',
  margin: '0 0 24px 0',
  lineHeight: '1.6'
}}>
      {long_description}
    </p>

    <div style={{
  display: 'grid',
  gridTemplateColumns: '1fr 1fr',
  gap: '32px'
}}>
      <div>
        <h3 style={{
  fontSize: '1.25rem',
  fontWeight: '600',
  color: 'var(--text-primary)',
  marginBottom: '16px',
  display: 'flex',
  alignItems: 'center',
  gap: '8px'
}}>
          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
            <path d="M5 12h14M12 5l7 7-7 7" />
          </svg>
          Input Parameters
        </h3>
        <div style={{
  display: 'flex',
  flexDirection: 'column',
  gap: '12px'
}}>
          {Object.entries(inputs).map(([key, value]) => <div key={key} style={{
  padding: '16px',
  backgroundColor: 'var(--background-default)',
  borderRadius: '12px',
  border: '1px solid var(--border-default)'
}}>
              <ParamField query={key} type={value.type.toLowerCase()} optional={!value.visible} required={value.visible}>
                <span style={{
  fontSize: '0.95rem',
  color: 'var(--text-secondary)',
  lineHeight: '1.5'
}}>
                  {value.description}
                </span>
              </ParamField>
            </div>)}
        </div>
      </div>

      <div>
        <h3 style={{
  fontSize: '1.25rem',
  fontWeight: '600',
  color: 'var(--text-primary)',
  marginBottom: '16px',
  display: 'flex',
  alignItems: 'center',
  gap: '8px'
}}>
          <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor">
            <circle cx="12" cy="12" r="10" /><path d="M8 12h8" />
          </svg>
          Outputs
        </h3>
        <div style={{
  display: 'flex',
  flexWrap: 'wrap',
  gap: '6px'
}}>
          {outputs.map((output, index) => <span key={index} style={{
  background: 'rgba(255, 107, 0, 0.1)',
  borderRadius: '6px',
  padding: '2px 8px',
  fontSize: '0.7rem',
  display: 'inline-flex',
  alignItems: 'center',
  gap: '4px',
  color: '#ff6b00',
  border: '1px solid rgba(255, 107, 0, 0.2)'
}}>
              {output}
            </span>)}
        </div>
      </div>
    </div>
  </div>;

<ModuleOverview
  category="Attack Surface Management"
  inputs={ {
"hostnames": {
"name": "hostnames",
"type": "FILE",
"visible": true,
"description": "List of hostnames",
},
"level-2-wordlist": {
"name": "level-2-wordlist",
"type": "FILE",
"visible": false,
"description": "Custom wordlist for level-2 enumeration (FUZZ.1.example.com)",
},
"level-3-wordlist": {
"name": "level-3-wordlist",
"type": "FILE",
"visible": false,
"description": "Custom wordlist for level-3 enumeration (FUZZ.2.1.example.com)",
},
"level-4-wordlist": {
"name": "level-4-wordlist",
"type": "FILE",
"visible": false,
"description": "Custom wordlist for level-4, and higher, enumeration (FUZZ.3.2.1.example.com, FUZZ.4.3.2.1.example.com, ...)",
},
"hostnames-per-level": {
"name": "hostnames-per-level",
"type": "STRING",
"visible": false,
"description": "Number of hostnames to brute-force at each level. Default: 200",
},
}}
  outputs={[ 
"hostnames",
"hostname-details"
]}
  author="trickest-mhmdiaa"
  createdDate="2024-07-04"
  iframeUrl="https://editor.trickest.io/preview?workflow_url=https://trickest-public-workflow.s3.eu-central-1.amazonaws.com/65339daa-dca5-47f8-81ab-5af3db009925.json"
/>

# Enumerate Hostnames via Recursive DNS Brute Force

## Description

Enumerate sub-subdomains of a list of hostnames using DNS brute force on the most likely hostnames. The module starts by determining which hostnames have the highest probability of having valid hostnames at other levels and then generates the permutations.

For example, given a subdomain like `test.foo.bar.baz.example.com`, it will try variations like `FUZZ.foo.bar.baz.example.com`, `FUZZ.bar.baz.example.com`, `FUZZ.baz.example.com`, and so on. It uses regularly updated wordlists made specifically for this purpose, based on analyzing the hostnames of hundreds of organizations. You can also use custom wordlists tailored to your organization’s naming conventions.

### Features

* Discovers **different environments, regions, and associated software** based on the input hostnames.
* **Faster than standard permutation scanning**, focusing on high-probability hostnames.
* **Built-in wordlists** with the option to **use custom ones** tailored to your target.
* A **daily validated list of resolvers** to ensure accuracy.
* Result **verification using manually curated trusted resolvers**.
* A **wildcard filter** takes care of false positives.

## Inputs

### Required

* **subdomains:** a list of subdomains

```
test.foo.bar.baz.example.com
dev.shop.example.com
```

### Optional

* **hostnames-per-level**l: the number of hostnames to brute-force at each level - a higher value will lead to more comprehensive results but also require more time and/or machines (default: 200)
* **level-2-wordlist**: a custom wordlist for level-2 enumeration `FUZZ.1.example.com`

```
prod
test
dev
```

* **level-3-wordlist**" a custom wordlist for level-3 enumeration `FUZZ.2.1.example.com`

```
api
web
ingress
```

* **level-4-wordlist**: a custom wordlist for level-4 (and higher) enumeration `FUZZ.3.2.1.example.com`

```
auth
admin
private
```

## Outputs

* **subdomains**: a list of found subdomains

```
prod.baz.example.com
api.dev.shop.example.com
admin.foo.bar.baz.example.com
```

* **subdomain-details**: JSONLines records of subdomain discovery details.

```json theme={null}
{"hostname": "prod.baz.example.com", "domain_name": "example.com", "data_source": "dns brute force", "context": "recursive brute force"}
{"hostname": "api.dev.shop.example.com", "domain_name": "example.com", "data_source": "dns brute force", "context": "recursive brute force"}
{"hostname": "admin.foo.bar.baz.example.com", "domain_name": "example.com", "data_source": "dns brute force", "context": "recursive brute force"}
```

## Changelog

* v1.0.0
  * Initial release
* v1.0.1
  * Improve wildcard filtering
