ronin-support 1.0.0 → 1.0.2

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 (151) 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 +33 -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/core_ext/file.rb +43 -0
  11. data/lib/ronin/support/archive/core_ext.rb +1 -1
  12. data/lib/ronin/support/archive/tar/writer.rb +2 -2
  13. data/lib/ronin/support/archive/tar.rb +4 -4
  14. data/lib/ronin/support/archive/zip/reader.rb +2 -2
  15. data/lib/ronin/support/binary/array.rb +5 -8
  16. data/lib/ronin/support/binary/bit_flip.rb +7 -1
  17. data/lib/ronin/support/binary/buffer.rb +25 -25
  18. data/lib/ronin/support/binary/byte_slice.rb +17 -17
  19. data/lib/ronin/support/binary/core_ext.rb +2 -0
  20. data/lib/ronin/support/binary/cstring.rb +50 -4
  21. data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +4 -0
  22. data/lib/ronin/support/binary/ctypes/arch/arm.rb +3 -0
  23. data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +4 -0
  24. data/lib/ronin/support/binary/ctypes/arch/arm64.rb +3 -0
  25. data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +4 -0
  26. data/lib/ronin/support/binary/ctypes/arch/mips.rb +3 -0
  27. data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +4 -0
  28. data/lib/ronin/support/binary/ctypes/arch/mips64.rb +3 -0
  29. data/lib/ronin/support/binary/ctypes/arch/ppc.rb +3 -0
  30. data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +3 -0
  31. data/lib/ronin/support/binary/ctypes/arch/x86.rb +3 -0
  32. data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +3 -0
  33. data/lib/ronin/support/binary/ctypes/array_type.rb +2 -2
  34. data/lib/ronin/support/binary/ctypes/big_endian.rb +3 -0
  35. data/lib/ronin/support/binary/ctypes/enum_type.rb +2 -2
  36. data/lib/ronin/support/binary/ctypes/little_endian.rb +3 -0
  37. data/lib/ronin/support/binary/ctypes/native.rb +3 -0
  38. data/lib/ronin/support/binary/ctypes/os/bsd.rb +1 -1
  39. data/lib/ronin/support/binary/ctypes/scalar_type.rb +2 -2
  40. data/lib/ronin/support/binary/ctypes/struct_type.rb +3 -3
  41. data/lib/ronin/support/binary/ctypes/type_resolver.rb +7 -8
  42. data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +2 -2
  43. data/lib/ronin/support/binary/ctypes/union_type.rb +3 -3
  44. data/lib/ronin/support/binary/ctypes.rb +3 -3
  45. data/lib/ronin/support/binary/memory.rb +2 -2
  46. data/lib/ronin/support/binary/packet.rb +80 -0
  47. data/lib/ronin/support/binary/stack.rb +6 -7
  48. data/lib/ronin/support/binary/struct/member.rb +5 -3
  49. data/lib/ronin/support/binary/struct.rb +81 -79
  50. data/lib/ronin/support/binary/template.rb +2 -5
  51. data/lib/ronin/support/binary/unhexdump/parser.rb +11 -11
  52. data/lib/ronin/support/binary/union.rb +22 -22
  53. data/lib/ronin/support/binary.rb +1 -0
  54. data/lib/ronin/support/cli/ansi.rb +0 -1
  55. data/lib/ronin/support/cli/io_shell/core_ext/io.rb +1 -1
  56. data/lib/ronin/support/cli/io_shell.rb +4 -4
  57. data/lib/ronin/support/cli/printing.rb +3 -3
  58. data/lib/ronin/support/compression/core_ext/file.rb +16 -0
  59. data/lib/ronin/support/compression/zlib.rb +1 -1
  60. data/lib/ronin/support/core_ext/enumerable.rb +0 -2
  61. data/lib/ronin/support/core_ext/file.rb +1 -1
  62. data/lib/ronin/support/core_ext/kernel.rb +6 -9
  63. data/lib/ronin/support/core_ext/string.rb +2 -2
  64. data/lib/ronin/support/crypto/cert.rb +11 -15
  65. data/lib/ronin/support/crypto/cert_chain.rb +1 -1
  66. data/lib/ronin/support/crypto/cipher/aes.rb +3 -0
  67. data/lib/ronin/support/crypto/cipher/aes128.rb +4 -1
  68. data/lib/ronin/support/crypto/cipher/aes256.rb +4 -1
  69. data/lib/ronin/support/crypto/cipher.rb +1 -1
  70. data/lib/ronin/support/crypto/core_ext/file.rb +33 -1
  71. data/lib/ronin/support/crypto/core_ext/string.rb +34 -2
  72. data/lib/ronin/support/crypto/key/methods.rb +4 -1
  73. data/lib/ronin/support/crypto/key.rb +5 -2
  74. data/lib/ronin/support/crypto/openssl.rb +1 -1
  75. data/lib/ronin/support/crypto.rb +0 -1
  76. data/lib/ronin/support/encoding/base16.rb +2 -2
  77. data/lib/ronin/support/encoding/base32.rb +29 -18
  78. data/lib/ronin/support/encoding/c/core_ext/integer.rb +1 -1
  79. data/lib/ronin/support/encoding/c/core_ext/string.rb +1 -1
  80. data/lib/ronin/support/encoding/c.rb +6 -6
  81. data/lib/ronin/support/encoding/core_ext/string.rb +2 -2
  82. data/lib/ronin/support/encoding/hex/core_ext/string.rb +1 -1
  83. data/lib/ronin/support/encoding/hex.rb +4 -4
  84. data/lib/ronin/support/encoding/js/core_ext/integer.rb +1 -1
  85. data/lib/ronin/support/encoding/js.rb +5 -5
  86. data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +2 -2
  87. data/lib/ronin/support/encoding/powershell.rb +5 -6
  88. data/lib/ronin/support/encoding/quoted_printable.rb +3 -1
  89. data/lib/ronin/support/encoding/ruby.rb +5 -5
  90. data/lib/ronin/support/encoding/shell/core_ext/integer.rb +2 -2
  91. data/lib/ronin/support/encoding/shell.rb +3 -3
  92. data/lib/ronin/support/encoding/sql.rb +1 -1
  93. data/lib/ronin/support/encoding/uuencoding.rb +3 -1
  94. data/lib/ronin/support/encoding/xml.rb +3 -3
  95. data/lib/ronin/support/encoding.rb +95 -0
  96. data/lib/ronin/support/network/asn/list.rb +6 -1
  97. data/lib/ronin/support/network/asn/record.rb +3 -0
  98. data/lib/ronin/support/network/asn/record_set.rb +3 -0
  99. data/lib/ronin/support/network/asn.rb +167 -6
  100. data/lib/ronin/support/network/dns/mixin.rb +2 -10
  101. data/lib/ronin/support/network/dns/resolver.rb +3 -0
  102. data/lib/ronin/support/network/domain.rb +21 -21
  103. data/lib/ronin/support/network/email_address.rb +1 -5
  104. data/lib/ronin/support/network/esmtp/mixin.rb +1 -0
  105. data/lib/ronin/support/network/ftp/mixin.rb +1 -1
  106. data/lib/ronin/support/network/host.rb +75 -47
  107. data/lib/ronin/support/network/http/core_ext/uri/http.rb +8 -0
  108. data/lib/ronin/support/network/http/core_ext.rb +1 -1
  109. data/lib/ronin/support/network/http.rb +317 -80
  110. data/lib/ronin/support/network/ip.rb +49 -23
  111. data/lib/ronin/support/network/ip_range/cidr.rb +1 -5
  112. data/lib/ronin/support/network/ip_range/glob.rb +1 -0
  113. data/lib/ronin/support/network/ip_range/range.rb +1 -1
  114. data/lib/ronin/support/network/ip_range.rb +5 -7
  115. data/lib/ronin/support/network/proxy.rb +4 -4
  116. data/lib/ronin/support/network/public_suffix/list.rb +10 -8
  117. data/lib/ronin/support/network/public_suffix/suffix_set.rb +3 -0
  118. data/lib/ronin/support/network/public_suffix.rb +9 -4
  119. data/lib/ronin/support/network/smtp/email.rb +0 -9
  120. data/lib/ronin/support/network/smtp/mixin.rb +2 -2
  121. data/lib/ronin/support/network/ssl/local_cert.rb +1 -3
  122. data/lib/ronin/support/network/ssl/mixin.rb +13 -13
  123. data/lib/ronin/support/network/ssl/openssl.rb +1 -1
  124. data/lib/ronin/support/network/ssl/proxy.rb +14 -16
  125. data/lib/ronin/support/network/ssl.rb +4 -2
  126. data/lib/ronin/support/network/tcp/proxy.rb +3 -3
  127. data/lib/ronin/support/network/tcp.rb +10 -12
  128. data/lib/ronin/support/network/telnet/mixin.rb +14 -14
  129. data/lib/ronin/support/network/tld/list.rb +2 -1
  130. data/lib/ronin/support/network/tld.rb +7 -4
  131. data/lib/ronin/support/network/tls/proxy.rb +1 -1
  132. data/lib/ronin/support/network/tls.rb +0 -2
  133. data/lib/ronin/support/network/udp/proxy.rb +5 -5
  134. data/lib/ronin/support/network/udp.rb +14 -16
  135. data/lib/ronin/support/path.rb +4 -4
  136. data/lib/ronin/support/text/erb/mixin.rb +3 -0
  137. data/lib/ronin/support/text/homoglyph/core_ext/string.rb +33 -0
  138. data/lib/ronin/support/text/homoglyph/table.rb +3 -3
  139. data/lib/ronin/support/text/patterns/credentials.rb +2 -2
  140. data/lib/ronin/support/text/patterns/crypto.rb +1 -1
  141. data/lib/ronin/support/text/patterns/file_system.rb +3 -4
  142. data/lib/ronin/support/text/patterns/network.rb +21 -21
  143. data/lib/ronin/support/text/patterns/numeric.rb +1 -1
  144. data/lib/ronin/support/text/patterns/source_code.rb +2 -2
  145. data/lib/ronin/support/text/random/mixin.rb +17 -17
  146. data/lib/ronin/support/text/random.rb +25 -25
  147. data/lib/ronin/support/text/typo/core_ext/string.rb +24 -0
  148. data/lib/ronin/support/text/typo/generator.rb +2 -2
  149. data/lib/ronin/support/version.rb +1 -1
  150. data/ronin-support.gemspec +6 -5
  151. metadata +3 -2
