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,385 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/socket'
3
+ require 'rex/proto/http'
4
+ require 'rex/proto/http/handler'
5
+
6
+ module Rex
7
+ module Proto
8
+ module Http
9
+
10
+ ###
11
+ #
12
+ # Runtime extension of the HTTP clients that connect to the server.
13
+ #
14
+ ###
15
+ module ServerClient
16
+
17
+ #
18
+ # Initialize a new request instance.
19
+ #
20
+ def init_cli(server)
21
+ self.request = Request.new
22
+ self.server = server
23
+ self.keepalive = false
24
+ end
25
+
26
+ #
27
+ # Resets the parsing state.
28
+ #
29
+ def reset_cli
30
+ self.request.reset
31
+ end
32
+
33
+ #
34
+ # Transmits a response and adds the appropriate headers.
35
+ #
36
+ def send_response(response)
37
+ # Set the connection to close or keep-alive depending on what the client
38
+ # can support.
39
+ response['Connection'] = (keepalive) ? 'Keep-Alive' : 'close'
40
+
41
+ # Add any other standard response headers.
42
+ server.add_response_headers(response)
43
+
44
+ # Send it off.
45
+ put(response.to_s)
46
+ end
47
+
48
+ #
49
+ # The current request context.
50
+ #
51
+ attr_accessor :request
52
+ #
53
+ # Boolean that indicates whether or not the connection supports keep-alive.
54
+ #
55
+ attr_accessor :keepalive
56
+ #
57
+ # A reference to the server the client is associated with.
58
+ #
59
+ attr_accessor :server
60
+
61
+ end
62
+
63
+ ###
64
+ #
65
+ # Acts as an HTTP server, processing requests and dispatching them to
66
+ # registered procs. Some of this server was modeled after webrick.
67
+ #
68
+ ###
69
+ class Server
70
+
71
+ include Proto
72
+
73
+ #
74
+ # A hash that associated a file extension with a mime type for use as the
75
+ # content type of responses.
76
+ #
77
+ ExtensionMimeTypes =
78
+ {
79
+ "rhtml" => "text/html",
80
+ "html" => "text/html",
81
+ "htm" => "text/htm",
82
+ "jpg" => "image/jpeg",
83
+ "jpeg" => "image/jpeg",
84
+ "jpeg" => "image/jpeg",
85
+ "gif" => "image/gif",
86
+ "png" => "image/png",
87
+ "bmp" => "image/bmp",
88
+ "txt" => "text/plain",
89
+ "css" => "text/css",
90
+ "ico" => "image/x-icon",
91
+ }
92
+
93
+ #
94
+ # The default server name that will be returned in the Server attribute of
95
+ # a response.
96
+ #
97
+ DefaultServer = "Rex"
98
+
99
+ #
100
+ # Initializes an HTTP server as listening on the provided port and
101
+ # hostname.
102
+ #
103
+ def initialize(port = 80, listen_host = '0.0.0.0', ssl = false, context = {}, comm = nil, ssl_cert = nil, ssl_compression = false)
104
+ self.listen_host = listen_host
105
+ self.listen_port = port
106
+ self.ssl = ssl
107
+ self.context = context
108
+ self.comm = comm
109
+ self.ssl_cert = ssl_cert
110
+ self.ssl_compression = ssl_compression
111
+ self.listener = nil
112
+ self.resources = {}
113
+ self.server_name = DefaultServer
114
+ end
115
+
116
+ # More readable inspect that only shows the url and resources
117
+ # @return [String]
118
+ def inspect
119
+ resources_str = resources.keys.map{|r| r.inspect }.join ", "
120
+
121
+ "#<#{self.class} http#{ssl ? "s" : ""}://#{listen_host}:#{listen_port} [ #{resources_str} ]>"
122
+ end
123
+
124
+ #
125
+ # Returns the hardcore alias for the HTTP service
126
+ #
127
+ def self.hardcore_alias(*args)
128
+ "#{(args[0] || '')}#{(args[1] || '')}"
129
+ end
130
+
131
+ #
132
+ # HTTP server.
133
+ #
134
+ def alias
135
+ super || "HTTP Server"
136
+ end
137
+
138
+ #
139
+ # Listens on the defined port and host and starts monitoring for clients.
140
+ #
141
+ def start
142
+
143
+ self.listener = Rex::Socket::TcpServer.create(
144
+ 'LocalHost' => self.listen_host,
145
+ 'LocalPort' => self.listen_port,
146
+ 'Context' => self.context,
147
+ 'SSL' => self.ssl,
148
+ 'SSLCert' => self.ssl_cert,
149
+ 'SSLCompression' => self.ssl_compression,
150
+ 'Comm' => self.comm
151
+ )
152
+
153
+ # Register callbacks
154
+ self.listener.on_client_connect_proc = Proc.new { |cli|
155
+ on_client_connect(cli)
156
+ }
157
+ self.listener.on_client_data_proc = Proc.new { |cli|
158
+ on_client_data(cli)
159
+ }
160
+
161
+ self.listener.start
162
+ end
163
+
164
+ #
165
+ # Terminates the monitor thread and turns off the listener.
166
+ #
167
+ def stop
168
+ self.listener.stop
169
+ self.listener.close
170
+ end
171
+
172
+
173
+ #
174
+ # Waits for the HTTP service to terminate
175
+ #
176
+ def wait
177
+ self.listener.wait if self.listener
178
+ end
179
+
180
+ #
181
+ # Closes the supplied client, if valid.
182
+ #
183
+ def close_client(cli)
184
+ listener.close_client(cli)
185
+ end
186
+
187
+ #
188
+ # Mounts a directory or resource as being serviced by the supplied handler.
189
+ #
190
+ def mount(root, handler, long_call = false, *args)
191
+ resources[root] = [ handler, long_call, args ]
192
+ end
193
+
194
+ #
195
+ # Remove the mount point.
196
+ #
197
+ def unmount(root)
198
+ resources.delete(root)
199
+ end
200
+
201
+ #
202
+ # Adds a resource handler, such as one for /, which will be called whenever
203
+ # the resource is requested. The ``opts'' parameter can have any of the
204
+ # following:
205
+ #
206
+ # Proc (proc) - The procedure to call when a request comes in for this resource.
207
+ # LongCall (bool) - Hints to the server that this resource may have long
208
+ # request processing times.
209
+ #
210
+ def add_resource(name, opts)
211
+ if (resources[name])
212
+ raise RuntimeError,
213
+ "The supplied resource '#{name}' is already added.", caller
214
+ end
215
+
216
+ # If a procedure was passed, mount the resource with it.
217
+ if (opts['Proc'])
218
+ mount(name, Handler::Proc, false, opts['Proc'], opts['VirtualDirectory'])
219
+ else
220
+ raise ArgumentError, "You must specify a procedure."
221
+ end
222
+ end
223
+
224
+ #
225
+ # Removes the supplied resource handler.
226
+ #
227
+ def remove_resource(name)
228
+ self.resources.delete(name)
229
+ end
230
+
231
+ #
232
+ # Adds Server headers and stuff.
233
+ #
234
+ def add_response_headers(resp)
235
+ resp['Server'] = self.server_name if not resp['Server']
236
+ end
237
+
238
+ #
239
+ # Returns the mime type associated with the supplied file. Right now the
240
+ # set of mime types is fairly limited.
241
+ #
242
+ def mime_type(file)
243
+ type = nil
244
+
245
+ if (file =~ /\.(.+?)$/)
246
+ type = ExtensionMimeTypes[$1.downcase]
247
+ end
248
+
249
+ type || "text/plain"
250
+ end
251
+
252
+ #
253
+ # Sends a 404 error to the client for a given request.
254
+ #
255
+ def send_e404(cli, request)
256
+ resp = Response::E404.new
257
+
258
+ resp['Content-Type'] = 'text/html'
259
+
260
+ resp.body =
261
+ "<html><head>" +
262
+ "<title>404 Not Found</title>" +
263
+ "</head><body>" +
264
+ "<h1>Not found</h1>" +
265
+ "The requested URL #{html_escape(request.resource)} was not found on this server.<p><hr>" +
266
+ "</body></html>"
267
+
268
+ # Send the response to the client like what
269
+ cli.send_response(resp)
270
+ end
271
+
272
+ attr_accessor :listen_port, :listen_host, :server_name, :context, :comm
273
+ attr_accessor :ssl, :ssl_cert, :ssl_compression
274
+ attr_accessor :listener, :resources
275
+
276
+ protected
277
+
278
+ #
279
+ # Extends new clients with the ServerClient module and initializes them.
280
+ #
281
+ def on_client_connect(cli)
282
+ cli.extend(ServerClient)
283
+
284
+ cli.init_cli(self)
285
+ end
286
+
287
+ #
288
+ # Processes data coming in from a client.
289
+ #
290
+ def on_client_data(cli)
291
+ begin
292
+ data = cli.read(65535)
293
+
294
+ raise ::EOFError if not data
295
+ raise ::EOFError if data.empty?
296
+
297
+ case cli.request.parse(data)
298
+ when Packet::ParseCode::Completed
299
+ dispatch_request(cli, cli.request)
300
+ cli.reset_cli
301
+
302
+ when Packet::ParseCode::Partial
303
+ # Return and wait for the on_client_data handler to be called again
304
+ # The Request object tracks the state of the request for us
305
+ return
306
+
307
+ when Packet::ParseCode::Error
308
+ close_client(cli)
309
+ end
310
+ rescue EOFError
311
+ if (cli.request.completed?)
312
+ dispatch_request(cli, cli.request)
313
+
314
+ cli.reset_cli
315
+ end
316
+
317
+ close_client(cli)
318
+ end
319
+ end
320
+
321
+ #
322
+ # Dispatches the supplied request for a given connection.
323
+ #
324
+ def dispatch_request(cli, request)
325
+ # Is the client requesting keep-alive?
326
+ if ((request['Connection']) and
327
+ (request['Connection'].downcase == 'Keep-Alive'.downcase))
328
+ cli.keepalive = true
329
+ end
330
+
331
+ # Search for the resource handler for the requested URL. This is pretty
332
+ # inefficient right now, but we can spruce it up later.
333
+ p = nil
334
+ len = 0
335
+ root = nil
336
+
337
+ resources.each_pair { |k, val|
338
+ if (request.resource =~ /^#{k}/ and k.length > len)
339
+ p = val
340
+ len = k.length
341
+ root = k
342
+ end
343
+ }
344
+
345
+ if (p)
346
+ # Create an instance of the handler for this resource
347
+ handler = p[0].new(self, *p[2])
348
+
349
+ # If the handler class requires a relative resource...
350
+ if (handler.relative_resource_required?)
351
+ # Substituted the mount point root in the request to make things
352
+ # relative to the mount point.
353
+ request.relative_resource = request.resource.gsub(/^#{root}/, '')
354
+ request.relative_resource = '/' + request.relative_resource if (request.relative_resource !~ /^\//)
355
+ end
356
+
357
+
358
+ # If we found the resource handler for this resource, call its
359
+ # procedure.
360
+ if (p[1] == true)
361
+ Rex::ThreadFactory.spawn("HTTPServerRequestHandler", false) {
362
+ handler.on_request(cli, request)
363
+ }
364
+ else
365
+ handler.on_request(cli, request)
366
+ end
367
+ else
368
+ elog("Failed to find handler for resource: #{request.resource}",
369
+ LogSource)
370
+
371
+ send_e404(cli, request)
372
+ end
373
+
374
+ # If keep-alive isn't enabled for this client, close the connection
375
+ if (cli.keepalive == false)
376
+ close_client(cli)
377
+ end
378
+ end
379
+
380
+ end
381
+
382
+ end
383
+ end
384
+ end
385
+
@@ -0,0 +1,2 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/proto/iax2/client'
@@ -0,0 +1,326 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Proto
4
+ module IAX2
5
+ class Call
6
+
7
+ attr_accessor :client
8
+ attr_accessor :oseq, :iseq
9
+ attr_accessor :scall, :dcall
10
+ attr_accessor :codec, :state
11
+ attr_accessor :ring_start, :ring_finish
12
+ attr_accessor :itime
13
+ attr_accessor :queue
14
+ attr_accessor :audio_hook
15
+ attr_accessor :audio_buff
16
+ attr_accessor :time_limit
17
+ attr_accessor :busy
18
+
19
+ attr_accessor :caller_name
20
+ attr_accessor :caller_number
21
+ attr_accessor :dtmf
22
+
23
+
24
+ def initialize(client, src_id)
25
+ self.client = client
26
+ self.scall = src_id
27
+ self.dcall = 0
28
+ self.iseq = 0
29
+ self.oseq = 0
30
+ self.state = nil
31
+
32
+ self.itime = ::Time.now
33
+ self.queue = ::Queue.new
34
+
35
+ self.audio_buff = []
36
+
37
+ self.busy = false
38
+ self.dtmf = ''
39
+ end
40
+
41
+
42
+ def dprint(msg)
43
+ self.client.dprint(msg)
44
+ end
45
+
46
+ def wait_for(*stypes)
47
+ begin
48
+ ::Timeout.timeout( IAX_DEFAULT_TIMEOUT ) do
49
+ while (res = self.queue.pop )
50
+ if stypes.include?(res[1])
51
+ return res
52
+ end
53
+ end
54
+ end
55
+ rescue ::Timeout::Error
56
+ return nil
57
+ end
58
+ end
59
+
60
+ # Register with the IAX endpoint
61
+ def register
62
+ self.client.send_regreq(self)
63
+ res = wait_for( IAX_SUBTYPE_REGAUTH, IAX_SUBTYPE_REGREJ )
64
+ return if not res
65
+
66
+ if res[1] == IAX_SUBTYPE_REGREJ
67
+ reason = res[2][IAX_IE_REGREJ_CAUSE] || "Unknown Reason"
68
+ dprint("REGREJ: #{reason}")
69
+ # Acknowledge the REGREJ
70
+ self.client.send_ack(self)
71
+ return
72
+ end
73
+
74
+ chall = nil
75
+ if res[2][14] == "\x00\x03" and res[2][IAX_IE_CHALLENGE_DATA]
76
+ self.dcall = res[0][0]
77
+ chall = res[2][IAX_IE_CHALLENGE_DATA]
78
+ end
79
+
80
+ if chall.nil?
81
+ dprint("REGAUTH: No challenge data received")
82
+ return
83
+ end
84
+
85
+ self.client.send_regreq_chall_response(self, chall)
86
+ res = wait_for( IAX_SUBTYPE_REGACK, IAX_SUBTYPE_REGREJ )
87
+ return if not res
88
+
89
+ if res[1] == IAX_SUBTYPE_REGREJ
90
+ reason = res[2][IAX_IE_REGREJ_CAUSE] || "Unknown Reason"
91
+ dprint("REGREJ: #{reason}")
92
+ return
93
+ end
94
+
95
+ if res[2][IAX_IE_APPARENT_ADDR]
96
+ r_fam, r_port, r_addr = res[2][IAX_IE_APPARENT_ADDR].unpack('nnA4')
97
+ r_addr = r_addr.unpack("C*").map{|x| x.to_s }.join(".")
98
+ dprint("REGACK: Registered from address #{r_addr}:#{r_port}")
99
+ end
100
+
101
+ # Acknowledge the REGACK
102
+ self.client.send_ack(self)
103
+
104
+ self.state = :registered
105
+
106
+ true
107
+ end
108
+
109
+ def dial(number)
110
+ self.client.send_new(self, number)
111
+ res = wait_for(IAX_SUBTYPE_AUTHREQ, IAX_SUBTYPE_ACCEPT)
112
+ return if not res
113
+
114
+ # Handle authentication if its requested
115
+ if res[1] == IAX_SUBTYPE_AUTHREQ
116
+ chall = nil
117
+ if res[2][14] == "\x00\x03" and res[1][15]
118
+ self.dcall = res[0][0]
119
+ chall = res[2][15]
120
+ end
121
+
122
+ self.client.send_authrep_chall_response(self, chall)
123
+ res = wait_for( IAX_SUBTYPE_ACCEPT)
124
+ return if not res
125
+ end
126
+
127
+ self.codec = res[2][IAX_IE_DESIRED_CODEC].unpack("N")[0]
128
+ self.state = :ringing
129
+ self.ring_start = ::Time.now.to_i
130
+ self.client.send_ack(self)
131
+ true
132
+ end
133
+
134
+ def hangup
135
+ self.client.send_hangup(self)
136
+ self.state = :hangup
137
+ true
138
+ end
139
+
140
+ def ring_time
141
+ (self.ring_finish || Time.now).to_i - self.ring_start.to_i
142
+ end
143
+
144
+ def timestamp
145
+ (( ::Time.now - self.itime) * 1000.0 ).to_i & 0xffffffff
146
+ end
147
+
148
+ def process_elements(data,off=0)
149
+ res = {}
150
+ while( off < data.length )
151
+ ie_type = data[off ,1].unpack("C")[0]
152
+ ie_len = data[off + 1,2].unpack("C")[0]
153
+ res[ie_type] = data[off + 2, ie_len]
154
+ off += ie_len + 2
155
+ end
156
+ res
157
+ end
158
+
159
+ # Handling incoming control packets
160
+ # TODO: Enforce sequence order to prevent duplicates from breaking our state
161
+ def handle_control(pkt)
162
+ src_call, dst_call, tstamp, out_seq, inp_seq, itype = pkt.unpack('nnNCCC')
163
+
164
+ # Scrub the high bits out of the call IDs
165
+ src_call ^= 0x8000 if (src_call & 0x8000 != 0)
166
+ dst_call ^= 0x8000 if (dst_call & 0x8000 != 0)
167
+
168
+ phdr = [ src_call, dst_call, tstamp, out_seq, inp_seq, itype ]
169
+
170
+ info = nil
171
+ stype = pkt[11,1].unpack("C")[0]
172
+ info = process_elements(pkt, 12) if [IAX_TYPE_IAX, IAX_TYPE_CONTROL].include?(itype)
173
+
174
+ if dst_call != self.scall
175
+ dprint("Incoming packet to inactive call: #{dst_call} vs #{self.scall}: #{phdr.inspect} #{stype.inspect} #{info.inspect}")
176
+ return
177
+ end
178
+
179
+ # Increment the received sequence number
180
+ self.iseq = (self.iseq + 1) & 0xff
181
+
182
+ if self.state == :hangup
183
+ dprint("Packet received after hangup, replying with invalid")
184
+ self.client.send_invalid(self)
185
+ return
186
+ end
187
+
188
+ # Technically these all require an ACK reply
189
+ # NEW, HANGUP, REJECT, ACCEPT, PONG, AUTHREP, REGREL, REGACK, REGREJ, TXREL
190
+
191
+ case itype
192
+ when IAX_TYPE_DTMF_BEGIN
193
+ self.dprint("DTMF BEG: #{pkt[11,1]}")
194
+ self.dtmf << pkt[11,1]
195
+
196
+ when IAX_TYPE_DTMF_END
197
+ self.dprint("DTMF END: #{pkt[11,1]}")
198
+
199
+ when IAX_TYPE_CONTROL
200
+ case stype
201
+ when IAX_CTRL_HANGUP
202
+ dprint("HANGUP")
203
+ self.client.send_ack(self)
204
+ self.state = :hangup
205
+
206
+ when IAX_CTRL_RINGING
207
+ dprint("RINGING")
208
+ self.client.send_ack(self)
209
+
210
+ when IAX_CTRL_BUSY
211
+ dprint("BUSY")
212
+ self.busy = true
213
+ self.state = :hangup
214
+ self.client.send_ack(self)
215
+
216
+ when IAX_CTRL_ANSWER
217
+ dprint("ANSWER")
218
+ if self.state == :ringing
219
+ self.state = :answered
220
+ self.ring_finish = ::Time.now.to_i
221
+ end
222
+ self.client.send_ack(self)
223
+
224
+ when IAX_CTRL_PROGRESS
225
+ dprint("PROGRESS")
226
+
227
+ when IAX_CTRL_PROCEED
228
+ dprint("PROCEED")
229
+
230
+ when 255
231
+ dprint("STOP SOUNDS")
232
+ end
233
+ # Acknowledge all control packets
234
+ # self.client.send_ack(self)
235
+
236
+ when IAX_TYPE_IAX
237
+
238
+ dprint( ["RECV", phdr, stype, info].inspect )
239
+ case stype
240
+ when IAX_SUBTYPE_HANGUP
241
+ self.state = :hangup
242
+ self.client.send_ack(self)
243
+ when IAX_SUBTYPE_LAGRQ
244
+ # Lagrps echo the timestamp
245
+ self.client.send_lagrp(self, tstamp)
246
+ when IAX_SUBTYPE_ACK
247
+ # Nothing to do here
248
+ when IAX_SUBTYPE_PING
249
+ # Pongs echo the timestamp
250
+ self.client.send_pong(self, tstamp)
251
+ when IAX_SUBTYPE_PONG
252
+ self.client.send_ack(self)
253
+ else
254
+ dprint( ["RECV-QUEUE", phdr, stype, info].inspect )
255
+ self.queue.push( [phdr, stype, info ] )
256
+ end
257
+
258
+ when IAX_TYPE_VOICE
259
+ v_codec = stype
260
+ if self.state == :answered
261
+ handle_audio(pkt)
262
+ end
263
+ self.client.send_ack(self)
264
+
265
+ when nil
266
+ dprint("Invalid control packet: #{pkt.unpack("H*")[0]}")
267
+ end
268
+ end
269
+
270
+
271
+ # Encoded audio from the client
272
+ def handle_audio(pkt)
273
+ # Ignore audio received before the call is answered (ring ring)
274
+ return if self.state != :answered
275
+
276
+ # Extract the data from the packet (full or mini)
277
+ data = audio_packet_data(pkt)
278
+
279
+ # Decode the data into linear PCM frames
280
+ buff = decode_audio_frame(data)
281
+
282
+ # Call the caller-provided hook if its exists
283
+ if self.audio_hook
284
+ self.audio_buff(buff)
285
+ # Otherwise append the frame to the buffer
286
+ else
287
+ self.audio_buff << buff
288
+ end
289
+ end
290
+
291
+ def each_audio_frame(&block)
292
+ self.audio_buff.each do |frame|
293
+ block.call(frame)
294
+ end
295
+ end
296
+
297
+ def decode_audio_frame(buff)
298
+ case self.codec
299
+
300
+ # Convert u-law into signed PCM
301
+ when IAX_CODEC_G711_MULAW
302
+ Rex::Proto::IAX2::Codecs::MuLaw.decode(buff)
303
+
304
+ # Convert a-law into signed PCM
305
+ when IAX_CODEC_G711_ALAW
306
+ Rex::Proto::IAX2::Codecs::ALaw.decode(buff)
307
+
308
+ # Linear little-endian signed PCM is our native format
309
+ when IAX_CODEC_LINEAR_PCM
310
+ buff
311
+
312
+ # Unsupported codec, return empty
313
+ else
314
+ dprint("UNKNOWN CODEC: #{self.codec.inspect}")
315
+ ''
316
+ end
317
+ end
318
+
319
+ def audio_packet_data(pkt)
320
+ (pkt[0,1].unpack("C")[0] & 0x80 == 0) ? pkt[4,pkt.length-4] : pkt[12,pkt.length-12]
321
+ end
322
+
323
+ end
324
+ end
325
+ end
326
+ end