pwn 0.5.708 → 0.5.709

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 (434) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/Installation.md +1 -0
  3. data/etc/default_skills/pwn/ai/agent/extrospection/osint/bridges/SKILL.md +30 -8
  4. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/SKILL.md +30 -8
  5. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/references/urls.md +1 -1
  6. data/etc/default_skills/pwn/ai/agent/extrospection/references/urls.md +0 -1
  7. data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
  8. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +48 -0
  9. data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
  10. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
  11. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
  12. data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +51 -0
  13. data/etc/default_skills/pwn/plugins/doctor/SKILL.md +57 -0
  14. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +61 -0
  15. data/etc/default_skills/pwn/plugins/frida/SKILL.md +49 -0
  16. data/etc/default_skills/pwn/plugins/gdb/SKILL.md +52 -0
  17. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
  18. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +48 -0
  19. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +52 -0
  20. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
  21. data/etc/default_skills/pwn/plugins/recon/SKILL.md +55 -0
  22. data/etc/default_skills/pwn/plugins/recon/references/urls.md +5 -0
  23. data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
  24. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
  25. data/etc/default_skills/pwn/plugins/volatility/SKILL.md +48 -0
  26. data/lib/pwn/ai/agent/assembly.rb +4 -1
  27. data/lib/pwn/ai/agent/btc.rb +4 -1
  28. data/lib/pwn/ai/agent/burp_suite.rb +5 -2
  29. data/lib/pwn/ai/agent/curriculum.rb +89 -30
  30. data/lib/pwn/ai/agent/dispatch.rb +27 -16
  31. data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
  32. data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
  33. data/lib/pwn/ai/agent/extrospection.rb +185 -60
  34. data/lib/pwn/ai/agent/gqrx.rb +4 -1
  35. data/lib/pwn/ai/agent/hacker_one.rb +5 -2
  36. data/lib/pwn/ai/agent/learning.rb +142 -25
  37. data/lib/pwn/ai/agent/loop.rb +53 -46
  38. data/lib/pwn/ai/agent/metrics.rb +133 -23
  39. data/lib/pwn/ai/agent/mistakes.rb +126 -17
  40. data/lib/pwn/ai/agent/open_goal.rb +25 -9
  41. data/lib/pwn/ai/agent/policy.rb +158 -18
  42. data/lib/pwn/ai/agent/prompt_builder.rb +21 -11
  43. data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
  44. data/lib/pwn/ai/agent/reflect.rb +9 -5
  45. data/lib/pwn/ai/agent/registry.rb +65 -12
  46. data/lib/pwn/ai/agent/result.rb +19 -10
  47. data/lib/pwn/ai/agent/reward.rb +150 -32
  48. data/lib/pwn/ai/agent/sast.rb +4 -1
  49. data/lib/pwn/ai/agent/swarm.rb +72 -36
  50. data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
  51. data/lib/pwn/ai/agent/tool_guard.rb +105 -6
  52. data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
  53. data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
  54. data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
  55. data/lib/pwn/ai/agent.rb +4 -0
  56. data/lib/pwn/ai/anthropic.rb +41 -7
  57. data/lib/pwn/ai/gemini.rb +21 -11
  58. data/lib/pwn/ai/grok.rb +44 -6
  59. data/lib/pwn/ai/http_retry.rb +40 -12
  60. data/lib/pwn/ai/ollama.rb +19 -10
  61. data/lib/pwn/ai/open_ai.rb +81 -30
  62. data/lib/pwn/ai/open_web_ui.rb +20 -14
  63. data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
  64. data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
  65. data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
  66. data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
  67. data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
  68. data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
  69. data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
  70. data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
  71. data/lib/pwn/ai/red_team/overreliance.rb +7 -1
  72. data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
  73. data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
  74. data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
  75. data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
  76. data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
  77. data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
  78. data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
  79. data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
  80. data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
  81. data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
  82. data/lib/pwn/ai/red_team.rb +4 -0
  83. data/lib/pwn/ai.rb +4 -0
  84. data/lib/pwn/aws/acm.rb +5 -2
  85. data/lib/pwn/aws/api_gateway.rb +10 -7
  86. data/lib/pwn/aws/app_stream.rb +5 -2
  87. data/lib/pwn/aws/application_auto_scaling.rb +5 -2
  88. data/lib/pwn/aws/application_discovery_service.rb +5 -2
  89. data/lib/pwn/aws/auto_scaling.rb +5 -2
  90. data/lib/pwn/aws/batch.rb +5 -2
  91. data/lib/pwn/aws/budgets.rb +5 -2
  92. data/lib/pwn/aws/cloud_formation.rb +5 -2
  93. data/lib/pwn/aws/cloud_front.rb +7 -4
  94. data/lib/pwn/aws/cloud_hsm.rb +5 -2
  95. data/lib/pwn/aws/cloud_search.rb +5 -2
  96. data/lib/pwn/aws/cloud_search_domain.rb +5 -2
  97. data/lib/pwn/aws/cloud_trail.rb +5 -2
  98. data/lib/pwn/aws/cloud_watch.rb +5 -2
  99. data/lib/pwn/aws/cloud_watch_events.rb +5 -2
  100. data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
  101. data/lib/pwn/aws/code_build.rb +5 -2
  102. data/lib/pwn/aws/code_commit.rb +5 -2
  103. data/lib/pwn/aws/code_deploy.rb +5 -2
  104. data/lib/pwn/aws/code_pipeline.rb +5 -2
  105. data/lib/pwn/aws/cognito_identity.rb +5 -2
  106. data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
  107. data/lib/pwn/aws/cognito_sync.rb +5 -2
  108. data/lib/pwn/aws/config_service.rb +5 -2
  109. data/lib/pwn/aws/data_pipleline.rb +5 -2
  110. data/lib/pwn/aws/database_migration_service.rb +5 -2
  111. data/lib/pwn/aws/device_farm.rb +5 -2
  112. data/lib/pwn/aws/direct_connect.rb +5 -2
  113. data/lib/pwn/aws/directory_service.rb +5 -2
  114. data/lib/pwn/aws/dynamo_db.rb +5 -2
  115. data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
  116. data/lib/pwn/aws/ec2.rb +5 -2
  117. data/lib/pwn/aws/ecr.rb +5 -2
  118. data/lib/pwn/aws/ecs.rb +5 -2
  119. data/lib/pwn/aws/efs.rb +5 -2
  120. data/lib/pwn/aws/elasti_cache.rb +5 -2
  121. data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
  122. data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
  123. data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
  124. data/lib/pwn/aws/elastic_transcoder.rb +5 -2
  125. data/lib/pwn/aws/elasticsearch_service.rb +5 -2
  126. data/lib/pwn/aws/emr.rb +5 -2
  127. data/lib/pwn/aws/firehose.rb +5 -2
  128. data/lib/pwn/aws/game_lift.rb +5 -2
  129. data/lib/pwn/aws/glacier.rb +6 -3
  130. data/lib/pwn/aws/health.rb +5 -2
  131. data/lib/pwn/aws/iam.rb +10 -4
  132. data/lib/pwn/aws/import_export.rb +5 -2
  133. data/lib/pwn/aws/inspector.rb +5 -2
  134. data/lib/pwn/aws/iot.rb +5 -2
  135. data/lib/pwn/aws/iot_data_plane.rb +5 -2
  136. data/lib/pwn/aws/kinesis.rb +5 -2
  137. data/lib/pwn/aws/kinesis_analytics.rb +5 -2
  138. data/lib/pwn/aws/kms.rb +5 -2
  139. data/lib/pwn/aws/lambda.rb +5 -2
  140. data/lib/pwn/aws/lambda_preview.rb +5 -2
  141. data/lib/pwn/aws/lex.rb +5 -2
  142. data/lib/pwn/aws/lightsail.rb +5 -2
  143. data/lib/pwn/aws/machine_learning.rb +5 -2
  144. data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
  145. data/lib/pwn/aws/marketplace_metering.rb +5 -2
  146. data/lib/pwn/aws/ops_works.rb +5 -2
  147. data/lib/pwn/aws/ops_works_cm.rb +5 -2
  148. data/lib/pwn/aws/pinpoint.rb +5 -2
  149. data/lib/pwn/aws/polly.rb +5 -2
  150. data/lib/pwn/aws/rds.rb +5 -2
  151. data/lib/pwn/aws/redshift.rb +5 -2
  152. data/lib/pwn/aws/rekognition.rb +5 -2
  153. data/lib/pwn/aws/route53.rb +5 -2
  154. data/lib/pwn/aws/route53_domains.rb +5 -2
  155. data/lib/pwn/aws/s3.rb +5 -2
  156. data/lib/pwn/aws/service_catalog.rb +5 -2
  157. data/lib/pwn/aws/ses.rb +5 -2
  158. data/lib/pwn/aws/shield.rb +5 -2
  159. data/lib/pwn/aws/simple_db.rb +5 -2
  160. data/lib/pwn/aws/sms.rb +5 -2
  161. data/lib/pwn/aws/snowball.rb +5 -2
  162. data/lib/pwn/aws/sns.rb +5 -2
  163. data/lib/pwn/aws/sqs.rb +5 -2
  164. data/lib/pwn/aws/ssm.rb +5 -2
  165. data/lib/pwn/aws/states.rb +5 -2
  166. data/lib/pwn/aws/storage_gateway.rb +5 -2
  167. data/lib/pwn/aws/sts.rb +4 -1
  168. data/lib/pwn/aws/support.rb +5 -2
  169. data/lib/pwn/aws/swf.rb +5 -2
  170. data/lib/pwn/aws/waf.rb +5 -2
  171. data/lib/pwn/aws/waf_regional.rb +5 -2
  172. data/lib/pwn/aws/workspaces.rb +5 -2
  173. data/lib/pwn/aws/x_ray.rb +5 -2
  174. data/lib/pwn/aws.rb +4 -0
  175. data/lib/pwn/banner/anon.rb +3 -0
  176. data/lib/pwn/banner/bubble.rb +3 -0
  177. data/lib/pwn/banner/cheshire.rb +3 -0
  178. data/lib/pwn/banner/code_cave.rb +3 -0
  179. data/lib/pwn/banner/dont_panic.rb +3 -0
  180. data/lib/pwn/banner/f_society.rb +3 -0
  181. data/lib/pwn/banner/fork_bomb.rb +3 -0
  182. data/lib/pwn/banner/jmp_esp.rb +3 -0
  183. data/lib/pwn/banner/matrix.rb +5 -1
  184. data/lib/pwn/banner/ninja.rb +3 -0
  185. data/lib/pwn/banner/off_the_air.rb +3 -0
  186. data/lib/pwn/banner/pirate.rb +3 -0
  187. data/lib/pwn/banner/radare2.rb +3 -0
  188. data/lib/pwn/banner/radare2_ai.rb +3 -0
  189. data/lib/pwn/banner/white_rabbit.rb +3 -0
  190. data/lib/pwn/banner.rb +6 -2
  191. data/lib/pwn/blockchain/btc.rb +8 -3
  192. data/lib/pwn/blockchain/eth.rb +10 -3
  193. data/lib/pwn/blockchain.rb +4 -0
  194. data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
  195. data/lib/pwn/bounty.rb +4 -0
  196. data/lib/pwn/config.rb +79 -13
  197. data/lib/pwn/cron.rb +297 -20
  198. data/lib/pwn/driver.rb +2 -18
  199. data/lib/pwn/ffi/adalm_pluto.rb +65 -11
  200. data/lib/pwn/ffi/fftw.rb +31 -6
  201. data/lib/pwn/ffi/hack_rf.rb +59 -8
  202. data/lib/pwn/ffi/liquid.rb +63 -10
  203. data/lib/pwn/ffi/rtl_sdr.rb +35 -5
  204. data/lib/pwn/ffi/soapy_sdr.rb +60 -10
  205. data/lib/pwn/ffi/stdio.rb +5 -8
  206. data/lib/pwn/ffi/volk.rb +36 -7
  207. data/lib/pwn/ffi.rb +12 -0
  208. data/lib/pwn/memory.rb +136 -16
  209. data/lib/pwn/memory_index.rb +34 -19
  210. data/lib/pwn/migrate.rb +34 -24
  211. data/lib/pwn/module_skills.rb +39 -8
  212. data/lib/pwn/plugins/aflplusplus.rb +52 -0
  213. data/lib/pwn/plugins/android.rb +65 -245
  214. data/lib/pwn/plugins/artifact_registry.rb +71 -0
  215. data/lib/pwn/plugins/assembly.rb +9 -4
  216. data/lib/pwn/plugins/authentication_helper.rb +8 -5
  217. data/lib/pwn/plugins/baresip.rb +59 -12
  218. data/lib/pwn/plugins/basic_auth.rb +9 -3
  219. data/lib/pwn/plugins/beef.rb +28 -18
  220. data/lib/pwn/plugins/binary_parser.rb +133 -0
  221. data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
  222. data/lib/pwn/plugins/burp_suite.rb +98 -68
  223. data/lib/pwn/plugins/bus_pirate.rb +15 -8
  224. data/lib/pwn/plugins/char.rb +33 -3
  225. data/lib/pwn/plugins/credential_attack.rb +99 -0
  226. data/lib/pwn/plugins/credit_card.rb +6 -1
  227. data/lib/pwn/plugins/dao_ldap.rb +19 -13
  228. data/lib/pwn/plugins/dao_mongo.rb +11 -5
  229. data/lib/pwn/plugins/dao_postgres.rb +28 -19
  230. data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
  231. data/lib/pwn/plugins/defect_dojo.rb +38 -22
  232. data/lib/pwn/plugins/detect_os.rb +5 -0
  233. data/lib/pwn/plugins/doctor.rb +149 -0
  234. data/lib/pwn/plugins/ein.rb +3 -0
  235. data/lib/pwn/plugins/exploit_dev.rb +264 -0
  236. data/lib/pwn/plugins/file_fu.rb +11 -8
  237. data/lib/pwn/plugins/frida.rb +61 -0
  238. data/lib/pwn/plugins/fuzz.rb +9 -6
  239. data/lib/pwn/plugins/gdb.rb +95 -0
  240. data/lib/pwn/plugins/git.rb +19 -14
  241. data/lib/pwn/plugins/github.rb +38 -15
  242. data/lib/pwn/plugins/google_workspace.rb +188 -45
  243. data/lib/pwn/plugins/hacker_one.rb +159 -35
  244. data/lib/pwn/plugins/hunter.rb +6 -3
  245. data/lib/pwn/plugins/ip_info.rb +9 -4
  246. data/lib/pwn/plugins/irc.rb +28 -15
  247. data/lib/pwn/plugins/jenkins.rb +65 -57
  248. data/lib/pwn/plugins/jira_data_center.rb +30 -22
  249. data/lib/pwn/plugins/jobs.rb +109 -0
  250. data/lib/pwn/plugins/json_pathify.rb +9 -5
  251. data/lib/pwn/plugins/log.rb +113 -13
  252. data/lib/pwn/plugins/mail_agent.rb +87 -79
  253. data/lib/pwn/plugins/metasploit.rb +11 -6
  254. data/lib/pwn/plugins/monkey_patch.rb +3 -0
  255. data/lib/pwn/plugins/msr206.rb +42 -28
  256. data/lib/pwn/plugins/nessus_cloud.rb +44 -4
  257. data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
  258. data/lib/pwn/plugins/nmap_it.rb +14 -34
  259. data/lib/pwn/plugins/nuclei.rb +57 -0
  260. data/lib/pwn/plugins/oauth2.rb +11 -5
  261. data/lib/pwn/plugins/ocr.rb +3 -0
  262. data/lib/pwn/plugins/open_api.rb +5 -2
  263. data/lib/pwn/plugins/openvas.rb +33 -25
  264. data/lib/pwn/plugins/packet.rb +152 -31
  265. data/lib/pwn/plugins/pdf_parse.rb +5 -2
  266. data/lib/pwn/plugins/pony.rb +86 -1
  267. data/lib/pwn/plugins/process_tube.rb +120 -0
  268. data/lib/pwn/plugins/ps.rb +7 -1
  269. data/lib/pwn/plugins/pwn_logger.rb +6 -2
  270. data/lib/pwn/plugins/rabbit_mq.rb +12 -7
  271. data/lib/pwn/plugins/radare2.rb +253 -0
  272. data/lib/pwn/plugins/recon.rb +161 -0
  273. data/lib/pwn/plugins/repl.rb +122 -1
  274. data/lib/pwn/plugins/scannable_codes.rb +5 -1
  275. data/lib/pwn/plugins/serial.rb +24 -14
  276. data/lib/pwn/plugins/shodan.rb +54 -35
  277. data/lib/pwn/plugins/slack_client.rb +11 -6
  278. data/lib/pwn/plugins/sock.rb +16 -8
  279. data/lib/pwn/plugins/spider.rb +5 -2
  280. data/lib/pwn/plugins/sqlmap.rb +49 -0
  281. data/lib/pwn/plugins/ssn.rb +3 -0
  282. data/lib/pwn/plugins/thread_pool.rb +6 -9
  283. data/lib/pwn/plugins/tor.rb +9 -4
  284. data/lib/pwn/plugins/transparent_browser.rb +62 -107
  285. data/lib/pwn/plugins/tty_spinner.rb +16 -2
  286. data/lib/pwn/plugins/twitter_api.rb +6 -2
  287. data/lib/pwn/plugins/uri_scheme.rb +4 -1
  288. data/lib/pwn/plugins/vault.rb +12 -3
  289. data/lib/pwn/plugins/vin.rb +24 -12
  290. data/lib/pwn/plugins/voice.rb +7 -2
  291. data/lib/pwn/plugins/volatility.rb +48 -0
  292. data/lib/pwn/plugins/vsphere.rb +9 -5
  293. data/lib/pwn/plugins/xxd.rb +12 -43
  294. data/lib/pwn/plugins/zaproxy.rb +30 -16
  295. data/lib/pwn/plugins.rb +19 -0
  296. data/lib/pwn/reports/ai_red_team.rb +6 -2
  297. data/lib/pwn/reports/csv.rb +8 -1
  298. data/lib/pwn/reports/fuzz.rb +5 -2
  299. data/lib/pwn/reports/html.rb +8 -1
  300. data/lib/pwn/reports/html_footer.rb +4 -3
  301. data/lib/pwn/reports/html_header.rb +6 -2
  302. data/lib/pwn/reports/json.rb +8 -1
  303. data/lib/pwn/reports/markdown.rb +8 -1
  304. data/lib/pwn/reports/pdf.rb +8 -1
  305. data/lib/pwn/reports/phone.rb +5 -2
  306. data/lib/pwn/reports/sast.rb +6 -2
  307. data/lib/pwn/reports/uri_buster.rb +5 -2
  308. data/lib/pwn/reports/xml.rb +8 -1
  309. data/lib/pwn/reports.rb +19 -0
  310. data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
  311. data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
  312. data/lib/pwn/sast/aws.rb +9 -3
  313. data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
  314. data/lib/pwn/sast/base64.rb +9 -3
  315. data/lib/pwn/sast/beef_hook.rb +9 -3
  316. data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
  317. data/lib/pwn/sast/cmd_execution_java.rb +9 -3
  318. data/lib/pwn/sast/cmd_execution_python.rb +9 -3
  319. data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
  320. data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
  321. data/lib/pwn/sast/csrf.rb +9 -3
  322. data/lib/pwn/sast/deserial_java.rb +9 -3
  323. data/lib/pwn/sast/emoticon.rb +9 -3
  324. data/lib/pwn/sast/eval.rb +9 -3
  325. data/lib/pwn/sast/factory.rb +9 -3
  326. data/lib/pwn/sast/http_authorization_header.rb +9 -3
  327. data/lib/pwn/sast/inner_html.rb +9 -3
  328. data/lib/pwn/sast/keystore.rb +9 -3
  329. data/lib/pwn/sast/local_storage.rb +9 -3
  330. data/lib/pwn/sast/location_hash.rb +9 -3
  331. data/lib/pwn/sast/log4j.rb +9 -3
  332. data/lib/pwn/sast/logger.rb +9 -3
  333. data/lib/pwn/sast/md5.rb +9 -3
  334. data/lib/pwn/sast/outer_html.rb +9 -3
  335. data/lib/pwn/sast/padding_oracle.rb +9 -3
  336. data/lib/pwn/sast/password.rb +9 -3
  337. data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
  338. data/lib/pwn/sast/php_type_juggling.rb +9 -3
  339. data/lib/pwn/sast/pom_version.rb +9 -3
  340. data/lib/pwn/sast/port.rb +9 -3
  341. data/lib/pwn/sast/post_message.rb +9 -3
  342. data/lib/pwn/sast/private_key.rb +9 -3
  343. data/lib/pwn/sast/redirect.rb +9 -3
  344. data/lib/pwn/sast/redos.rb +9 -3
  345. data/lib/pwn/sast/shell.rb +9 -3
  346. data/lib/pwn/sast/signature.rb +9 -3
  347. data/lib/pwn/sast/sql.rb +9 -3
  348. data/lib/pwn/sast/ssl.rb +9 -3
  349. data/lib/pwn/sast/sudo.rb +9 -3
  350. data/lib/pwn/sast/task_tag.rb +9 -3
  351. data/lib/pwn/sast/test_case_engine.rb +11 -7
  352. data/lib/pwn/sast/throw_errors.rb +9 -3
  353. data/lib/pwn/sast/token.rb +9 -3
  354. data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
  355. data/lib/pwn/sast/use_after_free.rb +9 -3
  356. data/lib/pwn/sast/version.rb +9 -3
  357. data/lib/pwn/sast/window_location_hash.rb +9 -3
  358. data/lib/pwn/sast.rb +4 -0
  359. data/lib/pwn/sdr/decoder/adsb.rb +36 -5
  360. data/lib/pwn/sdr/decoder/apt.rb +9 -6
  361. data/lib/pwn/sdr/decoder/base.rb +74 -22
  362. data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
  363. data/lib/pwn/sdr/decoder/dect.rb +12 -3
  364. data/lib/pwn/sdr/decoder/dsp.rb +229 -39
  365. data/lib/pwn/sdr/decoder/flex.rb +59 -11
  366. data/lib/pwn/sdr/decoder/gps.rb +12 -3
  367. data/lib/pwn/sdr/decoder/gsm.rb +24 -4
  368. data/lib/pwn/sdr/decoder/iridium.rb +12 -3
  369. data/lib/pwn/sdr/decoder/lora.rb +13 -4
  370. data/lib/pwn/sdr/decoder/lte.rb +27 -3
  371. data/lib/pwn/sdr/decoder/morse.rb +12 -3
  372. data/lib/pwn/sdr/decoder/p25.rb +12 -3
  373. data/lib/pwn/sdr/decoder/pager.rb +8 -5
  374. data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
  375. data/lib/pwn/sdr/decoder/rds.rb +14 -8
  376. data/lib/pwn/sdr/decoder/rfid.rb +12 -3
  377. data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
  378. data/lib/pwn/sdr/decoder/rtty.rb +8 -5
  379. data/lib/pwn/sdr/decoder/wifi.rb +12 -3
  380. data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
  381. data/lib/pwn/sdr/decoder.rb +9 -0
  382. data/lib/pwn/sdr/flipper_zero.rb +17 -10
  383. data/lib/pwn/sdr/frequency_allocation.rb +4 -1
  384. data/lib/pwn/sdr/gqrx.rb +178 -119
  385. data/lib/pwn/sdr/rfidler.rb +4 -1
  386. data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
  387. data/lib/pwn/sdr.rb +14 -0
  388. data/lib/pwn/sessions.rb +86 -16
  389. data/lib/pwn/setup.rb +94 -37
  390. data/lib/pwn/version.rb +1 -1
  391. data/lib/pwn/www/app_cobalt_io.rb +11 -5
  392. data/lib/pwn/www/bing.rb +10 -5
  393. data/lib/pwn/www/bug_crowd.rb +11 -5
  394. data/lib/pwn/www/checkip.rb +8 -4
  395. data/lib/pwn/www/coinbase_pro.rb +11 -5
  396. data/lib/pwn/www/duckduckgo.rb +12 -6
  397. data/lib/pwn/www/facebook.rb +11 -5
  398. data/lib/pwn/www/github.rb +11 -5
  399. data/lib/pwn/www/google.rb +11 -5
  400. data/lib/pwn/www/hacker_one.rb +20 -9
  401. data/lib/pwn/www/linkedin.rb +11 -5
  402. data/lib/pwn/www/pandora.rb +11 -5
  403. data/lib/pwn/www/pastebin.rb +9 -4
  404. data/lib/pwn/www/paypal.rb +19 -11
  405. data/lib/pwn/www/synack.rb +11 -5
  406. data/lib/pwn/www/torch.rb +13 -8
  407. data/lib/pwn/www/trading_view.rb +11 -5
  408. data/lib/pwn/www/twitter.rb +11 -5
  409. data/lib/pwn/www/uber.rb +11 -5
  410. data/lib/pwn/www/upwork.rb +11 -5
  411. data/lib/pwn/www/wayback_machine.rb +12 -6
  412. data/lib/pwn/www/youtube.rb +10 -5
  413. data/lib/pwn/www.rb +4 -0
  414. data/spec/conventions_spec.rb +118 -2
  415. data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
  416. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
  417. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
  418. data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
  419. data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
  420. data/spec/lib/pwn/plugins/doctor_spec.rb +23 -0
  421. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
  422. data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
  423. data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
  424. data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
  425. data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
  426. data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
  427. data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
  428. data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
  429. data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
  430. data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
  431. data/third_party/pwn_rdoc.jsonl +126 -5
  432. metadata +47 -3
  433. data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
  434. data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
