Skip to content

Latest commit

 

History

History
229 lines (163 loc) · 12.6 KB

File metadata and controls

229 lines (163 loc) · 12.6 KB

十、编写 BurpSuite 扩展

其他 HTTP 代理提供了良好的性能,但是,BurpSuite 由于其扩展能力,无疑是最好的工具。正如我们在前面的章节中所看到的,扩展添加了很多函数,因此它们可以集中于一个特定的问题。

创建扩展的能力为用户自动化测试活动提供了很大的帮助。BurpSuite 支持 Java、Python 和 Ruby 来开发扩展,因此它可以灵活地为开发人员提供方便的访问。

在本章中,我们将回顾一个新扩展的开发过程,并提供一些技巧和技巧,以便在安装 BurpSuite 时使用。

我们将在本章中介绍以下主题:

  • 建立发展环境
  • 编写 BurpSuite 扩展
  • 执行扩展

建立发展环境

要开发您自己的扩展,您可以使用开源的集成开发环境IDEs),例如 NetBeans 或 Eclipse。为自己选择最舒适的 IDE。在这种情况下,我们将使用 NetBeans:

  1. 转到 NetBeans 网站(https://netbeans.org/ 下载最新版本。不需要安装,因为 NetBeans 是用 Java 开发的,并作为 JAR 文件分发;只需解压缩下载文件并单击 netbeans bin 图标,如以下屏幕截图所示:

  1. 在开始使用 NetBeans 之前,请转到https://www.oracle.com/technetwork/java/javase/downloads/ 和。。。

编写 BurpSuite 扩展

任何 BurpSuite 扩展的基本类结构如下所示,由 PortSwigger 提供:

package burp; 

public class BurpExtender implements IBurpExtender{ 
    public void registerExtenderCallbacks (IBurpExtenderCallbacks callbacks){ 
        // your extension code here 
    } 
} 

这基本上就是用于创建所有 BurpSuite 扩展的类定义。现在,让我们开始修改代码。

BurpSuite 的 API

请记住,所有扩展都是以 PortSwigger 提供的结构(之前显示)为代码基础开发的,扩展的入口点如下:

void registerExtenderCallbacks (IBurpExtenderCallbacks callbacks); 

如果要调用自己的扩展名,则需要使用以下方法:

callbacks.setExtensionName (Your extension name); 

下面的代码显示字节实用程序。它们可用于管理字符串、搜索子字符串、编码、解码等:

int indexOf (byte[] data, byte[] pattern, boolean caseSensitive, int from, int to); String bytesToString(byte[] data); byte[] stringToBytes(String data); String urlDecode(String data); String urlEncode(String ...

使用扩展修改用户代理

现在,让我们使用 PortSwigger 提供的基本结构分析一个扩展的代码,以修改 HTTP 请求中的用户代理。

创建用户代理(字符串)

我们需要修改用户代理的第一件事是使用替代用户代理。在代码的下一部分中,我们创建一个默认用户代理列表,用于扩展;扩展名还提供了使用带有字符串的 XML 文件的选项,如下所示:

 public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { extCallbacks = callbacks; extHelpers = extCallbacks.getHelpers(); extCallbacks.setExtensionName("Burp UserAgent"); extCallbacks.registerSessionHandlingAction(this); printOut = new PrintWriter(extCallbacks.getStdout(), true); printHeader(); /* Create the default User-Agent */ bUserAgents.add("Current Browser"); bUserAgentNames.put("Current Browser", "Current Browser"); /* ...

创建 GUI

PortSwigger 简化了将扩展与 Burp Suite 集成的方法,创建了一个新的 Burp Suite 选项卡,元素只需要几行代码。

首先,我们需要在 Burp Suite 的窗口中为我们的扩展定义一个新选项卡,如下所示:

bUAPanel = new JPanel(null); 
JLabel bUALabel = new JLabel(); 
final JComboBox bUACbx = new JComboBox(bUserAgents.toArray()); 
JButton bUASetHeaderBtn = new JButton("Set Configuration"); 

我们还需要创建一个框,用于放置所有选项,以及每个选项的标签,如下所示:

bUALabel.setText("User-Agent:"); 
bUALabel.setBounds(16, 15, 75, 20); 
bUACbx.setBounds(146, 12, 310, 26); 
bUASetHeaderBtn.setBounds(306, 50, 150, 20); 

bUASetHeaderBtn.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    newUA = bUserAgentNames.get(bUACbx.getItemAt(bUACbx.getSelectedIndex())); 
    printOut.println("User-Agent header set to: " + newUA + "\n"); 
    } 
}); 

此外,我们需要补充的是,当应用或扩展打开时,没有没有没有默认值的应用或扩展提供给用户,如下所示:

bUALabel.setText("User-Agent:"); 
bUALabel.setBounds(16, 15, 75, 20); 
bUACbx.setBounds(146, 12, 310, 26); 
bUASetHeaderBtn.setBounds(306, 50, 150, 20); 

bUASetHeaderBtn.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    newUA = bUserAgentNames.get(bUACbx.getItemAt(bUACbx.getSelectedIndex())); 
    printOut.println("User-Agent header set to: " + newUA + "\n"); 
    } 
}); 

手术

前面的代码块显示了所有扩展内容和图形界面,但以下几行显示了扩展本身的操作:

首先,我们设置初始变量和组件,如下所示:

 @Override public String getTabCaption() { return "Burp UserAgent"; } @Override public Component getUiComponent() { return bUAPanel; } @Override public String getActionName(){ return "Burp UserAgent"; } @Override public void performAction(IHttpRequestResponse currentRequest, IHttpRequestResponse[] macroItems) { IRequestInfo requestInfo = extHelpers.analyzeRequest(currentRequest); List<String> headers = requestInfo.getHeaders(); String reqRaw = new String(currentRequest.getRequest()); String reqBody = ...

发现认证弱点

在服务、端口和技术检测之后,下一步是导航并了解应用的流程。这里,我们将重点讨论认证部分。

  1. 因此,打开 Burp Suite,配置完 web 浏览器后,进入https://www.mercadolibre.com.mx/

  2. 正如我们前面提到的,Mercado Libre 是一家大型在线零售商,它是卖家和买家之间的中间方,提供套餐服务和金融服务。

  3. 在登录部分输入有效凭据,以了解其工作原理。

  4. 此处提供了有关认证流程的简历:

    • 用户输入电子邮件地址或用户名和密码
    • 用户已登录
    • 如果用户关闭会话,下次进入登录部分时,他们只需输入密码,因为用户名已被占用
  5. 让我们检查登录请求:

POST /jms/mlm/lgz/msl/login/H4sIAAAAAAAEAzWNQQ7DIAwE_-JzFO4c-xHkEidBxQUZR6SK8veaSj3ueHd8QS5begf9VAIPdNacYlKYoGbUtQiHtNiBs6GWlP6RRwUFmZSkgb-GaKPlQTYaKpWDrIOH7mHNpRv6vTK2FQu7am3eud77zCQRl5LTU2iOhWc-HdwTrNg0qGB8gR---wvSIukMrwAAAA/enter-pass HTTP/1.1
    Host: www.mercadolibre.com
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Referer: https://www.mercadolibre.com/jms/mlm/lgz/login?platform_id=ml&go=https%3A%2F%2Fwww.mercadolibre.com.mx%2F&loginType=explicit
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 655
    Connection: close
    Cookie: msl_tx=1UqiRoqpEUxsLE3lBOswwkkNK9jF03Mi; _ml_ci=923720559.1550729012; orguseridp=21657778; _d2id=9db3c122-55e2-4c10-b17c-b06211ac246f-n; ftid=8MoAWQIdUk07TQENB2UnuCGnB5WY5qMo-1550733044507; dsid=e71d14ce-5128-453c-b586-60e5212fa4cf-1550733049231
    Upgrade-Insecure-Requests: 1

    user_id=vendetta%40gmail.com&password=H3r3154p4555w0rd&action=complete&dps=armor.bdecc76bc2e60160f1d8464959d69f4d2d9119c3f039ee75cb69bd697920e46f90877723d71324ebedade124738cd189e161d2b655c7fa985521cc6e4c2ccdc75231619b1a24f5e526cee284f62d303f.86588a3c22fdc3e5adde058557e1028e&rbms=1UqiRoqpEUxsLE3l&gctkn=03AOLTBLQTrF3tOZ-Md6XA6e3MFfVpMq2U2eZ1MOnZMtRddlltoxecbHaOtRdLrSPRUXTVGmJQ3nRRhvIcZa_4fY1KhgJ4vN2xg5DaG5ZeXjWuC-KIg59R0WDaRU9cyX7Nz1yaQOgVfvCGqf-buiapfJ5cVN3uureFwrxgegqBZwHAsHQBwOxSQ9hXZlU0V6ZHpWV7PwH_1N65MlH4HhvjGOgaBPPG5XJ69Nsa1eErb1KZG5s5ByeMbOeCgX6uTJzglJYzpxUmygRJpiIvN7ypFLdgnKNC7UuemvkGZwcOgbDQgmjdx5vifkJmlmNIsT2tEoXJw2wWJlBfi0cBkReEX61RoA4C91heOQ&kstrs=  

让我们再来看看对该登录请求的响应:

    HTTP/1.1 302 Found
    Content-Type: text/html; charset=utf-8
    Content-Length: 328
    Connection: close
    Date: Thu, 21 Feb 2019 07:13:56 GMT
    Server: Tengine
    Cache-Control: private, max-age=0, no-store
    Location: https://auth.mercadolibre.com.mx/session/replicator/1550733236355-bqp0ov4guqf0rkcp9qjp34r63e61r6r6?go=https%3A%2F%2Fwww.mercadolibre.com.mx%2F
    Set-Cookie: ssid=ghy-022103-1lPFbjVoxrDURTxzC3azejgqjE9O3a-__-21657778-__-1645341236209--RRR_0-RRR_0; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT; HttpOnly; Secure
    Set-Cookie: orgid=CS-022103-03c45ab2ac839ae3d7083c377cdce53010e242e00d3b5fd587459dcdb9c93fa8-21657778; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
    Set-Cookie: orghash=022103-MLMw1s3mS30KNKIoHNpkHJpGxvOlzu__RRR_0__RRR_0-21657778; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT; HttpOnly
    Set-Cookie: orgapi=CS-022103-69fb38cb3696712af34d6ddd57dc20cfb93a9a77a8d4d2490c82c20d7b7ff6ebc6b411d78e3f5f633a6e653efdd84859895e27e3d79c1da956c6649264d08370-21657778; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
    Set-Cookie: orguserid=0Z07t79hhh7; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
    Set-Cookie: orguseridp=21657778; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
    Set-Cookie: orgnickp=AUGUSTO_VENDETTA; Max-Age=94607999; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Sun, 20 Feb 2022 07:13:55 GMT
    Set-Cookie: uuid=0; Max-Age=0; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Thu, 21 Feb 2019 07:13:56 GMT
    Set-Cookie: sid=0; Max-Age=0; Domain=.mercadolibre.com; Path=/jms/mlm/; Expires=Thu, 21 Feb 2019 07:13:56 GMT; HttpOnly
    Vary: Accept, Accept-Encoding
    X-Content-Type-Options: nosniff
    X-DNS-Prefetch-Control: on
    X-Download-Options: noopen
    X-XSS-Protection: 1; mode=block
    X-Request-Id: 445dd144-db49-404e-83e9-7e081487326c
    X-D2id: 9db3c122-55e2-4c10-b17c-b06211ac246f
    Content-Security-Policy: frame-ancestors 'self'
    X-Frame-Options: SAMEORIGIN
    X-Cache: Miss from cloudfront
    Via: 1.1 ae22d429a3be7ab1d9089446772f27a7.cloudfront.net (CloudFront)
    X-Amz-Cf-Id: RyU3aIakL8jke184nvlIt6Ghu0-MfmJLlVYXBw9BxivAF3F9yH9_Mg==

    <p>Found. Redirecting to <a href="https://auth.mercadolibre.com.mx/session/replicator/1550733236355-bqp0ov4guqf0rkcp9qjp34r63e61r6r6?go=https%3A%2F%2Fwww.mercadolibre.com.mx%2F">https://auth.mercadolibre.com.mx/session/replicator/1550733236355-bqp0ov4guqf0rkcp9qjp34r63e61r6r6?go=https%3A%2F%2Fwww.mercadolibre.com.mx%2F</a></p>

使用前面的代码块,我们可以检测以下内容:

  • 应用正在使用负载平衡器或 DDoS 防护服务。我们可以在响应中看到请求是如何重定向到确定的服务器的。
  • 应用使用令牌跟踪请求;可能无法利用 CSRF 等漏洞进行攻击。
  • 应用具有 XSS 保护,避免了信息提取。例如,使用 JavaScript 提取用户的会话。
  • 该应用包括一个 SAMEORIGIN 策略。在这本书中,我们没有涉及到这一点。此控件用于避免执行来自外部实体的操作。
  • 用户凭据在请求主体中发送。
  • 应用使用 XML 格式。这意味着应用正在使用内部 API。

现在,我们有一些关于认证流的信息。在实际评估中,您需要映射整个应用和完整的应用流。

现在,我们将回顾与认证相关的问题。

执行扩展

编写完扩展后,启动 Burp Suite 应用,然后单击 Run | Run Project。启动应用时,将运行我们的扩展。

对于此扩展,您需要创建会话处理并在“用户代理”选项卡中配置选项,如以下屏幕截图所示:

正如您在以下屏幕截图中所看到的,应用运行时没有出现错误:

如果你想。。。

总结

在本章中,我们分析了如何创建自己的扩展以及 PortSwigger 提供的不同功能和方法,这不仅帮助我们创建了新的扩展,还向我们展示了如何修改需要适应我们需求的现有扩展。

下一章将介绍一个真实的案例,说明一家大型在线零售商是如何因其认证实现被破坏而受到损害的。