librex 0.0.1

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 (370) hide show
  1. data/README +4 -0
  2. data/lib/rex.rb +101 -0
  3. data/lib/rex.rb.ts.rb +70 -0
  4. data/lib/rex/LICENSE +29 -0
  5. data/lib/rex/arch.rb +103 -0
  6. data/lib/rex/arch/sparc.rb +75 -0
  7. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  8. data/lib/rex/arch/x86.rb +513 -0
  9. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  10. data/lib/rex/assembly/nasm.rb +100 -0
  11. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  12. data/lib/rex/codepage.map +104 -0
  13. data/lib/rex/compat.rb +281 -0
  14. data/lib/rex/constants.rb +113 -0
  15. data/lib/rex/elfparsey.rb +11 -0
  16. data/lib/rex/elfparsey/elf.rb +123 -0
  17. data/lib/rex/elfparsey/elfbase.rb +260 -0
  18. data/lib/rex/elfparsey/exceptions.rb +27 -0
  19. data/lib/rex/elfscan.rb +12 -0
  20. data/lib/rex/elfscan/scanner.rb +207 -0
  21. data/lib/rex/elfscan/search.rb +46 -0
  22. data/lib/rex/encoder/alpha2.rb +31 -0
  23. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  24. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  25. data/lib/rex/encoder/alpha2/generic.rb +113 -0
  26. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  27. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  28. data/lib/rex/encoder/ndr.rb +89 -0
  29. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  30. data/lib/rex/encoder/nonalpha.rb +61 -0
  31. data/lib/rex/encoder/nonupper.rb +64 -0
  32. data/lib/rex/encoder/xdr.rb +106 -0
  33. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  34. data/lib/rex/encoder/xor.rb +69 -0
  35. data/lib/rex/encoder/xor/dword.rb +13 -0
  36. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  37. data/lib/rex/encoders/xor_dword.rb +35 -0
  38. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  39. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  40. data/lib/rex/encoding/xor.rb +20 -0
  41. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  42. data/lib/rex/encoding/xor/byte.rb +15 -0
  43. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  44. data/lib/rex/encoding/xor/dword.rb +21 -0
  45. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  47. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  48. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  49. data/lib/rex/encoding/xor/generic.rb +146 -0
  50. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  51. data/lib/rex/encoding/xor/qword.rb +15 -0
  52. data/lib/rex/encoding/xor/word.rb +21 -0
  53. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  54. data/lib/rex/exceptions.rb +275 -0
  55. data/lib/rex/exceptions.rb.ut.rb +44 -0
  56. data/lib/rex/exploitation/cmdstager.rb +133 -0
  57. data/lib/rex/exploitation/egghunter.rb +143 -0
  58. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  59. data/lib/rex/exploitation/encryptjs.rb +77 -0
  60. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  61. data/lib/rex/exploitation/heaplib.rb +94 -0
  62. data/lib/rex/exploitation/javascriptosdetect.rb +735 -0
  63. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  64. data/lib/rex/exploitation/opcodedb.rb +818 -0
  65. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  66. data/lib/rex/exploitation/seh.rb +92 -0
  67. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  68. data/lib/rex/file.rb +84 -0
  69. data/lib/rex/file.rb.ut.rb +16 -0
  70. data/lib/rex/image_source.rb +12 -0
  71. data/lib/rex/image_source/disk.rb +60 -0
  72. data/lib/rex/image_source/image_source.rb +46 -0
  73. data/lib/rex/image_source/memory.rb +37 -0
  74. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  75. data/lib/rex/io/datagram_abstraction.rb +35 -0
  76. data/lib/rex/io/stream.rb +313 -0
  77. data/lib/rex/io/stream_abstraction.rb +186 -0
  78. data/lib/rex/io/stream_server.rb +211 -0
  79. data/lib/rex/job_container.rb +202 -0
  80. data/lib/rex/logging.rb +4 -0
  81. data/lib/rex/logging/log_dispatcher.rb +179 -0
  82. data/lib/rex/logging/log_sink.rb +42 -0
  83. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  84. data/lib/rex/logging/sinks/stderr.rb +43 -0
  85. data/lib/rex/machparsey.rb +9 -0
  86. data/lib/rex/machparsey/exceptions.rb +34 -0
  87. data/lib/rex/machparsey/mach.rb +209 -0
  88. data/lib/rex/machparsey/machbase.rb +408 -0
  89. data/lib/rex/machscan.rb +9 -0
  90. data/lib/rex/machscan/scanner.rb +217 -0
  91. data/lib/rex/mime.rb +9 -0
  92. data/lib/rex/mime/header.rb +75 -0
  93. data/lib/rex/mime/message.rb +112 -0
  94. data/lib/rex/mime/part.rb +20 -0
  95. data/lib/rex/nop/opty2.rb +108 -0
  96. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  97. data/lib/rex/nop/opty2_tables.rb +300 -0
  98. data/lib/rex/ole.rb +128 -0
  99. data/lib/rex/ole/clsid.rb +47 -0
  100. data/lib/rex/ole/difat.rb +141 -0
  101. data/lib/rex/ole/directory.rb +230 -0
  102. data/lib/rex/ole/direntry.rb +240 -0
  103. data/lib/rex/ole/fat.rb +99 -0
  104. data/lib/rex/ole/header.rb +204 -0
  105. data/lib/rex/ole/minifat.rb +77 -0
  106. data/lib/rex/ole/samples/create_ole.rb +27 -0
  107. data/lib/rex/ole/samples/dir.rb +35 -0
  108. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  109. data/lib/rex/ole/samples/ole_info.rb +23 -0
  110. data/lib/rex/ole/storage.rb +395 -0
  111. data/lib/rex/ole/stream.rb +53 -0
  112. data/lib/rex/ole/substorage.rb +49 -0
  113. data/lib/rex/ole/util.rb +157 -0
  114. data/lib/rex/parser/arguments.rb +97 -0
  115. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  116. data/lib/rex/parser/ini.rb +185 -0
  117. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  118. data/lib/rex/parser/nmap_xml.rb +111 -0
  119. data/lib/rex/payloads.rb +1 -0
  120. data/lib/rex/payloads/win32.rb +2 -0
  121. data/lib/rex/payloads/win32/common.rb +26 -0
  122. data/lib/rex/payloads/win32/kernel.rb +53 -0
  123. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  124. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  125. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  126. data/lib/rex/payloads/win32/kernel/stager.rb +171 -0
  127. data/lib/rex/peparsey.rb +12 -0
  128. data/lib/rex/peparsey/exceptions.rb +32 -0
  129. data/lib/rex/peparsey/pe.rb +188 -0
  130. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  131. data/lib/rex/peparsey/pebase.rb +1655 -0
  132. data/lib/rex/peparsey/section.rb +136 -0
  133. data/lib/rex/pescan.rb +13 -0
  134. data/lib/rex/pescan/analyze.rb +309 -0
  135. data/lib/rex/pescan/scanner.rb +206 -0
  136. data/lib/rex/pescan/search.rb +56 -0
  137. data/lib/rex/platforms.rb +1 -0
  138. data/lib/rex/platforms/windows.rb +51 -0
  139. data/lib/rex/poly.rb +132 -0
  140. data/lib/rex/poly/block.rb +468 -0
  141. data/lib/rex/poly/register.rb +100 -0
  142. data/lib/rex/poly/register/x86.rb +40 -0
  143. data/lib/rex/post.rb +8 -0
  144. data/lib/rex/post/dir.rb +51 -0
  145. data/lib/rex/post/file.rb +172 -0
  146. data/lib/rex/post/file_stat.rb +220 -0
  147. data/lib/rex/post/gen.pl +13 -0
  148. data/lib/rex/post/io.rb +182 -0
  149. data/lib/rex/post/meterpreter.rb +4 -0
  150. data/lib/rex/post/meterpreter/channel.rb +438 -0
  151. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  152. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  153. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  154. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  155. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  156. data/lib/rex/post/meterpreter/client.rb +335 -0
  157. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  158. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  159. data/lib/rex/post/meterpreter/extension.rb +32 -0
  160. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  161. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  162. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  163. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  164. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  165. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  166. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +104 -0
  167. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  168. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +100 -0
  169. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +24 -0
  170. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  171. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +273 -0
  172. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +235 -0
  173. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  174. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  175. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  176. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  177. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  178. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  179. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +167 -0
  180. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  181. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +192 -0
  182. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +139 -0
  183. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  184. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +184 -0
  185. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  186. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +182 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +174 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +185 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  198. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  199. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  200. data/lib/rex/post/meterpreter/packet.rb +596 -0
  201. data/lib/rex/post/meterpreter/packet_dispatcher.rb +409 -0
  202. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  203. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  204. data/lib/rex/post/meterpreter/ui/console.rb +135 -0
  205. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  206. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +595 -0
  207. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  208. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  209. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  210. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  211. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  212. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  213. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  214. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +63 -0
  215. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +376 -0
  216. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +270 -0
  217. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +484 -0
  218. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  219. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  220. data/lib/rex/post/permission.rb +26 -0
  221. data/lib/rex/post/process.rb +57 -0
  222. data/lib/rex/post/thread.rb +57 -0
  223. data/lib/rex/post/ui.rb +52 -0
  224. data/lib/rex/proto.rb +12 -0
  225. data/lib/rex/proto.rb.ts.rb +8 -0
  226. data/lib/rex/proto/dcerpc.rb +6 -0
  227. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  228. data/lib/rex/proto/dcerpc/client.rb +358 -0
  229. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  230. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  231. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  232. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  233. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  234. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  235. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  236. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  237. data/lib/rex/proto/dcerpc/response.rb +186 -0
  238. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  239. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  240. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  241. data/lib/rex/proto/drda.rb +5 -0
  242. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  243. data/lib/rex/proto/drda/constants.rb +49 -0
  244. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  245. data/lib/rex/proto/drda/packet.rb +252 -0
  246. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  247. data/lib/rex/proto/drda/utils.rb +123 -0
  248. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  249. data/lib/rex/proto/http.rb +5 -0
  250. data/lib/rex/proto/http.rb.ts.rb +12 -0
  251. data/lib/rex/proto/http/client.rb +817 -0
  252. data/lib/rex/proto/http/client.rb.ut.rb +93 -0
  253. data/lib/rex/proto/http/handler.rb +46 -0
  254. data/lib/rex/proto/http/handler/erb.rb +128 -0
  255. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  256. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  257. data/lib/rex/proto/http/handler/proc.rb +54 -0
  258. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  259. data/lib/rex/proto/http/header.rb +161 -0
  260. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  261. data/lib/rex/proto/http/packet.rb +394 -0
  262. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  263. data/lib/rex/proto/http/request.rb +356 -0
  264. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  265. data/lib/rex/proto/http/response.rb +85 -0
  266. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  267. data/lib/rex/proto/http/server.rb +367 -0
  268. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  269. data/lib/rex/proto/smb.rb +7 -0
  270. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  271. data/lib/rex/proto/smb/client.rb +1733 -0
  272. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  273. data/lib/rex/proto/smb/constants.rb +1062 -0
  274. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  275. data/lib/rex/proto/smb/crypt.rb +95 -0
  276. data/lib/rex/proto/smb/crypt.rb.ut.rb +20 -0
  277. data/lib/rex/proto/smb/evasions.rb +65 -0
  278. data/lib/rex/proto/smb/exceptions.rb +846 -0
  279. data/lib/rex/proto/smb/simpleclient.rb +292 -0
  280. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  281. data/lib/rex/proto/smb/utils.rb +514 -0
  282. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  283. data/lib/rex/proto/sunrpc.rb +1 -0
  284. data/lib/rex/proto/sunrpc/client.rb +195 -0
  285. data/lib/rex/script.rb +42 -0
  286. data/lib/rex/script/base.rb +59 -0
  287. data/lib/rex/script/meterpreter.rb +9 -0
  288. data/lib/rex/script/shell.rb +9 -0
  289. data/lib/rex/service.rb +48 -0
  290. data/lib/rex/service_manager.rb +141 -0
  291. data/lib/rex/service_manager.rb.ut.rb +32 -0
  292. data/lib/rex/services/local_relay.rb +423 -0
  293. data/lib/rex/socket.rb +586 -0
  294. data/lib/rex/socket.rb.ut.rb +86 -0
  295. data/lib/rex/socket/comm.rb +119 -0
  296. data/lib/rex/socket/comm/local.rb +409 -0
  297. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  298. data/lib/rex/socket/ip.rb +129 -0
  299. data/lib/rex/socket/parameters.rb +345 -0
  300. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  301. data/lib/rex/socket/range_walker.rb +295 -0
  302. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  303. data/lib/rex/socket/ssl_tcp.rb +184 -0
  304. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  305. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  306. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +51 -0
  307. data/lib/rex/socket/subnet_walker.rb +75 -0
  308. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  309. data/lib/rex/socket/switch_board.rb +272 -0
  310. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  311. data/lib/rex/socket/tcp.rb +76 -0
  312. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  313. data/lib/rex/socket/tcp_server.rb +67 -0
  314. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  315. data/lib/rex/socket/udp.rb +157 -0
  316. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  317. data/lib/rex/struct2.rb +5 -0
  318. data/lib/rex/struct2/c_struct.rb +181 -0
  319. data/lib/rex/struct2/c_struct_template.rb +39 -0
  320. data/lib/rex/struct2/constant.rb +26 -0
  321. data/lib/rex/struct2/element.rb +44 -0
  322. data/lib/rex/struct2/generic.rb +73 -0
  323. data/lib/rex/struct2/restraint.rb +54 -0
  324. data/lib/rex/struct2/s_string.rb +72 -0
  325. data/lib/rex/struct2/s_struct.rb +111 -0
  326. data/lib/rex/sync.rb +6 -0
  327. data/lib/rex/sync/event.rb +94 -0
  328. data/lib/rex/sync/read_write_lock.rb +176 -0
  329. data/lib/rex/sync/ref.rb +57 -0
  330. data/lib/rex/sync/thread_safe.rb +82 -0
  331. data/lib/rex/test.rb +35 -0
  332. data/lib/rex/text.rb +1029 -0
  333. data/lib/rex/text.rb.ut.rb +168 -0
  334. data/lib/rex/time.rb +65 -0
  335. data/lib/rex/transformer.rb +115 -0
  336. data/lib/rex/transformer.rb.ut.rb +38 -0
  337. data/lib/rex/ui.rb +21 -0
  338. data/lib/rex/ui/interactive.rb +252 -0
  339. data/lib/rex/ui/output.rb +80 -0
  340. data/lib/rex/ui/output/none.rb +18 -0
  341. data/lib/rex/ui/progress_tracker.rb +96 -0
  342. data/lib/rex/ui/subscriber.rb +149 -0
  343. data/lib/rex/ui/text/color.rb +97 -0
  344. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  345. data/lib/rex/ui/text/dispatcher_shell.rb +382 -0
  346. data/lib/rex/ui/text/input.rb +117 -0
  347. data/lib/rex/ui/text/input/buffer.rb +75 -0
  348. data/lib/rex/ui/text/input/readline.rb +129 -0
  349. data/lib/rex/ui/text/input/socket.rb +95 -0
  350. data/lib/rex/ui/text/input/stdio.rb +45 -0
  351. data/lib/rex/ui/text/irb_shell.rb +55 -0
  352. data/lib/rex/ui/text/output.rb +80 -0
  353. data/lib/rex/ui/text/output/buffer.rb +65 -0
  354. data/lib/rex/ui/text/output/file.rb +37 -0
  355. data/lib/rex/ui/text/output/socket.rb +43 -0
  356. data/lib/rex/ui/text/output/stdio.rb +40 -0
  357. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  358. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  359. data/lib/rex/ui/text/shell.rb +321 -0
  360. data/lib/rex/ui/text/table.rb +254 -0
  361. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  362. data/lib/rex/zip.rb +93 -0
  363. data/lib/rex/zip/archive.rb +91 -0
  364. data/lib/rex/zip/blocks.rb +182 -0
  365. data/lib/rex/zip/entry.rb +95 -0
  366. data/lib/rex/zip/samples/comment.rb +32 -0
  367. data/lib/rex/zip/samples/mkwar.rb +138 -0
  368. data/lib/rex/zip/samples/mkzip.rb +19 -0
  369. data/lib/rex/zip/samples/recursive.rb +58 -0
  370. metadata +435 -0
