ronin-app 0.1.0.rc1 → 0.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e807463567097ddf828ab12bc5c0d75fc1ea05d7c7c755d67e6550d6cd368776
4
- data.tar.gz: 54f0e5ae8cbb25d1749e6896060d1345ffdc3086085ea7317d4f7fe8e56543a1
3
+ metadata.gz: 254cf151b2f2725f6e24fa6acb4465c86f4071448e8fefcbe662b65e0565a676
4
+ data.tar.gz: 97cb3bc2fbbeaf8935f04d8907d3e248e6fda3d58216e1655f6a9409952951f6
5
5
  SHA512:
6
- metadata.gz: 3e7ec51601d1f88f7993157c6b9c0bf315e8cfda3b6daf8eb43da9239f4e0177fb94ce156601de05c41d2a4595a48697dc4aec96de9647dc804dd068e8e559f7
7
- data.tar.gz: 6efcab13cc6137d69581a0cc4f8e9b79eb97082e5add7b1f8f68a7861646daee311ad1d3246d1478e2d683a864554167dd76f73db4a8a9ee16e91d25a4be1f9f
6
+ metadata.gz: '062801f6bdfe086e94d87f292ce0c87f02187289033f465ef1f016d52c9328687885ba4c9f33f570d561cba5d8f8544d358e2a34ab20ababe0a888e2b1c54bd7'
7
+ data.tar.gz: 62c3aadce32eb5044a218350bd5301aa058f69eb872c2a5016c7c93b20c239d7559b8a5548935f38e4690ae43394f25a22766cc24a1722de3b998af51ee32665
data/.gitignore CHANGED
@@ -1,6 +1,7 @@
1
1
  /Gemfile.lock
2
2
  /coverage
3
3
  /doc
4
+ /pkg
4
5
  /log
