librex 0.0.4 → 0.0.5

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.
Files changed (389) hide show
  1. data/README.md +12 -0
  2. data/lib/rex.rb +0 -0
  3. data/lib/rex.rb.ts.rb +0 -0
  4. data/lib/rex/LICENSE +0 -0
  5. data/lib/rex/arch.rb +0 -0
  6. data/lib/rex/arch/sparc.rb +0 -0
  7. data/lib/rex/arch/sparc.rb.ut.rb +0 -0
  8. data/lib/rex/arch/x86.rb +0 -0
  9. data/lib/rex/arch/x86.rb.ut.rb +0 -0
  10. data/lib/rex/assembly/nasm.rb +0 -0
  11. data/lib/rex/assembly/nasm.rb.ut.rb +0 -0
  12. data/lib/rex/codepage.map +0 -0
  13. data/lib/rex/compat.rb +0 -0
  14. data/lib/rex/constants.rb +0 -0
  15. data/lib/rex/elfparsey.rb +0 -0
  16. data/lib/rex/elfparsey/elf.rb +0 -0
  17. data/lib/rex/elfparsey/elfbase.rb +2 -4
  18. data/lib/rex/elfparsey/exceptions.rb +0 -0
  19. data/lib/rex/elfscan.rb +0 -0
  20. data/lib/rex/elfscan/scanner.rb +0 -0
  21. data/lib/rex/elfscan/search.rb +10 -10
  22. data/lib/rex/encoder/alpha2.rb +0 -0
  23. data/lib/rex/encoder/alpha2/alpha_mixed.rb +0 -0
  24. data/lib/rex/encoder/alpha2/alpha_upper.rb +0 -0
  25. data/lib/rex/encoder/alpha2/generic.rb +0 -0
  26. data/lib/rex/encoder/alpha2/unicode_mixed.rb +0 -0
  27. data/lib/rex/encoder/alpha2/unicode_upper.rb +0 -0
  28. data/lib/rex/encoder/ndr.rb +0 -0
  29. data/lib/rex/encoder/ndr.rb.ut.rb +0 -0
  30. data/lib/rex/encoder/nonalpha.rb +0 -0
  31. data/lib/rex/encoder/nonupper.rb +0 -0
  32. data/lib/rex/encoder/xdr.rb +0 -0
  33. data/lib/rex/encoder/xdr.rb.ut.rb +0 -0
  34. data/lib/rex/encoder/xor.rb +0 -0
  35. data/lib/rex/encoder/xor/dword.rb +0 -0
  36. data/lib/rex/encoder/xor/dword_additive.rb +0 -0
  37. data/lib/rex/encoders/xor_dword.rb +0 -0
  38. data/lib/rex/encoders/xor_dword_additive.rb +0 -0
  39. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -0
  40. data/lib/rex/encoding/xor.rb +0 -0
  41. data/lib/rex/encoding/xor.rb.ts.rb +0 -0
  42. data/lib/rex/encoding/xor/byte.rb +0 -0
  43. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -0
  44. data/lib/rex/encoding/xor/dword.rb +0 -0
  45. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -0
  46. data/lib/rex/encoding/xor/dword_additive.rb +0 -0
  47. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -0
  48. data/lib/rex/encoding/xor/exceptions.rb +0 -0
  49. data/lib/rex/encoding/xor/generic.rb +0 -0
  50. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -0
  51. data/lib/rex/encoding/xor/qword.rb +0 -0
  52. data/lib/rex/encoding/xor/word.rb +0 -0
  53. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -0
  54. data/lib/rex/exceptions.rb +0 -0
  55. data/lib/rex/exceptions.rb.ut.rb +0 -0
  56. data/lib/rex/exploitation/cmdstager.rb +0 -0
  57. data/lib/rex/exploitation/cmdstager/base.rb +6 -1
  58. data/lib/rex/exploitation/cmdstager/debug_asm.rb +0 -0
  59. data/lib/rex/exploitation/cmdstager/debug_write.rb +0 -0
  60. data/lib/rex/exploitation/cmdstager/tftp.rb +8 -8
  61. data/lib/rex/exploitation/cmdstager/vbs.rb +0 -0
  62. data/lib/rex/exploitation/egghunter.rb +143 -36
  63. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -0
  64. data/lib/rex/exploitation/encryptjs.rb +0 -0
  65. data/lib/rex/exploitation/heaplib.js.b64 +0 -0
  66. data/lib/rex/exploitation/heaplib.rb +0 -0
  67. data/lib/rex/exploitation/javascriptosdetect.rb +114 -15
  68. data/lib/rex/exploitation/obfuscatejs.rb +0 -0
  69. data/lib/rex/exploitation/omelet.rb +320 -0
  70. data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
  71. data/lib/rex/exploitation/opcodedb.rb +0 -0
  72. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -0
  73. data/lib/rex/exploitation/seh.rb +0 -0
  74. data/lib/rex/exploitation/seh.rb.ut.rb +0 -0
  75. data/lib/rex/file.rb +1 -1
  76. data/lib/rex/file.rb.ut.rb +0 -0
  77. data/lib/rex/image_source.rb +0 -0
  78. data/lib/rex/image_source/disk.rb +0 -0
  79. data/lib/rex/image_source/image_source.rb +0 -0
  80. data/lib/rex/image_source/memory.rb +0 -0
  81. data/lib/rex/io/bidirectional_pipe.rb +0 -0
  82. data/lib/rex/io/datagram_abstraction.rb +0 -0
  83. data/lib/rex/io/stream.rb +1 -1
  84. data/lib/rex/io/stream_abstraction.rb +0 -0
  85. data/lib/rex/io/stream_server.rb +0 -0
  86. data/lib/rex/job_container.rb +0 -1
  87. data/lib/rex/logging.rb +0 -0
  88. data/lib/rex/logging/log_dispatcher.rb +0 -0
  89. data/lib/rex/logging/log_sink.rb +0 -0
  90. data/lib/rex/logging/sinks/flatfile.rb +0 -0
  91. data/lib/rex/logging/sinks/stderr.rb +0 -0
  92. data/lib/rex/machparsey.rb +0 -0
  93. data/lib/rex/machparsey/exceptions.rb +0 -0
  94. data/lib/rex/machparsey/machbase.rb +0 -0
  95. data/lib/rex/machscan.rb +0 -0
  96. data/lib/rex/machscan/scanner.rb +0 -0
  97. data/lib/rex/mime.rb +0 -0
  98. data/lib/rex/mime/header.rb +0 -0
  99. data/lib/rex/mime/message.rb +0 -0
  100. data/lib/rex/mime/part.rb +0 -0
  101. data/lib/rex/nop/opty2.rb +0 -0
  102. data/lib/rex/nop/opty2.rb.ut.rb +0 -0
  103. data/lib/rex/nop/opty2_tables.rb +0 -0
  104. data/lib/rex/ole.rb +0 -0
  105. data/lib/rex/ole/clsid.rb +0 -0
  106. data/lib/rex/ole/difat.rb +0 -0
  107. data/lib/rex/ole/directory.rb +0 -0
  108. data/lib/rex/ole/direntry.rb +0 -0
  109. data/lib/rex/ole/docs/dependencies.txt +8 -0
  110. data/lib/rex/ole/docs/references.txt +1 -0
  111. data/lib/rex/ole/fat.rb +0 -0
  112. data/lib/rex/ole/header.rb +3 -3
  113. data/lib/rex/ole/minifat.rb +0 -0
  114. data/lib/rex/ole/storage.rb +4 -4
  115. data/lib/rex/ole/stream.rb +0 -0
  116. data/lib/rex/ole/substorage.rb +0 -0
  117. data/lib/rex/ole/util.rb +0 -0
  118. data/lib/rex/parser/arguments.rb +0 -0
  119. data/lib/rex/parser/arguments.rb.ut.rb +0 -0
  120. data/lib/rex/parser/ini.rb +0 -0
  121. data/lib/rex/parser/ini.rb.ut.rb +0 -0
  122. data/lib/rex/parser/nexpose_xml.rb +0 -0
  123. data/lib/rex/parser/nmap_xml.rb +0 -0
  124. data/lib/rex/payloads.rb +0 -0
  125. data/lib/rex/payloads/win32.rb +0 -0
  126. data/lib/rex/payloads/win32/common.rb +0 -0
  127. data/lib/rex/payloads/win32/kernel.rb +0 -0
  128. data/lib/rex/payloads/win32/kernel/common.rb +0 -0
  129. data/lib/rex/payloads/win32/kernel/migration.rb +0 -0
  130. data/lib/rex/payloads/win32/kernel/recovery.rb +0 -0
  131. data/lib/rex/peparsey.rb +0 -0
  132. data/lib/rex/peparsey/exceptions.rb +0 -0
  133. data/lib/rex/peparsey/pe.rb +7 -1
  134. data/lib/rex/peparsey/pe_memdump.rb +0 -0
  135. data/lib/rex/peparsey/pebase.rb +27 -2
  136. data/lib/rex/peparsey/section.rb +0 -0
  137. data/lib/rex/pescan.rb +0 -0
  138. data/lib/rex/pescan/analyze.rb +0 -0
  139. data/lib/rex/pescan/scanner.rb +0 -0
  140. data/lib/rex/pescan/search.rb +0 -0
  141. data/lib/rex/platforms.rb +0 -0
  142. data/lib/rex/platforms/windows.rb +0 -0
  143. data/lib/rex/poly.rb +0 -0
  144. data/lib/rex/poly/block.rb +0 -0
  145. data/lib/rex/poly/register.rb +0 -0
  146. data/lib/rex/poly/register/x86.rb +0 -0
  147. data/lib/rex/post.rb +0 -0
  148. data/lib/rex/post/dir.rb +0 -0
  149. data/lib/rex/post/file.rb +0 -0
  150. data/lib/rex/post/file_stat.rb +0 -0
  151. data/lib/rex/post/gen.pl +0 -0
  152. data/lib/rex/post/io.rb +0 -0
  153. data/lib/rex/post/meterpreter.rb +0 -0
  154. data/lib/rex/post/meterpreter/channel.rb +0 -0
  155. data/lib/rex/post/meterpreter/channel_container.rb +0 -0
  156. data/lib/rex/post/meterpreter/channels/pool.rb +0 -0
  157. data/lib/rex/post/meterpreter/channels/pools/file.rb +0 -0
  158. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +0 -0
  159. data/lib/rex/post/meterpreter/channels/stream.rb +0 -0
  160. data/lib/rex/post/meterpreter/client.rb +3 -0
  161. data/lib/rex/post/meterpreter/client_core.rb +0 -0
  162. data/lib/rex/post/meterpreter/dependencies.rb +0 -0
  163. data/lib/rex/post/meterpreter/extension.rb +0 -0
  164. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +0 -0
  165. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +0 -0
  166. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +0 -0
  167. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +0 -0
  168. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  169. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
  170. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +0 -0
  171. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +0 -0
  172. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +0 -0
  173. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +0 -0
  174. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +2 -1
  175. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +12 -10
  176. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +0 -0
  177. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +0 -0
  178. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +31 -0
  179. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +0 -0
  180. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +0 -0
  181. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +0 -0
  182. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +0 -0
  183. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +0 -0
  184. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +0 -0
  185. data/lib/rex/post/meterpreter/extensions/{railgun → stdapi/railgun}/api_constants.rb +38106 -38105
  186. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1804 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
  188. data/lib/rex/post/meterpreter/extensions/{railgun → stdapi/railgun/def}/def_kernel32.rb +3848 -3678
  189. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/model.rb +540 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +308 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +196 -0
  196. data/lib/rex/post/meterpreter/extensions/{railgun → stdapi/railgun}/tlv.rb +6 -9
  197. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +5 -0
  198. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +0 -0
  199. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +0 -0
  200. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +0 -0
  201. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +0 -0
  202. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +0 -0
  203. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +0 -0
  204. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +0 -0
  205. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +0 -0
  206. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +0 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +0 -0
  208. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +0 -0
  209. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +0 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +0 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +6 -0
  212. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +0 -0
  213. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +0 -0
  214. data/lib/rex/post/meterpreter/object_aliases.rb +0 -0
  215. data/lib/rex/post/meterpreter/packet.rb +23 -1
  216. data/lib/rex/post/meterpreter/packet_dispatcher.rb +13 -2
  217. data/lib/rex/post/meterpreter/packet_parser.rb +0 -0
  218. data/lib/rex/post/meterpreter/packet_response_waiter.rb +17 -10
  219. data/lib/rex/post/meterpreter/ui/console.rb +0 -0
  220. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +0 -0
  221. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +12 -7
  222. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +0 -0
  223. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +0 -0
  224. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +221 -0
  225. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +0 -0
  226. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +0 -0
  227. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +0 -0
  228. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +0 -0
  229. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +4 -3
  230. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +0 -0
  231. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +56 -1
  232. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +22 -0
  233. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +0 -0
  234. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +0 -0
  235. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +0 -0
  236. data/lib/rex/post/permission.rb +0 -0
  237. data/lib/rex/post/process.rb +0 -0
  238. data/lib/rex/post/thread.rb +0 -0
  239. data/lib/rex/post/ui.rb +0 -0
  240. data/lib/rex/proto.rb +0 -0
  241. data/lib/rex/proto.rb.ts.rb +0 -0
  242. data/lib/rex/proto/dcerpc.rb +0 -0
  243. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -0
  244. data/lib/rex/proto/dcerpc/client.rb +3 -1
  245. data/lib/rex/proto/dcerpc/exceptions.rb +0 -0
  246. data/lib/rex/proto/dcerpc/handle.rb +0 -0
  247. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -0
  248. data/lib/rex/proto/dcerpc/ndr.rb +0 -0
  249. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -0
  250. data/lib/rex/proto/dcerpc/packet.rb +0 -0
  251. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -0
  252. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -0
  253. data/lib/rex/proto/dcerpc/uuid.rb +0 -0
  254. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -0
  255. data/lib/rex/proto/dhcp.rb +7 -0
  256. data/lib/rex/proto/dhcp/constants.rb +33 -0
  257. data/lib/rex/proto/dhcp/server.rb +285 -0
  258. data/lib/rex/proto/drda.rb +0 -0
  259. data/lib/rex/proto/drda.rb.ts.rb +0 -0
  260. data/lib/rex/proto/drda/constants.rb +0 -0
  261. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -0
  262. data/lib/rex/proto/drda/packet.rb +0 -0
  263. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -0
  264. data/lib/rex/proto/drda/utils.rb +0 -0
  265. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -0
  266. data/lib/rex/proto/http.rb +0 -0
  267. data/lib/rex/proto/http.rb.ts.rb +0 -0
  268. data/lib/rex/proto/http/client.rb +27 -2
  269. data/lib/rex/proto/http/client.rb.ut.rb +4 -2
  270. data/lib/rex/proto/http/handler.rb +0 -0
  271. data/lib/rex/proto/http/handler/erb.rb +0 -0
  272. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -0
  273. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -0
  274. data/lib/rex/proto/http/handler/proc.rb +6 -0
  275. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -0
  276. data/lib/rex/proto/http/header.rb +0 -0
  277. data/lib/rex/proto/http/header.rb.ut.rb +0 -0
  278. data/lib/rex/proto/http/packet.rb +20 -19
  279. data/lib/rex/proto/http/packet.rb.ut.rb +0 -0
  280. data/lib/rex/proto/http/request.rb +0 -0
  281. data/lib/rex/proto/http/request.rb.ut.rb +0 -0
  282. data/lib/rex/proto/http/response.rb +0 -0
  283. data/lib/rex/proto/http/response.rb.ut.rb +0 -0
  284. data/lib/rex/proto/http/server.rb +5 -3
  285. data/lib/rex/proto/http/server.rb.ut.rb +0 -0
  286. data/lib/rex/proto/proxy/socks4a.rb +440 -0
  287. data/lib/rex/proto/smb.rb +0 -0
  288. data/lib/rex/proto/smb.rb.ts.rb +0 -0
  289. data/lib/rex/proto/smb/client.rb +110 -61
  290. data/lib/rex/proto/smb/client.rb.ut.rb +0 -0
  291. data/lib/rex/proto/smb/constants.rb +5 -3
  292. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -0
  293. data/lib/rex/proto/smb/crypt.rb +0 -0
  294. data/lib/rex/proto/smb/crypt.rb.ut.rb +0 -0
  295. data/lib/rex/proto/smb/exceptions.rb +0 -0
  296. data/lib/rex/proto/smb/simpleclient.rb +0 -0
  297. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -0
  298. data/lib/rex/proto/smb/utils.rb +2 -0
  299. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -0
  300. data/lib/rex/proto/sunrpc.rb +0 -0
  301. data/lib/rex/proto/sunrpc/client.rb +0 -0
  302. data/lib/rex/proto/tftp.rb +10 -1
  303. data/lib/rex/proto/tftp/constants.rb +5 -3
  304. data/lib/rex/proto/tftp/server.rb +79 -9
  305. data/lib/rex/script.rb +0 -0
  306. data/lib/rex/script/base.rb +0 -0
  307. data/lib/rex/script/meterpreter.rb +0 -0
  308. data/lib/rex/script/shell.rb +0 -0
  309. data/lib/rex/service.rb +0 -0
  310. data/lib/rex/service_manager.rb +0 -0
  311. data/lib/rex/service_manager.rb.ut.rb +0 -0
  312. data/lib/rex/services/local_relay.rb +0 -0
  313. data/lib/rex/socket.rb +6 -4
  314. data/lib/rex/socket.rb.ut.rb +0 -0
  315. data/lib/rex/socket/comm.rb +0 -0
  316. data/lib/rex/socket/comm/local.rb +0 -0
  317. data/lib/rex/socket/comm/local.rb.ut.rb +0 -0
  318. data/lib/rex/socket/ip.rb +0 -0
  319. data/lib/rex/socket/parameters.rb +0 -0
  320. data/lib/rex/socket/parameters.rb.ut.rb +0 -0
  321. data/lib/rex/socket/range_walker.rb +0 -0
  322. data/lib/rex/socket/range_walker.rb.ut.rb +0 -0
  323. data/lib/rex/socket/ssl_tcp.rb +1 -1
  324. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -0
  325. data/lib/rex/socket/ssl_tcp_server.rb +0 -0
  326. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -0
  327. data/lib/rex/socket/subnet_walker.rb +0 -0
  328. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -0
  329. data/lib/rex/socket/switch_board.rb.ut.rb +0 -0
  330. data/lib/rex/socket/tcp.rb +0 -0
  331. data/lib/rex/socket/tcp.rb.ut.rb +0 -0
  332. data/lib/rex/socket/tcp_server.rb +0 -0
  333. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -0
  334. data/lib/rex/socket/udp.rb +0 -0
  335. data/lib/rex/socket/udp.rb.ut.rb +0 -0
  336. data/lib/rex/struct2.rb +0 -0
  337. data/lib/rex/struct2/c_struct.rb +0 -0
  338. data/lib/rex/struct2/c_struct_template.rb +0 -0
  339. data/lib/rex/struct2/constant.rb +0 -0
  340. data/lib/rex/struct2/element.rb +0 -0
  341. data/lib/rex/struct2/generic.rb +0 -0
  342. data/lib/rex/struct2/restraint.rb +0 -0
  343. data/lib/rex/struct2/s_string.rb +0 -0
  344. data/lib/rex/struct2/s_struct.rb +0 -0
  345. data/lib/rex/sync.rb +0 -0
  346. data/lib/rex/sync/event.rb +0 -0
  347. data/lib/rex/sync/read_write_lock.rb +0 -0
  348. data/lib/rex/sync/ref.rb +0 -0
  349. data/lib/rex/sync/thread_safe.rb +0 -0
  350. data/lib/rex/test.rb +0 -0
  351. data/lib/rex/text.rb +13 -3
  352. data/lib/rex/text.rb.ut.rb +9 -4
  353. data/lib/rex/time.rb +0 -0
  354. data/lib/rex/transformer.rb +0 -0
  355. data/lib/rex/transformer.rb.ut.rb +0 -0
  356. data/lib/rex/ui.rb +0 -0
  357. data/lib/rex/ui/interactive.rb +0 -0
  358. data/lib/rex/ui/output.rb +0 -0
  359. data/lib/rex/ui/output/none.rb +0 -0
  360. data/lib/rex/ui/progress_tracker.rb +0 -0
  361. data/lib/rex/ui/subscriber.rb +0 -0
  362. data/lib/rex/ui/text/color.rb +0 -0
  363. data/lib/rex/ui/text/color.rb.ut.rb +0 -0
  364. data/lib/rex/ui/text/dispatcher_shell.rb +0 -0
  365. data/lib/rex/ui/text/input.rb +0 -0
  366. data/lib/rex/ui/text/input/buffer.rb +0 -0
  367. data/lib/rex/ui/text/input/readline.rb +0 -0
  368. data/lib/rex/ui/text/input/socket.rb +0 -0
  369. data/lib/rex/ui/text/input/stdio.rb +0 -0
  370. data/lib/rex/ui/text/irb_shell.rb +0 -0
  371. data/lib/rex/ui/text/output.rb +0 -0
  372. data/lib/rex/ui/text/output/buffer.rb +0 -0
  373. data/lib/rex/ui/text/output/file.rb +0 -0
  374. data/lib/rex/ui/text/output/socket.rb +0 -0
  375. data/lib/rex/ui/text/output/stdio.rb +0 -0
  376. data/lib/rex/ui/text/progress_tracker.rb +0 -0
  377. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -0
  378. data/lib/rex/ui/text/shell.rb +9 -6
  379. data/lib/rex/ui/text/table.rb +5 -0
  380. data/lib/rex/ui/text/table.rb.ut.rb +0 -0
  381. data/lib/rex/zip.rb +0 -0
  382. data/lib/rex/zip/archive.rb +29 -1
  383. data/lib/rex/zip/blocks.rb +0 -0
  384. data/lib/rex/zip/entry.rb +5 -1
  385. metadata +369 -413
  386. data/README +0 -8
  387. data/lib/rex/post/meterpreter/extensions/railgun/api.rb +0 -9303
  388. data/lib/rex/post/meterpreter/extensions/railgun/railgun.rb +0 -815
  389. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/railgun.rb +0 -57
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -8,8 +8,9 @@ module Http
8
8
 
