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
@@ -105,26 +105,32 @@ module PWN
105
105
 
106
106
  public_class_method def self.help
107
107
  puts "USAGE:
108
- ldap_obj = #{self}.connect(
109
- host: 'required host or IP',
110
- port: 'required port',
111
- base: 'required ldap base to search from (e.g. dc=domain,dc=com)',
112
- encryption: 'optional parameter to protect communication in transit, :simple_tls OR :start_tls',
113
- auth_method: 'required ldap auth bind method, :simple, :sasl, OR :gss_spnego'
114
- username: 'required username',
115
- password: 'optional (prompts if left blank)',
108
+ # Run connect and return its result
109
+ #{self}.connect(
110
+ host: 'required - required host or IP',
111
+ port: 'optional - optional port (defaults to 636)',
112
+ base: 'required - required ldap base to search from (e.g. dc=domain,dc=com)',
113
+ encryption: 'optional - optional parameter to protect communication in transit, :simple_tls OR :start_tls',
114
+ auth_method: 'required - required ldap auth bind method, :simple, :sasl, OR :gss_spnego',
115
+ username: 'required - required username (e.g. support@0dayinc.com)',
116
+ password: 'optional - optional (prompts if left blank)'
116
117
  )
117
118
 
118
- employee = #{self}.get_employee_by_username(
119
- ldap_obj: 'required ldap_obj returned from #connect method',
120
- username: 'required username of employee to retrieve from LDAP server'
119
+ # Run get employee by username and return its result
120
+ #{self}.get_employee_by_username(
121
+ ldap_obj: 'required - required ldap_obj returned from #connect method',
122
+ username: 'required - required username of employee to retrieve from LDAP server'
121
123
  )
122
- puts employee[0][:dn]
123
124
 
124
- #{self}.disconnect(:ldap_obj => ldap_obj)
125
+ # Run disconnect and return its result
126
+ #{self}.disconnect(
127
+ ldap_obj: 'optional - ldap obj value consumed by #disconnect'
128
+ )
125
129
 
130
+ # Print the AUTHOR(S) string for this module.
126
131
  #{self}.authors
127
132
  "
133
+ constants.sort
128
134
  end
129
135
  end
130
136
  end
@@ -80,16 +80,22 @@ module PWN
80
80
 
81
81
  public_class_method def self.help
82
82
  puts "USAGE:
83
- mongo_conn = #{self}.connect(
84
- host: 'optional host or IP defaults to 127.0.0.1',
85
- port: 'optional port defaults to 27017',
86
- database: 'optional database name'
83
+ # Run connect and return its result
84
+ #{self}.connect(
85
+ host: 'optional - optional host or IP defaults to 127.0.0.1',
86
+ port: 'optional - optional port defaults to 27017',
87
+ database: 'optional - optional database name'
87
88
  )
88
89
 
89
- #{self}.disconnect(mongo_conn: mongo_conn)
90
+ # Run disconnect and return its result
91
+ #{self}.disconnect(
92
+ mongo_conn: 'optional - mongo conn value consumed by #disconnect'
93
+ )
90
94
 
95
+ # Print the AUTHOR(S) string for this module.
91
96
  #{self}.authors
92
97
  "
98
+ constants.sort
93
99
  end
94
100
  end
95
101
  end
@@ -190,34 +190,43 @@ module PWN
190
190
 
191
191
  public_class_method def self.help
192
192
  puts "USAGE:
193
- pg_conn = #{self}.connect(
194
- host: 'required host or IP',
195
- port: 'optional port (defaults to 5432)',
196
- dbname: 'required database name',
197
- user: 'required username',
198
- password: 'optional (prompts if left blank)',
199
- connect_timeout: 'optional (defaults to 60 seconds)',
200
- options: 'optional postgres options',
201
- tty: 'optional tty',
202
- sslmode: :disable|:allow|:prefer|:require
193
+ # Run connect and return its result
194
+ #{self}.connect(
195
+ host: 'required - required host or IP',
196
+ port: 'optional - optional port (defaults to 5432)',
197
+ dbname: 'required - required database name',
198
+ user: 'required - required username',
199
+ password: 'optional - optional (prompts if left blank)',
200
+ connect_timeout: 'optional - optional (defaults to 60 seconds)',
201
+ options: 'optional - optional postgres options',
202
+ tty: 'optional - optional tty',
203
+ sslmode: 'required - :disable|:allow|:prefer|:require'
203
204
  )
