buby 1.3.3-java → 1.5.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +28 -14
- data/Rakefile +96 -6
- data/VERSION.yml +5 -0
- data/bin/buby +2 -0
- data/buby.gemspec +102 -17
- data/{java/src → ext/buby/burp}/BurpExtender.java +189 -29
- data/ext/burp_interfaces/burp/IBurpExtender.java +31 -0
- data/ext/burp_interfaces/burp/IBurpExtenderCallbacks.java +785 -0
- data/ext/burp_interfaces/burp/IContextMenuFactory.java +38 -0
- data/ext/burp_interfaces/burp/IContextMenuInvocation.java +156 -0
- data/ext/burp_interfaces/burp/ICookie.java +53 -0
- data/ext/burp_interfaces/burp/IExtensionHelpers.java +352 -0
- data/ext/burp_interfaces/burp/IExtensionStateListener.java +27 -0
- data/ext/burp_interfaces/burp/IHttpListener.java +37 -0
- data/ext/burp_interfaces/burp/IHttpRequestResponse.java +102 -0
- data/ext/burp_interfaces/burp/IHttpRequestResponsePersisted.java +26 -0
- data/ext/burp_interfaces/burp/IHttpRequestResponseWithMarkers.java +44 -0
- data/ext/burp_interfaces/burp/IHttpService.java +39 -0
- data/ext/burp_interfaces/burp/IInterceptedProxyMessage.java +116 -0
- data/ext/burp_interfaces/burp/IIntruderAttack.java +31 -0
- data/ext/burp_interfaces/burp/IIntruderPayloadGenerator.java +50 -0
- data/ext/burp_interfaces/burp/IIntruderPayloadGeneratorFactory.java +40 -0
- data/ext/burp_interfaces/burp/IIntruderPayloadProcessor.java +45 -0
- data/{java/src → ext/burp_interfaces}/burp/IMenuItemHandler.java +36 -40
- data/ext/burp_interfaces/burp/IMessageEditor.java +64 -0
- data/ext/burp_interfaces/burp/IMessageEditorController.java +49 -0
- data/ext/burp_interfaces/burp/IMessageEditorTab.java +102 -0
- data/ext/burp_interfaces/burp/IMessageEditorTabFactory.java +38 -0
- data/ext/burp_interfaces/burp/IParameter.java +104 -0
- data/ext/burp_interfaces/burp/IProxyListener.java +37 -0
- data/ext/burp_interfaces/burp/IRequestInfo.java +95 -0
- data/ext/burp_interfaces/burp/IResponseInfo.java +54 -0
- data/ext/burp_interfaces/burp/IScanIssue.java +120 -0
- data/ext/burp_interfaces/burp/IScanQueueItem.java +80 -0
- data/ext/burp_interfaces/burp/IScannerCheck.java +89 -0
- data/ext/burp_interfaces/burp/IScannerInsertionPoint.java +156 -0
- data/ext/burp_interfaces/burp/IScannerInsertionPointProvider.java +38 -0
- data/ext/burp_interfaces/burp/IScannerListener.java +30 -0
- data/ext/burp_interfaces/burp/IScopeChangeListener.java +25 -0
- data/ext/burp_interfaces/burp/ISessionHandlingAction.java +51 -0
- data/ext/burp_interfaces/burp/ITab.java +38 -0
- data/ext/burp_interfaces/burp/ITempFile.java +33 -0
- data/ext/burp_interfaces/burp/ITextEditor.java +90 -0
- data/lib/buby/burp_extender/console_frame.rb +33 -0
- data/lib/buby/burp_extender/console_pane.rb +26 -0
- data/lib/buby/burp_extender/console_tab.rb +15 -0
- data/lib/buby/burp_extender/context_menu.rb +29 -0
- data/lib/buby/burp_extender/context_menu_factory.rb +17 -0
- data/lib/buby/burp_extender/context_menu_item.rb +13 -0
- data/lib/buby/burp_extender/jcheck_box_menu_item.rb +12 -0
- data/lib/buby/burp_extender/jmenu.rb +11 -0
- data/lib/buby/burp_extender/jmenu_item.rb +12 -0
- data/lib/buby/burp_extender/menu.rb +11 -0
- data/lib/buby/burp_extender/menu_item.rb +12 -0
- data/lib/buby/burp_extender.rb +339 -0
- data/lib/buby/context_menu_factory.rb +35 -0
- data/lib/buby/cookie.rb +37 -0
- data/lib/buby/extender.rb +156 -0
- data/lib/buby/http_listener.rb +29 -0
- data/lib/buby/{extends → implants}/buby_array_wrapper.rb +0 -0
- data/lib/buby/implants/context_menu_invocation.rb +113 -0
- data/lib/buby/implants/cookie.rb +47 -0
- data/lib/buby/implants/extension_helpers.rb +286 -0
- data/lib/buby/{extends → implants}/http_request_response.rb +8 -1
- data/lib/buby/implants/intercepted_proxy_message.rb +53 -0
- data/lib/buby/implants/intruder_attack.rb +42 -0
- data/lib/buby/implants/jruby.rb +64 -0
- data/lib/buby/implants/message_editor.rb +70 -0
- data/lib/buby/implants/message_editor_controller.rb +60 -0
- data/lib/buby/implants/parameter.rb +84 -0
- data/lib/buby/implants/request_info.rb +47 -0
- data/lib/buby/implants/response_info.rb +44 -0
- data/lib/buby/{extends → implants}/scan_issue.rb +1 -2
- data/lib/buby/implants/scan_queue_item.rb +53 -0
- data/lib/buby/implants/scanner_insertion_point.rb +92 -0
- data/lib/buby/implants/temp_file.rb +43 -0
- data/lib/buby/implants/text_editor.rb +63 -0
- data/lib/buby/implants.rb +28 -0
- data/lib/buby/intruder_payload_generator.rb +60 -0
- data/lib/buby/intruder_payload_generator_factory.rb +32 -0
- data/lib/buby/intruder_payload_processor.rb +38 -0
- data/lib/buby/message_editor_controller.rb +41 -0
- data/lib/buby/message_editor_tab.rb +98 -0
- data/lib/buby/message_editor_tab_factory.rb +28 -0
- data/lib/buby/parameter/base.rb +40 -0
- data/lib/buby/parameter/body.rb +7 -0
- data/lib/buby/parameter/cookie.rb +7 -0
- data/lib/buby/parameter/url.rb +7 -0
- data/lib/buby/parameter.rb +15 -0
- data/lib/buby/proxy_listener.rb +26 -0
- data/lib/buby/scan_issue.rb +112 -0
- data/lib/buby/scanner_check.rb +84 -0
- data/lib/buby/scanner_insertion_point.rb +118 -0
- data/lib/buby/scanner_insertion_point_provider.rb +27 -0
- data/lib/buby/scanner_listener.rb +22 -0
- data/lib/buby/scope_change_listener.rb +19 -0
- data/lib/buby/session_handling_action.rb +43 -0
- data/lib/buby/tab.rb +37 -0
- data/lib/buby/version.rb +9 -0
- data/lib/buby.rb +892 -101
- metadata +118 -22
- data/VERSION +0 -1
- data/java/buby.jar +0 -0
- data/java/src/burp/IBurpExtender.java +0 -180
- data/java/src/burp/IBurpExtenderCallbacks.java +0 -373
- data/java/src/burp/IHttpRequestResponse.java +0 -156
- data/java/src/burp/IScanIssue.java +0 -106
- data/java/src/burp/IScanQueueItem.java +0 -76
- data/lib/buby/extends.rb +0 -4
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
class Buby
|
|
2
|
+
# This interface is used to define an insertion point for use by active
|
|
3
|
+
# Scanner checks. Extensions can obtain instances of this interface by
|
|
4
|
+
# registering an +IScannerCheck+, or can create instances for use by Burp's
|
|
5
|
+
# own scan checks by registering an +IScannerInsertionPointProvider+.
|
|
6
|
+
#
|
|
7
|
+
# @api
|
|
8
|
+
# @abstract Subclass for specific insertion point flavors used.
|
|
9
|
+
class ScannerInsertionPoint
|
|
10
|
+
include Java::Burb::IScannerInsertionPoint
|
|
11
|
+
|
|
12
|
+
INS_PARAM_URL = 0x00
|
|
13
|
+
INS_PARAM_BODY = 0x01
|
|
14
|
+
INS_PARAM_COOKIE = 0x02
|
|
15
|
+
INS_PARAM_XML = 0x03
|
|
16
|
+
INS_PARAM_XML_ATTR = 0x04
|
|
17
|
+
INS_PARAM_MULTIPART_ATTR = 0x05
|
|
18
|
+
INS_PARAM_JSON = 0x06
|
|
19
|
+
INS_PARAM_AMF = 0x07
|
|
20
|
+
INS_HEADER = 0x20
|
|
21
|
+
INS_URL_REST = 0x21
|
|
22
|
+
INS_PARAM_NAME_URL = 0x22
|
|
23
|
+
INS_PARAM_NAME_BODY = 0x23
|
|
24
|
+
INS_USER_PROVIDED = 0x40
|
|
25
|
+
INS_EXTENSION_PROVIDED = 0x41
|
|
26
|
+
INS_UNKNOWN = 0x7f
|
|
27
|
+
|
|
28
|
+
# @overload initialize(name = nil, type = INS_UNKNOWN, base_value = nil, offsets = nil)
|
|
29
|
+
# @param [String] name
|
|
30
|
+
# @param [Fixnum] type
|
|
31
|
+
# @param [String] base_value
|
|
32
|
+
# @param [Array<Fixnum>] offsets
|
|
33
|
+
# @overload initialize(hash)
|
|
34
|
+
# @param [Hash] hash Hash containing instance information
|
|
35
|
+
#
|
|
36
|
+
# @abstract Subclass and override for the specific insertion point flavors
|
|
37
|
+
# used by the implementation.
|
|
38
|
+
def initialize(*args)
|
|
39
|
+
if args.first.kind_of? Hash
|
|
40
|
+
hsh = args.first
|
|
41
|
+
@type = hsh[:type] || hsh['type']
|
|
42
|
+
else
|
|
43
|
+
@name, @type, @base_vlaue, @offsets = args
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# This method returns the name of the insertion point.
|
|
48
|
+
#
|
|
49
|
+
# @return [String] The name of the insertion point (for example, a
|
|
50
|
+
# description of a particular request parameter).
|
|
51
|
+
#
|
|
52
|
+
def getInsertionPointName
|
|
53
|
+
@name || self.class.name
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# This method returns the base value for this insertion point.
|
|
57
|
+
#
|
|
58
|
+
# @return [String] the base value that appears in this insertion point in
|
|
59
|
+
# the base request being scanned, or +nil+ if there is no value in the
|
|
60
|
+
# base request that corresponds to this insertion point.
|
|
61
|
+
#
|
|
62
|
+
# @abstract
|
|
63
|
+
def getBaseValue
|
|
64
|
+
@base_value
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# This method is used to build a request with the specified payload placed
|
|
68
|
+
# into the insertion point. Any necessary adjustments to the
|
|
69
|
+
# Content-Length header will be made by the Scanner itself when the
|
|
70
|
+
# request is issued, and there is no requirement for the insertion point
|
|
71
|
+
# to do this.
|
|
72
|
+
#
|
|
73
|
+
# @note Burp's built-in scan checks do not apply any payload encoding
|
|
74
|
+
# (such as URL-encoding) when dealing with an extension-provided
|
|
75
|
+
# insertion point. Custom insertion points are responsible for
|
|
76
|
+
# performing any data encoding that is necessary given the nature and
|
|
77
|
+
# location of the insertion point.
|
|
78
|
+
#
|
|
79
|
+
# @param [Array<byte>] payload The payload that should be placed into the
|
|
80
|
+
# insertion point.
|
|
81
|
+
# @return [Array<byte>] The resulting request.
|
|
82
|
+
#
|
|
83
|
+
# @todo figure out wrapping these calls (method_missing magic?)
|
|
84
|
+
# @abstract
|
|
85
|
+
# @api called by burp
|
|
86
|
+
def buildRequest(payload)
|
|
87
|
+
# ...
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# This method is used to determine the offsets of the payload value within
|
|
91
|
+
# the request, when it is placed into the insertion point. Scan checks may
|
|
92
|
+
# invoke this method when reporting issues, so as to highlight the
|
|
93
|
+
# relevant part of the request within the UI.
|
|
94
|
+
#
|
|
95
|
+
# @param [Array<byte>] payload The payload that should be placed into the
|
|
96
|
+
# insertion point.
|
|
97
|
+
# @return [Array<Fixnum>] An int[2] array containing the start and end
|
|
98
|
+
# offsets of the payload within the request, or +nil+ if this is not
|
|
99
|
+
# applicable (for example, where the insertion point places a payload
|
|
100
|
+
# into a serialized data structure, the raw payload may not literally
|
|
101
|
+
# appear anywhere within the resulting request).
|
|
102
|
+
#
|
|
103
|
+
# @todo figure out wrapping these calls (method_missing magic?)
|
|
104
|
+
# @abstract
|
|
105
|
+
def getPayloadOffsets(payload)
|
|
106
|
+
@offsets
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# This method returns the type of the insertion point.
|
|
110
|
+
#
|
|
111
|
+
# @return [Fixnum] The type of the insertion point. Available types are
|
|
112
|
+
# defined in {Buby::ScannerInsertionPoint}.
|
|
113
|
+
#
|
|
114
|
+
def getInsertionPointType
|
|
115
|
+
@type || INS_UNKNOWN
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class Buby
|
|
2
|
+
|
|
3
|
+
# Extensions can implement this interface and then call
|
|
4
|
+
# {Buby#registerScannerInsertionPointProvider} to register a factory for
|
|
5
|
+
# custom Scanner insertion points.
|
|
6
|
+
#
|
|
7
|
+
class ScannerInsertionPointProvider
|
|
8
|
+
include Java::Burp::IScannerInsertionPointProvider
|
|
9
|
+
|
|
10
|
+
# When a request is actively scanned, the Scanner will invoke this method,
|
|
11
|
+
# and the provider should provide a list of custom insertion points that
|
|
12
|
+
# will be used in the scan.
|
|
13
|
+
# @note these insertion points are used in addition to those that are
|
|
14
|
+
# derived from Burp Scanner's configuration, and those provided by any
|
|
15
|
+
# other Burp extensions.
|
|
16
|
+
#
|
|
17
|
+
# @param [IHttpRequestResponse] baseRequestResponse The base request that will be actively scanned.
|
|
18
|
+
# @return [Array<IScannerInsertionPoint>, nil] A list of
|
|
19
|
+
# +IScannerInsertionPoint+ objects that should be used in thescanning, or
|
|
20
|
+
# +nil+ if no custom insertion points are applicable for this request.
|
|
21
|
+
#
|
|
22
|
+
def getInsertionPoints(baseRequestResponse)
|
|
23
|
+
pp [:got_getInsertionPoints, baseRequestResponse] if $DEBUG
|
|
24
|
+
__getInsertionPoints(baseRequestResponse).tap{|x|Buby::HttpRequestResponseHelper.implant(x)}
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class Buby
|
|
2
|
+
# Extensions can implement this interface and then call
|
|
3
|
+
# {Buby#registerScannerListener} to register a Scanner listener. The listener
|
|
4
|
+
# will be notified of new issues that are reported by the Scanner tool.
|
|
5
|
+
# Extensions can perform custom analysis or logging of Scanner issues by
|
|
6
|
+
# registering a Scanner listener.
|
|
7
|
+
#
|
|
8
|
+
class ScannerListener
|
|
9
|
+
include Java::Burp::IScannerListener
|
|
10
|
+
# This method is invoked when a new issue is added to Burp Scanner's
|
|
11
|
+
# results.
|
|
12
|
+
#
|
|
13
|
+
# @param [IScanIssue] issue An object that the extension can query to obtain
|
|
14
|
+
# details about the new issue.
|
|
15
|
+
#
|
|
16
|
+
# @abstract
|
|
17
|
+
def newScanIssue(issue)
|
|
18
|
+
pp [:got_newScanIssue, issue] if $DEBUG
|
|
19
|
+
Buby::ScanIssueHelper.implant issue
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class Buby
|
|
2
|
+
# Extensions can implement this interface and then call
|
|
3
|
+
# {Buby#registerScopeChangeListener} to register a scope change listener. The
|
|
4
|
+
# listener will be notified whenever a change occurs to Burp's suite-wide
|
|
5
|
+
# target scope.
|
|
6
|
+
#
|
|
7
|
+
# @todo improve listener classes with 1.9 instance_exec goodness next version
|
|
8
|
+
class ScopeChangeListener
|
|
9
|
+
include Java::Burp::IScopeChangeListener
|
|
10
|
+
|
|
11
|
+
# This method is invoked whenever a change occurs to Burp's suite-wide
|
|
12
|
+
# target scope.
|
|
13
|
+
#
|
|
14
|
+
# @abstract
|
|
15
|
+
def scopeChanged
|
|
16
|
+
pp [:got_scopeChanged] if $DEBUG
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
class Buby
|
|
2
|
+
# Extensions can implement this interface and then call
|
|
3
|
+
# {Buby#registerSessionHandlingAction} to register a custom session handling
|
|
4
|
+
# action. Each registered action will be available within the session handling
|
|
5
|
+
# rule UI for the user to select as a rule action. Users can choose to invoke
|
|
6
|
+
# an action directly in its own right, or following execution of a macro.
|
|
7
|
+
#
|
|
8
|
+
class SessionHandlingAction
|
|
9
|
+
include Java::Burp::ISessionHandlingAction
|
|
10
|
+
# This method is used by Burp to obtain the name of the session handling
|
|
11
|
+
# action. This will be displayed as an option within the session handling
|
|
12
|
+
# rule editor when the user selects to execute an extension-provided action.
|
|
13
|
+
#
|
|
14
|
+
# @return [String] The name of the action.
|
|
15
|
+
#
|
|
16
|
+
def getActionName
|
|
17
|
+
pp [:got_getActionName] if $DEBUG
|
|
18
|
+
self.class.name
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# This method is invoked when the session handling action should be
|
|
22
|
+
# executed. This may happen as an action in its own right, or as a
|
|
23
|
+
# sub-action following execution of a macro.
|
|
24
|
+
#
|
|
25
|
+
# @param [IHttpRequestResponse] currentRequest The base request that is
|
|
26
|
+
# currently being processed. The action can query this object to obtain
|
|
27
|
+
# details about the base request. It can issue additional requests of its
|
|
28
|
+
# own if necessary, and can use the setter methods on this object to
|
|
29
|
+
# update the base request.
|
|
30
|
+
# @param [Array<IHttpRequestResponse>] macroItems If the action is invoked
|
|
31
|
+
# following execution of a macro, this parameter contains the result of
|
|
32
|
+
# executing the macro. Otherwise, it is +nil+. Actions can use the details
|
|
33
|
+
# of the macro items to perform custom analysis of the macro to derive
|
|
34
|
+
# values of non-standard session handling tokens, etc.
|
|
35
|
+
# @return [void]
|
|
36
|
+
#
|
|
37
|
+
# @abstract
|
|
38
|
+
def performAction(currentRequest, macroItems)
|
|
39
|
+
pp [:got_performAction, currentRequest, macroItems] if $DEBUG
|
|
40
|
+
Buby::HttpRequestResponseHelper.implant(currentRequest)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
data/lib/buby/tab.rb
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
class Buby
|
|
2
|
+
# This interface is used to provide Burp with details of a custom tab that
|
|
3
|
+
# will be added to Burp's UI, using a method such as {Buby#addSuiteTab}.
|
|
4
|
+
#
|
|
5
|
+
# @abstract
|
|
6
|
+
class Tab
|
|
7
|
+
include Java::Burp::ITab
|
|
8
|
+
attr_accessor :caption, :component
|
|
9
|
+
|
|
10
|
+
def initialize(caption = nil, component = nil)
|
|
11
|
+
@caption = caption || self.class.name
|
|
12
|
+
@component = component
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Burp uses this method to obtain the caption that should appear on the
|
|
16
|
+
# custom tab when it is displayed.
|
|
17
|
+
#
|
|
18
|
+
# @return [String] The caption that should appear on the custom tab when it
|
|
19
|
+
# is displayed.
|
|
20
|
+
#
|
|
21
|
+
def getTabCaption
|
|
22
|
+
pp [:got_getTabCaption] if $DEBUG
|
|
23
|
+
@caption.to_s
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Burp uses this method to obtain the component that should be used as the
|
|
27
|
+
# contents of the custom tab when it is displayed.
|
|
28
|
+
#
|
|
29
|
+
# @return [java.awt.Component] The component that should be used as the
|
|
30
|
+
# contents of the custom tab when it is displayed.
|
|
31
|
+
#
|
|
32
|
+
def getUiComponent
|
|
33
|
+
pp [:got_getUiComponent] if $DEBUG
|
|
34
|
+
@component
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
data/lib/buby/version.rb
ADDED
data/lib/buby.rb
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
include Java
|
|
2
|
-
|
|
3
1
|
require 'pp'
|
|
4
|
-
require
|
|
5
|
-
require 'buby/
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
require 'uri'
|
|
3
|
+
require 'buby/implants'
|
|
4
|
+
|
|
5
|
+
# load the Burp extender interfaces if they're not already accessible
|
|
6
|
+
begin
|
|
7
|
+
Java::Burp::IBurpExtender
|
|
8
|
+
rescue NameError
|
|
9
|
+
require 'burp_interfaces.jar'
|
|
10
|
+
end
|
|
8
11
|
|
|
9
12
|
# Buby is a mash-up of the commercial security testing web proxy PortSwigger
|
|
10
13
|
# Burp Suite(tm) allowing you to add scripting to Burp. Burp is driven from
|
|
@@ -15,9 +18,10 @@ include_class 'BurpExtender'
|
|
|
15
18
|
# java implementation:
|
|
16
19
|
# * evt_extender_init
|
|
17
20
|
# * evt_proxy_message
|
|
18
|
-
# * evt_command_line_args
|
|
21
|
+
# * evt_command_line_args (removed in 1.5.01)
|
|
19
22
|
# * evt_register_callbacks
|
|
20
|
-
# * evt_application_closing
|
|
23
|
+
# * evt_application_closing (deprecated)
|
|
24
|
+
# * evt_extension_unloaded
|
|
21
25
|
#
|
|
22
26
|
# Buby also supports the newer event handlers available in Burp 1.2.09 and up:
|
|
23
27
|
# * evt_http_message
|
|
@@ -79,21 +83,48 @@ include_class 'BurpExtender'
|
|
|
79
83
|
# to type and say out-loud. Mike Tracy gets full credit as official
|
|
80
84
|
# Buby-namer.
|
|
81
85
|
#
|
|
86
|
+
# @todo move more to Java side
|
|
82
87
|
class Buby
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
autoload :ContextMenuFactory, 'buby/context_menu_factory'
|
|
89
|
+
autoload :Cookie, 'buby/cookie'
|
|
90
|
+
autoload :HttpListener, 'buby/http_listener'
|
|
91
|
+
autoload :IntruderPayloadGenerator, 'buby/intruder_payload_generator'
|
|
92
|
+
autoload :IntruderPayloadGeneratorFactory, 'buby/intruder_payload_generator_factory'
|
|
93
|
+
autoload :IntruderPayloadProcessor, 'buby/intruder_payload_processor'
|
|
94
|
+
autoload :MessageEditorController, 'buby/message_editor_controller'
|
|
95
|
+
autoload :MessageEditorTab, 'buby/message_editor_tab'
|
|
96
|
+
autoload :MessageEditorTabFactory, 'buby/message_editor_tab_factory'
|
|
97
|
+
autoload :Parameter, 'buby/parameter'
|
|
98
|
+
autoload :ProxyListener, 'buby/proxy_listener'
|
|
99
|
+
autoload :ScanIssue, 'buby/scan_issue'
|
|
100
|
+
autoload :ScannerCheck, 'buby/scanner_check'
|
|
101
|
+
autoload :ScannerInsertionPoint, 'buby/scanner_insertion_point'
|
|
102
|
+
autoload :ScannerInsertionPointProvider, 'buby/scanner_insertion_point_provider'
|
|
103
|
+
autoload :ScannerListener, 'buby/scanner_listener'
|
|
104
|
+
autoload :ScopeChangeListener, 'buby/scope_change_listener'
|
|
105
|
+
autoload :SessionHandlingAction, 'buby/session_handling_action'
|
|
106
|
+
autoload :Tab, 'buby/tab'
|
|
107
|
+
autoload :Version, 'buby/version'
|
|
108
|
+
|
|
109
|
+
# @deprecated moving to proper version module
|
|
110
|
+
VERSION = Buby::Version::STRING
|
|
111
|
+
|
|
112
|
+
# latest tested version of burp
|
|
113
|
+
COMPAT_VERSION = '1.5.05'
|
|
88
114
|
|
|
89
115
|
# :stopdoc:
|
|
116
|
+
# @deprecated to be removed next version
|
|
117
|
+
# @api private
|
|
90
118
|
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
|
119
|
+
|
|
120
|
+
# @deprecated to be removed next version
|
|
121
|
+
# @api private
|
|
91
122
|
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
|
92
123
|
# :startdoc:
|
|
93
124
|
|
|
94
125
|
def initialize(other=nil)
|
|
95
126
|
if other
|
|
96
|
-
raise "
|
|
127
|
+
raise TypeError, "argument must be another kind of Buby, got #{other.class}" unless other.is_a? Buby
|
|
97
128
|
@burp_extender = other.burp_extender
|
|
98
129
|
@burp_callbacks = other.burp_callbacks
|
|
99
130
|
end
|
|
@@ -101,8 +132,9 @@ class Buby
|
|
|
101
132
|
|
|
102
133
|
# Makes this handler the active Ruby handler object for the BurpExtender
|
|
103
134
|
# Java runtime. (there can be only one!)
|
|
104
|
-
|
|
105
|
-
|
|
135
|
+
# @param extender Buby's BurpExtender interface
|
|
136
|
+
def activate!(extender)
|
|
137
|
+
extender.handler = self
|
|
106
138
|
end
|
|
107
139
|
|
|
108
140
|
# Returns the internal reference to the BurpExtender instance. This
|
|
@@ -121,20 +153,72 @@ class Buby
|
|
|
121
153
|
@burp_callbacks or raise "Burp callbacks have not been set"
|
|
122
154
|
end
|
|
123
155
|
|
|
124
|
-
#
|
|
125
|
-
# vulnerability scan.
|
|
126
|
-
#
|
|
127
|
-
#
|
|
128
|
-
#
|
|
129
|
-
#
|
|
130
|
-
#
|
|
131
|
-
#
|
|
132
|
-
#
|
|
133
|
-
#
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
156
|
+
# This method can be used to send an HTTP request to the Burp Scanner tool
|
|
157
|
+
# to perform an active vulnerability scan. If the request is not within the
|
|
158
|
+
# current active scanning scope, the user will be asked if they wish to
|
|
159
|
+
# proceed with the scan.
|
|
160
|
+
#
|
|
161
|
+
# @overload doActiveScan(host, port, useHttps, request, insertionPointOffsets = nil)
|
|
162
|
+
# @param [String] host The hostname of the remote HTTP server.
|
|
163
|
+
# @param [Fixnum] port The port of the remote HTTP server.
|
|
164
|
+
# @param [Boolean] useHttps Flags whether the protocol is HTTPS or HTTP.
|
|
165
|
+
# @param [String, Array<byte>] request The full HTTP request.
|
|
166
|
+
# @param [Array<Array<Fixnum>>] insertionPointOffsets A list of index pairs
|
|
167
|
+
# representing the positions of the insertion points that should be
|
|
168
|
+
# scanned. Each item in the list must be an +int\[2]+ array containing the
|
|
169
|
+
# start and end offsets for the insertion point.
|
|
170
|
+
# @overload doActiveScan(request, insertionPointOffsets = nil)
|
|
171
|
+
# @param [IHttpRequestResponse] request Request object containing details
|
|
172
|
+
# about the request to scan.
|
|
173
|
+
# @param [Array<Array<Fixnum>>] insertionPointOffsets A list of index pairs
|
|
174
|
+
# representing the positions of the insertion points that should be
|
|
175
|
+
# scanned. Each item in the list must be an +int\[2]+ array containing the
|
|
176
|
+
# start and end offsets for the insertion point.
|
|
177
|
+
# @overload doActiveScan(url, insertionPointOffsets = nil)
|
|
178
|
+
# @param [String, URI, java.net.URL] url Build a +GET+ request and scan url.
|
|
179
|
+
# @param [Array<Array<Fixnum>>] insertionPointOffsets A list of index pairs
|
|
180
|
+
# representing the positions of the insertion points that should be
|
|
181
|
+
# scanned. Each item in the list must be an +int\[2]+ array containing the
|
|
182
|
+
# start and end offsets for the insertion point.
|
|
183
|
+
# @return [IScanQueueItem] The resulting scan queue item.
|
|
184
|
+
#
|
|
185
|
+
def doActiveScan(*args)
|
|
186
|
+
host, port, https, req, ip_off = args
|
|
187
|
+
case args.size
|
|
188
|
+
when 1,2
|
|
189
|
+
req = args.first
|
|
190
|
+
ip_off = args[1]
|
|
191
|
+
if req.kind_of? Java::Burp::IHttpRequestResponse
|
|
192
|
+
serv = req.getHttpService
|
|
193
|
+
https = serv.getProtocol == "https"
|
|
194
|
+
host = serv.getHost
|
|
195
|
+
port = serv.getPort
|
|
196
|
+
req = req.request
|
|
197
|
+
else
|
|
198
|
+
url = (req.kind_of?(URI) || req.kind_of?(Java::JavaNet::URL)) ? req : Java::JavaNet::URL.new(req.to_s)
|
|
199
|
+
req = getHelpers.buildHttpRequest req
|
|
200
|
+
host = url.host
|
|
201
|
+
port = url.port
|
|
202
|
+
if url.scheme.downcase == "https"
|
|
203
|
+
https = true
|
|
204
|
+
port = 443 if port == -1
|
|
205
|
+
else
|
|
206
|
+
https = false
|
|
207
|
+
port = 80 if port == -1
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
when 4,5
|
|
211
|
+
host, port, https, req, ip_off = args
|
|
212
|
+
else
|
|
213
|
+
raise ArgumentError
|
|
214
|
+
end
|
|
215
|
+
req = req.to_java_bytes if req.respond_to? :to_java_bytes
|
|
216
|
+
scanq = if getBurpVersion
|
|
217
|
+
_check_cb.doActiveScan(host, port, https, req, ip_off)
|
|
218
|
+
else
|
|
219
|
+
_check_cb.doActiveScan(host, port, https, req)
|
|
220
|
+
end
|
|
221
|
+
Buby::Implants::ScanQueueItem.implant scanq
|
|
138
222
|
end
|
|
139
223
|
alias do_active_scan doActiveScan
|
|
140
224
|
alias active_scan doActiveScan
|
|
@@ -157,7 +241,7 @@ class Buby
|
|
|
157
241
|
# Exclude the specified URL from the Suite-wide scope.
|
|
158
242
|
# * url = The URL to exclude from the Suite-wide scope.
|
|
159
243
|
def excludeFromScope(url)
|
|
160
|
-
url =
|
|
244
|
+
url = Java::JavaNet::URL.new(url) if url.is_a? String
|
|
161
245
|
_check_cb.excludeFromScope(url)
|
|
162
246
|
end
|
|
163
247
|
alias exclude_from_scope excludeFromScope
|
|
@@ -166,7 +250,7 @@ class Buby
|
|
|
166
250
|
# Include the specified URL in the Suite-wide scope.
|
|
167
251
|
# * url = The URL to exclude in the Suite-wide scope.
|
|
168
252
|
def includeInScope(url)
|
|
169
|
-
url =
|
|
253
|
+
url = Java::JavaNet::URL.new(url) if url.is_a? String
|
|
170
254
|
_check_cb.includeInScope(url)
|
|
171
255
|
end
|
|
172
256
|
alias include_in_scope includeInScope
|
|
@@ -177,7 +261,7 @@ class Buby
|
|
|
177
261
|
#
|
|
178
262
|
# Returns: true / false
|
|
179
263
|
def isInScope(url)
|
|
180
|
-
url =
|
|
264
|
+
url = Java::JavaNet::URL.new(url) if url.is_a? String
|
|
181
265
|
_check_cb.isInScope(url)
|
|
182
266
|
end
|
|
183
267
|
alias is_in_scope isInScope
|
|
@@ -197,10 +281,25 @@ class Buby
|
|
|
197
281
|
# * https = Flags whether the protocol is HTTPS or HTTP.
|
|
198
282
|
# * req = The full HTTP request. (String or Java bytes[])
|
|
199
283
|
#
|
|
200
|
-
#
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
284
|
+
# also may be called with new IHttpService as an argument
|
|
285
|
+
# * service = IHttpService object with host, port, etc.
|
|
286
|
+
# * request = request string
|
|
287
|
+
# @return The full response retrieved from the remote server.
|
|
288
|
+
#
|
|
289
|
+
def makeHttpRequest(*args)
|
|
290
|
+
ret = case args.size
|
|
291
|
+
when 2
|
|
292
|
+
service, req = args
|
|
293
|
+
req = req.to_java_bytes if req.is_a? String
|
|
294
|
+
_check_and_callback(:makeHttpRequst, service, req)
|
|
295
|
+
when 4
|
|
296
|
+
host, port, https, req = args
|
|
297
|
+
req = req.to_java_bytes if req.is_a? String
|
|
298
|
+
_check_cb.makeHttpRequest(host, port, https, req)
|
|
299
|
+
else
|
|
300
|
+
raise ArgumentError
|
|
301
|
+
end
|
|
302
|
+
String.from_java_bytes(ret)
|
|
204
303
|
end
|
|
205
304
|
alias make_http_request makeHttpRequest
|
|
206
305
|
alias make_request makeHttpRequest
|
|
@@ -242,7 +341,7 @@ class Buby
|
|
|
242
341
|
# Send a seed URL to the Burp Spider tool.
|
|
243
342
|
# * url = The new seed URL to begin spidering from.
|
|
244
343
|
def sendToSpider(url)
|
|
245
|
-
url =
|
|
344
|
+
url = Java::JavaNet::URL.new(url) if url.is_a? String
|
|
246
345
|
_check_cb.sendToSpider(url)
|
|
247
346
|
end
|
|
248
347
|
alias send_to_spider sendToSpider
|
|
@@ -254,17 +353,18 @@ class Buby
|
|
|
254
353
|
#
|
|
255
354
|
# * meth = string or symbol name of method
|
|
256
355
|
# * args = variable length array of arguments to pass to meth
|
|
257
|
-
def _check_and_callback(meth, *args)
|
|
356
|
+
def _check_and_callback(meth, *args, &block)
|
|
258
357
|
cb = _check_cb
|
|
259
358
|
unless cb.respond_to?(meth)
|
|
260
359
|
raise "#{meth} is not available in your version of Burp"
|
|
261
360
|
end
|
|
262
|
-
cb.__send__ meth, *args
|
|
361
|
+
cb.__send__ meth, *args, &block
|
|
263
362
|
end
|
|
264
363
|
|
|
265
364
|
|
|
266
365
|
# Returns a Java array of IHttpRequestResponse objects pulled directly from
|
|
267
366
|
# the Burp proxy history.
|
|
367
|
+
# @todo Bring IHttpRequestResponse helper up to date
|
|
268
368
|
def getProxyHistory
|
|
269
369
|
HttpRequestResponseList.new(_check_and_callback(:getProxyHistory))
|
|
270
370
|
end
|
|
@@ -275,6 +375,7 @@ class Buby
|
|
|
275
375
|
# Returns a Java array of IHttpRequestResponse objects pulled directly from
|
|
276
376
|
# the Burp site map for all urls matching the specified literal prefix.
|
|
277
377
|
# The prefix can be nil to return all objects.
|
|
378
|
+
# @todo Bring IHttpRequestResponse helper up to date
|
|
278
379
|
def getSiteMap(urlprefix=nil)
|
|
279
380
|
HttpRequestResponseList.new(_check_and_callback(:getSiteMap, urlprefix))
|
|
280
381
|
end
|
|
@@ -300,7 +401,7 @@ class Buby
|
|
|
300
401
|
#
|
|
301
402
|
# * filename = path and filename of the file to restore from
|
|
302
403
|
def restoreState(filename)
|
|
303
|
-
_check_and_callback(:restoreState,
|
|
404
|
+
_check_and_callback(:restoreState, Java::JavaIo::File.new(filename))
|
|
304
405
|
end
|
|
305
406
|
alias restore_state restoreState
|
|
306
407
|
|
|
@@ -311,7 +412,7 @@ class Buby
|
|
|
311
412
|
#
|
|
312
413
|
# * filename = path and filename of the file to save to
|
|
313
414
|
def saveState(filename)
|
|
314
|
-
_check_and_callback(:saveState,
|
|
415
|
+
_check_and_callback(:saveState, Java::JavaIo::File.new(filename))
|
|
315
416
|
end
|
|
316
417
|
alias save_state saveState
|
|
317
418
|
|
|
@@ -320,12 +421,20 @@ class Buby
|
|
|
320
421
|
# containing parameters as they are structured in the 'Parameters' tab in the
|
|
321
422
|
# Burp request UI.
|
|
322
423
|
#
|
|
323
|
-
# IMPORTANT: This method is only available with Burp 1.2.09 and
|
|
424
|
+
# IMPORTANT: This method is only available with Burp 1.2.09+ and deprecated in 1.5.01
|
|
324
425
|
#
|
|
325
|
-
#
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
426
|
+
# This method parses the specified request and returns details of each
|
|
427
|
+
# request parameter.
|
|
428
|
+
#
|
|
429
|
+
# @param request The request to be parsed.
|
|
430
|
+
# @return An array of:
|
|
431
|
+
# <code>String[] { name, value, type }</code> containing details of the
|
|
432
|
+
# parameters contained within the request.
|
|
433
|
+
# @deprecated Use +IExtensionHelpers.analyzeRequest()+ instead.
|
|
434
|
+
#
|
|
435
|
+
def getParameters(request)
|
|
436
|
+
request = request.to_java_bytes if request.is_a? String
|
|
437
|
+
_check_and_callback(:getParameters, request)
|
|
329
438
|
end
|
|
330
439
|
alias parameters getParameters
|
|
331
440
|
alias get_parameters getParameters
|
|
@@ -335,12 +444,20 @@ class Buby
|
|
|
335
444
|
# array containing the headers as they are structured in the 'Headers' tab
|
|
336
445
|
# in the Burp request/response viewer UI.
|
|
337
446
|
#
|
|
338
|
-
# IMPORTANT: This method is only available with Burp 1.2.09 and
|
|
447
|
+
# IMPORTANT: This method is only available with Burp 1.2.09+ and is deprecated in 1.5.01
|
|
448
|
+
#
|
|
449
|
+
# This method parses the specified request and returns details of each HTTP
|
|
450
|
+
# header.
|
|
451
|
+
#
|
|
452
|
+
# @param message The request to be parsed.
|
|
453
|
+
# @return An array of HTTP headers.
|
|
454
|
+
# @deprecated Use
|
|
455
|
+
# <code>IExtensionHelpers.analyzeRequest()</code> or
|
|
456
|
+
# <code>IExtensionHelpers.analyzeResponse()</code> instead.
|
|
339
457
|
#
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
_check_and_callback(:getHeaders, msg)
|
|
458
|
+
def getHeaders(message)
|
|
459
|
+
message = message.to_java_bytes if message.is_a? String
|
|
460
|
+
_check_and_callback(:getHeaders, message)
|
|
344
461
|
end
|
|
345
462
|
alias headers getHeaders
|
|
346
463
|
alias get_headers getHeaders
|
|
@@ -353,18 +470,25 @@ class Buby
|
|
|
353
470
|
alias exit_suite exitSuite
|
|
354
471
|
alias close exitSuite
|
|
355
472
|
|
|
356
|
-
# This method can be used to register a new menu item which will appear
|
|
357
|
-
#
|
|
358
|
-
#
|
|
359
|
-
#
|
|
473
|
+
# This method can be used to register a new menu item which will appear on
|
|
474
|
+
# the various context menus that are used throughout Burp Suite to handle
|
|
475
|
+
# user-driven actions.
|
|
476
|
+
#
|
|
360
477
|
# @param menuItemCaption The caption to be displayed on the menu item.
|
|
361
|
-
# @param menuItemHandler The handler to be invoked when the user clicks
|
|
362
|
-
#
|
|
363
|
-
#
|
|
364
|
-
#
|
|
365
|
-
|
|
366
|
-
|
|
478
|
+
# @param menuItemHandler The handler to be invoked when the user clicks on
|
|
479
|
+
# the menu item.
|
|
480
|
+
# @deprecated Use {#registerContextMenuFactory} instead.
|
|
481
|
+
#
|
|
482
|
+
# This method is only available with Burp 1.3.07+ and is deprecated in 1.5.01.
|
|
483
|
+
#
|
|
484
|
+
def registerMenuItem(menuItemCaption, menuItemHandler = nil, &block)
|
|
485
|
+
ret = if block_given?
|
|
486
|
+
_check_and_callback(:registerMenuItem, menuItemCaption, &block)
|
|
487
|
+
else
|
|
488
|
+
_check_and_callback(:registerMenuItem, menuItemCaption, menuItemHandler)
|
|
489
|
+
end
|
|
367
490
|
issueAlert("Handler #{menuItemHandler} registered for \"#{menuItemCaption}\"")
|
|
491
|
+
ret
|
|
368
492
|
end
|
|
369
493
|
alias register_menu_item registerMenuItem
|
|
370
494
|
|
|
@@ -407,8 +531,8 @@ class Buby
|
|
|
407
531
|
# configuration.
|
|
408
532
|
#
|
|
409
533
|
# This method is only available with Burp 1.3.09+
|
|
410
|
-
def loadConfig(
|
|
411
|
-
_check_and_callback(:loadConfig,
|
|
534
|
+
def loadConfig(config)
|
|
535
|
+
_check_and_callback(:loadConfig, config)
|
|
412
536
|
end
|
|
413
537
|
alias load_config loadConfig
|
|
414
538
|
alias config= loadConfig
|
|
@@ -437,8 +561,498 @@ class Buby
|
|
|
437
561
|
end
|
|
438
562
|
end
|
|
439
563
|
alias burp_version getBurpVersion
|
|
564
|
+
alias get_burp_version getBurpVersion
|
|
565
|
+
|
|
566
|
+
# This method is used to set the display name for the current extension,
|
|
567
|
+
# which will be displayed within the user interface for the Extender tool.
|
|
568
|
+
#
|
|
569
|
+
# @param [String] name The extension name.
|
|
570
|
+
# @return [void]
|
|
571
|
+
#
|
|
572
|
+
def setExtensionName(name)
|
|
573
|
+
_check_and_callback(:setExtensionName, name)
|
|
574
|
+
end
|
|
575
|
+
alias extension_name= setExtensionName
|
|
576
|
+
alias set_extension_name setExtensionName
|
|
577
|
+
|
|
578
|
+
# This method is used to obtain an
|
|
579
|
+
# <code>IExtensionHelpers</code> object, which can be used by the extension
|
|
580
|
+
# to perform numerous useful tasks.
|
|
581
|
+
#
|
|
582
|
+
# @return An object containing numerous helper methods, for tasks such as
|
|
583
|
+
# building and analyzing HTTP requests.
|
|
584
|
+
#
|
|
585
|
+
def getHelpers
|
|
586
|
+
@helpers ||= Buby::Implants::ExtensionHelpers.implant(_check_and_callback(:getHelpers))
|
|
587
|
+
end
|
|
588
|
+
alias helpers getHelpers
|
|
589
|
+
alias get_helpers getHelpers
|
|
590
|
+
|
|
591
|
+
# This method is used to obtain the current extension's standard output
|
|
592
|
+
# stream. Extensions should write all output to this stream, allowing the
|
|
593
|
+
# Burp user to configure how that output is handled from within the UI.
|
|
594
|
+
#
|
|
595
|
+
# @return [OutputStream] The extension's standard output stream.
|
|
596
|
+
#
|
|
597
|
+
# @todo double check
|
|
598
|
+
def getStdout
|
|
599
|
+
@stdout ||= _check_and_callback(:getStdout)
|
|
600
|
+
end
|
|
601
|
+
alias stdout getStdout
|
|
602
|
+
alias get_stdout getStdout
|
|
603
|
+
|
|
604
|
+
# This method is used to obtain the current extension's standard error
|
|
605
|
+
# stream. Extensions should write all error messages to this stream,
|
|
606
|
+
# allowing the Burp user to configure how that output is handled from
|
|
607
|
+
# within the UI.
|
|
608
|
+
#
|
|
609
|
+
# @return [OutputStream] The extension's standard error stream.
|
|
610
|
+
#
|
|
611
|
+
def getStderr
|
|
612
|
+
@stderr ||= _check_and_callback(:getStderr)
|
|
613
|
+
end
|
|
614
|
+
alias stderr getStderr
|
|
615
|
+
alias get_stderr getStderr
|
|
616
|
+
|
|
617
|
+
# This method is used to register a listener which will be notified of
|
|
618
|
+
# changes to the extension's state. <b>Note:</b> Any extensions that start
|
|
619
|
+
# background threads or open system resources (such as files or database
|
|
620
|
+
# connections) should register a listener and terminate threads / close
|
|
621
|
+
# resources when the extension is unloaded.
|
|
622
|
+
#
|
|
623
|
+
# @overload registerExtensionStateListener(listener)
|
|
624
|
+
# @param [IExtensionStateListener] listener A listener for extension
|
|
625
|
+
# state events
|
|
626
|
+
# @overload registerExtensionStateListener(&block)
|
|
627
|
+
# @param [Proc] &block A listener for extension state events
|
|
628
|
+
# (Isn't JRuby fun?)
|
|
629
|
+
#
|
|
630
|
+
def registerExtensionStateListener(listener = nil, &block)
|
|
631
|
+
if block_given?
|
|
632
|
+
_check_and_callback(:registerExtensionStateListener, &block)
|
|
633
|
+
else
|
|
634
|
+
_check_and_callback(:registerExtensionStateListener, listener)
|
|
635
|
+
end
|
|
636
|
+
end
|
|
637
|
+
alias register_extension_state_listener registerExtensionStateListener
|
|
638
|
+
|
|
639
|
+
# This method is used to register a listener which will be notified of
|
|
640
|
+
# requests and responses made by any Burp tool. Extensions can perform
|
|
641
|
+
# custom analysis or modification of these messages by registering an HTTP
|
|
642
|
+
# listener.
|
|
643
|
+
#
|
|
644
|
+
# @overload registerHttpListener(listener)
|
|
645
|
+
# @param [IHttpListener] listener A listener for http events
|
|
646
|
+
# @overload registerHttpListener(&block)
|
|
647
|
+
# @param [Proc] &block A listener for http events
|
|
648
|
+
# (Isn't JRuby fun?)
|
|
649
|
+
#
|
|
650
|
+
def registerHttpListener(listener = nil, &block)
|
|
651
|
+
if block_given?
|
|
652
|
+
_check_and_callback(:registerHttpListener, &block)
|
|
653
|
+
else
|
|
654
|
+
_check_and_callback(:registerHttpListener, listener)
|
|
655
|
+
end
|
|
656
|
+
end
|
|
657
|
+
alias register_http_listener registerHttpListener
|
|
658
|
+
|
|
659
|
+
# This method is used to register a listener which will be notified of
|
|
660
|
+
# requests and responses being processed by the Proxy tool. Extensions can
|
|
661
|
+
# perform custom analysis or modification of these messages, and control
|
|
662
|
+
# in-UI message interception, by registering a proxy listener.
|
|
663
|
+
#
|
|
664
|
+
# @overload registerProxyListener(listener)
|
|
665
|
+
# @param [IProxyListener] listener A listener for proxy events
|
|
666
|
+
# @overload registerHttpListener(&block)
|
|
667
|
+
# @param [Proc] &block A listener for proxy events
|
|
668
|
+
# (Isn't JRuby fun?)
|
|
669
|
+
#
|
|
670
|
+
def registerProxyListener(listener = nil, &block)
|
|
671
|
+
if block_given?
|
|
672
|
+
_check_and_callback(:registerProxyListener, &block)
|
|
673
|
+
else
|
|
674
|
+
_check_and_callback(:registerProxyListener, listener)
|
|
675
|
+
end
|
|
676
|
+
end
|
|
677
|
+
alias register_proxy_listener registerProxyListener
|
|
678
|
+
|
|
679
|
+
# This method is used to register a listener which will be notified of new
|
|
680
|
+
# issues that are reported by the Scanner tool. Extensions can perform
|
|
681
|
+
# custom analysis or logging of Scanner issues by registering a Scanner
|
|
682
|
+
# listener.
|
|
683
|
+
#
|
|
684
|
+
# @overload registerScannerListener(listener)
|
|
685
|
+
# @param [IScannerListener] listener A listener for scanner events
|
|
686
|
+
# @overload registerScannerListener(&block)
|
|
687
|
+
# @param [Proc] &block A listener for scanner events
|
|
688
|
+
# (Isn't JRuby fun?)
|
|
689
|
+
#
|
|
690
|
+
def registerScannerListener(listener = nil, &block)
|
|
691
|
+
if block_given?
|
|
692
|
+
_check_and_callback(:registerScannerListener, &block)
|
|
693
|
+
else
|
|
694
|
+
_check_and_callback(:registerScannerListener, listener)
|
|
695
|
+
end
|
|
696
|
+
end
|
|
697
|
+
alias register_scanner_listener registerScannerListener
|
|
698
|
+
|
|
699
|
+
# This method is used to register a listener which will be notified of
|
|
700
|
+
# changes to Burp's suite-wide target scope.
|
|
701
|
+
#
|
|
702
|
+
# @overload registerScopeChangeListener(listener)
|
|
703
|
+
# @param [IScopeChangeListener] listener A listener for scope change events
|
|
704
|
+
# @overload registerScopeChangeListener(&block)
|
|
705
|
+
# @param [Proc] &block A listener for scope change events
|
|
706
|
+
# (Isn't JRuby fun?)
|
|
707
|
+
#
|
|
708
|
+
def registerScopeChangeListener(listener = nil, &block)
|
|
709
|
+
if block_given?
|
|
710
|
+
_check_and_callback(:registerScopeChangeListener, &block)
|
|
711
|
+
else
|
|
712
|
+
_check_and_callback(:registerScopeChangeListener, listener)
|
|
713
|
+
end
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
# This method is used to register a factory for custom context menu items.
|
|
717
|
+
# When the user invokes a context menu anywhere within Burp, the factory
|
|
718
|
+
# will be passed details of the invocation event, and asked to provide any
|
|
719
|
+
# custom context menu items that should be shown.
|
|
720
|
+
#
|
|
721
|
+
# @overload registerContextMenuFactory(factory)
|
|
722
|
+
# @param [IContextMenuFactory] factory A listener for context
|
|
723
|
+
# menu invocation events
|
|
724
|
+
# @overload registerContextMenuFactory(&block)
|
|
725
|
+
# @param [Proc] &block A listener for context menu invocation events
|
|
726
|
+
# (Isn't JRuby fun?)
|
|
727
|
+
# @note It is probably better to use the more explicit +factory+ argument
|
|
728
|
+
# version to ensure the +IContextMenuInvocation+ Java classes have been
|
|
729
|
+
# wrapped properly.
|
|
730
|
+
#
|
|
731
|
+
def registerContextMenuFactory(factory = nil, &block)
|
|
732
|
+
if block_given?
|
|
733
|
+
_check_and_callback(:registerContextMenuFactory, &block)
|
|
734
|
+
else
|
|
735
|
+
_check_and_callback(:registerContextMenuFactory, factory)
|
|
736
|
+
end
|
|
737
|
+
end
|
|
738
|
+
alias register_context_menu_factory registerContextMenuFactory
|
|
739
|
+
|
|
740
|
+
# This method is used to register a factory for custom message editor tabs.
|
|
741
|
+
# For each message editor that already exists, or is subsequently created,
|
|
742
|
+
# within Burp, the factory will be asked to provide a new instance of an
|
|
743
|
+
# <code>IMessageEditorTab</code> object, which can provide custom rendering
|
|
744
|
+
# or editing of HTTP messages.
|
|
745
|
+
#
|
|
746
|
+
# @overload registerMessageEditorTabFactory(factory)
|
|
747
|
+
# @param [IMessageEditorTabFactory] factory A listener for message editor
|
|
748
|
+
# tab events
|
|
749
|
+
# @overload registerMessageEditorTabFactory(&block)
|
|
750
|
+
# @param [Proc] &block A listener for message editor tab events
|
|
751
|
+
# (Isn't JRuby fun?)
|
|
752
|
+
# @note It is probably better to use the more explicit +factory+ argument
|
|
753
|
+
# version to ensure the +IMessageEditorController+ Java classes have been
|
|
754
|
+
# wrapped properly.
|
|
755
|
+
#
|
|
756
|
+
def registerMessageEditorTabFactory(factory = nil, &block)
|
|
757
|
+
if block_given?
|
|
758
|
+
_check_and_callback(:registerMessageEditorTabFactory, &block)
|
|
759
|
+
else
|
|
760
|
+
_check_and_callback(:registerMessageEditorTabFactory, factory)
|
|
761
|
+
end
|
|
762
|
+
end
|
|
763
|
+
alias register_message_editor_tab_factory registerMessageEditorTabFactory
|
|
764
|
+
|
|
765
|
+
# This method is used to register a provider of Scanner insertion points.
|
|
766
|
+
# For each base request that is actively scanned, Burp will ask the
|
|
767
|
+
# provider to provide any custom scanner insertion points that are
|
|
768
|
+
# appropriate for the request.
|
|
769
|
+
#
|
|
770
|
+
# @overload registerScannerInsertionPointProvider(provider)
|
|
771
|
+
# @param [IScannerInsertionPointProvider] provider A provider of scanner
|
|
772
|
+
# insertion points
|
|
773
|
+
# @overload registerScannerInsertionPointProvider(&block)
|
|
774
|
+
# @param [Proc] &block A provider of scanner insertion points
|
|
775
|
+
# (Isn't JRuby fun?)
|
|
776
|
+
#
|
|
777
|
+
def registerScannerInsertionPointProvider(provider = nil, &block)
|
|
778
|
+
if block_given?
|
|
779
|
+
_check_and_callback(:registerScannerInsertionPointProvider, &block)
|
|
780
|
+
else
|
|
781
|
+
_check_and_callback(:registerScannerInsertionPointProvider, provider)
|
|
782
|
+
end
|
|
783
|
+
end
|
|
784
|
+
alias register_scanner_insertion_point_provider registerScannerInsertionPointProvider
|
|
785
|
+
|
|
786
|
+
# This method is used to register a custom Scanner check. When performing
|
|
787
|
+
# scanning, Burp will ask the check to perform active or passive scanning
|
|
788
|
+
# on the base request, and report any Scanner issues that are identified.
|
|
789
|
+
#
|
|
790
|
+
# @param [IScannerCheck] check An object that performs a given check.
|
|
791
|
+
#
|
|
792
|
+
def registerScannerCheck(check = nil, &block)
|
|
793
|
+
if block_given?
|
|
794
|
+
_check_and_callback(:registerScannerCheck, &block)
|
|
795
|
+
else
|
|
796
|
+
_check_and_callback(:registerScannerCheck, check)
|
|
797
|
+
end
|
|
798
|
+
end
|
|
799
|
+
alias register_scanner_check registerScannerCheck
|
|
800
|
+
|
|
801
|
+
# This method is used to register a factory for Intruder payloads. Each
|
|
802
|
+
# registered factory will be available within the Intruder UI for the user
|
|
803
|
+
# to select as the payload source for an attack. When this is selected, the
|
|
804
|
+
# factory will be asked to provide a new instance of an
|
|
805
|
+
# +IIntruderPayloadGenerator+ object, which will be used to generate payloads
|
|
806
|
+
# for the attack.
|
|
807
|
+
#
|
|
808
|
+
# @param [IIntruderPayloadGeneratorFactory] factory An object to be used for
|
|
809
|
+
# generating intruder payloads.
|
|
810
|
+
#
|
|
811
|
+
# @todo Test - block version may work here
|
|
812
|
+
def registerIntruderPayloadGeneratorFactory(factory = nil, &block)
|
|
813
|
+
if block_given?
|
|
814
|
+
_check_and_callback(:registerIntruderPayloadGeneratorFactory, &block)
|
|
815
|
+
else
|
|
816
|
+
_check_and_callback(:registerIntruderPayloadGeneratorFactory, factory)
|
|
817
|
+
end
|
|
818
|
+
end
|
|
819
|
+
alias register_intruder_payload_generator_factory registerIntruderPayloadGeneratorFactory
|
|
820
|
+
|
|
821
|
+
# This method is used to register a custom Intruder payload processor. Each
|
|
822
|
+
# registered processor will be available within the Intruder UI for the
|
|
823
|
+
# user to select as the action for a payload processing rule.
|
|
824
|
+
#
|
|
825
|
+
# @param [IIntruderPayloadProcessor] processor An object used for processing
|
|
826
|
+
# Intruder payloads
|
|
827
|
+
#
|
|
828
|
+
# @todo Test - block version may work here
|
|
829
|
+
def registerIntruderPayloadProcessor(processor)
|
|
830
|
+
if block_given?
|
|
831
|
+
_check_and_callback(:registerIntruderPayloadProcessor, &block)
|
|
832
|
+
else
|
|
833
|
+
_check_and_callback(:registerIntruderPayloadProcessor, processor)
|
|
834
|
+
end
|
|
835
|
+
end
|
|
836
|
+
alias register_intruder_payload_processor registerIntruderPayloadProcessor
|
|
837
|
+
|
|
838
|
+
# This method is used to register a custom session handling action. Each
|
|
839
|
+
# registered action will be available within the session handling rule UI
|
|
840
|
+
# for the user to select as a rule action. Users can choose to invoke an
|
|
841
|
+
# action directly in its own right, or following execution of a macro.
|
|
842
|
+
#
|
|
843
|
+
# @param [ISessionHandlingAction] action An object used to perform a given session action.
|
|
844
|
+
#
|
|
845
|
+
# @todo Test - block version may work here
|
|
846
|
+
def registerSessionHandlingAction(action)
|
|
847
|
+
if block_given?
|
|
848
|
+
_check_and_callback(:registerSessionHandlingAction, &block)
|
|
849
|
+
else
|
|
850
|
+
_check_and_callback(:registerSessionHandlingAction, action)
|
|
851
|
+
end
|
|
852
|
+
end
|
|
853
|
+
alias register_session_handling_action registerSessionHandlingAction
|
|
854
|
+
|
|
855
|
+
# This method is used to add a custom tab to the main Burp Suite window.
|
|
856
|
+
#
|
|
857
|
+
# @param [ITab] tab A tab to be added to the suite's user interface.
|
|
858
|
+
#
|
|
859
|
+
def addSuiteTab(tab)
|
|
860
|
+
_check_and_callback(:addSuiteTab, tab)
|
|
861
|
+
end
|
|
862
|
+
alias add_suite_tab addSuiteTab
|
|
863
|
+
|
|
864
|
+
# This method is used to remove a previously-added tab from the main Burp
|
|
865
|
+
# Suite window.
|
|
866
|
+
#
|
|
867
|
+
# @param [ITab] tab The tab to be removed from the suite's user interface.
|
|
868
|
+
#
|
|
869
|
+
def removeSuiteTab(tab)
|
|
870
|
+
_check_and_callback(:removeSuiteTab, tab)
|
|
871
|
+
end
|
|
872
|
+
alias remove_suite_tab removeSuiteTab
|
|
873
|
+
|
|
874
|
+
# This method is used to customize UI components in line with Burp's UI
|
|
875
|
+
# style, including font size, colors, table line spacing, etc.
|
|
876
|
+
#
|
|
877
|
+
# @param [Component] component The UI component to be customized.
|
|
878
|
+
#
|
|
879
|
+
def customizeUiComponent(component)
|
|
880
|
+
_check_and_callback(:customizeUiComponent, component)
|
|
881
|
+
end
|
|
882
|
+
alias customize_ui_component customizeUiComponent
|
|
883
|
+
|
|
884
|
+
# This method is used to create a new instance of Burp's HTTP message
|
|
885
|
+
# editor, for the extension to use in its own UI.
|
|
886
|
+
#
|
|
887
|
+
# @param controller An object created by the extension that implements the
|
|
888
|
+
# +IMessageEditorController+ interface. This parameter is optional and
|
|
889
|
+
# defaults to +nil+. If it is provided, then the message editor will query
|
|
890
|
+
# the controller when required to obtain details about the currently
|
|
891
|
+
# displayed message, including the +IHttpService+ for the message, and the
|
|
892
|
+
# associated request or response message. If a controller is not provided,
|
|
893
|
+
# then the message editor will not support context menu actions, such as
|
|
894
|
+
# sending requests to other Burp tools.
|
|
895
|
+
# @param [Boolean] editable Indicates whether the editor created should be
|
|
896
|
+
# editable, or used only for message viewing.
|
|
897
|
+
# @return [IMessageEditor] An object which the extension can use in
|
|
898
|
+
# its own UI.
|
|
899
|
+
#
|
|
900
|
+
def createMessageEditor(controller = nil, editable = true)
|
|
901
|
+
Buby::Implants::MessageEditor.implant _check_and_callback(:createMessageEditor, controller, editable)
|
|
902
|
+
end
|
|
903
|
+
alias create_message_editor createMessageEditor
|
|
904
|
+
|
|
905
|
+
# This method is used to save configuration settings for the extension in a
|
|
906
|
+
# persistent way that survives reloads of the extension and of Burp Suite.
|
|
907
|
+
# Saved settings can be retrieved using the method {#loadExtensionSetting}.
|
|
908
|
+
#
|
|
909
|
+
# @param [String] name The name of the setting.
|
|
910
|
+
# @param [String] value The value of the setting. If this value is +nil+ then
|
|
911
|
+
# any existing setting with the specified name will be removed.
|
|
912
|
+
#
|
|
913
|
+
def saveExtensionSetting(name, value)
|
|
914
|
+
_check_and_callback(:saveExtensionSetting, name, value)
|
|
915
|
+
end
|
|
916
|
+
alias save_extension_setting saveExtensionSetting
|
|
917
|
+
|
|
918
|
+
# This method is used to load configuration settings for the extension that
|
|
919
|
+
# were saved using the method
|
|
920
|
+
# <code>saveExtensionSetting()</code>.
|
|
921
|
+
#
|
|
922
|
+
# @param [String] name The name of the setting.
|
|
923
|
+
# @return [String] The value of the setting, or +nil+ if no value is set.
|
|
924
|
+
#
|
|
925
|
+
def loadExtensionSetting(name)
|
|
926
|
+
_check_and_callback(:loadExtensionSetting, name)
|
|
927
|
+
end
|
|
928
|
+
alias load_extension_setting loadExtensionSetting
|
|
929
|
+
|
|
930
|
+
# This method is used to create a new instance of Burp's plain text editor,
|
|
931
|
+
# for the extension to use in its own UI.
|
|
932
|
+
#
|
|
933
|
+
# @return [ITextEditor] A new text editor the extension can use in its own UI.
|
|
934
|
+
#
|
|
935
|
+
def createTextEditor()
|
|
936
|
+
_check_and_callback(:createTextEditor)
|
|
937
|
+
end
|
|
938
|
+
alias create_text_editor createTextEditor
|
|
939
|
+
|
|
940
|
+
# This method is used to retrieve the contents of Burp's session handling
|
|
941
|
+
# cookie jar. Extensions that provide an +ISessionHandlingAction+ can query
|
|
942
|
+
# and update the cookie jar in order to handle unusual session handling
|
|
943
|
+
# mechanisms.
|
|
944
|
+
#
|
|
945
|
+
# @return [Array<ICookie>] An array of the cookies representing the contents
|
|
946
|
+
# of Burp's session handling cookie jar.
|
|
947
|
+
#
|
|
948
|
+
def getCookieJarContents
|
|
949
|
+
_check_and_callback(:getCookieJarContents).tap{|arr| Buby::Implants::Cookie.implant(arr.first)}
|
|
950
|
+
end
|
|
951
|
+
alias get_cookie_jar_contents getCookieJarContents
|
|
952
|
+
alias cookie_jar_contents getCookieJarContents
|
|
953
|
+
|
|
954
|
+
# This method is used to update the contents of Burp's session handling
|
|
955
|
+
# cookie jar. Extensions that provide an
|
|
956
|
+
# <code>ISessionHandlingAction</code> can query and update the cookie jar
|
|
957
|
+
# in order to handle unusual session handling mechanisms.
|
|
958
|
+
#
|
|
959
|
+
# @param [ICookie] cookie An object containing details of the cookie to be
|
|
960
|
+
# updated. If the cookie jar already contains a cookie that matches the
|
|
961
|
+
# specified domain and name, then that cookie will be updated with the new
|
|
962
|
+
# value and expiration, unless the new value is +nil+, in which case the
|
|
963
|
+
# cookie will be removed. If the cookie jar does not already contain a
|
|
964
|
+
# cookie that matches the specified domain and name, then the cookie will
|
|
965
|
+
# be added.
|
|
966
|
+
#
|
|
967
|
+
# @see Buby::Cookie
|
|
968
|
+
def updateCookieJar(cookie)
|
|
969
|
+
_check_and_callback(:updateCookieJar, cookie)
|
|
970
|
+
end
|
|
971
|
+
alias update_cookie_jar updateCookieJar
|
|
972
|
+
|
|
973
|
+
# This method is used to create a temporary file on disk containing the
|
|
974
|
+
# provided data. Extensions can use temporary files for long-term storage
|
|
975
|
+
# of runtime data, avoiding the need to retain that data in memory.
|
|
976
|
+
# Not strictly needed in JRuby (use Tempfile class in stdlib instead) but might see use.
|
|
977
|
+
#
|
|
978
|
+
# @param [String, Array<byte>] buffer The data to be saved to a temporary file.
|
|
979
|
+
# @return [ITempFile] A reference to the temp file.
|
|
980
|
+
#
|
|
981
|
+
def saveToTempFile(buffer)
|
|
982
|
+
buffer = buffer.to_java_bytes if buffer.respond_to? :to_java_bytes
|
|
983
|
+
Buby::Implants::TempFile.implant(_check_and_callback(:saveToTempFile, buffer))
|
|
984
|
+
end
|
|
985
|
+
alias save_to_temp_file saveToTempFile
|
|
986
|
+
|
|
987
|
+
# This method is used to save the request and response of an
|
|
988
|
+
# +IHttpRequestResponse+ object to temporary files, so that they are no longer
|
|
989
|
+
# held in memory. Extensions can used this method to convert
|
|
990
|
+
# +IHttpRequestResponse+ objects into a form suitable for long-term storage.
|
|
991
|
+
#
|
|
992
|
+
# @param [IHttpRequestResponse] httpRequestResponse The request and response
|
|
993
|
+
# messages to be saved to temporary files.
|
|
994
|
+
# @return [IHttpRequestResponsePersisted] A reference to the saved temp file.
|
|
995
|
+
#
|
|
996
|
+
# @todo move HttpRequestResponse to new Implants method...
|
|
997
|
+
def saveBuffersToTempFiles(httpRequestResponse)
|
|
998
|
+
_check_and_callback(:saveBuffersToTempFiles, httpRequestResponse).tap{|obj| Buby::HttpRequestResponseHelper.implant(obj)}
|
|
999
|
+
end
|
|
1000
|
+
alias save_buffers_to_temp_files saveBuffersToTempFiles
|
|
1001
|
+
|
|
1002
|
+
# This method is used to apply markers to an HTTP request or response, at
|
|
1003
|
+
# offsets into the message that are relevant for some particular purpose.
|
|
1004
|
+
# Markers are used in various situations, such as specifying Intruder
|
|
1005
|
+
# payload positions, Scanner insertion points, and highlights in Scanner
|
|
1006
|
+
# issues.
|
|
1007
|
+
#
|
|
1008
|
+
# @param [IHttpRequestResponse] httpRequestResponse The object to which the
|
|
1009
|
+
# markers should be applied.
|
|
1010
|
+
# @param [Array<Array<Fixnum>>] requestMarkers A list of index pairs
|
|
1011
|
+
# representing the offsets of markers to be applied to the request message.
|
|
1012
|
+
# Each item in the list must be an +int[2]+ array containing the start and
|
|
1013
|
+
# end offsets for the marker. This parameter is optional and may be +nil+ if
|
|
1014
|
+
# no request markers are required.
|
|
1015
|
+
# @param [Array<Array<Fixnum>>] responseMarkers A list of index pairs
|
|
1016
|
+
# representing the offsets of markers to be applied to the response message.
|
|
1017
|
+
# Each item in the list must be an +int[2]+ array containing the start and
|
|
1018
|
+
# end offsets for the marker. This parameter is optional and may be +nil+ if
|
|
1019
|
+
# no response markers are required.
|
|
1020
|
+
# @return [IHttpRequestResponseWithMarkers] A marked request/response pair.
|
|
1021
|
+
#
|
|
1022
|
+
# @todo Bring IHttpRequestResponse helper up to date
|
|
1023
|
+
def applyMarkers(httpRequestResponse, requestMarkers, responseMarkers)
|
|
1024
|
+
_check_and_callback(:applyMarkers, httpRequestResponse, requestMarkers, responseMarkers).tap{|obj| Buby::HttpRequestResponseHelper.implant(obj)}
|
|
1025
|
+
end
|
|
1026
|
+
alias apply_markers applyMarkers
|
|
1027
|
+
|
|
1028
|
+
# This method is used to obtain the descriptive name for the Burp tool
|
|
1029
|
+
# identified by the tool flag provided.
|
|
1030
|
+
#
|
|
1031
|
+
# @param [Fixnum] toolFlag A flag identifying a Burp tool (+TOOL_PROXY+, +TOOL_SCANNER+, etc.). Tool flags are defined within this interface.
|
|
1032
|
+
# @return [String] The descriptive name for the specified tool.
|
|
1033
|
+
#
|
|
1034
|
+
def getToolName(toolFlag)
|
|
1035
|
+
_check_and_callback(:getToolName, toolFlag)
|
|
1036
|
+
end
|
|
1037
|
+
alias get_tool_name getToolName
|
|
1038
|
+
|
|
1039
|
+
# This method is used to register a new Scanner issue.
|
|
1040
|
+
# @note Wherever possible, extensions should implement custom Scanner checks
|
|
1041
|
+
# using +IScannerCheck+ and report issues via those checks, so as to
|
|
1042
|
+
# integrate with Burp's user-driven workflow, and ensure proper
|
|
1043
|
+
# consolidation of duplicate reported issues. This method is only designed
|
|
1044
|
+
# for tasks outside of the normal testing workflow, such as importing
|
|
1045
|
+
# results from other scanning tools.
|
|
1046
|
+
#
|
|
1047
|
+
# @param [IScanIssue] issue An issue to be added to the scan results.
|
|
1048
|
+
#
|
|
1049
|
+
def addScanIssue(issue)
|
|
1050
|
+
_check_and_callback(:addScanIssue, issue)
|
|
1051
|
+
end
|
|
1052
|
+
alias add_scan_issue addScanIssue
|
|
440
1053
|
|
|
441
1054
|
### Event Handlers ###
|
|
1055
|
+
# @todo move basic event handler logic to extender side
|
|
442
1056
|
|
|
443
1057
|
# This method is called by the BurpExtender java implementation upon
|
|
444
1058
|
# initialization of the BurpExtender instance for Burp. The args parameter
|
|
@@ -446,11 +1060,24 @@ class Buby
|
|
|
446
1060
|
# so that implementations can access and extend its public interfaces.
|
|
447
1061
|
#
|
|
448
1062
|
# The return value is ignored.
|
|
1063
|
+
# @deprecated
|
|
449
1064
|
def evt_extender_init ext
|
|
450
1065
|
@burp_extender = ext
|
|
451
1066
|
pp([:got_extender, ext]) if $DEBUG
|
|
452
1067
|
end
|
|
453
1068
|
|
|
1069
|
+
# This method is called by the BurpExtender implementations upon
|
|
1070
|
+
# initialization of the BurpExtender instance for Burp. The args parameter
|
|
1071
|
+
# is passed with a instance of the newly initialized BurpExtender instance
|
|
1072
|
+
# so that implementations can access and extend its public interfaces.
|
|
1073
|
+
#
|
|
1074
|
+
# @param [IBurpExtender] ext
|
|
1075
|
+
# @return [void]
|
|
1076
|
+
def extender_initialize ext
|
|
1077
|
+
@burp_extender = ext
|
|
1078
|
+
pp([:got_extender, ext]) if $DEBUG
|
|
1079
|
+
end
|
|
1080
|
+
|
|
454
1081
|
# This method is called by the BurpExtender implementation Burp startup.
|
|
455
1082
|
# The args parameter contains main()'s argv command-line arguments array.
|
|
456
1083
|
#
|
|
@@ -458,30 +1085,74 @@ class Buby
|
|
|
458
1085
|
# implementation of BurpExtender.
|
|
459
1086
|
#
|
|
460
1087
|
# The return value is ignored.
|
|
1088
|
+
# @deprecated - nothing calls this anymore
|
|
461
1089
|
def evt_command_line_args args
|
|
462
1090
|
pp([:got_args, args]) if $DEBUG
|
|
463
1091
|
end
|
|
464
1092
|
|
|
465
|
-
# This method is called by BurpExtender on startup to register Burp's
|
|
1093
|
+
# This method is called by BurpExtender on startup to register Burp's
|
|
466
1094
|
# IBurpExtenderCallbacks interface object.
|
|
467
1095
|
#
|
|
468
|
-
# This maps to the 'registerExtenderCallbacks' method in the Java
|
|
1096
|
+
# This maps to the 'registerExtenderCallbacks' method in the Java
|
|
469
1097
|
# implementation of BurpExtender.
|
|
470
1098
|
#
|
|
471
1099
|
# The return value is ignored.
|
|
472
|
-
|
|
1100
|
+
# @deprecated
|
|
1101
|
+
# @param cb [IBurpExtenderCallbacks] callbacks presented by burp
|
|
1102
|
+
# @param alert [Boolean]
|
|
1103
|
+
# @return [IBurpExtenderCallbacks] cb
|
|
1104
|
+
def evt_register_callbacks cb, alert = true
|
|
1105
|
+
cb.issueAlert("[JRuby::#{self.class}] registered callback") if alert
|
|
1106
|
+
pp([:got_evt_register_callbacks, cb]) if $DEBUG
|
|
473
1107
|
@burp_callbacks = cb
|
|
474
|
-
cb.issueAlert("[JRuby::#{self.class}] registered callback")
|
|
475
|
-
pp([:got_callbacks, cb]) if $DEBUG
|
|
476
1108
|
end
|
|
477
1109
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
1110
|
+
# This method is called by BurpExtender on startup to register Burp's
|
|
1111
|
+
# IBurpExtenderCallbacks interface object.
|
|
1112
|
+
#
|
|
1113
|
+
# This maps to the 'registerExtenderCallbacks' method in the Java
|
|
1114
|
+
# implementation of BurpExtender.
|
|
1115
|
+
#
|
|
1116
|
+
# @param callbacks [IBurpExtenderCallbacks] callbacks presented by burp
|
|
1117
|
+
# @param alert [Boolean]
|
|
1118
|
+
# @return [IBurpExtenderCallbacks] cb
|
|
1119
|
+
def register_callbacks callbacks, alert = true
|
|
1120
|
+
callbacks.issueAlert("[JRuby::#{self.class}] registered callback") if alert
|
|
1121
|
+
pp([:got_register_callbacks, callbacks]) if $DEBUG
|
|
1122
|
+
evt_register_callbacks(callbacks, false) if respond_to? :evt_register_callbacks
|
|
1123
|
+
@burp_callbacks = callbacks
|
|
1124
|
+
end
|
|
1125
|
+
|
|
1126
|
+
|
|
1127
|
+
ACTION_FOLLOW_RULES = Java::Burp::IInterceptedProxyMessage::ACTION_FOLLOW_RULES
|
|
1128
|
+
ACTION_DO_INTERCEPT = Java::Burp::IInterceptedProxyMessage::ACTION_DO_INTERCEPT
|
|
1129
|
+
ACTION_DONT_INTERCEPT = Java::Burp::IInterceptedProxyMessage::ACTION_DONT_INTERCEPT
|
|
1130
|
+
ACTION_DROP = Java::Burp::IInterceptedProxyMessage::ACTION_DROP
|
|
1131
|
+
ACTION_FOLLOW_RULES_AND_REHOOK = Java::Burp::IInterceptedProxyMessage::ACTION_FOLLOW_RULES_AND_REHOOK
|
|
1132
|
+
ACTION_DO_INTERCEPT_AND_REHOOK = Java::Burp::IInterceptedProxyMessage::ACTION_DO_INTERCEPT_AND_REHOOK
|
|
1133
|
+
ACTION_DONT_INTERCEPT_AND_REHOOK = Java::Burp::IInterceptedProxyMessage::ACTION_DONT_INTERCEPT_AND_REHOOK
|
|
1134
|
+
# Flag used to identify Burp Suite as a whole.
|
|
1135
|
+
TOOL_SUITE = Java::Burp::IBurpExtenderCallbacks::TOOL_SUITE
|
|
1136
|
+
# Flag used to identify the Burp Target tool.
|
|
1137
|
+
TOOL_TARGET = Java::Burp::IBurpExtenderCallbacks::TOOL_TARGET
|
|
1138
|
+
# Flag used to identify the Burp Proxy tool.
|
|
1139
|
+
TOOL_PROXY = Java::Burp::IBurpExtenderCallbacks::TOOL_PROXY
|
|
1140
|
+
# Flag used to identify the Burp Spider tool.
|
|
1141
|
+
TOOL_SPIDER = Java::Burp::IBurpExtenderCallbacks::TOOL_SPIDER
|
|
1142
|
+
# Flag used to identify the Burp Scanner tool.
|
|
1143
|
+
TOOL_SCANNER = Java::Burp::IBurpExtenderCallbacks::TOOL_SCANNER
|
|
1144
|
+
# Flag used to identify the Burp Intruder tool.
|
|
1145
|
+
TOOL_INTRUDER = Java::Burp::IBurpExtenderCallbacks::TOOL_INTRUDER
|
|
1146
|
+
# Flag used to identify the Burp Repeater tool.
|
|
1147
|
+
TOOL_REPEATER = Java::Burp::IBurpExtenderCallbacks::TOOL_REPEATER
|
|
1148
|
+
# Flag used to identify the Burp Sequencer tool.
|
|
1149
|
+
TOOL_SEQUENCER = Java::Burp::IBurpExtenderCallbacks::TOOL_SEQUENCER
|
|
1150
|
+
# Flag used to identify the Burp Decoder tool.
|
|
1151
|
+
TOOL_DECODER = Java::Burp::IBurpExtenderCallbacks::TOOL_DECODER
|
|
1152
|
+
# Flag used to identify the Burp Comparer tool.
|
|
1153
|
+
TOOL_COMPARER = Java::Burp::IBurpExtenderCallbacks::TOOL_COMPARER
|
|
1154
|
+
# Flag used to identify the Burp Extender tool.
|
|
1155
|
+
TOOL_EXTENDER = Java::Burp::IBurpExtenderCallbacks::TOOL_EXTENDER
|
|
485
1156
|
|
|
486
1157
|
# Seems we need to specifically render our 'message' to a string here in
|
|
487
1158
|
# ruby. Otherwise there's flakiness when converting certain binary non-ascii
|
|
@@ -622,6 +1293,8 @@ class Buby
|
|
|
622
1293
|
# message[0..4] = "HEAD "
|
|
623
1294
|
# return message.dup
|
|
624
1295
|
#
|
|
1296
|
+
# @deprecated Legacy - Use {Buby#process_proxy_message} or
|
|
1297
|
+
# {Buby::ProxyListener}
|
|
625
1298
|
def evt_proxy_message msg_ref, is_req, rhost, rport, is_https, http_meth, url, resourceType, status, req_content_type, message, action
|
|
626
1299
|
pp([ (is_req)? :got_proxy_request : :got_proxy_response,
|
|
627
1300
|
[:msg_ref, msg_ref],
|
|
@@ -640,6 +1313,21 @@ class Buby
|
|
|
640
1313
|
return message
|
|
641
1314
|
end
|
|
642
1315
|
|
|
1316
|
+
# This method is invoked when an HTTP message is being processed by the Proxy.
|
|
1317
|
+
#
|
|
1318
|
+
# @param [Boolean] messageIsRequest Indicates whether the HTTP message is a
|
|
1319
|
+
# request or a response.
|
|
1320
|
+
# @param [IInterceptedProxyMessage] message An +IInterceptedProxyMessage+
|
|
1321
|
+
# object that extensions can use to query and update details of the
|
|
1322
|
+
# message, and control whether the message should be intercepted and
|
|
1323
|
+
# displayed to the user for manual review or modification.
|
|
1324
|
+
# @return [void]
|
|
1325
|
+
#
|
|
1326
|
+
# @see Buby::ProxyListener
|
|
1327
|
+
def process_proxy_message(messageIsRequest, message)
|
|
1328
|
+
pp [:got_processProxyMessage] if $debug
|
|
1329
|
+
Buby::Implants::InterceptedProxyMessage.implant message
|
|
1330
|
+
end
|
|
643
1331
|
|
|
644
1332
|
# This method is invoked whenever any of Burp's tools makes an HTTP request
|
|
645
1333
|
# or receives a response. This is effectively a generalised version of the
|
|
@@ -667,9 +1355,33 @@ class Buby
|
|
|
667
1355
|
# * message_info = an instance of the IHttpRequestResponse Java class with
|
|
668
1356
|
# methods for accessing and manipulating various attributes of the message.
|
|
669
1357
|
#
|
|
1358
|
+
# @todo Bring IHttpRequestResponse helper up to date
|
|
1359
|
+
# @note Changed in Burp 1.5.01+
|
|
1360
|
+
# @deprecated This is the called by the legacy interface, use
|
|
1361
|
+
# {#process_http_message} instead
|
|
670
1362
|
def evt_http_message(tool_name, is_request, message_info)
|
|
671
1363
|
HttpRequestResponseHelper.implant(message_info)
|
|
672
|
-
pp([:
|
|
1364
|
+
pp([:got_evt_http_message, tool_name, is_request, message_info]) if $DEBUG
|
|
1365
|
+
end
|
|
1366
|
+
|
|
1367
|
+
|
|
1368
|
+
# This method is invoked when an HTTP request is about to be issued, and
|
|
1369
|
+
# when an HTTP response has been received.
|
|
1370
|
+
#
|
|
1371
|
+
# @param [Fixnum] toolFlag A flag indicating the Burp tool that issued the
|
|
1372
|
+
# request. Burp tool flags are defined in the +IBurpExtenderCallbacks+
|
|
1373
|
+
# interface.
|
|
1374
|
+
# @param [Boolean] messageIsRequest Flags whether the method is being invoked
|
|
1375
|
+
# for a request or response.
|
|
1376
|
+
# @param [IHttpRequestResponse] messageInfo Details of the request / response
|
|
1377
|
+
# to be processed. Extensions can call the setter methods on this object to
|
|
1378
|
+
# update the current message and so modify Burp's behavior.
|
|
1379
|
+
# @return [void]
|
|
1380
|
+
# @note This is the 1.5.01+ version of this callback
|
|
1381
|
+
#
|
|
1382
|
+
def process_http_message(toolFlag, messageIsRequest, messageInfo)
|
|
1383
|
+
HttpRequestResponseHelper.implant(messageInfo)
|
|
1384
|
+
pp([:got_process_http_message, toolFlag, messageIsRequest, messageInfo]) if $DEBUG
|
|
673
1385
|
end
|
|
674
1386
|
|
|
675
1387
|
# This method is invoked whenever Burp Scanner discovers a new, unique
|
|
@@ -684,18 +1396,70 @@ class Buby
|
|
|
684
1396
|
# Parameters:
|
|
685
1397
|
# * issue = an instance of the IScanIssue Java class with methods for viewing
|
|
686
1398
|
# information on the scan issue that was generated.
|
|
1399
|
+
# @todo move implant to new way...
|
|
1400
|
+
# @deprecated
|
|
687
1401
|
def evt_scan_issue(issue)
|
|
688
1402
|
ScanIssueHelper.implant(issue)
|
|
689
1403
|
pp([:got_scan_issue, issue]) if $DEBUG
|
|
690
1404
|
end
|
|
691
1405
|
|
|
1406
|
+
|
|
1407
|
+
# This method is invoked when a new issue is added to Burp Scanner's
|
|
1408
|
+
# results.
|
|
1409
|
+
#
|
|
1410
|
+
# @param [IScanIssue] issue An +IScanIssue+ object that the extension can
|
|
1411
|
+
# query to obtain details about the new issue.
|
|
1412
|
+
#
|
|
1413
|
+
# @return [void]
|
|
1414
|
+
#
|
|
1415
|
+
# @abstract
|
|
1416
|
+
# @note This maps to the newScanIssue callback in IScannerListener implemented
|
|
1417
|
+
# by the BurpExtender side.
|
|
1418
|
+
def new_scan_issue(issue)
|
|
1419
|
+
pp [:got_newScanIssue, issue] if $DEBUG
|
|
1420
|
+
ScanIssueHelper.implant issue
|
|
1421
|
+
end
|
|
1422
|
+
|
|
692
1423
|
# This method is called by BurpExtender right before closing the
|
|
693
1424
|
# application. Implementations can use this method to perform cleanup
|
|
694
1425
|
# tasks such as closing files or databases before exit.
|
|
1426
|
+
# @deprecated
|
|
695
1427
|
def evt_application_closing
|
|
696
1428
|
pp([:got_app_close]) if $DEBUG
|
|
697
1429
|
end
|
|
698
1430
|
|
|
1431
|
+
# This method is called by BurpExtender right before closing the
|
|
1432
|
+
# application. Implementations can use this method to perform cleanup
|
|
1433
|
+
# tasks such as closing files or databases before exit.
|
|
1434
|
+
def application_closing
|
|
1435
|
+
pp([:got_app_close]) if $DEBUG
|
|
1436
|
+
end
|
|
1437
|
+
|
|
1438
|
+
# This method is called by BurpExtender right before unloading the
|
|
1439
|
+
# extension. Implementations can use this method to perform cleanup
|
|
1440
|
+
# tasks such as closing files or databases before exit.
|
|
1441
|
+
def extension_unloaded
|
|
1442
|
+
pp([:got_extension_unloaded]) if $DEBUG
|
|
1443
|
+
end
|
|
1444
|
+
|
|
1445
|
+
# This method is used to unload the extension from Burp Suite.
|
|
1446
|
+
#
|
|
1447
|
+
def unloadExtension
|
|
1448
|
+
_check_and_callback(:unloadExtension)
|
|
1449
|
+
end
|
|
1450
|
+
alias unload_extension unloadExtension
|
|
1451
|
+
|
|
1452
|
+
# This method returns the command line arguments that were passed to Burp
|
|
1453
|
+
# on startup.
|
|
1454
|
+
#
|
|
1455
|
+
# @return [Array<String>] The command line arguments that were passed to Burp on startup.
|
|
1456
|
+
#
|
|
1457
|
+
def getCommandLineArguments
|
|
1458
|
+
_check_and_callback(:getCommandLineArguments)
|
|
1459
|
+
end
|
|
1460
|
+
alias get_command_line_arguments getCommandLineArguments
|
|
1461
|
+
alias command_line_arguments getCommandLineArguments
|
|
1462
|
+
|
|
699
1463
|
### Sugar/Convenience methods
|
|
700
1464
|
|
|
701
1465
|
# This is a convenience wrapper which can load a given burp state file and
|
|
@@ -783,10 +1547,10 @@ class Buby
|
|
|
783
1547
|
def harvest_cookies_from_history(cookie=nil, urlrx=nil, statefile=nil)
|
|
784
1548
|
ret = []
|
|
785
1549
|
search_proxy_history(statefile, urlrx) do |hrr|
|
|
786
|
-
if
|
|
787
|
-
ret +=
|
|
788
|
-
|
|
789
|
-
end
|
|
1550
|
+
if (resp = hrr.response)
|
|
1551
|
+
ret += helpers.analyzeResponse(resp).getCookies.select do |c|
|
|
1552
|
+
(cookie.nil? or c.match(cookie)) && (not block_given? or yield(c))
|
|
1553
|
+
end
|
|
790
1554
|
end
|
|
791
1555
|
end
|
|
792
1556
|
return ret
|
|
@@ -796,23 +1560,38 @@ class Buby
|
|
|
796
1560
|
|
|
797
1561
|
# Prepares the java BurpExtender implementation with a reference
|
|
798
1562
|
# to self as the module handler and launches burp suite.
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
1563
|
+
# @param extender Buby exender interface
|
|
1564
|
+
def start(extender = nil, args = [])
|
|
1565
|
+
# so we don't get error when this file is loaded
|
|
1566
|
+
extender ||= legacy_mode? ? Java.burp.BurpExtender : Object.const_get(:BurpExtender)
|
|
1567
|
+
activate!(extender)
|
|
1568
|
+
Java.burp.StartBurp.main(args.to_java(:string)) if legacy_mode?
|
|
802
1569
|
return self
|
|
803
1570
|
end
|
|
804
1571
|
|
|
805
|
-
#
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
#
|
|
1572
|
+
# @deprecated Use Buby#start instead
|
|
1573
|
+
alias start_burp start
|
|
1574
|
+
|
|
1575
|
+
# Starts burp using a supplied handler class
|
|
1576
|
+
#
|
|
1577
|
+
# @param extender Buby BurpExtender to use for callbacks
|
|
1578
|
+
# @param [Class] h_class Buby or a derived class. instance of which will
|
|
1579
|
+
# become handler.
|
|
1580
|
+
# @param [Array<String>] args arguments to Burp
|
|
1581
|
+
# @param init_args arguments to the handler constructor
|
|
809
1582
|
#
|
|
810
|
-
#
|
|
811
|
-
def self.
|
|
1583
|
+
# @return Buby handler instance
|
|
1584
|
+
def self.start(extender = nil, h_class=nil, init_args=nil, args=nil)
|
|
812
1585
|
h_class ||= self
|
|
813
1586
|
init_args ||= []
|
|
814
1587
|
args ||= []
|
|
815
|
-
h_class.new(*init_args).start_burp(args)
|
|
1588
|
+
h_class.new(*init_args).start_burp(extender, args)
|
|
1589
|
+
end
|
|
1590
|
+
|
|
1591
|
+
# @see Buby.start
|
|
1592
|
+
# @deprecated Use Buby.start instead
|
|
1593
|
+
def self.start_burp(extender = nil, h_class = nil, init_args = nil, args = nil)
|
|
1594
|
+
self.start(extender, h_class, init_args, args)
|
|
816
1595
|
end
|
|
817
1596
|
|
|
818
1597
|
# Attempts to load burp with require and confirm it provides the required
|
|
@@ -830,19 +1609,36 @@ class Buby
|
|
|
830
1609
|
# Checks the Java namespace to see if Burp has been loaded.
|
|
831
1610
|
def self.burp_loaded?
|
|
832
1611
|
@burp_loaded ||= begin
|
|
833
|
-
|
|
1612
|
+
Java.burp.StartBurp
|
|
834
1613
|
true
|
|
835
1614
|
rescue NameError
|
|
836
1615
|
false
|
|
837
1616
|
end
|
|
838
1617
|
end
|
|
839
1618
|
|
|
1619
|
+
# determines if we're running in legacy mode
|
|
1620
|
+
# @return [Class, nil]
|
|
1621
|
+
def self.legacy_mode?
|
|
1622
|
+
@legacy ||= begin
|
|
1623
|
+
Java.burp.BurpExtender
|
|
1624
|
+
rescue NameError
|
|
1625
|
+
false
|
|
1626
|
+
end
|
|
1627
|
+
@legacy
|
|
1628
|
+
end
|
|
1629
|
+
|
|
1630
|
+
def legacy_mode?
|
|
1631
|
+
self.class.legacy_mode?
|
|
1632
|
+
end
|
|
1633
|
+
|
|
840
1634
|
### Extra cruft added by Mr Bones:
|
|
841
1635
|
|
|
842
1636
|
# Returns the library path for the module. If any arguments are given,
|
|
843
1637
|
# they will be joined to the end of the libray path using
|
|
844
1638
|
# <tt>File.join</tt>.
|
|
845
1639
|
#
|
|
1640
|
+
# @deprecated
|
|
1641
|
+
# @api private
|
|
846
1642
|
def self.libpath( *args )
|
|
847
1643
|
args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
|
|
848
1644
|
end
|
|
@@ -851,6 +1647,8 @@ class Buby
|
|
|
851
1647
|
# they will be joined to the end of the path using
|
|
852
1648
|
# <tt>File.join</tt>.
|
|
853
1649
|
#
|
|
1650
|
+
# @deprecated
|
|
1651
|
+
# @api private
|
|
854
1652
|
def self.path( *args )
|
|
855
1653
|
args.empty? ? PATH : ::File.join(PATH, args.flatten)
|
|
856
1654
|
end
|
|
@@ -860,6 +1658,8 @@ class Buby
|
|
|
860
1658
|
# in. Optionally, a specific _directory_ name can be passed in such that
|
|
861
1659
|
# the _filename_ does not have to be equivalent to the directory.
|
|
862
1660
|
#
|
|
1661
|
+
# @deprecated
|
|
1662
|
+
# @api private
|
|
863
1663
|
def self.require_all_libs_relative_to( fname, dir = nil )
|
|
864
1664
|
dir ||= ::File.basename(fname, '.*')
|
|
865
1665
|
search_me = ::File.expand_path(
|
|
@@ -869,12 +1669,3 @@ class Buby
|
|
|
869
1669
|
end
|
|
870
1670
|
|
|
871
1671
|
end # Buby
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
# Try requiring 'burp.jar' from the Ruby lib-path
|
|
875
|
-
unless Buby.burp_loaded?
|
|
876
|
-
begin require "burp.jar"
|
|
877
|
-
rescue LoadError
|
|
878
|
-
end
|
|
879
|
-
end
|
|
880
|
-
|