9
9
  ###
10
10
  #
11
- # Acts as a client to an HTTP server, sending requests and receiving
12
- # responses.
11
+ # Acts as a client to an HTTP server, sending requests and receiving responses.
12
+ #
13
+ # See the RFC: http://www.w3.org/Protocols/rfc2616/rfc2616.html
13
14
  #
14
15
  ###
15
16
  class Client
@@ -172,6 +173,25 @@ class Client
172
173
  #
173
174
  # Create a CGI compatible request
174
175
  #
176
+ # Options:
177
+ # - agent: User-Agent header value
178
+ # - basic_auth: Basic-Auth header value
179
+ # - connection: Connection header value
180
+ # - cookie: Cookie header value
181
+ # - ctype: Content-Type header value, default: +application/x-www-form-urlencoded+
182
+ # - data: HTTP data (only useful with some methods, see rfc2616)
183
+ # - encode: URI encode the supplied URI
184
+ # - headers: HTTP headers as a hash, e.g. <code>{ "X-MyHeader" => "value" }</code>
185
+ # - method: HTTP method to use in the request, not limited to standard methods defined by rfc2616, default: GET
186
+ # - proto: protocol, default: HTTP
187
+ # - query: raw query string
188
+ # - raw_headers: HTTP headers as a hash
189
+ # - uri: the URI to request
190
+ # - vars_get: GET variables as a hash to be translated into a query string
191
+ # - vars_post: POST variables as a hash to be translated into POST data
192
+ # - version: version of the protocol, default: 1.1
193
+ # - vhost: Host header value
194
+ #
175
195
  def request_cgi(opts={})
