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
@@ -0,0 +1,88 @@
1
+
2
+ module Rex
3
+ module Proto
4
+ module IPMI
5
+
6
+ class Channel_Auth_Reply < BitStruct
7
+ unsigned :rmcp_version, 8, "RMCP Version"
8
+ unsigned :rmcp_padding, 8, "RMCP Padding"
9
+ unsigned :rmcp_sequence, 8, "RMCP Sequence"
10
+ unsigned :rmcp_mtype, 1, "RMCP Message Type"
11
+ unsigned :rmcp_class, 7, "RMCP Message Class"
12
+
13
+ unsigned :session_auth_type, 8, "Session Auth Type"
14
+ unsigned :session_sequence, 32, "Session Sequence Number"
15
+ unsigned :session_id, 32, "Session ID"
16
+ unsigned :message_length, 8, "Message Length"
17
+
18
+ unsigned :ipmi_tgt_address, 8, "IPMI Target Address"
19
+ unsigned :ipmi_tgt_lun, 8, "IPMI Target LUN"
20
+ unsigned :ipmi_header_checksum, 8, "IPMI Header Checksum"
21
+ unsigned :ipmi_src_address, 8, "IPMI Source Address"
22
+ unsigned :ipmi_src_lun, 8, "IPMI Source LUN"
23
+ unsigned :ipmi_command, 8, "IPMI Command"
24
+ unsigned :ipmi_completion_code, 8, "IPMI Completion Code"
25
+
26
+ unsigned :ipmi_channel, 8, "IPMI Channel"
27
+
28
+ unsigned :ipmi_compat_20, 1, "IPMI Version Compatibility: IPMI 2.0+"
29
+ unsigned :ipmi_compat_reserved1, 1, "IPMI Version Compatibility: Reserved 1"
30
+ unsigned :ipmi_compat_oem_auth, 1, "IPMI Version Compatibility: OEM Authentication"
31
+ unsigned :ipmi_compat_password, 1, "IPMI Version Compatibility: Straight Password"
32
+ unsigned :ipmi_compat_reserved2, 1, "IPMI Version Compatibility: Reserved 2"
33
+ unsigned :ipmi_compat_md5, 1, "IPMI Version Compatibility: MD5"
34
+ unsigned :ipmi_compat_md2, 1, "IPMI Version Compatibility: MD2"
35
+ unsigned :ipmi_compat_none, 1, "IPMI Version Compatibility: None"
36
+
37
+ unsigned :ipmi_user_reserved1, 2, "IPMI User Compatibility: Reserved 1"
38
+ unsigned :ipmi_user_kg, 1, "IPMI User Compatibility: KG Set to Default"
39
+ unsigned :ipmi_user_disable_message_auth, 1, "IPMI User Compatibility: Disable Per-Message Authentication"
40
+ unsigned :ipmi_user_disable_user_auth, 1, "IPMI User Compatibility: Disable User-Level Authentication"
41
+ unsigned :ipmi_user_non_null, 1, "IPMI User Compatibility: Non-Null Usernames Enabled"
42
+ unsigned :ipmi_user_null, 1, "IPMI User Compatibility: Null Usernames Enabled"
43
+ unsigned :ipmi_user_anonymous, 1, "IPMI User Compatibility: Anonymous Login Enabled"
44
+
45
+ unsigned :ipmi_conn_reserved1, 6, "IPMI Connection Compatibility: Reserved 1"
46
+ unsigned :ipmi_conn_20, 1, "IPMI Connection Compatibility: 2.0"
47
+ unsigned :ipmi_conn_15, 1, "IPMI Connection Compatibility: 1.5"
48
+
49
+ unsigned :ipmi_oem_id, 24, "IPMI OEM ID", :endian => 'little'
50
+
51
+ rest :ipm_oem_data, "IPMI OEM Data + Checksum Byte"
52
+
53
+
54
+ def to_banner
55
+ info = self
56
+ banner = "#{(info.ipmi_compat_20 == 1) ? "IPMI-2.0" : "IPMI-1.5"} "
57
+
58
+ pass_info = []
59
+ pass_info << "oem_auth" if info.ipmi_compat_oem_auth == 1
60
+ pass_info << "password" if info.ipmi_compat_password == 1
61
+ pass_info << "md5" if info.ipmi_compat_md5 == 1
62
+ pass_info << "md2" if info.ipmi_compat_md2 == 1
63
+ pass_info << "null" if info.ipmi_compat_none == 1
64
+
65
+ user_info = []
66
+ user_info << "kg_default" if (info.ipmi_compat_20 == 1 and info.ipmi_user_kg == 1)
67
+ user_info << "auth_msg" unless info.ipmi_user_disable_message_auth == 1
68
+ user_info << "auth_user" unless info.ipmi_user_disable_user_auth == 1
69
+ user_info << "non_null_user" if info.ipmi_user_non_null == 1
70
+ user_info << "null_user" if info.ipmi_user_null == 1
71
+ user_info << "anonymous_user" if info.ipmi_user_anonymous == 1
72
+
73
+ conn_info = []
74
+ conn_info << "1.5" if info.ipmi_conn_15 == 1
75
+ conn_info << "2.0" if info.ipmi_conn_20 == 1
76
+
77
+ if info.ipmi_oem_id != 0
78
+ banner << "OEMID:#{info.ipmi_oem_id} "
79
+ end
80
+
81
+ banner << "UserAuth(#{user_info.join(", ")}) PassAuth(#{pass_info.join(", ")}) Level(#{conn_info.join(", ")}) "
82
+ banner
83
+ end
84
+ end
85
+
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,35 @@
1
+
2
+ module Rex
3
+ module Proto
4
+ module IPMI
5
+
6
+ class Open_Session_Reply < BitStruct
7
+ unsigned :rmcp_version, 8, "RMCP Version"
8
+ unsigned :rmcp_padding, 8, "RMCP Padding"
9
+ unsigned :rmcp_sequence, 8, "RMCP Sequence"
10
+ unsigned :rmcp_mtype, 1, "RMCP Message Type"
11
+ unsigned :rmcp_class, 7, "RMCP Message Class"
12
+
13
+ unsigned :session_auth_type, 8, "Authentication Type"
14
+
15
+ unsigned :session_payload_encrypted, 1, "Session Payload Encrypted"
16
+ unsigned :session_payload_authenticated, 1, "Session Payload Authenticated"
17
+ unsigned :session_payload_type, 6, "Session Payload Type", :endian => 'little'
18
+
19
+ unsigned :session_id, 32, "Session ID"
20
+ unsigned :session_sequence, 32, "Session Sequence Number"
21
+ unsigned :message_length, 16, "Message Length", :endian => "little"
22
+
23
+ unsigned :ignored1, 8, "Ignored"
24
+ unsigned :error_code, 8, "RMCP Error Code"
25
+ unsigned :ignored2, 16, "Ignored"
26
+ char :console_session_id, 32, "Console Session ID"
27
+ char :bmc_session_id, 32, "BMC Session ID"
28
+
29
+ rest :stuff, "The Rest of the Stuff"
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,35 @@
1
+
2
+ module Rex
3
+ module Proto
4
+ module IPMI
5
+
6
+ class RAKP2 < BitStruct
7
+ unsigned :rmcp_version, 8, "RMCP Version"
8
+ unsigned :rmcp_padding, 8, "RMCP Padding"
9
+ unsigned :rmcp_sequence, 8, "RMCP Sequence"
10
+ unsigned :rmcp_mtype, 1, "RMCP Message Type"
11
+ unsigned :rmcp_class, 7, "RMCP Message Class"
12
+
13
+ unsigned :session_auth_type, 8, "Authentication Type"
14
+
15
+ unsigned :session_payload_encrypted, 1, "Session Payload Encrypted"
16
+ unsigned :session_payload_authenticated, 1, "Session Payload Authenticated"
17
+ unsigned :session_payload_type, 6, "Session Payload Type", :endian => 'little'
18
+
19
+ unsigned :session_id, 32, "Session ID"
20
+ unsigned :session_sequence, 32, "Session Sequence Number"
21
+ unsigned :message_length, 16, "Message Length", :endian => "little"
22
+
23
+ unsigned :ignored1, 8, "Ignored"
24
+ unsigned :error_code, 8, "RMCP Error Code"
25
+ unsigned :ignored2, 16, "Ignored"
26
+ char :console_session_id, 32, "Console Session ID"
27
+ char :bmc_random_id, 128, "BMC Random ID"
28
+ char :bmc_guid, 128, "RAKP2 Hash 2 (nulls)"
29
+ char :hmac_sha1, 160, "HMAC_SHA1 Output"
30
+ rest :stuff, "The rest of the stuff"
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,125 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module IPMI
6
+ class Utils
7
+
8
+ def self.checksum(data)
9
+ sum = 0
10
+ data.unpack("C*").each {|c| sum += c }
11
+ sum = ~sum + 1
12
+ sum & 0xff
13
+ end
14
+
15
+ def self.create_ipmi_getchannel_probe
16
+ [ # Get Channel Authentication Capabilities
17
+ 0x06, 0x00, 0xff, 0x07, # RMCP Header
18
+ 0x00, 0x00, 0x00, 0x00,
19
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x20, 0x18,
20
+ 0xc8, 0x81, 0x00, 0x38, 0x8e, 0x04, 0xb5
21
+ ].pack("C*")
22
+ end
23
+
24
+ # open rmcpplus_request
25
+ def self.create_ipmi_session_open_request(console_session_id)
26
+ head = [
27
+ 0x06, 0x00, 0xff, 0x07, # RMCP Header
28
+ 0x06, # RMCP+ Authentication Type
29
+ PAYLOAD_RMCPPLUSOPEN_REQ, # Payload Type
30
+ 0x00, 0x00, 0x00, 0x00, # Session ID
31
+ 0x00, 0x00, 0x00, 0x00 # Sequence Number
32
+ ].pack("C*")
33
+
34
+ data =
35
+ [ # Maximum access
36
+ 0x00, 0x00,
37
+ # Reserved
38
+ 0x00, 0x00
39
+ ].pack("C*") +
40
+ console_session_id +
41
+ [
42
+ 0x00, 0x00, 0x00, 0x08,
43
+ 0x01, 0x00, 0x00, 0x00,
44
+ 0x01, 0x00, 0x00, 0x08,
45
+ # HMAC-SHA1
46
+ 0x01, 0x00, 0x00, 0x00,
47
+ 0x02, 0x00, 0x00, 0x08,
48
+ # AES Encryption
49
+ 0x01, 0x00, 0x00, 0x00
50
+ ].pack("C*")
51
+
52
+ head + [data.length].pack('v') + data
53
+ end
54
+
55
+
56
+ # open rmcpplus_request with cipherzero
57
+ def self.create_ipmi_session_open_cipher_zero_request(console_session_id)
58
+ head = [
59
+ 0x06, 0x00, 0xff, 0x07, # RMCP Header
60
+ 0x06, # RMCP+ Authentication Type
61
+ PAYLOAD_RMCPPLUSOPEN_REQ, # Payload Type
62
+ 0x00, 0x00, 0x00, 0x00, # Session ID
63
+ 0x00, 0x00, 0x00, 0x00 # Sequence Number
64
+ ].pack("C*")
65
+
66
+ data =
67
+ [ # Maximum access
68
+ 0x00, 0x00,
69
+ # Reserved
70
+ 0x00, 0x00
71
+ ].pack("C*") +
72
+ console_session_id +
73
+ [
74
+ 0x00, 0x00, 0x00, 0x08,
75
+ # Cipher 0
76
+ 0x00, 0x00, 0x00, 0x00,
77
+ 0x01, 0x00, 0x00, 0x08,
78
+ # Cipher 0
79
+ 0x00, 0x00, 0x00, 0x00,
80
+ 0x02, 0x00, 0x00, 0x08,
81
+ # No Encryption
82
+ 0x00, 0x00, 0x00, 0x00
83
+ ].pack("C*")
84
+
85
+ head + [data.length].pack('v') + data
86
+ end
87
+
88
+ def self.create_ipmi_rakp_1(bmc_session_id, console_random_id, username)
89
+ [
90
+ 0x06, 0x00, 0xff, 0x07, # RMCP Header
91
+ 0x06, # RMCP+ Authentication Type
92
+ PAYLOAD_RAKP1, # Payload Type
93
+ 0x00, 0x00,
94
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
95
+ 0x00, 0x00, 0x00, 0x00
96
+ ].pack("C*") +
97
+ bmc_session_id +
98
+ console_random_id +
99
+ [
100
+ 0x14, 0x00, 0x00,
101
+ username.length
102
+ ].pack("C*") +
103
+ username
104
+ end
105
+
106
+
107
+ def self.create_rakp_hmac_sha1_salt(con_sid, bmc_sid, con_rid, bmc_rid, bmc_gid, auth_level, username)
108
+ con_sid +
109
+ bmc_sid +
110
+ con_rid +
111
+ bmc_rid +
112
+ bmc_gid +
113
+ [ auth_level ].pack("C") +
114
+ [ username.length ].pack("C") +
115
+ username
116
+ end
117
+
118
+ def self.verify_rakp_hmac_sha1(salt, hash, password)
119
+ OpenSSL::HMAC.digest('sha1', password, salt) == hash
120
+ end
121
+
122
+ end
123
+ end
124
+ end
125
+ end
@@ -1,11 +1,7 @@
1
1
  # -*- coding: binary -*-
