dstruct 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +23 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -0
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +326 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. metadata +536 -0
@@ -0,0 +1,3 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/proto/ntp/constants'
3
+ require 'rex/proto/ntp/modes'
@@ -0,0 +1,12 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Proto
4
+ module NTP
5
+ VERSIONS = (0..7).to_a
6
+ MODES = (0..7).to_a
7
+ MODE_6_OPERATIONS = (0..31).to_a
8
+ MODE_7_IMPLEMENTATIONS = (0..255).to_a
9
+ MODE_7_REQUEST_CODES = (0..255).to_a
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,130 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'bit-struct'
4
+
5
+ module Rex
6
+ module Proto
7
+ module NTP
8
+
9
+ # A very generic NTP message
10
+ #
11
+ # Uses the common/similar parts from versions 1-4 and considers everything
12
+ # after to be just one big field. For the particulars on the different versions,
13
+ # see:
14
+ # http://tools.ietf.org/html/rfc958#appendix-B
15
+ # http://tools.ietf.org/html/rfc1059#appendix-B
16
+ # pages 45/48 of http://tools.ietf.org/pdf/rfc1119.pdf
17
+ # http://tools.ietf.org/html/rfc1305#appendix-D
18
+ # http://tools.ietf.org/html/rfc5905#page-19
19
+ class NTPGeneric < BitStruct
20
+ # 0 1 2 3
21
+ # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
22
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
23
+ # |LI | VN | mode| Stratum | Poll | Precision |
24
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
25
+ unsigned :li, 2, default: 0
26
+ unsigned :version, 3, default: 0
27
+ unsigned :mode, 3, default: 0
28
+ unsigned :stratum, 8, default: 0
29
+ unsigned :poll, 8, default: 0
30
+ unsigned :precision, 8, default: 0
31
+ rest :payload
32
+ end
33
+
34
+ # An NTP control message. Control messages are only specified for NTP
35
+ # versions 2-4, but this is a fuzzer so why not try them all...
36
+ class NTPControl < BitStruct
37
+ # 0 1 2 3
38
+ # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
39
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40
+ # |00 | VN | 6 |R E M| op | Sequence |
41
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42
+ # | status | association id |
43
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44
+ # | offset | count |
45
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46
+ unsigned :reserved, 2, default: 0
47
+ unsigned :version, 3, default: 0
48
+ unsigned :mode, 3, default: 6
49
+ unsigned :response, 1, default: 0
50
+ unsigned :error, 1, default: 0
51
+ unsigned :more, 1, default: 0
52
+ unsigned :operation, 5, default: 0
53
+ unsigned :sequence, 16, default: 0
54
+ unsigned :status, 16, default: 0
55
+ unsigned :association_id, 16, default: 0
56
+ # TODO: there *must* be bugs in the handling of these next two fields!
57
+ unsigned :payload_offset, 16, default: 0
58
+ unsigned :payload_size, 16, default: 0
59
+ rest :payload
60
+ end
61
+
62
+ # An NTP "private" message. Private messages are only specified for NTP
63
+ # versions 2-4, but this is a fuzzer so why not try them all...
64
+ class NTPPrivate < BitStruct
65
+ # 0 1 2 3
66
+ # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
67
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68
+ # |R M| VN | 7 |A| Sequence | Implementation| Req code |
69
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70
+ # | err | Number of data items | MBZ | Size of data item |
71
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72
+ unsigned :response, 1, default: 0
73
+ unsigned :more, 1, default: 0
74
+ unsigned :version, 3, default: 0
75
+ unsigned :mode, 3, default: 7
76
+ unsigned :auth, 1, default: 0
77
+ unsigned :sequence, 7, default: 0
78
+ unsigned :implementation, 8, default: 0
79
+ unsigned :request_code, 8, default: 0
80
+ unsigned :error, 4, default: 0
81
+ unsigned :record_count, 12, default: 0
82
+ unsigned :mbz, 4, default: 0
83
+ unsigned :record_size, 12, default: 0
84
+ rest :payload
85
+
86
+ def records
87
+ records = []
88
+ 1.upto(record_count) do |record_num|
89
+ records << payload[record_size*(record_num-1), record_size]
90
+ end
91
+ records
92
+ end
93
+ end
94
+
95
+ def self.ntp_control(version, operation, payload = nil)
96
+ n = NTPControl.new
97
+ n.version = version
98
+ n.operation = operation
99
+ if payload
100
+ n.payload_offset = 0
101
+ n.payload_size = payload.size
102
+ n.payload = payload
103
+ end
104
+ n
105
+ end
106
+
107
+ def self.ntp_private(version, implementation, request_code, payload = nil)
108
+ n = NTPPrivate.new
109
+ n.version = version
110
+ n.implementation = implementation
111
+ n.request_code = request_code
112
+ n.payload = payload if payload
113
+ n
114
+ end
115
+
116
+ def self.ntp_generic(version, mode)
117
+ n = NTPGeneric.new
118
+ n.version = version
119
+ n.mode = mode
120
+ n
121
+ end
122
+
123
+ # Parses the given message and provides a description about the NTP message inside
124
+ def self.describe(message)
125
+ ntp = NTPGeneric.new(message)
126
+ "#{message.size}-byte version #{ntp.version} mode #{ntp.mode} reply"
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,31 @@
1
+ # -*- coding: binary -*-
2
+ # https://en.wikipedia.org/wiki/Printer_Job_Language
3
+ # See external links for PJL spec
4
+
5
+ module Rex::Proto::PJL
6
+
7
+ require "rex/proto/pjl/client"
8
+
9
+ DEFAULT_PORT = 9100
10
+ DEFAULT_TIMEOUT = 5
11
+
12
+ COUNT_MAX = 2_147_483_647
13
+ SIZE_MAX = 2_147_483_647
14
+
15
+ UEL = "\e%-12345X" # Universal Exit Language
16
+ PREFIX = "@PJL"
17
+
18
+ module Info
19
+ ID = "#{PREFIX} INFO ID"
20
+ STATUS = "#{PREFIX} INFO STATUS"
21
+ VARIABLES = "#{PREFIX} INFO VARIABLES"
22
+ FILESYS = "#{PREFIX} INFO FILESYS"
23
+ end
24
+
25
+ RDYMSG = "#{PREFIX} RDYMSG"
26
+
27
+ FSINIT = "#{PREFIX} FSINIT"
28
+ FSDIRLIST = "#{PREFIX} FSDIRLIST"
29
+ FSUPLOAD = "#{PREFIX} FSUPLOAD"
30
+
31
+ end
@@ -0,0 +1,163 @@
1
+ # -*- coding: binary -*-
2
+ # https://en.wikipedia.org/wiki/Printer_Job_Language
3
+ # See external links for PJL spec
4
+
5
+ module Rex::Proto::PJL
6
+ class Client
7
+
8
+ attr_reader :sock
9
+
10
+ def initialize(sock)
11
+ @sock = sock
12
+ end
13
+
14
+ # Begin a PJL job
15
+ #
16
+ # @return [void]
17
+ def begin_job
18
+ @sock.put("#{UEL}#{PREFIX}\n")
19
+ end
20
+
21
+ # End a PJL job
22
+ #
23
+ # @return [void]
24
+ def end_job
25
+ @sock.put(UEL)
26
+ end
27
+
28
+ # Send an INFO request and read the response
29
+ #
30
+ # @param category [String] INFO category
31
+ # @return [String] INFO response
32
+ def info(category)
33
+ categories = {
34
+ :id => Info::ID,
35
+ :status => Info::STATUS,
36
+ :variables => Info::VARIABLES,
37
+ :filesys => Info::FILESYS
38
+ }
39
+
40
+ unless categories.has_key?(category)
41
+ raise ArgumentError, "Unknown INFO category"
42
+ end
43
+
44
+ @sock.put("#{categories[category]}\n")
45
+ @sock.get(DEFAULT_TIMEOUT)
46
+ end
47
+
48
+ # Get version information
49
+ #
50
+ # @return [String] Version information
51
+ def info_id
52
+ id = nil
53
+
54
+ if info(:id) =~ /"(.*?)"/m
55
+ id = $1
56
+ end
57
+
58
+ id
59
+ end
60
+
61
+ # Get environment variables
62
+ #
63
+ # @return [String] Environment variables
64
+ def info_variables
65
+ env_vars = nil
66
+
67
+ if info(:variables) =~ /#{Info::VARIABLES}\r?\n(.*?)\f/m
68
+ env_vars = $1
69
+ end
70
+
71
+ env_vars
72
+ end
73
+
74
+ # List volumes
75
+ #
76
+ # @return [String] Volume listing
77
+ def info_filesys
78
+ filesys = nil
79
+
80
+ if info(:filesys) =~ /\[\d+ TABLE\]\r?\n(.*?)\f/m
81
+ filesys = $1
82
+ end
83
+
84
+ filesys
85
+ end
86
+
87
+ # Get the ready message
88
+ #
89
+ # @return [String] Ready message
90
+ def get_rdymsg
91
+ rdymsg = nil
92
+
93
+ if info(:status) =~ /DISPLAY="(.*?)"/m
94
+ rdymsg = $1
95
+ end
96
+
97
+ rdymsg
98
+ end
99
+
100
+ # Set the ready message
101
+ #
102
+ # @param message [String] Ready message
103
+ # @return [void]
104
+ def set_rdymsg(message)
105
+ @sock.put(%Q{#{RDYMSG} DISPLAY = "#{message}"\n})
106
+ end
107
+
108
+ # Initialize a volume
109
+ #
110
+ # @param volume [String] Volume
111
+ # @return [void]
112
+ def fsinit(volume)
113
+ if volume !~ /^[0-2]:$/
114
+ raise ArgumentError, "Volume must be 0:, 1:, or 2:"
115
+ end
116
+
117
+ @sock.put(%Q{#{FSINIT} VOLUME = "#{volume}"\n})
118
+ end
119
+
120
+ # List a directory
121
+ #
122
+ # @param pathname [String] Pathname
123
+ # @param count [Fixnum] Number of entries to list
124
+ # @return [String] Directory listing
125
+ def fsdirlist(pathname, count = COUNT_MAX)
126
+ if pathname !~ /^[0-2]:/
127
+ raise ArgumentError, "Pathname must begin with 0:, 1:, or 2:"
128
+ end
129
+
130
+ listing = nil
131
+
132
+ @sock.put(%Q{#{FSDIRLIST} NAME = "#{pathname}" ENTRY=1 COUNT=#{count}\n})
133
+
134
+ if @sock.get(DEFAULT_TIMEOUT) =~ /ENTRY=1\r?\n(.*?)\f/m
135
+ listing = $1
136
+ end
137
+
138
+ listing
139
+ end
140
+
141
+ # Download a file
142
+ #
143
+ # @param pathname [String] Pathname
144
+ # @param size [Fixnum] Size of file
145
+ # @return [String] File as a string
146
+ def fsupload(pathname, size = SIZE_MAX)
147
+ if pathname !~ /^[0-2]:/
148
+ raise ArgumentError, "Pathname must begin with 0:, 1:, or 2:"
149
+ end
150
+
151
+ file = nil
152
+
153
+ @sock.put(%Q{#{FSUPLOAD} NAME = "#{pathname}" OFFSET=0 SIZE=#{size}\n})
154
+
155
+ if @sock.get(DEFAULT_TIMEOUT) =~ /SIZE=\d+\r?\n(.*)\f/m
156
+ file = $1
157
+ end
158
+
159
+ file
160
+ end
161
+
162
+ end
163
+ end
@@ -0,0 +1,441 @@
1
+ # -*- coding: binary -*-
2
+ #
3
+ # sf - Sept 2010
4
+ #
5
+ require 'thread'
6
+ require 'rex/logging'
7
+ require 'rex/socket'
8
+
9
+ module Rex
10
+ module Proto
11
+ module Proxy
12
+
13
+ #
14
+ # A Socks4a proxy server.
15
+ #
16
+ class Socks4a
17
+
18
+ #
19
+ # A client connected to the Socks4a server.
20
+ #
21
+ class Client
22
+
23
+ REQUEST_VERSION = 4
24
+ REPLY_VERSION = 0
25
+
26
+ COMMAND_CONNECT = 1
27
+ COMMAND_BIND = 2
28
+
29
+ REQUEST_GRANTED = 90
30
+ REQUEST_REJECT_FAILED = 91
31
+ REQUEST_REJECT_CONNECT = 92
32
+ REQUEST_REJECT_USERID = 93
33
+
34
+ HOST = 1
35
+ PORT = 2
36
+
37
+ #
38
+ # A Socks4a packet.
39
+ #
40
+ class Packet
41
+
42
+ def initialize
43
+ @version = REQUEST_VERSION
44
+ @command = 0
45
+ @dest_port = 0
46
+ @dest_ip = '0.0.0.0'
47
+ @userid = ''
48
+ end
49
+
50
+ #
51
+ # A helper function to recv in a Socks4a packet byte by byte.
52
+ #
53
+ # sf: we could just call raw = sock.get_once but some clients
54
+ # seem to need reading this byte by byte instead.
55
+ #
56
+ def Packet.recv( sock, timeout=30 )
57
+ raw = ''
58
+ # read in the 8 byte header
59
+ while( raw.length < 8 )
60
+ raw << sock.read( 1 )
61
+ end
62
+ # if its a request there will be more data
63
+ if( raw[0..0].unpack( 'C' ).first == REQUEST_VERSION )
64
+ # read in the userid
65
+ while( raw[8..raw.length].index( "\x00" ) == nil )
66
+ raw << sock.read( 1 )
67
+ end
68
+ # if a hostname is going to be present, read it in
69
+ ip = raw[4..7].unpack( 'N' ).first
70
+ if( ( ip & 0xFFFFFF00 ) == 0x00000000 and ( ip & 0x000000FF ) != 0x00 )
71
+ hostname = ''
72
+ while( hostname.index( "\x00" ) == nil )
73
+ hostname += sock.read( 1 )
74
+ end
75
+ raw << hostname
76
+ end
77
+ end
78
+ # create a packet from this raw data...
79
+ packet = Packet.new
80
+ packet.from_r( raw ) ? packet : nil
81
+ end
82
+
83
+ #
84
+ # Pack a packet into raw bytes for transmitting on the wire.
85
+ #
86
+ def to_r
87
+ raw = [ @version, @command, @dest_port, Rex::Socket.addr_atoi( @dest_ip ) ].pack( 'CCnN' )
88
+ return raw if( @userid.empty? )
89
+ return raw + [ @userid ].pack( 'Z*' )
90
+ end
91
+
92
+ #
93
+ # Unpack a raw packet into its components.
94
+ #
95
+ def from_r( raw )
96
+ return false if( raw.length < 8 )
97
+ @version = raw[0..0].unpack( 'C' ).first
98
+ return false if( @version != REQUEST_VERSION and @version != REPLY_VERSION )
99
+ @command = raw[1..1].unpack( 'C' ).first
100
+ @dest_port = raw[2..3].unpack( 'n' ).first
101
+ @dest_ip = Rex::Socket.addr_itoa( raw[4..7].unpack( 'N' ).first )
102
+ if( raw.length > 8 )
103
+ @userid = raw[8..raw.length].unpack( 'Z*' ).first
104
+ # if this is a socks4a request we can resolve the provided hostname
105
+ if( self.is_hostname? )
106
+ hostname = raw[(8+@userid.length+1)..raw.length].unpack( 'Z*' ).first
107
+ @dest_ip = self.resolve( hostname )
108
+ # fail if we couldnt resolve the hostname
109
+ return false if( not @dest_ip )
110
+ end
111
+ else
112
+ @userid = ''
113
+ end
114
+ return true
115
+ end
116
+
117
+ def is_connect?
118
+ @command == COMMAND_CONNECT ? true : false
119
+ end
120
+
121
+ def is_bind?
122
+ @command == COMMAND_BIND ? true : false
123
+ end
124
+
125
+ attr_accessor :version, :command, :dest_port, :dest_ip, :userid
126
+
127
+ protected
128
+
129
+ #
130
+ # Resolve the given hostname into a dotted IP address.
131
+ #
132
+ def resolve( hostname )
133
+ if( not hostname.empty? )
134
+ begin
135
+ return Rex::Socket.addr_itoa( Rex::Socket.gethostbyname( hostname )[3].unpack( 'N' ).first )
136
+ rescue ::SocketError
137
+ return nil
138
+ end
139
+ end
140
+ return nil
141
+ end
142
+
143
+ #
144
+ # As per the Socks4a spec, check to see if the provided dest_ip is 0.0.0.XX
145
+ # which indicates after the @userid field contains a hostname to resolve.
146
+ #
147
+ def is_hostname?
148
+ ip = Rex::Socket.addr_atoi( @dest_ip )
149
+ if( ip & 0xFFFFFF00 == 0x00000000 )
150
+ return true if( ip & 0x000000FF != 0x00 )
151
+ end
152
+ return false
153
+ end
154
+
155
+ end
156
+
157
+ #
158
+ # A mixin for a socket to perform a relay to another socket.
159
+ #
160
+ module Relay
161
+
162
+ #
163
+ # Relay data coming in from relay_sock to this socket.
164
+ #
165
+ def relay( relay_client, relay_sock )
166
+ @relay_client = relay_client
167
+ @relay_sock = relay_sock
168
+ # start the relay thread (modified from Rex::IO::StreamAbstraction)
169
+ @relay_thread = Rex::ThreadFactory.spawn("SOCKS4AProxyServerRelay", false) do
170
+ loop do
171
+ closed = false
172
+ buf = nil
173
+
174
+ begin
175
+ s = Rex::ThreadSafe.select( [ @relay_sock ], nil, nil, 0.2 )
176
+ if( s == nil || s[0] == nil )
177
+ next
178
+ end
179
+ rescue
180
+ closed = true
181
+ end
182
+
183
+ if( closed == false )
184
+ begin
185
+ buf = @relay_sock.sysread( 32768 )
186
+ closed = true if( buf == nil )
187
+ rescue
188
+ closed = true
189
+ end
190
+ end
191
+
192
+ if( closed == false )
193
+ total_sent = 0
194
+ total_length = buf.length
195
+ while( total_sent < total_length )
196
+ begin
197
+ data = buf[total_sent, buf.length]
198
+ sent = self.write( data )
199
+ if( sent > 0 )
200
+ total_sent += sent
201
+ end
202
+ rescue
203
+ closed = true
204
+ break
205
+ end
206
+ end
207
+ end
208
+
209
+ if( closed )
210
+ @relay_client.stop
211
+ ::Thread.exit
212
+ end
213
+ end
214
+ end
215
+
216
+ end
217
+
218
+ end
219
+
220
+ #
221
+ # Create a new client connected to the server.
222
+ #
223
+ def initialize( server, sock )
224
+ @server = server
225
+ @lsock = sock
226
+ @rsock = nil
227
+ @client_thread = nil
228
+ @mutex = ::Mutex.new
229
+ end
230
+
231
+ #
232
+ # Start handling the client connection.
233
+ #
234
+ def start
235
+ # create a thread to handle this client request so as to not block the socks4a server
236
+ @client_thread = Rex::ThreadFactory.spawn("SOCKS4AProxyClient", false) do
237
+ begin
238
+ @server.add_client( self )
239
+ # get the initial client request packet
240
+ request = Packet.recv( @lsock )
241
+ raise "Invalid Socks4 request packet received." if not request
242
+ # handle the request
243
+ begin
244
+ # handle socks4a conenct requests
245
+ if( request.is_connect? )
246
+ # perform the connection request
247
+ params = {
248
+ 'PeerHost' => request.dest_ip,
249
+ 'PeerPort' => request.dest_port,
250
+ }
251
+ params['Context'] = @server.opts['Context'] if @server.opts.has_key?('Context')
252
+
253
+ @rsock = Rex::Socket::Tcp.create( params )
254
+ # and send back success to the client
255
+ response = Packet.new
256
+ response.version = REPLY_VERSION
257
+ response.command = REQUEST_GRANTED
258
+ @lsock.put( response.to_r )
259
+ # handle socks4a bind requests
260
+ elsif( request.is_bind? )
261
+ # create a server socket for this request
262
+ params = {
263
+ 'LocalHost' => '0.0.0.0',
264
+ 'LocalPort' => 0,
265
+ }
266
+ params['Context'] = @server.opts['Context'] if @server.opts.has_key?('Context')
267
+ bsock = Rex::Socket::TcpServer.create( params )
268
+ # send back the bind success to the client
269
+ response = Packet.new
270
+ response.version = REPLY_VERSION
271
+ response.command = REQUEST_GRANTED
272
+ response.dest_ip = '0.0.0.0'
273
+ response.dest_port = bsock.getlocalname()[PORT]
274
+ @lsock.put( response.to_r )
275
+ # accept a client connection (2 minute timeout as per spec)
276
+ begin
277
+ ::Timeout.timeout( 120 ) do
278
+ @rsock = bsock.accept
279
+ end
280
+ rescue ::Timeout::Error
281
+ raise "Timeout reached on accept request."
282
+ end
283
+ # close the listening socket
284
+ bsock.close
285
+ # verify the connection is from the dest_ip origionally specified by the client
286
+ rpeer = @rsock.getpeername
287
+ raise "Got connection from an invalid peer." if( rpeer[HOST] != request.dest_ip )
288
+ # send back the client connect success to the client
289
+ #
290
+ # sf: according to the spec we send this response back to the client, however
291
+ # I have seen some clients who bawk if they get this second response.
292
+ #
293
+ response = Packet.new
294
+ response.version = REPLY_VERSION
295
+ response.command = REQUEST_GRANTED
296
+ response.dest_ip = rpeer[HOST]
297
+ response.dest_port = rpeer[PORT]
298
+ @lsock.put( response.to_r )
299
+ else
300
+ raise "Unknown request command received #{request.command} received."
301
+ end
302
+ rescue
303
+ # send back failure to the client
304
+ response = Packet.new
305
+ response.version = REPLY_VERSION
306
+ response.command = REQUEST_REJECT_FAILED
307
+ @lsock.put( response.to_r )
308
+ # raise an exception to close this client connection
309
+ raise "Failed to handle the clients request."
310
+ end
311
+ # setup the two way relay for full duplex io
312
+ @lsock.extend( Relay )
313
+ @rsock.extend( Relay )
314
+ # start the socket relays...
315
+ @lsock.relay( self, @rsock )
316
+ @rsock.relay( self, @lsock )
317
+ rescue
318
+ wlog( "Client.start - #{$!}" )
319
+ self.stop
320
+ end
321
+ end
322
+ end
323
+
324
+ #
325
+ # Stop handling the client connection.
326
+ #
327
+ def stop
328
+ @mutex.synchronize do
329
+ if( not @closed )
330
+
331
+ begin
332
+ @lsock.close if @lsock
333
+ rescue
334
+ end
335
+
336
+ begin
337
+ @rsock.close if @rsock
338
+ rescue
339
+ end
340
+
341
+ @client_thread.kill if( @client_thread and @client_thread.alive? )
342
+
343
+ @server.remove_client( self )
344
+
345
+ @closed = true
346
+ end
347
+ end
348
+ end
349
+
350
+ end
351
+
352
+ #
353
+ # Create a new Socks4a server.
354
+ #
355
+ def initialize( opts={} )
356
+ @opts = { 'ServerHost' => '0.0.0.0', 'ServerPort' => 1080 }
357
+ @opts = @opts.merge( opts )
358
+ @server = nil
359
+ @clients = ::Array.new
360
+ @running = false
361
+ @server_thread = nil
362
+ end
363
+
364
+ #
365
+ # Check if the server is running.
366
+ #
367
+ def is_running?
368
+ return @running
369
+ end
370
+
371
+ #
372
+ # Start the Socks4a server.
373
+ #
374
+ def start
375
+ begin
376
+ # create the servers main socket (ignore the context here because we don't want a remote bind)
377
+ @server = Rex::Socket::TcpServer.create( 'LocalHost' => @opts['ServerHost'], 'LocalPort' => @opts['ServerPort'] )
378
+ # signal we are now running
379
+ @running = true
380
+ # start the servers main thread to pick up new clients
381
+ @server_thread = Rex::ThreadFactory.spawn("SOCKS4AProxyServer", false) do
382
+ while( @running ) do
383
+ begin
384
+ # accept the client connection
385
+ sock = @server.accept
386
+ # and fire off a new client instance to handle it
387
+ Client.new( self, sock ).start
388
+ rescue
389
+ wlog( "Socks4a.start - server_thread - #{$!}" )
390
+ end
391
+ end
392
+ end
393
+ rescue
394
+ wlog( "Socks4a.start - #{$!}" )
395
+ return false
396
+ end
397
+ return true
398
+ end
399
+
400
+ #
401
+ # Block while the server is running.
402
+ #
403
+ def join
404
+ @server_thread.join if @server_thread
405
+ end
406
+
407
+ #
408
+ # Stop the Socks4a server.
409
+ #
410
+ def stop
411
+ if( @running )
412
+ # signal we are no longer running
413
+ @running = false
414
+ # stop any clients we have (create a new client array as client.stop will delete from @clients)
415
+ clients = []
416
+ clients.concat( @clients )
417
+ clients.each do | client |
418
+ client.stop
419
+ end
420
+ # close the server socket
421
+ @server.close if @server
422
+ # if the server thread did not terminate gracefully, kill it.
423
+ @server_thread.kill if( @server_thread and @server_thread.alive? )
424
+ end
425
+ return !@running
426
+ end
427
+
428
+ def add_client( client )
429
+ @clients << client
430
+ end
431
+
432
+ def remove_client( client )
433
+ @clients.delete( client )
434
+ end
435
+
436
+ attr_reader :opts
437
+
438
+ end
439
+
440
+ end; end; end
441
+