176
196
  c_enc = opts['encode'] || false
177
197
  c_cgi = opts['uri'] || '/'
@@ -345,6 +365,11 @@ class Client
345
365
  buff = conn.get_once(-1, 1)
346
366
  rv = resp.parse( buff || '')
347
367
 
368
+ ##########################################################################
369
+ # XXX: NOTE: BUG: get_once currently (as of r10042) rescues "Exception"
370
+ # As such, the following rescue block will ever be reached. -jjd
371
+ ##########################################################################
372
+
348
373
  # Handle unexpected disconnects
349
374
  rescue ::Errno::EPIPE, ::EOFError, ::IOError
350
375
  case resp.state
@@ -69,8 +69,10 @@ class Rex::Proto::Http::Client::UnitTest < Test::Unit::TestCase
69
69
 
70
70
  resp = c.send_recv(r)
71
71
 
72
- assert_equal(200, resp.code)
73
- assert_equal('OK', resp.message)
72
+ #assert_equal(200, resp.code)
73
+ #assert_equal('OK', resp.message)
74
+ assert_equal(301, resp.code)
75
+ assert_equal('Moved Permanently', resp.message)
74
76
  assert_equal('1.1', resp.proto)
75
77
  end
76
78
 
File without changes
File without changes
File without changes
@@ -39,6 +39,12 @@ class Handler::Proc < Handler
39
39
  elog("Proc::on_request: Client closed connection prematurely", LogSource)
