256 lines
7.4 KiB
Markdown
256 lines
7.4 KiB
Markdown
# DNSRecon - Passive Infrastructure Reconnaissance Tool
|
||
|
||
DNSRecon is an interactive, passive reconnaissance tool designed to map adversary infrastructure. It operates on a "free-by-default" model, ensuring core functionality without subscriptions, while allowing power users to enhance its capabilities with paid API keys.
|
||
|
||
**Current Status: Phase 2 Implementation**
|
||
|
||
- ✅ Core infrastructure and graph engine
|
||
- ✅ Multi-provider support (crt.sh, DNS, Shodan)
|
||
- ✅ Session-based multi-user support
|
||
- ✅ Real-time web interface with interactive visualization
|
||
- ✅ Forensic logging system and JSON export
|
||
|
||
## Features
|
||
|
||
- **Passive Reconnaissance**: Gathers data without direct contact with target infrastructure.
|
||
- **In-Memory Graph Analysis**: Uses NetworkX for efficient relationship mapping.
|
||
- **Real-Time Visualization**: The graph updates dynamically as the scan progresses.
|
||
- **Forensic Logging**: A complete audit trail of all reconnaissance activities is maintained.
|
||
- **Confidence Scoring**: Relationships are weighted based on the reliability of the data source.
|
||
- **Session Management**: Supports concurrent user sessions with isolated scanner instances.
|
||
|
||
## Installation
|
||
|
||
### Prerequisites
|
||
|
||
- Python 3.8 or higher
|
||
- A modern web browser with JavaScript enabled
|
||
- (Recommended) A Linux host for running the application and the optional DNS cache.
|
||
|
||
### 1\. Clone the Project
|
||
|
||
```bash
|
||
git clone https://github.com/your-repo/dnsrecon.git
|
||
cd dnsrecon
|
||
```
|
||
|
||
### 2\. Install Python Dependencies
|
||
|
||
It is highly recommended to use a virtual environment:
|
||
|
||
```bash
|
||
python3 -m venv venv
|
||
source venv/bin/activate
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 3\. (Optional but Recommended) Set up a Local DNS Caching Resolver
|
||
|
||
Running a local DNS caching resolver can significantly speed up DNS queries and reduce your network footprint. Here’s how to set up `unbound` on a Debian-based Linux distribution (like Ubuntu).
|
||
|
||
**a. Install Unbound:**
|
||
|
||
```bash
|
||
sudo apt update
|
||
sudo apt install unbound -y
|
||
```
|
||
|
||
**b. Configure Unbound:**
|
||
Create a new configuration file for DNSRecon:
|
||
|
||
```bash
|
||
sudo nano /etc/unbound/unbound.conf.d/dnsrecon.conf
|
||
```
|
||
|
||
Add the following content to the file:
|
||
|
||
```
|
||
server:
|
||
# Listen on localhost for all users
|
||
interface: 127.0.0.1
|
||
access-control: 0.0.0.0/0 refuse
|
||
access-control: 127.0.0.0/8 allow
|
||
|
||
# Enable prefetching of popular items
|
||
prefetch: yes
|
||
```
|
||
|
||
**c. Restart Unbound and set it as the default resolver:**
|
||
|
||
```bash
|
||
sudo systemctl restart unbound
|
||
sudo systemctl enable unbound
|
||
```
|
||
|
||
To use this resolver for your system, you may need to update your network settings to point to `127.0.0.1` as your DNS server.
|
||
|
||
**d. Update DNSProvider to use the local resolver:**
|
||
In `dnsrecon/providers/dns_provider.py`, you can explicitly set the resolver's nameservers in the `__init__` method:
|
||
|
||
```python
|
||
# dnsrecon/providers/dns_provider.py
|
||
|
||
class DNSProvider(BaseProvider):
|
||
def __init__(self, session_config=None):
|
||
"""Initialize DNS provider with session-specific configuration."""
|
||
super().__init__(...)
|
||
|
||
# Configure DNS resolver
|
||
self.resolver = dns.resolver.Resolver()
|
||
self.resolver.nameservers = ['127.0.0.1'] # Use local caching resolver
|
||
self.resolver.timeout = 5
|
||
self.resolver.lifetime = 10
|
||
```
|
||
|
||
## Usage (Development)
|
||
|
||
### 1\. Start the Application
|
||
|
||
```bash
|
||
python app.py
|
||
```
|
||
|
||
### 2\. Open Your Browser
|
||
|
||
Navigate to `http://127.0.0.1:5000`.
|
||
|
||
### 3\. Basic Reconnaissance Workflow
|
||
|
||
1. **Enter Target Domain**: Input a domain like `example.com`.
|
||
2. **Select Recursion Depth**: Depth 2 is recommended for most investigations.
|
||
3. **Start Reconnaissance**: Click "Start Reconnaissance" to begin.
|
||
4. **Monitor Progress**: Watch the real-time graph build as relationships are discovered.
|
||
5. **Analyze and Export**: Interact with the graph and download the results when the scan is complete.
|
||
|
||
## Production Deployment
|
||
|
||
To deploy DNSRecon in a production environment, follow these steps:
|
||
|
||
### 1\. Use a Production WSGI Server
|
||
|
||
Do not use the built-in Flask development server for production. Use a WSGI server like **Gunicorn**:
|
||
|
||
```bash
|
||
pip install gunicorn
|
||
gunicorn --workers 4 --bind 0.0.0.0:5000 app:app
|
||
```
|
||
|
||
### 2\. Configure Environment Variables
|
||
|
||
Set the following environment variables for a secure and configurable deployment:
|
||
|
||
```bash
|
||
# Generate a strong, random secret key
|
||
export SECRET_KEY='your-super-secret-and-random-key'
|
||
|
||
# Set Flask to production mode
|
||
export FLASK_ENV='production'
|
||
export FLASK_DEBUG=False
|
||
|
||
# API keys (optional, but recommended for full functionality)
|
||
export SHODAN_API_KEY="your_shodan_key"
|
||
```
|
||
|
||
### 3\. Use a Reverse Proxy
|
||
|
||
Set up a reverse proxy like **Nginx** to sit in front of the Gunicorn server. This provides several benefits, including:
|
||
|
||
- **TLS/SSL Termination**: Securely handle HTTPS traffic.
|
||
- **Load Balancing**: Distribute traffic across multiple application instances.
|
||
- **Serving Static Files**: Efficiently serve CSS and JavaScript files.
|
||
|
||
**Example Nginx Configuration:**
|
||
|
||
```nginx
|
||
server {
|
||
listen 80;
|
||
server_name your_domain.com;
|
||
|
||
location / {
|
||
return 301 https://$host$request_uri;
|
||
}
|
||
}
|
||
|
||
server {
|
||
listen 443 ssl;
|
||
server_name your_domain.com;
|
||
|
||
# SSL cert configuration
|
||
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
|
||
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
|
||
|
||
location / {
|
||
proxy_pass http://127.0.0.1:5000;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
}
|
||
|
||
location /static {
|
||
alias /path/to/your/dnsrecon/static;
|
||
expires 30d;
|
||
}
|
||
}
|
||
```
|
||
|
||
## Autostart with systemd
|
||
|
||
To run DNSRecon as a service that starts automatically on boot, you can use `systemd`.
|
||
|
||
### 1\. Create a `.service` file
|
||
|
||
Create a new service file in `/etc/systemd/system/`:
|
||
|
||
```bash
|
||
sudo nano /etc/systemd/system/dnsrecon.service
|
||
```
|
||
|
||
### 2\. Add the Service Configuration
|
||
|
||
Paste the following configuration into the file. **Remember to replace `/path/to/your/dnsrecon` and `your_user` with your actual project path and username.**
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=DNSRecon Application
|
||
After=network.target
|
||
|
||
[Service]
|
||
User=your_user
|
||
Group=your_user
|
||
WorkingDirectory=/path/to/your/dnsrecon
|
||
ExecStart=/path/to/your/dnsrecon/venv/bin/gunicorn --workers 4 --bind 0.0.0.0:5000 app:app
|
||
Restart=always
|
||
Environment="SECRET_KEY=your-super-secret-and-random-key"
|
||
Environment="FLASK_ENV=production"
|
||
Environment="FLASK_DEBUG=False"
|
||
Environment="SHODAN_API_KEY=your_shodan_key"
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
### 3\. Enable and Start the Service
|
||
|
||
Reload the `systemd` daemon, enable the service to start on boot, and then start it immediately:
|
||
|
||
```bash
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable dnsrecon.service
|
||
sudo systemctl start dnsrecon.service
|
||
```
|
||
|
||
You can check the status of the service at any time with:
|
||
|
||
```bash
|
||
sudo systemctl status dnsrecon.service
|
||
```
|
||
|
||
## Security Considerations
|
||
|
||
- **API Keys**: API keys are stored in memory for the duration of a user session and are not written to disk.
|
||
- **Rate Limiting**: DNSRecon includes built-in rate limiting to be respectful to data sources.
|
||
- **Local Use**: The application is designed for local or trusted network use and does not have built-in authentication. **Do not expose it directly to the internet without proper security controls.**
|
||
|
||
## License
|
||
|
||
This project is licensed under the terms of the license agreement found in the `LICENSE` file. |