pwn 0.5.708 → 0.5.710

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.
Files changed (450) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/documentation/Installation.md +1 -0
  4. data/etc/default_skills/exploitdev/SKILL.md +38 -0
  5. data/etc/default_skills/pwn/ai/agent/extrospection/osint/bridges/SKILL.md +30 -8
  6. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/SKILL.md +30 -8
  7. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/references/urls.md +1 -1
  8. data/etc/default_skills/pwn/ai/agent/extrospection/references/urls.md +0 -1
  9. data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
  10. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +49 -0
  11. data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
  12. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
  13. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
  14. data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +58 -0
  15. data/etc/default_skills/pwn/plugins/credential_attack/references/urls.md +3 -0
  16. data/etc/default_skills/pwn/plugins/exploit_db/SKILL.md +49 -0
  17. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +63 -0
  18. data/etc/default_skills/pwn/plugins/frida/SKILL.md +51 -0
  19. data/etc/default_skills/pwn/plugins/fuzz/SKILL.md +2 -0
  20. data/etc/default_skills/pwn/plugins/gdb/SKILL.md +53 -0
  21. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
  22. data/etc/default_skills/pwn/plugins/k8s/SKILL.md +51 -0
  23. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +50 -0
  24. data/etc/default_skills/pwn/plugins/preflight_checker/SKILL.md +59 -0
  25. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +53 -0
  26. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
  27. data/etc/default_skills/pwn/plugins/recon/SKILL.md +57 -0
  28. data/etc/default_skills/pwn/plugins/recon/references/urls.md +6 -0
  29. data/etc/default_skills/pwn/plugins/semgrep/SKILL.md +48 -0
  30. data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
  31. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
  32. data/etc/default_skills/pwn/plugins/volatility/SKILL.md +49 -0
  33. data/lib/pwn/ai/agent/assembly.rb +4 -1
  34. data/lib/pwn/ai/agent/btc.rb +4 -1
  35. data/lib/pwn/ai/agent/burp_suite.rb +5 -2
  36. data/lib/pwn/ai/agent/curriculum.rb +89 -30
  37. data/lib/pwn/ai/agent/dispatch.rb +27 -16
  38. data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
  39. data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
  40. data/lib/pwn/ai/agent/extrospection.rb +185 -60
  41. data/lib/pwn/ai/agent/gqrx.rb +4 -1
  42. data/lib/pwn/ai/agent/hacker_one.rb +5 -2
  43. data/lib/pwn/ai/agent/learning.rb +142 -25
  44. data/lib/pwn/ai/agent/loop.rb +53 -46
  45. data/lib/pwn/ai/agent/metrics.rb +133 -23
  46. data/lib/pwn/ai/agent/mistakes.rb +126 -17
  47. data/lib/pwn/ai/agent/open_goal.rb +25 -9
  48. data/lib/pwn/ai/agent/policy.rb +158 -18
  49. data/lib/pwn/ai/agent/prompt_builder.rb +21 -11
  50. data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
  51. data/lib/pwn/ai/agent/reflect.rb +9 -5
  52. data/lib/pwn/ai/agent/registry.rb +65 -12
  53. data/lib/pwn/ai/agent/result.rb +19 -10
  54. data/lib/pwn/ai/agent/reward.rb +150 -32
  55. data/lib/pwn/ai/agent/sast.rb +4 -1
  56. data/lib/pwn/ai/agent/swarm.rb +72 -36
  57. data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
  58. data/lib/pwn/ai/agent/tool_guard.rb +105 -6
  59. data/lib/pwn/ai/agent/tools/sessions.rb +8 -1
  60. data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
  61. data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
  62. data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
  63. data/lib/pwn/ai/agent.rb +4 -0
  64. data/lib/pwn/ai/anthropic.rb +41 -7
  65. data/lib/pwn/ai/gemini.rb +21 -11
  66. data/lib/pwn/ai/grok.rb +44 -6
  67. data/lib/pwn/ai/http_retry.rb +40 -12
  68. data/lib/pwn/ai/ollama.rb +19 -10
  69. data/lib/pwn/ai/open_ai.rb +81 -30
  70. data/lib/pwn/ai/open_web_ui.rb +20 -14
  71. data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
  72. data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
  73. data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
  74. data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
  75. data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
  76. data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
  77. data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
  78. data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
  79. data/lib/pwn/ai/red_team/overreliance.rb +7 -1
  80. data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
  81. data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
  82. data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
  83. data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
  84. data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
  85. data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
  86. data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
  87. data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
  88. data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
  89. data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
  90. data/lib/pwn/ai/red_team.rb +4 -0
  91. data/lib/pwn/ai.rb +4 -0
  92. data/lib/pwn/aws/acm.rb +5 -2
  93. data/lib/pwn/aws/api_gateway.rb +10 -7
  94. data/lib/pwn/aws/app_stream.rb +5 -2
  95. data/lib/pwn/aws/application_auto_scaling.rb +5 -2
  96. data/lib/pwn/aws/application_discovery_service.rb +5 -2
  97. data/lib/pwn/aws/auto_scaling.rb +5 -2
  98. data/lib/pwn/aws/batch.rb +5 -2
  99. data/lib/pwn/aws/budgets.rb +5 -2
  100. data/lib/pwn/aws/cloud_formation.rb +5 -2
  101. data/lib/pwn/aws/cloud_front.rb +7 -4
  102. data/lib/pwn/aws/cloud_hsm.rb +5 -2
  103. data/lib/pwn/aws/cloud_search.rb +5 -2
  104. data/lib/pwn/aws/cloud_search_domain.rb +5 -2
  105. data/lib/pwn/aws/cloud_trail.rb +5 -2
  106. data/lib/pwn/aws/cloud_watch.rb +5 -2
  107. data/lib/pwn/aws/cloud_watch_events.rb +5 -2
  108. data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
  109. data/lib/pwn/aws/code_build.rb +5 -2
  110. data/lib/pwn/aws/code_commit.rb +5 -2
  111. data/lib/pwn/aws/code_deploy.rb +5 -2
  112. data/lib/pwn/aws/code_pipeline.rb +5 -2
  113. data/lib/pwn/aws/cognito_identity.rb +5 -2
  114. data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
  115. data/lib/pwn/aws/cognito_sync.rb +5 -2
  116. data/lib/pwn/aws/config_service.rb +5 -2
  117. data/lib/pwn/aws/data_pipleline.rb +5 -2
  118. data/lib/pwn/aws/database_migration_service.rb +5 -2
  119. data/lib/pwn/aws/device_farm.rb +5 -2
  120. data/lib/pwn/aws/direct_connect.rb +5 -2
  121. data/lib/pwn/aws/directory_service.rb +5 -2
  122. data/lib/pwn/aws/dynamo_db.rb +5 -2
  123. data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
  124. data/lib/pwn/aws/ec2.rb +5 -2
  125. data/lib/pwn/aws/ecr.rb +5 -2
  126. data/lib/pwn/aws/ecs.rb +5 -2
  127. data/lib/pwn/aws/efs.rb +5 -2
  128. data/lib/pwn/aws/elasti_cache.rb +5 -2
  129. data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
  130. data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
  131. data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
  132. data/lib/pwn/aws/elastic_transcoder.rb +5 -2
  133. data/lib/pwn/aws/elasticsearch_service.rb +5 -2
  134. data/lib/pwn/aws/emr.rb +5 -2
  135. data/lib/pwn/aws/firehose.rb +5 -2
  136. data/lib/pwn/aws/game_lift.rb +5 -2
  137. data/lib/pwn/aws/glacier.rb +6 -3
  138. data/lib/pwn/aws/health.rb +5 -2
  139. data/lib/pwn/aws/iam.rb +10 -4
  140. data/lib/pwn/aws/import_export.rb +5 -2
  141. data/lib/pwn/aws/inspector.rb +5 -2
  142. data/lib/pwn/aws/iot.rb +5 -2
  143. data/lib/pwn/aws/iot_data_plane.rb +5 -2
  144. data/lib/pwn/aws/kinesis.rb +5 -2
  145. data/lib/pwn/aws/kinesis_analytics.rb +5 -2
  146. data/lib/pwn/aws/kms.rb +5 -2
  147. data/lib/pwn/aws/lambda.rb +5 -2
  148. data/lib/pwn/aws/lambda_preview.rb +5 -2
  149. data/lib/pwn/aws/lex.rb +5 -2
  150. data/lib/pwn/aws/lightsail.rb +5 -2
  151. data/lib/pwn/aws/machine_learning.rb +5 -2
  152. data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
  153. data/lib/pwn/aws/marketplace_metering.rb +5 -2
  154. data/lib/pwn/aws/ops_works.rb +5 -2
  155. data/lib/pwn/aws/ops_works_cm.rb +5 -2
  156. data/lib/pwn/aws/pinpoint.rb +5 -2
  157. data/lib/pwn/aws/polly.rb +5 -2
  158. data/lib/pwn/aws/rds.rb +5 -2
  159. data/lib/pwn/aws/redshift.rb +5 -2
  160. data/lib/pwn/aws/rekognition.rb +5 -2
  161. data/lib/pwn/aws/route53.rb +5 -2
  162. data/lib/pwn/aws/route53_domains.rb +5 -2
  163. data/lib/pwn/aws/s3.rb +5 -2
  164. data/lib/pwn/aws/service_catalog.rb +5 -2
  165. data/lib/pwn/aws/ses.rb +5 -2
  166. data/lib/pwn/aws/shield.rb +5 -2
  167. data/lib/pwn/aws/simple_db.rb +5 -2
  168. data/lib/pwn/aws/sms.rb +5 -2
  169. data/lib/pwn/aws/snowball.rb +5 -2
  170. data/lib/pwn/aws/sns.rb +5 -2
  171. data/lib/pwn/aws/sqs.rb +5 -2
  172. data/lib/pwn/aws/ssm.rb +5 -2
  173. data/lib/pwn/aws/states.rb +5 -2
  174. data/lib/pwn/aws/storage_gateway.rb +5 -2
  175. data/lib/pwn/aws/sts.rb +4 -1
  176. data/lib/pwn/aws/support.rb +5 -2
  177. data/lib/pwn/aws/swf.rb +5 -2
  178. data/lib/pwn/aws/waf.rb +5 -2
  179. data/lib/pwn/aws/waf_regional.rb +5 -2
  180. data/lib/pwn/aws/workspaces.rb +5 -2
  181. data/lib/pwn/aws/x_ray.rb +5 -2
  182. data/lib/pwn/aws.rb +4 -0
  183. data/lib/pwn/banner/anon.rb +3 -0
  184. data/lib/pwn/banner/bubble.rb +3 -0
  185. data/lib/pwn/banner/cheshire.rb +3 -0
  186. data/lib/pwn/banner/code_cave.rb +3 -0
  187. data/lib/pwn/banner/dont_panic.rb +3 -0
  188. data/lib/pwn/banner/f_society.rb +3 -0
  189. data/lib/pwn/banner/fork_bomb.rb +3 -0
  190. data/lib/pwn/banner/jmp_esp.rb +3 -0
  191. data/lib/pwn/banner/matrix.rb +5 -1
  192. data/lib/pwn/banner/ninja.rb +3 -0
  193. data/lib/pwn/banner/off_the_air.rb +3 -0
  194. data/lib/pwn/banner/pirate.rb +3 -0
  195. data/lib/pwn/banner/radare2.rb +3 -0
  196. data/lib/pwn/banner/radare2_ai.rb +3 -0
  197. data/lib/pwn/banner/white_rabbit.rb +3 -0
  198. data/lib/pwn/banner.rb +6 -2
  199. data/lib/pwn/blockchain/btc.rb +8 -3
  200. data/lib/pwn/blockchain/eth.rb +10 -3
  201. data/lib/pwn/blockchain.rb +4 -0
  202. data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
  203. data/lib/pwn/bounty.rb +4 -0
  204. data/lib/pwn/config.rb +79 -13
  205. data/lib/pwn/cron.rb +297 -20
  206. data/lib/pwn/driver.rb +2 -18
  207. data/lib/pwn/ffi/adalm_pluto.rb +65 -11
  208. data/lib/pwn/ffi/fftw.rb +31 -6
  209. data/lib/pwn/ffi/hack_rf.rb +59 -8
  210. data/lib/pwn/ffi/liquid.rb +63 -10
  211. data/lib/pwn/ffi/rtl_sdr.rb +35 -5
  212. data/lib/pwn/ffi/soapy_sdr.rb +60 -10
  213. data/lib/pwn/ffi/stdio.rb +7 -8
  214. data/lib/pwn/ffi/volk.rb +36 -7
  215. data/lib/pwn/ffi.rb +12 -0
  216. data/lib/pwn/memory.rb +136 -16
  217. data/lib/pwn/memory_index.rb +34 -19
  218. data/lib/pwn/migrate.rb +34 -24
  219. data/lib/pwn/module_skills.rb +39 -8
  220. data/lib/pwn/plugins/aflplusplus.rb +72 -0
  221. data/lib/pwn/plugins/android.rb +71 -245
  222. data/lib/pwn/plugins/artifact_registry.rb +71 -0
  223. data/lib/pwn/plugins/assembly.rb +9 -4
  224. data/lib/pwn/plugins/authentication_helper.rb +8 -5
  225. data/lib/pwn/plugins/baresip.rb +59 -12
  226. data/lib/pwn/plugins/basic_auth.rb +9 -3
  227. data/lib/pwn/plugins/beef.rb +28 -18
  228. data/lib/pwn/plugins/binary_parser.rb +133 -0
  229. data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
  230. data/lib/pwn/plugins/burp_suite.rb +98 -68
  231. data/lib/pwn/plugins/bus_pirate.rb +15 -8
  232. data/lib/pwn/plugins/char.rb +33 -3
  233. data/lib/pwn/plugins/credential_attack.rb +158 -0
  234. data/lib/pwn/plugins/credit_card.rb +6 -1
  235. data/lib/pwn/plugins/dao_ldap.rb +19 -13
  236. data/lib/pwn/plugins/dao_mongo.rb +11 -5
  237. data/lib/pwn/plugins/dao_postgres.rb +28 -19
  238. data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
  239. data/lib/pwn/plugins/defect_dojo.rb +38 -22
  240. data/lib/pwn/plugins/detect_os.rb +5 -0
  241. data/lib/pwn/plugins/ein.rb +3 -0
  242. data/lib/pwn/plugins/exploit_db.rb +69 -0
  243. data/lib/pwn/plugins/exploit_dev.rb +330 -0
  244. data/lib/pwn/plugins/file_fu.rb +11 -8
  245. data/lib/pwn/plugins/frida.rb +112 -0
  246. data/lib/pwn/plugins/fuzz.rb +42 -6
  247. data/lib/pwn/plugins/gdb.rb +115 -0
  248. data/lib/pwn/plugins/git.rb +19 -14
  249. data/lib/pwn/plugins/github.rb +38 -15
  250. data/lib/pwn/plugins/google_workspace.rb +188 -45
  251. data/lib/pwn/plugins/hacker_one.rb +159 -35
  252. data/lib/pwn/plugins/hunter.rb +6 -3
  253. data/lib/pwn/plugins/ip_info.rb +9 -4
  254. data/lib/pwn/plugins/irc.rb +28 -15
  255. data/lib/pwn/plugins/jenkins.rb +65 -57
  256. data/lib/pwn/plugins/jira_data_center.rb +30 -22
  257. data/lib/pwn/plugins/jobs.rb +110 -0
  258. data/lib/pwn/plugins/json_pathify.rb +9 -5
  259. data/lib/pwn/plugins/k8s.rb +73 -0
  260. data/lib/pwn/plugins/log.rb +113 -13
  261. data/lib/pwn/plugins/mail_agent.rb +87 -79
  262. data/lib/pwn/plugins/metasploit.rb +11 -6
  263. data/lib/pwn/plugins/monkey_patch.rb +3 -0
  264. data/lib/pwn/plugins/msr206.rb +42 -28
  265. data/lib/pwn/plugins/nessus_cloud.rb +44 -4
  266. data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
  267. data/lib/pwn/plugins/nmap_it.rb +14 -34
  268. data/lib/pwn/plugins/nuclei.rb +90 -0
  269. data/lib/pwn/plugins/oauth2.rb +11 -5
  270. data/lib/pwn/plugins/ocr.rb +3 -0
  271. data/lib/pwn/plugins/open_api.rb +5 -2
  272. data/lib/pwn/plugins/openvas.rb +33 -25
  273. data/lib/pwn/plugins/packet.rb +152 -31
  274. data/lib/pwn/plugins/pdf_parse.rb +5 -2
  275. data/lib/pwn/plugins/pony.rb +86 -1
  276. data/lib/pwn/plugins/preflight_checker.rb +166 -0
  277. data/lib/pwn/plugins/process_tube.rb +139 -0
  278. data/lib/pwn/plugins/ps.rb +7 -1
  279. data/lib/pwn/plugins/pwn_logger.rb +6 -2
  280. data/lib/pwn/plugins/rabbit_mq.rb +12 -7
  281. data/lib/pwn/plugins/radare2.rb +253 -0
  282. data/lib/pwn/plugins/recon.rb +196 -0
  283. data/lib/pwn/plugins/repl.rb +122 -1
  284. data/lib/pwn/plugins/scannable_codes.rb +5 -1
  285. data/lib/pwn/plugins/semgrep.rb +61 -0
  286. data/lib/pwn/plugins/serial.rb +24 -14
  287. data/lib/pwn/plugins/shodan.rb +54 -35
  288. data/lib/pwn/plugins/slack_client.rb +11 -6
  289. data/lib/pwn/plugins/sock.rb +17 -8
  290. data/lib/pwn/plugins/spider.rb +5 -2
  291. data/lib/pwn/plugins/sqlmap.rb +49 -0
  292. data/lib/pwn/plugins/ssn.rb +3 -0
  293. data/lib/pwn/plugins/thread_pool.rb +6 -9
  294. data/lib/pwn/plugins/tor.rb +9 -4
  295. data/lib/pwn/plugins/transparent_browser.rb +62 -107
  296. data/lib/pwn/plugins/tty_spinner.rb +16 -2
  297. data/lib/pwn/plugins/twitter_api.rb +6 -2
  298. data/lib/pwn/plugins/uri_scheme.rb +4 -1
  299. data/lib/pwn/plugins/vault.rb +12 -3
  300. data/lib/pwn/plugins/vin.rb +24 -12
  301. data/lib/pwn/plugins/voice.rb +7 -2
  302. data/lib/pwn/plugins/volatility.rb +67 -0
  303. data/lib/pwn/plugins/vsphere.rb +9 -5
  304. data/lib/pwn/plugins/xxd.rb +12 -43
  305. data/lib/pwn/plugins/zaproxy.rb +30 -16
  306. data/lib/pwn/plugins.rb +22 -0
  307. data/lib/pwn/reports/ai_red_team.rb +6 -2
  308. data/lib/pwn/reports/csv.rb +8 -1
  309. data/lib/pwn/reports/fuzz.rb +5 -2
  310. data/lib/pwn/reports/html.rb +8 -1
  311. data/lib/pwn/reports/html_footer.rb +4 -3
  312. data/lib/pwn/reports/html_header.rb +6 -2
  313. data/lib/pwn/reports/json.rb +8 -1
  314. data/lib/pwn/reports/markdown.rb +8 -1
  315. data/lib/pwn/reports/pdf.rb +8 -1
  316. data/lib/pwn/reports/phone.rb +5 -2
  317. data/lib/pwn/reports/sast.rb +6 -2
  318. data/lib/pwn/reports/uri_buster.rb +5 -2
  319. data/lib/pwn/reports/xml.rb +8 -1
  320. data/lib/pwn/reports.rb +19 -0
  321. data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
  322. data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
  323. data/lib/pwn/sast/aws.rb +9 -3
  324. data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
  325. data/lib/pwn/sast/base64.rb +9 -3
  326. data/lib/pwn/sast/beef_hook.rb +9 -3
  327. data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
  328. data/lib/pwn/sast/cmd_execution_java.rb +9 -3
  329. data/lib/pwn/sast/cmd_execution_python.rb +9 -3
  330. data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
  331. data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
  332. data/lib/pwn/sast/csrf.rb +9 -3
  333. data/lib/pwn/sast/deserial_java.rb +9 -3
  334. data/lib/pwn/sast/emoticon.rb +9 -3
  335. data/lib/pwn/sast/eval.rb +9 -3
  336. data/lib/pwn/sast/factory.rb +9 -3
  337. data/lib/pwn/sast/http_authorization_header.rb +9 -3
  338. data/lib/pwn/sast/inner_html.rb +9 -3
  339. data/lib/pwn/sast/keystore.rb +9 -3
  340. data/lib/pwn/sast/local_storage.rb +9 -3
  341. data/lib/pwn/sast/location_hash.rb +9 -3
  342. data/lib/pwn/sast/log4j.rb +9 -3
  343. data/lib/pwn/sast/logger.rb +9 -3
  344. data/lib/pwn/sast/md5.rb +9 -3
  345. data/lib/pwn/sast/outer_html.rb +9 -3
  346. data/lib/pwn/sast/padding_oracle.rb +9 -3
  347. data/lib/pwn/sast/password.rb +9 -3
  348. data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
  349. data/lib/pwn/sast/php_type_juggling.rb +9 -3
  350. data/lib/pwn/sast/pom_version.rb +9 -3
  351. data/lib/pwn/sast/port.rb +9 -3
  352. data/lib/pwn/sast/post_message.rb +9 -3
  353. data/lib/pwn/sast/private_key.rb +9 -3
  354. data/lib/pwn/sast/redirect.rb +9 -3
  355. data/lib/pwn/sast/redos.rb +9 -3
  356. data/lib/pwn/sast/shell.rb +9 -3
  357. data/lib/pwn/sast/signature.rb +9 -3
  358. data/lib/pwn/sast/sql.rb +9 -3
  359. data/lib/pwn/sast/ssl.rb +9 -3
  360. data/lib/pwn/sast/sudo.rb +9 -3
  361. data/lib/pwn/sast/task_tag.rb +9 -3
  362. data/lib/pwn/sast/test_case_engine.rb +11 -7
  363. data/lib/pwn/sast/throw_errors.rb +9 -3
  364. data/lib/pwn/sast/token.rb +9 -3
  365. data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
  366. data/lib/pwn/sast/use_after_free.rb +9 -3
  367. data/lib/pwn/sast/version.rb +9 -3
  368. data/lib/pwn/sast/window_location_hash.rb +9 -3
  369. data/lib/pwn/sast.rb +4 -0
  370. data/lib/pwn/sdr/decoder/adsb.rb +36 -5
  371. data/lib/pwn/sdr/decoder/apt.rb +9 -6
  372. data/lib/pwn/sdr/decoder/base.rb +74 -22
  373. data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
  374. data/lib/pwn/sdr/decoder/dect.rb +12 -3
  375. data/lib/pwn/sdr/decoder/dsp.rb +229 -39
  376. data/lib/pwn/sdr/decoder/flex.rb +59 -11
  377. data/lib/pwn/sdr/decoder/gps.rb +12 -3
  378. data/lib/pwn/sdr/decoder/gsm.rb +24 -4
  379. data/lib/pwn/sdr/decoder/iridium.rb +12 -3
  380. data/lib/pwn/sdr/decoder/lora.rb +13 -4
  381. data/lib/pwn/sdr/decoder/lte.rb +27 -3
  382. data/lib/pwn/sdr/decoder/morse.rb +12 -3
  383. data/lib/pwn/sdr/decoder/p25.rb +12 -3
  384. data/lib/pwn/sdr/decoder/pager.rb +8 -5
  385. data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
  386. data/lib/pwn/sdr/decoder/rds.rb +14 -8
  387. data/lib/pwn/sdr/decoder/rfid.rb +12 -3
  388. data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
  389. data/lib/pwn/sdr/decoder/rtty.rb +8 -5
  390. data/lib/pwn/sdr/decoder/wifi.rb +12 -3
  391. data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
  392. data/lib/pwn/sdr/decoder.rb +9 -0
  393. data/lib/pwn/sdr/flipper_zero.rb +17 -10
  394. data/lib/pwn/sdr/frequency_allocation.rb +4 -1
  395. data/lib/pwn/sdr/gqrx.rb +178 -119
  396. data/lib/pwn/sdr/rfidler.rb +4 -1
  397. data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
  398. data/lib/pwn/sdr.rb +14 -0
  399. data/lib/pwn/sessions.rb +86 -16
  400. data/lib/pwn/setup.rb +106 -37
  401. data/lib/pwn/version.rb +1 -1
  402. data/lib/pwn/www/app_cobalt_io.rb +11 -5
  403. data/lib/pwn/www/bing.rb +10 -5
  404. data/lib/pwn/www/bug_crowd.rb +11 -5
  405. data/lib/pwn/www/checkip.rb +8 -4
  406. data/lib/pwn/www/coinbase_pro.rb +11 -5
  407. data/lib/pwn/www/duckduckgo.rb +12 -6
  408. data/lib/pwn/www/facebook.rb +11 -5
  409. data/lib/pwn/www/github.rb +11 -5
  410. data/lib/pwn/www/google.rb +11 -5
  411. data/lib/pwn/www/hacker_one.rb +20 -9
  412. data/lib/pwn/www/linkedin.rb +11 -5
  413. data/lib/pwn/www/pandora.rb +11 -5
  414. data/lib/pwn/www/pastebin.rb +9 -4
  415. data/lib/pwn/www/paypal.rb +19 -11
  416. data/lib/pwn/www/synack.rb +11 -5
  417. data/lib/pwn/www/torch.rb +13 -8
  418. data/lib/pwn/www/trading_view.rb +11 -5
  419. data/lib/pwn/www/twitter.rb +11 -5
  420. data/lib/pwn/www/uber.rb +11 -5
  421. data/lib/pwn/www/upwork.rb +11 -5
  422. data/lib/pwn/www/wayback_machine.rb +12 -6
  423. data/lib/pwn/www/youtube.rb +10 -5
  424. data/lib/pwn/www.rb +4 -0
  425. data/spec/conventions_spec.rb +118 -2
  426. data/spec/integration/help_contract_spec.rb +2 -0
  427. data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
  428. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
  429. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
  430. data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
  431. data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
  432. data/spec/lib/pwn/plugins/exploit_db_spec.rb +13 -0
  433. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
  434. data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
  435. data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
  436. data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
  437. data/spec/lib/pwn/plugins/k8s_spec.rb +13 -0
  438. data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
  439. data/spec/lib/pwn/plugins/preflight_checker_spec.rb +23 -0
  440. data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
  441. data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
  442. data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
  443. data/spec/lib/pwn/plugins/semgrep_spec.rb +13 -0
  444. data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
  445. data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
  446. data/spec/lib/pwn/req_queue_spec.rb +168 -0
  447. data/third_party/pwn_rdoc.jsonl +160 -5
  448. metadata +63 -7
  449. data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
  450. data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