204
205
 
205
- res = #{self}.sql_statement(
206
- pg_conn: pg_conn,
207
- prepared_statement: 'SELECT * FROM tn_users WHERE state = $1',
208
- statement_params: ['Active']
206
+ # Run sql statement and return its result
207
+ #{self}.sql_statement(
208
+ pg_conn: 'optional - pg conn value consumed by #sql_statement',
209
+ prepared_statement: 'optional - SELECT * FROM tn_users WHERE state = $1',
210
+ statement_params: 'required - statement params value consumed by #sql_statement'
209
211
  )
210
212
 
211
- res = #{self}.list_all_columns_by_table(
212
- pg_conn: pg_conn,
213
- schema: 'required schema name',
214
- table_name: 'required table name'
213
+ # Method Parameters Not Implemented
214
+ #{self}.list_all_columns_by_table(
215
+ pg_conn: 'optional - pg conn value consumed by #list_all_columns_by_table',
216
+ schema: 'required - required schema name',
217
+ table_name: 'required - required table name',
218
+ table_schema: 'optional - table schema value consumed by #list_all_columns_by_table'
215
219
  )
216
220
 
217
- #{self}.disconnect(pg_conn: pg_conn)
221
+ # Run disconnect and return its result
222
+ #{self}.disconnect(
223
+ pg_conn: 'optional - pg conn value consumed by #disconnect'
224
+ )
218
225
 
226
+ # Print the AUTHOR(S) string for this module.
219
227
  #{self}.authors
220
228
  "
229
+ constants.sort
221
230
  end
222
231
  end
223
232
  end
@@ -107,18 +107,27 @@ module PWN
107
107
 
108
108
  public_class_method def self.help
109
109
  puts "USAGE:
110
- sqlite3_conn = #{self}.connect(db_path: 'Required - Path of SQLite3 DB File')
110
+ # Run connect and return its result
111
+ #{self}.connect(
112
+ db_path: 'required - Path of SQLite3 DB File'
113
+ )
111
114
 
112
- res = #{self}.sql_statement(
113
- sqlite3_conn: sqlite3_conn,
114
- prepared_statement: 'SELECT * FROM tn_users WHERE state = ?;',
115
- statement_params: ['Active']
115
+ # Run sql statement and return its result
116
+ #{self}.sql_statement(
117
+ sqlite3_conn: 'optional - sqlite3 conn value consumed by #sql_statement',
118
+ prepared_statement: 'optional - SELECT * FROM tn_users WHERE state = ?;',
119
+ statement_params: 'required - statement params value consumed by #sql_statement'
116
120
  )
117
121
 
118
- #{self}.disconnect(:sqlite3_conn => sqlite3_conn)
122
+ # Run disconnect and return its result
123
+ #{self}.disconnect(
124
+ sqlite3_conn: 'optional - sqlite3 conn value consumed by #disconnect'
125
+ )
119
126
 
127
+ # Print the AUTHOR(S) string for this module.
120
128
  #{self}.authors
121
129
  "
130
+ constants.sort
122
131
  end
123
132
  end
124
133
  end
@@ -738,7 +738,8 @@ module PWN
738
738
 
739
739
  public_class_method def self.help
740
740
  puts "USAGE:
741
- dd_obj = #{self}.login(
741
+ # Run login and return its result
742
+ #{self}.login(
742
743
  url: 'required - url of DefectDojo Server',
743
744
  api_version: 'required - api version to use v1 || v2',
744
745
  username: 'required - username to AuthN w/ api v1)',
@@ -746,18 +747,21 @@ module PWN
746
747
  proxy: 'optional - proxy all traffic through MITM proxy (defaults to nil)'
747
748
  )
748
749
 
749
- product_list = #{self}.product_list(
750
- dd_obj: 'required dd_obj returned from #login_v1 method',
750
+ # Run product list and return its result
751
+ #{self}.product_list(
752
+ dd_obj: 'required - required dd_obj returned from #login method',
751
753
  id: 'optional - retrieve single product by id, otherwise return all'
752
754
  )
753
755
 
