Module: PWN::Reports::Engagement

Defined in:
lib/pwn/reports/engagement.rb

Overview

Compile engagement findings into a client-ready HTML/Markdown report.

Class Method Summary collapse

Class Method Details

.authorsObject



51
52
53
# File 'lib/pwn/reports/engagement.rb', line 51

public_class_method def self.authors
  "AUTHOR(S):\n  0day Inc. <[email protected]>\n"
end

.generate(opts = {}) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/pwn/reports/engagement.rb', line 19

public_class_method def self.generate(opts = {})
  name = (opts[:engagement] || opts[:name] || 'default').to_s
  rows = if opts[:findings]
           Array(opts[:findings])
         elsif defined?(PWN::Plugins::Findings)
           PWN::Plugins::Findings.report
         else
           []
         end
  rows = rows.sort_by { |r| -severity_rank(row: r) }
  payload = {
    title: "Engagement #{name}",
    findings: rows,
    summary: { count: rows.length, critical: rows.count { |r| r[:severity].to_s == 'critical' || r['severity'].to_s == 'critical' } }
  }
  dir = opts[:dir_path].to_s
  dir = File.join(Dir.home, '.pwn', 'exports') if dir.empty?
  report_name = (opts[:report_name] || "engagement-#{name}").to_s
  {
    markdown: PWN::Reports::Markdown.generate(results_hash: payload, dir_path: dir, report_name: report_name),
    html: PWN::Reports::HTML.generate(results_hash: payload, dir_path: dir, report_name: report_name),
    json: PWN::Reports::JSON.generate(results_hash: payload, dir_path: dir, report_name: report_name)
  }
end

.helpObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/pwn/reports/engagement.rb', line 55

public_class_method def self.help
  puts "USAGE:
    # Compile findings into markdown, html, and json.
    #{self}.generate(
      engagement: 'optional - engagement name (defaults to default)',
      name: 'optional - alias for engagement',
      findings: 'optional - Array of finding hashes (defaults to Findings.report)',
      dir_path: 'optional - output directory',
      report_name: 'optional - basename without extension'
    )

    # Render one format (md|html|json) for a session/engagement.
    #{self}.render(
      session_id: 'optional - pwn-ai session id',
      format: 'optional - md, html, or json (defaults to md)',
      engagement: 'optional - engagement name',
      dir_path: 'optional - output directory',
      report_name: 'optional - basename without extension'
    )

    # Print the AUTHOR(S) string for this module.
    #{self}.authors
  "
  constants.sort
end

.render(opts = {}) ⇒ Object



9
10
11
12
13
14
15
16
17
# File 'lib/pwn/reports/engagement.rb', line 9

public_class_method def self.render(opts = {})
  out = generate(opts)
  fmt = (opts[:format] || 'md').to_s
  case fmt
  when 'html' then { path: out[:html], format: fmt }
  when 'json' then { path: out[:json], format: fmt }
  else { path: out[:markdown], format: 'md', all: out }
  end
end