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
data/lib/pwn/migrate.rb CHANGED
@@ -679,40 +679,50 @@ module PWN
679
679
 
680
680
  public_class_method def self.help
681
681
  puts "USAGE:
682
- # Is ~/.pwn older than this pwn release's schema?
683
- #{self}.needed? # => true/false (cheap; used by refresh_env)
682
+ # Run installed schema and return its result
683
+ #{self}.installed_schema
684
684
 
685
- # Read-only per-file compatibility report.
686
- #{self}.status # => { schema_installed:, schema_current:, files:[…], incompatible:[…] }
687
- #{self}.check # human-readable to $stdout
685
+ # Run needed and return its result
686
+ #{self}.needed?
688
687
 
689
- # Apply schema migrations + (optionally) autofix incompatible files.
690
- # Always takes a timestamped backup under ~/.pwn/backup/<ts>/ first.
688
+ # Run status and return its result
689
+ #{self}.status
690
+
691
+ # Human-readable ~/.pwn state doctor. Read-only. Called from
692
+ #{self}.check(
693
+ io: 'optional - IO to write the report to (default $stdout)'
694
+ )
695
+
696
+ # Run run and return its result
691
697
  #{self}.run(
692
- fix: 'optional - also autofix per-file (default false)',
693
- backup: 'optional - default true',
694
- dry_run: 'optional - default false',
695
- key: 'optional - vault key (default: ~/.pwn/pwn.yaml.decryptor)',
696
- iv: 'optional - vault iv'
698
+ fix: 'optional - also autofix incompatible files (default: schema-migrations only)',
699
+ backup: 'optional - take timestamped backup of ~/.pwn first (default true)',
700
+ dry_run: 'optional - report what WOULD happen, write nothing (default false)',
701
+ key: 'optional - vault key (default: read ~/.pwn/pwn.yaml.decryptor)',
702
+ iv: 'optional - vault iv (default: read ~/.pwn/pwn.yaml.decryptor)',
703
+ io: 'optional - IO to write to (default $stdout)'
697
704
  )
698
705
 
699
- # pwn.yaml specifically deep-merge missing keys from the
700
- # current release template UNDER the user's values, re-encrypt.
701
- #{self}.vault_drift # => { missing: [dotted.paths], } or nil
702
- #{self}.backfill_vault
706
+ # Run vault drift and return its result
707
+ #{self}.vault_drift(
708
+ key: 'optional - vault key, iv: optional - vault iv'
709
+ )
703
710
 
704
- # Data:
705
- #{self}::SCHEMA_VERSION # bump when a ~/.pwn file shape changes
706
- #{self}::STATE_FILES # rel-path owner verifier fix
707
- #{self}::MIGRATIONS # ordered idempotent transforms
711
+ # Run backfill vault and return its result
712
+ #{self}.backfill_vault(
713
+ key: 'optional - optional, iv: optional, dry_run: false, io: $stdout',
714
+ io: 'optional - io value consumed by #backfill_vault',
715
+ dry_run: 'optional - dry run value consumed by #backfill_vault',
716
+ iv: 'optional - iv value consumed by #backfill_vault'
717
+ )
708
718
 
709
- # From the shell:
710
- pwn setup --migrate # == #{self}.run
711
- pwn setup --migrate --fix # == #{self}.run(fix: true)
712
- pwn setup --migrate --dry-run
719
+ # Run env template and return its result
720
+ #{self}.env_template
713
721
 
722
+ # Print the AUTHOR(S) string for this module.
714
723
  #{self}.authors
715
724
  "
725
+ constants.sort
716
726
  end
717
727
  end
718
728
  end
@@ -435,14 +435,45 @@ module PWN
435
435
  end
436
436
 
437
437
  public_class_method def self.help
