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
@@ -249,63 +249,76 @@ module PWN
249
249
 
250
250
  public_class_method def self.help
251
251
  puts "USAGE:
252
- irc_obj = #{self}.connect(
253
- host: 'required - host or ip',
254
- port: 'required - host port',
255
- nick: 'required - nickname',
252
+ # Run connect and return its result
253
+ #{self}.connect(
254
+ host: 'required - host or ip (defaults to 127.0.0.1)',
255
+ port: 'required - host port (defaults to 6667)',
256
+ nick: 'required - nick value consumed by #connect',
256
257
  real: 'optional - real name (defaults to value of nick)',
257
258
  tls: 'optional - boolean connect to host socket using TLS (defaults to false)'
258
259
  )
259
260
 
260
- #{self}.ping(
261
+ # Run join and return its result
262
+ #{self}.join(
261
263
  irc_obj: 'required - irc_obj returned from #connect method',
262
- message: 'required - message to send'
264
+ nick: 'required - nick value consumed by #join',
265
+ chan: 'required - channel to join'
263
266
  )
264
267
 
265
- #{self}.pong(
268
+ # Run names and return its result
269
+ #{self}.names(
266
270
  irc_obj: 'required - irc_obj returned from #connect method',
267
- message: 'required - message to send'
271
+ chan: 'required - channel to list names'
268
272
  )
269
273
 
274
+ # Run privmsg and return its result
270
275
  #{self}.privmsg(
271
276
  irc_obj: 'required - irc_obj returned from #connect method',
272
277
  chan: 'required - channel to send message',
273
- message: 'required - message to send'
278
+ message: 'required - message to send',
279
+ nick: 'optional - nick value consumed by #privmsg'
274
280
  )
275
281
 
276
- #{self}.join(
282
+ # Run ping and return its result
283
+ #{self}.ping(
277
284
  irc_obj: 'required - irc_obj returned from #connect method',
278
- nick: 'required - nickname',
279
- chan: 'required - channel to join'
285
+ message: 'required - message to send'
280
286
  )
281
287
 
282
- #{self}.names(
288
+ # Run pong and return its result
289
+ #{self}.pong(
283
290
  irc_obj: 'required - irc_obj returned from #connect method',
284
- chan: 'required - channel to list names'
291
+ message: 'required - message to send'
285
292
  )
286
293
 
294
+ # Run part and return its result
287
295
  #{self}.part(
288
296
  irc_obj: 'required - irc_obj returned from #connect method',
289
297
  chan: 'required - channel to part',
290
298
  message: 'optional - message to send when parting'
291
299
  )
292
300
 
301
+ # Run quit and return its result
293
302
  #{self}.quit(
294
303
  irc_obj: 'required - irc_obj returned from #connect method',
295
304
  message: 'optional - message to send when quitting'
296
305
  )
297
306
 
307
+ # Run listen and return its result
298
308
  #{self}.listen(
299
309
  irc_obj: 'required - irc_obj returned from #connect method',
300
310
  verbose: 'optional - boolean to enable verbose output (defaults to false)'
301
311
  )
302
312
 
303
- irc_obj = #{self}.disconnect(
313
+ # Run disconnect and return its result
314
+ #{self}.disconnect(
304
315
  irc_obj: 'required - irc_obj returned from #connect method'
305
316
  )
306
317
 
318
+ # Print the AUTHOR(S) string for this module.
307
319
  #{self}.authors
308
320
  "
321
+ constants.sort
309
322
  end
310
323
  end
311
324
  end
@@ -442,95 +442,103 @@ module PWN
442
442
  # Display Usage for this Module
443
443
 
444
444
  public_class_method def self.help
