ronin-exploits 0.3.1 → 1.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (338) hide show
  1. checksums.yaml +7 -0
  2. data/.document +4 -0
  3. data/.editorconfig +11 -0
  4. data/.github/workflows/ruby.yml +31 -0
  5. data/.gitignore +13 -0
  6. data/.mailmap +1 -0
  7. data/.rspec +1 -0
  8. data/.ruby-version +1 -0
  9. data/.yardopts +1 -0
  10. data/COPYING.txt +161 -335
  11. data/{History.txt → ChangeLog.md} +119 -16
  12. data/Gemfile +50 -0
  13. data/README.md +454 -0
  14. data/Rakefile +37 -23
  15. data/bin/ronin-exploits +13 -6
  16. data/data/new/exploit.rb.erb +158 -0
  17. data/gemspec.yml +44 -0
  18. data/lib/ronin/exploits/advisory.rb +84 -0
  19. data/lib/ronin/exploits/cli/command.rb +39 -0
  20. data/lib/ronin/exploits/cli/commands/irb.rb +57 -0
  21. data/lib/ronin/exploits/cli/commands/list.rb +80 -0
  22. data/lib/ronin/exploits/cli/commands/new.rb +332 -0
  23. data/lib/ronin/exploits/cli/commands/run.rb +396 -0
  24. data/lib/ronin/exploits/cli/commands/show.rb +290 -0
  25. data/lib/ronin/exploits/cli/exploit_command.rb +114 -0
  26. data/lib/ronin/exploits/cli/exploit_methods.rb +114 -0
  27. data/lib/ronin/exploits/cli/ruby_shell.rb +51 -0
  28. data/lib/ronin/exploits/cli.rb +51 -0
  29. data/lib/ronin/exploits/client_side_web_vuln.rb +69 -0
  30. data/lib/ronin/exploits/exceptions.rb +27 -17
  31. data/lib/ronin/exploits/exploit.rb +501 -582
  32. data/lib/ronin/exploits/heap_overflow.rb +50 -0
  33. data/lib/ronin/exploits/lfi.rb +141 -0
  34. data/lib/ronin/exploits/loot/file.rb +113 -0
  35. data/lib/ronin/exploits/loot.rb +119 -0
  36. data/lib/ronin/exploits/memory_corruption.rb +53 -0
  37. data/lib/ronin/exploits/metadata/arch.rb +83 -0
  38. data/lib/ronin/exploits/metadata/cookie_param.rb +80 -0
  39. data/lib/ronin/exploits/metadata/default_filename.rb +69 -0
  40. data/lib/ronin/exploits/metadata/default_port.rb +69 -0
  41. data/lib/ronin/exploits/metadata/header_name.rb +80 -0
  42. data/lib/ronin/exploits/metadata/os.rb +117 -0
  43. data/lib/ronin/exploits/metadata/shouts.rb +85 -0
  44. data/lib/ronin/exploits/metadata/url_path.rb +82 -0
  45. data/lib/ronin/exploits/metadata/url_query_param.rb +80 -0
  46. data/lib/ronin/exploits/mixins/binary.rb +106 -0
  47. data/lib/ronin/exploits/mixins/build_dir.rb +61 -0
  48. data/lib/ronin/exploits/mixins/file_builder.rb +102 -0
  49. data/lib/ronin/exploits/mixins/format_string.rb +87 -0
  50. data/lib/ronin/exploits/mixins/has_payload.rb +202 -0
  51. data/lib/ronin/exploits/mixins/has_targets.rb +297 -0
  52. data/lib/ronin/exploits/mixins/html.rb +213 -0
  53. data/lib/ronin/exploits/mixins/http.rb +866 -0
  54. data/lib/ronin/exploits/mixins/loot.rb +84 -0
  55. data/lib/ronin/exploits/mixins/nops.rb +121 -0
  56. data/lib/ronin/exploits/mixins/remote_tcp.rb +272 -0
  57. data/lib/ronin/exploits/mixins/remote_udp.rb +264 -0
  58. data/lib/ronin/exploits/mixins/seh.rb +136 -0
  59. data/lib/ronin/exploits/mixins/stack_overflow.rb +124 -0
  60. data/lib/ronin/exploits/mixins/text.rb +65 -0
  61. data/lib/ronin/exploits/mixins.rb +32 -0
  62. data/lib/ronin/exploits/open_redirect.rb +103 -0
  63. data/lib/ronin/exploits/params/base_url.rb +84 -0
  64. data/lib/ronin/exploits/params/bind_host.rb +53 -0
  65. data/lib/ronin/exploits/params/bind_port.rb +53 -0
  66. data/lib/ronin/exploits/params/filename.rb +71 -0
  67. data/lib/ronin/exploits/params/host.rb +56 -0
  68. data/lib/ronin/exploits/params/port.rb +71 -0
  69. data/lib/ronin/exploits/registry.rb +32 -0
  70. data/lib/ronin/exploits/rfi.rb +106 -0
  71. data/lib/ronin/exploits/root.rb +28 -0
  72. data/lib/ronin/exploits/seh_overflow.rb +90 -0
  73. data/lib/ronin/exploits/sqli.rb +172 -0
  74. data/lib/ronin/exploits/ssti.rb +108 -0
  75. data/lib/ronin/exploits/stack_overflow.rb +90 -0
  76. data/lib/ronin/exploits/target.rb +63 -103
  77. data/lib/ronin/exploits/test_result.rb +80 -0
  78. data/lib/ronin/exploits/use_after_free.rb +50 -0
  79. data/lib/ronin/exploits/version.rb +11 -12
  80. data/lib/ronin/exploits/web.rb +18 -89
  81. data/lib/ronin/exploits/web_vuln.rb +378 -0
  82. data/lib/ronin/exploits/xss.rb +102 -0
  83. data/lib/ronin/exploits.rb +19 -26
  84. data/man/ronin-exploits-irb.1 +31 -0
  85. data/man/ronin-exploits-irb.1.md +22 -0
  86. data/man/ronin-exploits-list.1 +37 -0
  87. data/man/ronin-exploits-list.1.md +27 -0
  88. data/man/ronin-exploits-new.1 +98 -0
  89. data/man/ronin-exploits-new.1.md +73 -0
  90. data/man/ronin-exploits-run.1 +117 -0
  91. data/man/ronin-exploits-run.1.md +87 -0
  92. data/man/ronin-exploits-show.1 +45 -0
  93. data/man/ronin-exploits-show.1.md +33 -0
  94. data/man/ronin-exploits.1 +55 -0
  95. data/man/ronin-exploits.1.md +41 -0
  96. data/ronin-exploits.gemspec +62 -0
  97. data/spec/advisory_spec.rb +71 -0
  98. data/spec/cli/exploit_command_spec.rb +68 -0
  99. data/spec/cli/exploit_methods_spec.rb +208 -0
  100. data/spec/cli/ruby_shell_spec.rb +14 -0
  101. data/spec/client_side_web_vuln_spec.rb +117 -0
  102. data/spec/exploit_spec.rb +538 -0
  103. data/spec/exploits_spec.rb +3 -4
  104. data/spec/heap_overflow_spec.rb +14 -0
  105. data/spec/lfi_spec.rb +162 -0
  106. data/spec/loot/file_spec.rb +131 -0
  107. data/spec/loot_spec.rb +138 -0
  108. data/spec/memory_corruption_spec.rb +22 -0
  109. data/spec/metadata/arch_spec.rb +82 -0
  110. data/spec/metadata/cookie_param_spec.rb +67 -0
  111. data/spec/metadata/default_filename_spec.rb +62 -0
  112. data/spec/metadata/default_port_spec.rb +62 -0
  113. data/spec/metadata/header_name_spec.rb +67 -0
  114. data/spec/metadata/os_spec.rb +164 -0
  115. data/spec/metadata/shouts_spec.rb +100 -0
  116. data/spec/metadata/url_path_spec.rb +67 -0
  117. data/spec/metadata/url_query_param_spec.rb +67 -0
  118. data/spec/mixins/binary_spec.rb +129 -0
  119. data/spec/mixins/build_dir.rb +66 -0
  120. data/spec/mixins/file_builder_spec.rb +67 -0
  121. data/spec/mixins/format_string_spec.rb +44 -0
  122. data/spec/mixins/has_payload_spec.rb +333 -0
  123. data/spec/mixins/has_targets_spec.rb +434 -0
  124. data/spec/mixins/html_spec.rb +772 -0
  125. data/spec/mixins/http_spec.rb +1227 -0
  126. data/spec/mixins/loot_spec.rb +20 -0
  127. data/spec/mixins/nops_spec.rb +165 -0
  128. data/spec/mixins/remote_tcp_spec.rb +217 -0
  129. data/spec/mixins/remote_udp_spec.rb +217 -0
  130. data/spec/mixins/seh_spec.rb +89 -0
  131. data/spec/mixins/stack_overflow_spec.rb +87 -0
  132. data/spec/mixins/text_spec.rb +43 -0
  133. data/spec/open_redirect_spec.rb +71 -0
  134. data/spec/params/base_url_spec.rb +71 -0
  135. data/spec/params/bind_host_spec.rb +34 -0
  136. data/spec/params/bind_port_spec.rb +35 -0
  137. data/spec/params/filename_spec.rb +77 -0
  138. data/spec/params/host_spec.rb +34 -0
  139. data/spec/params/port_spec.rb +77 -0
  140. data/spec/rfi_spec.rb +107 -0
  141. data/spec/seh_overflow_spec.rb +18 -0
  142. data/spec/spec_helper.rb +6 -10
  143. data/spec/sqli_spec.rb +306 -0
  144. data/spec/ssti_spec.rb +121 -0
  145. data/spec/stack_overflow_spec.rb +18 -0
  146. data/spec/target_spec.rb +92 -0
  147. data/spec/test_result_spec.rb +32 -0
  148. data/spec/use_after_free_spec.rb +14 -0
  149. data/spec/web_spec.rb +12 -0
  150. data/spec/web_vuln_spec.rb +854 -0
  151. data/spec/xss_spec.rb +69 -0
  152. metadata +361 -324
  153. data/Manifest.txt +0 -196
  154. data/README.txt +0 -274
  155. data/bin/ronin-exploit +0 -12
  156. data/bin/ronin-gen-binary-payload +0 -12
  157. data/bin/ronin-gen-exploit +0 -12
  158. data/bin/ronin-gen-ftp-exploit +0 -12
  159. data/bin/ronin-gen-http-exploit +0 -12
  160. data/bin/ronin-gen-local-exploit +0 -12
  161. data/bin/ronin-gen-nops +0 -12
  162. data/bin/ronin-gen-payload +0 -12
  163. data/bin/ronin-gen-remote-exploit +0 -12
  164. data/bin/ronin-gen-remote-tcp-exploit +0 -12
  165. data/bin/ronin-gen-remote-udp-exploit +0 -12
  166. data/bin/ronin-gen-shellcode +0 -12
  167. data/bin/ronin-gen-web-exploit +0 -12
  168. data/bin/ronin-payload +0 -12
  169. data/bin/ronin-payloads +0 -12
  170. data/lib/ronin/controls/behaviors.rb +0 -133
  171. data/lib/ronin/controls/exceptions/not_implemented.rb +0 -27
  172. data/lib/ronin/controls/exceptions/program_not_found.rb +0 -27
  173. data/lib/ronin/controls/exceptions.rb +0 -23
  174. data/lib/ronin/controls/file_system.rb +0 -145
  175. data/lib/ronin/controls/helpers/command_exec.rb +0 -143
  176. data/lib/ronin/controls/helpers/dir_create.rb +0 -42
  177. data/lib/ronin/controls/helpers/dir_listing.rb +0 -62
  178. data/lib/ronin/controls/helpers/dir_remove.rb +0 -42
  179. data/lib/ronin/controls/helpers/file_ctime.rb +0 -52
  180. data/lib/ronin/controls/helpers/file_mtime.rb +0 -53
  181. data/lib/ronin/controls/helpers/file_ownership.rb +0 -53
  182. data/lib/ronin/controls/helpers/file_read.rb +0 -62
  183. data/lib/ronin/controls/helpers/file_remove.rb +0 -51
  184. data/lib/ronin/controls/helpers/file_write.rb +0 -62
  185. data/lib/ronin/controls/helpers/memory_read.rb +0 -39
  186. data/lib/ronin/controls/helpers/memory_write.rb +0 -39
  187. data/lib/ronin/controls/helpers.rb +0 -33
  188. data/lib/ronin/controls.rb +0 -23
  189. data/lib/ronin/exploits/control.rb +0 -47
  190. data/lib/ronin/exploits/exceptions/exception.rb +0 -27
  191. data/lib/ronin/exploits/exceptions/exploit_not_built.rb +0 -29
  192. data/lib/ronin/exploits/exceptions/payload_size.rb +0 -29
  193. data/lib/ronin/exploits/exceptions/restricted_char.rb +0 -29
  194. data/lib/ronin/exploits/exceptions/target_data_missing.rb +0 -29
  195. data/lib/ronin/exploits/exceptions/target_unspecified.rb +0 -29
  196. data/lib/ronin/exploits/exceptions/unknown_helper.rb +0 -29
  197. data/lib/ronin/exploits/exploit_author.rb +0 -33
  198. data/lib/ronin/exploits/ftp.rb +0 -42
  199. data/lib/ronin/exploits/helpers/binary.rb +0 -50
  200. data/lib/ronin/exploits/helpers/buffer_overflow.rb +0 -115
  201. data/lib/ronin/exploits/helpers/file_based.rb +0 -112
  202. data/lib/ronin/exploits/helpers/format_string.rb +0 -117
  203. data/lib/ronin/exploits/helpers/padding.rb +0 -101
  204. data/lib/ronin/exploits/helpers.rb +0 -26
  205. data/lib/ronin/exploits/http.rb +0 -49
  206. data/lib/ronin/exploits/local.rb +0 -40
  207. data/lib/ronin/exploits/remote.rb +0 -40
  208. data/lib/ronin/exploits/remote_tcp.rb +0 -87
  209. data/lib/ronin/exploits/remote_udp.rb +0 -87
  210. data/lib/ronin/exploits/targets/buffer_overflow.rb +0 -46
  211. data/lib/ronin/exploits/targets/format_string.rb +0 -43
  212. data/lib/ronin/exploits/targets.rb +0 -27
  213. data/lib/ronin/exploits/verifiers.rb +0 -121
  214. data/lib/ronin/generators/exploits/exploit.rb +0 -70
  215. data/lib/ronin/generators/exploits/ftp.rb +0 -42
  216. data/lib/ronin/generators/exploits/http.rb +0 -42
  217. data/lib/ronin/generators/exploits/local.rb +0 -42
  218. data/lib/ronin/generators/exploits/remote.rb +0 -42
  219. data/lib/ronin/generators/exploits/remote_tcp.rb +0 -44
  220. data/lib/ronin/generators/exploits/remote_udp.rb +0 -44
  221. data/lib/ronin/generators/exploits/static.rb +0 -30
  222. data/lib/ronin/generators/exploits/web.rb +0 -45
  223. data/lib/ronin/generators/exploits.rb +0 -23
  224. data/lib/ronin/generators/payloads/binary_payload.rb +0 -42
  225. data/lib/ronin/generators/payloads/nops.rb +0 -42
  226. data/lib/ronin/generators/payloads/payload.rb +0 -66
  227. data/lib/ronin/generators/payloads/shellcode.rb +0 -42
  228. data/lib/ronin/generators/payloads/static.rb +0 -30
  229. data/lib/ronin/generators/payloads.rb +0 -23
  230. data/lib/ronin/model/has_default_port.rb +0 -54
  231. data/lib/ronin/model/targets_arch.rb +0 -68
  232. data/lib/ronin/model/targets_os.rb +0 -69
  233. data/lib/ronin/model/targets_product.rb +0 -68
  234. data/lib/ronin/payloads/asm_payload.rb +0 -40
  235. data/lib/ronin/payloads/binary_payload.rb +0 -42
  236. data/lib/ronin/payloads/control.rb +0 -47
  237. data/lib/ronin/payloads/encoders/encoder.rb +0 -92
  238. data/lib/ronin/payloads/encoders/xor.rb +0 -79
  239. data/lib/ronin/payloads/encoders.rb +0 -32
  240. data/lib/ronin/payloads/exceptions/exception.rb +0 -27
  241. data/lib/ronin/payloads/exceptions/not_implemented.rb +0 -29
  242. data/lib/ronin/payloads/exceptions/unknown_helper.rb +0 -29
  243. data/lib/ronin/payloads/exceptions.rb +0 -23
  244. data/lib/ronin/payloads/has_payload.rb +0 -111
  245. data/lib/ronin/payloads/helpers/chained.rb +0 -61
  246. data/lib/ronin/payloads/helpers/rpc.rb +0 -93
  247. data/lib/ronin/payloads/helpers.rb +0 -23
  248. data/lib/ronin/payloads/nops.rb +0 -39
  249. data/lib/ronin/payloads/payload.rb +0 -350
  250. data/lib/ronin/payloads/payload_author.rb +0 -33
  251. data/lib/ronin/payloads/shellcode.rb +0 -40
  252. data/lib/ronin/payloads/web_payload.rb +0 -41
  253. data/lib/ronin/payloads.rb +0 -36
  254. data/lib/ronin/ui/command_line/commands/exploit.rb +0 -193
  255. data/lib/ronin/ui/command_line/commands/exploits.rb +0 -154
  256. data/lib/ronin/ui/command_line/commands/gen_binary_payload.rb +0 -34
  257. data/lib/ronin/ui/command_line/commands/gen_exploit.rb +0 -34
  258. data/lib/ronin/ui/command_line/commands/gen_ftp_exploit.rb +0 -34
  259. data/lib/ronin/ui/command_line/commands/gen_http_exploit.rb +0 -34
  260. data/lib/ronin/ui/command_line/commands/gen_local_exploit.rb +0 -34
  261. data/lib/ronin/ui/command_line/commands/gen_nops.rb +0 -34
  262. data/lib/ronin/ui/command_line/commands/gen_payload.rb +0 -34
  263. data/lib/ronin/ui/command_line/commands/gen_remote_exploit.rb +0 -34
  264. data/lib/ronin/ui/command_line/commands/gen_remote_tcp_exploit.rb +0 -34
  265. data/lib/ronin/ui/command_line/commands/gen_remote_udp_exploit.rb +0 -34
  266. data/lib/ronin/ui/command_line/commands/gen_shellcode.rb +0 -34
  267. data/lib/ronin/ui/command_line/commands/gen_web_exploit.rb +0 -34
  268. data/lib/ronin/ui/command_line/commands/payload.rb +0 -129
  269. data/lib/ronin/ui/command_line/commands/payloads.rb +0 -128
  270. data/lib/ronin/vuln/behavior.rb +0 -165
  271. data/spec/controls/behaviors_examples.rb +0 -38
  272. data/spec/exploits/binary_exploit_spec.rb +0 -44
  273. data/spec/exploits/buffer_overflow_exploit_spec.rb +0 -70
  274. data/spec/exploits/exploit_spec.rb +0 -313
  275. data/spec/exploits/file_based_exploit_spec.rb +0 -48
  276. data/spec/exploits/format_string_exploit_spec.rb +0 -32
  277. data/spec/exploits/ftp_spec.rb +0 -13
  278. data/spec/exploits/http_spec.rb +0 -17
  279. data/spec/exploits/padding_exploit_spec.rb +0 -44
  280. data/spec/exploits/remote_tcp_spec.rb +0 -28
  281. data/spec/exploits/remote_udp_spec.rb +0 -28
  282. data/spec/exploits/target_spec.rb +0 -98
  283. data/spec/exploits/targets/buffer_overflow_spec.rb +0 -22
  284. data/spec/exploits/web_spec.rb +0 -35
  285. data/spec/generators/exploits/exploit_examples.rb +0 -24
  286. data/spec/generators/exploits/exploit_spec.rb +0 -42
  287. data/spec/generators/exploits/ftp_spec.rb +0 -42
  288. data/spec/generators/exploits/http_spec.rb +0 -42
  289. data/spec/generators/exploits/local_spec.rb +0 -42
  290. data/spec/generators/exploits/remote_spec.rb +0 -42
  291. data/spec/generators/exploits/remote_tcp_spec.rb +0 -47
  292. data/spec/generators/exploits/remote_udp_spec.rb +0 -47
  293. data/spec/generators/exploits/web_spec.rb +0 -52
  294. data/spec/generators/payloads/binary_payload_spec.rb +0 -31
  295. data/spec/generators/payloads/nops_spec.rb +0 -31
  296. data/spec/generators/payloads/payload_examples.rb +0 -16
  297. data/spec/generators/payloads/payload_spec.rb +0 -31
  298. data/spec/generators/payloads/shellcode_spec.rb +0 -31
  299. data/spec/helpers/database.rb +0 -5
  300. data/spec/helpers/objects.rb +0 -22
  301. data/spec/model/has_default_port_spec.rb +0 -27
  302. data/spec/model/models/default_port_model.rb +0 -13
  303. data/spec/model/models/non_default_port_model.rb +0 -11
  304. data/spec/model/models/targets_arch_model.rb +0 -11
  305. data/spec/model/models/targets_os_model.rb +0 -11
  306. data/spec/model/models/targets_product_model.rb +0 -11
  307. data/spec/model/targets_arch_spec.rb +0 -32
  308. data/spec/model/targets_os_spec.rb +0 -33
  309. data/spec/model/targets_product_spec.rb +0 -35
  310. data/spec/objects/exploits/example.rb +0 -25
  311. data/spec/objects/exploits/simple.rb +0 -24
  312. data/spec/objects/payloads/simple.rb +0 -19
  313. data/spec/payloads/encoders/encoder_spec.rb +0 -30
  314. data/spec/payloads/encoders/xor_spec.rb +0 -20
  315. data/spec/payloads/payload_spec.rb +0 -156
  316. data/spec/vuln/behavior_spec.rb +0 -15
  317. data/static/ronin/generators/exploits/_cache.erb +0 -14
  318. data/static/ronin/generators/exploits/_header.erb +0 -1
  319. data/static/ronin/generators/exploits/_helpers.erb +0 -4
  320. data/static/ronin/generators/exploits/exploit.erb +0 -24
  321. data/static/ronin/generators/exploits/ftp.erb +0 -24
  322. data/static/ronin/generators/exploits/http.erb +0 -26
  323. data/static/ronin/generators/exploits/local.erb +0 -24
  324. data/static/ronin/generators/exploits/remote.erb +0 -24
  325. data/static/ronin/generators/exploits/remote_tcp.erb +0 -26
  326. data/static/ronin/generators/exploits/remote_udp.erb +0 -26
  327. data/static/ronin/generators/exploits/web.erb +0 -28
  328. data/static/ronin/generators/payloads/_cache.erb +0 -10
  329. data/static/ronin/generators/payloads/_header.erb +0 -1
  330. data/static/ronin/generators/payloads/_helpers.erb +0 -2
  331. data/static/ronin/generators/payloads/binary_payload.erb +0 -25
  332. data/static/ronin/generators/payloads/nops.erb +0 -19
  333. data/static/ronin/generators/payloads/payload.erb +0 -25
  334. data/static/ronin/generators/payloads/shellcode.erb +0 -25
  335. data/tasks/spec.rb +0 -10
  336. data/tasks/yard.rb +0 -13
  337. data.tar.gz.sig +0 -0
  338. metadata.gz.sig +0 -0