@@ -20,6 +20,9 @@ module Ronin
20
20
  module Support
21
21
  module Network
22
22
  module ASN
23
+ #
24
+ # Represents an individual ASN record.
25
+ #
23
26
  class Record
24
27
 
25
28
  # The ASN number.
@@ -22,6 +22,9 @@ module Ronin
22
22
  module Support
23
23
  module Network
24
24
  module ASN
25
+ #
26
+ # A sub-set of ASN records.
27
+ #
25
28
  class RecordSet
26
29
 
27
30
  include Enumerable
@@ -27,6 +27,83 @@ module Ronin
27
27
  #
28
28
  # Handles Autonomous System Numbers (ASN).
29
29
  #
30
+ # ## Example
31
+ #
32
+ # Query the ASN record for a given IP address:
33
+ #
34
+ # Network::ASN.query('4.2.2.1')
35
+ # # =>
36
+ # # #<Ronin::Support::Network::ASN::DNSRecord:0x00007f34424f4ac0
37
+ # # @country_code="US",
38
+ # # @name=nil,
39
+ # # @number=3356,
40
+ # # @range=#<Ronin::Support::Network::IPRange::CIDR: 4.0.0.0/9>>
41
+ #
42
+ # Query all ASN records for the given ISP name:
43
+ #
44
+ # Network::ASN.list.name('LEVEL3').to_a
45
+ # # => [#<Ronin::Support::Network::ASN::Record:0x00007f344164ed18
46
+ # # @country_code="US",
47
+ # # @name="LEVEL3",
48
+ # # @number=3356,
49
+ # # @range=#<Ronin::Support::Network::IPRange::Range: 4.0.0.0 - 4.23.87.255>>,
50
+ # # #<Ronin::Support::Network::ASN::Record:0x00007f344164d828
51
+ # # @country_code="US",
52
+ # # @name="LEVEL3",
53
+ # # @number=3356,
54
+ # # @range=#<Ronin::Support::Network::IPRange::Range: 4.23.90.0 - 4.23.91.255>>,
55
+ # # ...]
56
+ #
57
+ # Query all IPv6 ASN records for a given company:
58
+ #
59
+ # Network::ASN.list.name('GOOGLE').ipv6
60
+ # # =>
61
+ # # [#<Ronin::Support::Network::ASN::Record:0x00007fc45b411500
62
+ # # @country_code="US",
63
+ # # @name="GOOGLE",
64
+ # # @number=15169,
65
+ # # @range=
66
+ # # #<Ronin::Support::Network::IPRange::Range: 2001:4860:: - 2001:4860:1024:ffff:ffff:ffff:ffff:ffff>>,
67
+ # # #<Ronin::Support::Network::ASN::Record:0x00007fc45b428d68
68
+ # # @country_code="US",
69
+ # # @name="GOOGLE",
70
+ # # @number=15169,
71
+ # # @range=
72
+ # # #<Ronin::Support::Network::IPRange::Range: 2001:4860:1026:: - 2001:4860:4804:ffff:ffff:ffff:ffff:ffff>>,
73
+ # # #<Ronin::Support::Network::ASN::Record:0x00007fc45b44be08
74
+ # # @country_code="US",
75
+ # # @name="GOOGLE",
76
+ # # @number=15169,
77
+ # # @range=
78
+ # # #<Ronin::Support::Network::IPRange::Range: 2001:4860:4806:: - 2001:4860:4864:ffff:ffff:ffff:ffff:ffff>>,
79
+ # # #<Ronin::Support::Network::ASN::Record:0x00007fc45b4562e0
80
+ # # @country_code="US",
81
+ # # @name="GOOGLE",
82
+ # # @number=15169,
83
+ # # @range=
84
+ # # #<Ronin::Support::Network::IPRange::Range: 2001:4860:4865:: - 2001:4860:ffff:ffff:ffff:ffff:ffff:ffff>>]
85
+ #
86
+ # Return all ASN numbers for a country:
87
+ #
88
+ # Network::ASN.list.country('NZ').numbers
89
+ # # => #<Set:
90
+ # # {45177,
91
+ # # 55759,
92
+ # # 55850,
93
+ # # 9500,
94
+ # # ...}>
95
+ #
96
+ # Return all ASN names for a country:
97
+ #
98
+ # Network::ASN.list.country_code('NZ').names
99
+ # # Network::ASN.list.country('NZ').names
100
+ # # =>
101
+ # # #<Set:
102
+ # # {"DEVOLI-AS-AP Devoli",
103
+ # # "MFAT-NET-NZ 195 Lambton Quay",
104
+ # # "MERCURYNZ-AS-AP Mercury NZ Limited",
105
+ # # ...}>
106
+ #
30
107
  # @api public
31
108
  #
32
109
  # @since 1.0.0
@@ -45,6 +122,15 @@ module Ronin
45
122
  # Performs rDNS queries using `*.nmap.asn.cymru.com` for IPv4
46
123
  # addresses and `*.nmap6.asn.cymru.com` for IPv6 addresses.
47
124
  #
125
+ # @example
126
+ # Network::ASN.query('4.2.2.1')
127
+ # # =>
128
+ # # #<Ronin::Support::Network::ASN::DNSRecord:0x00007f34424f4ac0
129
+ # # @country_code="US",
130
+ # # @name=nil,
131
+ # # @number=3356,
132
+ # # @range=#<Ronin::Support::Network::IPRange::CIDR: 4.0.0.0/9>>
133
+ #
48
134
  def self.query(ip)
49
135
  ip = IPAddr.new(ip) unless ip.kind_of?(IPAddr)
50
136
 
@@ -62,8 +148,9 @@ module Ronin
62
148
  return nil
63
149
  end
64
150
 
65
- asn, cidr_range, country_code, *rest = string.split(' | ',5)
66
- asn = asn.to_i
151
+ asn, cidr_range, country_code, *_rest = string.split(' | ',5)
152
+
153
+ asn = asn.to_i
67
154
  cidr_range = IPRange::CIDR.new(cidr_range)