438
- puts <<~USAGE
439
- USAGE:
440
- #{self}.enumerate
441
- #{self}.refresh!
442
- #{self}.drift
443
- #{self}.install(pwn_skills_path: '~/.pwn/skills')
444
- #{self}.authors
445
- USAGE
438
+ puts "USAGE:
439
+ # Run enumerate and return its result
440
+ #{self}.enumerate(
441
+ lib_root: 'optional - lib root value consumed by #enumerate'
442
+ )
443
+
444
+ # Run relpath and return its result
445
+ #{self}.relpath(
446
+ source: 'optional - source value consumed by #relpath',
447
+ const: 'optional - const value consumed by #relpath'
448
+ )
449
+
450
+ # Run render and return its result
451
+ #{self}.render(
452
+ module: 'optional - module value consumed by #render (defaults to opts)'
453
+ )
454
+
455
+ # Run refresh and return its result
456
+ #{self}.refresh!(
457
+ dest: 'required - dest value consumed by #refresh!',
458
+ lib_root: 'optional - lib root value consumed by #refresh!'
459
+ )
460
+
461
+ # Run drift and return its result
462
+ #{self}.drift(
463
+ dest: 'required - dest value consumed by #drift',
464
+ lib_root: 'optional - lib root value consumed by #drift'
465
+ )
466
+
467
+ # Run install and return its result
468
+ #{self}.install(
469
+ pwn_skills_path: 'required - pwn skills path value consumed by #install',
470
+ source: 'optional - source value consumed by #install'
471
+ )
472
+
473
+ # Print the AUTHOR(S) string for this module.
474
+ #{self}.authors
475
+ "
476
+ constants.sort
446
477
  end
447
478
  end
448
479
  end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+ require 'digest'
5
+
6
+ module PWN
7
+ module Plugins
8
+ # AFL++ campaign wrapper.
9
+ module AFLplusplus
10
+ public_class_method def self.required_bins
11
+ %w[afl-fuzz]
12
+ end
13
+
14
+ public_class_method def self.fuzz(opts = {})
15
+ PWN::Plugins::PreflightChecker.require_bin!(name: 'afl-fuzz')
16
+ in_dir = opts[:in_dir] || opts[:corpus]
17
+ out_dir = opts[:out_dir] || opts[:output]
18
+ target = opts[:target]
19
+ raise 'ERROR: in_dir, out_dir, and target are required' if in_dir.to_s.empty? || out_dir.to_s.empty? || target.to_s.empty?
20
+
21
+ cmd = ['afl-fuzz', '-i', in_dir.to_s, '-o', out_dir.to_s, '--', target.to_s]
22
+ cmd.concat(Array(opts[:args]))
23
+ stdout, stderr, status = Open3.capture3(*cmd)
24
+ { stdout: stdout, stderr: stderr, exit: status.exitstatus }
25
+ end
26
+
27
+ public_class_method def self.crash_triage(opts = {})
28
+ out_dir = (opts[:out_dir] || opts[:output]).to_s
29
+ raise 'ERROR: out_dir is required' if out_dir.empty?
30
+
31
+ crashes = Dir[File.join(out_dir, '**/crashes/id:*')]
32
+ hashes = crashes.map { |p| [p, Digest::SHA256.file(p).hexdigest] }
33
+ {
34
+ crashes: crashes,
35
+ unique: hashes.map(&:last).uniq,
36
+ asan: crashes.any? { |p| File.binread(p).include?('AddressSanitizer') }
37
+ }
38
+ end
39
+
40
+ public_class_method def self.authors
41
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
42
+ end
43
+
44
+ public_class_method def self.help
45
+ puts "USAGE:
46
+ # List host binaries this module expects to be installed.
47
+ #{self}.required_bins
48
+
49
+ # Run fuzz and return its result
50
+ #{self}.fuzz(
51
+ in_dir: 'required - in dir value consumed by #fuzz (defaults to opts[:corpus])',
52
+ corpus: 'optional - corpus value consumed by #fuzz',
53
+ out_dir: 'required - out dir value consumed by #fuzz (defaults to opts[:output])',
54
+ output: 'optional - output value consumed by #fuzz',
55
+ target: 'required - hostname, IP, or CIDR to scan',
56
+ args: 'optional - Array args value consumed by #fuzz'
57
+ )
58
+
59
+ # Dedup AFL++ crash files by sha256 and note AddressSanitizer hits.
60
+ #{self}.crash_triage(
61
+ out_dir: 'required - AFL output directory containing crashes/',
62
+ output: 'optional - alias for out_dir'
63
+ )
64
+
65
+ # Print the AUTHOR(S) string for this module.
66
+ #{self}.authors
67
+ "
68
+ constants.sort
69
+ end
70
+ end
71
+ end
72
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'yaml'
4
+ require 'fileutils'
5
+ require 'tmpdir'
4
6
  module PWN
5
7
  module Plugins
6
8
  # PWN module used to interact w/ Android Devices
@@ -1275,6 +1277,33 @@ module PWN
1275
1277
  raise e
1276
1278
  end
1277
1279
 
