ronin-support 1.0.0.beta3 → 1.0.1

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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +14 -0
  3. data/.rubocop.yml +109 -0
  4. data/ChangeLog.md +12 -1
  5. data/Gemfile +8 -4
  6. data/README.md +1 -1
  7. data/Rakefile +2 -2
  8. data/examples/ssl_proxy.rb +2 -1
  9. data/examples/tcp_proxy.rb +6 -4
  10. data/lib/ronin/support/archive/tar/writer.rb +2 -2
  11. data/lib/ronin/support/archive/tar.rb +4 -4
  12. data/lib/ronin/support/archive/zip/reader.rb +2 -2
  13. data/lib/ronin/support/binary/array.rb +4 -7
  14. data/lib/ronin/support/binary/bit_flip.rb +7 -1
  15. data/lib/ronin/support/binary/buffer.rb +22 -22
  16. data/lib/ronin/support/binary/byte_slice.rb +17 -17
  17. data/lib/ronin/support/binary/cstring.rb +7 -4
  18. data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +4 -0
  19. data/lib/ronin/support/binary/ctypes/arch/arm.rb +3 -0
  20. data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +4 -0
  21. data/lib/ronin/support/binary/ctypes/arch/arm64.rb +3 -0
  22. data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +4 -0
  23. data/lib/ronin/support/binary/ctypes/arch/mips.rb +3 -0
  24. data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +4 -0
  25. data/lib/ronin/support/binary/ctypes/arch/mips64.rb +3 -0
  26. data/lib/ronin/support/binary/ctypes/arch/ppc.rb +3 -0
  27. data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +3 -0
  28. data/lib/ronin/support/binary/ctypes/arch/x86.rb +3 -0
  29. data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +3 -0
  30. data/lib/ronin/support/binary/ctypes/array_type.rb +1 -1
  31. data/lib/ronin/support/binary/ctypes/big_endian.rb +3 -0
  32. data/lib/ronin/support/binary/ctypes/enum_type.rb +2 -2
  33. data/lib/ronin/support/binary/ctypes/little_endian.rb +3 -0
  34. data/lib/ronin/support/binary/ctypes/native.rb +3 -0
  35. data/lib/ronin/support/binary/ctypes/scalar_type.rb +2 -2
  36. data/lib/ronin/support/binary/ctypes/struct_type.rb +3 -3
  37. data/lib/ronin/support/binary/ctypes/type_resolver.rb +7 -8
  38. data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +1 -1
  39. data/lib/ronin/support/binary/ctypes/union_type.rb +3 -3
  40. data/lib/ronin/support/binary/ctypes.rb +3 -3
  41. data/lib/ronin/support/binary/memory.rb +2 -2
  42. data/lib/ronin/support/binary/packet.rb +3 -0
  43. data/lib/ronin/support/binary/stack.rb +3 -4
  44. data/lib/ronin/support/binary/struct/member.rb +5 -3
  45. data/lib/ronin/support/binary/struct.rb +81 -79
  46. data/lib/ronin/support/binary/template.rb +1 -0
  47. data/lib/ronin/support/binary/unhexdump/parser.rb +11 -11
  48. data/lib/ronin/support/binary/union.rb +22 -22
  49. data/lib/ronin/support/cli/ansi.rb +0 -1
  50. data/lib/ronin/support/cli/io_shell/core_ext/io.rb +1 -1
  51. data/lib/ronin/support/cli/io_shell.rb +4 -4
  52. data/lib/ronin/support/cli/printing.rb +3 -3
  53. data/lib/ronin/support/compression/zlib.rb +1 -1
  54. data/lib/ronin/support/core_ext/enumerable.rb +0 -2
  55. data/lib/ronin/support/core_ext/file.rb +1 -1
  56. data/lib/ronin/support/core_ext/kernel.rb +6 -5
  57. data/lib/ronin/support/core_ext/string.rb +2 -2
  58. data/lib/ronin/support/crypto/cert.rb +11 -15
  59. data/lib/ronin/support/crypto/cert_chain.rb +1 -1
  60. data/lib/ronin/support/crypto/cipher/aes.rb +3 -0
  61. data/lib/ronin/support/crypto/cipher/aes128.rb +4 -1
  62. data/lib/ronin/support/crypto/cipher/aes256.rb +4 -1
  63. data/lib/ronin/support/crypto/cipher.rb +1 -1
  64. data/lib/ronin/support/crypto/core_ext/file.rb +1 -1
  65. data/lib/ronin/support/crypto/key/methods.rb +4 -1
  66. data/lib/ronin/support/crypto/key.rb +5 -2
  67. data/lib/ronin/support/crypto/openssl.rb +1 -1
  68. data/lib/ronin/support/crypto.rb +0 -1
  69. data/lib/ronin/support/encoding/base16.rb +1 -1
  70. data/lib/ronin/support/encoding/base32.rb +28 -17
  71. data/lib/ronin/support/encoding/c/core_ext/integer.rb +1 -1
  72. data/lib/ronin/support/encoding/c.rb +4 -4
  73. data/lib/ronin/support/encoding/hex.rb +2 -2
  74. data/lib/ronin/support/encoding/js/core_ext/integer.rb +1 -1
  75. data/lib/ronin/support/encoding/js.rb +4 -4
  76. data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +2 -2
  77. data/lib/ronin/support/encoding/powershell.rb +4 -5
  78. data/lib/ronin/support/encoding/ruby.rb +4 -4
  79. data/lib/ronin/support/encoding/shell/core_ext/integer.rb +2 -2
  80. data/lib/ronin/support/encoding/shell.rb +3 -3
  81. data/lib/ronin/support/encoding/sql.rb +1 -1
  82. data/lib/ronin/support/encoding/xml.rb +2 -2
  83. data/lib/ronin/support/encoding.rb +95 -0
  84. data/lib/ronin/support/network/asn/list.rb +6 -1
  85. data/lib/ronin/support/network/asn/record.rb +3 -0
  86. data/lib/ronin/support/network/asn/record_set.rb +3 -0
  87. data/lib/ronin/support/network/asn.rb +167 -6
  88. data/lib/ronin/support/network/dns/resolver.rb +3 -0
  89. data/lib/ronin/support/network/domain.rb +21 -21
  90. data/lib/ronin/support/network/email_address.rb +1 -5
  91. data/lib/ronin/support/network/esmtp/mixin.rb +1 -0
  92. data/lib/ronin/support/network/ftp/mixin.rb +1 -1
  93. data/lib/ronin/support/network/host.rb +75 -47
  94. data/lib/ronin/support/network/http/core_ext.rb +1 -1
  95. data/lib/ronin/support/network/http.rb +317 -80
  96. data/lib/ronin/support/network/ip.rb +8 -10
  97. data/lib/ronin/support/network/ip_range/cidr.rb +1 -5
  98. data/lib/ronin/support/network/ip_range/glob.rb +1 -0
  99. data/lib/ronin/support/network/ip_range/range.rb +1 -1
  100. data/lib/ronin/support/network/ip_range.rb +1 -3
  101. data/lib/ronin/support/network/proxy.rb +4 -4
  102. data/lib/ronin/support/network/public_suffix/list.rb +10 -8
  103. data/lib/ronin/support/network/public_suffix/suffix_set.rb +3 -0
  104. data/lib/ronin/support/network/public_suffix.rb +9 -4
  105. data/lib/ronin/support/network/smtp/email.rb +0 -9
  106. data/lib/ronin/support/network/smtp/mixin.rb +2 -2
  107. data/lib/ronin/support/network/ssl/local_cert.rb +1 -3
  108. data/lib/ronin/support/network/ssl/mixin.rb +13 -13
  109. data/lib/ronin/support/network/ssl/openssl.rb +1 -1
  110. data/lib/ronin/support/network/ssl/proxy.rb +14 -16
  111. data/lib/ronin/support/network/ssl.rb +4 -2
  112. data/lib/ronin/support/network/tcp/proxy.rb +3 -3
  113. data/lib/ronin/support/network/tcp.rb +10 -12
  114. data/lib/ronin/support/network/telnet/mixin.rb +14 -14
  115. data/lib/ronin/support/network/tld/list.rb +2 -1
  116. data/lib/ronin/support/network/tld.rb +7 -4
  117. data/lib/ronin/support/network/tls/proxy.rb +1 -1
  118. data/lib/ronin/support/network/tls.rb +0 -2
  119. data/lib/ronin/support/network/udp/proxy.rb +5 -5
  120. data/lib/ronin/support/network/udp.rb +14 -16
  121. data/lib/ronin/support/path.rb +3 -3
  122. data/lib/ronin/support/text/erb/mixin.rb +3 -0
  123. data/lib/ronin/support/text/homoglyph/table.rb +3 -3
  124. data/lib/ronin/support/text/patterns/credentials.rb +2 -2
  125. data/lib/ronin/support/text/patterns/crypto.rb +1 -1
  126. data/lib/ronin/support/text/patterns/file_system.rb +3 -4
  127. data/lib/ronin/support/text/patterns/network.rb +10 -10
  128. data/lib/ronin/support/text/patterns/numeric.rb +1 -1
  129. data/lib/ronin/support/text/patterns/source_code.rb +2 -2
  130. data/lib/ronin/support/text/random.rb +2 -2
  131. data/lib/ronin/support/text/typo/generator.rb +2 -2
  132. data/lib/ronin/support/version.rb +1 -1
  133. data/ronin-support.gemspec +6 -5
  134. metadata +3 -2
