module PWN::Plugins::Serial

def self.authors

def self.authors
st.pentest@0dayinc.com>

def self.connect(opts = {})

def self.connect(opts = {})
block_dev].to_s if File.exist?(
.to_s
ttyUSB0' if opts[:block_dev].nil?
ud].nil?
d].to_i
s[:data_bits].nil?
[:data_bits].to_i
s[:stop_bits].nil?
[:stop_bits].to_i
.to_s.to_sym
ort::EVEN
ort::MARK
ort::ODD
ort::SPACE
ort::NONE
ntrol].to_s.to_sym
erialPort::HARD
erialPort::SOFT
erialPort::NONE
alPort.new(
_conn] = serial_conn
n_thread] = init_session_thread(
ial_conn
 => e
obj: serial_obj) unless serial_obj.nil?

def self.disconnect(opts = {})

def self.disconnect(opts = {})
:serial_obj]
al_obj[:serial_conn]
erial_obj[:session_thread]

minate
 => e

def self.dump_session_data

def self.dump_session_data
 => e

def self.flush_session_data

def self.flush_session_data
r
 => e

def self.get_line_state(opts = {})

def self.get_line_state(opts = {})
:serial_obj]
al_obj[:serial_conn]
gnals
 => e
obj: serial_obj) unless serial_obj.nil?

def self.get_modem_params(opts = {})

def self.get_modem_params(opts = {})
:serial_obj]
al_obj[:serial_conn]
dem_params
 => e
obj: serial_obj) unless serial_obj.nil?

def self.help

def self.help
elf}.connect(
tional serial block device path (defaults to /dev/ttyUSB0)',
l (defaults to 9600)',
tional (defaults to 8)',
tional (defaults to 1)',
nal - :even|:mark|:odd|:space|:none (defaults to :none)',
'optional - :none||:hard||:soft (defaults to :none)'
elf}.get_line_state(
equired serial_obj returned from #connect method'
{self}.get_modem_params(
equired serial_obj returned from #connect method'

equired serial_obj returned from #connect method',
ired - array of bytes OR string to write to serial device (e.g. [0x00, 0x41, 0x90, 0x00] OR \"ATDT+15555555\r\n\"'
(
equired serial_obj returned from #connect method'
 = #{self}.dump_session_data
ssion_data
ct(
equired serial_obj returned from #connect method'

def self.init_session_thread(opts = {})

def self.init_session_thread(opts = {})
:serial_conn]
obj session_thread
timeout = -1

t_readable
s into @session_data,
adable bytes if need-be
< serial_conn.readchar
=> e
minate

def self.request(opts = {})

def self.request(opts = {})
:serial_obj]
yload]
al_obj[:serial_conn]

.chars if payload.instance_of?(String)
byte|
(byte)
 => e
obj: serial_obj) unless serial_obj.nil?

def self.response(opts = {})

def self.response(opts = {})
:serial_obj]
p_session_data
 ''
do |byte|
s#{byte.unpack1('H*')}"
.unpack1('H*')
npack1 returns 2 bytes instead of one
ates to deb0 (that's not a double quote ")
b0
 is ghetto-hacker-ish.
gth == 4
s_byte[1..2]
s_byte[-2..-1]
sp = "#{hex_esc_raw_resp}\s#{byte_one}"
sp = "#{hex_esc_raw_resp}\s#{byte_two}"
sp = "#{hex_esc_raw_resp}\s#{this_byte}"
esponse array in space-delimited hex
 hex_esc_raw_resp.upcase.strip.split(/(?=FF)/)
ap(&:strip)
 => e
for Next Request