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
@@ -7,46 +7,46 @@ module Registry
7
7
 
8
8
  class NodeKey
9
9
 
10
- attr_accessor :timestamp, :parent_offset, :subkeys_count, :lf_record_offset
11
- attr_accessor :value_count, :value_list_offset, :security_key_offset
12
- attr_accessor :class_name_offset, :name_length, :class_name_length, :full_path
13
- attr_accessor :name, :lf_record, :value_list, :class_name_data, :readable_timestamp
10
+ attr_accessor :timestamp, :parent_offset, :subkeys_count, :lf_record_offset
11
+ attr_accessor :value_count, :value_list_offset, :security_key_offset
12
+ attr_accessor :class_name_offset, :name_length, :class_name_length, :full_path
13
+ attr_accessor :name, :lf_record, :value_list, :class_name_data, :readable_timestamp
14
14
 
15
- def initialize(hive, offset)
15
+ def initialize(hive, offset)
16
16
 
17
- offset = offset + 0x04
17
+ offset = offset + 0x04
18
18
 
19
- nk_header = hive[offset, 2]
20
- nk_type = hive[offset+0x02, 2]
19
+ nk_header = hive[offset, 2]
20
+ nk_type = hive[offset+0x02, 2]
21
21
 
22
- if nk_header !~ /nk/
23
- return
24
- end
22
+ if nk_header !~ /nk/
23
+ return
24
+ end
25
25
 
26
- @timestamp = hive[offset+0x04, 8].unpack('q').first
27
- @parent_offset = hive[offset+0x10, 4].unpack('l').first
28
- @subkeys_count = hive[offset+0x14, 4].unpack('l').first
29
- @lf_record_offset = hive[offset+0x1c, 4].unpack('l').first
30
- @value_count = hive[offset+0x24, 4].unpack('l').first
31
- @value_list_offset = hive[offset+0x28, 4].unpack('l').first
32
- @security_key_offset = hive[offset+0x2c, 4].unpack('l').first
33
- @class_name_offset = hive[offset+0x30, 4].unpack('l').first
34
- @name_length = hive[offset+0x48, 2].unpack('c').first
35
- @class_name_length = hive[offset+0x4a, 2].unpack('c').first
36
- @name = hive[offset+0x4c, @name_length].to_s
26
+ @timestamp = hive[offset+0x04, 8].unpack('q').first
27
+ @parent_offset = hive[offset+0x10, 4].unpack('l').first
28
+ @subkeys_count = hive[offset+0x14, 4].unpack('l').first
29
+ @lf_record_offset = hive[offset+0x1c, 4].unpack('l').first
30
+ @value_count = hive[offset+0x24, 4].unpack('l').first
31
+ @value_list_offset = hive[offset+0x28, 4].unpack('l').first
32
+ @security_key_offset = hive[offset+0x2c, 4].unpack('l').first
33
+ @class_name_offset = hive[offset+0x30, 4].unpack('l').first
34
+ @name_length = hive[offset+0x48, 2].unpack('c').first
35
+ @class_name_length = hive[offset+0x4a, 2].unpack('c').first
36
+ @name = hive[offset+0x4c, @name_length].to_s
37
37
 
38
- windows_time = @timestamp
39
- unix_time = windows_time/10000000-11644473600
40
- ruby_time = Time.at(unix_time)
38
+ windows_time = @timestamp
39
+ unix_time = windows_time/10000000-11644473600
40
+ ruby_time = Time.at(unix_time)
41
41
 
42
- @readable_timestamp = ruby_time
42
+ @readable_timestamp = ruby_time
43
43
 
44
- @lf_record = LFBlock.new(hive, @lf_record_offset + 0x1000) if @lf_record_offset != -1
45
- @value_list = ValueList.new(hive, @value_list_offset + 0x1000, @value_count) if @value_list_offset != -1
44
+ @lf_record = LFBlock.new(hive, @lf_record_offset + 0x1000) if @lf_record_offset != -1
45
+ @value_list = ValueList.new(hive, @value_list_offset + 0x1000, @value_count) if @value_list_offset != -1
46
46
 
