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
@@ -11,163 +11,178 @@ require 'rex/io/stream_server'
11
11
  ###
12
12
  module Rex::Socket::SslTcpServer
13
13
 
14
- @@loaded_openssl = false
15
-
16
- begin
17
- require 'openssl'
18
- @@loaded_openssl = true
19
- require 'openssl/nonblock'
20
- rescue ::Exception
21
- end
22
-
23
- include Rex::Socket::TcpServer
24
-
25
- ##
26
- #
27
- # Factory
28
- #
29
- ##
30
-
31
- def self.create(hash = {})
32
- hash['Proto'] = 'tcp'
33
- hash['Server'] = true
34
- hash['SSL'] = true
35
- self.create_param(Rex::Socket::Parameters.from_hash(hash))
36
- end
37
-
38
- #
39
- # Wrapper around the base class' creation method that automatically sets
40
- # the parameter's protocol to TCP and sets the server flag to true.
41
- #
42
- def self.create_param(param)
43
- param.proto = 'tcp'
44
- param.server = true
45
- param.ssl = true
46
- Rex::Socket.create_param(param)
47
- end
48
-
49
- def initsock(params = nil)
50
- raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
51
- self.sslctx = makessl(params.ssl_cert)
52
- super
53
- end
54
-
55
- def accept(opts = {})
56
- sock = super()
57
- return if not sock
58
-
59
- begin
60
- ssl = OpenSSL::SSL::SSLSocket.new(sock, self.sslctx)
61
-
62
- if not allow_nonblock?(ssl)
63
- ssl.accept
64
- else
65
- begin
66
- ssl.accept_nonblock
67
-
68
- # Ruby 1.8.7 and 1.9.0/1.9.1 uses a standard Errno
69
- rescue ::Errno::EAGAIN, ::Errno::EWOULDBLOCK
70
- IO::select(nil, nil, nil, 0.10)
71
- retry
72
-
73
- # Ruby 1.9.2+ uses IO::WaitReadable/IO::WaitWritable
74
- rescue ::Exception => e
75
- if ::IO.const_defined?('WaitReadable') and e.kind_of?(::IO::WaitReadable)
76
- IO::select( [ ssl ], nil, nil, 0.10 )
77
- retry
78
- end
79
-
80
- if ::IO.const_defined?('WaitWritable') and e.kind_of?(::IO::WaitWritable)
81
- IO::select( nil, [ ssl ], nil, 0.10 )
82
- retry
83
- end
84
-
85
- raise e
86
- end
87
- end
88
-
89
- sock.extend(Rex::Socket::SslTcp)
90
- sock.sslsock = ssl
91
- sock.sslctx = self.sslctx
92
-
93
- return sock
94
-
95
- rescue ::OpenSSL::SSL::SSLError
96
- sock.close
97
- nil
98
- end
99
- end
100
-
101
-
102
- #
103
- # Create a new ssl context. If +ssl_cert+ is not given, generates a new
104
- # key and a leaf certificate with random values.
105
- #
106
- def makessl(ssl_cert=nil)
107
-
108
- if ssl_cert
109
- cert = OpenSSL::X509::Certificate.new(ssl_cert)
110
- key = OpenSSL::PKey::RSA.new(ssl_cert)
111
- else
112
- key = OpenSSL::PKey::RSA.new(1024){ }
113
- cert = OpenSSL::X509::Certificate.new
114
- cert.version = 2
115
- cert.serial = rand(0xFFFFFFFF)
116
- # name = OpenSSL::X509::Name.new([["C","JP"],["O","TEST"],["CN","localhost"]])
117
- subject = OpenSSL::X509::Name.new([
118
- ["C","US"],
119
- ['ST', Rex::Text.rand_state()],
120
- ["L", Rex::Text.rand_text_alpha(rand(20) + 10)],
121
- ["O", Rex::Text.rand_text_alpha(rand(20) + 10)],
122
- ["CN", Rex::Text.rand_hostname],
123
- ])
124
- issuer = OpenSSL::X509::Name.new([
125
- ["C","US"],
126
- ['ST', Rex::Text.rand_state()],
127
- ["L", Rex::Text.rand_text_alpha(rand(20) + 10)],
128
- ["O", Rex::Text.rand_text_alpha(rand(20) + 10)],
129
- ["CN", Rex::Text.rand_hostname],
130
- ])
131
-
132
- cert.subject = subject
133
- cert.issuer = issuer
134
- cert.not_before = Time.now - (3600 * 365)
135
- cert.not_after = Time.now + (3600 * 365)
136
- cert.public_key = key.public_key
137
- ef = OpenSSL::X509::ExtensionFactory.new(nil,cert)
138
- cert.extensions = [
139
- ef.create_extension("basicConstraints","CA:FALSE"),
140
- ef.create_extension("subjectKeyIdentifier","hash"),
141
- ef.create_extension("extendedKeyUsage","serverAuth"),
142
- ef.create_extension("keyUsage","keyEncipherment,dataEncipherment,digitalSignature")
143
- ]
144
- ef.issuer_certificate = cert
145
- cert.add_extension ef.create_extension("authorityKeyIdentifier", "keyid:always,issuer:always")
146
- cert.sign(key, OpenSSL::Digest::SHA1.new)
147
- end
148
-
149
- ctx = OpenSSL::SSL::SSLContext.new()
150
- ctx.key = key
151
- ctx.cert = cert
152
-
153
- ctx.session_id_context = Rex::Text.rand_text(16)
154
-
155
- return ctx
156
- end
157
-
158
- #
159
- # This flag determines whether to use the non-blocking openssl
160
- # API calls when they are available. This is still buggy on
161
- # Linux/Mac OS X, but is required on Windows
162
- #
163
- def allow_nonblock?(sock=self.sock)
164
- avail = sock.respond_to?(:accept_nonblock)
165
- if avail and Rex::Compat.is_windows
166
- return true
167
- end
168
- false
169
- end
170
-
171
- attr_accessor :sslctx
14
+ @@loaded_openssl = false
15
+
16
+ begin
17
+ require 'openssl'
18
+ @@loaded_openssl = true
19
+ require 'openssl/nonblock'
20
+ rescue ::Exception
21
+ end
22
+
23
+ include Rex::Socket::TcpServer
24
+
25
+ ##
26
+ #
27
+ # Factory
28
+ #
29
+ ##
30
+
31
+ def self.create(hash = {})
32
+ hash['Proto'] = 'tcp'
33
+ hash['Server'] = true
34
+ hash['SSL'] = true
35
+ self.create_param(Rex::Socket::Parameters.from_hash(hash))
36
+ end
37
+
38
+ #
39
+ # Wrapper around the base class' creation method that automatically sets
40
+ # the parameter's protocol to TCP and sets the server flag to true.
41
+ #
42
+ def self.create_param(param)
43
+ param.proto = 'tcp'
44
+ param.server = true
45
+ param.ssl = true
46
+ Rex::Socket.create_param(param)
47
+ end
48
+
49
+ def initsock(params = nil)
50
+ raise RuntimeError, "No OpenSSL support" if not @@loaded_openssl
51
+ self.sslctx = makessl(params)
52
+ super
53
+ end
54
+
55
+ # (see TcpServer#accept)
56
+ def accept(opts = {})
57
+ sock = super()
58
+ return if not sock
59
+
60
+ begin
61
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, self.sslctx)
62
+
63
+ if not allow_nonblock?(ssl)
64
+ ssl.accept
65
+ else
66
+ begin
67
+ ssl.accept_nonblock
68
+
69
+ # Ruby 1.8.7 and 1.9.0/1.9.1 uses a standard Errno
70
+ rescue ::Errno::EAGAIN, ::Errno::EWOULDBLOCK
71
+ IO::select(nil, nil, nil, 0.10)
72
+ retry
73
+
74
+ # Ruby 1.9.2+ uses IO::WaitReadable/IO::WaitWritable
75
+ rescue ::Exception => e
76
+ if ::IO.const_defined?('WaitReadable') and e.kind_of?(::IO::WaitReadable)
77
+ IO::select( [ ssl ], nil, nil, 0.10 )
78
+ retry
79
+ end
80
+
81
+ if ::IO.const_defined?('WaitWritable') and e.kind_of?(::IO::WaitWritable)
82
+ IO::select( nil, [ ssl ], nil, 0.10 )
83
+ retry
84
+ end
85
+
86
+ raise e
87
+ end
88
+ end
89
+
90
+ sock.extend(Rex::Socket::SslTcp)
91
+ sock.sslsock = ssl
92
+ sock.sslctx = self.sslctx
93
+
94
+ return sock
95
+
96
+ rescue ::OpenSSL::SSL::SSLError
97
+ sock.close
98
+ nil
99
+ end
100
+ end
101
+
102
+
103
+ #
104
+ # Create a new ssl context. If +ssl_cert+ is not given, generates a new
105
+ # key and a leaf certificate with random values.
106
+ #
107
+ # @param [Rex::Socket::Parameters] params
108
+ # @return [::OpenSSL::SSL::SSLContext]
109
+ def makessl(params)
110
+ ssl_cert = params.ssl_cert
111
+ if ssl_cert
112
+ cert = OpenSSL::X509::Certificate.new(ssl_cert)
113
+ key = OpenSSL::PKey::RSA.new(ssl_cert)
114
+ else
115
+ key = OpenSSL::PKey::RSA.new(1024){ }
116
+ cert = OpenSSL::X509::Certificate.new
117
+ cert.version = 2
118
+ cert.serial = rand(0xFFFFFFFF)
119
+ # name = OpenSSL::X509::Name.new([["C","JP"],["O","TEST"],["CN","localhost"]])
120
+ subject = OpenSSL::X509::Name.new([
121
+ ["C","US"],
122
+ ['ST', Rex::Text.rand_state()],
123
+ ["L", Rex::Text.rand_text_alpha(rand(20) + 10)],
124
+ ["O", Rex::Text.rand_text_alpha(rand(20) + 10)],
125
+ ["CN", Rex::Text.rand_hostname],
126
+ ])
127
+ issuer = OpenSSL::X509::Name.new([
128
+ ["C","US"],
129
+ ['ST', Rex::Text.rand_state()],
130
+ ["L", Rex::Text.rand_text_alpha(rand(20) + 10)],
131
+ ["O", Rex::Text.rand_text_alpha(rand(20) + 10)],
132
+ ["CN", Rex::Text.rand_hostname],
133
+ ])
134
+
135
+ cert.subject = subject
136
+ cert.issuer = issuer
137
+ cert.not_before = Time.now - (3600 * 365)
138
+ cert.not_after = Time.now + (3600 * 365)
139
+ cert.public_key = key.public_key
140
+ ef = OpenSSL::X509::ExtensionFactory.new(nil,cert)
141
+ cert.extensions = [
142
+ ef.create_extension("basicConstraints","CA:FALSE"),
143
+ ef.create_extension("subjectKeyIdentifier","hash"),
144
+ ef.create_extension("extendedKeyUsage","serverAuth"),
145
+ ef.create_extension("keyUsage","keyEncipherment,dataEncipherment,digitalSignature")
146
+ ]
147
+ ef.issuer_certificate = cert
148
+ cert.add_extension ef.create_extension("authorityKeyIdentifier", "keyid:always,issuer:always")
149
+ cert.sign(key, OpenSSL::Digest::SHA1.new)
150
+ end
151
+
152
+ ctx = OpenSSL::SSL::SSLContext.new()
153
+ ctx.key = key
154
+ ctx.cert = cert
155
+ ctx.options = 0
156
+
157
+
158
+ # Older versions of OpenSSL do not export the OP_NO_COMPRESSION symbol
159
+ if defined?(OpenSSL::SSL::OP_NO_COMPRESSION)
160
+ # enable/disable the SSL/TLS-level compression
161
+ if params.ssl_compression
162
+ ctx.options &= ~OpenSSL::SSL::OP_NO_COMPRESSION
163
+ else
164
+ ctx.options |= OpenSSL::SSL::OP_NO_COMPRESSION
165
+ end
166
+ end
167
+
168
+ ctx.session_id_context = Rex::Text.rand_text(16)
169
+
170
+ return ctx
171
+ end
172
+
173
+ #
174
+ # This flag determines whether to use the non-blocking openssl
175
+ # API calls when they are available. This is still buggy on
176
+ # Linux/Mac OS X, but is required on Windows
177
+ #
178
+ def allow_nonblock?(sock=self.sock)
179
+ avail = sock.respond_to?(:accept_nonblock)
180
+ if avail and Rex::Compat.is_windows
181
+ return true
182
+ end
183
+ false
184
+ end
185
+
186
+ attr_accessor :sslctx
172
187
  end
