ronin-support 0.1.0.pre1
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.
- data/.document +4 -0
- data/.rspec +1 -0
- data/.yardopts +1 -0
- data/COPYING.txt +504 -0
- data/ChangeLog.md +4 -0
- data/Gemfile +23 -0
- data/README.md +98 -0
- data/Rakefile +29 -0
- data/gemspec.yml +20 -0
- data/lib/ronin/extensions.rb +28 -0
- data/lib/ronin/extensions/file.rb +63 -0
- data/lib/ronin/extensions/ip_addr.rb +220 -0
- data/lib/ronin/extensions/kernel.rb +45 -0
- data/lib/ronin/extensions/meta.rb +22 -0
- data/lib/ronin/extensions/meta/object.rb +24 -0
- data/lib/ronin/extensions/string.rb +200 -0
- data/lib/ronin/formatting.rb +26 -0
- data/lib/ronin/formatting/binary.rb +22 -0
- data/lib/ronin/formatting/digest.rb +22 -0
- data/lib/ronin/formatting/extensions.rb +25 -0
- data/lib/ronin/formatting/extensions/binary.rb +24 -0
- data/lib/ronin/formatting/extensions/binary/file.rb +35 -0
- data/lib/ronin/formatting/extensions/binary/integer.rb +147 -0
- data/lib/ronin/formatting/extensions/binary/string.rb +363 -0
- data/lib/ronin/formatting/extensions/digest.rb +23 -0
- data/lib/ronin/formatting/extensions/digest/file.rb +117 -0
- data/lib/ronin/formatting/extensions/digest/string.rb +80 -0
- data/lib/ronin/formatting/extensions/http.rb +23 -0
- data/lib/ronin/formatting/extensions/http/integer.rb +57 -0
- data/lib/ronin/formatting/extensions/http/string.rb +102 -0
- data/lib/ronin/formatting/extensions/text.rb +23 -0
- data/lib/ronin/formatting/extensions/text/array.rb +125 -0
- data/lib/ronin/formatting/extensions/text/string.rb +206 -0
- data/lib/ronin/formatting/http.rb +22 -0
- data/lib/ronin/formatting/text.rb +22 -0
- data/lib/ronin/network.rb +29 -0
- data/lib/ronin/network/esmtp.rb +22 -0
- data/lib/ronin/network/extensions.rb +29 -0
- data/lib/ronin/network/extensions/esmtp.rb +22 -0
- data/lib/ronin/network/extensions/esmtp/net.rb +100 -0
- data/lib/ronin/network/extensions/http.rb +22 -0
- data/lib/ronin/network/extensions/http/net.rb +661 -0
- data/lib/ronin/network/extensions/imap.rb +22 -0
- data/lib/ronin/network/extensions/imap/net.rb +124 -0
- data/lib/ronin/network/extensions/pop3.rb +22 -0
- data/lib/ronin/network/extensions/pop3/net.rb +92 -0
- data/lib/ronin/network/extensions/smtp.rb +22 -0
- data/lib/ronin/network/extensions/smtp/net.rb +110 -0
- data/lib/ronin/network/extensions/ssl.rb +22 -0
- data/lib/ronin/network/extensions/ssl/net.rb +147 -0
- data/lib/ronin/network/extensions/tcp.rb +22 -0
- data/lib/ronin/network/extensions/tcp/net.rb +304 -0
- data/lib/ronin/network/extensions/telnet.rb +22 -0
- data/lib/ronin/network/extensions/telnet/net.rb +156 -0
- data/lib/ronin/network/extensions/udp.rb +22 -0
- data/lib/ronin/network/extensions/udp/net.rb +226 -0
- data/lib/ronin/network/http.rb +24 -0
- data/lib/ronin/network/http/exceptions.rb +22 -0
- data/lib/ronin/network/http/exceptions/unknown_request.rb +29 -0
- data/lib/ronin/network/http/http.rb +290 -0
- data/lib/ronin/network/http/proxy.rb +307 -0
- data/lib/ronin/network/imap.rb +49 -0
- data/lib/ronin/network/network.rb +41 -0
- data/lib/ronin/network/pop3.rb +49 -0
- data/lib/ronin/network/smtp.rb +24 -0
- data/lib/ronin/network/smtp/email.rb +143 -0
- data/lib/ronin/network/smtp/smtp.rb +68 -0
- data/lib/ronin/network/ssl.rb +47 -0
- data/lib/ronin/network/tcp.rb +22 -0
- data/lib/ronin/network/telnet.rb +109 -0
- data/lib/ronin/network/udp.rb +22 -0
- data/lib/ronin/path.rb +132 -0
- data/lib/ronin/support.rb +28 -0
- data/lib/ronin/support/inflector.rb +40 -0
- data/lib/ronin/support/version.rb +27 -0
- data/lib/ronin/templates.rb +23 -0
- data/lib/ronin/templates/erb.rb +75 -0
- data/lib/ronin/templates/template.rb +161 -0
- data/ronin-support.gemspec +10 -0
- data/spec/extensions/file_spec.rb +24 -0
- data/spec/extensions/ip_addr_spec.rb +171 -0
- data/spec/extensions/kernel_spec.rb +30 -0
- data/spec/extensions/string_spec.rb +177 -0
- data/spec/formatting/binary/helpers/hexdumps.rb +16 -0
- data/spec/formatting/binary/helpers/hexdumps/ascii.bin +0 -0
- data/spec/formatting/binary/helpers/hexdumps/hexdump_decimal_shorts.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/hexdump_hex_bytes.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/hexdump_hex_shorts.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/hexdump_octal_bytes.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/hexdump_octal_shorts.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/hexdump_repeated.txt +6 -0
- data/spec/formatting/binary/helpers/hexdumps/od_decimal_bytes.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_decimal_ints.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_decimal_quads.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_decimal_shorts.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_hex_bytes.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_hex_ints.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_hex_quads.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_hex_shorts.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_octal_bytes.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_octal_ints.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_octal_quads.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_octal_shorts.txt +17 -0
- data/spec/formatting/binary/helpers/hexdumps/od_repeated.txt +6 -0
- data/spec/formatting/binary/helpers/hexdumps/repeated.bin +1 -0
- data/spec/formatting/binary/integer_spec.rb +140 -0
- data/spec/formatting/binary/string_spec.rb +306 -0
- data/spec/formatting/digest/string_spec.rb +82 -0
- data/spec/formatting/http/integer_spec.rb +42 -0
- data/spec/formatting/http/string_spec.rb +76 -0
- data/spec/formatting/text/array_spec.rb +105 -0
- data/spec/formatting/text/string_spec.rb +180 -0
- data/spec/network/http/http_spec.rb +280 -0
- data/spec/network/http/proxy_spec.rb +150 -0
- data/spec/network/network_spec.rb +8 -0
- data/spec/network/ssl_spec.rb +14 -0
- data/spec/path_spec.rb +84 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support_spec.rb +8 -0
- data/spec/templates/classes/example_erb.rb +11 -0
- data/spec/templates/classes/example_template.rb +35 -0
- data/spec/templates/erb_spec.rb +21 -0
- data/spec/templates/helpers/data.rb +9 -0
- data/spec/templates/helpers/data/includes/_relative.erb +1 -0
- data/spec/templates/helpers/data/templates/example.erb +1 -0
- data/spec/templates/template_spec.rb +54 -0
- metadata +286 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Ronin - A Ruby platform for exploit development and security research.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2006-2010 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
5
|
+
#
|
|
6
|
+
# This library is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
8
|
+
# License as published by the Free Software Foundation; either
|
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# Lesser General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
17
|
+
# License along with this library; if not, write to the Free Software
|
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
19
|
+
# Boston, MA 02110-1301 USA
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
require 'ronin/network/extensions/udp/net'
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Ronin - A Ruby platform for exploit development and security research.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2006-2010 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
5
|
+
#
|
|
6
|
+
# This library is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
8
|
+
# License as published by the Free Software Foundation; either
|
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# Lesser General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
17
|
+
# License along with this library; if not, write to the Free Software
|
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
19
|
+
# Boston, MA 02110-1301 USA
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
require 'socket'
|
|
23
|
+
|
|
24
|
+
module Net
|
|
25
|
+
#
|
|
26
|
+
# Creates a new UDPSocket object connected to a given host and port.
|
|
27
|
+
#
|
|
28
|
+
# @param [String] host
|
|
29
|
+
# The host to connect to.
|
|
30
|
+
#
|
|
31
|
+
# @param [Integer] port
|
|
32
|
+
# The port to connect to.
|
|
33
|
+
#
|
|
34
|
+
# @param [String] local_host (nil)
|
|
35
|
+
# The local host to bind to.
|
|
36
|
+
#
|
|
37
|
+
# @param [Integer] local_port (nil)
|
|
38
|
+
# The local port to bind to.
|
|
39
|
+
#
|
|
40
|
+
# @yield [socket]
|
|
41
|
+
# If a block is given, it will be passed the newly created socket.
|
|
42
|
+
#
|
|
43
|
+
# @yieldparam [UDPsocket] socket
|
|
44
|
+
# The newly created UDPSocket object.
|
|
45
|
+
#
|
|
46
|
+
# @return [UDPSocket]
|
|
47
|
+
# The newly created UDPSocket object.
|
|
48
|
+
#
|
|
49
|
+
# @example
|
|
50
|
+
# Net.udp_connect('www.hackety.org',80)
|
|
51
|
+
# # => UDPSocket
|
|
52
|
+
#
|
|
53
|
+
# @example
|
|
54
|
+
# Net.udp_connect('www.wired.com',80) do |sock|
|
|
55
|
+
# puts sock.readlines
|
|
56
|
+
# end
|
|
57
|
+
#
|
|
58
|
+
def Net.udp_connect(host,port,local_host=nil,local_port=nil)
|
|
59
|
+
host = host.to_s
|
|
60
|
+
local_host = if local_host
|
|
61
|
+
local_host.to_s
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
sock = UDPSocket.new(host,port,local_host,local_port)
|
|
65
|
+
|
|
66
|
+
yield sock if block_given?
|
|
67
|
+
return sock
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# Creates a new UDPSocket object, connected to a given host and port.
|
|
72
|
+
# The given data will then be written to the newly created UDPSocket.
|
|
73
|
+
#
|
|
74
|
+
# @param [String] data
|
|
75
|
+
# The data to send through the connection.
|
|
76
|
+
#
|
|
77
|
+
# @param [String] host
|
|
78
|
+
# The host to connect to.
|
|
79
|
+
#
|
|
80
|
+
# @param [Integer] port
|
|
81
|
+
# The port to connect to.
|
|
82
|
+
#
|
|
83
|
+
# @param [String] local_host (nil)
|
|
84
|
+
# The local host to bind to.
|
|
85
|
+
#
|
|
86
|
+
# @param [Integer] local_port (nil)
|
|
87
|
+
# The local port to bind to.
|
|
88
|
+
#
|
|
89
|
+
# @yield [socket]
|
|
90
|
+
# If a block is given, it will be passed the newly created socket.
|
|
91
|
+
#
|
|
92
|
+
# @yieldparam [UDPsocket] socket
|
|
93
|
+
# The newly created UDPSocket object.
|
|
94
|
+
#
|
|
95
|
+
# @return [UDPSocket]
|
|
96
|
+
# The newly created UDPSocket object.
|
|
97
|
+
#
|
|
98
|
+
def Net.udp_connect_and_send(data,host,port,local_host=nil,local_port=nil)
|
|
99
|
+
sock = Net.udp_connect(host,port,local_host,local_port)
|
|
100
|
+
sock.write(data)
|
|
101
|
+
|
|
102
|
+
yield sock if block_given?
|
|
103
|
+
return sock
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
#
|
|
107
|
+
# Creates a new temporary UDPSocket object, connected to the given host
|
|
108
|
+
# and port.
|
|
109
|
+
#
|
|
110
|
+
# @param [String] host
|
|
111
|
+
# The host to connect to.
|
|
112
|
+
#
|
|
113
|
+
# @param [Integer] port
|
|
114
|
+
# The port to connect to.
|
|
115
|
+
#
|
|
116
|
+
# @param [String] local_host (nil)
|
|
117
|
+
# The local host to bind to.
|
|
118
|
+
#
|
|
119
|
+
# @param [Integer] local_port (nil)
|
|
120
|
+
# The local port to bind to.
|
|
121
|
+
#
|
|
122
|
+
# @yield [socket]
|
|
123
|
+
# If a block is given, it will be passed the newly created socket.
|
|
124
|
+
# After the block has returned, the socket will then be closed.
|
|
125
|
+
#
|
|
126
|
+
# @yieldparam [UDPsocket] socket
|
|
127
|
+
# The newly created UDPSocket object.
|
|
128
|
+
#
|
|
129
|
+
# @return [nil]
|
|
130
|
+
#
|
|
131
|
+
def Net.udp_session(host,port,local_host=nil,local_port=nil)
|
|
132
|
+
sock = Net.udp_connect(host,port,local_host,local_port)
|
|
133
|
+
|
|
134
|
+
yield sock if block_given?
|
|
135
|
+
|
|
136
|
+
sock.close
|
|
137
|
+
return nil
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
#
|
|
141
|
+
# Reads the banner from the service running on the given host and port.
|
|
142
|
+
#
|
|
143
|
+
# @param [String] host
|
|
144
|
+
# The host to connect to.
|
|
145
|
+
#
|
|
146
|
+
# @param [Integer] port
|
|
147
|
+
# The port to connect to.
|
|
148
|
+
#
|
|
149
|
+
# @param [String] local_host (nil)
|
|
150
|
+
# The local host to bind to.
|
|
151
|
+
#
|
|
152
|
+
# @param [Integer] local_port (nil)
|
|
153
|
+
# The local port to bind to.
|
|
154
|
+
#
|
|
155
|
+
# @yield [banner]
|
|
156
|
+
# If a block is given, it will be passed the grabbed banner.
|
|
157
|
+
#
|
|
158
|
+
# @yieldparam [String] banner
|
|
159
|
+
# The grabbed banner.
|
|
160
|
+
#
|
|
161
|
+
# @return [String]
|
|
162
|
+
# The grabbed banner.
|
|
163
|
+
#
|
|
164
|
+
def Net.udp_banner(host,port,local_host=nil,local_port=nil)
|
|
165
|
+
banner = nil
|
|
166
|
+
|
|
167
|
+
Net.udp_session(host,port,local_host,local_port) do |sock|
|
|
168
|
+
banner = sock.readline
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
yield banner if block_given?
|
|
172
|
+
return banner
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
#
|
|
176
|
+
# Creates a new UDPServer listening on a given host and port.
|
|
177
|
+
#
|
|
178
|
+
# @param [Integer] port
|
|
179
|
+
# The local port to listen on.
|
|
180
|
+
#
|
|
181
|
+
# @param [String] host ('0.0.0.0')
|
|
182
|
+
# The host to bind to.
|
|
183
|
+
#
|
|
184
|
+
# @return [UDPServer]
|
|
185
|
+
# The new UDP server.
|
|
186
|
+
#
|
|
187
|
+
# @example
|
|
188
|
+
# Net.udp_server(1337)
|
|
189
|
+
#
|
|
190
|
+
def Net.udp_server(port,host='0.0.0.0')
|
|
191
|
+
host = host.to_s
|
|
192
|
+
server = UDPServer.new(host,port)
|
|
193
|
+
|
|
194
|
+
yield server if block_given?
|
|
195
|
+
return server
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
#
|
|
199
|
+
# Creates a new temporary UDPServer listening on a given host and port.
|
|
200
|
+
#
|
|
201
|
+
# @param [Integer] port
|
|
202
|
+
# The local port to bind to.
|
|
203
|
+
#
|
|
204
|
+
# @param [String] host ('0.0.0.0')
|
|
205
|
+
# The host to bind to.
|
|
206
|
+
#
|
|
207
|
+
# @yield [server]
|
|
208
|
+
# The block which will be called after the _server_ has been created.
|
|
209
|
+
# After the block has finished, the _server_ will be closed.
|
|
210
|
+
#
|
|
211
|
+
# @yieldparam [UDPServer] server
|
|
212
|
+
# The newly created UDP server.
|
|
213
|
+
#
|
|
214
|
+
# @return [nil]
|
|
215
|
+
#
|
|
216
|
+
# @example
|
|
217
|
+
# Net.udp_server_session(1337) do |server|
|
|
218
|
+
# data, sender = server.recvfrom(1024)
|
|
219
|
+
# end
|
|
220
|
+
#
|
|
221
|
+
def Net.udp_server_session(port,host='0.0.0.0',&block)
|
|
222
|
+
server = Net.udp_server(port,host,&block)
|
|
223
|
+
server.close()
|
|
224
|
+
return nil
|
|
225
|
+
end
|
|
226
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Ronin - A Ruby platform for exploit development and security research.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2006-2010 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
5
|
+
#
|
|
6
|
+
# This library is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
8
|
+
# License as published by the Free Software Foundation; either
|
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# Lesser General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
17
|
+
# License along with this library; if not, write to the Free Software
|
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
19
|
+
# Boston, MA 02110-1301 USA
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
require 'ronin/network/http/exceptions'
|
|
23
|
+
require 'ronin/network/http/http'
|
|
24
|
+
require 'ronin/network/extensions/http'
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Ronin - A Ruby platform for exploit development and security research.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2006-2010 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
5
|
+
#
|
|
6
|
+
# This library is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
8
|
+
# License as published by the Free Software Foundation; either
|
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# Lesser General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
17
|
+
# License along with this library; if not, write to the Free Software
|
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
19
|
+
# Boston, MA 02110-1301 USA
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
require 'ronin/network/http/exceptions/unknown_request'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Ronin - A Ruby platform for exploit development and security research.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2006-2010 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
5
|
+
#
|
|
6
|
+
# This library is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
8
|
+
# License as published by the Free Software Foundation; either
|
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# Lesser General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
17
|
+
# License along with this library; if not, write to the Free Software
|
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
19
|
+
# Boston, MA 02110-1301 USA
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
module Ronin
|
|
23
|
+
module Network
|
|
24
|
+
module HTTP
|
|
25
|
+
class UnknownRequest < StandardError
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Ronin - A Ruby platform for exploit development and security research.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2006-2010 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
5
|
+
#
|
|
6
|
+
# This library is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
8
|
+
# License as published by the Free Software Foundation; either
|
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
+
# Lesser General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
|
17
|
+
# License along with this library; if not, write to the Free Software
|
|
18
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
19
|
+
# Boston, MA 02110-1301 USA
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
require 'ronin/network/http/exceptions/unknown_request'
|
|
23
|
+
require 'ronin/network/http/proxy'
|
|
24
|
+
require 'ronin/network/extensions/http'
|
|
25
|
+
|
|
26
|
+
module Ronin
|
|
27
|
+
module Network
|
|
28
|
+
module HTTP
|
|
29
|
+
#
|
|
30
|
+
# The Ronin HTTP proxy to use. Parses the value of the `HTTP_PROXY`
|
|
31
|
+
# environment variable if set.
|
|
32
|
+
#
|
|
33
|
+
# @return [Proxy]
|
|
34
|
+
# The Ronin HTTP proxy.
|
|
35
|
+
#
|
|
36
|
+
# @see Proxy.new
|
|
37
|
+
# @see Proxy.parse
|
|
38
|
+
#
|
|
39
|
+
def HTTP.proxy
|
|
40
|
+
@proxy ||= if ENV['HTTP_PROXY']
|
|
41
|
+
Proxy.parse(ENV['HTTP_PROXY'])
|
|
42
|
+
else
|
|
43
|
+
Proxy.new
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# Sets the Ronin HTTP proxy to use.
|
|
49
|
+
#
|
|
50
|
+
# @param [Proxy, URI::HTTP, Hash, String] new_proxy
|
|
51
|
+
# The new proxy information to use.
|
|
52
|
+
#
|
|
53
|
+
# @return [Proxy]
|
|
54
|
+
# The new proxy.
|
|
55
|
+
#
|
|
56
|
+
# @raise [ArgumentError]
|
|
57
|
+
# The given proxy information was not a {Proxy}, `URI::HTTP`,
|
|
58
|
+
# `Hash` or {String}.
|
|
59
|
+
#
|
|
60
|
+
def HTTP.proxy=(new_proxy)
|
|
61
|
+
@proxy = Proxy.create(new_proxy)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
#
|
|
65
|
+
# The default Ronin HTTP User-Agent string.
|
|
66
|
+
#
|
|
67
|
+
# @return [String, nil]
|
|
68
|
+
# The default Ronin HTTP User-Agent.
|
|
69
|
+
#
|
|
70
|
+
def HTTP.user_agent
|
|
71
|
+
@user_agent ||= nil
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
#
|
|
75
|
+
# Sets the default Ronin HTTP User-Agent string.
|
|
76
|
+
#
|
|
77
|
+
# @param [String] agent
|
|
78
|
+
# The new User-Agent string to use.
|
|
79
|
+
#
|
|
80
|
+
def HTTP.user_agent=(agent)
|
|
81
|
+
@user_agent = agent
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
#
|
|
85
|
+
# Expands the URL into options.
|
|
86
|
+
#
|
|
87
|
+
# @param [URI::HTTP, String, nil] url
|
|
88
|
+
# The URL to expand.
|
|
89
|
+
#
|
|
90
|
+
# @return [Hash{Symbol => Object}]
|
|
91
|
+
# The options for the URL.
|
|
92
|
+
#
|
|
93
|
+
def HTTP.expand_url(url)
|
|
94
|
+
new_options = {
|
|
95
|
+
:port => Net::HTTP.default_port,
|
|
96
|
+
:path => '/'
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if url
|
|
100
|
+
url = case url
|
|
101
|
+
when URI
|
|
102
|
+
url
|
|
103
|
+
when Hash
|
|
104
|
+
URI::HTTP.build(url)
|
|
105
|
+
else
|
|
106
|
+
URI(url.to_s)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
new_options[:ssl] = {} if url.scheme == 'https'
|
|
110
|
+
|
|
111
|
+
new_options[:host] = url.host
|
|
112
|
+
new_options[:port] = url.port
|
|
113
|
+
|
|
114
|
+
new_options[:user] = url.user if url.user
|
|
115
|
+
new_options[:password] = url.password if url.password
|
|
116
|
+
|
|
117
|
+
new_options[:path] = url.path unless url.path.empty?
|
|
118
|
+
new_options[:path] += "?#{url.query}" if url.query
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
return new_options
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# Expands the given HTTP options.
|
|
126
|
+
#
|
|
127
|
+
# @param [Hash] options
|
|
128
|
+
# HTTP options.
|
|
129
|
+
#
|
|
130
|
+
# @option options [String, URI::HTTP, URI::HTTPS] :url
|
|
131
|
+
# The URL to request.
|
|
132
|
+
#
|
|
133
|
+
# @option options [String] :host
|
|
134
|
+
# The host to connect to.
|
|
135
|
+
#
|
|
136
|
+
# @option options [String] :port (::Net::HTTP.default_port)
|
|
137
|
+
# The port to connect to.
|
|
138
|
+
#
|
|
139
|
+
# @option options [String] :user
|
|
140
|
+
# The user to authenticate as.
|
|
141
|
+
#
|
|
142
|
+
# @option options [String] :password
|
|
143
|
+
# The password to authenticate with.
|
|
144
|
+
#
|
|
145
|
+
# @option options [String] :path ('/')
|
|
146
|
+
# The path to request.
|
|
147
|
+
#
|
|
148
|
+
# @option options [String, Hash] :proxy (Ronin::Network::HTTP.proxy)
|
|
149
|
+
# The Proxy information.
|
|
150
|
+
#
|
|
151
|
+
# @return [Hash]
|
|
152
|
+
# The expanded version of options.
|
|
153
|
+
#
|
|
154
|
+
def HTTP.expand_options(options={})
|
|
155
|
+
new_options = options.dup
|
|
156
|
+
|
|
157
|
+
if new_options[:ssl] == true
|
|
158
|
+
new_options[:ssl] = {}
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
url = new_options.delete(:url)
|
|
162
|
+
new_options.merge!(HTTP.expand_url(url))
|
|
163
|
+
|
|
164
|
+
new_options[:proxy] = if new_options.has_key?(:proxy)
|
|
165
|
+
HTTP::Proxy.create(new_options[:proxy])
|
|
166
|
+
else
|
|
167
|
+
HTTP.proxy
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
return new_options
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
#
|
|
174
|
+
# Converts an underscored, dashed, lowercase or uppercase HTTP header
|
|
175
|
+
# name to the standard camel-case HTTP header name.
|
|
176
|
+
#
|
|
177
|
+
# @param [Symbol, String] name
|
|
178
|
+
# The unformatted HTTP header name.
|
|
179
|
+
#
|
|
180
|
+
# @return [String]
|
|
181
|
+
# The camel-case HTTP header name.
|
|
182
|
+
#
|
|
183
|
+
def HTTP.header_name(name)
|
|
184
|
+
name.to_s.split(/[\s+_-]/).map { |word| word.capitalize }.join('-')
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
#
|
|
188
|
+
# Converts underscored, dashed, lowercase and uppercase HTTP headers
|
|
189
|
+
# to standard camel-cased HTTP headers.
|
|
190
|
+
#
|
|
191
|
+
# @param [Hash{Symbol,String => String}] options
|
|
192
|
+
# Ronin HTTP headers.
|
|
193
|
+
#
|
|
194
|
+
# @return [Hash]
|
|
195
|
+
# The camel-cased HTTP headers created from the given options.
|
|
196
|
+
#
|
|
197
|
+
def HTTP.headers(options={})
|
|
198
|
+
headers = {}
|
|
199
|
+
|
|
200
|
+
if HTTP.user_agent
|
|
201
|
+
headers['User-Agent'] = HTTP.user_agent
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
if options
|
|
205
|
+
options.each do |name,value|
|
|
206
|
+
headers[HTTP.header_name(name)] = value.to_s
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
return headers
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
#
|
|
214
|
+
# Creates a specific type of HTTP request object.
|
|
215
|
+
#
|
|
216
|
+
# @param [Hash] options
|
|
217
|
+
# The HTTP options for the request.
|
|
218
|
+
#
|
|
219
|
+
# @option options [Symbol, String] :method
|
|
220
|
+
# The HTTP method to use for the request.
|
|
221
|
+
#
|
|
222
|
+
# @option options [String] :path ('/')
|
|
223
|
+
# The path to request.
|
|
224
|
+
#
|
|
225
|
+
# @option options [String] :body
|
|
226
|
+
# The body of the request.
|
|
227
|
+
#
|
|
228
|
+
# @option options [Hash, String] :form_data
|
|
229
|
+
# The form data that may be sent in the body of the request.
|
|
230
|
+
#
|
|
231
|
+
# @option options [String] :user
|
|
232
|
+
# The user to authenticate as.
|
|
233
|
+
#
|
|
234
|
+
# @option options [String] :password
|
|
235
|
+
# The password to authenticate with.
|
|
236
|
+
#
|
|
237
|
+
# @option options [Hash{Symbol,String => String}] :headers
|
|
238
|
+
# Additional HTTP headers to use for the request.
|
|
239
|
+
#
|
|
240
|
+
# @return [HTTP::Request]
|
|
241
|
+
# The new HTTP Request object.
|
|
242
|
+
#
|
|
243
|
+
# @raise [ArgumentError]
|
|
244
|
+
# The `:method` option must be specified.
|
|
245
|
+
#
|
|
246
|
+
# @raise [UnknownRequest]
|
|
247
|
+
# The `:method` option did not match a known Net::HTTP request
|
|
248
|
+
# class.
|
|
249
|
+
#
|
|
250
|
+
# @see HTTP.expand_options
|
|
251
|
+
#
|
|
252
|
+
def HTTP.request(options={})
|
|
253
|
+
unless options[:method]
|
|
254
|
+
raise(ArgumentError,"the :method option must be specified")
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
name = options[:method].to_s.capitalize
|
|
258
|
+
|
|
259
|
+
unless Net::HTTP.const_defined?(name)
|
|
260
|
+
raise(UnknownRequest,"unknown HTTP request type #{name.dump}")
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
headers = HTTP.headers(options[:headers])
|
|
264
|
+
path = (options[:path] || '/').to_s
|
|
265
|
+
|
|
266
|
+
request = Net::HTTP.const_get(name).new(path,headers)
|
|
267
|
+
|
|
268
|
+
if request.request_body_permitted?
|
|
269
|
+
if options[:form_data]
|
|
270
|
+
request.set_form_data(options[:form_data])
|
|
271
|
+
elsif options[:body]
|
|
272
|
+
request.body = options[:body]
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
if (user = options.delete(:user))
|
|
277
|
+
user = user.to_s
|
|
278
|
+
|
|
279
|
+
if (password = options.delete(:password))
|
|
280
|
+
password = password.to_s
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
request.basic_auth(user,password)
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
return request
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
end
|