445
- puts %{USAGE:
446
- jenkins_obj = #{self}.connect(
447
- ip: 'required host/ip of Jenkins Server',
448
- port: 'optional tcp port (defaults to 8080),
449
- username: 'optional username (functionality will be limited if ommitted)',
450
- api_key: 'optional api_key (functionality will be limited if ommitted)',
451
- identity_file: 'optional ssh private key path to AuthN w/ Jenkins PREFERRED over username/api_key',
452
- ssl: 'optional connect over TLS (defaults to true),
453
- proxy: 'optional debug proxy rest api requests to jenkins (e.g. "http://127.0.0.1:8080")''
445
+ puts "USAGE:
446
+ # Run connect and return its result
447
+ #{self}.connect(
448
+ ip: 'required - required host/ip of Jenkins Server',
449
+ port: 'optional - optional tcp port (defaults to 8080',
450
+ username: 'optional - optional username (functionality will be limited if ommitted)',
451
+ api_key: 'optional - optional api_key (functionality will be limited if ommitted)',
452
+ identity_file: 'optional - optional ssh private key path to AuthN w/ Jenkins PREFERRED over username/api_key',
453
+ ssl: 'optional - optional connect over TLS (defaults to true',
454
+ proxy: 'optional - optional debug proxy rest api requests to jenkins (e.g. http://127.0.0.1:8080)'
454
455
  )
455
- puts jenkins_obj.public_methods
456
456
 
457
+ # Run create user and return its result
457
458
  #{self}.create_user(
458
- jenkins_obj: 'required - jenkins_obj returned from #connect method',
459
- username: 'required - user to create',
460
- password: 'optional - password for new user (will prompt if nil)'
461
- fullname: 'required - full name of new user'
462
- email: 'required - email address of new user'
459
+ jenkins_obj: 'optional - jenkins obj value consumed by #create_user',
460
+ username: 'optional - username value consumed by #create_user',
461
+ password: 'optional - password value consumed by #create_user',
462
+ fullname: 'optional - fullname value consumed by #create_user',
463
+ email: 'optional - email value consumed by #create_user'
463
464
  )
464
465
 
466
+ # Run create ssh credential and return its result
465
467
  #{self}.create_ssh_credential(
466
- jenkins_obj: 'required - jenkins_obj returned from #connect method',
467
- username: 'required - username for new credential'
468
- private_key_path: 'required - path of private ssh key for new credential'
469
- key_passphrase: 'optional - private key passphrase for new credential'
470
- credential_id: 'optional but recommended - useful when creating userland jobs',
471
- description: 'optional - description of new credential'
472
- domain: 'optional - defaults to GLOBAL',
473
- scope: 'optional - GLOBAL or SYSTEM (defaults to GLOBAL)'
468
+ jenkins_obj: 'optional - jenkins obj value consumed by #create_ssh_credential',
469
+ username: 'optional - username value consumed by #create_ssh_credential',
470
+ private_key_path: 'optional - private key path value consumed by #create_ssh_credential',
471
+ key_passphrase: 'optional - key passphrase value consumed by #create_ssh_credential',
472
+ credential_id: 'optional - credential id value consumed by #create_ssh_credential',
473
+ description: 'optional - description value consumed by #create_ssh_credential',
474
+ domain: 'optional - FQDN to query (e.g. example.com)',
475
+ scope: 'optional - scope value consumed by #create_ssh_credential'
474
476
  )
475
477
 
476
- git_repo_arr = #{self}.get_all_job_git_repos(
477
- jenkins_obj: 'required jenkins_obj returned from connect method'
478
+ # Run get all job git repos and return its result
479
+ #{self}.get_all_job_git_repos(
480
+ jenkins_obj: 'required - required jenkins_obj returned from #connect method'
478
481
  )
479
482
 
480
- git_repo_branches = #{self}.get_all_git_repo_branches_by_commit_date(
481
- jenkins_obj: 'required jenkins_obj returned from #connect method',
482
- job_name: 'required jenkins job name',
483
- git_url: 'required git url for git_repo'
483
+ # Run list nested jobs and return its result
484
+ #{self}.list_nested_jobs(
485
+ jenkins_obj: 'required - required jenkins_obj returned from #connect method',
486
+ view_path: 'required - required view path to list jobs'
484
487
  )
485
488
 
486
- nested_jobs_arr = #{self}.list_nested_jobs(
487
- jenkins_obj: 'required jenkins_obj returned from #connect method',
488
- view_path: 'required view path list jobs'
489
+ # Run list nested views and return its result
490
+ #{self}.list_nested_views(
491
+ jenkins_obj: 'required - required jenkins_obj returned from #connect method',
492
+ view_path: 'required - required view path list sub-views'
489
493
  )
490
494
 
491
- nested_views_arr = #{self}.list_nested_views(
492
- jenkins_obj: 'required jenkins_obj returned from #connect method',
493
- view_path: 'required view path list sub-views'
495
+ # Run create nested view and return its result
496
+ #{self}.create_nested_view(
497
+ jenkins_obj: 'optional - jenkins obj value consumed by #create_nested_view',
498
+ view_name: 'optional - view name value consumed by #create_nested_view',
499
+ create_in_view_path: 'optional - create in view path value consumed by #create_nested_view'
494
500
  )
495
501
 
496
- view_created_bool = #{self}.create_nested_view(
497
- jenkins_obj: 'required jenkins_obj returned from #connect method',
498
- view_path: 'required view path create',
499
- create_in_view_path: 'optional creates nested view within an existing nested view, defaults to / views'
502
+ # Run add job to nested view and return its result
503
+ #{self}.add_job_to_nested_view(
504
+ jenkins_obj: 'required - required jenkins_obj returned from #connect method',
505
+ view_path: 'required - required view path associate job',
506
+ job_name: 'required - required view path attach to a view'
500
507
  )
501
508
 
502
- add_job_to_nested_view_resp = #{self}.add_job_to_nested_view(
503
- jenkins_obj: 'required jenkins_obj returned from #connect method',
504
- view_path: 'required view path associate job',
505
- job_name: 'required view path attach to a view',
506
- )
507
-
508
- copy_job_resp = #{self}.copy_job_no_fail_on_exist(
509
- jenkins_obj: 'required jenkins_obj returned from #connect method',
510
- existing_job_name: 'required existing job to copt to new job',
511
- new_job_name: 'required name of new job'
509
+ # Run copy job no fail on exist and return its result
510
+ #{self}.copy_job_no_fail_on_exist(
511
+ jenkins_obj: 'required - required jenkins_obj returned from #connect method',
512
+ existing_job_name: 'required - required existing job to copt to new job',
513
+ new_job_name: 'required - required name of new job'
512
514
  )
513
515
 
516
+ # Run disable jobs by regex and return its result
514
517
  #{self}.disable_jobs_by_regex(
515
- jenkins_obj: 'required jenkins_obj returned from #connect method',
516
- regex: 'required regex pattern for matching jobs to disable e.g. :regex => "^M[0-9]"',
518
+ jenkins_obj: 'required - required jenkins_obj returned from #connect method',
519
+ regex: 'required - required regex pattern for matching jobs to disable e.g. :regex => ^M[0-9]'
517
520
  )
518
521
 
519
- #{self}.delete_job_by_regex(
520
- jenkins_obj: 'required jenkins_obj returned from #connect method',
521
- regex: 'required regex pattern for matching jobs to disable e.g. :regex => "^M[0-9]"',
522
+ # Run delete jobs by regex and return its result
523
+ #{self}.delete_jobs_by_regex(
524
+ jenkins_obj: 'required - required jenkins_obj returned from #connect method',
525
+ regex: 'required - required regex pattern for matching jobs to disable e.g. :regex => ^M[0-9]'
522
526
  )
523
527
 
528
+ # Run clear build queue and return its result
524
529
  #{self}.clear_build_queue(
525
- jenkins_obj: 'required jenkins_obj returned from #connect method',
530
+ jenkins_obj: 'required - required jenkins_obj returned from #connect method'
526
531
  )
527
532
 
533
+ # Run disconnect and return its result
528
534
  #{self}.disconnect(
529
- jenkins_obj: 'required jenkins_obj returned from connect method'
535
+ jenkins_obj: 'required - required jenkins_obj returned from #connect method'
530
536
  )
531
537
 
538
+ # Print the AUTHOR(S) string for this module.
532
539
  #{self}.authors
533
- }
540
+ "
541
+ constants.sort
534
542
  end
535
543
  end
536
544
  end
@@ -607,67 +607,75 @@ module PWN
607
607
 
608
608
  public_class_method def self.help
609
609
  puts "USAGE:
610
- all_fields = #{self}.get_all_fields
610
+ # Run get all fields and return its result
611
+ #{self}.get_all_fields
611
612
 
