librex 0.0.68 → 0.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -1,111 +1,120 @@
1
1
  # -*- coding: binary -*-
2
- ##
3
- # $Id: entry.rb 15548 2012-06-29 06:08:20Z rapid7 $
4
- ##
5
2
 
6
3
  module Rex
7
4
  module Zip
8
5
 
9
- #
6
+ #
10
7
  # An Entry represents a logical file or directory to be stored in an Archive
11
8
  #
12
9
  class Entry
13
10
 
14
- attr_accessor :name, :flags, :info, :xtra, :comment, :attrs
15
- attr_reader :data
16
-
17
- def initialize(fname, data, compmeth, timestamp=nil, attrs=nil, xtra=nil, comment=nil)
18
- @name = fname.unpack("C*").pack("C*")
19
- @data = data.unpack("C*").pack("C*")
20
- @xtra = xtra
21
- @xtra ||= ''
22
- @comment = comment
23
- @comment ||= ''
24
- @attrs = attrs
25
- @attrs ||= 0
26
-
27
- # XXX: sanitize timestmap (assume now)
28
- timestamp ||= Time.now
29
- @flags = CompFlags.new(0, compmeth, timestamp)
30
-
31
- if (@data)
32
- compress
33
- else
34
- @data = ''
35
- @info = CompInfo.new(0, 0, 0)
36
- end
37
- @compdata ||= ''
38
- end
39
-
40
- def data=(val)
41
- @data = val.unpack("C*").pack("C*")
42
- compress
43
- end
44
-
45
- #
46
- # Compress the #data and store it for later use. If this entry's compression method
47
- # produces a larger blob than the original data, the method is changed to CM_STORE.
48
- #
49
- def compress
50
- @crc = Zlib.crc32(@data, 0)
51
- case @flags.compmeth
52
-
53
- when CM_STORE
54
- @compdata = @data
55
-
56
- when CM_DEFLATE
57
- z = Zlib::Deflate.new(Zlib::BEST_COMPRESSION)
58
- @compdata = z.deflate(@data, Zlib::FINISH)
59
- z.close
60
- @compdata = @compdata[2, @compdata.length-6]
61
-
62
- else
63
- raise 'Unsupported compression method: %u' % @flags.compmeth
64
- end
65
-
66
- # if compressing doesn't help, just store it
67
- if (@compdata.length > @data.length)
68
- @compdata = @data
69
- @flags.compmeth = CM_STORE
70
- end
71
-
72
- @info = CompInfo.new(@crc, @compdata.length, @data.length)
73
- end
74
-
75
-
76
- def relative_path
77
- if (@name[0,1] == '/')
78
- return @name[1,@name.length]
79
- end
80
- @name
81
- end
82
-
83
-
84
- #
85
- # Return the compressed data in a format suitable for adding to an Archive
86
- #
87
- def pack
88
- # - lfh 1
89
- lfh = LocalFileHdr.new(self)
90
- ret = lfh.pack
91
-
92
- # - data 1
93
- if (@compdata)
94
- ret << @compdata
95
- end
96
-
97
- if (@gpbf & GPBF_USE_DATADESC)
98
- # - data desc 1
99
- dd = DataDesc.new(@info)
100
- ret << dd.pack
101
- end
102
-
103
- ret
104
- end
105
-
106
- def inspect
107
- "#<#{self.class} name:#{name}, data:#{@data.length} bytes>"
108
- end
11
+ attr_accessor :name, :flags, :info, :xtra, :comment, :attrs, :central_dir_name
12
+ attr_reader :data
13
+
14
+ def initialize(fname, data, compmeth, timestamp=nil, attrs=nil, xtra=nil, comment=nil, central_dir_name=nil)
15
+ @name = fname.unpack("C*").pack("C*")
16
+ @central_dir_name = (central_dir_name ? central_dir_name.unpack("C*").pack("C*") : nil)
17
+ @data = data.unpack("C*").pack("C*")
18
+ @xtra = xtra
19
+ @xtra ||= ''
20
+ @comment = comment
21
+ @comment ||= ''
22
+ @attrs = attrs
23
+ @attrs ||= 0
24
+
25
+ # XXX: sanitize timestmap (assume now)
26
+ timestamp ||= Time.now
27
+ @flags = CompFlags.new(0, compmeth, timestamp)
28
+
29
+ if (@data)
30
+ compress
31
+ else
32
+ @data = ''
33
+ @info = CompInfo.new(0, 0, 0)
34
+ end
35
+ @compdata ||= ''
36
+ end
37
+
38
+ def data=(val)
39
+ @data = val.unpack("C*").pack("C*")
40
+ compress
41
+ end
42
+
43
+ #
44
+ # Compress the #data and store it for later use. If this entry's compression method
45
+ # produces a larger blob than the original data, the method is changed to CM_STORE.
46
+ #
47
+ def compress
48
+ @crc = Zlib.crc32(@data, 0)
49
+ case @flags.compmeth
50
+
51
+ when CM_STORE
52
+ @compdata = @data
53
+
54
+ when CM_DEFLATE
55
+ z = Zlib::Deflate.new(Zlib::BEST_COMPRESSION)
56
+ @compdata = z.deflate(@data, Zlib::FINISH)
57
+ z.close
58
+ @compdata = @compdata[2, @compdata.length-6]
59
+
60
+ else
61
+ raise 'Unsupported compression method: %u' % @flags.compmeth
62
+ end
63
+
64
+ # if compressing doesn't help, just store it
65
+ if (@compdata.length > @data.length)
66
+ @compdata = @data
67
+ @flags.compmeth = CM_STORE
68
+ end
69
+
70
+ @info = CompInfo.new(@crc, @compdata.length, @data.length)
71
+ end
72
+
73
+
74
+ def relative_path
75
+ get_relative_path(@name)
76
+ end
77
+
78
+ def central_dir_path
79
+ return nil if @central_dir_name.blank?
80
+ get_relative_path(@central_dir_name)
81
+ end
82
+
83
+
84
+ #
85
+ # Return the compressed data in a format suitable for adding to an Archive
86
+ #
87
+ def pack
88
+ # - lfh 1
89
+ lfh = LocalFileHdr.new(self)
90
+ ret = lfh.pack
91
+
92
+ # - data 1
93
+ if (@compdata)
94
+ ret << @compdata
95
+ end
96
+
97
+ if (@gpbf & GPBF_USE_DATADESC)
98
+ # - data desc 1
99
+ dd = DataDesc.new(@info)
100
+ ret << dd.pack
101
+ end
102
+
103
+ ret
104
+ end
105
+
106
+ def inspect
107
+ "#<#{self.class} name:#{name}, data:#{@data.length} bytes>"
108
+ end
109
+
110
+ private
111
+
112
+ def get_relative_path(path)
113
+ if (path[0,1] == '/')
114
+ return path[1, path.length]
115
+ end
116
+ path
117
+ end
109
118
 
