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
@@ -1085,6 +1085,7 @@ module PWN
1085
1085
  # )
1086
1086
 
1087
1087
  public_class_method def self.send(opts = {})
1088
+ PWN::Plugins::PreflightChecker.require_cap_net_raw! if defined?(PWN::Plugins::PreflightChecker)
1088
1089
  pkt = opts[:pkt]
1089
1090
 
1090
1091
  if opts[:iface]
@@ -1205,108 +1206,228 @@ module PWN
1205
1206
 
1206
1207
  public_class_method def self.help
1207
1208
  puts "USAGE:
1208
- pcap = #{self}.open_pcap_file(
1209
+ # Run open pcap file and return its result
1210
+ #{self}.open_pcap_file(
1209
1211
  path: 'required - path to packet capture file'
1210
1212
  )
1211
- pcap[0].public_methods
1212
- pcap.each do |p|
1213
- print \"IP ID: \#{p.ip_id_readable} \"
1214
- print \"IP Sum: \#{p.ip_sum_readable} \"
1215
- print \"SRC IP: \#{p.ip_src_readable} \"
1216
- print \"SRC MAC: (\#{p.eth_src_readable}) \"
1217
- print \"TCP SRC PORT: \#{p.tcp_sport} => \"
1218
- print \"DST IP: \#{p.ip_dst_readable} \"
1219
- print \"DST MAC: (\#{p.eth_dst_readable}) \"
1220
- print \"TCP DST PORT: \#{p.tcp_dport} \"
1221
- print \"ETH PROTO: \#{p.eth_proto_readable} \"
1222
- print \"TCP FLAGS: \#{p.tcp_flags_readable} \"
1223
- print \"TCP ACK: \#{p.tcp_ack_readable} \"
1224
- print \"TCP SEQ: \#{p.tcp_seq_readable} \"
1225
- print \"TCP SUM: \#{p.tcp_sum_readable} \"
1226
- print \"TCP OPTS: \#{p.tcp_opts_readable} \"
1227
- puts \"BODY: \#{p.hexify(p.payload)}\"
1228
- puts \"\\n\\n\\n\"
1229
- end
1230
1213
 
1231
- pkt = #{self}.construct_arp(
1214
+ # Run construct arp and return its result
1215
+ #{self}.construct_arp(
1232
1216
  ip_saddr: 'required - source ip of packet',
1233
1217
  ip_daddr: 'required - destination ip to send packet',
1234
1218
  payload: 'optional - packet payload defaults to empty string',
1235
1219
  ip_id: 'optional - defaults to 0xfeed',
1236
1220
  iface: 'optional - interface to send packet (defaults to eth0)',
1221
+ eth_src: 'optional - eth src value consumed by #construct_arp',
1222
+ eth_dst: 'optional - eth dst value consumed by #construct_arp',
1223
+ eth_proto: 'optional - eth proto value consumed by #construct_arp',
1224
+ arp_hw: 'optional - arp hw value consumed by #construct_arp',
1225
+ arp_proto: 'optional - arp proto value consumed by #construct_arp',
1226
+ arp_hw_len: 'optional - arp hw len value consumed by #construct_arp',
1227
+ arp_proto_len: 'optional - arp proto len value consumed by #construct_arp',
1228
+ arp_opcode: 'optional - arp opcode value consumed by #construct_arp',
1229
+ arp_src_mac: 'optional - arp src mac value consumed by #construct_arp',
1230
+ arp_dst_mac: 'optional - arp dst mac value consumed by #construct_arp'
1237
1231
  )
1238
1232
 
1239
- pkt = #{self}.construct_eth(
1233
+ # Run construct eth and return its result
1234
+ #{self}.construct_eth(
1240
1235
  ip_saddr: 'required - source ip of packet',
1241
1236
  ip_daddr: 'required - destination ip to send packet',
1242
1237
  payload: 'optional - packet payload defaults to empty string',
1243
1238
  ip_id: 'optional - defaults to 0xfeed',
1244
1239
  iface: 'optional - interface to send packet (defaults to eth0)',
1240
+ eth_src: 'optional - eth src value consumed by #construct_eth',
1241
+ eth_dst: 'optional - eth dst value consumed by #construct_eth',
1242
+ eth_proto: 'optional - eth proto value consumed by #construct_eth'
1245
1243
  )
1246
1244
 