5
6
  /man/*.1
6
7
  /tmp
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-3.1
1
+ ruby-3.3
data/ChangeLog.md CHANGED
@@ -1,4 +1,4 @@
1
- ### 0.1.0 / 2024-XX-XX
1
+ ### 0.1.0 / 2024-07-22
2
2
 
3
3
  * Initial release:
4
4
  * Provides a web interface to explore and search the
data/Gemfile CHANGED
@@ -38,11 +38,13 @@ gem 'sidekiq', require: false
38
38
 
39
39
  group :development do
40
40
  gem 'rake', require: false
41
+ gem 'rack-test', '~> 2.1', require: false
41
42
 
42
43
  gem 'rubygems-tasks', '~> 0.2'
43
44
 
44
45
  gem 'rspec', '~> 3.0', require: false
45
46
  gem 'simplecov', '~> 0.20', require: false
47
+ gem 'capybara', '~> 3.40', require: false
46
48
 
47
49
  gem 'kramdown', '~> 2.0', require: false
48
50
  gem 'kramdown-man', '~> 1.0', require: false
data/README.md CHANGED
@@ -35,48 +35,48 @@ user. It provides a web interface to [ronin-support], [ronin-repos], [ronin-db],
35
35
  <tbody>
36
36
  <tr>
37
37
  <td>
38
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_scanning_nmap.svg" />
38
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_scanning_nmap.svg" />
39
39
  </td>
40
40
  <td>
41
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_scanning_masscan.svg" />
41
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_scanning_masscan.svg" />
42
42
  </td>
43
43
  <td>
44
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_scanning_recon.svg" />
44
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_scanning_recon.svg" />
45
45
  </td>
46
46
  <td>
47
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_scanning_spider.svg" />
47
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_scanning_spider.svg" />
48
48
  </td>
49
49
  <td>
50
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_scanning_vulns.svg" />
50
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_scanning_vulns.svg" />
51
51
  </td>
52
52
  <td>
53
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_db.svg" />
53
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_db.svg" />
54
54
  </td>
55
55
  <td>
56
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_db_ip_address.svg" />
56
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_db_ip_address.svg" />
57
57
  </td>
58
58
  </tr>
59
59
  <tr>
60
60
  <td>
61
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_repos.svg" />
61
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_repos.svg" />
62
62
  </td>
63
63
  <td>
64
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_repos_show.svg" />
64
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_repos_show.svg" />
65
65
  </td>
66
66
  <td>
67
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_payloads.svg" />
67
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_payloads.svg" />
68
68
  </td>
69
69
  <td>
70
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_payloads_show.svg" />
70
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_payloads_show.svg" />
71
71
  </td>
72
72
  <td>
73
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_payloads_build.svg" />
73
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_payloads_build.svg" />
74
74
  </td>
75
75
  <td>
76
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_exploits.svg" />
76
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_exploits.svg" />
77
77
  </td>
78
78
  <td>
79
- <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/add_screenshots/screenshots/ronin_app_exploits_show.svg" />
79
+ <img src="https://raw.githubusercontent.com/ronin-rb/ronin-app/main/screenshots/ronin_app_exploits_show.svg" />
80
80
  </td>
81
81
  </tr>
82
82
  </tbody>
data/app.rb CHANGED
@@ -39,6 +39,7 @@ require 'ronin/support/encoding'
39
39
  # param validations
40
40
  require 'ronin/app/validations/install_repo_params'
41
41
  require 'ronin/app/validations/import_params'
42
+ require 'ronin/app/validations/http_params'
42
43
 
43
44
  # schema builders
44
45
  require 'ronin/app/schemas/payloads/encoders/encode_schema'
@@ -354,6 +355,28 @@ class App < Sinatra::Base
354
355
  erb :queue
355
356
  end
356
357
 
358
+ get '/network/http' do
359
+ erb :"network/http"
360
+ end
361
+
362
+ post '/network/http' do
363
+ result = Validations::HTTPParams.call(params)
364
+
365
+ if result.success?
366
+ kwargs = result.to_h
367
+ method = kwargs.delete(:method)
368
+ url = kwargs.delete(:url)
369
+
370
+ @http_response = Ronin::Support::Network::HTTP.request(method,url,**kwargs)
371
+
372
+ erb :"network/http"
373
+ else
374
+ @params = params
375
+ @errors = result.errors
376
+ halt 400, erb(:"network/http")
377
+ end
378
+ end
379
+
357
380
  private
358
381
 
359
382
  #
data/gemspec.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  name: ronin-app
2
2
  summary: A local web interface for Ronin
3
3
  description: |
4
- ronin-app is a small web application that is meant to be ran locally by the
4
+ ronin-app is a small web application that is meant to be ran locally by the
5
5
  user. It provides a web interface to ronin-support, ronin-repos, ronin-db,
6
6
  ronin-payloads, ronin-exploits, as well as automating
7
7
  ronin-nmap, ronin-masscan, ronin-web-spider, ronin-recon, and ronin-vulns.
@@ -39,17 +39,18 @@ dependencies:
39
39
  sidekiq: ~> 7.0
40
40
  puma: ~> 6.0
41
41
  # Ronin dependencies:
42
- ronin-support: ~> 1.1.0.rc1
43
- ronin-core: ~> 0.2.0.rc1
44
- ronin-db-activerecord: ~> 0.2.0.rc1
45
- ronin-db: ~> 0.2.0.rc1
46
- ronin-payloads: ~> 0.2.0.rc1
47
- ronin-exploits: ~> 1.1.0.rc1
48
- ronin-vulns: ~> 0.2.0.rc1
49
- ronin-web-spider: ~> 0.2.0.rc1
50
- ronin-nmap: ~> 0.1.0.rc1
51
- ronin-masscan: ~> 0.1.0.rc1
52
- ronin-recon: ~> 0.1.0.rc1
42
+ ronin-support: ~> 1.1
43
+ ronin-core: ~> 0.2
44
+ ronin-repos: ~> 0.2
45
+ ronin-db-activerecord: ~> 0.2
46
+ ronin-db: ~> 0.2
47
+ ronin-payloads: ~> 0.2
48
+ ronin-exploits: ~> 1.1
49
+ ronin-vulns: ~> 0.2
50
+ ronin-web-spider: ~> 0.2
51
+ ronin-nmap: ~> 0.1
52
+ ronin-masscan: ~> 0.1
53
+ ronin-recon: ~> 0.1
53
54
 
54
55
  development_dependencies:
55
56
  bundler: ~> 2.0
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-app - a local web app for Ronin.
4
+ #
5
+ # Copyright (c) 2023-2024 Hal Brodigan (postmodern.mod3@gmail.com)
6
+ #
7
+ # ronin-app is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Affero 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-app 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 Affero General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Affero General Public License
18
+ # along with ronin-app. If not, see <http://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'dry/validation'
22
+
23
+ module Ronin
24
+ module App
25
+ module Validations
26
+ #
27
+ # Validations for the form params submitted to `POST /network/http`.
28
+ #
29
+ class HTTPParams < Dry::Validation::Contract
30
+
31
+ HTTPMethods = Types::Symbol.enum(
32
+ copy: 'COPY',
33
+ delete: 'DELETE',
34
+ get: 'GET',
35
+ head: 'HEAD',
36
+ lock: 'LOCK',
37
+ mkcol: 'MKCOL',
38
+ move: 'MOVE',
39
+ options: 'OPTIONS',
40
+ patch: 'PATCH',
41
+ post: 'POST',
42
+ propfind: 'PROPFIND',
43
+ proppatch: 'PROPPATCH',
44
+ put: 'PUT',
45
+ trace: 'TRACE',
46
+ unlock: 'UNLOCK'
47
+ )
48
+
49
+ Versions = (Types::Float | Types::Integer).enum(
50
+ 1 => '1.0',
51
+ 1.1 => '1.1',
52
+ 1.2 => '1.2'
53
+ )
54
+
55
+ VerificationModes = Types::Symbol.enum(
56
+ none: 'none',
57
+ peer: 'peer',
58
+ fail_if_no_peer_cert: 'fail_if_no_peer_cert'
59
+ )
60
+
61
+ Headers = Types::Hash.constructor do |input,type|
62
+ if input.is_a?(String)
63
+ headers = {}
64
+
65
+ input.strip.each_line(chomp: true) do |line|
66
+ name, value = line.split(/:\s*/,2)
67
+
68
+ case (previous_value = headers[name])
69
+ when nil # no value yet
70
+ headers[name] = value
71
+ when String # previous value
72
+ headers[name] = [previous_value, value]
73
+ when Array # multiple previous values
74
+ previous_value << value
75
+ end
76
+ end
77
+
78
+ headers unless headers.empty?
79
+ elsif type.valid?(input)
80
+ input
81
+ else
82
+ type.call(input)
83
+ end
84
+ end
85
+
86
+ params do
87
+ required(:method).filled(HTTPMethods)
88
+ required(:url).filled(:string)
89
+
90
+ optional(:body).maybe(:string)
91
+ optional(:headers).maybe(Headers)
92
+
93
+ optional(:proxy).maybe(:string)
94
+ optional(:user_agent).maybe(:string)
95
+ optional(:user).maybe(:string)
96
+ optional(:password).maybe(:string)
97
+ optional(:cookie).maybe(:string)
98
+
99
+ optional(:ssl).hash do
100
+ optional(:timeout).maybe(:integer)
101
+ optional(:version).maybe(Versions)
102
+ optional(:min_version).maybe(Versions)
103
+ optional(:max_version).maybe(Versions)
104
+ optional(:verify).maybe(VerificationModes)
105
+ optional(:verify_depth).maybe(:integer)
106
+ optional(:verify_hostname).maybe(:bool)
107
+ end
108
+ end
109
+
110
+ #
111
+ # Initializes and calls the validation contract.
112
+ #
113
+ # @param [Hash{String => Object}] params
114
+ # The HTTP params to validate.
115
+ #
116
+ # @return [Dry::Validation::Result]
117
+ # The validation result.
118
+ #
119
+ def self.call(params)
120
+ new.call(params)
121
+ end
122
+
123
+ end
124
+ end
125
+ end
126
+ end
@@ -21,6 +21,6 @@
21
21
  module Ronin
