librex 0.0.68 → 0.0.70

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 (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -15,104 +15,104 @@ module Socket
15
15
  ###
16
16
  module Comm
17
17
 
18
- ###
19
- #
20
- # This mixin provides stubs for event notification handlers that can be
21
- # registered with a Comm factory to be called when various events occur,
22
- # such as socket instantiation.
23
- #
24
- ###
25
- module Events
26
-
27
- #
28
- # This callback is notified when a socket is being created and is passed
29
- # the parameters that will be used to create it.
30
- #
31
- def on_before_socket_create(comm, param)
32
- end
33
-
34
- #
35
- # This callback is notified when a new socket is created and the
36
- # parameters that were used to create it. This provides the callback
37
- # with a chance to extend or otherwise modify the socket before it's
38
- # passed on to the actual requestor.
39
- #
40
- def on_socket_created(comm, sock, param)
41
- end
42
-
43
- end
44
-
45
- #
46
- # Creates a compatible socket based on the supplied uniform parameters.
47
- #
48
- def self.create(param)
49
- raise NotImplementedError
50
- end
51
-
52
- #
53
- # Indicates whether or not this comm can be chained with other chainable
54
- # comms. This is particularly important for things like Proxy Comms that
55
- # can be proxied through one another. The semantics of this are currently
56
- # undefined and will probably need some more thought.
57
- #
58
- def chainable?
59
- false
60
- end
61
-
62
- #
63
- # Registers an event handler that implements the Rex::Socket::Comm::Event
64
- # interface in at least some fashion. Event handlers are notified when
65
- # sockets are created through the Comm instance that they register against.
66
- #
67
- def register_event_handler(handler)
68
- if (handlers == nil)
69
- self.handlers = []
70
- end
71
-
72
- self.handlers << handler
73
- end
74
-
75
- #
76
- # Deregisters a previously registered event handler.
77
- #
78
- def deregister_event_handler(handler)
79
- if (handlers)
80
- handlers.delete(handler)
81
- end
82
- end
83
-
84
- #
85
- # Enumerates each registered event handler so that they can be notified of
86
- # an event.
87
- #
88
- def each_event_handler(&block)
89
- if (handlers)
90
- handlers.each(&block)
91
- end
92
- end
93
-
94
- #
95
- # Notifies handlers of the before socket create event.
96
- #
97
- def notify_before_socket_create(comm, param)
98
- each_event_handler() { |handler|
99
- handler.on_before_socket_create(comm, param)
100
- }
101
- end
102
-
103
- #
104
- # Notifies handlers of the socket created event.
105
- #
106
- def notify_socket_created(comm, sock, param)
107
- each_event_handler() { |handler|
108
- handler.on_socket_created(comm, sock, param)
109
- }
110
- end
18
+ ###
19
+ #
20
+ # This mixin provides stubs for event notification handlers that can be
21
+ # registered with a Comm factory to be called when various events occur,
22
+ # such as socket instantiation.
23
+ #
24
+ ###
25
+ module Events
26
+
27
+ #
28
+ # This callback is notified when a socket is being created and is passed
29
+ # the parameters that will be used to create it.
30
+ #
31
+ def on_before_socket_create(comm, param)
32
+ end
33
+
34
+ #
35
+ # This callback is notified when a new socket is created and the
36
+ # parameters that were used to create it. This provides the callback
37
+ # with a chance to extend or otherwise modify the socket before it's
38
+ # passed on to the actual requestor.
39
+ #
40
+ def on_socket_created(comm, sock, param)
41
+ end
42
+
43
+ end
44
+
45
+ #
46
+ # Creates a compatible socket based on the supplied uniform parameters.
47
+ #
48
+ def self.create(param)
49
+ raise NotImplementedError
50
+ end
51
+
52
+ #
53
+ # Indicates whether or not this comm can be chained with other chainable
54
+ # comms. This is particularly important for things like Proxy Comms that
55
+ # can be proxied through one another. The semantics of this are currently
56
+ # undefined and will probably need some more thought.
57
+ #
58
+ def chainable?
59
+ false
60
+ end
61
+
62
+ #
63
+ # Registers an event handler that implements the Rex::Socket::Comm::Event
64
+ # interface in at least some fashion. Event handlers are notified when
65
+ # sockets are created through the Comm instance that they register against.
66
+ #
67
+ def register_event_handler(handler)
68
+ if (handlers == nil)
69
+ self.handlers = []
70
+ end
71
+
72
+ self.handlers << handler
73
+ end
74
+
75
+ #
76
+ # Deregisters a previously registered event handler.
77
+ #
78
+ def deregister_event_handler(handler)
79
+ if (handlers)
80
+ handlers.delete(handler)
81
+ end
82
+ end
83
+
84
+ #
85
+ # Enumerates each registered event handler so that they can be notified of
86
+ # an event.
87
+ #
88
+ def each_event_handler(&block)
89
+ if (handlers)
90
+ handlers.each(&block)
91
+ end
92
+ end
93
+
94
+ #
95
+ # Notifies handlers of the before socket create event.
96
+ #
97
+ def notify_before_socket_create(comm, param)
98
+ each_event_handler() { |handler|
99
+ handler.on_before_socket_create(comm, param)
100
+ }
101
+ end
102
+
103
+ #
104
+ # Notifies handlers of the socket created event.
105
+ #
106
+ def notify_socket_created(comm, sock, param)
107
+ each_event_handler() { |handler|
108
+ handler.on_socket_created(comm, sock, param)
109
+ }
110
+ end
111
111
 
112
112
  protected
113
113
 
114
- attr_accessor :handlers # :nodoc:
115
- attr_accessor :handlers_rwlock # :nodoc:
114
+ attr_accessor :handlers # :nodoc:
115
+ attr_accessor :handlers_rwlock # :nodoc:
116
116
 
117
117
  end
118
118
 
@@ -15,445 +15,512 @@ require 'timeout'
15
15
  ###
16
16
  class Rex::Socket::Comm::Local
17
17
 
18
- include Singleton
19
- include Rex::Socket::Comm
20
-
21
- #
22
- # Creates an instance of a socket using the supplied parameters.
23
- #
24
- def self.create(param)
25
-
26
- # Work around jRuby socket implementation issues
27
- if(RUBY_PLATFORM == 'java')
28
- return self.create_jruby(param)
29
- end
30
-
31
- case param.proto
32
- when 'tcp'
33
- return create_by_type(param, ::Socket::SOCK_STREAM, ::Socket::IPPROTO_TCP)
34
- when 'udp'
35
- return create_by_type(param, ::Socket::SOCK_DGRAM, ::Socket::IPPROTO_UDP)
36
- when 'ip'
37
- return create_ip(param)
38
- else
39
- raise Rex::UnsupportedProtocol.new(param.proto), caller
40
- end
41
- end
42
-
43
- #
44
- # Creates an instance of a socket using the supplied parameters.
45
- # Use various hacks to make this work with jRuby
46
- #
47
- def self.create_jruby(param)
48
- sock = nil
49
-
50
- # Notify handlers of the before socket create event.
51
- self.instance.notify_before_socket_create(self, param)
52
-
53
- case param.proto
54
- when 'tcp'
55
- if (param.server?)
56
- sock = TCPServer.new(param.localport, param.localhost)
57
- klass = Rex::Socket::TcpServer
58
- if (param.ssl)
59
- klass = Rex::Socket::SslTcpServer
60
- end
61
- sock.extend(klass)
62
-
63
- else
64
- sock = TCPSocket.new(param.peerhost, param.peerport)
65
- klass = Rex::Socket::Tcp
66
- if (param.ssl)
67
- klass = Rex::Socket::SslTcp
68
- end
69
- sock.extend(klass)
70
- end
71
- when 'udp'
72
- if (param.server?)
73
- sock = UDPServer.new(param.localport, param.localhost)
74
- klass = Rex::Socket::UdpServer
75
- sock.extend(klass)
76
- else
77
- sock = UDPSocket.new(param.peerhost, param.peerport)
78
- klass = Rex::Socket::Udp
79
- sock.extend(klass)
80
- end
81
- else
82
- raise Rex::UnsupportedProtocol.new(param.proto), caller
83
- end
84
-
85
- sock.initsock(param)
86
- self.instance.notify_socket_created(self, sock, param)
87
- return sock
88
- end
89
-
90
-
91
- #
92
- # Creates a raw IP socket using the supplied Parameter instance.
93
- # Special-cased because of how different it is from UDP/TCP
94
- #
95
- def self.create_ip(param)
96
- self.instance.notify_before_socket_create(self, param)
97
-
98
- sock = ::Socket.open(::Socket::PF_INET, ::Socket::SOCK_RAW, ::Socket::IPPROTO_RAW)
99
- sock.setsockopt(::Socket::IPPROTO_IP, ::Socket::IP_HDRINCL, 1)
100
-
101
- # Configure broadcast support
102
- sock.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_BROADCAST, true)
103
-
104
- if (param.bare? == false)
105
- sock.extend(::Rex::Socket::Ip)
106
- sock.initsock(param)
107
- end
108
-
109
- self.instance.notify_socket_created(self, sock, param)
110
-
111
- sock
112
- end
113
-
114
-
115
- #
116
- # Creates a socket using the supplied Parameter instance.
117
- #
118
- def self.create_by_type(param, type, proto = 0)
119
-
120
- # Whether to use IPv6 addressing
121
- usev6 = false
122
-
123
- # Detect IPv6 addresses and enable IPv6 accordingly
124
- if ( Rex::Socket.support_ipv6?())
125
-
126
- # Allow the caller to force IPv6
127
- if (param.v6)
128
- usev6 = true
129
- end
130
-
131
- # Force IPv6 mode for non-connected UDP sockets
132
- if (type == ::Socket::SOCK_DGRAM and not param.peerhost)
133
- # FreeBSD allows IPv6 socket creation, but throws an error on sendto()
134
-
135
- if (not Rex::Compat.is_freebsd())
136
- usev6 = true
137
- end
138
- end
139
-
140
- local = Rex::Socket.resolv_nbo(param.localhost) if param.localhost
141
- peer = Rex::Socket.resolv_nbo(param.peerhost) if param.peerhost
142
-
143
- if (local and local.length == 16)
144
- usev6 = true
145
- end
146
-
147
- if (peer and peer.length == 16)
148
- usev6 = true
149
- end
150
-
151
- if (usev6)
152
- if (local and local.length == 4)
153
- if (local == "\x00\x00\x00\x00")
154
- param.localhost = '::'
155
- elsif (local == "\x7f\x00\x00\x01")
156
- param.localhost = '::1'
157
- else
158
- param.localhost = '::ffff:' + Rex::Socket.getaddress(param.localhost, true)
159
- end
160
- end
161
-
162
- if (peer and peer.length == 4)
163
- if (peer == "\x00\x00\x00\x00")
164
- param.peerhost = '::'
165
- elsif (peer == "\x7f\x00\x00\x01")
166
- param.peerhost = '::1'
167
- else
168
- param.peerhost = '::ffff:' + Rex::Socket.getaddress(param.peerhost, true)
169
- end
170
- end
171
-
172
- param.v6 = true
173
- end
174
- else
175
- # No IPv6 support
176
- param.v6 = false
177
- end
178
-
179
- # Notify handlers of the before socket create event.
180
- self.instance.notify_before_socket_create(self, param)
181
-
182
- # Create the socket
183
- sock = nil
184
- if (param.v6)
185
- sock = ::Socket.new(::Socket::AF_INET6, type, proto)
186
- else
187
- sock = ::Socket.new(::Socket::AF_INET, type, proto)
188
- end
189
-
190
- # Bind to a given local address and/or port if they are supplied
191
- if param.localport or param.localhost
192
- begin
193
- sock.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_REUSEADDR, true)
194
- sock.bind(Rex::Socket.to_sockaddr(param.localhost, param.localport))
195
-
196
- rescue ::Errno::EADDRNOTAVAIL,::Errno::EADDRINUSE
197
- sock.close
198
- raise Rex::AddressInUse.new(param.localhost, param.localport), caller
199
- end
200
- end
201
-
202
- # Configure broadcast support for all datagram sockets
203
- if (type == ::Socket::SOCK_DGRAM)
204
- sock.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_BROADCAST, true)
205
- end
206
-
207
- # If a server TCP instance is being created...
208
- if (param.server?)
209
- sock.listen(256)
210
-
211
- if (param.bare? == false)
212
- klass = Rex::Socket::TcpServer
213
- if (param.ssl)
214
- klass = Rex::Socket::SslTcpServer
215
- end
216
- sock.extend(klass)
217
-
218
- sock.initsock(param)
219
- end
220
- # Otherwise, if we're creating a client...
221
- else
222
- chain = []
223
-
224
- # If we were supplied with host information
225
- if (param.peerhost)
226
-
227
- # A flag that indicates whether we need to try multiple scopes
228
- retry_scopes = false
229
-
230
- # Always retry with link-local IPv6 addresses
231
- if Rex::Socket.is_ipv6?( param.peerhost ) and param.peerhost =~ /^fe80::/
232
- retry_scopes = true
233
- end
234
-
235
- # Prepare a list of scope IDs to try when connecting to
236
- # link-level addresses. Read from /proc if it is available,
237
- # otherwise increment through the first 255 IDs.
238
- @@ip6_lla_scopes ||= []
239
-
240
- if @@ip6_lla_scopes.length == 0 and retry_scopes
241
-
242
- # Linux specific interface lookup code
243
- if ::File.exists?( "/proc/self/net/igmp6" )
244
- ::File.open("/proc/self/net/igmp6") do |fd|
245
- fd.each_line do |line|
246
- line = line.strip
247
- tscope, tint, junk = line.split(/\s+/, 3)
248
- next if not tint
249
-
250
- # Specifying lo in any connect call results in the socket
251
- # being unusable, even if the correct interface is set.
252
- next if tint == "lo"
253
-
254
- @@ip6_lla_scopes << tscope
255
- end
256
- end
257
- else
258
- # Other Unix-like platforms should support a raw scope ID
259
- [*(1 .. 255)].map{ |x| @@ip6_lla_scopes << x.to_s }
260
- end
261
- end
262
-
263
- ip6_scope_idx = 0
264
- ip = param.peerhost
265
- port = param.peerport
266
-
267
- if param.proxies
268
- chain = param.proxies.dup
269
- chain.push(['host',param.peerhost,param.peerport])
270
- ip = chain[0][1]
271
- port = chain[0][2].to_i
272
- end
273
-
274
- begin
275
-
276
- begin
277
- Timeout.timeout(param.timeout) do
278
- sock.connect(Rex::Socket.to_sockaddr(ip, port))
279
- end
280
- rescue ::Timeout::Error
281
- raise ::Errno::ETIMEDOUT
282
- end
283
-
284
- rescue ::Errno::EHOSTUNREACH,::Errno::ENETDOWN,::Errno::ENETUNREACH,::Errno::ENETRESET,::Errno::EHOSTDOWN,::Errno::EACCES,::Errno::EINVAL
285
-
286
- # Rescue errors caused by a bad Scope ID for a link-local address
287
- if retry_scopes and @@ip6_lla_scopes[ ip6_scope_idx ]
288
- ip = param.peerhost + "%" + @@ip6_lla_scopes[ ip6_scope_idx ]
289
- ip6_scope_idx += 1
290
- retry
291
- end
292
-
293
- sock.close
294
- raise Rex::HostUnreachable.new(param.peerhost, param.peerport), caller
295
-
296
- rescue ::Errno::EADDRNOTAVAIL,::Errno::EADDRINUSE
297
- sock.close
298
- raise Rex::AddressInUse.new(param.peerhost, param.peerport), caller
299
-
300
- rescue Errno::ETIMEDOUT
301
- sock.close
302
- raise Rex::ConnectionTimeout.new(param.peerhost, param.peerport), caller
303
-
304
- rescue ::Errno::ECONNRESET,::Errno::ECONNREFUSED,::Errno::ENOTCONN,::Errno::ECONNABORTED
305
- sock.close
306
- raise Rex::ConnectionRefused.new(param.peerhost, param.peerport), caller
307
- end
308
- end
309
-
310
- if (param.bare? == false)
311
- case param.proto
312
- when 'tcp'
313
- klass = Rex::Socket::Tcp
314
- sock.extend(klass)
315
- sock.initsock(param)
316
- when 'udp'
317
- sock.extend(Rex::Socket::Udp)
318
- sock.initsock(param)
319
- end
320
- end
321
-
322
- if chain.size > 1
323
- chain.each_with_index {
324
- |proxy, i|
325
- next_hop = chain[i + 1]
326
- if next_hop
327
- proxy(sock, proxy[0], next_hop[1], next_hop[2])
328
- end
329
- }
330
- end
331
-
332
- # Now extend the socket with SSL and perform the handshake
333
- if(param.bare? == false and param.ssl)
334
- klass = Rex::Socket::SslTcp
335
- sock.extend(klass)
336
- sock.initsock(param)
337
- end
338
-
339
-
340
- end
341
-
342
- # Notify handlers that a socket has been created.
343
- self.instance.notify_socket_created(self, sock, param)
344
-
345
- sock
346
- end
347
-
348
- def self.proxy(sock, type, host, port)
349
-
350
- #$stdout.print("PROXY\n")
351
- case type.downcase
352
- when 'http'
353
- setup = "CONNECT #{host}:#{port} HTTP/1.0\r\n\r\n"
354
- size = sock.put(setup)
355
- if (size != setup.length)
356
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to send the entire request to the proxy"), caller
357
- end
358
-
359
- begin
360
- ret = sock.get_once(39,30)
361
- rescue IOError
362
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a response from the proxy"), caller
363
- end
364
-
365
- if ret.nil?
366
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a response from the proxy"), caller
367
- end
368
-
369
- resp = Rex::Proto::Http::Response.new
370
- resp.update_cmd_parts(ret.split(/\r?\n/)[0])
371
-
372
- if resp.code != 200
373
- raise Rex::ConnectionProxyError.new(host, port, type, "The proxy returned a non-OK response"), caller
374
- end
375
- when 'socks4'
376
- setup = [4,1,port.to_i].pack('CCn') + Socket.gethostbyname(host)[3] + Rex::Text.rand_text_alpha(rand(8)+1) + "\x00"
377
- size = sock.put(setup)
378
- if (size != setup.length)
379
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to send the entire request to the proxy"), caller
380
- end
381
-
382
- begin
383
- ret = sock.get_once(8, 30)
384
- rescue IOError
385
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a response from the proxy"), caller
386
- end
387
-
388
- if (ret.nil? or ret.length < 8)
389
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a complete response from the proxy"), caller
390
- end
391
- if ret[1,1] != "\x5a"
392
- raise Rex::ConnectionProxyError.new(host, port, type, "Proxy responded with error code #{ret[0,1].unpack("C")[0]}"), caller
393
- end
394
- when 'socks5'
395
- auth_methods = [5,1,0].pack('CCC')
396
- size = sock.put(auth_methods)
397
- if (size != auth_methods.length)
398
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to send the entire request to the proxy"), caller
399
- end
400
- ret = sock.get_once(2,30)
401
- if (ret[1,1] == "\xff")
402
- raise Rex::ConnectionProxyError.new(host, port, type, "The proxy requires authentication"), caller
403
- end
404
-
405
- if (Rex::Socket.is_ipv4?(host))
406
- addr = Rex::Socket.gethostbyname(host)[3]
407
- setup = [5,1,0,1].pack('C4') + addr + [port.to_i].pack('n')
408
- elsif (Rex::Socket.support_ipv6? and Rex::Socket.is_ipv6?(host))
409
- # IPv6 stuff all untested
410
- addr = Rex::Socket.gethostbyname(host)[3]
411
- setup = [5,1,0,4].pack('C4') + addr + [port.to_i].pack('n')
412
- else
413
- # Then it must be a domain name.
414
- # Unfortunately, it looks like the host has always been
415
- # resolved by the time it gets here, so this code never runs.
416
- setup = [5,1,0,3].pack('C4') + [host.length].pack('C') + host + [port.to_i].pack('n')
417
- end
418
-
419
- size = sock.put(setup)
420
- if (size != setup.length)
421
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to send the entire request to the proxy"), caller
422
- end
423
-
424
- begin
425
- response = sock.get_once(10, 30)
426
- rescue IOError
427
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a response from the proxy"), caller
428
- end
429
-
430
- if (response.nil? or response.length < 10)
431
- raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a complete response from the proxy"), caller
432
- end
433
- if response[1,1] != "\x00"
434
- raise Rex::ConnectionProxyError.new(host, port, type, "Proxy responded with error code #{response[1,1].unpack("C")[0]}"), caller
435
- end
436
- else
437
- raise RuntimeError, "The proxy type specified is not valid", caller
438
- end
439
- end
440
-
441
- ##
442
- #
443
- # Registration
444
- #
445
- ##
446
-
447
- def self.register_event_handler(handler) # :nodoc:
448
- self.instance.register_event_handler(handler)
449
- end
450
-
451
- def self.deregister_event_handler(handler) # :nodoc:
452
- self.instance.deregister_event_handler(handler)
453
- end
454
-
455
- def self.each_event_handler(handler) # :nodoc:
456
- self.instance.each_event_handler(handler)
457
- end
18
+ include Singleton
19
+ include Rex::Socket::Comm
20
+
21
+ #
22
+ # Creates an instance of a socket using the supplied parameters.
23
+ #
24
+ def self.create(param)
25
+
26
+ # Work around jRuby socket implementation issues
27
+ if(RUBY_PLATFORM == 'java')
28
+ return self.create_jruby(param)
29
+ end
30
+
31
+ case param.proto
32
+ when 'tcp'
33
+ return create_by_type(param, ::Socket::SOCK_STREAM, ::Socket::IPPROTO_TCP)
34
+ when 'udp'
35
+ return create_by_type(param, ::Socket::SOCK_DGRAM, ::Socket::IPPROTO_UDP)
36
+ when 'ip'
37
+ return create_ip(param)
38
+ else
39
+ raise Rex::UnsupportedProtocol.new(param.proto), caller
40
+ end
41
+ end
42
+
43
+ #
44
+ # Creates an instance of a socket using the supplied parameters.
45
+ # Use various hacks to make this work with jRuby
46
+ #
47
+ def self.create_jruby(param)
48
+ sock = nil
49
+
50
+ # Notify handlers of the before socket create event.
51
+ self.instance.notify_before_socket_create(self, param)
52
+
53
+ case param.proto
54
+ when 'tcp'
55
+ if (param.server?)
56
+ sock = TCPServer.new(param.localport, param.localhost)
57
+ klass = Rex::Socket::TcpServer
58
+ if (param.ssl)
59
+ klass = Rex::Socket::SslTcpServer
60
+ end
61
+ sock.extend(klass)
62
+
63
+ else
64
+ sock = TCPSocket.new(param.peerhost, param.peerport)
65
+ klass = Rex::Socket::Tcp
66
+ if (param.ssl)
67
+ klass = Rex::Socket::SslTcp
68
+ end
69
+ sock.extend(klass)
70
+ end
71
+ when 'udp'
72
+ if (param.server?)
73
+ sock = UDPServer.new(param.localport, param.localhost)
74
+ klass = Rex::Socket::UdpServer
75
+ sock.extend(klass)
76
+ else
77
+ sock = UDPSocket.new(param.peerhost, param.peerport)
78
+ klass = Rex::Socket::Udp
79
+ sock.extend(klass)
80
+ end
81
+ else
82
+ raise Rex::UnsupportedProtocol.new(param.proto), caller
83
+ end
84
+
85
+ sock.initsock(param)
86
+ self.instance.notify_socket_created(self, sock, param)
87
+ return sock
88
+ end
89
+
90
+
91
+ #
92
+ # Creates a raw IP socket using the supplied Parameter instance.
93
+ # Special-cased because of how different it is from UDP/TCP
94
+ #
95
+ def self.create_ip(param)
96
+ self.instance.notify_before_socket_create(self, param)
97
+
98
+ sock = ::Socket.open(::Socket::PF_INET, ::Socket::SOCK_RAW, ::Socket::IPPROTO_RAW)
99
+ sock.setsockopt(::Socket::IPPROTO_IP, ::Socket::IP_HDRINCL, 1)
100
+
101
+ # Configure broadcast support
102
+ sock.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_BROADCAST, true)
103
+
104
+ if (param.bare? == false)
105
+ sock.extend(::Rex::Socket::Ip)
106
+ sock.initsock(param)
107
+ end
108
+
109
+ self.instance.notify_socket_created(self, sock, param)
110
+
111
+ sock
112
+ end
113
+
114
+
115
+ #
116
+ # Creates a socket using the supplied Parameter instance.
117
+ #
118
+ def self.create_by_type(param, type, proto = 0)
119
+
120
+ # Whether to use IPv6 addressing
121
+ usev6 = false
122
+
123
+ # Detect IPv6 addresses and enable IPv6 accordingly
124
+ if ( Rex::Socket.support_ipv6?())
125
+
126
+ # Allow the caller to force IPv6
127
+ if (param.v6)
128
+ usev6 = true
129
+ end
130
+
131
+ # Force IPv6 mode for non-connected UDP sockets
132
+ if (type == ::Socket::SOCK_DGRAM and not param.peerhost)
133
+ # FreeBSD allows IPv6 socket creation, but throws an error on sendto()
134
+ # Windows 7 SP1 and newer also fail to sendto with IPv6 udp sockets
135
+ unless Rex::Compat.is_freebsd or Rex::Compat.is_windows
136
+ usev6 = true
137
+ end
138
+ end
139
+
140
+ local = Rex::Socket.resolv_nbo(param.localhost) if param.localhost
141
+ peer = Rex::Socket.resolv_nbo(param.peerhost) if param.peerhost
142
+
143
+ if (local and local.length == 16)
144
+ usev6 = true
145
+ end
146
+
147
+ if (peer and peer.length == 16)
148
+ usev6 = true
149
+ end
150
+
151
+ if (usev6)
152
+ if (local and local.length == 4)
153
+ if (local == "\x00\x00\x00\x00")
154
+ param.localhost = '::'
155
+ elsif (local == "\x7f\x00\x00\x01")
156
+ param.localhost = '::1'
157
+ else
158
+ param.localhost = '::ffff:' + Rex::Socket.getaddress(param.localhost, true)
159
+ end
160
+ end
161
+
162
+ if (peer and peer.length == 4)
163
+ if (peer == "\x00\x00\x00\x00")
164
+ param.peerhost = '::'
165
+ elsif (peer == "\x7f\x00\x00\x01")
166
+ param.peerhost = '::1'
167
+ else
168
+ param.peerhost = '::ffff:' + Rex::Socket.getaddress(param.peerhost, true)
169
+ end
170
+ end
171
+
172
+ param.v6 = true
173
+ end
174
+ else
175
+ # No IPv6 support
176
+ param.v6 = false
177
+ end
178
+
179
+ # Notify handlers of the before socket create event.
180
+ self.instance.notify_before_socket_create(self, param)
181
+
182
+ # Create the socket
183
+ sock = nil
184
+ if (param.v6)
185
+ sock = ::Socket.new(::Socket::AF_INET6, type, proto)
186
+ else
187
+ sock = ::Socket.new(::Socket::AF_INET, type, proto)
188
+ end
189
+
190
+ # Bind to a given local address and/or port if they are supplied
191
+ if param.localport or param.localhost
192
+ begin
193
+ sock.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_REUSEADDR, true)
194
+ sock.bind(Rex::Socket.to_sockaddr(param.localhost, param.localport))
195
+
196
+ rescue ::Errno::EADDRNOTAVAIL,::Errno::EADDRINUSE
197
+ sock.close
198
+ raise Rex::AddressInUse.new(param.localhost, param.localport), caller
199
+ end
200
+ end
201
+
202
+ # Configure broadcast support for all datagram sockets
203
+ if (type == ::Socket::SOCK_DGRAM)
204
+ sock.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_BROADCAST, true)
205
+ end
206
+
207
+ # If a server TCP instance is being created...
208
+ if (param.server?)
209
+ sock.listen(256)
210
+
211
+ if (param.bare? == false)
212
+ klass = Rex::Socket::TcpServer
213
+ if (param.ssl)
214
+ klass = Rex::Socket::SslTcpServer
215
+ end
216
+ sock.extend(klass)
217
+
218
+ sock.initsock(param)
219
+ end
220
+ # Otherwise, if we're creating a client...
221
+ else
222
+ chain = []
223
+
224
+ # If we were supplied with host information
225
+ if (param.peerhost)
226
+
227
+ # A flag that indicates whether we need to try multiple scopes
228
+ retry_scopes = false
229
+
230
+ # Always retry with link-local IPv6 addresses
231
+ if Rex::Socket.is_ipv6?( param.peerhost ) and param.peerhost =~ /^fe80::/
232
+ retry_scopes = true
233
+ end
234
+
235
+ # Prepare a list of scope IDs to try when connecting to
236
+ # link-level addresses. Read from /proc if it is available,
237
+ # otherwise increment through the first 255 IDs.
238
+ @@ip6_lla_scopes ||= []
239
+
240
+ if @@ip6_lla_scopes.length == 0 and retry_scopes
241
+
242
+ # Linux specific interface lookup code
243
+ if ::File.exists?( "/proc/self/net/igmp6" )
244
+ ::File.open("/proc/self/net/igmp6") do |fd|
245
+ fd.each_line do |line|
246
+ line = line.strip
247
+ tscope, tint, junk = line.split(/\s+/, 3)
248
+ next if not tint
249
+
250
+ # Specifying lo in any connect call results in the socket
251
+ # being unusable, even if the correct interface is set.
252
+ next if tint == "lo"
253
+
254
+ @@ip6_lla_scopes << tscope
255
+ end
256
+ end
257
+ else
258
+ # Other Unix-like platforms should support a raw scope ID
259
+ [*(1 .. 255)].map{ |x| @@ip6_lla_scopes << x.to_s }
260
+ end
261
+ end
262
+
263
+ ip6_scope_idx = 0
264
+ ip = param.peerhost
265
+ port = param.peerport
266
+
267
+ if param.proxies
268
+ chain = param.proxies.dup
269
+ chain.push(['host',param.peerhost,param.peerport])
270
+ ip = chain[0][1]
271
+ port = chain[0][2].to_i
272
+ end
273
+
274
+ begin
275
+
276
+ begin
277
+ Timeout.timeout(param.timeout) do
278
+ sock.connect(Rex::Socket.to_sockaddr(ip, port))
279
+ end
280
+ rescue ::Timeout::Error
281
+ raise ::Errno::ETIMEDOUT
282
+ end
283
+
284
+ rescue ::Errno::EHOSTUNREACH,::Errno::ENETDOWN,::Errno::ENETUNREACH,::Errno::ENETRESET,::Errno::EHOSTDOWN,::Errno::EACCES,::Errno::EINVAL
285
+
286
+ # Rescue errors caused by a bad Scope ID for a link-local address
287
+ if retry_scopes and @@ip6_lla_scopes[ ip6_scope_idx ]
288
+ ip = param.peerhost + "%" + @@ip6_lla_scopes[ ip6_scope_idx ]
289
+ ip6_scope_idx += 1
290
+ retry
291
+ end
292
+
293
+ sock.close
294
+ raise Rex::HostUnreachable.new(param.peerhost, param.peerport), caller
295
+
296
+ rescue ::Errno::EADDRNOTAVAIL,::Errno::EADDRINUSE
297
+ sock.close
298
+ raise Rex::AddressInUse.new(param.peerhost, param.peerport), caller
299
+
300
+ rescue Errno::ETIMEDOUT
301
+ sock.close
302
+ raise Rex::ConnectionTimeout.new(param.peerhost, param.peerport), caller
303
+
304
+ rescue ::Errno::ECONNRESET,::Errno::ECONNREFUSED,::Errno::ENOTCONN,::Errno::ECONNABORTED
305
+ sock.close
306
+ raise Rex::ConnectionRefused.new(param.peerhost, param.peerport), caller
307
+ end
308
+ end
309
+
310
+ if (param.bare? == false)
311
+ case param.proto
312
+ when 'tcp'
313
+ klass = Rex::Socket::Tcp
314
+ sock.extend(klass)
315
+ sock.initsock(param)
316
+ when 'udp'
317
+ sock.extend(Rex::Socket::Udp)
318
+ sock.initsock(param)
319
+ end
320
+ end
321
+
322
+ if chain.size > 1
323
+ chain.each_with_index {
324
+ |proxy, i|
325
+ next_hop = chain[i + 1]
326
+ if next_hop
327
+ proxy(sock, proxy[0], next_hop[1], next_hop[2])
328
+ end
329
+ }
330
+ end
331
+
332
+ # Now extend the socket with SSL and perform the handshake
333
+ if(param.bare? == false and param.ssl)
334
+ klass = Rex::Socket::SslTcp
335
+ sock.extend(klass)
336
+ sock.initsock(param)
337
+ end
338
+
339
+
340
+ end
341
+
342
+ # Notify handlers that a socket has been created.
343
+ self.instance.notify_socket_created(self, sock, param)
344
+
345
+ sock
346
+ end
347
+
348
+ def self.proxy(sock, type, host, port)
349
+ case type.downcase
350
+ when 'sapni'
351
+ packet_type = 'NI_ROUTE'
352
+ route_info_version = 2
353
+ ni_version = 39
354
+ num_of_entries = 2
355
+ talk_mode = 1 # ref: http://help.sap.com/saphelp_dimp50/helpdata/En/f8/bb960899d743378ccb8372215bb767/content.htm
356
+ num_rest_nodes = 1
357
+
358
+ shost, sport = sock.peerinfo.split(":")
359
+ first_route_item = [shost, 0, sport, 0, 0].pack("A*CA*cc")
360
+ route_data = [first_route_item.length, first_route_item].pack("NA*")
361
+ route_data << [host, 0, port.to_s, 0, 0].pack("A*CA*cc")
362
+
363
+ ni_packet = [
364
+ packet_type,
365
+ 0,
366
+ route_info_version,
367
+ ni_version,
368
+ num_of_entries,
369
+ talk_mode,
370
+ 0,
371
+ 0,
372
+ num_rest_nodes
373
+ ].pack("A8c8")
374
+ # Add the data block, according to sap documentation:
375
+ # A 4-byte header precedes each data block. These 4 bytes give the
376
+ # length of the data block (length without leading 4 bytes)
377
+ # The data block (the route data)
378
+ ni_packet << [route_data.length - 4].pack('N') + route_data
379
+ # Now that we've built the whole packet, prepend its length before writing it to the wire
380
+ ni_packet = [ni_packet.length].pack('N') + ni_packet
381
+
382
+ size = sock.put(ni_packet)
383
+
384
+ if size != ni_packet.length
385
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to send the entire request to the proxy"), caller
386
+ end
387
+
388
+ begin
389
+ ret_len = sock.get_once(4, 30).unpack('N')[0]
390
+ if ret_len and ret_len != 0
391
+ ret = sock.get_once(ret_len, 30)
392
+ end
393
+ rescue IOError
394
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a response from the proxy"), caller
395
+ end
396
+
397
+ if ret and ret.length < 4
398
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a complete response from the proxy"), caller
399
+ end
400
+
401
+ if ret =~ /NI_RTERR/
402
+ case ret
403
+ when /timed out/
404
+ raise Rex::ConnectionProxyError.new(host, port, type, "Connection to remote host #{host} timed out")
405
+ when /refused/
406
+ raise Rex::ConnectionProxyError.new(host, port, type, "Connection to remote port #{port} closed")
407
+ when /denied/
408
+ raise Rex::ConnectionProxyError.new(host, port, type, "Connection to #{host}:#{port} blocked by ACL")
409
+ else
410
+ raise Rex::ConnectionProxyError.new(host, port, type, "Connection to #{host}:#{port} failed (Unknown fail)")
411
+ end
412
+ elsif ret =~ /NI_PONG/
413
+ # success case
414
+ # would like to print this "[*] remote native connection to #{host}:#{port} established\n"
415
+ else
416
+ raise Rex::ConnectionProxyError.new(host, port, type, "Connection to #{host}:#{port} failed (Unknown fail)")
417
+ end
418
+
419
+ when 'http'
420
+ setup = "CONNECT #{host}:#{port} HTTP/1.0\r\n\r\n"
421
+ size = sock.put(setup)
422
+ if (size != setup.length)
423
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to send the entire request to the proxy"), caller
424
+ end
425
+
426
+ begin
427
+ ret = sock.get_once(39,30)
428
+ rescue IOError
429
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a response from the proxy"), caller
430
+ end
431
+
432
+ if ret.nil?
433
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a response from the proxy"), caller
434
+ end
435
+
436
+ resp = Rex::Proto::Http::Response.new
437
+ resp.update_cmd_parts(ret.split(/\r?\n/)[0])
438
+
439
+ if resp.code != 200
440
+ raise Rex::ConnectionProxyError.new(host, port, type, "The proxy returned a non-OK response"), caller
441
+ end
442
+ when 'socks4'
443
+ setup = [4,1,port.to_i].pack('CCn') + Socket.gethostbyname(host)[3] + Rex::Text.rand_text_alpha(rand(8)+1) + "\x00"
444
+ size = sock.put(setup)
445
+ if (size != setup.length)
446
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to send the entire request to the proxy"), caller
447
+ end
448
+
449
+ begin
450
+ ret = sock.get_once(8, 30)
451
+ rescue IOError
452
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a response from the proxy"), caller
453
+ end
454
+
455
+ if (ret.nil? or ret.length < 8)
456
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a complete response from the proxy"), caller
457
+ end
458
+ if ret[1,1] != "\x5a"
459
+ raise Rex::ConnectionProxyError.new(host, port, type, "Proxy responded with error code #{ret[0,1].unpack("C")[0]}"), caller
460
+ end
461
+ when 'socks5'
462
+ auth_methods = [5,1,0].pack('CCC')
463
+ size = sock.put(auth_methods)
464
+ if (size != auth_methods.length)
465
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to send the entire request to the proxy"), caller
466
+ end
467
+ ret = sock.get_once(2,30)
468
+ if (ret[1,1] == "\xff")
469
+ raise Rex::ConnectionProxyError.new(host, port, type, "The proxy requires authentication"), caller
470
+ end
471
+
472
+ if (Rex::Socket.is_ipv4?(host))
473
+ addr = Rex::Socket.gethostbyname(host)[3]
474
+ setup = [5,1,0,1].pack('C4') + addr + [port.to_i].pack('n')
475
+ elsif (Rex::Socket.support_ipv6? and Rex::Socket.is_ipv6?(host))
476
+ # IPv6 stuff all untested
477
+ addr = Rex::Socket.gethostbyname(host)[3]
478
+ setup = [5,1,0,4].pack('C4') + addr + [port.to_i].pack('n')
479
+ else
480
+ # Then it must be a domain name.
481
+ # Unfortunately, it looks like the host has always been
482
+ # resolved by the time it gets here, so this code never runs.
483
+ setup = [5,1,0,3].pack('C4') + [host.length].pack('C') + host + [port.to_i].pack('n')
484
+ end
485
+
486
+ size = sock.put(setup)
487
+ if (size != setup.length)
488
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to send the entire request to the proxy"), caller
489
+ end
490
+
491
+ begin
492
+ response = sock.get_once(10, 30)
493
+ rescue IOError
494
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a response from the proxy"), caller
495
+ end
496
+
497
+ if (response.nil? or response.length < 10)
498
+ raise Rex::ConnectionProxyError.new(host, port, type, "Failed to receive a complete response from the proxy"), caller
499
+ end
500
+ if response[1,1] != "\x00"
501
+ raise Rex::ConnectionProxyError.new(host, port, type, "Proxy responded with error code #{response[1,1].unpack("C")[0]}"), caller
502
+ end
503
+ else
504
+ raise RuntimeError, "The proxy type specified is not valid", caller
505
+ end
506
+ end
507
+
508
+ ##
509
+ #
510
+ # Registration
511
+ #
512
+ ##
513
+
514
+ def self.register_event_handler(handler) # :nodoc:
515
+ self.instance.register_event_handler(handler)
516
+ end
517
+
518
+ def self.deregister_event_handler(handler) # :nodoc:
519
+ self.instance.deregister_event_handler(handler)
520
+ end
521
+
522
+ def self.each_event_handler(handler) # :nodoc:
523
+ self.instance.each_event_handler(handler)
524
+ end
458
525
 
459
526
  end