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
@@ -132,27 +132,32 @@ module PWN
132
132
  # Display Usage for this Module
133
133
 
134
134
  public_class_method def self.help
135
- puts %{USAGE:
136
- git_html_resp = #{self}.gen_html_diff(
137
- repo: 'required git repo name',
138
- branch: 'required git repo branch (e.g. master, develop, etc)',
139
- since: 'optional date, otherwise default to last pull'
135
+ puts "USAGE:
136
+ # Run gen html diff and return its result
137
+ #{self}.gen_html_diff(
138
+ repo: 'required - required git repo name',
139
+ branch: 'required - required git repo branch (e.g. master, develop, etc)',
140
+ since: 'optional - optional date, otherwise default to last pull'
140
141
  )
141
142
 
142
- author = #{self}.get_author(
143
- repo_root: 'optional path to git repo root (defaults to ".")'
144
- from_line: 'required line number to start in range',
145
- to_line: 'required line number to stop in range',
146
- target_file: 'required file in which line range is queried'
147
- entry_beautified: 'required boolean'
143
+ # Run dump all repo branches and return its result
144
+ #{self}.dump_all_repo_branches(
145
+ git_url: 'required - required git repo url'
148
146
  )
149
147
 
150
- all_repo_branches = #{self}.dump_all_repo_branches(
151
- git_url: 'required git repo url'
148
+ # Run get author and return its result
149
+ #{self}.get_author(
150
+ repo_root: 'optional - repo root value consumed by #get_author',
151
+ from_line: 'optional - from line value consumed by #get_author',
152
+ to_line: 'optional - to line value consumed by #get_author',
153
+ target_file: 'optional - target file value consumed by #get_author',
154
+ entry_beautified: 'optional - entry beautified value consumed by #get_author'
152
155
  )
153
156
 
157
+ # Print the AUTHOR(S) string for this module.
154
158
  #{self}.authors
155
- }
159
+ "
160
+ constants.sort
156
161
  end
157
162
  end
158
163
  end
@@ -235,6 +235,7 @@ module PWN
235
235
  gh_bin = ENV['PATH'].to_s.split(File::PATH_SEPARATOR)
236
236
  .map { |d| File.join(d, 'gh') }
237
237
  .find { |f| File.executable?(f) }
238
+ # Run api and return its result
238
239
  raise "ERROR: gh CLI not found on PATH - use #{self}.api(path:) instead, or install gh (https://cli.github.com)" unless gh_bin
239
240
 
240
241
  token = resolve_token(opts)
@@ -259,36 +260,58 @@ module PWN
259
260
 
260
261
  public_class_method def self.help
261
262
  puts "USAGE:
262
- response_json = #{self}.download_all_gists(
263
- username: 'optional - username of gists to download (default PWN::Env[:plugins][:github][:username])',
263
+ # Run download all gists and return its result
264
+ #{self}.download_all_gists(
265
+ username: 'optional - username of gists to backup (default PWN::Env[:plugins][:github][:username])',
264
266
  target_dir: 'required - target directory to save respective gists'
265
267
  )
266
268
 
267
- runs = #{self}.workflow_runs(
268
- owner: 'optional - default PWN::Env[:plugins][:github][:username]',
269
+ # Run workflow runs and return its result
270
+ #{self}.workflow_runs(
271
+ owner: 'required - repo owner (default PWN::Env[:plugins][:github][:username])',
269
272
  repo: 'required - repo name',
270
- workflow: 'optional - e.g. install-matrix.yml',
271
- params: 'optional - {branch:, status:, per_page:}'
273
+ workflow: 'optional - workflow file name or id (e.g. install-matrix.yml). Omit for all runs.',
274
+ params: 'optional - {branch:, status:, per_page:, page:}',
275
+ token: 'optional - token value consumed by #workflow_runs'
272
276
  )
273
277
 
274
- jobs = #{self}.workflow_run_jobs(
275
- owner: 'optional', repo: 'required', run_id: 'required'
278
+ # Run workflow run jobs and return its result
279
+ #{self}.workflow_run_jobs(
280
+ owner: 'required - repo owner (default PWN::Env[:plugins][:github][:username])',
281
+ repo: 'required - repo name',
282
+ run_id: 'required - workflow run id',
283
+ params: 'optional - params value consumed by #workflow_run_jobs',
284
+ token: 'optional - token value consumed by #workflow_run_jobs'
276
285
  )