@@ -310,46 +310,62 @@ module PWN
310
310
 
311
311
  public_class_method def self.help
312
312
  puts "USAGE:
313
- nsc_obj = #{self}.login(
314
- console_ip: 'required host/ip of Nexpose Console (server)',
315
- username: 'required username',
316
- password: 'optional password (will prompt if nil)'
313
+ # Run login and return its result
314
+ #{self}.login(
315
+ console_ip: 'required - required host/ip of Nexpose Console (server)',
316
+ username: 'required - required username',
317
+ password: 'optional - optional password (will prompt if nil)'
317
318
  )
318
- puts nsc_obj.public_methods
319
319
 
320
- all_individual_site_assets_arr = #{self}.list_all_individual_site_assets(
321
- nsc_obj: 'required nsc_obj returned from login method',
322
- site_name: 'required Nexpose site name to update (case-sensitive)'
320
+ # Run list all individual site assets and return its result
321
+ #{self}.list_all_individual_site_assets(
322
+ nsc_obj: 'required - required nsc_obj returned from login method',
323
+ site_name: 'required - required Nexpose site name to update (case-sensitive)'
323
324
  )
324
325
 
325
- nsc_obj = #{self}.update_site_assets(
326
- nsc_obj: 'required nsc_obj returned from login method',
327
- site_name: 'required Nexpose site name to update (case-sensitive),
328
- assets: 'required array of hashes containing called :ip => values being IP address (All IPs not included in the :assets parameter will be removed from Nexpose)'
326
+ # Run update site assets and return its result
327
+ #{self}.update_site_assets(
328
+ nsc_obj: 'required - required nsc_obj returned from login method',
329
+ site_name: 'required - required Nexpose site name to update (case-sensitive',
330
+ assets: 'required - required array of hashes containing called :ip => values being IP address (All IPs not included in the :assets parameter will be removed from Nexpose)'
329
331
  )