@@ -186,16 +186,46 @@ module PWN
186
186
 
187
187
  public_class_method def self.help
188
188
  puts "USAGE:
189
+ # Run available and return its result
189
190
  #{self}.available?
191
+
192
+ # Run list devices and return its result
190
193
  #{self}.list_devices
191
- dev = #{self}.open(index: 0)
192
- #{self}.configure(device: dev, freq_hz:, rate_hz: 2_048_000, gain_db: nil, ppm: 0)
193
- #{self}.tuner_gains(device: dev)
194
- iq = #{self}.read_sync(device: dev, bytes: 262_144) # u8 I/Q String
195
- #{self}.close(device: dev)
196
194
 
195
+ # Open a session or connection and return a handle.
196
+ #{self}.open(
197
+ index: 'optional - index value consumed by #open'
198
+ )
199
+
200
+ # Close a session previously returned by #open.
201
+ #{self}.close(
202
+ device: 'optional - device value consumed by #close'
203
+ )
204
+
205
+ # Run configure and return its result
206
+ #{self}.configure(
207
+ device: 'required - pointer from .open',
208
+ freq_hz: 'required - center frequency Hz',
209
+ rate_hz: 'optional - sample rate (default 2.048e6)',
210
+ gain_db: 'optional - tenths of dB (e.g. 496 = 49.6 dB). nil = auto',
211
+ ppm: 'optional - freq correction ppm (default 0)'
212
+ )
213
+
214
+ # Run read sync and return its result
215
+ #{self}.read_sync(
216
+ device: 'required - pointer from .open',
217
+ bytes: 'optional - number of raw bytes to read (default 262144)'
218
+ )
219
+
220
+ # Run tuner gains and return its result
221
+ #{self}.tuner_gains(
222
+ device: 'required - device value consumed by #tuner_gains'
223
+ )
224
+
225
+ # Print the AUTHOR(S) string for this module.
197
226
  #{self}.authors
