pwn 0.5.354 → 0.5.356

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8512e5e4d1177bad32c255ef76118b23cf334c579f75c7e89fcf01ffacfc4e4c
4
- data.tar.gz: f14e9efed8c396aa61ab72a3a60437854c924b694f8c70c793abb2f3536a3260
3
+ metadata.gz: 9b868d96f794aec7b4791d100b90533fd12f4c8604d2bce0ecfb2984545a70cb
4
+ data.tar.gz: 292c193f5f6bb877a0b4c1b96803dba2c7f67a7fa21dab9ed67da88d66238ffc
5
5
  SHA512:
6
- metadata.gz: 0ea6aed1954cf83f6ad74518aafb11386679e4a387b063b80b8286609c54d634bc9d65528a6fe569dd80ed0581cb1dfbd93b8d463741c68e5807793f8c65d6d9
7
- data.tar.gz: dc78f00786760d81eeca854594acaa1dbaae3e8401c958458fc3d1ddc01d492b23d42ba9dd4737e35aeca3d661519b35a4ce98f17e814edd1cee9a1f7ab83069
6
+ metadata.gz: 3f8e83b4c59a0e9ff7d03ee3768ef09316bb6d3e967d1c78ed566ece9dc41f4c96ebe267583cbdc7b7acb84ac0c000b319d2cde4a486630112a03949c8049e7a
7
+ data.tar.gz: 84f93e38d00342370e2812a1b23c797dc5a97f44aa538d9a1972dca01e028a72043ac194f1cde78650a12c46d5ec5bd67f82702bb2670d54709e3d5243cc72f5
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ cd /opt/pwn
37
37
  $ ./install.sh
38
38
  $ ./install.sh ruby-gem
39
39
  $ pwn
40
- pwn[v0.5.354]:001 >>> PWN.help
40
+ pwn[v0.5.356]:001 >>> PWN.help
41
41
  ```
42
42
 
43
43
  [![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
@@ -52,7 +52,7 @@ $ rvm use ruby-3.4.4@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.5.354]:001 >>> PWN.help
55
+ pwn[v0.5.356]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
  If you're using a multi-user install of RVM do:
@@ -62,7 +62,7 @@ $ rvm use ruby-3.4.4@pwn
62
62
  $ rvmsudo gem uninstall --all --executables pwn
63
63
  $ rvmsudo gem install --verbose pwn
64
64
  $ pwn
65
- pwn[v0.5.354]:001 >>> PWN.help
65
+ pwn[v0.5.356]:001 >>> PWN.help
66
66
  ```
67
67
 
68
68
  PWN periodically upgrades to the latest version of Ruby which is reflected in `/opt/pwn/.ruby-version`. The easiest way to upgrade to the latest version of Ruby from a previous PWN installation is to run the following script:
@@ -40,7 +40,7 @@ module PWN
40
40
  end
41
41
 
42
42
  # Supported Method Parameters::
43
- # burp_obj = PWN::Plugins::BurpSuite.start(
43
+ # burp_obj1 = PWN::Plugins::BurpSuite.start(
44
44
  # burp_jar_path: 'optional - path of burp suite pro jar file (defaults to /opt/burpsuite/burpsuite_pro.jar)',
45
45
  # headless: 'optional - run burp headless if set to true',
46
46
  # browser_type: 'optional - defaults to :firefox. See PWN::Plugins::TransparentBrowser.help for a list of types',
@@ -60,12 +60,10 @@ module PWN
60
60
 
61
61
  browser_type = opts[:browser_type] ||= :firefox
62
62
  burp_ip = opts[:burp_ip] ||= '127.0.0.1'
63
- burp_port = opts[:burp_port] ||= 8080
64
- # burp_port = opts[:burp_port] ||= PWN::Plugins::Sock.get_random_unused_port
65
- #
63
+ burp_port = opts[:burp_port] ||= PWN::Plugins::Sock.get_random_unused_port
64
+
66
65
  pwn_burp_ip = opts[:pwn_burp_ip] ||= '127.0.0.1'
67
- pwn_burp_port = opts[:pwn_burp_port] ||= 1337
68
- # pwn_burp_port = opts[:pwn_burp_port] ||= PWN::Plugins::Sock.get_random_unused_port
66
+ pwn_burp_port = opts[:pwn_burp_port] ||= PWN::Plugins::Sock.get_random_unused_port
69
67
 