22
22
  module App
23
23
  # The ronin-app version
24
- VERSION = '0.1.0.rc1'
24
+ VERSION = '0.1.0'
25
25
  end
26
26
  end
@@ -167,6 +167,10 @@ main > nav.breadcrumb a {
167
167
  text-decoration: none;
168
168
  }
169
169
 
170
+ .content .tabs ul li a:hover {
171
+ background-color: var(--fg-color);
172
+ }
173
+
170
174
  .content .content-tab {
171
175
  display: none;
172
176
  }
@@ -214,3 +218,8 @@ body.dark-mode main strong,
214
218
  body.dark-mode main a {
215
219
  color: var(--dark-mode-fg-color);
216
220
  }
221
+
222
+ body.dark-mode .content .tabs ul li a:hover {
223
+ color: var(--dark-mode-bg-color);
224
+ background-color: var(--dark-mode-fg-color);
225
+ }
@@ -90,6 +90,16 @@
90
90
  </td>
91
91
  </tr>
92
92
 
93
+ <% if defined?(Ronin::Exploits::Metadata::Shouts) &&
94
+ @exploit.include?(Ronin::Exploits::Metadata::Shouts) %>
95
+ <tr>
96
+ <td><strong>Shouts:</strong></td>
97
+ <td>
98
+ <p><%=h @exploit.shouts.join(', ') %></p>
99
+ </td>
100
+ </tr>
101
+ <% end %>
102
+
93
103
  <tr>
94
104
  <td><strong>Params:</strong></td>
95
105
  <td>
data/views/layout.erb CHANGED
@@ -60,6 +60,14 @@
60
60
  </div>
61
61
  </div>
62
62
 
63
+ <div class="navbar-item has-dropdown is-hoverable">
64
+ <a class="navbar-item">network</a>
65
+
66
+ <div class="navbar-dropdown">
67
+ <a href="/network/http" class="navbar-item">http</a>
68
+ </div>
69
+ </div>
70
+
63
71
  <a href="/queue" class="navbar-item">queue</a>
64
72
  <a href="/about" class="navbar-item">about</a>
65
73
  </div>
@@ -89,7 +97,7 @@
89
97
  <div class="container">
90
98
  <div class="columns">
91
99
  <div class="column is-full">
92
- <span>(c) 2023 Hal Brodigan</span>
100
+ <span>(c) 2023-<%= Date.today.year %> Hal Brodigan</span>
93
101
  </div>
94
102
  </div>
95
103
  </div>
