buby 1.3.3-java → 1.5.0-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
|