198
227
  "
228
+ constants.sort
199
229
  end
200
230
 
201
231
  class << self
@@ -317,22 +317,72 @@ module PWN
317
317
 
318
318
  public_class_method def self.help
319
319
  puts "USAGE:
320
+ # Run available and return its result
320
321
  #{self}.available?
322
+
323
+ # Run info and return its result
321
324
  #{self}.info
322
- #{self}.list_devices
323
- dev = #{self}.make(args: 'driver=rtlsdr')
324
- #{self}.device_keys(device: dev)
325
- #{self}.unmake(device: dev)
326
325
 
327
- h = #{self}.open(args: 'driver=rtlsdr')
328
- #{self}.configure(handle: h, freq_hz:, rate_hz: 2_048_000, gain_db: nil)
329
- #{self}.start_rx(handle: h)
330
- data = #{self}.read_sync(handle: h) # cs16le interleaved I/Q
331
- #{self}.stop_rx(handle: h)
332
- #{self}.close(handle: h)
326
+ # Run list devices and return its result
327
+ #{self}.list_devices
333
328
 
329
+ # Run make and return its result
330
+ #{self}.make(
331
+ args: 'required - args value consumed by #make'
332
+ )
333
+
334
+ # Run unmake and return its result
335
+ #{self}.unmake(
336
+ device: 'optional - device value consumed by #unmake'
337
+ )
338
+
339
+ # Run device keys and return its result
340
+ #{self}.device_keys(
341
+ device: 'required - device value consumed by #device_keys'
342
+ )
343
+
344
+ # Open a session or connection and return a handle.
345
+ #{self}.open(
346
+ args: 'optional - Soapy args string, e.g. driver=rtlsdr',
347
+ channel: 'optional - RX channel (default 0)'
348
+ )
349
+
350
+ # Run configure and return its result
351
+ #{self}.configure(
352
+ handle: 'required - from .open',
353
+ freq_hz: 'required - center frequency Hz',
354
+ rate_hz: 'optional - sample rate Hz (default 2_048_000)',
355
+ gain_db: 'optional - overall gain dB (default AGC on)',
356
+ bw_hz: 'optional - baseband filter BW Hz'
357
+ )
358
+
359
+ # Sets up + activates a CS16 RX stream. Extends handle in place
360
+ #{self}.start_rx(
361
+ handle: 'required - from .open',
362
+ samples: 'optional - MTU / read block size (default 65536)'
363
+ )
364
+
365
+ # Run read sync and return its result
366
+ #{self}.read_sync(
367
+ handle: 'required - from .start_rx',
368
+ timeout_us: 'optional - microseconds (default 1_000_000)'
369
+ )
370
+
371
+ # Run stop rx and return its result
372
+ #{self}.stop_rx(
373
+ handle: 'optional - handle value consumed by #stop_rx'
374
+ )
375
+
376
+ # Close a session previously returned by #open.
377
+ #{self}.close(
378
+ handle: 'optional - handle value consumed by #close',
379
+ device: 'optional - device value consumed by #close'
380
+ )
381
+
382
+ # Print the AUTHOR(S) string for this module.
334
383
  #{self}.authors