330
332
 
331
- nsc_obj = #{self}.delete_site_assets_older_than(
332
- nsc_obj: 'required nsc_obj returned from login method',
333
- site_name: 'required Nexpose site name to update (case-sensitive),
334
- days: 'required assets to remove older than number of days in this parameter'
333
+ # Run delete site assets older than and return its result
334
+ #{self}.delete_site_assets_older_than(
335
+ nsc_obj: 'required - required nsc_obj returned from login method',
336
+ site_name: 'required - required Nexpose site name to update (case-sensitive',
337
+ days: 'required - required assets to remove older than number of days in this parameter'
335
338
  )
336
339
 
337
- nsc_obj = #{self}.scan_site_by_name(
338
- nsc_obj: 'required nsc_obj returned from login method',
339
- site_name: 'required Nexpose site name to scan (case-sensitive),
340
- poll_interval: 'optional poll interval to check the completion status of the scan (defaults to 60 seconds)
340
+ # Run scan site by name and return its result
341
+ #{self}.scan_site_by_name(
342
+ nsc_obj: 'required - required nsc_obj returned from login method',
343
+ site_name: 'required - required Nexpose site name to scan (case-sensitive',
344
+ poll_interval: 'optional - optional poll interval to check the completion status of the scan (defaults to 3 minutes'
341
345
  )