47
- @class_name_data = hive[@class_name_offset + 0x04 + 0x1000, @class_name_length]
47
+ @class_name_data = hive[@class_name_offset + 0x04 + 0x1000, @class_name_length]
48
48
 
49
- end
49
+ end
50
50
 
51
51
  end
52
52
 
@@ -4,21 +4,21 @@ module Registry
4
4
 
5
5
  class RegfBlock
6
6
 
7
- attr_accessor :timestamp, :root_key_offset
7
+ attr_accessor :timestamp, :root_key_offset
8
8
 
9
- def initialize(hive)
9
+ def initialize(hive)
10
10
 
11
- regf_header = hive[0x00, 4]
11
+ regf_header = hive[0x00, 4]
12
12
 
13
- if regf_header !~ /regf/
14
- puts "Not a registry hive"
15
- return
16
- end
13
+ if regf_header !~ /regf/
14
+ puts "Not a registry hive"
15
+ return
16
+ end
17
17
 
18
- @timestamp = hive[0x0C, 8].unpack('q').first
19
- @root_key_offset = 0x20
18
+ @timestamp = hive[0x0C, 8].unpack('q').first
19
+ @root_key_offset = 0x20
20
20
 
21
- end
21
+ end
22
22
  end
23
23
 
24
24
  end
@@ -4,63 +4,63 @@ module Registry
4
4
 
5
5
  class ValueKey
6
6
 
7
- attr_accessor :name_length, :length_of_data, :data_offset, :full_path
8
- attr_accessor :value_type, :readable_value_type, :name, :value
7
+ attr_accessor :name_length, :length_of_data, :data_offset, :full_path
8
+ attr_accessor :value_type, :readable_value_type, :name, :value
9
9
 
10
- def initialize(hive, offset)
11
- offset = offset + 4
10
+ def initialize(hive, offset)
11
+ offset = offset + 4
12
12
 
13
- vk_header = hive[offset, 2]
13
+ vk_header = hive[offset, 2]
14
14
 
15
- if vk_header !~ /vk/
16
- puts "no vk at offset #{offset}"
17
- return
18
- end
15
+ if vk_header !~ /vk/
16
+ puts "no vk at offset #{offset}"
17
+ return
18
+ end
19
19
 
20
- @name_length = hive[offset+0x02, 2].unpack('c').first
21
- @length_of_data = hive[offset+0x04, 4].unpack('l').first
22
- @data_offset = hive[offset+ 0x08, 4].unpack('l').first
23
- @value_type = hive[offset+0x0C, 4].unpack('c').first
20
+ @name_length = hive[offset+0x02, 2].unpack('c').first
21
+ @length_of_data = hive[offset+0x04, 4].unpack('l').first
22
+ @data_offset = hive[offset+ 0x08, 4].unpack('l').first
23
+ @value_type = hive[offset+0x0C, 4].unpack('c').first
24
24
 
25
- if @value_type == 1
26
- @readable_value_type = "Unicode character string"
27
- elsif @value_type == 2
28
- @readable_value_type = "Unicode string with %VAR% expanding"
29
- elsif @value_type == 3
30
- @readable_value_type = "Raw binary value"
31
- elsif @value_type == 4
32
- @readable_value_type = "Dword"
33
- elsif @value_type == 7
34
- @readable_value_type = "Multiple unicode strings separated with '\\x00'"
35
- end
25
+ if @value_type == 1
26
+ @readable_value_type = "Unicode character string"
27
+ elsif @value_type == 2
28
+ @readable_value_type = "Unicode string with %VAR% expanding"
29
+ elsif @value_type == 3
30
+ @readable_value_type = "Raw binary value"
31
+ elsif @value_type == 4
32
+ @readable_value_type = "Dword"
33
+ elsif @value_type == 7
34
+ @readable_value_type = "Multiple unicode strings separated with '\\x00'"
35
+ end
36
36
 
37
- flag = hive[offset+0x10, 2].unpack('c').first
37
+ flag = hive[offset+0x10, 2].unpack('c').first
38
38
 