@@ -29,7 +29,7 @@ module Ronin
29
29
  # Represents a host or host name.
30
30
  #
31
31
  # ## Examples
32
- #
32
+ #
33
33
  # host = Host.new('www.example.com')
34
34
  #
35
35
  # Resolve parent domain:
@@ -69,36 +69,36 @@ module Ronin
69
69
  # # => [#<Resolv::DNS::Resource::IN::MX:0x00007f7e50035658 @exchange=#<Resolv::DNS::Name: aspmx.l.google.com.>, @preference=1, @ttl=3600>, ...]
70
70
  # host.get_mailservers
71
71
  # # => ["alt1.aspmx.l.google.com",
72
- # "alt4.aspmx.l.google.com",
73
- # "alt3.aspmx.l.google.com",
74
- # "alt2.aspmx.l.google.com",
75
- # "aspmx.l.google.com"]
72
+ # # "alt4.aspmx.l.google.com",
73
+ # # "alt3.aspmx.l.google.com",
74
+ # # "alt2.aspmx.l.google.com",
75
+ # # "aspmx.l.google.com"]
76
76
  # host.mailservers
77
77
  # # => ["alt1.aspmx.l.google.com",
78
- # "alt4.aspmx.l.google.com",
79
- # "alt3.aspmx.l.google.com",
80
- # "alt2.aspmx.l.google.com",
81
- # "aspmx.l.google.com"]
78
+ # # "alt4.aspmx.l.google.com",
79
+ # # "alt3.aspmx.l.google.com",
80
+ # # "alt2.aspmx.l.google.com",
81
+ # # "aspmx.l.google.com"]
82
82
  # host.get_ns_records