612
- user = #{self}.get_user(
613
- username: 'required - username to lookup (e.g. jane.doe')',
613
+ # Run get user and return its result
614
+ #{self}.get_user(
615
+ username: 'required - username to lookup (e.g. jane.doe) (defaults to PWN::Plugins::AuthenticationHelper.username)',
614
616
  params: 'optional - additional parameters to pass in the URI (e.g. expand, etc.)'
615
617
  )
616
618
 
617
- issue_resp = #{self}.get_issue(
619
+ # Run get issue and return its result
620
+ #{self}.get_issue(
618
621
  issue: 'required - issue to lookup (e.g. Bug, Issue, Story, or Epic ID)',
619
622
  params: 'optional - additional parameters to pass in the URI (e.g. fields, expand, etc.)'
620
623
  )
621
624
 
622
- issue_resp = #{self}.create_issue(
625
+ # Run create issue and return its result
626
+ #{self}.create_issue(
623
627
  project_key: 'required - project key (e.g. PWN)',
624
628
  summary: 'required - summary of the issue (e.g. Epic for PWN-1337)',
625
629
  issue_type: 'required - issue type (e.g. :epic, :story, :bug)',
626
630
  description: 'optional - description of the issue',
627
631
  epic_name: 'optional - name of the epic',
628
632
  additional_fields: 'optional - additional fields to set in the issue (e.g. labels, components, custom fields, etc.)',
629
- attachments: 'optional - array of attachment paths to upload to the issue (e.g. [\"/tmp/file1.txt\", \"/tmp/file2.txt\"])',
630
- comment: 'optional - comment to add to the issue (e.g. \"This is a comment\")'
633
+ attachments: 'optional - array of attachment paths to upload to the issue (e.g. [/tmp/file1.txt, /tmp/file2.txt])',
634
+ comment: 'optional - comment to add to the issue (e.g. This is a comment)'
631
635
  )
632
636
 
633
- issue_resp = #{self}.update_issue(
634
- issue: 'required - issue to update (e.g. Bug, Issue, Story, or Epic ID)',
637
+ # Run update issue and return its result
638
+ #{self}.update_issue(
635
639
  fields: 'required - fields to update in the issue (e.g. summary, description, labels, components, custom fields, etc.)',
636
- attachments: 'optional - array of attachment paths to upload to the issue (e.g. [\"/tmp/file1.txt\", \"/tmp/file2.txt\"])'
640
+ attachments: 'optional - array of attachment paths to upload to the issue (e.g. [/tmp/file1.txt, /tmp/file2.txt])',
641
+ issue: 'required - issue value consumed by #update_issue'
637
642
  )
638
643
 
639
- issue_resp = #{self}.issue_comment(
640
- issue: 'required - issue to comment on (e.g. Bug, Issue, Story, or Epic ID)',
644
+ # Run issue comment and return its result
645
+ #{self}.issue_comment(
646
+ issue: 'required - issue to delete (e.g. Bug, Issue, Story, or Epic ID)',
641
647
  comment_action: 'required - action to perform on the issue comment (e.g. :delete, :add, :update - Defaults to :add)',
642
648
  comment_id: 'optional - comment ID to delete or update (e.g. 10000)',
643
- author: 'optional - author of the comment (e.g. \"jane.doe\")',
644
- comment: 'optional - comment to add or update in the issue (e.g. \"This is a comment\")'
649
+ author: 'optional - author of the comment (e.g. jane.doe)',
650
+ comment: 'optional - comment to add or update in the issue (e.g. This is a comment)'
645
651
  )
646
652
 
647
- issue_type_metadata = #{self}.get_issue_type_metadata(
653
+ # Run get issue type metadata and return its result
654
+ #{self}.get_issue_type_metadata(
648
655
  project_key: 'required - project key (e.g. PWN)',
649
656
  issue_type_id: 'required - issue type ID (e.g. issue[:fields][:issuetype][:id] from #get_issue method)'
650
657
  )
651
658
 
652
- issue_resp = #{self}.clone_issue(
659
+ # Run clone issue and return its result
660
+ #{self}.clone_issue(
653
661
  issue: 'required - issue to clone (e.g. Bug, Issue, Story, or Epic ID)',
654
662
  copy_attachments: 'optional - boolean to indicate whether to copy attachments (Defaults to false)'
