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
@@ -40,270 +40,279 @@ module Railgun
40
40
  # A easier way to call multiple functions in a single request
41
41
  class MultiCaller
42
42
 
43
- include DLLHelper
44
-
45
- def initialize( client, parent )
46
- @parent = parent
47
- @client = client
48
-
49
- if( @client.platform =~ /x64/i )
50
- @native = 'Q'
51
- else
52
- @native = 'V'
53
- end
54
- end
55
-
56
- def call(functions)
57
-
58
- request = Packet.create_request('stdapi_railgun_api_multi')
59
- function_results = []
60
- layouts = []
61
- functions.each do |f|
62
- dll_name,funcname,args = f
63
- dll_host = @parent.get_dll( dll_name )
64
-
65
- if not dll_host
66
- raise "DLL #{dll_name} has not been loaded"
67
- end
68
-
69
- function = dll_host.functions[funcname]
70
- if not function
71
- raise "DLL #{dll_name} function #{funcname} has not been defined"
72
- end
73
-
74
- raise "#{function.params.length} arguments expected. #{args.length} arguments provided." unless args.length == function.params.length
75
- #puts "process_function_call(function.windows_name,#{PP.pp(args, "")})"
76
-
77
- # We transmit the immediate stack and three heap-buffers:
78
- # in, inout and out. The reason behind the separation is bandwidth.
79
- # We don't want to transmit uninitialized data in or no-longer-needed data out.
80
-
81
- # out-only-buffers that are ONLY transmitted on the way BACK
82
- out_only_layout = {} # paramName => BufferItem
83
- out_only_size_bytes = 0
84
- #puts " assembling out-only buffer"
85
- function.params.each_with_index do |param_desc, param_idx|
86
- #puts " processing #{param_desc[1]}"
87
-
88
- # Special case:
89
- # The user can choose to supply a Null pointer instead of a buffer
90
- # in this case we don't need space in any heap buffer
91
- if param_desc[0][0,1] == 'P' # type is a pointer
92
- if args[param_idx] == nil
93
- next
94
- end
95
- end
96
-
97
- # we care only about out-only buffers
98
- if param_desc[2] == "out"
99
- raise "error in param #{param_desc[1]}: Out-only buffers must be described by a number indicating their size in bytes " unless args[param_idx].class == Fixnum
100
- buffer_size = args[param_idx]
101
- # bump up the size for an x64 pointer
102
- if( @native == 'Q' and buffer_size == 4 )
103
- args[param_idx] = 8
104
- buffer_size = args[param_idx]
105
- end
106
-
107
- if( @native == 'Q' )
108
- raise "Please pass 8 for 'out' PDWORDS, since they require a buffer of size 8" unless buffer_size == 8
109
- elsif( @native == 'V' )
110
- raise "Please pass 4 for 'out' PDWORDS, since they require a buffer of size 4" unless buffer_size == 4
111
- end
112
-
113
- out_only_layout[param_desc[1]] = BufferItem.new(param_idx, out_only_size_bytes, buffer_size, param_desc[0])
114
- out_only_size_bytes += buffer_size
115
- end
116
- end
117
-
118
- tmp = assemble_buffer("in", function, args)
119
- in_only_layout = tmp[0]
120
- in_only_buffer = tmp[1]
121
-
122
- tmp = assemble_buffer("inout", function, args)
123
- inout_layout = tmp[0]
124
- inout_buffer = tmp[1]
125
-
126
-
127
- # now we build the stack
128
- # every stack dword will be described by two dwords:
129
- # first dword describes second dword:
130
- # 0 - literal,
131
- # 1 = relative to in-only buffer
132
- # 2 = relative to out-only buffer
133
- # 3 = relative to inout buffer
134
-
135
- # (literal numbers and pointers to buffers we have created)
136
- literal_pairs_blob = ""
137
- #puts " assembling literal stack"
138
- function.params.each_with_index do |param_desc, param_idx|
139
- #puts " processing (#{param_desc[0]}, #{param_desc[1]}, #{param_desc[2]})"
140
- buffer = nil
141
- # is it a pointer to a buffer on our stack
142
- if ["PDWORD", "PWCHAR", "PCHAR", "PBLOB"].include? param_desc[0]
143
- #puts " pointer"
144
- if args[param_idx] == nil # null pointer?
145
- buffer = [0].pack(@native) # type: DWORD (so the dll does not rebase it)
146
- buffer += [0].pack(@native) # value: 0
147
- elsif param_desc[2] == "in"
148
- buffer = [1].pack(@native)
149
- buffer += [in_only_layout[param_desc[1]].addr].pack(@native)
150
- elsif param_desc[2] == "out"
151
- buffer = [2].pack(@native)
152
- buffer += [out_only_layout[param_desc[1]].addr].pack(@native)
153
- elsif param_desc[2] == "inout"
154
- buffer = [3].pack(@native)
155
- buffer += [inout_layout[param_desc[1]].addr].pack(@native)
156
- else
157
- raise "unexpected direction"
158
- end
159
- else
160
- #puts " not a pointer"
161
- # it's not a pointer
162
- buffer = [0].pack(@native)
163
- case param_desc[0]
164
- when "LPVOID", "HANDLE"
165
- num = param_to_number(args[param_idx])
166
- buffer += [num].pack(@native)
167
- when "DWORD"
168
- num = param_to_number(args[param_idx])
169
- buffer += [num % 4294967296].pack(@native)
170
- when "WORD"
171
- num = param_to_number(args[param_idx])
172
- buffer += [num % 65536].pack(@native)
173
- when "BYTE"
174
- num = param_to_number(args[param_idx])
175
- buffer += [num % 256].pack(@native)
176
- when "BOOL"
177
- case args[param_idx]
178
- when true
179
- buffer += [1].pack('V')
180
- when false
181
- buffer += [0].pack('V')
182
- else
183
- raise "param #{param_desc[1]}: true or false expected"
184
- end
185
- else
186
- raise "unexpected type for param #{param_desc[1]}"
187
- end
188
- end
189
-
190
- #puts " adding pair to blob"
191
- literal_pairs_blob += buffer
192
- #puts " buffer size %X" % buffer.length
193
- #puts " blob size so far: %X" % literal_pairs_blob.length
194
- end
195
-
196
- #puts "\n\nsending Stuff to meterpreter"
197
-
198
- group = Rex::Post::Meterpreter::GroupTlv.new(TLV_TYPE_RAILGUN_MULTI_GROUP)
199
- group.add_tlv(TLV_TYPE_RAILGUN_SIZE_OUT, out_only_size_bytes)
200
- group.add_tlv(TLV_TYPE_RAILGUN_STACKBLOB, literal_pairs_blob)
201
- group.add_tlv(TLV_TYPE_RAILGUN_BUFFERBLOB_IN, in_only_buffer)
202
- group.add_tlv(TLV_TYPE_RAILGUN_BUFFERBLOB_INOUT, inout_buffer)
203
- group.add_tlv(TLV_TYPE_RAILGUN_DLLNAME, dll_name )
204
- group.add_tlv(TLV_TYPE_RAILGUN_FUNCNAME, function.windows_name)
205
- request.tlvs << group
206
-
207
- layouts << [inout_layout, out_only_layout]
208
- end
209
-
210
- call_results = []
211
- res = @client.send_request(request)
212
- res.each(TLV_TYPE_RAILGUN_MULTI_GROUP) do |val|
213
- call_results << val
214
- end
215
-
216
- functions.each do |f|
217
- dll_name,funcname,args = f
218
- dll_host = @parent.get_dll( dll_name )
219
- function = dll_host.functions[funcname]
220
- response = call_results.shift
221
- inout_layout, out_only_layout = layouts.shift
222
-
223
- rec_inout_buffers = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_INOUT)
224
- rec_out_only_buffers = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_OUT)
225
- rec_return_value = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_RET)
226
- rec_last_error = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_ERR)
227
-
228
- # The hash the function returns
229
- return_hash={"GetLastError" => rec_last_error}
230
-
231
- #process return value
232
- case function.return_type
233
- when "LPVOID", "HANDLE"
234
- if( @native == 'Q' )
235
- return_hash["return"] = rec_return_value
236
- else
237
- return_hash["return"] = rec_return_value % 4294967296
238
- end
239
- when "DWORD"
240
- return_hash["return"] = rec_return_value % 4294967296
241
- when "WORD"
242
- return_hash["return"] = rec_return_value % 65536
243
- when "BYTE"
244
- return_hash["return"] = rec_return_value % 256
245
- when "BOOL"
246
- return_hash["return"] = (rec_return_value != 0)
247
- when "VOID"
248
- return_hash["return"] = nil
249
- else
250
- raise "unexpected return type: #{function.return_type}"
251
- end
252
- #puts return_hash
253
- #puts "out_only_layout:"
254
- #puts out_only_layout
255
-
256
-
257
- # process out-only buffers
258
- #puts "processing out-only buffers:"
259
- out_only_layout.each_pair do |param_name, buffer_item|
260
- #puts " #{param_name}"
261
- buffer = rec_out_only_buffers[buffer_item.addr, buffer_item.length_in_bytes]
262
- case buffer_item.datatype
263
- when "PDWORD"
264
- return_hash[param_name] = buffer.unpack('V')[0]
265
- when "PCHAR"
266
- return_hash[param_name] = asciiz_to_str(buffer)
267
- when "PWCHAR"
268
- return_hash[param_name] = uniz_to_str(buffer)
269
- when "PBLOB"
270
- return_hash[param_name] = buffer
271
- else
272
- raise "unexpected type in out-only buffer of #{param_name}: #{buffer_item.datatype}"
273
- end
274
- end
275
- #puts return_hash
276
-
277
- # process in-out buffers
278
- #puts "processing in-out buffers:"
279
- inout_layout.each_pair do |param_name, buffer_item|
280
- #puts " #{param_name}"
281
- buffer = rec_inout_buffers[buffer_item.addr, buffer_item.length_in_bytes]
282
- case buffer_item.datatype
283
- when "PDWORD"
284
- return_hash[param_name] = buffer.unpack('V')[0]
285
- when "PCHAR"
286
- return_hash[param_name] = asciiz_to_str(buffer)
287
- when "PWCHAR"
288
- return_hash[param_name] = uniz_to_str(buffer)
289
- when "PBLOB"
290
- return_hash[param_name] = buffer
291
- else
292
- raise "unexpected type in in-out-buffer of #{param_name}: #{buffer_item.datatype}"
293
- end
294
- end
295
- #puts return_hash
296
- #puts "finished"
297
-
298
- function_results << return_hash
299
- end
300
- function_results
301
- end
302
- # process_multi_function_call
303
-
304
- protected
305
-
306
- attr_accessor :win_consts
43
+ include DLLHelper
44
+
45
+ def initialize( client, parent, win_consts )
46
+ @parent = parent
47
+ @client = client
48
+
49
+ # needed by DLL helper
50
+ @win_consts = win_consts
51
+
52
+ if( @client.platform =~ /x64/i )
53
+ @native = 'Q'
54
+ else
55
+ @native = 'V'
56
+ end
57
+ end
58
+
59
+ def call(functions)
60
+
61
+ request = Packet.create_request('stdapi_railgun_api_multi')
62
+ function_results = []
63
+ layouts = []
64
+ functions.each do |f|
65
+ dll_name,funcname,args = f
66
+ dll_host = @parent.get_dll( dll_name )
67
+
68
+ if not dll_host
69
+ raise "DLL #{dll_name} has not been loaded"
70
+ end
71
+
72
+ function = dll_host.functions[funcname]
73
+ if not function
74
+ raise "DLL #{dll_name} function #{funcname} has not been defined"
75
+ end
76
+
77
+ raise "#{function.params.length} arguments expected. #{args.length} arguments provided." unless args.length == function.params.length
78
+ #puts "process_function_call(function.windows_name,#{PP.pp(args, "")})"
79
+
80
+ # We transmit the immediate stack and three heap-buffers:
81
+ # in, inout and out. The reason behind the separation is bandwidth.
82
+ # We don't want to transmit uninitialized data in or no-longer-needed data out.
83
+
84
+ # out-only-buffers that are ONLY transmitted on the way BACK
85
+ out_only_layout = {} # paramName => BufferItem
86
+ out_only_size_bytes = 0
87
+ #puts " assembling out-only buffer"
88
+ function.params.each_with_index do |param_desc, param_idx|
89
+ #puts " processing #{param_desc[1]}"
90
+
91
+ # Special case:
92
+ # The user can choose to supply a Null pointer instead of a buffer
93
+ # in this case we don't need space in any heap buffer
94
+ if param_desc[0][0,1] == 'P' # type is a pointer
95
+ if args[param_idx] == nil
96
+ next
97
+ end
98
+ end
99
+
100
+ # we care only about out-only buffers
101
+ if param_desc[2] == "out"
102
+ raise "error in param #{param_desc[1]}: Out-only buffers must be described by a number indicating their size in bytes " unless args[param_idx].class == Fixnum
103
+ buffer_size = args[param_idx]
104
+ # bump up the size for an x64 pointer
105
+ if( @native == 'Q' and buffer_size == 4 )
106
+ args[param_idx] = 8
107
+ buffer_size = args[param_idx]
108
+ end
109
+
110
+ if( @native == 'Q' )
111
+ raise "Please pass 8 for 'out' PDWORDS, since they require a buffer of size 8" unless buffer_size == 8
112
+ elsif( @native == 'V' )
113
+ raise "Please pass 4 for 'out' PDWORDS, since they require a buffer of size 4" unless buffer_size == 4
114
+ end
115
+
116
+ out_only_layout[param_desc[1]] = BufferItem.new(param_idx, out_only_size_bytes, buffer_size, param_desc[0])
117
+ out_only_size_bytes += buffer_size
118
+ end
119
+ end
120
+
121
+ tmp = assemble_buffer("in", function, args)
122
+ in_only_layout = tmp[0]
123
+ in_only_buffer = tmp[1]
124
+
125
+ tmp = assemble_buffer("inout", function, args)
126
+ inout_layout = tmp[0]
127
+ inout_buffer = tmp[1]
128
+
129
+
130
+ # now we build the stack
131
+ # every stack dword will be described by two dwords:
132
+ # first dword describes second dword:
133
+ # 0 - literal,
134
+ # 1 = relative to in-only buffer
135
+ # 2 = relative to out-only buffer
136
+ # 3 = relative to inout buffer
137
+
138
+ # (literal numbers and pointers to buffers we have created)
139
+ literal_pairs_blob = ""
140
+ #puts " assembling literal stack"
141
+ function.params.each_with_index do |param_desc, param_idx|
142
+ #puts " processing (#{param_desc[0]}, #{param_desc[1]}, #{param_desc[2]})"
143
+ buffer = nil
144
+ # is it a pointer to a buffer on our stack
145
+ if ["PDWORD", "PWCHAR", "PCHAR", "PBLOB"].include? param_desc[0]
146
+ #puts " pointer"
147
+ if args[param_idx] == nil # null pointer?
148
+ buffer = [0].pack(@native) # type: DWORD (so the dll does not rebase it)
149
+ buffer += [0].pack(@native) # value: 0
150
+ elsif param_desc[2] == "in"
151
+ buffer = [1].pack(@native)
152
+ buffer += [in_only_layout[param_desc[1]].addr].pack(@native)
153
+ elsif param_desc[2] == "out"
154
+ buffer = [2].pack(@native)
155
+ buffer += [out_only_layout[param_desc[1]].addr].pack(@native)
156
+ elsif param_desc[2] == "inout"
157
+ buffer = [3].pack(@native)
158
+ buffer += [inout_layout[param_desc[1]].addr].pack(@native)
159
+ else
160
+ raise "unexpected direction"
161
+ end
162
+ else
163
+ #puts " not a pointer"
164
+ # it's not a pointer
165
+ buffer = [0].pack(@native)
166
+ case param_desc[0]
167
+ when "LPVOID", "HANDLE"
168
+ num = param_to_number(args[param_idx])
169
+ buffer += [num].pack(@native)
170
+ when "DWORD"
171
+ num = param_to_number(args[param_idx])
172
+ buffer += [num % 4294967296].pack(@native)
173
+ when "WORD"
174
+ num = param_to_number(args[param_idx])
175
+ buffer += [num % 65536].pack(@native)
176
+ when "BYTE"
177
+ num = param_to_number(args[param_idx])
178
+ buffer += [num % 256].pack(@native)
179
+ when "BOOL"
180
+ case args[param_idx]
181
+ when true
182
+ buffer += [1].pack('V')
183
+ when false
184
+ buffer += [0].pack('V')
185
+ else
186
+ raise "param #{param_desc[1]}: true or false expected"
187
+ end
188
+ else
189
+ raise "unexpected type for param #{param_desc[1]}"
190
+ end
191
+ end
192
+
193
+ #puts " adding pair to blob"
194
+ literal_pairs_blob += buffer
195
+ #puts " buffer size %X" % buffer.length
196
+ #puts " blob size so far: %X" % literal_pairs_blob.length
197
+ end
198
+
199
+ #puts "\n\nsending Stuff to meterpreter"
200
+
201
+ group = Rex::Post::Meterpreter::GroupTlv.new(TLV_TYPE_RAILGUN_MULTI_GROUP)
202
+ group.add_tlv(TLV_TYPE_RAILGUN_SIZE_OUT, out_only_size_bytes)
203
+ group.add_tlv(TLV_TYPE_RAILGUN_STACKBLOB, literal_pairs_blob)
204
+ group.add_tlv(TLV_TYPE_RAILGUN_BUFFERBLOB_IN, in_only_buffer)
205
+ group.add_tlv(TLV_TYPE_RAILGUN_BUFFERBLOB_INOUT, inout_buffer)
206
+ group.add_tlv(TLV_TYPE_RAILGUN_DLLNAME, dll_name )
207
+ group.add_tlv(TLV_TYPE_RAILGUN_FUNCNAME, function.windows_name)
208
+ request.tlvs << group
209
+
210
+ layouts << [inout_layout, out_only_layout]
211
+ end
212
+
213
+ call_results = []
214
+ res = @client.send_request(request)
215
+ res.each(TLV_TYPE_RAILGUN_MULTI_GROUP) do |val|
216
+ call_results << val
217
+ end
218
+
219
+ functions.each do |f|
220
+ dll_name,funcname,args = f
221
+ dll_host = @parent.get_dll( dll_name )
222
+ function = dll_host.functions[funcname]
223
+ response = call_results.shift
224
+ inout_layout, out_only_layout = layouts.shift
225
+
226
+ rec_inout_buffers = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_INOUT)
227
+ rec_out_only_buffers = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_BUFFERBLOB_OUT)
228
+ rec_return_value = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_RET)
229
+ rec_last_error = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_ERR)
230
+ rec_err_msg = response.get_tlv_value(TLV_TYPE_RAILGUN_BACK_MSG)
231
+
232
+ # Error messages come back with trailing CRLF, so strip it out
233
+ # if we do get a message.
234
+ rec_err_msg.strip! if not rec_err_msg.nil?
235
+
236
+ # The hash the function returns
237
+ return_hash = {
238
+ "GetLastError" => rec_last_error,
239
+ "ErrorMessage" => rec_err_msg
240
+ }
241
+
242
+ #process return value
243
+ case function.return_type
244
+ when "LPVOID", "HANDLE"
245
+ if( @native == 'Q' )
246
+ return_hash["return"] = rec_return_value
247
+ else
248
+ return_hash["return"] = rec_return_value % 4294967296
249
+ end
250
+ when "DWORD"
251
+ return_hash["return"] = rec_return_value % 4294967296
252
+ when "WORD"
253
+ return_hash["return"] = rec_return_value % 65536
254
+ when "BYTE"
255
+ return_hash["return"] = rec_return_value % 256
256
+ when "BOOL"
257
+ return_hash["return"] = (rec_return_value != 0)
258
+ when "VOID"
259
+ return_hash["return"] = nil
260
+ else
261
+ raise "unexpected return type: #{function.return_type}"
262
+ end
263
+ #puts return_hash
264
+ #puts "out_only_layout:"
265
+ #puts out_only_layout
266
+
267
+
268
+ # process out-only buffers
269
+ #puts "processing out-only buffers:"
270
+ out_only_layout.each_pair do |param_name, buffer_item|
271
+ #puts " #{param_name}"
272
+ buffer = rec_out_only_buffers[buffer_item.addr, buffer_item.length_in_bytes]
273
+ case buffer_item.datatype
274
+ when "PDWORD"
275
+ return_hash[param_name] = buffer.unpack('V')[0]
276
+ when "PCHAR"
277
+ return_hash[param_name] = asciiz_to_str(buffer)
278
+ when "PWCHAR"
279
+ return_hash[param_name] = uniz_to_str(buffer)
280
+ when "PBLOB"
281
+ return_hash[param_name] = buffer
282
+ else
283
+ raise "unexpected type in out-only buffer of #{param_name}: #{buffer_item.datatype}"
284
+ end
285
+ end
286
+ #puts return_hash
287
+
288
+ # process in-out buffers
289
+ #puts "processing in-out buffers:"
290
+ inout_layout.each_pair do |param_name, buffer_item|
291
+ #puts " #{param_name}"
292
+ buffer = rec_inout_buffers[buffer_item.addr, buffer_item.length_in_bytes]
293
+ case buffer_item.datatype
294
+ when "PDWORD"
295
+ return_hash[param_name] = buffer.unpack('V')[0]
296
+ when "PCHAR"
297
+ return_hash[param_name] = asciiz_to_str(buffer)
298
+ when "PWCHAR"
299
+ return_hash[param_name] = uniz_to_str(buffer)
300
+ when "PBLOB"
301
+ return_hash[param_name] = buffer
302
+ else
303
+ raise "unexpected type in in-out-buffer of #{param_name}: #{buffer_item.datatype}"
304
+ end
305
+ end
306
+ #puts return_hash
307
+ #puts "finished"
308
+
309
+ function_results << return_hash
310
+ end
311
+ function_results
312
+ end
313
+ # process_multi_function_call
314
+
315
+ protected
307
316
 
308
317
  end # MultiCall
309
318