40
40
  rescue
41
41
  elog("Proc::on_request: #{$!}\n\n#{$@.join("\n")}", LogSource)
42
+ if self.server and self.server.context
43
+ exploit = self.server.context['MsfExploit']
44
+ if exploit
45
+ exploit.print_error("Exception handling request: #{$!}")
46
+ end
47
+ end
42
48
  end
43
49
  end
44
50
 
File without changes
File without changes
File without changes
@@ -92,7 +92,7 @@ class Packet
92
92
  end
93
93
  end
94
94
  rescue
95
- # This rescue might be a problem because it will swallow TimeoutError
95
+ # XXX: BUG: This rescue might be a problem because it will swallow TimeoutError
96
96
  self.error = $!
97
97
  return ParseCode::Error
98
98
  end
@@ -284,24 +284,25 @@ protected
284
284
  end
285
285
 
286
286
  # Determine how to handle data when there is no length header
287
- if(self.body_bytes_left == -1 and self.transfer_chunked != true)
288
- if(self.headers['Connection'].to_s.downcase.include?('keep-alive'))
289
- # If we are using keep-alive, but have no content-length and
290
- # no chunked transfer header, pretend this is the entire
291
- # buffer and call it done
292
- self.body_bytes_left = self.bufq.length
293
- elsif(not self.transfer_chunked and not self.headers['Content-Length'])
294
- # RFC 2616 says: "The presence of a message-body in a request
295
- # is signaled by the inclusion of a Content-Length or
296
- # Transfer-Encoding header field in the request's
297
- # message-headers."
298
- #
299
- # So if we haven't seen either a Content-Length or a
300
- # Transfer-Encoding header, there shouldn't be a message body.
301
- self.body_bytes_left = 0
302
- else
287
+ if (self.body_bytes_left == -1)
288
+ if (not self.transfer_chunked)
289
+ if (self.headers['Connection'].to_s.downcase.include?('keep-alive'))
290
+ # If we are using keep-alive, but have no content-length and
291
+ # no chunked transfer header, pretend this is the entire
292
+ # buffer and call it done
293
+ self.body_bytes_left = self.bufq.length
294
+ elsif (not self.headers['Content-Length'] and self.class == Rex::Proto::Http::Request)
295
+ # RFC 2616 says: "The presence of a message-body in a request
296
+ # is signaled by the inclusion of a Content-Length or
297
+ # Transfer-Encoding header field in the request's
298
+ # message-headers."
299
+ #
300
+ # So if we haven't seen either a Content-Length or a
301
+ # Transfer-Encoding header, there shouldn't be a message body.
302
+ self.body_bytes_left = 0
303
+ #else
303
304
  # Otherwise we need to keep reading until EOF