1247
- pkt = #{self}.construct_hsrp(
1245
+ # Run construct hsrp and return its result
1246
+ #{self}.construct_hsrp(
1248
1247
  ip_saddr: 'required - source ip of packet',
1249
1248
  ip_daddr: 'required - destination ip to send packet',
1250
1249
  payload: 'optional - packet payload defaults to empty string',
1251
1250
  ip_id: 'optional - defaults to 0xfeed',
1252
1251
  iface: 'optional - interface to send packet (defaults to eth0)',
1252
+ eth_src: 'optional - eth src value consumed by #construct_hsrp',
1253
+ eth_dst: 'optional - eth dst value consumed by #construct_hsrp',
1254
+ eth_proto: 'optional - eth proto value consumed by #construct_hsrp',
1255
+ ip_v: 'optional - ip v value consumed by #construct_hsrp',
1256
+ ip_hl: 'optional - ip hl value consumed by #construct_hsrp',
1257
+ ip_tos: 'optional - ip tos value consumed by #construct_hsrp',
1258
+ ip_len: 'optional - ip len value consumed by #construct_hsrp',
1259
+ ip_frag: 'optional - ip frag value consumed by #construct_hsrp',
1260
+ ip_ttl: 'optional - ip ttl value consumed by #construct_hsrp',
1261
+ ip_proto: 'optional - ip proto value consumed by #construct_hsrp',
1262
+ ip_sum: 'optional - ip sum value consumed by #construct_hsrp',
1263
+ udp_src_port: 'optional - udp src port value consumed by #construct_hsrp',
1264
+ udp_dst_port: 'optional - udp dst port value consumed by #construct_hsrp',
1265
+ udp_len: 'optional - udp len value consumed by #construct_hsrp',
1266
+ udp_sum: 'optional - udp sum value consumed by #construct_hsrp',
1267
+ hsrp_version: 'optional - hsrp version value consumed by #construct_hsrp',
1268
+ hsrp_opcode: 'optional - hsrp opcode value consumed by #construct_hsrp',
1269
+ hsrp_state: 'optional - hsrp state value consumed by #construct_hsrp',
1270
+ hsrp_hellotime: 'optional - hsrp hellotime value consumed by #construct_hsrp',
1271
+ hsrp_holdtime: 'optional - hsrp holdtime value consumed by #construct_hsrp',
1272
+ hsrp_priority: 'optional - hsrp priority value consumed by #construct_hsrp',
1273
+ hsrp_group: 'optional - hsrp group value consumed by #construct_hsrp',
1274
+ hsrp_reserved: 'optional - hsrp reserved value consumed by #construct_hsrp',
1275
+ hsrp_password: 'optional - hsrp password value consumed by #construct_hsrp',
1276
+ hsrp_addr: 'optional - hsrp addr value consumed by #construct_hsrp'
1253
1277
  )
1254
1278
 
1255
- pkt = #{self}.construct_icmp(
1279
+ # Run construct icmp and return its result
1280
+ #{self}.construct_icmp(
1256
1281
  ip_saddr: 'required - source ip of packet',
1257
1282
  ip_daddr: 'required - destination ip to send packet',
1258
- payload: 'optional - packet payload defaults to \"*ping*\"',
1283
+ payload: 'optional - packet payload defaults to *ping*',
1259
1284
  ip_id: 'optional - defaults to 0xfeed',
1260
1285
  iface: 'optional - interface to send packet (defaults to eth0)',
1286
+ eth_src: 'optional - eth src value consumed by #construct_icmp',
1287
+ eth_dst: 'optional - eth dst value consumed by #construct_icmp',
1288
+ eth_proto: 'optional - eth proto value consumed by #construct_icmp',
1289
+ ip_v: 'optional - ip v value consumed by #construct_icmp',
1290
+ ip_hl: 'optional - ip hl value consumed by #construct_icmp',
1291
+ ip_tos: 'optional - ip tos value consumed by #construct_icmp',
1292
+ ip_len: 'optional - ip len value consumed by #construct_icmp',
1293
+ ip_frag: 'optional - ip frag value consumed by #construct_icmp',
1294
+ ip_ttl: 'optional - ip ttl value consumed by #construct_icmp',
1295
+ ip_proto: 'optional - ip proto value consumed by #construct_icmp',
1296
+ ip_sum: 'optional - ip sum value consumed by #construct_icmp',
1297
+ icmp_type: 'optional - icmp type value consumed by #construct_icmp',
1298
+ icmp_code: 'optional - icmp code value consumed by #construct_icmp',
1299
+ icmp_sum: 'optional - icmp sum value consumed by #construct_icmp'
1261
1300
  )