2
- ##
3
- #
4
2
  # NAT-PMP protocol support
5
3
  #
6
- # by Jon Hart <jhart@spoofed.org>
7
- #
8
- ##
4
+ # @author Jon Hart <jhart@spoofed.org>
9
5
 
10
6
  require 'rex/proto/natpmp/constants'
11
7
  require 'rex/proto/natpmp/packet'
@@ -10,10 +10,10 @@
10
10
  module Rex
11
11
  module Proto
12
12
  module NATPMP
13
- DefaultPort = 5351
14
- Version = 0
15
- TCP = 2
16
- UDP = 1
13
+ DefaultPort = 5351
14
+ Version = 0
15
+ TCP = 2
16
+ UDP = 1
17
17
  end
18
18
  end
19
19
  end
@@ -11,34 +11,34 @@ module Rex
11
11
  module Proto
12
12
  module NATPMP
13
13
 
14
- # Return a NAT-PMP request to get the external address.
15
- def self.external_address_request
16
- [ 0, 0 ].pack('nn')
17
- end
14
+ # Return a NAT-PMP request to get the external address.
15
+ def self.external_address_request
16
+ [ 0, 0 ].pack('nn')
17
+ end
18
18
 
19
- # Parse a NAT-PMP external address response +resp+.
20
- # Returns the decoded parts of the response as an array.
21
- def self.parse_external_address_response(resp)
22
- (ver, op, result, epoch, addr) = resp.unpack("CCSLN")
23
- [ ver, op, result, epoch, Rex::Socket::addr_itoa(addr) ]
24
- end
19
+ # Parse a NAT-PMP external address response +resp+.
20
+ # Returns the decoded parts of the response as an array.
21
+ def self.parse_external_address_response(resp)
22
+ (ver, op, result, epoch, addr) = resp.unpack("CCSLN")
23
+ [ ver, op, result, epoch, Rex::Socket::addr_itoa(addr) ]
24
+ end
25
25
 