304
- self.body_bytes_left = -1
305
+ end
305
306
  end
306
307
  end
307
308
 
@@ -390,7 +391,7 @@ protected
390
391
 
391
392
  # If there are no more bytes left, then parsing has completed and we're
392
393
  # ready to go.
393
- if (self.transfer_chunked != 1 and self.body_bytes_left <= 0)
394
+ if (not self.transfer_chunked and self.body_bytes_left == 0)
394
395
  self.state = ParseState::Completed
395
396
  return
396
397
  end
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -99,7 +99,7 @@ class Server
99
99
  # Initializes an HTTP server as listening on the provided port and
100
100
  # hostname.
101
101
  #
102
- def initialize(port = 80, listen_host = '0.0.0.0', ssl = false, context = {})
102
+ def initialize(port = 80, listen_host = '0.0.0.0', ssl = false, context = {}, comm = nil)
103
103
  self.listen_host = listen_host
104
104
  self.listen_port = port
105
105
  self.context = context
@@ -107,6 +107,7 @@ class Server
107
107
  self.resources = {}
108
108
  self.server_name = DefaultServer
109
109
  self.ssl = ssl
110
+ self.comm = comm
110
111
  end
111
112
 
112
113
  #
@@ -132,7 +133,8 @@ class Server
132
133
  'LocalHost' => self.listen_host,
