Lisäosan kehittäminen Montoya API:lla: automaattinen session hallinta osa 2
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.
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:
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.
Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.