110
119
  end
111
120
 
@@ -14,212 +14,267 @@ module Zip
14
14
  # - APK files are Android Package files
15
15
  #
16
16
  class Jar < Archive
17
- attr_accessor :manifest
18
-
19
- #
20
- # Create a MANIFEST.MF file based on the current Archive#entries.
21
- #
22
- # See http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html for
23
- # some explanation of the format.
24
- #
25
- # Example MANIFEST.MF
26
- # Manifest-Version: 1.0
27
- # Main-Class: metasploit.Payload
28
- #
29
- # Name: metasploit.dat
30
- # SHA1-Digest: WJ7cUVYUryLKfQFmH80/ADfKmwM=
31
- #
32
- # Name: metasploit/Payload.class
33
- # SHA1-Digest: KbAIMttBcLp1zCewA2ERYkcnRU8=
34
- #
35
- # The SHA1-Digest lines are optional unless the jar is signed (see #sign).
36
- #
37
- def build_manifest(opts={})
38
- main_class = opts[:main_class] || nil
39
- existing_manifest = nil
40
-
41
- @manifest = "Manifest-Version: 1.0\r\n"
42
- @manifest << "Main-Class: #{main_class}\r\n" if main_class
43
- @manifest << "\r\n"
44
- @entries.each { |e|
45
- next if e.name =~ %r|/$|
46
- if e.name == "META-INF/MANIFEST.MF"
47
- existing_manifest = e
48
- next
49
- end
50
- #next unless e.name =~ /\.class$/
51
- @manifest << "Name: #{e.name}\r\n"
52
- #@manifest << "SHA1-Digest: #{Digest::SHA1.base64digest(e.data)}\r\n"
53
- @manifest << "\r\n"
54
- }
55
- if existing_manifest
56
- existing_manifest.data = @manifest
57
- else
58
- add_file("META-INF/", '')
59
- add_file("META-INF/MANIFEST.MF", @manifest)
60
- end
61
- end
62
-
63
- def to_s
64
- pack
65
- end
66
-
67
- #
68
- # Length of the *compressed* blob
69
- #
70
- def length
71
- pack.length
72
- end
73
-
74
- #
75
- # Add multiple files from an array
76
- #
77
- # +files+ should be structured like so:
78
- # [
79
- # [ "path", "to", "file1" ],
80
- # [ "path", "to", "file2" ]
81
- # ]
82
- # and +path+ should be the location on the file system to find the files to
83
- # add. +base_dir+ will be prepended to the path inside the jar.
84
- #
85
- # Example:
86
- # war = Rex::Zip::Jar.new
87
- # war.add_file("WEB-INF/", '')
88
- # war.add_file("WEB-INF/web.xml", web_xml)
89
- # war.add_file("WEB-INF/classes/", '')
90
- # files = [
91
- # [ "servlet", "examples", "HelloWorld.class" ],
92
- # [ "Foo.class" ],
93
- # [ "servlet", "Bar.class" ],
94
- # ]
95
- # war.add_files(files, "./class_files/", "WEB-INF/classes/")
96
- #
97
- # The above code would create a jar with the following structure from files
98
- # found in ./class_files/ :
99
- #
100
- # +- WEB-INF/
101
- # +- web.xml
102
- # +- classes/
103
- # +- Foo.class
104
- # +- servlet/
105
- # +- Bar.class
106
- # +- examples/
107
- # +- HelloWorld.class
108
- #
109
- def add_files(files, path, base_dir="")
110
- files.each do |file|
111
- # Add all of the subdirectories if they don't already exist
112
- 1.upto(file.length - 1) do |idx|
113
- full = base_dir + file[0,idx].join("/") + "/"
114
- if !(entries.map{|e|e.name}.include?(full))
115
- add_file(full, '')
116
- end
117
- end
118
- # Now add the actual file, grabbing data from the filesystem
119
- fd = File.open(File.join( path, file ), "rb")
120
- data = fd.read(fd.stat.size)
121
- fd.close
122
- add_file(base_dir + file.join("/"), data)
123
- end
124
- end
125
-
126
- #
127
- # Add a signature to this jar given a +key+ and a +cert+. +cert+ should be
128
- # an instance of OpenSSL::X509::Certificate and +key+ is expected to be an
129
- # instance of one of OpenSSL::PKey::DSA or OpenSSL::PKey::RSA.
130
- #
131
- # This method aims to create signature files compatible with the jarsigner
132
- # tool destributed with the JDK and any JVM should accept the resulting
133
- # jar.
134
- #
135
- # === Signature contents
136
- # Modifies the META-INF/MANIFEST.MF entry adding SHA1-Digest attributes in
137
- # each Name section. The signature consists of two files, a .SF and a .DSA
138
- # (or .RSA if signing with an RSA key). The .SF file is similar to the
139
- # manifest with Name sections but the SHA1-Digest is not optional. The
140
- # difference is in what gets hashed for the SHA1-Digest line -- in the
141
- # manifest, it is the file's contents, in the .SF, it is the file's section
142
- # in the manifest (including trailing newline!). The .DSA/.RSA file is a
143
- # PKCS7 signature of the .SF file contents.
144
- #
145
- # === Links
146
- # A short description of the format:
147
- # http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Signed%20JAR%20File
148
- #
149
- # Some info on importing a private key into a keystore which is not
150
- # directly supported by keytool for some unfathomable reason
151
- # http://www.agentbob.info/agentbob/79-AB.html
152
- #
153
- def sign(key, cert, ca_certs=nil)
154
- m = self.entries.find { |e| e.name == "META-INF/MANIFEST.MF" }
155
- raise RuntimeError.new("Jar has no manifest") unless m
156
-
157
- ca_certs ||= [ cert ]
158
-
159
- new_manifest = ''
160
- sigdata = "Signature-Version: 1.0\r\n"
161
- sigdata << "Created-By: 1.6.0_18 (Sun Microsystems Inc.)\r\n"
162
- sigdata << "\r\n"
163
-
164
- # Grab the sections of the manifest
165
- files = m.data.split(/\r?\n\r?\n/)
166
- if files[0] =~ /Manifest-Version/
167
- # keep the header as is
168
- new_manifest << files[0]
169
- new_manifest << "\r\n\r\n"
170
- files = files[1,files.length]
171
- end
172
-
173
- # The file sections should now look like this:
174
- # "Name: metasploit/Payload.class\r\nSHA1-Digest: KbAIMttBcLp1zCewA2ERYkcnRU8=\r\n\r\n"
175
- files.each do |f|
176
- next unless f =~ /Name: (.*)/
177
- name = $1
178
- e = self.entries.find { |e| e.name == name }
179
- if e
180
- digest = OpenSSL::Digest::SHA1.digest(e.data)
181
- manifest_section = "Name: #{name}\r\n"
182
- manifest_section << "SHA1-Digest: #{[digest].pack('m').strip}\r\n"
183
- manifest_section << "\r\n"
184
-
185
- manifest_digest = OpenSSL::Digest::SHA1.digest(manifest_section)
186
-
187
- sigdata << "Name: #{name}\r\n"
188
- sigdata << "SHA1-Digest: #{[manifest_digest].pack('m')}\r\n"
189
- new_manifest << manifest_section
190
- end
191
- end
192
-
193
- # Now overwrite with the new manifest
194
- m.data = new_manifest
195
-
196
- flags = 0
197
- flags |= OpenSSL::PKCS7::BINARY
198
- flags |= OpenSSL::PKCS7::DETACHED
199
- # SMIME and ATTRs are technically valid in the signature but they
200
- # both screw up the java verifier, so don't include them.
201
- flags |= OpenSSL::PKCS7::NOSMIMECAP
202
- flags |= OpenSSL::PKCS7::NOATTR
203
-
204
- signature = OpenSSL::PKCS7.sign(cert, key, sigdata, ca_certs, flags)
205
- sigalg = case key
206
- when OpenSSL::PKey::RSA; "RSA"
207
- when OpenSSL::PKey::DSA; "DSA"
208
- # Don't really know what to do if it's not DSA or RSA. Can
209
- # OpenSSL::PKCS7 actually sign stuff with it in that case?
210
- # Regardless, the java spec says signatures can only be RSA,
211
- # DSA, or PGP, so just assume it's PGP and hope for the best
212
- else; "PGP"
213
- end
214
-
215
- # SIGNFILE is the default name in documentation. MYKEY is probably
216
- # more common, though because that's what keytool defaults to. We
217
- # can probably randomize this with no ill effects.
218
- add_file("META-INF/SIGNFILE.SF", sigdata)
219
- add_file("META-INF/SIGNFILE.#{sigalg}", signature.to_der)
220
-
221
- return true
222
- end
17
+ attr_accessor :manifest
18
+ # @!attribute [rw] substitutions
19
+ # The substitutions to apply when randomizing. Randomization is designed to
20
+ # be used in packages and/or classes names.
21
+ #
22
+ # @return [Hash]
23
+ attr_accessor :substitutions
24
+
25
+ def initialize
26
+ @substitutions = {}
27
+ super
28
+ end
29
+
30
+ #
31
+ # Create a MANIFEST.MF file based on the current Archive#entries.
32
+ #
33
+ # See http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html for
34
+ # some explanation of the format.
35
+ #
36
+ # Example MANIFEST.MF
37
+ # Manifest-Version: 1.0
38
+ # Main-Class: metasploit.Payload
39
+ #
40
+ # Name: metasploit.dat
41
+ # SHA1-Digest: WJ7cUVYUryLKfQFmH80/ADfKmwM=
42
+ #
43
+ # Name: metasploit/Payload.class
44
+ # SHA1-Digest: KbAIMttBcLp1zCewA2ERYkcnRU8=
45
+ #
46
+ # The SHA1-Digest lines are optional unless the jar is signed (see #sign).
47
+ #
48
+ def build_manifest(opts={})
49
+ main_class = (opts[:main_class] ? randomize(opts[:main_class]) : nil)
50
+ app_name = (opts[:app_name] ? randomize(opts[:main_class]) : nil)
51
+ existing_manifest = nil
52
+
53
+ @manifest = "Manifest-Version: 1.0\r\n"
54
+ @manifest << "Main-Class: #{main_class}\r\n" if main_class
55
+ @manifest << "Application-Name: #{app_name}\r\n" if app_name
56
+ @manifest << "Permissions: all-permissions\r\n"
57
+ @manifest << "\r\n"
58
+ @entries.each { |e|
59
+ next if e.name =~ %r|/$|
60
+ if e.name == "META-INF/MANIFEST.MF"
61
+ existing_manifest = e
62
+ next
63
+ end
64
+ #next unless e.name =~ /\.class$/
65
+ @manifest << "Name: #{e.name}\r\n"
66
+ #@manifest << "SHA1-Digest: #{Digest::SHA1.base64digest(e.data)}\r\n"
67
+ @manifest << "\r\n"
68
+ }
69
+ if existing_manifest
70
+ existing_manifest.data = @manifest
71
+ else
72
+ add_file("META-INF/", '')
73
+ add_file("META-INF/MANIFEST.MF", @manifest)
74
+ end
75
+ end
76
+
77
+ def to_s
78
+ pack
79
+ end
80
+
81
+ #
82
+ # Length of the *compressed* blob
83
+ #
84
+ def length
85
+ pack.length
86
+ end
87
+
88
+ #
89
+ # Add multiple files from an array
90
+ #
91
+ # +files+ should be structured like so:
92
+ # [
93
+ # [ "path", "to", "file1" ],
94
+ # [ "path", "to", "file2" ]
95
+ # ]
96
+ # and +path+ should be the location on the file system to find the files to
97
+ # add. +base_dir+ will be prepended to the path inside the jar.
98
+ #
99
+ # Example:
100
+ # war = Rex::Zip::Jar.new
101
+ # war.add_file("WEB-INF/", '')
102
+ # war.add_file("WEB-INF/web.xml", web_xml)
103
+ # war.add_file("WEB-INF/classes/", '')
104
+ # files = [
105
+ # [ "servlet", "examples", "HelloWorld.class" ],
106
+ # [ "Foo.class" ],
107
+ # [ "servlet", "Bar.class" ],
108
+ # ]
109
+ # war.add_files(files, "./class_files/", "WEB-INF/classes/")
110
+ #
111
+ # The above code would create a jar with the following structure from files
112
+ # found in ./class_files/ :
113
+ #
114
+ # +- WEB-INF/
115
+ # +- web.xml
116
+ # +- classes/
117
+ # +- Foo.class
118
+ # +- servlet/
119
+ # +- Bar.class
120
+ # +- examples/
121
+ # +- HelloWorld.class
122
+ #
123
+ def add_files(files, path, base_dir="")
124
+ files.each do |file|
125
+ # Add all of the subdirectories if they don't already exist
126
+ 1.upto(file.length - 1) do |idx|
127
+ full = base_dir + file[0,idx].join("/") + "/"
128
+ if !(entries.map{|e|e.name}.include?(full))
129
+ add_file(full, '')
130
+ end
131
+ end
132
+ # Now add the actual file, grabbing data from the filesystem
133
+ fd = File.open(File.join( path, file ), "rb")
134
+ data = fd.read(fd.stat.size)
135
+ fd.close
136
+ add_file(base_dir + file.join("/"), data)
137
+ end
138
+ end
139
+
140
+ #
141
+ # Add a signature to this jar given a +key+ and a +cert+. +cert+ should be
142
+ # an instance of OpenSSL::X509::Certificate and +key+ is expected to be an
143
+ # instance of one of OpenSSL::PKey::DSA or OpenSSL::PKey::RSA.
144
+ #
145
+ # This method aims to create signature files compatible with the jarsigner
146
+ # tool destributed with the JDK and any JVM should accept the resulting
147
+ # jar.
148
+ #
149
+ # === Signature contents
150
+ # Modifies the META-INF/MANIFEST.MF entry adding SHA1-Digest attributes in
151
+ # each Name section. The signature consists of two files, a .SF and a .DSA
152
+ # (or .RSA if signing with an RSA key). The .SF file is similar to the
153
+ # manifest with Name sections but the SHA1-Digest is not optional. The
154
+ # difference is in what gets hashed for the SHA1-Digest line -- in the
155
+ # manifest, it is the file's contents, in the .SF, it is the file's section
156
+ # in the manifest (including trailing newline!). The .DSA/.RSA file is a
157
+ # PKCS7 signature of the .SF file contents.
158
+ #
159
+ # === Links
160
+ # A short description of the format:
161
+ # http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Signed%20JAR%20File
162
+ #
163
+ # Some info on importing a private key into a keystore which is not
164
+ # directly supported by keytool for some unfathomable reason
165
+ # http://www.agentbob.info/agentbob/79-AB.html
166
+ #
167
+ def sign(key, cert, ca_certs=nil)
168
+ m = self.entries.find { |e| e.name == "META-INF/MANIFEST.MF" }
169
+ raise RuntimeError.new("Jar has no manifest") unless m
170
+
171
+ ca_certs ||= [ cert ]
172
+
173
+ new_manifest = ''
174
+ sigdata = "Signature-Version: 1.0\r\n"
175
+ sigdata << "Created-By: 1.6.0_18 (Sun Microsystems Inc.)\r\n"
176
+ sigdata << "\r\n"
177
+
178
+ # Grab the sections of the manifest
179
+ files = m.data.split(/\r?\n\r?\n/)
180
+ if files[0] =~ /Manifest-Version/
181
+ # keep the header as is
182
+ new_manifest << files[0]
183
+ new_manifest << "\r\n\r\n"
184
+ files = files[1,files.length]
185
+ end
186
+
187
+ # The file sections should now look like this:
188
+ # "Name: metasploit/Payload.class\r\nSHA1-Digest: KbAIMttBcLp1zCewA2ERYkcnRU8=\r\n\r\n"
189
+ files.each do |f|
190
+ next unless f =~ /Name: (.*)/
191
+ name = $1
192
+ e = self.entries.find { |e| e.name == name }
193
+ if e
194
+ digest = OpenSSL::Digest::SHA1.digest(e.data)
195
+ manifest_section = "Name: #{name}\r\n"
196
+ manifest_section << "SHA1-Digest: #{[digest].pack('m').strip}\r\n"
197
+ manifest_section << "\r\n"
198
+
199
+ manifest_digest = OpenSSL::Digest::SHA1.digest(manifest_section)
200
+
201
+ sigdata << "Name: #{name}\r\n"
202
+ sigdata << "SHA1-Digest: #{[manifest_digest].pack('m')}\r\n"
203
+ new_manifest << manifest_section
204
+ end
205
+ end
206
+
207
+ # Now overwrite with the new manifest
208
+ m.data = new_manifest
209
+
210
+ flags = 0
211
+ flags |= OpenSSL::PKCS7::BINARY
212
+ flags |= OpenSSL::PKCS7::DETACHED
213
+ # SMIME and ATTRs are technically valid in the signature but they
214
+ # both screw up the java verifier, so don't include them.
215
+ flags |= OpenSSL::PKCS7::NOSMIMECAP
216
+ flags |= OpenSSL::PKCS7::NOATTR
217
+
218
+ signature = OpenSSL::PKCS7.sign(cert, key, sigdata, ca_certs, flags)
219
+ sigalg = case key
220
+ when OpenSSL::PKey::RSA; "RSA"
221
+ when OpenSSL::PKey::DSA; "DSA"
222
+ # Don't really know what to do if it's not DSA or RSA. Can
223
+ # OpenSSL::PKCS7 actually sign stuff with it in that case?
224
+ # Regardless, the java spec says signatures can only be RSA,
225
+ # DSA, or PGP, so just assume it's PGP and hope for the best
226
+ else; "PGP"
227
+ end
228
+
229
+ # SIGNFILE is the default name in documentation. MYKEY is probably
230
+ # more common, though because that's what keytool defaults to. We
231
+ # can probably randomize this with no ill effects.
232
+ add_file("META-INF/SIGNFILE.SF", sigdata)
233
+ add_file("META-INF/SIGNFILE.#{sigalg}", signature.to_der)
234
+
235
+ return true
236
+ end
237
+
238
+ # Adds a file to the JAR, randomizing the file name
239
+ # and the contents.
240
+ #
241
+ # @see Rex::Zip::Archive#add_file
242
+ def add_file(fname, fdata=nil, xtra=nil, comment=nil)
243
+ super(randomize(fname), randomize(fdata), xtra, comment)
244
+ end
245
+
246
+ # Adds a substitution to have into account when randomizing. Substitutions
247
+ # must be added immediately after {#initialize}.
248
+ #
249
+ # @param str [String] String to substitute. It's designed to randomize
250
+ # class and/or package names.
251
+ # @param bad [String] String containing bad characters to avoid when
252
+ # applying substitutions.
253
+ # @return [String] The substitution which will be used when randomizing.
254
+ def add_sub(str, bad = '')
255
+ if @substitutions.key?(str)
256
+ return @substitutions[str]
257
+ end
258
+
259
+ @substitutions[str] = Rex::Text.rand_text_alpha(str.length, bad)
260
+ end
261
+
262
+ # Randomizes an input by applying the `substitutions` available.
263
+ #
264
+ # @param str [String] String to randomize.
265
+ # @return [String] The input `str` with all the possible `substitutions`
266
+ # applied.
267
+ def randomize(str)
268
+ return str if str.nil?
269
+
270
+ random = str
271
+
272
+ @substitutions.each do |orig, subs|
273
+ random = str.gsub(orig, subs)
274
+ end
275
+
276
+ random
277
+ end
223
278
 
224
279
  end
225
280