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.
1
2from burp import IBurpExtender
3from burp import IHttpListener
4
5class BurpExtender(IBurpExtender, IHttpListener):
6 def registerExtenderCallbacks(self, callbacks):
7 self.callbacks = callbacks
8 self.helpers = callbacks.getHelpers()
9 callbacks.setExtensionName("HTTP headers adder")
10 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.
1 def processHttpMessage(self, tool_flag, is_request, message_info):
2 if is_request:
3 return
4 else:
5 returnKyseistä 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*. *
1 if is_request:
2 # jos kyseessa on HTTP pyynto eika vastaus
3 request = message_info.getRequest()
4 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ä.
1if "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).
1body = request[request_info.getBodyOffset():]
2
3new_headers = []
4for header in request_info.getHeaders():
5 new_headers.append(header)
6new_headers.append("Hakatemia-Plugin: Part2")
7
8new_message = self.helpers.buildHttpMessage(new_headers, body)
9message_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ä:
1
2from burp import IBurpExtender
3from burp import IHttpListener
4
5class BurpExtender(IBurpExtender, IHttpListener):
6 def registerExtenderCallbacks(self, callbacks):
7 self.callbacks = callbacks
8 self.helpers = callbacks.getHelpers()
9 callbacks.setExtensionName("HTTP headers adder")
10 callbacks.registerHttpListener(self)
11
12 def processHttpMessage(self, tool_flag, is_request, message_info):
13 if is_request:
14 request = message_info.getRequest()
15 request_info = self.helpers.analyzeRequest(request)
16
17 if "127.0.0.1:5000" in request_info.getHeaders()[1]:
18 body = request[request_info.getBodyOffset():]
19
20 new_headers = []
21 for header in request_info.getHeaders():
22 new_headers.append(header)
23 new_headers.append("Hakatemia-Plugin: Part2")
24
25 new_message = self.helpers.buildHttpMessage(new_headers, body)
26 message_info.setRequest(new_message)
27
28 else:
29 pass
30 return
31
32Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.