AES_Killer_v4.0.java
April 12, 2021 ยท View on GitHub
package burp;
import java.io.PrintWriter; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.Cipher; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec;
/**
-
@author bugzy */ public class BurpExtender implements IBurpExtender, IProxyListener, IHttpListener{
public String ExtensionName = "AES_Killer v4.0";
public IBurpExtenderCallbacks callbacks; public IExtensionHelpers helpers; public PrintWriter stdout; public PrintWriter stderr; public Boolean isDebug = false;
public String _key01 = "
"; // key used to encrypt complete request & response body public String _key02 = " "; // key used to encrypt specific parameters within the request public Cipher cipher; public SecretKey sec_key;
public String[] Hosts = { "https://
:443/", "https:// :443/"}; // encrypted parameters public String[] params = { "username", "password", "account", "amount" };
@Override public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { this.callbacks = callbacks; this.helpers = callbacks.getHelpers(); this.stdout = new PrintWriter(callbacks.getStdout(), true); this.callbacks.setExtensionName(this.ExtensionName);
this.callbacks.registerHttpListener(this); this.callbacks.registerProxyListener(this); this.stdout.println("AES_Killer - v4.0 Installed !!!");}
private void print_output(String _src, String str){ if(! isDebug){ return; } this.stdout.println(_src + " :: " + str); }
private void print_error(String _src, String str){ if(! isDebug){ return; } this.stdout.println(_src + " :: " + str); }
private String do_Decrypt(String _key, String paramString){ try{ String temp_params = paramString; cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); sec_key = new SecretKeySpec(this.helpers.base64Decode(_key), "AES"); cipher.init(2, sec_key); temp_params = new String (cipher.doFinal(this.helpers.base64Decode(temp_params))); return temp_params; }catch(Exception ex){ print_error("do_Decrypt", ex.getMessage()); return paramString; } }
private String do_Encrypt(String _key, String paramString){ try{ String temp_params = paramString; cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); sec_key = new SecretKeySpec(this.helpers.base64Decode(_key), "AES"); cipher.init(1, sec_key); temp_params = new String (this.helpers.base64Encode(cipher.doFinal(temp_params.getBytes()))); return temp_params; }catch(Exception ex){ print_error("do_Encryp", ex.getMessage()); return paramString; } }
private String decrypt_parameters(String _reqBody){ String _str = _reqBody; for(int i=0; i< this.params.length; i++){ int _fi = _str.indexOf(params[i]); if(_fi == -1){ continue; }
_fi = _fi + params[i].length() + 2; int _si = _str.indexOf("</end-del>", _fi); String _enc_param = _str.substring(_fi, _si); if(_enc_param.contains("null")){ continue; } // null value check String _dec_param = do_Decrypt(_key02, _enc_param); _str = _str.substring(0, _fi) + _dec_param + _str.substring(_si, _str.length()); } return _str;}
private String encrypt_parameters(String _reqBody){ String _str = _reqBody; for(int i=0; i< this.params.length; i++){ int _fi = _str.indexOf(params[i]); if(_fi == -1){ continue; }
_fi = _fi + params[i].length() + 2; int _si = _str.indexOf("</<end-del>>", _fi); String _enc_param = _str.substring(_fi, _si); if(_enc_param.contains("null")){ continue; } // null value check String _dec_param = do_Encrypt(_key02, _enc_param); _str = _str.substring(0, _fi) + _dec_param + _str.substring(_si, _str.length()); } return _str;}
@Override public void processProxyMessage(boolean messageIsRequest, IInterceptedProxyMessage message) { if(messageIsRequest){ IHttpRequestResponse messageInfo = message.getMessageInfo(); IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo); String URL = new String(reqInfo.getUrl().toString()); List headers = reqInfo.getHeaders();
if((URL.contains(this.Hosts[0]) || URL.contains(this.Hosts[1])) && reqInfo.getMethod().toLowerCase().contains("post")){ String tmpreq = new String(messageInfo.getRequest()); String messageBody = new String(tmpreq.substring(reqInfo.getBodyOffset())).trim(); String decValue = do_Decrypt(_key01, messageBody); decValue = decrypt_parameters(decValue); headers.add(new String("AES-Killer: v4.0")); byte[] updateMessage = helpers.buildHttpMessage(headers, decValue.getBytes()); messageInfo.setRequest(updateMessage); print_output("PPM", "Decrypted request\n" + new String(updateMessage)); } }else { IHttpRequestResponse messageInfo = message.getMessageInfo(); IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo); IResponseInfo resInfo = helpers.analyzeResponse(messageInfo.getResponse()); String URL = new String(reqInfo.getUrl().toString()); List headers = resInfo.getHeaders();
// if(!headers.contains("AES-Killer: DecryptedResponse")){ // return; // }
if((URL.contains(this.Hosts[0]) || URL.contains(this.Hosts[1])) && reqInfo.getMethod().toLowerCase().contains("post")){
String tmpreq = new String(messageInfo.getResponse());
String messageBody = new String(tmpreq.substring(resInfo.getBodyOffset())).trim();
messageBody = do_Encrypt(_key01, messageBody);
byte[] updateMessage = helpers.buildHttpMessage(headers, messageBody.getBytes());
messageInfo.setResponse(updateMessage);
print_output("PPM","Final Encrypted Response\n" + new String(updateMessage));
}
}
}
@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
if(messageIsRequest){
IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo);
String URL = new String(reqInfo.getUrl().toString());
List headers = reqInfo.getHeaders();
// if(!headers.contains("AES-Killer: v4.0")){ // return; // }
if((URL.contains(this.Hosts[0]) || URL.contains(this.Hosts[1])) && reqInfo.getMethod().toLowerCase().contains("post")){
String tmpreq = new String(messageInfo.getRequest());
String messageBody = new String(tmpreq.substring(reqInfo.getBodyOffset())).trim();
messageBody = encrypt_parameters(messageBody);
messageBody = do_Encrypt(_key01, messageBody);
byte[] updateMessage = helpers.buildHttpMessage(headers, messageBody.getBytes());
messageInfo.setRequest(updateMessage);
print_output("PHTM", "Final Encrypted Request\n" + new String(updateMessage));
}
}
else{
IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo);
IResponseInfo resInfo = helpers.analyzeResponse(messageInfo.getResponse());
String URL = new String(reqInfo.getUrl().toString());
List headers = resInfo.getHeaders();
if((URL.contains(this.Hosts[0]) || URL.contains(this.Hosts[1])) && reqInfo.getMethod().toLowerCase().contains("post")){
String tmpreq = new String(messageInfo.getResponse());
String messageBody = new String(tmpreq.substring(resInfo.getBodyOffset())).trim();
messageBody = do_Decrypt(_key01, messageBody);
headers.add("AES-Killer: DecryptedResponse");
byte[] updateMessage = helpers.buildHttpMessage(headers, messageBody.getBytes());
messageInfo.setResponse(updateMessage);
print_output("PHTM", "Decrypted Response\n" + new String(updateMessage));
}
}
}
}