26
- # Return a NAT-PMP request to map remote port +rport+/+protocol+ to local port +lport+ for +lifetime+ ms
27
- def self.map_port_request(lport, rport, protocol, lifetime)
28
- [ Rex::Proto::NATPMP::Version, # version
29
- protocol, # opcode, which is now the protocol we are asking to forward
30
- 0, # reserved
31
- lport,
32
- rport,
33
- lifetime
34
- ].pack("ccnnnN")
35
- end
26
+ # Return a NAT-PMP request to map remote port +rport+/+protocol+ to local port +lport+ for +lifetime+ ms
27
+ def self.map_port_request(lport, rport, protocol, lifetime)
28
+ [ Rex::Proto::NATPMP::Version, # version
29
+ protocol, # opcode, which is now the protocol we are asking to forward
30
+ 0, # reserved
31
+ lport,
32
+ rport,
33
+ lifetime
34
+ ].pack("ccnnnN")
35
+ end
36
36
 
37
- # Parse a NAT-PMP mapping response +resp+.
38
- # Returns the decoded parts as an array.
39
- def self.parse_map_port_response(resp)
40
- resp.unpack("CCSLnnN")
41
- end
37
+ # Parse a NAT-PMP mapping response +resp+.
38
+ # Returns the decoded parts as an array.
39
+ def self.parse_map_port_response(resp)
40
+ resp.unpack("CCSLnnN")
41
+ end
42
42
  end