68
155
 
69
156
  return DNSRecord.new(asn,cidr_range,country_code)
@@ -76,11 +163,85 @@ module Ronin
76
163
  # @return [List]
77
164
  # The loaded list file.
78
165
  #
166
+ # @note
167
+ # The first access of {list} will take a while, as the entire ASN
168
+ # list will need to be downloaded and parsed.
169
+ #
170
+ # @example Query the ASN record for the given IP address:
171
+ # Network::ASN.list.ip('4.2.2.1')
172
+ # # =>
173
+ # # #<Ronin::Support::Network::ASN::Record:0x00007fc46207f818
174
+ # # @country_code="US",
175
+ # # @name="LEVEL3",
176
+ # # @number=3356,
177
+ # # @range=#<Ronin::Support::Network::IPRange::Range: 4.0.0.0 - 4.23.87.255>>
178
+ #
179
+ # @example Query all ASN records for the given ISP name:
180
+ # Network::ASN.list.name('LEVEL3').to_a
181
+ # # => [#<Ronin::Support::Network::ASN::Record:0x00007f344164ed18
182
+ # # @country_code="US",
183
+ # # @name="LEVEL3",
184
+ # # @number=3356,
185
+ # # @range=#<Ronin::Support::Network::IPRange::Range: 4.0.0.0 - 4.23.87.255>>,
186
+ # # #<Ronin::Support::Network::ASN::Record:0x00007f344164d828
187
+ # # @country_code="US",
188
+ # # @name="LEVEL3",
189
+ # # @number=3356,
190
+ # # @range=#<Ronin::Support::Network::IPRange::Range: 4.23.90.0 - 4.23.91.255>>,
191
+ # # ...]
192
+ #
193
+ # @example Query all IPv6 ASN records for a given company:
194
+ # Network::ASN.list.name('GOOGLE').ipv6
195
+ # # =>
196
+ # # [#<Ronin::Support::Network::ASN::Record:0x00007fc45b411500
197
+ # # @country_code="US",
198
+ # # @name="GOOGLE",
199
+ # # @number=15169,
200
+ # # @range=
201
+ # # #<Ronin::Support::Network::IPRange::Range: 2001:4860:: - 2001:4860:1024:ffff:ffff:ffff:ffff:ffff>>,
202
+ # # #<Ronin::Support::Network::ASN::Record:0x00007fc45b428d68
203
+ # # @country_code="US",
204
+ # # @name="GOOGLE",
205
+ # # @number=15169,
206
+ # # @range=
207
+ # # #<Ronin::Support::Network::IPRange::Range: 2001:4860:1026:: - 2001:4860:4804:ffff:ffff:ffff:ffff:ffff>>,
208
+ # # #<Ronin::Support::Network::ASN::Record:0x00007fc45b44be08
209
+ # # @country_code="US",
210
+ # # @name="GOOGLE",
211
+ # # @number=15169,
212
+ # # @range=
213
+ # # #<Ronin::Support::Network::IPRange::Range: 2001:4860:4806:: - 2001:4860:4864:ffff:ffff:ffff:ffff:ffff>>,
214
+ # # #<Ronin::Support::Network::ASN::Record:0x00007fc45b4562e0
215
+ # # @country_code="US",
216
+ # # @name="GOOGLE",
217
+ # # @number=15169,
218
+ # # @range=
219
+ # # #<Ronin::Support::Network::IPRange::Range: 2001:4860:4865:: - 2001:4860:ffff:ffff:ffff:ffff:ffff:ffff>>]
220
+ #
221
+ # @example Return all ASN numbers for a country:
222
+ # Network::ASN.list.country('NZ').numbers
223
+ # # => #<Set:
224
+ # # {45177,
225
+ # # 55759,
226
+ # # 55850,
227
+ # # 9500,
228
+ # # ...}>
229
+ #
230
+ # @example Return all ASN names for a country:
231
+ # Network::ASN.list.country_code('NZ').names
232
+ # # Network::ASN.list.country('NZ').names
233
+ # # =>
234
+ # # #<Set:
235
+ # # {"DEVOLI-AS-AP Devoli",
236
+ # # "MFAT-NET-NZ 195 Lambton Quay",
237
+ # # "MERCURYNZ-AS-AP Mercury NZ Limited",
238
+ # # ...}>
239
+ #
79
240
  def self.list
80
- @list ||= (
81
- List.update
82
- List.load_file
83
- )
241
+ @list ||= begin
242
+ List.update
243
+ List.load_file
244
+ end
84
245
  end
85
246
  end
86
247
  end
@@ -25,6 +25,8 @@ module Ronin
25
25
  #
26
26
  # Provides helper methods for performing DNS queries.
27
27
  #
28
+ # @api public
29
+ #
28
30
  module Mixin
29
31
  #
30
32
  # Sets the DNS nameservers to query.
@@ -79,8 +81,6 @@ module Ronin
79
81
  # @return [Resolv, Resolv::DNS]
80
82
  # The DNS Resolver.
81
83
  #
82
- # @api public
83
- #
84
84
  def dns_resolver(nameservers: nil, nameserver: nil)
85
85
  if nameserver
86
86
  Network::DNS.resolver(nameserver: nameserver)
@@ -111,8 +111,6 @@ module Ronin
111
111
  # @return [String, nil]
112
112
  # The address of the hostname.
113
113
  #
114
- # @api public
115
- #
116
114
  def dns_get_address(host,**kwargs)
117
115
  dns_resolver(**kwargs).get_address(host.to_s)
118
116
  end
@@ -137,8 +135,6 @@ module Ronin
137
135
  # @return [Array<String>]
138
136
  # The addresses of the hostname.
139
137
  #
140
- # @api public
141
- #
142
138
  def dns_get_addresses(host,**kwargs)
143
139
  dns_resolver(**kwargs).get_addresses(host.to_s)
144
140
  end
@@ -161,8 +157,6 @@ module Ronin
161
157
  # @return [String, nil]
162
158
  # The hostname of the address.
163
159
  #
164
- # @api public
165
- #
166
160
  def dns_get_name(ip,**kwargs)
167
161
  dns_resolver(**kwargs).get_name(ip.to_s)
168
162
  end
@@ -187,8 +181,6 @@ module Ronin
187
181
  # @return [Array<String>]
188
182
  # The hostnames of the address.
189
183
  #
190
- # @api public
191
- #
192
184
  def dns_get_names(ip,**kwargs)
193
185
  dns_resolver(**kwargs).get_names(ip.to_s)
194
186
  end
@@ -90,6 +90,7 @@ module Ronin
90
90
  begin
91
91
  @resolver.getaddress(host).to_s
92
92
  rescue Resolv::ResolvError
93
+ # ignore any Resolv failures
93
94
  end
94
95
  end
95
96
 
@@ -123,6 +124,7 @@ module Ronin
123
124
  def get_name(ip)
124
125
  @resolver.getname(ip).to_s
125
126
  rescue Resolv::ResolvError
127
+ # ignore any Resolv failures
126
128
  end
127
129
 
128
130
  #
@@ -189,6 +191,7 @@ module Ronin
189
191
  begin
190
192
  @resolver.getresource(name,record_class)
191
193
  rescue Resolv::ResolvError
194
+ # ignore any Resolv failures
192
195
  end
193
196
  end
194
197
 
@@ -33,31 +33,31 @@ module Ronin
33
33
  # # => #<Ronin::Support::Network::IP: 192.30.255.113>
34
34
  # domain.mailservers
35
35
  # # => ["aspmx.l.google.com",
36
- # "alt3.aspmx.l.google.com",
37
- # "alt4.aspmx.l.google.com",
38
- # "alt1.aspmx.l.google.com",
39
- # "alt2.aspmx.l.google.com"]
36
+ # # "alt3.aspmx.l.google.com",
37
+ # # "alt4.aspmx.l.google.com",
38
+ # # "alt1.aspmx.l.google.com",
39
+ # # "alt2.aspmx.l.google.com"]
40
40
  # domain.nameservers
41
41
  # # => ["dns1.p08.nsone.net",
42
- # "dns2.p08.nsone.net",
43
- # "dns3.p08.nsone.net",
44
- # "dns4.p08.nsone.net",
45
- # "ns-1283.awsdns-32.org",
46
- # "ns-1707.awsdns-21.co.uk",
47
- # "ns-421.awsdns-52.com",
48
- # "ns-520.awsdns-01.net"]
42
+ # # "dns2.p08.nsone.net",
43
+ # # "dns3.p08.nsone.net",
44
+ # # "dns4.p08.nsone.net",
45
+ # # "ns-1283.awsdns-32.org",
46
+ # # "ns-1707.awsdns-21.co.uk",
47
+ # # "ns-421.awsdns-52.com",
48
+ # # "ns-520.awsdns-01.net"]
49
49
  # domain.txt_strings
50
50
  # # => ["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",
51
- # "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",
52
- # "MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805",
53
- # "MS=ms44452932",
54
- # "atlassian-domain-verification=jjgw98AKv2aeoYFxiL/VFaoyPkn3undEssTRuMg6C/3Fp/iqhkV4HVV7WjYlVeF8",
55
- # "stripe-verification=f88ef17321660a01bab1660454192e014defa29ba7b8de9633c69d6b4912217f",
56
- # "google-site-verification=UTM-3akMgubp6tQtgEuAkYNYLyYAvpTnnSrDMWoDR3o",
57
- # "MS=ms58704441",
58
- # "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd",
59
- # "adobe-idp-site-verification=b92c9e999aef825edc36e0a3d847d2dbad5b2fc0e05c79ddd7a16139b48ecf4b",
60
- # "apple-domain-verification=RyQhdzTl6Z6x8ZP4"]
51
+ # # "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",
52
+ # # "MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805",
53
+ # # "MS=ms44452932",
54
+ # # "atlassian-domain-verification=jjgw98AKv2aeoYFxiL/VFaoyPkn3undEssTRuMg6C/3Fp/iqhkV4HVV7WjYlVeF8",
55
+ # # "stripe-verification=f88ef17321660a01bab1660454192e014defa29ba7b8de9633c69d6b4912217f",
56
+ # # "google-site-verification=UTM-3akMgubp6tQtgEuAkYNYLyYAvpTnnSrDMWoDR3o",
57
+ # # "MS=ms58704441",
58
+ # # "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd",
59
+ # # "adobe-idp-site-verification=b92c9e999aef825edc36e0a3d847d2dbad5b2fc0e05c79ddd7a16139b48ecf4b",
60
+ # # "apple-domain-verification=RyQhdzTl6Z6x8ZP4"]
61
61
  #
62
62
  # @api public
63
63
  #
@@ -232,8 +232,6 @@ module Ronin
232
232
  return new(name: name, **parse_address(address))
233
233
  end
234
234
 
235
- private
236
-
237
235
  #
238
236
  # Parses the address portion of an email address.
239
237
  #
@@ -326,8 +324,6 @@ module Ronin
326
324
  return {domain: domain, address: address}
327
325
  end
328
326
 
329
- public
330
-
331
327
  # Email address de-obfuscation rules.
332
328
  DEOBFUSCATIONS = {
333
329
  /\s+@\s+/ => '@',
@@ -425,7 +421,7 @@ module Ronin
425
421
 
426
422
  # Email address obfuscation rules.
427
423
  OBFUSCATIONS = [
428
- [/\@/, {'@' => ' @ ' }],
424
+ [/\@/, {'@' => ' @ ' }],
429
425
  [/\@/, {'@' => ' AT ' }],
430
426
  [/\@/, {'@' => ' at ' }],
431
427
  [/\@/, {'@' => '[AT]' }],
@@ -104,6 +104,7 @@ module Ronin
104
104
  end
105
105
  else
106
106
  smtp = smtp_connect(host,**kwargs)
107
+
107
108
  smtp.esmtp = true
108
109
  return smtp
109
110
  end
@@ -86,8 +86,8 @@ module Ronin
86
86
  account: nil,
87
87
  passive: true)
88
88
  host = DNS::IDN.to_ascii(host)
89
+ ftp = Net::FTP.new
89
90
 
90
- ftp = Net::FTP.new
91
91
  ftp.connect(host,port)
92
92
  ftp.login(user,password,account)
93
93
  ftp.passive = passive
@@ -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
@@ -33,6 +33,10 @@ module URI
33
33
  # @return [Integer]
34
34
  # The HTTP Response Status.
35
35
  #
36
+ # @example
37
+ # URI('http://github.com/').status
38
+ # # => 301
39
+ #
36
40
  # @see Ronin::Support::Network::HTTP.response_status
37
41
  #
38
42
  # @since 0.3.0
@@ -53,6 +57,10 @@ module URI
53
57
  #
54
58
  # @see Ronin::Support::Network::HTTP.ok?
55
59
  #
60
+ # @example
61
+ # URI('https://example.com/').ok?
62
+ # # => true
63
+ #
56
64
  # @since 0.3.0
57
65
  #
58
66
  def ok?(**kwargs)
@@ -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'