buby 1.5.0.pre2-java → 1.5.0.pre3-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/Rakefile +1 -1
  2. data/VERSION.yml +1 -1
  3. data/buby.gemspec +15 -4
  4. data/ext/buby/burp/BurpExtender.java +55 -16
  5. data/ext/burp_interfaces/burp/IBurpExtenderCallbacks.java +52 -53
  6. data/ext/burp_interfaces/burp/IContextMenuInvocation.java +26 -15
  7. data/ext/burp_interfaces/burp/IInterceptedProxyMessage.java +23 -3
  8. data/ext/burp_interfaces/burp/IProxyListener.java +1 -1
  9. data/lib/buby.rb +48 -30
  10. data/lib/buby/burp_extender.rb +339 -0
  11. data/lib/buby/burp_extender/console_frame.rb +33 -0
  12. data/lib/buby/burp_extender/console_pane.rb +26 -0
  13. data/lib/buby/burp_extender/console_tab.rb +15 -0
  14. data/lib/buby/burp_extender/context_menu.rb +29 -0
  15. data/lib/buby/burp_extender/context_menu_factory.rb +17 -0
  16. data/lib/buby/burp_extender/context_menu_item.rb +13 -0
  17. data/lib/buby/burp_extender/jcheck_box_menu_item.rb +12 -0
  18. data/lib/buby/burp_extender/jmenu.rb +11 -0
  19. data/lib/buby/burp_extender/jmenu_item.rb +12 -0
  20. data/lib/buby/burp_extender/menu.rb +11 -0
  21. data/lib/buby/burp_extender/menu_item.rb +12 -0
  22. data/lib/buby/extender.rb +156 -0
  23. data/lib/buby/implants/context_menu_invocation.rb +29 -2
  24. data/lib/buby/implants/cookie.rb +0 -1
  25. data/lib/buby/implants/extension_helpers.rb +0 -37
  26. data/lib/buby/implants/http_request_response.rb +3 -3
  27. data/lib/buby/implants/intercepted_proxy_message.rb +0 -1
  28. data/lib/buby/implants/intruder_attack.rb +0 -1
  29. data/lib/buby/implants/jruby.rb +19 -10
  30. data/lib/buby/implants/message_editor.rb +0 -1
  31. data/lib/buby/implants/message_editor_controller.rb +0 -1
  32. data/lib/buby/implants/parameter.rb +0 -1
  33. data/lib/buby/implants/request_info.rb +0 -1
  34. data/lib/buby/implants/response_info.rb +0 -1
  35. data/lib/buby/implants/scan_queue_item.rb +0 -1
  36. data/lib/buby/implants/scanner_insertion_point.rb +0 -1
  37. data/lib/buby/implants/temp_file.rb +0 -1
  38. data/lib/buby/implants/text_editor.rb +0 -1
  39. data/lib/buby/scanner_check.rb +1 -1
  40. data/lib/buby/version.rb +2 -2
  41. metadata +15 -4
  42. data/lib/buby.jar +0 -0
  43. data/lib/burp_interfaces.jar +0 -0