1280
+ public_class_method def self.apk_pipeline(opts = {})
1281
+ apk = opts[:apk].to_s
1282
+ raise 'ERROR: apk is required' if apk.empty?
1283
+
1284
+ out = opts[:out_dir] || File.join(Dir.tmpdir, "pwn-apk-#{Process.pid}")
1285
+ FileUtils.mkdir_p(out)
1286
+ decoded = File.join(out, 'apktool')
1287
+ jadx_out = File.join(out, 'jadx')
1288
+ steps = []
1289
+ if PWN::Plugins::PreflightChecker.bin?(name: 'apktool')
1290
+ system('apktool', 'd', '-f', '-o', decoded, apk)
1291
+ steps << :apktool
1292
+ end
1293
+ if PWN::Plugins::PreflightChecker.bin?(name: 'jadx')
1294
+ FileUtils.mkdir_p(jadx_out)
1295
+ system('jadx', '-d', jadx_out, apk)
1296
+ steps << :jadx
1297
+ end
1298
+ manifest = File.join(decoded, 'AndroidManifest.xml')
1299
+ perms = []
1300
+ if File.file?(manifest)
1301
+ txt = File.read(manifest)
1302
+ perms = txt.scan(/android:name="([^"]+)"/).flatten.grep(/PERMISSION|permission/)
1303
+ end
1304
+ { out_dir: out, steps: steps, apk: apk, permissions: perms, manifest: (File.file?(manifest) ? manifest : nil) }
1305
+ end
1306
+
1278
1307
  # Author(s):: 0day Inc. <support@0dayinc.com>
1279
1308
 
1280
1309
  public_class_method def self.authors
@@ -1287,330 +1316,127 @@ module PWN
1287
1316
 
1288
1317
  public_class_method def self.help
1289
1318
  puts "USAGE:
1290
-
1319
+ # Run adb net connect and return its result
1291
1320
  #{self}.adb_net_connect(
1292
1321
  adb_path: 'required - path to adb binary',
1293
1322
  target: 'required - target host or IP to connect',
1294
1323
  port: 'optional - defaults to tcp 5555'
1295
1324
  )
1296
1325
 
1297
- adb_response = #{self}.adb_sh(
1326
+ # Run adb sh and return its result
1327
+ #{self}.adb_sh(
1298
1328
  adb_path: 'required - path to adb binary',
1299
- command: 'adb command to execute'
1300
- as_root: 'optional - boolean (defaults to false)',
1329
+ command: 'required - adb command to execute',
1330
+ as_root: 'optional - boolean (defaults to false)'
1301
1331
  )
1302
1332
 
1333
+ # Run adb push and return its result
1303
1334
  #{self}.adb_push(
1304
1335
  adb_path: 'required - path to adb binary',
1305
1336
  file: 'required - source file to push',
1306
- dest: 'required - destination path to push file',
1307
- as_root: 'optional - boolean (defaults to false)',
1337
+ dest: 'required - destination path to save pushed file',
1338
+ as_root: 'optional - boolean (defaults to false)'
1308
1339
  )
1309
1340
 
1341
+ # Run adb pull and return its result
1310
1342
  #{self}.adb_pull(
1311
1343
  adb_path: 'required - path to adb binary',
1312
1344
  file: 'required - source file to pull',
1313
- dest: 'required - destination path to pull file',
1314
- as_root: 'optional - boolean (defaults to false)',
1345
+ dest: 'required - destination path to save pulled file',
1346
+ as_root: 'optional - boolean (defaults to false)'
1315
1347
  )
1316
1348
 
1349
+ # Run take screenshot and return its result
1317
1350
  #{self}.take_screenshot(
1318
1351
  adb_path: 'required - path to adb binary',
1319
1352
  dest: 'optional - destination path to save screenshot file (defaults to /sdcard/screen.png)',
1320
1353
  as_root: 'optional - boolean (defaults to true)'
1321
1354
  )
1322
1355
 
1356
+ # Run screen record and return its result
1323
1357
  #{self}.screen_record(
1324
1358
  adb_path: 'required - path to adb binary',
1325
1359
  dest: 'optional - destination path to save screen record file (defaults to /sdcard/screen.mp4)',
1326
1360
  as_root: 'optional - boolean (defaults to true)'
1327
1361
  )
1328
1362
 
1329
- installed_apps_arr = #{self}.list_installed_apps(
1363
+ # Run list installed apps and return its result
1364
+ #{self}.list_installed_apps(
1330
1365
  adb_path: 'required - path to adb binary',