1262
1301
 
1263
- pkt = #{self}.construct_icmpv6(
1302
+ # Run construct icmpv6 and return its result
1303
+ #{self}.construct_icmpv6(
1264
1304
  ip_saddr: 'required - source ip of packet',
1265
1305
  ip_daddr: 'required - destination ip to send packet',
1266
1306
  payload: 'optional - packet payload defaults to empty string',
1267
1307
  ip_id: 'optional - defaults to 0xfeed',
1268
1308
  iface: 'optional - interface to send packet (defaults to eth0)',
1309
+ eth_src: 'optional - eth src value consumed by #construct_icmpv6',
1310
+ eth_dst: 'optional - eth dst value consumed by #construct_icmpv6',
1311
+ eth_proto: 'optional - eth proto value consumed by #construct_icmpv6',
1312
+ ipv6_v: 'optional - ipv6 v value consumed by #construct_icmpv6',
1313
+ ipv6_class: 'optional - ipv6 class value consumed by #construct_icmpv6',
1314
+ ipv6_label: 'optional - ipv6 label value consumed by #construct_icmpv6',
1315
+ ipv6_len: 'optional - ipv6 len value consumed by #construct_icmpv6',
1316
+ ipv6_next: 'optional - ipv6 next value consumed by #construct_icmpv6',
1317
+ ipv6_hop: 'optional - ipv6 hop value consumed by #construct_icmpv6',
1318
+ ipv6_saddr: 'optional - ipv6 saddr value consumed by #construct_icmpv6',
1319
+ ipv6_daddr: 'optional - ipv6 daddr value consumed by #construct_icmpv6',
1320
+ icmpv6_type: 'optional - icmpv6 type value consumed by #construct_icmpv6',
1321
+ icmpv6_code: 'optional - icmpv6 code value consumed by #construct_icmpv6',
1322
+ icmpv6_sum: 'optional - icmpv6 sum value consumed by #construct_icmpv6'
1269
1323
  )
1270
1324
 
1271
- pkt = #{self}.construct_ip(
1325
+ # Run construct ip and return its result
1326
+ #{self}.construct_ip(
1272
1327
  ip_saddr: 'required - source ip of packet',
1273
1328
  ip_daddr: 'required - destination ip to send packet',
1274
1329
  payload: 'optional - packet payload defaults to empty string',
1275
1330
  ip_id: 'optional - defaults to 0xfeed',
1276
1331
  iface: 'optional - interface to send packet (defaults to eth0)',
1332
+ eth_src: 'optional - eth src value consumed by #construct_ip',
1333
+ eth_dst: 'optional - eth dst value consumed by #construct_ip',
1334
+ eth_proto: 'optional - eth proto value consumed by #construct_ip',
1335
+ ip_v: 'optional - ip v value consumed by #construct_ip',
1336
+ ip_hl: 'optional - ip hl value consumed by #construct_ip',
1337
+ ip_tos: 'optional - ip tos value consumed by #construct_ip',
1338
+ ip_len: 'optional - ip len value consumed by #construct_ip',
1339
+ ip_frag: 'optional - ip frag value consumed by #construct_ip',
1340
+ ip_ttl: 'optional - ip ttl value consumed by #construct_ip',
1341
+ ip_proto: 'optional - ip proto value consumed by #construct_ip',
1342
+ ip_sum: 'optional - ip sum value consumed by #construct_ip'
1277
1343
  )
1278
1344
 
1279
- pkt = #{self}.construct_ipv6(
1345
+ # Run construct ipv6 and return its result
1346
+ #{self}.construct_ipv6(
1280
1347
  ip_saddr: 'required - source ip of packet',
1281
1348
  ip_daddr: 'required - destination ip to send packet',
1282
1349
  payload: 'optional - packet payload defaults to empty string',
1283
1350
  ip_id: 'optional - defaults to 0xfeed',
1284
1351
  iface: 'optional - interface to send packet (defaults to eth0)',