@@ -0,0 +1,206 @@
1
+ module Rex
2
+ module PeScan
3
+ module Scanner
4
+
5
+ class Generic
6
+
7
+ attr_accessor :pe, :regex
8
+
9
+ def initialize(pe)
10
+ self.pe = pe
11
+ end
12
+
13
+ def config(param)
14
+ end
15
+
16
+ def scan(param)
17
+ config(param)
18
+
19
+ $stdout.puts "[#{param['file']}]"
20
+ pe.all_sections.each do |section|
21
+ hits = scan_section(section, param)
22
+ hits.each do |hit|
23
+ vma = pe.rva_to_vma(hit[0])
24
+
25
+ next if (param['filteraddr'] and [vma].pack("V").reverse !~ /#{param['filteraddr']}/)
26
+
27
+ msg = hit[1].is_a?(Array) ? hit[1].join(" ") : hit[1]
28
+ $stdout.puts pe.ptr_s(vma) + " " + msg
29
+ if(param['disasm'])
30
+ ::Rex::Assembly::Nasm.disassemble([msg].pack("H*")).split("\n").each do |line|
31
+ $stdout.puts "\t#{line.strip}"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ def scan_section(section, param={})
39
+ []
40
+ end
41
+ end
42
+
43
+ class JmpRegScanner < Generic
44
+
45
+ def config(param)
46
+ regnums = param['args']
47
+
48
+ # build a list of the call bytes
49
+ calls = _build_byte_list(0xd0, regnums - [4]) # note call esp's don't work..
50
+ jmps = _build_byte_list(0xe0, regnums)
51
+ pushs1 = _build_byte_list(0x50, regnums)
52
+ pushs2 = _build_byte_list(0xf0, regnums)
53
+
54
+ regexstr = '('
55
+ if !calls.empty?
56
+ regexstr += "\xff[#{calls}]|"
57
+ end
58
+
59
+ regexstr += "\xff[#{jmps}]|([#{pushs1}]|\xff[#{pushs2}])(\xc3|\xc2..))"
60
+
61
+ self.regex = Regexp.new(regexstr, nil, 'n')
62
+ end
63
+
64
+ # build a list for regex of the possible bytes, based on a base
65
+ # byte and a list of register numbers..
66
+ def _build_byte_list(base, regnums)
67
+ regnums.collect { |regnum| Regexp.escape((base | regnum).chr) }.join('')
68
+ end
69
+
70
+ def _ret_size(section, index)
71
+ d = section.read(index, 1)
72
+ case d
73
+ when "\xc3"
74
+ return 1
75
+ when "\xc2"
76
+ return 3
77
+ end
78
+
79
+ raise RuntimeError, "invalid return opcode"
80
+ end
81
+
82
+ def _parse_ret(data)
83
+ if data.length == 1
84
+ return "ret"
85
+ else
86
+ return "retn 0x%04x" % data[1, 2].unpack('v')[0]
87
+ end
88
+ end
89
+
90
+
91
+ def scan_section(section, param={})
92
+ index = 0
93
+
94
+ hits = [ ]
95
+
96
+ while (index = section.index(regex, index)) != nil
97
+ rva = section.offset_to_rva(index)
98
+ message = ''
99
+
100
+ parse_ret = false
101
+
102
+ byte1 = section.read(index, 1).unpack("C*")[0]
103
+
104
+ if byte1 == 0xff
105
+ byte2 = section.read(index+1, 1).unpack("C*")[0]
106
+ regname = Rex::Arch::X86.reg_name32(byte2 & 0x7)
107
+
108
+ case byte2 & 0xf8
109
+ when 0xd0
110
+ message = "call #{regname}"
111
+ index += 2
112
+ when 0xe0
113
+ message = "jmp #{regname}"
114
+ index += 2
115
+ when 0xf0
116
+ retsize = _ret_size(section, index+2)
117
+ message = "push #{regname}; " + _parse_ret(section.read(index+2, retsize))
118
+ index += 2 + retsize
119
+ else
120
+ raise "wtf"
121
+ end
122
+ else
123
+ regname = Rex::Arch::X86.reg_name32(byte1 & 0x7)
124
+ retsize = _ret_size(section, index+1)
125
+ message = "push #{regname}; " + _parse_ret(section.read(index+1, retsize))
126
+ index += 1 + retsize
127
+ end
128
+
129
+ hits << [ rva, message ]
130
+ end
131
+
132
+ return hits
133
+ end
134
+ end
135
+
136
+ class PopPopRetScanner < JmpRegScanner
137
+
138
+ def config(param)
139
+ pops = _build_byte_list(0x58, (0 .. 7).to_a - [4]) # we don't want pop esp's...
140
+ self.regex = Regexp.new("[#{pops}][#{pops}](\xc3|\xc2..)", nil, 'n')
141
+ end
142
+
143
+ def scan_section(section, param={})
144
+
145
+ index = 0
146
+
147
+ hits = [ ]
148
+
149
+ while index < section.size && (index = section.index(regex, index)) != nil
150
+ rva = section.offset_to_rva(index)
151
+ message = ''
152
+
153
+ pops = section.read(index, 2)
154
+ reg1 = Rex::Arch::X86.reg_name32(pops[0,1].unpack("C*")[0] & 0x7)
155
+ reg2 = Rex::Arch::X86.reg_name32(pops[1,1].unpack("C*")[0] & 0x7)
156
+
157
+ message = "pop #{reg1}; pop #{reg2}; "
158
+
159
+ retsize = _ret_size(section, index+2)
160
+ message += _parse_ret(section.read(index+2, retsize))
161
+
162
+ index += 2 + retsize
163
+
164
+ hits << [ rva, message ]
165
+ end
166
+
167
+ return hits
168
+ end
169
+ end
170
+
171
+ class RegexScanner < Generic
172
+
173
+ def config(param)
174
+ self.regex = Regexp.new(param['args'], nil, 'n')
175
+ end
176
+
177
+ def scan_section(section, param={})
178
+ index = 0
179
+
180
+ hits = [ ]
181
+
182
+ while index < section.size && (index = section.index(regex, index)) != nil
183
+
184
+ idx = index
185
+ buf = ''
186
+ mat = nil
187
+
188
+ while (! (mat = buf.match(regex)))
189
+ buf << section.read(idx, 1)
190
+ idx += 1
191
+ end
192
+
193
+ rva = section.offset_to_rva(index)
194
+
195
+ hits << [ rva, buf.unpack("H*") ]
196
+ index += buf.length
197
+ end
198
+
199
+ return hits
200
+ end
201
+ end
202
+
203
+ end
204
+ end
205
+ end
206
+
@@ -0,0 +1,56 @@
1
+ module Rex
2
+ module PeScan
3
+ module Search
4
+
5
+ require "rex/assembly/nasm"
6
+
7
+ class DumpRVA
8
+ attr_accessor :pe
9
+
10
+ def initialize(pe)
11
+ self.pe = pe
12
+ end
13
+
14
+ def config(param)
15
+ @address = pe.vma_to_rva(param['args'])
16
+ end
17
+
18
+ def scan(param)
19
+ config(param)
20
+
21
+ $stdout.puts "[#{param['file']}]"
22
+
23
+ # Adjust based on -A and -B flags
24
+ pre = param['before'] || 0
25
+ suf = param['after'] || 16
26
+
27
+ @address -= pre
28
+ @address = 0 if (@address < 0 || ! @address)
29
+
30
+ begin
31
+ buf = pe.read_rva(@address, suf)
32
+ rescue ::Rex::PeParsey::WtfError
33
+ return
34
+ end
35
+
36
+ $stdout.puts pe.ptr_s(pe.rva_to_vma(@address)) + " " + buf.unpack("H*")[0]
37
+ if(param['disasm'])
38
+ ::Rex::Assembly::Nasm.disassemble(buf).split("\n").each do |line|
39
+ $stdout.puts "\t#{line.strip}"
40
+ end
41
+ end
42
+
43
+ end
44
+ end
45
+
46
+ class DumpOffset < DumpRVA
47
+ def config(param)
48
+ begin
49
+ @address = pe.file_offset_to_rva(param['args'])
50
+ rescue Rex::PeParsey::BoundsError
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1 @@
1
+ require 'rex/platforms/windows'
@@ -0,0 +1,51 @@
1
+ module Rex
2
+ module Platforms
3
+ module Windows
4
+
5
+
6
+
7
+ #
8
+ # Windows Registry Constants
9
+ #
10
+ REG_NONE = 1
11
+ REG_SZ = 1
12
+ REG_EXPAND_SZ = 2
13
+ REG_BINARY = 3
14
+ REG_DWORD = 4
15
+ REG_LITTLE_ENDIAN = 4
16
+ REG_BIG_ENDIAN = 5
17
+ REG_LINK = 6
18
+ REG_MULTI_SZ = 7
19
+
20
+ HKEY_CLASSES_ROOT = 0x80000000
21
+ HKEY_CURRENT_USER = 0x80000001
22
+ HKEY_LOCAL_MACHINE = 0x80000002
23
+ HKEY_USERS = 0x80000003
24
+ HKEY_PERFORMANCE_DATA = 0x80000004
25
+ HKEY_CURRENT_CONFIG = 0x80000005
26
+ HKEY_DYN_DATA = 0x80000006
27
+
28
+ def registry_hive_lookup(hive)
29
+ case hive
30
+ when 'HKCR'
31
+ HKEY_LOCAL_MACHINE
32
+ when 'HKCU'
33
+ HKEY_CURRENT_USER
34
+ when 'HKLM'
35
+ HKEY_LOCAL_MACHINE
36
+ when 'HKU'
37
+ HKEY_USERS
38
+ when 'HKPD'
39
+ HKEY_PERFORMANCE_DATA
40
+ when 'HKCC'
41
+ HKEY_CURRENT_CONFIG
42
+ when 'HKDD'
43
+ HKEY_DYN_DATA
44
+ else
45
+ HKEY_LOCAL_MACHINE
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,132 @@
1
+ module Rex
2
+ module Poly
3
+
4
+ require 'rex/poly/register'
5
+ require 'rex/poly/block'
6
+
7
+ ###
8
+ #
9
+ # This class encapsulates the state of a single polymorphic block set
10
+ # generation. It tracks the current set of consumed registers, the linear
11
+ # list of blocks generated, the end-result buffer, and the phase of
12
+ # generation. The fields exposed by the State class are intended for use only
13
+ # by the polymorphic generation subsystem and should not be modified directly.
14
+ #
15
+ ###
16
+ class State
17
+
18
+ #
19
+ # Initializes the polymorphic generation state.
20
+ #
21
+ def initialize
22
+ @block_list = nil
23
+ reset
24
+ end
25
+
26
+ #
27
+ # Resets the generation state to have a plain start by clearing all
28
+ # consumed registers, resetting the polymorphic buffer back to its
29
+ # beginning and destroying any block generation state.
30
+ #
31
+ def reset
32
+ # Reset the generation flag on any blocks in the block list
33
+ @block_list.each { |block|
34
+ block[0].generated = false
35
+ } if (@block_list)
36
+
37
+ @regnums = Hash.new
38
+ @buffer = ''
39
+ @block_list = []
40
+ @curr_offset = 0
41
+ @first_phase = true
42
+ @badchars = nil
43
+ end
44
+
45
+ #
46
+ # Returns true if the supplied register number is already consumed.
47
+ #
48
+ def consumed_regnum?(regnum)
49
+ @regnums[regnum]
50
+ end
51
+
52
+ #
53
+ # Consumes a register number, thus removing it from the pool that can be
54
+ # assigned. The consumed register number is returned to the caller.
55
+ #
56
+ def consume_regnum(regnum)
57
+ raise RuntimeError, "Register #{regnum} is already consumed." if (consumed_regnum?(regnum))
58
+
59
+ @regnums[regnum] = true
60
+
61
+ regnum
62
+ end
63
+
64
+ #
65
+ # Acquires a register number that has not already been consumed from the
66
+ # supplied register number set and consumes it, returning the selected
67
+ # register number to the caller. The register number is selected from the
68
+ # set at random.
69
+ #
70
+ def consume_regnum_from_set(regnum_set)
71
+ # Pick a random starting point within the supplied set.
72
+ idx = rand(regnum_set.length)
73
+
74
+ # Try each index in the set.
75
+ regnum_set.length.times { |x|
76
+ regnum = regnum_set[(idx + x) % regnum_set.length]
77
+
78
+ next if (consumed_regnum?(regnum))
79
+
80
+ return consume_regnum(regnum)
81
+ }
82
+
83
+ # If we get through the entire iteration without finding a register,
84
+ # then we are out of registers to assign.
85
+ raise RuntimeError, "No registers are available to consume from the set"
86
+ end
87
+
88
+ #
89
+ # Eliminates a register number from the consumed pool so that it can be
90
+ # used in the future. This happens after a block indicates that a register
91
+ # has been clobbered.
92
+ #
93
+ def defecate_regnum(regnum)
94
+ @regnums.delete(regnum)
95
+ end
96
+
97
+ #
98
+ # The buffer state for the current polymorphic generation. This stores the
99
+ # end-result of a call to generate on a LogicalBlock.
100
+ #
101
+ attr_accessor :buffer
102
+
103
+ #
104
+ # The linear list of blocks that is generated by calling the generate
105
+ # method on a LogicalBlock.
106
+ #
107
+ attr_accessor :block_list
108
+
109
+ #
110
+ # The current offset into the polymorphic buffer that is being generated.
111
+ # This is updated as blocks are appended to the block_list.
112
+ #
113
+ attr_accessor :curr_offset
114
+
115
+ #
116
+ # A boolean field that is used by the LogicalBlock class to track whether
117
+ # or not it is in the first phase (generating the block list), or in the
118
+ # second phase (generating the polymorphic buffer). This phases are used
119
+ # to indicate whether or not the offset_of and regnum_of methods will
120
+ # return actual results.
121
+ #
122
+ attr_accessor :first_phase
123
+
124
+ #
125
+ # Characters to avoid when selecting permutations, if any.
126
+ #
127
+ attr_accessor :badchars
128
+
129
+ end
130
+
131
+ end
132
+ end