655
663
  )
656
664
 
657
- issue_resp = #{self}.delete_issue(
665
+ # Run delete issue and return its result
666
+ #{self}.delete_issue(
658
667
  issue: 'required - issue to delete (e.g. Bug, Issue, Story, or Epic ID)'
659
668
  )
660
669
 
661
- issue_resp = #{self}.delete_attachment(
670
+ # Run delete attachment and return its result
671
+ #{self}.delete_attachment(
662
672
  id: 'required - attachment ID to delete (e.g. 10000) found in #get_issue method'
663
673
  )
664
674
 
665
- **********************************************************************
666
- * For more information on the Jira Server REST API, see:
667
- * https://developer.atlassian.com/server/jira/platform/rest-apis/
668
-
675
+ # Print the AUTHOR(S) string for this module.
669
676
  #{self}.authors
670
677
  "
678
+ constants.sort
671
679
  end
672
680
  end
673
681
  end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'fileutils'
5
+ require 'securerandom'
6
+ require 'open3'
7
+
8
+ module PWN
9
+ module Plugins
10
+ # Background jobs that survive a pwn-ai turn (scans, fuzz campaigns).
11
+ module Jobs
12
+ JOBS_DIR = File.join(Dir.home, '.pwn', 'jobs')
13
+
14
+ public_class_method def self.required_bins
15
+ []
16
+ end
17
+
18
+ public_class_method def self.start(opts = {})
19
+ cmd = opts[:command] || opts[:cmd]
20
+ raise 'ERROR: command is required' if cmd.to_s.empty?
21
+
22
+ FileUtils.mkdir_p(JOBS_DIR)
23
+ id = SecureRandom.hex(6)
24
+ log = File.join(JOBS_DIR, "#{id}.log")
25
+ meta = File.join(JOBS_DIR, "#{id}.json")
26
+ pid = spawn(cmd.to_s, %i[out err] => [log, 'a'])
27
+ Process.detach(pid)
28
+ row = {
29
+ id: id,
30
+ pid: pid,
31
+ command: cmd.to_s,
32
+ log: log,
33
+ session_id: opts[:session_id],
34
+ started_at: Time.now.utc.iso8601
35
+ }
36
+ File.write(meta, JSON.generate(row))
37
+ PWN::Plugins::ArtifactRegistry.register(session_id: opts[:session_id], path: log, kind: 'job-log') if opts[:session_id] && defined?(PWN::Plugins::ArtifactRegistry) && File.file?(log)
38
+ row
39
+ end
40
+
41
+ public_class_method def self.status(opts = {})
42
+ row = load_job(opts)
43
+ alive = begin
44
+ Process.kill(0, row[:pid].to_i)
45
+ true
46
+ rescue Errno::ESRCH, Errno::EPERM
47
+ false
48
+ end
49
+ row.merge(alive: alive)
50
+ end
51
+
52
+ public_class_method def self.tail(opts = {})
53
+ row = load_job(opts)
54
+ n = (opts[:lines] || 40).to_i
55
+ return '' unless File.file?(row[:log])
56
+
57
+ File.readlines(row[:log]).last(n).join
58
+ end
59
+
60
+ public_class_method def self.stop(opts = {})
61
+ row = load_job(opts)
62
+ Process.kill('TERM', row[:pid].to_i)
63
+ true
64
+ rescue Errno::ESRCH
65
+ false
66
+ end
67
+
68
+ public_class_method def self.authors
69
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
70
+ end
71
+
72
+ public_class_method def self.help
73
+ puts "USAGE:
74
+ # List host binaries this module expects to be installed.
75
+ #{self}.required_bins
76
+
77
+ # Run start and return its result
78
+ #{self}.start(
79
+ command: 'required - command value consumed by #start (defaults to opts[:cmd])',
80
+ cmd: 'required - command string to run',
81
+ session_id: 'optional - session id value consumed by #start'
82
+ )
83
+
84
+ # Run status and return its result
85
+ #{self}.status
86
+
87
+ # Run tail and return its result
88
+ #{self}.tail(
89
+ lines: 'optional - lines value consumed by #tail'
90
+ )
91
+
92
+ # Run stop and return its result
93
+ #{self}.stop
94
+
95
+ # Print the AUTHOR(S) string for this module.
96
+ #{self}.authors
97
+ "
98
+ constants.sort
99
+ end
100
+
101
+ private_class_method def self.load_job(opts = {})
102
+ id = opts[:id].to_s
103
+ path = File.join(JOBS_DIR, "#{id}.json")
104
+ raise "ERROR: unknown job #{id}" unless File.file?(path)
105
+
106
+ JSON.parse(File.read(path), symbolize_names: true)
107
+ end
108
+ end
109
+ end
110
+ end
@@ -33,13 +33,17 @@ module PWN
33
33
  # Display Usage for this Module
