Sulley - elemento opcional y verificación de comando

7

Actualmente estoy usando Sulley para borrar mi servidor FTP, pero tengo problemas. Quiero especificar el comando STRU, que tiene una sintaxis:

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

Intenté especificar los argumentos opcionales F, R, P para el comando STRU como los siguientes:

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')

Esto envía los comandos correctos al servidor FTP (STRU F; STRU R; STRU P), pero el problema es que eso es todo. No trata de omitir el personaje o de difuminarlo, lo que también me gustaría. Sé que solo puedo especificar el argumento para fuzz, pero me gustaría fuzz el argumento, así como mutar los argumentos válidos. ¿Alguna idea de cómo aplicar el argumento opcional + fuzzable al código anterior?

Otro problema es que no sé cómo puedo verificar qué comando se está usando actualmente. Estoy usando los comandos dentro de s_block_start y estoy iterando a través del elemento s_group como el siguiente:

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()

Eso es todo. Cualquier idea y recomendaciones son bienvenidas. Gracias

    
pregunta eleanor 26.04.2012 - 14:14
fuente

1 respuesta

4

Ya que ambas preguntas se relacionan con los grupos, deberíamos ver cómo se usan primero. El propósito es vincular los datos de bloque a un conjunto de valores estáticos: el surco recorre la lista de valores y genera datos de bloque para cada uno.

El ejemplo en los documentos utiliza HTTP, donde los datos de bloque son una solicitud HTTP simple y los valores de grupo son verbos HTTP ('GET', 'POST', 'PUT', etc.). En el ejemplo, sulley genera y borra el bloque de datos (la solicitud) para cada verbo HTTP en el 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")

Desde el documento:

  

Cuando esta solicitud definida se carga en una sesión de Sulley, el fuzzer   generará y transmitirá todos los valores posibles para el bloque "cuerpo",   una vez por cada verbo definido en el grupo

Ahora, para la primera pregunta, está obteniendo solo las cadenas 'STRU F' 'STRU R' y 'STRU P' porque cada valor en la lista suministrada a s_group () se trata igual que una cadena creada con s_static () - No están mutados.

Puedes probar esto:

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()

Lo que está más cerca de lo que buscabas, pero probablemente te salgas con la suya con esto:

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

Que borra el espacio (s_delim ()) y el parámetro (s_string ()).

Para su segunda pregunta, no necesita verificar qué comando se está utilizando. Si los bloques son específicos de un comando, simplemente defínalos por separado:

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()
    
respondido por el trs80 31.08.2012 - 17:34
fuente

Lea otras preguntas en las etiquetas