335
384
  "
385
+ constants.sort
336
386
  end
337
387
  end
338
388
  end
data/lib/pwn/ffi/stdio.rb CHANGED
@@ -34,17 +34,14 @@ module PWN
34
34
  # Display Usage for this Module
35
35
 
36
36
  public_class_method def self.help
37
- # NB: bare `puts` here would resolve to the FFI-attached libc puts
38
- # (writes to C stdout, bypasses $stdout capture, flushes at exit).
39
- $stdout.puts "USAGE:
40
- #{self}.puts string
41
- #{self}.printf(\"format string\", str, int, etc)
42
-
43
- scanf_buffer = FFI::MemoryPointer.new(:char, 100)
44
- #{self}.scanf(\"format string\", scanf_buffer)
37
+ puts "USAGE:
38
+ # Run available and return its result
39
+ #{self}.available?
45
40
 
41
+ # Print the AUTHOR(S) string for this module.
46
42
  #{self}.authors
47
43
  "
44
+ constants.sort
48
45
  end
49
46
  end
50
47
  end
data/lib/pwn/ffi/volk.rb CHANGED
@@ -173,16 +173,45 @@ module PWN
173
173
 
174
174
  public_class_method def self.help
175
175
  puts "USAGE:
176
- #{self}.available? # => true/false
177
- #{self}.unpack_s16le(data: raw_bytes) # s16le → Float[-1,1]
178
- #{self}.accumulate(samples:) # Σ samples
179
- #{self}.magnitude_squared(iq:) # |z|² per complex pair
180
- #{self}.sqrt(samples:)
181
- #{self}.scale(samples:, factor:)
182
- #{self}.dot_prod(a:, b:)
176
+ # Run available and return its result
177
+ #{self}.available?
183
178
 