34
34
 
35
35
  public_class_method def self.help
36
- puts %{USAGE:
37
- json_path_arr = #{self}.search_key(
38
- json_data_struct: "required JSON data structure",
39
- key: "required key to find in JSON data structure. returns key values"
36
+ puts "USAGE:
37
+ # Run search key and return its result
38
+ #{self}.search_key(
39
+ json_data_struct: 'required - required JSON data structure',
40
+ key: 'required - required key to find in JSON data structure. returns key values'
40
41
  )
42
+
43
+ # Print the AUTHOR(S) string for this module.
41
44
  #{self}.authors
42
- }
45
+ "
46
+ constants.sort
43
47
  end
44
48
  end
45
49
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+
5
+ module PWN
6
+ module Plugins
7
+ # trivy / kube-hunter wrappers plus docker-socket preflight.
8
+ module K8s
9
+ public_class_method def self.required_bins
10
+ %w[trivy]
11
+ end
12
+
13
+ public_class_method def self.trivy(opts = {})
14
+ PWN::Plugins::PreflightChecker.require_bin!(name: 'trivy')
15
+ target = opts[:target] || opts[:image] || opts[:path]
16
+ raise 'ERROR: target is required' if target.to_s.empty?
17
+
18
+ mode = (opts[:mode] || :image).to_s
19
+ cmd = ['trivy', mode, '--format', 'json', target.to_s]
20
+ stdout, stderr, status = Open3.capture3(*cmd)
21
+ { stdout: stdout, stderr: stderr, exit: status.exitstatus }
22
+ end
23
+
24
+ public_class_method def self.kube_hunter(opts = {})
25
+ return { error: 'kube-hunter missing', hint: 'pip install kube-hunter' } unless PWN::Plugins::PreflightChecker.bin?(name: 'kube-hunter')
26
+
27
+ cmd = ['kube-hunter']
28
+ cmd += ['--remote', opts[:remote].to_s] if opts[:remote]
29
+ cmd << '--report' << 'json'
30
+ stdout, stderr, status = Open3.capture3(*cmd)
31
+ { stdout: stdout, stderr: stderr, exit: status.exitstatus }
32
+ end
33
+
34
+ public_class_method def self.docker_socket?(opts = {})
35
+ path = (opts[:path] || '/var/run/docker.sock').to_s
36
+ PWN::Plugins::PreflightChecker.service?(name: 'docker', path: path)
37
+ end
38
+
39
+ public_class_method def self.authors
40
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
41
+ end
42
+
43
+ public_class_method def self.help
44
+ puts "USAGE:
45
+ # List host binaries this module expects to be installed.
46
+ #{self}.required_bins
47
+
48
+ # Scan a container image or filesystem with trivy.
49
+ #{self}.trivy(
50
+ target: 'required - image name or path',
51
+ image: 'optional - alias for target',
52
+ path: 'optional - alias for target',
53
+ mode: 'optional - trivy subcommand (defaults to image)'
54
+ )
55
+
56
+ # Run kube-hunter (remote cluster optional).
57
+ #{self}.kube_hunter(
58
+ remote: 'optional - API server host for --remote'
59
+ )
60
+
61
+ # True when the docker unix socket is present.
62
+ #{self}.docker_socket?(
63
+ path: 'optional - socket path (defaults to /var/run/docker.sock)'
64
+ )
65
+
66
+ # Print the AUTHOR(S) string for this module.
67
+ #{self}.authors
68
+ "
69
+ constants.sort
70
+ end
71
+ end
72
+ end
73
+ end