83
83
  # # => [#<Resolv::DNS::Resource::IN::NS:0x00007f7e4f972258 @name=#<Resolv::DNS::Name: dns1.p08.nsone.net.>, @ttl=900>, ...]
84
84
  # host.get_nameservers
85
85
  # # => ["dns3.p08.nsone.net",
86
- # "ns-1707.awsdns-21.co.uk",
87
- # "dns2.p08.nsone.net",
88
- # "ns-1283.awsdns-32.org",
89
- # "dns4.p08.nsone.net",
90
- # "ns-421.awsdns-52.com",
91
- # "dns1.p08.nsone.net",
92
- # "ns-520.awsdns-01.net"]
86
+ # # "ns-1707.awsdns-21.co.uk",
87
+ # # "dns2.p08.nsone.net",
88
+ # # "ns-1283.awsdns-32.org",
89
+ # # "dns4.p08.nsone.net",
90
+ # # "ns-421.awsdns-52.com",
91
+ # # "dns1.p08.nsone.net",
92
+ # # "ns-520.awsdns-01.net"]
93
93
  # host.nameservers
94
94
  # # => ["dns3.p08.nsone.net",
95
- # "ns-1707.awsdns-21.co.uk",
96
- # "dns2.p08.nsone.net",
97
- # "ns-1283.awsdns-32.org",
98
- # "dns4.p08.nsone.net",
99
- # "ns-421.awsdns-52.com",
100
- # "dns1.p08.nsone.net",
101
- # "ns-520.awsdns-01.net"]
95
+ # # "ns-1707.awsdns-21.co.uk",
96
+ # # "dns2.p08.nsone.net",
97
+ # # "ns-1283.awsdns-32.org",
98
+ # # "dns4.p08.nsone.net",
99
+ # # "ns-421.awsdns-52.com",
100
+ # # "dns1.p08.nsone.net",
101
+ # # "ns-520.awsdns-01.net"]
102
102
  # host.get_soa_record
103
103
  # # => #<Resolv::DNS::Resource::IN::SOA:0x00007f7e4f63d0b0 @mname=#<Resolv::DNS::Name: ns-1707.awsdns-21.co.uk.>, @rname=#<Resolv::DNS::Name: awsdns-hostmaster.amazon.com.>, @serial=1, @refresh=7200, @retry=900, @expire=1209600, @minimum=86400, @ttl=880>
104
104
  # host.soa_record
@@ -111,28 +111,28 @@ module Ronin
111
111
  # # => [#<Resolv::DNS::Resource::IN::TXT:0x00007f7e4f67c648 @strings=[\"apple-domain-verification=RyQhdzTl6Z6x8ZP4\"], @ttl=2852>, ...]