@@ -0,0 +1,33 @@
1
+ class BurpExtender
2
+ # @api private
3
+ class ConsoleFrame < Java::JavaxSwing::JFrame
4
+ attr_accessor :burp, :pane
5
+ def initialize(burp_extender, pane, opts = {}, &block)
6
+ @burp = burp_extender
7
+ @pane = pane
8
+
9
+ blck = lambda do |event|
10
+ if event.getID == Java::JavaAwtEvent::WindowEvent::WINDOW_CLOSING
11
+ @pane.tar.shutdown
12
+ self.dispose
13
+ end
14
+ end
15
+
16
+ super(opts[:title] || 'JRuby IRB Console (tab will autocomplete)')
17
+ set_size(*(opts[:size] || [700, 600]))
18
+ content_pane.add(@pane)
19
+ addWindowStateListener &blck
20
+ addWindowListener &blck
21
+
22
+ if block_given?
23
+ addWindowStateListener &block
24
+ addWindowListener &block
25
+ end
26
+
27
+ @burp.callbacks.customizeUiComponent self
28
+ Java::JavaAwt::EventQueue.invoke_later {
29
+ self.visible = true
30
+ }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ class BurpExtender
2
+ # @api private
3
+ class ConsolePane < Java::JavaxSwing::JScrollPane
4
+ attr_accessor :text, :tar
5
+ def initialize
6
+ super
7
+ @text = Java::JavaxSwing::JTextPane.new
8
+ @text.font = find_font('Monospaced', Java::JavaAwt::Font::PLAIN, 14, 'Anonymous Pro', 'Anonymous', 'Monaco', 'Andale Mono')
9
+ @text.margin = Java::JavaAwt::Insets.new(8,8,8,8)
10
+ @text.caret_color = Java::JavaAwt::Color.new(0xa40000)
11
+ @text.background = Java::JavaAwt::Color.new(0xf2f2f2)
12
+ @text.foreground = Java::JavaAwt::Color.new(0xa40000)
13
+ self.viewport_view = @text
14
+ @tar = Java::OrgJrubyDemo::TextAreaReadline.new(@text, " Welcome to the Burp JRuby IRB Console [#{JRUBY_VERSION} (#{RUBY_VERSION})]\n\n")
15
+ JRuby.objectspace = true # useful for code completion
16
+ @tar.hook_into_runtime_with_streams(JRuby.runtime)
17
+ end
18
+
19
+ # Try to find preferred font family, use otherwise -- err -- otherwise
20
+ def find_font(otherwise, style, size, *families)
21
+ avail_families = Java::JavaAwt::GraphicsEnvironment.local_graphics_environment.available_font_family_names
22
+ fontname = families.find(proc {otherwise}) { |name| avail_families.include? name }
23
+ Java::JavaAwt::Font.new(fontname, style, size)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ require 'buby/version'
2
+
3
+ class BurpExtender
4
+ # @api private
5
+ class ConsoleTab
6
+ include Java::Burp::ITab
7
+ attr_accessor :ui_component, :tab_caption
8
+ CAPTION = "Buby v#{Buby::Version::STRING}"
9
+
10
+ def initialize component, caption = nil
11
+ @ui_component = component
12
+ @tab_caption = caption || CAPTION
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ require 'buby/burp_extender/context_menu_item'
2
+
3
+ # @api private
4
+ class BurpExtender
5
+ # @api private
6
+ class ContextMenu < Java::JavaxSwing::JMenu
7
+ attr_accessor :burp, :invocation
8
+ def initialize burp_extender, invocation
9
+ @burp = burp_extender
10
+ @invocation = invocation
11
+ super 'Buby'
12
+
13
+ if @burp.frame
14
+ self.add(ContextMenuItem.new('Move console to tab', @burp, @invocation) do |event|
15
+ burp = event.source.burp
16
+ invocation = event.source.invocation
17
+ burp.move_to_tab
18
+ end)
19
+ else
20
+ self.add(ContextMenuItem.new('Move console to window', @burp, @invocation) do |event|
21
+ burp = event.source.burp
22
+ invocation = event.source.invocation
23
+ burp.move_to_window
24
+ end)
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ require 'buby/burp_extender/context_menu'
2
+
3
+ class BurpExtender
4
+ # @api private
5
+ class ContextMenuFactory
6
+ attr_accessor :burp
7
+ include Java::Burp::IContextMenuFactory
8
+ def initialize burp_extender
9
+ @burp = burp_extender
10
+ end
11
+
12
+ def createMenuItems invocation
13
+ pp [:createMenuItems, invocation] if $DEBUG
14
+ [BurpExtender::ContextMenu.new(@burp, invocation)]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ class BurpExtender
2
+ # @api private
3
+ class ContextMenuItem < Java::JavaxSwing::JMenuItem
4
+ attr_accessor :invocation, :burp
5
+ def initialize text, burp_extender, invocation, &block
6
+ super text
7
+ @invocation = invocation
8
+ @burp = burp_extender
9
+
10
+ addActionListener &block
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ class BurpExtender
2
+ class JCheckBoxMenuItem < Java::JavaxSwing::JCheckBoxMenuItem
3
+ attr_accessor :burp
4
+ def initialize(burp_extender, *args, &block)
5
+ super *args
6
+ @burp = burp_extender
7
+ if block_given?
8
+ addActionListener &block
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ class BurpExtender
2
+ # @api private
3
+ class JMenu < Java::JavaxSwing::JMenu
4
+ attr_accessor :burp
5
+ def initialize burp_extender, name = nil
6
+ name ||= burp_extender.handler.class.name
7
+ @burp = burp_extender
8
+ super name
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ class BurpExtender
2
+ # @api private
3
+ class JMenuItem < Java::JavaxSwing::JMenuItem
4
+ attr_accessor :burp
5
+ def initialize text, burp_extender, &block
6
+ super text
7
+ @burp = burp_extender
8
+
9
+ addActionListener &block
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ class BurpExtender
2
+ # @api private
3
+ class Menu < Java::JavaAwt::Menu
4
+ attr_accessor :burp
5
+ def initialize burp_extender, name = nil
6
+ name ||= burp_extender.handler.class.name
7
+ @burp = burp_extender
8
+ super name
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ class BurpExtender
2
+ # @api private
3
+ class MenuItem < Java::JavaAwt::MenuItem
4
+ attr_accessor :burp
5
+ def initialize text, burp_extender, &block
6
+ super text
7
+ @burp = burp_extender
8
+
9
+ addActionListener &block
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,156 @@
1
+ class Buby
2
+ # This is the JRuby implementation of IBurpExtender for use as a JRuby
3
+ # extension. This class handles the type conversions and other ruby sugar.
4
+ # {BurpExtender} further extends this by adding additional things during
5
+ # startup, like setting up Buby as the handler class and starting console
6
+ # tabs.
7
+ #
8
+ # @note This class, unlike the Java implementation, does not fire the
9
+ # deprecated evt_* callbacks, only the new versions.
10
+ #
11
+ # @todo move implant logic to extender interfaces
12
+ module Extender
13
+ include Java::Burp::IBurpExtender
14
+ include Java::Burp::IExtensionStateListener
15
+ include Java::Burp::IProxyListener
16
+ include Java::Burp::IHttpListener
17
+ include Java::Burp::IScannerListener
18
+ include Java::Burp::IScopeChangeListener
19
+ include Java::Burp::IContextMenuFactory
20
+
21
+ # @group Buby internals
22
+ # Internal reference to ruby handler class (usually {Buby})
23
+ @@handler = nil
24
+
25
+ # Returns the internal Ruby handler reference.
26
+ #
27
+ # The handler is the ruby class or module used for proxying BurpExtender
28
+ # events into a ruby runtime. Usually, this is Buby or a subclass.
29
+ #
30
+ def self.handler
31
+ @@handler
32
+ end
33
+
34
+ # Sets an internal reference to the ruby handler class or module to use for
35
+ # proxied BurpExtender events into a ruby runtime.
36
+ #
37
+ # Generally, this should probably be called in {#registerExtenderCallbacks}.
38
+ # However, it is also possible to set this afterwards and even swap in new
39
+ # objects during runtime.
40
+ #
41
+ def self.handler=(hndlr)
42
+ @@handler = hndlr
43
+ end
44
+
45
+ def handler
46
+ @@handler
47
+ end
48
+
49
+ def handler= hndlr
50
+ @@handler = hndlr
51
+ end
52
+
53
+ # @group Burp extender
54
+ # This callback usually fires before the handler is set.
55
+ #
56
+ def initialize *args
57
+ @@handler.extender_initialize(*args) if @@handler.respond_to? :extender_inititialize
58
+ end
59
+
60
+ # This method is invoked when the extension is loaded. It registers an
61
+ # instance of the +IBurpExtenderCallbacks+ interface, providing methods that
62
+ # may be invoked by the extension to perform various actions.
63
+ #
64
+ # @param [IBurpExtenderCallbacks] callbacks Burp's Java object for querying
65
+ # Burp's data.
66
+ # @return [void]
67
+ #
68
+ def registerExtenderCallbacks(callbacks)
69
+ @callbacks = callbacks
70
+ callbacks.issueAlert("[#{self.class}] registering JRuby handler callbacks")
71
+ callbacks.registerExtensionStateListener(self)
72
+ callbacks.registerHttpListener(self)
73
+ callbacks.registerScannerListener(self)
74
+ callbacks.registerContextMenuFactory self
75
+ callbacks.registerScopeChangeListener self
76
+ @@handler.register_callbacks(callbacks) if @@handler.respond_to? :register_callbacks
77
+ end
78
+
79
+ # @group Listeners
80
+ # This method is called when the extension is unloaded. This, in turn, calls
81
+ # {Buby#extension_unloaded} on the handler instance
82
+ #
83
+ def extensionUnloaded
84
+ @@handler.extension_unloaded if @@handler.respond_to? :extension_unloaded
85
+ end
86
+
87
+ # This method is invoked when an HTTP message is being processed by the
88
+ # Proxy and calls {Buby#process_proxy_message} on the handler.
89
+ #
90
+ # @param [Boolean] messageIsRequest Indicates whether the HTTP message is a
91
+ # request or a response.
92
+ # @param [IInterceptedProxyMessage] message An +IInterceptedProxyMessage+
93
+ # object that extensions can use to query and update details of the
94
+ # message, and control whether the message should be intercepted and
95
+ # displayed to the user for manual review or modification.
96
+ # @return [void]
97
+ #
98
+ def processProxyMessage(messageIsRequest, message)
99
+ @@handler.process_proxy_message(messageIsRequest, message) if @@handler.respond_to? :process_proxy_message
100
+ end
101
+
102
+ # This method is invoked when an HTTP request is about to be issued, and
103
+ # when an HTTP response has been received.
104
+ #
105
+ # @param [Fixnum] toolFlag A flag indicating the Burp tool that issued the
106
+ # request. Burp tool flags are defined in the +IBurpExtenderCallbacks+
107
+ # interface.
108
+ # @param [Boolean] messageIsRequest Flags whether the method is being
109
+ # invoked for a request or response.
110
+ # @param [IHttpRequestResponse] messageInfo Details of the request /
111
+ # response to be processed. Extensions can call the setter methods on this
112
+ # object to update the current message and so modify Burp's behavior.
113
+ # @return [void]
114
+ #
115
+ def processHttpMessage(toolFlag, messageIsRequest, messageInfo)
116
+ @@handler.process_http_message(toolFlag, messageIsRequest, messageInfo) if @@handler.respond_to? :process_http_message
117
+ end
118
+
119
+ # This method is invoked when a new issue is added to Burp Scanner's
120
+ # results.
121
+ #
122
+ # @param [IScanIssue] issue An +IScanIssue+ object that the extension can
123
+ # query to obtain details about the new issue.
124
+ #
125
+ def newScanIssue(issue)
126
+ @@handler.new_scan_issue(issue) if @@handler.respond_to? :new_scan_issue
127
+ end
128
+
129
+ # This method will be called by Burp when the user invokes a context menu
130
+ # anywhere within Burp. The factory can then provide any custom context menu
131
+ # items that should be displayed in the context menu, based on the details
132
+ # of the menu invocation.
133
+ #
134
+ # @param [IContextMenuInvocation] invocation An object the extension can
135
+ # query to obtain details of the context menu invocation.
136
+ # @return [Array<JMenuItem>, nil] A list of custom menu items (which may
137
+ # include sub-menus, checkbox menu items, etc.) that should be displayed.
138
+ # Extensions may return +nil+ from this method, to indicate that no menu
139
+ # items are required.
140
+ #
141
+ # @abstract
142
+ def createMenuItems invocation
143
+ @@handler.create_menu_items(invocation) if @@handler.respond_to? :create_menu_items
144
+ end
145
+
146
+ # This method is invoked whenever a change occurs to Burp's suite-wide
147
+ # target scope.
148
+ #
149
+ # @return [void]
150
+ #
151
+ # @abstract
152
+ def scopeChanged
153
+ @@handler.scope_changed if @@handler.respond_to? :scope_changed
154
+ end
155
+ end
156
+ end
@@ -41,13 +41,41 @@ class Buby
41
41
  # Context menu is being invoked in a search results window.
