
नेटवर्क मॉनिटरिंग टूल जो प्रक्रिया-से-नेटवर्क कनेक्शनों का मानचित्रण करता है, क्लाउड प्रदाताओं की पहचान करता है, और बीकनिंग गतिविधि का पता लगाता है।
नेटवर्क मॉनिटरिंग टूल जो प्रोसेस-से-नेटवर्क कनेक्शन का मानचित्रण करता है, क्लाउड प्रदाताओं की पहचान करता है, और फ़ायरवॉल नियम उत्पन्न करता है। संग्रह के लिए हल्का एजेंट, एकत्रीकरण के लिए सर्वर, विश्लेषण के लिए पार्सर।
क्रॉस-मशीन अवलोकन — OS संस्करण तुलना, साझा IP पहचान, सभी होस्टों में बीकनिंग उम्मीदवार:

प्रति-होस्ट विवरण — गंभीर अलर्ट (EOL OS, अज्ञात IP पर nc.exe बीकनिंग):

प्रति-होस्ट विवरण — चेतावनी (बीकन उम्मीदवार फ़्लैग किया गया):

प्रति-होस्ट विवरण — स्वच्छ (कोई विसंगति नहीं):

cargo build --release
# Simple collection
cargo run --release -- collect --duration-seconds 300
# With DNS lookups
cargo run --release -- collect --duration-seconds 300 --enable-dns
# With compression and encryption
cargo run --release -- collect \
--duration-seconds 300 \
--compress \
--encrypt-key "your-secret-password"
# Generate all reports
cargo run --release -- parse \
--input connections.jsonl \
--process-summary processes.json \
--cloud-analysis cloud.json \
--firewall-rules-iptables firewall.sh \
--database-export network.sql
# Offline ownership lookup with local ASN DB (no network calls)
cargo run --release -- parse \
--input connections.jsonl \
--cloud-analysis cloud.json \
--asn-db ip2asn-v4.tsv
# Live ARIN lookup with persistent cache (re-run skips already-queried IPs)
cargo run --release -- parse \
--input connections.jsonl \
--cloud-analysis cloud.json \
--arin-lookup \
--arin-cache arin_cache.json
# Quick 5-minute analysis
cargo run --release -- monitor \
--duration-seconds 300 \
--output-dir ./analysis \
--full-analysis
agent बाइनरी एक न्यूनतम, ज़ीरो-फ़्लैग डिप्लॉयमेंट लक्ष्य है। सभी कॉन्फ़िगरेशन एनवायरनमेंट वेरिएबल्स के माध्यम से संकलन समय पर बाइनरी में बेक किया जाता है — इसे लक्ष्य पर ड्रॉप करें और बिना किसी तर्क के चलाएँ।
AGENT_SERVER="http://10.0.1.5:8080/upload" \
AGENT_KEY="labkey123" \
AGENT_INTERVAL="5" \
AGENT_BATCH="200" \
AGENT_DURATION="0" \
AGENT_DNS="false" \
AGENT_ENCRYPT_KEY="mysecretpassword" \
cargo build --release --bin agent
target/release/agent पर परिणामी बाइनरी में कोई बाहरी निर्भरता नहीं होती और किसी फ़्लैग की आवश्यकता नहीं होती:
./agent
AGENT_SERVER="https://collector.internal/upload" \
AGENT_KEY="prod-api-key" \
AGENT_DURATION="0" \
AGENT_INTERVAL="30" \
AGENT_COMPRESS="true" \
AGENT_ENCRYPT_KEY="$(cat /etc/gibson/key)" \
cargo build --release --bin agent
cargo run --release -- collect \
--duration-seconds 3600 \
--interval-seconds 10 \
--compress \
--encrypt-key "your-32-char-hex-key-or-password" \
--upload-url "https://your-server.com/api/upload" \
--api-key "your-api-key" \
--batch-size 50 \
--delete-after-upload
cargo run --release -- collect \
--duration-seconds 86400 \
--interval-seconds 30 \
--output connections_daily.jsonl \
--enable-dns \
--compress
पार्सर अमेलित IP के स्वामी की पहचान करने के लिए दो परस्पर अनन्य मार्गों का समर्थन करता है:
ip2asn डेटाबेस डाउनलोड करें (साप्ताहिक रीफ़्रेश):
curl -O https://iptoasn.com/data/ip2asn-v4.tsv.gz && gunzip ip2asn-v4.tsv.gz
जब --asn-db प्रदान किया जाता है, तो --arin-lookup अनदेखा कर दिया जाता है। ARIN परिणामों को डिस्क पर सहेजने के लिए --arin-cache का उपयोग करें ताकि पुनः चलाने पर पहले से क्वेरी किए गए IP छोड़ दिए जाएँ।
# Parse with cloud detection focus
cargo run --release -- parse \
--input connections.jsonl \
--cloud-analysis cloud_report.json \
--min-connections 5 \
--whitelist-processes "chrome,firefox,safari,edge"
collector_server.py बनाएँ:
from flask import Flask, request, jsonify
import os
import json
import base64
from datetime import datetime
from Crypto.Cipher import AES
import gzip
app = Flask(__name__)
# Configuration
UPLOAD_DIR = "./collected_data"
API_KEY = "your-secure-api-key"
ENCRYPTION_KEY = bytes.fromhex("your-32-byte-hex-key") # Optional
os.makedirs(UPLOAD_DIR, exist_ok=True)
def decrypt_data(encrypted_data, key):
"""Decrypt AES-256-GCM encrypted data"""
decoded = base64.b64decode(encrypted_data)
nonce = decoded[:12]
ciphertext = decoded[12:]
cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
plaintext = cipher.decrypt_and_verify(ciphertext[:-16], ciphertext[-16:])
return plaintext
@app.route('/api/upload', methods=['POST'])
def upload():
# Verify API key
if request.headers.get('X-API-Key') != API_KEY:
return jsonify({"error": "Invalid API key"}), 401
try:
data = request.get_data()
# If data is base64 encoded (encrypted)
if data.startswith(b'eyJ'): # JSON starts with {"
# Not encrypted, parse directly
batch = json.loads(data)
else:
# Encrypted data
decrypted = decrypt_data(data, ENCRYPTION_KEY)
batch = json.loads(decrypted)
# Save to file
hostname = batch.get('hostname', 'unknown')
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f"{UPLOAD_DIR}/{hostname}_{timestamp}.json"
with open(filename, 'w') as f:
json.dump(batch, f)
return jsonify({"status": "success", "file": filename}), 200
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, ssl_context='adhoc') # Use proper SSL in production
इसे चलाएँ:
pip install flask pycryptodome
python collector_server.py
/etc/nginx/sites-available/collector बनाएँ:
server {
listen 443 ssl;
server_name collector.yourcompany.com;
ssl_certificate /etc/ssl/certs/your-cert.pem;
ssl_certificate_key /etc/ssl/private/your-key.pem;
client_max_body_size 100M;
location /upload {
# API key validation
if ($http_x_api_key != "your-secure-api-key") {
return 403;
}
# Save uploaded files
client_body_in_file_only on;
client_body_temp_path /var/uploads/;
# Pass to processing script
proxy_pass http://localhost:8080;
proxy_set_header X-File $request_body_file;
}
}
// index.js for AWS Lambda
const AWS = require('aws-sdk');
const crypto = require('crypto');
const s3 = new AWS.S3();
const BUCKET_NAME = 'your-network-data-bucket';
const API_KEY = process.env.API_KEY;
const ENCRYPTION_KEY = Buffer.from(process.env.ENCRYPTION_KEY, 'hex');
exports.handler = async (event) => {
// Verify API key
if (event.headers['X-API-Key'] !== API_KEY) {
return {
statusCode: 401,
body: JSON.stringify({ error: 'Invalid API key' })
};
}
try {
let data = event.body;
// Decrypt if needed
if (!data.startsWith('{')) {
// Encrypted data
const encrypted = Buffer.from(data, 'base64');
const nonce = encrypted.slice(0, 12);
const ciphertext = encrypted.slice(12);
const decipher = crypto.createDecipheriv('aes-256-gcm', ENCRYPTION_KEY, nonce);
const decrypted = Buffer.concat([
decipher.update(ciphertext.slice(0, -16)),
decipher.final()
]);
data = decrypted.toString();
}
const batch = JSON.parse(data);
const key = `${batch.hostname}/${Date.now()}_${batch.batch_id}.json`;
await s3.putObject({
Bucket: BUCKET_NAME,
Key: key,
Body: data,
ContentType: 'application/json'
}).promise();
return {
statusCode: 200,
body: JSON.stringify({ status: 'success', key })
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify({ error: error.message })
};
}
};
प्रमुख सिस्टम पर कलेक्टर तैनात करें:
# Windows endpoints
gibson.exe collect --duration-seconds 3600 --upload-url https://sec.company.com/upload --api-key KEY
# Linux servers
./gibson collect --duration-seconds 7200 --compress --upload-url https://sec.company.com/upload
Linux पर systemd सेवा का उपयोग करें:
# /etc/systemd/system/network-monitor.service
[Unit]
Description=Network Connection Monitor
After=network.target
[Service]
Type=simple
User=monitor
ExecStart=/opt/monitor/gibson collect \
--duration-seconds 3600 \
--compress \
--encrypt-key ${ENCRYPT_KEY} \
--upload-url https://collector.internal/upload \
--api-key ${API_KEY}
Restart=always
[Install]
WantedBy=multi-user.target
FROM rust:1.75 as builder
WORKDIR /app
COPY . .
RUN cargo build --release
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates
COPY --from=builder /app/target/release/gibson /usr/local/bin/
CMD ["gibson", "collect", "--duration-seconds", "3600", "--upload-url", "${UPLOAD_URL}"]
{
"process_name": "chrome",
"pid": 1234,
"total_connections": 45,
"unique_remote_ips": ["1.2.3.4", "5.6.7.8"],
"cloud_providers": {
"AWS": {
"connection_count": 12,
"services": {"CloudFront": 8, "S3": 4}
}
},
"risk_score": 0.5
}
{
"AWS": {
"provider": "AWS",
"unique_ips": ["52.84.1.2", "54.230.3.4"],
"unique_domains": ["d1234.cloudfront.net"],
"services": {"CloudFront": 15, "S3": 3},
"total_connections": 18
}
}
# Generated firewall rules
# ALLOW: Known Cloud Providers
iptables -A OUTPUT -p tcp -d 52.84.0.0/14 -j ACCEPT -m comment --comment "chrome to AWS"
iptables -A OUTPUT -p tcp -d 104.16.0.0/12 -j ACCEPT -m comment --comment "firefox to Cloudflare"
--interval-seconds 30 का उपयोग करें--enable-dns फ़्लैग)MIT
Pull requests का स्वागत है।
| वेरिएबल | डिफ़ॉल्ट | विवरण |
|---|
AGENT_SERVER | http://localhost:8080/upload | अपलोड एंडपॉइंट URL |
AGENT_KEY | (कोई नहीं) | X-API-Key हेडर मान |
AGENT_INTERVAL | 5 | सॉकेट पोल अंतराल (सेकंड में) |
AGENT_BATCH | 200 | प्रति अपलोड बैच रिकॉर्ड |
AGENT_DURATION | 0 | रन अवधि सेकंड में (0 = हमेशा चलाएँ) |
AGENT_DNS | false | IP को होस्टनाम में हल करें |
AGENT_ESTABLISHED | true | केवल ESTABLISHED कनेक्शन |
AGENT_LOCAL_COPY | false | अपलोड के साथ स्थानीय .jsonl प्रति रखें |
AGENT_COMPRESS | false | अपलोड से पहले Gzip संपीड़ित करें |
AGENT_ENCRYPT_KEY | (कोई नहीं) | AES-256-GCM पेलोड एन्क्रिप्ट करें (पासवर्ड या 64-अक्षर हेक्स कुंजी) |
AGENT_UA | (reqwest डिफ़ॉल्ट) | HTTP User-Agent हेडर |
| विधि | फ़्लैग | गति | नेटवर्क | सबसे उपयुक्त |
|---|
| स्थानीय ASN DB | --asn-db | तत्काल | कोई नहीं | बार-बार विश्लेषण, एयर-गैप्ड वातावरण |
| लाइव ARIN RDAP | --arin-lookup | धीमा (प्रति-IP) | हाँ | एकमुश्त लुकअप, कोई स्थानीय DB उपलब्ध नहीं |