342
346
 
347
+ # Run generate report via existing config and return its result
348
+ #{self}.generate_report_via_existing_config(
349
+ nsc_obj: 'required - required nsc_obj returned from login method',
350
+ config_id: 'optional - relevant r.config_id returned when invoking the block nsc_obj.reports.each {|r| puts \#{r.name} => \#{r.config_id}}'
351
+ )
352
+
353
+ # Run download recurring report and return its result
343
354
  #{self}.download_recurring_report(
344
- nsc_obj: 'required nsc_obj returned from login method',
345
- report_names: 'required array of report name/types to generate e.g. ['report.html', 'report.pdf', 'report.xml']',
346
- poll_interval: 'optional poll interval to check the completion status of report generation (defaults to 60 seconds)
355
+ nsc_obj: 'required - required nsc_obj returned from login method',
356
+ report_names: 'required - required array of report name/types to generate e.g. [report.html, report.pdf, report.xml]',
357
+ poll_interval: 'optional - optional poll interval to check the completion status of report generation (defaults to 60 seconds'
347
358
  )
348
359
 
349
- #{self}.logout(nsc_obj: 'required nsc_obj returned from login method')
360
+ # Run logout and return its result
361
+ #{self}.logout(
362
+ nsc_obj: 'required - required nsc_obj returned from login method'
363
+ )
350
364
 
