casper-proxy 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ *.swp
2
+ *.gem
3
+ .bundle
4
+ Gemfile.lock
5
+ pkg/*
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3@casper
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in casper.gemspec
4
+ gemspec
@@ -0,0 +1,43 @@
1
+ # Casper
2
+
3
+ ## Introduction
4
+
5
+ casper is a transparent proxy designed to be used during a web application
6
+ penetration test during a manual target link discovery step.
7
+
8
+ Instead of just fireup a crawler, with casper you can have the link visited
9
+ during a normal user session.
10
+
11
+ This is ideal to understand the logic sequence steps and what's happening
12
+ behind the woods.
13
+
14
+ ## Usage
15
+
16
+ Running casper it is very easy:
17
+
18
+ ```
19
+ $ casper
20
+
21
+ [2012-06-27 08:52:47] INFO WEBrick 1.3.1
22
+ [2012-06-27 08:52:47] INFO ruby 1.9.3 (2012-04-20) [x86_64-darwin11.4.0]
23
+ [2012-06-27 08:52:47] INFO Casper::Proxy#start: pid=24323 port=8080
24
+ ```
25
+
26
+ Now you can configure your browser to use http://localhost:8080 as proxy server
27
+ and watching all requests reaching the target.
28
+
29
+ If you don't want to be bothered by too much noise on screen, you can ask
30
+ casper only to trace requests for the url you're interested to:
31
+
32
+ ```
33
+ $ casper -T theapptotest.com
34
+ ```
35
+
36
+ ## Talking to the proxy server
37
+
38
+ casper is configured to handle some signals and react accordingly:
39
+
40
+ * SIGINT: shutdown the server
41
+ * SIGINFO: the server will put an informational string about how many requests were collected and how many unique hosts were discovered
42
+ * SIGUSR1: the server will dump all the hosts you're browser communicated with
43
+ * SIGUSR2: the server will dump all logged urls
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ require "casper"
3
+ require 'getoptlong'
4
+
5
+ opts = GetoptLong.new(
6
+ [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
7
+ [ '--version', '-v', GetoptLong::NO_ARGUMENT ],
8
+ [ '--trace', '-T', GetoptLong::REQUIRED_ARGUMENT],
9
+ [ '--port', '-p', GetoptLong::REQUIRED_ARGUMENT ]
10
+ )
11
+
12
+ options = {:trace=>nil, :Port=>nil}
13
+ opts.each do |opt, arg|
14
+ case opt
15
+ when '--help'
16
+ puts "casper - HTTP transparent proxy v#{Casper::Version.version}"
17
+ printf "usage: casper [arguments]\n"
18
+ printf "\n\t-T domain: log all requests make to the domain specified as argument discarding other\n"
19
+ printf "\t-p port: bind the proxy at the specified port number\n"
20
+ printf "\t-h: show this help\n"
21
+ printf "\t-v: show casper version\n"
22
+ exit 0
23
+ when '--version'
24
+ puts "#{Casper::Version.version}"
25
+ exit 0
26
+ when '--trace'
27
+ options[:trace] = arg
28
+ when '--port'
29
+ options[:Port] = arg
30
+ end
31
+ end
32
+
33
+
34
+ server = Casper::Proxy.new(options)
35
+ trap("INT") { server.shutdown }
36
+ trap("INFO") { server.info }
37
+ trap("USR1") { server.dump }
38
+ trap("USR2") { server.get_urls }
39
+ server.start
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "casper/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "casper-proxy"
7
+ s.version = Casper::Version.version
8
+ s.authors = ["Paolo Perego"]
9
+ s.email = ["thesp0nge@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{A transparent HTTP proxy useful in the preliminary recognize step for a web application security assessment}
12
+ s.description = %q{A transparent HTTP proxy useful in the preliminary recognize step for a web application security assessment}
13
+
14
+ s.rubyforge_project = "casper"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_development_dependency "rake"
22
+ s.add_development_dependency "rspec"
23
+
24
+ end
@@ -0,0 +1,67 @@
1
+ require "webrick"
2
+ require "webrick/httpproxy"
3
+ require "casper/version"
4
+
5
+ module Casper
6
+ class Proxy < WEBrick::HTTPProxyServer
7
+ attr_reader :req_count
8
+ attr_reader :hosts
9
+
10
+ def initialize(config={})
11
+ @req_count = 0
12
+ @hosts=[]
13
+ @urls=[]
14
+ @trace_domain = ""
15
+ @trace_domain = config[:trace] if config[:trace] and ! config[:trace].empty?
16
+
17
+ config[:Port] = 8080 if ! config[:Port]
18
+ config[:AccessLog] = []
19
+ config[:ProxyContentHandler] = Proc.new do |req, res|
20
+ log_requests(req, res)
21
+ end
22
+
23
+ super(config)
24
+ end
25
+
26
+ def info
27
+ $stdout.puts "[#{Time.now}] INFO #{@req_count} requests to #{@hosts.count} unique hosts"
28
+ end
29
+
30
+ def dump
31
+ $stdout.puts "Hosts we communicate with "
32
+ if (@hosts.count == 0)
33
+ $stdout.puts "None\n"
34
+
35
+ else
36
+ @hosts.each do |h|
37
+ $stdout.puts " >>> #{h}\n"
38
+ end
39
+ end
40
+ end
41
+
42
+ def get_urls
43
+ @urls.each do |u|
44
+ $stdout.puts "#{u}\n"
45
+ end
46
+ end
47
+
48
+ private
49
+ def log_requests(req, res)
50
+ if (@trace_domain == "") or ( ! req.request_line.index(@trace_domain).nil?)
51
+ $stdout.puts "[#{Time.now}] #{req.request_line.chomp} => #{res.status}\n"
52
+ $stdout.puts "---> #{req.body} #{req.request_method}" if req.request_method == "POST"
53
+ if @urls.index(req.request_line.chomp).nil?
54
+ @urls << req.request_line.chomp
55
+ end
56
+ if @hosts.index(req.host).nil?
57
+ @hosts << req.host
58
+ end
59
+ inc_req_count
60
+ end
61
+ end
62
+
63
+ def inc_req_count
64
+ @req_count += 1
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,16 @@
1
+ module Casper
2
+ module Version
3
+ MAJOR = 1
4
+ MINOR = 0
5
+ PATCH = 0
6
+ BUILD = ''
7
+
8
+ def self.version
9
+ if BUILD.empty?
10
+ return [MAJOR, MINOR, PATCH].compact.join('.')
11
+ else
12
+ return [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1 @@
1
+ require 'casper'
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: casper-proxy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Paolo Perego
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: A transparent HTTP proxy useful in the preliminary recognize step for
47
+ a web application security assessment
48
+ email:
49
+ - thesp0nge@gmail.com
50
+ executables:
51
+ - casper
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - .gitignore
56
+ - .rvmrc
57
+ - Gemfile
58
+ - README.md
59
+ - Rakefile
60
+ - bin/casper
61
+ - casper.gemspec
62
+ - lib/casper.rb
63
+ - lib/casper/version.rb
64
+ - spec/spec_helper.rb
65
+ homepage: ''
66
+ licenses: []
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ segments:
78
+ - 0
79
+ hash: -379329322285311904
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ segments:
87
+ - 0
88
+ hash: -379329322285311904
89
+ requirements: []
90
+ rubyforge_project: casper
91
+ rubygems_version: 1.8.24
92
+ signing_key:
93
+ specification_version: 3
94
+ summary: A transparent HTTP proxy useful in the preliminary recognize step for a web
95
+ application security assessment
96
+ test_files:
97
+ - spec/spec_helper.rb