Simovits

DNurl – Chunked transfer encoding i C#

Jag har tidigare skrivit om dnurl vilket är ett enkelt curl-liknande verktyg för att testa webbsidor. Då kallades projektet nurl men bytte namn eftersom det namnkrockade med ett annat verktyg. Verktyget är till för att testa webbsidor och nu har stöd för chunked transfer encoding lagts till. Det har även skett en del refactoring av koden utöver namnbytet. Tanken med DNurl är inte att ersätta curl eller andra liknande verktyg. Jag kommer fortsätta ha behov av curl. Tanken är snarare ett komplement. Eftersom DNurl är en .NET-applikation så kan man ladda in den exekverbara filen som en .NET-assembly och använda den i powershell. Ifall man exempelvis behöver använda powershell för att skripta sidhämtningar så kan därmed DNurl erbjuda full kontroll över http-requests i powershell. För detta har jag bifogat ett exempel nedan.


# This is just a sample of how to use the dnurl .net-assembly for fuzzing-like tasks.
param($strPath = "C:\src\dnurl\nurl\bin\Debug\dnurl.exe")

# Create the nurl-object
$assembly = [Reflection.Assembly]::LoadFile($strPath)
$nurl = $assembly.CreateInstance("JamesUtility.DNurl")

# Example of simple automation for google receiving a bad request.
$nurl.strHost = "www.google.se"
$nurl.bIsSSL = $false
$nurl.bEchoWrite = $true
$nurl.bDebug = $true
$nurl.port = 80
$nurl.strHttpRequest = "GET / HTTP/1.1\r\nHost: www.google.se\r\n\r\n"

$nurl.run()

$strResponseCode = $nurl.getResponseCode()
$htHeaders = $nurl.getServerHeaders()
$htHeaders
$strBody = $nurl.getServerAsciiBody()
$nurl.closeOutputStreams()

write-host "Response from server: $strResponseCode"
write-host "Body: $strBody "

Exemplet laddar dynamiskt in dnurl.exe som en .net-assemly, skapar ett objekt av klassen DNurl och anropar google på port 80. För att demonstrera att objektet från klassen DNurl håller svaret från google så skrivs dessa ut. DNurl är tänkt att hållas väldigt enkelt. Om man kan sätta sig in i koden snabbt och slippa massa beroenden till tredjeparts-program så har man full kontroll över vad som händer då man testar en funktion på en webbsida. Om man exempelvis använder HttpClient-klassen som erbjuds i .net så sker massor av saker bakom kulisserna. Man har inte full kontroll över vad som händer. Det samma gäller andra liknande komponenter såsom curl. Om man utför web-applikations-tester och i synnerhet penetrationstester för webapplikationer så är total kontroll över kommunikationen väldigt viktig. Därför ville jag exempelvis inte använda mig av en tredjeparts-komponent för att koda av chunked transfer encoding eller bara låta det ske magiskt i bakgrunden från HttpClient (speciellt inte som det är superenkelt att implementera). DNurl kommer inte heller innehålla någon superbra felhantering eftersom det är tänkt att användas mer som en template när man utför webbapplikations-tester. Om man håller ned antalet kodrader så tar det kortare tid att läsa igenom. Tanken är som sagt att ge full kontroll över varje byte som skickas till servern, inte att skapa ett specifikt kommando för varje möjlig http-request (då vill man antagligen använda curl istället). Nedan visas DNurls olika kommandoradsalternativ.

--host "host/ip"
--port "port number"
--request "input file"
--out "output file"
--ssl - Use SSL for HTTPS connections
--skipheaders - If headers should be skipped
--skipsent - If sent http-request should be skipped
--skipadjust - If we should NOT try to adjust the content-length
--binary - Do not try to interpret HTTP-headers
--sendtimeout - Send-timeout for client
--receivetimeout - Receive-timeout for client
--replace "replace" "newtext" - Replace a text with another before send
--append - If the output file should be opened for append (not reset)
--tamperconvert "file" - Convert tamper data copied format into proper request
--httprequest "string" - Use httprequest directly from command line
--stdin - read from stdin instead.

Om man ska använda DNurl direkt från kommandoraden så kan man göra det på formen: dnurl.exe –host www.simovits.com –port 80 Länk till projektets git repository: https://github.com/jamesrep/dnurl