277
286
 
278
- log = #{self}.job_log(
279
- owner: 'optional', repo: 'required', job_id: 'required'
287
+ # Run job log and return its result
288
+ #{self}.job_log(
289
+ owner: 'required - repo owner (default PWN::Env[:plugins][:github][:username])',
290
+ repo: 'required - repo name',
291
+ job_id: 'required - job id from workflow_run_jobs',
292
+ token: 'optional - token value consumed by #job_log'
280
293
  )
281
294
 
282
- json = #{self}.api(
283
- path: 'required - e.g. repos/0dayinc/pwn/releases/latest',
284
- method: 'optional - :get|:post|:put|:patch|:delete',
285
- params: 'optional', body: 'optional', raw: 'optional'
295
+ # Run api and return its result
296
+ #{self}.api(
297
+ path: 'required - REST path relative to https://api.github.com (e.g. repos/0dayinc/pwn/releases/latest)',
298
+ method: 'optional - :get|:post|:put|:patch|:delete (default :get)',
299
+ params: 'optional - query params Hash',
300
+ body: 'optional - request body Hash/Array/String for POST/PUT/PATCH',
301
+ token: 'optional - PAT (default PWN::Env[:plugins][:github][:personal_access_token])',
302
+ raw: 'optional - return raw RestClient::Response instead of parsed JSON (default false)'
286
303
  )
287
304
 
288
- #{self}.gh(cmd: 'run view <run_id> -R <owner>/<repo> --log-failed')
305
+ # Thin wrapper around the `gh` CLI with GH_TOKEN injected from PWN::Env so
306
+ #{self}.gh(
307
+ cmd: 'required - gh subcommand string, e.g. run list -R 0dayinc/pwn -L 5 --json databaseId,status',
308
+ token: 'optional - PAT (default PWN::Env[:plugins][:github][:personal_access_token])'
309
+ )
289
310
 
311
+ # Print the AUTHOR(S) string for this module.
290
312
  #{self}.authors
291
313
  "
314
+ constants.sort
292
315
  end
293
316
  end
294
317
  end
@@ -876,51 +876,194 @@ module PWN
876
876
  end
877
877
 
878
878
  public_class_method def self.help