173
188
 
@@ -12,63 +12,63 @@ module Socket
12
12
  ###
13
13
  class SubnetWalker
14
14
 
15
- #
16
- # Initializes a subnet walker instance using the supplied subnet
17
- # information.
18
- #
19
- def initialize(subnet, netmask)
20
- self.subnet = Socket.resolv_to_dotted(subnet)
21
- self.netmask = Socket.resolv_to_dotted(netmask)
15
+ #
16
+ # Initializes a subnet walker instance using the supplied subnet
17
+ # information.
18
+ #
19
+ def initialize(subnet, netmask)
20
+ self.subnet = Socket.resolv_to_dotted(subnet)
21
+ self.netmask = Socket.resolv_to_dotted(netmask)
22
22
 
23
- reset
24
- end
23
+ reset
24
+ end
25
25
 
26
- #
27
- # Resets the subnet walker back to its original state.
28
- #
29
- def reset
30
- self.curr_ip = self.subnet.split('.')
31
- self.num_ips = (1 << (32 - Socket.net2bitmask(self.netmask).to_i))
32
- self.curr_ip_idx = 0
33
- end
26
+ #
27
+ # Resets the subnet walker back to its original state.
28
+ #
29
+ def reset
30
+ self.curr_ip = self.subnet.split('.')
31
+ self.num_ips = (1 << (32 - Socket.net2bitmask(self.netmask).to_i))
32
+ self.curr_ip_idx = 0
33
+ end
34
34
 
