cURL
cURL staat voor “client URL” en is een command-line applicatie voor het verkrijgen (uploaden en downloaden) van informatie en bestanden over diverse internetprotocollen. De reden dat ik een browser uit 1997 wat extra aandacht geef in de vorm van een post is dat deze tool vandaag de dag nog steeds veel gebruikt wordt door OS systemen zonder GUI en uiteraard ook door security researchers. cURL maakt het makkelijk om snel volledige informatie te verkrijgen en voorziet de gebruiker meteen in de achterliggende broncode en toont geen opmaak. Of ik cURL gebruik om gegevens op te halen, sites te testen (zonder dat er door mijn browser extra code uitgevoerd wordt) of om data te uploaden, cURL doet het snel, effectief en is ontzettend krachtig. Dus om dit te benadrukken hierbij een (kleine) cURL post!
cURL bestaat uit 2 onderdelen, de cURL bibliotheek en de command-line tool welke gebruik maakt van deze bibliotheek. cURL is ontwikkeld door de Zweedse ontwikkelaar Daniel Stenberg. De kracht van cURL zit hem in de bibliotheek welke nog steeds bijgewerkt wordt waardoor deze vele protocollen ondersteund waaronder ook moderne protocollen (IPv6). De taalbindings zijn beschikbaar in meer dan 40 programmeertalen (Python, Java, C++, PHP etc.). Daarnaast is de bibliotheek gratis, portable, en threat-safe (multi-threaded). Omdat de cURL bibliotheek zo krachtig is werkt het op vele verschillende platformen zoals Windows, Linux, Solaris en mobiele platformen zoals Android. Het wordt ook gebruikt in auto’s, televisietoestellen, routers, printers, audioapparatuur, mobiele telefoons, tablets, mediaspelers en duizenden softwaretoepassingen.
Dus even ter volledigheid. cURL ondersteund o.a. de volgende zaken:
Protocollen:
- HTTP(S)
- SOAP requests
- (S)FTP(S)
- SCP
- SFTP
- TFTP
- LDAP
- DICT
- TELNET
- FILE
- LDAP(S)
- GOPHER
- SMB(S)
- IMAP(S) (na 9 Februar1 2010)
- POP3(S) (na 9 Februar1 2010)
- SMTP(S) (na 9 Februar1 2010)
- RTSP (na 9 Februar1 2010)
- RTMP
Methodes:
- HTTP POST
- HTTP PUT
- FTP uploading
- HTTP form based upload
- Proxies / Tunneling
- HTTP/2, cookies
- File Transfer Resume
Authenticatie:
- User+password
- Basic
- Plain
- Digest
- CRAM-MD5
- NTLM
- Negotiate
- Kerberos
cURL ondersteunt HTTPS en andere SSL security based protocollen. cURL voert standaard SSL-certificaatverificatie uit wanneer een veilig protocol zoals HTTPS wordt gespecificeerd. Dit werkt als volgt.
1. cURL maakt verbinding maakt met een externe server via een velig protocol.
2. cURL vraagt het certificaat op van de externe server
3. cURL verifieerd de geldigheid van het certificaat en controleert of dit certificaat legitiem en niet ingetrokken is. Wanneer de externe server een SSL certificaat gebruikt welke geen geldige ondertekening heeft of als het een self-signed certificate betreft zal cURL een foutmelding genereren. Om dit te omzeilen kan de gebruiker de flags -k of –insecure toevoegen. In dat geval wordt certificaatverificatie overgeslagen. In dat geval kun je (als je de server vertouwd) het certificaat downloaden en toevoegen aan je eigen “trusted authorities”.
Soms moet ook een eigen SSL certificaat opgegeven worden. Het is fijn dat sommige cURL-pakketten zijn gebundeld met een CA-certificaat. Er zijn verschillende opties om een CA-certificaat te specificeren, zoals –cacert en –capath. De optie –cacert kan gebruikt worden om de locatie van het CA-certificaat te specificeren. Op Windows zal cURL, als er geen CA-certificaat is gespecificeerd zoeken naar een CA-certificaat met de naam “curl-ca-bundle.crt”. cURL zal hiernaar zoeken op de volgende locaties (en in de volgende volgorde):
- Opgegeven certificaat met de –cacert en –capath flags
- Directory van de cURL programmatuur
- Huidige werkmap (command-line)
- Windows-systeemdirectory
- Windows-directory
- Directory’s gespecificeerd in de %PATH%-omgevingsvariabelen
Dat cURL geen “kleine” of “simpele” applicatie is blijkt wel uit de helppagina (die nog wat verder doorloopt dan de screenshot):