1331
- as_root: 'optional - boolean (defaults to false)',
1366
+ as_root: 'optional - boolean (defaults to false)'
1332
1367
  )
1333
1368
 
1334
- app_response = #{self}.dumpsys(
1369
+ # Run dumpsys and return its result
1370
+ #{self}.dumpsys(
1335
1371
  adb_path: 'required - path to adb binary',
1336
1372
  app: 'optional - application app to detail otherwise display all (i.e. display info from an android app returned from #list_install_apps method)',
1337
- as_root: 'optional - boolean (defaults to false)',
1373
+ as_root: 'optional - boolean (defaults to false)'
1338
1374
  )
1339
1375
 
1340
- app_response = #{self}.open_app(
1376
+ # Run open app and return its result
1377
+ #{self}.open_app(
1341
1378
  adb_path: 'required - path to adb binary',
1342
1379
  app: 'required - application app to run (i.e. open an android app returned from #list_install_apps method)',
1343
1380
  as_root: 'optional - boolean (defaults to false)'
1344
1381
  )
1345
1382
 
1383
+ # Run find hidden codes and return its result
1346
1384
  #{self}.find_hidden_codes(
1347
1385
  adb_path: 'required - path to adb binary',
1348
- from: 'required - start at keycode #'
1386
+ from: 'required - start at keycode #',
1349
1387
  to: 'required - end at keycode #',
1350
1388
  interact: 'optional - defaults to false'
1351
1389
  )
1352
1390
 
1391
+ # Run swipe and return its result
1353
1392
  #{self}.swipe(
1354
1393
  adb_path: 'required - path to adb binary',
1355
1394
  direction: 'required - direction to swipe (:up|:down|:left|:right)'
1356
1395
  )
1357
1396
 
1397
+ # Run input and return its result
1358
1398
  #{self}.input(
1359
1399
  adb_path: 'required - path to adb binary',
1360
1400
  string: 'required - string to type'
1361
1401
  )
1362
1402
 
1403
+ # see https://developer.android.com/reference/android/view/KeyEvent.html for more info
1363
1404
  #{self}.input_special(
1364
1405
  adb_path: 'required - path to adb binary',