1352
+ eth_src: 'optional - eth src value consumed by #construct_ipv6',
1353
+ eth_dst: 'optional - eth dst value consumed by #construct_ipv6',
1354
+ eth_proto: 'optional - eth proto value consumed by #construct_ipv6',
1355
+ ipv6_v: 'optional - ipv6 v value consumed by #construct_ipv6',
1356
+ ipv6_class: 'optional - ipv6 class value consumed by #construct_ipv6',
1357
+ ipv6_label: 'optional - ipv6 label value consumed by #construct_ipv6',
1358
+ ipv6_len: 'optional - ipv6 len value consumed by #construct_ipv6',
1359
+ ipv6_next: 'optional - ipv6 next value consumed by #construct_ipv6',
1360
+ ipv6_hop: 'optional - ipv6 hop value consumed by #construct_ipv6',
1361
+ ipv6_saddr: 'optional - ipv6 saddr value consumed by #construct_ipv6',
1362
+ ipv6_daddr: 'optional - ipv6 daddr value consumed by #construct_ipv6'
1285
1363
  )
1286
1364
 
1287
- pkt = #{self}.construct_tcp(
1365
+ # Run construct tcp and return its result
1366
+ #{self}.construct_tcp(
1288
1367
  ip_saddr: 'required - source ip of packet',
1289
1368
  ip_daddr: 'required - destination ip to send packet',
1290
1369
  payload: 'optional - packet payload defaults to empty string',
1291
1370
  ip_id: 'optional - defaults to 0xfeed',
1292
1371
  iface: 'optional - interface to send packet (defaults to eth0)',
1372
+ eth_src: 'optional - eth src value consumed by #construct_tcp',
1373
+ eth_dst: 'optional - eth dst value consumed by #construct_tcp',
1374
+ eth_proto: 'optional - eth proto value consumed by #construct_tcp',
1375
+ ip_v: 'optional - ip v value consumed by #construct_tcp',
1376
+ ip_hl: 'optional - ip hl value consumed by #construct_tcp',
1377
+ ip_tos: 'optional - ip tos value consumed by #construct_tcp',
1378
+ ip_len: 'optional - ip len value consumed by #construct_tcp',
1379
+ ip_frag: 'optional - ip frag value consumed by #construct_tcp',
1380
+ ip_ttl: 'optional - ip ttl value consumed by #construct_tcp',
1381
+ ip_proto: 'optional - ip proto value consumed by #construct_tcp',
1382
+ ip_sum: 'optional - ip sum value consumed by #construct_tcp',
1383
+ tcp_src_port: 'optional - tcp src port value consumed by #construct_tcp',
1384
+ tcp_dst_port: 'optional - tcp dst port value consumed by #construct_tcp',
1385
+ tcp_seq: 'optional - tcp seq value consumed by #construct_tcp',
1386
+ tcp_ack: 'optional - tcp ack value consumed by #construct_tcp',
1387
+ tcp_hlen: 'optional - tcp hlen value consumed by #construct_tcp',
1388
+ tcp_reserved: 'optional - tcp reserved value consumed by #construct_tcp',
1389
+ tcp_ecn: 'optional - tcp ecn value consumed by #construct_tcp',
1390
+ tcp_flags: 'optional - tcp flags value consumed by #construct_tcp',
1391
+ tcp_win: 'optional - tcp win value consumed by #construct_tcp',
1392
+ tcp_sum: 'optional - tcp sum value consumed by #construct_tcp',
1393
+ tcp_urg: 'optional - tcp urg value consumed by #construct_tcp',
1394
+ tcp_opts: 'optional - tcp opts value consumed by #construct_tcp'
1293
1395
  )
1294
1396
 
1295
- pkt = #{self}.construct_udp(
1397
+ # Run construct udp and return its result
1398
+ #{self}.construct_udp(
1296
1399
  ip_saddr: 'required - source ip of packet',
1297
1400
  ip_daddr: 'required - destination ip to send packet',
1298
1401
  payload: 'optional - packet payload defaults to empty string',
1299
1402
  ip_id: 'optional - defaults to 0xfeed',
1300
1403
  iface: 'optional - interface to send packet (defaults to eth0)',