42
42
  CONTEXT_SEARCH_RESULTS = 10;
43
43
 
44
+ # This method can be used to retrieve details of the HTTP requests /
45
+ # responses that were shown or selected by the user when the context menu
46
+ # was invoked.
47
+ #
48
+ # @note For performance reasons, the objects returned from this method are
49
+ # tied to the originating context of the messages within the Burp UI.
50
+ # For example, if a context menu is invoked on the Proxy intercept
51
+ # panel, then the +IHttpRequestResponse+ returned by this method will
52
+ # reflect the current contents of the interception panel, and this will
53
+ # change when the current message has been forwarded or dropped. If your
54
+ # extension needs to store details of the message for which the context
55
+ # menu has been invoked, then you should query those details from the
56
+ # +IHttpRequestResponse+ at the time of invocation, or you should use
57
+ # +IBurpExtenderCallbacks.saveBuffersToTempFiles()+ to create a
58
+ # persistent read-only copy of the +IHttpRequestResponse+.
59
+ #
60
+ # @return [Array<IHttpRequestResponse>,nil] An array of objects
61
+ # representing the items that were shown or selected by the user when
62
+ # the context menu was invoked. This method returns +nil+ if no messages
63
+ # are applicable to the invocation.
64
+ #
44
65
  def getSelectedMessages
