ronin-support 1.0.0.beta3 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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'