1365
- event: 'required - special event to invoke (
1366
- :zoom_in|
1367
- :zoom_out|
1368
- :zenkaku_hankaku|
1369
- :yen|
1370
- :window|
1371
- :wakeup|
1372
- :voice_assist|
1373
- :tv_zoom_mode|
1374
- :tv_timer_programming|
1375
- :tv_terrestrial_digital|
1376
- :tv_terrestrial_analog|
1377
- :tv_satellite_teletext|
1378
- :tv_satellite_service|
1379
- :tv_satellite|
1380
- :tv_satellite_bs|
1381
- :tv_satellite_cs|
1382
- :tv_radio_service|
1383
- :tv_power|
1384
- :tv_number_entry|
1385
- :tv_network|
1386
- :tv_media_context_menu|
1387
- :tv_input_vga1|
1388
- :tv_input_hdmi1|
1389
- :tv_input_hdmi2|
1390
- :tv_input_hdmi3|
1391
- :tv_input_hdmi4|
1392
- :tv_input_composite1|
1393
- :tv_input_composite2|
1394
- :tv_input_component1|
1395
- :tv_input_component2|
1396
- :tv_input|
1397
- :tv_data_service|
1398
- :tv_contents_menu|
1399
- :tv_audio_desc|
1400
- :tv_audio_desc_mix_up|
1401
- :tv_audio_desc_mix_down|
1402
- :tv_antenna_cable|
1403
- :tv|
1404
- :sysrq|
1405
- :switch_charset|
1406
- :stem_primary|
1407
- :stem1|
1408
- :stem2|
1409
- :stem3|
1410
- :stb_power|
1411
- :stb_input|
1412
- :sleep|
1413
- :settings|
1414
- :scroll_lock|
1415
- :ro|
1416
- :prog_blue|
1417
- :prog_green|
1418
- :prog_red|
1419
- :prog_yellow|
1420
- :pairing|
1421
- :num_lock|
1422
- :numpad_subtract|
1423
- :numpad_multiply|
1424
- :numpad_left_paren|
1425
- :numpad_right_paren|
1426
- :numpad_equals|
1427
- :numpad_enter|
1428
- :numpad_dot|
1429
- :numpad_comma|
1430
- :numpad_add|
1431
- :numpad0|
1432
- :numpad1|
1433
- :numpad2|
1434
- :numpad3|
1435
- :numpad4|
1436
- :numpad5|
1437
- :numpad6|
1438
- :numpad7|
1439
- :numpad8|
1440
- :numpad9|
1441
- :num|
1442
- :nav_in|
1443
- :nav_next|
1444
- :nav_out|
1445
- :nav_previous|
1446
- :music|
1447
- :muhenkan|
1448
- :meta_left|
1449
- :meta_right|
1450
- :media_top_menu|
1451
- :media_step_forward|
1452
- :media_step_back|
1453
- :media_skip_forward|
1454
- :media_skip_back|
1455
- :media_record|
1456
- :media_play|
1457
- :media_eject|
1458
- :media_close|
1459
- :media_audio_track|
1460
- :manner_mode|
1461
- :last_channel|
1462
- :language_switch|
1463
- :katakana_hiragana|
1464
- :kana|
1465
- :insert|
1466
- :info|
1467
- :henkan|
1468
- :help|
1469
- :guide|
1470
- :del|
1471
- :f1|
1472
- :f2|
1473
- :f3|
1474
- :f4|
1475
- :f5|
1476
- :f6|
1477
- :f7|
1478
- :f8|
1479
- :f9|
1480
- :f10|
1481
- :f11|
1482
- :f12|
1483
- :escape|
1484
- :eisu|
1485
- :dvr|
1486
- :ctrl_left|
1487
- :ctrl_right|
1488
- :cut|
1489
- :copy|
1490
- :paste|
1491
- :contacts|
1492
- :chan_down|
1493
- :chan_up|
1494
- :captions|
1495
- :caps_lock|
1496
- :calendar|
1497
- :calculator|
1498
- :gamepad1|
1499
- :gamepad2|
1500
- :gamepad3|
1501
- :gamepad4|
1502
- :gamepad5|
1503
- :gamepad6|
1504
- :gamepad7|
1505
- :gamepad8|
1506
- :gamepad9|
1507
- :gamepad10|
1508
- :gamepad11|
1509
- :gamepad12|
1510
- :gamepad13|
1511
- :gamepad14|
1512
- :gamepad15|
1513
- :gamepad16|
1514
- :gamepad_a|
1515
- :gamepad_b|
1516
- :gamepad_c|
1517
- :gamepad_l1|
1518
- :gamepad_l2|
1519
- :gamepad_mode|
1520
- :gamepad_r1|
1521
- :gamepad_r2|
1522
- :gamepad_select|
1523
- :gamepad_start|
1524
- :gamepad_thumbl|
1525
- :gamepad_thumbr|
1526
- :gamepad_x|
1527
- :gamepad_y|
1528
- :gamepad_z|
1529
- :brightness_up|
1530
- :brightness_down|
1531
- :break|
1532
- :bookmark|
1533
- :avr_power|
1534
- :avr_input|
1535
- :assist|
1536
- :app_switch|
1537
- :threeDmode|
1538
- :eleven|
1539
- :twelve|
1540
- :unknown|
1541
- :soft_left|
1542
- :soft_right|
1543
- :soft_sleep|
1544
- :home|
1545
- :forward|
1546
- :back|
1547
- :call|
1548
- :endcall|
1549
- :dpad_up|
1550
- :dpad_down|
1551
- :dpad_left|
1552
- :dpad_right|
1553
- :dpad_down_left|
1554
- :dpad_down_right|
1555
- :dpad_up_left|
1556
- :dpad_up_right|
1557
- :dpad_center|
1558
- :volume_up|
1559
- :volume_down|
1560
- :power|
1561
- :camera|
1562
- :clear|
1563
- :alt_left|
1564
- :alt_right|
1565
- :shift_left|
1566
- :shift_right|
1567
- :tab|
1568
- :sym|
1569
- :explorer|
1570
- :envelope|
1571
- :enter|
1572
- :backspace|
1573
- :headsethook|
1574
- :focus|
1575
- :menu|
1576
- :top_menu|
1577
- :notification|
1578
- :search|
1579
- :media_play_pause|
1580
- :media_stop|
1581
- :media_next|
1582
- :media_previous|
1583
- :media_rewind|
1584
- :media_fast_forward|
1585
- :mute|
1586
- :page_up|
1587
- :page_down|
1588
- :pictsymbols|
1589
- :move_home|
1590
- :move_end
1591
- )
1592
- see https://developer.android.com/reference/android/view/KeyEvent.html for more info'
1406
+ event: 'required - special event to invoke ('
1593
1407
  )
