Dlaczego uprawnieni pentesterzy potrzebują rotacji proxy
Jeśli kiedykolwiek uruchomiłeś amass albo ffuf na cel objęty programem bug bounty — i po pięciu minutach zobaczyłeś 403 Forbidden albo CAPTCHA na każdej odpowiedzi — wiesz, dlaczego rotacja IP ma znaczenie. WAF i systemy rate-limiting blokują adresy, z których napływa zbyt wiele żądań. Residential proxy z odpowiednią rotacją pozwalają na kontrolowane, etyczne rozproszenie ruchu tak, aby nie naruszyć warunków programu ani nie zdradzić swojej infrastruktury.
Kluczowe zastrzeżenie: Wszystkie techniki opisane w tym artykule mogą być stosowane wyłącznie w ramach wyraźnie określonego zakresu (scope) autoryzowanego pentestu lub programu bug bounty. Testowanie poza scope jest nielegalne i nieetyczne.
Ramy prawne i autoryzacja — zanim zaczniesz
Scope i safe harbor
Każdy program bug bounty definiuje scope — listę domen, IP, aplikacji i typów podatności, które wolno testować. Zanim uruchomisz jakiekolwiek narzędzie:
- Przeczytaj regulamin programu na platformie (HackerOne, Bugcrowd, Intigriti).
- Zidentyfikuj explicit scope — domeny, wildcardy, zakresy IP.
- Sprawdź safe harbor — czy program gwarantuje ochronę prawną dla badań w scope.
- Zwróć uwagę na limity żądań — niektóre programy wprost określają maksymalny rate (np. 100 req/min).
Testowanie infrastruktury spoza scope, nawet jeśli jest technicznie podobna, jest nielegalne w większości jurysdykcji. Nie ma wyjątków.
Typy autoryzacji
| Typ autoryzacji | Przykład | Uwagi |
|---|---|---|
| Program bug bounty | Polityka na HackerOne | Scope + safe harbor w regulaminie |
| Pentest komercyjny | Umowa z klientem | Podpisana umowa + ROE (Rules of Engagement) |
| CTF / lab | OWASP Juice Shop | Jawne zezwolenie, brak ryzyka prawnego |
| Brak autoryzacji | — | NIE TESTUJ. Pełna odpowiedzialność karna i cywilna. |
Wybór typu proxy do pentestów
Nie każdy typ proxy nadaje się do każdego etapu pentestu. Poniżej porównanie trzech głównych kategorii w kontekście pentest proxy rotation:
| Kryterium | Residential proxy | Datacenter proxy | Mobile proxy |
|---|---|---|---|
| Wykrywalność przez WAF | Niska — IP wygląda jak zwykły użytkownik | Wysoka — zakresy CIDR znane dostawcom WAF | Bardzo niska — IP operatorów komórkowych |
| Rotacja IP | Per-request lub sticky session | Ręczna lub per-request | Per-request (reconnect) |
| Stabilność połączenia | Średnia | Wysoka | Zmienna (zależna od operatora) |
| Koszt | Średni | Niski | Wysoki |
| Najlepsze zastosowanie | Enumeracja, content discovery, OSINT | Brute-force wewn., szybkie skanowanie | Testy API mobilnych, MFA bypass |
Do bug bounty residential proxies są zazwyczaj najlepszym wyborem — ruch wygląda naturalnie, a rotacja per-request zapobiega blokadom.
Odkrywanie subdomen z rotacją proxy
Amass — enumeracja pasywna
Amass agreguje dane z kilkudziesięciu źródeł OSINT ( crt.sh, VirusTotal, Shodan, DNSDB). Pasywna enumeracja rzadko wymaga proxy — źródła API mają własne limity. Problem pojawia się przy aktywnej enumeracji DNS, gdzie amass wysyła zapytania bezpośrednio do resolverów docelowych.
Konfiguracja amass z upstream residential proxy:
# Plik: ~/.config/amass/amass.ini
[network_settings]
http_proxy = http://user-country-US:PASSWORD@gate.proxyhat.com:8080
https_proxy = http://user-country-US:PASSWORD@gate.proxyhat.com:8080
[dns_settings]
# Dystrybucja zapytań przez wiele resolverów + proxy
resolver = 1.1.1.1,8.8.8.8,8.8.4.4
timeout = 5
max_retries = 3
Uruchomienie z włączonym proxy:
# Enumeracja pasywna (proxy dla API data sources)
amass enum -passive -d example.com
# Enumeracja aktywna — proxy rozprasza ruch DNS
amass enum -active -d example.com -config ~/.config/amass/amass.ini
Subfinder — pasywna enumeracja
Subfinder działa wyłącznie pasywnie, więc proxy jest potrzebne głównie do unikania rate-limitów na API dostawców danych (SecurityTrails, BufferOver). Użyj zmiennych środowiskowych:
export HTTP_PROXY=http://user-country-US:PASSWORD@gate.proxyhat.com:8080
export HTTPS_PROXY=http://user-country-US:PASSWORD@gate.proxyhat.com:8080
subfinder -d example.com -all -o subs.txt
Dla dłuższych list domen warto napisać prosty wrapper, który rotuje kraj po kraju — zmieniając country-US na country-DE, country-GB itd. między kolejnymi domenami.
Web asset discovery z proxy — ffuf i gobuster
Dlaczego content discovery wymaga rotacji IP
Typowy skan ffuf z wordlistą common.txt (4600 wpisów) przy 100 req/s = ~46 sekund. Przy 500 req/s = ~9 sekund. Problem: większość WAF blokuje IP po 200–500 żądaniach w krótkim czasie. Web asset discovery proxies rozwiązują ten problem — każde żądanie może pochodzić z innego IP.
ffuf z rotacyjnym residential proxy
ffuf natywnie obsługuje proxy przez flagę -x:
# Podstawowe użycie z residential proxy
ffuf -u https://example.com/FUZZ \
-w /opt/wordlists/common.txt \
-x http://user-country-US:PASSWORD@gate.proxyhat.com:8080 \
-t 50 \
-rate 100
Flaga -t 50 (50 wątków) z -rate 100 (100 req/s) zapewnia stabilny ruch. Przy rotacji per-request (domyślny tryb residential) każde żądanie ma inne IP — WAF nie widzi anomalii.
Zaawansowana rotacja — skrypt wrapper
Dla pełnej kontroli nad rotacją IP, możesz napisać wrapper, który zmienia parametr sesji w nazwie użytkownika proxy:
#!/bin/bash
# ffuf-rotate.sh — ffuf z rotacją sticky sessions
DOMAIN="$1"
WORDLIST="$2"
BATCH_SIZE=200
TOTAL=$(wc -l < "$WORDLIST")
BATCHES=$(( (TOTAL + BATCH_SIZE - 1) / BATCH_SIZE ))
for i in $(seq 1 $BATCHES); do
SESSION="sess-$(date +%s)-$i"
PROXY_URL="http://user-session-${SESSION}:PASSWORD@gate.proxyhat.com:8080"
# Podziel wordlistę na batche
START=$(( (i - 1) * BATCH_SIZE + 1 ))
END=$(( i * BATCH_SIZE ))
sed -n "${START},${END}p" "$WORDLIST" > "/tmp/batch_${i}.txt"
ffuf -u "https://${DOMAIN}/FUZZ" \
-w "/tmp/batch_${i}.txt" \
-x "$PROXY_URL" \
-t 30 \
-rate 80 \
-o "/tmp/ffuf_batch_${i}.json" \
-of json
# Pauza między batchami — etykieta rate-limit
sleep 5
done
# Połącz wyniki
jq -s '.[].results[]' /tmp/ffuf_batch_*.json > ffuf_results.json
echo "[+] Wyniki zapisane w ffuf_results.json"
Ten skrypt dzieli wordlistę na batche po 200 wpisów, każdy batch biegnie przez inną sesję sticky (stałe IP wewnątrz batcha), a między batchami jest 5-sekundowa pauza. To etyczny sposób na content discovery — szanujesz limity celu i nie zalewasz go ruchem.
Gobuster — alternatywa dla ffuf
Gobuster obsługuje proxy przez zmienną środowiskową lub flagę -p:
export HTTP_PROXY=http://user-country-US:PASSWORD@gate.proxyhat.com:8080
gobuster dir -u https://example.com \
-w /opt/wordlists/common.txt \
-t 30 \
--timeout 10s
Scanner-traffic blending — Burp Suite z upstream proxy
Konfiguracja Burp Suite
Burp Suite Professional pozwala na skonfigurowanie upstream proxy dla całego ruchu. To kluczowe dla bug bounty residential proxies — ruch skanera wygląda jak normalny ruch użytkownika:
- Otwórz Project options → Connections → Upstream Proxy Servers.
- Dodaj nową regułę:
Destination host: *(wszystkie hosty). - Ustaw proxy host:
gate.proxyhat.com, port:8080. - W sekcji authentication wpisz username i password w formacie:
user-country-US/PASSWORD. - Zaznacz Use for all destinations.
Dla aktywnego skanowania z rotacją IP, użyj trybu per-request — zmieniaj parametr sesji w username między kolejnymi skanami. Możesz zautomatyzować to za pomocą Burp Extension w Pythonie (Jython), która rotuje username proxy co N żądań.
Sticky sessions w Burp
Kiedy testujesz logikę sesji (session management, MFA flow), potrzebujesz sticky session — stałego IP dla całego flow:
- Username:
user-session-mytest01-country-US:PASSWORD - Każdy request w ramach sesji idzie przez to samo IP.
- Po zakończeniu testu zmieniasz session ID — nowe IP, nowa sesja.
Rate-limit etiquette — etyka w bug bounty
Limity żądań w scope
Wielu programów bug bounty określa maksymalny rate żądań. Typowe wartości:
- 100 req/min — programy z wrażliwą infrastrukturą (bankowość, zdrowie).
- 500 req/min — standardowe programy webowe.
- Brak limitu — rzadkie, zazwyczaj duże programy typu infra.
Jeśli program nie określa limitu, stosuj zasadę rozsądku — nie przekraczaj 200–300 req/min dla jednego IP.
Praktyczne strategie throttlingu
| Narzędzie | Flaga throttle | Zalecana wartość |
|---|---|---|
| ffuf | -rate | 50–100 req/s z rotacją IP |
| gobuster | -t + --timeout | 20–30 wątków |
| nuclei | -rate-limit | 100–150 req/min |
| Burp Active Scan | Throttle w Options | 50–100 req/min per IP |
Co robić, gdy WAF blokuje
- Nie zwiększaj rate — to pogorszy sytuację.
- Przełącz się na sticky session z innym IP (nowy session ID).
- Zmniejsz rate do połowy dotychczasowej wartości.
- Rozważ geo-targeting — użyj IP z kraju, w którym znajduje się cel (mniej podejrzane dla WAF).
- Jeśli CAPTCHA się pojawia — zrób pauzę 5–10 minut przed kolejną próbą.
OSINT i unikanie atrybucji
Residential proxy pełnią podwójną rolę w OSINT: (1) zapobiegają blokadom rate-limit, (2) chronią Twoją tożsamość. Kiedy zbierasz dane z publicznych źródeł (WHOIS, Shodan, crt.sh, social media), Twój prawdziwy IP nie jest logowany przez cel.
Geo-targeting jest tu kluczowy — jeśli badasz infrastrukturę w Niemczech, użyj:
curl -x http://user-country-DE-city-berlin:PASSWORD@gate.proxyhat.com:8080 \
https://target.example/api/endpoint
Ruch z berlińskiego IP jest mniej podejrzany niż ruch z amerykańskiego datacenter.
Podsumowanie — kluczowe zasady
Key Takeaways:
- Zawsze weryfikuj scope — testowanie poza autoryzowanym zakresem jest nielegalne.
- Residential proxy z rotacją per-request to najlepszy wybór do enumeracji i content discovery w bug bounty.
- Sticky sessions — używaj ich do testowania logiki sesji (MFA, auth flow).
- Szanuj rate-limity — throttluj ruch nawet poniżej formalnych limitów programu.
- Geo-targeting zmniejsza ryzyko wykrycia — dopasuj lokalizację IP do celu.
- Burp Suite z upstream proxy pozwala na blending scanner-traffic z normalnym ruchem.
- Dokumentuj — zapisuj, kiedy i jakich proxy użyłeś, w razie sporu z programem.
Jeśli szukasz proxy do autoryzowanych pentestów i bug bounty, sprawdź plany ProxyHat — residential proxy z rotacją per-request, geo-targetingiem w 190+ krajach i sticky sessions na życzenie. Więcej o zastosowaniach proxy w web scrapingu i SERP tracking.