365
+ # Print the AUTHOR(S) string for this module.
351
366
  #{self}.authors
352
367
  "
368
+ constants.sort
353
369
  end
354
370
  end
355
371
  end
@@ -127,52 +127,32 @@ module PWN
127
127
 
128
128
  public_class_method def self.help
129
129
  puts "USAGE:
130
- #{self}.port_scan do |nmap|
131
- puts nmap.public_methods
132
- nmap.connect_scan = true
133
- nmap.service_scan = true
134
- nmap.verbose = true
135
- nmap.ports = [1..1024,1337]
136
- nmap.targets = '127.0.0.1'
137
- nmap.xml = '/tmp/nmap_port_scan_res.xml'
138
- end
139
-
130
+ # nmap.connect_scan = true
140
131
  #{self}.port_scan(
141
- targets: '127.0.0.1',
142
- ports: '1-65535',
143
- connect_scan: true,
144
- service_scan: true,
145
- script: 'vuln,safe',
146
- xml: '/tmp/nmap_port_scan_res.xml'
132
+ targets: 'optional - hostname, IP, CIDR, or list of targets',
133
+ ports: 'optional - port, list, or range (e.g. 22,80,443 or 1-1024)',
134
+ connect_scan: 'optional - connect scan value consumed by #port_scan',
135
+ service_scan: 'optional - service scan value consumed by #port_scan',
136
+ script: 'optional - script value consumed by #port_scan',
137
+ xml: 'optional - /tmp/nmap_port_scan_res.xml'
147
138
  )