70
68
  burp_cmd_string = 'java -Xmx4G'
71
69
  burp_cmd_string = "#{burp_cmd_string} -Djava.awt.headless=true" if opts[:headless]
@@ -103,14 +101,13 @@ module PWN
103
101
  next
104
102
  end
105
103
 
106
- # USE THIS WHEN Updating Proxy Listener settings become
107
- # available in the BurpSuite Montoya API
108
104
  # Update proxy listener to use the burp_ip and burp_port
109
- # update_proxy_listener(
110
- # burp_obj: burp_obj,
111
- # address: burp_ip,
112
- # port: burp_port
113
- # )
105
+ update_proxy_listener(
106
+ burp_obj: burp_obj,
107
+ id: '0',
108
+ address: burp_ip,
109
+ port: burp_port
110
+ )
114
111
 
115
112
  burp_obj
116
113
  rescue StandardError => e
@@ -246,6 +243,113 @@ module PWN
246
243
  raise e
247
244
  end
248
245
 
246
+ # Supported Method Parameters::
247
+ # json_proxy_listeners = PWN::Plugins::BurpSuite.get_proxy_listeners(
248
+ # burp_obj: 'required - burp_obj returned by #start method'
249
+ # )
250
+
251
+ public_class_method def self.get_proxy_listeners(opts = {})
252
+ burp_obj = opts[:burp_obj]
253
+ rest_browser = burp_obj[:rest_browser]
254
+ pwn_burp_api = burp_obj[:pwn_burp_api]
255
+
256
+ listeners = rest_browser.get("http://#{pwn_burp_api}/proxy/listeners", content_type: 'application/json; charset=UTF8')
257
+ JSON.parse(listeners, symbolize_names: true)
258
+ rescue StandardError => e
259
+ stop(burp_obj: burp_obj) unless burp_obj.nil?
260
+ raise e
261
+ end
262
+
263
+ # Supported Method Parameters::
264
+ # json_proxy_listener = PWN::Plugins::BurpSuite.add_proxy_listener(
265
+ # burp_obj: 'required - burp_obj returned by #start method',
266
+ # bind_address: 'required - bind address for the proxy listener (e.g., "127.0.0.1")',
267
+ # port: 'required - port for the proxy listener (e.g., 8081)',
268
+ # enabled: 'optional - enable the listener (defaults to true)'
269
+ # )
270
+
271
+ public_class_method def self.add_proxy_listener(opts = {})
272
+ burp_obj = opts[:burp_obj]
273
+ rest_browser = burp_obj[:rest_browser]
274
+ pwn_burp_api = burp_obj[:pwn_burp_api]
275
+ bind_address = opts[:bind_address]
276
+ raise 'ERROR: bind_address parameter is required' if bind_address.nil?
277
+
278
+ port = opts[:port]
279
+ raise 'ERROR: port parameter is required' if port.nil?
280
+
281
+ enabled = opts[:enabled] != false # Default to true if not specified
282
+
283
+ proxy_listeners = get_proxy_listeners(burp_obj: burp_obj)
284
+ last_known_proxy_id = proxy_listeners.last[:id].to_i ||= 0
285
+ next_id = last_known_proxy_id + 1
286
+
287
+ post_body = {
288
+ id: next_id.to_s,
289
+ bind_address: bind_address,
290
+ port: port,
291
+ enabled: enabled
292
+ }.to_json
293
+
294
+ listener = rest_browser.post("http://#{pwn_burp_api}/proxy/listeners", post_body, content_type: 'application/json; charset=UTF8')
295
+ JSON.parse(listener, symbolize_names: true)
296
+ rescue StandardError => e
297
+ stop(burp_obj: burp_obj) unless burp_obj.nil?
298
+ raise e
299
+ end
300
+
301
+ # Supported Method Parameters::
302
+ # json_proxy_listener = PWN::Plugins::BurpSuite.update_proxy_listener(
303
+ # burp_obj: 'required - burp_obj returned by #start method',
304
+ # id: 'optional - ID of the proxy listener (defaults to "0")',
305
+ # bind_address: 'optional - bind address for the proxy listener (defaults to "127.0.0.1")',
306
+ # port: 'optional - port for the proxy listener (defaults to 8080)',
307
+ # enabled: 'optional - enable or disable the listener (defaults to true)'
308
+ # )
309
+
310
+ public_class_method def self.update_proxy_listener(opts = {})
311
+ burp_obj = opts[:burp_obj]
312
+ rest_browser = burp_obj[:rest_browser]
313
+ pwn_burp_api = burp_obj[:pwn_burp_api]
314
+ id = opts[:id] ||= '0'
315
+ bind_address = opts[:bind_address] ||= '127.0.0.1'
316
+ port = opts[:port] ||= 8080
317
+ enabled = opts[:enabled] != false # Default to true if not specified
318
+
319
+ post_body = {
320
+ id: id,
321
+ bind_address: bind_address,
322
+ port: port,
323
+ enabled: enabled
324
+ }.to_json
325
+
326
+ listener = rest_browser.put("http://#{pwn_burp_api}/proxy/listeners/#{id}", post_body, content_type: 'application/json; charset=UTF8')
327
+ JSON.parse(listener, symbolize_names: true)
328
+ rescue StandardError => e
329
+ stop(burp_obj: burp_obj) unless burp_obj.nil?
330
+ raise e
331
+ end
332
+
333
+ # Supported Method Parameters::
334
+ # PWN::Plugins::BurpSuite.delete_proxy_listener(
335
+ # burp_obj: 'required - burp_obj returned by #start method',
336
+ # id: 'required - ID of the proxy listener (defaults to "0")'
337
+ # )
338
+
339
+ public_class_method def self.delete_proxy_listener(opts = {})
340
+ burp_obj = opts[:burp_obj]
341
+ rest_browser = burp_obj[:rest_browser]
342
+ pwn_burp_api = burp_obj[:pwn_burp_api]
343
+ id = opts[:id] ||= '0'
344
+ raise 'ERROR: id parameter is required' if id.nil?
345
+
346
+ rest_browser.delete("http://#{pwn_burp_api}/proxy/listeners/#{id}")
347
+ true # Return true to indicate successful deletion (or error if API fails)
348
+ rescue StandardError => e
349
+ stop(burp_obj: burp_obj) unless burp_obj.nil?
350
+ raise e
351
+ end
352
+
249
353
  # Supported Method Parameters::
