diff --git a/README.md b/README.md index 14c97a314..c9486bd40 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Commands: completion decode, dec decrypt + defang dns dns-proxy email-addr @@ -508,6 +509,13 @@ $ ronin refang hxxps://www[.]evil[.]com/foo/bar/baz https://www.evil.com/foo/bar/baz ``` +Defangs a URL: + +```shell +$ ronin defang https://www.evil.com/foo/bar/baz +hxxps://www[.]evil[.]com/foo/bar/baz +``` + Query the ASN of an IP address: ```shell diff --git a/gemspec.yml b/gemspec.yml index 191ff9002..15ac19089 100644 --- a/gemspec.yml +++ b/gemspec.yml @@ -49,6 +49,7 @@ generated_files: - man/ronin-completion.1 - man/ronin-decode.1 - man/ronin-decrypt.1 + - man/ronin-defang.1 - man/ronin-dns.1 - man/ronin-dns-proxy.1 - man/ronin-email-addr.1 diff --git a/lib/ronin/cli/commands/defang.rb b/lib/ronin/cli/commands/defang.rb new file mode 100644 index 000000000..65ab6f514 --- /dev/null +++ b/lib/ronin/cli/commands/defang.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true +# +# Copyright (c) 2006-2024 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_relative '../value_processor_command' + +require 'ronin/support/network/defang' + +module Ronin + class CLI + module Commands + # + # Defangs a URL, hostname, or IP address. + # + # ## Usage + # + # ronin defang [options] [{URL | HOST | IP} ...] + # + # ## Options + # + # -f, --file FILE Optional file to read values from + # -h, --help Print help information + # + # ## Arguments + # + # [URL | HOST | IP ...] A URL, hostname, or IP address + # + # ## Examples + # + # ronin defang https://www.evil.com/foo/bar/baz + # ronin defang www.example.com + # ronin defang 192.168.1.1 + # ronin defang --file urls.txt + # + # @since 2.2.0 + # + class Defang < ValueProcessorCommand + + usage '[options] [{URL | HOST | IP} ...]' + + argument :value, required: false, + repeats: true, + usage: 'URL | HOST | IP', + desc: 'A URL, hostname, or IP address' + + examples [ + 'https://www.evil.com/foo/bar/baz', + 'www.example.com', + '192.168.1.1', + '--file urls.txt' + ] + + description 'Defangs a URLs, hostnames, or IP addresses' + + man_page 'ronin-defang.1' + + # + # Defangs a URL, hostname, or IP address. + # + # @param [String] value + # The value to defang. + # + def process_value(value) + puts Support::Network::Defang.defang(value) + end + + end + end + end +end diff --git a/man/ronin-defang.1.md b/man/ronin-defang.1.md new file mode 100644 index 000000000..5cf057755 --- /dev/null +++ b/man/ronin-defang.1.md @@ -0,0 +1,59 @@ +# ronin-defang 1 "2025-01-01" Ronin "User Manuals" + +## NAME + +ronin-defang - Defangs a URLs, hostnames, or IP addresses + +## SYNOPSIS + +`ronin defang` [*options*] [{*URL* \| *HOST* \| *IP*} ...] + +## DESCRIPTION + +Defangs URL(s), hostname(s), or IP address(es). + +## ARGUMENTS + +*URL* +: A URL argument to defang + (ex: `https://www.evil.com/foo/bar/baz`). + +*HOST* +: A hostname argument to defang (ex: `www.example.com`). + +*IP* +: A IP address argument to defang (ex: `192.168.1.1`). + +## OPTIONS + +`-f`, `--file` *FILE* +: The optional file to read values from. + +`-h`, `--help` +: Print help information. + +## EXAMPLES + +Defangs a URL: + + ronin defang https://www.evil.com/foo/bar/baz + +Defangs a hostname: + + ronin defang www.example.com + +Defangs a IP address: + + ronin defang 192.168.1.1 + +Defangs a file of URLs, hostnames, or IP addresses: + + ronin defang --file urls.txt + +## AUTHOR + +Postmodern + +## SEE ALSO + +[ronin-refang](ronin-refang.1.md) diff --git a/spec/cli/commands/defang_spec.rb b/spec/cli/commands/defang_spec.rb new file mode 100644 index 000000000..611b27ae2 --- /dev/null +++ b/spec/cli/commands/defang_spec.rb @@ -0,0 +1,42 @@ +require 'spec_helper' +require 'ronin/cli/commands/defang' +require_relative 'man_page_example' + +describe Ronin::CLI::Commands::Defang do + include_examples "man_page" + + describe "#process_value" do + context "when given a refanged URL value" do + let(:url) { 'https://www.evil.com/foo/bar/baz' } + let(:defanged) { 'hxxps[://]www[.]evil[.]com/foo/bar/baz' } + + it "must print the defanged URL" do + expect { + subject.process_value(url) + }.to output("#{defanged}#{$/}").to_stdout + end + end + + context "when given a refanged hostname value" do + let(:host) { 'www.example.com' } + let(:defanged) { 'www[.]example[.]com' } + + it "must print the defanged hostname" do + expect { + subject.process_value(host) + }.to output("#{defanged}#{$/}").to_stdout + end + end + + context "when given a refanged IP address value" do + let(:ip) { '192.168.1.1' } + let(:defanged) { '192[.]168[.]1[.]1' } + + it "must print the defanged IP address" do + expect { + subject.process_value(ip) + }.to output("#{defanged}#{$/}").to_stdout + end + end + end +end