148
139
 
149
- #{self}.parse_xml_results(:xml_file => 'required - path to nmap xml results') do |xml|
150
- xml.each_host do |host|
151
- puts host.ip
152
-
153
- host.scripts.each do |name,output|
154
- output.each_line { |line| puts line }
155
- end
156
-
157
- host.each_port do |port|
158
- puts port
159
-
160
- port.scripts.each do |name,output|
161
- puts name
162
- output.each_line { |line| puts line }
163
- end
164
- end
165
- end
166
- end
140
+ # xml.each_host do |host|
141
+ #{self}.parse_xml_results(
142
+ xml_file: 'optional - xml file value consumed by #parse_xml_results'
143
+ )
167
144
 
145
+ # Run diff xml results and return its result
168
146
  #{self}.diff_xml_results(
169
147
  xml_a: 'required - path to nmap xml results',
170
148
  xml_b: 'required - path to nmap xml results',
171
149
  diff: 'required - path to nmap xml results diff'
172
150
  )
173
151
 
152
+ # Print the AUTHOR(S) string for this module.
174
153
  #{self}.authors
175
154
  "
155
+ constants.sort
176
156
  end
177
157
  end
178
158
  end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'open3'
5
+
6
+ module PWN
7
+ module Plugins
8
+ # nuclei wrapper: template/severity, JSONL findings.
9
+ module Nuclei
10
+ public_class_method def self.required_bins
11
+ %w[nuclei]
12
+ end
13
+
14
+ public_class_method def self.scan(opts = {})
15
+ PWN::Plugins::PreflightChecker.require_bin!(name: 'nuclei')
16
+ target = opts[:target] || opts[:url]
17
+ raise 'ERROR: target is required' if target.to_s.empty?
18
+
19
+ cmd = ['nuclei', '-u', target.to_s, '-jsonl', '-silent']
20
+ cmd += ['-severity', opts[:severity].to_s] if opts[:severity]
21
+ cmd += ['-t', opts[:templates].to_s] if opts[:templates]
22
+ cmd += ['-rate-limit', opts[:rate_limit].to_s] if opts[:rate_limit]
23
+ stdout, stderr, status = Open3.capture3(*cmd)
24
+ findings = stdout.each_line.filter_map do |ln|
25
+ JSON.parse(ln)
26
+ rescue JSON::ParserError
27
+ nil
28
+ end
29
+ { findings: to_findings(rows: findings), raw: findings, stderr: stderr, exit: status.exitstatus }
30
+ end
31
+
32
+ public_class_method def self.to_findings(opts = {})
33
+ Array(opts[:rows] || opts[:findings]).map do |r|
34
+ r = r.transform_keys(&:to_s) if r.is_a?(Hash)
35
+ info = r['info'] || {}
36
+ info = info.transform_keys(&:to_s) if info.is_a?(Hash)
37
+ {
38
+ title: info['name'] || r['template-id'] || 'nuclei finding',
39
+ severity: (info['severity'] || 'info').to_s,
40
+ url: r['matched-at'] || r['host'],
41
+ template: r['template-id'],
42
+ description: info['description']
43
+ }
44
+ end
45
+ end
46
+
47
+ public_class_method def self.to_defectdojo(opts = {})
48
+ to_findings(opts).map do |f|
49
+ { title: f[:title], severity: f[:severity], description: "#{f[:url]} #{f[:template]}".strip }
50
+ end
51
+ end
52
+
53
+ public_class_method def self.authors
54
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
55
+ end
56
+
57
+ public_class_method def self.help
58
+ puts "USAGE:
59
+ # List host binaries this module expects to be installed.
60
+ #{self}.required_bins
61
+
62
+ # Run scan and return its result
63
+ #{self}.scan(
64
+ target: 'required - hostname, IP, or CIDR to scan (defaults to opts[:url])',
65
+ url: 'optional - HTTP(S) URL',
66
+ severity: 'optional - severity value consumed by #scan',
67
+ templates: 'optional - templates value consumed by #scan',
68
+ rate_limit: 'optional - requests per second passed to nuclei -rate-limit'
69
+ )
70
+
71
+ # Map nuclei JSONL rows into report-shaped finding hashes.
72
+ #{self}.to_findings(
73
+ rows: 'optional - Array of parsed nuclei JSONL objects',
74
+ findings: 'optional - alias for rows'
75
+ )
76
+
77
+ # Shape findings for a DefectDojo import payload.
78
+ #{self}.to_defectdojo(
79
+ rows: 'optional - Array of parsed nuclei JSONL objects',
80
+ findings: 'optional - alias for rows'
81
+ )
82
+
83
+ # Print the AUTHOR(S) string for this module.
84
+ #{self}.authors
85
+ "
86
+ constants.sort
87
+ end
88
+ end
89
+ end
90
+ end
@@ -51,16 +51,22 @@ module PWN
51
51
  # Display Usage for this Module
