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,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # $Id: exceptions.rb 5413 2008-02-13 02:43:56Z ramon $
4
+
5
+ module Rex
6
+ module ElfParsey
7
+
8
+ class ElfError < ::RuntimeError
9
+ end
10
+
11
+ class ParseError < ElfError
12
+ end
13
+
14
+ class ElfHeaderError < ParseError
15
+ end
16
+
17
+ class ProgramHeaderError < ParseError
18
+ end
19
+
20
+ class BoundsError < ElfError
21
+ end
22
+
23
+ class WtfError < ElfError
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # $Id: elfscan.rb 5398 2008-02-06 17:31:57Z ramon $
4
+
5
+ module Rex
6
+ module ElfScan
7
+
8
+ end
9
+ end
10
+
11
+ require 'rex/elfscan/scanner'
12
+ require 'rex/elfscan/search'
@@ -0,0 +1,207 @@
1
+
2
+ # $Id: scanner.rb 7320 2009-11-02 17:09:13Z hdm $
3
+
4
+ module Rex
5
+ module ElfScan
6
+ module Scanner
7
+ class Generic
8
+
9
+ attr_accessor :elf, :regex
10
+
11
+ def initialize(elf)
12
+ self.elf = elf
13
+ end
14
+
15
+ def config(param)
16
+ end
17
+
18
+ def scan(param)
19
+ config(param)
20
+
21
+ $stdout.puts "[#{param['file']}]"
22
+ elf.program_header.each do |program_header|
23
+
24
+ # Scan only loadable segment entries in the program header table
25
+ if program_header.p_type == Rex::ElfParsey::ElfBase::PT_LOAD
26
+ hits = scan_segment(program_header, param)
27
+ hits.each do |hit|
28
+ rva = hit[0]
29
+ message = hit[1].is_a?(Array) ? hit[1].join(" ") : hit[1]
30
+ $stdout.puts elf.ptr_s(rva) + " " + message
31
+ end
32
+ end
33
+
34
+ end
35
+ end
36
+
37
+ def scan_segment(program_header, param={})
38
+ []
39
+ end
40
+ end
41
+
42
+ class JmpRegScanner < Generic
43
+
44
+ def config(param)
45
+ regnums = param['args']
46
+
47
+ # build a list of the call bytes
48
+ calls = _build_byte_list(0xd0, regnums - [4]) # note call esp's don't work..
49
+ jmps = _build_byte_list(0xe0, regnums)
50
+ pushs1 = _build_byte_list(0x50, regnums)
51
+ pushs2 = _build_byte_list(0xf0, regnums)
52
+
53
+ regexstr = '('
54
+ if !calls.empty?
55
+ regexstr += "\xff[#{calls}]|"
56
+ end
57
+
58
+ regexstr += "\xff[#{jmps}]|([#{pushs1}]|\xff[#{pushs2}])(\xc3|\xc2..))"
59
+
60
+ self.regex = Regexp.new(regexstr, nil, 'n')
61
+ end
62
+
63
+ # build a list for regex of the possible bytes, based on a base
64
+ # byte and a list of register numbers..
65
+ def _build_byte_list(base, regnums)
66
+ regnums.collect { |regnum| Regexp.escape((base | regnum).chr) }.join('')
67
+ end
68
+
69
+ def _ret_size(offset)
70
+ case elf.read(offset, 1)
71
+ when "\xc3"
72
+ return 1
73
+ when "\xc2"
74
+ return 3
75
+ end
76
+
77
+ raise "wtf"
78
+ end
79
+
80
+ def _parse_ret(data)
81
+ if data.length == 1
82
+ return "ret"
83
+ else
84
+ return "retn 0x%04x" % data[1, 2].unpack('v')[0]
85
+ end
86
+ end
87
+
88
+
89
+ def scan_segment(program_header, param={})
90
+ offset = program_header.p_offset
91
+
92
+ hits = []
93
+
94
+ while (offset = elf.index(regex, offset)) != nil
95
+
96
+ rva = elf.offset_to_rva(offset)
97
+ message = ''
98
+
99
+ parse_ret = false
100
+
101
+ byte1 = elf.read(offset, 1).unpack('C')[0]
102
+
103
+ if byte1 == 0xff
104
+ byte2 = elf.read(offset+1, 1).unpack('C')[0]
105
+ regname = Rex::Arch::X86.reg_name32(byte2 & 0x7)
106
+
107
+ case byte2 & 0xf8
108
+ when 0xd0
109
+ message = "call #{regname}"
110
+ offset += 2
111
+ when 0xe0
112
+ message = "jmp #{regname}"
113
+ offset += 2
114
+ when 0xf0
115
+ retsize = _ret_size(offset+2)
116
+ message = "push #{regname}; " + _parse_ret(elf.read(offset+2, retsize))
117
+ offset += 2 + retsize
118
+ else
119
+ raise "wtf"
120
+ end
121
+ else
122
+ regname = Rex::Arch::X86.reg_name32(byte1 & 0x7)
123
+ retsize = _ret_size(offset+1)
124
+ message = "push #{regname}; " + _parse_ret(elf.read(offset+1, retsize))
125
+ offset += 1 + retsize
126
+ end
127
+
128
+ hits << [ rva, message ]
129
+ end
130
+
131
+ return hits
132
+ end
133
+ end
134
+
135
+ class PopPopRetScanner < JmpRegScanner
136
+
137
+ def config(param)
138
+ pops = _build_byte_list(0x58, (0 .. 7).to_a - [4]) # we don't want pop esp's...
139
+ self.regex = Regexp.new("[#{pops}][#{pops}](\xc3|\xc2..)", nil, 'n')
140
+ end
141
+
142
+ def scan_segment(program_header, param={})
143
+ offset = program_header.p_offset
144
+
145
+ hits = []
146
+
147
+ while offset < program_header.p_offset + program_header.p_filesz &&
148
+ (offset = elf.index(regex, offset)) != nil
149
+
150
+ rva = elf.offset_to_rva(offset)
151
+ message = ''
152
+
153
+ pops = elf.read(offset, 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(offset+2)
160
+ message += _parse_ret(elf.read(offset+2, retsize))
161
+
162
+ offset += 2 + retsize
163
+
164
+ hits << [ rva, message ]
165
+ end
166
+
167
+ return hits
168
+ end
169
+ end
170
+
171
+ class RegexScanner < JmpRegScanner
172
+
173
+ def config(param)
174
+ self.regex = Regexp.new(param['args'], nil, 'n')
175
+ end
176
+
177
+ def scan_segment(program_header, param={})
178
+ offset = program_header.p_offset
179
+
180
+ hits = []
181
+
182
+ while offset < program_header.p_offset + program_header.p_filesz &&
183
+ (offset = elf.index(regex, offset)) != nil
184
+
185
+ idx = offset
186
+ buf = ''
187
+ mat = nil
188
+
189
+ while (! (mat = buf.match(regex)))
190
+ buf << elf.read(idx, 1)
191
+ idx += 1
192
+ end
193
+
194
+ rva = elf.offset_to_rva(offset)
195
+
196
+ hits << [ rva, buf.unpack("H*") ]
197
+ offset += buf.length
198
+ end
199
+
200
+ return hits
201
+ end
202
+ end
203
+
204
+ end
205
+ end
206
+ end
207
+
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # $Id: search.rb 5413 2008-02-13 02:43:56Z ramon $
4
+
5
+ module Rex
6
+ module ElfScan
7
+ module Search
8
+
9
+ class DumpRVA
10
+ attr_accessor :elf
11
+
12
+ def initialize(elf)
13
+ self.elf = elf
14
+ end
15
+
16
+ def config(param)
17
+ @address = param['args']
18
+ end
19
+
20
+ def scan(param)
21
+ config(param)
22
+
23
+ $stdout.puts "[#{param['file']}]"
24
+
25
+ # Adjust based on -A and -B flags
26
+ pre = param['before'] || 0
27
+ suf = param['after'] || 16
28
+
29
+ @address -= pre
30
+ @address = 0 if (@address < 0 || ! @address)
31
+ buf = elf.read_rva(@address, suf)
32
+ $stdout.puts elf.ptr_s(@address) + " " + buf.unpack("H*")[0]
33
+ end
34
+ end
35
+
36
+ class DumpOffset < DumpRVA
37
+ def config(param)
38
+ begin
39
+ @address = elf.offset_to_rva(param['args'])
40
+ rescue Rex::ElfParsey::BoundsError
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # ________________________________________________________________________________
5
+ #
6
+ # ,sSSs,,s, ,sSSSs, ALPHA 2: Zero-tolerance. (build 07)
7
+ # SS" Y$P" SY" ,SY
8
+ # iS' dY ,sS" Unicode-proof uppercase alphanumeric shellcode encoding.
9
+ # YS, dSb ,sY" Copyright (C) 2003, 2004 by Berend-Jan Wever.
10
+ # `"YSS'"S' 'SSSSSSSP <skylined@edup.tudelft.nl>
11
+ # ________________________________________________________________________________
12
+ #
13
+
14
+ #
15
+ # make sure the namespace is created
16
+ #
17
+
18
+ module Rex
19
+ module Encoder
20
+ module Alpha2
21
+ end end end
22
+
23
+ #
24
+ # include the Alpha2 encodings
25
+ #
26
+
27
+ require 'rex/encoder/alpha2/generic'
28
+ require 'rex/encoder/alpha2/alpha_mixed'
29
+ require 'rex/encoder/alpha2/alpha_upper'
30
+ require 'rex/encoder/alpha2/unicode_mixed'
31
+ require 'rex/encoder/alpha2/unicode_upper'
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rex/encoder/alpha2/generic'
4
+
5
+ module Rex
6
+ module Encoder
7
+ module Alpha2
8
+
9
+ class AlphaMixed < Generic
10
+
11
+ def self.gen_decoder_prefix(reg, offset)
12
+ if (offset > 32)
13
+ raise "Critical: Offset is greater than 32"
14
+ end
15
+
16
+ # use inc ebx as a nop here so we still pad correctly
17
+ if (offset <= 16)
18
+ nop = 'C' * offset
19
+ mod = 'I' * (16 - offset) + nop + '7QZ' # dec ecx,,, push ecx, pop edx
20
+ edxmod = 'J' * (17 - offset)
21
+ else
22
+ mod = 'A' * (offset - 16)
23
+ nop = 'C' * (16 - mod.length)
24
+ mod << nop + '7QZ'
25
+ edxmod = 'B' * (17 - (offset - 16))
26
+ end
27
+ regprefix = {
28
+ 'EAX' => 'PY' + mod, # push eax, pop ecx
29
+ 'ECX' => 'I' + mod, # dec ecx
30
+ 'EDX' => edxmod + nop + '7RY', # dec edx,,, push edx, pop ecx
31
+ 'EBX' => 'SY' + mod, # push ebx, pop ecx
32
+ 'ESP' => 'TY' + mod, # push esp, pop ecx
33
+ 'EBP' => 'UY' + mod, # push ebp, pop ecx
34
+ 'ESI' => 'VY' + mod, # push esi, pop ecx
35
+ 'EDI' => 'WY' + mod, # push edi, pop ecx
36
+ }
37
+
38
+ reg.upcase!
39
+ if (not regprefix.keys.include? reg)
40
+ raise ArgumentError.new("Invalid register name")
41
+ end
42
+ return regprefix[reg]
43
+ end
44
+
45
+ def self.gen_decoder(reg, offset)
46
+ decoder =
47
+ gen_decoder_prefix(reg, offset) +
48
+ "jA" + # push 0x41
49
+ "X" + # pop eax
50
+ "P" + # push eax
51
+ "0A0" + # xor byte [ecx+30], al
52
+ "A" + # inc ecx <---
53
+ "kAAQ" + # imul eax, [ecx+42], 51 -> 10 |
54
+ "2AB" + # xor al, [ecx + 42] |
55
+ "2BB" + # xor al, [edx + 42] |
56
+ "0BB" + # xor [edx + 42], al |
57
+ "A" + # inc ecx |
58
+ "B" + # inc edx |
59
+ "X" + # pop eax |
60
+ "P" + # push eax |
61
+ "8AB" + # cmp [ecx + 42], al |
62
+ "uJ" + # jnz short -------------------------
63
+ "I" # first encoded char, fixes the above J
64
+
65
+ return decoder
66
+ end
67
+
68
+ end end end end
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rex/encoder/alpha2/generic'
4
+
5
+ module Rex
6
+ module Encoder
7
+ module Alpha2
8
+
9
+ class AlphaUpper < Generic
10
+ def self.default_accepted_chars ; ('B' .. 'Z').to_a + ('0' .. '9').to_a ; end
11
+
12
+ def self.gen_decoder_prefix(reg, offset)
13
+ if (offset > 20)
14
+ raise "Critical: Offset is greater than 20"
15
+ end
16
+
17
+ # use inc ebx as a nop here so we still pad correctly
18
+ if (offset <= 10)
19
+ nop = 'C' * offset
20
+ mod = 'I' * (10 - offset) + nop + 'QZ' # dec ecx,,, push ecx, pop edx
21
+ edxmod = 'J' * (11 - offset)
22
+ else
23
+ mod = 'A' * (offset - 10)
24
+ nop = 'C' * (10 - mod.length)
25
+ mod << nop + 'QZ'
26
+ edxmod = 'B' * (11 - (offset - 10))
27
+ end
28
+ regprefix = {
29
+ 'EAX' => 'PY' + mod, # push eax, pop ecx
30
+ 'ECX' => 'I' + mod, # dec ecx
31
+ 'EDX' => edxmod + nop + 'RY', # mod edx,,, push edx, pop ecx
32
+ 'EBX' => 'SY' + mod, # push ebx, pop ecx
33
+ 'ESP' => 'TY' + mod, # push esp, pop ecx
34
+ 'EBP' => 'UY' + mod, # push ebp, pop ecx
35
+ 'ESI' => 'VY' + mod, # push esi, pop ecx
36
+ 'EDI' => 'WY' + mod, # push edi, pop edi
37
+ }
38
+
39
+ reg.upcase!
40
+ if (not regprefix.keys.include? reg)
41
+ raise ArgumentError.new("Invalid register name")
42
+ end
43
+ return regprefix[reg]
44
+
45
+ end
46
+
47
+ def self.gen_decoder(reg, offset)
48
+ decoder =
49
+ gen_decoder_prefix(reg, offset) +
50
+ "V" + # push esi
51
+ "T" + # push esp
52
+ "X" + # pop eax
53
+ "30" + # xor esi, [eax]
54
+ "V" + # push esi
55
+ "X" + # pop eax
56
+ "4A" + # xor al, 41
57
+ "P" + # push eax
58
+ "0A3" + # xor [ecx+33], al
59
+ "H" + # dec eax
60
+ "H" + # dec eax
61
+ "0A0" + # xor [ecx+30], al
62
+ "0AB" + # xor [ecx+42], al
63
+ "A" + # inc ecx <---------------
64
+ "A" + # inc ecx |
65
+ "B" + # inc edx |
66
+ "TAAQ" + # imul eax, [ecx+41], 10 * |
67
+ "2AB" + # xor al [ecx+42] |
68
+ "2BB" + # xor al, [edx+42] |
69
+ "0BB" + # xor [edx+42], al |
70
+ "X" + # pop eax |
71
+ "P" + # push eax |
72
+ "8AC" + # cmp [ecx+43], al |
73
+ "JJ" + # jnz * --------------------
74
+ "I" # first encoded char, fixes the above J
75
+
76
+ return decoder
77
+ end
78
+
79
+ end end end end