@@ -0,0 +1,303 @@
1
+ <script type="text/javascript" src="/javascript/tabs.js"></script>
2
+ <h1>HTTP</h1>
3
+
4
+ <form action="/network/http" method="post">
5
+ <div class="field">
6
+ <label class="label is-required">URL</label>
7
+
8
+ <div class="control">
9
+ <% if @errors && @errors[:url] %>
10
+ <input class="input is-danger" type="text" name="url" value="<%=hattr params[:url] %>">
11
+
12
+ <% @errors[:url].each do |error| %>
13
+ <p class="help is-danger"><%=h error %></p>
14
+ <% end %>
15
+ <% else %>
16
+ <input class="input" type="text" name="url" placeholder="https://www.example.com" value="<%=hattr params[:url] %>">
17
+ <% end %>
18
+ </div>
19
+ </div>
20
+
21
+ <div class="field">
22
+ <label class="has-text-weight-semibold">HTTP Method:</label>
23
+
24
+ <% if @errors && @errors[:method] %>
25
+ <select class="select is-danger" name="method">
26
+ <option value="">
27
+ <option value="COPY"<%= ' selected' if params[:http_method] == 'COPY' %>>COPY</option>
28
+ <option value="DELETE"<%= ' selected' if params[:http_method] == 'DELETE' %>>DELETE</option>
29
+ <option value="GET"<%= ' selected' if params[:http_method] == 'GET' %>>GET</option>
30
+ <option value="HEAD"<%= ' selected' if params[:http_method] == 'HEAD' %>>HEAD</option>
31
+ <option value="LOCK"<%= ' selected' if params[:http_method] == 'LOCK' %>>LOCK</option>
32
+ <option value="MKCOL"<%= ' selected' if params[:http_method] == 'MKCOL' %>>MKCOL</option>
33
+ <option value="MOVE"<%= ' selected' if params[:http_method] == 'MOVE' %>>MOVE</option>
34
+ <option value="OPTIONS"<%= ' selected' if params[:http_method] == 'OPTIONS' %>>OPTIONS</option>
35
+ <option value="PATCH"<%= ' selected' if params[:http_method] == 'PATCH' %>>PATCH</option>
36
+ <option value="POST"<%= ' selected' if params[:http_method] == 'POST' %>>POST</option>
37
+ <option value="PROPFIND"<%= ' selected' if params[:http_method] == 'PROPFIND' %>>PROPFIND</option>
38
+ <option value="PROPPATCH"<%= ' selected' if params[:http_method] == 'PROPPATCH' %>>PROPPATCH</option>
39
+ <option value="PUT"<%= ' selected' if params[:http_method] == 'PUT' %>>PUT</option>
40
+ <option value="TRACE"<%= ' selected' if params[:http_method] == 'TRACE' %>>TRACE</option>
41
+ <option value="UNLOCK"<%= ' selected' if params[:http_method] == 'UNLOCK' %>>UNLOCK</option>
42
+ </select>
43
+
44
+ <% @errors[:method].each do |error| %>
45
+ <p class="help is-danger"><%=h error %></p>
46
+ <% end %>
47
+ <% else %>
48
+ <select class="select" name="method">
49
+ <option value="">
50
+ <option value="COPY"<%= ' selected' if params[:http_method] == 'COPY' %>>COPY</option>
51
+ <option value="DELETE"<%= ' selected' if params[:http_method] == 'DELETE' %>>DELETE</option>
52
+ <option value="GET"<%= ' selected' if params[:http_method] == 'GET' %>>GET</option>
53
+ <option value="HEAD"<%= ' selected' if params[:http_method] == 'HEAD' %>>HEAD</option>
54
+ <option value="LOCK"<%= ' selected' if params[:http_method] == 'LOCK' %>>LOCK</option>
55
+ <option value="MKCOL"<%= ' selected' if params[:http_method] == 'MKCOL' %>>MKCOL</option>
56
+ <option value="MOVE"<%= ' selected' if params[:http_method] == 'MOVE' %>>MOVE</option>
57
+ <option value="OPTIONS"<%= ' selected' if params[:http_method] == 'OPTIONS' %>>OPTIONS</option>
58
+ <option value="PATCH"<%= ' selected' if params[:http_method] == 'PATCH' %>>PATCH</option>
59
+ <option value="POST"<%= ' selected' if params[:http_method] == 'POST' %>>POST</option>
60
+ <option value="PROPFIND"<%= ' selected' if params[:http_method] == 'PROPFIND' %>>PROPFIND</option>
61
+ <option value="PROPPATCH"<%= ' selected' if params[:http_method] == 'PROPPATCH' %>>PROPPATCH</option>
62
+ <option value="PUT"<%= ' selected' if params[:http_method] == 'PUT' %>>PUT</option>
63
+ <option value="TRACE"<%= ' selected' if params[:http_method] == 'TRACE' %>>TRACE</option>
64
+ <option value="UNLOCK"<%= ' selected' if params[:http_method] == 'UNLOCK' %>>UNLOCK</option>
65
+ </select>
66
+ <% end %>
67
+ </div>
68
+
69
+ <div class="field">
70
+ <button type="submit" class="button is-primary">Send</button>
71
+ </div>
72
+
73
+ <div class="tabs is-centered">
74
+ <ul>
75
+ <li class="is-active"><a data-tab-id="general">General</a></li>
76
+ <li><a data-tab-id="ssl">SSL</a></li>
77
+ </ul>
78
+ </div>
79
+
80
+ <div class="tabs-content">
81
+ <div id="general" class="content-tab is-active">
82
+ <div class="field">
83
+ <label class="has-text-weight-semibold">Proxy:</label>
84
+
85
+ <div class="control">
86
+ <% if @errors && @errors[:proxy] %>
87
+ <input class="input is-danger" type="text" name="proxy" value="<%=hattr params[:proxy] %>">
88
+
89
+ <% @errors[:proxy].each do |error| %>
90
+ <p class="help is-danger"><%=h error %></p>
91
+ <% end %>
92
+ <% else %>
93
+ <input class="input" type="text" name="proxy" value="<%=hattr params[:proxy] %>">
94
+ <% end %>
95
+ </div>
96
+ </div>
97
+
98
+ <div class="field">
99
+ <label class="has-text-weight-semibold">Headers:</label>
100
+
101
+ <div class="control">
102
+ <% if @errors && @errors[:headers] %>
103
+ <textarea class="textarea is-danger" name="headers" placeholder="Content-Type: application/x-www-form-urlencoded, Connection: keep-alive" value="<%=hattr params[:headers] %>"></textarea>
104
+
105
+ <% @errors[:headers].each do |error| %>
106
+ <p class="help is-danger"><%=h error %></p>
107
+ <% end %>
108
+ <% else %>
109
+ <textarea class="textarea" name="headers" placeholder="Content-Type: application/x-www-form-urlencoded, Connection: keep-alive" value="<%=hattr params[:headers] %>"></textarea>
110
+ <% end %>
111
+ </div>
112
+ </div>
113
+
114
+ <div class="field">
115
+ <label class="has-text-weight-semibold">User Agent:</label>
116
+
117
+ <div class="control">
118
+ <% if @errors && @errors[:user_agent] %>
119
+ <input class="input is-danger" type="text" name="user_agent" value="<%=hattr params[:user_agent] %>">
120
+
121
+ <% @errors[:user_agent].each do |error| %>
122
+ <p class="help is-danger"><%=h error %></p>
123
+ <% end %>
124
+ <% else %>
125
+ <input class="input" type="text" name="user_agent" value="<%=hattr params[:user_agent] %>">
126
+ <% end %>
127
+ </div>
128
+ </div>
129
+
130
+ <div class="field">
131
+ <label class="has-text-weight-semibold">User:</label>
132
+
133
+ <div class="control">
134
+ <% if @errors && @errors[:user] %>
135
+ <input class="input is-danger" type="text" name="user" value="<%=hattr params[:user] %>">
136
+
137
+ <% @errors[:user].each do |error| %>
138
+ <p class="help is-danger"><%=h error %></p>
139
+ <% end %>
140
+ <% else %>
141
+ <input class="input" type="text" name="user" value="<%=hattr params[:user] %>">
142
+ <% end %>
143
+ </div>
144
+ </div>
145
+
146
+ <div class="field">
147
+ <label class="has-text-weight-semibold">Password:</label>
148
+
149
+ <div class="control">
150
+ <% if @errors && @errors[:password] %>
151
+ <input class="input is-danger" type="text" name="password" value="<%=hattr params[:password] %>">
152
+
153
+ <% @errors[:password].each do |error| %>
154
+ <p class="help is-danger"><%=h error %></p>
155
+ <% end %>
156
+ <% else %>
157
+ <input class="input" type="text" name="password" value="<%=hattr params[:password] %>">
158
+ <% end %>
159
+ </div>
160
+ </div>
161
+
162
+ <div class="field">
163
+ <label class="has-text-weight-semibold">Cookie:</label>
164
+
165
+ <div class="control">
166
+ <% if @errors && @errors[:cookie] %>
167
+ <input class="input is-danger" type="text" name="cookie" value="<%=hattr params[:cookie] %>">
168
+
169
+ <% @errors[:cookie].each do |error| %>
170
+ <p class="help is-danger"><%=h error %></p>
171
+ <% end %>
172
+ <% else %>
173
+ <input class="input" type="text" name="cookie" value="<%=hattr params[:cookie] %>">
174
+ <% end %>
175
+ </div>
176
+ </div>
177
+
178
+ <div class="field">
179
+ <label class="has-text-weight-semibold">Body:</label>
180
+
181
+ <div class="control">
182
+ <% if @errors && @errors[:body] %>
183
+ <textarea class="textarea is-danger" type="text" name="body" value="<%=hattr params[:body] %>"></textarea>
184
+
185
+ <% @errors[:body].each do |error| %>
186
+ <p class="help is-danger"><%=h error %></p>
187
+ <% end %>
188
+ <% else %>
189
+ <textarea class="textarea" type="text" name="body" value="<%=hattr params[:body] %>"></textarea>
190
+ <% end %>
191
+ </div>
192
+ </div>
193
+ </div>
194
+
195
+ <div id="ssl" class="content-tab">
196
+ <div class="field">
197
+ <label class="has-text-weight-semibold">Timeout:</label>
198
+
199
+ <div class="control">
200
+ <% if @errors && @errors[:ssl]&.dig(:timeout) %>
201
+ <input class="input is-danger" type="number" name="ssl[timeout]" value="<%=hattr params[:timeout] %>">
202
+
203
+ <% @errors[:ssl][:timeout].each do |error| %>
204
+ <p class="help is-danger"><%=h error %></p>
205
+ <% end %>
206
+ <% else %>
207
+ <input class="input" type="number" name="ssl[timeout]" value="<%=hattr params[:timeout] %>">
208
+ <% end %>
209
+ </div>
210
+ </div>
211
+
212
+ <div class="field">
213
+ <label class="has-text-weight-semibold">Version:</label>
214
+ <select class="select" name="ssl[version]">
215
+ <option value="">
216
+ <option value="1.0"<%= ' selected' if params[:ssl]&.dig(:version) == '1.0' %>>1.0</option>
217
+ <option value="1.1"<%= ' selected' if params[:ssl]&.dig(:version) == '1.1' %>>1.1</option>
218
+ <option value="1.2"<%= ' selected' if params[:ssl]&.dig(:version) == '1.2' %>>1.2</option>
219
+ </select>
220
+ </div>
221
+
222
+ <div class="field">
223
+ <label class="has-text-weight-semibold">Min Version:</label>
224
+ <select class="select" name="ssl[min_version]">
225
+ <option value="">
226
+ <option value="1.0"<%= ' selected' if params[:ssl]&.dig(:version) == '1.0' %>>1.0</option>
227
+ <option value="1.1"<%= ' selected' if params[:ssl]&.dig(:version) == '1.1' %>>1.1</option>
228
+ <option value="1.2"<%= ' selected' if params[:ssl]&.dig(:version) == '1.2' %>>1.2</option>
229
+ </select>
230
+ </div>
231
+
232
+ <div class="field">
233
+ <label class="has-text-weight-semibold">Max Version:</label>
234
+ <select class="select" name="ssl[max_version]">
235
+ <option value="">
236
+ <option value="1.0"<%= ' selected' if params[:ssl]&.dig(:version) == '1.0' %>>1.0</option>
237
+ <option value="1.1"<%= ' selected' if params[:ssl]&.dig(:version) == '1.1' %>>1.1</option>
238
+ <option value="1.2"<%= ' selected' if params[:ssl]&.dig(:version) == '1.2' %>>1.2</option>
239
+ </select>
240
+ </div>
241
+
242
+ <div class="field">
243
+ <label class="has-text-weight-semibold">Verify:</label>
244
+ <select class="select" name="ssl[verify]">
245
+ <option value="">
246
+ <option value="none"<%= ' selected' if params[:verify] == 'none' %>>None</option>
247
+ <option value="peer"<%= ' selected' if params[:verify] == 'peer' %>>Peer</option>
248
+ <option value="fail_if_no_peer_cert"<%= ' selected' if params[:verify] == 'fail_if_no_peer_cert' %>>Fail if no peer cert</option>
249
+ </select>
250
+ </div>
251
+
252
+ <div class="field">
253
+ <label class="has-text-weight-semibold">Verify Depth:</label>
254
+
255
+ <div class="control">
256
+ <% if @errors && @errors[:ssl]&.dig(:verify_depth) %>
257
+ <input class="input is-danger" type="number" name="ssl[verify_depth]" value="<%=hattr params[:verify_depth] %>">
258
+
259
+ <% @errors[:ssl][:verify_depth].each do |error| %>
260
+ <p class="help is-danger"><%=h error %></p>
261
+ <% end %>
262
+ <% else %>
263
+ <input class="input" type="number" name="ssl[verify_depth]" value="<%=hattr params[:verify_depth] %>">
264
+ <% end %>
265
+ </div>
266
+ </div>
267
+
268
+ <div class="field">
269
+ <label class="has-text-weight-semibold">Verify Hostname:</label>
270
+
271
+ <div class="control">
272
+ <% if @errors && @errors[:ssl]&.dig(:verify_hostname) %>
273
+ <input class="checkbox is-danger" type="checkbox" name="ssl[verify_hostname]" value="<%=hattr params[:verify_hostname] %>">
274
+
275
+ <% @errors[:ssl][:verify_hostname].each do |error| %>
276
+ <p class="help is-danger"><%=h error %></p>
277
+ <% end %>
278
+ <% else %>
279
+ <input class="checkbox is-danger" type="checkbox" name="ssl[verify_hostname]" value="<%=hattr params[:verify_hostname] %>">
280
+ <% end %>
281
+ </div>
282
+ </div>
283
+ </div>
284
+ </div>
285
+ </div>
286
+
287
+ <% if @http_response %>
288
+ <div>
289
+ <pre>
290
+ <%=h @http_response.code %> <%= @http_response.message %>
291
+ </pre>
292
+
293
+ <pre>
294
+ <% @http_response.each_capitalized do |name, value| %>
295
+ <%=h name%>: <%=h value %>
296
+ <% end %>
297
+ </pre>
298
+
299
+ <pre>
300
+ <%=h @http_response.body %>
301
+ </pre>
302
+ </div>
303
+ <% end %>
@@ -1,4 +1,7 @@
1
- <h1>Payload: <%=h @payload.id %></h1>
1
+ <div class="is-flex is-justify-content-space-between">
2
+ <h1>Payload: <%=h @payload.id %></h1>
3
+ <a href="/payloads/build/<%=hattr @payload.id %>" class="button is-primary">Build</a>
4
+ </div>
2
5
 