52
52
 
53
53
  public_class_method def self.help
54
- puts %{USAGE:
55
- #{self}.decode(oauth2_token: 'required oauth2 token')"
54
+ puts "USAGE:
55
+ # Run decode and return its result
56
+ #{self}.decode(
57
+ oauth2_token: 'required - required oauth2 token'
58
+ )
56
59
 
60
+ # Run get value by key and return its result
57
61
  #{self}.get_value_by_key(
58
- oauth2_token: 'required oauth2 token',
59
- key: 'required oauth2 token key name located within the Base64 encoded token as symbol, e.g. :company_id'
62
+ oauth2_token: 'required - required oauth2 token',
63
+ key: 'required - required oauth2 token key name located within the Base64 encoded token as symbol, e.g. :company_id'
60
64
  )
61
65
 
66
+ # Print the AUTHOR(S) string for this module.
62
67
  #{self}.authors
63
- }
68
+ "
69
+ constants.sort
64
70
  end
65
71
  end
66
72
  end
@@ -31,12 +31,15 @@ module PWN
31
31
 
32
32
  public_class_method def self.help
33
33
  puts "USAGE:
34
+ # Run process and return its result
34
35
  #{self}.process(
35
36
  file: 'required - path to image file'
36
37
  )
37
38
 
39
+ # Print the AUTHOR(S) string for this module.
38
40
  #{self}.authors
39
41
  "
42
+ constants.sort
40
43
  end
41
44
  end
42
45
  end
@@ -897,16 +897,19 @@ module PWN
897
897
 
898
898
  public_class_method def self.help
899
899
  puts "USAGE:
900
- openapi_spec = #{self}.generate_spec(
900
+ # Run generate spec and return its result
901
+ #{self}.generate_spec(
901
902
  spec_paths: 'required - array of OpenAPI file paths to merge',
902
903
  base_url: 'required - base URL for OpenAPI endpoints (e.g., http://fqdn.com)',
903
- output_json_path: 'required - path to save the merged OpenAPI JSON file',
904
+ output_json_path: 'optional - path to save the merged OpenAPI JSON file',
904
905
  target_version: 'optional - target OpenAPI version (default: 3.0.3)',
905
906
  debug: 'optional - boolean to enable debug logging (default: false)'
906
907
  )
907
908
 
909
+ # Print the AUTHOR(S) string for this module.
908
910
  #{self}.authors
909
911
  "
912
+ constants.sort
910
913
  end
911
914
  end
912
915
  end
@@ -268,46 +268,54 @@ module PWN
268
268
 
269
269
  public_class_method def self.help
270
270
  puts "USAGE:
271
- task_xml_resp = #{self}.get_task_id(
272
- task_name: 'required task name to start',
273
- username: 'required username',
274
- password: 'optional password (will prompt if nil)'
271
+ # Run get task id and return its result
272
+ #{self}.get_task_id(
273
+ task_name: 'required - required task name to start',
274
+ username: 'required - required username',
275
+ password: 'optional - optional password (will prompt if nil)'
275
276
  )
276
277
 
277
- start_task_xml_resp = #{self}.start_task(
278
- task_name: 'required task name to start',
279
- username: 'required username',
280
- password: 'optional password (will prompt if nil)'
278
+ # Run start task and return its result
279
+ #{self}.start_task(
280
+ task_name: 'required - required task name to start',
281
+ username: 'required - required username',
282
+ password: 'optional - optional password (will prompt if nil)'
281
283
  )
282
284
 
283
- task_status = #{self}.get_task_status(
284
- task_name: 'required task name to start',
285
- username: 'required username',
286
- password: 'optional password (will prompt if nil)'
285
+ # Run get task status and return its result
286
+ #{self}.get_task_status(
287
+ task_name: 'required - required task name to start',
288
+ username: 'required - required username',
289
+ password: 'optional - optional password (will prompt if nil)'
287
290
  )
288
291
 
289
- last_report_id = #{self}.last_report_id(
290
- task_name: 'required task name to start',
291
- username: 'required username',
292
- password: 'optional password (will prompt if nil)'
292
+ # Run last report id and return its result
293
+ #{self}.last_report_id(
294
+ task_name: 'required - required task name to start',
295
+ username: 'required - required username',
296
+ password: 'optional - optional password (will prompt if nil)'
293
297
  )
294
298
 
299
+ # Run save report and return its result
295
300
  #{self}.save_report(
296
- report_type: 'required report type (csv|itg|pdf|txt|xml)',
297
- report_id: 'required report id to save',
298
- report_dir: 'required directory to save report',
299
- username: 'required username',
300
- password: 'optional password (will prompt if nil)',
301
- report_filter: 'optional - results filter (Default: \"apply_overrides=0 levels=hml rows=1000 min_qod=70 first=1 sort-reverse=severity\")
301
+ report_type: 'required - required report type (csv|itg|pdf|txt|xml)',
302
+ report_id: 'required - required report id to save',
303
+ report_dir: 'required - required directory to save report',
304
+ username: 'required - required username',
305
+ password: 'optional - optional password (will prompt if nil)',
306
+ report_filter: 'optional - results filter (Default: apply_overrides=0 levels=hml rows=1000 min_qod=70 first=1 sort-reverse=severity'
302
307
  )
303
308
 
304
- report_types = #{self}.get_report_types(
305
- username: 'required username',
306
- password: 'optional password (will prompt if nil)'
309
+ # Run get report types and return its result
310
+ #{self}.get_report_types(
311
+ username: 'required - required username',
312
+ password: 'optional - optional password (will prompt if nil)'
307
313
  )
308
314
 
315
+ # Print the AUTHOR(S) string for this module.
309
316
  #{self}.authors
310
317
  "
318
+ constants.sort
311
319
  end
312
320
  end
313
321
  end