35
- #
36
- # Returns the next IP address.
37
- #
38
- def next_ip
39
- if (curr_ip_idx >= num_ips)
40
- return nil
41
- end
35
+ #
36
+ # Returns the next IP address.
37
+ #
38
+ def next_ip
39
+ if (curr_ip_idx >= num_ips)
40
+ return nil
41
+ end
42
42
 
43
- if (curr_ip_idx > 0)
44
- self.curr_ip[3] = (curr_ip[3].to_i + 1) % 256
45
- self.curr_ip[2] = (curr_ip[2].to_i + 1) % 256 if (curr_ip[3] == 0)
46
- self.curr_ip[1] = (curr_ip[1].to_i + 1) % 256 if (curr_ip[2] == 0)
47
- self.curr_ip[0] = (curr_ip[0].to_i + 1) % 256 if (curr_ip[1] == 0)
48
- end
43
+ if (curr_ip_idx > 0)
44
+ self.curr_ip[3] = (curr_ip[3].to_i + 1) % 256
45
+ self.curr_ip[2] = (curr_ip[2].to_i + 1) % 256 if (curr_ip[3] == 0)
46
+ self.curr_ip[1] = (curr_ip[1].to_i + 1) % 256 if (curr_ip[2] == 0)
47
+ self.curr_ip[0] = (curr_ip[0].to_i + 1) % 256 if (curr_ip[1] == 0)
48
+ end
49
49
 
