ronin-support 0.5.1 → 1.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.editorconfig +11 -0
- data/.github/workflows/ruby.yml +27 -0
- data/.gitignore +7 -6
- data/.mailmap +1 -0
- data/.ruby-version +1 -0
- data/.yardopts +1 -2
- data/ChangeLog.md +533 -137
- data/Gemfile +20 -20
- data/README.md +137 -61
- data/Rakefile +29 -10
- data/data/text/homoglyphs/ascii.txt +8 -0
- data/data/text/homoglyphs/cyrillic.txt +33 -0
- data/data/text/homoglyphs/full_width.txt +81 -0
- data/data/text/homoglyphs/greek.txt +21 -0
- data/data/text/homoglyphs/latin_numbers.txt +14 -0
- data/data/text/homoglyphs/punctuation.txt +7 -0
- data/data/text/patterns/network/public_suffix.rb.erb +44 -0
- data/examples/ssl_proxy.rb +38 -0
- data/examples/tcp_proxy.rb +41 -0
- data/gemspec.yml +25 -15
- data/lib/ronin/support/archive/core_ext/file.rb +118 -0
- data/lib/ronin/{formatting/sql.rb → support/archive/core_ext.rb} +6 -7
- data/lib/ronin/support/archive/mixin.rb +213 -0
- data/lib/ronin/support/archive/tar/reader.rb +135 -0
- data/lib/ronin/support/archive/tar/writer.rb +197 -0
- data/lib/ronin/support/archive/tar.rb +155 -0
- data/lib/ronin/support/archive/zip/reader/entry.rb +134 -0
- data/lib/ronin/support/archive/zip/reader/statistics.rb +76 -0
- data/lib/ronin/support/archive/zip/reader.rb +273 -0
- data/lib/ronin/support/archive/zip/writer.rb +175 -0
- data/lib/ronin/support/archive/zip.rb +105 -0
- data/lib/ronin/support/archive.rb +211 -0
- data/lib/ronin/support/binary/array.rb +255 -0
- data/lib/ronin/support/binary/bit_flip.rb +147 -0
- data/lib/ronin/support/binary/buffer.rb +2027 -0
- data/lib/ronin/support/binary/byte_slice.rb +324 -0
- data/lib/ronin/support/binary/core_ext/array.rb +75 -0
- data/lib/ronin/support/binary/core_ext/float.rb +80 -0
- data/lib/ronin/support/binary/core_ext/integer.rb +305 -0
- data/lib/ronin/support/binary/core_ext/io.rb +38 -0
- data/lib/ronin/support/binary/core_ext/string.rb +115 -0
- data/lib/ronin/{formatting/extensions/text.rb → support/binary/core_ext.rb} +9 -9
- data/lib/ronin/support/binary/cstring.rb +259 -0
- data/lib/ronin/support/binary/ctypes/aggregate_type.rb +98 -0
- data/lib/ronin/support/binary/ctypes/arch/arm/big_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/arm.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64/big_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/arm64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/mips/little_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/mips.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64/little_endian.rb +77 -0
- data/lib/ronin/support/binary/ctypes/arch/mips64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/ppc64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/x86.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch/x86_64.rb +75 -0
- data/lib/ronin/support/binary/ctypes/arch.rb +30 -0
- data/lib/ronin/support/binary/ctypes/array_object_type.rb +164 -0
- data/lib/ronin/support/binary/ctypes/array_type.rb +232 -0
- data/lib/ronin/support/binary/ctypes/big_endian.rb +195 -0
- data/lib/ronin/support/binary/ctypes/char_type.rb +59 -0
- data/lib/ronin/support/binary/ctypes/char_types.rb +39 -0
- data/lib/ronin/support/binary/ctypes/enum_type.rb +181 -0
- data/lib/ronin/support/binary/ctypes/float32_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/float64_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/float_type.rb +62 -0
- data/lib/ronin/support/binary/ctypes/int16_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/int32_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/int64_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/int8_type.rb +41 -0
- data/lib/ronin/support/binary/ctypes/int_type.rb +62 -0
- data/lib/ronin/support/binary/ctypes/little_endian.rb +195 -0
- data/lib/ronin/support/binary/ctypes/mixin.rb +135 -0
- data/lib/ronin/support/binary/ctypes/native.rb +205 -0
- data/lib/ronin/support/binary/ctypes/network.rb +29 -0
- data/lib/ronin/support/binary/ctypes/object_type.rb +55 -0
- data/lib/ronin/support/binary/ctypes/os/bsd.rb +65 -0
- data/lib/ronin/support/binary/ctypes/os/freebsd.rb +215 -0
- data/lib/ronin/support/binary/ctypes/os/linux.rb +193 -0
- data/lib/ronin/support/binary/ctypes/os/macos.rb +151 -0
- data/lib/ronin/support/binary/ctypes/os/netbsd.rb +147 -0
- data/lib/ronin/support/binary/ctypes/os/openbsd.rb +168 -0
- data/lib/ronin/support/binary/ctypes/os/unix.rb +78 -0
- data/lib/ronin/support/binary/ctypes/os/windows.rb +125 -0
- data/lib/ronin/support/binary/ctypes/os.rb +125 -0
- data/lib/ronin/support/binary/ctypes/scalar_type.rb +200 -0
- data/lib/ronin/support/binary/ctypes/string_type.rb +143 -0
- data/lib/ronin/support/binary/ctypes/struct_object_type.rb +173 -0
- data/lib/ronin/support/binary/ctypes/struct_type.rb +359 -0
- data/lib/ronin/support/binary/ctypes/type.rb +193 -0
- data/lib/ronin/support/binary/ctypes/type_resolver.rb +206 -0
- data/lib/ronin/support/binary/ctypes/uint16_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/uint32_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/uint64_type.rb +50 -0
- data/lib/ronin/support/binary/ctypes/uint8_type.rb +41 -0
- data/lib/ronin/support/binary/ctypes/uint_type.rb +59 -0
- data/lib/ronin/support/binary/ctypes/unbounded_array_type.rb +258 -0
- data/lib/ronin/support/binary/ctypes/union_object_type.rb +173 -0
- data/lib/ronin/support/binary/ctypes/union_type.rb +261 -0
- data/lib/ronin/support/binary/ctypes.rb +462 -0
- data/lib/ronin/support/binary/hexdump/core_ext/file.rb +118 -0
- data/lib/ronin/support/binary/hexdump/core_ext/string.rb +115 -0
- data/lib/ronin/support/binary/hexdump/core_ext.rb +20 -0
- data/lib/ronin/support/binary/hexdump/parser.rb +492 -0
- data/lib/ronin/support/binary/hexdump.rb +20 -0
- data/lib/ronin/support/binary/memory.rb +268 -0
- data/lib/ronin/support/binary/packet.rb +33 -0
- data/lib/ronin/support/binary/stack.rb +256 -0
- data/lib/ronin/support/binary/stream/methods.rb +1755 -0
- data/lib/ronin/support/binary/stream.rb +151 -0
- data/lib/ronin/support/binary/struct/member.rb +86 -0
- data/lib/ronin/support/binary/struct.rb +830 -0
- data/lib/ronin/support/binary/template.rb +284 -0
- data/lib/ronin/support/binary/union.rb +162 -0
- data/lib/ronin/support/binary.rb +26 -0
- data/lib/ronin/support/cli/ansi.rb +330 -0
- data/lib/ronin/support/cli/io_shell/core_ext/io.rb +67 -0
- data/lib/ronin/{fuzzing/extensions.rb → support/cli/io_shell/core_ext.rb} +6 -7
- data/lib/ronin/support/cli/io_shell.rb +161 -0
- data/lib/ronin/support/cli/printing.rb +216 -0
- data/lib/ronin/support/cli.rb +20 -0
- data/lib/ronin/support/compression/core_ext/file.rb +70 -0
- data/lib/ronin/support/compression/core_ext/string.rb +101 -0
- data/lib/ronin/{formatting/html.rb → support/compression/core_ext.rb} +6 -7
- data/lib/ronin/support/compression/gzip/reader.rb +70 -0
- data/lib/ronin/support/compression/gzip/writer.rb +74 -0
- data/lib/ronin/support/compression/gzip.rb +105 -0
- data/lib/ronin/support/compression/mixin.rb +180 -0
- data/lib/ronin/{network/extensions/esmtp/net.rb → support/compression/zlib.rb} +9 -10
- data/lib/ronin/support/compression.rb +174 -0
- data/lib/ronin/{extensions → support/core_ext}/enumerable.rb +5 -6
- data/lib/ronin/{extensions → support/core_ext}/file.rb +11 -34
- data/lib/ronin/support/core_ext/integer.rb +37 -0
- data/lib/ronin/support/core_ext/ipaddr.rb +65 -0
- data/lib/ronin/{extensions → support/core_ext}/kernel.rb +10 -9
- data/lib/ronin/{extensions → support/core_ext}/resolv.rb +5 -28
- data/lib/ronin/{extensions → support/core_ext}/string.rb +117 -57
- data/lib/ronin/support/core_ext.rb +33 -0
- data/lib/ronin/support/crypto/cert.rb +522 -0
- data/lib/ronin/support/crypto/cert_chain.rb +204 -0
- data/lib/ronin/support/crypto/cipher/aes.rb +71 -0
- data/lib/ronin/support/crypto/cipher/aes128.rb +54 -0
- data/lib/ronin/support/crypto/cipher/aes256.rb +54 -0
- data/lib/ronin/support/crypto/cipher.rb +194 -0
- data/lib/ronin/support/crypto/core_ext/file.rb +660 -0
- data/lib/ronin/support/crypto/core_ext/string.rb +548 -0
- data/lib/ronin/{binary.rb → support/crypto/core_ext.rb} +7 -8
- data/lib/ronin/support/crypto/hmac.rb +48 -0
- data/lib/ronin/support/crypto/key/dh.rb +122 -0
- data/lib/ronin/support/crypto/key/dsa.rb +103 -0
- data/lib/ronin/support/crypto/key/ec.rb +99 -0
- data/lib/ronin/support/crypto/key/methods.rb +163 -0
- data/lib/ronin/support/crypto/key/rsa.rb +169 -0
- data/lib/ronin/support/crypto/key.rb +105 -0
- data/lib/ronin/support/crypto/mixin.rb +620 -0
- data/lib/ronin/{network/extensions/http/net.rb → support/crypto/openssl.rb} +9 -10
- data/lib/ronin/support/crypto.rb +779 -0
- data/lib/ronin/support/encoding/base16/core_ext/string.rb +63 -0
- data/lib/ronin/support/encoding/base16/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/base16.rb +82 -0
- data/lib/ronin/support/encoding/base32/core_ext/string.rb +63 -0
- data/lib/ronin/support/encoding/base32/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/base32.rb +164 -0
- data/lib/ronin/support/encoding/base64/core_ext/string.rb +76 -0
- data/lib/ronin/support/encoding/base64/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/base64.rb +78 -0
- data/lib/ronin/support/encoding/c/core_ext/integer.rb +82 -0
- data/lib/ronin/support/encoding/c/core_ext/string.rb +125 -0
- data/lib/ronin/support/encoding/c/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/c.rb +277 -0
- data/lib/ronin/support/encoding/core_ext/string.rb +107 -0
- data/lib/ronin/support/encoding/core_ext.rb +33 -0
- data/lib/ronin/support/encoding/hex/core_ext/integer.rb +82 -0
- data/lib/ronin/support/encoding/hex/core_ext/string.rb +133 -0
- data/lib/ronin/support/encoding/hex/core_ext.rb +22 -0
- data/lib/ronin/support/encoding/hex.rb +248 -0
- data/lib/ronin/support/encoding/html/core_ext/integer.rb +106 -0
- data/lib/ronin/support/encoding/html/core_ext/string.rb +130 -0
- data/lib/ronin/support/encoding/html/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/html.rb +233 -0
- data/lib/ronin/support/encoding/http/core_ext/integer.rb +95 -0
- data/lib/ronin/support/encoding/http/core_ext/string.rb +129 -0
- data/lib/ronin/support/encoding/http/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/http.rb +241 -0
- data/lib/ronin/support/encoding/js/core_ext/integer.rb +67 -0
- data/lib/ronin/support/encoding/js/core_ext/string.rb +125 -0
- data/lib/ronin/support/encoding/js/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/js.rb +279 -0
- data/lib/ronin/support/encoding/powershell/core_ext/integer.rb +87 -0
- data/lib/ronin/support/encoding/powershell/core_ext/string.rb +145 -0
- data/lib/ronin/support/encoding/powershell/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/powershell.rb +297 -0
- data/lib/ronin/support/encoding/punycode/core_ext/string.rb +63 -0
- data/lib/ronin/support/encoding/punycode/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/punycode.rb +76 -0
- data/lib/ronin/support/encoding/quoted_printable/core_ext/string.rb +75 -0
- data/lib/ronin/support/encoding/quoted_printable/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/quoted_printable.rb +102 -0
- data/lib/ronin/support/encoding/ruby/core_ext/string.rb +129 -0
- data/lib/ronin/{formatting/binary.rb → support/encoding/ruby/core_ext.rb} +6 -7
- data/lib/ronin/support/encoding/ruby.rb +235 -0
- data/lib/ronin/support/encoding/shell/core_ext/integer.rb +89 -0
- data/lib/ronin/support/encoding/shell/core_ext/string.rb +134 -0
- data/lib/ronin/support/encoding/shell/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/shell.rb +293 -0
- data/lib/ronin/{network/extensions → support/encoding}/smtp.rb +7 -7
- data/lib/ronin/support/encoding/sql/core_ext/string.rb +114 -0
- data/lib/ronin/{formatting/http.rb → support/encoding/sql/core_ext.rb} +6 -7
- data/lib/ronin/support/encoding/sql.rb +124 -0
- data/lib/ronin/support/encoding/uri/core_ext/integer.rb +149 -0
- data/lib/ronin/support/encoding/uri/core_ext/string.rb +195 -0
- data/lib/ronin/support/encoding/uri/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/uri.rb +424 -0
- data/lib/ronin/support/encoding/uuencoding/core_ext/string.rb +73 -0
- data/lib/ronin/support/encoding/uuencoding/core_ext.rb +19 -0
- data/lib/ronin/support/encoding/uuencoding.rb +70 -0
- data/lib/ronin/support/encoding/xml/core_ext/integer.rb +100 -0
- data/lib/ronin/support/encoding/xml/core_ext/string.rb +124 -0
- data/lib/ronin/support/encoding/xml/core_ext.rb +20 -0
- data/lib/ronin/support/encoding/xml.rb +328 -0
- data/lib/ronin/support/encoding.rb +46 -0
- data/lib/ronin/support/home.rb +88 -0
- data/lib/ronin/support/mixin.rb +42 -0
- data/lib/ronin/support/network/asn/dns_record.rb +112 -0
- data/lib/ronin/support/network/asn/list.rb +269 -0
- data/lib/ronin/support/network/asn/record.rb +164 -0
- data/lib/ronin/support/network/asn/record_set.rb +226 -0
- data/lib/ronin/support/network/asn.rb +88 -0
- data/lib/ronin/{binary/hexdump.rb → support/network/core_ext.rb} +6 -7
- data/lib/ronin/support/network/dns/idn.rb +38 -0
- data/lib/ronin/support/network/dns/mixin.rb +941 -0
- data/lib/ronin/support/network/dns/resolver.rb +707 -0
- data/lib/ronin/support/network/dns.rb +1109 -0
- data/lib/ronin/support/network/domain.rb +70 -0
- data/lib/ronin/support/network/email_address.rb +574 -0
- data/lib/ronin/support/network/esmtp/mixin.rb +115 -0
- data/lib/ronin/support/network/exceptions.rb +43 -0
- data/lib/ronin/support/network/ftp/mixin.rb +106 -0
- data/lib/ronin/support/network/host.rb +1473 -0
- data/lib/ronin/support/network/http/cookie.rb +245 -0
- data/lib/ronin/support/network/http/core_ext/uri/http.rb +63 -0
- data/lib/ronin/support/network/http/core_ext.rb +19 -0
- data/lib/ronin/support/network/http/mixin.rb +890 -0
- data/lib/ronin/support/network/http/request.rb +215 -0
- data/lib/ronin/support/network/http/set_cookie.rb +210 -0
- data/lib/ronin/support/network/http/user_agents.rb +115 -0
- data/lib/ronin/support/network/http.rb +2582 -0
- data/lib/ronin/support/network/imap/mixin.rb +133 -0
- data/lib/ronin/support/network/ip/mixin.rb +114 -0
- data/lib/ronin/support/network/ip.rb +540 -0
- data/lib/ronin/support/network/ip_range/cidr.rb +252 -0
- data/lib/ronin/support/network/ip_range/glob.rb +309 -0
- data/lib/ronin/support/network/ip_range/range.rb +249 -0
- data/lib/ronin/support/network/ip_range.rb +284 -0
- data/lib/ronin/support/network/mixin.rb +58 -0
- data/lib/ronin/support/network/packet.rb +27 -0
- data/lib/ronin/support/network/pop3/mixin.rb +113 -0
- data/lib/ronin/support/network/proxy.rb +602 -0
- data/lib/ronin/support/network/public_suffix/list.rb +339 -0
- data/lib/ronin/support/network/public_suffix/suffix.rb +118 -0
- data/lib/ronin/support/network/public_suffix/suffix_set.rb +150 -0
- data/lib/ronin/support/network/public_suffix.rb +41 -0
- data/lib/ronin/support/network/smtp/email.rb +190 -0
- data/lib/ronin/support/network/smtp/mixin.rb +290 -0
- data/lib/ronin/{extensions/meta.rb → support/network/smtp.rb} +6 -7
- data/lib/ronin/support/network/ssl/local_cert.rb +114 -0
- data/lib/ronin/support/network/ssl/local_key.rb +84 -0
- data/lib/ronin/support/network/ssl/mixin.rb +740 -0
- data/lib/ronin/{network/extensions/imap/net.rb → support/network/ssl/openssl.rb} +9 -10
- data/lib/ronin/support/network/ssl/proxy.rb +296 -0
- data/lib/ronin/support/network/ssl.rb +173 -0
- data/lib/ronin/support/network/tcp/mixin.rb +400 -0
- data/lib/ronin/support/network/tcp/proxy.rb +435 -0
- data/lib/ronin/support/network/tcp.rb +443 -0
- data/lib/ronin/support/network/telnet/mixin.rb +150 -0
- data/lib/ronin/support/network/telnet.rb +90 -0
- data/lib/ronin/support/network/tld/list.rb +266 -0
- data/lib/ronin/support/network/tld.rb +41 -0
- data/lib/ronin/support/network/tls/mixin.rb +670 -0
- data/lib/ronin/support/network/tls/proxy.rb +135 -0
- data/lib/ronin/support/network/tls.rb +53 -0
- data/lib/ronin/support/network/udp/mixin.rb +389 -0
- data/lib/ronin/support/network/udp/proxy.rb +192 -0
- data/lib/ronin/support/network/udp.rb +435 -0
- data/lib/ronin/support/network/unix/mixin.rb +273 -0
- data/lib/ronin/support/network.rb +37 -0
- data/lib/ronin/support/path.rb +136 -0
- data/lib/ronin/{network/extensions/dns/net.rb → support/text/core_ext/regexp.rb} +8 -9
- data/lib/ronin/support/text/core_ext/string.rb +46 -0
- data/lib/ronin/support/text/core_ext.rb +23 -0
- data/lib/ronin/support/text/entropy/core_ext/string.rb +45 -0
- data/lib/ronin/support/text/entropy/core_ext.rb +19 -0
- data/lib/ronin/support/text/entropy.rb +66 -0
- data/lib/ronin/support/text/erb/mixin.rb +44 -0
- data/lib/ronin/support/text/erb.rb +19 -0
- data/lib/ronin/support/text/homoglyph/core_ext/string.rb +108 -0
- data/lib/ronin/{formatting/digest.rb → support/text/homoglyph/core_ext.rb} +6 -7
- data/lib/ronin/{network/http/exceptions/unknown_request.rb → support/text/homoglyph/exceptions.rb} +10 -9
- data/lib/ronin/support/text/homoglyph/table.rb +228 -0
- data/lib/ronin/support/text/homoglyph.rb +142 -0
- data/lib/ronin/support/text/mixin.rb +31 -0
- data/lib/ronin/support/text/patterns/credentials.rb +75 -0
- data/lib/ronin/support/text/patterns/crypto.rb +67 -0
- data/lib/ronin/support/text/patterns/file_system.rb +93 -0
- data/lib/ronin/support/text/patterns/language.rb +37 -0
- data/lib/ronin/support/text/patterns/network/public_suffix.rb +44 -0
- data/lib/ronin/support/text/patterns/network.rb +140 -0
- data/lib/ronin/support/text/patterns/numeric.rb +52 -0
- data/lib/ronin/support/text/patterns/pii.rb +105 -0
- data/lib/ronin/support/text/patterns/source_code.rb +148 -0
- data/lib/ronin/support/text/patterns.rb +25 -0
- data/lib/ronin/support/text/random/mixin.rb +437 -0
- data/lib/ronin/support/text/random.rb +419 -0
- data/lib/ronin/support/text/typo/core_ext/string.rb +123 -0
- data/lib/ronin/support/text/typo/core_ext.rb +19 -0
- data/lib/ronin/support/text/typo/exceptions.rb +28 -0
- data/lib/ronin/support/text/typo/generator.rb +161 -0
- data/lib/ronin/support/text/typo.rb +260 -0
- data/lib/ronin/support/text.rb +26 -0
- data/lib/ronin/support/version.rb +6 -7
- data/lib/ronin/support.rb +20 -15
- data/ronin-support.gemspec +3 -1
- metadata +462 -369
- data/.gemtest +0 -0
- data/lib/ronin/binary/hexdump/parser.rb +0 -403
- data/lib/ronin/binary/struct.rb +0 -567
- data/lib/ronin/binary/template.rb +0 -454
- data/lib/ronin/extensions/ip_addr.rb +0 -217
- data/lib/ronin/extensions/meta/object.rb +0 -24
- data/lib/ronin/extensions/regexp.rb +0 -157
- data/lib/ronin/extensions.rb +0 -29
- data/lib/ronin/formatting/extensions/binary/array.rb +0 -61
- data/lib/ronin/formatting/extensions/binary/base64.rb +0 -106
- data/lib/ronin/formatting/extensions/binary/file.rb +0 -77
- data/lib/ronin/formatting/extensions/binary/float.rb +0 -65
- data/lib/ronin/formatting/extensions/binary/integer.rb +0 -180
- data/lib/ronin/formatting/extensions/binary/string.rb +0 -345
- data/lib/ronin/formatting/extensions/binary.rb +0 -26
- data/lib/ronin/formatting/extensions/digest/file.rb +0 -129
- data/lib/ronin/formatting/extensions/digest/string.rb +0 -86
- data/lib/ronin/formatting/extensions/digest.rb +0 -21
- data/lib/ronin/formatting/extensions/html/integer.rb +0 -142
- data/lib/ronin/formatting/extensions/html/string.rb +0 -194
- data/lib/ronin/formatting/extensions/html.rb +0 -21
- data/lib/ronin/formatting/extensions/http/integer.rb +0 -69
- data/lib/ronin/formatting/extensions/http/string.rb +0 -110
- data/lib/ronin/formatting/extensions/http.rb +0 -21
- data/lib/ronin/formatting/extensions/sql/string.rb +0 -128
- data/lib/ronin/formatting/extensions/sql.rb +0 -20
- data/lib/ronin/formatting/extensions/text/array.rb +0 -137
- data/lib/ronin/formatting/extensions/text/string.rb +0 -297
- data/lib/ronin/formatting/extensions.rb +0 -24
- data/lib/ronin/formatting/text.rb +0 -20
- data/lib/ronin/formatting.rb +0 -25
- data/lib/ronin/fuzzing/extensions/string.rb +0 -209
- data/lib/ronin/fuzzing/fuzzer.rb +0 -110
- data/lib/ronin/fuzzing/fuzzing.rb +0 -360
- data/lib/ronin/fuzzing/mutator.rb +0 -161
- data/lib/ronin/fuzzing/repeater.rb +0 -81
- data/lib/ronin/fuzzing/template.rb +0 -133
- data/lib/ronin/fuzzing.rb +0 -21
- data/lib/ronin/mixin.rb +0 -89
- data/lib/ronin/network/dns.rb +0 -201
- data/lib/ronin/network/esmtp.rb +0 -113
- data/lib/ronin/network/extensions/dns.rb +0 -20
- data/lib/ronin/network/extensions/esmtp.rb +0 -20
- data/lib/ronin/network/extensions/http/uri/http.rb +0 -228
- data/lib/ronin/network/extensions/http.rb +0 -21
- data/lib/ronin/network/extensions/imap.rb +0 -20
- data/lib/ronin/network/extensions/pop3/net.rb +0 -24
- data/lib/ronin/network/extensions/pop3.rb +0 -20
- data/lib/ronin/network/extensions/smtp/net.rb +0 -24
- data/lib/ronin/network/extensions/ssl/net.rb +0 -24
- data/lib/ronin/network/extensions/ssl.rb +0 -20
- data/lib/ronin/network/extensions/tcp/net.rb +0 -24
- data/lib/ronin/network/extensions/tcp.rb +0 -20
- data/lib/ronin/network/extensions/telnet/net.rb +0 -24
- data/lib/ronin/network/extensions/telnet.rb +0 -20
- data/lib/ronin/network/extensions/udp/net.rb +0 -24
- data/lib/ronin/network/extensions/udp.rb +0 -20
- data/lib/ronin/network/extensions.rb +0 -29
- data/lib/ronin/network/ftp.rb +0 -149
- data/lib/ronin/network/http/exceptions.rb +0 -20
- data/lib/ronin/network/http/http.rb +0 -1127
- data/lib/ronin/network/http/proxy.rb +0 -330
- data/lib/ronin/network/http.rb +0 -22
- data/lib/ronin/network/imap.rb +0 -158
- data/lib/ronin/network/mixins/dns.rb +0 -55
- data/lib/ronin/network/mixins/esmtp.rb +0 -164
- data/lib/ronin/network/mixins/ftp.rb +0 -155
- data/lib/ronin/network/mixins/http.rb +0 -227
- data/lib/ronin/network/mixins/imap.rb +0 -156
- data/lib/ronin/network/mixins/mixin.rb +0 -58
- data/lib/ronin/network/mixins/pop3.rb +0 -149
- data/lib/ronin/network/mixins/smtp.rb +0 -159
- data/lib/ronin/network/mixins/ssl.rb +0 -148
- data/lib/ronin/network/mixins/tcp.rb +0 -368
- data/lib/ronin/network/mixins/telnet.rb +0 -208
- data/lib/ronin/network/mixins/udp.rb +0 -381
- data/lib/ronin/network/mixins/unix.rb +0 -279
- data/lib/ronin/network/mixins.rb +0 -29
- data/lib/ronin/network/network.rb +0 -45
- data/lib/ronin/network/pop3.rb +0 -124
- data/lib/ronin/network/proxy.rb +0 -578
- data/lib/ronin/network/smtp/email.rb +0 -174
- data/lib/ronin/network/smtp/smtp.rb +0 -230
- data/lib/ronin/network/smtp.rb +0 -22
- data/lib/ronin/network/ssl.rb +0 -186
- data/lib/ronin/network/tcp/proxy.rb +0 -417
- data/lib/ronin/network/tcp/tcp.rb +0 -443
- data/lib/ronin/network/tcp.rb +0 -21
- data/lib/ronin/network/telnet.rb +0 -264
- data/lib/ronin/network/udp/proxy.rb +0 -191
- data/lib/ronin/network/udp/udp.rb +0 -450
- data/lib/ronin/network/udp.rb +0 -21
- data/lib/ronin/network/unix.rb +0 -286
- data/lib/ronin/network.rb +0 -31
- data/lib/ronin/path.rb +0 -137
- data/lib/ronin/spec/ui/output.rb +0 -22
- data/lib/ronin/support/inflector.rb +0 -92
- data/lib/ronin/support/support.rb +0 -42
- data/lib/ronin/templates/erb.rb +0 -78
- data/lib/ronin/templates/template.rb +0 -169
- data/lib/ronin/templates.rb +0 -21
- data/lib/ronin/ui/output/helpers.rb +0 -296
- data/lib/ronin/ui/output/output.rb +0 -146
- data/lib/ronin/ui/output/terminal/color.rb +0 -124
- data/lib/ronin/ui/output/terminal/raw.rb +0 -103
- data/lib/ronin/ui/output/terminal.rb +0 -21
- data/lib/ronin/ui/output.rb +0 -21
- data/lib/ronin/ui/shell.rb +0 -286
- data/lib/ronin/wordlist.rb +0 -287
- data/spec/binary/hexdump/helpers/hexdumps/ascii.bin +0 -0
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_decimal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_hex_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_octal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/hexdump_repeated.txt +0 -6
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_ints.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_quads.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_decimal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_doubles.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_floats.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_ints.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_quads.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_hex_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_named_chars.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_bytes.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_ints.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_quads.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_octal_shorts.txt +0 -17
- data/spec/binary/hexdump/helpers/hexdumps/od_repeated.txt +0 -6
- data/spec/binary/hexdump/helpers/hexdumps/repeated.bin +0 -1
- data/spec/binary/hexdump/helpers/hexdumps.rb +0 -13
- data/spec/binary/hexdump/parser_spec.rb +0 -302
- data/spec/binary/struct_spec.rb +0 -496
- data/spec/binary/template_spec.rb +0 -414
- data/spec/extensions/enumerable_spec.rb +0 -24
- data/spec/extensions/file_spec.rb +0 -63
- data/spec/extensions/ip_addr_spec.rb +0 -203
- data/spec/extensions/kernel_spec.rb +0 -30
- data/spec/extensions/regexp_spec.rb +0 -482
- data/spec/extensions/resolv_spec.rb +0 -18
- data/spec/extensions/string_spec.rb +0 -179
- data/spec/formatting/binary/array_spec.rb +0 -26
- data/spec/formatting/binary/base64_spec.rb +0 -50
- data/spec/formatting/binary/float_spec.rb +0 -34
- data/spec/formatting/binary/integer_spec.rb +0 -166
- data/spec/formatting/binary/string_spec.rb +0 -197
- data/spec/formatting/digest/string_spec.rb +0 -82
- data/spec/formatting/html/integer_spec.rb +0 -66
- data/spec/formatting/html/string_spec.rb +0 -103
- data/spec/formatting/http/integer_spec.rb +0 -42
- data/spec/formatting/http/string_spec.rb +0 -76
- data/spec/formatting/sql/string_spec.rb +0 -75
- data/spec/formatting/text/array_spec.rb +0 -105
- data/spec/formatting/text/string_spec.rb +0 -162
- data/spec/fuzzing/extensions/string_spec.rb +0 -87
- data/spec/fuzzing/fuzzer_spec.rb +0 -109
- data/spec/fuzzing/fuzzing_spec.rb +0 -24
- data/spec/fuzzing/mutator_spec.rb +0 -112
- data/spec/fuzzing/repeater_spec.rb +0 -57
- data/spec/fuzzing/template_spec.rb +0 -54
- data/spec/mixin_spec.rb +0 -53
- data/spec/network/dns_spec.rb +0 -201
- data/spec/network/ftp_spec.rb +0 -81
- data/spec/network/http/http_spec.rb +0 -466
- data/spec/network/http/proxy_spec.rb +0 -148
- data/spec/network/network_spec.rb +0 -8
- data/spec/network/proxy_spec.rb +0 -121
- data/spec/network/shared/unix_server.rb +0 -31
- data/spec/network/smtp/email_spec.rb +0 -100
- data/spec/network/ssl_spec.rb +0 -70
- data/spec/network/tcp/proxy_spec.rb +0 -116
- data/spec/network/tcp/tcp_spec.rb +0 -273
- data/spec/network/telnet_spec.rb +0 -67
- data/spec/network/udp/udp_spec.rb +0 -271
- data/spec/network/unix_spec.rb +0 -183
- data/spec/path_spec.rb +0 -86
- data/spec/spec_helper.rb +0 -9
- data/spec/support/inflector_spec.rb +0 -22
- data/spec/support_spec.rb +0 -8
- data/spec/templates/classes/example_erb.rb +0 -11
- data/spec/templates/classes/example_template.rb +0 -35
- data/spec/templates/erb_spec.rb +0 -21
- data/spec/templates/helpers/data/includes/_relative.erb +0 -1
- data/spec/templates/helpers/data/templates/example.erb +0 -1
- data/spec/templates/helpers/data.rb +0 -9
- data/spec/templates/template_spec.rb +0 -54
- data/spec/ui/classes/test_shell.rb +0 -22
- data/spec/ui/output_spec.rb +0 -32
- data/spec/ui/shell_spec.rb +0 -83
- data/spec/wordlist_spec.rb +0 -151
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
4
|
+
#
|
|
5
|
+
# ronin-support is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# ronin-support is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
|
16
|
+
# along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'ipaddr'
|
|
20
|
+
|
|
21
|
+
module Ronin
|
|
22
|
+
module Support
|
|
23
|
+
module Network
|
|
24
|
+
class IPRange
|
|
25
|
+
#
|
|
26
|
+
# Represents CIDR notation IP ranges.
|
|
27
|
+
#
|
|
28
|
+
# ## Examples
|
|
29
|
+
#
|
|
30
|
+
# cidr = Network::IP::CIDR.new('10.0.0.1/24')
|
|
31
|
+
# cidr.each { |ip puts }
|
|
32
|
+
# # 10.0.0.0
|
|
33
|
+
# # 10.0.0.1
|
|
34
|
+
# # 10.0.0.2
|
|
35
|
+
# # ...
|
|
36
|
+
# # 10.0.0.254
|
|
37
|
+
# # 10.0.0.255
|
|
38
|
+
#
|
|
39
|
+
# @api public
|
|
40
|
+
#
|
|
41
|
+
# @since 1.0.0
|
|
42
|
+
#
|
|
43
|
+
class CIDR < IPAddr
|
|
44
|
+
|
|
45
|
+
include Enumerable
|
|
46
|
+
|
|
47
|
+
# The CIDR IP range string.
|
|
48
|
+
#
|
|
49
|
+
# @return [String]
|
|
50
|
+
attr_reader :string
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# Initializes and parses the CIDR range.
|
|
54
|
+
#
|
|
55
|
+
# @param [String] string
|
|
56
|
+
# The CIDR range string to parse.
|
|
57
|
+
#
|
|
58
|
+
# @param [Integer] family
|
|
59
|
+
# The address family for the CIDR range. This is mainly for
|
|
60
|
+
# backwards compatibility with `IPAddr#initialize`.
|
|
61
|
+
#
|
|
62
|
+
def initialize(string,family=Socket::AF_UNSPEC)
|
|
63
|
+
super(string,family)
|
|
64
|
+
|
|
65
|
+
@string = string
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
#
|
|
69
|
+
# Alias for {#initialize new}.
|
|
70
|
+
#
|
|
71
|
+
# @param [String] string
|
|
72
|
+
# The CIDR range string to parse.
|
|
73
|
+
#
|
|
74
|
+
# @return [CIDR]
|
|
75
|
+
# The parsed CIDR range.
|
|
76
|
+
#
|
|
77
|
+
# @see #initialize
|
|
78
|
+
#
|
|
79
|
+
def self.parse(string)
|
|
80
|
+
new(string)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Socket families and IP address sizes
|
|
84
|
+
SIZES = {
|
|
85
|
+
Socket::AF_INET => 32,
|
|
86
|
+
Socket::AF_INET6 => 128
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
# Socket families and IP address masks
|
|
90
|
+
MASKS = {
|
|
91
|
+
Socket::AF_INET => IN4MASK,
|
|
92
|
+
Socket::AF_INET6 => IN6MASK
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
#
|
|
96
|
+
# Calcualtes the CIDR range between two IP addresses.
|
|
97
|
+
#
|
|
98
|
+
# @param [String, IPAddr] first
|
|
99
|
+
# The first IP address in the CIDR range.
|
|
100
|
+
#
|
|
101
|
+
# @param [String, IPAddr] last
|
|
102
|
+
# The last IP Address in the CIDR range.
|
|
103
|
+
#
|
|
104
|
+
# @return [CIDR]
|
|
105
|
+
# The CIDR range between the two IP addresses.
|
|
106
|
+
#
|
|
107
|
+
# @example
|
|
108
|
+
# IPRange::CIDR.range("1.1.1.1","1.1.1.255")
|
|
109
|
+
# # => #<Ronin::Support::Network::IPRange::CIDR: 1.1.1.1/24>
|
|
110
|
+
#
|
|
111
|
+
def self.range(first,last)
|
|
112
|
+
first_ip = case first
|
|
113
|
+
when IPAddr then first
|
|
114
|
+
else IPAddr.new(first)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
last_ip = case last
|
|
118
|
+
when IPAddr then last
|
|
119
|
+
else IPAddr.new(last)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
unless (first_ip.family == last_ip.family)
|
|
123
|
+
raise(ArgumentError,"must specify two IPv4 or IPv6 addresses: #{first.inspect} #{last.inspect}")
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
num_bits = SIZES.fetch(first_ip.family)
|
|
127
|
+
mask = MASKS.fetch(first_ip.family)
|
|
128
|
+
diff_bits = first_ip.to_i ^ last_ip.to_i
|
|
129
|
+
|
|
130
|
+
if diff_bits != 0
|
|
131
|
+
prefix_length = num_bits - Math.log2(diff_bits).ceil
|
|
132
|
+
|
|
133
|
+
return new("#{first_ip}/#{prefix_length}")
|
|
134
|
+
else
|
|
135
|
+
return new(first_ip.to_s)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
#
|
|
140
|
+
# Enumerates over each IP address that is included in the addresses
|
|
141
|
+
# netmask. Supports both IPv4 and IPv6 addresses.
|
|
142
|
+
#
|
|
143
|
+
# @param [String] string
|
|
144
|
+
# The CIDR range string to parse and enumerate over.
|
|
145
|
+
#
|
|
146
|
+
# @yield [ip]
|
|
147
|
+
# The block which will be passed every IP address covered be the
|
|
148
|
+
# netmask of the IPAddr object.
|
|
149
|
+
#
|
|
150
|
+
# @yieldparam [String] ip
|
|
151
|
+
# An IP address.
|
|
152
|
+
#
|
|
153
|
+
# @example
|
|
154
|
+
# IPRange::CIDR.each('10.0.0.1/24') { |ip| puts ip }
|
|
155
|
+
# # 10.0.0.1
|
|
156
|
+
# # 10.0.0.2
|
|
157
|
+
# # ...
|
|
158
|
+
# # 10.0.0.254
|
|
159
|
+
# # 10.0.0.255
|
|
160
|
+
#
|
|
161
|
+
def self.each(string,&block)
|
|
162
|
+
new(string).each(&block)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
#
|
|
166
|
+
# Iterates over each IP address that is included in the addresses
|
|
167
|
+
# netmask. Supports both IPv4 and IPv6 addresses.
|
|
168
|
+
#
|
|
169
|
+
# @yield [ip]
|
|
170
|
+
# The block which will be passed every IP address covered be the
|
|
171
|
+
# netmask of the IPAddr object.
|
|
172
|
+
#
|
|
173
|
+
# @yieldparam [String] ip
|
|
174
|
+
# An IP address.
|
|
175
|
+
#
|
|
176
|
+
# @return [self]
|
|
177
|
+
#
|
|
178
|
+
# @note
|
|
179
|
+
# This method will skip IPv4 addresses ending in `.0` or `.255`.
|
|
180
|
+
#
|
|
181
|
+
# @example
|
|
182
|
+
# cidr = IPAddr.new('10.1.1.1/24')
|
|
183
|
+
# cidr.each { |ip| puts ip }
|
|
184
|
+
# # 10.0.0.1
|
|
185
|
+
# # 10.0.0.2
|
|
186
|
+
# # ...
|
|
187
|
+
# # 10.0.0.253
|
|
188
|
+
# # 10.0.0.254
|
|
189
|
+
#
|
|
190
|
+
def each
|
|
191
|
+
return enum_for(__method__) unless block_given?
|
|
192
|
+
|
|
193
|
+
family_mask = MASKS[@family]
|
|
194
|
+
octet_mask = if ipv6? then 0xffff
|
|
195
|
+
else 0xff
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
(0..((~@mask_addr) & family_mask)).each do |i|
|
|
199
|
+
ip_uint = (@addr | i)
|
|
200
|
+
|
|
201
|
+
# skip IPv4 addresses ending in .0 or .255
|
|
202
|
+
if (ipv4? && ((ip_uint & 0xff) == 0 || (ip_uint & 0xff) == 0xff))
|
|
203
|
+
next
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
yield _to_string(ip_uint)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
return self
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
#
|
|
213
|
+
# The first IP address of the CIDR Range.
|
|
214
|
+
#
|
|
215
|
+
# @return [String]
|
|
216
|
+
#
|
|
217
|
+
def first
|
|
218
|
+
_to_string(@addr)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
#
|
|
222
|
+
# The last IP address of the CIDR range.
|
|
223
|
+
#
|
|
224
|
+
# @return [String]
|
|
225
|
+
#
|
|
226
|
+
def last
|
|
227
|
+
_to_string(@addr | ~@mask_addr)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
#
|
|
231
|
+
# Converts the CIDR range back into a String.
|
|
232
|
+
#
|
|
233
|
+
# @return [String]
|
|
234
|
+
#
|
|
235
|
+
def to_s
|
|
236
|
+
@string
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
#
|
|
240
|
+
# Inspects the CIDR range.
|
|
241
|
+
#
|
|
242
|
+
# @return [String]
|
|
243
|
+
#
|
|
244
|
+
def inspect
|
|
245
|
+
"#<#{self.class}: #{@string}>"
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
4
|
+
#
|
|
5
|
+
# ronin-support is free software: you can redistribute it and/or modify
|
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
# (at your option) any later version.
|
|
9
|
+
#
|
|
10
|
+
# ronin-support is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU Lesser General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
|
16
|
+
# along with ronin-support. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require 'combinatorics/list_comprehension'
|
|
20
|
+
|
|
21
|
+
module Ronin
|
|
22
|
+
module Support
|
|
23
|
+
module Network
|
|
24
|
+
class IPRange
|
|
25
|
+
#
|
|
26
|
+
# Represents an IP-glob range.
|
|
27
|
+
#
|
|
28
|
+
# ## Examples
|
|
29
|
+
#
|
|
30
|
+
# ip_range = IPRange::Glob.new('10.0.1-3.*/24')
|
|
31
|
+
# ip_range.each { |ip| puts ip }
|
|
32
|
+
# # 10.0.1.1
|
|
33
|
+
# # 10.0.1.2
|
|
34
|
+
# # ...
|
|
35
|
+
# # 10.0.1.253
|
|
36
|
+
# # 10.0.1.254
|
|
37
|
+
# # ...
|
|
38
|
+
# # 10.0.2.1
|
|
39
|
+
# # 10.0.2.2
|
|
40
|
+
# # ...
|
|
41
|
+
# # 10.0.2.253
|
|
42
|
+
# # 10.0.2.254
|
|
43
|
+
# # ...
|
|
44
|
+
# # 10.0.3.1
|
|
45
|
+
# # 10.0.3.2
|
|
46
|
+
# # ...
|
|
47
|
+
# # 10.0.3.253
|
|
48
|
+
# # 10.0.3.254
|
|
49
|
+
#
|
|
50
|
+
# @api public
|
|
51
|
+
#
|
|
52
|
+
# @since 1.0.0
|
|
53
|
+
#
|
|
54
|
+
class Glob
|
|
55
|
+
|
|
56
|
+
include Enumerable
|
|
57
|
+
|
|
58
|
+
# The IP glob string.
|
|
59
|
+
#
|
|
60
|
+
# @return [String]
|
|
61
|
+
attr_reader :string
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Initializes and parses the IP-glob range.
|
|
65
|
+
#
|
|
66
|
+
# @param [String] string
|
|
67
|
+
# The IP-glob string to parse.
|
|
68
|
+
#
|
|
69
|
+
def initialize(string)
|
|
70
|
+
@string = string
|
|
71
|
+
|
|
72
|
+
if @string.include?(':') # IPv6
|
|
73
|
+
@version = 6
|
|
74
|
+
@separator = ':'
|
|
75
|
+
@base = 16
|
|
76
|
+
@formatter = method(:format_ipv6_address)
|
|
77
|
+
else # IPv4
|
|
78
|
+
@version = 4
|
|
79
|
+
@separator = '.'
|
|
80
|
+
@base = 10
|
|
81
|
+
@formatter = method(:format_ipv4_address)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
@ranges = @string.split(@separator).map do |segment|
|
|
85
|
+
case segment
|
|
86
|
+
when '*' then (1..254)
|
|
87
|
+
when /,/ then parse_list(segment)
|
|
88
|
+
when /-/ then parse_range(segment)
|
|
89
|
+
else [segment]
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
#
|
|
95
|
+
# Alias for {#initialize new}.
|
|
96
|
+
#
|
|
97
|
+
# @param [String] string
|
|
98
|
+
# The IP-glob string to parse.
|
|
99
|
+
#
|
|
100
|
+
# @return [Glob]
|
|
101
|
+
# The parsed IP-glob range.
|
|
102
|
+
#
|
|
103
|
+
# @see #initialize
|
|
104
|
+
#
|
|
105
|
+
def self.parse(string)
|
|
106
|
+
new(string)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
#
|
|
110
|
+
# Enumerates over the IP-glob range.
|
|
111
|
+
#
|
|
112
|
+
# @param [String] string
|
|
113
|
+
# The IP-glob string to parse and enumerate over.
|
|
114
|
+
#
|
|
115
|
+
# @yield [ip]
|
|
116
|
+
# The block which will be passed each IP address contained within
|
|
117
|
+
# the IP address range.
|
|
118
|
+
#
|
|
119
|
+
# @yieldparam [String] ip
|
|
120
|
+
# An IP address within the IP address range.
|
|
121
|
+
#
|
|
122
|
+
# @return [self]
|
|
123
|
+
#
|
|
124
|
+
# @example Enumerate through a IPv4 glob range:
|
|
125
|
+
# IPRange::Glob.each('10.0.1-3.*') { |ip| puts ip }
|
|
126
|
+
# # 10.0.1.1
|
|
127
|
+
# # 10.0.1.2
|
|
128
|
+
# # ...
|
|
129
|
+
# # 10.0.1.253
|
|
130
|
+
# # 10.0.1.254
|
|
131
|
+
# # ...
|
|
132
|
+
# # 10.0.2.1
|
|
133
|
+
# # 10.0.2.2
|
|
134
|
+
# # ...
|
|
135
|
+
# # 10.0.2.253
|
|
136
|
+
# # 10.0.2.254
|
|
137
|
+
# # ...
|
|
138
|
+
# # 10.0.3.1
|
|
139
|
+
# # 10.0.3.2
|
|
140
|
+
# # ...
|
|
141
|
+
# # 10.0.3.253
|
|
142
|
+
# # 10.0.3.254
|
|
143
|
+
#
|
|
144
|
+
# @example Enumerate through a globbed IPv6 range:
|
|
145
|
+
# IPRange::Glob.each('::ff::02-0a::c3') { |ip| puts ip }
|
|
146
|
+
#
|
|
147
|
+
def self.each(string,&block)
|
|
148
|
+
new(string).each(&block)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
#
|
|
152
|
+
# Determines if the IP-glob range is IPv4.
|
|
153
|
+
#
|
|
154
|
+
# @return [Boolean]
|
|
155
|
+
#
|
|
156
|
+
def ipv4?
|
|
157
|
+
@version == 4
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
#
|
|
161
|
+
# Determines if the IP-glob range is IPv6.
|
|
162
|
+
#
|
|
163
|
+
# @return [Boolean]
|
|
164
|
+
#
|
|
165
|
+
def ipv6?
|
|
166
|
+
@version == 6
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
#
|
|
170
|
+
# Enumerates over the IP-glob range.
|
|
171
|
+
#
|
|
172
|
+
# @yield [ip]
|
|
173
|
+
# The block which will be passed each IP address contained within
|
|
174
|
+
# the IP address range.
|
|
175
|
+
#
|
|
176
|
+
# @yieldparam [String] ip
|
|
177
|
+
# An IP address within the IP address range.
|
|
178
|
+
#
|
|
179
|
+
# @return [self]
|
|
180
|
+
#
|
|
181
|
+
# @example Enumerate through a IPv4 glob range:
|
|
182
|
+
# ip_range = IPRange::Glob.new('10.0.1-3.*')
|
|
183
|
+
# ip_range.each { |ip| puts ip }
|
|
184
|
+
# # 10.0.1.1
|
|
185
|
+
# # 10.0.1.2
|
|
186
|
+
# # ...
|
|
187
|
+
# # 10.0.1.253
|
|
188
|
+
# # 10.0.1.254
|
|
189
|
+
# # ...
|
|
190
|
+
# # 10.0.2.1
|
|
191
|
+
# # 10.0.2.2
|
|
192
|
+
# # ...
|
|
193
|
+
# # 10.0.2.253
|
|
194
|
+
# # 10.0.2.254
|
|
195
|
+
# # ...
|
|
196
|
+
# # 10.0.3.1
|
|
197
|
+
# # 10.0.3.2
|
|
198
|
+
# # ...
|
|
199
|
+
# # 10.0.3.253
|
|
200
|
+
# # 10.0.3.254
|
|
201
|
+
#
|
|
202
|
+
# @example Enumerate through a globbed IPv6 range:
|
|
203
|
+
# ip_range = IPRange::Glob.new('::ff::02-0a::c3')
|
|
204
|
+
# ip_range.each { |ip| puts ip }
|
|
205
|
+
#
|
|
206
|
+
def each
|
|
207
|
+
return enum_for(__method__) unless block_given?
|
|
208
|
+
|
|
209
|
+
# cycle through the address ranges
|
|
210
|
+
@ranges.comprehension do |address|
|
|
211
|
+
yield @formatter.call(address)
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
return self
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
#
|
|
218
|
+
# Converts the IP-glob range back into a String.
|
|
219
|
+
#
|
|
220
|
+
# @return [String]
|
|
221
|
+
#
|
|
222
|
+
def to_s
|
|
223
|
+
@string
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
#
|
|
227
|
+
# Inspects the IP-glob range.
|
|
228
|
+
#
|
|
229
|
+
# @return [String]
|
|
230
|
+
#
|
|
231
|
+
def inspect
|
|
232
|
+
"#<#{self.class}: #{@string}>"
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
private
|
|
236
|
+
|
|
237
|
+
#
|
|
238
|
+
# Parses a comma separated list of numbers or ranges (ex: `i,j,k-l`).
|
|
239
|
+
#
|
|
240
|
+
# @param [String] list
|
|
241
|
+
# The string to parse.
|
|
242
|
+
#
|
|
243
|
+
# @return [Array<Integer, Range>]
|
|
244
|
+
# The parsed list.
|
|
245
|
+
#
|
|
246
|
+
def parse_list(list)
|
|
247
|
+
list.split(',').flat_map do |octet|
|
|
248
|
+
if octet.include?('-')
|
|
249
|
+
# i-j range
|
|
250
|
+
parse_range(octet)
|
|
251
|
+
else
|
|
252
|
+
octet.to_i(@base)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
#
|
|
258
|
+
# Parses a range of numbers. (ex: `i-j`).
|
|
259
|
+
#
|
|
260
|
+
# @param [String] range
|
|
261
|
+
# The string to parse.
|
|
262
|
+
#
|
|
263
|
+
# @return [Range<Integer,Integer>]
|
|
264
|
+
# The parsed range.
|
|
265
|
+
#
|
|
266
|
+
def parse_range(range)
|
|
267
|
+
start, stop = range.split('-',2)
|
|
268
|
+
start = start.to_i(@base)
|
|
269
|
+
stop = stop.to_i(@base)
|
|
270
|
+
|
|
271
|
+
(start..stop).to_a
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
#
|
|
275
|
+
# Formats an IPv4 address.
|
|
276
|
+
#
|
|
277
|
+
# @param [Array<String, Integer>] parts
|
|
278
|
+
# The address parts to format.
|
|
279
|
+
#
|
|
280
|
+
# @return [String]
|
|
281
|
+
# The formatted IPv4 address.
|
|
282
|
+
#
|
|
283
|
+
def format_ipv4_address(parts)
|
|
284
|
+
parts.join('.')
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
#
|
|
288
|
+
# Formats an IPv6 address.
|
|
289
|
+
#
|
|
290
|
+
# @param [Array<String, Integer>] parts
|
|
291
|
+
# The address parts to format.
|
|
292
|
+
#
|
|
293
|
+
# @return [String]
|
|
294
|
+
# The formatted IPv6 address.
|
|
295
|
+
#
|
|
296
|
+
def format_ipv6_address(parts)
|
|
297
|
+
parts.map { |part|
|
|
298
|
+
case part
|
|
299
|
+
when Integer then part.to_s(16)
|
|
300
|
+
else part
|
|
301
|
+
end
|
|
302
|
+
}.join(':')
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|