179
+ # Run unpack s16le and return its result
180
+ #{self}.unpack_s16le(
181
+ data: 'required - raw String of little-endian signed 16-bit PCM'
182
+ )
183
+
184
+ # Run accumulate and return its result
185
+ #{self}.accumulate(
186
+ samples: 'optional - samples value consumed by #accumulate'
187
+ )
188
+
189
+ # Run magnitude squared and return its result
190
+ #{self}.magnitude_squared(
191
+ iq: 'required - Array of interleaved I/Q Floats (even length)'
192
+ )
193
+
194
+ # Run sqrt and return its result
195
+ #{self}.sqrt(
196
+ samples: 'optional - samples value consumed by #sqrt'
197
+ )
198
+
199
+ # Run scale and return its result
200
+ #{self}.scale(
201
+ samples: 'optional - samples value consumed by #scale',
202
+ factor: 'optional - factor value consumed by #scale'
203
+ )
204
+
205
+ # Run dot prod and return its result
206
+ #{self}.dot_prod(
207
+ a: 'required - a value consumed by #dot_prod',
208
+ b: 'required - b value consumed by #dot_prod'
209
+ )
210
+
211
+ # Print the AUTHOR(S) string for this module.
184
212
  #{self}.authors
185
213
  "
214
+ constants.sort
186
215
  end
