BurpSuite - Lisäosien rakentaminen
Muokataan HTTP-pyyntöjä lennosta BurpSuite lisäosalla
Lisäosan rekisteröinti
Tässä moduulissa päästään tekemään jo käytännön temppuja HTTP-pyyntöihin. Rakennetaan lisäosa, jonka ainoa tehtävä on lisätä jokaiseen BurpSuite:n läpi kulkevaan HTTP-pyyntöön uusi otsake. Aloitetaan luomalla uusi tiedosto ja lisäämällä samat pakolliset funktiot kuin edellisessä moduulissa.
from burp import IBurpExtender
from burp import IHttpListener
class BurpExtender(IBurpExtender, IHttpListener):
def registerExtenderCallbacks(self, callbacks):
self.callbacks = callbacks
self.helpers = callbacks.getHelpers()
callbacks.setExtensionName("HTTP headers adder")
callbacks.registerHttpListener(self)
Valitse lisäosalle haluamasi nimi ja muista rekisteröidä lisäosa HTTP-kuuntelijaksi käyttämällä registerHttpListener -funktiota.
HTTP-viestien käsittely
Jatketaan lisäämällä funktio nimeltä processHttpMessage.
def processHttpMessage(self, tool_flag, is_request, message_info):
if is_request:
return
else:
return
Kyseistä funktiota kutsutaan aina kun BurpSuite näkee HTTP-viestin, koska meidän lisäosa on rekisteröity kuuntelijaksi aiemmassa kohdassa. Täältä näet BurpSuite:n dokumentaation tuohon funktioon liittyen.
https://portswigger.net/burp/extender/api/burp/ihttplistener.html
This method is invoked when an HTTP request is about to be issued, and when an HTTP response has been received.
Funktiolle annetaan Burpin toimesta kolme eri parametria (tool_flag, is_request ja message_info.
- tool_flag - parametri antaa tietoa siitä, mikä työkalu tämän pyynnön on suorittanut (Proxy, repeater, intruder, lisäosa, jne)
- is_request - parametri on boolean-arvo, joka kertoo onko kyseessä HTTP-pyyntö vai -vastaus
- message_info - on objekti, jonka kautta pääsemme käsittelemään itse HTTP-viestiä
HTTP-otsakkeen lisääminen
Koska haluamme vain käsitellä HTTP-pyyntöjä emmekä vastauksia, voimme keskittyä pelkästään tilanteisiin, jossa is_request == Tosi.
if is_request:
# jos kyseessa on HTTP pyynto eika vastaus
request = message_info.getRequest()
request_info = self.helpers.analyzeRequest(request)
message_info -objektin kautta voimme kutsua funktiota nimeltä getRequest, joka palauttaa raa'an HTTP-viestin, eli tavujonon (byte array). Syötämme tämän aiemmin viitattuun helpers-luokan alla olevaan analyzeRequest-funktioon. Kyseinen funktio palauttaa request_info -objektin, joka sisältää analysoitua tietoa HTTP-pyyntöön liittyen.
- getRequest -funktio palauttaa raa'an HTTP-pyynnön
- helpers -luokka sisältää paljon erilaisia elämää helpottavia toiminnallisuuksia, kuten tämä analyzeRequest-funktio joka osaa analysoida raakoja HTTP-pyyntöjä meidän puolesta
Näistä löydät tarkempaa tietoa täältä: https://portswigger.net/burp/extender/api/burp/iextensionhelpers.html
Seuraavaksi jatketaan tarkistamalla, että HTTP-pyynnön kohdeosoite on oikea. Tämä saavutetaan käyttämällä getHeaders-funktiota äsken analysoidun HTTP-pyynnön kautta. request_info -luokan muita funktioita voi tutkia täältä.
if "127.0.0.1:5000" in request_info.getHeaders()[1]:
getHeaders -funktio palauttaa listan HTTP-pyynnön otsakkeista. Koska tiedämme, että tässä tapauksessa Host-otsake sijaitsee aina toisena listassa, voimme viitata siihen suoraan (tämä ei ole välttämättä kauhean hyvää koodia, mutta toimii tässä tapauksessa). Tässä tapauksessa kohde on lokaali portti 5000, voi olla eri sinun tapauksessa!
Lopuksi luemme HTTP-viestin kehon, rakennamme uuden listan otsakkeita, lisäämme oman otsakkeen tähän listaan, rakennamme näistä uuden HTTP-viestin (tavujonon) ja asetamme sen aiemman HTTP-pyynnön tilalle (muista, että tässä kohtaa käsittelemme yhä lennossa olevaa HTTP-viestiä, joka ei ole vielä lähtenyt laitteelta sivustolle).
body = request[request_info.getBodyOffset():]
new_headers = []
for header in request_info.getHeaders():
new_headers.append(header)
new_headers.append("Hakatemia-Plugin: Part2")
new_message = self.helpers.buildHttpMessage(new_headers, body)
message_info.setRequest(new_message)
getBodyOffset -funktio palauttaa sen indexin, missä kohtaa alkaa HTTP-viestin keho. Tässä lisää tietoa, jos ei vielä tässä vaiheessa aukea. Käytännössä otamme raa'asta HTTP-pyynnöstä ne tavut, siitä alkaen missä alkaa HTTP-keho, viestin loppuun asti. Jos pyynnössä ei ole kehoa, tämä tulee olemaan None-arvo. Seuraavaksi teemme uuden listan, johon lisäämme aiemmasta HTTP-pyynnöstä otsakkeet ja lopuksi lisäämme tähän listaan oman otsakkeen.
Näiden jälkeen rakennamme kyseistä kehosta ja HTTP-otsakkeiden listasta uuden HTTP-viestin käyttämällä helpers-luokan buildHttpMessage -funktiota. Asetamme sitten tämän uuden, muokatun viestin setRequest -funktiolla aiemman viestin tilalle. Lopullinen koodi näyttää jotakuinkin tältä:
from burp import IBurpExtender
from burp import IHttpListener
class BurpExtender(IBurpExtender, IHttpListener):
def registerExtenderCallbacks(self, callbacks):
self.callbacks = callbacks
self.helpers = callbacks.getHelpers()
callbacks.setExtensionName("HTTP headers adder")
callbacks.registerHttpListener(self)
def processHttpMessage(self, tool_flag, is_request, message_info):
if is_request:
request = message_info.getRequest()
request_info = self.helpers.analyzeRequest(request)
if "127.0.0.1:5000" in request_info.getHeaders()[1]:
body = request[request_info.getBodyOffset():]
new_headers = []
for header in request_info.getHeaders():
new_headers.append(header)
new_headers.append("Hakatemia-Plugin: Part2")
new_message = self.helpers.buildHttpMessage(new_headers, body)
message_info.setRequest(new_message)
else:
pass
return
Valmis ryhtymään eettiseksi hakkeriksi?
Aloita jo tänään.
Hakatemian jäsenenä saat rajoittamattoman pääsyn Hakatemian moduuleihin, harjoituksiin ja työkaluihin, sekä pääset discord-kanavalle jossa voit pyytää apua sekä ohjaajilta että muilta Hakatemian jäseniltä.