Module: PWN::Plugins::Serial

Defined in:
lib/pwn/plugins/serial.rb

Overview

This plugin is used for interacting with serial devices including, but not limited to, modems (including cellphone radios), legacy equipment, arduinos, & other misc ftdi devices

Class Method Summary collapse

Class Method Details

.authorsObject

Author(s)

0day Inc. <[email protected]>



216
217
218
219
220
# File 'lib/pwn/plugins/serial.rb', line 216

public_class_method def self.authors
  "AUTHOR(S):
    0day Inc. <[email protected]>
  "
end

.connect(opts = {}) ⇒ Object

Supported Method Parameters

serial_obj = PWN::Plugins::Serial.connect(

block_dev: 'optional - serial block device path (defaults to /dev/ttyUSB0)',
baud: 'optional - (defaults to 9600)',
data_bits: 'optional - (defaults to 8)',
stop_bits: 'optional - (defaults to 1)',
parity: 'optional - (defaults to SerialPort::NONE)',
flow_control: 'optional - (defaults to SerialPort::HARD) SerialPort::NONE|SerialPort::SOFT|SerialPort::HARD'

)



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
# File 'lib/pwn/plugins/serial.rb', line 24

public_class_method def self.connect(opts = {})
  block_dev = opts[:block_dev].to_s if File.exist?(
    opts[:block_dev].to_s
  )
  block_dev = '/dev/ttyUSB0' if opts[:block_dev].nil?

  baud = if opts[:baud].nil?
           9_600
         else
           opts[:baud].to_i
         end

  data_bits = if opts[:data_bits].nil?
                8
              else
                opts[:data_bits].to_i
              end

  stop_bits = if opts[:stop_bits].nil?
                1
              else
                opts[:stop_bits].to_i
              end

  parity = if opts[:parity].nil?
             SerialPort::NONE
           else
             opts[:parity]
           end

  flow_control = if opts[:flow_control].nil?
                   SerialPort::HARD
                 else
                   opts[:flow_control]
                 end

  serial_conn = SerialPort.new(
    block_dev,
    baud,
    data_bits,
    stop_bits,
    parity,
    flow_control
  )

  serial_obj = {}
  serial_obj[:serial_conn] = serial_conn
  serial_obj[:session_thread] = init_session_thread(
    serial_conn: serial_conn
  )

  serial_obj
rescue StandardError => e
  disconnect(serial_obj: serial_obj) unless serial_obj.nil?
  raise e
end

.disconnect(opts = {}) ⇒ Object

Supported Method Parameters

PWN::Plugins::Serial.disconnect(

serial_obj: 'required - serial_obj returned from #connect method'

)



202
203
204
205
206
207
208
209
210
211
212
# File 'lib/pwn/plugins/serial.rb', line 202

public_class_method def self.disconnect(opts = {})
  serial_obj = opts[:serial_obj]
  serial_conn = serial_obj[:serial_conn]
  session_thread = serial_obj[:session_thread]
  flush_session_data(serial_obj: serial_obj)
  session_thread.terminate
  serial_conn.close
  serial_conn = nil
rescue StandardError => e
  raise e
end

.dump_session_data(opts = {}) ⇒ Object

Supported Method Parameters

session_data = PWN::Plugins::Serial.dump_session_data(

serial_obj: 'required - serial_obj returned from #connect method'

)



174
175
176
177
178
179
180
181
# File 'lib/pwn/plugins/serial.rb', line 174

public_class_method def self.dump_session_data(opts = {})
  serial_obj = opts[:serial_obj]

  @session_data
rescue StandardError => e
  disconnect(serial_obj: serial_obj) unless serial_obj.nil?
  raise e
end

.flush_session_data(opts = {}) ⇒ Object

Supported Method Parameters

session_data = PWN::Plugins::Serial.flush_session_data(

serial_obj: 'required - serial_obj returned from #connect method'

)



188
189
190
191
192
193
194
195
# File 'lib/pwn/plugins/serial.rb', line 188