50
- self.curr_ip_idx += 1
51
-
52
- self.curr_ip.join('.')
53
- end
50
+ self.curr_ip_idx += 1
54
51
 
55
- #
56
- # The subnet that is being enumerated.
57
- #
58
- attr_reader :subnet
59
- #
60
- # The netmask of the subnet.
61
- #
62
- attr_reader :netmask
63
- #
64
- # The total number of IPs within the subnet.
65
- #
66
- attr_reader :num_ips
52
+ self.curr_ip.join('.')
53
+ end
54
+
55
+ #
56
+ # The subnet that is being enumerated.
57
+ #
58
+ attr_reader :subnet
59
+ #
60
+ # The netmask of the subnet.
61
+ #
62
+ attr_reader :netmask
63
+ #
64
+ # The total number of IPs within the subnet.
65
+ #
66
+ attr_reader :num_ips
67
67
 
68
68
  protected
69
69
 
70
- attr_writer :subnet, :netmask, :num_ips # :nodoc:
71
- attr_accessor :curr_ip, :curr_ip_idx # :nodoc:
70
+ attr_writer :subnet, :netmask, :num_ips # :nodoc:
71
+ attr_accessor :curr_ip, :curr_ip_idx # :nodoc:
72
72
 
73
73
  end
74
74
 