Belangrijke cURL Flags
Een aantal belangrijke flags die we later in wat voorbeelden zullen toepassen zijn:
- –help = De man/help pagina van cURL
- -a = Append de output in een target bestand
- –compressed = Vraag een compressed respons op
- -K of –config = Lees de configuratie uit een configuratiebestand
- –connect-to = Geef achter deze flag op met welke host je wilt verbinden
- -d of –data = HTTP POST data
- -q of –disable = cURL uitschakelen
- –dns-ipv4-addr = Specificeer het IP adres om DNS requests te resolven
- -D = Dump de header naar een bestandsnaam
- –fail = Silent fail (genereer geen meldingen bij HTTP errors
- –ftp-account = Geef FTP accountgegevens op
- -G of –get = Verkrijg de POST data van de URL
- -H of –header = Verstuur een custom header naar de webserver
- -k of –insecure = Sta onveilige SSL verbindingen toe
- -4 / –ipv4 /-6 / –ipv6 = Resolve het IPv4 of IPv6 adres
- -L of –location = Redirects volgen
- -o of –output = Schrijf de output naar een bestand i.p.v. naar stdout
- -Z of –parallel = Bestandsoverdrachten paralel i.p.v. een-voor-een uitvoeren
- -# of –progress-bar = Laat tijdens overdracht ene statusbalk zien
- -x of –proxy = Specificeer een proxyserver
- –raw = Verkrijg de ruwe HTTP output (zonder transfer decoding)
- -s of –silent = Draai op de achtergrond
- -T of –upload-file = Upload een lokaal bestand naar een remote destination
- -u of –user = Geef servercredentials op
- -v of –verbose = Verkrijg verbose (volledige) output (voor troubleshooting)
Specials authenticatie flags:
- –anyauth = Laat cURL de authenticatiemethode kiezen
- –cacert = Het certificaatbestand welke gebruikt moet worden om de targetserver te verifiëren
- –capath = De certificaatdirectory welke gebruikt moet worden om de targetserver te verifiëren
- –cert-status = Verifieer het certificaat
- –cert = Het eigen (client) certificaat + eventueel wachtwoord
- –ciphers = Lijst van SSL ciphers om te gebruiken
- –digest = Gebruik digest authenticatie
- –key = Bestandsnaam van de private key
- –ntlm = Gebruik HTTP NTLM authenticatie
- –proto = Specificeer de toegestane en niet-toegestane protocollen
- –ssl = Probeer SSL/TLS te gebruiken
cURL Gebruiken / Voorbeelden
Zoals je ondertussen wel door hebt kan cURL je ontzettend helpen bij allerhande dataopvragen en bestandsoverdrachten. Laten we hiervan eens een paar voorbeelden bekijken.
Het meest standaard commando is een simpele GET waarmee de volledige pagina incl. Header verkregen wordt:
curl https://jarnobaselier.nl |

Je kunt ook je user agent aanpassen. In onderstaande voorbeeld zal de ontvangende server denken dat het verkeer afkomstig is van een Firefox 6.0 browser:
curl -A "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" https://jarnobaselier.nl |
Om alleen de header te ontvangen gebruiken we de –I flag:
curl –I https://jarnobaselier.nl |

Wellicht willen we deze header opslaan. Om zaken op te slaan in een file voegen we de -o flag toe:
curl –I -o jarnoheader.txt https://jarnobaselier.nl |
Mocht je de -O flag gebruiken dan is het niet nodig om zelf een outputname te selecteren. cURL zal dezelfde naam aanhouden als die van het bronbestand. Op deze manier kunnen we ook een download starten waarbij het doelbestand dezelfde naam houd dan het bronbestand:
curl -O https://jarnobaselier.nl/mooifilmpke.mp4 |
Uiteraard kunnen we ook in 1 commando meerdere bestanden downloaden:
curl -O https://jarnobaselier.nl/mooifilmpke.mp4 -O https://jarnobaselier.nl/nogeenmooifilmpke.mp4 |
cURL kan downloads resumen. Mocht een grote download gecancelled worden dan kun je deze resumen met de continue (-C) flag:
curl -C - -O https://jarnobaselier.nl/mooifilmpke.mp4 -O https://jarnobaselier.nl/nogeenmooifilmpke.mp4 |
Om de downloadsnelheid van een bestand te testen gebruiken we de –D (dump header) flag en om geen output te genereren gaan we de output dumpen naar /dev/null (terminal).
curl -D - https://jarnobaselier.nl/mooifilmpke.mp4 -o /dev/null |
De downloadsnelheid beperken tot 1000 Bytes/second doen we als volgt met de –limit-rate flag:
curl --limit-rate 1000B -O https://jarnobaselier.nl/mooifilmpke.mp4 |
Wil je een bestand downloaden met als voorwaarde dat deze gemodificeerd is v.a. een specifiek moment dan kun je de –z optie toevoegen.
curl -z 21-Jan-20 -O https://jarnobaselier.nl/mooifilmpke.mp4 |
We kunnen ook authenticatie toepassen. Zonder verdere toevoeging gebruikt cURL “basic authentication”:
curl -u username:password -O https://jarnobaselier.nl/mooifilmpke.mp4 |
Om een andere authenticatiemethode te gebruiken specificeer je deze. B.v. NTLM:
curl -u username:password -ntlm -O https://jarnobaselier.nl/mooifilmpke.mp4 |
Laten we bovenstaande eens toepassen via FTP:
curl -u ftpuser:ftppassword -O ftp://jarnobaselier.nl/public_html/mooifilmpke.mp4 |
Bovenstaande commando download het gespecificeerde bestand van de FTP server. Als we de bestandsnaam niet specificeren wordt de inhoud van de FTP folder weergegeven:
curl -u ftpuser:ftppassword -O ftp://jarnobaselier.nl/public_html/ |
Om alleen bestanden te zien waarvan de naam begint met een a,b of c kunnen we een range specificeren:
curl -u ftpuser:ftppassword ftp://jarnobaselier.nl/public_html/[a-c]/ |
Met toevoeging van de transfer (T) flag kunnen we bestanden uploaden naar de FTP server:
curl -u ftpuser:ftppassword -T uploadfilmpke.mp4 ftp://jarnobaselier.nl/public_html/mooifilmpke.mp4 |
We kunnen bovenstaande commando uitbreiden door een proxyserver toe te voegen:
curl -x proxysever.mijndomein.nl:8080 -u ftpuser:ftppassword -T uploadfilmpke.mp4 ftp://jarnobaselier.nl/public_html/mooifilmpke.mp4 |
SMTP wordt ook ondersteund, dus e-mailen met cURL is geen probleem:
curl --mail-from blah@jarnobaselier.nl --mail-rcpt blah@ontvanger.nl smtp://mailserver.nl |
Na bovenstaande commando kun je je e-mail typen. Om vervolgens de e-mail te verzenden plaats je op een nieuwe regel een punt (.) en geef je een ENTER. V.a. dat moment wordt je mail verzonden. Deze methode lijkt erg veel op de telnet methode. Bovenstaande kunnen we uiteraard ook geauthenticeerd doen:
curl --mail-from blah@jarnobaselier.nl --mail-rcpt blah@ontvanger.nl smtp://mailserver.nl -u "gebruikersnaam@eigendomein.nl:wachtwoord" |
Als uitgebreider voorbeeld kunnen we mailen over de Microsoft Office365 SMTP server welke TLS gebruikt:
nano test.txt ############ Subject: Mail onderwerp Mail Body ############ curl --connect-timeout 150 -v "smtp://smtp.office365.com:587" -u "blah@jarnobaselier.nl:wachtwoord" --mail-from "blah@jarnobaselier.nl" --mail-rcpt "blah@ontvanger.nl" --ssl -F subject='Hello' -T test.txt |
Wat opvalt in boven bovenstaande commando is dat we de SMTP server een poort meegeven (587 / TLS) en dat we SSL forceren met de “–ssl” flag. Ook geven we de inhoud van de mail mee in het “mail.txt” bestand.
Let op dat het account dat je gebruikt voor bovenstaande commando geen MFA actief heeft. Als MFA wel actief is maak dan een App Wachtwoord aan om e-mail te versturen.
Tot zover de diverse cURL voorbeelden!
Conclusie
cURL is een applicatie die ik zelf pas recentelijk veelvoudig ben gaan gebruiken en hoe vaker ik cURL gebruik des te meer ik de voordelen van deze command-line superbrowser en transfer-agent ga inzien. Er is vrijwel geen toepassing te bedenken waarbij cURL niet kan ondersteunen. Ga zelf eens aan de slag met cURL en ontdek het gemak. Ik hoop dat deze post je in ieder geval een beetje op weg geholpen heeft en dat je snapt hoe cURL werkt. Gebruik deze post gerust als naslagwerk en deel hem op je eigen website of social media kanelen. Een “like” is ook altijd “leuk”! Dankjewel!