250
354
  # json_sitemap = PWN::Plugins::BurpSuite.get_sitemap(
251
355
  # burp_obj: 'required - burp_obj returned by #start method',
@@ -696,20 +800,31 @@ module PWN
696
800
  end
697
801
 
698
802
  # Wait for scan completion
699
- scan_queue = rest_browser.get("http://#{pwn_burp_api}/scan/active")
700
- json_scan_queue = JSON.parse(scan_queue, symbolize_names: true)
701
- scan_queue_total = json_scan_queue.count
702
- json_scan_queue.each do |scan_item|
703
- this_scan_item_id = scan_item[:id]
704
- until scan_item[:status] == 'finished'
705
- scan_item_resp = rest_browser.get("http://#{pwn_burp_api}/scan/active/#{this_scan_item_id}")
706
- scan_item = JSON.parse(scan_item_resp, symbolize_names: true)
707
- scan_status = scan_item[:status]
708
- puts "Target ID ##{this_scan_item_id} of ##{scan_queue_total}| #{scan_status}"
709
- sleep 3
803
+ loop do
804
+ scan_queue = rest_browser.get("http://#{pwn_burp_api}/scan/active")
805
+ json_scan_queue = JSON.parse(scan_queue, symbolize_names: true)
806
+ break if json_scan_queue.all? { |scan| scan[:status] == 'finished' }
807
+
808
+ puts "\n\n\n"
809
+ puts '-'* 90
810
+ json_scan_queue.each do |scan|
811
+ puts "Target ID: #{scan[:id]}, Request Count: #{scan[:request_count]}, Progress: #{scan[:percent_complete]}%, Status: #{scan[:status]}"
710
812
  end
711
- puts "Target ID ##{this_scan_item_id} of ##{scan_queue_total}| 100% complete\n"
813
+
814
+ sleep 30
712
815
  end
816
+ # scan_queue_total = json_scan_queue.count
817
+ # json_scan_queue.each do |scan_item|
818
+ # this_scan_item_id = scan_item[:id]
819
+ # until scan_item[:status] == 'finished'
820
+ # scan_item_resp = rest_browser.get("http://#{pwn_burp_api}/scan/active/#{this_scan_item_id}")
821
+ # scan_item = JSON.parse(scan_item_resp, symbolize_names: true)
822
+ # scan_status = scan_item[:status]
823
+ # puts "Target ID ##{this_scan_item_id} of ##{scan_queue_total}| #{scan_status}"
824
+ # sleep 3
825
+ # end
826
+ # puts "Target ID ##{this_scan_item_id} of ##{scan_queue_total}| 100% complete\n"
827
+ # end
713
828
 
714
829
  active_scan_url_arr # Return array of targeted URIs to pass to #generate_scan_report method
715
830
  rescue StandardError => e
@@ -788,109 +903,6 @@ module PWN
788
903
  raise e
789
904
  end
790
905
 
791
- # Supported Method Parameters::
792
- # json_proxy_listeners = PWN::Plugins::BurpSuite.get_proxy_listeners(
793
- # burp_obj: 'required - burp_obj returned by #start method'
794
- # )
795
-
796
- public_class_method def self.get_proxy_listeners(opts = {})
797
- burp_obj = opts[:burp_obj]
798
- rest_browser = burp_obj[:rest_browser]
799
- pwn_burp_api = burp_obj[:pwn_burp_api]
800
-
801
- listeners = rest_browser.get("http://#{pwn_burp_api}/proxy/listeners", content_type: 'application/json; charset=UTF8')
802
- JSON.parse(listeners, symbolize_names: true)
803
- rescue StandardError => e
804
- stop(burp_obj: burp_obj) unless burp_obj.nil?
805
- raise e
806
- end
807
-
808
- # Supported Method Parameters::
809
- # json_proxy_listener = PWN::Plugins::BurpSuite.add_proxy_listener(
810
- # burp_obj: 'required - burp_obj returned by #start method',
811
- # bind_address: 'required - bind address for the proxy listener (e.g., "127.0.0.1")',
812
- # port: 'required - port for the proxy listener (e.g., 8081)',
813
- # enabled: 'optional - enable the listener (defaults to true)'
814
- # )
815
-
816
- public_class_method def self.add_proxy_listener(opts = {})
817
- burp_obj = opts[:burp_obj]
818
- rest_browser = burp_obj[:rest_browser]
819
- pwn_burp_api = burp_obj[:pwn_burp_api]
820
- bind_address = opts[:bind_address]
821
- raise 'ERROR: bind_address parameter is required' if bind_address.nil?
822
-
823
- port = opts[:port]
824
- raise 'ERROR: port parameter is required' if port.nil?
825
-
826
- enabled = opts[:enabled] != false # Default to true if not specified
827
-
828
- post_body = {
829
- id: "#{bind_address}:#{port}",
830
- bind_address: bind_address,
831
- port: port,
832
- enabled: enabled
833
- }.to_json
834
-
835
- listener = rest_browser.post("http://#{pwn_burp_api}/proxy/listeners", post_body, content_type: 'application/json; charset=UTF8')
836
- JSON.parse(listener, symbolize_names: true)
837
- rescue StandardError => e
838
- stop(burp_obj: burp_obj) unless burp_obj.nil?
839
- raise e
840
- end
841
-
842
- # Supported Method Parameters::
843
- # json_proxy_listener = PWN::Plugins::BurpSuite.update_proxy_listener(
844
- # burp_obj: 'required - burp_obj returned by #start method',
845
- # id: 'optional - ID of the proxy listener (defaults to "127.0.0.1:8080")',
846
- # bind_address: 'optional - bind address for the proxy listener (defaults to "127.0.0.1")',
847
- # port: 'optional - port for the proxy listener (defaults to 8080)',
848
- # enabled: 'optional - enable or disable the listener (defaults to true)'
849
- # )
850
-
851
- public_class_method def self.update_proxy_listener(opts = {})
852
- burp_obj = opts[:burp_obj]
853
- rest_browser = burp_obj[:rest_browser]
854
- pwn_burp_api = burp_obj[:pwn_burp_api]
855
- id = opts[:id] ||= '127.0.0.1:8080'
856
- bind_address = opts[:bind_address] ||= '127.0.0.1'
857
- port = opts[:port] ||= 8080
858
- enabled = opts[:enabled] != false # Default to true if not specified
859
-
860
- post_body = {
861
- id: id,
862
- bind_address: bind_address,
863
- port: port,
864
- enabled: enabled
865
- }.to_json
866
-
867
- listener = rest_browser.put("http://#{pwn_burp_api}/proxy/listeners/#{id}", post_body, content_type: 'application/json; charset=UTF8')
868
- JSON.parse(listener, symbolize_names: true)
869
- rescue StandardError => e
870
- stop(burp_obj: burp_obj) unless burp_obj.nil?
871
- raise e
872
- end
873
-
874
- # Supported Method Parameters::
875
- # PWN::Plugins::BurpSuite.delete_proxy_listener(
876
- # burp_obj: 'required - burp_obj returned by #start method',
877
- # id: 'required - ID of the proxy listener (e.g., "127.0.0.1:8080")'
878
- # )
879
-
880
- public_class_method def self.delete_proxy_listener(opts = {})
881
- burp_obj = opts[:burp_obj]
882
- rest_browser = burp_obj[:rest_browser]
883
- pwn_burp_api = burp_obj[:pwn_burp_api]
884
- id = opts[:id]
885
- raise 'ERROR: id parameter is required' if id.nil?
886
-
887
- rest_browser.delete("http://#{pwn_burp_api}/proxy/listeners/#{id}")
888
- true # Return true to indicate successful deletion (or error if API fails)
889
- rescue StandardError => e
890
- stop(burp_obj: burp_obj) unless burp_obj.nil?
891
- raise e
892
- end
893
-
894
906
  # Supported Method Parameters::
