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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +14 -0
- data/.rubocop.yml +109 -0
- data/ChangeLog.md +33 -1
- data/Gemfile +8 -4
- data/README.md +1 -1
- data/Rakefile +2 -2
- data/examples/ssl_proxy.rb +2 -1
- data/examples/tcp_proxy.rb +6 -4
- data/lib/ronin/support/archive/core_ext/file.rb +43 -0
- data/lib/ronin/support/archive/core_ext.rb +1 -1
- data/lib/ronin/support/archive/tar/writer.rb +2 -2
- data/lib/ronin/support/archive/tar.rb +4 -4
- data/lib/ronin/support/archive/zip/reader.rb +2 -2
- data/lib/ronin/support/binary/array.rb +5 -8
- data/lib/ronin/support/binary/bit_flip.rb +7 -1
- data/lib/ronin/support/binary/buffer.rb +25 -25
- data/lib/ronin/support/binary/byte_slice.rb +17 -17
- data/lib/ronin/support/binary/core_ext.rb +2 -0
- data/lib/ronin/support/binary/cstring.rb +50 -4
- data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/arm.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/mips.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +4 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/x86.rb +3 -0
- data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +3 -0
- data/lib/ronin/support/binary/ctypes/array_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/big_endian.rb +3 -0
- data/lib/ronin/support/binary/ctypes/enum_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/little_endian.rb +3 -0
- data/lib/ronin/support/binary/ctypes/native.rb +3 -0
- data/lib/ronin/support/binary/ctypes/os/bsd.rb +1 -1
- data/lib/ronin/support/binary/ctypes/scalar_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/struct_type.rb +3 -3
- data/lib/ronin/support/binary/ctypes/type_resolver.rb +7 -8
- data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +2 -2
- data/lib/ronin/support/binary/ctypes/union_type.rb +3 -3
- data/lib/ronin/support/binary/ctypes.rb +3 -3
- data/lib/ronin/support/binary/memory.rb +2 -2
- data/lib/ronin/support/binary/packet.rb +80 -0
- data/lib/ronin/support/binary/stack.rb +6 -7
- data/lib/ronin/support/binary/struct/member.rb +5 -3
- data/lib/ronin/support/binary/struct.rb +81 -79
- data/lib/ronin/support/binary/template.rb +2 -5
- data/lib/ronin/support/binary/unhexdump/parser.rb +11 -11
- data/lib/ronin/support/binary/union.rb +22 -22
- data/lib/ronin/support/binary.rb +1 -0
- data/lib/ronin/support/cli/ansi.rb +0 -1
- data/lib/ronin/support/cli/io_shell/core_ext/io.rb +1 -1
- data/lib/ronin/support/cli/io_shell.rb +4 -4
- data/lib/ronin/support/cli/printing.rb +3 -3
- data/lib/ronin/support/compression/core_ext/file.rb +16 -0
- data/lib/ronin/support/compression/zlib.rb +1 -1
- data/lib/ronin/support/core_ext/enumerable.rb +0 -2
- data/lib/ronin/support/core_ext/file.rb +1 -1
- data/lib/ronin/support/core_ext/kernel.rb +6 -9
- data/lib/ronin/support/core_ext/string.rb +2 -2
- data/lib/ronin/support/crypto/cert.rb +11 -15
- data/lib/ronin/support/crypto/cert_chain.rb +1 -1
- data/lib/ronin/support/crypto/cipher/aes.rb +3 -0
- data/lib/ronin/support/crypto/cipher/aes128.rb +4 -1
- data/lib/ronin/support/crypto/cipher/aes256.rb +4 -1
- data/lib/ronin/support/crypto/cipher.rb +1 -1
- data/lib/ronin/support/crypto/core_ext/file.rb +33 -1
- data/lib/ronin/support/crypto/core_ext/string.rb +34 -2
- data/lib/ronin/support/crypto/key/methods.rb +4 -1
- data/lib/ronin/support/crypto/key.rb +5 -2
- data/lib/ronin/support/crypto/openssl.rb +1 -1
- data/lib/ronin/support/crypto.rb +0 -1
- data/lib/ronin/support/encoding/base16.rb +2 -2
- data/lib/ronin/support/encoding/base32.rb +29 -18
- data/lib/ronin/support/encoding/c/core_ext/integer.rb +1 -1
- data/lib/ronin/support/encoding/c/core_ext/string.rb +1 -1
- data/lib/ronin/support/encoding/c.rb +6 -6
- data/lib/ronin/support/encoding/core_ext/string.rb +2 -2
- data/lib/ronin/support/encoding/hex/core_ext/string.rb +1 -1
- data/lib/ronin/support/encoding/hex.rb +4 -4
- data/lib/ronin/support/encoding/js/core_ext/integer.rb +1 -1
- data/lib/ronin/support/encoding/js.rb +5 -5
- data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +2 -2
- data/lib/ronin/support/encoding/powershell.rb +5 -6
- data/lib/ronin/support/encoding/quoted_printable.rb +3 -1
- data/lib/ronin/support/encoding/ruby.rb +5 -5
- data/lib/ronin/support/encoding/shell/core_ext/integer.rb +2 -2
- data/lib/ronin/support/encoding/shell.rb +3 -3
- data/lib/ronin/support/encoding/sql.rb +1 -1
- data/lib/ronin/support/encoding/uuencoding.rb +3 -1
- data/lib/ronin/support/encoding/xml.rb +3 -3
- data/lib/ronin/support/encoding.rb +95 -0
- data/lib/ronin/support/network/asn/list.rb +6 -1
- data/lib/ronin/support/network/asn/record.rb +3 -0
- data/lib/ronin/support/network/asn/record_set.rb +3 -0
- data/lib/ronin/support/network/asn.rb +167 -6
- data/lib/ronin/support/network/dns/mixin.rb +2 -10
- data/lib/ronin/support/network/dns/resolver.rb +3 -0
- data/lib/ronin/support/network/domain.rb +21 -21
- data/lib/ronin/support/network/email_address.rb +1 -5
- data/lib/ronin/support/network/esmtp/mixin.rb +1 -0
- data/lib/ronin/support/network/ftp/mixin.rb +1 -1
- data/lib/ronin/support/network/host.rb +75 -47
- data/lib/ronin/support/network/http/core_ext/uri/http.rb +8 -0
- data/lib/ronin/support/network/http/core_ext.rb +1 -1
- data/lib/ronin/support/network/http.rb +317 -80
- data/lib/ronin/support/network/ip.rb +49 -23
- data/lib/ronin/support/network/ip_range/cidr.rb +1 -5
- data/lib/ronin/support/network/ip_range/glob.rb +1 -0
- data/lib/ronin/support/network/ip_range/range.rb +1 -1
- data/lib/ronin/support/network/ip_range.rb +5 -7
- data/lib/ronin/support/network/proxy.rb +4 -4
- data/lib/ronin/support/network/public_suffix/list.rb +10 -8
- data/lib/ronin/support/network/public_suffix/suffix_set.rb +3 -0
- data/lib/ronin/support/network/public_suffix.rb +9 -4
- data/lib/ronin/support/network/smtp/email.rb +0 -9
- data/lib/ronin/support/network/smtp/mixin.rb +2 -2
- data/lib/ronin/support/network/ssl/local_cert.rb +1 -3
- data/lib/ronin/support/network/ssl/mixin.rb +13 -13
- data/lib/ronin/support/network/ssl/openssl.rb +1 -1
- data/lib/ronin/support/network/ssl/proxy.rb +14 -16
- data/lib/ronin/support/network/ssl.rb +4 -2
- data/lib/ronin/support/network/tcp/proxy.rb +3 -3
- data/lib/ronin/support/network/tcp.rb +10 -12
- data/lib/ronin/support/network/telnet/mixin.rb +14 -14
- data/lib/ronin/support/network/tld/list.rb +2 -1
- data/lib/ronin/support/network/tld.rb +7 -4
- data/lib/ronin/support/network/tls/proxy.rb +1 -1
- data/lib/ronin/support/network/tls.rb +0 -2
- data/lib/ronin/support/network/udp/proxy.rb +5 -5
- data/lib/ronin/support/network/udp.rb +14 -16
- data/lib/ronin/support/path.rb +4 -4
- data/lib/ronin/support/text/erb/mixin.rb +3 -0
- data/lib/ronin/support/text/homoglyph/core_ext/string.rb +33 -0
- data/lib/ronin/support/text/homoglyph/table.rb +3 -3
- data/lib/ronin/support/text/patterns/credentials.rb +2 -2
- data/lib/ronin/support/text/patterns/crypto.rb +1 -1
- data/lib/ronin/support/text/patterns/file_system.rb +3 -4
- data/lib/ronin/support/text/patterns/network.rb +21 -21
- data/lib/ronin/support/text/patterns/numeric.rb +1 -1
- data/lib/ronin/support/text/patterns/source_code.rb +2 -2
- data/lib/ronin/support/text/random/mixin.rb +17 -17
- data/lib/ronin/support/text/random.rb +25 -25
- data/lib/ronin/support/text/typo/core_ext/string.rb +24 -0
- data/lib/ronin/support/text/typo/generator.rb +2 -2
- data/lib/ronin/support/version.rb +1 -1
- data/ronin-support.gemspec +6 -5
- metadata +3 -2
@@ -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, *
|
66
|
-
|
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
|
-
|
82
|
-
|
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
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
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
|
-
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
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
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
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]' }],
|
@@ -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
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
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
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
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
|
-
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
#
|
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
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
#
|
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
|
-
#
|
115
|
-
#
|
116
|
-
#
|
117
|
-
#
|
118
|
-
#
|
119
|
-
#
|
120
|
-
#
|
121
|
-
#
|
122
|
-
#
|
123
|
-
#
|
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
|
-
#
|
127
|
-
#
|
128
|
-
#
|
129
|
-
#
|
130
|
-
#
|
131
|
-
#
|
132
|
-
#
|
133
|
-
#
|
134
|
-
#
|
135
|
-
#
|
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,
|
294
|
-
new_suffix
|
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
|
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)
|