112
112
  # host.get_txt_strings
113
113
  # # => ["apple-domain-verification=RyQhdzTl6Z6x8ZP4",
114
- # "MS=ms58704441",
115
- # "atlassian-domain-verification=jjgw98AKv2aeoYFxiL/VFaoyPkn3undEssTRuMg6C/3Fp/iqhkV4HVV7WjYlVeF8",
116
- # "MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805",
117
- # "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com include:spf.protection.outlook.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net ip4:166.78.69.169 ip4:1",
118
- # "66.78.69.170 ip4:166.78.71.131 ip4:167.89.101.2 ip4:167.89.101.192/28 ip4:192.254.112.60 ip4:192.254.112.98/31 ip4:192.254.113.10 ip4:192.254.113.101 ip4:192.254.114.176 ip4:62.253.227.114 ~all",
119
- # "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd",
120
- # "google-site-verification=UTM-3akMgubp6tQtgEuAkYNYLyYAvpTnnSrDMWoDR3o",
121
- # "stripe-verification=f88ef17321660a01bab1660454192e014defa29ba7b8de9633c69d6b4912217f",
122
- # "adobe-idp-site-verification=b92c9e999aef825edc36e0a3d847d2dbad5b2fc0e05c79ddd7a16139b48ecf4b",
123
- # "MS=ms44452932"]
114
+ # # "MS=ms58704441",
115
+ # # "atlassian-domain-verification=jjgw98AKv2aeoYFxiL/VFaoyPkn3undEssTRuMg6C/3Fp/iqhkV4HVV7WjYlVeF8",
116
+ # # "MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805",
117
+ # # "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com include:spf.protection.outlook.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net ip4:166.78.69.169 ip4:1",
118
+ # # "66.78.69.170 ip4:166.78.71.131 ip4:167.89.101.2 ip4:167.89.101.192/28 ip4:192.254.112.60 ip4:192.254.112.98/31 ip4:192.254.113.10 ip4:192.254.113.101 ip4:192.254.114.176 ip4:62.253.227.114 ~all",
119
+ # # "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd",
120
+ # # "google-site-verification=UTM-3akMgubp6tQtgEuAkYNYLyYAvpTnnSrDMWoDR3o",
121
+ # # "stripe-verification=f88ef17321660a01bab1660454192e014defa29ba7b8de9633c69d6b4912217f",
122
+ # # "adobe-idp-site-verification=b92c9e999aef825edc36e0a3d847d2dbad5b2fc0e05c79ddd7a16139b48ecf4b",
123
+ # # "MS=ms44452932"]
124
124
  # host.txt_strings
125
125
  # # => ["apple-domain-verification=RyQhdzTl6Z6x8ZP4",
126
- # "MS=ms58704441",
127
- # "atlassian-domain-verification=jjgw98AKv2aeoYFxiL/VFaoyPkn3undEssTRuMg6C/3Fp/iqhkV4HVV7WjYlVeF8",
128
- # "MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805",
129
- # "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com include:spf.protection.outlook.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net ip4:166.78.69.169 ip4:1",
130
- # "66.78.69.170 ip4:166.78.71.131 ip4:167.89.101.2 ip4:167.89.101.192/28 ip4:192.254.112.60 ip4:192.254.112.98/31 ip4:192.254.113.10 ip4:192.254.113.101 ip4:192.254.114.176 ip4:62.253.227.114 ~all",
131
- # "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd",
132
- # "google-site-verification=UTM-3akMgubp6tQtgEuAkYNYLyYAvpTnnSrDMWoDR3o",
133
- # "stripe-verification=f88ef17321660a01bab1660454192e014defa29ba7b8de9633c69d6b4912217f",
134
- # "adobe-idp-site-verification=b92c9e999aef825edc36e0a3d847d2dbad5b2fc0e05c79ddd7a16139b48ecf4b",
135
- # "MS=ms44452932"]
126
+ # # "MS=ms58704441",
127
+ # # "atlassian-domain-verification=jjgw98AKv2aeoYFxiL/VFaoyPkn3undEssTRuMg6C/3Fp/iqhkV4HVV7WjYlVeF8",
128
+ # # "MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805",
129
+ # # "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com include:spf.protection.outlook.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net ip4:166.78.69.169 ip4:1",
130
+ # # "66.78.69.170 ip4:166.78.71.131 ip4:167.89.101.2 ip4:167.89.101.192/28 ip4:192.254.112.60 ip4:192.254.112.98/31 ip4:192.254.113.10 ip4:192.254.113.101 ip4:192.254.114.176 ip4:62.253.227.114 ~all",
131
+ # # "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd",
132
+ # # "google-site-verification=UTM-3akMgubp6tQtgEuAkYNYLyYAvpTnnSrDMWoDR3o",
133
+ # # "stripe-verification=f88ef17321660a01bab1660454192e014defa29ba7b8de9633c69d6b4912217f",
134
+ # # "adobe-idp-site-verification=b92c9e999aef825edc36e0a3d847d2dbad5b2fc0e05c79ddd7a16139b48ecf4b",
135
+ # # "MS=ms44452932"]
136
136
  #