879
- puts <<~USAGE
880
- USAGE:
881
- # OAuth (Desktop client from Google Cloud Console)
882
- # authorize the printed URL; refresh/bearer persist to Env + pwn.yaml
883
- #{self}.obtain_oauth_auth_url(services: 'email,calendar')
884
- #{self}.obtain_oauth_auth_url(wait: false) # URL only; no listener
885
- #{self}.exchange_oauth_code(code: 'optional paste fallback')
886
- #{self}.authenticated?
887
- #{self}.revoke
888
-
889
- # Gmail
890
- #{self}.gmail_search(query: 'is:unread', max: 10)
891
- #{self}.gmail_get(id: 'MESSAGE_ID')
892
- #{self}.gmail_send(to: 'a@b.com', subject: 'Hi', body: '...')
893
- #{self}.gmail_reply(id: 'MESSAGE_ID', body: 'Thanks')
894
- #{self}.gmail_labels
895
- #{self}.gmail_modify(id: 'MESSAGE_ID', add_labels: ['STARRED'], remove_labels: ['UNREAD'])
896
-
897
- # Calendar
898
- #{self}.calendar_list(start: '2026-03-01T00:00:00Z')
899
- #{self}.calendar_create(summary: 'Standup', start: '2026-03-01T10:00:00-06:00', end: '2026-03-01T10:30:00-06:00')
900
- #{self}.calendar_update(id: 'EVENT_ID', summary: 'Standup (moved)')
901
- #{self}.calendar_delete(id: 'EVENT_ID')
902
-
903
- # Drive
904
- #{self}.drive_search(query: 'quarterly report')
905
- #{self}.drive_get(id: 'FILE_ID')
906
- #{self}.drive_upload(path: '/tmp/report.pdf')
907
- #{self}.drive_download(id: 'FILE_ID', output: '/tmp/out.pdf')
908
- #{self}.drive_create_folder(name: 'Reports')
909
- #{self}.drive_share(id: 'FILE_ID', email: 'a@b.com', role: 'reader')
910
- #{self}.drive_delete(id: 'FILE_ID')
911
-
912
- # Docs / Sheets
913
- #{self}.docs_create(title: 'Notes', body: 'Hello')
914
- #{self}.docs_get(id: 'DOC_ID')
915
- #{self}.docs_append(id: 'DOC_ID', text: ' more')
916
- #{self}.sheets_create(title: 'Budget')
917
- #{self}.sheets_get(id: 'SHEET_ID', range: 'Sheet1!A1:D10')
918
- #{self}.sheets_update(id: 'SHEET_ID', range: 'Sheet1!A1', values: [['Name']])
919
- #{self}.sheets_append(id: 'SHEET_ID', range: 'Sheet1!A:C', values: [['a', 'b', 'c']])
920
-
921
- Config: PWN::Env[:plugins][:google_workspace][:oauth]
922
- #{self}.authors
923
- USAGE
879
+ puts "USAGE:
880
+ # Run scopes and return its result
881
+ #{self}.scopes(
882
+ scope: 'optional - scope value consumed by #scopes',
883
+ services: 'optional - services value consumed by #scopes'
884
+ )
885
+
886
+ # Run parse oauth code and return its result
887
+ #{self}.parse_oauth_code(
888
+ code: 'optional - code value consumed by #parse_oauth_code'
889
+ )
890
+
891
+ # Run obtain oauth auth url and return its result
892
+ #{self}.obtain_oauth_auth_url(
893
+ wait: 'optional - wait value consumed by #obtain_oauth_auth_url',
894
+ timeout: 'optional - seconds to wait before giving up',
895
+ probe: 'optional - probe value consumed by #obtain_oauth_auth_url'
896
+ )
897
+
898
+ # Run exchange oauth code and return its result
899
+ #{self}.exchange_oauth_code(
900
+ code: 'required - code value consumed by #exchange_oauth_code',
901
+ code_verifier: 'optional - code verifier value consumed by #exchange_oauth_code (defaults to pending[:verifier])'
902
+ )
903
+
904
+ # Run refresh oauth bearer token and return its result
905
+ #{self}.refresh_oauth_bearer_token(
906
+ refresh_token: 'required - refresh token value consumed by #refresh_oauth_bearer_token (defaults to c[:refresh_token])',
907
+ client_id: 'required - client id value consumed by #refresh_oauth_bearer_token (defaults to c[:client_id])',
908
+ client_secret: 'required - client secret value consumed by #refresh_oauth_bearer_token (defaults to c[:client_secret])'
909
+ )
910
+
911
+ # Run bearer token and return its result
912
+ #{self}.bearer_token
913
+
914
+ # Run authenticated and return its result
915
+ #{self}.authenticated?
916
+
917
+ # Run revoke and return its result
918
+ #{self}.revoke
919
+
920
+ # ── Gmail ──────────────────────────────────────────────────────────
921
+ #{self}.gmail_search(
922
+ query: 'optional - search query string',
923
+ max: 'optional - max value consumed by #gmail_search'
924
+ )
925
+
926
+ # Run gmail get and return its result
927
+ #{self}.gmail_get(
928
+ id: 'required - id value consumed by #gmail_get',
929
+ format: 'optional - format value consumed by #gmail_get (defaults to full)'
930
+ )
931
+
932
+ # Run gmail send and return its result
933
+ #{self}.gmail_send(
934
+ to: 'required - to value consumed by #gmail_send'
935
+ )
936
+
937
+ # Run gmail reply and return its result
938
+ #{self}.gmail_reply(
939
+ id: 'required - id value consumed by #gmail_reply'
940
+ )
941
+
942
+ # Run gmail labels and return its result
943
+ #{self}.gmail_labels
944
+
945
+ # Run gmail modify and return its result
946
+ #{self}.gmail_modify(
947
+ id: 'required - id value consumed by #gmail_modify',
948
+ add_labels: 'optional - add labels value consumed by #gmail_modify',
949
+ add: 'required - add value consumed by #gmail_modify',
950
+ remove_labels: 'optional - remove labels value consumed by #gmail_modify',
951
+ remove: 'required - remove value consumed by #gmail_modify'
952
+ )
953
+
954
+ # ── Calendar ───────────────────────────────────────────────────────
955
+ #{self}.calendar_list(
956
+ calendar_id: 'optional - calendar id value consumed by #calendar_list',
957
+ start: 'optional - start value consumed by #calendar_list',
958
+ end: 'optional - end value consumed by #calendar_list',
959
+ max: 'optional - max value consumed by #calendar_list'
960
+ )
961
+
962
+ # Run calendar create and return its result
963
+ #{self}.calendar_create(
964
+ calendar_id: 'optional - calendar id value consumed by #calendar_create'
965
+ )
966
+
967
+ # Run calendar update and return its result
968
+ #{self}.calendar_update(
969
+ id: 'required - id value consumed by #calendar_update',
970
+ calendar_id: 'optional - calendar id value consumed by #calendar_update'
971
+ )
972
+
973
+ # Run calendar delete and return its result
974
+ #{self}.calendar_delete(
975
+ id: 'required - id value consumed by #calendar_delete',
976
+ calendar_id: 'optional - calendar id value consumed by #calendar_delete'
977
+ )
978
+
979
+ # ── Drive ──────────────────────────────────────────────────────────
980
+ #{self}.drive_search(
981
+ query: 'optional - search query string',
982
+ raw_query: 'optional - raw query value consumed by #drive_search',
983
+ max: 'optional - max value consumed by #drive_search'
984
+ )
985
+
986
+ # Run drive get and return its result
987
+ #{self}.drive_get(
988
+ id: 'required - id value consumed by #drive_get'
989
+ )
990
+
991
+ # Run drive upload and return its result
992
+ #{self}.drive_upload(
993
+ path: 'required - filesystem path to read or write',
994
+ name: 'required - binary or identifier name',
995
+ parent: 'optional - parent value consumed by #drive_upload',
996
+ mime: 'optional - mime value consumed by #drive_upload'
997
+ )
998
+
999
+ # Run drive download and return its result
1000
+ #{self}.drive_download(
1001
+ id: 'required - id value consumed by #drive_download',
1002
+ export_mime: 'optional - export mime value consumed by #drive_download (defaults to EXPORT_MIME[meta[:mimeType])',
1003
+ output: 'optional - output value consumed by #drive_download'
1004
+ )
1005
+
1006
+ # Run drive create folder and return its result
1007
+ #{self}.drive_create_folder(
1008
+ name: 'required - binary or identifier name',
1009
+ parent: 'optional - parent value consumed by #drive_create_folder'
1010
+ )
1011
+
1012
+ # Run drive share and return its result
1013
+ #{self}.drive_share(
1014
+ id: 'required - id value consumed by #drive_share',
1015
+ role: 'optional - role value consumed by #drive_share',
1016
+ type: 'optional - type value consumed by #drive_share',
1017
+ email: 'optional - email value consumed by #drive_share',
1018
+ domain: 'optional - FQDN to query (e.g. example.com)',
1019
+ notify: 'optional - notify value consumed by #drive_share'
1020
+ )
1021
+
1022
+ # Run drive delete and return its result
1023
+ #{self}.drive_delete(
1024
+ id: 'required - id value consumed by #drive_delete',
1025
+ permanent: 'optional - permanent value consumed by #drive_delete'
1026
+ )
1027
+
1028
+ # ── Docs ───────────────────────────────────────────────────────────
1029
+ #{self}.docs_get(
1030
+ id: 'required - id value consumed by #docs_get'
1031
+ )
1032
+
1033
+ # Run docs create and return its result
1034
+ #{self}.docs_create(
1035
+ title: 'required - title value consumed by #docs_create',
1036
+ body: 'optional - body value consumed by #docs_create'
1037
+ )
1038
+
1039
+ # Run docs append and return its result
1040
+ #{self}.docs_append(
1041
+ id: 'required - id value consumed by #docs_append',
1042
+ text: 'optional - text value consumed by #docs_append'
1043
+ )
1044
+
1045
+ # ── Sheets ─────────────────────────────────────────────────────────
1046
+ #{self}.sheets_create(
1047
+ title: 'required - title value consumed by #sheets_create',
1048
+ sheet_name: 'optional - sheet name value consumed by #sheets_create'
1049
+ )
1050
+
1051
+ # Run sheets get and return its result
1052
+ #{self}.sheets_get(
1053
+ id: 'required - id value consumed by #sheets_get',
1054
+ range: 'required - range value consumed by #sheets_get'
1055
+ )
1056
+
1057
+ # Run sheets update and return its result
1058
+ #{self}.sheets_update
1059
+
1060
+ # Run sheets append and return its result
1061
+ #{self}.sheets_append
1062
+
1063
+ # Print the AUTHOR(S) string for this module.
1064
+ #{self}.authors
1065
+ "
1066
+ constants.sort
924
1067
  end
