HAKATEMIA
09BurpSuite lisäosien rakentaminen uudella tavalla (Montoya API)

Lisäosan kehittäminen Montoya API:lla: automaattinen session hallinta osa 2

Keskitaso30MIN

Lisäosan kirjoittaminen Javalla ja Montoya API:lla

Tässä moduulissa jumpataan aiemmin Pythonilla tehty kirjautumisen automatisointi Montoya API:n Java toteutukselle. Käytämme tässä Portswiggerin malliesimerkkiä, jonka avasimme edellisessä moduulissa IDEA-ympäristössämme. Löydät myös samalla tavalla dokumentaatiota täältä.

Muokkaamme tätä seuraavalla tavalla, eli *HttpHandlerExample.java *-tiedosto näyttää seuraavanlaiselta.

JAVA
1package example.httphandler;
2
3import burp.api.montoya.BurpExtension;
4import burp.api.montoya.MontoyaApi;
5
6public class HttpHandlerExample implements BurpExtension {
7    @Override
8    public void initialize(MontoyaApi api) {
9        api.extension().setName("HTTP Handler Example");
10
11        //Register our http handler with Burp.
12        api.http().registerHttpHandler(new MyHttpHandler(api));
13    }
14}

Tässä asetamme käytännössä vain oman nimen tälle lisäosalle *setName *-funktiolla. Kaikki monimutkaisempi toimintalogiikka tapahtuu *MyHttpHandler.java *-tiedostossa:

JAVA
1package example.httphandler;
2
3import burp.api.montoya.MontoyaApi;
4import burp.api.montoya.http.handler.*;
5import burp.api.montoya.http.message.requests.HttpRequest;
6import burp.api.montoya.http.HttpService;
7import burp.api.montoya.http.message.HttpRequestResponse;
8import burp.api.montoya.logging.Logging;
9import burp.api.montoya.http.message.HttpHeader;
10
11import java.util.List;
12
13import static burp.api.montoya.http.handler.RequestToBeSentAction.continueWith;
14import static burp.api.montoya.http.handler.ResponseReceivedAction.continueWith;
15
16class MyHttpHandler implements HttpHandler {
17    private static Logging logging = null;
18    private static String session_token;
19    private static MontoyaApi api;
20
21    public MyHttpHandler(MontoyaApi api) {
22        this.logging = api.logging();
23        this.api = api;
24        this.session_token = null;
25    }
26
27    @Override
28    public RequestToBeSentAction handleHttpRequestToBeSent(HttpRequestToBeSent requestToBeSent) {
29        if (isTarget(requestToBeSent)) {
30            if (session_token != null) {
31                logging.logToOutput("Setting new cookies to request");
32                HttpRequest modRequest = requestToBeSent.withUpdatedHeader("Cookie","session="+session_token);
33                return continueWith(modRequest);
34            }
35        }
36        return continueWith(requestToBeSent);
37    }
38
39    @Override
40    public ResponseReceivedAction handleHttpResponseReceived(HttpResponseReceived responseReceived) {
41
42        if (needsLogin(responseReceived)) {
43            logging.logToOutput("Updating cookies");
44            makeAuth();
45
46            HttpRequest orig_req = responseReceived.initiatingRequest().withUpdatedHeader("Cookie","session="+session_token);
47            HttpService httpService = HttpService.httpService("127.0.0.1",5000,false);
48            HttpRequestResponse resp = api.http().sendRequest(orig_req);
49            return continueWith(resp.response());
50        }
51        return continueWith(responseReceived);
52    }
53
54    private static boolean isTarget(HttpRequestToBeSent httpRequestToBeSent) {
55        return httpRequestToBeSent.url().contains("127.0.0.1:5000");
56    }
57
58    private static boolean needsLogin(HttpResponseReceived httpResponseReceived) {
59        if (httpResponseReceived.statusCode() == (short)302) {
60            List<HttpHeader> headers = httpResponseReceived.headers();
61            for (HttpHeader header : headers)
62            {
63                if (header.toString().equalsIgnoreCase("Location: /")) {
64                    return true;
65                }
66            }
67        }
68        return false;
69    }
70
71    private static void makeAuth() {
72        HttpService httpService = HttpService.httpService("127.0.0.1",5000,false);
73        HttpRequest req = HttpRequest.httpRequest(httpService, "POST /login HTTP/1.1\r\nHost: 127.0.0.1:5000\r\nContent-Length: 17\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\nusername=username");
74        HttpRequestResponse resp = api.http().sendRequest(req);
75        session_token = resp.response().cookies().getFirst().value();
76    }
77}

Toimintalogiikka on täysin sama kuin Python versiossa. Ainoita huomioitavia eroja ovat, että tässä esimerkissä ei käytetä enää *processHttpMessage *-funktiota, vaan kahta erillistä *handleHttpRequestToBeSent- *ja *handleHttpResponseReceived -*funktiota. Toinen vastaa pyyntöjen käsittelystä ja toinen vastausten. Meillä on myös kolme omaa funktiota:

  • *isTarget - *joka käytännössä vain tarkistaa sisältääkö URL-osoite meidän kohteen tunnusmerkit.
  • *needsLogin *- joka tarkistaa, että onko kirjautumiseväste vanhentunut HTTP-vastauksen pohjalta. Iteroi otsakkeet ja tarkistaa statuskoodin.
  • *makeAuth *- joka suorittaa uudelleenkirjautumisen ohjelmallisesti ja päivittää yhteisen *session_token-*arvon.
1 / 2
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.