Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import com.nccgroup.loggerplusplus.logview.processor.LogProcessor;
import com.nccgroup.loggerplusplus.preferences.PreferencesController;
import com.nccgroup.loggerplusplus.reflection.ReflectionController;
import com.nccgroup.loggerplusplus.util.DateFormattedGsonProvider;
import com.nccgroup.loggerplusplus.util.Globals;
import com.nccgroup.loggerplusplus.util.userinterface.LoggerMenu;
import lombok.Getter;
Expand All @@ -39,7 +40,7 @@ public class LoggerPlusPlus implements BurpExtension {
public static LoggingController loggingController;
public static LoggerPlusPlus instance;
public static MontoyaApi montoya;
public static IGsonProvider gsonProvider = new DefaultGsonProvider();
public static IGsonProvider gsonProvider = new DateFormattedGsonProvider();

private Registration menuBarRegistration;
private LogProcessor logProcessor;
Expand Down
80 changes: 60 additions & 20 deletions src/main/java/com/nccgroup/loggerplusplus/imports/LoggerImport.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.nccgroup.loggerplusplus.LoggerPlusPlus;
import com.nccgroup.loggerplusplus.logentry.ImportingLogEntryHttpRequestResponse;
import com.nccgroup.loggerplusplus.logview.processor.EntryImportWorker;
import lombok.extern.log4j.Log4j2;
import org.apache.logging.log4j.util.Base64Util;
import com.google.gson.Gson;
import com.google.gson.JsonElement;

Expand All @@ -43,6 +43,8 @@
@Log4j2
public class LoggerImport {

private static final String COMMENT_IMPORTED_MARKER = "[Imported from JSON]";

public static String getLoadFile() {
JFileChooser chooser = null;
chooser = new JFileChooser();
Expand Down Expand Up @@ -79,9 +81,9 @@ public static ArrayList<String> readFile(String filename) {
return lines;
}

public static ArrayList<HttpRequestResponse> importWStalker() {
public static ArrayList<ImportingLogEntryHttpRequestResponse> importWStalker() {
ArrayList<String> lines;
ArrayList<HttpRequestResponse> requests = new ArrayList<>();
ArrayList<ImportingLogEntryHttpRequestResponse> requests = new ArrayList<>();

String filename = getLoadFile();
if ( filename.length() == 0 ) { // exit if no file selected
Expand All @@ -101,9 +103,10 @@ public static ArrayList<HttpRequestResponse> importWStalker() {
HttpService httpService = HttpService.httpService(url);
HttpRequest httpRequest = HttpRequest.httpRequest(httpService, b64Decoder.decode(v[0], Base64DecodingOptions.URL));
HttpResponse httpResponse = HttpResponse.httpResponse(b64Decoder.decode(v[1], Base64DecodingOptions.URL));
HttpRequestResponse requestResponse = HttpRequestResponse.httpRequestResponse(httpRequest, httpResponse);

requests.add(requestResponse);
requests.add(new ImportingLogEntryHttpRequestResponse(
HttpRequestResponse.httpRequestResponse(httpRequest, httpResponse)
));

} catch (Exception e) {
log.error("LoggerImport-importWStalker: Error Parsing Content");
Expand All @@ -114,13 +117,13 @@ public static ArrayList<HttpRequestResponse> importWStalker() {
return requests;
}

public static ArrayList<HttpRequestResponse> importZAP() {
public static ArrayList<ImportingLogEntryHttpRequestResponse> importZAP() {
ArrayList<String> lines = new ArrayList<String>();
ArrayList<HttpRequestResponse> requests = new ArrayList<HttpRequestResponse>();
ArrayList<ImportingLogEntryHttpRequestResponse> requests = new ArrayList<ImportingLogEntryHttpRequestResponse>();

String filename = getLoadFile();
if ( filename.length() == 0 ) { // exit if no file selected
return new ArrayList<HttpRequestResponse>();
return new ArrayList<ImportingLogEntryHttpRequestResponse>();
}

lines = readFile(filename);
Expand Down Expand Up @@ -155,9 +158,10 @@ public static ArrayList<HttpRequestResponse> importZAP() {
HttpService httpService = HttpService.httpService(url);
HttpRequest httpRequest = HttpRequest.httpRequest(httpService, requestBuffer);
HttpResponse httpResponse = HttpResponse.httpResponse(responseBuffer);
HttpRequestResponse requestResponse = HttpRequestResponse.httpRequestResponse(httpRequest, httpResponse);

requests.add(requestResponse);
requests.add(new ImportingLogEntryHttpRequestResponse(
HttpRequestResponse.httpRequestResponse(httpRequest, httpResponse)
));

// Reset content
isRequest = true;
Expand Down Expand Up @@ -203,8 +207,8 @@ public static ArrayList<HttpRequestResponse> importZAP() {
return requests;
}

public static ArrayList<HttpRequestResponse> importFromExportedJson() {
ArrayList<HttpRequestResponse> requests = new ArrayList<>();
public static ArrayList<ImportingLogEntryHttpRequestResponse> importFromExportedJson() {
ArrayList<ImportingLogEntryHttpRequestResponse> requests = new ArrayList<>();

String filename = getLoadFile();
if ( filename.length() == 0 ) { // exit if no file selected
Expand All @@ -223,17 +227,19 @@ public static ArrayList<HttpRequestResponse> importFromExportedJson() {
Gson gson = LoggerPlusPlus.gsonProvider.getGson();
JsonArray arr = gson.fromJson(reader, JsonElement.class).getAsJsonArray();
Base64Utils b64Decoder = LoggerPlusPlus.montoya.utilities().base64Utils();
JsonObject obj, req, res;
JsonObject obj, req, res, jsonEntry;
HttpService httpService;
HttpRequest httpRequest;
HttpResponse httpResponse;
HttpRequestResponse requestResponse;
HttpRequestResponse requestResponse = null;
String url;
String[] v = new String[2];
ImportingLogEntryHttpRequestResponse logEntry;

Iterator<JsonElement> i = arr.iterator();
while (i.hasNext()) {
obj = i.next().getAsJsonObject();
Iterator<JsonElement> iter = arr.iterator();
StringBuilder comment = new StringBuilder();
while (iter.hasNext()) {
obj = iter.next().getAsJsonObject();
req = obj.getAsJsonObject("Request");
res = obj.getAsJsonObject("Response");

Expand All @@ -246,19 +252,53 @@ public static ArrayList<HttpRequestResponse> importFromExportedJson() {
httpRequest = HttpRequest.httpRequest(httpService, b64Decoder.decode(v[0]));
httpResponse = HttpResponse.httpResponse(b64Decoder.decode(v[1]));
requestResponse = HttpRequestResponse.httpRequestResponse(httpRequest, httpResponse);

requests.add(requestResponse);
} catch (Exception e) {
log.error("LoggerImport-importFromExportedJson: Error Parsing Content", e);
}

logEntry = new ImportingLogEntryHttpRequestResponse(requestResponse);
logEntry.setRequestTime(req.get("Time").getAsString());
logEntry.setResponseTime(res.get("Time").getAsString());

// might not exist
if (req.has("Tool")) {
logEntry.setTool(req.get("Tool").getAsString());
}

if (res.has("RTT")) {
logEntry.setRTT(res.get("RTT").getAsInt());
}

jsonEntry = obj.getAsJsonObject("Entry");
if (jsonEntry.has("ListenInterface")) {
logEntry.setListenInterface(jsonEntry.get("ListenInterface").getAsString());
}

comment.setLength(0); // empty the string
if (req.has("Comment")) {
comment.append(req.get("Comment").getAsString());

// prevent duplicated 'imported' marker
if (comment.indexOf(COMMENT_IMPORTED_MARKER) == -1)
{
comment.insert(0, " ");
comment.insert(0, COMMENT_IMPORTED_MARKER);
}
}
else {
comment.insert(0, COMMENT_IMPORTED_MARKER);
}

logEntry.setComment(comment.toString());

requests.add(logEntry);
}

return requests;
}

//TODO Integrate progress bar with SwingWorkerWithProgressDialog
public static boolean loadImported(ArrayList<HttpRequestResponse> requests, Boolean sendToAutoExporters) {
public static boolean loadImported(ArrayList<ImportingLogEntryHttpRequestResponse> requests, Boolean sendToAutoExporters) {
EntryImportWorker importWorker = LoggerPlusPlus.instance.getLogProcessor().createEntryImportBuilder()
.setOriginatingTool(ToolType.EXTENSIONS)
.setHttpEntries(requests)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.nccgroup.loggerplusplus.logentry;

import burp.api.montoya.core.ToolType;
import burp.api.montoya.http.message.HttpRequestResponse;
import burp.api.montoya.http.message.requests.HttpRequest;
import burp.api.montoya.http.message.responses.HttpResponse;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Getter
@Log4j2
public class ImportingLogEntryHttpRequestResponse {
// example: Nov 15, 2023, 6:30:46 PM
// ...btw wt is this date time format, it is not common at all!
// ...ffs, there is also a '0x202f' (Narrow no-break space) char in the date sometime..
private static final SimpleDateFormat dtFormatter = new SimpleDateFormat("MMM d, y, K:m:s a");
private static final SimpleDateFormat longDtFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

private final HttpRequestResponse httpReqRes;

private Date requestTime = null;

private Date responseTime = null;

@Setter
private Integer RTT = null;

@Setter
private String comment = null;

private ToolType tool = null;

@Setter
private String listenInterface = null;

public ImportingLogEntryHttpRequestResponse(HttpRequestResponse hrr) {
this.httpReqRes = hrr;
}

public HttpRequest request() {
return httpReqRes.request();
}

public HttpResponse response() {
return httpReqRes.response();
}

private Date formattedTimeParser(String dateTimeString) throws ParseException {
if (dateTimeString.indexOf(',') > -1)
{
return dtFormatter.parse(dateTimeString.replace('\u202F', ' '));
}
return longDtFormatter.parse(dateTimeString);
}

public void setRequestTime(String dateTimeString) {
try {
this.requestTime = formattedTimeParser(dateTimeString);
} catch (ParseException e) {
log.error("Failed to parse requestTime: " + dateTimeString);
throw new RuntimeException(e);
}
}

public void setResponseTime(String dateTimeString) {
try {
this.responseTime = formattedTimeParser(dateTimeString);
} catch (ParseException e) {
log.error("Failed to parse responseTime: " + dateTimeString);
throw new RuntimeException(e);
}
}

public void setTool(String toolName) {
try {
this.tool = ToolType.valueOf(toolName.toUpperCase());
} catch (Exception e) {
log.error("Error at setTool: " + toolName);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ public LogEntry(ToolType tool, HttpRequest request, HttpResponse response){
*/
public LogEntry(ToolType tool, HttpRequest request, Date formattedRequestTime) {
this(tool, request);
this.setReqestTime(formattedRequestTime);
this.setRequestTime(formattedRequestTime);
}

public boolean process() {
Expand Down Expand Up @@ -388,7 +388,7 @@ public byte[] getResponseBytes() {
return response.toByteArray().getBytes();
}

public void setReqestTime(Date requestTime) {
public void setRequestTime(Date requestTime) {
this.requestDateTime = requestTime;
this.formattedRequestTime = LogProcessor.LOGGER_DATE_FORMAT.format(this.requestDateTime);
}
Expand Down
Loading