pwn 0.5.418 → 0.5.421

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.
@@ -8,6 +8,96 @@ module PWN
8
8
  module Plugins
9
9
  # This module contains methods related to the pwn REPL Driver.
10
10
  module REPL
11
+ # Supported Method Parameters::
12
+ # PWN::Plugins::REPL.load_config(
13
+ # pi: 'required - Pry Instance object',
14
+ # yaml_config_path: 'required - full path to pwn.yaml file',
15
+ # decryption_file: 'optional - full path to decryption YAML file'
16
+ # )
17
+ public_class_method def self.load_config(opts = {})
18
+ yaml_config_path = opts[:yaml_config_path]
19
+
20
+ return false unless yaml_config_path
21
+
22
+ pi = opts[:pi] ||= Pry
23
+ raise "ERROR: #{yaml_config_path} does not exist." unless File.exist?(yaml_config_path)
24
+
25
+ is_encrypted = PWN::Plugins::Vault.file_encrypted?(file: yaml_config_path)
26
+
27
+ if is_encrypted
28
+ # TODO: Implement "something you know, something you have, && something you are?"
29
+ decryption_file = opts[:decryption_file] ||= "#{Dir.home}/pwn.decryptor.yaml"
30
+ raise "ERROR: #{decryption_file} does not exist." unless File.exist?(decryption_file)
31
+
32
+ yaml_decryptor = YAML.load_file(decryption_file, symbolize_names: true)
33
+
34
+ key = opts[:key] ||= yaml_decryptor[:key] ||= ENV.fetch('PWN_DECRYPTOR_KEY')
35
+ key = PWN::Plugins::AuthenticationHelper.mask_password(prompt: 'Decryption Key') if key.nil?
36
+
37
+ iv = opts[:iv] ||= yaml_decryptor[:iv] ||= ENV.fetch('PWN_DECRYPTOR_IV')
38
+ iv = PWN::Plugins::AuthenticationHelper.mask_password(prompt: 'Decryption IV') if iv.nil?
39
+
40
+ yaml_config = PWN::Plugins::Vault.dump(
41
+ file: yaml_config_path,
42
+ key: key,
43
+ iv: iv
44
+ )
45
+ else
46
+ yaml_config = YAML.load_file(yaml_config_path, symbolize_names: true)
47
+ end
48
+ pi.config.p = yaml_config
49
+ Pry.config.p = yaml_config
50
+
51
+ valid_ai_engines = %i[
52
+ grok
53
+ openai
54
+ ollama
55
+ ]
56
+ ai_engine = yaml_config[:ai_engine].to_s.downcase.to_sym
57
+
58
+ raise "ERROR: Unsupported AI Engine: #{ai_engine} in #{yaml_config_path}. Supported AI Engines:\n#{valid_ai_engines.inspect}" unless valid_ai_engines.include?(ai_engine)
59
+
60
+ pi.config.pwn_ai_engine = ai_engine
61
+ Pry.config.pwn_ai_engine = ai_engine
62
+
63
+ pi.config.pwn_ai_base_uri = pi.config.p[ai_engine][:base_uri]
64
+ Pry.config.pwn_ai_base_uri = pi.config.pwn_ai_base_uri
65
+
66
+ pi.config.pwn_ai_key = pi.config.p[ai_engine][:key]
67
+ Pry.config.pwn_ai_key = pi.config.pwn_ai_key
68
+
69
+ pi.config.pwn_ai_model = pi.config.p[ai_engine][:model]
70
+ Pry.config.pwn_ai_model = pi.config.pwn_ai_model
71
+
72
+ pi.config.pwn_ai_system_role_content = pi.config.p[ai_engine][:system_role_content]
73
+ Pry.config.pwn_ai_system_role_content = pi.config.pwn_ai_system_role_content
74
+
75
+ pi.config.pwn_ai_temp = pi.config.p[ai_engine][:temp]
76
+ Pry.config.pwn_ai_temp = pi.config.pwn_ai_temp
77
+
78
+ pi.config.pwn_asm_arch = pi.config.p[:asm][:arch]
79
+ Pry.config.pwn_asm_arch = pi.config.pwn_asm_arch
80
+
81
+ pi.config.pwn_asm_endian = pi.config.p[:asm][:endian]
82
+ Pry.config.pwn_asm_endian = pi.config.pwn_asm_endian
83
+
84
+ pi.config.pwn_irc = pi.config.p[:irc]
85
+ Pry.config.pwn_irc = pi.config.pwn_irc
86
+
87
+ pi.config.pwn_hunter = pi.config.p[:hunter][:api_key]
88
+ Pry.config.pwn_hunter = pi.config.pwn_hunter
89
+
90
+ pi.config.pwn_shodan = pi.config.p[:shodan][:api_key]
91
+ Pry.config.pwn_shodan = pi.config.pwn_shodan
92
+
93
+ pi.config.reload_config = false
94
+ Pry.config.reload_config = false
95
+
96
+ true
97
+ rescue StandardError => e
98
+ raise e
99
+ end
100
+
11
101
  # Supported Method Parameters::