45
66
  pp [:got_get_selected_messages] if $DEBUG
46
67
  hrrl = __getSelectedMessages
47
68
  HttpRequestResponseHelper.implant(hrrl.first)
48
69
  hrrl
49
70
  end
50
-
71
+
72
+ # This method can be used to retrieve details of the Scanner issues that
73
+ # were selected by the user when the context menu was invoked.
74
+ #
75
+ # @return [Array<IScanIssue>,nil] The issues that were selected by the
76
+ # user when the context menu was invoked. This method returns +nil+ if
77
+ # no Scanner issues are applicable to the invocation.
78
+ #
51
79
  def getSelectedIssues
52
80
  pp [:got_get_selected_issues] if $DEBUG
53
81
  sil = __getSelectedIssues
@@ -58,7 +86,6 @@ class Buby
58
86
  # Install ourselves into the current +IContextMenuInvocation+ java class
59
87
  # @param [IContextMenuInvocation] invocation
60
88
  #
61
- # @todo __persistent__?
62
89
  def self.implant(invocation)
63
90
  unless invocation.implanted? || invocation.nil?
64
91
  pp [:implanting, invocation, invocation.class] if $DEBUG
@@ -18,7 +18,6 @@ class Buby
18
18
  # Install ourselves into the current +ICookie+ java class