925
1068
  end
926
1069
  end
@@ -658,49 +658,173 @@ module PWN
658
658
 
659
659
  public_class_method def self.help
660
660
  puts "USAGE:
661
- h1_obj = #{self}.login(
662
- username: 'optional - default PWN::Env[:plugins][:hackerone][:username]',
663
- api_key: 'optional - default PWN::Env[:plugins][:hackerone][:api_key]'
661
+ # Run login and return its result
662
+ #{self}.login(
663
+ username: 'optional - username (default PWN::Env[:plugins][:hackerone][:username])',
664
+ api_key: 'optional - api token (default PWN::Env; will prompt if still nil)',
665
+ token: 'optional - alias for api_key'
664
666
  )
665
667
 
666
- reports = #{self}.get_me_reports(h1_obj: h1_obj)
667
- report = #{self}.get_report(id: 12345)
668
- report = #{self}.create_report(
669
- team_handle: 'security',
670
- title: 'Example',
671
- vulnerability_information: 'Details...'
668
+ # Run api and return its result
669
+ #{self}.api(
670
+ path: 'required - path relative to /v1/hackers (e.g. me/reports)',
671
+ method: 'optional - :get|:post|:put|:patch|:delete (default :get)',
672
+ params: 'optional - query params Hash',
673
+ body: 'optional - request body Hash/Array/String (defaults to opts[:http_body])',
674
+ username: 'optional - username value consumed by #api',
675
+ api_key: 'optional - api key value consumed by #api',
676
+ h1_obj: 'optional - session from #login (supplies username/api_key)',
677
+ raw: 'optional - return raw response (default false)',
678
+ http_method: 'optional - http method value consumed by #api (defaults to :get)',
679
+ http_body: 'optional - http body value consumed by #api'
672
680
  )
