15 ene 2014

Bypaseando captchas de voz. Parte 1

Buenas a todos, hace ya algún tiempo durante un proceso de auditoría de seguridad web, me encontré con la necesidad de atacar por fuerza bruta un proceso de autenticación en el que había un captcha. Este captcha tenía la particularidad de que permitía tanto visualizar 4 caracteres sobre una imagen, como escuchar mediante un audio en formato WAV el contenido de esos caracteres con la voz de loquendo.

La imagen con los caracteres del captcha era tan mala, que apenas logré pasarla manualmente, por tanto automatizar un script para saltárselo era casi imposible... En ese momento se me ocurrió hacer uso de un script que había visto en los videos de la PyCon, llamado "python-speechrecognition".

Se trata de un script python basado en Pocketsphinx que permite extraer el texto de un archivo de audio WAV. Os dejo el video a continuación:


El script podéis descargarlo desde este enlace:

import sys,os

def decodeSpeech(hmmd,lmdir,dictp,wavfile):
    """
    Decodes a speech file
    """

    try:
        import pocketsphinx as ps
        import sphinxbase

    except:
        print """Pocket sphinx and sphixbase is not installed
        in your system. Please install it with package manager.
        """

    speechRec = ps.Decoder(hmm = hmmd, lm = lmdir, dict = dictp)
    wavFile = file(wavfile,'rb')
    wavFile.seek(44)
    speechRec.decode_raw(wavFile)
    result = speechRec.get_hyp()

    return result[0]

if __name__ == "__main__":
    hmdir = "/usr/share/pocketsphinx/model/hmm/wsj1"
    lmd = "/usr/share/pocketsphinx/model/lm/wsj/wlist5o.3e-7.vp.tg.lm.DMP"
    dictd = "/usr/share/pocketsphinx/model/lm/wsj/wlist5o.dic"
    wavfile = sys.argv[1]
    recognised = decodeSpeech(hmdir,lmd,dictd,wavfile)

    print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
    print recognised
    print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"


Para que funcione el script es necesario instalar una serie de dependencias (pocket sphinx):
sudo apt-get install python-pocketsphinx pocketsphinx-hmm-wsj1 pocketsphinx-lm-wsj
En mi caso particular me daba muchos falsos positivos, pero me sirvió para probar de manera práctica que el captcha era vulnerable.

En próximos posts os contaré como hacerle algunas modificaciones para adaptarlo a vuestras posibles necesidades.

Saludos!

1 comentario: