Sulley - elemento opzionale e controllo del comando

7

Attualmente sto usando Sulley per confondere il mio server FTP, ma sto avendo problemi. Voglio specificare il comando STRU, che ha una sintassi:

STRU [<SP> F|R|P] <CRLF>

Ho provato a specificare gli argomenti F, R, P opzionali nel comando STRU come segue:

s_initialize('DataSTRU')
s_static('STRU ')
s_group('struv', values=['F', 'R', 'P'])
s_block_start('strub', group='struv')
s_block_end()
s_repeat('strub', min_reps=0, max_reps=1, fuzzable=True)
s_static('\r\n')

Questo invia i comandi giusti al server FTP (STRU F; STRU R; STRU P), ma il problema è che è così. Non cerca di omettere il personaggio o lo sfocato, che vorrei anche. So che posso solo specificare l'argomento di fuzz, ma vorrei sfocare l'argomento e modificare gli argomenti validi. Qualche idea su come applicare l'argomento facoltativo + fuzzable al codice precedente?

Un altro problema è che non so come posso controllare quale comando è attualmente in uso - sto usando i comandi all'interno di s_block_start e sto scorrendo l'elemento s_group come segue:

s_initialize('DataSet')
s_group('commands', values=['MODE', 'PROT', 'STRU'])
s_block_start('DataBlock', group='commands')
s_delim(' ')
  // TODO: how to check whether:
  // if   [current_command == 'MODE'] do this
  // elif [current_command == 'PROT'] do this
  // else [current_command == 'STRU'] do this
s_static('\r\n')
s_block_end()

Questo è tutto. Tutte le idee e le raccomandazioni sono benvenute. Grazie

    
posta eleanor 26.04.2012 - 14:14
fonte

1 risposta

4

Poiché entrambe le tue domande si riferiscono ai gruppi, dovremmo esaminare come vengono utilizzati per primi. Lo scopo è quello di associare i dati di blocco a un insieme di valori statici, che scorre ripetutamente attraverso l'elenco di valori e genera dati di blocco per ciascuno di essi.

L'esempio nei documenti utilizza HTTP, dove i dati del blocco sono una semplice richiesta HTTP ei valori del gruppo sono verbi HTTP ('GET', 'POST', 'PUT', ecc.). Nell'esempio, sulley genera e confonde il blocco di dati (la richiesta) per ogni verbo HTTP nel s_group:

# define a new block named "HTTP BASIC".
s_initialize("HTTP BASIC")

# define a group primitive listing the various HTTP verbs we wish to fuzz.
s_group("verbs", values=["GET", "HEAD", "POST", "TRACE"])

# define a new block named "body" and associate with the above group.
if s_block_start("body", group="verbs"):
    # break the remainder of the HTTP request into individual primitives.
    s_delim(" ")
    s_delim("/")
    s_string("index.html")
    s_delim(" ")
    s_string("HTTP")
    s_delim("/")
    s_string("1")
    s_delim(".")
    s_string("1")
    # end the request with the mandatory static sequence.
    s_static("\r\n\r\n")
# close the open block, the name argument is optional here.
s_block_end("body")

Dal doc:

When this defined request is loaded into a Sulley session, the fuzzer will generate and transmit all possible values for the block "body", once for each verb defined in the group

Ora per la prima domanda, stai ricevendo solo le stringhe "STRU R" e "STRU P" perché ogni valore nell'elenco fornito a s_group () è trattato come una stringa creata con s_static () - non sono mutati.

Puoi provare questo:

s_initialize('DataSTRU')

for op in ['', 'F', 'R', 'P']:      # trying to include your missing-arg case
  s_block_start('stru-%s' % op)
  s_static('STRU')
  s_delim(' ')
  s_string(op)
  s_static('\r\n')
  s_block_end()

Che è più vicino a quello che stavi puntando, ma probabilmente puoi farla franca con questo:

s_initialize('DataSTRU')
s_block_start('stru')
s_static('STRU')
s_delim(' ')
s_string('F')
s_static('\r\n')
s_block_end()

Che confonde lo spazio (s_delim ()) e il parametro (s_string ()).

Per la seconda domanda, non è necessario verificare quale comando è in uso. Se i blocchi sono specifici di un comando, definiscili separatamente:

s_initialize('DataSet')
s_block_start('mode')
s_static('MODE')
# MODE-specific primitives 
s_block_end()
s_block_start('prot')
s_static('PROT')
# PROT-specific primitives
s_block_end()
for op in ['', 'F', 'R', 'P']:
  s_block_start('stru-%s' % op)
  s_static('STRU')
  s_delim(' ')
  s_string(op)
  s_static('\r\n')
  s_block_end()
    
risposta data 31.08.2012 - 17:34
fonte

Leggi altre domande sui tag