12
102
  # PWN::Plugins::REPL.refresh_ps1_proc(
13
103
  # mode: 'required - :splat or nil'
@@ -17,6 +107,8 @@ module PWN
17
107
  mode = opts[:mode]
18
108
 
19
109
  proc do |_target_self, _nest_level, pi|
110
+ load_config(opts) if Pry.config.reload_config
111
+
20
112
  pi.config.pwn_repl_line += 1
21
113
  line_pad = format(
22
114
  '%0.3d',
@@ -69,6 +161,7 @@ module PWN
69
161
  # PWN::Plugins::REPL.add_commands
70
162
 
71
163
  public_class_method def self.add_commands
164
+ # Load any existing pwn.yaml configuration file
72
165
  # Define Custom REPL Commands
73
166
  Pry::Commands.create_command 'welcome-banner' do
74
167
  description 'Display the random welcome banner, including basic usage.'
@@ -299,8 +392,7 @@ module PWN
299
392
 
300
393
  response_history = ai_agents[dm_agent.to_sym][:response_history]
301
394
  ai_engine = pi.config.pwn_ai_engine
302
- ai_fqdn = pi.config.pwn_ai_fqdn if ai_engine == :ollama
303
- ai_fqdn ||= ''
395
+ ai_base_uri = pi.config.pwn_ai_base_uri
304
396
  ai_key = pi.config.pwn_ai_key
305
397
  ai_key ||= ''
306
398
  ai_temp = pi.config.pwn_ai_temp
@@ -341,6 +433,7 @@ module PWN
341
433
  case ai_engine
342
434
  when :grok
343
435
  response = PWN::AI::Grok.chat(
436
+ base_uri: ai_base_uri,
344
437
  token: ai_key,
345
438
  model: model,
346
439
  temp: ai_temp,
@@ -351,7 +444,7 @@ module PWN
351
444
  )
352
445
  when :ollama
353
446
  response = PWN::AI::Ollama.chat(
354
- fqdn: ai_fqdn,
447
+ base_uri: ai_base_uri,
355
448
  token: ai_key,
356
449
  model: model,
357
450
  temp: ai_temp,
@@ -362,6 +455,7 @@ module PWN
362
455
  )
363
456
  when :openai
364
457
  response = PWN::AI::OpenAI.chat(
458
+ base_uri: ai_base_uri,
365
459
  token: ai_key,
366
460
  model: model,
367
461
  temp: ai_temp,
@@ -502,78 +596,8 @@ module PWN
502
596
 
503
597
  # Initialize pwn.yaml Configuration using :before_session Hook
504
598
  Pry.config.hooks.add_hook(:before_session, :init_opts) do |_output, _binding, pi|
505
- if opts[:yaml_config_path]
506
- yaml_config_path = opts[:yaml_config_path]
507
- raise "ERROR: #{yaml_config_path} does not exist." unless File.exist?(yaml_config_path)
508
-
509
- is_encrypted = PWN::Plugins::Vault.file_encrypted?(file: yaml_config_path)
510
-
511
- if is_encrypted
512
- # TODO: Implement "something you know, something you have, && something you are?"
513
- decryption_file = opts[:decryption_file] ||= "#{Dir.home}/pwn.decryptor.yaml"
514
- yaml_decryptor = YAML.load_file(decryption_file, symbolize_names: true) if File.exist?(decryption_file)
515
-
516
- key = opts[:key] ||= yaml_decryptor[:key] ||= ENV.fetch('PWN_DECRYPTOR_KEY')
517
- key = PWN::Plugins::AuthenticationHelper.mask_password(prompt: 'Decryption Key') if key.nil?
518
-
519
- iv = opts[:iv] ||= yaml_decryptor[:iv] ||= ENV.fetch('PWN_DECRYPTOR_IV')
520
- iv = PWN::Plugins::AuthenticationHelper.mask_password(prompt: 'Decryption IV') if iv.nil?
521
-
522
- yaml_config = PWN::Plugins::Vault.dump(
523
- file: yaml_config_path,
524
- key: key,
525
- iv: iv
526
- )
527
- else
528
- yaml_config = YAML.load_file(yaml_config_path, symbolize_names: true)
529
- end
530
- pi.config.p = yaml_config
531
- Pry.config.p = yaml_config
532
-
533
- valid_ai_engines = %i[
534
- grok
535
- openai
536
- ollama
537
- ]
538
- ai_engine = yaml_config[:ai_engine].to_s.downcase.to_sym
539
-
540
- raise "ERROR: Unsupported AI Engine: #{ai_engine} in #{yaml_config_path}. Supported AI Engines:\n#{valid_ai_engines.inspect}" unless valid_ai_engines.include?(ai_engine)
541
-
542
- pi.config.pwn_ai_engine = ai_engine
543
- Pry.config.pwn_ai_engine = ai_engine
544
-
545
- pi.config.pwn_ai_fqdn = pi.config.p[ai_engine][:fqdn]
546
- Pry.config.pwn_ai_fqdn = pi.config.pwn_ai_fqdn
547
-
548
- pi.config.pwn_ai_key = pi.config.p[ai_engine][:key]
549
- Pry.config.pwn_ai_key = pi.config.pwn_ai_key
550
-
551
- pi.config.pwn_ai_model = pi.config.p[ai_engine][:model]
552
- Pry.config.pwn_ai_model = pi.config.pwn_ai_model
553
-
554
- pi.config.pwn_ai_system_role_content = pi.config.p[ai_engine][:system_role_content]
555
- Pry.config.pwn_ai_system_role_content = pi.config.pwn_ai_system_role_content
556
-
557
- pi.config.pwn_ai_temp = pi.config.p[ai_engine][:temp]
558
- Pry.config.pwn_ai_temp = pi.config.pwn_ai_temp
559
-
560
- pi.config.pwn_asm_arch = pi.config.p[:asm][:arch]
561
- Pry.config.pwn_asm_arch = pi.config.pwn_asm_arch
562
-
563
- pi.config.pwn_asm_endian = pi.config.p[:asm][:endian]
564
- Pry.config.pwn_asm_endian = pi.config.pwn_asm_endian
565
-
566
- pi.config.pwn_irc = pi.config.p[:irc]
567
- Pry.config.pwn_irc = pi.config.pwn_irc
568
-
569
- pi.config.pwn_hunter = pi.config.p[:hunter][:api_key]
570
- Pry.config.pwn_hunter = pi.config.pwn_hunter
571
-
572
- pi.config.pwn_shodan = pi.config.p[:shodan][:api_key]
573
- Pry.config.pwn_shodan = pi.config.pwn_shodan
574
-
575
- true
576
- end
599
+ opts[:pi] = pi
600
+ load_config(opts)
577
601
  end
578
602
 
579
603
  Pry.config.hooks.add_hook(:after_read, :pwn_asm_hook) do |request, pi|
@@ -633,9 +657,12 @@ module PWN
633
657
  system_role_content = pi.config.pwn_ai_system_role_content
634
658
  temp = pi.config.pwn_ai_temp
635
659
 
660
+ ai_base_uri = pi.config.pwn_ai_base_uri
661
+
636
662
  case ai_engine
637
663
  when :grok
638
664
  response = PWN::AI::Grok.chat(
665
+ base_uri: ai_base_uri,
639
666
  token: ai_key,
640
667
  model: model,
641
668
  system_role_content: system_role_content,
@@ -646,10 +673,8 @@ module PWN
646
673
  spinner: true
647
674
  )
648
675
  when :ollama
649
- fqdn = pi.config.pwn_ai_fqdn
650
-
651
676
  response = PWN::AI::Ollama.chat(
652
- fqdn: fqdn,
677
+ base_uri: ai_base_uri,
653
678
  token: ai_key,
654
679
  model: model,
655
680
  system_role_content: system_role_content,
@@ -661,6 +686,7 @@ module PWN
661
686
  )
662
687
  when :openai
663
688
  response = PWN::AI::OpenAI.chat(
689
+ base_uri: ai_base_uri,
664
690
  token: ai_key,
665
691
  model: model,
666
692
  system_role_content: system_role_content,
@@ -721,8 +747,11 @@ module PWN
721
747
  # Define PS1 Prompt
722
748
  Pry.config.pwn_repl_line = 0
723
749
  Pry.config.prompt_name = :pwn
724
- arrow_ps1_proc = refresh_ps1_proc
725
- splat_ps1_proc = refresh_ps1_proc(mode: :splat)
750
+ arrow_ps1_proc = refresh_ps1_proc(opts)
751
+
752
+ opts[:mode] = :splat
753
+ splat_ps1_proc = refresh_ps1_proc(opts)
754
+
726
755
  ps1 = [arrow_ps1_proc, splat_ps1_proc]
727
756
  prompt = Pry::Prompt.new(:pwn, 'PWN Prototyping REPL', ps1)
728
757
 
@@ -172,6 +172,9 @@ module PWN
172
172
  relative_editor = File.basename(editor)
173
173
  system(relative_editor, file)
174
174
 
175
+ # If the Pry object exists, set reload_config to true
176
+ Pry.config.reload_config = true if defined?(Pry)
177
+
175
178
  encrypt(
176
179
  file: file,
177
180
  key: key,
@@ -206,6 +206,7 @@ module PWN
206
206
  api_key = zap_obj[:api_key].to_s.scrub
207
207
  keyword = opts[:keyword]
208
208
  return_as = opts[:return_as] ||= :base64
209
+ raise 'ERROR: return_as must be :base64 or :har' unless %i[base64 har].include?(return_as)
209
210
 
210
211
  entries = []
211
212
  start = 0
@@ -229,16 +230,16 @@ module PWN
229
230
  start += count
230
231
  end
231
232
 
232
- case return_as
233
- when :har
234
- if keyword
235
- entries = har_sitemap.select do |site|
236
- json_request = site[:request].to_json
237
- json_request.include?(keyword)
238
- end
233
+ if keyword
234
+ entries = har_sitemap.select do |site|
235
+ json_request = site[:request].to_json
236
+ json_request.include?(keyword)
239
237
  end
240
- when :base64
238
+ end
239
+
240
+ if return_as == :base64
241
241
  # Deduplicate entries based on method + url
242
+ base64_entries = []
242
243
  entries.each do |entry|
243
244
  entry_hash = {}
244
245
  req = entry[:request]
@@ -279,17 +280,9 @@ module PWN
279
280
  entry_hash[:request] = encoded_req
280
281
  entry_hash[:response] = encoded_res
281
282
  entry_hash[:http_service] = http_service
282
- entries.push(entry_hash)
283
+ base64_entries.push(entry_hash)
283
284
  end
284
-
285
- if keyword
286
- entries = entries.select do |site|
287
- deccoded_request = Base64.strict_decode64(site[:request])
288
- deccoded_request.include?(keyword)
289
- end
290
- end
291
- else
292
- raise "ERROR: Invalid return_as option #{return_as}. Valid options are :base64 or :har"
285
+ entries = base64_entries
293
286
  end
294
287
 
295
288
  entries.uniq
@@ -18,9 +18,9 @@ module PWN
18
18
  # ai_engine: 'optional - AI engine to use for analysis (:grok, :ollama, or :openai)',
19
19
  # ai_model: 'optionnal - AI Model to Use for Respective AI Engine (e.g., grok-4i-0709, chargpt-4o-latest, llama-3.1, etc.)',
20
20
  # ai_key: 'optional - AI Key/Token for Respective AI Engine',
21
- # ai_fqdn: 'optional - AI FQDN (Only Required for "ollama" AI Engine)',
21
+ # ai_base_uri: 'optional - AI FQDN (Only Required for "ollama" AI Engine)',
22
22
  # ai_system_role_content: 'optional - AI System Role Content (Defaults to "Confidence score of 0-10 this is vulnerable (0 being not vulnerable, moving upwards in confidence of exploitation). Provide additional context to assist penetration tester assessment.")',
23
- # ai_temp: 'optional - AI Temperature (Defaults to 0.9)'
23
+ # ai_temp: 'optional - AI Temperature (Defaults to 0.1)'
24
24
  # )
25
25
 
26
26
  public_class_method def self.generate(opts = {})
@@ -37,15 +37,15 @@ module PWN
37
37
  valid_ai_engines = %i[grok ollama openai]
38
38
  raise "ERROR: Invalid AI Engine. Valid options are: #{valid_ai_engines.join(', ')}" unless valid_ai_engines.include?(ai_engine)
39
39
 
40
- ai_fqdn = opts[:ai_fqdn]
41
- raise 'ERROR: FQDN for Ollama AI engine is required.' if ai_engine == :ollama && ai_fqdn.nil?
40
+ ai_base_uri = opts[:ai_base_uri]
41
+ raise 'ERROR: FQDN for Ollama AI engine is required.' if ai_engine == :ollama && ai_base_uri.nil?
42
42
 
43
43
  ai_model = opts[:ai_model]
44
44
  raise 'ERROR: AI Model is required for AI engine ollama.' if ai_engine == :ollama && ai_model.nil?
45
45
 
46
46
  ai_key = opts[:ai_key] ||= PWN::Plugins::AuthenticationHelper.mask_password(prompt: "#{ai_engine} Token")
47
47
  ai_system_role_content = opts[:ai_system_role_content] ||= 'Confidence score of 0-10 this is vulnerable (0 being not vulnerable, moving upwards in confidence of exploitation). Provide additional context to assist penetration tester assessment.'
48
- ai_temp = opts[:ai_temp] ||= 0.9
48
+ ai_temp = opts[:ai_temp] ||= 0.1
49
49
 
50
50
  puts "Analyzing source code using AI engine: #{ai_engine}\nModel: #{ai_model}\nSystem Role Content: #{ai_system_role_content}\nTemperature: #{ai_temp}"
51
51
  end
@@ -75,6 +75,7 @@ module PWN
75
75
  case ai_engine
76
76
  when :grok
77
77
  response = PWN::AI::Grok.chat(
78
+ base_uri: ai_base_uri,
78
79
  token: ai_key,
79
80
  model: ai_model,
80
81
  system_role_content: ai_system_role_content,
@@ -84,7 +85,7 @@ module PWN
84
85
  )
85
86
  when :ollama
86
87
  response = PWN::AI::Ollama.chat(
87
- fqdn: ai_fqdn,
88
+ base_uri: ai_base_uri,
88
89
  token: ai_key,
89
90
  model: ai_model,
90
91
  system_role_content: ai_system_role_content,
@@ -94,6 +95,7 @@ module PWN
94
95
  )
95
96
  when :openai
96
97
  response = PWN::AI::OpenAI.chat(
98
+ base_uri: ai_base_uri,
97
99
  token: ai_key,
98
100
  model: ai_model,
99
101
  system_role_content: ai_system_role_content,
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.418'
4
+ VERSION = '0.5.421'
5
5
  end
@@ -536,7 +536,7 @@
536
536
  {"messages":[{"role":"user","content":"PWN::Plugins::BurpSuite.get_proxy_listeners Usage"},{"role":"assistant","content":"`PWN::Plugins::BurpSuite.get_proxy_listeners`: Supported Method Parameters\n\njson_proxy_listeners = PWN::Plugins::BurpSuite.get_proxy_listeners(\n\nburp_obj: 'required - burp_obj returned by #start method'\n\n)\n"}]}
537
537
  {"messages":[{"role":"user","content":"PWN::Plugins::BurpSuite.get_repeater_tab Usage"},{"role":"assistant","content":"`PWN::Plugins::BurpSuite.get_repeater_tab`: Supported Method Parameters\n\nrepeater_tab = PWN::Plugins::BurpSuite.get_repeater_tab(\n\nburp_obj: 'required - burp_obj returned by #start method',\nid: 'required - id of the repeater tab to get'\n\n)\n"}]}
538
538
  {"messages":[{"role":"user","content":"PWN::Plugins::BurpSuite.get_scan_issues Usage"},{"role":"assistant","content":"`PWN::Plugins::BurpSuite.get_scan_issues`: Supported Method Parameters\n\njson_scan_issues = PWN::Plugins::BurpSuite.get_scan_issues(\n\nburp_obj: 'required - burp_obj returned by #start method'\n\n)\n"}]}
539
- {"messages":[{"role":"user","content":"PWN::Plugins::BurpSuite.get_sitemap Usage"},{"role":"assistant","content":"`PWN::Plugins::BurpSuite.get_sitemap`: Supported Method Parameters\n\njson_sitemap = PWN::Plugins::BurpSuite.get_sitemap(\n\nburp_obj: 'required - burp_obj returned by #start method',\nkeyword: 'optional - keyword to filter sitemap entries (default: nil)'\n\n)\n"}]}
539
+ {"messages":[{"role":"user","content":"PWN::Plugins::BurpSuite.get_sitemap Usage"},{"role":"assistant","content":"`PWN::Plugins::BurpSuite.get_sitemap`: Supported Method Parameters\n\njson_sitemap = PWN::Plugins::BurpSuite.get_sitemap(\n\nburp_obj: 'required - burp_obj returned by #start method',\nkeyword: 'optional - keyword to filter sitemap entries (default: nil)',\nreturn_as: 'optional - :base64 or :har (defaults to :base64)'\n\n)\n"}]}
540
540
  {"messages":[{"role":"user","content":"PWN::Plugins::BurpSuite.help Usage"},{"role":"assistant","content":"`PWN::Plugins::BurpSuite.help`: "}]}
541
541
  {"messages":[{"role":"user","content":"PWN::Plugins::BurpSuite.import_openapi_to_sitemap Usage"},{"role":"assistant","content":"`PWN::Plugins::BurpSuite.import_openapi_to_sitemap`: "}]}
542
542
  {"messages":[{"role":"user","content":"PWN::Plugins::BurpSuite.in_scope Usage"},{"role":"assistant","content":"`PWN::Plugins::BurpSuite.in_scope`: Supported Method Parameters\n\nuri_in_scope = PWN::Plugins::BurpSuite.in_scope(\n\nburp_obj: 'required - burp_obj returned by #start method',\nuri: 'required - URI to determine if in scope'\n\n)\n"}]}
@@ -1069,7 +1069,7 @@
1069
1069
  {"messages":[{"role":"user","content":"PWN::Reports::Phone.generate Usage"},{"role":"assistant","content":"`PWN::Reports::Phone.generate`: Supported Method Parameters\n\nPWN::Reports::Phone.generate(\n\ndir_path: dir_path,\nresults_hash: results_hash\n\n)\n"}]}
1070
1070
  {"messages":[{"role":"user","content":"PWN::Reports::Phone.help Usage"},{"role":"assistant","content":"`PWN::Reports::Phone.help`: "}]}
1071
1071
  {"messages":[{"role":"user","content":"PWN::Reports::SAST.authors Usage"},{"role":"assistant","content":"`PWN::Reports::SAST.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1072
- {"messages":[{"role":"user","content":"PWN::Reports::SAST.generate Usage"},{"role":"assistant","content":"`PWN::Reports::SAST.generate`: Supported Method Parameters\n\nPWN::Reports::SAST.generate(\n\ndir_path: 'optional - Directory path to save the report (defaults to .)',\nresults_hash: 'optional - Hash containing the results of the SAST analysis (defaults to empty hash structure)',\nreport_name: 'optional - Name of the report file (defaults to current directory name)',\nai_engine: 'optional - AI engine to use for analysis (:grok, :ollama, or :openai)',\nai_model: 'optionnal - AI Model to Use for Respective AI Engine (e.g., grok-4i-0709, chargpt-4o-latest, llama-3.1, etc.)',\nai_key: 'optional - AI Key/Token for Respective AI Engine',\nai_fqdn: 'optional - AI FQDN (Only Required for \"ollama\" AI Engine)',\nai_system_role_content: 'optional - AI System Role Content (Defaults to \"Is this code vulnerable or a false positive? Valid responses are only: \"VULNERABLE\" or \"FALSE+\". DO NOT PROVIDE ANY OTHER TEXT OR EXPLANATIONS.\")',\nai_temp: 'optional - AI Temperature (Defaults to 0.9)'\n\n)\n"}]}
1072
+ {"messages":[{"role":"user","content":"PWN::Reports::SAST.generate Usage"},{"role":"assistant","content":"`PWN::Reports::SAST.generate`: Supported Method Parameters\n\nPWN::Reports::SAST.generate(\n\ndir_path: 'optional - Directory path to save the report (defaults to .)',\nresults_hash: 'optional - Hash containing the results of the SAST analysis (defaults to empty hash structure)',\nreport_name: 'optional - Name of the report file (defaults to current directory name)',\nai_engine: 'optional - AI engine to use for analysis (:grok, :ollama, or :openai)',\nai_model: 'optionnal - AI Model to Use for Respective AI Engine (e.g., grok-4i-0709, chargpt-4o-latest, llama-3.1, etc.)',\nai_key: 'optional - AI Key/Token for Respective AI Engine',\nai_fqdn: 'optional - AI FQDN (Only Required for \"ollama\" AI Engine)',\nai_system_role_content: 'optional - AI System Role Content (Defaults to \"Confidence score of 0-10 this is vulnerable (0 being not vulnerable, moving upwards in confidence of exploitation). Provide additional context to assist penetration tester assessment.\")',\nai_temp: 'optional - AI Temperature (Defaults to 0.1)'\n\n)\n"}]}
1073
1073
  {"messages":[{"role":"user","content":"PWN::Reports::SAST.help Usage"},{"role":"assistant","content":"`PWN::Reports::SAST.help`: "}]}
1074
1074
  {"messages":[{"role":"user","content":"PWN::Reports::URIBuster.authors Usage"},{"role":"assistant","content":"`PWN::Reports::URIBuster.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1075
1075
  {"messages":[{"role":"user","content":"PWN::Reports::URIBuster.generate Usage"},{"role":"assistant","content":"`PWN::Reports::URIBuster.generate`: Supported Method Parameters\n\nPWN::Reports::URIBuster.generate(\n\ndir_path: dir_path,\nresults_hash: results_hash\n\n)\n"}]}
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.418
4
+ version: 0.5.421
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 8.0.2.1
18
+ version: 8.0.3
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 8.0.2.1
25
+ version: 8.0.3
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: anemone
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -309,14 +309,14 @@ dependencies:
309
309
  requirements:
310
310
  - - '='
311
311
  - !ruby/object:Gem::Version
312
- version: 1.8.5
312
+ version: 1.8.6
313
313
  type: :runtime
314
314
  prerelease: false
315
315
  version_requirements: !ruby/object:Gem::Requirement
316
316
  requirements:
317
317
  - - '='
318
318
  - !ruby/object:Gem::Version
319
- version: 1.8.5
319
+ version: 1.8.6
320
320
  - !ruby/object:Gem::Dependency
321
321
  name: gist
322
322
  requirement: !ruby/object:Gem::Requirement
@@ -407,14 +407,14 @@ dependencies:
407
407
  requirements:
408
408
  - - '='
409
409
  - !ruby/object:Gem::Version
410
- version: 2.14.1
410
+ version: 2.15.0
411
411
  type: :runtime
412
412
  prerelease: false
413
413
  version_requirements: !ruby/object:Gem::Requirement
414
414
  requirements:
415
415
  - - '='
416
416
  - !ruby/object:Gem::Version
417
- version: 2.14.1
417
+ version: 2.15.0
418
418
  - !ruby/object:Gem::Dependency
419
419
  name: jsonpath
420
420
  requirement: !ruby/object:Gem::Requirement
@@ -505,14 +505,14 @@ dependencies:
505
505
  requirements:
506
506
  - - '='
507
507
  - !ruby/object:Gem::Version
508
- version: 0.0.125
508
+ version: 0.0.126
509
509
  type: :runtime
510
510
  prerelease: false
511
511
  version_requirements: !ruby/object:Gem::Requirement
512
512
  requirements:
513
513
  - - '='
514
514
  - !ruby/object:Gem::Version
515
- version: 0.0.125
515
+ version: 0.0.126
516
516
  - !ruby/object:Gem::Dependency
517
517
  name: metasm
518
518
  requirement: !ruby/object:Gem::Requirement
@@ -939,14 +939,14 @@ dependencies:
939
939
  requirements:
940
940
  - - '='
941
941
  - !ruby/object:Gem::Version
942
- version: 1.80.2
942
+ version: 1.81.1
943
943
  type: :runtime
944
944
  prerelease: false
945
945
  version_requirements: !ruby/object:Gem::Requirement
946
946
  requirements:
947
947
  - - '='
948
948
  - !ruby/object:Gem::Version
949
- version: 1.80.2
949
+ version: 1.81.1
950
950
  - !ruby/object:Gem::Dependency
951
951
  name: rubocop-rake
952
952
  requirement: !ruby/object:Gem::Requirement
@@ -1065,14 +1065,14 @@ dependencies:
1065
1065
  requirements:
1066
1066
  - - '='
1067
1067
  - !ruby/object:Gem::Version
1068
- version: 2.7.0
1068
+ version: 3.0.0
1069
1069
  type: :runtime
1070
1070
  prerelease: false
1071
1071
  version_requirements: !ruby/object:Gem::Requirement
1072
1072
  requirements:
1073
1073
  - - '='
1074
1074
  - !ruby/object:Gem::Version
1075
- version: 2.7.0
1075
+ version: 3.0.0
1076
1076
  - !ruby/object:Gem::Dependency
1077
1077
  name: socksify
1078
1078
  requirement: !ruby/object:Gem::Requirement
@@ -1107,14 +1107,14 @@ dependencies:
1107
1107
  requirements:
1108
1108
  - - '='
1109
1109
  - !ruby/object:Gem::Version
1110
- version: 2.7.3
1110
+ version: 2.7.4
1111
1111
  type: :runtime
1112
1112
  prerelease: false
1113
1113
  version_requirements: !ruby/object:Gem::Requirement
1114
1114
  requirements:
1115
1115
  - - '='
1116
1116
  - !ruby/object:Gem::Version
1117
- version: 2.7.3
1117
+ version: 2.7.4
1118
1118
  - !ruby/object:Gem::Dependency
1119
1119
  name: thin
1120
1120
  requirement: !ruby/object:Gem::Requirement