19
19
  # @param [ICookie] cookie instance
20
20
  #
21
- # @todo __persistent__?
22
21
  def self.implant(cookie)
23
22
  unless cookie.implanted? || cookie.nil?
24
23
  pp [:implanting, cookie, cookie.class] if $DEBUG
@@ -245,46 +245,9 @@ class Buby
245
245
  Buby::Implants::ScannerInsertionPoint.implant(__makeScannerInsertionPoint(insertion_point_name, base_request, from, to))
246
246
  end
247
247
 
248
- def self.extend_proxy(arg)
249
- pp [self, arg, arg.class]
250
- a_methods = %w{
251
- analyzeRequest
252
- analyzeResponse
253
- getRequestParameter
254
- indexOf
255
- buildHttpMessage
256
- buildHttpRequest
257
- addParameter
258
- removeParameter
259
- updateParameter
260
- toggleRequestMethod
261
- buildHttpService
262
- buildParameter
263
- makeScannerInsertionPoint
264
- }
265
- a_methods.each do |meth|
266
- pp ["__" + meth, self] if $DEBUG
267
- arg.class_exec(meth) do |meth|
268
- alias_method "__"+meth.to_s, meth
269
- end
270
- end
271
- a_methods.each do |meth|
272
- pp [meth, self] if $DEBUG
273
- arg.java_class.ruby_names_for_java_method(meth).each do |ruby_meth|
274
- pp [ruby_meth, meth, self] if $DEBUG
275
- arg.class_exec(ruby_meth, meth, instance_method(meth)) do |ruby_meth, meth_name, meth|
276
- define_method meth_name, meth
277
- # alias_method ruby_meth, "__"+meth unless ruby_meth == meth
278
- end
279
- end
280
- end
281
- include Buby::Implants::Proxy
282
- end
283
-
284
248
  # Install ourselves into the current +IExtensionHelpers+ java class
285
249
  # @param [IExtensionHelpers] helpers
286
250
  #
287
- # @todo __persistent__?
288
251
  def self.implant(helpers)
289
252
  unless helpers.implanted? || helpers.nil?
290
253
  pp [:implanting, helpers, helpers.class] if $DEBUG