673
681
 
674
- balance = #{self}.get_balance
675
- earnings = #{self}.get_earnings
676
- payouts = #{self}.get_payouts
677
-
678
- programs = #{self}.get_programs
679
- program = #{self}.get_program(handle: 'security')
680
- scopes = #{self}.get_structured_scopes(handle: 'security')
681
- excl = #{self}.get_scope_exclusions(handle: 'security')
682
- weak = #{self}.get_weaknesses(handle: 'security')
683
-
684
- items = #{self}.get_hacktivity
685
-
686
- intents = #{self}.get_report_intents
687
- intent = #{self}.get_report_intent(id: 1)
688
- intent = #{self}.create_report_intent(body: { data: { type: 'report-intent', attributes: {} } })
689
- intent = #{self}.update_report_intent(id: 1, body: { data: { type: 'report-intent', attributes: {} } })
690
- #{self}.submit_report_intent(id: 1)
691
- #{self}.delete_report_intent(id: 1)
692
- atts = #{self}.get_report_intent_attachments(report_intent_id: 1)
693
- #{self}.delete_report_intent_attachment(report_intent_id: 1, id: 2)
694
-
695
- json = #{self}.api(
696
- path: 'me/reports',
697
- method: :get,
698
- params: { page: { number: 1 } }
682
+ # ---- Reports -------------------------------------------------------
683
+ #{self}.get_me_reports(
684
+ params: 'optional - query params Hash (e.g. page/filter)',
685
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
699
686
  )
700
687
 