1404
+ eth_src: 'optional - eth src value consumed by #construct_udp',
1405
+ eth_dst: 'optional - eth dst value consumed by #construct_udp',
1406
+ eth_proto: 'optional - eth proto value consumed by #construct_udp',
1407
+ ip_v: 'optional - ip v value consumed by #construct_udp',
1408
+ ip_hl: 'optional - ip hl value consumed by #construct_udp',
1409
+ ip_tos: 'optional - ip tos value consumed by #construct_udp',
1410
+ ip_len: 'optional - ip len value consumed by #construct_udp',
1411
+ ip_frag: 'optional - ip frag value consumed by #construct_udp',
1412
+ ip_ttl: 'optional - ip ttl value consumed by #construct_udp',
1413
+ ip_proto: 'optional - ip proto value consumed by #construct_udp',
1414
+ ip_sum: 'optional - ip sum value consumed by #construct_udp',
1415
+ udp_src_port: 'optional - udp src port value consumed by #construct_udp',
1416
+ udp_dst_port: 'optional - udp dst port value consumed by #construct_udp',
1417
+ udp_len: 'optional - udp len value consumed by #construct_udp',
1418
+ udp_sum: 'optional - udp sum value consumed by #construct_udp'
1301
1419
  )
1302
1420
 
1421
+ # Run send and return its result
1303
1422
  #{self}.send(
1304
1423
  pkt: 'required - pkt returned from other #construct_<type> methods',
1305
- iface: 'optional - interface to send packet (defaults to eth0)',
1424
+ iface: 'optional - interface to send packet (defaults to eth0)'
1306
1425
  )
1307
1426
 
1427
+ # Print the AUTHOR(S) string for this module.
1308
1428
  #{self}.authors
1309
1429
  "
1430
+ constants.sort
1310
1431
  end
1311
1432
  end
1312
1433
  end
@@ -41,12 +41,15 @@ module PWN
41
41
 
42
42
  public_class_method def self.help
43
43
  puts "USAGE:
44
- pdf_pages_hash = #{self}.read_text(
45
- pdf_path: 'required path to pdf file'
44
+ # Run read text and return its result
45
+ #{self}.read_text(
46
+ pdf_path: 'optional - optional path to dir defaults to .'
46
47
  )
47
48
 
49
+ # Print the AUTHOR(S) string for this module.
48
50
  #{self}.authors
49
51
  "
52
+ constants.sort
50
53
  end
51
54
  end
52
55
  end
@@ -276,9 +276,94 @@ module PWN
276
276
 
277
277
  public_class_method def self.help
278
278
  puts "USAGE:
279
- This module is deprecated. Please Use PWN::Plugins::MailAgent instead.
279
+ # Default options can be set so that they dont have to be repeated
280
+ #{self}.options
281
+
282
+ # Method usage N/A
283
+ #{self}.options
284
+
285
+ # Method usage N/A
286
+ #{self}.override_options
287
+
288
+ # Method usage N/A
289
+ #{self}.override_options
290
+
291
+ # Method usage N/A
292
+ #{self}.subject_prefix(
293
+ value: 'optional - integer or string to pack/encode'
294
+ )
295
+
296
+ # Method usage N/A
297
+ #{self}.append_inputs
298
+
299
+ # Send an email
300
+ #{self}.mail(
301
+ body: 'optional - body value consumed by #mail',
302
+ subject: 'optional - subject value consumed by #mail',
303
+ to: 'required - to value consumed by #mail',
304
+ via: 'optional - via value consumed by #mail',
305
+ via_options: 'optional - via options value consumed by #mail'
306
+ )
307
+
308
+ # Method usage N/A
309
+ #{self}.permissable_options
310
+
311
+ # Method usage N/A
312
+ #{self}.default_delivery_method
313
+
314
+ # Method usage N/A
315
+ #{self}.standard_options
316
+
317
+ # Method usage N/A
318
+ #{self}.non_standard_options
319
+
320
+ # Method usage N/A
321
+ #{self}.build_mail(
322
+ date: 'optional - date value consumed by #build_mail',
323
+ from: 'optional - sender account or address to bind as operator',
324
+ via_options: 'optional - via options value consumed by #build_mail',
325
+ attachments: 'optional - attachments value consumed by #build_mail',
326
+ html_body: 'optional - html body value consumed by #build_mail (defaults to opts[:attachments])',
327
+ body: 'optional - body value consumed by #build_mail',
328
+ via: 'optional - via value consumed by #build_mail',
329
+ headers: 'optional - headers value consumed by #build_mail',
330
+ charset: 'optional - charset value consumed by #build_mail',
331
+ text_part_charset: 'optional - text part charset value consumed by #build_mail',
332
+ content_type: 'optional - content type value consumed by #build_mail'
333
+ )
334
+
335
+ # Method usage N/A
336
+ #{self}.build_html_part(
337
+ html_body: 'optional - html body value consumed by #build_html_part',
338
+ html_body_part_header: 'optional - html body part header value consumed by #build_html_part'
339
+ )
340
+
341
+ # Method usage N/A
342
+ #{self}.build_text_part(
343
+ charset: 'optional - charset value consumed by #build_text_part',
344
+ body: 'optional - body value consumed by #build_text_part',
345
+ body_part_header: 'optional - body part header value consumed by #build_text_part'
346
+ )
347
+
348
+ # Method usage N/A
349
+ #{self}.set_content_type(
350
+ mail: 'optional - mail value consumed by #set_content_type',
351
+ user_content_type: 'optional - user content type value consumed by #set_content_type'
352
+ )
353
+
354
+ # Method usage N/A
355
+ #{self}.add_attachments(
356
+ mail: 'optional - mail value consumed by #add_attachments',
357
+ attachments: 'optional - attachments value consumed by #add_attachments'
358
+ )
359
+
360
+ # Method usage N/A
361
+ #{self}.sendmail_binary
362
+
363
+ # Print the AUTHOR(S) string for this module.
280
364
  #{self}.authors