754
- engagement_list = #{self}.engagement_list(
755
- dd_obj: 'required dd_obj returned from #login_v1 method',
756
+ # Run engagement list and return its result
757
+ #{self}.engagement_list(
758
+ dd_obj: 'required - required dd_obj returned from #login method',
756
759
  id: 'optional - retrieve single engagement by id, otherwise return all'
757
760
  )
758
761
 
759
- engagement_create_response = #{self}.engagement_create(
760
- dd_obj: 'required - dd_obj returned from #login_v1 method',
762
+ # Run engagement create and return its result
763
+ #{self}.engagement_create(
764
+ dd_obj: 'required - dd_obj returned from #login method',
761
765
  name: 'required - name of the engagement',
762
766
  description: 'optional - description of engagement',
763
767
  engagement_type: 'optional - type of engagement Interactive||CI/CD (defaults to CI/CD)',
@@ -774,16 +778,19 @@ module PWN
774
778
  check_list: 'optional - boolean to set an engagement as a checkbox assessment (defaults to false)',
775
779
  first_contacted: 'optional - date of engagement request e.g. 2018-06-18 (Defaults to current day)',
776
780
  target_start: 'optional - date to start enagement e.g. 2018-06-19 (Defaults to current day)',
777
- target_end: 'optional - date of engagement completion e.g. 2018-06-20 (Defaults to current day)'
781
+ target_end: 'optional - date of engagement completion e.g. 2018-06-20 (Defaults to current day)',
782
+ engagment_type: 'optional - engagment type value consumed by #engagement_create'
778
783
  )
779
784
 
780
- test_list = #{self}.test_list(
781
- dd_obj: 'required dd_obj returned from #login_v1 method',
785
+ # Run test list and return its result
786
+ #{self}.test_list(
787
+ dd_obj: 'required - required dd_obj returned from #login method',
782
788
  id: 'optional - retrieve single test by id, otherwise return all'
783
789
  )
784
790
 
785
- importscan_response = #{self}.importscan(
786
- dd_obj: 'required - dd_obj returned from #login_v1 method',
791
+ # Run importscan and return its result
792
+ #{self}.importscan(
793
+ dd_obj: 'required - dd_obj returned from #login method',
787
794
  engagement_name: 'required - name of engagement to associate w/ scan',
788
795
  scan_type: 'required - type of scan importing (see <DEFECTDOJO_URL>/admin/dojo/test_type/ for listing)',
789
796
  file: 'required - path of scan results file',
@@ -795,11 +802,14 @@ module PWN
795
802
  create_finding_groups: 'optional - flag to create finding groups (defaults to false)',
796
803
  close_old_findings_product_scope: 'optional - flag to close old findings from engagement (defaults to false)',
797
804
  close_old_findings: 'optional - flag to close old findings, regardless of engagement (defaults to false)',
798
- push_to_jira: 'optional - flag to push findings to JIRA (defaults to false)'
805
+ push_to_jira: 'optional - flag to push findings to JIRA (defaults to false)',
806
+ test_title: 'optional - test title value consumed by #importscan',
807
+ group_by: 'required - group by value consumed by #importscan'
799
808
  )
800
809
 
801
- reimportscan_response = #{self}.reimportscan(
802
- dd_obj: 'required - dd_obj returned from #login_v1 method',
810
+ # Run reimportscan and return its result
811
+ #{self}.reimportscan(
812
+ dd_obj: 'required - dd_obj returned from #login method',
803
813
  engagement_name: 'required - name of engagement to associate w/ scan',
804
814
  scan_type: 'required - type of scan importing (see <DEFECTDOJO_URL>/admin/dojo/test_type/ for listing)',
805
815
  file: 'required - path of scan results file',
@@ -814,27 +824,33 @@ module PWN
814
824
  push_to_jira: 'optional - flag to push findings to JIRA (defaults to false)'
815
825
  )
816
826
 
817
- finding_list = #{self}.finding_list(
818
- dd_obj: 'required dd_obj returned from #login_v1 method',
827
+ # Run finding list and return its result
828
+ #{self}.finding_list(
829
+ dd_obj: 'required - required dd_obj returned from #login method',
819
830
  id: 'optional - retrieve single finding by id, otherwise return all'
820
831
  )
821
832
 
822
- user_list = #{self}.user_list(
823
- dd_obj: 'required dd_obj returned from #login_v1 method',
833
+ # Run user list and return its result
834
+ #{self}.user_list(
835
+ dd_obj: 'required - required dd_obj returned from #login method',
824
836
  id: 'optional - retrieve single user by id, otherwise return all'