187
216
 
188
217
  class << self
data/lib/pwn/ffi.rb CHANGED
@@ -59,6 +59,18 @@ module PWN
59
59
  # Display a List of Every PWN::FFI Module
60
60
 
61
61
  public_class_method def self.help
62
+ puts "USAGE:
63
+ # Run available and return its result
64
+ #{self}.available?(
65
+ mod: 'required - Symbol or Module (e.g. :Liquid or PWN::FFI::Liquid)'
66
+ )
67
+
68
+ # Returns { ModuleName => true|false } for every registered binding
69
+ #{self}.backends
70
+
71
+ # Print the AUTHOR(S) string for this module.
72
+ #{self}.authors
73
+ "
62
74
  constants.sort
63
75
  end
64
76
  end
data/lib/pwn/memory.rb CHANGED
@@ -600,22 +600,142 @@ module PWN
600
600
 
601
601
  # Display Usage for this Module
602
602
  public_class_method def self.help
603
- puts <<~USAGE
604
- USAGE:
605
- mem = PWN::Memory.load
606
- PWN::Memory.remember(key: :user_prefers_ruby, value: 'Always prefer pure Ruby + RestClient patterns', category: :preference)
607
- facts = PWN::Memory.recall(query: 'recon', category: :fact, limit: 10)
608
- # session-first (previous response → older), then durable newest-first:
609
- sess = PWN::Memory.recall(limit: 10) # or session_id: '20260811_...'
610
- hits = PWN::Memory.recall_semantic(query: 'recon', limit: 6) # embedding-ranked
611
- PWN::Memory.forget(key: :some_key)
612
- PWN::Memory.forget(key: :operator_pref_x) rescue puts('protected')
613
- PWN::Memory.clear(force: true)
614
- context_str = PWN::Memory.to_context
615
- PWN::Memory.lean!(dry_run: true) # drop expired session_* + truncate values
616
-
617
- #{self}.authors
618
- USAGE
603
+ puts "USAGE:
604
+ # Run load and return its result
605
+ #{self}.load
606
+
607
+ # Run save and return its result
608
+ #{self}.save(
609
+ mem: 'optional - mem value consumed by #save',
610
+ force: 'optional - force value consumed by #save'
611
+ )
612
+
613
+ # Run remember and return its result
614
+ #{self}.remember(
615
+ key: 'required - Symbol or String key for the memory fact',
616
+ value: 'required - The value (any JSON serializable)',
617
+ category: 'optional - e.g. :fact, :preference, :lesson, :env (default: :fact)',
618
+ source: 'optional - :human | :reflect | :heuristic | :resolve | :consolidate (M3 provenance)',
619
+ confidence: 'optional - 0.0..1.0 how sure the writer was (M3)',
620
+ importance: 'optional - 0.0..1.0 retrieval/eviction weight (M2/M3)',
621
+ ttl: 'optional - seconds until stale (M3; consolidate evicts stale low-conf first)'
622
+ )
623
+
624
+ # Run recall and return its result
625
+ #{self}.recall(
626
+ query: 'optional - string to search keys/values/categories (simple match)',
627
+ category: 'optional - filter by category (:session = transcript only)',
628
+ limit: 'optional - max results (default 50)',
629
+ session_id: 'optional - current session (default Env/Pry active id)',
630
+ include_session: 'optional - include session value consumed by #recall'
631
+ )
632
+
633
+ # Resolve the active pwn-ai session id (Env, then Pry config)
634
+ #{self}.current_session_id(
635
+ session_id: 'optional - session id value consumed by #current_session_id'
636
+ )
637
+
638
+ # Walk the current session transcript from the previous assistant response
639
+ #{self}.session_turns(
640
+ session_id: 'optional - session id value consumed by #session_turns',
641
+ query: 'required - search query string',
642
+ limit: 'optional - limit value consumed by #session_turns'
643
+ )
644
+
645
+ # Run recent dialog and return its result
646
+ #{self}.recent_dialog(
647
+ session_id: 'optional - session id value consumed by #recent_dialog',
648
+ pairs: 'optional - max user/assistant pairs (default 2)',
649
+ max_chars: 'optional - per-turn truncation (default 1200)'
650
+ )
651
+
652
+ # Previous non-empty user message in the active session (what the human
653
+ #{self}.prior_user_message(
654
+ pairs: 'optional - pairs value consumed by #prior_user_message',
655
+ max_chars: 'optional - max chars value consumed by #prior_user_message (defaults to 4_000)',
656
+ skip_meta: 'optional - skip meta value consumed by #prior_user_message',
657
+ session_id: 'optional - session id value consumed by #prior_user_message'
658
+ )
659
+
660
+ # Previous non-empty assistant message in the active session
661
+ #{self}.prior_assistant_message(
662
+ pairs: 'optional - pairs value consumed by #prior_assistant_message',
663
+ max_chars: 'optional - max chars value consumed by #prior_assistant_message (defaults to 4_000)',
664
+ skip_meta: 'optional - skip meta value consumed by #prior_assistant_message',
665
+ session_id: 'optional - session id value consumed by #prior_assistant_message'
666
+ )
667
+
668
+ # Build chronological user→assistant pairs from the active session
669
+ #{self}.turn_pairs(
670
+ pairs: 'optional - pairs value consumed by #turn_pairs',
671
+ max_chars: 'optional - max chars value consumed by #turn_pairs',
672
+ session_id: 'optional - session id value consumed by #turn_pairs',
673
+ include_orphan_user: 'optional - include orphan user value consumed by #turn_pairs'
674
+ )
675
+
676
+ # Find a user↔assistant pair in the active session
677
+ #{self}.find_turn_pair(
678
+ match: 'required - match value consumed by #find_turn_pair',
679
+ skip_meta: 'optional - skip meta value consumed by #find_turn_pair',
680
+ session_id: 'optional - session id value consumed by #find_turn_pair',
681
+ pairs: 'optional - pairs value consumed by #find_turn_pair (defaults to 12)',
682
+ max_chars: 'optional - max chars value consumed by #find_turn_pair (defaults to 4_000)'
683
+ )
684
+
685
+ # Run meta recall user and return its result
686
+ #{self}.meta_recall_user?(
687
+ text: 'optional - text value consumed by #meta_recall_user?'
688
+ )
689
+
690
+ # Run meta recall assistant and return its result
691
+ #{self}.meta_recall_assistant?(
692
+ text: 'optional - text value consumed by #meta_recall_assistant?'
693
+ )
694
+
695
+ # Run normalize utterance and return its result
696
+ #{self}.normalize_utterance(
697
+ text: 'optional - text value consumed by #normalize_utterance'
698
+ )
699
+
700
+ # Run recall semantic and return its result
701
+ #{self}.recall_semantic(
702
+ query: 'optional - search query string',
703
+ limit: 'optional - limit value consumed by #recall_semantic'
704
+ )
705
+
706
+ # Refuses PROTECT_KEY_PREFIXES / PROTECT_CATEGORIES unless force:true
707
+ #{self}.forget(
708
+ key: 'required - key value consumed by #forget',
709
+ force: 'optional - Boolean bypass protect policy (default false)'
710
+ )
711
+
712
+ # Requires force:true — protected prefs/SOPs must not vanish via bare clear
713
+ #{self}.clear(
714
+ force: 'required - force value consumed by #clear'
715
+ )
716
+
717
+ # Run to context and return its result
718
+ #{self}.to_context(
719
+ limit: 'optional - limit value consumed by #to_context (defaults to 20)'
720
+ )
721
+
722
+ # True when a memory key must survive cap eviction / age GC
723
+ #{self}.protected_entry?(
724
+ key: 'optional - key value consumed by #protected_entry?',
725
+ entry: 'optional - entry value consumed by #protected_entry?'
726
+ )
727
+
728
+ # Run lean and return its result
729
+ #{self}.lean!(
730
+ dry_run: 'optional - Boolean plan only (default false)',
731
+ value_max_chars: 'optional - truncate values (default VALUE_MAX_CHARS)',
732
+ ephemeral_ttl_secs: 'optional - drop expired session_* keys'
733
+ )
734
+
735
+ # Print the AUTHOR(S) string for this module.
736
+ #{self}.authors
737
+ "
738
+ constants.sort
619
739
  end
