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
@@ -13,380 +13,457 @@ module Socket
13
13
  # show-stoppingly inefficient when storing a bunch of non-consecutive
14
14
  # addresses, which should be a somewhat unusual case.
15
15
  #
16
+ # @example
17
+ # r = RangeWalker.new("10.1,3.1-7.1-255")
18
+ # r.include?("10.3.7.255") #=> true
19
+ # r.length #=> 3570
20
+ # r.each do |addr|
21
+ # # do something with the address
22
+ # end
16
23
  ###
17
24
  class RangeWalker
18
25
 
19
- #
20
- # Initializes a walker instance using the supplied range
21
- #
22
- def initialize(parseme)
23
- if parseme.is_a? RangeWalker
24
- @ranges = parseme.ranges.dup
25
- else
26
- @ranges = parse(parseme)
27
- end
28
- reset
29
- end
30
-
31
- #
32
- # Calls the instance method
33
- #
34
- # This is basically only useful for determining if a range can be parsed
35
- #
36
- def self.parse(parseme)
37
- self.new.parse(parseme)
38
- end
39
-
40
- #
41
- # Turn a human-readable range string into ranges we can step through one address at a time.
42
- #
43
- # Allow the following formats:
44
- # "a.b.c.d e.f.g.h"
45
- # "a.b.c.d, e.f.g.h"
46
- # where each chunk is CIDR notation, (e.g. '10.1.1.0/24') or a range in nmap format (see expand_nmap)
47
- #
48
- # OR this format
49
- # "a.b.c.d-e.f.g.h"
50
- # where a.b.c.d and e.f.g.h are single IPs and the second must be
51
- # bigger than the first.
52
- #
53
- def parse(parseme)
54
- return nil if not parseme
55
- ranges = []
56
- parseme.split(', ').map{ |a| a.split(' ') }.flatten.each { |arg|
57
- opts = {}
58
-
59
- # Handle IPv6 first (support ranges, but not CIDR)
60
- if arg.include?(":")
61
- addrs = arg.split('-', 2)
62
-
63
- # Handle a single address
64
- if addrs.length == 1
65
- addr, scope_id = addrs[0].split('%')
66
- opts[:scope_id] = scope_id if scope_id
67
-
68
- return false unless Rex::Socket.is_ipv6?(addr)
69
- addr = Rex::Socket.addr_atoi(addr)
70
- ranges.push [addr, addr, true, opts]
71
- next
72
- end
73
-
74
- addr1, scope_id = addrs[0].split('%')
75
- opts[:scope_id] = scope_id if scope_id
76
-
77
- addr2, scope_id = addrs[0].split('%')
78
- ( opts[:scope_id] ||= scope_id ) if scope_id
79
-
80
- return false if not (Rex::Socket.is_ipv6?(addr1) and Rex::Socket.is_ipv6?(addr2))
81
-
82
- # Handle IPv6 ranges in the form of 2001::1-2001::10
83
- addr1 = Rex::Socket.addr_atoi(addr1)
84
- addr2 = Rex::Socket.addr_atoi(addr2)
85
-
86
- ranges.push [addr1, addr2, true, opts]
87
- next
88
-
89
- # Handle IPv4 CIDR
90
- elsif arg.include?("/")
91
- # Then it's CIDR notation and needs special case
92
- return false if arg =~ /[,-]/ # Improper CIDR notation (can't mix with 1,3 or 1-3 style IP ranges)
93
- return false if arg.scan("/").size > 1 # ..but there are too many slashes
94
- ip_part,mask_part = arg.split("/")
95
- return false if ip_part.nil? or ip_part.empty? or mask_part.nil? or mask_part.empty?
96
- return false if mask_part !~ /^[0-9]{1,2}$/ # Illegal mask -- numerals only
97
- return false if mask_part.to_i > 32 # This too -- between 0 and 32.
98
- begin
99
- Rex::Socket.addr_atoi(ip_part) # This allows for "www.metasploit.com/24" which is fun.
100
- rescue Resolv::ResolvError
101
- return false # Can't resolve the ip_part, so bail.
102
- end
103
-
104
- expanded = expand_cidr(arg)
105
- if expanded
106
- ranges.push(expanded)
107
- else
108
- return false
109
- end
110
-
111
- # Handle hostnames
112
- elsif arg =~ /[^-0-9,.*]/
113
- # Then it's a domain name and we should send it on to addr_atoi
114
- # unmolested to force a DNS lookup.
115
- Rex::Socket.addr_atoi_list(arg).each { |addr| ranges.push [addr, addr, false, opts] }
116
-
117
- # Handle IPv4 ranges
118
- elsif arg =~ /^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})-([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$/
119
- # Then it's in the format of 1.2.3.4-5.6.7.8
120
- # Note, this will /not/ deal with DNS names, or the fancy/obscure 10...1-10...2
121
- begin
122
- addrs = [Rex::Socket.addr_atoi($1), Rex::Socket.addr_atoi($2)]
123
- return false if addrs[0] > addrs[1] # The end is greater than the beginning.
124
- ranges.push [addrs[0], addrs[1], false, opts]
125
- rescue Resolv::ResolvError # Something's broken, forget it.
126
- return false
127
- end
128
- else
129
- # Returns an array of ranges
130
- expanded = expand_nmap(arg)
131
- if expanded
132
- expanded.each { |r| ranges.push(r) }
133
- end
134
- end
135
- }
136
-
137
- # Remove any duplicate ranges
138
- ranges = ranges.uniq
139
-
140
- return ranges
141
- end
142
-
143
- #
144
- # Resets the subnet walker back to its original state.
145
- #
146
- def reset
147
- return false if not valid?
148
- @curr_range = 0
149
- @curr_addr = @ranges[0][0]
150
- @length = 0
151
- @ranges.each { |r| @length += r[1] - r[0] + 1 }
152
- end
153
-
154
- #
155
- # Returns the next IP address.
156
- #
157
- def next_ip
158
- return false if not valid?
159
- if (@curr_addr > @ranges[@curr_range][1])
160
- if (@curr_range >= @ranges.length - 1)
161
- return nil
162
- end
163
- @curr_range += 1
164
- @curr_addr = @ranges[@curr_range][0]
165
- end
166
- addr = Rex::Socket.addr_itoa(@curr_addr, @ranges[@curr_range][2])
167
-
168
- if @ranges[@curr_range][3][:scope_id]
169
- addr = addr + '%' + @ranges[@curr_range][3][:scope_id]
170
- end
171
-
172
- @curr_addr += 1
173
- return addr
174
- end
175
-
176
- def valid?
177
- (@ranges and not @ranges.empty?)
178
- end
179
-
180
- #
181
- # Returns true if the argument is an ip address that falls within any of
182
- # the stored ranges.
183
- #
184
- def include?(addr)
185
- return false if not @ranges
186
- if (addr.is_a? String)
187
- addr = Rex::Socket.addr_atoi(addr)
188
- end
189
- @ranges.map { |r|
190
- if r[0] <= addr and addr <= r[1]
191
- return true
192
- end
193
- }
194
- return false
195
- end
196
-
197
- #
198
- # Returns true if this RangeWalker includes all of the addresses in the
199
- # given RangeWalker
200
- #
201
- def include_range?(range_walker)
202
- return false if ((not @ranges) or @ranges.empty?)
203
- return false if not range_walker.ranges
204
-
205
- range_walker.ranges.all? do |start, stop|
206
- ranges.any? do |self_start, self_stop|
207
- r = (self_start..self_stop)
208
- r.include?(start) and r.include?(stop)
209
- end
210
- end
211
- end
212
-
213
- #
214
- # Calls the given block with each address. This is basically a wrapper for
215
- # #next_ip
216
- #
217
- def each(&block)
218
- while (ip = next_ip)
219
- block.call(ip)
220
- end
221
- end
222
-
223
- #
224
- # Returns an array with one element, a Range defined by the given CIDR
225
- # block.
226
- #
227
- def expand_cidr(arg)
228
- start,stop = Rex::Socket.cidr_crack(arg)
229
- if !start or !stop
230
- return false
231
- end
232
- range = Range.new
233
- range.start = Rex::Socket.addr_atoi(start)
234
- range.stop = Rex::Socket.addr_atoi(stop)
235
- range.ipv6 = (arg.include?(":"))
236
- range.options = {}
237
-
238
- return range
239
- end
240
-
241
- #
242
- # Expands an nmap-style host range x.x.x.x where x can be simply "*" which
243
- # means 0-255 or any combination and repitition of:
244
- # i,n
245
- # n-m
246
- # i,n-m
247
- # n-m,i
248
- # ensuring that n is never greater than m.
249
- #
250
- # non-unique elements will be removed
251
- # e.g.:
252
- # 10.1.1.1-3,2-2,2 => ["10.1.1.1", "10.1.1.2", "10.1.1.3"]
253
- # 10.1.1.1-3,7 => ["10.1.1.1", "10.1.1.2", "10.1.1.3", "10.1.1.7"]
254
- #
255
- # Returns an array of Ranges
256
- #
257
- def expand_nmap(arg)
258
- # Can't really do anything with IPv6
259
- return false if arg.include?(":")
260
-
261
- # nmap calls these errors, but it's hard to catch them with our
262
- # splitting below, so short-cut them here
263
- return false if arg.include?(",-") or arg.include?("-,")
264
-
265
- bytes = []
266
- sections = arg.split('.')
267
- if sections.length != 4
268
- # Too many or not enough dots
269
- return false
270
- end
271
- sections.each { |section|
272
- if section.empty?
273
- # pretty sure this is an unintentional artifact of the C
274
- # functions that turn strings into ints, but it sort of makes
275
- # sense, so why not
276
- # "10...1" => "10.0.0.1"
277
- section = "0"
278
- end
279
-
280
- if section == "*"
281
- # I think this ought to be 1-254, but this is how nmap does it.
282
- section = "0-255"
283
- elsif section.include?("*")
284
- return false
285
- end
286
-
287
- # Break down the sections into ranges like so
288
- # "1-3,5-7" => ["1-3", "5-7"]
289
- ranges = section.split(',', -1)
290
- sets = []
291
- ranges.each { |r|
292
- bounds = []
293
- if r.include?('-')
294
- # Then it's an actual range, break it down into start,stop
295
- # pairs:
296
- # "1-3" => [ 1, 3 ]
297
- # if the lower bound is empty, start at 0
298
- # if the upper bound is empty, stop at 255
299
- #
300
- bounds = r.split('-', -1)
301
- return false if (bounds.length > 2)
302
-
303
- bounds[0] = 0 if bounds[0].nil? or bounds[0].empty?
304
- bounds[1] = 255 if bounds[1].nil? or bounds[1].empty?
305
- bounds.map!{|b| b.to_i}
306
- return false if bounds[0] > bounds[1]
307
- else
308
- # Then it's a single value
309
- bounds[0] = r.to_i
310
- end
311
- return false if bounds[0] > 255 or (bounds[1] and bounds[1] > 255)
312
- return false if bounds[1] and bounds[0] > bounds[1]
313
- if bounds[1]
314
- bounds[0].upto(bounds[1]) do |i|
315
- sets.push(i)
316
- end
317
- elsif bounds[0]
318
- sets.push(bounds[0])
319
- end
320
- }
321
- bytes.push(sets.sort.uniq)
322
- }
323
-
324
- #
325
- # Combinitorically squish all of the quads together into a big list of
326
- # ip addresses, stored as ints
327
- #
328
- # e.g.:
329
- # [[1],[1],[1,2],[1,2]]
330
- # =>
331
- # [atoi("1.1.1.1"),atoi("1.1.1.2"),atoi("1.1.2.1"),atoi("1.1.2.2")]
332
- addrs = []
333
- for a in bytes[0]
334
- for b in bytes[1]
335
- for c in bytes[2]
336
- for d in bytes[3]
337
- ip = (a << 24) + (b << 16) + (c << 8) + d
338
- addrs.push ip
339
- end
340
- end
341
- end
342
- end
343
-
344
- addrs.sort!
345
- addrs.uniq!
346
-
347
- rng = Range.new
348
- rng.ipv6 = false
349
- rng.options = {}
350
- rng.start = addrs[0]
351
-
352
- ranges = []
353
- 1.upto(addrs.length - 1) do |idx|
354
- if addrs[idx - 1] + 1 == addrs[idx]
355
- # Then this address is contained in the current range
356
- next
357
- else
358
- # Then this address is the upper bound for the current range
359
- rng.stop = addrs[idx - 1]
360
- ranges.push(rng.dup)
361
- rng.start = addrs[idx]
362
- end
363
- end
364
- rng.stop = addrs[addrs.length - 1]
365
- ranges.push(rng.dup)
366
- return ranges
367
- end
368
-
369
- #
370
- # The total number of IPs within the range
371
- #
372
- attr_reader :length
373
-
374
- # for backwards compatibility
375
- alias :num_ips :length
376
-
377
- attr_reader :ranges
26
+ # The total number of IPs within the range
27
+ #
28
+ # @return [Fixnum]
29
+ attr_reader :length
30
+
31
+ # for backwards compatibility
32
+ alias :num_ips :length
33
+
34
+ # A list of the {Range ranges} held in this RangeWalker
35
+ # @return [Array]
36
+ attr_reader :ranges
37
+
38
+ # Initializes a walker instance using the supplied range
39
+ #
40
+ # @param parseme [RangeWalker,String]
41
+ def initialize(parseme)
42
+ if parseme.is_a? RangeWalker
43
+ @ranges = parseme.ranges.dup
44
+ else
45
+ @ranges = parse(parseme)
46
+ end
47
+ reset
48
+ end
49
+
50
+ #
51
+ # Calls the instance method
52
+ #
53
+ # This is basically only useful for determining if a range can be parsed
54
+ #
55
+ # @return (see #parse)
56
+ def self.parse(parseme)
57
+ self.new.parse(parseme)
58
+ end
59
+
60
+ #
61
+ # Turn a human-readable range string into ranges we can step through one address at a time.
62
+ #
63
+ # Allow the following formats:
64
+ # "a.b.c.d e.f.g.h"
65
+ # "a.b.c.d, e.f.g.h"
66
+ # where each chunk is CIDR notation, (e.g. '10.1.1.0/24') or a range in nmap format (see {#expand_nmap})
67
+ #
68
+ # OR this format
69
+ # "a.b.c.d-e.f.g.h"
70
+ # where a.b.c.d and e.f.g.h are single IPs and the second must be
71
+ # bigger than the first.
72
+ #
73
+ # @param parseme [String]
74
+ # @return [self]
75
+ # @return [false] if +parseme+ cannot be parsed
76
+ def parse(parseme)
77
+ return nil if not parseme
78
+ ranges = []
79
+ parseme.split(', ').map{ |a| a.split(' ') }.flatten.each do |arg|
80
+ opts = {}
81
+
82
+ # Handle IPv6 first (support ranges, but not CIDR)
83
+ if arg.include?(":")
84
+ addrs = arg.split('-', 2)
85
+
86
+ # Handle a single address
87
+ if addrs.length == 1
88
+ addr, scope_id = addrs[0].split('%')
89
+ opts[:scope_id] = scope_id if scope_id
90
+ opts[:ipv6] = true
91
+
92
+ return false unless Rex::Socket.is_ipv6?(addr)
93
+ addr = Rex::Socket.addr_atoi(addr)
94
+ ranges.push(Range.new(addr, addr, opts))
95
+ next
96
+ end
97
+
98
+ addr1, scope_id = addrs[0].split('%')
99
+ opts[:scope_id] = scope_id if scope_id
100
+
101
+ addr2, scope_id = addrs[0].split('%')
102
+ ( opts[:scope_id] ||= scope_id ) if scope_id
103
+
104
+ # Both have to be IPv6 for this to work
105
+ return false unless (Rex::Socket.is_ipv6?(addr1) && Rex::Socket.is_ipv6?(addr2))
106
+
107
+ # Handle IPv6 ranges in the form of 2001::1-2001::10
108
+ addr1 = Rex::Socket.addr_atoi(addr1)
109
+ addr2 = Rex::Socket.addr_atoi(addr2)
110
+
111
+ ranges.push(Range.new(addr1, addr2, opts))
112
+ next
113
+
114
+ # Handle IPv4 CIDR
115
+ elsif arg.include?("/")
116
+ # Then it's CIDR notation and needs special case
117
+ return false if arg =~ /[,-]/ # Improper CIDR notation (can't mix with 1,3 or 1-3 style IP ranges)
118
+ return false if arg.scan("/").size > 1 # ..but there are too many slashes
119
+ ip_part,mask_part = arg.split("/")
120
+ return false if ip_part.nil? or ip_part.empty? or mask_part.nil? or mask_part.empty?
121
+ return false if mask_part !~ /^[0-9]{1,2}$/ # Illegal mask -- numerals only
122
+ return false if mask_part.to_i > 32 # This too -- between 0 and 32.
123
+ if ip_part =~ /^\d{1,3}(\.\d{1,3}){1,3}$/
124
+ return false unless ip_part =~ Rex::Socket::MATCH_IPV4
125
+ end
126
+ begin
127
+ Rex::Socket.getaddress(ip_part) # This allows for "www.metasploit.com/24" which is fun.
128
+ rescue Resolv::ResolvError, ::SocketError, Errno::ENOENT
129
+ return false # Can't resolve the ip_part, so bail.
130
+ end
131
+
132
+ expanded = expand_cidr(arg)
133
+ if expanded
134
+ ranges.push(expanded)
135
+ else
136
+ return false
137
+ end
138
+
139
+ # Handle hostnames
140
+ elsif arg =~ /[^-0-9,.*]/
141
+ # Then it's a domain name and we should send it on to addr_atoi
142
+ # unmolested to force a DNS lookup.
143
+ begin
144
+ ranges += Rex::Socket.addr_atoi_list(arg).map { |a| Range.new(a, a, opts) }
145
+ rescue Resolv::ResolvError, ::SocketError, Errno::ENOENT
146
+ return false
147
+ end
148
+
149
+ # Handle IPv4 ranges
150
+ elsif arg =~ /^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})-([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$/
151
+
152
+ # Then it's in the format of 1.2.3.4-5.6.7.8
153
+ # Note, this will /not/ deal with DNS names, or the fancy/obscure 10...1-10...2
154
+ begin
155
+ start, stop = Rex::Socket.addr_atoi($1), Rex::Socket.addr_atoi($2)
156
+ return false if start > stop # The end is greater than the beginning.
157
+ ranges.push(Range.new(start, stop, opts))
158
+ rescue Resolv::ResolvError, ::SocketError, Errno::ENOENT
159
+ return false
160
+ end
161
+ else
162
+ # Returns an array of ranges
163
+ expanded = expand_nmap(arg)
164
+ if expanded
165
+ expanded.each { |r| ranges.push(r) }
166
+ end
167
+ end
168
+ end
169
+
170
+ # Remove any duplicate ranges
171
+ ranges = ranges.uniq
172
+
173
+ return ranges
174
+ end
175
+
176
+ #
177
+ # Resets the subnet walker back to its original state.
178
+ #
179
+ # @return [self]
180
+ def reset
181
+ return false if not valid?
182
+ @curr_range_index = 0
183
+ @curr_addr = @ranges.first.start
184
+ @length = 0
185
+ @ranges.each { |r| @length += r.length }
186
+
187
+ self
188
+ end
189
+
190
+ # Returns the next IP address.
191
+ #
192
+ # @return [String] The next address in the range
193
+ def next_ip
194
+ return false if not valid?
195
+ if (@curr_addr > @ranges[@curr_range_index].stop)
196
+ # Then we are at the end of this range. Grab the next one.
197
+
198
+ # Bail if there are no more ranges
199
+ return nil if (@ranges[@curr_range_index+1].nil?)
200
+
201
+ @curr_range_index += 1
202
+
203
+ @curr_addr = @ranges[@curr_range_index].start
204
+ end
205
+ addr = Rex::Socket.addr_itoa(@curr_addr, @ranges[@curr_range_index].ipv6?)
206
+
207
+ if @ranges[@curr_range_index].options[:scope_id]
208
+ addr = addr + '%' + @ranges[@curr_range_index].options[:scope_id]
209
+ end
210
+
211
+ @curr_addr += 1
212
+ return addr
213
+ end
214
+
215
+ alias :next :next_ip
216
+
217
+ # Whether this RangeWalker's ranges are valid
218
+ def valid?
219
+ (@ranges && !@ranges.empty?)
220
+ end
221
+
222
+ # Returns true if the argument is an ip address that falls within any of
223
+ # the stored ranges.
224
+ #
225
+ # @return [true] if this RangeWalker contains +addr+
226
+ # @return [false] if not
227
+ def include?(addr)
228
+ return false if not @ranges
229
+ if (addr.is_a? String)
230
+ addr = Rex::Socket.addr_atoi(addr)
231
+ end
232
+ @ranges.map { |r|
233
+ if addr.between?(r.start, r.stop)
234
+ return true
235
+ end
236
+ }
237
+ return false
238
+ end
239
+
240
+ #
241
+ # Returns true if this RangeWalker includes *all* of the addresses in the
242
+ # given RangeWalker
243
+ #
244
+ # @param other [RangeWalker]
245
+ def include_range?(other)
246
+ return false if (!@ranges || @ranges.empty?)
247
+ return false if !other.ranges || other.ranges.empty?
248
+
249
+ # Check that all the ranges in +other+ fall within at least one of
250
+ # our ranges.
251
+ other.ranges.all? do |other_range|
252
+ ranges.any? do |range|
253
+ other_range.start.between?(range.start, range.stop) && other_range.stop.between?(range.start, range.stop)
254
+ end
255
+ end
256
+ end
257
+
258
+ #
259
+ # Calls the given block with each address. This is basically a wrapper for
260
+ # {#next_ip}
261
+ #
262
+ # @return [self]
263
+ def each(&block)
264
+ while (ip = next_ip)
265
+ block.call(ip)
266
+ end
267
+ reset
268
+
269
+ self
270
+ end
271
+
272
+ #
273
+ # Returns an Array with one element, a {Range} defined by the given CIDR
274
+ # block.
275
+ #
276
+ # @see Rex::Socket.cidr_crack
277
+ # @param arg [String] A CIDR range
278
+ # @return [Range]
279
+ # @return [false] if +arg+ is not valid CIDR notation
280
+ def expand_cidr(arg)
281
+ start,stop = Rex::Socket.cidr_crack(arg)
282
+ if !start or !stop
283
+ return false
284
+ end
285
+ range = Range.new
286
+ range.start = Rex::Socket.addr_atoi(start)
287
+ range.stop = Rex::Socket.addr_atoi(stop)
288
+ range.options = { :ipv6 => (arg.include?(":")) }
289
+
290
+ return range
291
+ end
292
+
293
+ #
294
+ # Expands an nmap-style host range x.x.x.x where x can be simply "*" which
295
+ # means 0-255 or any combination and repitition of:
296
+ # i,n
297
+ # n-m
298
+ # i,n-m
299
+ # n-m,i
300
+ # ensuring that n is never greater than m.
301
+ #
302
+ # non-unique elements will be removed
303
+ # e.g.:
304
+ # 10.1.1.1-3,2-2,2 => ["10.1.1.1", "10.1.1.2", "10.1.1.3"]
305
+ # 10.1.1.1-3,7 => ["10.1.1.1", "10.1.1.2", "10.1.1.3", "10.1.1.7"]
306
+ #
307
+ # Returns an array of Ranges
308
+ #
309
+ def expand_nmap(arg)
310
+ # Can't really do anything with IPv6
311
+ return false if arg.include?(":")
312
+
313
+ # nmap calls these errors, but it's hard to catch them with our
314
+ # splitting below, so short-cut them here
315
+ return false if arg.include?(",-") or arg.include?("-,")
316
+
317
+ bytes = []
318
+ sections = arg.split('.')
319
+ if sections.length != 4
320
+ # Too many or not enough dots
321
+ return false
322
+ end
323
+ sections.each { |section|
324
+ if section.empty?
325
+ # pretty sure this is an unintentional artifact of the C
326
+ # functions that turn strings into ints, but it sort of makes
327
+ # sense, so why not
328
+ # "10...1" => "10.0.0.1"
329
+ section = "0"
330
+ end
331
+
332
+ if section == "*"
333
+ # I think this ought to be 1-254, but this is how nmap does it.
334
+ section = "0-255"
335
+ elsif section.include?("*")
336
+ return false
337
+ end
338
+
339
+ # Break down the sections into ranges like so
340
+ # "1-3,5-7" => ["1-3", "5-7"]
341
+ ranges = section.split(',', -1)
342
+ sets = []
343
+ ranges.each { |r|
344
+ bounds = []
345
+ if r.include?('-')
346
+ # Then it's an actual range, break it down into start,stop
347
+ # pairs:
348
+ # "1-3" => [ 1, 3 ]
349
+ # if the lower bound is empty, start at 0
350
+ # if the upper bound is empty, stop at 255
351
+ #
352
+ bounds = r.split('-', -1)
353
+ return false if (bounds.length > 2)
354
+
355
+ bounds[0] = 0 if bounds[0].nil? or bounds[0].empty?
356
+ bounds[1] = 255 if bounds[1].nil? or bounds[1].empty?
357
+ bounds.map!{|b| b.to_i}
358
+ return false if bounds[0] > bounds[1]
359
+ else
360
+ # Then it's a single value
361
+ bounds[0] = r.to_i
362
+ end
363
+ return false if bounds[0] > 255 or (bounds[1] and bounds[1] > 255)
364
+ return false if bounds[1] and bounds[0] > bounds[1]
365
+ if bounds[1]
366
+ bounds[0].upto(bounds[1]) do |i|
367
+ sets.push(i)
368
+ end
369
+ elsif bounds[0]
370
+ sets.push(bounds[0])
371
+ end
372
+ }
373
+ bytes.push(sets.sort.uniq)
374
+ }
375
+
376
+ #
377
+ # Combinitorically squish all of the quads together into a big list of
378
+ # ip addresses, stored as ints
379
+ #
380
+ # e.g.:
381
+ # [[1],[1],[1,2],[1,2]]
382
+ # =>
383
+ # [atoi("1.1.1.1"),atoi("1.1.1.2"),atoi("1.1.2.1"),atoi("1.1.2.2")]
384
+ addrs = []
385
+ for a in bytes[0]
386
+ for b in bytes[1]
387
+ for c in bytes[2]
388
+ for d in bytes[3]
389
+ ip = (a << 24) + (b << 16) + (c << 8) + d
390
+ addrs.push ip
391
+ end
392
+ end
393
+ end
394
+ end
395
+
396
+ addrs.sort!
397
+ addrs.uniq!
398
+
399
+ rng = Range.new
400
+ rng.options = { :ipv6 => false }
401
+ rng.start = addrs[0]
402
+
403
+ ranges = []
404
+ 1.upto(addrs.length - 1) do |idx|
405
+ if addrs[idx - 1] + 1 == addrs[idx]
406
+ # Then this address is contained in the current range
407
+ next
408
+ else
409
+ # Then this address is the upper bound for the current range
410
+ rng.stop = addrs[idx - 1]
411
+ ranges.push(rng.dup)
412
+ rng.start = addrs[idx]
413
+ end
414
+ end
415
+ rng.stop = addrs[addrs.length - 1]
416
+ ranges.push(rng.dup)
417
+ return ranges
418
+ end
378
419
 
379
420
  end
380
421
 
381
- class Range < Array # :nodoc: all
382
- def start; self[0]; end
383
- def stop; self[1]; end
384
- def ipv6; self[2]; end
385
- def options; self[3]; end
386
- def start=(val); self[0] = val; end
387
- def stop=(val); self[1] = val; end
388
- def ipv6=(val); self[2] = val; end
389
- def options=(val); self[3] = val; end
422
+ # A range of IP addresses
423
+ class Range
424
+
425
+ #@!attribute start
426
+ # The first address in this range, as a number
427
+ # @return [Fixnum]
428
+ attr_accessor :start
429
+ #@!attribute stop
430
+ # The last address in this range, as a number
431
+ # @return [Fixnum]
432
+ attr_accessor :stop
433
+ #@!attribute options
434
+ # @return [Hash]
435
+ attr_accessor :options
436
+
437
+ # @param start [Fixnum]
438
+ # @param stop [Fixnum]
439
+ # @param options [Hash] Recognized keys are:
440
+ # * +:ipv6+
441
+ # * +:scope_id+
442
+ def initialize(start=nil, stop=nil, options=nil)
443
+ @start = start
444
+ @stop = stop
445
+ @options = options
446
+ end
447
+
448
+ # Compare attributes with +other+
449
+ # @param other [Range]
450
+ # @return [Boolean]
451
+ def ==(other)
452
+ (other.start == start && other.stop == stop && other.ipv6? == ipv6? && other.options == options)
453
+ end
454
+
455
+ # The number of addresses in this Range
456
+ # @return [Fixnum]
457
+ def length
458
+ stop - start + 1
459
+ end
460
+ alias :count :length
461
+
462
+ # Whether this Range contains IPv6 or IPv4 addresses
463
+ # @return [Boolean]
464
+ def ipv6?
465
+ options[:ipv6]
466
+ end
390
467
  end
391
468
 
392
469
  end