1594
1408
 
1595
- app_response = #{self}.close_app(
1409
+ # Run close app and return its result
1410
+ #{self}.close_app(
1596
1411
  adb_path: 'required - path to adb binary',
1597
- app: 'required - application app to run (i.e. open an android app returned from #list_install_apps method)',
1412
+ app: 'required - application app to close (i.e. open an android app returned from #list_install_apps method)',
1598
1413
  as_root: 'optional - boolean (defaults to false)'
1599
1414
  )
1600
1415
 
1416
+ # Run invoke event listener and return its result
1601
1417
  #{self}.invoke_event_listener(
1602
1418
  adb_path: 'required - path to adb binary',
1603
1419
  as_root: 'optional - boolean (defaults to false)',
1420
+ app: 'optional - app value consumed by #invoke_event_listener'
1604
1421
  )
1605
1422
 
1423
+ # Run adb net disconnect and return its result
1606
1424
  #{self}.adb_net_disconnect(
1607
1425
  adb_path: 'required - path to adb binary',
1608
- target: 'required - target host or IP to connect',
1426
+ target: 'required - target host or IP to disconnect',
1609
1427
  port: 'optional - defaults to tcp 5555'
1610
1428
  )
1611
1429
 
1430
+ # Run apk pipeline and return its result
1431
+ #{self}.apk_pipeline(
1432
+ apk: 'required - apk value consumed by #apk_pipeline',
1433
+ out_dir: 'optional - out dir value consumed by #apk_pipeline'
1434
+ )
1435
+
1436
+ # Print the AUTHOR(S) string for this module.
1612
1437
  #{self}.authors
1613
1438
  "
1439
+ constants.sort
1614
1440
  end
1615
1441
  end
1616
1442
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+ require 'json'
5
+
6
+ module PWN
7
+ module Plugins
8
+ # ~/.pwn/artifacts/<session>/ loot index for session_recall.
9
+ module ArtifactRegistry
10
+ ROOT = File.join(Dir.home, '.pwn', 'artifacts')
11
+
12
+ public_class_method def self.required_bins
13
+ []
14
+ end
15
+
16
+ public_class_method def self.register(opts = {})
17
+ sid = (opts[:session_id] || 'default').to_s
18
+ src = opts[:path].to_s
19
+ raise 'ERROR: path is required' if src.empty?
20
+ raise "ERROR: file not found: #{src}" unless File.file?(src)
21
+
22
+ dir = File.join(ROOT, sid)
23
+ FileUtils.mkdir_p(dir)
24
+ dest = File.join(dir, File.basename(src))
25
+ FileUtils.cp(src, dest)
26
+ meta = File.join(dir, 'index.jsonl')
27
+ File.open(meta, 'a') { |f| f.puts(JSON.generate(path: dest, kind: opts[:kind], src: src, at: Time.now.utc.iso8601)) }
28
+ dest
29
+ end
30
+
31
+ public_class_method def self.list(opts = {})
32
+ sid = (opts[:session_id] || 'default').to_s
33
+ meta = File.join(ROOT, sid, 'index.jsonl')
34
+ return [] unless File.file?(meta)
35
+
36
+ File.readlines(meta).filter_map do |ln|
37
+ JSON.parse(ln, symbolize_names: true)
38
+ rescue JSON::ParserError
39
+ nil
40
+ end
41
+ end
42
+
43
+ public_class_method def self.authors
44
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
45
+ end
46
+
47
+ public_class_method def self.help
48
+ puts "USAGE:
49
+ # List host binaries this module expects to be installed.
50
+ #{self}.required_bins
51
+
52
+ # Run register and return its result
53
+ #{self}.register(
54
+ session_id: 'optional - session id value consumed by #register',
55
+ path: 'required - filesystem path to read or write',
56
+ kind: 'optional - kind value consumed by #register'
57
+ )
58
+
59
+ # Run list and return its result
60
+ #{self}.list(
61
+ session_id: 'optional - session id value consumed by #list'
62
+ )
63
+
64
+ # Print the AUTHOR(S) string for this module.
65
+ #{self}.authors
66
+ "
67
+ constants.sort
68
+ end
69
+ end
70
+ end
71
+ end