701
- #{self}.logout(h1_obj: h1_obj)
688
+ # Run get report and return its result
689
+ #{self}.get_report(
690
+ id: 'required - report id',
691
+ username: 'optional - optional, api_key: optional, h1_obj: optional',
692
+ params: 'optional - params value consumed by #get_report'
693
+ )
694
+
695
+ # Run create report and return its result
696
+ #{self}.create_report(
697
+ team_handle: 'required - program handle',
698
+ title: 'required - report title',
699
+ vulnerability_information: 'required - detailed description',
700
+ impact: 'optional - impact text',
701
+ severity_rating: 'optional - none|low|medium|high|critical',
702
+ weakness_id: 'optional - weakness id integer',
703
+ structured_scope_id: 'optional - structured scope id value consumed by #create_report',
704
+ body: 'optional - full JSON:API body Hash (overrides attribute kwargs)',
705
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
706
+ )
707
+
708
+ # ---- Payments ------------------------------------------------------
709
+ #{self}.get_balance(
710
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
711
+ )
712
+
713
+ # Run get earnings and return its result
714
+ #{self}.get_earnings(
715
+ params: 'optional - query params Hash',
716
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
717
+ )
718
+
719
+ # Run get payouts and return its result
720
+ #{self}.get_payouts(
721
+ params: 'optional - query params Hash',
722
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
723
+ )
724
+
725
+ # ---- Programs -------------------------------------------------------
726
+ #{self}.get_programs(
727
+ params: 'optional - query params Hash',
728
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
729
+ )
730
+
731
+ # Run get program and return its result
732
+ #{self}.get_program(
733
+ handle: 'required - program handle',
734
+ username: 'optional - optional, api_key: optional, h1_obj: optional',
735
+ params: 'optional - params value consumed by #get_program'
736
+ )
737
+
738
+ # Run get structured scopes and return its result
739
+ #{self}.get_structured_scopes(
740
+ handle: 'required - program handle',
741
+ params: 'optional - params value consumed by #get_structured_scopes',
742
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
743
+ )
744
+
745
+ # Run get scope exclusions and return its result
746
+ #{self}.get_scope_exclusions(
747
+ handle: 'required - program handle',
748
+ params: 'optional - params value consumed by #get_scope_exclusions',
749
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
750
+ )
751
+
752
+ # Run get weaknesses and return its result
753
+ #{self}.get_weaknesses(
754
+ handle: 'required - program handle',
755
+ params: 'optional - params value consumed by #get_weaknesses',
756
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
757
+ )
758
+
759
+ # ---- Hacktivity -----------------------------------------------------
760
+ #{self}.get_hacktivity(
761
+ params: 'optional - query params Hash',
762
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
763
+ )
764
+
765
+ # ---- Report Intents ------------------------------------------------
766
+ #{self}.get_report_intents(
767
+ params: 'optional - params value consumed by #get_report_intents',
768
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
769
+ )
770
+
771
+ # Run get report intent and return its result
772
+ #{self}.get_report_intent(
773
+ id: 'required - report intent id',
774
+ username: 'optional - optional, api_key: optional, h1_obj: optional',
775
+ params: 'optional - params value consumed by #get_report_intent'
776
+ )
777
+
778
+ # Run create report intent and return its result
779
+ #{self}.create_report_intent(
780
+ body: 'required - full JSON:API body Hash',
781
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
782
+ )
783
+
784
+ # Run update report intent and return its result
785
+ #{self}.update_report_intent(
786
+ id: 'required - report intent id',
787
+ body: 'required - full JSON:API body Hash',
788
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
789
+ )
790
+
791
+ # Run delete report intent and return its result
792
+ #{self}.delete_report_intent(
793
+ id: 'required - report intent id',
794
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
795
+ )
796
+
797
+ # Run submit report intent and return its result
798
+ #{self}.submit_report_intent(
799
+ id: 'required - report intent id',
800
+ body: 'optional - JSON:API body Hash',
801
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
802
+ )
803
+
804
+ # Run get report intent attachments and return its result
805
+ #{self}.get_report_intent_attachments(
806
+ report_intent_id: 'required - report intent id value consumed by #get_report_intent_attachments (defaults to opts[:id])',
807
+ username: 'optional - optional, api_key: optional, h1_obj: optional',
808
+ id: 'required - id value consumed by #get_report_intent_attachments',
809
+ params: 'optional - params value consumed by #get_report_intent_attachments'
810
+ )
811
+
812
+ # Run delete report intent attachment and return its result
813
+ #{self}.delete_report_intent_attachment(
814
+ report_intent_id: 'required - report intent id value consumed by #delete_report_intent_attachment',
815
+ id: 'required - attachment id',
816
+ username: 'optional - optional, api_key: optional, h1_obj: optional'
817
+ )
818
+
819
+ # Clears the session hash in-place (no server-side session to destroy)
820
+ #{self}.logout(
821
+ h1_obj: 'required - required h1_obj returned from #login method'
822
+ )
823
+
824
+ # Print the AUTHOR(S) string for this module.
702
825
  #{self}.authors