895
907
  # PWN::Plugins::BurpSuite.update_burp_jar(
896
908
  # )
@@ -929,7 +941,7 @@ module PWN
929
941
 
930
942
  public_class_method def self.help
931
943
  puts "USAGE:
932
- burp_obj = #{self}.start(
944
+ burp_obj1 = #{self}.start(
933
945
  burp_jar_path: 'optional - path of burp suite pro jar file (defaults to /opt/burpsuite/burpsuite_pro.jar)',
934
946
  headless: 'optional - run headless if set to true',
935
947
  browser_type: 'optional - defaults to :firefox. See PWN::Plugins::TransparentBrowser.help for a list of types'
@@ -958,6 +970,30 @@ module PWN
958
970
  burp_obj: 'required - burp_obj returned by #start method'
959
971
  )
960
972
 
973
+ #{self}.get_proxy_listeners(
974
+ burp_obj: 'required - burp_obj returned by #start method'
975
+ )
976
+
977
+ json_proxy_listener = #{self}.add_proxy_listener(
978
+ burp_obj: 'required - burp_obj returned by #start method',
979
+ bind_address: 'required - bind address for the proxy listener (e.g., \"127.0.0.1\")',
980
+ port: 'required - port for the proxy listener (e.g., 8081)',
981
+ enabled: 'optional - enable the listener (defaults to true)'
982
+ )
983
+
984
+ json_proxy_listener = #{self}.update_proxy_listener(
985
+ burp_obj: 'required - burp_obj returned by #start method',
986
+ id: 'optional - ID of the proxy listener (defaults to \"0\")',
987
+ bind_address: 'required - bind address for the proxy listener (e.g., \"127.0.0.1\")',
988
+ port: 'required - port for the proxy listener (e.g., 8081)',
989
+ enabled: 'optional - enable the listener (defaults to true)'
990
+ )
991
+
992
+ #{self}.delete_proxy_listener(
993
+ burp_obj: 'required - burp_obj returned by #start method',
994
+ id: 'required - ID of the proxy listener (defaults to \"0\")'
995
+ )
996
+
961
997
  json_sitemap = #{self}.get_sitemap(
962
998
  burp_obj: 'required - burp_obj returned by #start method',
963
999
  target_url: 'optional - target URL to filter sitemap results (defaults to entire sitemap)'
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.5.354'
4
+ VERSION = '0.5.356'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.354
4
+ version: 0.5.356
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.