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,8 +1,5 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
- # $Id: section.rb 15548 2012-06-29 06:08:20Z rapid7 $
5
-
6
3
  require 'rex/peparsey/exceptions'
7
4
  require 'rex/peparsey/pebase'
8
5
  require 'rex/struct2'
@@ -10,127 +7,121 @@ require 'rex/struct2'
10
7
  module Rex
11
8
  module PeParsey
12
9
  class Section
13
- attr_accessor :_section_header, :_isource
14
- attr_accessor :base_rva
15
-
16
- #
17
- # Initialize a section.
18
- #
19
- # isource - The ImageSource class backing the image
20
- # base_vma - The address of this section base
21
- # section_header - The section header (struct2) although this is not
22
- # required, which is why there is a base_vma. This can be nil.
23
- #
24
- def initialize(isource, base_rva, section_header = nil)
25
- self._isource = isource
26
- self.base_rva = base_rva
27
- self._section_header = section_header
28
- end
29
-
30
- def file_offset
31
- _isource.file_offset
32
- end
33
-
34
- def size
35
- _isource.size
36
- end
37
-
38
- def name
39
- # a section header is not required
40
- return nil if !_section_header
41
-
42
- # FIXME make this better...
43
- _section_header.v['Name'].gsub(/\x00+$/, '')
44
- end
45
-
46
- def flags
47
- # a section header is not required
48
- return nil if !_section_header
49
- _section_header.v['Characteristics']
50
- end
51
-
52
- def vma
53
- # a section header is not required
54
- return nil if !_section_header
55
- _section_header.v['VirtualAddress']
56
- end
57
-
58
- def raw_size
59
- # a section header is not required
60
- return nil if !_section_header
61
- _section_header.v['SizeOfRawData']
62
- end
63
-
64
- def _check_offset(offset, len = 1)
65
- if offset < 0 || offset+len > size
66
- raise BoundsError, "Offset #{offset} outside of section", caller
67
- end
68
- end
69
-
70
- def read(offset, len)
71
- _check_offset(offset, len)
72
- return _isource.read(offset, len)
73
- end
74
-
75
- def read_rva(rva, len)
76
- return read(rva_to_offset(rva), len)
77
- end
78
-
79
- def read_asciiz(offset)
80
- _check_offset(offset)
81
- return _isource.read_asciiz(offset)
82
- end
83
-
84
- def read_asciiz_rva(rva)
85
- return read_asciiz(rva_to_offset(rva))
86
- end
87
-
88
- def index(*args)
89
- _isource.index(*args)
90
- end
91
-
92
- def offset_to_rva(offset)
93
- if !contains_offset?(offset)
94
- raise BoundsError, "Offset #{offset} outside of section", caller
95
- end
96
-
97
- return offset + base_rva
98
- end
99
-
100
- def file_offset_to_rva(foffset)
101
- return offset_to_rva(foffset - file_offset)
102
- end
103
- # if offset < 0 || offset < file_offset || offset >= file_offset+size
104
- # raise BoundsError, "File offset #{offset} outside of section", caller
105
- # end
106
- #
107
- # return (offset - file_offset) + base_rva
108
- # end
109
-
110
- def rva_to_offset(rva)
111
- offset = rva - base_rva
112
- if !contains_offset?(offset)
113
- raise BoundsError, "RVA #{rva} outside of section", caller
114
- end
115
-
116
- return offset
117
- end
118
-
119
- def rva_to_file_offset(rva)
120
- return rva_to_offset(rva) + file_offset
121
- end
122
-
123
- def contains_offset?(offset)
124
- offset >= 0 && offset < size
125
- end
126
-
127
- def contains_file_offset?(foffset)
128
- contains_offset?(foffset - file_offset)
129
- end
130
-
131
- def contains_rva?(rva)
132
- contains_offset?(rva - base_rva)
133
- end
10
+ attr_accessor :_section_header, :_isource
11
+ attr_accessor :base_rva
12
+
13
+ #
14
+ # Initialize a section.
15
+ #
16
+ # isource - The ImageSource class backing the image
17
+ # base_vma - The address of this section base
18
+ # section_header - The section header (struct2) although this is not
19
+ # required, which is why there is a base_vma. This can be nil.
20
+ #
21
+ def initialize(isource, base_rva, section_header = nil)
22
+ self._isource = isource
23
+ self.base_rva = base_rva
24
+ self._section_header = section_header
25
+ end
26
+
27
+ def file_offset
28
+ _isource.file_offset
29
+ end
30
+
31
+ def size
32
+ _isource.size
33
+ end
34
+
35
+ def name
36
+ # a section header is not required
37
+ return nil if !_section_header
38
+
39
+ # FIXME make this better...
40
+ _section_header.v['Name'].gsub(/\x00+$/n, '')
41
+ end
42
+
43
+ def flags
44
+ # a section header is not required
45
+ return nil if !_section_header
46
+ _section_header.v['Characteristics']
47
+ end
48
+
49
+ def vma
50
+ # a section header is not required
51
+ return nil if !_section_header
52
+ _section_header.v['VirtualAddress']
53
+ end
54
+
55
+ def raw_size
56
+ # a section header is not required
57
+ return nil if !_section_header
58
+ _section_header.v['SizeOfRawData']
59
+ end
60
+
61
+ def _check_offset(offset, len = 1)
62
+ if offset < 0 || offset+len > size
63
+ raise BoundsError, "Offset #{offset} outside of section", caller
64
+ end
65
+ end
66
+
67
+ def read(offset, len)
68
+ _check_offset(offset, len)
69
+ return _isource.read(offset, len)
70
+ end
71
+
72
+ def read_rva(rva, len)
73
+ return read(rva_to_offset(rva), len)
74
+ end
75
+
76
+ def read_asciiz(offset)
77
+ _check_offset(offset)
78
+ return _isource.read_asciiz(offset)
79
+ end
80
+
81
+ def read_asciiz_rva(rva)
82
+ return read_asciiz(rva_to_offset(rva))
83
+ end
84
+
85
+ def index(*args)
86
+ _isource.index(*args)
87
+ end
88
+
89
+ def offset_to_rva(offset)
90
+ if !contains_offset?(offset)
91
+ raise BoundsError, "Offset #{offset} outside of section", caller
92
+ end
93
+
94
+ return offset + base_rva
95
+ end
96
+
97
+ def file_offset_to_rva(foffset)
98
+ return offset_to_rva(foffset - file_offset)
99
+ end
100
+
101
+ def rva_to_offset(rva)
102
+ offset = rva - base_rva
103
+ if !contains_offset?(offset)
104
+ raise BoundsError, "RVA #{rva} outside of section", caller
105
+ end
106
+
107
+ return offset
108
+ end
109
+
110
+ def rva_to_file_offset(rva)
111
+ return rva_to_offset(rva) + file_offset
112
+ end
113
+
114
+ def contains_offset?(offset)
115
+ offset >= 0 && offset < size
116
+ end
117
+
118
+ def contains_file_offset?(foffset)
119
+ contains_offset?(foffset - file_offset)
120
+ end
121
+
122
+ def contains_rva?(rva)
123
+ contains_offset?(rva - base_rva)
124
+ end
134
125
 
