BurpSuite - Lisäosien rakentaminen

Muokataan HTTP-pyyntöjä lennosta BurpSuite lisäosalla

Keskitaso
30 min

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
    

Kadotetaan HTTP-otsakkeita

Tehtävässä käytetty sovellus tarkistaa onko HTTP-pyynnöissä HTTP-otsakkeita, jossa on termi 'hakatemia'. Rakenna lisäosa joka poistaa jokaisesta HTTP-pyynnöstä otsakkeet, jossa on kyseinen termi.

Tehtävät

Flag

Löydä lippu (flag) labraympäristöstä ja syötä se alle.

hakatemia pro

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ä.