281
365
  "
366
+ constants.sort
282
367
  end
283
368
  end
284
369
  end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PWN
4
+ module Plugins
5
+ # Plugin/binary/capability preflight. Plugins declare required_bins /
6
+ # required_caps; HOST summaries list degraded modules without autoloading
7
+ # the whole plugin tree.
8
+ module PreflightChecker
9
+ class MissingBinary < StandardError; end
10
+ class MissingCapability < StandardError; end
11
+ class MissingService < StandardError; end
12
+
13
+ PLUGIN_DEPS = {
14
+ 'PWN::Plugins::Radare2' => { bins: %w[r2] },
15
+ 'PWN::Plugins::GDB' => { bins: %w[gdb] },
16
+ 'PWN::Plugins::Nuclei' => { bins: %w[nuclei] },
17
+ 'PWN::Plugins::Sqlmap' => { bins: %w[sqlmap] },
18
+ 'PWN::Plugins::Frida' => { bins: %w[frida] },
19
+ 'PWN::Plugins::AFLplusplus' => { bins: %w[afl-fuzz] },
20
+ 'PWN::Plugins::Volatility' => { bins: %w[vol] },
21
+ 'PWN::Plugins::NmapIt' => { bins: %w[nmap] },
22
+ 'PWN::Plugins::Metasploit' => { bins: %w[msfconsole] },
23
+ 'PWN::Plugins::BurpSuite' => { bins: %w[burpsuite] },
24
+ 'PWN::Plugins::Zaproxy' => { bins: %w[zaproxy] },
25
+ 'PWN::Plugins::Packet' => { bins: [], caps: %w[CAP_NET_RAW] },
26
+ 'PWN::Plugins::K8s' => { bins: %w[trivy], services: [{ name: 'docker', path: '/var/run/docker.sock' }] }
27
+ }.freeze
28
+
29
+ public_class_method def self.required_bins
30
+ []
31
+ end
32
+
33
+ public_class_method def self.bin?(opts = {})
34
+ name = opts[:name].to_s
35
+ return false if name.empty?
36
+
37
+ ENV['PATH'].to_s.split(File::PATH_SEPARATOR).any? do |dir|
38
+ File.executable?(File.join(dir, name))
39
+ end
40
+ end
41
+
42
+ public_class_method def self.require_bin!(opts = {})
43
+ name = opts[:name].to_s
44
+ return true if bin?(name: name)
45
+
46
+ raise MissingBinary, "ERROR: required binary missing: #{name}. Install via pwn setup --profile re (or the plugin profile)."
47
+ end
48
+
49
+ public_class_method def self.cap_net_raw?(opts = {})
50
+ return true unless File.readable?('/proc/self/status')
51
+
52
+ line = File.readlines('/proc/self/status').find { |l| l.start_with?('CapEff:') }
53
+ return false unless line
54
+
55
+ hex = line.split.last.to_s
56
+ hex.to_i(16).anybits?(1 << 13)
57
+ rescue StandardError
58
+ opts[:default] == true
59
+ end
60
+
61
+ public_class_method def self.require_cap_net_raw!(opts = {})
62
+ return true if cap_net_raw?(opts)
63
+
64
+ raise MissingCapability,
65
+ 'ERROR: CAP_NET_RAW is missing. Packet.send cannot inject L2 frames. ' \
66
+ 'Hint: sudo setcap cap_net_raw,cap_net_admin+ep "$(readlink -f "$(command -v ruby)")" ' \
67
+ 'or run as root. Fallback: PWN::Plugins::Sock.connect (no raw).'
68
+ end
69
+
70
+ public_class_method def self.service?(opts = {})
71
+ path = opts[:path].to_s
72
+ return File.socket?(path) unless path.empty?
73
+
74
+ false
75
+ end
76
+
77
+ public_class_method def self.check(opts = {})
78
+ deps = PLUGIN_DEPS
79
+ if opts[:names]
80
+ want = Array(opts[:names]).map(&:to_s)
81
+ deps = deps.slice(*want)
82
+ end
83
+ deps.map do |plugin, dep|
84
+ bins = Array(dep[:bins])
85
+ caps = Array(dep[:caps])
86
+ services = Array(dep[:services])
87
+ missing_bins = bins.reject { |b| bin?(name: b) }
88
+ missing_caps = []
89
+ missing_caps << 'CAP_NET_RAW' if caps.include?('CAP_NET_RAW') && !cap_net_raw?
90
+ missing_services = services.reject { |s| service?(name: s[:name] || s['name'], path: s[:path] || s['path']) }.map { |s| s[:name] || s['name'] }
91
+ status = if missing_bins.empty? && missing_caps.empty? && missing_services.empty?
92
+ :ok
93
+ elsif bins.any? && missing_bins.length == bins.length
94
+ :dead
95
+ else
96
+ :degraded
97
+ end
98
+ { plugin: plugin, status: status, missing_bins: missing_bins, missing_caps: missing_caps, missing_services: missing_services }
99
+ end
100
+ end
101
+
102
+ public_class_method def self.host_summary(opts = {})
103
+ rows = check(names: opts[:names])
104
+ cap = (opts[:limit] || 12).to_i
105
+ dead = rows.select { |r| r[:status] == :dead }
106
+ degraded = rows.select { |r| r[:status] == :degraded }
107
+ lines = ["HOST plugins ok=#{rows.count { |r| r[:status] == :ok }} degraded=#{degraded.length} dead=#{dead.length}"]
108
+ (degraded + dead).first(cap).each do |r|
109
+ miss = (Array(r[:missing_bins]) + Array(r[:missing_caps]) + Array(r[:missing_services])).join(',')
110
+ lines << " #{r[:status]} #{r[:plugin]} missing=#{miss}"
111
+ end
112
+ lines.join("\n")
113
+ end
114
+
115
+ public_class_method def self.authors
116
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
117
+ end
118
+
119
+ public_class_method def self.help
120
+ puts "USAGE:
121
+ # List host binaries this module expects to be installed.
122
+ #{self}.required_bins
123
+
124
+ # Run bin and return its result
125
+ #{self}.bin?(
126
+ name: 'required - binary or identifier name'
127
+ )
128
+
129
+ # Run require bin and return its result
130
+ #{self}.require_bin!(
131
+ name: 'required - binary or identifier name'
132
+ )
133
+
134
+ # Run cap net raw and return its result
135
+ #{self}.cap_net_raw?(
136
+ default: 'optional - default value consumed by #cap_net_raw?'
137
+ )
138
+
139
+ # Run require cap net raw and return its result
140
+ #{self}.require_cap_net_raw!
141
+
142
+ # True when a unix socket/service path exists.
143
+ #{self}.service?(
144
+ name: 'optional - service name for the report row',
145
+ path: 'required - unix socket path (e.g. /var/run/docker.sock)'
146
+ )
147
+
148
+ # Run check and return its result
149
+ #{self}.check(
150
+ names: 'optional - Array names value consumed by #check'
151
+ )
152
+
153
+ # Run host summary and return its result
154
+ #{self}.host_summary(
155
+ names: 'optional - names value consumed by #host_summary',
156
+ limit: 'optional - limit value consumed by #host_summary'
157
+ )
158
+
159
+ # Print the AUTHOR(S) string for this module.
160
+ #{self}.authors
161
+ "
162
+ constants.sort
163
+ end
164
+ end
165
+ end
166
+ end