ronin-support 0.5.1 → 1.0.0.beta1

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 (517) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +27 -0
  4. data/.gitignore +7 -6
  5. data/.mailmap +1 -0
  6. data/.ruby-version +1 -0
  7. data/.yardopts +1 -2
  8. data/ChangeLog.md +533 -137
  9. data/Gemfile +20 -20
  10. data/README.md +137 -61
  11. data/Rakefile +29 -10
  12. data/data/text/homoglyphs/ascii.txt +8 -0
  13. data/data/text/homoglyphs/cyrillic.txt +33 -0
  14. data/data/text/homoglyphs/full_width.txt +81 -0
  15. data/data/text/homoglyphs/greek.txt +21 -0
  16. data/data/text/homoglyphs/latin_numbers.txt +14 -0
  17. data/data/text/homoglyphs/punctuation.txt +7 -0
  18. data/data/text/patterns/network/public_suffix.rb.erb +44 -0
  19. data/examples/ssl_proxy.rb +38 -0
  20. data/examples/tcp_proxy.rb +41 -0
  21. data/gemspec.yml +25 -15
  22. data/lib/ronin/support/archive/core_ext/file.rb +118 -0
  23. data/lib/ronin/{formatting/sql.rb → support/archive/core_ext.rb} +6 -7
  24. data/lib/ronin/support/archive/mixin.rb +213 -0
  25. data/lib/ronin/support/archive/tar/reader.rb +135 -0
  26. data/lib/ronin/support/archive/tar/writer.rb +197 -0
  27. data/lib/ronin/support/archive/tar.rb +155 -0
  28. data/lib/ronin/support/archive/zip/reader/entry.rb +134 -0
  29. data/lib/ronin/support/archive/zip/reader/statistics.rb +76 -0
  30. data/lib/ronin/support/archive/zip/reader.rb +273 -0
  31. data/lib/ronin/support/archive/zip/writer.rb +175 -0
  32. data/lib/ronin/support/archive/zip.rb +105 -0
  33. data/lib/ronin/support/archive.rb +211 -0
  34. data/lib/ronin/support/binary/array.rb +255 -0
  35. data/lib/ronin/support/binary/bit_flip.rb +147 -0
  36. data/lib/ronin/support/binary/buffer.rb +2027 -0
  37. data/lib/ronin/support/binary/byte_slice.rb +324 -0
  38. data/lib/ronin/support/binary/core_ext/array.rb +75 -0
  39. data/lib/ronin/support/binary/core_ext/float.rb +80 -0
  40. data/lib/ronin/support/binary/core_ext/integer.rb +305 -0
  41. data/lib/ronin/support/binary/core_ext/io.rb +38 -0
  42. data/lib/ronin/support/binary/core_ext/string.rb +115 -0
  43. data/lib/ronin/{formatting/extensions/text.rb → support/binary/core_ext.rb} +9 -9
  44. data/lib/ronin/support/binary/cstring.rb +259 -0
  45. data/lib/ronin/support/binary/ctypes/aggregate_type.rb +98 -0
  46. data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +77 -0
  47. data/lib/ronin/support/binary/ctypes/arch/arm.rb +75 -0
  48. data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +77 -0
  49. data/lib/ronin/support/binary/ctypes/arch/arm64.rb +75 -0
  50. data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +77 -0
  51. data/lib/ronin/support/binary/ctypes/arch/mips.rb +75 -0
  52. data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +77 -0
  53. data/lib/ronin/support/binary/ctypes/arch/mips64.rb +75 -0
  54. data/lib/ronin/support/binary/ctypes/arch/ppc.rb +75 -0
  55. data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +75 -0
  56. data/lib/ronin/support/binary/ctypes/arch/x86.rb +75 -0
  57. data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +75 -0
  58. data/lib/ronin/support/binary/ctypes/arch.rb +30 -0
  59. data/lib/ronin/support/binary/ctypes/array_object_type.rb +164 -0
  60. data/lib/ronin/support/binary/ctypes/array_type.rb +232 -0
  61. data/lib/ronin/support/binary/ctypes/big_endian.rb +195 -0
  62. data/lib/ronin/support/binary/ctypes/char_type.rb +59 -0
  63. data/lib/ronin/support/binary/ctypes/char_types.rb +39 -0
  64. data/lib/ronin/support/binary/ctypes/enum_type.rb +181 -0
  65. data/lib/ronin/support/binary/ctypes/float32_type.rb +50 -0
  66. data/lib/ronin/support/binary/ctypes/float64_type.rb +50 -0
  67. data/lib/ronin/support/binary/ctypes/float_type.rb +62 -0
  68. data/lib/ronin/support/binary/ctypes/int16_type.rb +50 -0
  69. data/lib/ronin/support/binary/ctypes/int32_type.rb +50 -0
  70. data/lib/ronin/support/binary/ctypes/int64_type.rb +50 -0
  71. data/lib/ronin/support/binary/ctypes/int8_type.rb +41 -0
  72. data/lib/ronin/support/binary/ctypes/int_type.rb +62 -0
  73. data/lib/ronin/support/binary/ctypes/little_endian.rb +195 -0
  74. data/lib/ronin/support/binary/ctypes/mixin.rb +135 -0
  75. data/lib/ronin/support/binary/ctypes/native.rb +205 -0
  76. data/lib/ronin/support/binary/ctypes/network.rb +29 -0
  77. data/lib/ronin/support/binary/ctypes/object_type.rb +55 -0
  78. data/lib/ronin/support/binary/ctypes/os/bsd.rb +65 -0
  79. data/lib/ronin/support/binary/ctypes/os/freebsd.rb +215 -0
  80. data/lib/ronin/support/binary/ctypes/os/linux.rb +193 -0
  81. data/lib/ronin/support/binary/ctypes/os/macos.rb +151 -0
  82. data/lib/ronin/support/binary/ctypes/os/netbsd.rb +147 -0
  83. data/lib/ronin/support/binary/ctypes/os/openbsd.rb +168 -0
  84. data/lib/ronin/support/binary/ctypes/os/unix.rb +78 -0
  85. data/lib/ronin/support/binary/ctypes/os/windows.rb +125 -0
  86. data/lib/ronin/support/binary/ctypes/os.rb +125 -0
  87. data/lib/ronin/support/binary/ctypes/scalar_type.rb +200 -0
  88. data/lib/ronin/support/binary/ctypes/string_type.rb +143 -0
  89. data/lib/ronin/support/binary/ctypes/struct_object_type.rb +173 -0
  90. data/lib/ronin/support/binary/ctypes/struct_type.rb +359 -0
  91. data/lib/ronin/support/binary/ctypes/type.rb +193 -0
  92. data/lib/ronin/support/binary/ctypes/type_resolver.rb +206 -0
  93. data/lib/ronin/support/binary/ctypes/uint16_type.rb +50 -0
  94. data/lib/ronin/support/binary/ctypes/uint32_type.rb +50 -0
  95. data/lib/ronin/support/binary/ctypes/uint64_type.rb +50 -0
  96. data/lib/ronin/support/binary/ctypes/uint8_type.rb +41 -0
  97. data/lib/ronin/support/binary/ctypes/uint_type.rb +59 -0
  98. data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +258 -0
  99. data/lib/ronin/support/binary/ctypes/union_object_type.rb +173 -0
  100. data/lib/ronin/support/binary/ctypes/union_type.rb +261 -0
  101. data/lib/ronin/support/binary/ctypes.rb +462 -0
  102. data/lib/ronin/support/binary/hexdump/core_ext/file.rb +118 -0
  103. data/lib/ronin/support/binary/hexdump/core_ext/string.rb +115 -0
  104. data/lib/ronin/support/binary/hexdump/core_ext.rb +20 -0
  105. data/lib/ronin/support/binary/hexdump/parser.rb +492 -0
  106. data/lib/ronin/support/binary/hexdump.rb +20 -0
  107. data/lib/ronin/support/binary/memory.rb +268 -0
  108. data/lib/ronin/support/binary/packet.rb +33 -0
  109. data/lib/ronin/support/binary/stack.rb +256 -0
  110. data/lib/ronin/support/binary/stream/methods.rb +1755 -0
  111. data/lib/ronin/support/binary/stream.rb +151 -0
  112. data/lib/ronin/support/binary/struct/member.rb +86 -0
  113. data/lib/ronin/support/binary/struct.rb +830 -0
  114. data/lib/ronin/support/binary/template.rb +284 -0
  115. data/lib/ronin/support/binary/union.rb +162 -0
  116. data/lib/ronin/support/binary.rb +26 -0
  117. data/lib/ronin/support/cli/ansi.rb +330 -0
  118. data/lib/ronin/support/cli/io_shell/core_ext/io.rb +67 -0
  119. data/lib/ronin/{fuzzing/extensions.rb → support/cli/io_shell/core_ext.rb} +6 -7
  120. data/lib/ronin/support/cli/io_shell.rb +161 -0
  121. data/lib/ronin/support/cli/printing.rb +216 -0
  122. data/lib/ronin/support/cli.rb +20 -0
  123. data/lib/ronin/support/compression/core_ext/file.rb +70 -0
  124. data/lib/ronin/support/compression/core_ext/string.rb +101 -0
  125. data/lib/ronin/{formatting/html.rb → support/compression/core_ext.rb} +6 -7
  126. data/lib/ronin/support/compression/gzip/reader.rb +70 -0
  127. data/lib/ronin/support/compression/gzip/writer.rb +74 -0
  128. data/lib/ronin/support/compression/gzip.rb +105 -0
  129. data/lib/ronin/support/compression/mixin.rb +180 -0
  130. data/lib/ronin/{network/extensions/esmtp/net.rb → support/compression/zlib.rb} +9 -10
  131. data/lib/ronin/support/compression.rb +174 -0
  132. data/lib/ronin/{extensions → support/core_ext}/enumerable.rb +5 -6
  133. data/lib/ronin/{extensions → support/core_ext}/file.rb +11 -34
  134. data/lib/ronin/support/core_ext/integer.rb +37 -0
  135. data/lib/ronin/support/core_ext/ipaddr.rb +65 -0
  136. data/lib/ronin/{extensions → support/core_ext}/kernel.rb +10 -9
  137. data/lib/ronin/{extensions → support/core_ext}/resolv.rb +5 -28
  138. data/lib/ronin/{extensions → support/core_ext}/string.rb +117 -57
  139. data/lib/ronin/support/core_ext.rb +33 -0
  140. data/lib/ronin/support/crypto/cert.rb +522 -0
  141. data/lib/ronin/support/crypto/cert_chain.rb +204 -0
  142. data/lib/ronin/support/crypto/cipher/aes.rb +71 -0
  143. data/lib/ronin/support/crypto/cipher/aes128.rb +54 -0
  144. data/lib/ronin/support/crypto/cipher/aes256.rb +54 -0
  145. data/lib/ronin/support/crypto/cipher.rb +194 -0
  146. data/lib/ronin/support/crypto/core_ext/file.rb +660 -0
  147. data/lib/ronin/support/crypto/core_ext/string.rb +548 -0
  148. data/lib/ronin/{binary.rb → support/crypto/core_ext.rb} +7 -8
  149. data/lib/ronin/support/crypto/hmac.rb +48 -0
  150. data/lib/ronin/support/crypto/key/dh.rb +122 -0
  151. data/lib/ronin/support/crypto/key/dsa.rb +103 -0
  152. data/lib/ronin/support/crypto/key/ec.rb +99 -0
  153. data/lib/ronin/support/crypto/key/methods.rb +163 -0
  154. data/lib/ronin/support/crypto/key/rsa.rb +169 -0
  155. data/lib/ronin/support/crypto/key.rb +105 -0
  156. data/lib/ronin/support/crypto/mixin.rb +620 -0
  157. data/lib/ronin/{network/extensions/http/net.rb → support/crypto/openssl.rb} +9 -10
  158. data/lib/ronin/support/crypto.rb +779 -0
  159. data/lib/ronin/support/encoding/base16/core_ext/string.rb +63 -0
  160. data/lib/ronin/support/encoding/base16/core_ext.rb +19 -0
  161. data/lib/ronin/support/encoding/base16.rb +82 -0
  162. data/lib/ronin/support/encoding/base32/core_ext/string.rb +63 -0
  163. data/lib/ronin/support/encoding/base32/core_ext.rb +19 -0
  164. data/lib/ronin/support/encoding/base32.rb +164 -0
  165. data/lib/ronin/support/encoding/base64/core_ext/string.rb +76 -0
  166. data/lib/ronin/support/encoding/base64/core_ext.rb +19 -0
  167. data/lib/ronin/support/encoding/base64.rb +78 -0
  168. data/lib/ronin/support/encoding/c/core_ext/integer.rb +82 -0
  169. data/lib/ronin/support/encoding/c/core_ext/string.rb +125 -0
  170. data/lib/ronin/support/encoding/c/core_ext.rb +20 -0
  171. data/lib/ronin/support/encoding/c.rb +277 -0
  172. data/lib/ronin/support/encoding/core_ext/string.rb +107 -0
  173. data/lib/ronin/support/encoding/core_ext.rb +33 -0
  174. data/lib/ronin/support/encoding/hex/core_ext/integer.rb +82 -0
  175. data/lib/ronin/support/encoding/hex/core_ext/string.rb +133 -0
  176. data/lib/ronin/support/encoding/hex/core_ext.rb +22 -0
  177. data/lib/ronin/support/encoding/hex.rb +248 -0
  178. data/lib/ronin/support/encoding/html/core_ext/integer.rb +106 -0
  179. data/lib/ronin/support/encoding/html/core_ext/string.rb +130 -0
  180. data/lib/ronin/support/encoding/html/core_ext.rb +20 -0
  181. data/lib/ronin/support/encoding/html.rb +233 -0
  182. data/lib/ronin/support/encoding/http/core_ext/integer.rb +95 -0
  183. data/lib/ronin/support/encoding/http/core_ext/string.rb +129 -0
  184. data/lib/ronin/support/encoding/http/core_ext.rb +20 -0
  185. data/lib/ronin/support/encoding/http.rb +241 -0
  186. data/lib/ronin/support/encoding/js/core_ext/integer.rb +67 -0
  187. data/lib/ronin/support/encoding/js/core_ext/string.rb +125 -0
  188. data/lib/ronin/support/encoding/js/core_ext.rb +20 -0
  189. data/lib/ronin/support/encoding/js.rb +279 -0
  190. data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +87 -0
  191. data/lib/ronin/support/encoding/powershell/core_ext/string.rb +145 -0
  192. data/lib/ronin/support/encoding/powershell/core_ext.rb +20 -0
  193. data/lib/ronin/support/encoding/powershell.rb +297 -0
  194. data/lib/ronin/support/encoding/punycode/core_ext/string.rb +63 -0
  195. data/lib/ronin/support/encoding/punycode/core_ext.rb +19 -0
  196. data/lib/ronin/support/encoding/punycode.rb +76 -0
  197. data/lib/ronin/support/encoding/quoted_printable/core_ext/string.rb +75 -0
  198. data/lib/ronin/support/encoding/quoted_printable/core_ext.rb +19 -0
  199. data/lib/ronin/support/encoding/quoted_printable.rb +102 -0
  200. data/lib/ronin/support/encoding/ruby/core_ext/string.rb +129 -0
  201. data/lib/ronin/{formatting/binary.rb → support/encoding/ruby/core_ext.rb} +6 -7
  202. data/lib/ronin/support/encoding/ruby.rb +235 -0
  203. data/lib/ronin/support/encoding/shell/core_ext/integer.rb +89 -0
  204. data/lib/ronin/support/encoding/shell/core_ext/string.rb +134 -0
  205. data/lib/ronin/support/encoding/shell/core_ext.rb +20 -0
  206. data/lib/ronin/support/encoding/shell.rb +293 -0
  207. data/lib/ronin/{network/extensions → support/encoding}/smtp.rb +7 -7
  208. data/lib/ronin/support/encoding/sql/core_ext/string.rb +114 -0
  209. data/lib/ronin/{formatting/http.rb → support/encoding/sql/core_ext.rb} +6 -7
  210. data/lib/ronin/support/encoding/sql.rb +124 -0
  211. data/lib/ronin/support/encoding/uri/core_ext/integer.rb +149 -0
  212. data/lib/ronin/support/encoding/uri/core_ext/string.rb +195 -0
  213. data/lib/ronin/support/encoding/uri/core_ext.rb +20 -0
  214. data/lib/ronin/support/encoding/uri.rb +424 -0
  215. data/lib/ronin/support/encoding/uuencoding/core_ext/string.rb +73 -0
  216. data/lib/ronin/support/encoding/uuencoding/core_ext.rb +19 -0
  217. data/lib/ronin/support/encoding/uuencoding.rb +70 -0
  218. data/lib/ronin/support/encoding/xml/core_ext/integer.rb +100 -0
  219. data/lib/ronin/support/encoding/xml/core_ext/string.rb +124 -0
  220. data/lib/ronin/support/encoding/xml/core_ext.rb +20 -0
  221. data/lib/ronin/support/encoding/xml.rb +328 -0
  222. data/lib/ronin/support/encoding.rb +46 -0
  223. data/lib/ronin/support/home.rb +88 -0
  224. data/lib/ronin/support/mixin.rb +42 -0
  225. data/lib/ronin/support/network/asn/dns_record.rb +112 -0
  226. data/lib/ronin/support/network/asn/list.rb +269 -0
  227. data/lib/ronin/support/network/asn/record.rb +164 -0
  228. data/lib/ronin/support/network/asn/record_set.rb +226 -0
  229. data/lib/ronin/support/network/asn.rb +88 -0
  230. data/lib/ronin/{binary/hexdump.rb → support/network/core_ext.rb} +6 -7
  231. data/lib/ronin/support/network/dns/idn.rb +38 -0
  232. data/lib/ronin/support/network/dns/mixin.rb +941 -0
  233. data/lib/ronin/support/network/dns/resolver.rb +707 -0
  234. data/lib/ronin/support/network/dns.rb +1109 -0
  235. data/lib/ronin/support/network/domain.rb +70 -0
  236. data/lib/ronin/support/network/email_address.rb +574 -0
  237. data/lib/ronin/support/network/esmtp/mixin.rb +115 -0
  238. data/lib/ronin/support/network/exceptions.rb +43 -0
  239. data/lib/ronin/support/network/ftp/mixin.rb +106 -0
  240. data/lib/ronin/support/network/host.rb +1473 -0
  241. data/lib/ronin/support/network/http/cookie.rb +245 -0
  242. data/lib/ronin/support/network/http/core_ext/uri/http.rb +63 -0
  243. data/lib/ronin/support/network/http/core_ext.rb +19 -0
  244. data/lib/ronin/support/network/http/mixin.rb +890 -0
  245. data/lib/ronin/support/network/http/request.rb +215 -0
  246. data/lib/ronin/support/network/http/set_cookie.rb +210 -0
  247. data/lib/ronin/support/network/http/user_agents.rb +115 -0
  248. data/lib/ronin/support/network/http.rb +2582 -0
  249. data/lib/ronin/support/network/imap/mixin.rb +133 -0
  250. data/lib/ronin/support/network/ip/mixin.rb +114 -0
  251. data/lib/ronin/support/network/ip.rb +540 -0
  252. data/lib/ronin/support/network/ip_range/cidr.rb +252 -0
  253. data/lib/ronin/support/network/ip_range/glob.rb +309 -0
  254. data/lib/ronin/support/network/ip_range/range.rb +249 -0
  255. data/lib/ronin/support/network/ip_range.rb +284 -0
  256. data/lib/ronin/support/network/mixin.rb +58 -0
  257. data/lib/ronin/support/network/packet.rb +27 -0
  258. data/lib/ronin/support/network/pop3/mixin.rb +113 -0
  259. data/lib/ronin/support/network/proxy.rb +602 -0
  260. data/lib/ronin/support/network/public_suffix/list.rb +339 -0
  261. data/lib/ronin/support/network/public_suffix/suffix.rb +118 -0
  262. data/lib/ronin/support/network/public_suffix/suffix_set.rb +150 -0
  263. data/lib/ronin/support/network/public_suffix.rb +41 -0
  264. data/lib/ronin/support/network/smtp/email.rb +190 -0
  265. data/lib/ronin/support/network/smtp/mixin.rb +290 -0
  266. data/lib/ronin/{extensions/meta.rb → support/network/smtp.rb} +6 -7
  267. data/lib/ronin/support/network/ssl/local_cert.rb +114 -0
  268. data/lib/ronin/support/network/ssl/local_key.rb +84 -0
  269. data/lib/ronin/support/network/ssl/mixin.rb +740 -0
  270. data/lib/ronin/{network/extensions/imap/net.rb → support/network/ssl/openssl.rb} +9 -10
  271. data/lib/ronin/support/network/ssl/proxy.rb +296 -0
  272. data/lib/ronin/support/network/ssl.rb +173 -0
  273. data/lib/ronin/support/network/tcp/mixin.rb +400 -0
  274. data/lib/ronin/support/network/tcp/proxy.rb +435 -0
  275. data/lib/ronin/support/network/tcp.rb +443 -0
  276. data/lib/ronin/support/network/telnet/mixin.rb +150 -0
  277. data/lib/ronin/support/network/telnet.rb +90 -0
  278. data/lib/ronin/support/network/tld/list.rb +266 -0
  279. data/lib/ronin/support/network/tld.rb +41 -0
  280. data/lib/ronin/support/network/tls/mixin.rb +670 -0
  281. data/lib/ronin/support/network/tls/proxy.rb +135 -0
  282. data/lib/ronin/support/network/tls.rb +53 -0
  283. data/lib/ronin/support/network/udp/mixin.rb +389 -0
  284. data/lib/ronin/support/network/udp/proxy.rb +192 -0
  285. data/lib/ronin/support/network/udp.rb +435 -0
  286. data/lib/ronin/support/network/unix/mixin.rb +273 -0
  287. data/lib/ronin/support/network.rb +37 -0
  288. data/lib/ronin/support/path.rb +136 -0
  289. data/lib/ronin/{network/extensions/dns/net.rb → support/text/core_ext/regexp.rb} +8 -9
  290. data/lib/ronin/support/text/core_ext/string.rb +46 -0
  291. data/lib/ronin/support/text/core_ext.rb +23 -0
  292. data/lib/ronin/support/text/entropy/core_ext/string.rb +45 -0
  293. data/lib/ronin/support/text/entropy/core_ext.rb +19 -0
  294. data/lib/ronin/support/text/entropy.rb +66 -0
  295. data/lib/ronin/support/text/erb/mixin.rb +44 -0
  296. data/lib/ronin/support/text/erb.rb +19 -0
  297. data/lib/ronin/support/text/homoglyph/core_ext/string.rb +108 -0
  298. data/lib/ronin/{formatting/digest.rb → support/text/homoglyph/core_ext.rb} +6 -7
  299. data/lib/ronin/{network/http/exceptions/unknown_request.rb → support/text/homoglyph/exceptions.rb} +10 -9
  300. data/lib/ronin/support/text/homoglyph/table.rb +228 -0
  301. data/lib/ronin/support/text/homoglyph.rb +142 -0
  302. data/lib/ronin/support/text/mixin.rb +31 -0
  303. data/lib/ronin/support/text/patterns/credentials.rb +75 -0
  304. data/lib/ronin/support/text/patterns/crypto.rb +67 -0
  305. data/lib/ronin/support/text/patterns/file_system.rb +93 -0
  306. data/lib/ronin/support/text/patterns/language.rb +37 -0
  307. data/lib/ronin/support/text/patterns/network/public_suffix.rb +44 -0
  308. data/lib/ronin/support/text/patterns/network.rb +140 -0
  309. data/lib/ronin/support/text/patterns/numeric.rb +52 -0
  310. data/lib/ronin/support/text/patterns/pii.rb +105 -0
  311. data/lib/ronin/support/text/patterns/source_code.rb +148 -0
  312. data/lib/ronin/support/text/patterns.rb +25 -0
  313. data/lib/ronin/support/text/random/mixin.rb +437 -0
  314. data/lib/ronin/support/text/random.rb +419 -0
  315. data/lib/ronin/support/text/typo/core_ext/string.rb +123 -0
  316. data/lib/ronin/support/text/typo/core_ext.rb +19 -0
  317. data/lib/ronin/support/text/typo/exceptions.rb +28 -0
  318. data/lib/ronin/support/text/typo/generator.rb +161 -0
  319. data/lib/ronin/support/text/typo.rb +260 -0
  320. data/lib/ronin/support/text.rb +26 -0
  321. data/lib/ronin/support/version.rb +6 -7
  322. data/lib/ronin/support.rb +20 -15
  323. data/ronin-support.gemspec +3 -1
  324. metadata +462 -369
  325. data/.gemtest +0 -0
  326. data/lib/ronin/binary/hexdump/parser.rb +0 -403
  327. data/lib/ronin/binary/struct.rb +0 -567
  328. data/lib/ronin/binary/template.rb +0 -454
  329. data/lib/ronin/extensions/ip_addr.rb +0 -217
  330. data/lib/ronin/extensions/meta/object.rb +0 -24
  331. data/lib/ronin/extensions/regexp.rb +0 -157
  332. data/lib/ronin/extensions.rb +0 -29
  333. data/lib/ronin/formatting/extensions/binary/array.rb +0 -61
  334. data/lib/ronin/formatting/extensions/binary/base64.rb +0 -106
  335. data/lib/ronin/formatting/extensions/binary/file.rb +0 -77
  336. data/lib/ronin/formatting/extensions/binary/float.rb +0 -65
  337. data/lib/ronin/formatting/extensions/binary/integer.rb +0 -180
  338. data/lib/ronin/formatting/extensions/binary/string.rb +0 -345
  339. data/lib/ronin/formatting/extensions/binary.rb +0 -26
  340. data/lib/ronin/formatting/extensions/digest/file.rb +0 -129
  341. data/lib/ronin/formatting/extensions/digest/string.rb +0 -86
  342. data/lib/ronin/formatting/extensions/digest.rb +0 -21
  343. data/lib/ronin/formatting/extensions/html/integer.rb +0 -142
  344. data/lib/ronin/formatting/extensions/html/string.rb +0 -194
  345. data/lib/ronin/formatting/extensions/html.rb +0 -21
  346. data/lib/ronin/formatting/extensions/http/integer.rb +0 -69
  347. data/lib/ronin/formatting/extensions/http/string.rb +0 -110
  348. data/lib/ronin/formatting/extensions/http.rb +0 -21
  349. data/lib/ronin/formatting/extensions/sql/string.rb +0 -128
  350. data/lib/ronin/formatting/extensions/sql.rb +0 -20
  351. data/lib/ronin/formatting/extensions/text/array.rb +0 -137
  352. data/lib/ronin/formatting/extensions/text/string.rb +0 -297
  353. data/lib/ronin/formatting/extensions.rb +0 -24
  354. data/lib/ronin/formatting/text.rb +0 -20
  355. data/lib/ronin/formatting.rb +0 -25
  356. data/lib/ronin/fuzzing/extensions/string.rb +0 -209
  357. data/lib/ronin/fuzzing/fuzzer.rb +0 -110
  358. data/lib/ronin/fuzzing/fuzzing.rb +0 -360
  359. data/lib/ronin/fuzzing/mutator.rb +0 -161
  360. data/lib/ronin/fuzzing/repeater.rb +0 -81
  361. data/lib/ronin/fuzzing/template.rb +0 -133
  362. data/lib/ronin/fuzzing.rb +0 -21
  363. data/lib/ronin/mixin.rb +0 -89
  364. data/lib/ronin/network/dns.rb +0 -201
  365. data/lib/ronin/network/esmtp.rb +0 -113
  366. data/lib/ronin/network/extensions/dns.rb +0 -20
  367. data/lib/ronin/network/extensions/esmtp.rb +0 -20
  368. data/lib/ronin/network/extensions/http/uri/http.rb +0 -228
  369. data/lib/ronin/network/extensions/http.rb +0 -21
  370. data/lib/ronin/network/extensions/imap.rb +0 -20
  371. data/lib/ronin/network/extensions/pop3/net.rb +0 -24
  372. data/lib/ronin/network/extensions/pop3.rb +0 -20
  373. data/lib/ronin/network/extensions/smtp/net.rb +0 -24
  374. data/lib/ronin/network/extensions/ssl/net.rb +0 -24
  375. data/lib/ronin/network/extensions/ssl.rb +0 -20
  376. data/lib/ronin/network/extensions/tcp/net.rb +0 -24
  377. data/lib/ronin/network/extensions/tcp.rb +0 -20
  378. data/lib/ronin/network/extensions/telnet/net.rb +0 -24
  379. data/lib/ronin/network/extensions/telnet.rb +0 -20
  380. data/lib/ronin/network/extensions/udp/net.rb +0 -24
  381. data/lib/ronin/network/extensions/udp.rb +0 -20
  382. data/lib/ronin/network/extensions.rb +0 -29
  383. data/lib/ronin/network/ftp.rb +0 -149
  384. data/lib/ronin/network/http/exceptions.rb +0 -20
  385. data/lib/ronin/network/http/http.rb +0 -1127
  386. data/lib/ronin/network/http/proxy.rb +0 -330
  387. data/lib/ronin/network/http.rb +0 -22
  388. data/lib/ronin/network/imap.rb +0 -158
  389. data/lib/ronin/network/mixins/dns.rb +0 -55
  390. data/lib/ronin/network/mixins/esmtp.rb +0 -164
  391. data/lib/ronin/network/mixins/ftp.rb +0 -155
  392. data/lib/ronin/network/mixins/http.rb +0 -227
  393. data/lib/ronin/network/mixins/imap.rb +0 -156
  394. data/lib/ronin/network/mixins/mixin.rb +0 -58
  395. data/lib/ronin/network/mixins/pop3.rb +0 -149
  396. data/lib/ronin/network/mixins/smtp.rb +0 -159
  397. data/lib/ronin/network/mixins/ssl.rb +0 -148
  398. data/lib/ronin/network/mixins/tcp.rb +0 -368
  399. data/lib/ronin/network/mixins/telnet.rb +0 -208
  400. data/lib/ronin/network/mixins/udp.rb +0 -381
  401. data/lib/ronin/network/mixins/unix.rb +0 -279
  402. data/lib/ronin/network/mixins.rb +0 -29
  403. data/lib/ronin/network/network.rb +0 -45
  404. data/lib/ronin/network/pop3.rb +0 -124
  405. data/lib/ronin/network/proxy.rb +0 -578
  406. data/lib/ronin/network/smtp/email.rb +0 -174
  407. data/lib/ronin/network/smtp/smtp.rb +0 -230
  408. data/lib/ronin/network/smtp.rb +0 -22
  409. data/lib/ronin/network/ssl.rb +0 -186
  410. data/lib/ronin/network/tcp/proxy.rb +0 -417
  411. data/lib/ronin/network/tcp/tcp.rb +0 -443
  412. data/lib/ronin/network/tcp.rb +0 -21
  413. data/lib/ronin/network/telnet.rb +0 -264
  414. data/lib/ronin/network/udp/proxy.rb +0 -191
  415. data/lib/ronin/network/udp/udp.rb +0 -450
  416. data/lib/ronin/network/udp.rb +0 -21
  417. data/lib/ronin/network/unix.rb +0 -286
  418. data/lib/ronin/network.rb +0 -31
  419. data/lib/ronin/path.rb +0 -137
  420. data/lib/ronin/spec/ui/output.rb +0 -22
  421. data/lib/ronin/support/inflector.rb +0 -92
  422. data/lib/ronin/support/support.rb +0 -42
  423. data/lib/ronin/templates/erb.rb +0 -78
  424. data/lib/ronin/templates/template.rb +0 -169
  425. data/lib/ronin/templates.rb +0 -21
  426. data/lib/ronin/ui/output/helpers.rb +0 -296
  427. data/lib/ronin/ui/output/output.rb +0 -146
  428. data/lib/ronin/ui/output/terminal/color.rb +0 -124
  429. data/lib/ronin/ui/output/terminal/raw.rb +0 -103
  430. data/lib/ronin/ui/output/terminal.rb +0 -21
  431. data/lib/ronin/ui/output.rb +0 -21
  432. data/lib/ronin/ui/shell.rb +0 -286
  433. data/lib/ronin/wordlist.rb +0 -287
  434. data/spec/binary/hexdump/helpers/hexdumps/ascii.bin +0 -0
  435. data/spec/binary/hexdump/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -17
  436. data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_bytes.txt +0 -17
  437. data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_shorts.txt +0 -17
  438. data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_bytes.txt +0 -17
  439. data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_shorts.txt +0 -17
  440. data/spec/binary/hexdump/helpers/hexdumps/hexdump_repeated.txt +0 -6
  441. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_bytes.txt +0 -17
  442. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_ints.txt +0 -17
  443. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_quads.txt +0 -17
  444. data/spec/binary/hexdump/helpers/hexdumps/od_decimal_shorts.txt +0 -17
  445. data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +0 -17
  446. data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +0 -17
  447. data/spec/binary/hexdump/helpers/hexdumps/od_hex_bytes.txt +0 -17
  448. data/spec/binary/hexdump/helpers/hexdumps/od_hex_ints.txt +0 -17
  449. data/spec/binary/hexdump/helpers/hexdumps/od_hex_quads.txt +0 -17
  450. data/spec/binary/hexdump/helpers/hexdumps/od_hex_shorts.txt +0 -17
  451. data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +0 -17
  452. data/spec/binary/hexdump/helpers/hexdumps/od_octal_bytes.txt +0 -17
  453. data/spec/binary/hexdump/helpers/hexdumps/od_octal_ints.txt +0 -17
  454. data/spec/binary/hexdump/helpers/hexdumps/od_octal_quads.txt +0 -17
  455. data/spec/binary/hexdump/helpers/hexdumps/od_octal_shorts.txt +0 -17
  456. data/spec/binary/hexdump/helpers/hexdumps/od_repeated.txt +0 -6
  457. data/spec/binary/hexdump/helpers/hexdumps/repeated.bin +0 -1
  458. data/spec/binary/hexdump/helpers/hexdumps.rb +0 -13
  459. data/spec/binary/hexdump/parser_spec.rb +0 -302
  460. data/spec/binary/struct_spec.rb +0 -496
  461. data/spec/binary/template_spec.rb +0 -414
  462. data/spec/extensions/enumerable_spec.rb +0 -24
  463. data/spec/extensions/file_spec.rb +0 -63
  464. data/spec/extensions/ip_addr_spec.rb +0 -203
  465. data/spec/extensions/kernel_spec.rb +0 -30
  466. data/spec/extensions/regexp_spec.rb +0 -482
  467. data/spec/extensions/resolv_spec.rb +0 -18
  468. data/spec/extensions/string_spec.rb +0 -179
  469. data/spec/formatting/binary/array_spec.rb +0 -26
  470. data/spec/formatting/binary/base64_spec.rb +0 -50
  471. data/spec/formatting/binary/float_spec.rb +0 -34
  472. data/spec/formatting/binary/integer_spec.rb +0 -166
  473. data/spec/formatting/binary/string_spec.rb +0 -197
  474. data/spec/formatting/digest/string_spec.rb +0 -82
  475. data/spec/formatting/html/integer_spec.rb +0 -66
  476. data/spec/formatting/html/string_spec.rb +0 -103
  477. data/spec/formatting/http/integer_spec.rb +0 -42
  478. data/spec/formatting/http/string_spec.rb +0 -76
  479. data/spec/formatting/sql/string_spec.rb +0 -75
  480. data/spec/formatting/text/array_spec.rb +0 -105
  481. data/spec/formatting/text/string_spec.rb +0 -162
  482. data/spec/fuzzing/extensions/string_spec.rb +0 -87
  483. data/spec/fuzzing/fuzzer_spec.rb +0 -109
  484. data/spec/fuzzing/fuzzing_spec.rb +0 -24
  485. data/spec/fuzzing/mutator_spec.rb +0 -112
  486. data/spec/fuzzing/repeater_spec.rb +0 -57
  487. data/spec/fuzzing/template_spec.rb +0 -54
  488. data/spec/mixin_spec.rb +0 -53
  489. data/spec/network/dns_spec.rb +0 -201
  490. data/spec/network/ftp_spec.rb +0 -81
  491. data/spec/network/http/http_spec.rb +0 -466
  492. data/spec/network/http/proxy_spec.rb +0 -148
  493. data/spec/network/network_spec.rb +0 -8
  494. data/spec/network/proxy_spec.rb +0 -121
  495. data/spec/network/shared/unix_server.rb +0 -31
  496. data/spec/network/smtp/email_spec.rb +0 -100
  497. data/spec/network/ssl_spec.rb +0 -70
  498. data/spec/network/tcp/proxy_spec.rb +0 -116
  499. data/spec/network/tcp/tcp_spec.rb +0 -273
  500. data/spec/network/telnet_spec.rb +0 -67
  501. data/spec/network/udp/udp_spec.rb +0 -271
  502. data/spec/network/unix_spec.rb +0 -183
  503. data/spec/path_spec.rb +0 -86
  504. data/spec/spec_helper.rb +0 -9
  505. data/spec/support/inflector_spec.rb +0 -22
  506. data/spec/support_spec.rb +0 -8
  507. data/spec/templates/classes/example_erb.rb +0 -11
  508. data/spec/templates/classes/example_template.rb +0 -35
  509. data/spec/templates/erb_spec.rb +0 -21
  510. data/spec/templates/helpers/data/includes/_relative.erb +0 -1
  511. data/spec/templates/helpers/data/templates/example.erb +0 -1
  512. data/spec/templates/helpers/data.rb +0 -9
  513. data/spec/templates/template_spec.rb +0 -54
  514. data/spec/ui/classes/test_shell.rb +0 -22
  515. data/spec/ui/output_spec.rb +0 -32
  516. data/spec/ui/shell_spec.rb +0 -83
  517. data/spec/wordlist_spec.rb +0 -151