135
126
  end
136
127
 
@@ -1,8 +1,5 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
- # $Id: pescan.rb 15548 2012-06-29 06:08:20Z rapid7 $
5
-
6
3
  module Rex
7
4
  module PeScan
8
5
 
@@ -3,360 +3,360 @@ module Rex
3
3
  module PeScan
4
4
  module Analyze
5
5
 
6
- require "rex/ui/text/table"
7
-
8
- class Fingerprint
9
- attr_accessor :pe
10
-
11
- def initialize(pe)
12
- self.pe = pe
13
- end
14
-
15
- def config(param)
16
- @sigs = {}
17
-
18
- name = nil
19
- regx = ''
20
- epon = 0
21
- sidx = 0
22
-
23
- fd = File.open(param['database'], 'rb')
24
- fd.each_line do |line|
25
- case line
26
- when /^\s*#/
27
- next
28
- when /\[\s*(.*)\s*\]/
29
- if (name)
30
- @sigs[ name ] = [regx, epon]
31
- end
32
- name = $1 + " [#{ sidx+=1 }]"
33
- epon = 0
34
- next
35
- when /signature\s*=\s*(.*)/
36
- pat = $1.strip
37
- regx = ''
38
- pat.split(/\s+/).each do |c|
39
- next if c.length != 2
40
- regx << (c.index('?') ? '.' : "\\x#{c}")
41
- end
42
- when /ep_only\s*=\s*(.*)/
43
- epon = ($1 =~ /^T/i) ? 1 : 0
44
- end
45
- end
46
-
47
- if (name and ! @sigs[name])
48
- @sigs[ name ] = [regx, epon]
49
- end
50
-
51
- fd.close
52
- end
53
-
54
- def scan(param)
55
- config(param)
56
-
57
- epa = pe.hdr.opt.AddressOfEntryPoint
58
- buf = pe.read_rva(epa, 256) || ""
59
-
60
- @sigs.each_pair do |name, data|
61
- begin
62
- if (buf.match(Regexp.new('^' + data[0], nil, 'n')))
63
- $stdout.puts param['file'] + ": " + name
64
- end
65
- rescue RegexpError
66
- $stderr.puts "Invalid signature: #{name} #{data[0]}"
67
- end
68
- end
69
- end
70
- end
71
-
72
- class Information
73
- attr_accessor :pe
74
-
75
- def initialize(pe)
76
- self.pe = pe
77
- end
78
-
79
- def add_fields(tbl, obj, fields)
80
- fields.each do |name|
81
- begin
82
- tbl << [name, "0x%.8x" % obj.send(name)]
83
- rescue ::NoMethodError => e
84
- $stderr.puts "Invalid field #{name}"
85
- end
86
- end
87
- end
88
-
89
- def scan(param)
90
-
91
- $stdout.puts "\n\n"
92
-
93
- tbl = table("Image Headers", ['Name', 'Value'])
94
- add_fields(tbl, pe.hdr.file, %W{
95
- Characteristics
96
- SizeOfOptionalHeader
97
- PointerToSymbolTable
98
- TimeDateStamp
99
- NumberOfSections
100
- Machine
101
- })
102
- $stdout.puts tbl.to_s
103
- $stdout.puts "\n\n"
104
-
105
- tbl = table("Optional Image Headers", ['Name', 'Value'])
106
- add_fields(tbl, pe.hdr.opt, %W{
107
- ImageBase
108
- Magic
109
- MajorLinkerVersion
110
- MinorLinkerVersion
111
- SizeOfCode
112
- SizeOfInitializeData
113
- SizeOfUninitializeData
114
- AddressOfEntryPoint
115
- BaseOfCode
116
- BaseOfData
117
- SectionAlignment
118
- FileAlignment
119
- MajorOperatingSystemVersion
120
- MinorOperatingSystemVersion
121
- MajorImageVersion
122
- MinorImageVersion
123
- MajorSubsystemVersion
124
- MinorSubsystemVersion
125
- Win32VersionValue
126
- SizeOfImage
127
- SizeOfHeaders
128
- CheckSum
129
- Subsystem
130
- DllCharacteristics
131
- SizeOfStackReserve
132
- SizeOfStackCommit
133
- SizeOfHeapReserve
134
- SizeOfHeapCommit
135
- LoaderFlags
136
- NumberOfRvaAndSizes
137
- })
138
-
139
- $stdout.puts tbl.to_s
140
- $stdout.puts "\n\n"
141
-
142
- # Get DllCharacteristics (in Integer)
143
- dllcharacteristics = pe.hdr.opt.struct[23].value
144
-
145
- if (dllcharacteristics > 0)
146
- tbl = table("DllCharacteristics", ['Flag', 'Value'])
147
-
148
- # http://msdn.microsoft.com/en-us/library/ms680339(v=vs.85).aspx
149
- traits = {
150
- :ASLR => 'False', #IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
151
- :Integrity => 'False', #IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
152
- :NX => 'False', #IMAGE_DLLCHARACTERISTICS_NX_COMPAT
153
- :Isolation => 'False', #IMAGE_DLLCHARACTERISTICS_NO_ISOLATION
154
- :SEH => 'False', #IMAGE_DLLCHARACTERISTICS_NO_SEH
155
- :Bind => 'False', #IMAGE_DLLCHARACTERISTICS_NO_BIND
156
- :WDM => 'False', #IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
157
- :Terminal => 'False' #IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
158
- }
159
-
160
- # Convert integer to an bit array
161
- c_bits = ("%32d" %dllcharacteristics.to_s(2)).split('').map { |e| e.to_i }.reverse
162
-
163
- # Check characteristics
164
- traits[:ASLR] = 'True' if c_bits[6] == 1 #0x0040
165
- traits[:Integrity] = 'True' if c_bits[7] == 1 #0x0080
166
- traits[:NX] = 'True' if c_bits[8] == 1 #0x0100
167
- traits[:Isolation] = 'True' if c_bits[9] == 1 #0x0200
168
- traits[:SEH] = 'True' if c_bits[10] == 1 #0x0400
169
- traits[:Bind] = 'True' if c_bits[11] == 1 #0x0800
170
- traits[:WDM] = 'True' if c_bits[13] == 1 #2000
171
- traits[:Terminal] = 'True' if c_bits[15] == 1 #0x8000
172
-
173
- # Putting results to table
174
- traits.each do |trait_name, trait_value|
175
- tbl << [trait_name, trait_value]
176
- end
177
-
178
- $stdout.puts tbl.to_s
179
- $stdout.puts "\n\n"
180
- end
181
-
182
- if (pe.exports)
183
- tbl = table("Exported Functions", ['Ordinal', 'Name', 'Address'])
184
- pe.exports.entries.each do |ent|
185
- tbl << [ent.ordinal, ent.name, "0x%.8x" % pe.rva_to_vma(ent.rva)]
186
- end
187
- $stdout.puts tbl.to_s
188
- $stdout.puts "\n\n"
189
- end
190
-
191
- # Rex::PeParsey::Pe doesn't seem to give us any offset information for each function,
192
- # which makes it difficult to calculate the actual addresses for them. So instead we
193
- # are using Metasm::COFF::ImportDirectory to do this task. The ability to see
194
- # addresses is mainly for ROP.
195
- if (pe.imports)
196
- tbl = table("Imported Functions", ['Library', 'Address', 'Ordinal', 'Name'])
197
- exefmt = Metasm::AutoExe.orshellcode{ Metasm.const_get('x86_64').new }
198
- exe = exefmt.decode_file(pe._isource.file.path)
199
- ibase = pe.image_base
200
- exe_imports = exe.imports
201
- exe_imports.each do |lib|
202
- lib_name = lib.libname
203
- ini_offset = lib.iat_p
204
- func_table = lib.imports
205
- offset = 0
206
- func_table.each do |func|
207
- func_addr = "0x%08x" %(ibase + ini_offset + offset)
208
- tbl << [lib_name, func_addr, func.hint, func.name]
209
- offset += 4
210
- end
211
- end
212
-
213
- $stdout.puts tbl.to_s
214
- $stdout.puts "\n\n"
215
- end
216
-
217
- if(pe.config)
218
- tbl = table("Configuration Header", ['Name', 'Value'])
219
- add_fields(tbl, pe.config, %W{
220
- Size
221
- TimeDateStamp
222
- MajorVersion
223
- MinorVersion
224
- GlobalFlagsClear
225
- GlobalFlagsSet
226
- CriticalSectionDefaultTimeout
227
- DeCommitFreeBlockThreshold
228
- DeCommitTotalFreeThreshold
229
- LockPrefixTable
230
- MaximumAllocationSize
231
- VirtualMemoryThreshold
232
- ProcessAffinityMask
233
- ProcessHeapFlags
234
- CSDVersion
235
- Reserved1
236
- EditList
237
- SecurityCookie
238
- SEHandlerTable
239
- SEHandlerCount
240
- })
241
- $stdout.puts tbl.to_s
242
- $stdout.puts "\n\n"
243
- end
244
-
245
-
246
- if(pe.resources)
247
- tbl = table("Resources", ['ID', 'Language', 'Code Page', 'Size', 'Name'])
248
- pe.resources.keys.sort.each do |rkey|
249
- res = pe.resources[rkey]
250
- tbl << [rkey, res.lang, res.code, res.size, res.file]
251
- end
252
- $stdout.puts tbl.to_s
253
- $stdout.puts "\n\n"
254
- end
255
-
256
- tbl = table("Section Header", ["Name", "VirtualAddress", "SizeOfRawData", "Characteristics"])
257
- pe.sections.each do |sec|
258
- tbl << [ sec.name, *[sec.vma, sec.raw_size, sec.flags].map{|x| "0x%.8x" % x} ]
259
- end
260
- $stdout.puts tbl.to_s
261
- $stdout.puts "\n\n"
262
-
263
- end
264
-
265
- def table(name, cols)
266
- Rex::Ui::Text::Table.new(
267
- 'Header' => name,
268
- 'Columns' => cols
269
- )
270
- end
271
- end
272
-
273
-
274
- class Ripper
275
-
276
- require "fileutils"
277
-
278
- attr_accessor :pe
279
-
280
- def initialize(pe)
281
- self.pe = pe
282
- end
283
-
284
- def scan(param)
285
- dest = param['dir']
286
-
287
- if (param['file'])
288
- dest = File.join(dest, File.basename(param['file']))
289
- end
290
-
291
- ::FileUtils.mkdir_p(dest)
292
-
293
- pe.resources.keys.sort.each do |rkey|
294
- res = pe.resources[rkey]
295
- path = File.join(dest, rkey.split('/')[1] + '_' + res.file)
296
-
297
- fd = File.new(path, 'wb')
298
- fd.write(res.data)
299
- fd.close
300
- end
301
- end
302
- end
303
-
304
- class ContextMapDumper
305
-
306
- attr_accessor :pe
307
-
308
- def initialize(pe)
309
- self.pe = pe
310
- end
311
-
312
- def scan(param)
313
- dest = param['dir']
314
- path = ''
315
-
316
- ::FileUtils.mkdir_p(dest)
317
-
318
- if(not (param['dir'] and param['file']))
319
- $stderr.puts "No directory or file specified"
320
- return
321
- end
322
-
323
- if (param['file'])
324
- path = File.join(dest, File.basename(param['file']) + ".map")
325
- end
326
-
327
- fd = File.new(path, "wb")
328
- pe.all_sections.each do |section|
329
-
330
- # Skip over known bad sections
331
- next if section.name == ".data"
332
- next if section.name == ".reloc"
333
-
334
- offset = 0
335
- while offset < section.size
336
- byte = section.read(offset, 1)[0]
337
- if byte != 0
338
- chunkbase = pe.rva_to_vma(section.base_rva) + offset
339
- data = ''
340
- while byte != 0
341
- data << byte
342
- offset += 1
343
- byte = 0
344
- byte = section.read(offset, 1)[0] if offset < section.size
345
- end
346
- buff = nil
347
- buff = [ 0x01, chunkbase, data.length, data].pack("CNNA*") if data.length > 0
348
-
349
- fd.write(buff) if buff
350
- end
351
- offset += 1
352
- end
6
+ require "rex/ui/text/table"
7
+
8
+ class Fingerprint
9
+ attr_accessor :pe
10
+
11
+ def initialize(pe)
12
+ self.pe = pe
13
+ end
14
+
15
+ def config(param)
16
+ @sigs = {}
17
+
18
+ name = nil
19
+ regx = ''
20
+ epon = 0
21
+ sidx = 0
22
+
23
+ fd = File.open(param['database'], 'rb')
24
+ fd.each_line do |line|
25
+ case line
26
+ when /^\s*#/
27
+ next
28
+ when /\[\s*(.*)\s*\]/
29
+ if (name)
30
+ @sigs[ name ] = [regx, epon]
31
+ end
32
+ name = $1 + " [#{ sidx+=1 }]"
33
+ epon = 0
34
+ next
35
+ when /signature\s*=\s*(.*)/
36
+ pat = $1.strip
37
+ regx = ''
38
+ pat.split(/\s+/).each do |c|
39
+ next if c.length != 2
40
+ regx << (c.index('?') ? '.' : "\\x#{c}")
41
+ end
42
+ when /ep_only\s*=\s*(.*)/
43
+ epon = ($1 =~ /^T/i) ? 1 : 0
44
+ end
45
+ end
46
+
47
+ if (name and ! @sigs[name])
48
+ @sigs[ name ] = [regx, epon]
49
+ end
50
+
51
+ fd.close
52
+ end
53
+
54
+ def scan(param)
55
+ config(param)
56
+
57
+ epa = pe.hdr.opt.AddressOfEntryPoint
58
+ buf = pe.read_rva(epa, 256) || ""
59
+
60
+ @sigs.each_pair do |name, data|
61
+ begin
62
+ if (buf.match(Regexp.new('^' + data[0], nil, 'n')))
63
+ $stdout.puts param['file'] + ": " + name
64
+ end
65
+ rescue RegexpError
66
+ $stderr.puts "Invalid signature: #{name} #{data[0]}"
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ class Information
73
+ attr_accessor :pe
74
+
75
+ def initialize(pe)
76
+ self.pe = pe
77
+ end
78
+
79
+ def add_fields(tbl, obj, fields)
80
+ fields.each do |name|
81
+ begin
82
+ tbl << [name, "0x%.8x" % obj.send(name)]
83
+ rescue ::NoMethodError => e
84
+ $stderr.puts "Invalid field #{name}"
85
+ end
86
+ end
87
+ end
88
+
89
+ def scan(param)
90
+
91
+ $stdout.puts "\n\n"
92
+
93
+ tbl = table("Image Headers", ['Name', 'Value'])
94
+ add_fields(tbl, pe.hdr.file, %W{
95
+ Characteristics
96
+ SizeOfOptionalHeader
97
+ PointerToSymbolTable
98
+ TimeDateStamp
99
+ NumberOfSections
100
+ Machine
101
+ })
102
+ $stdout.puts tbl.to_s
103
+ $stdout.puts "\n\n"
104
+
105
+ tbl = table("Optional Image Headers", ['Name', 'Value'])
106
+ add_fields(tbl, pe.hdr.opt, %W{
107
+ ImageBase
108
+ Magic
109
+ MajorLinkerVersion
110
+ MinorLinkerVersion
111
+ SizeOfCode
112
+ SizeOfInitializeData
113
+ SizeOfUninitializeData
114
+ AddressOfEntryPoint
115
+ BaseOfCode
116
+ BaseOfData
117
+ SectionAlignment
118
+ FileAlignment
119
+ MajorOperatingSystemVersion
120
+ MinorOperatingSystemVersion
121
+ MajorImageVersion
122
+ MinorImageVersion
123
+ MajorSubsystemVersion
124
+ MinorSubsystemVersion
125
+ Win32VersionValue
126
+ SizeOfImage
127
+ SizeOfHeaders
128
+ CheckSum
129
+ Subsystem
130
+ DllCharacteristics
131
+ SizeOfStackReserve
132
+ SizeOfStackCommit
133
+ SizeOfHeapReserve
134
+ SizeOfHeapCommit
135
+ LoaderFlags
136
+ NumberOfRvaAndSizes
137
+ })
138
+
139
+ $stdout.puts tbl.to_s
140
+ $stdout.puts "\n\n"
141
+
142
+ # Get DllCharacteristics (in Integer)
143
+ dllcharacteristics = pe.hdr.opt.struct[23].value
144
+
145
+ if (dllcharacteristics > 0)
146
+ tbl = table("DllCharacteristics", ['Flag', 'Value'])
147
+
148
+ # http://msdn.microsoft.com/en-us/library/ms680339(v=vs.85).aspx
149
+ traits = {
150
+ :ASLR => 'False', #IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
151
+ :Integrity => 'False', #IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
152
+ :NX => 'False', #IMAGE_DLLCHARACTERISTICS_NX_COMPAT
153
+ :Isolation => 'False', #IMAGE_DLLCHARACTERISTICS_NO_ISOLATION
154
+ :SEH => 'False', #IMAGE_DLLCHARACTERISTICS_NO_SEH
155
+ :Bind => 'False', #IMAGE_DLLCHARACTERISTICS_NO_BIND
156
+ :WDM => 'False', #IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
157
+ :Terminal => 'False' #IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
158
+ }
159
+
160
+ # Convert integer to an bit array
161
+ c_bits = ("%32d" %dllcharacteristics.to_s(2)).split('').map { |e| e.to_i }.reverse
162
+
163
+ # Check characteristics
164
+ traits[:ASLR] = 'True' if c_bits[6] == 1 #0x0040
165
+ traits[:Integrity] = 'True' if c_bits[7] == 1 #0x0080
166
+ traits[:NX] = 'True' if c_bits[8] == 1 #0x0100
167
+ traits[:Isolation] = 'True' if c_bits[9] == 1 #0x0200
168
+ traits[:SEH] = 'True' if c_bits[10] == 1 #0x0400
169
+ traits[:Bind] = 'True' if c_bits[11] == 1 #0x0800
170
+ traits[:WDM] = 'True' if c_bits[13] == 1 #2000
171
+ traits[:Terminal] = 'True' if c_bits[15] == 1 #0x8000
172
+
173
+ # Putting results to table
174
+ traits.each do |trait_name, trait_value|
175
+ tbl << [trait_name, trait_value]
176
+ end
177
+
178
+ $stdout.puts tbl.to_s
179
+ $stdout.puts "\n\n"
180
+ end
181
+
182
+ if (pe.exports)
183
+ tbl = table("Exported Functions", ['Ordinal', 'Name', 'Address'])
184
+ pe.exports.entries.each do |ent|
185
+ tbl << [ent.ordinal, ent.name, "0x%.8x" % pe.rva_to_vma(ent.rva)]
186
+ end
187
+ $stdout.puts tbl.to_s
188
+ $stdout.puts "\n\n"
189
+ end
190
+
191
+ # Rex::PeParsey::Pe doesn't seem to give us any offset information for each function,
192
+ # which makes it difficult to calculate the actual addresses for them. So instead we
193
+ # are using Metasm::COFF::ImportDirectory to do this task. The ability to see
194
+ # addresses is mainly for ROP.
195
+ if (pe.imports)
196
+ tbl = table("Imported Functions", ['Library', 'Address', 'Ordinal', 'Name'])
197
+ exefmt = Metasm::AutoExe.orshellcode{ Metasm.const_get('x86_64').new }
198
+ exe = exefmt.decode_file(pe._isource.file.path)
199
+ ibase = pe.image_base
200
+ exe_imports = exe.imports
201
+ exe_imports.each do |lib|
202
+ lib_name = lib.libname
203
+ ini_offset = lib.iat_p
204
+ func_table = lib.imports
205
+ offset = 0
206
+ func_table.each do |func|
207
+ func_addr = "0x%08x" %(ibase + ini_offset + offset)
208
+ tbl << [lib_name, func_addr, func.hint, func.name]
209
+ offset += 4
210
+ end
211
+ end
212
+
213
+ $stdout.puts tbl.to_s
214
+ $stdout.puts "\n\n"
215
+ end
216
+
217
+ if(pe.config)
218
+ tbl = table("Configuration Header", ['Name', 'Value'])
219
+ add_fields(tbl, pe.config, %W{
220
+ Size
221
+ TimeDateStamp
222
+ MajorVersion
223
+ MinorVersion
224
+ GlobalFlagsClear
225
+ GlobalFlagsSet
226
+ CriticalSectionDefaultTimeout
227
+ DeCommitFreeBlockThreshold
228
+ DeCommitTotalFreeThreshold
229
+ LockPrefixTable
230
+ MaximumAllocationSize
231
+ VirtualMemoryThreshold
232
+ ProcessAffinityMask
233
+ ProcessHeapFlags
234
+ CSDVersion
235
+ Reserved1
236
+ EditList
237
+ SecurityCookie
238
+ SEHandlerTable
239
+ SEHandlerCount
240
+ })
241
+ $stdout.puts tbl.to_s
242
+ $stdout.puts "\n\n"
243
+ end
244
+
245
+
246
+ if(pe.resources)
247
+ tbl = table("Resources", ['ID', 'Language', 'Code Page', 'Size', 'Name'])
248
+ pe.resources.keys.sort.each do |rkey|
249
+ res = pe.resources[rkey]
250
+ tbl << [rkey, res.lang, res.code, res.size, res.file]
251
+ end
252
+ $stdout.puts tbl.to_s
253
+ $stdout.puts "\n\n"
254
+ end
255
+
256
+ tbl = table("Section Header", ["Name", "VirtualAddress", "SizeOfRawData", "Characteristics"])
257
+ pe.sections.each do |sec|
258
+ tbl << [ sec.name, *[sec.vma, sec.raw_size, sec.flags].map{|x| "0x%.8x" % x} ]
259
+ end
260
+ $stdout.puts tbl.to_s
261
+ $stdout.puts "\n\n"
262
+
263
+ end
264
+
265
+ def table(name, cols)
266
+ Rex::Ui::Text::Table.new(
267
+ 'Header' => name,
268
+ 'Columns' => cols
269
+ )
270
+ end
271
+ end
272
+
273
+
274
+ class Ripper
275
+
276
+ require "fileutils"
277
+
278
+ attr_accessor :pe
279
+
280
+ def initialize(pe)
281
+ self.pe = pe
282
+ end
283
+
284
+ def scan(param)
285
+ dest = param['dir']
286
+
287
+ if (param['file'])
288
+ dest = File.join(dest, File.basename(param['file']))
289
+ end
290
+
291
+ ::FileUtils.mkdir_p(dest)
292
+
293
+ pe.resources.keys.sort.each do |rkey|
294
+ res = pe.resources[rkey]
295
+ path = File.join(dest, rkey.split('/')[1] + '_' + res.file)
296
+
297
+ fd = File.new(path, 'wb')
298
+ fd.write(res.data)
299
+ fd.close
300
+ end
301
+ end
302
+ end
303
+
304
+ class ContextMapDumper
305
+
306
+ attr_accessor :pe
307
+
308
+ def initialize(pe)
309
+ self.pe = pe
310
+ end
311
+
312
+ def scan(param)
313
+ dest = param['dir']
314
+ path = ''
315
+
316
+ ::FileUtils.mkdir_p(dest)
317
+
318
+ if(not (param['dir'] and param['file']))
319
+ $stderr.puts "No directory or file specified"
320
+ return
321
+ end
322
+
323
+ if (param['file'])
324
+ path = File.join(dest, File.basename(param['file']) + ".map")
325
+ end
326
+
327
+ fd = File.new(path, "wb")
328
+ pe.all_sections.each do |section|
329
+
330
+ # Skip over known bad sections
331
+ next if section.name == ".data"
332
+ next if section.name == ".reloc"
333
+
334
+ offset = 0
335
+ while offset < section.size
336
+ byte = section.read(offset, 1)[0]
337
+ if byte != 0
338
+ chunkbase = pe.rva_to_vma(section.base_rva) + offset
339
+ data = ''
340
+ while byte != 0
341
+ data << byte
342
+ offset += 1
343
+ byte = 0
344
+ byte = section.read(offset, 1)[0] if offset < section.size
345
+ end
346
+ buff = nil
347
+ buff = [ 0x01, chunkbase, data.length, data].pack("CNNA*") if data.length > 0
348
+
349
+ fd.write(buff) if buff
350
+ end
351
+ offset += 1
352
+ end
353
353
 
354
- end
354
+ end
355
355
 
356
356
 
357
- fd.close
358
- end
359
- end
357
+ fd.close
358
+ end
359
+ end
360
360
 
361
361
  # EOC
362
362