825
837
  )
826
838
 
827
- tool_configuration_list = #{self}.tool_configuration_list(
828
- dd_obj: 'required dd_obj returned from #login_v1 method',
839
+ # Run tool configuration list and return its result
840
+ #{self}.tool_configuration_list(
841
+ dd_obj: 'required - required dd_obj returned from #login method',
829
842
  id: 'optional - retrieve single test by id, otherwise return all'
830
843
  )
831
844
 
845
+ # Run logout and return its result
832
846
  #{self}.logout(
833
- dd_obj: 'required dd_obj returned from #login_v1 or #login_v2 method'
847
+ dd_obj: 'required - required dd_obj returned from #login method'
834
848
  )
835
849
 
850
+ # Print the AUTHOR(S) string for this module.
836
851
  #{self}.authors
837
852
  "
853
+ constants.sort
838
854
  end
839
855
  end
840
856
  end
@@ -57,14 +57,19 @@ module PWN
57
57
 
58
58
  public_class_method def self.help
59
59
  puts "USAGE:
60
+ # Run type and return its result
60
61
  #{self}.type
61
62
 
63
+ # Run arch and return its result
62
64
  #{self}.arch
63
65
 
66
+ # Run endian and return its result
64
67
  #{self}.endian
65
68
 
69
+ # Print the AUTHOR(S) string for this module.
66
70
  #{self}.authors
67
71
  "
72
+ constants.sort
68
73
  end
69
74
  end
70
75
  end
@@ -129,12 +129,15 @@ module PWN
129
129
 
130
130
  public_class_method def self.help
131
131
  puts "USAGE:
132
+ # Run generate and return its result
132
133
  #{self}.generate(
133
134
  count: 'required - number of EIN numbers to generate'
134
135
  )
135
136
 
137
+ # Print the AUTHOR(S) string for this module.
136
138
  #{self}.authors
137
139
  "
140
+ constants.sort
138
141
  end
139
142
  end
140
143
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'open3'
5
+
6
+ module PWN
7
+ module Plugins
8
+ # searchsploit / ExploitDB plus a CPE string builder for nmap versions.
9
+ module ExploitDB
10
+ public_class_method def self.required_bins
11
+ %w[searchsploit]
12
+ end
13
+
14
+ public_class_method def self.search(opts = {})
15
+ q = (opts[:query] || opts[:q]).to_s
16
+ raise 'ERROR: query is required' if q.empty?
17
+
18
+ return { error: 'searchsploit missing', query: q } unless PWN::Plugins::PreflightChecker.bin?(name: 'searchsploit')
19
+
20
+ stdout, stderr, status = Open3.capture3('searchsploit', '--json', q)
21
+ parsed = begin
22
+ JSON.parse(stdout)
23
+ rescue JSON::ParserError
24
+ {}
25
+ end
26
+ { query: q, results: parsed['RESULTS_EXPLOIT'] || parsed['results'] || [], stderr: stderr, exit: status.exitstatus }
27
+ end
28
+
29
+ public_class_method def self.cve_for_cpe(opts = {})
30
+ cpe = opts[:cpe].to_s
31
+ product = opts[:product].to_s
32
+ version = opts[:version].to_s
33
+ q = cpe
34
+ q = "#{product} #{version}".strip if q.empty?
35
+ raise 'ERROR: cpe or product is required' if q.empty?
36
+
37
+ search(query: q).merge(cpe: cpe, product: product, version: version)
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
+ # Search local ExploitDB via searchsploit --json.
50
+ #{self}.search(
51
+ query: 'required - product, CVE, or keyword',
52
+ q: 'optional - alias for query'
53
+ )
54
+
55
+ # Build a search from an nmap CPE/product/version tuple.
56
+ #{self}.cve_for_cpe(
57
+ cpe: 'optional - CPE string (e.g. cpe:/a:apache:http_server:2.4.49)',
58
+ product: 'optional - product name when no CPE',
59
+ version: 'optional - version string from nmap_it'
60
+ )
61
+
62
+ # Print the AUTHOR(S) string for this module.
63
+ #{self}.authors
64
+ "
65
+ constants.sort
66
+ end
67
+ end
68
+ end
69
+ end