@@ -20,268 +20,268 @@ module Socket
20
20
  ###
21
21
  class SwitchBoard
22
22
 
23
- include Singleton
24
- include Enumerable
25
-
26
- def initialize
27
- @_initialized = false
28
- end
29
-
30
- ###
31
- #
32
- # This class represents a logical switch board route.
33
- # TODO: Enable this to work with IPv6 addresses
34
- #
35
- ###
36
- class Route
37
- def initialize(subnet, netmask, comm)
38
- self.subnet = subnet
39
- self.netmask = netmask
40
- self.comm = comm
41
- self.subnet_nbo = Socket.resolv_nbo_i(subnet)
42
- self.netmask_nbo = Socket.resolv_nbo_i(netmask)
43
- end
44
-
45
- #
46
- # Sort according to bitmask
47
- #
48
- def <=>(other)
49
- self.bitmask <=> other.bitmask
50
- end
51
-
52
- #
53
- # Convert the netmask to a bitmask and cache it.
54
- #
55
- def bitmask
56
- @_bitmask = Socket.net2bitmask(self.netmask) if (@_bitmask == nil)
57
- @_bitmask
58
- end
59
-
60
- attr_reader :subnet, :netmask, :comm
61
- attr_reader :subnet_nbo, :netmask_nbo
62
- protected
63
- attr_writer :subnet, :netmask, :comm
64
- attr_writer :subnet_nbo, :netmask_nbo
65
- end
66
-
67
- ##
68
- #
69
- # Class method wrappers
70
- #
71
- ##
72
-
73
- #
74
- # Adds a route to the switch board routing table using the supplied Comm
75
- # instance.
76
- #
77
- def self.add_route(subnet, mask, comm)
78
- ret = self.instance.add_route(subnet, mask, comm)
79
- if ret && comm.respond_to?(:routes) && comm.routes.kind_of?(Array)
80
- comm.routes << "#{subnet}/#{mask}"
81
- end
82
- ret
83
- end
84
-
85
- #
86
- # Removes a route from the switch board routing table for the supplied
87
- # subnet routing through the supplied Comm instance.
88
- #
89
- def self.remove_route(subnet, mask, comm)
90
- ret = self.instance.remove_route(subnet, mask, comm)
91
- if ret && comm.respond_to?(:routes) && comm.routes.kind_of?(Array)
92
- comm.routes.delete "#{subnet}/#{mask}"
93
- end
94
- ret
95
- end
96
-
97
- #
98
- # Flush all the routes from the switch board routing table.
99
- #
100
- def self.flush_routes
101
- ret = self.instance.flush_routes
102
- end
103
-
104
- #
105
- # Enumerate each route in the routing table.
106
- #
107
- def self.each(&block)
108
- self.instance.each(&block)
109
- end
110
-
111
- #
112
- # Returns the array of routes.
113
- #
114
- def self.routes
115
- self.instance.routes
116
- end
117
-
118
- def self.route_exists?(subnet, mask)
119
- self.instance.route_exists?(subnet, mask)
120
- end
121
-
122
- #
123
- # Returns the Comm instance that should be used for the supplied address.
124
- # If no comm can be found, the default Local Comm is returned.
125
- #
126
- def self.best_comm(addr)
127
- self.instance.best_comm(addr)
128
- end
129
-
130
- #
131
- # Removes all routes that go through the supplied Comm.
132
- #
133
- def self.remove_by_comm(comm)
134
- self.instance.remove_by_comm(comm)
135
- end
136
-
137
- ##
138
- #
139
- # Instance methods
140
- #
141
- ##
142
-
143
- #
144
- # Adds a route for a given subnet and netmask destined through a given comm
145
- # instance.
146
- #
147
- def add_route(subnet, mask, comm)
148
- # If a bitmask was supplied, convert it.
149
- netmask = (mask.to_s =~ /^\d+$/) ? Rex::Socket.bit2netmask(mask.to_i) : mask
150
- rv = true
151
-
152
- _init
153
-
154
- mutex.synchronize {
155
- # If the route already exists, return false to the caller.
156
- if (route_exists?(subnet, netmask) == false)
157
- self.routes << Route.new(subnet, netmask, comm)
158
- else
159
- rv = false
160
- end
161
- }
162
-
163
- rv
164
- end
165
-
166
- #
167
- # Removes a route for a given subnet and netmask destined through a given
168
- # comm instance.
169
- #
170
- def remove_route(subnet, mask, comm)
171
- # If a bitmask was supplied, convert it.
172
- netmask = (mask.to_s =~ /^\d+$/) ? Rex::Socket.bit2netmask(mask.to_i) : mask
173
- rv = false
174
-
175
- _init
176
-
177
- mutex.synchronize {
178
- self.routes.delete_if { |route|
179
- if (route.subnet == subnet and route.netmask == netmask and route.comm == comm)
180
- rv = true
181
- else
182
- false
183
- end
184
- }
185
- }
186
-
187
- rv
188
- end
189
-
190
- #
191
- # Flushes all established routes.
192
- #
193
- def flush_routes
194
- _init
195
-
196
- # Remove each of the individual routes so the comms don't think they're
197
- # still routing after a flush.
198
- self.routes.each { |r|
199
- if r.comm.respond_to? :routes
200
- r.comm.routes.delete("#{r.subnet}/#{r.netmask}")
201
- end
202
- }
203
- # Re-initialize to an empty array
204
- self.routes = Array.new
205
- end
206
-
207
- #
208
- # Checks to see if a route already exists for the supplied subnet and
209
- # netmask.
210
- #
211
- def route_exists?(subnet, netmask)
212
- each { |route|
213
- return true if (route.subnet == subnet and route.netmask == netmask)
214
- }
215
-
216
- false
217
- end
218
-
219
- #
220
- # Enumerates each entry in the routing table.
221
- #
222
- def each(&block)
223
- _init
224
-
225
- routes.each(&block)
226
- end
227
-
228
- #
229
- # Finds the best possible comm for the supplied target address.
230
- #
231
- def best_comm(addr)
232
-
233
- addr_nbo = Socket.resolv_nbo_i(addr)
234
- comm = nil
235
- msb = 0
236
-
237
- each { |route|
238
- if ((route.subnet_nbo & route.netmask_nbo) ==
239
- (addr_nbo & route.netmask_nbo))
240
- if (route.bitmask >= msb)
241
- comm = route.comm
242
- msb = route.bitmask
243
- end
244
- end
245
- }
246
-
247
- comm
248
- end
249
-
250
- #
251
- # Remove all routes that go through the supplied comm.
252
- #
253
- def remove_by_comm(comm)
254
- _init
255
- mutex.synchronize {
256
- routes.delete_if { |route|
257
- route.comm == comm
258
- }
259
- }
260
- end
261
-
262
- #
263
- # The routes array.
264
- #
265
- attr_reader :routes
266
- #
267
- # The mutex protecting the routes array.
268
- #
269
- attr_reader :mutex
23
+ include Singleton
24
+ include Enumerable
25
+
26
+ def initialize
27
+ @_initialized = false
28
+ end
29
+
30
+ ###
31
+ #
32
+ # This class represents a logical switch board route.
33
+ # TODO: Enable this to work with IPv6 addresses
34
+ #
35
+ ###
36
+ class Route
37
+ def initialize(subnet, netmask, comm)
38
+ self.subnet = subnet
39
+ self.netmask = netmask
40
+ self.comm = comm
41
+ self.subnet_nbo = Socket.resolv_nbo_i(subnet)
42
+ self.netmask_nbo = Socket.resolv_nbo_i(netmask)
43
+ end
44
+
45
+ #
46
+ # Sort according to bitmask
47
+ #
48
+ def <=>(other)
49
+ self.bitmask <=> other.bitmask
50
+ end
51
+
52
+ #
53
+ # Convert the netmask to a bitmask and cache it.
54
+ #
55
+ def bitmask
56
+ @_bitmask = Socket.net2bitmask(self.netmask) if (@_bitmask == nil)
57
+ @_bitmask
58
+ end
59
+
60
+ attr_reader :subnet, :netmask, :comm
61
+ attr_reader :subnet_nbo, :netmask_nbo
62
+ protected
63
+ attr_writer :subnet, :netmask, :comm
64
+ attr_writer :subnet_nbo, :netmask_nbo
65
+ end
66
+
67
+ ##
68
+ #
69
+ # Class method wrappers
70
+ #
71
+ ##
72
+
73
+ #
74
+ # Adds a route to the switch board routing table using the supplied Comm
75
+ # instance.
76
+ #
77
+ def self.add_route(subnet, mask, comm)
78
+ ret = self.instance.add_route(subnet, mask, comm)
79
+ if ret && comm.respond_to?(:routes) && comm.routes.kind_of?(Array)
80
+ comm.routes << "#{subnet}/#{mask}"
81
+ end
82
+ ret
83
+ end
84
+
85
+ #
86
+ # Removes a route from the switch board routing table for the supplied
87
+ # subnet routing through the supplied Comm instance.
88
+ #
89
+ def self.remove_route(subnet, mask, comm)
90
+ ret = self.instance.remove_route(subnet, mask, comm)
91
+ if ret && comm.respond_to?(:routes) && comm.routes.kind_of?(Array)
92
+ comm.routes.delete "#{subnet}/#{mask}"
93
+ end
94
+ ret
95
+ end
96
+
97
+ #
98
+ # Flush all the routes from the switch board routing table.
99
+ #
100
+ def self.flush_routes
101
+ ret = self.instance.flush_routes
102
+ end
103
+
104
+ #
105
+ # Enumerate each route in the routing table.
106
+ #
107
+ def self.each(&block)
108
+ self.instance.each(&block)
109
+ end
110
+
111
+ #
112
+ # Returns the array of routes.
113
+ #
114
+ def self.routes
115
+ self.instance.routes
116
+ end
117
+
118
+ def self.route_exists?(subnet, mask)
119
+ self.instance.route_exists?(subnet, mask)
120
+ end
121
+
122
+ #
123
+ # Returns the Comm instance that should be used for the supplied address.
124
+ # If no comm can be found, the default Local Comm is returned.
125
+ #
126
+ def self.best_comm(addr)
127
+ self.instance.best_comm(addr)
128
+ end
129
+
130
+ #
131
+ # Removes all routes that go through the supplied Comm.
132
+ #
133
+ def self.remove_by_comm(comm)
134
+ self.instance.remove_by_comm(comm)
135
+ end
136
+
137
+ ##
138
+ #
139
+ # Instance methods
140
+ #
141
+ ##
142
+
143
+ #
144
+ # Adds a route for a given subnet and netmask destined through a given comm
145
+ # instance.
146
+ #
147
+ def add_route(subnet, mask, comm)
148
+ # If a bitmask was supplied, convert it.
149
+ netmask = (mask.to_s =~ /^\d+$/) ? Rex::Socket.bit2netmask(mask.to_i) : mask
150
+ rv = true
151
+
152
+ _init
153
+
154
+ mutex.synchronize {
155
+ # If the route already exists, return false to the caller.
156
+ if (route_exists?(subnet, netmask) == false)
157
+ self.routes << Route.new(subnet, netmask, comm)
158
+ else
159
+ rv = false
160
+ end
161
+ }
162
+
163
+ rv
164
+ end
165
+
166
+ #
167
+ # Removes a route for a given subnet and netmask destined through a given
168
+ # comm instance.
169
+ #
170
+ def remove_route(subnet, mask, comm)
171
+ # If a bitmask was supplied, convert it.
172
+ netmask = (mask.to_s =~ /^\d+$/) ? Rex::Socket.bit2netmask(mask.to_i) : mask
173
+ rv = false
174
+
175
+ _init
176
+
177
+ mutex.synchronize {
178
+ self.routes.delete_if { |route|
179
+ if (route.subnet == subnet and route.netmask == netmask and route.comm == comm)
180
+ rv = true
181
+ else
182
+ false
183
+ end
184
+ }
185
+ }
186
+
187
+ rv
188
+ end
189
+
190
+ #
191
+ # Flushes all established routes.
192
+ #
193
+ def flush_routes
194
+ _init
195
+
196
+ # Remove each of the individual routes so the comms don't think they're
197
+ # still routing after a flush.
198
+ self.routes.each { |r|
199
+ if r.comm.respond_to? :routes
200
+ r.comm.routes.delete("#{r.subnet}/#{r.netmask}")
201
+ end
202
+ }
203
+ # Re-initialize to an empty array
204
+ self.routes = Array.new
205
+ end
206
+
207
+ #
208
+ # Checks to see if a route already exists for the supplied subnet and
209
+ # netmask.
210
+ #
211
+ def route_exists?(subnet, netmask)
212
+ each { |route|
213
+ return true if (route.subnet == subnet and route.netmask == netmask)
214
+ }
215
+
216
+ false
217
+ end
218
+
219
+ #
220
+ # Enumerates each entry in the routing table.
221
+ #
222
+ def each(&block)
223
+ _init
224
+
225
+ routes.each(&block)
226
+ end
227
+
228
+ #
229
+ # Finds the best possible comm for the supplied target address.
230
+ #
231
+ def best_comm(addr)
232
+
233
+ addr_nbo = Socket.resolv_nbo_i(addr)
234
+ comm = nil
235
+ msb = 0
236
+
237
+ each { |route|
238
+ if ((route.subnet_nbo & route.netmask_nbo) ==
239
+ (addr_nbo & route.netmask_nbo))
240
+ if (route.bitmask >= msb)
241
+ comm = route.comm
242
+ msb = route.bitmask
243
+ end
244
+ end
245
+ }
246
+
247
+ comm
248
+ end
249
+
250
+ #
251
+ # Remove all routes that go through the supplied comm.
252
+ #
253
+ def remove_by_comm(comm)
254
+ _init
255
+ mutex.synchronize {
256
+ routes.delete_if { |route|
257
+ route.comm == comm
258
+ }
259
+ }
260
+ end
261
+
262
+ #
263
+ # The routes array.
264
+ #
265
+ attr_reader :routes
266
+ #
267
+ # The mutex protecting the routes array.
268
+ #
269
+ attr_reader :mutex
270
270
 
271
271
  protected
272
272
 
273
- attr_writer :routes, :mutex # :nodoc:
274
-
275
- #
276
- # Initializes the underlying stuff.
277
- #
278
- def _init
279
- if (@_initialized != true)
280
- @_initialized = true
281
- self.routes = Array.new
282
- self.mutex = Mutex.new
283
- end
284
- end
273
+ attr_writer :routes, :mutex # :nodoc:
274
+
275
+ #
276
+ # Initializes the underlying stuff.
277
+ #
278
+ def _init
279
+ if (@_initialized != true)
280
+ @_initialized = true
281
+ self.routes = Array.new
282
+ self.mutex = Mutex.new
283
+ end
284
+ end
285
285
 
286
286
  end
287
287