Setup · published
Initial Recon Script
Ein Bash-Helper für automatisierte Initial-Scans, saubere Projektstruktur und strukturierte Nmap-Outputs.
Automatisierter Initial-Scan:
IP und Namen angeben, anschließend wird ein Verzeichnis erstellt und der Scan-Output dort abgelegt.
Es wird wie folgt gescannt:
Full TCP Port Scan
Ziel: Ermittelt schnell alle offenen TCP-Ports des Targets.
nmap -p- --min-rate 10000 -T4 -v -n
Service Enumeration Scan
Ziel: Analysiert die gefundenen Ports auf Services, Versionen, Standard-Scripts, OS-Informationen und Traceroute.
nmap -sV -sC -O --traceroute -T4 -v
Es wird foglgende Basis Struktur erzeugt:
TARGET/
├── recon/
├── scans/
│ ├── <host>-initial.nmap
│ ├── <host>-ports.txt
│ ├── <host>-services.nmap
│ └── hosts/ # nur bei CIDR-Scans
├── loot/
├── web/
├── shells/
├── privesc/
├── notes/
│ └── master_notes.md
├── reports/
│ └── final_walkthrough.md
├── screenshots/
├── timeline.txt
└── credentials.txt
Ich habe zwei Versionen erstellt:
initscan.sh = Projekt vorbereiten + scannen
quickscan.sh = nur scannen
Script 1 = initscan.sh
#!/usr/bin/env bash
set -euo pipefail
usage() {
echo "Usage: $0 -i <IP|CIDR> -n <TARGET_NAME>"
echo
echo "Options:"
echo " -i IP-Adresse ODER CIDR des Targets (z.B. 10.129.163.96 oder 10.10.110.0/24)"
echo " -n Name des Targets (z.B. lame oder offshore)"
echo " -h Hilfe anzeigen"
exit 1
}
# === Argumente parsen ===
IP=""
TARGET=""
while getopts "i:n:h" opt; do
case "$opt" in
i) IP="$OPTARG" ;;
n) TARGET="$OPTARG" ;;
h) usage ;;
*) usage ;;
esac
done
if [[ -z "${IP}" || -z "${TARGET}" ]]; then
echo "[!] IP/CIDR und TARGET-Name sind Pflicht."
usage
fi
# === Utils ===
is_cidr() {
[[ "$1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}/([0-9]|[12][0-9]|3[0-2])$ ]]
}
sanitize_name() {
# safe for filenames: replace '/' -> '_', spaces -> '_'
local s="$1"
s="${s//\//_}"
s="${s// /_}"
echo "$s"
}
extract_up_hosts_gnmap() {
# Reads a .gnmap file and prints IPs of hosts that are Up
# Example line: "Host: 10.10.110.12 () Status: Up"
awk '/Status: Up/{for(i=1;i<=NF;i++) if($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) print $i}' "$1" | sort -u
}
scan_single_host() {
local host="$1"
local host_safe
host_safe="$(sanitize_name "$host")"
echo
echo "[*] ===== Host: $host ====="
echo "[*] Quick Portscan auf allen TCP-Ports ..."
nmap -p- --min-rate 10000 -T4 -v -n --open "$host" -oN "${host_safe}-initial.nmap"
echo "[*] Offene Ports extrahieren -> ${host_safe}-ports.txt ..."
awk -F/ '/^[0-9]+\/tcp/ {print $1}' "${host_safe}-initial.nmap" \
| paste -sd, - > "${host_safe}-ports.txt" || true
local PORTS=""
PORTS="$(cat "${host_safe}-ports.txt" || true)"
echo "[*] Ports: ${PORTS}"
if [[ -z "${PORTS}" ]]; then
echo "[!] Keine offenen Ports gefunden für ${host}, skip."
return 0
fi
echo "[*] Service Scan (-sV -sC -O --traceroute) ..."
nmap -sV -sC -O --traceroute -T4 -v -n -p "$PORTS" -oN "${host_safe}-services.nmap" "$host"
echo "[+] Host fertig: $host"
}
# === Root-Hinweis für OS Detection ===
if [[ "${EUID}" -ne 0 ]]; then
echo "[!] Hinweis: OS Detection (-O) funktioniert zuverlässig nur mit sudo/root."
fi
# === Basisverzeichnis ===
TARGET_SAFE="$(sanitize_name "$TARGET")"
BASE="./${TARGET_SAFE}"
mkdir -p "$BASE"/{recon,scans,loot,web,shells,privesc,notes,reports,screenshots}
touch "$BASE"/notes/master_notes.md
touch "$BASE"/reports/final_walkthrough.md
touch "$BASE"/timeline.txt
touch "$BASE"/credentials.txt
# Alle Nmap-Scans landen in scans/
cd "$BASE/scans" || { echo "[!] Konnte nicht nach $BASE/scans wechseln"; exit 1; }
# === CIDR oder Single IP? ===
if is_cidr "$IP"; then
SAFE_NET="$(sanitize_name "$IP")"
echo "[*] CIDR erkannt: $IP"
echo "[*] Host Discovery (-sn) auf $IP ..."
nmap -sn -T4 -n "$IP" -oN "${SAFE_NET}-hosts.nmap" -oG "${SAFE_NET}-hosts.gnmap"
mapfile -t HOSTS < <(extract_up_hosts_gnmap "${SAFE_NET}-hosts.gnmap")
if (( ${#HOSTS[@]} == 0 )); then
echo "[!] Keine Hosts up gefunden in $IP. Fertig."
exit 0
fi
echo "[*] Up Hosts (${#HOSTS[@]}):"
printf ' - %s\n' "${HOSTS[@]}"
mkdir -p "hosts"
for h in "${HOSTS[@]}"; do
host_safe="$(sanitize_name "$h")"
mkdir -p "hosts/${host_safe}"
(
cd "hosts/${host_safe}" || exit 1
scan_single_host "$h"
)
done
echo
echo "[+] Fertig. Übersicht:"
echo " - ${BASE}/scans/${SAFE_NET}-hosts.nmap"
echo " - ${BASE}/scans/${SAFE_NET}-hosts.gnmap"
echo " - ${BASE}/scans/hosts/<host>/<host>-initial.nmap"
echo " - ${BASE}/scans/hosts/<host>/<host>-ports.txt"
echo " - ${BASE}/scans/hosts/<host>/<host>-services.nmap"
else
echo "[*] Single Host erkannt: $IP"
scan_single_host "$IP"
echo
echo "[+] Fertig. Files in ${BASE}/scans:"
ls -1
fi
printf "[%s] Initial scan completed for target '%s' against '%s'\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$TARGET_SAFE" "$IP" >> ../timeline.txt
Script2 = quickscan.sh
#!/usr/bin/env bash
set -euo pipefail
usage() {
echo "Usage: $0 -i <IP|CIDR>"
echo
echo "Options:"
echo " -i IP-Adresse ODER CIDR des Targets, z.B. 10.129.163.96 oder 10.10.110.0/24"
echo " -h Hilfe anzeigen"
exit 1
}
IP=""
while getopts "i:h" opt; do
case "$opt" in
i) IP="$OPTARG" ;;
h) usage ;;
*) usage ;;
esac
done
if [[ -z "${IP}" ]]; then
echo "[!] IP/CIDR ist Pflicht."
usage
fi
is_cidr() {
[[ "$1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}/([0-9]|[12][0-9]|3[0-2])$ ]]
}
sanitize_name() {
local s="$1"
s="${s//\//_}"
s="${s// /_}"
echo "$s"
}
extract_up_hosts_gnmap() {
awk '/Status: Up/{for(i=1;i<=NF;i++) if($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) print $i}' "$1" | sort -u
}
scan_single_host() {
local host="$1"
local host_safe
host_safe="$(sanitize_name "$host")"
echo
echo "[*] ===== Host: $host ====="
echo "[*] Quick Portscan auf allen TCP-Ports ..."
nmap -p- --min-rate 10000 -T4 -v -n --open "$host" -oN "${host_safe}-initial.nmap"
echo "[*] Offene Ports extrahieren -> ${host_safe}-ports.txt ..."
awk -F/ '/^[0-9]+\/tcp/ {print $1}' "${host_safe}-initial.nmap" \
| paste -sd, - > "${host_safe}-ports.txt" || true
local PORTS=""
PORTS="$(cat "${host_safe}-ports.txt" || true)"
echo "[*] Ports: ${PORTS}"
if [[ -z "${PORTS}" ]]; then
echo "[!] Keine offenen Ports gefunden für ${host}, skip."
return 0
fi
echo "[*] Service Scan (-sV -sC -O --traceroute) ..."
nmap -sV -sC -O --traceroute -T4 -v -n -p "$PORTS" -oN "${host_safe}-services.nmap" "$host"
echo "[+] Host fertig: $host"
}
if [[ "${EUID}" -ne 0 ]]; then
echo "[!] Hinweis: OS Detection (-O) funktioniert zuverlässig nur mit sudo/root."
fi
if is_cidr "$IP"; then
SAFE_NET="$(sanitize_name "$IP")"
echo "[*] CIDR erkannt: $IP"
echo "[*] Host Discovery (-sn) auf $IP ..."
nmap -sn -T4 -n "$IP" -oN "${SAFE_NET}-hosts.nmap" -oG "${SAFE_NET}-hosts.gnmap"
mapfile -t HOSTS < <(extract_up_hosts_gnmap "${SAFE_NET}-hosts.gnmap")
if (( ${#HOSTS[@]} == 0 )); then
echo "[!] Keine Hosts up gefunden in $IP. Fertig."
exit 0
fi
echo "[*] Up Hosts (${#HOSTS[@]}):"
printf ' - %s\n' "${HOSTS[@]}"
mkdir -p hosts
for h in "${HOSTS[@]}"; do
host_safe="$(sanitize_name "$h")"
mkdir -p "hosts/${host_safe}"
(
cd "hosts/${host_safe}" || exit 1
scan_single_host "$h"
)
done
echo
echo "[+] Fertig. Übersicht:"
echo " - ${SAFE_NET}-hosts.nmap"
echo " - ${SAFE_NET}-hosts.gnmap"
echo " - hosts/<host>/<host>-initial.nmap"
echo " - hosts/<host>/<host>-ports.txt"
echo " - hosts/<host>/<host>-services.nmap"
else
echo "[*] Single Host erkannt: $IP"
scan_single_host "$IP"
echo
echo "[+] Fertig. Files:"
ls -1
fi