39
- if flag == 0
40
- @name = "Default"
41
- else
42
- @name = hive[offset+0x14, @name_length].to_s
43
- end
39
+ if flag == 0
40
+ @name = "Default"
41
+ else
42
+ @name = hive[offset+0x14, @name_length].to_s
43
+ end
44
44
 
45
- @value = ValueKeyData.new(hive, @data_offset, @length_of_data, @value_type, offset)
46
- end
45
+ @value = ValueKeyData.new(hive, @data_offset, @length_of_data, @value_type, offset)
46
+ end
47
47
  end
48
48
 
49
49
  class ValueKeyData
50
50
 
51
- attr_accessor :data
51
+ attr_accessor :data
52
52
 
53
- def initialize(hive, offset, length, datatype, parent_offset)
54
- offset = offset + 4
53
+ def initialize(hive, offset, length, datatype, parent_offset)
54
+ offset = offset + 4
55
55
 
56
- #If the data-size is lower than 5, the data-offset value is used to store
57
- #the data itself!
58
- if length < 5
59
- @data = hive[parent_offset + 0x08, 4]
60
- else
61
- @data = hive[offset + 0x1000, length]
62
- end
63
- end
56
+ #If the data-size is lower than 5, the data-offset value is used to store
57
+ #the data itself!
58
+ if length < 5
59
+ @data = hive[parent_offset + 0x08, 4]
60
+ else
61
+ @data = hive[offset + 0x1000, length]
62
+ end
63
+ end
64
64
  end
65
65
 
66
66
  end
@@ -6,23 +6,23 @@ module Registry
6
6
 
7
7
  class ValueList
8
8
 
9
- attr_accessor :values
9
+ attr_accessor :values
10
10
 
11
- def initialize(hive, offset, number_of_values)
12
- offset = offset + 4
13
- inner_offset = 0
11
+ def initialize(hive, offset, number_of_values)
12
+ offset = offset + 4
13
+ inner_offset = 0
14
14
 
15
- @values = []
15
+ @values = []
16
16
 
17
- 1.upto(number_of_values) do |v|
18
- valuekey_offset = hive[offset + inner_offset, 4]
19
- next if !valuekey_offset
17
+ 1.upto(number_of_values) do |v|
18
+ valuekey_offset = hive[offset + inner_offset, 4]
19
+ next if !valuekey_offset
20
20
 
21
- valuekey_offset = valuekey_offset.unpack('l').first
22
- @values << ValueKey.new(hive, valuekey_offset + 0x1000)
23
- inner_offset = inner_offset + 4
24
- end
25
- end
21
+ valuekey_offset = valuekey_offset.unpack('l').first
22
+ @values << ValueKey.new(hive, valuekey_offset + 0x1000)
23
+ inner_offset = inner_offset + 4
24
+ end
25
+ end
26
26
  end
27
27
 
28
28
  end
@@ -9,262 +9,263 @@ module Rex
9
9
  module RopBuilder
10
10
 
11
11
  class RopBase