3
6
  <table class="table">
4
7
  <tbody>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ronin-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.rc1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Postmodern
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-23 00:00:00.000000000 Z
11
+ date: 2024-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-schema
@@ -170,154 +170,168 @@ dependencies:
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: 1.1.0.rc1
173
+ version: '1.1'
174
174
  type: :runtime
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: 1.1.0.rc1
180
+ version: '1.1'
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: ronin-core
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: 0.2.0.rc1
187
+ version: '0.2'
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: 0.2.0.rc1
194
+ version: '0.2'
195
+ - !ruby/object:Gem::Dependency
196
+ name: ronin-repos
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.2'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '0.2'
195
209
  - !ruby/object:Gem::Dependency
196
210
  name: ronin-db-activerecord
197
211
  requirement: !ruby/object:Gem::Requirement
198
212
  requirements:
199
213
  - - "~>"
200
214
  - !ruby/object:Gem::Version
201
- version: 0.2.0.rc1
215
+ version: '0.2'
202
216
  type: :runtime
203
217
  prerelease: false
204
218
  version_requirements: !ruby/object:Gem::Requirement
205
219
  requirements:
206
220
  - - "~>"
207
221
  - !ruby/object:Gem::Version
208
- version: 0.2.0.rc1
222
+ version: '0.2'
209
223
  - !ruby/object:Gem::Dependency