620
740
  end
621
741
  end
@@ -281,25 +281,40 @@ module PWN
281
281
  # Display Usage for this Module
282
282
 
283
283
  public_class_method def self.help
284
- puts <<~USAGE
285
- USAGE:
286
- PWN::MemoryIndex.available?
287
- PWN::MemoryIndex.recall_semantic(query: 'nmap sweep', limit: 6)
288
- PWN::MemoryIndex.to_context(query: 'nmap sweep', limit: 6) # PromptBuilder drop-in
289
- PWN::MemoryIndex.refresh # incremental (re)embed
290
- PWN::MemoryIndex.embed(texts: ['a', 'b']) # raw vectors
291
- PWN::MemoryIndex.reset
292
-
293
- Config (prefer direct Ollama; Open WebUI is the fallback proxy):
294
- PWN::Env[:ai][:ollama][:base_uri] = 'http://127.0.0.1:11434'
295
- PWN::Env[:ai][:ollama][:embed_model] = '<embed-model-tag>'
296
- # or:
297
- PWN::Env[:ai][:openwebui][:base_uri] = 'https://openwebui.local'
298
- PWN::Env[:ai][:openwebui][:key] = '<jwt>'
299
- PWN::Env[:ai][:openwebui][:embed_model] = '<embed-model-tag>'
300
-
301
- #{self}.authors
302
- USAGE
284
+ puts "USAGE:
285
+ # Run available and return its result
286
+ #{self}.available?
287
+
288
+ # Run recall semantic and return its result
289
+ #{self}.recall_semantic(
290
+ query: 'required - user request / search text',
291
+ limit: 'optional - top-K by cosine similarity (default 6)'
292
+ )
293
+
294
+ # Run to context and return its result
295
+ #{self}.to_context(
296
+ limit: 'optional - limit value consumed by #to_context (defaults to 6)',
297
+ drop_hygiene_sops: 'optional - drop hygiene sops value consumed by #to_context',
298
+ query: 'optional - search query string'
299
+ )
300
+
301
+ # Run refresh and return its result
302
+ #{self}.refresh(
303
+ mem: 'optional - mem value consumed by #refresh (defaults to PWN::Memory.load)'
304
+ )
305
+
306
+ # Run embed and return its result
307
+ #{self}.embed(
308
+ texts: 'required - Array texts value consumed by #embed'
309
+ )
310
+
311
+ # Run reset and return its result
312
+ #{self}.reset
313
+
314
+ # Print the AUTHOR(S) string for this module.
315
+ #{self}.authors
316
+ "
317
+ constants.sort
303
318
  end
304
319
  end
305
320
  end
data/lib/pwn/migrate.rb CHANGED
@@ -679,40 +679,50 @@ module PWN
679
679
 
680
680
  public_class_method def self.help
681
681
  puts "USAGE:
682
- # Is ~/.pwn older than this pwn release's schema?
683
- #{self}.needed? # => true/false (cheap; used by refresh_env)
682
+ # Run installed schema and return its result
683
+ #{self}.installed_schema
684
684
 
685
- # Read-only per-file compatibility report.
686
- #{self}.status # => { schema_installed:, schema_current:, files:[…], incompatible:[…] }
687
- #{self}.check # human-readable to $stdout
685
+ # Run needed and return its result
686
+ #{self}.needed?
688
687
 
