reavetard
Version:
CoffeeScript modules that provide AP rotation support and a host of data management and general usability enhancements for Reaver-WPS Cracker and its partner in crime, Wash-WPS Scanner
82 lines (73 loc) • 2.88 kB
text/coffeescript
# Reavetard - Reaver WPS (+Wash) extension scripts
# wash.coffee :: Module that spawns wash child processes and parses any AP data
# that they spit out
# Author: Robbie Saunders http://eibbors.com/[/p/reavetard]
# ==============================================================================
# Module dependencies
# -------------------------
events = require 'events'
{spawn, exec} = require 'child_process'
# Arguments supported by the wash command in the format:
# key: [shortFlag, fullFlag, description, includesValue]
WASH_ARGS =
interface: ['-i', '--interface=<iface>', 'Interface to capture packets on', true]
file: ['-f', '--file [FILE1 FILE2 FILE3 ...]', 'Read packets from capture files', true]
channel: ['-c', '--channel=<num>', 'Channel to listen on [auto]', true]
outFile: ['-o', '--out-file=<file>', 'Write data to file', true]
probes: ['-n', '--probes=<num>', 'Maximum number of probes to send to each AP in scan mode [15]', true]
daemonize: ['-D', '--daemonize', 'Daemonize wash', false]
ignoreFCS: ['-C', '--ignore-fcs', 'Ignore frame checksum errors', false]
use5ghz: ['-5', '--5ghz', 'Use 5GHz 802.11 channels', false]
scan: ['-s', '--scan', 'Use scan mode', false]
survey: ['-u', '--survey', 'Use survey mode [default]', false]
help: ['-h', '--help', 'Show help', false]
### Child process wrapper for spawned wash processes ###
class Wash extends events.EventEmitter
constructor: (options) ->
for own key, value of options
@[key] = value
?= 'mon0'
?= true
= null
# Setting a duration will switch to exec vs. real time parsing (spawn)
start: (args, duration=0) ->
# create an arguments array, if not provided by caller
if not args?
args = []
for key, value of WASH_ARGS when @[key]?
[flag, option, desc, inclVal] = value
if @[key] or inclVal then args.push flag
if inclVal then args.push @[key]
# kill the existing process, then spawn a new one and bind to the data event
if duration > 0
= undefined
exec 'wash', args, (output) =>
for line in output.split('\n')
line
else
= spawn 'wash', args
.stdout.on 'data',
.stderr.on 'data',
stop: () ->
if
.kill()
'exit', true
# parse and emit any discovered stations
process: (data) =>
ap = ///
(\w\w(:\w\w)+)\s+ # bssid
(\d+)\s+ # channel
(-\d+)\s+ #rssi
(\d\.\d)\s+ # wps version
(Yes|No)\s+ # wps locked?
(.*) # essid
///.exec(data.toString())
if ap then 'ap',
bssid: ap[1]
channel: ap[3]
rssi: ap[4]
version: ap[5]
locked: (ap[6] is 'Yes')
essid: ap[7]
module.exports = Wash