@@ -0,0 +1,33 @@
1
+ # ronin-exploits-show 1 "May 2022" Ronin "User Manuals"
2
+
3
+ ## SYNOPSIS
4
+
5
+ `ronin-exploits show` [*options*] {*NAME* \| --file *FILE*}
6
+
7
+ ## DESCRIPTION
8
+
9
+ Prints information about an exploit.
10
+
11
+ ## ARGUMENTS
12
+
13
+ *NAME*
14
+ The name of the exploit to load.
15
+
16
+ ## OPTIONS
17
+
18
+ `-v`, `--verbose`
19
+ Prints additional information about the exploit.
20
+
21
+ `-f`, `--file` *FILE*
22
+ Optionally loads the exploit from the file.
23
+
24
+ `-h`, `--help`
25
+ Print help information
26
+
27
+ ## AUTHOR
28
+
29
+ Postmodern <postmodern.mod3@gmail.com>
30
+
31
+ ## SEE ALSO
32
+
33
+ ronin-exploits-list(1) ronin-exploits-run(1)
@@ -0,0 +1,55 @@
1
+ .\" Generated by kramdown-man 0.1.8
2
+ .\" https://github.com/postmodern/kramdown-man#readme
3
+ .TH ronin-exploits 1 "May 2022" Ronin "User Manuals"
4
+ .LP
5
+ .SH SYNOPSIS
6
+ .LP
7
+ .HP
8
+ \fBronin-exploits\fR \[lB]\fIoptions\fP\[rB] \[lB]\fICOMMAND\fP \[lB]\.\.\.\[rB]\[rB]
9
+ .LP
10
+ .SH DESCRIPTION
11
+ .LP
12
+ .PP
13
+ Runs a \fBronin-exploits\fR \fICOMMAND\fP\.
14
+ .LP
15
+ .SH ARGUMENTS
16
+ .LP
17
+ .TP
18
+ \fICOMMAND\fP
19
+ The \fBronin-exploits\fR command to execute\.
20
+ .LP
21
+ .SH OPTIONS
22
+ .LP
23
+ .TP
24
+ \fB-h\fR, \fB--help\fR
25
+ Print help information
26
+ .LP
27
+ .SH COMMANDS
28
+ .LP
29
+ .TP
30
+ \fIirb\fP
31
+ Starts ronin\-exploits interactive Ruby shell\.
32
+ .LP
33
+ .TP
34
+ \fIlist\fP
35
+ Lists available exploits\.
36
+ .LP
37
+ .TP
38
+ \fIrun\fP
39
+ Runs an exploit\.
40
+ .LP
41
+ .TP
42
+ \fIhelp\fP
43
+ Lists available commands or shows help about a specific command\.
44
+ .LP
45
+ .SH AUTHOR
46
+ .LP
47
+ .PP
48
+ Postmodern
49
+ .MT postmodern\.mod3\[at]gmail\.com
50
+ .ME
51
+ .LP
52
+ .SH SEE ALSO
53
+ .LP
54
+ .PP
55
+ ronin\-exploits\-console(1) ronin\-exploits\-list(1) ronin\-exploits\-run(1)
@@ -0,0 +1,41 @@
1
+ # ronin-exploits 1 "May 2022" Ronin "User Manuals"
2
+
3
+ ## SYNOPSIS
4
+
5
+ `ronin-exploits` [*options*] [*COMMAND* [...]]
6
+
7
+ ## DESCRIPTION
8
+
9
+ Runs a `ronin-exploits` *COMMAND*.
10
+
11
+ ## ARGUMENTS
12
+
13
+ *COMMAND*
14
+ The `ronin-exploits` command to execute.
15
+
16
+ ## OPTIONS
17
+
18
+ `-h`, `--help`
19
+ Print help information
20
+
21
+ ## COMMANDS
22
+
23
+ *irb*
24
+ Starts ronin-exploits interactive Ruby shell.
25
+
26
+ *list*
27
+ Lists available exploits.
28
+
29
+ *run*
30
+ Runs an exploit.
31
+
32
+ *help*
33
+ Lists available commands or shows help about a specific command.
34
+
35
+ ## AUTHOR
36
+
37
+ Postmodern <postmodern.mod3@gmail.com>
38
+
39
+ ## SEE ALSO
40
+
41
+ ronin-exploits-console(1) ronin-exploits-list(1) ronin-exploits-run(1)
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ require 'yaml'
4
+
5
+ Gem::Specification.new do |gem|
6
+ gemspec = YAML.load_file('gemspec.yml')
7
+
8
+ gem.name = gemspec.fetch('name')
9
+ gem.version = gemspec.fetch('version') do
10
+ lib_dir = File.join(File.dirname(__FILE__),'lib')
11
+ $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
12
+
13
+ require 'ronin/exploits/version'
14
+ Ronin::Exploits::VERSION
15
+ end
16
+
17
+ gem.summary = gemspec['summary']
18
+ gem.description = gemspec['description']
19
+ gem.licenses = Array(gemspec['license'])
20
+ gem.authors = Array(gemspec['authors'])
21
+ gem.email = gemspec['email']
22
+ gem.homepage = gemspec['homepage']
23
+ gem.metadata = gemspec['metadata'] if gemspec['metadata']
24
+
25
+ glob = lambda { |patterns| gem.files & Dir[*patterns] }
26
+
27
+ gem.files = `git ls-files`.split($/)
28
+ gem.files = glob[gemspec['files']] if gemspec['files']
29
+ gem.files += Array(gemspec['generated_files'])
30
+
31
+ gem.executables = gemspec.fetch('executables') do
32
+ glob['bin/*'].map { |path| File.basename(path) }
33
+ end
34
+ gem.default_executable = gem.executables.first if Gem::VERSION < '1.7.'
35
+
36
+ gem.extensions = glob[gemspec['extensions'] || 'ext/**/extconf.rb']
37
+ gem.test_files = glob[gemspec['test_files'] || 'spec/{**/}*_spec.rb']
38
+ gem.extra_rdoc_files = glob[gemspec['extra_doc_files'] || '*.{txt,md}']
39
+
40
+ gem.require_paths = Array(gemspec.fetch('require_paths') {
41
+ %w[ext lib].select { |dir| File.directory?(dir) }
42
+ })
43
+
44
+ gem.requirements = gemspec['requirements']
45
+ gem.required_ruby_version = gemspec['required_ruby_version']
46
+ gem.required_rubygems_version = gemspec['required_rubygems_version']
47
+ gem.post_install_message = gemspec['post_install_message']
48
+
49
+ split = lambda { |string| string.split(/,\s*/) }
50
+
51
+ if gemspec['dependencies']
52
+ gemspec['dependencies'].each do |name,versions|
53
+ gem.add_dependency(name,split[versions])
54
+ end
55
+ end
56
+
57
+ if gemspec['development_dependencies']
58
+ gemspec['development_dependencies'].each do |name,versions|
59
+ gem.add_development_dependency(name,split[versions])
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+ require 'ronin/exploits/advisory'
3
+
4
+ describe Ronin::Exploits::Advisory do
5
+ let(:id) { 'CVE-2022-1234' }
6
+ let(:url) { "https://nvd.nist.gov/vuln/detail/#{id}" }
7
+
8
+ subject { described_class.new(id,url) }
9
+
10
+ describe "#initialize" do
11
+ context "when given only an id" do
12
+ subject { described_class.new(id) }
13
+
14
+ it "must set #id" do
15
+ expect(subject.id).to eq(id)
16
+ end
17
+
18
+ it "must default #url to .url_for(id)" do
19
+ expect(subject.url).to eq(described_class.url_for(id))
20
+ end
21
+ end
22
+
23
+ context "when given an id and a url" do
24
+ subject { described_class.new(id,url) }
25
+
26
+ it "must set #id" do
27
+ expect(subject.id).to eq(id)
28
+ end
29
+
30
+ it "must set #url" do
31
+ expect(subject.url).to eq(url)
32
+ end
33
+ end
34
+ end
35
+
36
+ describe ".url_for" do
37
+ subject { described_class }
38
+
39
+ context "when given a CVE-YYYY-NNNN id" do
40
+ let(:id) { 'CVE-2022-1234' }
41
+
42
+ it "must return 'https://nvd.nist.gov/vuln/detail/CVE-YYYY-NNNN'" do
43
+ expect(subject.url_for(id)).to eq(
44
+ "https://nvd.nist.gov/vuln/detail/#{id}"
45
+ )
46
+ end
47
+ end
48
+
49
+ context "when given a GHSA-XXXX id" do
50
+ let(:id) { 'GHSA-1234abcd' }
51
+
52
+ it "must return 'https://github.com/advisories/GHSA-XXXX'" do
53
+ expect(subject.url_for(id)).to eq("https://github.com/advisories/#{id}")
54
+ end
55
+ end
56
+
57
+ context "when given any other kind of id" do
58
+ let(:id) { 'XYZ-123' }
59
+
60
+ it "must return nil" do
61
+ expect(subject.url_for(id)).to be(nil)
62
+ end
63
+ end
64
+ end
65
+
66
+ describe "#to_s" do
67
+ it "must return the advisory #id" do
68
+ expect(subject.to_s).to eq(id)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+ require 'ronin/exploits/cli/exploit_command'
3
+ require 'ronin/exploits/exploit'
4
+
5
+ describe Ronin::Exploits::CLI::ExploitCommand do
6
+ module TestExploitCommand
7
+ class TestExploit < Ronin::Exploits::Exploit
8
+ register 'test_exploit_command'
9
+ end
10
+
11
+ class TestCommand < Ronin::Exploits::CLI::ExploitCommand
12
+ end
13
+ end
14
+
15
+ let(:exploit_class) { TestExploitCommand::TestExploit }
16
+ let(:command_class) { TestExploitCommand::TestCommand }
17
+ subject { command_class.new }
18
+
19
+ describe "#load_exploit" do
20
+ let(:id) { exploit_class.id }
21
+
22
+ before do
23
+ expect(Ronin::Exploits).to receive(:load_class).with(id).and_return(exploit_class)
24
+ end
25
+
26
+ it "must load the exploit class and return the exploit class" do
27
+ expect(subject.load_exploit(id)).to be(exploit_class)
28
+ end
29
+
30
+ it "must also set #exploit_class" do
31
+ subject.load_exploit(id)
32
+
33
+ expect(subject.exploit_class).to be(exploit_class)
34
+ end
35
+ end
36
+
37
+ describe "#load_exploit_from" do
38
+ let(:file) { "path/to/exploit/file.rb" }
39
+
40
+ before do
41
+ expect(Ronin::Exploits).to receive(:load_class_from_file).with(file).and_return(exploit_class)
42
+ end
43
+
44
+ it "must load the exploit class and return the exploit class" do
45
+ expect(subject.load_exploit_from(file)).to be(exploit_class)
46
+ end
47
+
48
+ it "must also set #exploit_class" do
49
+ subject.load_exploit_from(file)
50
+
51
+ expect(subject.exploit_class).to be(exploit_class)
52
+ end
53
+ end
54
+
55
+ describe "#initialize_exploit" do
56
+ before { subject.load_exploit(exploit_class.id) }
57
+
58
+ it "must initialize a new exploit object using #exploit_class" do
59
+ expect(subject.initialize_exploit).to be_kind_of(exploit_class)
60
+ end
61
+
62
+ it "must also set #exploit" do
63
+ subject.initialize_exploit
64
+
65
+ expect(subject.exploit).to be_kind_of(exploit_class)
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,208 @@
1
+ require 'spec_helper'
2
+ require 'ronin/exploits/cli/exploit_methods'
3
+ require 'ronin/exploits/cli/command'
4
+
5
+ describe Ronin::Exploits::CLI::ExploitMethods do
6
+ module TestExploitMethods
7
+ class TestCommand < Ronin::Exploits::CLI::Command
8
+ include Ronin::Exploits::CLI::ExploitMethods
9
+ end
10
+ end
11
+
12
+ let(:command_class) { TestExploitMethods::TestCommand }
13
+ subject { command_class.new }
14
+
15
+ describe "#load_exploit" do
16
+ let(:exploit_id) { 'html/encode' }
17
+
18
+ it "must call Exploits.load_class with the given ID" do
19
+ expect(Ronin::Exploits).to receive(:load_class).with(exploit_id)
20
+ expect(subject).to_not receive(:exit)
21
+
22
+ subject.load_exploit(exploit_id)
23
+ end
24
+
25
+ context "when Ronin::Exploits::ClassNotfound is raised" do
26
+ let(:message) { "class not found" }
27
+ let(:exception) do
28
+ Ronin::Exploits::ClassNotFound.new(message)
29
+ end
30
+
31
+ it "must print an error message and exit with an error code" do
32
+ expect(Ronin::Exploits).to receive(:load_class).with(exploit_id).and_raise(exception)
33
+ expect(subject).to receive(:exit).with(1)
34
+
35
+ expect {
36
+ subject.load_exploit(exploit_id)
37
+ }.to output("#{subject.command_name}: #{message}#{$/}").to_stderr
38
+ end
39
+ end
40
+
41
+ context "when another type of exception is raised" do
42
+ let(:message) { "unexpected error" }
43
+ let(:exception) { RuntimeError.new(message) }
44
+
45
+ it "must print the exception, an error message, and exit with -1" do
46
+ expect(Ronin::Exploits).to receive(:load_class).with(exploit_id).and_raise(exception)
47
+ expect(subject).to receive(:print_exception).with(exception)
48
+ expect(subject).to receive(:exit).with(-1)
49
+
50
+ expect {
51
+ subject.load_exploit(exploit_id)
52
+ }.to output("#{subject.command_name}: an unhandled exception occurred while loading exploit #{exploit_id}#{$/}").to_stderr
53
+ end
54
+ end
55
+ end
56
+
57
+ describe "#load_exploit_from" do
58
+ let(:file) { '/path/to/html/encode.rb' }
59
+
60
+ it "must call Exploits.load_class with the given ID and file" do
61
+ expect(Ronin::Exploits).to receive(:load_class_from_file).with(file)
62
+ expect(subject).to_not receive(:exit)
63
+
64
+ subject.load_exploit_from(file)
65
+ end
66
+
67
+ context "when Ronin::Exploits::ClassNotfound is raised" do
68
+ let(:message) { "class not found" }
69
+ let(:exception) do
70
+ Ronin::Exploits::ClassNotFound.new(message)
71
+ end
72
+
73
+ it "must print an error message and exit with an error code" do
74
+ expect(Ronin::Exploits).to receive(:load_class_from_file).with(file).and_raise(exception)
75
+ expect(subject).to receive(:exit).with(1)
76
+
77
+ expect {
78
+ subject.load_exploit_from(file)
79
+ }.to output("#{subject.command_name}: #{message}#{$/}").to_stderr
80
+ end
81
+ end
82
+
83
+ context "when another type of exception is raised" do
84
+ let(:message) { "unexpected error" }
85
+ let(:exception) { RuntimeError.new(message) }
86
+
87
+ it "must print the exception, an error message, and exit with -1" do
88
+ expect(Ronin::Exploits).to receive(:load_class_from_file).with(file).and_raise(exception)
89
+ expect(subject).to receive(:print_exception).with(exception)
90
+ expect(subject).to receive(:exit).with(-1)
91
+
92
+ expect {
93
+ subject.load_exploit_from(file)
94
+ }.to output(
95
+ "#{subject.command_name}: an unhandled exception occurred while loading exploit from file #{file}#{$/}"
96
+ ).to_stderr
97
+ end
98
+ end
99
+ end
100
+
101
+ describe "#initialie_exploit" do
102
+ let(:exploit_id) { 'test' }
103
+ let(:exploit_class) { double('Encoder class', id: exploit_id) }
104
+
105
+ it "must return a new instance of the given exploit class" do
106
+ expect(exploit_class).to receive(:new)
107
+
108
+ subject.initialize_exploit(exploit_class)
109
+ end
110
+
111
+ context "when additional keyword arguments are given" do
112
+ let(:kwargs) do
113
+ {foo: 1, bar: 2}
114
+ end
115
+
116
+ it "must pass them to new()" do
117
+ expect(exploit_class).to receive(:new).with(**kwargs)
118
+
119
+ subject.initialize_exploit(exploit_class,**kwargs)
120
+ end
121
+ end
122
+
123
+ context "when a Core::Params::ParamError is raised" do
124
+ let(:message) { "param foo was not set" }
125
+ let(:exception) { Ronin::Core::Params::RequiredParam.new(message) }
126
+
127
+ it "must print an error message and exit with 1" do
128
+ expect(exploit_class).to receive(:new).and_raise(exception)
129
+ expect(subject).to receive(:exit).with(1)
130
+
131
+ expect {
132
+ subject.initialize_exploit(exploit_class)
133
+ }.to output("#{subject.command_name}: #{message}#{$/}").to_stderr
134
+ end
135
+ end
136
+
137
+ context "when another type of exception is raised" do
138
+ let(:message) { "unexpected error" }
139
+ let(:exception) { RuntimeError.new(message) }
140
+
141
+ it "must print the exception, an error message, and exit with -1" do
142
+ expect(exploit_class).to receive(:new).and_raise(exception)
143
+ expect(subject).to receive(:print_exception).with(exception)
144
+ expect(subject).to receive(:exit).with(-1)
145
+
146
+ expect {
147
+ subject.initialize_exploit(exploit_class)
148
+ }.to output("#{subject.command_name}: an unhandled exception occurred while initializing exploit #{exploit_id}#{$/}").to_stderr
149
+ end
150
+ end
151
+ end
152
+
153
+ describe "#validate_exploit" do
154
+ let(:exploit_id) { 'test' }
155
+ let(:exploit) { double('Encoder instance', class_id: exploit_id) }
156
+
157
+ it "must call #perform_validate on #exploit" do
158
+ expect(exploit).to receive(:perform_validate)
159
+
160
+ subject.validate_exploit(exploit)
161
+ end
162
+
163
+ context "when a Core::Params::ParamError is raised" do
164
+ let(:message) { "param foo was not set" }
165
+ let(:exception) { Ronin::Core::Params::RequiredParam.new(message) }
166
+
167
+ it "must print an error message and exit with 1" do
168
+ expect(exploit).to receive(:perform_validate).and_raise(exception)
169
+ expect(subject).to receive(:exit).with(1)
170
+
171
+ expect {
172
+ subject.validate_exploit(exploit)
173
+ }.to output("#{subject.command_name}: failed to validate the exploit #{exploit_id}: #{message}#{$/}").to_stderr
174
+ end
175
+ end
176
+
177
+ context "when a Ronin::Exploits::ValidationError is raised" do
178
+ let(:message) { "param foo was not set" }
179
+ let(:exception) do
180
+ Ronin::Exploits::ValidationError.new(message)
181
+ end
182
+
183
+ it "must print an error message and exit with 1" do
184
+ expect(exploit).to receive(:perform_validate).and_raise(exception)
185
+ expect(subject).to receive(:exit).with(1)
186
+
187
+ expect {
188
+ subject.validate_exploit(exploit)
189
+ }.to output("#{subject.command_name}: failed to validate the exploit #{exploit_id}: #{message}#{$/}").to_stderr
190
+ end
191
+ end
192
+
193
+ context "when another type of exception is raised" do
194
+ let(:message) { "unexpected error" }
195
+ let(:exception) { RuntimeError.new(message) }
196
+
197
+ it "must print the exception, an error message, and exit with -1" do
198
+ expect(exploit).to receive(:perform_validate).and_raise(exception)
199
+ expect(subject).to receive(:print_exception).with(exception)
200
+ expect(subject).to receive(:exit).with(-1)
201
+
202
+ expect {
203
+ subject.validate_exploit(exploit)
204
+ }.to output("#{subject.command_name}: an unhandled exception occurred while validating the exploit #{exploit_id}#{$/}").to_stderr
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+ require 'ronin/exploits/cli/ruby_shell'
3
+
4
+ describe Ronin::Exploits::CLI::RubyShell do
5
+ describe "#initialize" do
6
+ it "must default #name to 'ronin-exploits'" do
7
+ expect(subject.name).to eq('ronin-exploits')
8
+ end
9
+
10
+ it "must default #context to Ronin::Exploits" do
11
+ expect(subject.context).to be(Ronin::Exploits)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,117 @@
1
+ require 'spec_helper'
2
+ require 'ronin/exploits/client_side_web_vuln'
3
+ require 'ronin/vulns/web_vuln'
4
+
5
+ describe Ronin::Exploits::ClientSideWebVuln do
6
+ module TestClientSideWebVuln
7
+ class TestExploit < Ronin::Exploits::ClientSideWebVuln
8
+ base_path '/Templatize.asp'
9
+ query_param 'item'
10
+
11
+ def vuln
12
+ @vuln ||= Ronin::Vulns::WebVuln.new(url, **web_vuln_kwargs)
13
+ end
14
+ end
15
+ end
16
+
17
+ let(:exploit_class) { TestClientSideWebVuln::TestExploit }
18
+ let(:base_url) { 'http://testasp.vulnweb.com/' }
19
+ let(:query) { 'item=html/about.html' }
20
+ let(:query_param) { 'item' }
21
+ let(:payload) { 'test payload' }
22
+
23
+ subject do
24
+ exploit_class.new(
25
+ payload: payload,
26
+ params: {
27
+ base_url: base_url
28
+ }
29
+ )
30
+ end
31
+
32
+ it "must define a 'format' param" do
33
+ expect(described_class.params[:format]).to_not be(nil)
34
+ expect(described_class.params[:format].type).to be_kind_of(Ronin::Core::Params::Types::Enum)
35
+ expect(described_class.params[:format].type.values).to eq([:http, :curl])
36
+ expect(described_class.params[:format].desc).to eq('Output format')
37
+ end
38
+
39
+ describe "#format_exploit" do
40
+ context "when the 'format' param is :http" do
41
+ subject do
42
+ exploit_class.new(
43
+ payload: payload,
44
+ params: {
45
+ base_url: base_url,
46
+ format: :http
47
+ }
48
+ )
49
+ end
50
+
51
+ it "must call #to_http on the #vuln object" do
52
+ expect(subject.format_exploit).to eq(subject.vuln.to_http(payload))
53
+ end
54
+ end
55
+
56
+ context "when the 'format' param is :curl" do
57
+ subject do
58
+ exploit_class.new(
59
+ payload: payload,
60
+ params: {
61
+ base_url: base_url,
62
+ format: :curl
63
+ }
64
+ )
65
+ end
66
+
67
+ it "must call #to_curl on the #vuln object" do
68
+ expect(subject.format_exploit).to eq(subject.vuln.to_curl(payload))
69
+ end
70
+ end
71
+ end
72
+
73
+ describe "#launch" do
74
+ context "when the 'format' param is :http" do
75
+ subject do
76
+ exploit_class.new(
77
+ payload: payload,
78
+ params: {
79
+ base_url: base_url,
80
+ format: :http
81
+ }
82
+ )
83
+ end
84
+
85
+ it "must print out a message and the exploit formatted as an HTTP request" do
86
+ expect(subject).to receive(:print_info).with("Copy and paste the following exploit:")
87
+ expect(subject).to receive(:puts)
88
+ expect(subject).to receive(:puts).with(subject.vuln.to_http(payload))
89
+ expect(subject).to receive(:puts)
90
+
91
+ subject.launch
92
+ end
93
+ end
94
+
95
+ context "when the 'format' param is :curl" do
96
+ subject do
97
+ exploit_class.new(
98
+ payload: payload,
99
+ params: {
100
+ base_url: base_url,
101
+ format: :curl
102
+ }
103
+ )
104
+ end
105
+
106
+
107
+ it "must print out a message and the exploit formatted as an HTTP request" do
108
+ expect(subject).to receive(:print_info).with("Copy and paste the following exploit:")
109
+ expect(subject).to receive(:puts)
110
+ expect(subject).to receive(:puts).with(subject.vuln.to_curl(payload))
111
+ expect(subject).to receive(:puts)
112
+
113
+ subject.launch
114
+ end
115
+ end
116
+ end
117
+ end