689
- # Apply schema migrations + (optionally) autofix incompatible files.
690
- # Always takes a timestamped backup under ~/.pwn/backup/<ts>/ first.
688
+ # Run status and return its result
689
+ #{self}.status
690
+
691
+ # Human-readable ~/.pwn state doctor. Read-only. Called from
692
+ #{self}.check(
693
+ io: 'optional - IO to write the report to (default $stdout)'
694
+ )
695
+
696
+ # Run run and return its result
691
697
  #{self}.run(
692
- fix: 'optional - also autofix per-file (default false)',
693
- backup: 'optional - default true',
694
- dry_run: 'optional - default false',
695
- key: 'optional - vault key (default: ~/.pwn/pwn.yaml.decryptor)',
696
- iv: 'optional - vault iv'
698
+ fix: 'optional - also autofix incompatible files (default: schema-migrations only)',
699
+ backup: 'optional - take timestamped backup of ~/.pwn first (default true)',
700
+ dry_run: 'optional - report what WOULD happen, write nothing (default false)',
701
+ key: 'optional - vault key (default: read ~/.pwn/pwn.yaml.decryptor)',
702
+ iv: 'optional - vault iv (default: read ~/.pwn/pwn.yaml.decryptor)',
703
+ io: 'optional - IO to write to (default $stdout)'
697
704
  )
698
705
 
699
- # pwn.yaml specifically deep-merge missing keys from the
700
- # current release template UNDER the user's values, re-encrypt.
701
- #{self}.vault_drift # => { missing: [dotted.paths], } or nil
702
- #{self}.backfill_vault
706
+ # Run vault drift and return its result
707
+ #{self}.vault_drift(
708
+ key: 'optional - vault key, iv: optional - vault iv'
709
+ )
703
710
 
704
- # Data:
705
- #{self}::SCHEMA_VERSION # bump when a ~/.pwn file shape changes
706
- #{self}::STATE_FILES # rel-path owner verifier fix
707
- #{self}::MIGRATIONS # ordered idempotent transforms
711
+ # Run backfill vault and return its result
712
+ #{self}.backfill_vault(
713
+ key: 'optional - optional, iv: optional, dry_run: false, io: $stdout',
714
+ io: 'optional - io value consumed by #backfill_vault',
715
+ dry_run: 'optional - dry run value consumed by #backfill_vault',
716
+ iv: 'optional - iv value consumed by #backfill_vault'
717
+ )
708
718
 
709
- # From the shell:
710
- pwn setup --migrate # == #{self}.run
711
- pwn setup --migrate --fix # == #{self}.run(fix: true)
712
- pwn setup --migrate --dry-run
719
+ # Run env template and return its result
720
+ #{self}.env_template
713
721
 
722
+ # Print the AUTHOR(S) string for this module.
714
723
  #{self}.authors
715
724
  "
725
+ constants.sort
716
726
  end
717
727
  end
718
728
  end
@@ -435,14 +435,45 @@ module PWN
435
435
  end
436
436
 
437
437
  public_class_method def self.help
438
- puts <<~USAGE
439
- USAGE:
440
- #{self}.enumerate
441
- #{self}.refresh!
442
- #{self}.drift
443
- #{self}.install(pwn_skills_path: '~/.pwn/skills')
444
- #{self}.authors
445
- USAGE
438
+ puts "USAGE:
439
+ # Run enumerate and return its result
440
+ #{self}.enumerate(
441
+ lib_root: 'optional - lib root value consumed by #enumerate'
442
+ )
443
+
444
+ # Run relpath and return its result
445
+ #{self}.relpath(
446
+ source: 'optional - source value consumed by #relpath',
447
+ const: 'optional - const value consumed by #relpath'
448
+ )
449
+
450
+ # Run render and return its result
451
+ #{self}.render(
452
+ module: 'optional - module value consumed by #render (defaults to opts)'
453
+ )
454
+
455
+ # Run refresh and return its result
456
+ #{self}.refresh!(
457
+ dest: 'required - dest value consumed by #refresh!',
458
+ lib_root: 'optional - lib root value consumed by #refresh!'
459
+ )
460
+
461
+ # Run drift and return its result
462
+ #{self}.drift(
463
+ dest: 'required - dest value consumed by #drift',
464
+ lib_root: 'optional - lib root value consumed by #drift'
465
+ )
466
+
467
+ # Run install and return its result
468
+ #{self}.install(
469
+ pwn_skills_path: 'required - pwn skills path value consumed by #install',
470
+ source: 'optional - source value consumed by #install'
471
+ )
472
+
473
+ # Print the AUTHOR(S) string for this module.
474
+ #{self}.authors
475
+ "
476
+ constants.sort
446
477
  end
447
478
  end
448
479
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+
5
+ module PWN
6
+ module Plugins
7
+ # AFL++ campaign wrapper.
8
+ module AFLplusplus
9
+ public_class_method def self.required_bins
10
+ %w[afl-fuzz]
11
+ end
12
+
13
+ public_class_method def self.fuzz(opts = {})
14
+ PWN::Plugins::Doctor.require_bin!(name: 'afl-fuzz')
15
+ in_dir = opts[:in_dir] || opts[:corpus]
16
+ out_dir = opts[:out_dir] || opts[:output]
17
+ target = opts[:target]
18
+ raise 'ERROR: in_dir, out_dir, and target are required' if in_dir.to_s.empty? || out_dir.to_s.empty? || target.to_s.empty?
19
+
20
+ cmd = ['afl-fuzz', '-i', in_dir.to_s, '-o', out_dir.to_s, '--', target.to_s]
21
+ cmd.concat(Array(opts[:args]))
22
+ stdout, stderr, status = Open3.capture3(*cmd)
23
+ { stdout: stdout, stderr: stderr, exit: status.exitstatus }
24
+ end
25
+
26
+ public_class_method def self.authors
27
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
28
+ end
29
+
30
+ public_class_method def self.help
31
+ puts "USAGE:
32
+ # List host binaries this module expects to be installed.
33
+ #{self}.required_bins
34
+
35
+ # Run fuzz and return its result
36
+ #{self}.fuzz(
37
+ in_dir: 'required - in dir value consumed by #fuzz (defaults to opts[:corpus])',
38
+ corpus: 'optional - corpus value consumed by #fuzz',
39
+ out_dir: 'required - out dir value consumed by #fuzz (defaults to opts[:output])',
40
+ output: 'optional - output value consumed by #fuzz',
41
+ target: 'required - hostname, IP, or CIDR to scan',
42
+ args: 'optional - Array args value consumed by #fuzz'
43
+ )
44
+
45
+ # Print the AUTHOR(S) string for this module.
46
+ #{self}.authors
47
+ "
48
+ constants.sort
49
+ end
50
+ end
51
+ end
52
+ end