210
224
  name: ronin-db
211
225
  requirement: !ruby/object:Gem::Requirement
212
226
  requirements:
213
227
  - - "~>"
214
228
  - !ruby/object:Gem::Version
215
- version: 0.2.0.rc1
229
+ version: '0.2'
216
230
  type: :runtime
217
231
  prerelease: false
218
232
  version_requirements: !ruby/object:Gem::Requirement
219
233
  requirements:
220
234
  - - "~>"
221
235
  - !ruby/object:Gem::Version
222
- version: 0.2.0.rc1
236
+ version: '0.2'
223
237
  - !ruby/object:Gem::Dependency
224
238
  name: ronin-payloads
225
239
  requirement: !ruby/object:Gem::Requirement
226
240
  requirements:
227
241
  - - "~>"
228
242
  - !ruby/object:Gem::Version
229
- version: 0.2.0.rc1
243
+ version: '0.2'
230
244
  type: :runtime
231
245
  prerelease: false
232
246
  version_requirements: !ruby/object:Gem::Requirement
233
247
  requirements:
234
248
  - - "~>"
235
249
  - !ruby/object:Gem::Version
236
- version: 0.2.0.rc1
250
+ version: '0.2'
237
251
  - !ruby/object:Gem::Dependency
238
252
  name: ronin-exploits