12
- def initialize()
13
- @stdio = Rex::Ui::Text::Output::Stdio.new
14
- @gadgets = []
15
- end
16
-
17
- def to_csv(gadgets = [])
18
- if gadgets.empty? and @gadgets.nil? or @gadgets.empty?
19
- @stdio.print_error("No gadgets collected to convert to CSV format.")
20
- return
21
- end
22
-
23
- # allow the users to import gadget collections from multiple files
24
- if @gadgets.empty? or @gadgets.nil?
25
- @gadgets = gadgets
26
- end
27
-
28
- table = Rex::Ui::Text::Table.new(
29
- 'Header' => "#{@file} ROP Gadgets",
30
- 'Indent' => 1,
31
- 'Columns' =>
32
- [
33
- "Address",
34
- "Raw",
35
- "Disassembly",
36
- ])
37
-
38
- @gadgets.each do |gadget|
39
- table << [gadget[:address], gadget[:raw].unpack('H*')[0], gadget[:disasm].gsub(/\n/, ' | ')]
40
- end
41
-
42
- return table.to_csv
43
- end
44
-
45
- def import(file)
46
- begin
47
- data = File.new(file, 'r').read
48
- rescue
49
- @stdio.print_error("Error reading #{file}")
50
- return []
51
- end
52
-
53
- if data.empty? or data.nil?
54
- return []
55
- end
56
-
57
- data.gsub!(/\"/, '')
58
- data.gsub!("Address,Raw,Disassembly\n", '')
59
-
60
- @gadgets = []
61
-
62
- data.each_line do |line|
63
- addr, raw, disasm = line.split(',', 3)
64
- if addr.nil? or raw.nil? or disasm.nil?
65
- @stdio.print_error("Import file format corrupted")
66
- return []
67
- end
68
- disasm.gsub!(/: /, ":\t")
69
- disasm.gsub!(' | ', "\n")
70
- raw = [raw].pack('H*')
71
- @gadgets << {:file => file, :address => addr, :raw => raw, :disasm => disasm.chomp!}
72
- end
73
- @gadgets
74
- end
75
-
76
- def print_msg(msg, color=true)
77
- if not @stdio
78
- @stdio = Rex::Ui::Text::Output::Stdio.new
79
- end
80
-
81
- if color == true
82
- @stdio.auto_color
83
- else
84
- @stdio.disable_color
85
- end
86
- @stdio.print_raw(@stdio.substitute_colors(msg))
87
- end
12
+ def initialize()
13
+ @stdio = Rex::Ui::Text::Output::Stdio.new
14
+ @gadgets = []
15
+ end
16
+
17
+ def to_csv(gadgets = [])
18
+ if gadgets.empty? and @gadgets.nil? or @gadgets.empty?
19
+ @stdio.print_error("No gadgets collected to convert to CSV format.")
20
+ return
21
+ end
22
+
23
+ # allow the users to import gadget collections from multiple files
24
+ if @gadgets.empty? or @gadgets.nil?
25
+ @gadgets = gadgets
26
+ end
27
+
28
+ table = Rex::Ui::Text::Table.new(
29
+ 'Header' => "#{@file} ROP Gadgets",
30
+ 'Indent' => 1,
31
+ 'Columns' =>
32
+ [
33
+ "Address",
34
+ "Raw",
35
+ "Disassembly",
36
+ ])
37
+
38
+ @gadgets.each do |gadget|
39
+ table << [gadget[:address], gadget[:raw].unpack('H*')[0], gadget[:disasm].gsub(/\n/, ' | ')]
40
+ end
41
+
42
+ return table.to_csv
43
+ end
44
+
45
+ def import(file)
46
+ begin
47
+ data = File.new(file, 'r').read
48
+ rescue
49
+ @stdio.print_error("Error reading #{file}")
50
+ return []
51
+ end
52
+
53
+ if data.empty? or data.nil?
54
+ return []
55
+ end
56
+
57
+ data.gsub!(/\"/, '')
58
+ data.gsub!("Address,Raw,Disassembly\n", '')
59
+
60
+ @gadgets = []
61
+
62
+ data.each_line do |line|
63
+ addr, raw, disasm = line.split(',', 3)
64
+ if addr.nil? or raw.nil? or disasm.nil?
65
+ @stdio.print_error("Import file format corrupted")
66
+ return []
67
+ end
68
+ disasm.gsub!(/: /, ":\t")
69
+ disasm.gsub!(' | ', "\n")
70
+ raw = [raw].pack('H*')
71
+ @gadgets << {:file => file, :address => addr, :raw => raw, :disasm => disasm.chomp!}
72
+ end
73
+ @gadgets
74
+ end
75
+
76
+ def print_msg(msg, color=true)
77
+ if not @stdio
78
+ @stdio = Rex::Ui::Text::Output::Stdio.new
79
+ end
80
+
81
+ if color == true
82
+ @stdio.auto_color
83
+ else
84
+ @stdio.disable_color
85
+ end
86
+ @stdio.print_raw(@stdio.substitute_colors(msg))
87
+ end
88
88
  end
89
89
 
90
90
  class RopCollect < RopBase
91
- def initialize(file="")
92
- @stdio = Rex::Ui::Text::Output::Stdio.new
93
- @file = file if not file.empty?
94
- @bin = Metasm::AutoExe.decode_file(file) if not file.empty?
95
- @disassembler = @bin.disassembler if not @bin.nil?
96
- if @disassembler
97
- @disassembler.cpu = Metasm::Ia32.new('386_common')
98
- end
99
- super()
100
- end
101
-
102
- def collect(depth, pattern)
103
- matches = []
104
- gadgets = []
105
-
106
- # find matches by scanning for the pattern
107
- matches = @disassembler.pattern_scan(pattern)
108
- if @bin.kind_of?(Metasm::PE)
109
- @bin.sections.each do |section|
110
- next if section.characteristics.include? 'MEM_EXECUTE'
111
- # delete matches if the address is outside the virtual address space
112
- matches.delete_if do |ea|
113
- va = section.virtaddr + @bin.optheader.image_base
114
- ea >= va and ea < va + section.virtsize
115
- end
116
- end
117
- elsif @bin.kind_of?(Metasm::ELF)
118
- @bin.segments.each do |seg|
119
- next if seg.flags.include? 'X'
120
- matches.delete_if do |ea|
121
- ea >= seg.vaddr and ea < seg.vaddr + seg.memsz
122
- end
123
- end
124
- elsif @bin.kind_of?(Metasm::MachO)
125
- @bin.segments.each do |seg|
126
- next if seg.initprot.include? 'EXECUTE'
127
- matches.delete_if do |ea|
128
- ea >= seg.virtaddr and ea < seg.virtaddr + seg.filesize
129
- end
130
- end
131
- end
132
-
133
- gadgets = process_gadgets(matches, depth)
134
- gadgets.each do |gadget|
135
- @gadgets << gadget
136
- end
137
- gadgets
138
- end
139
-
140
- def pattern_search(pattern)
141
- p = Regexp.new("(" + pattern + ")")
142
- matches = []
143
-
144
- @gadgets.each do |gadget|
145
- disasm = ""
146
- addrs = []
147
-
148
- gadget[:disasm].each_line do |line|
149
- addr, asm = line.split("\t", 2)
150
- addrs << addr
151
- disasm << asm
152
- end
153
-
154
- if gadget[:raw] =~ p or gadget[:disasm] =~ p or disasm =~ p
155
- matches << {:gadget => gadget, :disasm => disasm, :addrs => addrs}
156
- end
157
- end
158
- matches.each do |match|
159
- @stdio.print_status("gadget with address: %bld%cya#{match[:gadget][:address]}%clr matched")
160
- color_pattern(match[:gadget], match[:disasm], match[:addrs], p)
161
- end
162
- matches
163
- end
164
-
165
- def color_pattern(gadget, disasm, addrs, p)
166
- idx = disasm.index(p)
167
- if idx.nil?
168
- print_msg(gadget[:disasm])
169
- return
170
- end
171
-
172
- disasm = disasm.insert(idx, "%bld%grn")
173
-
174
- asm = ""
175
- cnt = 0
176
- colors = false
177
- disasm.each_line do |line|
178
- # if we find this then we are in the matching area
179
- if line.index(/\%bld\%grn/)
180
- colors = true
181
- end
182
- asm << "%clr" + addrs[cnt] + "\t"
183
-
184
- # color the remaining parts of the gadget
185
- if colors and line.index("%bld%grn").nil?
186
- asm << "%bld%grn" + line
187
- else
188
- asm << line
189
- end
190
-
191
- cnt += 1
192
- end
193
- asm << "%clr\n"
194
- print_msg(asm)
195
- end
196
-
197
- def process_gadgets(rets, num)
198
- ret = {}
199
- gadgets = []
200
- tmp = []
201
- rets.each do |ea|
202
- insn = @disassembler.disassemble_instruction(ea)
203
- next if not insn
204
-
205
- xtra = insn.bin_length
206
-
207
- 1.upto(num) do |x|
208
- addr = ea - x
209
-
210
- # get the disassembled instruction at this address
211
- di = @disassembler.disassemble_instruction(addr)
212
-
213
- # skip invalid instructions
214
- next if not di
215
- next if di.opcode.props[:setip]
216
- next if di.opcode.props[:stopexec]
217
-
218
- # get raw bytes
219
- buf = @disassembler.read_raw_data(addr, x + xtra)
220
-
221
-
222
- # make sure disassembling forward leads to our instruction
223
- next if not ends_with_addr(buf, addr, ea)
224
-
225
- dasm = ""
226
- while addr <= ea
227
- di = @disassembler.disassemble_instruction(addr)
228
- dasm << ("0x%08x:\t" % addr) + di.instruction.to_s + "\n"
229
- addr = addr + di.bin_length
230
- end
231
-
232
- if not tmp.include?(ea)
233
- tmp << ea
234
- else
235
- next
236
- end
237
- # otherwise, we create a new tailchunk and add it to the list
238
- ret = {:file => @file, :address => ("0x%08x" % (ea - x)), :raw => buf, :disasm => dasm}
239
- gadgets << ret
240
- end
241
- end
242
- gadgets
243
- end
244
-
245
- private
246
- def ends_with_addr(raw, base, addr)
247
- dasm2 = Metasm::Shellcode.decode(raw, @disassembler.cpu).disassembler
248
- offset = 0
249
- while ((di = dasm2.disassemble_instruction(offset)))
250
- return true if (base + offset) == addr
251
- return false if di.opcode.props[:setip]
252
- return false if di.opcode.props[:stopexec]
253
- offset = di.next_addr
254
- end
255
- false
256
- end
257
-
258
- def raw_instructions(raw)
259
- insns = []
260
- d2 = Metasm::Shellcode.decode(raw, @disassembler.cpu).disassembler
261
- addr = 0
262
- while ((di = d2.disassemble_instruction(addr)))
263
- insns << di.instruction
264
- addr = di.next_addr
265
- end
266
- insns
267
- end
91
+ def initialize(file="")
92
+ @stdio = Rex::Ui::Text::Output::Stdio.new
93
+ @file = file if not file.empty?
94
+ @bin = Metasm::AutoExe.decode_file(file) if not file.empty?
95
+ @disassembler = @bin.disassembler if not @bin.nil?
96
+ if @disassembler
97
+ @disassembler.cpu = Metasm::Ia32.new('386_common')
98
+ end
99
+ super()
100
+ end
101
+
102
+ def collect(depth, pattern)
103
+ matches = []
104
+ gadgets = []
105
+
106
+ # find matches by scanning for the pattern
107
+ matches = @disassembler.pattern_scan(pattern)
108
+ if @bin.kind_of?(Metasm::PE)
109
+ @bin.sections.each do |section|
110
+ next if section.characteristics.include? 'MEM_EXECUTE'
111
+ # delete matches if the address is outside the virtual address space
112
+ matches.delete_if do |ea|
113
+ va = section.virtaddr + @bin.optheader.image_base
114
+ ea >= va and ea < va + section.virtsize
115
+ end
116
+ end
117
+ elsif @bin.kind_of?(Metasm::ELF)
118
+ @bin.segments.each do |seg|
119
+ next if seg.flags.include? 'X'
120
+ matches.delete_if do |ea|
121
+ ea >= seg.vaddr and ea < seg.vaddr + seg.memsz
122
+ end
123
+ end
124
+ elsif @bin.kind_of?(Metasm::MachO)
125
+ @bin.segments.each do |seg|
126
+ next if seg.initprot.include? 'EXECUTE'
127
+ matches.delete_if do |ea|
128
+ ea >= seg.virtaddr and ea < seg.virtaddr + seg.filesize
129
+ end
130
+ end
131
+ end
132
+
133
+ gadgets = process_gadgets(matches, depth)
134
+ gadgets.each do |gadget|
135
+ @gadgets << gadget
136
+ end
137
+ gadgets
138
+ end
139
+
140
+ def pattern_search(pattern)
141
+ p = Regexp.new("(" + pattern + ")")
142
+ matches = []
143
+
144
+ @gadgets.each do |gadget|
145
+ disasm = ""
146
+ addrs = []
147
+
148
+ gadget[:disasm].each_line do |line|
149
+ addr, asm = line.split("\t", 2)
150
+ addrs << addr
151
+ disasm << asm
152
+ end
153
+
154
+ if gadget[:raw] =~ p or gadget[:disasm] =~ p or disasm =~ p
155
+ matches << {:gadget => gadget, :disasm => disasm, :addrs => addrs}
156
+ end
157
+ end
158
+ matches.each do |match|
159
+ @stdio.print_status("gadget with address: %bld%cya#{match[:gadget][:address]}%clr matched")
160
+ color_pattern(match[:gadget], match[:disasm], match[:addrs], p)
161
+ end
162
+ matches
163
+ end
164
+
165
+ def color_pattern(gadget, disasm, addrs, p)
166
+ idx = disasm.index(p)
167
+ if idx.nil?
168
+ print_msg(gadget[:disasm])
169
+ return
170
+ end
171
+
172
+ disasm = disasm.insert(idx, "%bld%grn")
173
+
174
+ asm = ""
175
+ cnt = 0
176
+ colors = false
177
+ disasm.each_line do |line|
178
+ # if we find this then we are in the matching area
179
+ if line.index(/\%bld\%grn/)
180
+ colors = true
181
+ end
182
+ asm << "%clr" + addrs[cnt] + "\t"
183
+
184
+ # color the remaining parts of the gadget
185
+ if colors and line.index("%bld%grn").nil?
186
+ asm << "%bld%grn" + line
187
+ else
188
+ asm << line
189
+ end
190
+
191
+ cnt += 1
192
+ end
193
+ asm << "%clr\n"
194
+ print_msg(asm)
195
+ end
196
+
197
+ def process_gadgets(rets, num)
198
+ ret = {}
199
+ gadgets = []
200
+ tmp = []
201
+ rets.each do |ea|
202
+ insn = @disassembler.disassemble_instruction(ea)
203
+ next if not insn
204
+
205
+ xtra = insn.bin_length
206
+
207
+ num.downto(0) do |x|
208
+ addr = ea - x
209
+
210
+ # get the disassembled instruction at this address
211
+ di = @disassembler.disassemble_instruction(addr)
212
+
213
+ # skip invalid instructions
214
+ next if not di
215
+ next if di.opcode.props[:setip]
216
+ next if di.opcode.props[:stopexec]
217
+
218
+ # get raw bytes
219
+ buf = @disassembler.read_raw_data(addr, x + xtra)
220
+
221
+
222
+ # make sure disassembling forward leads to our instruction
223
+ next if not ends_with_addr(buf, addr, ea)
224
+
225
+ dasm = ""
226
+ while addr <= ea
227
+ di = @disassembler.disassemble_instruction(addr)
228
+ dasm << ("0x%08x:\t" % addr) + di.instruction.to_s + "\n"
229
+ addr = addr + di.bin_length
230
+ end
231
+
232
+ if not tmp.include?(ea)
233
+ tmp << ea
234
+ else
235
+ next
236
+ end
237
+
238
+ # otherwise, we create a new tailchunk and add it to the list
239
+ ret = {:file => @file, :address => ("0x%08x" % (ea - x)), :raw => buf, :disasm => dasm}
240
+ gadgets << ret
241
+ end
242
+ end
243
+ gadgets
244
+ end
245
+
246
+ private
247
+ def ends_with_addr(raw, base, addr)
248
+ dasm2 = Metasm::Shellcode.decode(raw, @disassembler.cpu).disassembler
249
+ offset = 0
250
+ while ((di = dasm2.disassemble_instruction(offset)))
251
+ return true if (base + offset) == addr
252
+ return false if di.opcode.props[:setip]
253
+ return false if di.opcode.props[:stopexec]
254
+ offset = di.next_addr
255
+ end
256
+ false
257
+ end
258
+
259
+ def raw_instructions(raw)
260
+ insns = []
261
+ d2 = Metasm::Shellcode.decode(raw, @disassembler.cpu).disassembler
262
+ addr = 0
263
+ while ((di = d2.disassemble_instruction(addr)))
264
+ insns << di.instruction
265
+ addr = di.next_addr
266
+ end
267
+ insns
268
+ end
268
269
  end
269
270
  end
270
271
  end