703
826
  "
827
+ constants.sort
704
828
  end
705
829
  end
706
830
  end
@@ -142,18 +142,21 @@ module PWN
142
142
 
143
143
  public_class_method def self.help
144
144
  puts "USAGE:
145
- search_results = #{self}.query(
146
- api_key: 'required hunter api key',
145
+ # Run a search using the open session.
146
+ #{self}.search(
147
+ api_key: 'required - required hunter api key',
147
148
  query: 'required - hunter search query',
148
149
  start_time: 'required - start date for the search (format is yyyy-mm-dd)',
149
150
  end_time: 'required - end date for the search (format is yyyy-mm-dd)',
150
151
  start_page: 'optional - starting page number for pagination (default is 1)',
151
152
  page_size: 'optional - number of results per page (default is 10)',
152
- fields: 'optional - comma-separated list of fields 'product,transport_protocol,protocol,banner,country,province,city,asn,org,web,updated_at' (default is nil)'
153
+ fields: 'optional - comma-separated list of fields product,transport_protocol,protocol,banner,country,province,city,asn,org,web,updated_at (default is nil)'
153
154
  )
154
155
 
156
+ # Print the AUTHOR(S) string for this module.
155
157
  #{self}.authors
156
158
  "
159
+ constants.sort
157
160
  end
158
161
  end
159
162
  end
@@ -235,29 +235,34 @@ module PWN
235
235
 
236
236
  public_class_method def self.help
237
237
  puts "USAGE:
238
- is_rfc1918 = #{self}.check_rfc1918(
238
+ # Run check rfc1918 and return its result
239
+ #{self}.check_rfc1918(
239
240
  ip: 'required - IP to check'
240
241
  )
241
242
 
242
- ip_info_struc = #{self}.get(
243
+ # Run get and return its result
244
+ #{self}.get(
243
245
  target: 'required - IP or Host to lookup',
244
246
  proxy: 'optional - use a proxy',
245
- tls_port: 'optional port to check cert for Domain Name (default: 443). Will not execute if proxy parameter is set.',
247
+ tls_port: 'optional - optional port to check cert for Domain Name (default: 443). Will not execute if proxy parameter is set.',
246
248
  skip_api: 'optional - skip the API call',
247
249
  dns_server: 'optional - DNS server to use for lookup (default: your default DNS server)'
248
250
  )
249
251
 
252
+ # Run bruteforce subdomains and return its result
250
253
  #{self}.bruteforce_subdomains(
251
254
  parent_domain: 'required - Parent Domain to brute force',
252
255
  dictionary: 'required - Dictionary to use for subdomain brute force',
253
256
  max_threads: 'optional - Maximum number of threads to use (default: 9)',
254
257
  proxy: 'optional - use a proxy',
255
- tls_port: 'optional port to check cert for Domain Name (default: 443). Will not execute if proxy parameter is set.',
258
+ tls_port: 'optional - optional port to check cert for Domain Name (default: 443). Will not execute if proxy parameter is set.',
256
259
  results_file: 'optional - File to write results to (default: /tmp/parent_domain-timestamp-pwn_bruteforce_subdomains.txt)'
257
260
  )
258
261
 
262
+ # Print the AUTHOR(S) string for this module.
259
263
  #{self}.authors
260
264
  "
265
+ constants.sort
261
266
  end
262
267
  end
263
268
  end