239
253
  requirement: !ruby/object:Gem::Requirement
240
254
  requirements:
241
255
  - - "~>"
242
256
  - !ruby/object:Gem::Version
243
- version: 1.1.0.rc1
257
+ version: '1.1'
244
258
  type: :runtime
245
259
  prerelease: false
246
260
  version_requirements: !ruby/object:Gem::Requirement
247
261
  requirements:
248
262
  - - "~>"
249
263
  - !ruby/object:Gem::Version
250
- version: 1.1.0.rc1
264
+ version: '1.1'
251
265
  - !ruby/object:Gem::Dependency
252
266
  name: ronin-vulns
253
267
  requirement: !ruby/object:Gem::Requirement
254
268
  requirements:
255
269
  - - "~>"
256
270
  - !ruby/object:Gem::Version
257
- version: 0.2.0.rc1
271
+ version: '0.2'
258
272
  type: :runtime
259
273
  prerelease: false
260
274
  version_requirements: !ruby/object:Gem::Requirement
261
275
  requirements:
262
276
  - - "~>"
263
277
  - !ruby/object:Gem::Version
264
- version: 0.2.0.rc1
278
+ version: '0.2'
265
279
  - !ruby/object:Gem::Dependency
266
280
  name: ronin-web-spider
267
281
  requirement: !ruby/object:Gem::Requirement