133
134
  'LocalPort' => self.listen_port,
134
135
  'Context' => self.context,
135
- 'SSL' => self.ssl
136
+ 'SSL' => self.ssl,
137
+ 'Comm' => self.comm
136
138
  )
137
139
 
138
140
  # Register callbacks
@@ -254,7 +256,7 @@ class Server
254
256
  cli.send_response(resp)
255
257
  end
256
258
 
257
- attr_accessor :listen_port, :listen_host, :server_name, :context, :ssl
259
+ attr_accessor :listen_port, :listen_host, :server_name, :context, :ssl, :comm
258
260
  attr_accessor :listener, :resources
259
261
 
260
262
  protected
File without changes
@@ -0,0 +1,440 @@
1
+ #
2
+ # sf - Sept 2010
3
+ #
4
+ require 'thread'
5
+ require 'rex/logging'
6
+ require 'rex/socket'
7
+
8
+ module Rex
9
+ module Proto
10
+ module Proxy
11
+
12
+ #
13
+ # A Socks4a proxy server.
14
+ #
15
+ class Socks4a
16
+
17
+ #
18
+ # A client connected to the Socks4a server.
19
+ #
20
+ class Client
21
+
22
+ REQUEST_VERSION = 4
23
+ REPLY_VERSION = 0
24
+
25
+ COMMAND_CONNECT = 1
26
+ COMMAND_BIND = 2
27
+
28
+ REQUEST_GRANTED = 90
29
+ REQUEST_REJECT_FAILED = 91
30
+ REQUEST_REJECT_CONNECT = 92
31
+ REQUEST_REJECT_USERID = 93
32
+
33
+ HOST = 1
34
+ PORT = 2
35
+
36
+ #
37
+ # A Socks4a packet.
38
+ #
39
+ class Packet
40
+
41
+ def initialize
42
+ @version = REQUEST_VERSION
43
+ @command = 0
44
+ @dest_port = 0
45
+ @dest_ip = '0.0.0.0'
46
+ @userid = ''
47
+ end
48
+
49
+ #
50
+ # A helper function to recv in a Socks4a packet byte by byte.
51
+ #
52
+ # sf: we could just call raw = sock.get_once but some clients
53
+ # seem to need reading this byte by byte instead.
54
+ #
55
+ def Packet.recv( sock, timeout=30 )
56
+ raw = ''
57
+ # read in the 8 byte header
58
+ while( raw.length < 8 )
59
+ raw << sock.read( 1 )
60
+ end
61
+ # if its a request there will be more data
62
+ if( raw[0..0].unpack( 'C' ).first == REQUEST_VERSION )
63
+ # read in the userid
64
+ while( raw[8..raw.length].index( "\x00" ) == nil )
65
+ raw << sock.read( 1 )
66
+ end
67
+ # if a hostname is going to be present, read it in
68
+ ip = raw[4..7].unpack( 'N' ).first
69
+ if( ( ip & 0xFFFFFF00 ) == 0x00000000 and ( ip & 0x000000FF ) != 0x00 )
70
+ hostname = ''
71
+ while( hostname.index( "\x00" ) == nil )
72
+ hostname += sock.read( 1 )
73
+ end
74
+ raw << hostname
75
+ end
76
+ end
77
+ # create a packet from this raw data...
78
+ packet = Packet.new
79
+ packet.from_r( raw ) ? packet : nil
80
+ end
81
+
82
+ #
83
+ # Pack a packet into raw bytes for transmitting on the wire.
84
+ #
85
+ def to_r
86
+ raw = [ @version, @command, @dest_port, Rex::Socket.addr_atoi( @dest_ip ) ].pack( 'CCnN' )
87
+ return raw if( @userid.empty? )
88
+ return raw + [ @userid ].pack( 'Z*' )
89
+ end
90
+
91
+ #
92
+ # Unpack a raw packet into its components.
93
+ #
94
+ def from_r( raw )
95
+ return false if( raw.length < 8 )
96
+ @version = raw[0..0].unpack( 'C' ).first
97
+ return false if( @version != REQUEST_VERSION and @version != REPLY_VERSION )
98
+ @command = raw[1..1].unpack( 'C' ).first
99
+ @dest_port = raw[2..3].unpack( 'n' ).first
100
+ @dest_ip = Rex::Socket.addr_itoa( raw[4..7].unpack( 'N' ).first )
101
+ if( raw.length > 8 )
102
+ @userid = raw[8..raw.length].unpack( 'Z*' ).first
103
+ # if this is a socks4a request we can resolve the provided hostname
104
+ if( self.is_hostname? )
105
+ hostname = raw[(8+@userid.length+1)..raw.length].unpack( 'Z*' ).first
106
+ @dest_ip = self.resolve( hostname )
107
+ # fail if we couldnt resolve the hostname
108
+ return false if( not @dest_ip )
109
+ end
110
+ else
111
+ @userid = ''
112
+ end
113
+ return true
114
+ end
115
+
116
+ def is_connect?
117
+ @command == COMMAND_CONNECT ? true : false
118
+ end
119
+
120
+ def is_bind?
121
+ @command == COMMAND_BIND ? true : false
122
+ end
123
+
124
+ attr_accessor :version, :command, :dest_port, :dest_ip, :userid
125
+
126
+ protected
127
+
128
+ #
129
+ # Resolve the given hostname into a dotted IP address.
130
+ #
131
+ def resolve( hostname )
132
+ if( not hostname.empty? )
133
+ begin
134
+ return Rex::Socket.addr_itoa( Rex::Socket.gethostbyname( hostname )[3].unpack( 'N' ).first )
135
+ rescue ::SocketError
136
+ return nil
137
+ end
138
+ end
139
+ return nil
140
+ end
141
+
142
+ #
143
+ # As per the Socks4a spec, check to see if the provided dest_ip is 0.0.0.XX
144
+ # which indicates after the @userid field contains a hostname to resolve.
145
+ #
146
+ def is_hostname?
147
+ ip = Rex::Socket.addr_atoi( @dest_ip )
148
+ if( ip & 0xFFFFFF00 == 0x00000000 )
149
+ return true if( ip & 0x000000FF != 0x00 )
150
+ end
151
+ return false
152
+ end
153
+
154
+ end
155
+
156
+ #
157
+ # A mixin for a socket to perform a relay to another socket.
158
+ #
159
+ module Relay
160
+
161
+ #
162
+ # Relay data coming in from relay_sock to this socket.
163
+ #
164
+ def relay( relay_client, relay_sock )
165
+ @relay_client = relay_client
166
+ @relay_sock = relay_sock
167
+ # start the relay thread (modified from Rex::IO::StreamAbstraction)
168
+ @relay_thread = ::Thread.new do
169
+ loop do
170
+ closed = false
171
+ buf = nil
172
+
173
+ begin
174
+ s = Rex::ThreadSafe.select( [ @relay_sock ], nil, nil, 0.2 )
175
+ if( s == nil || s[0] == nil )
176
+ next
177
+ end
178
+ rescue
179
+ closed = true
180
+ end
181
+
182
+ if( closed == false )
183
+ begin
184
+ buf = @relay_sock.sysread( 32768 )
185
+ closed = true if( buf == nil )
186
+ rescue
187
+ closed = true
188
+ end
189
+ end
190
+
191
+ if( closed == false )
192
+ total_sent = 0
193
+ total_length = buf.length
194
+ while( total_sent < total_length )
195
+ begin
196
+ data = buf[0, buf.length]
197
+ sent = self.write( data )
198
+ if( sent > 0 )
199
+ total_sent += sent
200
+ buf[0, sent] = ""
201
+ end
202
+ rescue
203
+ closed = true
204
+ break
205
+ end
206
+ end
207
+ end
208
+
209
+ if( closed )
210
+ @relay_client.stop
211
+ ::Thread.exit
212
+ end
213
+ end
214
+ end
215
+
216
+ end
217
+
218
+ end
219
+
220
+ #
221
+ # Create a new client connected to the server.
222
+ #
223
+ def initialize( server, sock )
224
+ @server = server
225
+ @lsock = sock
226
+ @rsock = nil
227
+ @client_thread = nil
228
+ @mutex = ::Mutex.new
229
+ @closed = false
230
+ end
231
+
232
+ #
233
+ # Start handling the client connection.
234
+ #
235
+ def start
236
+ # create a thread to handle this client request so as to not block the socks4a server
237
+ @client_thread = ::Thread.new do
238
+ begin
239
+ @server.add_client( self )
240
+ # get the initial client request packet
241
+ request = Packet.recv( @lsock )
242
+ raise "Invalid Socks4 request packet received." if not request
243
+ # handle the request
244
+ begin
245
+ # handle socks4a conenct requests
246
+ if( request.is_connect? )
247
+ # perform the connection request
248
+ params = {
249
+ 'PeerHost' => request.dest_ip,
250
+ 'PeerPort' => request.dest_port,
251
+ 'Comm' => @server.opts['Comm']
252
+ }
253
+ @rsock = Rex::Socket::Tcp.create( params )
254
+ # and send back success to the client
255
+ response = Packet.new
256
+ response.version = REPLY_VERSION
257
+ response.command = REQUEST_GRANTED
258
+ @lsock.put( response.to_r )
259
+ # handle socks4a bind requests
260
+ elsif( request.is_bind? )
261
+ # create a server socket for this request
262
+ params = {
263
+ 'LocalHost' => '0.0.0.0',
264
+ 'LocalPort' => 0,
265
+ 'Comm' => @server.opts['Comm']
266
+ }
267
+ bsock = Rex::Socket::TcpServer.create( params )
268
+ # send back the bind success to the client
269
+ response = Packet.new
270
+ response.version = REPLY_VERSION
271
+ response.command = REQUEST_GRANTED
272
+ response.dest_ip = '0.0.0.0'
273
+ response.dest_port = bsock.getlocalname()[PORT]
274
+ @lsock.put( response.to_r )
275
+ # accept a client connection (2 minute timeout as per spec)
276
+ begin
277
+ ::Timeout.timeout( 120 ) do
278
+ @rsock = bsock.accept
279
+ end
280
+ rescue ::Timeout::Error
281
+ raise "Timeout reached on accept request."
282
+ end
283
+ # close the listening socket
284
+ bsock.close
285
+ # verify the connection is from the dest_ip origionally specified by the client
286
+ rpeer = @rsock.getpeername
287
+ raise "Got connection from an invalid peer." if( rpeer[HOST] != request.dest_ip )
288
+ # send back the client connect success to the client
289
+ #
290
+ # sf: according to the spec we send this response back to the client, however
291
+ # I have seen some clients who bawk if they get this second response.
292
+ #
293
+ response = Packet.new
294
+ response.version = REPLY_VERSION
295
+ response.command = REQUEST_GRANTED
296
+ response.dest_ip = rpeer[HOST]
297
+ response.dest_port = rpeer[PORT]
298
+ @lsock.put( response.to_r )
299
+ else
300
+ raise "Unknown request command received #{request.command} received."
301
+ end
302
+ rescue
303
+ # send back failure to the client
304
+ response = Packet.new
305
+ response.version = REPLY_VERSION
306
+ response.command = REQUEST_REJECT_FAILED
307
+ @lsock.put( response.to_r )
308
+ # raise an exception to close this client connection
309
+ raise "Failed to handle the clients request."
310
+ end
311
+ # setup the two way relay for full duplex io
312
+ @lsock.extend( Relay )
313
+ @rsock.extend( Relay )
314
+ # start the socket relays...
315
+ @lsock.relay( self, @rsock )
316
+ @rsock.relay( self, @lsock )
317
+ rescue
318
+ wlog( "Client.start - #{$!}" )
319
+ self.stop
320
+ end
321
+ end
322
+ end
323
+
324
+ #
325
+ # Stop handling the client connection.
326
+ #
327
+ def stop
328
+ @mutex.synchronize do
329
+ if( not @closed )
330
+
331
+ begin
332
+ @lsock.close if @lsock
333
+ rescue
334
+ end
335
+
336
+ begin
337
+ @rsock.close if @rsock
338
+ rescue
339
+ end
340
+
341
+ @client_thread.kill if( @client_thread and @client_thread.alive? )
342
+
343
+ @server.remove_client( self )
344
+
345
+ @closed = true
346
+ end
347
+ end
348
+ end
349
+
350
+ end
351
+
352
+ #
353
+ # Create a new Socks4a server.
354
+ #
355
+ def initialize( opts={} )
356
+ @opts = { 'ServerHost' => '0.0.0.0', 'ServerPort' => 1080, 'Comm' => nil }
357
+ @opts = @opts.merge( opts )
358
+ @server = nil
359
+ @clients = ::Array.new
360
+ @running = false
361
+ @server_thread = nil
362
+ end
363
+
364
+ #
365
+ # Check if the server is running.
366
+ #
367
+ def is_running?
368
+ return @running
369
+ end
370
+
371
+ #
372
+ # Start the Socks4a server.
373
+ #
374
+ def start
375
+ begin
376
+ # create the servers main socket
377
+ @server = Rex::Socket::TcpServer.create( 'LocalHost' => @opts['ServerHost'], 'LocalPort' => @opts['ServerPort'] )
378
+ # signal we are now running
379
+ @running = true
380
+ # start the servers main thread to pick up new clients
381
+ @server_thread = ::Thread.new do
382
+ while( @running ) do
383
+ begin
384
+ # accept the client connection
385
+ sock = @server.accept
386
+ # and fire off a new client instance to handle it
387
+ Client.new( self, sock ).start
388
+ rescue
389
+ wlog( "Socks4a.start - server_thread - #{$!}" )
390
+ end
391
+ end
392
+ end
393
+ rescue
394
+ wlog( "Socks4a.start - #{$!}" )
395
+ return false
396
+ end
397
+ return true
398
+ end
399
+
400
+ #
401
+ # Block while the server is running.
402
+ #
403
+ def join
404
+ @server_thread.join
405
+ end
406
+
407
+ #
408
+ # Stop the Socks4a server.
409
+ #
410
+ def stop
411
+ if( @running )
412
+ # signal we are no longer running
413
+ @running = false
414
+ # stop any clients we have (create a new client array as client.stop will delete from @clients)
415
+ clients = []
416
+ clients.concat( @clients )
417
+ clients.each do | client |
418
+ client.stop
419
+ end
420
+ # close the server socket
421
+ @server.close if @server
422
+ # if the server thread did not terminate gracefully, kill it.
423
+ @server_thread.kill if( @server_thread and @server_thread.alive? )
424
+ end
425
+ return !@running
426
+ end
427
+
428
+ def add_client( client )
429
+ @clients << client
430
+ end
431
+
432
+ def remove_client( client )
433
+ @clients.delete( client )
434
+ end
435
+
436
+ attr_reader :opts
437
+
438
+ end
439
+
440
+ end; end; end