137
137
  # @api public
138
138
  #
@@ -165,6 +165,11 @@ module Ronin
165
165
  #
166
166
  # @return [Boolean]
167
167
  #
168
+ # @example
169
+ # host = Network::Host.new("www.詹姆斯.com')
170
+ # host.idn?
171
+ # # => true
172
+ #
168
173
  def idn?
169
174
  @name !~ /\A[A-Za-z0-9._-]+\z/
170
175
  end
@@ -178,6 +183,11 @@ module Ronin
178
183
  #
179
184
  # @return [Boolean]
180
185
  #
186
+ # @example
187
+ # host = Network::Host.new("www.xn--8ws00zhy3a.com")
188
+ # host.punycode?
189
+ # # => true
190
+ #
181
191
  def punycode?
182
192
  @name.include?('xn--')
183
193
  end
@@ -190,6 +200,11 @@ module Ronin
190
200
  # @return [Host]
191
201
  # The new host containing the punycode version of the hostname.
192
202
  #
203
+ # @example
204
+ # host = Network::Host.new("www.詹姆斯.com")
205
+ # host.punycode
206
+ # # => #<Ronin::Support::Network::Host: www.xn--8ws00zhy3a.com>
207
+ #
193
208
  def punycode
194
209
  self.class.new(DNS::IDN.to_ascii(@name))
195
210
  end
@@ -252,7 +267,7 @@ module Ronin
252
267
  domain, suffix = PublicSuffix.list.split(@name)
253
268
 
254
269
  if (last_dot = domain.rindex('.'))
255
- domain = domain[(last_dot+1)..]
270
+ domain = domain[(last_dot + 1)..]
256
271
  end
257
272
 
258
273
  Domain.new("#{domain}.#{suffix}")
@@ -268,6 +283,11 @@ module Ronin
268
283
  # @return [Host]
269
284
  # The new sub-domain.
270
285
  #
286
+ # @example
287
+ # host = Network::Host.new('example.com')
288
+ # host.subdomain('www')
289
+ # # => #<Ronin::Support::Network::Host: www.example.com>
290
+ #
271
291
  def subdomain(subname)
272
292
  Host.new("#{subname}.#{@name}")
273
293
  end
@@ -290,8 +310,8 @@ module Ronin
290
310
  # # => #<Ronin::Support::Network::Host: www.example.com>
291
311
  #
292
312
  def change_suffix(new_suffix)
293
- name, suffix = PublicSuffix.list.split(@name)
294
- new_suffix = new_suffix.to_s
313
+ name, _suffix = PublicSuffix.list.split(@name)
314
+ new_suffix = new_suffix.to_s
295
315
 
296
316
  if new_suffix.start_with?('.')
297
317
  return self.class.new("#{name}#{new_suffix}")
@@ -345,7 +365,7 @@ module Ronin
345
365
 
346
366
  PublicSuffix.list.each do |suffix|
347
367
  unless suffix.wildcard?
348
- if (type == nil) || (suffix.type == type)
368
+ if type.nil? || (suffix.type == type)
349
369
  yield change_suffix(suffix)
350
370
  end
351
371
  end
@@ -1416,6 +1436,14 @@ module Ronin
1416
1436
  #
1417
1437
  # @note This method will query `8.8.8.8` which supports `ANY` queries.
1418
1438
  #
1439
+ # @example
1440
+ # host = Network::Host.new('www.example.com')
1441
+ # host.registered?
1442
+ # # => true
1443
+ # bad_host = Network::Host.new('foo.example.com')
1444
+ # bad_host.registered?
1445
+ # # => false
1446
+ #
1419
1447
  def registered?
1420
1448
  !get_any_records(nameserver: '8.8.8.8').empty?
1421
1449
  end
@@ -16,4 +16,4 @@
16
16
  # along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
17
17
  #
18
18
 
19
- require 'ronin/support/network/http/core_ext/uri/http.rb'
19
+ require 'ronin/support/network/http/core_ext/uri/http'