268
282
  requirements:
269
283
  - - "~>"
270
284
  - !ruby/object:Gem::Version
271
- version: 0.2.0.rc1
285
+ version: '0.2'
272
286
  type: :runtime
273
287
  prerelease: false
274
288
  version_requirements: !ruby/object:Gem::Requirement
275
289
  requirements:
276
290
  - - "~>"
277
291
  - !ruby/object:Gem::Version
278
- version: 0.2.0.rc1
292
+ version: '0.2'
279
293
  - !ruby/object:Gem::Dependency
280
294
  name: ronin-nmap
281
295
  requirement: !ruby/object:Gem::Requirement
282
296
  requirements:
283
297
  - - "~>"
284
298
  - !ruby/object:Gem::Version
285
- version: 0.1.0.rc1
299
+ version: '0.1'
286
300
  type: :runtime
287
301
  prerelease: false
288
302
  version_requirements: !ruby/object:Gem::Requirement
289
303
  requirements:
290
304
  - - "~>"
291
305
  - !ruby/object:Gem::Version
292
- version: 0.1.0.rc1
306
+ version: '0.1'
293
307
  - !ruby/object:Gem::Dependency
294
308
  name: ronin-masscan
295
309
  requirement: !ruby/object:Gem::Requirement
296
310
  requirements:
297
311
  - - "~>"
298
312
  - !ruby/object:Gem::Version
299
- version: 0.1.0.rc1
313
+ version: '0.1'
300
314
  type: :runtime
301
315
  prerelease: false
302
316
  version_requirements: !ruby/object:Gem::Requirement
303
317
  requirements:
304
318
  - - "~>"
305
319
  - !ruby/object:Gem::Version
306
- version: 0.1.0.rc1
320
+ version: '0.1'
307
321
  - !ruby/object:Gem::Dependency
308
322
  name: ronin-recon
309
323
  requirement: !ruby/object:Gem::Requirement
310
324
  requirements:
311
325
  - - "~>"
312
326
  - !ruby/object:Gem::Version
313
- version: 0.1.0.rc1
327
+ version: '0.1'
314
328
  type: :runtime
315
329
  prerelease: false
316
330
  version_requirements: !ruby/object:Gem::Requirement
317
331
  requirements:
318
332
  - - "~>"
319
333
  - !ruby/object:Gem::Version
320
- version: 0.1.0.rc1
334
+ version: '0.1'
321
335
  - !ruby/object:Gem::Dependency
322
336
  name: bundler
323
337
  requirement: !ruby/object:Gem::Requirement
@@ -334,9 +348,9 @@ dependencies:
334
348
  version: '2.0'
335
349
  description: |
336
350
  ronin-app is a small web application that is meant to be ran locally by the
337
- user. It provides a web interface to ronin-support, ronin-repos, ronin-db,
338
- ronin-payloads, ronin-exploits, as well as automating
339
- ronin-nmap, ronin-masscan, ronin-web-spider, ronin-recon, and ronin-vulns.
351
+ user. It provides a web interface to ronin-support, ronin-repos, ronin-db,
352
+ ronin-payloads, ronin-exploits, as well as automating
353
+ ronin-nmap, ronin-masscan, ronin-web-spider, ronin-recon, and ronin-vulns.
340
354
  email: postmodern.mod3@gmail.com
341
355
  executables:
342
356
  - ronin-app
@@ -392,6 +406,7 @@ files:
392
406
  - lib/ronin/app/types/nmap.rb
393
407
  - lib/ronin/app/types/spider.rb
394
408
  - lib/ronin/app/types/vulns.rb
409
+ - lib/ronin/app/validations/http_params.rb
395
410
  - lib/ronin/app/validations/import_params.rb
396
411
  - lib/ronin/app/validations/install_repo_params.rb
397
412
  - lib/ronin/app/validations/masscan_params.rb
@@ -482,6 +497,7 @@ files:
482
497
  - views/index.erb
483
498
  - views/layout.erb
484
499
  - views/masscan.erb
500
+ - views/network/http.erb
485
501
  - views/nmap.erb
486
502
  - views/payloads/build.erb
487
503
  - views/payloads/encoders/encode.erb
@@ -531,7 +547,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
531
547
  - !ruby/object:Gem::Version
532
548
  version: '0'
533
549
  requirements: []
534
- rubygems_version: 3.3.27
550
+ rubygems_version: 3.5.11
535
551
  signing_key:
536
552
  specification_version: 4
537
553
  summary: A local web interface for Ronin