@@ -0,0 +1,740 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # Ronin Support is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Ronin Support is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/support/network/ssl'
20
+ require 'ronin/support/network/tcp/mixin'
21
+ require 'ronin/support/crypto/cert'
22
+
23
+ module Ronin
24
+ module Support
25
+ module Network
26
+ module SSL
27
+ #
28
+ # Provides helper methods for communicating with SSL-enabled services.
29
+ #
30
+ module Mixin
31
+ include TCP::Mixin
32
+
33
+ #
34
+ # Creates a new SSL Context.
35
+ #
36
+ # @param [Hash{Symbol => Object}] kwargs
37
+ # Additional keyword arguments.
38
+ #
39
+ # @option kwargs [1, 1.1, 1.2, String, Symbol, nil] :version
40
+ # The SSL version to use.
41
+ #
42
+ # @option kwargs [Symbol, Boolean] :verify
43
+ # Specifies whether to verify the SSL certificate.
44
+ # May be one of the following:
45
+ #
46
+ # * `:none`
47
+ # * `:peer`
48
+ # * `:fail_if_no_peer_cert`
49
+ # * `:client_once`
50
+ #
51
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key
52
+ # The RSA key to use for the SSL context.
53
+ #
54
+ # @option kwargs [String] :key_file
55
+ # The path to the SSL `.key` file.
56
+ #
57
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert
58
+ # The X509 certificate to use for the SSL context.
59
+ #
60
+ # @option kwargs [String] :cert_file
61
+ # The path to the SSL `.crt` file.
62
+ #
63
+ # @option kwargs [String] :ca_bundle
64
+ # Path to the CA certificate file or directory.
65
+ #
66
+ # @return [OpenSSL::SSL::SSLContext]
67
+ # The newly created SSL Context.
68
+ #
69
+ # @api semipublic
70
+ #
71
+ # @since 0.6.0
72
+ #
73
+ def ssl_context(**kwargs)
74
+ Network::SSL.context(**kwargs)
75
+ end
76
+
77
+ #
78
+ # Initiates an SSL session with an existing TCP socket.
79
+ #
80
+ # @param [TCPSocket] socket
81
+ # The existing TCP socket.
82
+ #
83
+ # @param [Hash{Symbol => Object}] kwargs
84
+ # Additional keyword arguments for {#ssl_context}.
85
+ #
86
+ # @option kwargs [Symbol, Boolean] :verify
87
+ # Specifies whether to verify the SSL certificate.
88
+ # May be one of the following:
89
+ #
90
+ # * `:none`
91
+ # * `:peer`
92
+ # * `:fail_if_no_peer_cert`
93
+ # * `:client_once`
94
+ #
95
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key
96
+ # The RSA key to use for the SSL context.
97
+ #
98
+ # @option kwargs [String] :key_file
99
+ # The path to the SSL `.key` file.
100
+ #
101
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert
102
+ # The X509 certificate to use for the SSL context.
103
+ #
104
+ # @option kwargs [String] :cert_file
105
+ # The path to the SSL `.crt` file.
106
+ #
107
+ # @option kwargs [String] :ca_bundle
108
+ # Path to the CA certificate file or directory.
109
+ #
110
+ # @return [OpenSSL::SSL::SSLSocket]
111
+ # the new SSL Socket.
112
+ #
113
+ # @api public
114
+ #
115
+ # @since 0.6.0
116
+ #
117
+ def ssl_socket(socket,**kwargs)
118
+ ssl_socket = OpenSSL::SSL::SSLSocket.new(socket,ssl_context(**kwargs))
119
+ ssl_socket.sync_close = true
120
+ return ssl_socket
121
+ end
122
+
123
+ #
124
+ # Tests whether a remote SSLed TCP port is open.
125
+ #
126
+ # @param [String] host
127
+ # The host to connect to.
128
+ #
129
+ # @param [Integer] port
130
+ # The port to connect to.
131
+ #
132
+ # @param [String] bind_host
133
+ # The local host to bind to.
134
+ #
135
+ # @param [Integer] bind_port
136
+ # The local port to bind to.
137
+ #
138
+ # @param [Integer] timeout (5)
139
+ # The maximum time to attempt connecting.
140
+ #
141
+ # @param [Hash{Symbol => Object}] kwargs
142
+ # Additional keyword arguments for {#ssl_connect}.
143
+ #
144
+ # @option options [Symbol, Boolean] :verify
145
+ # Specifies whether to verify the SSL certificate.
146
+ # May be one of the following:
147
+ #
148
+ # * `:none`
149
+ # * `:peer`
150
+ # * `:fail_if_no_peer_cert`
151
+ # * `:client_once`
152
+ #
153
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key
154
+ # The RSA key to use for the SSL context.
155
+ #
156
+ # @option kwargs [String] :key_file
157
+ # The path to the SSL `.key` file.
158
+ #
159
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert
160
+ # The X509 certificate to use for the SSL context.
161
+ #
162
+ # @option kwargs [String] :cert_file
163
+ # The path to the SSL `.crt` file.
164
+ #
165
+ # @option kwargs [String] :ca_bundle
166
+ # Path to the CA certificate file or directory.
167
+ #
168
+ # @return [Boolean, nil]
169
+ # Specifies whether the remote SSLed TCP port is open.
170
+ # If the connection was not accepted, `nil` will be returned.
171
+ #
172
+ # @example
173
+ # ssl_open?('www.bankofamerica.com',443)
174
+ #
175
+ # @example Using a timeout:
176
+ # ssl_open?('example.com',80, timeout: 5)
177
+ # # => nil
178
+ #
179
+ # @api public
180
+ #
181
+ # @since 0.6.0
182
+ #
183
+ def ssl_open?(host,port, bind_host: nil, bind_port: nil, timeout: 5,
184
+ **kwargs)
185
+ begin
186
+ Timeout.timeout(timeout) do
187
+ ssl_connect(host,port, bind_host: bind_host,
188
+ bind_port: bind_port,
189
+ **kwargs)
190
+ end
191
+
192
+ return true
193
+ rescue Timeout::Error
194
+ return nil
195
+ rescue SocketError, SystemCallError
196
+ return false
197
+ end
198
+ end
199
+
200
+ #
201
+ # Establishes a SSL connection.
202
+ #
203
+ # @param [String] host
204
+ # The host to connect to.
205
+ #
206
+ # @param [Integer] port
207
+ # The port to connect to.
208
+ #
209
+ # @param [String] bind_host
210
+ # The local host to bind to.
211
+ #
212
+ # @param [Integer] bind_port
213
+ # The local port to bind to.
214
+ #
215
+ # @param [Hash{Symbol => Object}] kwargs
216
+ # Additional keyword arguments for {#ssl_socket}.
217
+ #
218
+ # @option kwargs [Symbol, Boolean] :verify
219
+ # Specifies whether to verify the SSL certificate.
220
+ # May be one of the following:
221
+ #
222
+ # * `:none`
223
+ # * `:peer`
224
+ # * `:fail_if_no_peer_cert`
225
+ # * `:client_once`
226
+ #
227
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key
228
+ # The RSA key to use for the SSL context.
229
+ #
230
+ # @option kwargs [String] :key_file
231
+ # The path to the SSL `.key` file.
232
+ #
233
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert
234
+ # The X509 certificate to use for the SSL context.
235
+ #
236
+ # @option kwargs [String] :cert_file
237
+ # The path to the SSL `.crt` file.
238
+ #
239
+ # @option kwargs [String] :ca_bundle
240
+ # Path to the CA certificate file or directory.
241
+ #
242
+ # @yield [ssl_socket]
243
+ # The given block will be passed the new SSL socket. Once the block
244
+ # returns the SSL socket will be closed.
245
+ #
246
+ # @yieldparam [OpenSSL::SSL::SSLSocket] ssl_socket
247
+ # The new SSL Socket.
248
+ #
249
+ # @return [OpenSSL::SSL::SSLSocket, nil]
250
+ # the new SSL Socket. If a block is given, then `nil` will be
251
+ # returned.
252
+ #
253
+ # @example
254
+ # socket = ssl_connect('twitter.com',443)
255
+ #
256
+ # @example
257
+ # ssl_connect('twitter.com',443) do |sock|
258
+ # sock.write("GET / HTTP/1.1\n\r\n\r")
259
+ #
260
+ # sock.each_line { |line| puts line }
261
+ # end
262
+ #
263
+ # @see http://rubydoc.info/stdlib/openssl/OpenSSL/SSL/SSLSocket
264
+ #
265
+ # @api public
266
+ #
267
+ def ssl_connect(host,port, bind_host: nil, bind_port: nil, **kwargs)
268
+ socket = tcp_connect(host,port,bind_host: bind_host,
269
+ bind_port: bind_port)
270
+ ssl_socket = ssl_socket(socket,**kwargs)
271
+ ssl_socket.connect
272
+
273
+ if block_given?
274
+ yield ssl_socket
275
+ ssl_socket.close
276
+ else
277
+ return ssl_socket
278
+ end
279
+ end
280
+
281
+ #
282
+ # Creates a new SSL connection and sends the given data.
283
+ #
284
+ # @param [String] data
285
+ # The data to send through the connection.
286
+ #
287
+ # @param [String] host
288
+ # The host to connect to.
289
+ #
290
+ # @param [Integer] port
291
+ # The port to connect to.
292
+ #
293
+ # @param [String] bind_host
294
+ # The local host to bind to.
295
+ #
296
+ # @param [Integer] bind_port
297
+ # The local port to bind to.
298
+ #
299
+ # @param [Hash{Symbol => Object}] kwargs
300
+ # Additional keyword arguments for {#ssl_connect}.
301
+ #
302
+ # @option kwargs [Symbol, Boolean] :verify
303
+ # Specifies whether to verify the SSL certificate.
304
+ # May be one of the following:
305
+ #
306
+ # * `:none`
307
+ # * `:peer`
308
+ # * `:fail_if_no_peer_cert`
309
+ # * `:client_once`
310
+ #
311
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key
312
+ # The RSA key to use for the SSL context.
313
+ #
314
+ # @option kwargs [String] :key_file
315
+ # The path to the SSL `.key` file.
316
+ #
317
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert
318
+ # The X509 certificate to use for the SSL context.
319
+ #
320
+ # @option kwargs [String] :cert_file
321
+ # The path to the SSL `.crt` file.
322
+ #
323
+ # @option kwargs [String] :ca_bundle
324
+ # Path to the CA certificate file or directory.
325
+ #
326
+ # @yield [ssl_socket]
327
+ # The given block will be passed the newly created SSL Socket.
328
+ #
329
+ # @yieldparam [OpenSSL::SSL::SSLSocket] ssl_socket
330
+ # The newly created SSL Socket.
331
+ #
332
+ # @api public
333
+ #
334
+ # @since 0.6.0
335
+ #
336
+ def ssl_connect_and_send(data,host,port, bind_host: nil,
337
+ bind_port: nil,
338
+ **kwargs)
339
+ socket = ssl_connect(host,port, bind_host: bind_host,
340
+ bind_port: bind_port,
341
+ **kwargs)
342
+ socket.write(data)
343
+
344
+ yield socket if block_given?
345
+ return socket
346
+ end
347
+
348
+ #
349
+ # Connects to the host and port and returns the server's certificate.
350
+ #
351
+ # @param [String] host
352
+ # The host to connect to.
353
+ #
354
+ # @param [Integer] port
355
+ # The port to connect to.
356
+ #
357
+ # @param [Hash{Symbol => Object}] kwargs
358
+ # Additional keyword arguments.
359
+ #
360
+ # @option kwargs [String] :bind_host
361
+ # The local host to bind to.
362
+ #
363
+ # @option kwargs [Integer] :bind_port
364
+ # The local port to bind to.
365
+ #
366
+ # @option kwargs [Symbol, Boolean] :verify
367
+ # Specifies whether to verify the SSL certificate.
368
+ # May be one of the following:
369
+ #
370
+ # * `:none`
371
+ # * `:peer`
372
+ # * `:fail_if_no_peer_cert`
373
+ # * `:client_once`
374
+ #
375
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key
376
+ # The RSA key to use for the SSL context.
377
+ #
378
+ # @option kwargs [String] :key_file
379
+ # The path to the SSL `.key` file.
380
+ #
381
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert
382
+ # The X509 certificate to use for the SSL context.
383
+ #
384
+ # @option kwargs [String] :cert_file
385
+ # The path to the SSL `.crt` file.
386
+ #
387
+ # @option kwargs [String] :ca_bundle
388
+ # Path to the CA certificate file or directory.
389
+ #
390
+ # @return [Crypto::Cert]
391
+ # The server's certificate.
392
+ #
393
+ def ssl_cert(host,port,**kwargs)
394
+ socket = ssl_connect(host,port,**kwargs)
395
+ cert = Crypto::Cert(socket.peer_cert)
396
+ socket.close
397
+ return cert
398
+ end
399
+
400
+ #
401
+ # Reads the banner from the service running on the given host and
402
+ # port.
403
+ #
404
+ # @param [String] host
405
+ # The host to connect to.
406
+ #
407
+ # @param [Integer] port
408
+ # The port to connect to.
409
+ #
410
+ # @param [String] bind_host
411
+ # The local host to bind to.
412
+ #
413
+ # @param [Integer] bind_port
414
+ # The local port to bind to.
415
+ #
416
+ # @param [Hash{Symbol => Object}] kwargs
417
+ # Additional keyword arguments for {#ssl_connect}.
418
+ #
419
+ # @option kwargs [Symbol, Boolean] :verify
420
+ # Specifies whether to verify the SSL certificate.
421
+ # May be one of the following:
422
+ #
423
+ # * `:none`
424
+ # * `:peer`
425
+ # * `:fail_if_no_peer_cert`
426
+ # * `:client_once`
427
+ #
428
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key
429
+ # The RSA key to use for the SSL context.
430
+ #
431
+ # @option kwargs [String] :key_file
432
+ # The path to the SSL `.key` file.
433
+ #
434
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert
435
+ # The X509 certificate to use for the SSL context.
436
+ #
437
+ # @option kwargs [String] :cert_file
438
+ # The path to the SSL `.crt` file.
439
+ #
440
+ # @option kwargs [String] :ca_bundle
441
+ # Path to the CA certificate file or directory.
442
+ #
443
+ # @yield [banner]
444
+ # If a block is given, it will be passed the grabbed banner.
445
+ #
446
+ # @yieldparam [String] banner
447
+ # The grabbed banner.
448
+ #
449
+ # @return [String]
450
+ # The grabbed banner.
451
+ #
452
+ # @example
453
+ # ssl_banner('smtp.gmail.com',465)
454
+ # # => "220 mx.google.com ESMTP c20sm3096959rvf.1"
455
+ #
456
+ # @api public
457
+ #
458
+ # @since 0.6.0
459
+ #
460
+ def ssl_banner(host,port, bind_host: nil, bind_port: nil, **kwargs)
461
+ banner = nil
462
+
463
+ ssl_connect(host,port, bind_host: bind_host,
464
+ bind_port: bind_port,
465
+ **kwargs) do |ssl_socket|
466
+ banner = ssl_socket.readline.strip
467
+ end
468
+
469
+ yield banner if block_given?
470
+ return banner
471
+ end
472
+
473
+ #
474
+ # Connects to a specified host and port, sends the given data and then
475
+ # closes the connection.
476
+ #
477
+ # @param [String] data
478
+ # The data to send through the connection.
479
+ #
480
+ # @param [String] host
481
+ # The host to connect to.
482
+ #
483
+ # @param [Integer] port
484
+ # The port to connect to.
485
+ #
486
+ # @param [String] bind_host
487
+ # The local host to bind to.
488
+ #
489
+ # @param [Integer] bind_port
490
+ # The local port to bind to.
491
+ #
492
+ # @param [Hash{Symbol => Object}] kwargs
493
+ # Additional keyword arguments for {#ssl_connect}.
494
+ #
495
+ # @option kwargs [Symbol, Boolean] :verify
496
+ # Specifies whether to verify the SSL certificate.
497
+ # May be one of the following:
498
+ #
499
+ # * `:none`
500
+ # * `:peer`
501
+ # * `:fail_if_no_peer_cert`
502
+ # * `:client_once`
503
+ #
504
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key
505
+ # The RSA key to use for the SSL context.
506
+ #
507
+ # @option kwargs [String] :key_file
508
+ # The path to the SSL `.key` file.
509
+ #
510
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert
511
+ # The X509 certificate to use for the SSL context.
512
+ #
513
+ # @option kwargs [String] :cert_file
514
+ # The path to the SSL `.crt` file.
515
+ #
516
+ # @option kwargs [String] :ca_bundle
517
+ # Path to the CA certificate file or directory.
518
+ #
519
+ # @return [true]
520
+ # The data was successfully sent.
521
+ #
522
+ # @example
523
+ # buffer = "GET /#{'A' * 4096}\n\r"
524
+ # ssl_send(buffer,'victim.com',443)
525
+ # # => true
526
+ #
527
+ # @api public
528
+ #
529
+ # @since 0.6.0
530
+ #
531
+ def ssl_send(data,host,port, bind_host: nil, bind_port: nil,**kwargs)
532
+ ssl_connect(host,port, bind_host: bind_host,
533
+ bind_port: bind_port,**kwargs) do |socket|
534
+ socket.write(data)
535
+ end
536
+
537
+ return true
538
+ end
539
+
540
+ #
541
+ # Accepts an SSL session from an existing TCP socket.
542
+ #
543
+ # @param [TCPSocket] socket
544
+ # The existing TCP socket.
545
+ #
546
+ # @param [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] key
547
+ # The RSA key to use for the SSL context.
548
+ #
549
+ # @param [Crypto::Cert, OpenSSL::X509::Certificate, nil] cert
550
+ # The X509 certificate to use for the SSL context.
551
+ #
552
+ # @param [Hash{Symbol => Object}] kwargs
553
+ # Additional keyword arguments for {#ssl_socket}.
554
+ #
555
+ # @option kwargs [Symbol, Boolean] :verify
556
+ # Specifies whether to verify the SSL certificate.
557
+ # May be one of the following:
558
+ #
559
+ # * `:none`
560
+ # * `:peer`
561
+ # * `:fail_if_no_peer_cert`
562
+ # * `:client_once`
563
+ #
564
+ # @option kwargs [String] :key_file
565
+ # The path to the SSL `.key` file.
566
+ #
567
+ # @option kwargs [String] :cert_file
568
+ # The path to the SSL `.crt` file.
569
+ #
570
+ # @option kwargs [String] :ca_bundle
571
+ # Path to the CA certificate file or directory.
572
+ #
573
+ # @return [OpenSSL::SSL::SSLSocket]
574
+ # the new SSL Socket.
575
+ #
576
+ # @api public
577
+ #
578
+ # @since 0.6.0
579
+ #
580
+ def ssl_server_socket(socket, key: Network::SSL.key,
581
+ cert: Network::SSL.cert,
582
+ **kwargs)
583
+ return ssl_socket(socket, cert: cert, key: key, **kwargs)
584
+ end
585
+
586
+ #
587
+ # Creates a new SSL socket listening on a given host and port,
588
+ # accepting clients in a loop.
589
+ #
590
+ # @param [Integer] port
591
+ # The local port to listen on.
592
+ #
593
+ # @param [String] host
594
+ # The host to bind to.
595
+ #
596
+ # @param [Integer] backlog (5)
597
+ # The maximum backlog of pending connections.
598
+ #
599
+ # @param [Hash{Symbol => Object}] kwargs
600
+ # Additional keyword arguments for {#ssl_server_socket}.
601
+ #
602
+ # @option kwargs [Symbol, Boolean] :verify
603
+ # Specifies whether to verify the SSL certificate.
604
+ # May be one of the following:
605
+ #
606
+ # * `:none`
607
+ # * `:peer`
608
+ # * `:fail_if_no_peer_cert`
609
+ # * `:client_once`
610
+ #
611
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key (Network::SSL.key)
612
+ # The RSA key to use for the SSL context.
613
+ #
614
+ # @option kwargs [String] :key_file
615
+ # The path to the SSL `.key` file.
616
+ #
617
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert (Network::SSL.cert)
618
+ # The X509 certificate to use for the SSL context.
619
+ #
620
+ # @option kwargs [String] :cert_file
621
+ # The path to the SSL `.crt` file.
622
+ #
623
+ # @option kwargs [String] :ca_bundle
624
+ # Path to the CA certificate file or directory.
625
+ #
626
+ # @yield [client]
627
+ # The given block will be passed the newly connected client.
628
+ # After the block has finished, the client will be closed.
629
+ #
630
+ # @yieldparam [OpenSSL::SSL::SSLSocket] client
631
+ # A newly connected client.
632
+ #
633
+ # @return [nil]
634
+ #
635
+ # @example
636
+ # # $ openssl genrsa -out ssl.key 1024
637
+ # # $ openssl req -new -key ssl.key -x509 -days 3653 -out ssl.crt
638
+ # # $ cat ssl.key ssl.crt > ssl.pem
639
+ # # $ chmod 600 ssl.key ssl.pem
640
+ # ssl_server_loop(port: 1337, cert: 'ssl.crt', key: 'ssl.key') do |sock|
641
+ # sock.puts 'lol'
642
+ # end
643
+ #
644
+ # @api public
645
+ #
646
+ # @since 0.6.0
647
+ #
648
+ def ssl_server_loop(port: nil, host: nil, backlog: 5, **kwargs)
649
+ return tcp_server_session(port: port, host: host, backlog: backlog) do |server|
650
+ loop do
651
+ client = server.accept
652
+ ssl_client = ssl_server_socket(client,**kwargs)
653
+ ssl_client.accept
654
+
655
+ yield ssl_client if block_given?
656
+ ssl_client.close
657
+ end
658
+ end
659
+ end
660
+
661
+ #
662
+ # Creates a new SSL socket listening on a given host and port,
663
+ # accepts only one client and then stops listening.
664
+ #
665
+ # @param [Integer] port
666
+ # The local port to listen on.
667
+ #
668
+ # @param [String] host
669
+ # The host to bind to.
670
+ #
671
+ # @param [Hash{Symbol => Object}] kwargs
672
+ # Additional keyword arguments for {#ssl_server_socket}.
673
+ #
674
+ # @option kwargs [Symbol, Boolean] :verify
675
+ # Specifies whether to verify the SSL certificate.
676
+ # May be one of the following:
677
+ #
678
+ # * `:none`
679
+ # * `:peer`
680
+ # * `:fail_if_no_peer_cert`
681
+ # * `:client_once`
682
+ #
683
+ # @option kwargs [Crypto::Key::RSA, OpenSSL::PKey::RSA, nil] :key (Network::SSL.key)
684
+ # The RSA key to use for the SSL context.
685
+ #
686
+ # @option kwargs [String] :key_file
687
+ # The path to the SSL `.key` file.
688
+ #
689
+ # @option kwargs [Crypto::Cert, OpenSSL::X509::Certificate, nil] :cert (Network::SSL.cert)
690
+ # The X509 certificate to use for the SSL context.
691
+ #
692
+ # @option kwargs [String] :cert_file
693
+ # The path to the SSL `.crt` file.
694
+ #
695
+ # @option kwargs [String] :ca_bundle
696
+ # Path to the CA certificate file or directory.
697
+ #
698
+ # @example
699
+ # ssl_accept(1337) do |client|
700
+ # client.puts 'lol'
701
+ # end
702
+ #
703
+ # @yield [client]
704
+ # The given block will be passed the newly connected client.
705
+ # After the block has finished, both the client and the server will
706
+ # be closed.
707
+ #
708
+ # @yieldparam [OpenSSL::SSL::SSLSocket] client
709
+ # The newly connected client.
710
+ #
711
+ # @return [nil]
712
+ #
713
+ # @example
714
+ # # $ openssl genrsa -out ssl.key 1024
715
+ # # $ openssl req -new -key ssl.key -x509 -days 3653 -out ssl.crt
716
+ # # $ cat ssl.key ssl.crt > ssl.pem
717
+ # # $ chmod 600 ssl.key ssl.pem
718
+ # ssl_accept(port: 1337, cert: 'ssl.crt', key: 'ssl.key') do |client|
719
+ # client.puts 'lol'
720
+ # end
721
+ #
722
+ # @api public
723
+ #
724
+ # @since 0.6.0
725
+ #
726
+ def ssl_accept(port: nil, host: nil,**kwargs)
727
+ tcp_server_session(port: port, host: host, backlog: 1) do |server|
728
+ client = server.accept
729
+ ssl_client = ssl_server_socket(client,options)
730
+ ssl_client.accept
731
+
732
+ yield ssl_client if block_given?
733
+ ssl_client.close
734
+ end
735
+ end
736
+ end
737
+ end
738
+ end
739
+ end
740
+ end