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,113 @@
1
+ #
2
+ # Log severities
3
+ #
4
+ LOG_ERROR = 'error'
5
+ LOG_DEBUG = 'debug'
6
+ LOG_INFO = 'info'
7
+ LOG_WARN = 'warn'
8
+ LOG_RAW = 'raw'
9
+
10
+ ##
11
+ #
12
+ # Log levels
13
+ #
14
+ ##
15
+
16
+ #
17
+ # LEV_0 - Default
18
+ #
19
+ # This log level is the default log level if none is specified. It should be
20
+ # used when a log message should always be displayed when logging is enabled.
21
+ # Very few log messages should occur at this level aside from necessary
22
+ # information logging and error/warning logging. Debug logging at level zero
23
+ # is not advised.
24
+ #
25
+ LEV_0 = 0
26
+
27
+ #
28
+ # LEV_1 - Extra
29
+ #
30
+ # This log level should be used when extra information may be needed to
31
+ # understand the cause of an error or warning message or to get debugging
32
+ # information that might give clues as to why something is happening. This
33
+ # log level should be used only when information may be useful to understanding
34
+ # the behavior of something at a basic level. This log level should not be
35
+ # used in an exhaustively verbose fashion.
36
+ #
37
+ LEV_1 = 1
38
+
39
+ #
40
+ # LEV_2 - Verbose
41
+ #
42
+ # This log level should be used when verbose information may be needed to
43
+ # analyze the behavior of the framework. This should be the default log
44
+ # level for all detailed information not falling into LEV_0 or LEV_1.
45
+ # It is recommended that this log level be used by default if you are
46
+ # unsure.
47
+ #
48
+ LEV_2 = 2
49
+
50
+ #
51
+ # LEV_3 - Insanity
52
+ #
53
+ # This log level should contain very verbose information about the
54
+ # behavior of the framework, such as detailed information about variable
55
+ # states at certain phases including, but not limited to, loop iterations,
56
+ # function calls, and so on. This log level will rarely be displayed,
57
+ # but when it is the information provided should make it easy to analyze
58
+ # any problem.
59
+ #
60
+ LEV_3 = 3
61
+
62
+
63
+ #
64
+ # Architecture constants
65
+ #
66
+ ARCH_ANY = '_any_'
67
+ ARCH_X86 = 'x86'
68
+ ARCH_X86_64 = 'x86_64'
69
+ ARCH_X64 = 'x64' # To be used for compatability with ARCH_X86_64
70
+ ARCH_MIPS = 'mips'
71
+ ARCH_MIPSLE = 'mipsle'
72
+ ARCH_MIPSBE = 'mipsbe'
73
+ ARCH_PPC = 'ppc'
74
+ ARCH_PPC64 = 'ppc64'
75
+ ARCH_CBEA = 'cbea'
76
+ ARCH_CBEA64 = 'cbea64'
77
+ ARCH_SPARC = 'sparc'
78
+ ARCH_CMD = 'cmd'
79
+ ARCH_PHP = 'php'
80
+ ARCH_TTY = 'tty'
81
+ ARCH_ARMLE = 'armle'
82
+ ARCH_ARMBE = 'armbe'
83
+ ARCH_JAVA = 'java'
84
+ ARCH_TYPES =
85
+ [
86
+ ARCH_X86,
87
+ ARCH_X86_64,
88
+ ARCH_MIPS,
89
+ ARCH_MIPSLE,
90
+ ARCH_MIPSBE,
91
+ ARCH_PPC,
92
+ ARCH_PPC64,
93
+ ARCH_CBEA,
94
+ ARCH_CBEA64,
95
+ ARCH_SPARC,
96
+ ARCH_ARMLE,
97
+ ARCH_ARMBE,
98
+ ARCH_CMD,
99
+ ARCH_PHP,
100
+ ARCH_TTY,
101
+ ARCH_JAVA
102
+ ]
103
+
104
+ ARCH_ALL = ARCH_TYPES
105
+
106
+ #
107
+ # Endian constants
108
+ #
109
+ ENDIAN_LITTLE = 0
110
+ ENDIAN_BIG = 1
111
+
112
+ IS_ENDIAN_LITTLE = ( [1].pack('s') == "\x01\x00" ) ? true : false
113
+ IS_ENDIAN_BIG = ( not IS_ENDIAN_LITTLE )
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # $Id: elfparsey.rb 5413 2008-02-13 02:43:56Z ramon $
4
+
5
+ module Rex
6
+ module ElfParsey
7
+
8
+ end
9
+ end
10
+
11
+ require 'rex/elfparsey/elf'
@@ -0,0 +1,123 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # $Id: elf.rb 6615 2009-06-03 01:39:54Z hdm $
4
+
5
+ require 'rex/elfparsey/elfbase'
6
+ require 'rex/elfparsey/exceptions'
7
+ require 'rex/image_source'
8
+
9
+ module Rex
10
+ module ElfParsey
11
+ class Elf < ElfBase
12
+
13
+ attr_accessor :elf_header, :program_header, :base_addr, :isource
14
+
15
+ def initialize(isource)
16
+ offset = 0
17
+ base_addr = 0
18
+
19
+ # ELF Header
20
+ elf_header = ElfHeader.new(isource.read(offset, ELF_HEADER_SIZE))
21
+
22
+ # Data encoding
23
+ ei_data = elf_header.e_ident[EI_DATA,1].unpack("C")[0]
24
+
25
+ e_phoff = elf_header.e_phoff
26
+ e_phentsize = elf_header.e_phentsize
27
+ e_phnum = elf_header.e_phnum
28
+
29
+ # Program Header Table
30
+ program_header = []
31
+
32
+ e_phnum.times do |i|
33
+ offset = e_phoff + (e_phentsize * i)
34
+
35
+ program_header << ProgramHeader.new(
36
+ isource.read(offset, PROGRAM_HEADER_SIZE), ei_data
37
+ )
38
+
39
+ if program_header[-1].p_type == PT_LOAD && base_addr == 0
40
+ base_addr = program_header[-1].p_vaddr
41
+ end
42
+
43
+ end
44
+
45
+ self.elf_header = elf_header
46
+ self.program_header = program_header
47
+ self.base_addr = base_addr
48
+ self.isource = isource
49
+ end
50
+
51
+ def self.new_from_file(filename, disk_backed = false)
52
+
53
+ file = ::File.new(filename)
54
+ # file.binmode # windows... :\
55
+
56
+ if disk_backed
57
+ return self.new(ImageSource::Disk.new(file))
58
+ else
59
+ obj = new_from_string(file.read)
60
+ file.close
61
+ return obj
62
+ end
63
+ end
64
+
65
+ def self.new_from_string(data)
66
+ return self.new(ImageSource::Memory.new(data))
67
+ end
68
+
69
+ #
70
+ # Returns true if this binary is for a 64-bit architecture.
71
+ #
72
+ def ptr_64?
73
+ unless [ ELFCLASS32, ELFCLASS64 ].include?(
74
+ elf_header.e_ident[EI_CLASS,1].unpack("C*")[0])
75
+ raise ElfHeaderError, 'Invalid class', caller
76
+ end
77
+
78
+ elf_header.e_ident[EI_CLASS,1].unpack("C*")[0] == ELFCLASS64
79
+ end
80
+
81
+ #
82
+ # Returns true if this binary is for a 32-bit architecture.
83
+ # This check does not take into account 16-bit binaries at the moment.
84
+ #
85
+ def ptr_32?
86
+ ptr_64? == false
87
+ end
88
+
89
+ #
90
+ # Converts a virtual address to a string representation based on the
91
+ # underlying architecture.
92
+ #
93
+ def ptr_s(rva)
94
+ (ptr_32?) ? ("0x%.8x" % rva) : ("0x%.16x" % rva)
95
+ end
96
+
97
+ def offset_to_rva(offset)
98
+ base_addr + offset
99
+ end
100
+
101
+ def rva_to_offset(rva)
102
+ rva - base_addr
103
+ end
104
+
105
+ def read(offset, len)
106
+ isource.read(offset, len)
107
+ end
108
+
109
+ def read_rva(rva, len)
110
+ isource.read(rva_to_offset(rva), len)
111
+ end
112
+
113
+ def index(*args)
114
+ isource.index(*args)
115
+ end
116
+
117
+ def close
118
+ isource.close
119
+ end
120
+
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,260 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # $Id: elfbase.rb 6615 2009-06-03 01:39:54Z hdm $
4
+
5
+ require 'rex/struct2'
6
+
7
+ module Rex
8
+ module ElfParsey
9
+ class ElfBase
10
+
11
+ # ELF Header
12
+
13
+ ELF_HEADER_SIZE = 52
14
+
15
+ EI_NIDENT = 16
16
+
17
+ ELF32_EHDR_LSB = Rex::Struct2::CStructTemplate.new(
18
+ [ 'string', 'e_ident', EI_NIDENT, '' ],
19
+ [ 'uint16v', 'e_type', 0 ],
20
+ [ 'uint16v', 'e_machine', 0 ],
21
+ [ 'uint32v', 'e_version', 0 ],
22
+ [ 'uint32v', 'e_entry', 0 ],
23
+ [ 'uint32v', 'e_phoff', 0 ],
24
+ [ 'uint32v', 'e_shoff', 0 ],
25
+ [ 'uint32v', 'e_flags', 0 ],
26
+ [ 'uint16v', 'e_ehsize', 0 ],
27
+ [ 'uint16v', 'e_phentsize', 0 ],
28
+ [ 'uint16v', 'e_phnum', 0 ],
29
+ [ 'uint16v', 'e_shentsize', 0 ],
30
+ [ 'uint16v', 'e_shnum', 0 ],
31
+ [ 'uint16v', 'e_shstrndx', 0 ]
32
+ )
33
+
34
+ ELF32_EHDR_MSB = Rex::Struct2::CStructTemplate.new(
35
+ [ 'string', 'e_ident', EI_NIDENT, '' ],
36
+ [ 'uint16n', 'e_type', 0 ],
37
+ [ 'uint16n', 'e_machine', 0 ],
38
+ [ 'uint32n', 'e_version', 0 ],
39
+ [ 'uint32n', 'e_entry', 0 ],
40
+ [ 'uint32n', 'e_phoff', 0 ],
41
+ [ 'uint32n', 'e_shoff', 0 ],
42
+ [ 'uint32n', 'e_flags', 0 ],
43
+ [ 'uint16n', 'e_ehsize', 0 ],
44
+ [ 'uint16n', 'e_phentsize', 0 ],
45
+ [ 'uint16n', 'e_phnum', 0 ],
46
+ [ 'uint16n', 'e_shentsize', 0 ],
47
+ [ 'uint16n', 'e_shnum', 0 ],
48
+ [ 'uint16n', 'e_shstrndx', 0 ]
49
+ )
50
+
51
+ # e_type This member identifies the object file type
52
+
53
+ ET_NONE = 0 # No file type
54
+ ET_REL = 1 # Relocatable file
55
+ ET_EXEC = 2 # Executable file
56
+ ET_DYN = 3 # Shared object file
57
+ ET_CORE = 4 # Core file
58
+ ET_LOPROC = 0xff00 # Processor-specific
59
+ ET_HIPROC = 0xffff # Processor-specific
60
+
61
+ #
62
+ # e_machine This member's value specifies the required architecture for an
63
+ # individual file.
64
+ #
65
+
66
+ # ET_NONE = 0 # No machine
67
+ EM_M32 = 1 # AT&T WE 32100
68
+ EM_SPARC = 2 # SPARC
69
+ EM_386 = 3 # Intel Architecture
70
+ EM_68K = 4 # Motorola 68000
71
+ EM_88K = 5 # Motorola 88000
72
+ EM_860 = 7 # Intel 80860
73
+ EM_MIPS = 8 # MIPS RS3000 Big-Endian
74
+ EM_MIPS_RS4_BE = 10 # MIPS RS4000 Big-Endian
75
+
76
+ # e_version This member identifies the object file version
77
+
78
+ EV_NONE = 0 # Invalid version
79
+ EV_CURRENT = 1 # Current version
80
+
81
+
82
+ # ELF Identification
83
+
84
+ # e_ident[] Identification indexes
85
+
86
+ EI_MAG0 = 0 # File identification
87
+ EI_MAG1 = 1 # File identification
88
+ EI_MAG2 = 2 # File identification
89
+ EI_MAG3 = 3 # File identification
90
+ EI_CLASS = 4 # File class
91
+ EI_DATA = 5 # Data encoding
92
+ EI_VERSION = 6 # File version
93
+ EI_PAD = 7 # Start of padding bytes
94
+ # EI_NIDENT = 16 # Size of e_ident[]
95
+
96
+ #
97
+ # EI_MAG0 to EI_MAG3 A file's first 4 bytes hold a "magic number",
98
+ # identifying the file as an ELF object file.
99
+ #
100
+
101
+ ELFMAG0 = 0x7f # e_ident[EI_MAG0]
102
+ ELFMAG1 = ?E # e_ident[EI_MAG1]
103
+ ELFMAG2 = ?L # e_ident[EI_MAG2]
104
+ ELFMAG3 = ?F # e_ident[EI_MAG3]
105
+
106
+ ELFMAG = ELFMAG0.chr + ELFMAG1.chr + ELFMAG2.chr + ELFMAG3.chr
107
+
108
+ # EI_CLASS Identifies the file's class, or capacity
109
+
110
+ ELFCLASSNONE = 0 # Invalid class
111
+ ELFCLASS32 = 1 # 32-bit objects
112
+ ELFCLASS64 = 2 # 64-bit objects
113
+
114
+ #
115
+ # EI_DATA Specifies the data encoding of the processor-specific data in
116
+ # the object file. The following encodings are currently defined.
117
+ #
118
+
119
+ ELFDATANONE = 0 # Invalid data encoding
120
+ ELFDATA2LSB = 1 # Least significant byte first
121
+ ELFDATA2MSB = 2 # Most significant byte first
122
+
123
+ class GenericStruct
124
+ attr_accessor :struct
125
+ def initialize(_struct)
126
+ self.struct = _struct
127
+ end
128
+
129
+ # The following methods are just pass-throughs for struct
130
+
131
+ # Access a value
132
+ def v
133
+ struct.v
134
+
135
+ end
136
+
137
+ # Access a value by array
138
+ def [](*args)
139
+ struct[*args]
140
+ end
141
+
142
+ # Obtain an array of all fields
143
+ def keys
144
+ struct.keys
145
+ end
146
+
147
+ def method_missing(meth, *args)
148
+ v[meth.to_s] || (raise NoMethodError.new, meth)
149
+ end
150
+ end
151
+
152
+ class GenericHeader < GenericStruct
153
+ end
154
+
155
+ class ElfHeader < GenericHeader
156
+ def initialize(rawdata)
157
+
158
+ # Identify the data encoding and parse ELF Header
159
+ elf_header = ELF32_EHDR_LSB.make_struct
160
+
161
+ if !elf_header.from_s(rawdata)
162
+ raise ElfHeaderError, "Couldn't parse ELF Header", caller
163
+ end
164
+
165
+ if elf_header.v['e_ident'][EI_DATA,1].unpack('C')[0] == ELFDATA2MSB
166
+ elf_header = ELF32_EHDR_MSB.make_struct
167
+
168
+ if !elf_header.from_s(rawdata)
169
+ raise ElfHeaderError, "Couldn't parse ELF Header", caller
170
+ end
171
+ end
172
+
173
+ unless [ ELFDATA2LSB, ELFDATA2MSB ].include?(
174
+ elf_header.v['e_ident'][EI_DATA,1].unpack('C')[0])
175
+ raise ElfHeaderError, "Invalid data encoding", caller
176
+ end
177
+
178
+ # Identify the file as an ELF object file
179
+ unless elf_header.v['e_ident'][EI_MAG0, 4] == ELFMAG
180
+ raise ElfHeaderError, 'Invalid magic number', caller
181
+ end
182
+
183
+ self.struct = elf_header
184
+ end
185
+
186
+ def e_ident
187
+ struct.v['e_ident']
188
+ end
189
+
190
+ end
191
+
192
+
193
+ # Program Header
194
+
195
+ PROGRAM_HEADER_SIZE = 36
196
+
197
+ ELF32_PHDR_LSB = Rex::Struct2::CStructTemplate.new(
198
+ [ 'uint32v', 'p_type', 0 ],
199
+ [ 'uint32v', 'p_offset', 0 ],
200
+ [ 'uint32v', 'p_vaddr', 0 ],
201
+ [ 'uint32v', 'p_paddr', 0 ],
202
+ [ 'uint32v', 'p_filesz', 0 ],
203
+ [ 'uint32v', 'p_filesz', 0 ],
204
+ [ 'uint32v', 'p_memsz', 0 ],
205
+ [ 'uint32v', 'p_flags', 0 ],
206
+ [ 'uint32v', 'p_align', 0 ]
207
+ )
208
+
209
+ ELF32_PHDR_MSB = Rex::Struct2::CStructTemplate.new(
210
+ [ 'uint32n', 'p_type', 0 ],
211
+ [ 'uint32n', 'p_offset', 0 ],
212
+ [ 'uint32n', 'p_vaddr', 0 ],
213
+ [ 'uint32n', 'p_paddr', 0 ],
214
+ [ 'uint32n', 'p_filesz', 0 ],
215
+ [ 'uint32n', 'p_filesz', 0 ],
216
+ [ 'uint32n', 'p_memsz', 0 ],
217
+ [ 'uint32n', 'p_flags', 0 ],
218
+ [ 'uint32n', 'p_align', 0 ]
219
+ )
220
+
221
+ #
222
+ # p_type This member tells what kind of segment this array element
223
+ # describes or how to interpret the array element's information.
224
+ #
225
+
226
+ # Segment Types
227
+
228
+ PT_NULL = 0
229
+ PT_LOAD = 1
230
+ PT_DYNAMIC = 2
231
+ PT_INTERP = 3
232
+ PT_NOTE = 4
233
+ PT_SHLIB = 5
234
+ PT_PHDR = 6
235
+ PT_LOPROC = 0x70000000
236
+ PT_HIPROC = 0x7fffffff
237
+
238
+ class ProgramHeader < GenericHeader
239
+ def initialize(rawdata, ei_data)
240
+ # Identify the data encoding and parse Program Header
241
+ if ei_data == ELFDATA2LSB
242
+ program_header = ELF32_PHDR_LSB.make_struct
243
+ elsif ei_data == ELFDATA2MSB
244
+ program_header = ELF32_PHDR_MSB.make_struct
245
+ else
246
+ raise ElfHeaderError, "Invalid data encoding", caller
247
+ end
248
+
249
+ if !program_header.from_s(rawdata)
250
+ raise ProgramHeaderError, "Couldn't parse Program Header", caller
251
+ end
252
+
253
+ self.struct = program_header
254
+ end
255
+
256
+ end
257
+
258
+ end
259
+ end
260
+ end