43
43
 
44
44
  end
@@ -40,287 +40,287 @@
40
40
  # The latter has a minor bug in its separate_keys function.
41
41
  # The third key has to begin from the 14th character of the
42
42
  # input string instead of 13th:)
43
- #--
44
- # $Id: ntlm.rb 11678 2011-01-30 19:26:35Z hdm $
45
- #++
46
-
47
- #this class defines the base type needed for other modules like message and crypt
48
43
 
49
44
  require 'rex/proto/ntlm/constants'
50
45
 
51
46
  module Rex
52
47
  module Proto
53
48
  module NTLM
49
+ # The base type needed for other modules like message and crypt
54
50
  class Base
55
51
 
56
52
  CONST = Rex::Proto::NTLM::Constants
57
53
 
58
- # base classes for primitives
59
- class Field
60
- attr_accessor :active, :value
61
-
62
- def initialize(opts)
63
- @value = opts[:value]
64
- @active = opts[:active].nil? ? true : opts[:active]
65
- end
66
-
67
- def size
68
- @active ? @size : 0
69
- end
70
- end
71
-
72
- class String < Field
73
- def initialize(opts)
74
- super(opts)
75
- @size = opts[:size]
76
- end
77
-
78
- def parse(str, offset=0)
79
- if @active and str.size >= offset + @size
80
- @value = str[offset, @size]
81
- @size
82
- else
83
- 0
84
- end
85
- end
86
-
87
- def serialize
88
- if @active
89
- @value
90
- else
91
- ""
92
- end
93
- end
94
-
95
- def value=(val)
96
- @value = val
97
- @size = @value.nil? ? 0 : @value.size
98
- @active = (@size > 0)
99
- end
100
- end
101
-
102
- class Int16LE < Field
103
- def initialize(opt)
104
- super(opt)
105
- @size = 2
106
- end
107
-
108
- def parse(str, offset=0)
109
- if @active and str.size >= offset + @size
110
- @value = str[offset, @size].unpack("v")[0]
111
- @size
112
- else
113
- 0
114
- end
115
- end
116
-
117
- def serialize
118
- [@value].pack("v")
119
- end
120
- end
121
-
122
- class Int32LE < Field
123
- def initialize(opt)
124
- super(opt)
125
- @size = 4
126
- end
127
-
128
- def parse(str, offset=0)
129
- if @active and str.size >= offset + @size
130
- @value = str.slice(offset, @size).unpack("V")[0]
131
- @size
132
- else
133
- 0
134
- end
135
- end
136
-
137
- def serialize
138
- [@value].pack("V") if @active
139
- end
140
- end
141
-
142
- class Int64LE < Field
143
- def initialize(opt)
144
- super(opt)
145
- @size = 8
146
- end
147
-
148
- def parse(str, offset=0)
149
- if @active and str.size >= offset + @size
150
- d, u = str.slice(offset, @size).unpack("V2")
151
- @value = (u * 0x100000000 + d)
152
- @size
153
- else
154
- 0
155
- end
156
- end
157
-
158
- def serialize
159
- [@value & 0x00000000ffffffff, @value >> 32].pack("V2") if @active
160
- end
161
- end
162
-
163
- # base class of data structure
164
- class FieldSet
165
- class << FieldSet
166
- def define(&block)
167
- c = Class.new(self)
168
- def c.inherited(subclass)
169
- proto = @proto
170
- subclass.instance_eval {
171
- @proto = proto
172
- }
173
- end
174
- c.module_eval(&block)
175
- c
176
- end
177
-
178
- def string(name, opts)
179
- add_field(name, String, opts)
180
- end
181
-
182
- def int16LE(name, opts)
183
- add_field(name, Int16LE, opts)
184
- end
185
-
186
- def int32LE(name, opts)
187
- add_field(name, Int32LE, opts)
188
- end
189
-
190
- def int64LE(name, opts)
191
- add_field(name, Int64LE, opts)
192
- end
193
-
194
- def security_buffer(name, opts)
195
- add_field(name, SecurityBuffer, opts)
196
- end
197
-
198
- def prototypes
199
- @proto
200
- end
201
-
202
- def names
203
- @proto.map{|n, t, o| n}
204
- end
205
-
206
- def types
207
- @proto.map{|n, t, o| t}
208
- end
209
-
210
- def opts
211
- @proto.map{|n, t, o| o}
212
- end
213
-
214
- private
215
-
216
- def add_field(name, type, opts)
217
- (@proto ||= []).push [name, type, opts]
218
- define_accessor name
219
- end
220
-
221
- def define_accessor(name)
222
- module_eval(<<-End, __FILE__, __LINE__ + 1)
223
- def #{name}
224
- self['#{name}'].value
225
- end
226
-
227
- def #{name}=(val)
228
- self['#{name}'].value = val
229
- end
230
- End
231
- end
232
- end #self
233
-
234
- def initialize
235
- @alist = self.class.prototypes.map{ |n, t, o| [n, t.new(o)] }
236
- end
237
-
238
- def serialize
239
- @alist.map{|n, f| f.serialize }.join
240
- end
241
-
242
- def parse(str, offset=0)
243
- @alist.inject(offset){|cur, a| cur += a[1].parse(str, cur)}
244
- end
245
-
246
- def size
247
- @alist.inject(0){|sum, a| sum += a[1].size}
248
- end
249
-
250
- def [](name)
251
- a = @alist.assoc(name.to_s.intern)
252
- raise ArgumentError, "no such field: #{name}" unless a
253
- a[1]
254
- end
255
-
256
- def []=(name, val)
257
- a = @alist.assoc(name.to_s.intern)
258
- raise ArgumentError, "no such field: #{name}" unless a
259
- a[1] = val
260
- end
261
-
262
- def enable(name)
263
- self[name].active = true
264
- end
265
-
266
- def disable(name)
267
- self[name].active = false
268
- end
269
- end
270
-
271
- Blob = FieldSet.define {
272
- int32LE :blob_signature, {:value => CONST::BLOB_SIGN}
273
- int32LE :reserved, {:value => 0}
274
- int64LE :timestamp, {:value => 0}
275
- string :challenge, {:value => "", :size => 8}
276
- int32LE :unknown1, {:value => 0}
277
- string :target_info, {:value => "", :size => 0}
278
- int32LE :unknown2, {:value => 0}
279
- }
280
-
281
- SecurityBuffer = FieldSet.define {
282
- int16LE :length, {:value => 0}
283
- int16LE :allocated, {:value => 0}
284
- int32LE :offset, {:value => 0}
285
- }
286
-
287
-
288
- class SecurityBuffer
289
- attr_accessor :active
290
- def initialize(opts)
291
- super()
292
- @value = opts[:value]
293
- @active = opts[:active].nil? ? true : opts[:active]
294
- @size = 8
295
- end
296
-
297
- def parse(str, offset=0)
298
- if @active and str.size >= offset + @size
299
- super(str, offset)
300
- @value = str[self.offset, self.length]
301
- @size
302
- else
303
- 0
304
- end
305
- end
306
-
307
- def serialize
308
- super if @active
309
- end
310
-
311
- def value
312
- @value
313
- end
314
-
315
- def value=(val)
316
- @value = val
317
- self.length = self.allocated = val.size
318
- end
319
-
320
- def data_size
321
- @active ? @value.size : 0
322
- end
323
- end
54
+ # base classes for primitives
55
+ class Field
56
+ attr_accessor :active, :value
57
+
58
+ def initialize(opts)
59
+ @value = opts[:value]
60
+ @active = opts[:active].nil? ? true : opts[:active]
61
+ end
62
+
63
+ def size
64
+ @active ? @size : 0
65
+ end
66
+ end
67
+
68
+ class String < Field
69
+ def initialize(opts)
70
+ super(opts)
71
+ @size = opts[:size]
72
+ end
73
+
74
+ def parse(str, offset=0)
75
+ if @active and str.size >= offset + @size
76
+ @value = str[offset, @size]
77
+ @size
78
+ else
79
+ 0
80
+ end
81
+ end
82
+
83
+ def serialize
84
+ if @active
85
+ @value
86
+ else
87
+ ""
88
+ end
89
+ end
90
+
91
+ def value=(val)
92
+ @value = val
93
+ @size = @value.nil? ? 0 : @value.size
94
+ @active = (@size > 0)
95
+ end
96
+ end
97
+
98
+ class Int16LE < Field
99
+ def initialize(opt)
100
+ super(opt)
101
+ @size = 2
102
+ end
103
+
104
+ def parse(str, offset=0)
105
+ if @active and str.size >= offset + @size
106
+ @value = str[offset, @size].unpack("v")[0]
107
+ @size
108
+ else
109
+ 0
110
+ end
111
+ end
112
+
113
+ def serialize
114
+ [@value].pack("v")
115
+ end
116
+ end
117
+
118
+ class Int32LE < Field
119
+ def initialize(opt)
120
+ super(opt)
121
+ @size = 4
122
+ end
123
+
124
+ def parse(str, offset=0)
125
+ if @active and str.size >= offset + @size
126
+ @value = str.slice(offset, @size).unpack("V")[0]
127
+ @size
128
+ else
129
+ 0
130
+ end
131
+ end
132
+
133
+ def serialize
134
+ [@value].pack("V") if @active
135
+ end
136
+ end
137
+
138
+ class Int64LE < Field
139
+ def initialize(opt)
140
+ super(opt)
141
+ @size = 8
142
+ end
143
+
144
+ def parse(str, offset=0)
145
+ if @active and str.size >= offset + @size
146
+ d, u = str.slice(offset, @size).unpack("V2")
147
+ @value = (u * 0x100000000 + d)
148
+ @size
149
+ else
150
+ 0
151
+ end
152
+ end
153
+
154
+ def serialize
155
+ [@value & 0x00000000ffffffff, @value >> 32].pack("V2") if @active
156
+ end
157
+ end
158
+
159
+ # base class of data structure
160
+ class FieldSet
161
+ class << FieldSet
162
+ def define(&block)
163
+ klass = Class.new(self) do
164
+ def self.inherited(subclass)
165
+ proto = @proto
166
+
167
+ subclass.instance_eval do
168
+ @proto = proto
169
+ end
170
+ end
171
+ end
172
+
173
+ klass.module_eval(&block)
174
+
175
+ klass
176
+ end
177
+
178
+ def string(name, opts)
179
+ add_field(name, String, opts)
180
+ end
181
+
182
+ def int16LE(name, opts)
183
+ add_field(name, Int16LE, opts)
184
+ end
185
+
186
+ def int32LE(name, opts)
187
+ add_field(name, Int32LE, opts)
188
+ end
189
+
190
+ def int64LE(name, opts)
191
+ add_field(name, Int64LE, opts)
192
+ end
193
+
194
+ def security_buffer(name, opts)
195
+ add_field(name, SecurityBuffer, opts)
196
+ end
197
+
198
+ def prototypes
199
+ @proto
200
+ end
201
+
202
+ def names
203
+ @proto.map{|n, t, o| n}
204
+ end
205
+
206
+ def types
207
+ @proto.map{|n, t, o| t}
208
+ end
209
+
210
+ def opts
211
+ @proto.map{|n, t, o| o}
212
+ end
213
+
214
+ private
215
+
216
+ def add_field(name, type, opts)
217
+ (@proto ||= []).push [name, type, opts]
218
+ define_accessor name
219
+ end
220
+
221
+ def define_accessor(name)
222
+ module_eval(<<-End, __FILE__, __LINE__ + 1)
223
+ def #{name}
224
+ self['#{name}'].value
225
+ end
226
+
227
+ def #{name}=(val)
228
+ self['#{name}'].value = val
229
+ end
230
+ End
231
+ end
232
+ end #self
233
+
234
+ def initialize
235
+ @alist = self.class.prototypes.map{ |n, t, o| [n, t.new(o)] }
236
+ end
237
+
238
+ def serialize
239
+ @alist.map{|n, f| f.serialize }.join
240
+ end
241
+
242
+ def parse(str, offset=0)
243
+ @alist.inject(offset){|cur, a| cur += a[1].parse(str, cur)}
244
+ end
245
+
246
+ def size
247
+ @alist.inject(0){|sum, a| sum += a[1].size}
248
+ end
249
+
250
+ def [](name)
251
+ a = @alist.assoc(name.to_s.intern)
252
+ raise ArgumentError, "no such field: #{name}" unless a
253
+ a[1]
254
+ end
255
+
256
+ def []=(name, val)
257
+ a = @alist.assoc(name.to_s.intern)
258
+ raise ArgumentError, "no such field: #{name}" unless a
259
+ a[1] = val
260
+ end
261
+
262
+ def enable(name)
263
+ self[name].active = true
264
+ end
265
+
266
+ def disable(name)
267
+ self[name].active = false
268
+ end
269
+ end
270
+
271
+ Blob = FieldSet.define {
272
+ int32LE :blob_signature, {:value => CONST::BLOB_SIGN}
273
+ int32LE :reserved, {:value => 0}
274
+ int64LE :timestamp, {:value => 0}
275
+ string :challenge, {:value => "", :size => 8}
276
+ int32LE :unknown1, {:value => 0}
277
+ string :target_info, {:value => "", :size => 0}
278
+ int32LE :unknown2, {:value => 0}
279
+ }
280
+
281
+ SecurityBuffer = FieldSet.define {
282
+ int16LE :length, {:value => 0}
283
+ int16LE :allocated, {:value => 0}
284
+ int32LE :offset, {:value => 0}
285
+ }
286
+
287
+
288
+ class SecurityBuffer
289
+ attr_accessor :active
290
+ def initialize(opts)
291
+ super()
292
+ @value = opts[:value]
293
+ @active = opts[:active].nil? ? true : opts[:active]
294
+ @size = 8
295
+ end
296
+
297
+ def parse(str, offset=0)
298
+ if @active and str.size >= offset + @size
299
+ super(str, offset)
300
+ @value = str[self.offset, self.length]
301
+ @size
302
+ else
303
+ 0
304
+ end
305
+ end
306
+
307
+ def serialize
308
+ super if @active
309
+ end
310
+
311
+ def value
312
+ @value
313
+ end
314
+
315
+ def value=(val)
316
+ @value = val
317
+ self.length = self.allocated = val.size
318
+ end
319
+
320
+ def data_size
321
+ @active ? @value.size : 0
322
+ end
323
+ end
324
324
  end
325
325
  end
326
326
  end