ronin-web 1.0.2 → 2.0.0.rc1
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 +3 -2
- data/.gitignore +1 -0
- data/.rubocop.yml +5 -0
- data/ChangeLog.md +46 -1
- data/Gemfile +25 -12
- data/README.md +257 -51
- data/Rakefile +9 -0
- data/data/completions/ronin-web +203 -0
- data/gemspec.yml +18 -5
- data/lib/ronin/web/cli/browser_options.rb +92 -0
- data/lib/ronin/web/cli/browser_shell.rb +448 -0
- data/lib/ronin/web/cli/command.rb +1 -1
- data/lib/ronin/web/cli/commands/browser.rb +373 -0
- data/lib/ronin/web/cli/commands/completion.rb +63 -0
- data/lib/ronin/web/cli/commands/diff.rb +60 -8
- data/lib/ronin/web/cli/commands/html.rb +21 -33
- data/lib/ronin/web/cli/commands/irb.rb +1 -1
- data/lib/ronin/web/cli/commands/new/{webapp.rb → app.rb} +8 -8
- data/lib/ronin/web/cli/commands/new/nokogiri.rb +4 -4
- data/lib/ronin/web/cli/commands/new/server.rb +1 -1
- data/lib/ronin/web/cli/commands/new/spider.rb +1 -1
- data/lib/ronin/web/cli/commands/new.rb +5 -3
- data/lib/ronin/web/cli/commands/reverse_proxy.rb +1 -1
- data/lib/ronin/web/cli/commands/screenshot.rb +186 -0
- data/lib/ronin/web/cli/commands/server.rb +1 -1
- data/lib/ronin/web/cli/commands/session_cookie.rb +265 -0
- data/lib/ronin/web/cli/commands/spider.rb +61 -467
- data/lib/ronin/web/cli/commands/user_agent.rb +177 -0
- data/lib/ronin/web/cli/commands/vulns.rb +463 -0
- data/lib/ronin/web/cli/commands/wordlist.rb +484 -0
- data/lib/ronin/web/cli/commands/xml.rb +149 -0
- data/lib/ronin/web/cli/js_shell.rb +69 -0
- data/lib/ronin/web/cli/ruby_shell.rb +1 -1
- data/lib/ronin/web/cli/spider_options.rb +919 -0
- data/lib/ronin/web/cli.rb +3 -1
- data/lib/ronin/web/html.rb +1 -1
- data/lib/ronin/web/root.rb +1 -1
- data/lib/ronin/web/version.rb +2 -2
- data/lib/ronin/web/xml.rb +1 -1
- data/lib/ronin/web.rb +4 -364
- data/man/ronin-web-browser.1 +92 -0
- data/man/ronin-web-browser.1.md +96 -0
- data/man/ronin-web-completion.1 +76 -0
- data/man/ronin-web-completion.1.md +78 -0
- data/man/ronin-web-diff.1 +14 -21
- data/man/ronin-web-diff.1.md +13 -6
- data/man/ronin-web-html.1 +30 -46
- data/man/ronin-web-html.1.md +27 -17
- data/man/ronin-web-irb.1 +9 -16
- data/man/ronin-web-irb.1.md +6 -2
- data/man/ronin-web-new-app.1.md +39 -0
- data/man/ronin-web-new-nokogiri.1 +9 -20
- data/man/ronin-web-new-nokogiri.1.md +5 -5
- data/man/ronin-web-new-server.1 +11 -23
- data/man/ronin-web-new-server.1.md +5 -5
- data/man/ronin-web-new-spider.1 +44 -88
- data/man/ronin-web-new-spider.1.md +37 -37
- data/man/ronin-web-new.1 +18 -30
- data/man/ronin-web-new.1.md +15 -11
- data/man/ronin-web-reverse-proxy.1 +33 -38
- data/man/ronin-web-reverse-proxy.1.md +20 -14
- data/man/ronin-web-screenshot.1 +56 -0
- data/man/ronin-web-screenshot.1.md +56 -0
- data/man/ronin-web-server.1 +15 -29
- data/man/ronin-web-server.1.md +13 -9
- data/man/ronin-web-session-cookie.1 +38 -0
- data/man/ronin-web-session-cookie.1.md +41 -0
- data/man/ronin-web-spider.1 +121 -130
- data/man/ronin-web-spider.1.md +115 -66
- data/man/ronin-web-user-agent.1 +44 -0
- data/man/ronin-web-user-agent.1.md +46 -0
- data/man/ronin-web-vulns.1 +175 -0
- data/man/ronin-web-vulns.1.md +177 -0
- data/man/ronin-web-wordlist.1 +258 -0
- data/man/ronin-web-wordlist.1.md +263 -0
- data/man/ronin-web-xml.1 +43 -0
- data/man/ronin-web-xml.1.md +46 -0
- data/man/ronin-web.1 +67 -18
- data/man/ronin-web.1.md +55 -4
- data/scripts/setup +58 -0
- metadata +122 -31
- data/lib/ronin/web/mechanize.rb +0 -84
- data/man/ronin-web-new-webapp.1.md +0 -39
- /data/data/new/{webapp → app}/.gitignore +0 -0
- /data/data/new/{webapp → app}/.ruby-version.erb +0 -0
- /data/data/new/{webapp → app}/Dockerfile.erb +0 -0
- /data/data/new/{webapp → app}/Gemfile +0 -0
- /data/data/new/{webapp → app}/app.rb.erb +0 -0
- /data/data/new/{webapp → app}/config.ru +0 -0
- /data/data/new/{webapp → app}/docker-compose.yml.erb +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2006-
|
3
|
+
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-web is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -27,11 +27,11 @@ module Ronin
|
|
27
27
|
module Commands
|
28
28
|
class New < Command
|
29
29
|
#
|
30
|
-
# Generate a new ronin-web-server based
|
30
|
+
# Generate a new ronin-web-server based web app.
|
31
31
|
#
|
32
32
|
# ## Usage
|
33
33
|
#
|
34
|
-
# ronin-web new
|
34
|
+
# ronin-web new app [options] DIR
|
35
35
|
#
|
36
36
|
# ## Options
|
37
37
|
#
|
@@ -45,11 +45,11 @@ module Ronin
|
|
45
45
|
#
|
46
46
|
# DIR The directory to create
|
47
47
|
#
|
48
|
-
class
|
48
|
+
class App < Command
|
49
49
|
|
50
50
|
include Core::CLI::Generator
|
51
51
|
|
52
|
-
template_dir File.join(ROOT,'data','new','
|
52
|
+
template_dir File.join(ROOT,'data','new','app')
|
53
53
|
|
54
54
|
usage '[options] DIR'
|
55
55
|
|
@@ -75,12 +75,12 @@ module Ronin
|
|
75
75
|
argument :dir, required: true,
|
76
76
|
desc: 'The directory to create'
|
77
77
|
|
78
|
-
description 'Generate a new ronin-web-server based
|
78
|
+
description 'Generate a new ronin-web-server based app'
|
79
79
|
|
80
|
-
man_page 'ronin-web-new-
|
80
|
+
man_page 'ronin-web-new-app.1'
|
81
81
|
|
82
82
|
#
|
83
|
-
# Runs the `ronin-web new
|
83
|
+
# Runs the `ronin-web new app` command.
|
84
84
|
#
|
85
85
|
# @param [String] path
|
86
86
|
# The path to the new project directory to create.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2006-
|
3
|
+
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-web is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -27,7 +27,7 @@ module Ronin
|
|
27
27
|
module Commands
|
28
28
|
class New < Command
|
29
29
|
#
|
30
|
-
# Generates a new nokogiri Ruby script.
|
30
|
+
# Generates a new nokogiri Ruby script for parsing HTML/XML.
|
31
31
|
#
|
32
32
|
# ## Usage
|
33
33
|
#
|
@@ -58,9 +58,9 @@ module Ronin
|
|
58
58
|
desc: 'Optional URL for the script'
|
59
59
|
|
60
60
|
argument :file, required: true,
|
61
|
-
desc:
|
61
|
+
desc: 'The file to create'
|
62
62
|
|
63
|
-
description 'Generates a new nokogiri Ruby script'
|
63
|
+
description 'Generates a new nokogiri Ruby script for parsing HTML/XML'
|
64
64
|
|
65
65
|
man_page 'ronin-web-new-nokogiri.1'
|
66
66
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2006-
|
3
|
+
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-web is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2006-
|
3
|
+
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-web is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2006-
|
3
|
+
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-web is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -28,7 +28,7 @@ module Ronin
|
|
28
28
|
#
|
29
29
|
# ## Usage
|
30
30
|
#
|
31
|
-
# ronin-web new {nokogiri | server |
|
31
|
+
# ronin-web new {nokogiri | server | app | spider}
|
32
32
|
#
|
33
33
|
# ## Options
|
34
34
|
#
|
@@ -42,11 +42,11 @@ module Ronin
|
|
42
42
|
#
|
43
43
|
# ## Commands
|
44
44
|
#
|
45
|
+
# app
|
45
46
|
# help
|
46
47
|
# nokogiri
|
47
48
|
# server
|
48
49
|
# spider
|
49
|
-
# webapp
|
50
50
|
#
|
51
51
|
class New < Command
|
52
52
|
|
@@ -55,6 +55,8 @@ module Ronin
|
|
55
55
|
namespace: "#{self}"
|
56
56
|
)
|
57
57
|
|
58
|
+
description 'Creates new projects or scripts'
|
59
|
+
|
58
60
|
man_page 'ronin-web-new.1'
|
59
61
|
|
60
62
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# ronin-web - A collection of useful web helper methods and commands.
|
4
4
|
#
|
5
|
-
# Copyright (c) 2006-
|
5
|
+
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
6
6
|
#
|
7
7
|
# ronin-web is free software: you can redistribute it and/or modify
|
8
8
|
# it under the terms of the GNU General Public License as published by
|
@@ -0,0 +1,186 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# ronin-web - A collection of useful web helper methods and commands.
|
4
|
+
#
|
5
|
+
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
6
|
+
#
|
7
|
+
# ronin-web is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
#
|
12
|
+
# ronin-web is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU General Public License
|
18
|
+
# along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
|
19
|
+
#
|
20
|
+
|
21
|
+
require 'ronin/web/cli/command'
|
22
|
+
require 'ronin/web/cli/browser_options'
|
23
|
+
|
24
|
+
require 'ronin/core/cli/logging'
|
25
|
+
|
26
|
+
module Ronin
|
27
|
+
module Web
|
28
|
+
class CLI
|
29
|
+
module Commands
|
30
|
+
#
|
31
|
+
# Screenshots one or more URLs.
|
32
|
+
#
|
33
|
+
# ## Usage
|
34
|
+
#
|
35
|
+
# ronin-web screenshot [options] {URL [...] | --file FILE}
|
36
|
+
#
|
37
|
+
# ## Options
|
38
|
+
#
|
39
|
+
# -B, --browser NAME|PATH The browser name or path to execute
|
40
|
+
# -W, --width WIDTH Sets the width of the browser viewport (Default: 1024)
|
41
|
+
# -H, --height HEIGHT Sets the height of the browser viewport (Default: 768)
|
42
|
+
# -f, --file FILE Input file to read URLs from
|
43
|
+
# -F, --format png|jpg Screenshot image format (Default: png)
|
44
|
+
# -d, --directory DIR Directory to save images to (Default: /data/home/postmodern/code/ronin-rb/ronin-web)
|
45
|
+
# --full Screenshots the full page
|
46
|
+
# -C, --css-path CSSPath The CSSpath selector to screenshot
|
47
|
+
# -h, --help Print help information
|
48
|
+
#
|
49
|
+
# ## Arguments
|
50
|
+
#
|
51
|
+
# URL ... The URL visit and screenshot
|
52
|
+
#
|
53
|
+
class Screenshot < Command
|
54
|
+
|
55
|
+
include Core::CLI::Logging
|
56
|
+
include BrowserOptions
|
57
|
+
|
58
|
+
usage '[options] {URL [...] | --file FILE}'
|
59
|
+
|
60
|
+
option :file, short: '-f',
|
61
|
+
value: {
|
62
|
+
type: String,
|
63
|
+
usage: 'FILE'
|
64
|
+
},
|
65
|
+
desc: 'Input file to read URLs from'
|
66
|
+
|
67
|
+
option :format, short: '-F',
|
68
|
+
value: {
|
69
|
+
type: [:png, :jpg],
|
70
|
+
default: :png
|
71
|
+
},
|
72
|
+
desc: 'Screenshot image format'
|
73
|
+
|
74
|
+
option :directory, short: '-d',
|
75
|
+
value: {
|
76
|
+
type: String,
|
77
|
+
usage: 'DIR',
|
78
|
+
default: Dir.pwd
|
79
|
+
},
|
80
|
+
desc: 'Directory to save images to'
|
81
|
+
|
82
|
+
option :full, desc: 'Screenshots the full page'
|
83
|
+
|
84
|
+
option :css_path, short: '-C',
|
85
|
+
value: {
|
86
|
+
type: String,
|
87
|
+
usage: 'CSSPath'
|
88
|
+
},
|
89
|
+
desc: 'The CSSpath selector to screenshot'
|
90
|
+
|
91
|
+
argument :url, required: true,
|
92
|
+
repeats: true,
|
93
|
+
desc: 'The URL visit and screenshot'
|
94
|
+
|
95
|
+
description 'Screenshots one or more URLs'
|
96
|
+
|
97
|
+
man_page 'ronin-web-screenshot.1'
|
98
|
+
|
99
|
+
#
|
100
|
+
# Runs the `ronin-web screenshot` command.
|
101
|
+
#
|
102
|
+
# @param [Array<String>] urls
|
103
|
+
# The URLs to screenshot.
|
104
|
+
#
|
105
|
+
def run(*urls)
|
106
|
+
if options[:file]
|
107
|
+
File.open(options[:file]) do |file|
|
108
|
+
file.each_line(chomp: true) do |url|
|
109
|
+
process_url(url)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
elsif !urls.empty?
|
113
|
+
urls.each do |url|
|
114
|
+
process_url(url)
|
115
|
+
end
|
116
|
+
else
|
117
|
+
print_error "must specify --file or URL arguments"
|
118
|
+
exit(-1)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
#
|
123
|
+
# Visits and screenshots a URL.
|
124
|
+
#
|
125
|
+
# @param [String] url
|
126
|
+
# The URL to screenshot.
|
127
|
+
#
|
128
|
+
def process_url(url)
|
129
|
+
begin
|
130
|
+
browser.goto(url)
|
131
|
+
rescue Ferrum::StatusError
|
132
|
+
print_error "failed to request URL: #{url}"
|
133
|
+
end
|
134
|
+
|
135
|
+
image_path = image_path_for(url)
|
136
|
+
FileUtils.mkdir_p(File.dirname(image_path))
|
137
|
+
|
138
|
+
log_info "Screenshotting #{url} to #{image_path} ..."
|
139
|
+
browser.screenshot(
|
140
|
+
path: image_path,
|
141
|
+
format: options[:format],
|
142
|
+
full: options[:full],
|
143
|
+
selector: options[:css_path]
|
144
|
+
)
|
145
|
+
end
|
146
|
+
|
147
|
+
#
|
148
|
+
# Parses a URL.
|
149
|
+
#
|
150
|
+
# @param [String] url
|
151
|
+
# The URL string to parse.
|
152
|
+
#
|
153
|
+
# @return [URI::HTTP, URI::HTTPS]
|
154
|
+
# The parsed URL.
|
155
|
+
#
|
156
|
+
def parse_url(url)
|
157
|
+
URI.parse(url)
|
158
|
+
rescue URI::InvalidURI
|
159
|
+
print_error "invalid URI: #{url}"
|
160
|
+
exit(1)
|
161
|
+
end
|
162
|
+
|
163
|
+
#
|
164
|
+
# Generates the image path for a given URL.
|
165
|
+
#
|
166
|
+
# @param [String] url
|
167
|
+
# The given URL.
|
168
|
+
#
|
169
|
+
# @return [String]
|
170
|
+
# The relative image path that represents the URL.
|
171
|
+
#
|
172
|
+
def image_path_for(url)
|
173
|
+
uri = parse_url(url)
|
174
|
+
|
175
|
+
path = File.join(options[:directory],uri.host,uri.request_uri)
|
176
|
+
path << 'index' if path.end_with?('/')
|
177
|
+
path << ".#{options[:format]}"
|
178
|
+
|
179
|
+
return path
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
#
|
3
3
|
# ronin-web - A collection of useful web helper methods and commands.
|
4
4
|
#
|
5
|
-
# Copyright (c) 2006-
|
5
|
+
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
6
6
|
#
|
7
7
|
# ronin-web is free software: you can redistribute it and/or modify
|
8
8
|
# it under the terms of the GNU General Public License as published by
|
@@ -0,0 +1,265 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# ronin-web - A collection of useful web helper methods and commands.
|
4
|
+
#
|
5
|
+
# Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
6
|
+
#
|
7
|
+
# ronin-web is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation, either version 3 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
#
|
12
|
+
# ronin-web is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU General Public License
|
18
|
+
# along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
|
19
|
+
#
|
20
|
+
|
21
|
+
require 'ronin/web/cli/command'
|
22
|
+
require 'ronin/web/session_cookie'
|
23
|
+
require 'ronin/support/network/http'
|
24
|
+
require 'ronin/support/encoding/hex'
|
25
|
+
|
26
|
+
require 'command_kit/options/verbose'
|
27
|
+
require 'command_kit/printing/indent'
|
28
|
+
|
29
|
+
module Ronin
|
30
|
+
module Web
|
31
|
+
class CLI
|
32
|
+
module Commands
|
33
|
+
#
|
34
|
+
# Parses and deserializes various session cookie formats.
|
35
|
+
#
|
36
|
+
# ## Usage
|
37
|
+
#
|
38
|
+
# ronin-web session_cookie [options] {URL | COOKIE}
|
39
|
+
#
|
40
|
+
# ## Options
|
41
|
+
#
|
42
|
+
# -v, --verbose Enables verbose output
|
43
|
+
# -F, --format ruby|json|yaml The format to print the session cookie params (Default: ruby)
|
44
|
+
# -h, --help Print help information
|
45
|
+
#
|
46
|
+
# ## Arguments
|
47
|
+
#
|
48
|
+
# URL | COOKIE The URL or the session cookie to parse
|
49
|
+
#
|
50
|
+
# @since 2.0.0
|
51
|
+
#
|
52
|
+
class SessionCookie < Command
|
53
|
+
|
54
|
+
include CommandKit::Options::Verbose
|
55
|
+
include CommandKit::Printing::Indent
|
56
|
+
|
57
|
+
usage '[options] {URL | COOKIE}'
|
58
|
+
|
59
|
+
option :format, short: '-F',
|
60
|
+
value: {
|
61
|
+
type: [:ruby, :json, :yaml],
|
62
|
+
default: :ruby
|
63
|
+
},
|
64
|
+
desc: 'The format to print the session cookie params'
|
65
|
+
|
66
|
+
argument :url_or_cookie, required: true,
|
67
|
+
usage: 'URL | COOKIE',
|
68
|
+
desc: 'The URL or the session cookie to parse'
|
69
|
+
|
70
|
+
description 'Parses and deserializes various session cookie formats'
|
71
|
+
|
72
|
+
examples [
|
73
|
+
'"rack.session=BAh7CEkiD3Nlc3Npb25faWQGOgZFVG86HVJhY2s6OlNlc3Npb246OlNlc3Npb25JZAY6D0BwdWJsaWNfaWRJIkUyYWJkZTdkM2I0YTMxNDE5OThiYmMyYTE0YjFmMTZlNTNlMWMzYWJlYzhiYzc4ZjVhMGFlMGUwODJmMjJlZGIxBjsARkkiCWNzcmYGOwBGSSIxNHY1TmRCMGRVaklXdjhzR3J1b2ZhM2xwNHQyVGp5ZHptckQycjJRWXpIZz0GOwBGSSINdHJhY2tpbmcGOwBGewZJIhRIVFRQX1VTRVJfQUdFTlQGOwBUSSItOTkxNzUyMWYzN2M4ODJkNDIyMzhmYmI5Yzg4MzFmMWVmNTAwNGQyYwY7AEY%3D--02184e43850f38a46c8f22ffb49f7f22be58e272"'
|
74
|
+
]
|
75
|
+
|
76
|
+
man_page 'ronin-web-session-cookie.1'
|
77
|
+
|
78
|
+
#
|
79
|
+
# Runs the `ronin-web session-cookie` command.
|
80
|
+
#
|
81
|
+
# @param [String] arg
|
82
|
+
#
|
83
|
+
def run(arg)
|
84
|
+
session_cookie = if arg.start_with?('https://') ||
|
85
|
+
arg.start_with?('http://')
|
86
|
+
fetch_session_cookie(arg)
|
87
|
+
else
|
88
|
+
parse_session_cookie(arg)
|
89
|
+
end
|
90
|
+
|
91
|
+
if session_cookie
|
92
|
+
print_session_cookie(session_cookie)
|
93
|
+
else
|
94
|
+
print_error "no session cookie found"
|
95
|
+
exit(-1)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
#
|
100
|
+
# Fetches the session cookie from the URL.
|
101
|
+
#
|
102
|
+
# @param [String] url
|
103
|
+
# The URL to request.
|
104
|
+
#
|
105
|
+
# @return [Ronin::Web::SessionCookie::Django, Ronin::Web::SessionCookie::JWT, Ronin::Web::SessionCookie::Rack, nil]
|
106
|
+
# The parses session cookie.
|
107
|
+
#
|
108
|
+
def fetch_session_cookie(url)
|
109
|
+
response = begin
|
110
|
+
Support::Network::HTTP.get(url)
|
111
|
+
rescue => error
|
112
|
+
print_error "failed to request URL (#{url.inspect}): #{error.message}"
|
113
|
+
exit(-1)
|
114
|
+
end
|
115
|
+
|
116
|
+
Web::SessionCookie.extract(response)
|
117
|
+
end
|
118
|
+
|
119
|
+
#
|
120
|
+
# Parses a session cookie.
|
121
|
+
#
|
122
|
+
# @param [String] cookie
|
123
|
+
# The session cookie to parse.
|
124
|
+
#
|
125
|
+
# @return [Ronin::Web::SessionCookie::Django, Ronin::Web::SessionCookie::JWT, Ronin::Web::SessionCookie::Rack, nil]
|
126
|
+
# The parses session cookie.
|
127
|
+
#
|
128
|
+
def parse_session_cookie(cookie)
|
129
|
+
Web::SessionCookie.parse(cookie)
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# Prints a session cookie.
|
134
|
+
#
|
135
|
+
# @param [Ronin::Web::SessionCookie::Django, Ronin::Web::SessionCookie::JWT, Ronin::Web::SessionCookie::Rack] session_cookie
|
136
|
+
#
|
137
|
+
# @raise [NotImplementedError]
|
138
|
+
# The session cookie was not `Ronin::Web::SessionCookie::Django`,
|
139
|
+
# `Ronin::Web::SessionCookie::JWT`, or
|
140
|
+
# `Ronin::Web::SessionCookie::Rack`.
|
141
|
+
#
|
142
|
+
def print_session_cookie(session_cookie)
|
143
|
+
case session_cookie
|
144
|
+
when Web::SessionCookie::Django
|
145
|
+
print_django_session_cookie(session_cookie)
|
146
|
+
when Web::SessionCookie::JWT
|
147
|
+
print_jwt_session_cookie(session_cookie)
|
148
|
+
when Web::SessionCookie::Rack
|
149
|
+
print_rack_session_cookie(session_cookie)
|
150
|
+
else
|
151
|
+
raise(NotImplementedError,"cannot print session cookie: #{session_cookie.inspect}")
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
#
|
156
|
+
# Prints a Django session cookie.
|
157
|
+
#
|
158
|
+
# @param [Ronin::Web::SessionCookie::Django] session_cookie
|
159
|
+
#
|
160
|
+
def print_django_session_cookie(session_cookie)
|
161
|
+
if verbose?
|
162
|
+
puts "Type: Django"
|
163
|
+
puts "Params:"
|
164
|
+
puts
|
165
|
+
|
166
|
+
indent do
|
167
|
+
print_params(session_cookie.params)
|
168
|
+
end
|
169
|
+
puts
|
170
|
+
|
171
|
+
puts "Salt: #{session_cookie.salt}"
|
172
|
+
puts "HMAC: #{Support::Encoding::Hex.quote(session_cookie.hmac)}"
|
173
|
+
else
|
174
|
+
print_params(session_cookie.params)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
#
|
179
|
+
# Prints a JWT session cookie.
|
180
|
+
#
|
181
|
+
# @param [Ronin::Web::SessionCookie::JWT] session_cookie
|
182
|
+
#
|
183
|
+
def print_jwt_session_cookie(session_cookie)
|
184
|
+
if verbose?
|
185
|
+
puts "Type: JWT"
|
186
|
+
puts "Header:"
|
187
|
+
puts
|
188
|
+
|
189
|
+
indent do
|
190
|
+
print_params(session_cookie.header)
|
191
|
+
end
|
192
|
+
puts
|
193
|
+
|
194
|
+
puts "Params:"
|
195
|
+
puts
|
196
|
+
|
197
|
+
indent do
|
198
|
+
print_params(session_cookie.params)
|
199
|
+
end
|
200
|
+
puts
|
201
|
+
|
202
|
+
puts "HMAC: #{Support::Encoding::Hex.quote(session_cookie.hmac)}"
|
203
|
+
else
|
204
|
+
print_params(session_cookie.params)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
#
|
209
|
+
# Prints a Rack session cookie.
|
210
|
+
#
|
211
|
+
# @param [Ronin::Web::SessionCookie::Rack] session_cookie
|
212
|
+
#
|
213
|
+
def print_rack_session_cookie(session_cookie)
|
214
|
+
if verbose?
|
215
|
+
puts "Type: Rack"
|
216
|
+
puts "Params:"
|
217
|
+
puts
|
218
|
+
|
219
|
+
indent do
|
220
|
+
print_params(session_cookie.params)
|
221
|
+
end
|
222
|
+
puts
|
223
|
+
|
224
|
+
puts "HMAC: #{session_cookie.hmac}"
|
225
|
+
else
|
226
|
+
print_params(session_cookie.params)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
#
|
231
|
+
# Prints the session cookie params as JSON.
|
232
|
+
#
|
233
|
+
# @param [Hash] params
|
234
|
+
# The params to print.
|
235
|
+
#
|
236
|
+
def print_params(params)
|
237
|
+
format_params(params).each_line do |line|
|
238
|
+
puts line
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
#
|
243
|
+
# Formats the params based on the `--format` option.
|
244
|
+
#
|
245
|
+
def format_params(params)
|
246
|
+
case options[:format]
|
247
|
+
when :ruby
|
248
|
+
require 'pp'
|
249
|
+
params.pretty_print_inspect
|
250
|
+
when :json
|
251
|
+
require 'json'
|
252
|
+
JSON.pretty_generate(params)
|
253
|
+
when :yaml
|
254
|
+
require 'yaml'
|
255
|
+
YAML.dump(params)
|
256
|
+
else
|
257
|
+
raise(NotImplementedError,"unsupported format: #{options[:format].inspect}")
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|