public_class_method def self.flush_session_data(opts = {})
  serial_obj = opts[:serial_obj]

  @session_data.clear
rescue StandardError => e
  disconnect(serial_obj: serial_obj) unless serial_obj.nil?
  raise e
end

.get_line_state(opts = {}) ⇒ Object

Supported Method Parameters

line_state = PWN::Plugins::Serial.get_line_state(

serial_obj: 'required serial_obj returned from #connect method'

)



115
116
117
118
119
120
121
122
# File 'lib/pwn/plugins/serial.rb', line 115

public_class_method def self.get_line_state(opts = {})
  serial_obj = opts[:serial_obj]
  serial_conn = serial_obj[:serial_conn]
  serial_conn.get_signals
rescue StandardError => e
  disconnect(serial_obj: serial_obj) unless serial_obj.nil?
  raise e
end

.get_modem_params(opts = {}) ⇒ Object

Supported Method Parameters

modem_params = PWN::Plugins::Serial.get_modem_params(

serial_obj: 'required - serial_obj returned from #connect method'

)



129
130
131
132
133
134
135
136
# File 'lib/pwn/plugins/serial.rb', line 129

public_class_method def self.get_modem_params(opts = {})
  serial_obj = opts[:serial_obj]
  serial_conn = serial_obj[:serial_conn]
  serial_conn.get_modem_params
rescue StandardError => e
  disconnect(serial_obj: serial_obj) unless serial_obj.nil?
  raise e
end

.helpObject

Display Usage for this Module



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
# File 'lib/pwn/plugins/serial.rb', line 224

public_class_method def self.help
  puts "USAGE:
    serial_obj = #{self}.connect(
      block_dev: 'optional serial block device path (defaults to /dev/ttyUSB0)',
      baud: 'optional (defaults to 9600)',
      data_bits: 'optional (defaults to 8)',
      stop_bits: 'optional (defaults to 1)',
      parity: 'optional (defaults to SerialPort::NONE)',
      flow_control: 'optional (defaults to SerialPort::NONE)'
    )

    line_state = #{self}.get_line_state(
      serial_obj: 'required serial_obj returned from #connect method'
    )

    modem_params = #{self}.get_modem_params(
      serial_obj: 'required serial_obj returned from #connect method'
    )

    #{self}.request(
      serial_obj: 'required serial_obj returned from #connect method',
      request: 'required string to write to serial device'
    )

    #{self}.response(
      serial_obj: 'required serial_obj returned from #connect method'
    )

    session_data_arr = #{self}.dump_session_data(
      serial_obj: 'required serial_obj returned from #connect method'
    )

    #{self}.flush_session_data
      serial_obj: 'required serial_obj returned from #connect method'
    )

    #{self}.disconnect(
      serial_obj: 'required serial_obj returned from #connect method'
    )

    #{self}.authors
  "
end

.request(opts = {}) ⇒ Object

Supported Method Parameters

PWN::Plugins::Serial.request(

serial_obj: 'required serial_obj returned from #connect method',
request: 'required - string to write to serial device'

)



144
145
146
147
148
149
150
151
152
153
154
# File 'lib/pwn/plugins/serial.rb', line 144

public_class_method def self.request(opts = {})
  serial_obj = opts[:serial_obj]
  request = opts[:request].to_s.scrub
  serial_conn = serial_obj[:serial_conn]
  chars_written = serial_conn.write(request)
  serial_conn.flush
  chars_written
rescue StandardError => e
  disconnect(serial_obj: serial_obj) unless serial_obj.nil?
  raise e
end

.response(opts = {}) ⇒ Object

Supported Method Parameters

PWN::Plugins::Serial.response(

serial_obj: 'required - serial_obj returned from #connect method'

)



161
162
163
164
165
166
167
# File 'lib/pwn/plugins/serial.rb', line 161

public_class_method def self.response(opts = {})
  serial_obj = opts[:serial_obj]
  @session_data.last
rescue StandardError => e
  disconnect(serial_obj: serial_obj) unless serial_obj.nil?
  raise e
end