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 - Mortal_Poison

#1
Hacking / ¿Sirven los CTFs para el Hacking?
Abril 15, 2022, 06:45:47 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Probablemente, esto es uno de los posts que más quise hacer en su época pero nunca me tomé el tiempo de hacerlo. Y es que, si bien, de manera personal y profesional he avanzado de manera progresiva como pentester, me desmotivó mucho que mi canal solo recibiera strikes, strikes y más strikes. Pero qué se va a hacer. La vida es así y ahora quiero volver a retomar el canal que por un tiempo olvidé. Un canal que me dejó conocer más a profundidad este foro. Los que quieran volverse a sumar al barco, son bienvenidos, y los que se fueron, gracias por haber estado. Sin más, comencemos con lo que nos atañe, con ¿Realmente sirven los CTFs o Capture The Flags para el Hacking?.

En primera instancia, debemos definir qué es un CTF. Un CTF no es más que encontrar la respuesta a un reto diseñado por una persona y/o grupo con el fin de obtener puntos y posicionarte en el tablero que usualmente existen en este tipo de eventos. No obstante, existen 3 tipos comúnes de CTFs que describiré a continuación:


  • Jeopardy
En esta categoría, existen diversas categorías adentro de este tipo de CTFs, como por ejemplo, criptografía, web, reversing, OSINT, entre otras. Usualmente mencionan la complejidad del reto y con esto, también los puntos que ganarías si lo resuelves. Por ejemplo, los retos más 'complicados', dan más puntos y como estarás imaginando, los retos más sencillos, te darán menos puntos.
  • Ataque & Defensa
Debes proteger tus propios servicios para obtener puntos de defensa y hackear a tus oponentes para obtener puntos de ataque.
  • King of the Hill
Existen múltiples servidores vulnerables listos para ser explotados que no pertenecen a ningún grupo. Además, los equipos no tienen sus propios servidores que defender como en los escenarios de Ataque - Defensa. Por ejemplo, capturas un servidor y tienes que intentar defenderlo el máximo de tiempo posible para obtener más puntos.


Y bueno, aunque lo anterior es una descripción muy breve de los tipos de CTFs, se puede llegar a entender cuál es la idea de los mismos. Ahora bien, viene mi punto de vista. Los CTFs están pensados para 'entretener'. Sin embargo, muchas empresas o servicios militares cada año realizan este tipo de prácticas para 'medir el nivel' que pueden llegar a tener las personas que se inscriban.




LA HABILIDAD

Y es que, nadie habla de realmente qué tan hábil requieres ser para resolver este tipo de retos. Retos los cuales tienes que adivinar y tener una bola de cristal para saber cómo llegar a la respuesta, retos los cuales encuentras cosas tan absurdas que nunca pasarán en la vida real, retos los cuales como bien lo mencioné anteriormente, están pensados para entretener. La diferencia entre los CTFs y el mundo real, está en que ya tú sabes que el reto tiene una vulnerabilidad y que tienes que intentar encontrarla, en el mundo real, esto no pasa, es decir, nadie te deja una vulnerabilidad adrede (a menos que sea un insider, ahí hasta de pronto). Mi opinión es con base en lo que he podido experimentar a lo largo de mi travesía en este maravilloso mundo. He visto pocos CTFs que los acercan al mundo real, claro, no voy a generalizar, pero es que esto es una realidad.

Ahora bien, gracias a haber estado en varias empresas y compartido con diversos pentesters, he visto muchos que para CTFs son unas máquinas, pero cuando se trata de ambientes reales, se quedan pegados. Siempre me hice la misma pregunta. ¿A qué se debe? ¿por qué?. Y claro, tuve la oportunidad de participar en algunos CTFs y, lo que en principio parecía 'divertido', se convirtió en un tormento y frustración en el que no encontraba respuesta a varios retos. ¿Quizá no sé mucho? ¿quizá como lo pintan las organizaciones y organizadores, me falta aprender más? y bueno, claro que sí, todos los días aprendo. No obstante, estaba haciéndome las preguntas en un lugar equivocado.

EL ENTORNO

Casualmente, me pasaban varios activos en ambientes reales y los rompía, los desbarataba. Cosa que compañeros que eran muy buenos en CTF no lo hacían. Recuerdo en aquella época, que me decían algunos conocidos: "los CTFs sí te ayudan para explotar ambientes reales". Finalmente, tuve la oportunidad de participar como en 2 o 3 CTFs en ese entonces, y claro, valí gaver. Pero el punto no es ese, el punto es que, al estar prediseñados esos escenarios, siempre intentan poner retos que están salidos de lo que en un ambiente real sucede; e insisto, no está mal. Para gustos, colores. Pero por favor, no se debe hacer hincapié en que este tipo de retos miden tu habilidad, porque para mí, no es así.

Realmente, me preocupa que en la actualidad se esté comenzando a medir los niveles por este tipo de cosas. Es preocupante. Les aseguro, que si me hubiesen puesto algo de CTFs en las empresas que he estado, me hubiera aburrido y quizá no hubiera completado el proceso de selección. A mí me gusta frustrarme con escenarios reales, con escenarios donde el desarrollador que está detrás, está pensando en sanitizar una entrada, en donde está pensando cómo prevenir que se hagan fraudes, en donde existe un conglomerado de personas para evitar cualquier ingreso a un servidor, en donde las personas encargadas de redes están pensando en cómo vlanear correctamente.

EL HYPE

Y claro, no significa que no me gustan porque soy malo en ellos. De hecho, como lo mencioné, pueden llegar a ser interesantes y geniales si te gustan. Te hacen pensar en cuál puede ser la solución que puso la persona que diseñó el reto. Y para mí está bien. Pero mi opinión va más encaminada al por qué estos no son escenarios reales y por qué no deberían ser considerados en medir tu habilidad. Para mí, las personas que siempre quedan en los primeros puestos, es porque han jugado muchos CTFs y porque me he dado cuenta que muchos de los retos tienen patrones de CTFs pasados o de otras competencias en otros eventos.

Quiero creer que esto mejore en los próximos años y que sean más aterrizados a la realidad.

Y como conclusión, creo que los CTFs también te pueden ayudar para conocer herramientas, conocer quizá alguna que otra técnica pero no te ayudarán en lo que se basa el Hacking Real. A mi modo de ver, prefiero invertir lo que dura un CTF que pueden ser 3 días por ejemplo, en realizar Bug Bounty o realizar Research que divagar porque no puedo encontrar una solución que alguien que puso un valor súper ofuscado en una imagen que redirige a un dominio para descargar un .pcap y analizar dónde puede estar un archivo incrustado que puede ser un comprimido para conocer la Flag por fuerza bruta.

Y tú, ¿qué opinas?...

Les dejo el vídeo en el canal:

#2
Buenas a todos/as,

Espero y se encuentren muy bien. Quería traerles este contenido en el canal, ya que, además de incentivar a más personas que se inmiscuyan en la seguridad informática, también hay que demostrar el talento que tiene Latinoamérica en el mundo del Hacking. Dos foros que han sido pilares y ejes de esto, ha sido Underc0de y No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, sin duda alguna. Si eres una nueva persona y lees esto, quiero que sepas que puedes sumergirte en este mundo a través de estos grandiosos foros. No es endiosar, pero hay que ser realistas: la información que existe y la comunidad, es muy valiosa. Pero más que eso, también es importante retribuir lo que se aprende a la comunidad, por eso es comunidad. Creo que el ser altruista, contribuye a que se genera una mayor comunidad y un conocimiento progresivo en el tiempo.

Sin más, me gustaría que ustedes opinaran.

¿Qué piensan del Black Hacking?.

¿Qué piensan de lo de irse a otro país con respecto a nuestro campo?.

Estas dos preguntas fueron realizadas a WHK, aquí tienen la entrevista.




Espero que también opinen y generemos un debate interesante. No he visto uno en internet de esa índole y creo que podríamos crearlo ;).

Un abrazo.
#3

El día de hoy, quiero aportar algo de lo que conozco en lo que respecta a la destrucción de datos. Como Pentesters, hay que saber de todo un poco, a pesar de especializarte en los temas que más te apasionan.

En éste caso enfatizaré más en los HDD.

La restauración y/o la destrucción de datos probablemente son dos caras de la misma moneda. ¿Deseas saber cómo y cuándo recuperar información? entonces deberás comprender cómo puede destruirse irrevocablemente. Se suele vender la idea de que el borrado de archivos es sencillo, sin embargo, es muchísimo más complejo de lo que parece.

Dependiendo del grado o del nivel de cuán importantes son los archivos  que desees borrar, debes aplicar distintas técnicas. Te planteo tres ejemplos que SE DIFERENCIAN ENTRE SÍ:

  • Si deseas borrar unas fotos donde sales desnudo.
  • Si eres un integrante del IS*S.
  • Si eres uno de los administradores de DarkMarkets (P.E SkillRoad).

Como podrás notar, los ejemplos anteriores se asemejan en que se necesitan borrar los archivos pero distan en su contexto. No es lo mismo que desees borrar imágenes de tu galería donde sales desnudo que borrar una galería entera de personas decapitadas. De este modo, si un integrante del IS*S o un administrador de una DarkMarket elimina los archivos con Shred, Wipe, AxCrypt, Ccleaner y/o cualquier otro método convencional, el archivo casi siempre puede ser recuperado en su totalidad.

Para los que no sepan, en un laboratorio se pueden recuperar hasta +70 capas de borrado. Si tengo un archivo denominado: Underc0de.txt y luego creé otro y lo borré por 70 veces, en un laboratorio no tengas duda que será recuperado. ¿Cómo lo hacen? uno de los instrumentos que son usados en éstos laboratorios son los osciloscopios(básicamente es un dispositivo de visualización gráfica que muestra señales eléctricas variables en el tiempo). El proceso es medir la huella magnética de cada bit en el disco y es ahí donde se sabe si en ese bit hubo grabado un 0 o un 1, donde 1 significa que sí hubo grabado algo y 0 no. Un software que cumple con lo anterior, analiza e interpreta las huellas magnéticas y genera los 0's y 1's y lo hace por el número de veces que mencioné anteriormente.


Una recomendación que puedo hacer, es no poner en el nombre de los ficheros nombres tan certeros que indiquen de qué trata el fichero. El motivo de esto es que la mayoría de veces, se el nombre de un archivo, más no su contenido. Por ejemplo, si yo elimino un archivo denominado Passwords-All-Users-Underc0de.txt pues con los software de recuperación, ya sabría que dicho archivo es algo importante y es un .txt, los cuales son dos datos importantes para su recuperación. De hecho, hasta los metadatos suelen quedar en el disco.


UIno de los problemas principales que existen actualmente, es que los fabricantes de los discos duros(HDD) solventan los problemas de una manera "muy peculiar". Resulta, que si un disco duro está grabando un archivo y va en 98% por ejemplo y por "X" o "Y" motivo ocurre un error, algunos discos empiezan a grabar el mismo archivo en otro sector del disco y ese progreso del 98% del archivo, se queda ahí. Otro tipo de discos, lo que hacen es copian el archivo grabado a otro sector del disco para que siga con su progreso normal.  Existen herramientas que aprovechan este tipo de cosas y recuperan los archivos "incompletos".

De esta forma, muchos piensan en recurrir al método Gutmann que lo que hace es de más de 35 pasadas sobreescribe el archivo mediante patrones de ceros y unos para confundir a las herramientas usadas en los laboratorios de recuperación de información. A pesar de que es uno de los más utilizados, puedes recurrir por uno de los que se dice que usa el Departamento de Defensa de EE.UU: U.S. DoD 5220.22-M (ECE). Pueden encontrar un poco más de información No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Entonces si realmente es algo que debes borrar, entonces lo que yo haría es encriptar el/los ficheros. Esto por el simple hecho de que es más complicado desencriptar que recuperar los ficheros/datos borrados. Por último, si deseas seguir un estilo de recomendaciones, lo que yo te compartir es:

- Cambia el nombre y extension del archivo -> Encripta el archivo con una contraseña que confirmes que es compleja de descifrar -> Aplica el método de Gutmann al/los ficheros -> Realiza las limpiezas y/o desfragmentaciones del disco con software como Ccleaner, Advanced SystemCare y los demás que abundan en internet.

Aunque son unas pequeñas recomendaciones, entiendo que habrán unas recomendaciones adicionales que le haga un poco más difícil el volcado de archivos a los forenses, pero insisto, depende de lo importante que sea el fichero.




Probablemente, no me hayan visto últimamente, pero fue porque estuve en una experiencia de desarrollador en una empresa y aunque fue una experiencia muy bonita, ya retomaré nuevamente todo.

Espero que les haya servido. Cualquier aporte es bienvenido.

Un saludo.


#4
    Muchos son los problemas que se explotan sin impunidad alguna por los atacantes en la actualidad. Independientemente de la vulnerabilidad(bien sea técnica y/o de capa 8[errores humanos]) el atacante la aprovechará. Una de las características principales de esta problemática, se debe al desconocimiento y desinterés por parte de los desarrolladores para minimizar cualquier brecha de seguridad en su sistema que creen utópicamente infalible.

    Basándonos con ésta premisa, podemos entonces deducir que, la mayoría de las casas de desarrollo, se enfocan en sacar sistemas escalables, flexibles y pensados a futuro, cumpliendo netamente con la ideología de alta cohesión y bajo acoplamiento.


    ¿Eres desarrollador/a?

    Si eres desarrollador, deberías hacerte las siguientes preguntas básicas antes de proseguir a lo técnico:

    • ¿Cuál es la metodología que usas para realizarle auditoria a tu aplicación?. -> Owasp | ¿Por qué Owasp?.
      Owasp no siempre es el indicado para realizar pentesting a tus aplicaciones web. La metodología muestra un top el cual puede resultar no ser el adecuado para lo que estás usando. Por ejemplo, si usas Rails, las No tienes permitido ver los links. Registrarse o Entrar a mi cuenta son un problema, y esta, no aparece en el Owasp Top(2013 & 2017).Te puedo nombrar otro ejemplo y es el de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
      Aclaro que su última actualización fue ya hace algunos años, pero si nos centramos con ésta lógica, en el Top 10 de Owasp 2016 va liderando la inyección SQL y ésta apareció hace más de 20 años(1998, para ser más precisos).
    • ¿Te confías de tu Framework?
      Grave error. De los desarrolladores que conozco, el 99% de ellos se confían en las funciones que sanitizan las entradas de su aplicación. Por ejemplo,  ¿Sabes que se han descubierto fallos en las mismas funciones, cierto?. No digo que las funciones no deberían tener fallos, pero los desarrolladores deberían además de aplicar dichas funciones, aplicar más filtros para controlar cualquier entrada maliciosa por parte del usuario.
    • ¿Qué versión de DBMS usas?
      En ocasiones, los DBMS(DataBase Management System) no se actualizan porque la aplicación genera errores al realizar las consultas por la versión de ésta. Es un gran problema, pues hemos visto que hay versiones de Mysql por ejemplo, donde en versiones anteriores, se puede realizar escalación de privilegios, lo mismo que en Oracle, MariaDB, entre otros.


    Es difícil, realmente difícil protegerse ante cualquier amenaza, porque el precedente es y será el riesgo de los activos con los que contemos. Pero si de algo estoy seguro, es que nosotros como Pentesters, debemos desarrollar el ojo clínico para lo que hacemos. Cada cosa afecta al sistema que queremos romper, es el entorno que se convertirá en nuestro habitat y una vez lo conozcamos, podremos conocer las posibles vulnerabilidades y explotarlas.

    Sin más preámbulo, vamos a lo técnico y les mostraré algunas vulnerabilidades que podrán parecer de impacto bajo, pero bien explotadas, pueden afectar hasta al mismo gerente de una empresa.

    REDIRECCIONES CONTROLABLES


    Ilustración 1. Plugin de Firefox para controlar las direcciones.

    El plugin de NoRedirect, nos permite controlar las redirecciones de sitio y tomar control a nuestro antojo. Si nosotros desearamos ingresar a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, no nos dejaría, porque siempre nos va a redireccionar a login.php. Si lo viéramos desde el código, sería algo como esto:
    [/list]
    Código: php

    <?php
    if(isset($_COOKIE['id_user'])){
    header('Location: index.php');
    }else{
    //Si la cookie no existe, entonces que siempre me lleve al login.php
    header('Location: login.php');
    }
        ?>



    Desde ese punto de vista, lo único que haríamos es bajar el plugin para firefox, instalarlo y luego añadir el sitio del panel de administración con alguna expresion regular si lo deseamos.


    Ilustración 2. Añadir sitio para bloquear el redirect.


    ABRIR NUEVAS PESTAÑAS

    La etiqueta de a href es una de las más usadas en cualquier aplicativo web. De hecho, es usada con el atributo "_blank" para abrirle una nueva pestaña al usuario y evitarle molestias a este. Un claro ejemplo, es este:
    Código: html5

    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
    <a href="https://google.com" target="_blank">Google</a>
    </body>
    </html>



    Ilustración 3. Hipervinculo de HTML.

    Si presionamos en el hipervinculo, nos llevará a Google, claro está. El problema es que la mayoría de páginas web implementan opciones como: "el usuario podrá crear un link de su biografia y poner un sitio web o incluso, comentar con un link de su sitio web". Generalmente(si lo vemos desde el lado de los Frameworks), validan desde el Controlador que el link debe ir de una forma en particular. Si un atacante logra observar que puede crear un link del siguiente estilo, podrá redireccionar sin que se de cuenta al usuario a una página para realizar phishing:
    Código: html5
    <a target="_blank" href="http://viinacademy.com/PoCUnderc0de/index.html"> Mi sitio! </a>


    Y se vería de la siguiente forma:


    Ilustración 4. Como se vería el hipervinculo del atacante.

    Donde el link del atacante(el que está en el atributo de href) contiene lo siguiente:

    Código: html5
    <html>
    <script>
    if (window.opener) window.opener.parent.location.replace('https://underc0de.org/foro');
    if (window.parent != window) window.parent.location.replace('https://underc0de.org/foro');
    </script>

    The rules of life:

    </html>


    Ahora, si un usuario da click y tiene muchas pestañas abiertas(la mayoría de las personas siempre las tienen), le va a abrir una nueva pestaña que abrirá el link de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y le mostrará "The rules of life" pero a la página original(la de localhost/Test/index.html) la redireccionará a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Esa redirección, bien podría ser un scam o una página maliciosa, dependiendo de la creatividad del atacante.

    Resumiendo esta técnica, parándonos como atacantes, serían los siguientes pasos:


    • Ingresar a la página de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.
    • Ingresar a alguna vista que nos permita crear un link.
    • Verificar que permitan usar el atributo de target='blank_'".
    • Crear un scam(página idéntica al sitio legítimo) de la página y tenerlo hospedado en un servidor.
    • Poner en un link la página junto a un texto que sea interesante.

    ¿Cómo es posible solucionarlo?

    Siempre deberás usar rel="noopener noreferrer" cuando uses el atributo target="_blank". Esto no permitirá redirigir a los usuarios.

    INYECCIONES SQL

    Qué más que las más conocidas como inyecciones SQL. Daré algunos tips desde el lado del pentester para descubrir inyecciones en lugares donde no se cree que las aplicaciones las tienen. Al ser una de las vulnerabilidades más explotadas, creo que los desarrolladores deben enfocarse en el BUEN filtro de sus campos.


    • Intentar poner la comilla(') probablemente es una de las primeras opciones que intentamos al realizar pentest en una aplicación. Sin embargo, esto puede provocar distintos filtros y una redirección a distintas páginas de error para encubrir la SQLi. Debes intentar generar errores, bien sea, basadas en error y/o en unión, siempre pensando en cómo respondería el DBMS.
    • ¿Qué pasa si comentas alguna sentencia? por ejemplo: %23' o --', pues como sabrán, así se hacen los comentarios cuando hacemos procedimientos almacenados pero al realizar pentest en una aplicación, esto puede generar errores(porque se le ordena que ignore lo que sigue de la consulta al recibir el parámetro).
    • A veces, los desarrolladores pasan funciones como addslashes,htmlspecialchars, entre otras, con el fin de sanitizar las entradas. Sin embargo, la documentación de PHP NO recomiendo usar éste tipo de funciones, pues aparte de estar obsoletas, se ha demostrado que son obsoletas realizando inyecciones de charsets. En especiales, estas funciones filtran la comilla simple y/o dobles("/'), pero podrás intentar poniendo comparaciones de variables que no serán válidos, como @@verxi0n(@@version), @@Slep(@sleep), entre otr@s.
    • Si la entrada es un número, puedes intentar hacer operaciones aritméticas y de ahí, intentar con otros vectores de ataque.
      Por ejemplo, puedes hacer cosas como id=365--' o id=1-2.

    Algunas de éstas vulnerabilidades me han servido para estar en el HoF(Hall Of Fame) de algunas empresas y créanme, los desarrolladores generalmente cometen las mismas fallas debido al uso de metodologías ágiles, de tiempo o de cualquier otro factor que pueda afectar su rendimiento vs cumplimiento.

    Cualquier duda,opinión y/o sugerencia, será bien recibida.

    Un saludo.
    #5
    Una duda que quizá a muchos ataca, una duda que probablemente genera desconocimiento.
    Quizá alguna vez hayas escuchado de los programas denominados Bug Bounty. Bug Bounty hace alusión al dinero destinado por las organizaciones para la corrección de vulnerabilidades de sus activos con el fin de que los hackers estén motivados a realizar una divulgación responsable a través de plataformas que actúan como intermediarias como Bug Crowd, HackerOne, CrowdCurity, BountyFactory, VulnScope, entre otras.

    ¿Qué necesitas?

    No necesitas ningún requisito en la mayoría de plataformas, exceptuando algunas, como VulnScope que sí te piden que firmes un contrato de confidencialidad pero ningún requerimiento alto. Entonces, en resumen, lo único que hace falta es registrarse en alguna de las plataformas antes mencionadas, unirte a un programa(en algunas programas) y comenzar a realizar resportes.


    He creado un diagrama en el cual se podrá observar de mejor manera el proceso de Bug Bounty, tanto desde la perspectiva de las empresas como desde los hunters.


    El proceso, a groso modo, es el siguiente:


    • La compañía decide crear un programa de Bug Bounty.
    • La compañía elige la plataforma en donde desea publicarlo[HackerOne, BugCrowd, BountyFactory].
    • Esta, realiza las respectivas reglas y políticas para cuando el programa se lance al público.
    • Una vez lanzado al público, los hunters(cazadores de recompensas) podrán comenzar a testear las aplicaciones.
    • Si un hunter encuentra un fallo, publica el reporte(inicialmente de manera privada) en la plataforma al respectivo programa.
    • La compañía, independientemente de como valide las vulnerabilidades, acepta o rechaza de que es una vulnerabilidad.
    • El hunter es remunerado de alguna forma.
    • La plataforma le concede los respectivos puntos al hunter.
    • El reporte se cierra y dependiendo de las políticas de la empresa, se hace público o privado.


    Comprendiendo el concepto, creo que es necesario mencionar el por qué no todo es tan sencillo como parece.
    Cuando vas en busca de un XSS, una SQLi o un CSRF de una de las aplicaciones que está in-scope(en el alcance) del programa, usualmente, ya ha sido reportada con anticipación. Sin embargo, las hay, pero hay que profundizar más en el aplicativo, debido a que en algún momento, una persona testeó en lo que tú estás testeando ahora: buscador, login, formulario de registro, configuraciones de perfil, entre otras. De hecho, muchos de los vectores de ataque que se han encontrado recientemente en RockstarGames(un XSS en el D0M) debió usar parte de mathml para demostrar que era válido el reporte.

    Volviendo a lo que nos compete, daré algunos consejos que de seguro te servirán si deseas entrar al rubro.

    Código fuente

    Sí, así como lo ves. Sé que muchos que se dedican a la seguridad informática, no conocen o no manejan bien la programación y ahí existe un grave problema. ¿Por qué?. En los programas, muchas veces piden que también se testeen aplicaciones en Android/iOS o incluso en los aplicativos que deseen testear, proveen el código en GitHub. Teniendo acceso al código, se puede hacer mucho: ver cómo se envían/reciben las entradas de usuario desde el cliente al servidor, revisar la longitud con la que se recibe, comprobar si existe algún acceso en el código comentado y otra cantidad de variables que se consideran importantes cuando se está haciendo una auditoría de código. De hecho, muchas veces lo que se suele hacer es montar la aplicación en local, que a pesar de un poco más de trabajo, es mucho mejor. Se hace esto, con el fin de evitar los firewalls, que a pesar de que tiene solución(hacerles bypass), molesta.

    Metodología

    En primera medida, debes revisar y apuntar los dominios/subdominios que estén en el alcance del programa. Luego, realizar un reconocimiento exhaustivo de estos. Debes usar todo lo que consideres necesario, ya que esto es vital para luego proceder a realizar las pruebas de concepto. Podrás buscar también los subdominios en caso de que ellos lo deseen(*.example.com). Recuerda que para esto, también puedes usar los dorks que son muy útiles. Luego, comienza por cada uno de los objetivos, verificando si tiene un CMS, plugins, servicios que están arriba, entre otros. Haz pruebas de fuzzing, pues son muy útiles para revelar errores y exponer vulnerabilidades. Procede a intentar impactar de una forma más profunda en la vulnerabilidad(¡LEE BIEN LAS POLÍTICAS DEL PROGRAMA!).


    Prueba de concepto

    Si en los pasos anteriores, encontraste una vulnerabilidad, deberás comprobarla con una pequeña prueba de concepto. Este aspecto es uno de los más fundamentales que pueden existir a la hora de realizar reportes, ya que si una PoC no la pueden replicar, no será considerado como bug. Mis recomendaciones son: intenta varios vectores de ataque, luego captura cómo reproduciste tú la vulnerabilidad y enumeralo por pasos en el reporte.
    Deberás adjuntar también capturas de pantalla, para que quede en evidencia de que sí existe tal vulnerabilidad y así evitar un posible cierre de reporte.

    Reporte de vulnerabilidad

    Aparte de la PoC, deberás saber comunicar de una manera apropiada lo que encontraste. Que los que vayan a recibir el reporte sean técnicos, no quiere decir que vayan a entender lo que les estás comunicando. Por ende, debes hacer un reporte claro y contundente que posea: detalles(de qué trata el reporte), severidad(calificación de la brecha), impacto(cuánto riesgo existe al tener esta brecha), explotabilidad(cómo podría afectar a...) y remediación(posibles correciones que podría tomar la empresa).


    Posiblemente, tus primeros reportes sean duplicados, pero no debes desmotivarte, pues eso quiere decir que debes conocer un poco más de la aplicación que estás testeando. Si en algún caso, el reporte es inválido, deberás profundizar más en los conceptos que crees que te hagan falta(sobretodo, técnicos).

    A continuación, les dejaré unos plugins que les podrían servir, tanto para Firefox como para Chrome:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    A continuación, un vídeo en el cual también doy otros consejos


    Cualquier sugerencia, duda u opinión, será bien recibida.
    #6
    El objetivo principal de éste post es minimizar cualquier posible fuga si queremos profundizar por darknets o incluso por la clearnet.
    Como había prometido hace unos meses atrás, quería traer tutoriales enseñando lo que he aprendido acerca de Anonimato / Privacidad / Seguridad. Con el motivo anterior, antes de traer más tutoriales propios de los temas mencionados, deberemos configurar bien nuestro navegador.

    Antes de comenzar les mencionaré que el "anonimato" también comienza desde el sistema operativo. En mi caso, uso Arch Linux, sin embargo, uso Windows también, para distintos motivos(grabar, juegos, entre otros) pero no para hacer mis tareas principales. Hago énfasis que ésta guía está enfatizada para sistemas operativos Open Source, como Gnu/Linux. Sistemas operativos como MacOSX y Windows por obligación están atados a manos y cuello ante filtraciones, ya sean efímeras o persistentes en el tiempo.

    Firefox realmente es un proyecto magnífico, por eso esta guía estará relacionada con éste explorador web.
    Firefox, tiene varias opciones para que podamos trabajar con el. Mediante firefox --help listaremos dichas opciones:


    Existe la opción de los perfiles creados para la instancia que Firefox usa actualmente. Si desearamos, Firefox nos permitirá crear/ejecutar paralelamente TODOS los perfiles que nos apatezcan. Entonces ejecutando el comando de firefox --ProfileManager se nos listarán los usuarios que guarda nuestra Firefox.



    El perfil "default" es el predeterminado, con el que nos viene Firefox. Crearemos uno nuevo con sus respectivas configuraciones. Desmarcando la segunda opción, Firefox cada vez que se inicie nos preguntará cuál perfil deseamos usar. De éste modo, es como podremos usar varios perfiles a la vez.

    Una vez dado click en el botón de "crear", aparecerá el asistgente de creacicón de perfiles:


    El siguiente paso será asignar un nombre que deseemos al perfil y también a su respectica carpeta con el fin de:
    -> Guardar el perfil en medios extraíbles(como USB's, HDD's externos, la nube) para usar el perfil en cualquier otro computador.
    -> Destruir rápidamente nuestro perfil de navegación sin problema alguno.



    Una vez creado correctamente nuestro perfil, procederemos a iniciarlo dándole click en "Start Firefox" con nuestro perfil seleccionado.

    Nos vamos a la pestaña de "Preferencias":


    Como muchos sabrán, No tienes permitido ver los links. Registrarse o Entrar a mi cuenta para determinar cuáles son las páginas "peligrosas" y por este motivo, desactivaremos ésta opción:


    También desactivaremos la opción que permite a Firefox enviar información técnica a Mozilla junto con la protección de Tracking.





    Add-ons obligatorios

    A continuación, suministraré una lista de extensiones que serán muy importantes para nuestro objetivo:
    NoSCript-> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    Nos permitirá bloquear todo tipo de Scripts que puedan ser usados en nuestra contra. Es muy útil, incluso éste nos avisa y nos bloquea muchos ataques de XSS(porque bloquea scripts).

    HTTPs EveryWhere -> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    Con ésta extensión podremos detectar cuáles son páginas fake(falsas) y con ello, obtener un poco más de seguridad al navegar.

    Random Agent Spoofing -> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    Nos permite cambiar nuestro user-agent o también cambiar perfiles de navegadores a nuestro gusto. Tiene diversas características, pero la principal es que engañaremos a páginas donde esté implementado el Tracking o con rasteradores.

    Privacy Badger -> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    Impedirá que los sitios con de anunciantes y otros rastreadores realicen un seguimiento de dónde vienes, a dónde vas y qué páginas miras en la web. Si Privacy Badger detecta alguna acción "inusual" de éste tipo, automáticamente lo bloqueará.




    Procederé a explicarles cómo configurar el RAS(Random Agent Spoofing):


    Tab Profile:
    Como podrán notar, podremos seleccionar qué tipo de perfil de navegador deseamos al navegar. Desde seleccionar un perfil móvil hasta de escritorio. Incluso, podemos indicarle que sea aleatorio y así configurarle la otra opción que sea cambiar periódicamente.

    Tab Headers:

    Muchas veces, las páginas contienen trackers que recopilan desde qué página venimos, como por ejemplo Facebook. En esta pestaña hay bastante utilidad, teniendo en cuenta que que cambiaremos las cabeceras junto con otros aspectos que no deseamos que la mayoría de páginas tomen.



    Tab Options:

    Es bueno detener cualquier script de inyección, y en la pestaña de opciones nos permite implementar esto. De hecho, pueden cambiar el tamaño de pantalla, el cual también es un factor que muchos desconocen, pero que sirve para identificar y/o hacer footprinting.


    En las opciones estándar, se debería bloquear lo que les podría dar indicios, como el recurso del tiempo del dom, las búsquedas sugeridas, la geolocalización, entre otras.




    Y que no se nos olvide deshabilitar las Cookies, es un punto muy importante.

    Para finalizar, tendremos que desactivar las opciones de reporte.



    Con la configuración anterior y los add-ons que les recomendé, se podría asumir que tendremos un poco más de privacidad, sin embargo, podrás tener muchos problemas en páginas que sí se requiera por ejemplo habilitar Cookies, desactivar scripts para el funcionamiento de la página(por ejemplo, formularios[me refiero a las páginas que validan con JS y no los que lo hacen con los de HTML5]) y entre otras cosas que tú mism@ te darás cuenta.




    Para comprobar un poco cómo nos ha quedado, la EFF nos ofrece un análisis con su página de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta:


    Lo que haremos es, con nuestros add-ons activos, seleccionar "Testear con una compañia real" y presionar en "TEST ME".

    Ésto, dará lugar a que realice un test con una empresa real, evaluando los puntos que hemos estado desglosando a lo largo del post.


    Ahora presionamos en ver resultados completos:


    Y como se podrá apreciar, arroja datos que no son los míos, pues por ejemplo, yo tengo Arch.
    Podrían también antes de todo, intentar hacer el test sin los add-ons para comparar.

    Existe también software para que podamos "cambiar" nuestra Mac Address. Para ello, tienen MacAddressChanger, pueden probarlo y descargarlo de su página oficial:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Quiero plantear una desventaja del add-on de RAS y es que aún no está disponible para nuevas versiones de browsers, como lo es Firefox Quantum, entre otras.
    Espero que de igual forma les sirva, quizá para hacerles caer en cuenta que falta mucho por trabajar en el lado de privacidad, desde conocer cómo "nos reconocen" hasta saber cómo poder intentar evitar todo este tema.

    Les recuerdo, que esto no quiere decir que ya serán invisibles, sino como repito, se reduce drásticamente cualquier intento de usurpación por gobiernos, agencias(NSA) y cualquier otra organización.

    Cualquier duda,opinión y/o sugerencia, es bien recibida.

    Un saludo.
    #7
    ¿Qué son las WebShells?

    Con @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta tuvimos la oportunidad de hablar sobre WebShells.

    Un tema muy amplio, donde sitúa temas importantes como vulnerabilidades junto a su respectiva explotación(y post-explotación).

    Los motivos de subir una WebShell(Backdoor) varían desde:

    • El momento indicado para realizar un ataque
    • Intruir al Sistema Operativo
    • Ejecución arbitraria de comando

    También depende las ideologías, ciberdelitos, análisis de inteligencia, entre otr@s.

    Antes de comenzar el post, debemos brindar conocimientos sobre que es una WebShell.




    WebShell y sus funciones

    Las WebShells, son puertas traseras que son subidas al servidor(de manera reversa/directa) para obtener acceso completo a él.

    Independientemente si se cuenta o no con permisos de escritura, es posible realizar diversas cosas.

    Incluso, es posible hacer Bypass con la Navaja Suiza cuando tenemos un Backdoor en un servidor donde no tenemos los permisos de lectura|escritura|ejecución.

    Hacemos hincapié en que las WebShells podemos subir a servidores Windows, Linux.

    Sin embargo, el hecho no está en subir un backdoor a un servidor que maneja tecnologías que no interprete; no debemos subir a un servidor que use tecnología JSP un backdoor escrito en PHP, simplemente, será inútil.

    Usualmente, las WebShells que existen en línea y están disponibles para su descarga, poseen interfaz web.

    El término Shell, implica el acceso a línea de comandos del estilo de Unix que es entregado a través del servidor web.

    Las funcionalidades que poseen WebShells tradicionales son:

    • Conocer archivos del servidor.
    • Conectarnos a algún motor de base de datos.
    • Herramientas de String para conversiones.
    • Bruteforce.
    • Administrar procesos.

    A pesar que existan más funcionalidades, las anteriores son algunas de ellas. Dependiendo la Webshell, incrementan o disminuyen las características.




    ¿Cómo se sube una WebShell a un servidor?

    Cuando deseamos tener un backdoor en 'un' sitio web, el primer paso es explotar la vulnerabilidad y subir el backdoor creado(o descargado[cuidado con los que descargan]).

    Asumiendo que previamente han realizado los procedimientos inmutables para encontrar el fallo.

    Ahora, las vulnerabilidades web, se han extendido a lo largo del tiempo:

    # Vulnerabilidades > Tipo de Vulnerabilidades.

    Cumpliendo la anterior 'fórmula', nuestra proeza como Pentesters se ha maximizado, por intentar identificar la mayor parte de vulnerabilidades en los servidores extendidos alrededor del mundo.

    Por tanto, mientras se posea una vulnerabilidad que sea explotable donde permita subir archivos, es posible inyectar nuestro backdoor.

    De hecho, existen webs que muestran las vulnerabilidades mundiales, por países y demás segmentación que son muy útiles.

    Les mostraré una. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta permite analizar los tipos de vulnerabilidades frecuentes en distintos años, vectores de ataque filtrados por diferentes tópicos como el top de vulnerabilidades, el análisis por países de éstas, incluso por universidades, entre otras.

    Como recuerdo, el caso tan "famoso" de Rasputin, el cual mencionaba que había creado una tool privada, la cual encontraba, explotaba y backdoreaba los servidores que sus matchs fueran TRUE.

    Recuerdo que algunas personas no creían hasta que salió un leak que corroboró lo de Rasputin.

    No me extraña éste tipo de herramientas, ya que poseo una priv8 que desarrollé y presenté en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

    El tema de Rasputin no tuvo tanta represalia por el motivo de que el/los gobiernos mediante los índices de Vaughn esto no logró ser 'apocalíptico', sobresaltando de manera 'legal' la FOIA(es una ley que otorga a todos los miembros de los Estados Unidos el derecho de conocer la información federal del gobierno).

    A continuación, una imagen de lo que RecorderFuture capturó (y lo que muchos vimos) de un Pastebin (eliminado) que salió precisamente de bases de datos donde estaban los vectores de las SQLi.

    Habían vulnerabilidades de universidades como la de Cambridge, Oxford, Washington, Arizon, Tennessee, entre otras.


    Ilustración 1. Gráfica de resultados válidos de Inyecciones SQL.

    Estos backdoors se vendían y de hecho, algunos aún no han reparado las fallas.

    Ni los mismos sitios grandes se libran de vulnerabilidades, porque somos humanos y pecamos por distracción, pereza o desconocimiento.

    La respuesta es fácil:

    • Analizar
    • Encontrar una vulnerabilidad {en lo posible critica}
    • Explotar
    • Analizar viabilidad de subir archivos por algún medio
    • Congrats!




    ¿Puedo encontrar una WebShell en mi servidor?

    ¡Claro que es posible! siempre y cuando tu sitio web no sea muy grande o no dispongas de muchos servidores que sólo controles tú.

    Explayándome, si tienes pocos servidores y puedes revisarlos a diarios, esa vigilancia es perfecta.

    Sin embargo, esto no pasa en Bancos o Multinacionales, en términos inmensurables, es incontenible, las empresas poseen cientos de servidores web, con distintos sistemas operativos, aplicaciones, usuarios locales agregando/eliminando/editando archivos y entre otras variables, hacen que la deteccion de un backdoor sea extremadamente compleja.

    Como aclaramos en el vídeo, existen herramientas como:

    • NeoPI.
    • Shell Detector.
    • LMD | Maldet + WSS(Web Shell Scanner).

    Aún con estas herramientas no se logra reconocer en un 100% una Webshell sin falsos positivos o, con reconocimiento que es infalible.




    ¿Cómo funciona?

    Hay dos modalidades de cómo funciona una WebShell:

    • Subir del lado del servidor completamente.
    • Subir del lado del servidor un archivo de conexión pero hacer la conexión directa desde el lado del cliente.


    La primera opción, hay desventajas, como los logs, el tipo de requests y entre otras.

    Desde el lado del cliente, es mucho mejor, siempre y cuando se haya codeado de manera idónea.

    En resumen, cuando tengan que escoger entre si subirla del lado del servidor completamente o del lado del cliente, seleccionen la segunda.

    Nosotros en el vídeo mostramos una Webshell del lado del cliente que es sumamente poderosa y útil, es de @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

    El post lo pueden abrir presionando No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y conocer más a fondo de cómo funciona esta Webshell(sin backdoors xD).

    A continuación, pueden descargar los archivos de prueba, donde existe una inyección de código SQL para posteriormente subir el backdoor.

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




    ¡Hagamos una PoC!

    Una vez descargados los archivos, debe proceder a iniciar nuestro Apache e importar la base de datos.

    En mi caso, uso Arch, pero eso no afecta en nada si posees Ubuntu, Windows, Debian, entre otras.

    Almacenamos los archivos en nuestro gestor de servidor local, Wamp/Xampp/Lampp, entre otr@s.

    Debería quedar:


    Ilustración 2. Archivos subidos al servidor.


    Ilustración 3. Index de la página web.

    Como notaran, solo quedaría importar la base de datos, vía PhpMyAdmin o vía CLI.

    Una vez importada, quedaría de la siguiente manera:


    Ilustración 4. Base de datos cargada correctamente.

    Una vez esté previamente subido, podremos hacer la PoC con el vídeo que dejaremos al final :).




    Otros intereses

    Como mostramos, existen muchas más webshells, unas creativas, otras no, pero queremos hacer énfasis en algo: podemos realizar webshells más avanzadas, dependiendo nuestra creatividad y eso es más que suficiente para hacer Bypass a cualquier sistema de control.



    Streaming

    Sin más, en el Streaming pueden opinar qué tema quieren que mostremos ;).

    Próximamente, tenemos pensado algo que sabemos también gustará.


    Además, queremos agradecer a la comunidad de Underc0de y de VIINVIDEOS HD, nos brindan soporte completamente para crear un espacio agradable donde nos consumen nuestras ganas de aprender.

    Post creado por: @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta & @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.
    #8



    La representación actual de la seguridad, ha sido una auténtica problemática para las empresas. Sabemos que si destinan dinero, de último recurso será la seguridad. Aclaro que esto está cambiando. Pero como todo, esto no es de la noche a la mañana.
    Para los usuarios que no son técnicos ni están en nuestra área, son invulnerables las empresas como Facebook, Spotify, Blizzard, Riot Games, Steam, entre otras. Las personas solemos vislumbrar la seguridad, porque como cualquier otro tema, creemos que nunca nos pasará.

    Quizás, esto se deba a la manera en la que nos educan, porque no nos enseñan que somos humanos. A pesar de que el altruismo en nuestra sociedad no es un hecho concebible de manera inconsciente, es irrefutable que somos un defecto hecho personas. Por esa y muchísimas más razones, no es posible confirmar que un sistema es seguro. Ahí lo "razonable" se convierte en irracional, y es cuando debemos aceptar que siempre habrá personas más inteligentes que nosotros y aprender a desaprender.

    Una de las concepciones que tenemos los que buscamos vulnerabilidades en los sistemas, es que nuestra curiosidad nos mueve en conjunto a la perseverancia. Es pensar más allá. Es ver puertas donde la gente ve paredes.

    Underc0de, ha sido un punto de equilibrio entre gente de un nivel técnico muy alto y también en parte del conocimiento centralizado.

    A las empresas(y lo menciono por experiencia) les incomoda cuando les avisan un fallo de seguridad en sus sistemas. Posiblemente porque su mentalidad es un poco cerrada.

    Con esta introducción, quiero mostrarles dos vulnerabilidades en dos empresas pragmáticamente grandes, concernientes a vídeojuegos y aclaro que tengo fallos más graves, pero por el momento, publicaré estas.

    ABORDANDO AL PIRATA


    Hace años, solía jugar un juego llamado No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, de la empresa No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. El juego, a groso modo, es de piratas en barcos, donde el juego te ofrece características como pertenecer a clanes, tomar islas, abordar barcos, entre otras que lo hacen un juego divertido.
    Como es un juego Pay2win(ahora más que antes), solía buscarle fallos y subirlos al canal de Youtube que creé. Lo menciono porque, me movía la curiosidad saber si podía obtener las mismas características de pago, con algún bug. Y así fue como trascendió mi cuenta, entre los bugs que encontraba y subía, y entre los que no. Esto me hizo bastante grande. No en la cuestión del juego, sino en la cuestión de que aprendí bastante. 

    Así que hace unos meses me dispuse a encontrar y reportar vulnerabilidades de este juego, y con esto fue lo que me encontré.

    Entrando a la página oficial, nos podemos registrar o crear una nueva cuenta. En éste caso, vamos a registrarnos.


    Ilustración 1. Login de Seafight.

    Ingresamos nuestros datos para el registro.


    Ilustración 2. Datos de registro para ingresar a Seafight.

    Una vez presionado el botón de "Juega ahora gratis", vemos el primer anuncio(y apenas entrando xD) de una súper promo de perlas, que las adquieres obviamente con dinero.


    ...

    ¡Eh! me equivoqué de imagen.


    Ilustración 3. Registro correcto.

    Ahora nos remitimos a "Camarote" > "Correo":


    Ilustración 4. Pestaña para envíar mensajes entre jugadores.

    Ahora, añadiremos en "Nombre de Usuario", nuestro nombre de Usuario. Posteriormente, en el Asunto, podemos poner cualquier cosa. En el cuerpo del mensaje, está el vector de ataque.


    Ilustración 5. Vector de ataque en el cuerpo de mensaje.

    ¿Por qué? ellos mandan por método POST la información, y eso está bien. El problema radica, en que no validan que no pueda inyectar código malicioso de JavaScript. Cuando ocurre esto, en una sección donde el único enfoque es enviarse información entre jugadores, podemos asumir que es un fallo de seguridad grave.

    He diseñado el siguiente escenario, donde podrán comprender de manera más detallada cómo podría afectar de manera múltiple a los jugadores de la plataforma. Luego de ello, vendrá la PoC.


    Ilustración 6. Diagrama donde se muestra el funcionamiento de los mensajes de Seafight.

    POST DATA en realidad vendría siendo nuestro código malicioso. Teniendo claro esto, vamos a proceder a inyectar nuestro payload.

    Inyectemos un payload en el navegador de Chrome:


    Ilustración 7. Código malicioso en el cuerpo del mensaje.

    Y magia, nos bloquea Chrome >:( :


    Ilustración 8. Bloqueo de Chrome con XSS_AUDITOR.

    Y obviamente, al bloquearlo, no se mostraría nuestra alerta(aunque esté allí pero nuestro cliente«Web Browser» no lo muestre).


    Ilustración 9. Código malicioso estático correctamente.

    Mozilla Firefox

    No estoy patrocinando Mozilla, pero ya notarán las diferencias.
    Me cree una cuenta nueva, denominada: "AquilesClavoElBug2" y ahí notarán que puse el código malicioso.


    Ilustración 10. Incrustando el código malicioso en nueva cuenta.

    Y voilá:


    Ilustración 10. El cliente muestra correctamente la alerta.

    Como podrán notar, esas son las dos diferencias entre Chrome y Firefox.

    Podemos hacer Bypass en éste tipo de casos, pero no me centraré en ello en éste post.

    En el próximo post, demostraré cómo explotaremos esto de una forma más sustancial, claro está, a modo de prevención y sin querer hacerle daño a nadie.

    Por otra parte, quisiera mostrar el correo que ellos me respondieron ante la explicación que les quise dar mencionandoles que poseen un fallo de seguridad:


    Ilustración 11. Respuesta de Bigpoint ante la información de una falla de seguridad.

    Luego de eso, no respondieron.

    Steam

    Ésta página cuenta con varias vulnerabilidades, ahora, les mostraré un Open Redirect.
    Los open redirect generalmente tienen una tabla de severidad media, debido a el impacto que puede afectar a cualquier persona que caiga. Por ejemplo, podríamos redirigir desde un sitio original a un sitio de phishing a las personas y así quedarnos con sus datos. La verdad, son muchas posibilidades que tendríamos con ese vector de ataque.

    Si entramos a algún vídeojuego(No tienes permitido ver los links. Registrarse o Entrar a mi cuenta), que quisiéramos comprar, veríamos algo como esto:


    Ilustración 12. For Honor - Juego de Steam.

    Si bajamos, podremos notar que hay un botón que se denomina: "Visitar el Sitio Web" y redirecciona a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.


    Ilustración 13. Redirección desde Steam a páginas de juegos.


    El problema viene de Steam, debido a que su "linkfilter" hace una redirección absoluta a una URL proporcionada. Por esa misma razón, las URLs de redirección de Steam quedan de la siguiente manera:

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

    Esto ocurre únicamente cuando desde la página oficial de Steam presionamos el botón "Visitar el Sitio Web".

    • Si lo hacemos directamente, nos aparece el aviso que nos indica que "no es un sitio oficial de Steam".
    • Si lo hacemos dentro de la página de Steam, como lo he indicado, se redirecciona correctamente.

    Pero podríamos hacer lo siguiente:

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

    La excepción ocurre cuando al abrirlo directamente, nos sale lo siguiente:


    Ilustración 14. Filtro de redirección de Steam.

    Entonces viendo que no funcionaba de esa manera, creé este pequeño exploit en php, que lo pueden encontrar en:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Código: php

    <?php
    $curl_h = curl_init('https://steamcommunity.com/linkfilter/?url=hotmail.com');


    # Modify Headers
    curl_setopt($curl_h, CURLOPT_HTTPHEADER,
        array(
    'Host: steamcommunity.com',
    'Cookie: steamCountry=CO"%"7C98139622f4f41de49e0ad1ebcb216d70; steamLogin=76561198809901810"%"7C"%"7C639A3671DD789F0A0A852C7E39F271211527EC59; steamLoginSecure=76561198809901810"%"7C"%"7CF8C6CD7AB23B4060D130444791178356E37B7E7F; sessionid=ce46ae916feb5f18a3e8c6f6; _ga=GA1.2.589967724.1517180624; _gid=GA1.2.1251830587.1517180624; timezoneOffset=-18000,0; recentlyVisitedAppHubs=304390',
                  'User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0',
                  'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                  'Referer: http://store.steampowered.com/app/304390/FOR_HONOR',
                  'Connection: keep-alive',
                  'Upgrade-Insecure-Requests: 1'
        )
       
    );
    # Return Transfer
    curl_setopt($curl_h, CURLOPT_RETURNTRANSFER, true);
    //Follow Redirections
    curl_setopt($curl_h, CURLOPT_FOLLOWLOCATION, true);


    //Execute the request
    $data = curl_exec($curl_h);

    //Close cURL Handle.
    curl_close($curl_h);
    echo $data;
    echo 'This is PoC By: Mortal_Poison #Underc0de #VIINVIDEOSHD';
    ?>


    Como podrán notar, hace una redirección satisfactoria, desde VIINACADEMY > STEAM > HOTMAIL. No es la única manera de explotar esto, pero simplemente es una pequeña prueba de concepto donde demuestro el open redirect(y no menciono de las posibilidades de XSS que posee en ese parámetro[descúbranlo por ustedes mismos]).

    En resumen y comprendiendo el exploit, Steam no verifica si sí es legítimo el Referer y el redireccionamiento, ya que como notaron, es como si le estuviera diciendo: "vengo de Steam y voy para VIINACADEMY" y Steam respondiera:"viene de Steam, es correcto, redireccionando...".

    Acuérdense que hasta se podría poner ese Open Redirect en herramientas como UFONet que aprovechan éste tipo de vulnerabilidades para hacer ataques de DDoS.

    Posdata: Aclaro que reporté las vulnerabilidades, pero es imposible cuando las empresas no se disponen a colaborar para solucionar estas vulnerabilidades donde a la final, los afectados somos nosotros. En otros entornos, será tu novi@, tus amigos, tu familia, tú. Y dime ¿Estás dispuesto/a a exigir que las empresas fortalezcan su seguridad?.

    Cualquier sugerencia/duda u opinión es bien recibida.

    A continuación, les dejo un vídeo que he preparado para la explicación de éste post :). Un abrazo para todos.


    Próximamente puedo mostrar más fallos a más empresas ;D, dependiendo de cómo les parece éste post.
    #9

    No es cuestión de ego, es cuestión de realismo. Antes de que se acabe el año, sí que me gustaría dejar mi punto de vista ante lo que es hoy en día la seguridad informática. Denominé el título de esta manera, debido a tantas cosas que se me pasaron por la cabeza, entre ellas, las mentiras. El nuevo año que comenzará, sé que nuevas personas se incorporarán a éste mundo y otras se irán, como el ciclo natural de todo. Aquí en Underc0de sé que hay personas de muchísimo nivel, pero también me he dado cuenta que muchos entran simplemente para "subirse". Como en todas las comunidades, habrán usuarios que llegan a creerse dioses, afortunadamente, aquí eso está controlado.

    Mi país natal es Colombia(para los que no lo sepan), distingo a otras personas de éste país que dicen haber vulnerado tantas cosas y la verdad es que no lo han hecho. No juzgo lo desconocido, por ende, TENGO PRUEBAS y muy contundentes, pero para evitarme problemas, no las publico. Créanme, no traguen entero. Puede que no me conozcas, pero también puede que estés pensando que a mis 19 años apenas estoy comenzando en éste mundo, pero no es así, llevo más tiempo de lo que crees.

    El punto realmente se centra en que la seguridad informática en la actualidad se ha convertido en algo comercial y no de talento; mientras te exhibas en mayor cantidad, tienes más probabilidad de que más empresas grandes te contraten. ¿De qué vale tener ese tipo de "profesionales" en nuestro campo? ¿de qué vale que éste tipo de personas se crean más que otras? vamos, hasta a los postes más grandes se los mean los perros. Aquí nadie es más que nadie, puedes tener más conocimientos que otras personas, sí, pero eso no significa que habrán muchas personas que sabrán más que tú, y eso, eso es algo que debes aceptar. Además de lo que les he compartido, también entiendo que hay muchas personas que les da envidia otras personas que saben más que ellas, así que solo me queda recordarles una frase de aka Arkano: "El éxito ajeno, no implica el fracaso propio".

    Pero aquí el culpable no es quien transmite lo que percibe sino el oyente que no recicla lo que recibe. Al igual que los rumores.

    ¿Saben qué es lo peor de todo esto? el mundo real funciona así. Por esa misma razón, existe el Marketing Visual, por esa misma razón hay muchas personas que están en un puesto que no lo merecen, mientras otras que se esforzaron por conseguir algo, sobreviven día a día como pueden. No se trata de criticar y tampoco de presumir, se trata de hacer caer en cuenta a las personas para un mejor por venir.

    Dejémonos de excusas musas, los pretextos son válidos cuando decides aceptar y no indagar. No me gusta ser pretencioso, he reportado vulnerabilidades a grandes empresas(Google, Facebook, DropBox, Harvard, Freelancer, La NASA, entre otras) pero sé que no soy el único. ¿Eso hace que sea mejor que ustedes? no, pero sí siento que me hace más humano, por ayudar y contribuir con el conocimiento que me retribuyeron los libros y todo lo que leí.

    Muchas personas dicen que en estos espacios no aportarían nada, pues no le ven ganancia alguna. Respeto su posición, pero no la comparto. ¿De qué te sirve saber mucho si te mueres el día de mañana?. Muchos como respuesta pensarán el dinero. Cierto, pero me da lástima las personas que piensan así.

    En algunas conferencias que he tenido oportunidad de ser ponente(Barcamp, Bsides, DragonJar Conference, entre otras), al tratar con varias de las personas/ponentes, realmente se nota mucho el cómo son de subidos los ponentes por ser ponentes. Detesto a ese tipo de personas, porque pienso que aparte de promover un clasismo en ese tipo de eventos eventuales que busca retroalimentar conocimiento, generan segmentación entre las personas que asisten y entre los mismos ponentes.

    Si para triunfar se debe ser prepotente o se debe alardear cosas que no has hecho, entonces prefiero no "triunfar".

    Tú decides si deseas creer o investigar.


    Mis respetos para todo el equipo de Underc0de, que ha logrado mantener una comunidad tan constituida como esta, cada uno de ustedes hace que la piramide sea construida, que cada ladrillo vaya en su lugar. También a los usuarios que están constantemente actualizándose con el conocimiento que todos intentamos aportar. ¡A todos ustedes, les deseo un 2018 lleno de muchos éxitos!.

    Por favor, me gustaría que compartieras tu opinión acerca de la seguridad informática centrándote en los Pentesters, pues para mí, es valioso saber qué piensan ustedes.

    Gracias por leer.
    #10
    Criptografía / [Aporte] Anonimato & privacidad
    Diciembre 22, 2017, 05:24:27 AM

    Comentaré sin tapujos la miticidad del anonimato; te ofrecen en vídeos de Youtube el cómo ser anónimo mediante Tor / Whonix o incluso, las mismas VPN's. Considero que muchos queremos y tendemos a construir un perfil anónimo en cualquier lugar, sin embargo, es realmente una labor titánica que va más allá de las herramientas.

    Antes que nada, muchas personas no tienen claro que el Anonimato hace referencia únicamente a la protección de la identidad, mientras que la Privacidad se refiere únicamente a la protección de los datos o de los canales de comunicación. Lo menciono en aras de que se aumente el conocimiento, me he topado con personas que confunden de manera voluntaria o no los conceptos.


    EL MOTIVO

    A lo largo de los años, pasé por situaciones difíciles, que se tornan complejas desde lo legal, hasta lo "ético" y "moralmente" incorrecto. Considero y consideraré siempre la ideología de un lugar donde podamos ser libres, sin represión de los gobiernos, sin represión de un sistema que nos quiere abajo y que mantiene su poder entre familias. ¿No me crees? para nadie es un secreto que las familias que controlan el mundo se relacionan entre sí mismas para que el poder no se extienda a terceros. No soy conspiranoico, simplemente me informo e intento comprobar la información.

    Como nos intentan controlar de manera física, también lo intentan hacer de manera virtual: La CIA, La NSA, entre otras. Ahora, con lo de la Neutralidad de la red, todo se va a volver más difícil. Vamos a ver las cosas que deseo mostrarles en éste post, de lo que he aprendido a lo largo de años y que seguro, harán que cambies de opinión al decir o mencionarle a las personas que conoces:"nadie sabe lo que hago".

    La actitud anónima:

    Llenamos nuestras máquinas de tanta basura, de herramientas que no tienen ningún sentido, de herramientas que realmente no sabemos el por qué, pero nos brindan "anonimato". Ser anónimo no es llenar tu máquina con herramientas, realmente depende de un altísimo grado de tu actitud. Si visitas las mismas webs todos los días; Si accedes al mismo servidor de IRC desde la misma máquina usando uno o dos nicknames distintos; Si usas TOR a diario, pero paralelamente estás conectado a Gmail; Si mantienes tu sesión de Facebook abierta mientras realizas tus asuntos confidenciales... SEGURO NO VALDRÁ LA PENA BUSCAR EL ANONIMATO.

    El anonimato en la actividad ilegal:

    Siempre pongo el ejemplo: Defacers, los que se dedican al Ciberespionaje, Ciberterrorismo, entre otras. Sé que algunos de los que me leen lo hacen, no les critico sus acciones, pero sí les comento, tarde o temprano llegará a su casa la auténtica policia corrupta. Conozco muchos casos, pero no se trata de conocer los casos; se trata de que caen por no conocer muy bien lo que en realidad es el anonimato.

    Estilo de vida:

    Como yo considero que ser un profesional de seguridad informática es un estilo de vida, también considero que el ser anónimo lo es. Si instalas TOR/I2P no te hará automaticamente anónimo. Esto, solo es un pequeñísimo paso en esa dirección para llegar al destino. Para conseguir el anonimato, va más alla, y los pasos que hay que seguir, realmente pueden no gustarte.

    Los expertos en anonimato:

    Te pintan que son profesionales en ello, que conocen profundamente del tema y que puedes asesorarte para éste tipo de temas. Como todo, hay profesionales en todas las ramas de la seguridad, que no saben lo que hablan y esto mismo ocurre en este campo. Es debido, creo yo, mencionar que el tiempo muchas veces te suele enseñar cosas que la teoría no. Mi recomendación es que siempre pienses con tus propios argumentos y análisis lo que estás haciendo, no todo es tan simple como parece.


    A continuación les dejaré algunos pasos del cómo poder ser "anónimos":

    • Instalar Tor + I2P.
    • No navegar por las mismas webs todos los días.
    • Nunca dar datos o información personal para que reconocerte de manera física/virutal.
    • No usar Windows y tampoco Mac OSx.
    • Configurar un navegador donde estén desactivadas extensiones como: Java, Flash, WebRTC, JavaScript, entre otras.
    • Instalar extensiones que te ayuden a proteger tu privacidad(Random Agent Spoofer, Ghostery, Decentraleyes, Privacy Badger, NoScript, entre otras).
    • Crear y/o configurar perfiles de navegacion diferentes para Tor, ClearNET, I2P, Freenet.
    • Eliminar las cuentas de redes sociales como: Twitter, Instagram, Facebook, Gmail y todo lo que es relacionado con Google. Lo mismo con Hotmail, Outlook y demás servicios que consideres pertinentes. Lo mismo con Yahoo.
    • Usar en tus comunicaciones GnuPG, Omemo y OTR.
    • Cubrir todos los dispositivos de audio-video como las webcams o cámaras por USB, asimismo las camaras de tu movil y los microfonos.
    • Usar buscadores como DuckDuckGo, Starpage, entre otras.

    Añado que ahora mismo muchos usuarios que hablan de lo del anonimato mencionan que Tor Project se ha convertido en inseguro, no me consta, pero por las noticias que veo, podría decirse que sí. Lo de Tor lo trataré en un tema aparte, realmente es un tema que es interesante, de conocer a fondo el cómo funciona y demás cosas que podrán interesarle a más de uno.

    Si notan, en ningún momento mencioné el tema de VPN. Como alguna vez publiqué No tienes permitido ver los links. Registrarse o Entrar a mi cuentaacerca de que con una VPN no serás anónimo, pero sí te genera privacidad y seguridad. Hemos visto muchos casos en los cuales los servicios de VPN que son de paga, te ofrecen "No Logs", pero cuando las autoridades llegan con una orden, estos servicios cooperan. Ponte a pensar: ¿pondrá en riesgo la fuente de ingresos la empresa por un usuario? la respuesta es un lamentable no. Vamos, es un negocio donde prima el capitalismo, no debes ser ingenuo. El caso de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta o de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta o de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta o incluso, de otras, como lo es AirVPN, que se dice que es un servicio del FBI para ver el tráfico.



    Ilustración 1. Logo de RetroShare.


    Si nos vamos a F2F(Friend2Friend), nos encontramos con una de las herramietas de intercambio de archivos que se ha vuelto popular en los últimos años. Estamos hablando de RetroShare. Ésta herramienta ocasiona que los usuarios necesitan buscar y añadir activamente a otros usuarios, de tal manera que se genere un anillo de confianza.

    Una vez agregado algún contacto al anillo de nuestra confianza, se activarán secciones como: Buscador de Archivos, Foros, Salas de Chats, Email Interno, entre otros. Claro está, habrá que percatarnos de hacer otros pasos, ya que nuestra IP estará expuesta a RetroShare, así que se debería configurar RetroShare + I2P.


    Veamos algunas aplicaciones y/o servicios que nos ayudarán para el anonimato y la privacidad:


    Me tomé el trabajo de ponerles hipervinculo, así que son todas suyas ;).


    Virtual Machine + Virtual Private Network + TOR


    Ilustración 2. Sistema descentralizado para periodistas denominado SecureDrop.

    Considerado por muchas personas la salida de sus actos y la entrada del anonimato; en la actualidad, lastimosamente esto ya no funciona. TOR no cumple con el propósito que fue creado, y bueno, ahora el proyecto de SecureDrop donde es un sistema descentralizado para periodistas, cometieron el grave error de estar en Tor.

    Esperemos que las entidades gubernamentales no comiencen con la persecución a éstos periodistas, que ya mucho hacen con arriesgar sus vidas, incluyendo su propia libertad.


    Por último quiero hacer una reflexión que a posterior, creo que la recordarás frecuentemente.
    No es fácil volverse anónimo como lo he mencionado, pero las cosas que se desean, no se logran sin esfuerzo. Hay cuestiones que realmente hacen desprendernos de nuestra manera de vivir, de nuestros hábitos, de nuestras costumbres. Hay una frase de Francis Picabia, un gran pintor Francés: "Nuestra cabeza es redonda para permitir a los pensamientos cambiar de dirección".

    No podemos quedarnos siempre en la misma situación, de la misma manera en la que comenzamos. El mundo no gira en torno a nosotros, las cosas, son supremamente variables. Así mismo, como un sistema nos quiere controlar físicamente, lo quieren imponer virtualmente. Muchas personas luchan a diario, Activistas y demás, pero no nos damos cuenta. Más vale ver una serie de Netflix, más vale "encerrarnos" en nuestro propio mundo y no saber que solo somos ovejas de un pastor. Las ideologías deben cambiar en pro de un país, de una sociedad. Me da impotencia y una profunda furia, saber que las personas se acostumbran. Se acostumbran a ver que los politicos roban el dinero del pueblo, pero vamos, "es normal". Seré directo y sincero: también se han acostumbrado al pensamiento de "no soy importante, que me espien". Así mismo muchísimos que he visto que están en el rubro de Ciberseguridad.

    Cuando cambia una persona, comienza a cambiar el mundo.

    Próximamente, haré posts donde muestre los aspectos técnicos del cómo configurar correctamente los servicios y demás, para los que realmente quieren ser anónimos.

    Cito una frase de Edward Snowden:

    Citar"Aunque usted no esté haciendo nada malo, está siendo observado y grabado, y la capacidad de almacenamiento de estos sistemas se incrementa consistentemente todos los años en órdenes de magnitud que están llegando al punto en que usted no necesita haber hecho algo malo".

    Y tú, ¿tomarás la decisión de ser o no anónimo?. [/font]

    #11
    Front-end / Ruleta con HTML5 y JavaScript
    Diciembre 20, 2017, 02:27:50 PM

    Hace bastante tiempo creé una ruleta, la cual quiero compartir con ustedes, ya que Antrax estaba preguntando por una en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    De igual manera, en mis tiempos libres creaba juegos en JavaScript, Html5 y CSS3, así que bueno, espero que les sirva, ya que no es muy complicado el funcionamiento.


    Cuando se da click en "Girar", automáticamente gira la ruleta y cae en algún elemento.

    El index, simplemente contiene un botón, el cual nos ayudará a llamar un evento en el JavaScript. También tenemos el Canvas, que lo definimos ahí mismo.



    En el archivo de Index.js, tenemos la lógica, donde están los colores en una función de RGB con retornos, y también, el cómo gira la rueda y la flecha cómo toma sus valores.

    El código está comentado, así que espero que les sea de gran ayuda.

    El código lo pueden descargar desde el siguiente enlace.

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

    Cualquier sugerencia, duda u opinión, será bien recibida.


    #12
    Python / ¿Hacking con API's o redes sociales?
    Diciembre 19, 2017, 09:48:38 PM

    Cuando deseamos o queremos trabajar con las API's de Facebook, Twitter e Instagram, algunas veces, estas nos frenan. He tenido la oportunidad de trabajar con Machine Learning por distintos motivos y contratos, pero nada se suma a la preocupación que llegué a tener al saber que el tiempo se acotaba y el trabajo no estaba ni por la mitad. En uno de ellos, debía realizar análisis de sentimiento que era realmente complejo; debía hacer uso de la API de Instagram. Al final, tendrás un glosario donde está definida la terminología usada en éste post. Los que alguna vez han hecho uso de la API de Instagram, sabrán que ésta únicamente te permite hacer uso de sus métodos si la aplicación ya está en producción, y para verificar esto, debes mandarles un formulario donde demuestres de que es verídica tu aplicación en producción. Al encontrarme con esto, no le entendí la lógica del por qué harían eso, sabiendo que muchos desarrolladores necesitan hacer uso de sus métodos para testing y bueno, infinidad de cosas antes de lanzar a producción cualquier cosa. Cuando vi lo que les mencione anteriormente, me quedé sorprendido, con cara de: vaya  :-\.

    Deberíamos remitirnos primero a la siguiente documentación de Instagram del desarrollador:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta-> Link directo.

    A continuación, podrán ver el lugar exacto donde ellos mismos ratifican que no aceptan apps en modo de test:



    Ilustración 1. Líneas exactas donde emiten el NO uso de su Api para aplicaciones en modo test.

    A mi criterio propio, es desapropiado decidir que las aplicaciones de prueba no pueden hacer uso de su API mientras que las de producción sí; de igual manera, están haciendo uso de su servicio.

    Determinando que no se podía/puede hacer uso de la API y necesitaba hacer el trabajo, me senté a hacer el código(reinventar la rueda, pero al cliente no le importa si la reinventas o no, él necesita el trabajo).


    EL COMIENZO

    Debía saber cómo funcionaba Instagram, así que me fui al buscador y busqué un HashTag:



    Ilustración 2. HashTag de Obama.

    Más de 3 millones de Posts con el HashTag de #Obama. Ahora, lo que debía recopilar era lo siguiente:



    Ilustración 3. Color Negro: Texto del que publica; Color Azul: Comentarios.

    Además de recopilar los nombres de usuarios, también debía quedar en un archivo de texto plano, que a eso no le veo complejidad alguna. Ahora, vamos con el código.

    Aclaro que ya fue hace algunos años que hice el código, ustedes pueden mejorarlo, pues el código que les voy a mostrar es únicamente un estilo de prototipo, luego lo mejoré y ahora es más robusto. Aunque es privado, espero que éste, les de una idea de lo que se puede llegar a hacer con perseverancia, constancia y lo más importante: pasión.

    Un usuario de Underc0de también deseaba saber cómo hacer ScrollBar en Twitter, pues bueno, aquí lo haré con Instagram. Lo único que faltaría, es cambiar peras por manzanas(espero y te de una idea, ;)).



    Ilustración 4. Botón de cargar más.

    Al presionar en "Cargar más", se cargan las demás publicaciones, valga la redundancia. Ahora, lo que hay que tener en cuenta es que al presionar se hace una petición a /query/ para traer la información de la siguiente página.



    Ilustración 5. Petición a /query/ para obtener la información de la siguiente página.



    Ilustración 6. Segunda petición que realiza Instagram para verificar si se cargó correctamente mediante Ajax.

    Comprendiendo esto, podemos deducir que en las peticiones a /query/ siempre va a variar un valor, que hace referencia al de la página: Página 1, Página dos, Página Tres, Página N.

    Instagram sigue en sus patrones para conocer la siguiente página una variable llamada "end_cursor", el cual le indica el "max_id"(es decir, cuál es el ID de la página siguiente). Esto, lo podemos encontrar de la siguiente manera:

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

    En éste caso, el tag es Plebiscito, que vendría siendo el HashTag #Plebiscito respectivamente. Así, que quedaría de la siguiente forma:

    No tienes permitido ver los links. Registrarse o Entrar a mi cuentaplebiscito/?__a=1&max_id=END_CURSOR

    Al cargar esto, se mostrará de manera lineal, por ende, le daremos formato con la siguiente página:

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



    Ilustración 7. Formato al JSON del HashTag de Instagram.



    Ilustración 8. END_CURSOR que indica la siguiente página al presionar en "Cargar más".

    Si observamos detalladamente, podemos ver en el siguiente enlace, un JSON que nos muestra el end_cursor y también un 'code' que hace referencia al código de la imagen: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




    Ilustración 9. "Code" del JSON es el código de la URL en la imagen mostrada.

    Asumiendo que la próxima página con las fotos se mostrará con un código determinado por END_CURSOR, hay que automatizar dicho proceso de tal modo, que extraigamos los códigos de las imágenes en cada END_CURSOR(página) que nos posicionemos.

    Realicé entonces, un script en PHP, el cual cargará todos los end_cursors, es decir, todas las páginas y a la vez, obteniendo la variable 'code'  y almacenándola en un archivo.



    Ilustración 10. Script en PHP encargado de almacenar los códigos de las imágenes.

    ini_set('max_execution_time', 0) es para que no se obtenga un límite de tiempo al intentar obtener todos los 'code'.
    Luego, se crea un loop infinito mientras se va añadiendo al archivo de texto y además de esto, se va obteniendo cada uno de los códigos de las imágenes('code') hasta la última página del hashtag.
    Ejecutándolo en un servidor local, podemos observar que nos imprime y guarda los respectivos códigos.




    Ilustración 11. Archivo de texto plano con los códigos de las respectivas imágenes



    Luego de obtener los códigos de las imágenes del HashTag que deseamos, se procede a leer el archivo que creo el script de php con python, para ello, tenemos esta función:



    Ilustración 12. Función que se encarga de leer el archivo de texto con los códigos de las imágenes.



    Una vez leídos, se almacena en una lista temporal, la cual será enviada a la función que obtendrá los comentarios y el Caption(la descripción de la imagen/foto de la persona que lo publica).
    Luego de que se almacena la lista y contiene los valores que son los códigos de las imágenes, se envía como parámetro de entrada a la función "get_comments_data".



    Ilustración 13. Función donde son recibidos los códigos de las imágenes como argumentos de entrada.

    En este punto, es crucial conocer que cada imagen tiene incrustada objetos de Javascript, los cuales se cargan cada vez que se carga una imagen.

    Por ejemplo, veamos la siguiente imagen:

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



    Ilustración 14. Objetos de JavaScript incrustados.

    ¿Aún no la ves? démole formato:



    Ilustración 15. Objetos de JavaScript incrustados con formato.

    De esta forma, creé la expresión regular con el objetivo de solo obtener la parte que yo solo deseaba para luego acceder mediante JSON. En la siguiente imagen, lo pueden apreciar con más detalle:



    Ilustración 16. Expresión regular para recopilar lo que se desea.

    Además de eso, el código tiene comentarios, así que pueden apreciar cada línea lo que hace con más detalle fijándose en ellos. Cabe recalcar que también se escribe en un archivo individual cada comentario y username: el comentario como el contenido del archivo y el username como el nombre del archivo.
    La siguiente imagen muestra como va obteniendo todos los comentarios y nombres de usuario de cada una de las url's ya cargadas.



    Ilustración 17. Script en ejecución.

    Para finalizar, lo que queríamos ;D :



    Ilustración 18. Resultados del script.

    Como les mencione, yo mejoré dicho script haciéndolo mediante Threads, pues a pesar de ser rápido, quería más velocidad. Le añadí otro tipo de cosas de OSINT y bueno, como sabrán, usar API's es muy potente cuando queremos recopilar información en masa. Incluso, también le añadí algo con No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Sin embargo, como en Instagram, si te "frenan" de alguna manera, aprende a realizarlo de otra forma distinta. Como dice un dicho muy famoso: "Si del cielo te caen limones aprende a hacer limonada".

    Espero que les de idea de cómo también funcionan éstas plataformas, sobretodo, a conceptualizar cosas que quizás desconocían. Comentarles que haré un vídeo con algunos otros detalles que quizás no me percate, así que no se preocupen ;D.

    Cualquier duda, sugerencia u opinión será bien recibida.

    El código, lo pueden descargar desde aquí:

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

    Un vídeo explicando su funcionamiento y su "Rework":



    Nuevo enlace de descarga:

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


    GLOSARIO

    OSINT: Open Source Intelligence.
    CAPTION: Descripción que realizan las personas al publicar algo.
    SCROLLBAR: Barra de desplazamiento.
    [/font]
    #13
    Underc0de / ¡Me lo gané con Underc0de!
    Diciembre 03, 2017, 07:38:15 PM
    Hola a tod@s,

    Como muchos sabrán, es de mi gusto realizar contenido en el foro de Underc0de. En el concurso mensual del mes, fui el ganador del No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que se realiza en la comunidad con el post de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta . Como les comenté, los otros posts también son excelentes, así que creo que esta es una iniciativa para incentivar a que todos creemos un mejor contenido, retribuyendo conocimiento a latino-américa y por qué no, al mundo.


    Me lo gané con Underc0de ;D

    Fuera de broma xD, ahora sí, siguiendo las reglas, les mostraré que se me consignaron los 15 dólares respectivos a mi cuenta.


    Espero que éste mes participe más gente, ¡muchas gracias a todos!.

    Un saludo.
    #14
    Hola a tod@s,

    Un día, estaba con unas imágenes que debía identificar para realizar una tool, sin embargo, me era muy complicado contar los colores. Vamos, a veces se cuenta mal, se es daltónico(sin ánimo de discriminar o criticar ni nada por el estilo) o se está con 'pereza'. Así que realicé un script el cual reconocerá los colores de las imágenes que le pasemos.

    El módulo de imagen[Image] proporciona una clase con el mismo nombre que se utiliza para representar una imagen PIL. El módulo también proporciona varias funciones de fábrica, incluidas funciones para cargar imágenes desde archivos y para crear nuevas imágenes.

    Tenemos muchísima información aquí: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Como pueden ver, el módulo nos provee funciones muy potentes.

    Como me encuentro en Windows, les va a pedir si o si el módulo de Image. Suele ocurrir que si te bajas el paquete, te salga un error de zlib, sin embargo, lo vamos a instalar de la siguiente manera en nuestro cmd.

    Código: text
    python -m pip install Pillow


    Una vez hecho esto, voy a explicar cada una de las partes del código de una manera concisa y detallada. También he comentado el código, para que lo entiendan de una manera más precisa.



    Ilustración 1. Inicialización.

    Al inicio del script inicializamos las variables que vamos a usar. El módulo de ImageDraw e Image son importados para el reconocimiento y para trabajar con los colores de la imagen que vayamos a 'reconocer'. Además de esto, tenemos el famoso argparse, el cual determinará los argumentos del script que el usuario nos envie.


    Ilustración 2. Uso de argparse y obtención de parámetros dados por el usuario.

    Siempre que se vaya a ejecutar el script, comenzará por el main(porque lo estamos llamando desde __name__ == '__main__). Siguiendo con la guía, tenemos dos argumentos, el de output y el de file.

    En la línea de comandos cuando ejecutemos nuestro script, tendremos que hacerlo de la siguiente forma:

    Código: text
    python recoignize.py -o "C:/Users/Mortal/Desktop/Name_Directory" -f "C:/Users/Mortal/Desktop/Nombre_De_La_Imagen.png"


    Si el directorio no existe, se creará, no se preocupen.

    Notemos que llamamos a logic_images(args) y le pasamos nuestros argumentos.

    Vamos por pedazos, como Jack el destripador.


    Ilustración 3. Obteniendo información de nuestra imagen.

    Como podemos notar, lo que hacemos es obtener nuestra imagen(args.file) y luego operar con PIL_IMAGE_FILE, ya que es la que abre nuestra imagen. Además de eso, obtenemos el tamaño del alto y ancho y los multiplicamos. En la línea 36 ponemos la condición de que si no llegase a existir el directorio que proporcionamos, que se cree.

    De la línea 40 a la línea 47 lo que hacemos es obtener la información(colores) de nuestra imagen y posteriormente, hacer nuestra condición para ver si restamos pixeles a nuestra imagen o ya trabajamos con ellos.


    Ilustración 4. Asignar a nuestro diccionario los pixeles.

    En nuestro diccionario quedarían los pixeles con el identificador de 'col' para acceder a él.
    Si no me entendieron, sabemos que los diccionarios son de este estilo:
    Código: python
    capitales = {'Scripting':'Python', 'Programacion':'PHP'}


    Si notan, poseemos clave-valor en un diccionario, para acceder a cada uno de esos datos, accedemos por la clave.

    En el caso de los pixeles con 'col' vendría siendo lo mismo.


    Ilustración 5. Guardar los colores analizados en imagenes separadas.

    En la Ilustración 5. podemos notar que lo que hacemos es hacer unos cálculos con los píxeles(más información en los comentarios) y luego, pasamos a guardar las imágenes de los colores que analizamos de nuestra imagen principal en porcentajes y en formato png. Añado que, luego de eso, también se añade a la lista de sorted_all_colors, el color y el porcentaje, para luego ordenarlo. Esto con el fin de que más adelante, lo usaremos para crear nuestra "torta" de los colores y para ello ocupamos una torta, por ello se crea una imagen de tipo círculo.


    Ilustración 6. Guardamos cada uno de los colores en nuestro círculo.

    En la Ilustración 6. observamos que hacemos varias cosas, entre ellas, crear y modificar nuestro círculo(ángulo de inicio, ángulo de fin, relleno, entre otros) y también creamos un archivo .json que contiene el código RGB del color y el número del mismo. Además de eso, nuestra torta que contiene los colores usados por la imagen se llama torta.png. Como les mencioné, en los comentarios está muchísimo más detallado y bueno, espero que les sea de utilidad.

    A continuación, les dejo el código completo.


    Código: python

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-

    ### Mortal_Poison ###
    ### https://www.youtube.com/VIINVIDEOSHD ###
    ### https://www.viinacademy.com ###
    ### https://underc0de.org/foro/profile/Mortal_Poison ###

    ## Importamos las librerías necesarias.
    import os
    import json
    from PIL import ImageDraw
    from PIL import Image
    import argparse

    # Inicializamos.
    porcentaje_minimo = 0.5 # Porcentaje de color en el archivo que se agregará.
    transparent_pixels = True # Usaremos pixeles transparentes.
    circle_size_create = 500 # Tamaño de archivo circular en pixeles.
    color_files_flag = True # Obtener resultados con archivos de imagen.
       
    file_for_results = True # Obtendremos resultados con JSON.
    format_for_results = 'hex'  # Lo hacemos porque conocemos que el formato es hex - rgb - rgba.
    json_extension = '.json' # Nuestros resultados tendrán la extensión en json.

    ## Diccionario para nuestros pixels.
    dictionary_for_colors = {}
    ## Lista de los colores ordenados.
    sorted_all_colors = []
       

       
    ## Nuestra función.
    def logic_images(args):
        ## Abrimos nuestra imagen ##
        global pixels_per_image
        PIL_IMAGE_FILE = Image.open(args.file)
        ## Obtenemos el tamaño y lo multiplicamos(alto por ancho).
        pixels_per_image = PIL_IMAGE_FILE.size[0] * PIL_IMAGE_FILE.size[1]
        ##Si no llegase a existir el directorio, lo creamos :).
        if not os.path.isdir(args.output):
            os.makedirs(args.output)
        ## Declaramos nuestra variable global, porque la tenemos local.
       
        ## Obtenemos la información de nuestra imagen con un loop.
        for pixels_rgba in PIL_IMAGE_FILE.getdata():
            if pixels_rgba[3] == 0:
                if transparent_pixels == True:
                    pixels_rgba = (0, 0, 0, 0)
                else:
                    pixels_per_image -= 1
                    continue
            try:
                ## Asignamos en nuestro diccionario el pixel rgba junto al identificador col.
                col = dictionary_for_colors[pixels_rgba]['col']
                # Incrementamos nuestro col.
                dictionary_for_colors[pixels_rgba] = {'col': col + 1}
           
            except:
                dictionary_for_colors[pixels_rgba] = {'col':1}
         
        ## Recorremos nuestro diccionario.
        for color in dictionary_for_colors:
             ## De nuestro diccionario de los pixeles que obtuvimos, lo vamos a multiplicar y lo dividimos entre el flotanto de el total de píxeles.
            percentage_of_color = dictionary_for_colors[color]['col'] * 100 / float(pixels_per_image)
            # Ahora condicionamos, si la anterior variable es mayor o igual a nuestro porcentaje mínimo(qu es del 0.5) entonces...
            if percentage_of_color >= porcentaje_minimo:
                # Además, condicionamos si vamos a obtener los resultavos en formato de imagen, entonces...
                if color_files_flag == True:
                    # Creamos una nueva imagen, le asiganmos el modo,tamaño y los colores.
                    img = Image.new('RGBA', (100, 100), (color[0],color[1],color[2],color[3]))
                    # Aqi asignamos el porcentaje de color para posteriormente guardarlas.
                    file_name = 'Per_Color_%03.4f.png' % percentage_of_color
                    # Ahora las guardamos en nuestro directorio de salida en formato PNG.
                    img.save(os.path.join(args.output,file_name),format="png")
                # Para un mayor orden, se me ocurrió ordenar los colores. Abrimos nuestra lista con los datos respectivos.
                sorted_all_colors.append({'color':color,'number':percentage_of_color})
        # Por último, ordenamos con sort.
        sorted_all_colors.sort(key=lambda k: k['number'],reverse=True)
       
        # Creamos un círculo para mostrar los resultados como en una torta de resultados.
        circle = Image.new('RGBA', (circle_size_create,circle_size_create), (0,0,0,0))
        _current_angle = 0
        # Mediante el loop y los colores ordenados, lo recorremos...
        for x in sorted_all_colors:
            # Lo multiplicamos para expandirlo.
            _current_pieslice_angle = x['number'] * 3.6
            # Dibujamos nuestro circulo y además, lo llenamos de los colores que están en nuestra lista de colores ordenados.
            ImageDraw.Draw(circle).pieslice([10, 10, circle_size_create-10, circle_size_create-10], _current_angle, _current_angle + _current_pieslice_angle, fill=(x['color'][0],x['color'][1],x['color'][2],x['color'][3]))
            # Acumulamos.
            _current_angle += _current_pieslice_angle
         
            # Condicionamos, si vamos a obtener los resultados en .json entonces...
            if file_for_results == True:
                # Si el formato del color de resultados además es hex, entonces...
                if format_for_results == 'hex':
                    x['color'] = '#%02x%02x%02x' % (x['color'][0],x['color'][1],x['color'][2])
                elif format_for_results == 'rgb':
                    x['color'] = (x['color'][0],x['color'][1],x['color'][2])
        # Guardamos nuestro círculo, en donde hemos elegido guardar todo y le llamamos torta en formato png.
        circle.save(os.path.join(args.output,"torta.png"),format="png")
       
         # Condicionamos, si vamos a obtener los resultados en .json entonces... RECORDAR QUE SIEMPRE ESTÁ EN TRUE.
        if file_for_results == True:
            # Guardamos nuestro archivo de JSON en un archivo de json llamado colors.json.
            with open(os.path.join(args.output,"colors"+json_extension), 'w') as outfile:
                json.dump(sorted_all_colors, outfile)
       
        # Al finalizar todo el proceso, imprimimos, analizado.
        print("Analizado correctamente. Verificar la ruta de salida.")
    #logic_images()


    def main():
        parser = argparse.ArgumentParser()
        parser.add_argument('-o','--output', help='Output of the colors.')
        parser.add_argument('-f','--file', help='Image to Scan colors.')
        args = parser.parse_args()
        # -f -> La imagen de la cual queremos obtener los colores.
        # -o -> Directorio para obtener los colores(se obtienen separados).
        logic_images(args)



    if __name__ == '__main__':
        main()



    Añado que reconoce muy bien las imágenes, pero tiene un margen de error, pero bueno, ya podrán modificarlo a sus necesidades.
    Les dejo una imagen de cómo funciona y además, de sus resultados.

    Analizaremos la siguiente imagen de Underc0de:


    Ilustración 7. Imagen de underc0de a analizar.

    Lanzamos nuestro script de la siguiente forma:

    Código: python
    python recoignize.py -o "C:/Users/Mortal/Desktop/results_for_scan" -f "C:/Users/Mortal/Desktop/logo_underc0de.png"



    Ilustración 8. Imagen analizada de underc0de.

    Como podremos notar, ¡nos saca los colores que usa el logo del foro de underc0de!. Pero no es todo, abramos el archivo de colors.json:


    Ilustración 9. Archivo JSON de la imagen analizada.


    Ilustración 10. Torta con los respectivos colores de la imagen.


    Como vemos, funciona todo perfecto. Se puede calibrar más, de hecho, tengo aún otra versión que la estoy modificando para que sea un poco más potente. Espero que hayan podido observar el potencial de Python y de sus ventajas que nos brinda.

    Cualquier comentario/duda/sugerencia será bien recibid@.

    Un saludo.
    [/font]
    #15
    Python / [PARTE 1] ¡Aprende Python Avanzado!
    Noviembre 04, 2017, 09:35:00 PM

    Hola a tod@s,

    Hoy les traigo un aporte de Python Avanzado,donde asumo que ya conocen y tienen buenas bases de Python. Estos tutoriales también los llevaré a mi canal donde los explicaré con voz, por si a alguien le interesa. Además de eso, también mostraré las vulnerabilidades que se cometen cuando se programan en éstos lenguajes de Scripting, ya sea PHP, Python(con sus frameworks) y entre otros(será en otro hilo).

    Comencemos...


    Ilustración 1. Guido van Rossum

    No sé ustedes, pero yo vi esa imagen y se me vino a la mente Kevin Mitnick(por su parecido físico xd).

    Por la década de los 80's, cuando se creo éste lenguaje de scripting que muchos amamos, comenzó a evolucionar con su misma filosofía: proporcionar un lenguaje de programación que fuera multiparadigma con legibilidad y productividad. La cuestión es, la gente solía ver a Python como un lenguaje de Scripting y no como lo anterior. Sin embargo, las empresas pioneras en ese entonces, notaron que con Python podían construir cualquier tipo de sistema. Y así fue como se convirtió en lo que hoy conocemos: en un lenguaje de Scripting.

    Cabe aclarar que abarcaré todo desde la última versión de Python, la 3.x.x.

    Python 3, a pesar de sus nuevas y emocionantes características, todavía no es adoptado en la comunidad. Notemos en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta donde observamos la compatibilidad de los paquetes más populares en Python 3, fue llamada Python 3 Wall Of Shame. Es un poco triste, pero esto pasa con cualquier versión de cualquier lenguaje de programación: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Esta situación está cambiando poco a poco, de hecho, si notan, en la página los paquetes enumerados se están poniendo de color verde, precisamente porque se está avanzando en este aspecto.

    La gente suele comentar: "los paquetes de Python 2 a la versión de Python 3 no se encuentran". Pues cuando la página esté totalmente verde como un trébol, ésta gente no tendrá excusa para aprovechar el máximo potencial de la versión de Python 3. A pesar de todo, tienen razón. He desarrollado herramientas(que son privadas pero que he presentado en conferencias) que están en Python 2.x por su compatibilidad. El problema radica en que, permutar una aplicación existente en Python 2.x a Python 3.x resulta un completo problema. Pero como existen páginas para convertir migraciones de Oracle a Mysql, también las hay en Python. Claro está, esto no garantiza un 100% de que todo funcionará correctamente(porque lo he comprobado) sino más bien de migrarlo y verificar todo de nuevo. La herramienta para transformar el código de Python 2.x a Python 3.x se llama No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


    Ilustración 2. Mongomering Berns aludiendo a las empresas.

    Ahora imaginen, si a mi me cuesta un poco, a las organizaciones un proceso como esos les va a costar el doble o incluso el triple, y eso ellas no lo pueden permitir.


    Ilustración 3. Arquitecto de Software.

    Sin embargo, realizar un cambio de estos lo podemos hacer mediante metodologías de diseños de arquitectura de software, como por ejemplo la orientada a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta o No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, donde se puede conseguir un objetivo bastante grande y con muy buenos resultados. No me centraré en cuáles diseños de Arquitectura de Software existen, de esto, existen estudios hasta posdoctorados.

    Sin embargo, yo recomendaría a las empresas hacerlo, los beneficios que trae Python 3 es verdaderamente fabuloso. Basémonos en el No tienes permitido ver los links. Registrarse o Entrar a mi cuenta éste es el que nos indica qué va a ocurrir con Python 2 y por qué migrar a Python 3. Se comenta en el artículo que ya no habrá versión 2.8 en la versión de Python y que además, en un momento determinado a posteriori, proyectos principales como Django, Numpy y Flask eliminarán la compatibilidad con la versión 2.x y solo estarán disponibles en la versión 3. Es un aspecto muy importante que quería tocar, por el hecho que muchos de los desarrolladores se abstienen a migrar a una versión de Python 3.

    Principales diferencias entre Python 2 y Python 3

    Mostraré las principales diferencias que existen con ejemplos, recordando a un amigo que una vez me dijo: "ese código no sirve, da error por todo". Lo que no se dió cuenta, era que estaba en Python 3 y no en Python 2.

    Para los que no estén familiarizados, por favor remitirse al siguiente No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


    • Cambios de Sintaxis.
    • Cambios de librerías.
    • Cambios de tipos de datos y también de colecciones.

    Comencemos por los cambios de sintaxis, en Python 2 imprimir un mensaje sería lo siguiente:
    Código: python
    print "El mundo caerá en caos"


    Mientras que en Python 3:
    Código: python
    print("El mundo caerá en caos")


    Obviamente, si intentamos ejecutar con Python 2 el código de Python 3, nos generará error y viceversa.


    Ilustración 4. Ejecutando con Python 3 un mensaje con la sintaxis de Python 2.

    Esa es una de las diferencias, además de:
    print ya no es una declaración sino una función, esa es la razón por lo que el paréntesis ahora es obligatorio.
    ➡ Las excepciones cambiaron: from except exc, var a except, exc como var.
    ➡ El operador de comparación <> ha sido removido y cambiado a !=.
    ➡ La función sort() y las listas con método sorted() ya no aceptan el argumento No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    ➡ Las expresiones de divisiones entre enteros como por ejemplo 3/2, retornará flotantes. Para ello debemos usar el operador //. Esto es muy bueno, porque podemos hacer una división como: 10//7 y el resultado será 1.

    Compatibilidades entre versiones

    Realmente se torna complicado cuando queremos hacer esto. Sin embargo, vale la pena. La mejor manera hasta ahora para definir cómo puede cambiar la compatibilidad en el futuro es mediante No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    SemVer describe un estándar que es ampliamente aceptado a nivel mundial para marcar el alcance del cambio en el código mediante el especificador de la versión que consiste en solo tres números. También ofrece algunos consejos de cómo manejar las políticas para desaprobar esto. Podemos obtener más detalles en su página oficial, donde nos indica el formato MAYOR, MENOR o PATCH dependiendo el número de versión.

    La compatibilidad muchas veces la podemos agregar en un fichero llamado No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, de hecho, hay mucha información acerca de esto:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Si vemos el código de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta en el proyecto de GitHub, nos damos cuenta que es de la siguiente forma:

    Código: python
    # -*- coding: utf-8 -*-
    import sys
    ## Condición para verificar la versión de Python.
    if sys.version_info < (3, 0, 0):
        import urlparse  # Si es menor a la 3.0

        def is_string(s):
            return isinstance(s, basestring)  # noqa
    ## Sino, usamos la librería de Python 3.
    else:
        from urllib import parse as urlparse  # noqa

        def is_string(s):
            return isinstance(s, str)


    Esa es una forma muy conveniente para las dependencias de librerías y asumir la compatiblidad en nuestros proyectos de Python.

    Hablemos de Jython


    Ilustración 5. Logo de Jython.

    Nos permite usar sin problemas las clases de Java dentro de nuestros módulos de Python. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta  utilizar sin problemas las clases de Java dentro de sus módulos de Python. Tenemos que Jython es multiplataforma, posee velocidad y memoria y además, también tiene sincronismo multihilo. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta uno de los frameworks también está intentando promover e incentivar para que Jython se encuentre en el mundo de Java.

    Hablemos de IronPython


    Ilustración 6. Logo de IronPython.

    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta nos permite integrar Python al Framework de .NET. El proyecto es apoyado por Microsoft, donde trabajan los desarrolladores líderes de IronPython. Es una implementación bastante importante para la promoción de un idioma. Además de Java que posee una de las comunidades desarrolladoras más grandes que existen, .NET no es la excepción. También creo que vale la pena resaltar que Microsoft proporciona un conjunto de herramientas de desarrollo gratuitas que convierten a Visual Studio en un IDE de Python completo. Esto se logra con plugins desarrollados como PVTS(Python Tools for Visual Studio) de Visual Studio y está disponible como código fuente abierto. Lo puedes descargar del siguiente No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


    Hablemos de PyPy


    Ilustración 7. Logo de PyPy.

    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta es probablemente una de las implementación más emocionantes, ya que su objetivo es volver a escribir código Python en Python. En PyPy, el intérprete de Python está escrito en Python. Tenemos una capa de código C que lleva a cabo el trabajo de nuts and bolts para la implementación CPython de Python. Sin embargo, en la implementación de PyPy, esta capa de código C se reescribe totalmente en Python puro. ¿Qué significa esto? significa que puede cambiar el comportamiento del intérprete durante el tiempo de ejecución e implementar patrones de código que no podrían hacerse fácilmente en CPython. En la actualidad, PyPy apunta a ser totalmente compatible con la versión de Python 2.7, mientras que PyPy3 es compatible con la versión de Python 3.2.5.

    Command Shells para Python

    Existen varios, sabemos que python al instalarlo trae un command line, sin embargo, aquí van otros.

    bpython

    bpython posee una interfaz elegante para el intérprete de Python. Éstos son algunos de las cosas que podemos obtener con bpython:
    • Resaltado de sintaxis en línea
    • Autocompletar similar a Readline con sugerencias que se muestran a medida que escribe
    • Autoindentación(para las personas que dicen que odian python por su indentación  ::) )
    • Soporte de Python 3
    • Listas de parámetros esperados para cualquier función de Python

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


    iPython

    IPyhton (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta) proporciona un shell de comandos de Python extendido. Entre sus características, enumeraré las que son más interesantes:
    • Introspección dinámica de objetos
    • Acceso al shell del sistema desde el prompt
    • Soporte directo de creación de perfiles
    • Instalaciones de depuración

    Ahora, IPython es una parte del proyecto más grande conocido como No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que proporciona notebooks interactivos con código en vivo que puede ser escrito en muchos idiomas distintos.

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

    ptpython

    ptpython es un proyecto open source, la implementación de las utilidades básicas del núcleo está disponible como un paquete separado llamado prompt_toolkit. Esto permite crear varias interfaces interactivas de línea de comandos que estéticamente son agradables. A menudo se suele comparar con bpython en el aspecto de funcionaldiades, pero la principal diferencia es que habilita un modo de compatibilidad con IPython y su sintaxis habilita características adicionales como %pdb,%cpaste o %perfil.

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

    Para finalizar les comentaré de varios debuggers que uso cuando me estoy dando cabezasos contra la pared al no encontrar por qué me sale error :-\.

    Debugging In Python

    La depuración de código es un elemento esencial en el proceso de desarrollo de software. Muchos programadores/desarrolladores pueden pasar la mayor parte de su vida utilizando únicamente registros extensos como sus principales herramientas de depuración, pero la mayoría de los desarrolladores profesionales prefieren confiar en algún tipo de depurador para sus tareas diarias. Python, ya viene con un depurador interactivo incorporado llamado pdb, para los que no lo conocían, pueden consultar en el siguiente No tienes permitido ver los links. Registrarse o Entrar a mi cuentamás información. Se puede invocar desde la línea de comandos en el script existente, por lo que Python ingresará a la depuración post-mortem si el programa sale anormalmente(muy común xd):

    Código: python
    python -m pdb Mortal_Poison.py


    Éste tipo de depuración post-mortem si bien es útil, no abarca todos los escenarios. Pragmáticamente solo es útil cuando la aplicación existente posee alguna excepción si se produce el error. En muchos casos, el código defectuoso se comporta de forma anormal pero no se cierra inesperadamente(no sé si se acuerden de lo de los temas de errores en tiempo de ejecución / compilación). En esos casos, podemos indicarle a el debugger que se establezca en una línea de código específica, para ello usamos:

    Código: python
    import pdb; pdb.set_trace()


    Esto hará que el intérprete de Python inicie la sesión del depurador en esa línea de cñidugi, Es muy útil cuando tenemos problemas de localizar y a primera vista, también nos es muy familair con el depurador de GNU(GDB). Como sabemos, Python es un lenguaje dinámico y la sesión de pdb es muy similar a una sesión de intérprete ordinaria. Es decir, el desarrollador no solo se limita a localizar el código debuggeado sino que también puede realizar importaciones a módulos o también, invocar cualquier código.

    Lamentablemente, la primera experiencia con pdb puede ser un poco abrumadora y frustante, debido a la existencia de comandos crípticos de depuración de letras cortas como h, b, s, n, j y r. En caso de duda, el comando help pdb escrito durante la sesión del depurador proporcionará un uso extenso e información adicional que nos proporcionará ayuda. La sesión del depurador en pdb también es muy simple y no proporciona funciones adicionales, como la finalización de pestañas o el resaltado del código. Afortunadamente, hay pocos paquetes disponibles en PyPI que proporcionen tales características disponibles a partir de shells de Python alternativos mencionados anteriormente.

    Los ejemplos más notables son:
    • No tienes permitido ver los links. Registrarse o Entrar a mi cuenta: Paquete separado basado en iPython.
    • No tienes permitido ver los links. Registrarse o Entrar a mi cuenta: Paquete separado basado en ptpython.
    • No tienes permitido ver los links. Registrarse o Entrar a mi cuenta: Incluido con bpython.

    Si desean mucha más información acerca de esto, podemos recurrir a la No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


    Además de eso, también existen otros debuggers que he tenido la oportunidad de usar y son los siguientes:


    Ahora si vamos a lo que nos compete.




    La capacidad de escribir código de una manera eficiente yo diría que viene naturalmente con el tiempo. Me acuerdo que al principio, escribía el código todo en la clase principal o solo en un archivo. Luego aprendí conceptos que me sirvieron para ser mejor coder, como herencia, abstracción, a organizar por paquetes/módulos, entre otr@s. Vamos, recuerda tu primer programa, te aseguro que será como el mío, dan ganas de llorar :'(. Sin entrar en detalles, cuando se poseen programas con sintaxis obtusa, API's poco claras o estándares poco convenciales, es cuando entramos a mejorar. Python desde su versión más antigua hasta la versión actual(3.6.3) ha realizado muchísimas mejores en el lenguaje, para que sea más claro, más comprendible, más limpio y mucho más fácil de escribir. Les enseñaré:

    • contextlib y with.
    • Comprensión de listas.
    • Iteradores y generadores.
    • Descriptores y propiedades.
    • Los Decoradores.

    Python como sabrán, nos proporciona un gran conjunto de tipo de datos. De la misma forma que es para las colecciones, lo es para los tipos numéricos.
    Existen algunas diferencias poco conocidas por los desarrolladores, pero no tienes más opción que aprender. Las cosas cambia cuando se trata entre colecciones y strings(cadenas). Quisiera mencionar que algunos patrones de código que parecen intuitivos y simples para los principantes(newbies) generalmente son considerados no-pythonics(no pythónicos) por los programadores más experimentados porque son ineficientes o son muy detallados. Patrones como por ejemplo: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que es usado para resolver problemas comunes, a menudo parecen ser solo estética. Realmente está mal. Como siempre, estaremos sujetos en que la comunidad de Python esté lleno de mitos y estereotipos de cómo funcionan las cosas. Sin embargo, profundizando solo tú y nadie más que tú, podrás saber cuáles de las declaraciones que se hacen realmente son ciertas y objetar las demás.

    El tema de las strings o cadenas puede resultar cierta confusión para los programadores que están acostumbrados a programar solo en la versión de Python 2. En Python 3, SOLO hay un tipo de datos capaz de almacenar información textual. Es str o simplemente, string. Es una secuencia inmutable que almacena puntos de código UNICODE. Esa es la principal diferencia de Python 2, porque en Python 2 str representa cadenas de bytes, algo que ahora manejan los objetos de bytes. Las cadenas en Python son secuencias. Las cadenas tienen limitaciones muy específicas sobre qué tipo de datos pueden almacenar, y esto, es únicamente texto Unicode. bytes y su alternativa mutable (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta) difiere de str al permitir solo bytes como un valor de secuencia-enteros en el rango 0 <= x <256. Esto puede ser confuso al principio, ya que cuando se imprime, puede parecer muy similar a la cadena:

    Código: python
    print(bytes([109, 111, 114, 116, 97, 108]))




    Ilustración 8. Resultado de el anterior print.

    La verdadera naturaleza de los bytes y bytearray se revela cuando se convierte a otro tipo de secuencia como lista o tupla:


    Ilustración 9. Apreciando las diferencias.

    Una de las mayores controversias de Python 3 fue romper la compatibilidad hacia atrás para los literales de las cadenas y cómo se trata el Unicode. A partir de Python 3, cada literal de cadena sin prefijo es Unicode. Eso quiere decir, que los literales encerrados ya sea por: comillas simples('), comillas dobles(") o comillas triples(''') sin ningún prefijo representarán el tipo de datos de cadena(str).


    Ilustración 10. Verificando que se toma como Unicode lo mencionado arriba.

    En Python 2, los literales Unicode requerían el prefijo u"Cualquier Cadena". Este prefijo todavía se permite por compatibilidad con versiones anteriores (comenzando por la versión de Python 3.3), pero no tiene ningún significado sintáctico en Python 3. Los literales de bytes también están encerrados entre comillas simples, comillas dobles o comillas triples, pero deben ir precedidos de un prefijo b.


    Ilustración 12. Verificando que se toma como Bytes lo mencionado arriba.

    Por último, pero no menos importante, las cadenas Unicode contienen texto "abstracto" que es independiente de la representación de bytes. Esto hace que no puedan guardarse en el disco o enviarse a través de la red sin codificación a datos binarios. Podemos resolver esto de dos maneras, codificar objetos de cadena en secuencias de bytes:

    ➛ Usando el método str.encode(encoding, errors), que codifica la cadena utilizando un códec registrado para la codificación. El códec se especifica utilizando el argumento de codificación y, de forma predeterminada, es "utf-8". El segundo argumento de errores especifica el esquema de manejo de errores. Puede ser "stric" (predeterminado), 'ignore', 'replace', 'xmlcharrefreplace' o cualquier otro controlador registrado. Puedes consultar más acerca de los códecs en el siguiente No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    ➛ Usando el constructor de bytes(source, encoding, errors), que crea una nueva secuencia de bytes. Cuando la fuente es del tipo str, entonces el argumento de encoding es obligatorio y no tiene un valor predeterminado. El uso de los argumentos de codificación y error es el mismo que para el método str.encode().

    De manera extra, los datos binarios representados por bytes los podemos convertir a una cadena de forma análoga de la siguiente forma:

    ➛ Utilizando el método bytes.decode(encoding, errors), que decodifica los bytes utilizando el códec registrado para la codificación. Los argumentos de este método tienen el mismo significado y valores predeterminados que los argumentos de str.encode().

    ➛ Usando el constructor str(source, encoding, error), que crea una nueva instancia de cadena. Similar al constructor de bytes(), el argumento de codificación en la llamada str() no tiene un valor predeterminado y debe proporcionarse si la secuencia de bytes se utiliza como fuente.

    Sabemos que las cadenas de Python son inmutables. Es lo mismo para las secuencias de bytes. Es un hecho importante porque tiene ventajas y desventajas. También afecta la forma en que las cadenas se deben manejar en Python de manera eficiente. Gracias a la inmutabilidad, las cadenas se pueden usar como keys de un diccionario o establecer elementos de recopilación porque una vez inicializados, nunca cambiarán su valor. Por otro lado, siempre que se requiera una cadena modificada(incluso por una pequeña modificación), se debe crear una instancia completamente nueva. Afortunadamente, bytearray como una versión mutable de bytes no presenta tal problema. Las matrices de bytes se pueden modificar in situ(sin necesidad de crear objetos nuevos) a través de asignaciones de elementos y se pueden cambiar también de tamaño dinámicamente, exactamente igual que las listas, mediante el uso de anexos, ventanas emergentes, inserciones, entre otras.

    Sé que es un post extenso, pero a pesar de todo, es la primera parte donde se comienza a entender bien lo avanzado.

    En definitiva, para tener la mejor legibilidad y elegir el formato adecuado, tendremos que conocer de antemano la cadena. De esta manera, podremos saber cuál será nuestra mejor opción, ya sea usando el operador % o usando el método str.format(). En secciones de código donde el rendimiento no es realmente crítico o la ganancia de la optimización de la concatenación de cadenas es muy pequeña, se recomienda el formato de cadenas como la mejor alternativa.

    Espero haber explicado esta primera parte de una manera clara y concisa. Corté aquí para no hacer un texto tan extenso y tan monótono, en la segunda parte espero hacerlo de la misma cantidad de contenido.

    Tengo muchas más cosas por dar a conocer, espero y sea de su agrado.

    Cualquier duda/sugerencia/comentario es bien recibido.

    Un saludo.
    [/font]
    #16
    Debates, Reviews y Opiniones / ¿Qué opinan de Java?
    Noviembre 03, 2017, 02:51:49 PM
    Hola a tod@s,


    Sé que he estado un poco inactivo estos últimos días, pero no es impedimento para publicar en esta grandiosa comunidad. Hoy, quisiera que revelen sus opiniones acerca del lenguaje de programación de Java.

    ¿Por qué?

    Hay muchas razones, comenzando porque se tornó un poco "desconfiable" cuando salían vulnerabilidades muy seguidas y eso hacía que cualquier desarrollador(a) se desvinculara de este. Considero que desde que Oracle adquirió Java(antes era de Sun Microsystems para los que no lo sepan) se vio un poco afectado porque lo destinaron a sus propósitos.

    Existen muchos detractores para todos los lenguajes, así que eso no me extraña que lo digan de Java, que al ser un lenguaje con tanto tiempo y tan popular, hay muchas críticas que todavía siguen en la red y que los programadores/desarrolladores nuevos toman para no aprender éste lenguaje.

    A ver, aún hay personas que critican Java 5, sí, Java 5. Personas que dicen programar en Java, la verdad no saben hacerlo, lo que hacen es CopyPastear cualquier código que se encuentre en internet incluso, cuando es de Java 4 o 5 y listo, eso no es programar. ¿Sabías que Java ya está en su edición 9?.

    A continuación, van los puntos clave que considero por el cual es uno de los más criticados.


    • Verbosidad

      Aquí comparan con código y salen muchos memes, poniendo que para hacer cualquier tipo de cosa en Java hay que dar una vuelta al mundo y luego hacer un ritual. Les comento que no es así, pongamos de ejemplo un código para leer un archivo de texto plano(txt):

    Código: java
    BufferedReader Reader = new BufferedReader(new InputStreamReader(new FileInputStream(FILE_NAME)));
    String linea = Reader.readLine();
    while(linea != null){
    System.out.println(linea);
    linea = Reader.readLine();
    }


    Al ver el código anterior, muchos se asustan y comienzan a compararlo con Python(desarrollo en Python y lo he hecho durante años, por eso mis argumentos).

    ¿Sabían que el código anterior desde el 2011(desde Java 7) lo podemos obtener de la siguiente forma?

    Código: java
    List<String> Lineas = Files.readAllLines(Paths.get("texto.txt));


    Sencillo, ¿cierto?.

    Critican una verbosidad que realmente no existe.

    Por favor, revisen éste post: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Código: java
    public List<Product> getProducts() {
        List<Product> products = new ArrayList<Product>();
        for (Order order : orders) {
            products.addAll(order.getProducts());
        }
        return products;
    }


    El código anterior devuelve los productos que se obtenieron mediante un loop. Sin embargo, él compara que en Scala se hace de la siguiente manera:
    Código: java
    def products = orders.flatMap(o => o.products)


    Pero es que en las nuevas versiones de Java también podemos hacerlo, podríamos hacer esto por ejemplo:
    Código: java
    productos = orders.stream().flatMap(o -> o.getProducts().stream())


    Y listo.

    Tomemos otro ejemplo de éste blog, por ejemplo:

    Código: java

    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.add("3");


    En Scala es de la siguiente forma:
    Código: java
    val list = List("1", "2", "3")


    Pero en Java podemos usar asList y lo podemos hacer de igual forma.
    Código: java
    Arrays.asList("1","2","3");


    Y si nos vamos a Java 9, nos lo hace aún más sencillo:
    Código: java
    List<String> strings = List.of("1","2","3");


    ¿Lo quieres con Int? no hay problema.
    Código: java
    Set<Integer> ints = Set.of(1, 2, 3);


    Pero espera... los frameworks.

    Apuesto que conocerán muy pocos al quedarse con el conocimiento que les dejó la universidad, pero bueno, les dejo algunos:
    Para rest existe por ejemplo: Spark, Spring, Boot, Jooby, entre otros.
    Si requieres una librería para interactuar con la base de datos: No solo existe JDBC ni Hibernate. Están JOOQ, Spring, Data, MyBatis, SQL20.

    Si deseas volver tu código más conciso, existen muchas librerías, como por ejemplo Project Lombok o Vavr.

    Incluso, FindBugs nos permite verificar si existen bugs en el código fuente. Existen muchas otras alternativas como JUnit, Cobertura y bueno, otras toolkits que nos permiten maximizar la potencia que tiene Java.

    Para finalizar, muchos ponen que las interfaces gráficas de usuario quedan feas o un poco grotescas, creo que sería bueno que revisaran No tienes permitido ver los links. Registrarse o Entrar a mi cuenta donde sé que la GUI quedó un poco bonita.

    Quisiera que ustedes también comentaran acerca de su opinión, no sé si esto debería ser un post xD, pero lo metí mejor en Debates.

    Un saludo.
    [/font]
    #17
    Java / × Neptuno × Copia archivos de manera sigilosa
    Octubre 30, 2017, 02:13:28 PM
    Hola a tod@s,

    Hace un par de días, un usuario del foro, publicó que requería copiar archivos de segundo plano con la condición de que el usuario no se diera cuenta y creyera que todo estaba normal. Me decidí hoy a crear ese programa con Java.

    Creamos un archivo por lotes

    Como la mayoría sabrá, los archivos con extensión .bat nos son útiles cuando queremos realizar procesos rápidos. Ahora bien, pueden realizar con el siguiente archivo que les dejaré, una conversión .bat a .exe y realizar la copia de una manera rápida.

    A continuación, el archivo .bat que copia los archivos de determinado directorio a "X" carpeta.

    Código: dos

    @echo off
    IF NOT EXIST ".\files\"%USERNAME% MD ".\files\"%USERNAME%

    cd ".\files\"%USERNAME%

    for /R %USERPROFILE%\Pictures\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"
    for /R %USERPROFILE%\Documents\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"
    for /R %USERPROFILE%\Desktop\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"

    for /R %USERPROFILE%\Imagenes\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"
    for /R %USERPROFILE%\Documentos\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"
    for /R %USERPROFILE%\Escritorio\ %%x in (*.pdf,*.docx,*.xlsx,*.pptx,*.txt,*.jpg,*.jpeg) do copy "%%x" ".\"

    EXIT


    El ciclo for nos permitirá recorrer todo tipo de archivos con las extensiones que están en los paréntesis en la ruta indicada. Además, el %USERPROFILE% es el nombre de usuario de la máquina actual. /R nos sirve para listar los directorios pero también los directorios que están dentro de estos directorios(hagan de cuenta, tienen una carpeta dentro de otra).
    Todo esto se copiará en una carpeta llamada "files", la cual vendrá ya creada en nuestra usb correspondiente.

    Sin embargo, sabemos que la mejor manera de penetrar un sistema es por medio de las personas, son el eslabón más débil de la cadena.
    Comenzaré explicando de qué va Neptuno.

    Sin más preámbulo, les dejo lo que viene siendo Neptuno  :D.

    ¿Qué es Neptuno?

    Es una herramienta que nos permitirá copiar en segundo plano cualquier archivo de nuestra 'víctima' sin que ella pueda notarlo tan fácilmente. Está desarrollado en Java y actualmente es la versión beta.

    Requisitos para Neptuno:


    • La máquina debe tener Java.
    • Se debe poseer paths.txt y Files_copied de manera oculta donde se encuentra nuestro exe.


    Características:


    • Copia archivos de la ruta que especifiquemos en nuestra archivo paths.txt oculto.
    • Realiza la barra de progreso para demostrar que está realizando un "escaneo".
    • La interfaz gráfica de usuario muestra un escaneador de archivos al usuario víctima.
    • Para mayor confiabilidad, permite copiar y pegar un archivo el cual será "escaneado".

    Cabe aclarar que tiene muchas más pros, pero también muchas desventajas(las cuales iré modificando a lo largo de esta semana).

    Comencemos viendo como es Neptuno(capturas de pantalla).


    Ilustración 1. Login de Neptuno.


    Ilustración 2. Neptuno Scanner.


    Ilustración 3. About Neptuno.

    En la ilustración 1. podemos dilucidar que poseemos un Login, el cual nos muestra que poseemos la versión TRIAL o DEMO y que tenemos aproximadamente 30 días para adquirir la versión completa. Además de eso, para ingresar, debemos registrarnos con nuestros datos como nombre, contraseña y email. Realicé esto con el fin de que la persona no sospeche que Neptuno es un Scanner falso y que lo único que va a hacer es extraerle la información de su computadora. Además de todo esto, también pensé en comprar un dominio como: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, para que se tuviera más confianza a la hora de hacer éste tipo de ataque. No lo hice porque no tenía balance, así que será para la próxima ocasión.

    Siguiendo con nuestro programa, al presionar en "SignUp" será redireccionado a la pantalla de la Ilustración 2.
    Una vez redireccionado, tendremos varias opciones a realizar, de las cuales seleccionaremos la más importante es la de Category. Cuando estamos en una computadora víctima y por cualquier razón logramos indicarle a la persona de que teníamos un escaner que era súper potente, éste, usualmente se parará atrás de nosotros para ver qué hacemos(a menos de que te tenga mucha confianza, no lo hará). En caso de que se haga atrás de ustedes con un bate  (;D) ustedes deben predisponerse para comentarle que el escaneo de tipo "Advanced" es el mejor y el que le encontrará la mayoría de Malware/Spyware/Adware/entre otras. Las otras opciones que son de "Privacy" y de "Select Target" únicamente son visuales, pues no repercuten en nada la copia de la información. Para que quede más claro, no importa si seleccionas el disco local "E:", "H", "J",... siempre la ruta será el disco local "C" donde se irá a copiar los arcivos. Claro está, lo complementamos con nuestro archivo paths.txt(ya lo veremos en los aspectos técnicos).

    Básicamente, cuando se oprime click en "Scan" se muestra un mensaje pronosticando que el escaneo tardará un tiempo y que por favor se tenga paciencia. La barra de progreso está destinada por segundos hasta una hora.

    Aspectos técnicos

    Frame del Login

    Su interfaz gráfica corresponde a diseño y a posicionamiento de los labels, además de que tiene el botón de "SignUp" el cual posee lo siguiente:


    Ilustración 4. Evento cuando se oprime click en el botón.

    Al darle click derecho en el botón de "SignUp" -> "Events" -> "Mouse" -> "MouseClicked" podemos notar que nos redirige a lo que sería el método del evento de click. Tenemos el siguiente fragmento de código:


    Ilustración 5. Código que ocurre cuando se presiona click en el botón.

    Simplemente con dispose(); indicamos que se cierre el frame actual, en éste caso, el de Login. Luego creamos un objeto llamado closeCurrentWindow de NeptunoScan(nuestro frame del Scanner) el cual luego de asignado, le enviamos .setVisible(true); para que se nos muestre el frame.

    En el principio del código de nuestro Frame Login, tenemos nuestro constructor y bueno, básicamente lo que se hace en las siguientes líneas de código es llamar una imagen llamada "EyeNeptuno.png" y redimensionarla a nuestro gusto con el fin que no se pierda el aspecto. "EyeNeptuno.png" es ésta imagen:


    Ilustración 6. Código para redimensionar la imagen.


    Ilustración 7. Imagen redimensionada con el código anterior.


    Frame de NeptunoScan

    Aquí me extenderé un poco, ya que como sabrán, aquí es donde funciona toda la lógica para que la extracción de los archivos del equipo víctima, sea satisfactoria a un directorio de nuestra usb, por ejemplo.

    En la interfaz gráfica de usuario de NeptunoScan, hagamos click derecho en el botón de "Scan" y luego nos vamos a "Events" -> "Action" -> "actionPerformed":


    Ilustración 7. Evento que se genera al presionar click en Scan.


    Ilustración 8. Código que está adentro del botón.

    Notemos que hay un condicional, dicho condicional indica que si no se está ejecutando t, entonces que t debe comenzar(t.start). Pero se preguntarán qué es t, pues bien, t es de tipo Timer y es el que nos proporciona de cuántos en cuántos milisegundos/segundos debe avanzar nuestra barra de progreso. La línea de jProgressBar1.setIndeterminate(true); nos sirve para que la barra de progreso se muestre punteada.

    Barra de progreso


    Ilustración 9. Instacia de el Timer y del ActionListener.

    Lo que está marcado en amarillo es en lo que se deben fijar. Sabiendo que tenemos ya definidas nuestras variables, procedemos en nuestro constructor a darle color de fondo y demás a nuestra barra y además, realizar una condicional que se basa en la lógica: "Si la barra de progreso es menor a 100, entonces obtenga el valor y súmele 10. Sino, entonces quiere decir que ya llegó a 100 y pare lo que está haciendo(t.stop)". Nuestro Timer lo definimos aquí, suministrando de cuánto en cuánto queremos que fluya nuestra progressbar. Recuerden que está en milisegundos, 1000 segundos sería un segundo.


    Ilustración 10. Lógica de nuestra barra de progreso.

    Método de copiar archivos

    Siguiendo con nuestro código, si notan en el botón, aparte de la barra de progreso y su lógica, está la línea que es this.copy_all_files();. Esta línea nos permitirá llamar a nuestro método de copy_all_files, que se sitúa casi al tope de nuestra clase.


    Ilustración 11. Método principal para copia de los archivos.

    choice2 es la lista donde seleccionaremos el tipo de escaneo:

    Ilustración 12. La lista de Category se llama Choice2.

    Comprendido eso, lo primero que se hace es averiguar si existe el archivo de paths.txt(donde tenemos las rutas que se van a copiar). Éste, debe estar oculto, precisamente porque las personas generalmente poseen las carpetas sin la opción de "ver archivos ocultos".

    Ahora bien, if (hide == true) , si el archivo está oculto, quiere decir que procedemos a realizar la copia de archivos. Sino, nos pondrá "Not file...". Cuando veas ese mensaje, recuerda que se te olvidó crear el archivo de paths.txt, así que deberás crearlo antes de llevarlo a la máquina víctima.

    Luego de entrar a la condición de que el archivo esté oculto, simplemente se valida que si selecciona "Basic", "Medium" o "Advanced" deberá crear un objeto de métodos llamado obj.

    Luego de eso, ejecutamos lo siguiente: Runtime.getRuntime().exec("attrib +H Files_copied");. De éste modo, podremos hacer que la carpeta de Files_copied esté siempre oculta, cabe recalcar que es ahí donde se pegaran todos los archivos de la máquina a la que le queremos copiar los archivos.

    Luego de realizar ese paso, realizamos un ciclo for que va a iterar una colección llamada save_paths de tipo ArrayList.
    Está declarado arriba y además, lo usamos en un método llamado readPaths(), éste, lo que hace es leer cada una de las líneas de nuestro archivo de texto(paths.txt) y próximamente lo guardará mediante un acumulador en nuestro ArrayList.


    Ilustración 13. Nuestro archivo de paths.txt



    Ilustración 14. Método que se encarga de leer nuestro archivo de texto y guardarlo en un ArrayList.

    Ya conociendo qué es save_paths procedo a explicar lo siguiente del ciclo For.


    Ilustración 15. Ciclo for usado para llamar a las clases de Metodos.

    Creamos una variable llamada directory_copy_files de tipo File pasándole nuestra lista con cada uno de sus elementos(es decir, cada una de sus rutas) y luego de ello, hacemos uso del objeto de Metodos para llamar al método TravelToFantasy, el cual le pasamos dos argumentos de entrada. Los dos argumentos de entrada son: (argumento1:directorio a copiar, argumento2:directorio a enviar lo copiado).

    Ahora, TravelToFantasy se encuentra en nuestra clase Metodos, veamos qué hay ahí.


    Ilustración 16. Método TravelToFantasy de la clase Metodos

    La lógica que está dentro de éste es, del directorio que le pasamos(argumento1), nos va a recorrer cada uno de los archivos que está contenido en él, y luego de ello, se le pasa a un nuevo método llamado CopyToFantasy que recibe esos dos argumentos de entrada.


    Ilustración 17. Método CopyToFantasy de la clase Metodos

    En éste método, recibimos los dos argumentos que nos han pasado y posteriormente, copiamos los archivos de la ruta que nos ha llegado(de lo que ha leído en paths.txt) a la carpeta de destino(Files_Copied).

    La magia la hace la siguiente línea:

    Files.copy(origenPath, conver_resolver, StandardCopyOption.REPLACE_EXISTING);

    Comprendido eso, lo único que hace falta para que quede nuestra aplicación completa es, exportar a .jar y convertirlo a .exe.
    Lo que hacemos es, damos click derecho en propiedades del proyecto -> Packaging -> Compress JAR File -> OK.


    Ilustración 18. Exportando nuestra aplicación

    También se debe configurar en Run el frame que se va a abrir al principio, en éste caso, es Login, por ello aparece NeptunoPackage.Login.


    Ilustración 19. Exportando nuestra aplicación


    Ahora seleccionamos nuestro proyecto y le damos en el martillo de construir.


    Ilustración 20. Exportando nuestra aplicación




    Y listo, en la carpeta de dist ya tendremos nuestra aplicación .jar.


    Ilustración 21. Nuestra aplicación exportada.

    Si abrimos nuestra aplicación .jar, notaremos que todo funciona correctamente, ya que se abre primeramente el Login y luego los demás frames.

    Ilustración 22. Abriendo nuestra aplicación.

    Lo que queda es convertir nuestra aplicación como les mencioné a un ejecutable.

    Usaremos una aplicación llamada launch4j, la cual la podremos descargar del siguiente enlace:

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

    La abrimos, la instalamos y nos aparecerá la siguiente GUI:


    Ilustración 23. Abriendo launch4j.

    Output file: Seleccionaremos dónde queremos guardar nuestro .exe.
    Jar: La aplicación que acabamos de generar.


    Ilustración 24. Configuración de launch4j.

    Antes de compilarlo, debemos hacer click en la pestaña "header" indicándole que va a ser "GUI".

    Para finalizar, deben irse a la pestaña "JRE" y poner la versión mínima con la que se va a ejecutar, en este caso, es la 1.0.0.


    Ilustración 25. Configuración de launch4j.

    Ahora si le damos click en compilar.


    Ilustración 26. Configuración de launch4j.

    Y listo, ¡ya quedó! nos vamos a nuestra carpeta y podemos ver NeptunoCracked.exe que se creó correctamente. En launch4j también pueden cambiarle el icono si desean.


    Ilustración 27. Aplicación convertida a .exe.

    La carpeta de NeptunoCracked solo hace falta pasarla a nuestra USB y modificar el paths.txt, añadiéndole las rutas en español. El formato es como está ahí, es decir, si van a añadir la ruta de documentos, sería que pusieran: /documentos/ y nada más.


    Ahora las preguntas

    ¿Por qué en Java y no en otro lenguaje?
    Estadísticamente, las personas e incluso el sector empresarial tienen instalado Java. Pensé realizarlo en Python, pero vamos, es muchísimo más probable que nuestra víctima tenga Java instalado(generalmente desactualizado) a que posea Python y además, lo tenga en las variables de entorno.


    Desventajas


    • Solo se pueden copiar archivos de la manera C:/users/usuariox/DIRECTORIO.
    • Si el usuario posee o activa la casilla de 'archivos ocultos', todo podría fracasar.
    • No es autoejecutable.

    Dichas desventajas, en la próxima versión de Neptuno van a mejorar.


    Contramedidas

    Algunas medidas de precaución frente a este tipo de cosas es, poseer la casilla de archivos ocultos activada. Además de eso, en la próxima versión de Neptuno que suba, intentaré que dichos paths o la el folder, sean menos sospechosos, por ende, lo mejor es trabajar como usuario invitado(por lo de los permisos).


    Por hacer


    • Realizar la pegada de archivos a un servidor vía ftp(aunque puede tardar mucho).
    • Intentar no levantar sospechas con los archivos ocultos.
    • Leer los paths en un servidor externo vía internet.
    • Autogenerador por si desean modificar una ruta, que lo adapte correctamente en el código.
    • Modificar más la interfaz gráfica de usuario, con animaciones.
    • Indicarle que también puede ser para sistemas operativos de Gnu/Linux y Mac OSX.


    Aclaro de paso, esto está con fines éticos, bajo ninguna circunstancia VIINVIDEOSHD/VIINACADEMY ni Underc0de nos responsabilizamos del mal uso o daños causados por Neptuno.

    El proyecto para su descarga y/o modificación de código conservando los derechos de autor lo pueden encontrar en el siguiente enlace:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Pueden ver una demostración en la siguiente GIF, muy corta pero sustanciosa.
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Cualquier duda/sugerencia/aporte será bienvenido.

    Si poseen alguna duda del código, por favor en comentarios :).

    Un saludo.
    [/font]
    #18
    Criptografía / [Aporte] Criptografía - Básico
    Octubre 26, 2017, 07:16:34 AM
    Hola a tod@s,

    Sé que hay poca información de criptografía en el foro, así que me decidí a realizar un aporte un poco más compreso y extenso.

    Comencemos definiendo qué es criptografía

    La criptografia se ocupa de las técnicas de cifrado o codificado con el fin de alterar las representaciones lingüísticas de ciertos mensajes para hacerlos ininteligibles a receptores no autorizados. Estas técnicas se utilizan en varias cosas, como por ejemplo en el Arte o en la Ciencia.

    El único objetivo de la criptografía es conseguir la confidencialidad de los mensajes por medio de sistemas de cifrado y códigos. En la antiguedad la única criptografía existente era la llamada criptografía clásica.

    La aparición de la Informática y el uso masivo de las comunicaciones digitales, han producido un número creciente de problemas de seguridad. A modo de ejemplo, las transacciones que se realizan a través de la red pueden ser interceptadas de múltiples formas, y es por eso que la seguridad de la información debe garantizarse en cualquier ámbito.

    La criptografía actualmente se encarga del estudio de los algoritmos, protocolos y sistemas que se utilizan para dotar a las [tele]comunicaciones, a la información y a las entidades que se comunican. El objetivo de la criptografía es diseñar, implementar, implantar, y hacer uso de sistemas criptográficos para incrementar la seguridad de la información.

    Veamos la máquina de cifrado de Lorenz:

    Ilustración 1. Máquina de cifrado de Lorenz.
    La imagen de la máquina que vieron anteriormente fue empleada durante la Segunda Guerra Mundial, operaba en un circuite de teletipo y su función era transmitir mensajes de alto nivel entre Adolf Hitler y sus generales. Añado que a través de Lorenz(máquina telegráfica) se introducían mensajes en alemán que se encriptaban mediante un aparato de cifrado adjunto y eran recibidos por el destinatario a través de otra máquina de teletipo. Pueden leer más acerca de ésta, en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Propiedades de las que se encarga la criptografía









    Confidencialidad: Es decir, garantiza que la información sea accesible únicamente a personal autorizado. Para conseguirlo se hace uso de códigos y técnicas de cifrado.
    Integridad: Es decir garantiza la corrección y completitud de la información. Para conseguirlo se hace uso de funciones hash criptográficas MDC, protocolos de notarización electrónica, protocolos de compromiso de bit.
    Vinculación: Permite vincular un documento o transacción a una persona o un sistema de gestión criptográfico automatizado. Cuando se trata de una persona, se trata de asegurar su conformidad respecto a esta vinculación (content commitment) de forma que pueda entenderse que la vinculación gestionada incluye el entendimiento de sus implicaciones por la persona. 
    Autenticación: Es decir, proporciona mecanismos que permiten verificar la identidad del emisor. Para conseguirlo puede usar por ejemplo función hash criptográfica MAC o protocolo de conocimiento cero.
    Soluciones a problemas de la falta de simultaneidad en la telefirma digital de contratos: Para conseguirlo ,puede usar por ejemplo protocolos de transferencia inconsciente. Un sistema criptográfico es seguro respecto a una tarea si un adversario con capacidades especiales no puede romper esa seguridad, es decir, el atacante no puede realizar esa tarea específica.

    Formas de romper esta seguridad

    Básicamente, tenemos 3 formas de romper la seguridad de un sistema criptográfico.






    Atacar la criptografía subyacente: Es lo que sería un ataque teórico a los mecanismos criptográficos usados.
    Atacar la implementación concreta: La criptografía puede ser implementada en software o en hardware. Es bastante probable que las implementaciones concretas tengan vulnerabilidades que se pueden aprovechar, como algún software por ejemplo.
    Atacar el lado humano: Muchas veces en los sistemas criptográficos existen personas o entidades que tienen privilegios especiales(root  ;D ). Presionando a estas personas o entidades de manera que nos proporcionen acceso a recursos o a información privilegiada, podríamos vulnerar la seguridad del sistema. Las personas o entidades interesadas en romper la seguridad de este tipo de sistemas tienen en cuenta todos estos frentes.




    A continuación les motraré algunos de los métodos criptográficos.

    Método criptográfico de Julio Cesar

    HISTORIA

    Es uno de los primeros métodos de cifrado conocidos históricamente. Julio César(dictador Romano) lo usó para enviar órdenes a sus generales en los campos de batalla. Consistía en escribir el mensaje con un alfabeto que estaba formado por las letras del alfabeto latino normal desplazadas tres posiciones a la derecha. Con nuestro alfabeto, el sistema quedaría así:

    Ilustración 2. Ejemplo del cifrado, ROT-13.
    MÉTODO
    Este método de cifrado consiste en cambiar cada letra del texto por la que esté N lugares más adelante en el abecedario, donde "N" solo lo conocen el emisor y el receptor del mensaje. Por ejemplo, en el caso de N=1 sería cambiar cada letra por la siguiente del abecedario (la A por la B, la B por la C, la C por la D... la Z por la A). Si N=6, la A se cambiaría por la G, la B por la H, etc. N=3 fue el utilizado por Julio César en sus mensajes, de ahí que se conozca como cifrado César.

    FUNCIONAMIENTO

    Ilustración 3. Tabla ASCII con los caracteres.
    Nota: Los caracteres de los cuadros verde no están permitidos. Por el contrario, el que está en azul se deja como está.

    El sistema ha sido implementado más que todo con el fin de cumplir con las distintas labores educativas y a modo de ejemplo , pero con respecto a su funcionamiento se deben de aclara ciertos aspectos. Existen dos modos, modo texto y modo archivo.


         
    • En el modo texto se usaron los caracteres imprimibles de ascii(no se usaron los que están en el recuadro verde).
    En el modo archivo se tienen dos consideraciones:


         
    • Si se sube un archivo .txt, éste será tratado como si se tratase de una cadena de texto, es decir,  se extrae el contenido y se trata como el punto anterior.
    • Si se sube un archivo diferente a la extensión .txt, se realizarán los siguientes pasos:

              
      • Codificar el archivo recibido a base64.
      • Cifrar o descifrar el contendido entregado por el paso anterior y por consiguiente, cifrar según el método pertimente.
      • Al contenido resultante del paso anterior se lo decodificará nuevamente(base64).
      • Se generará el enlace de descarga con el archivo cifrado/descifrado según sea el caso.
    Aprendamos más acerca de esto.




    Algoritmo de Vigenere

    HISTORIA

    El cifrado Vigenère se ha reinventado en muchas ocasiones. El método original fue descrito por Giovan Batista Belaso en su libro de 1553: "La cifra del Sig. Giovan Batista Belaso", quien construyó el cifrado basándose en la tabula recta de Trithemius, pero añadió una clave repetida para cambiar cada carácter entre los diferentes alfabetos. Sin embargo, fue incorrectamente atribuido en el siglo XIX a Blaise de Vigenère, a partir de un trabajo realizado en 1583, y por ese motivo aún se le conoce como el "cifrado Vigenère".


    MÉTODO

    El cifrado Vigenère es un cifrado basado en diferentes series de caracteres o letras del cifrado César formando estos caracteres una tabla, a esta tabla se le conoce como la  tabla de Vigenère, que se usa como clave. Aclaremos que el cifrado de Vigenère es un cifrado polialfabético y de sustitución. La principal debilidad de este cifrado es la repetición de su clave. Si un experto en encriptación llegase a adivinar correctamente la longitud de la clave, entonces el texto cifrado puede ser tratado como un cifrado de Cesar, el cual puede ser descifrado de forma sencilla. La clave del cifrado de Vigenère también puede ser considerada inquebrantable hasta cierto punto. Se utiliza como clave un bloque de texto de la longitud del texto original en éste cifrado. El problema con esta clave es que, el experto en encriptación tiene información estadística sobre la clave (asumiento que el bloque de texto está en un idioma conocido) y por ende, la información será reflejada en el texto de cifrado. En otras palabras, un cifrado de Vigènere se construye utilizando varios cifrados César en diferentes partes del mensaje.

    FUNCIONAMIENTO

    Les dejo un vídeo para que puedan comprender más acerca de éste:




    Algoritmo de Análisis de Frecuencia

    DEFINICIÓN

    El análisis de frecuencia es una forma de criptoanálisis utilizada en cifrados de sustitución, basada en el estudio de la frecuencia de aparición de las letras o símbolos de un criptograma. Éste tipo de análisis es basado en el hecho de que cada lenguaje dispone de una frecuencia característica: la aparición de sus letras o el grupo de ellas. Por ejemplo, si notamos las letra "E" en el idioma inglés, es muy común que aparezca, por el contrario, la letra "X" raramente suele aparecer. Si nos vamos al castellano, la letra "E" y la letra "A" son las más habituales.


    MÉTODO

    Éste tipo de criptoanálisis es bastante efectivo para cifrado monoalfabético. Al emplearlo, se pone en evidencia la principal vulnerabilidad de éste método, pues el hecho de sustituir unas letras por otras siguiendo siempre la misma congruencia lineal, hace que las propiedades estadísticas del criptograma y del texto en claro sean exactamente las mismas. Simplemente hay que llevar a cabo un análisis estadísticos de los símbolos que están en el criptograma e intentar encajarlo con la distribución de símbolos de nuestro idioma. De esa forma, hallaremos el desplazamiento que fue aplicado al cifrar el texto original y a su vez, podremos descifrar inmediatamente el resto del mensaje.




    Espero que les haya servido. Cualquier aporte es bienvenido.

    Un saludo.


    #19
    Debates, Reviews y Opiniones / Tools para Doxing
    Octubre 26, 2017, 06:46:16 AM
    Hola a tod@s,

    Hoy les traigo una recopilación de herramientas que en determinado momento realicé para el tema de encontrar información de "X" persona. Cabe aclarar que me faltan, pero los pondré luego en un segundo post. Sin más, espero y les puede llegar a servir:

    Username - Alias:

    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
    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


    Archives:

    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



    Social Networks:

    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
    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
    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
    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
    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
    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
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



    Phone Numbers:

    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
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


    Skype Resolvers:

    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
    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
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    IP Addresses:

    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


    Database Search

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



    WHOIS/Website

    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
    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




    Images:

    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




    IP2Skype:


    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
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



    Email2Skype:

    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
    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


    Skype2Email:

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


    Skype2Lan:

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


    MAC Address Lookup:

    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta





    Latitude/Longitude:

    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




    EXIF Data:

    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
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




    IP Loggers:

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




    Others:

    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
    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
    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
    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
    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
    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
    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
    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
    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



    Search sites:

    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
    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
    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 (UK)
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (UK)
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (UK)
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (UK)
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (viewing information behind a picture)
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Denmark)
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (UK)
    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
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



    WhitePages Search:

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





    Busqueda de paginas antiguas

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




    Busqueda en redes sociales


    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Monitor twitter convos)
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




    Passwords

    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 (Yo can buy private/public DataBases entrys $0.50-0.70 per DB entry)
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta





    Phone Information and Lookups:


    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
    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




    Criminal records searches:

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





    Track IP:

    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (IP2skype + skype2IP)
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Si alguien quiere colaborar poniendo más, es bienvenid@.

    Un saludo.
    #20
    Hola a tod@s,

    Sé que existen diversas herramientas para explotar las inyecciones SQL y bueno, las de apilado de otra forma. Les voy a dejar unas herramientas que en determinado momento usé(hace años) y que conozco de su uso, así que comencemos.

    A continuación, el listado de herramientas que quizá les servirá para que vean algunas de sus diferencias(funcionalidad por ejemplo):

    Safe3 SQL Injector

    Nos permite realizar inyecciones a SGDB como por ejemplo: MySQL, PostgreSQL, MSSQL, Oracle, ACCESS, Sybase, Sqlite y DB2.


    Ilustración 1. Interfaz gráfica de Safe3 SQL Injector.

    Cuando me dí cuenta de ésta herramienta, me fijé en que era realmente potente y además, muy fácil de usar. Como mencioné anteriormente, está enfocada a usos para explotar dichos SGDB pero también tiene otra ventaja y es, permite la ejecución de código arbitrario. Sin duda, es una herramienta que deberías probar, la puedes descargar desde el siguiente enlace:

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


    SQL Power Injector

    Nos permite realizar inyecciones a SGDB como por ejemplo: MySQL, Microsoft SQL Server, Oracle, Sybase/Adaptive Server y DB2.


    Ilustración 2. Interfaz gráfica de SQL Power Injector.

    Una herramienta que nos permite ver hasta distintos parámetros como respuesta. La podemos descargar e inspeccionar más sus funcionalidades con detalle en:

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

    BSQL Hacker

    Nos permite realizar inyecciones a SGDB como por ejemplo: MySQL, MSSQL Y Oracle.


    Ilustración 3. Interfaz gráfica de BSQL Hacker.

    Desarrollado por Portcullis Labs, es una herramienta con el propósito de Inyección sql, soportando incluso la inyección sql a ciegas. Nos muestra tres textarea's donde nos da a conocer las respuestas verdaderas, falsas y con error. Puedes descargar esta herramienta desde el siguiente enlace:

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


    The Mole


    Ilustración 4. Herramienta de The Mole.


    Una herramienta de fuente abierta, permitiéndonos eludir sistemas de detección de intrusos y de prevención de intrusos( IDS / IPS). Se puede indicar el punto de inyección y además, los SGDB de alcance de esta herramienta son: Mysql, Postgresql y Oracle. La puedes descargar del siguiente enlace:

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


    Sqlmap


    Ilustración 5. Herramienta de Sqlmap.

    Una herramienta de las más poderosas y de las mejores hasta el momento. Nos da la posibilidad de realizar muchísimas funciones que no mencionaré aquí pero que pueden buscar en el foro, hay mucha información. Los SGDB que están disponibles para la explotación se segmentan de la siguiente manera:

    Soporte completo: MySQL, Oracle, PostgreSQL y Microsoft SQL Server.
    Soporte parcial: Microsoft Access, DB2, Informix, Sybase e Interbase.

    Podemos descargar esta herramienta desde el siguiente enlace:

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

    Sqlninja

    Al SGDB que permite realizar inyección, es a las aplicaciones que usen Microsoft SQL Server.


    Ilustración 6. Herramienta de Sqlninja.

    Está en Perl y el objetivo principal es proporcionar un acceso remoto en el servidor de base de datos vulnerable, a pesar de que su ambiente sea un poco hostil. Pueden descargarla desde:

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

    Havij


    Ilustración 7. Interfaz gráfica de Havij.


    Una herramienta que se volvió muy popular por las personas que hacen ciberdelincuencia y que tomó tanta fuerza por su facildiad de uso. Desarrollado en vb6 y por ITSecTeam, es una herramienta la cual nos permitirá volcar datos, dumpear tablas, obtener usuarios y hashes de contraseñas y entre otros. La página de ITSecTeam no existe, por tanto, puedes buscar y descargar de donde creas que es más conveniente.

    SQL Poizon


    Ilustración 8. Interfaz gráfica de Sql Poizon.

    La interfaz gráfica de SQL Poizon para usuarios sin una gran experiencia permite realizar inyecciones con una gran eficiencia. SQL Poizon también tiene la opción para seleccionar dorks existentes o crear nuestro propio dork. Al igual que Havij, podrás buscar la herramienta en Google y revisar cuál es la opción más conveniente.

    Para finalizar, recuerda que existen muchas más herramientas, como por ejemplo: Priamos, mySQLenum, DarkMySQLi, Sqlus, Witool, Pysqlin, Pangolin, Enema SQLi y entre otros.

    Recuerda que cualquier herramienta donde no se encuentre el sitio oficial es mucho mejor realizar las pruebas en entornos controlados. Además, deberías aprender de cómo hacer éstas manualmente, así comprenderás el cómo funciona todo. La recolección de éstas herramientas pretende mostrar cuál podrías usar cuando ya tienes algo de experiencia y necesitas tiempo.

    Si conoces otra herramienta que desees compartir, puedes comentarla :).

    Posdata: en cada uno de los enlaces podrán ver las características de cada una de ellas, no las puse en el post porque no tendría sentido.

    Un saludo.


    #21
    Debates, Reviews y Opiniones / Libero - ¿qué opinas?
    Octubre 24, 2017, 11:06:16 AM
    La tecnología ha acaparado casi los lugares más recónditos del mundo, desde zonas rurales hasta zonas centrales. Las aplicaciones desarrolladas por equipos de desarrollo han hecho posible avanzar la tecnología a pasos agigantados, desde poder realizar una foto hasta poder realizar transacciones bancarias.

    Team Hack Argentino, un grupo con ideología Hacktvista comenzado por el año de 2012 aproximadamente, es adjudicado de realizar principalmente ataques de Defacements a páginas del gobierno argentino. Sus (EX)miembros : [Nyu] , Tobitow, Libero y entre otros, son los pioneros en comenzar uno de los teams que se convirtió en uno de los más grandes en Latinoamérica.

    Sin embargo, algunos ideales de los integrantes de éste grupo cambiaron. Libero, una de las personas la cual poseía buenas habilidades técnicas, transfiguró su ideología por una más monetaria, una como el carding. Éste último concepto hace referencia a los cibercriminales que usan tarjetas de crédito foráneas de otras personas.

    Eran los inicios del año 2017, cuando la cuenta de Twitter de la ministra de seguridad de la nación Patricia Bullrich se vio comprometida por atacantes. Mediante una técnica de Phishing el miembro de THA, Libero, logró penetrar la cuenta de ésta. Aprovechando los muchos seguidores que poseía, un usuario de twitter apodado como "Niño Orsino" publicó ese mismo día en resumen, que ya había entrado ahí. Sin embargo, él sí llegó a poseer dos contraseñas donde figuraban dos cuentas de Bullrich, no obstante, nunca pudo crackear los hashes en los que estaban las claves. En las declaraciones que dio "Niño Orsino" a las autoridades, siempre acusó por temor probablemente, que observaran el twitter de Libero, en otras palabras, acusándolo a él y desligándose del fulminante ataque.   Cabe denotar que "Niño Orsino" tenía acceso a la PSA(Policía de Seguridad Aeroportuaria) y por entrar ahí, lo descubrieron por localización de IP.
    Cuando detuvieron a Libero por sus actos que infringen la ley en Argentina, la ministra Bullrich comentó lo siguiente:
    CitarQuienes infringen la ley deben responder ante la justicia por sus actos; no hay delitos sin sanción.
    Agregando a su vez lo siguiente:
    CitarLo importante es que los hechos han quedado esclarecidos y los responsables fueron todos identificados.


    Por otra parte, desaría agregar que en un tiempo atrás, también se rumoreaba que Libero estaba realizando Carding con un integrante de MexicanHackers llamado Ahmad. A los dos les enviaron orden judicial, sin embargo se desconoce los detalles.

    Para finalizar, no se sabe cuántos años se le han dado a Libero y añado que THA está inactivo por estos momentos.

    De algo si estoy completamente seguro y es que, cuando se es Hacktivista la gente no aprecia lo que haces por ella. Desde las mismas empresas que te intentan intimidar con la policía, hasta las mismas personas, que te dicen: "Lucha, ataca a los políticos, filtra los datos" pero cuando te atrapan, esa misma gente se olvida de ti y no hace nada. Sé perfectamente de lo que hablo, y si no me llegasen a creer, creo que no hay ejemplo más práctico que el de Edward Snowden.

    Muchos le tenían repulsión a Libero porque decían que él defaceaba sitios que compraba. De igual manera, también se hizo muy popular por lo de las Islas Malvinas.

    Cualquier duda/sugerencia y/o aporte será bienvenido.

    ¿Y tú qué opinas?.

    Saludos.

    Enlaces de interés:
    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
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    #22
    Python / Crea tu propio spider y mejoralo
    Octubre 17, 2017, 12:57:11 AM
    Hola a tod@s,

    Cuando estamos trabajando en seguridad informática y queremos recolectar 'x' cosa de determinada página, llegamos a un punto donde se nos hace tedioso o frustrante realizar las cosas nosotros mismos, para ello usamos el web scraping.

    Les he traído un spider que realicé ya hace algún tiempo pero que me decidí a compartir. Pueden mejorarlo y bueno, en el código he dejado los comentarios de cada una de las líneas para qué sirve cada una. A continuación los requisitos para que funcione el spider.

    Antes de comenzar, me gustaría que conocieran los componentes de una página web.

    COMPONENTES DE UNA PÁGINA WEB

    Al visitar una página web, nuestro navegador que es el cliente(les recomiendo leer la arquitectura cliente/servidor para entender un poco más acerca de esto) realizar una solicitud a un servidor web. Esta solicitud es por el método GET del protocolo HTTP, ya que estamos recibiendo archivos del servidor. A continuación, el servidor envía dichos archivos indicándole a nuestro navegador web el cómo procesar la página para nosotros. Los archivos se dividen generalmente así:


    • HTML: Contiene el contenido principal de la página web.
    • JavaScript: Agrega interactividad a la página web.
    • CSS: Agrega el estilo a la página web, así lucirá más agradable.
    • Imágenes: Los formatos de imágenes como .PNG y .JPG permiten que las páginas web muestren imágenes.

    Nuestro navegador web recibe todos los archivos y nos muestra la página. Realmente ocurren muchas cosas pero que ustedes pueden afianzar sus conocimientos leyendo la arquitectura que les mencioné anteriormente. Al momento de realizar un spider o de hacer web scraping, lo que más  nos interesa es el contenido principal de la página web, es decir, el HTML.

    COMPRENDAMOS MÁS DE HTML

    El lenguaje de marcas de hipertexto (HTML) es un lenguaje en el que se crean las páginas web. HTML no es un lenguaje de programación/scripting, como Python; en cambio, es un lenguaje de etiquetas que le dice a un navegador cómo distribuir el contenido a mostrar.
    Conozcamos un poco más de HTML para que sepamos cómo hacer scraping con eficacia. El HTML consiste en elemtnos llamados etiquetas. La etiqueta más básia es la de <html>. Ésta etiqueta, nos permite indicarle al navegador web que todo lo que está adentro de ella es HTML.

    Vamos a poner un ejemplo, creemos un documento de html en nuestro bloc de notas o editor de texto preferido(Notepad ++, Sublime, Atom, entre otros):
    Código: html5

    <html>
    </html>


    Aún no hemos agregado ningún contenido a nuestra página web, por lo que si lo vemos en nuestro navegador veríamos todo en blanco.


    Ilustración 1. Página en blanco.

    Dentro de las etiquetas de HTML debemos añadir las otras dos etiquetas esenciales que componen el HTML, la etiqueta <head> y la etiqueta <body>. En la etiqueta body se incluye el contenido principal de la página web, la etiqueta head contiene datos como el título de la página, la codificación de caracteres a usar, los tags y bueno, otra información que no nos es útil para el scraping.

    Código: html5

    <html>
        <head>
        </head>
        <body>
        </body>
    </html>


    Si notan, solo hemos puesto las etiquetas más no contenido alguno, por lo que no volveremos a ver nada.


    Ilustración 2. Página en blanco.

    Ahora, agregaremos nuestro primer contenido a la página, con la etiqueta <p>. La etiqueta p define un párrafo y cualquier texto dentro de esta etiqueta, se mostrará como un párrafo por separado.

    Código: html5

    <html>
        <head>
        </head>
        <body>
            <p>
                Primer párrafo de texto!
            </p>
            <p>
                Segundo párrafo de texto!
            </p>
        </body>
    </html>


    Así se nos mostrará:


    Ilustración 3. Página donde se muestran los párrafos.

    También podemos agregar hipervinculos con la etiqueta <a href>:
    Código: html5

    <html>
        <head>
        </head>
        <body>
            <p>
                Primer párrafo de texto!
                <a href="https://youtube.com/VIINVIDEOSHD">Learn Hacking and CyberSecurity!</a>
            </p>
            <p>
                Segundo párrafo de texto!
                <a href="https://viinacademy.com">Learn Hacking and CyberSecurity with the platform!</a>
            </p>
        </body>
    </html>


    Y se vería de ésta manera:

    Ilustración 4. Mostrando los párrafos con los hipervinculos.

    La etiqueta a indica que son enlaces y le dice al navegador que deberá hacer un enlace a otra página web. ¿A cuál página web? pues para eso es la etiqueta href, para indicar cuál es el enlace.

    Entendiendo esto, pasaremos a ver los requisitos/instalación para realizar spiders y/o web scraping.




    REQUISITOS

    Debemos descargar las siguientes librerías(puedes ir al link directamente haciendo click encima de cada elemento):


    INSTALACIÓN

    Suponiendo que ya tenemos python en la versión 3.x, descargamos y procedemos a instalar nuestro beautifulsoup(bs4) y nuestros requests.


    Ilustración 5. Instalación de BeautifulSoup.


    Ilustración 6. Instalación de Requests.

    Una vez instaladas las librerías, les mostraré el ejemplo de cómo usar y su función para la que están principalmente diseñadas.

    REQUESTS...

    Con nuestra librería de requests podremos ver el contenido fuente de cualquier página y realizar peticiones por métodos como GET y POST. El método de requests.get nos devuelve también un código de status.

    Código: python

    import requests
    page_get = requests.get("https://viinacademy.com/index.html")


    <Response [200]>


    El código de status nos indica si la página respondió correctamente, en otros casos puede dar otro tipo de códigos de estado, como por ejemplo 500, que corresponde a un Internal Server Error.

    Podemos imprimir el contenido de la página usando webpage.content:

    Código: python

    import requests
    page_get = requests.get("http://example.com/index.html")
    page.content


    Donde devolverá todo el contenido del HTML:
    b'<!DOCTYPE html>\n<html>\n    <head>\n        <title>A simple example page</title>\n    </head>\n    <body>\n        <p>Here is some simple content for this page.</p>\n    </body>\n</html>'


    Entremos con BS4

    BS4 nos permite la extracción de datos en concreto de una página web. Podemos usarla para archivos .html o para .xml. Nosotros podemos parsear el documento y extraer todos las etiquetas de párrafos que existen. Para ello, podemos usar el siguiente código:

    Código: python

    from bs4 import BeautifulSoup
    page = requests.get("http://example.com")
    soup = BeautifulSoup(page.content, 'html.parser')
    soup.find_all('p')


    BeautifulSoup nos permite extraer etiquetas como a href, párrafos, incluso selectores de CSS. Si quieres ver muchos de los ejemplos que existen actualmente de esta grandiosa librería, puedes irte a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Concluyendo, hay muchas más librerías un poco más potentes que bs4, sin embargo, ésta bien usada también tiene un gran potencial para realizar scraping y/o recolección de información.

    A continuación el spider que realicé y que pueden comprender mediante los distintos comentarios que dejé en el código.

    Código: python

    # Importamos librerías. #
    import requests
    import sys

    from bs4 import BeautifulSoup

    # Creamos nuestras listas. #
    urls = []
    urls2 = []

    # Recibimos los argumentos. #
    target_url = sys.argv[1]

    # Realizamos una conexión al argumento pasado y además, leemos todo el contenido del código fuente que existe en la página. #
    url = requests.get(target_url).content
    # Usamos nuestra librería de bs4 para posteriormente recatar lo que deseamos. #
    soup = BeautifulSoup(url)
    # Mediante el for y el método de bs4 llamado find_all, recolectamos todas las etiquetas donde existe a href. #
    for line in soup.find_all('a'):
        new_line = line.get('href')
        try:
        # Si existe en alguna línea del código fuente el http, lo almacenamos en nuestra lista llamada urls. #
            if new_line[:4] == "http":
                if target_url in new_line:
                urls.append(str(new_line))
            # Si no existe, intentamos combinar nuestro argumento(url de la página) + lo que encontramos. #
            elif new_line[:1] == "/":
                try:
                    comb_line = target_url+new_line
                    urls.append(str(comb_line)) 
                except:
                    pass
            # Recorremos lo que hemos guardado anteriormente en nuestra lista(urls).
            for get_this in urls:
            # Como dentro de urls están todos los enlaces, realizamos una conexión a dicha url y leemos el código fuente. #
                url = requests.get(get_this).content
                # Usamos nuestra librería de bs4 para posteriormente recatar lo que deseamos. #
                soup = BeautifulSoup(url)
                for line in soup.find_all('a'):
                    new_line = line.get('href')
                    try:
                        if new_line[:4] == "http":
                            if target_url in new_line:
                                urls2.append(str(newline))
                        elif new_line[:1] == "/":
                            comb_line = target_url+new_line
                            urls2.append(str(comb_line))
                    except:
                        urls_3 = set(urls2)
                # Recorremos nuestra lista llamada urls_3 e imprimimos todos los links de nuestro spider.
                for value in urls_3:
                    print(value)
        except:
        pass

    # Mortal_Poison -> https://www.youtube.com/VIINVIDEOSHD.


    Espero que les sirva, para ejecutarlo, basta con poner en nuestro cmd o nuestra terminal: python No tienes permitido ver los links. Registrarse o Entrar a mi cuenta No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Les dejo una captura de cómo funciona:


    Ilustración 7. Ejecutando el spider.


    Ilustración 8. Spider funcionando.

    Cualquier pregunta/duda/sugerencia será bien recibida.

    En un próximo post traeré de cómo recatar información cuando están en tablas o bueno, de cómo podemos combinarlo con librerías de DataFrame para hacer mucho más potente nuestra recolección de datos.

    Un ejemplo más práctico lo pueden ver en el siguiente vídeo:


    Un saludo.
    #23
    Hola a tod@s,

    Éste es mi segundo post, ya que el que les iba a traer aún no lo termino  ::). Sin embargo, me propuse a postear algo interesante y creo que esto le servirá a muchas personas que quieren documentar/reportar/aprender sobre las explotaciones y post-explotaciones a los archivos .htaccess.

    DEFINICIONES...

    htaccess hace referencia a Hypertext Access. Es un archivo de configuración usado por servidores Apache. En éste archivo lo que se determinan son las reglas de cómo queremos que se comporte el servidor, indicándole los ajustes iniciales. Es usado muy común cuando deseamos proteger algún directorio en especial o incluso, no sé si han notado que muchos administradores de Joomla!, Wordpress, Drupal u otro CMS(Content Management System) los usan para que no accedan a sus paneles de administración.


    Ilustración 1. Reglas de ejemplo para que restringir el acceso al panel de administración.




    POP-UPS CONTINUOS A LOS USUARIOS

    A continuación les muestro un ejemplo de un archivo .htaccess:

    Código: php
    ### MAIN DEFAULTS ###
    Options +ExecCGI -Indexes
    DirectoryIndex index.html index.htm index.php
    DefaultLanguage en-US
    AddDefaultCharset UTF-8
    ServerSignature Off


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

    Me parece muy interesante dicho ejemplo, pues noten que tiene una regla llamada ServerSignature en modo Off, ésto, con el fin de ocultar y no permitir el banner grabbing de Apache. Si no sabes qué es el banner del servidor web de Apache, es cuando en fase de reconocimiento te das cuenta de que la aplicación web que estás auditando está alojada en Apache por sus cabeceras, devolviendote algo similar a:


    Ilustración 2. Banners headers de Apache Web Server.

    La técnica de los pop-ups realmente no es un peligro, sin embargo, es usado por muchos 'troles' que desean molestar los foros/sitios web y demás entornos donde se pueda subir una foto de perfil, avatar personalizado y también las famosas firmas.

    En ésta técnica abusamos del mod_rewrite, cuyo fin es para designar y modificar el cómo se muestran las URL y las páginas web de tus sitios a tus usuarios. Palabras más, palabras menos, con él, podemos redireccionar. Un ejemplo  claro sería cuando tenemos:

    URL: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. El mod_rewrite se encargaría de convertir esa url a:
    URL: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Para un ejemplo más sustancioso, haz de cuenta que tienes dos imágenes: publica.png y protegido.png. publica.png se almacenará en un directorio público, mientras que protegido.png se almacenará en un directorio protegido con su respectiva contraseña(por algo es protegido).

    Teniendo en cuenta esto, nuestro archivo .htaccess quedaría de la siguiente manera:

    Código: php

    Options +FollowSymlinks
    RewriteEngine on
    RewriteRule publica.png /protected-directory/protegido.png
    AuthUserFile /home/usr/.htpasswd
    AuthName "authentication name"
    AuthType Basic
    require user mortal


    Explicando a groso modo, las anteriores reglas:

    • FollowSymlinks : cuando se trata de servidores web, no puedes dejar las cosas sin definir. Tienes que definir quién tiene acceso a qué. La regla de FollowSymlinks le dice a su servidor si debe o no seguir los enlaces simbólicos.
    • RewriteEngine : nos permite reescribir o redireccionar una URL.
    • Auth*(el asterisco indica todo lo que siga después de Auth) : apunta al archivo de contraseñas que creamos, en éste caso, el archivo se llama .htpasswd.
    • require user : Requiere a un usuario válido.

    ¿Notaron que estamos haciendo una redirección de publica.png a protegido.png, no? sino, ya casi lo norarán.
    Como lo mencione, el archivo donde almacenamos las contraseñas(llamado .htpasswd) deberá estar configurado de la siguiente manera:
    username:contraseñaEncriptada


    El nombre de usuario claramente tendrá que coincidir con el nombre de usuario que agregó en el archivo .htaccess. La contraseña encriptada se puede realizar mediante la función de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta sino, puedes usar generadores de contraseñas en línea.

    Ahora, lo que podrías hacer es configurar como imagen de perfil/imagen de un foro o cualquier otro, la imagen publica.png. ¿Qué sucederá? cualquier persona que desee ver tu imagen le aparecerá repetidamente el aviso para incorporar el nombre de usuario y contraseña. Es un poco molesto la verdad, y ya se consideraría spam.


    Ilustración 3. Diálogo que les abriría al intentar ver tu imagen.




    FINGERPRINTING - IP  LOGGING

    Similar a la técnica número uno, ésta técnica nos ofrece poder rastrear direcciones IP sin la interacción de los usuarios. Incluso, podríamos establecer que se descargue un fichero autoejecutable con evasiones de antivirus para que tengamos una conexión meterpreter :) (si el autorun no está habilitado[cosa que normalmente pasa >:(] podemos usar el USB Rubber Ducky o el más querido, BADUSB).

    El hecho es que, dejando de lado lo del payload autoejecutable, la técnica realmente consiste en recopilar todo tipo de información sin que ellos sean conscientes.

    Haríamos básicamente la misma redirección, solo que a nuestro fichero de .php:

    Código: php

    Options +FollowSymlinks
    RewriteEngine on
    RewriteRule publica.png /path/to/mortal.php


    Quizá, te estarás preguntando, ¿y el servidor 'víctima' cómo interpretará el archivo de mortal.php si pública.png lo redirecciona?. Entendámolo mejor.

    Debemos engañar al servidor para que considere que hemos incluido una imagen válida. Desde el punto de vista de los servidores, ellos estarán haciendo una solicitud a un archivo de imagen. Generalmente los servidores no incluyen la imagen en la página(y mucho menos nuestro script de PHP). Como somos magos, debemos engañar al servidor para que considere que estamos incluyendo una imagen y no nuestro script de mortal.php.

    Para engañarlo, basta con que hagamos uso de la gran función de php llamada imagecreate(). Así es, vamos a usar imágenes dinámicas de PHP para que el servidor crea que estamos incluyendo publica.png en lugar de mortal.php.

    He implementado un pequeño script en PHP:

    Código: PHP

    <?php
    /* Vamos a escribir en un archivo de html. */
    $log = 'data.html';
    /* Capturamos la ip de nuestra víctima. */
    $remote_ip = $_SERVER['REMOTE_ADDR'];
    /* Capturamos la URI actual de la página. */
    $page_URI = $_SERVER['REQUEST_URI'];
    /* Capturamos el referer, es decir, de dónde viene. */
    $refer_where = $_SERVER['HTTP_REFERER'];
    /* Día, mes, año y hora. Esto, por si deseamos tener más segmentado nuestra información */
    $date_time = date('l, F d y h:i:s');
    /* El navegador que está usando */
    $agent_get = $_SERVER['HTTP_USER_AGENT'];


    /* Abrimos nuestro archivo de data.html y comenzamos a insertar los datos */
    $fp = fopen("data.html", "a");
    /* Se inserta la fecha, IP, la página, el referido y el user_agent. */
    fputs($fp, "<b>$date_time</b><br>
                <b>IP: </b>$remote_ip<br>
    <b>Page_URI: </b>$page_URI<br>
    <b>Refer: </b>$refer_where<br>
    <b>Useragent:</b>$agent_get <br>
    ####################################### <br><br>");
    flock($fp, 3); /* Usamos bloqueo obligado a todo lo que contiene nuestra variable fp. */
    /* Cerramos nuestro archivo */
    fclose($fp);

    /* Hacemos la magia */

    /* imagecreate nos permite representar una imagen en blanco del tamaño especificado. imagecreate(ancho*alto). */
    $my_img_ = imagecreate(190 ,100);
    /* Rellenamos el color de fondo. */
    $background = imagecolorallocate( $my_img_, 121, 0, 255);
    $text_colour = imagecolorallocate( $my_img_, 200, 200, 0 );
    $line_colour = imagecolorallocate( $my_img_, 212, 233, 0 );

    /* Dibujamos una cadena horizontalmente. */
    imagestring( $my_img_, 4, 30, 25, "For our victim...", $text_colour );
    /* Grosor de nuestra linea. */
    imagesetthickness ( $my_img_, 3);
    /* Color de nuestra línea */
    imageline( $my_img_, 30, 45, 165, 45, $line_colour );
    /* Lo admitido. */
    header( "Content-type: image/png" );
    /* Mostramos nuestra imagen. */
    imagepng( $my_img_ );
    /* Y procedemos a mostrar lo demás. */
    imagecolordeallocate( $line_color );
    imagecolordeallocate( $text_color );
    imagecolordeallocate( $background );
    /* No es necesario, pero vamos, es una buena práctica por si llegase a ser muy grande la imagen. */
    imagedestroy($my_img_);


    /* https://www.youtube.com/VIINVIDEOSHD */
    /* https://www.viinacademy.com */
    /* https://underc0de.org/foro/profile/mortal_poison */
    ?>


    Pueden testear como se ve la imagen que creamos en la siguiente URL: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Si notan, en el código existe una vulnerabilidad xD, simplemente quería hacer un poco de consciencia. La vulnerabilidad es un XSS persistente y se encuentra en el $_SERVER['HTTP_USER_AGENT']; y bueno, la verdad es que para mitigar esto, cambien el data.html a data.txt.


    Si no entienden algo del código, lo dejé comentado. En resumen, lo que hace el script es: cuando se presenta la imagen en el navegador de los usuarios, éste escribirá su agente de usuario, dirección IP, el encabezado de referencia y otra información útil. Imaginen cuánto daño se podría causar, desde saber de dónde se conectan las víctimas hasta diseñar payloads para los mismos.

    Para finalizar, si llegases a establecer tu imagen de perfil publica.png, la secuencia de .htaccess redirigiría a la secuencia de comandos PHP ocasionando que el servidor piense que publica.png es mortal.php y nos suministre lo que deseamos :o.




    Evasión de vulnerabilidades web

    htaccess tiene varios usos para la evasión de filtros con respecto a las vulnerabilidades web. Comencemos con un vector de ataque de falsificación de solicitudes de servidor(SSRF).

    Server-Side Request Forgery

    He diseñado un diagrama que les dará a entender cómo funciona éste ataque(para los que no lo conocen):


    Ilustración 4. Diagrama de un ataque SSRF.

    Si aún no logras entender el diagrama, te explicaré de una forma más sustanciosa. Para propósitos de ejemplo, supongamos que tienes la web:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    El parámetro ?url= está por método GET de HTTP, por tanto, podrías cambiar a:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Recuerda que el puerto 3306 hace referencia(usualmente) a la base de datos. Asumiendo eso, ésto permitiría a un atacante la divulgación de archivos locales a través de SSRF, permitiendo leer contenido localmente. Hay muchas protecciones contra éste tipo de ataques, pero también muchas formas de hacer Bypass.

    Por supuesto, podríamos lograr incluso RCE asumiendo que existen servicios como smb, sftp, gopher, memcached, entre otros.
    Nuestro htaccess quedaría de la siguiente manera:

    Código: php

    Options +FollowSymlinks
    RewriteEngine on
    RewriteRule publica.png http://127.0.0.1:3306


    Redireccionamos de publica.png a la base de datos del localhost con el fin de que no se nos incluya en una blacklist si llegase a existir una protección directa. A pesar de que lo redireccioné al localhost, pueden hacerlo con otros archivos importantes, como por ejemplo: /etc/passwd,C:\WINDOWS\system32\config\SAM o C:\WINDOWS\system32\config\SYSTEM.

    Tendríamos que hacer la llamada a nuestra imagen desde el sitio para que nos devuelva información que hemos solicitado mediante nuestro ataque de SSRF.


    Tenemos que considerar el alcance que podría repercutir tener un fichero .htaccess a disposición de un atacante. Hagamos un poco de GHDB básico.


    Ilustración 5. Dorks para encontrar .htaccess.

    Si observan detalladamente, NO en todas las webs aparece como: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Aparecen como:

    • 1.htaccess
    • a.htaccess
    • _1.htaccess
    • Old.htaccess
    • _____.htaccess

    el .htaccess varía a menudo, quizá alguno que posea un poco más de tiempo, podría crear un script que con un diccionario de ese tipo de opciones(como la anterior lista) encuentre el .htaccess de una web.

    Para terminar, desearía concluir que tener conocimiento de las reglas de .htaccess en cualquier web, permitirá a un atacante saber qué restricciones de seguridad existen y cuáles no. Por lo tanto, permitirá saber qué es lo que potencialmente necesita ser evitado y aprovecharse de ello. También puede revelar información sobre las tecnologías que se ejecutan en la website(importante).

    Incluyendo que si por 'x' motivo un atacante tiene acceso limitado a un servidor, es decir, tiene permisos pero no puede editar archivos ni realizar otras acciones, pero tiene la capacidad de editar el .htaccess repercutirá en un grave problema de seguridad(tan así, que hasta se puede subir una webshell).

    En otro post podría poner de cómo tener más alcance con esto.

    Espero que les haya gustado el post.
    Cualquier duda/sugerencia/aporte pueden escribirlo por este medio.

    Muchas gracias por leer.

    Un saludo.

    Me pueden encontrar en:
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


    GLOSARIO:

    Banner grabbing: obtener información sobre el servidor donde reside la aplicación web, llegando al punto de relacionarse con Fingerprinting.
    RCE: Ejecución de código remoto. Es una vulnerabilidad para ejecutar cualquier comando en una máquina de destino o en un proceso de destino.
    Bypass: Saltarse una medida de protección.
    GHDB: Google Hacking Database.

    #24
    Hola a tod@s,

    Bien, éste es mi segundo post y aunque no encontré la sección indicada para publicarlo, creo que el más ideal es éste.
    Resulta que a veces se torna complejo el leer código fuente ajeno y que bueno, la verdad pensar lo que pensó en ese determinado momento un programador / desarrollador se puede volver complicadísimo.


    Ilustración 1. Tú pensando en cómo leer el código de otra persona.

    Recuerdo que hace mucho tiempo decían:
    Citar "SI QUIERES APRENDER MÁS, LEE CÓDIGO FUENTE DE OTRAS PERSONAS".

    Yo siempre asemejo esa frase con un escritor. Si deseas ser un escritor y quieres ser uno de los mejores, ¿te basta solo con enfocarte en tu escritura? pues la respuesta es un rotundo no. Para ser un buen escritor, debes ser un lector voráz. Para destacar, para manejar léxico, para aprender estilos, debes aprender a interpretar la escritura de otros escritores ya sean más o menos experimentados que tú.

    Existen diversas técnicas para poder leer un código fuente, entre ellas:

    • Cuando el autor del programa ha escrito en un archivo donde explica la estructura del mismo y además, la responsabilidad de cada uno de los módulos.
      En otras palabras, cuando se posee documentación del programa.
    • Revisar los directorios existentes de los cuales se desprende el programa, haciendo posible la deducción de una parte de la escritura del código.
    • Ver los comentarios en las líneas que se hicieron en el programa.

    A pesar de tantas técnicas que podemos encontrar, también podemos encontrar tips(la encontré hace ya varios años):
    No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

    Cómo leer código fuente de otras personas

    He visto a muchos que son programadores. Alguna vez que les he dado un código para la interpretación del mismo, lo único que hacen es desplazarse de arriba a abajo con un cara de amargura e incluso, de desasosiego ante eso. Luego se arrepienten y prácticamente comienzan a excusarse:

    • El código es una mierda.
    • El código está desactualizado, no sirve.
    • Podemos resolver el problema de otras maneras.
    Yo diría que es como por etapas. Sicología, ¿dónde? ;D.

    Realmente me hacen dudar de su experiencia, pero son personas que no quieren calibrar su forma de desarrollo.

    Siguiendo con nuestro querido post, les quiero mencionar a todos que si realmente desean aprender y entender cómo funciona el código de otra persona, la única solución viable que siempre he encontrado es la paciencia.




    A continuación, un listado que me han servido a mí y que probablemente les servirá a ustedes cuando se encuentren a éste reto:


    • Build and run!
      Primero debes entender cómo funciona el programa, qué es lo que hace. No me refiero al código, me refiero al programa funcional. Luego de entender cómo funciona, piensa en una nueva función que podrías añadir. Oblígate a mejorar el programa en algo. De ésta manera, tendrás que exigirte a ti mismo saber cómo funciona el código.
    • Distinguish styles
      Distinguir los estilos es muy importante. Saber que en un código nos podemos encontrar con código spaguetti, código refactorizado o con modularidad es indispensable para que podamos apropiarnos y saber qué nos espera. No es lo mismo leer un código el cual lo hicieron por hacerlo, a leer un código bien estructurado.
    • Review main class
      Para mí, esto es muy importante. Si revisas el main o de donde se hacen los llamados a las funciones / clases / métodos, podrás ver a cuál llama primero, luego de eso, podrás irte a la función / clase / método y comenzar a leer línea por línea el por qué lo llama inicialmente. Así mismo para los demás llamados.
    • Become familiar with the new
      Familiarizarse con lo nuevo creo que es radical. A esto no me refiero que vayas a leerte un proyecto de Google si encuentras una función y no sabías lo que hacía xD, me refiero a a que si no entiendes algo, consultalo, aprende para qué sirve y regresa al código. No sirve de mucho 'perder' tiempo cuando se encuentra en tiempo de entregas. Si estás libre, en mi opinión, es válido y sería muy bueno que lo hicieras.
    • Desktop Testing
      Las pruebas de escritorio son muy útiles si te encuentras en una función con for aninados o bueno, algún loop anidado. Si no entiendes algo, haz una prueba de escritorio. Con esto, lograrás saber cuál es el límite de dicho loop(finito o infinito) y deducirás rápidamente el uso que tiene éste adentro del programa.
    • Documentation
      Pragmáticamente lo que concierne éste punto es, si crees que al método / función / clase que estás leyendo le hace falta documentación, documentalo. Me ha pasado varias veces que, leo un código de otra persona, entiendo para qué sirve una función pero cuando vuelvo a leer 'x' línea de código, no recuerdo para qué servía. Eso es tiempo perdido. Puedes evitarlo documentando dicha línea en el código.
    • Modify lines of code
      Modificar trozos de código es muy bueno, deberías hacerlo siempre que tengas la posibilidad.
    • Doubts
      Si posees dudas en una función extraña, que hasta los que la desarrollaron ni la entienden, es momento de preguntar en foros especializados. Así no te frustras y dejas todo tirado(esto para personas impacientes, por eso recalqué lo de la paciencia).
    • print('Mortal_Poison')
      Considerando que no entiendes lo que pasa en una variable, imprime lo que está antes. ¿Para qué tienes la función de impresión? ::) .

    A medida que me vaya acordando y observando más consejos útiles, modificaré el tema y los pondré.

    Me gustaría que ustedes también pudieran compartir sus experiencias al leer código fuente ajeno, creo que es importante para los que comienzan e incluso, para los que ya hemos tocado código.

    Destaco que lo enfoque principalmente a lenguajes de alto nivel. A lenguajes de bajo nivel no tanto, porque no estoy muy familiarizado con dichos lenguajes a pesar de que hace un tiempo los trabajé. Si alguien pudiera dar unos consejos para ese tipo de lenguajes, estaría perfecto.

    Para terminar, no puse nada del tema de idiomas(en específico inglés) debido a que asumo que se conoce lo básico-medio para el tema.

    Un saludo.
    #25
    Hola a tod@s,

    Éste es mi primer post en underc0de, así que espero que les sea de utilidad.

    Hace algún tiempo decidí crear un bot con Python + Selenium(es espléndida), considero que puede llegar a ser de utilidad para las personas que deseen saber cómo funciona un bot en twitter, facebook, gmail, entre otras.

    ¿Alguna vez te has preguntado cómo funcionan éste tipo de bots?

    Funcionan de una manera realmente asombrosa, es el poder hecho script(en muchos casos).

    Los bots que muchos conocen de likes, comentarios y demás son posibles automatizarlos mediante Python y cualquier otro lenguaje de programación.  Python, nos ofrece muchas librerías, entre ellas la mejor conocida como SELENIUM.  Selenium es una librería la cual usamos para automatizar lo que haríamos normalmente en el navegador. Les dejo una pequeña descripción que tienen en su sitio oficial:

    CitarSelenium automatiza los navegadores. ¡Eso es! Lo que hagas con ese poder depende totalmente de ti. Principalmente, es para la automatización de aplicaciones web para fines de pruebas, pero ciertamente no se limita a eso. Las tareas de administración basadas en la web pueden (y deberían!) Ser automatizadas también.

    Ya definiendo eso y conociendo lo que es, vamos a entrar en un ejemplo más práctico, donde mostraré cómo usarla y en éste caso, lo haré en el sistema operativo de Windows.

    Cabe aclarar que Python al ser multiplataforma, es indiferente si usamos Linux, Mac, Windows u otro sistema operativo.





    ¡USÉMOLO!

    Para descargar Selenium, lo podemos hacer en ésta web:

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


    Ilustración 1. Descarga de Selenium.

    Una vez descargado, lo podemos instalar simplemente con nuestro Python(recuerden que lo deben tener en las variables de entorno):


    Ilustración 2. Instalación de Selenium.

    Luego de la instalación, podemos proceder a lo que nos gusta, el código  :).

    Existen diversas formas de programar/desarrollar, lo sabemos. Sin embargo, ustedes pueden adaptar éste código a su manera, a su lógica, a su uso.

    En éste caso, realizaré un bot que realice un post 1000 veces(compartir) en Facebook. Se puede poner también un loop infinito.

    Antes que nada, importemos selenium.

    Para importar selenium lo hacemos de la siguiente manera:

    Pero...

    Existe un paso muy importante, es el de descargar el webdriver de Mozilla Firefox o en su defecto, el de Google Chrome. El webdriver de Mozilla Firefox se llama Geckodriver y el de Chrome se llama ChromeDriver.

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

    Una vez descargado(a elección y criterio suyo) procedemos a:
    1) Ponerlo de variable de entorno / solución más óptima si van a trabajar con Python + Selenium muchas veces.
    2) Ponerlo en una carpeta y simplemente pasarle la ruta a nuestro script.

    Yo opté por la segunda opción y además, lo haré con Geckodriver(webdriver de Firefox), así que vamos a ello.

    Ahora si procedemos a importar algunas declaraciones de importaciones básicas para importar módulos de Selenium.


    Ilustración 3. Importación de la librería con sus respectivos módulos.

    Luego de importar correctamente nuestra librería, debemos importar nuestro Geckodriver en una línea del script(OJO, SI NO LO TIENEN EN LA VARIABLE DE ENTORNO, SINO, SE SALTAN ESTE PASO).


    Ilustración 4. Llamado a Geckodriver para su uso.

    --> Recuerden que esa es mi ruta donde tengo el Geckodriver, en su caso, deben poner la ruta donde lo dejaron.


    Como vamos a realizar un bot para Facebook, tenemos que ingresar a nuestra cuenta, en ese caso, creamos una función llamada "executeBot()" a la cual le insertaremos nuestra lógica.


    Ilustración 5. Datos de acceso de nuestra cuenta.

    Nótese que solo estamos poniendo en dos variables nuestro email y nuestra contraseña, pero no estamos insertándolo en el formulario de login de Facebook. con "driver.get(url)" lo que hacemos es acceder a cualquier url que deseemos. Recuerden que driver vendría siendo nuestro objeto de tipo browser.

    Ahora bien, ya teniendo nuestros datos, debemos insertarlos en el formulario y además, presionar en el botón de entrar.
    Para ello, tenemos que tener un concepto clave antes de seguir. Xpath es lo que usa selenium(sin mencionar los selectores de CSS) para que pueda saber dónde va a ingresar datos, dónde va a hacer click, entre otras. Xpath nos sirve precisamente para recopilar los inputs, botones, clases, id's y demás que necesitemos usar en Selenium.

    Resumiendo, tenemos una página web, sacamos el xpath de los input de logeo y eso se lo pasamos a Selenium. Selenium ingresa lo que le hemos indicado con anticipación que ingrese y ya está.

    Eso lo haremos ahora mismo. Para sacar los xpath de cualquier página, basta con el inspector de elementos de Chrome / Firefox, pero sino, existen diversas extensiones como lo puede ser Firepath(recomendada).

    Yo lo haré con el inspector de firebug, así que lo único que debemos hacer es darle click derecho a los inputs y al botón que deseemos extraer los xpath's y ponerlos en nuestro código. Veámolo en detalle.


    Ilustración 6. Extracción de xpath del correo electrónico.


    Ilustración 7. Extracción de xpath de la contraseña.


    Ilustración 8. Extracción de xpath del botón.

    Cada uno de ellos los vamos a pegar en las siguientes líneas de código.


    Ilustración 9. Inserción de xpath's en nuestro código.

    Lo que está subrayado en amarillo, es cada uno de los xpath's que extraje, en la variable de email, está la del input del email. En la variable de password, está el del input de password. En la variable de button, está el xpath del botón.

    EXPLICACIÓN DE LOS MÉTODOS
    find_element_by_xpath() --> le indicamos a nuestro navegador que encuentre el xpath que deseamos.
    send_keys()                    --> usado para insertar contenido en un campo editable(inputs por ejemplo).
    click()                             --> para presionar click en alguna parte de la página web(indicar xpath).

    Tenemos ya nuestra sesión de Facebook abierta. Ahora, lo que queríamos era compartir un enlace de facebook, lo haremos de la siguiente forma:


    Ilustración 10. Compartir contenido de facebook en nuestro perfil.


    Ilustración 11. Compartir contenido de facebook en nuestro perfil.

    En la Ilustración 11. podemos notar que existe el botón de "publicar", ahí lo único que se hace es extraer el xpath y luego de eso, pasarselo a nuestro método de find_element_by_xpath para que posteriormente no haya ningún problema con click().

    Si notan, en ese campo no pusimos nada, porque en la url ya le estamos pasando el enlace: "No tienes permitido ver los links. Registrarse o Entrar a mi cuentaENLACE", sin embargo, podríamos sacarle el xpath a ese textarea e insertarle nuestro contenido. El xpath de ese textarea es(Les ahorro trabajo): //*[@id="u_0_s"]

    Nos queda probar nuestro bot, llamamos nuestra función:


    Ilustración 12. Llamada de función para ejecución del script.

    Y prácticamente eso sería todo. Les dejo el código completo aquí:

    Código: python
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from time import sleep
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support.ui import Select
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions
    from selenium.common.exceptions import NoSuchElementException

    driver = webdriver.Firefox(executable_path='C:/Users/Mortal_Poison/Downloads/geckodriver-v0.19.0-win64/geckodriver.exe')
    def executeBot():
    input_email_id = "[email protected]"
    input_pwd = "our_password"
    # Get the page. In this case is loggin attempt of Facebook.
    driver.get('https://www.facebook.com/login.php?login_attempt=1&lwv=110')
    print("...Facebook is open...")
    # We find the xpath for insert our email address.
    email = driver.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/div/div/div[2]/form/div/div[1]/input")
    # Put mail.
    email.send_keys(input_email_id)
    print("Email put.")
    # We find the xpath for insert our password.
    password = driver.find_element_by_xpath("//input[@id='pass']")
    # Put password.
    password.send_keys(input_pwd)
    print("Password put...")
    # We find xpath of button Login.
    button = driver.find_element_by_xpath("//button[@id='loginbutton']")
    # We click on button of login.
    button.click()
    # Open session.
    print("Facebook account is open.")
    x = 0
    while x<1000:
    driver.get("https://www.facebook.com/sharer.php?u=youtube.com/viinvideoshd")
    postbutton = driver.find_element_by_xpath('//*[@id="u_0_1v"]')
    postbutton.click()
    print("Shared!." , x)
    x = x+1

    #driver.get("https://www.facebook.com/Underc0de/")
    #post_textarea = driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div/div[2]/div[1]/div/div[2]/div/div[1]/div/button[1]')
    #post_textarea.click()
    #print("Liked page.")

    executeBot()


    # https://www.youtube.com/viinvideoshd
    # https://www.viinacademy.com
    # https://underc0de.org -> Mortal_Poison


    Si desean hacerlo para móviles, también pueden hacerlo con Selendroid.

    Posdata: Lo que está comentado luego del while es para dar like a una página de Facebook, en ese caso puse la página de Facebook de underc0de. Si no ven bien las imagenes, pueden dar click derecho, copiar link de la imagen y pegarla en una nueva pestaña, te aseguro que se verá mejor.

    Y bueno chic@s, espero que les haya servido, ya les traeré un post más completo de cómo usar esto pero enfocado netamente a la seguridad ofensiva ;D. Cualquier sugerencia / duda / aporte será bien recibido.

    Podrían compartir sus bots con Selenium en éste hilo, y así podríamos crear uno que sea útil para cualquier cosa.

    Pueden ver una demo muy corta que creé aquí: