# frozen_string_literal: true
#
# Copyright (c) 2006-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
#
# Ronin is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ronin is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ronin. If not, see .
#
require 'ronin/support/text/patterns'
module Ronin
class CLI
#
# Adds pattern options to a command.
#
# ## Options
#
# -N, --number Searches for all numbers
# -X, --hex-number Searches for all hexadecimal numbers
# -V, --version-number Searches for all version numbers
# -w, --word Searches for all words
# --mac-addr Searches for all MAC addresses
# -4, --ipv4-addr Searches for all IPv4 addresses
# -6, --ipv6-addr Searches for all IPv6 addresses
# -I, --ip Searches for all IP addresses
# -H, --host Searches for all host names
# -D, --domain Searches for all domain names
# --uri Searches for all URIs
# -U, --url Searches for all URLs
# --user-name Searches for all user names
# -E, --email-addr Searches for all email addresses
# --obfuscated-email-addr Searches for all obfuscated email addresses
# --phone-number Searches for all phone numbers
# --ssn Searches for all Social Security Numbers (SSNs)
# --amex-cc Searches for all AMEX Credit Card numbers
# --discover-cc Searches for all Discover Card numbers
# --mastercard-cc Searches for all MasterCard numbers
# --visa-cc Searches for all VISA Credit Card numbers
# --visa-mastercard-cc Searches for all VISA MasterCard numbers
# --cc Searches for all Credit Card numbers
# --file-name Searches for all file names
# --dir-name Searches for all directory names
# --relative-unix-path Searches for all relative UNIX paths
# --absolute-unix-path Searches for all absolute UNIX paths
# --unix-path Searches for all UNIX paths
# --relative-windows-path Searches for all relative Windows paths
# --absolute-windows-path Searches for all absolute Windows paths
# --windows-path Searches for all Windows paths
# --relative-path Searches for all relative paths
# --absolute-path Searches for all absolute paths
# -P, --path Searches for all paths
# --variable-name Searches for all variable names
# --function-name Searches for all function names
# --md5 Searches for all MD5 hashes
# --sha1 Searches for all SHA1 hashes
# --sha256 Searches for all SHA256 hashes
# --sha512 Searches for all SHA512 hashes
# --hash Searches for all hashes
# --ssh-private-key Searches for all SSH private key data
# --ssh-public-key Searches for all SSH public key data
# --private-key Searches for all private key data
# --rsa-public-key Searches for all RSA public key data
# --dsa-public-key Searches for all DSA public key data
# --ec-public-key Searches for all EC public key data
# --public-key Searches for all public key data
# --aws-access-key-id Searches for all AWS access key IDs
# --aws-secret-access-key Searches for all AWS secret access keys
# -A, --api-key Searches for all API keys
# --single-quoted-string Searches for all single-quoted strings
# --double-quoted-string Searches for all double-quoted strings
# -S, --string Searches for all quoted strings
# -B, --base64 Searches for all Base64 strings
# -e, --regexp /REGEXP/ Custom regular expression to search for
#
module PatternOptions
include Support::Text::Patterns
#
# Adds pattern options to the command.
#
# @param [Class] command
# The command including {PatternOptions}.
#
def self.included(command)
define_numeric_options(command)
define_language_options(command)
define_network_options(command)
define_pii_options(command)
define_file_system_options(command)
define_source_code_options(command)
define_crypto_options(command)
define_credentials_options(command)
command.option :regexp, short: '-e',
value: {type: Regexp},
desc: 'Custom regular expression to search for' do |regexp|
@pattern = regexp
end
end
#
# Defines numeric pattern options.
#
# @param [Class] command
# The command including {PatternOptions}.
#
def self.define_numeric_options(command)
command.option :number, short: '-N',
desc: 'Searches for all numbers' do
@pattern = NUMBER
end
command.option :hex_number, short: '-X',
desc: 'Searches for all hexadecimal numbers' do
@pattern = HEX_NUMBER
end
command.option :version_number, short: '-V',
desc: 'Searches for all version numbers' do
@pattern = VERSION_NUMBER
end
end
#
# Defines language pattern options.
#
# @param [Class] command
# The command including {PatternOptions}.
#
def self.define_language_options(command)
command.option :word, short: '-w',
desc: 'Searches for all words' do
@pattern = WORD
end
end
#
# Defines network pattern options.
#
# @param [Class] command
# The command including {PatternOptions}.
#
def self.define_network_options(command)
command.option :mac_addr, desc: 'Searches for all MAC addresses' do
@pattern = MAC_ADDR
end
command.option :ipv4_addr, short: '-4',
desc: 'Searches for all IPv4 addresses' do
@pattern = IPV4_ADDR
end
command.option :ipv6_addr, short: '-6',
desc: 'Searches for all IPv6 addresses' do
@pattern = IPV6_ADDR
end
command.option :ip, short: '-I',
desc: 'Searches for all IP addresses' do
@pattern = IP
end
command.option :host, short: '-H',
desc: 'Searches for all host names' do
@pattern = HOST_NAME
end
command.option :domain, short: '-D',
desc: 'Searches for all domain names' do
@pattern = DOMAIN
end
command.option :uri, desc: 'Searches for all URIs' do
@pattern = URI
end
command.option :url, short: '-U',
desc: 'Searches for all URLs' do
@pattern = URL
end
end
#
# Defines PII pattern options.
#
# @param [Class] command
# The command including {PatternOptions}.
#
def self.define_pii_options(command)
command.option :user_name, desc: 'Searches for all user names' do
@pattern = USER_NAME
end
command.option :email_addr, short: '-E',
desc: 'Searches for all email addresses' do
@pattern = EMAIL_ADDRESS
end
command.option :obfuscated_email_addr, desc: 'Searches for all obfuscated email addresses' do
@pattern = OBFUSCATED_EMAIL_ADDRESS
end
command.option :phone_number, desc: 'Searches for all phone numbers' do
@pattern = PHONE_NUMBER
end
command.option :ssn, desc: 'Searches for all Social Security Numbers (SSNs)' do
@pattern = SSN
end
command.option :amex_cc, desc: 'Searches for all AMEX Credit Card numbers' do
@pattern = AMEX_CC
end
command.option :discover_cc, desc: 'Searches for all Discover Card numbers' do
@pattern = DISCOVER_CC
end
command.option :mastercard_cc, desc: 'Searches for all MasterCard numbers' do
@pattern = MASTERCARD_CC
end
command.option :visa_cc, desc: 'Searches for all VISA Credit Card numbers' do
@pattern = VISA_CC
end
command.option :visa_mastercard_cc, desc: 'Searches for all VISA MasterCard numbers' do
@pattern = VISA_MASTERCARD_CC
end
command.option :cc, desc: 'Searches for all Credit Card numbers' do
@pattern = CC
end
end
#
# Defines File System pattern options.
#
# @param [Class] command
# The command including {PatternOptions}.
#
def self.define_file_system_options(command)
command.option :file_name, desc: 'Searches for all file names' do
@pattern = FILE_NAME
end
command.option :dir_name, desc: 'Searches for all directory names' do
@pattern = DIR_NAME
end
command.option :relative_unix_path, desc: 'Searches for all relative UNIX paths' do
@pattern = RELATIVE_UNIX_PATH
end
command.option :absolute_unix_path, desc: 'Searches for all absolute UNIX paths' do
@pattern = ABSOLUTE_UNIX_PATH
end
command.option :unix_path, desc: 'Searches for all UNIX paths' do
@pattern = UNIX_PATH
end
command.option :relative_windows_path, desc: 'Searches for all relative Windows paths' do
@pattern = RELATIVE_WINDOWS_PATH
end
command.option :absolute_windows_path, desc: 'Searches for all absolute Windows paths' do
@pattern = ABSOLUTE_WINDOWS_PATH
end
command.option :windows_path, desc: 'Searches for all Windows paths' do
@pattern = WINDOWS_PATH
end
command.option :relative_path, desc: 'Searches for all relative paths' do
@pattern = RELATIVE_PATH
end
command.option :absolute_path, desc: 'Searches for all absolute paths' do
@pattern = ABSOLUTE_PATH
end
command.option :path, short: '-P',
desc: 'Searches for all paths' do
@pattern = PATH
end
end
#
# Defines source code pattern options.
#
# @param [Class] command
# The command including {PatternOptions}.
#
def self.define_source_code_options(command)
command.option :identifier, desc: 'Searches for all identifier names' do
@pattern = IDENTIFIER
end
command.option :variable_name, desc: 'Searches for all variable names' do
@pattern = VARIABLE_NAME
end
command.option :variable_assignment, desc: 'Searches for all variable assignments' do
@pattern = VARIABLE_ASSIGNMENT
end
command.option :function_name, desc: 'Searches for all function names' do
@pattern = FUNCTION_NAME
end
command.option :single_quoted_string, desc: 'Searches for all single-quoted strings' do
@pattern = SINGLE_QUOTED_STRING
end
command.option :double_quoted_string, desc: 'Searches for all double-quoted strings' do
@pattern = DOUBLE_QUOTED_STRING
end
command.option :string, short: '-S',
desc: 'Searches for all quoted strings' do
@pattern = STRING
end
command.option :base64, short: '-B',
desc: 'Searches for all Base64 strings' do
@pattern = BASE64
end
command.option :c_comment, desc: 'Searches for all C comments' do
@pattern = C_COMMENT
end
command.option :cpp_comment, desc: 'Searches for all C++ comments' do
@pattern = CPP_COMMENT
end
command.option :java_comment, desc: 'Searches for all Java comments' do
@pattern = JAVA_COMMENT
end
command.option :javascript_comment, desc: 'Searches for all JavaScript comments' do
@pattern = JAVASCRIPT_COMMENT
end
command.option :shell_comment, desc: 'Searches for all Shell comments' do
@pattern = SHELL_COMMENT
end
command.option :ruby_comment, desc: 'Searches for all Ruby comments' do
@pattern = RUBY_COMMENT
end
command.option :python_comment, desc: 'Searches for all Python comments' do
@pattern = PYTHON_COMMENT
end
command.option :comment, desc: 'Searches for all comments' do
@pattern = COMMENT
end
end
#
# Defines cryptographic pattern options.
#
# @param [Class] command
# The command including {PatternOptions}.
#
def self.define_crypto_options(command)
command.option :md5, desc: 'Searches for all MD5 hashes' do
@pattern = MD5
end
command.option :sha1, desc: 'Searches for all SHA1 hashes' do
@pattern = SHA1
end
command.option :sha256, desc: 'Searches for all SHA256 hashes' do
@pattern = SHA256
end
command.option :sha512, desc: 'Searches for all SHA512 hashes' do
@pattern = SHA512
end
command.option :hash, desc: 'Searches for all hashes' do
@pattern = HASH
end
command.option :ssh_public_key, desc: 'Searches for all SSH public key data' do
@pattern = SSH_PUBLIC_KEY
end
command.option :public_key, desc: 'Searches for all public key data' do
@pattern = PUBLIC_KEY
end
end
#
# Defines credentials pattern options.
#
# @param [Class] command
# The command including {PatternOptions}.
#
def self.define_credentials_options(command)
command.option :ssh_private_key, desc: 'Searches for all SSH private key data' do
@pattern = SSH_PRIVATE_KEY
end
command.option :dsa_private_key, desc: 'Searches for all DSA private key data' do
@pattern = DSA_PRIVATE_KEY
end
command.option :ec_private_key, desc: 'Searches for all EC private key data' do
@pattern = EC_PRIVATE_KEY
end
command.option :rsa_private_key, desc: 'Searches for all RSA private key data' do
@pattern = RSA_PRIVATE_KEY
end
command.option :private_key, short: '-K',
desc: 'Searches for all private key data' do
@pattern = PRIVATE_KEY
end
command.option :aws_access_key_id, desc: 'Searches for all AWS access key IDs' do
@pattern = AWS_ACCESS_KEY_ID
end
command.option :aws_secret_access_key, desc: 'Searches for all AWS secret access keys' do
@pattern = AWS_SECRET_ACCESS_KEY
end
command.option :api_key, short: '-A',
desc: 'Searches for all API keys' do
@pattern = API_KEY
end
end
# The pattern to search for.
#
# @return [Regexp, nil]
attr_reader :pattern
end
end
end