elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 25
71  Programación / Scripting / Re: Script con archivos autoextraibles en: 27 Julio 2020, 17:28 pm
La idea es que entiendas el código, si tienes cualquier duda sobre ello, pregunta  ;-)
72  Programación / Scripting / Re: Script con archivos autoextraibles en: 26 Julio 2020, 20:33 pm
Claro que es posible, un archivo no es más que binario. Puedes comprimirlo, descomprimirlo, cifrarlo o lo que quieras.

Busca una librería de compresión y su documentación.
O un algoritmo e implementalo.
O invéntalo tu de 0.

Como dice nuestro compañero, un archivo es un binario. Yo hace más o menos un año o por allá en primero de grado medio de FP, quiera hacer un "backdoor", con conexion socket cliente-servidor. Donde el cliente podía subir un archivo de su escritorio local al servidor y viceversa. Una pena que perdiera ese códgo...

Por suerte el codigo esta en este foro: https://foro.elhacker.net/scripting/conexion_sockets_en_python_con_ip_publica-t493988.0.html;msg2194422
73  Programación / Scripting / Re: Función for (python), duda de "novato". en: 25 Julio 2020, 19:54 pm
Citar
¿Por qué si Indice = 0 todo va bien, pero si Indice = 1, la maquina me devuelve: "lista[Indice] *= 10
IndexError= list idex out of range "?
Porque al final de la lista, el la variable indice tendrá un numero mayor del indice existente.

para mostrar un elemento en la lista sería lo siguiente.
Código:
lista = [1,2,3,4,5,6,7,8,9]
 lista[0] => output: 1
 lista[1] => output: 2
 lista[2] => output: 3
 lista[3] => output: 4
 lista[4] => output: 5
 lista[5] => output: 6
 lista[6] => output: 7
 lista[7] => output: 8
 lista[8] => output: 9
 lista[9] => IndexError= list idex out of range
Ya que en la posición 9 ya no hay ningun elemento

SI la lista fuera:
Código:
lista = [1,2,3,4,5,6,7,8,9,10]
 lista[0] => output: 1
 lista[1] => output: 2
 lista[2] => output: 3
 lista[3] => output: 4
 lista[4] => output: 5
 lista[5] => output: 6
 lista[6] => output: 7
 lista[7] => output: 8
 lista[8] => output: 9
 lista[9] => 10
La posicion 9 tendría el valor 10, si ahora en esta lista pones un numero mayor este te saltará el error IndexError= list idex out of range

Esto lo tienes claro? Una vez entiendes esto... veamos tu codigo

Código:
#Modificar una lista.
lista = [1,2,3,4,5,6,7,8,9]
Indice = 0
for recorrer in lista:
    lista[Indice] *= 10
    Indice += 1
print(lista)

Este crea una lista y en la variable Indice el valor por defecto es 0. Después leemos todos los elementos de la lista con un bucle for
Código:
for recorrer in lista:
    lista[Indice] *= 10
    Indice += 1
El bucle para cada elemento ejecutará lo que haya dentro. así que:

Código:
   1º pasada:
           lista[0] *=10 # output 10
    2º pasada:
           lista[1] *=10 # output 20
    3º pasada:
           lista[2] *=10 # output 30
    ....
    9º pasada:
          lista[8] *=10 # output 90 (9*10)

Ahora pongamos la variable Indice como valor 1 por defecto
Código:
   1º pasada:
           lista[1] *=10 # output 20
    2º pasada:
           lista[2] *=10 # output 30
    3º pasada:
           lista[3] *=10 # output 40
    ....
    9º pasada:
          lista[9] *=10 # output ERROR IndexError= list idex out of range
Y como da un error, ya no puede acabar de ejecutar el script

Citar
¿Por qué es necesario el Indice en "lista[Indice] *= 10"?
Porque si no, no estas especificando ningún número para que pueda ejecutar la operacion.

Espero que te haya podido resolver tu duda!  :). Y suerte con tus estudios.
74  Programación / Scripting / Re: Como envia datos a un sitio web HTTPS via socket? | Servidor Proxy python3 en: 25 Julio 2020, 18:19 pm
Buenas!! Cuando he hecho la parte del proxy HTTP entendí su funcionamiento y todo, pero ahora en la parte de HTTPS. no acabo de entender muy bien.... Modifiqué el código, para ver mejor lo que esta pasando...

Código:
#CODE
class Send_data_tls:
def send_data(self, site, port, conn, data, addr):
context = ssl.create_default_context()
sender = context.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM), server_hostname=site)
sender.connect((site,port))
HEAD = "HEAD / HTTP 1.1\r\nHost: "+str(site)+"\r\n\r\n"
sender.send(HEAD.encode())
print("\033[1;32m data sent\033[0m: "+str(data))
receive = sender.recv(BUFFER_RECV)
print("\n\n"+str(receive))

def get_data(conn, addr, data):
#CODE
if port == 443:
SSL = Send_data_tls()
SSL.send_data(website, int(port), conn, data, addr)
else:
send_data(website, int(port), conn, data, addr)
#CODE
#CODE

Hice varias pruebas y ninguna me surgió nada interesante... donde pueda partir de alla. Cree la clase Send_data_tls con la funcion send_data (creo una clase por que me imagino que tengo que hacer algo antes de enviar los datos a la web HTTPS).

En la funcion get_data en la condicional cargo la clase en la variable SSL y ejecuto la funcion send_data().

Cuando lo ejecuto, me encuentro con algo MUY lógico...
[IMAGE] =>  https://drive.google.com/file/d/1rdieWydRAgjcHvhZ7qdK6hrk583-V2Hl/view?usp=sharing

Lo que pasa, y cuya cosa ya me dí cuenta es que, al conectarme a la web por 443
Citar
data sent: b'CONNECT platzi.com:443 HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0\r\nProxy-Connection: keep-alive\r\nConnection: keep-alive\r\nHost: platzi.com:443\r\n\r\n'

Este se conecta antes con el servidor Cloudflare (creo que la CA para autenticar el certificado), y este por alguna razon me recibe el 400 Bad Request.

El problema en que no entiendo que esta pasando y que debo hacer.... El cloudflare me esta rechazando.

Puedo hacer lo que quiero hacer con unicamente el modulo ssl?

Segun @el-brujo me dijo que con ese modulo me bastava. Hay algun post o sitio donde expliquen como funciona este modulo?
Para navegar o en tu caso, para enviar una petición con datos sólo tienes que usar la librería SSL y ya:

Código:

import ssl


https://docs.python.org/3/library/ssl.html


Gracias
75  Programación / Desarrollo Web / Re: [Pregunta]: ¿Por qué y cómo puedo resolver esto? en: 22 Julio 2020, 19:16 pm
Este archivo PHP contiene HTML, pureba de cambiar tu archivo a:
Código:
<?php
// [...]
      echo '<h6>Este es el dato de ajax: <script type="text/javascript">document.write("un dato");';</script></h6>
// [...]
OJO! Son comillas simples en el echo porque dentro del string utilizas comillas dobles. [en el string de write() cambie las comillas simples por las dobles ya que sino produciria un error]
      v--------- PHP               v--------- PHP
'    '  '    '                       "    "  "    "
  ^-----^------- strings        ^-----^------- strings

      v--------- string               v--------- string
'    "  "    '                       "    '  '    "
  ^-----^------- strings        ^-----^------- strings

Ahora cuando llames con AJAX, la salida será lo que tengas en el echo. Y se añadirá al #box_element con la funcion append()
76  Programación / Scripting / Re: Como envia datos a un sitio web HTTPS via socket? | Servidor Proxy python3 en: 22 Julio 2020, 11:50 am
Buenas! He modificado el código y al detectar que el puerto es 443 he creado la funcion send_data_tls() donde le envio los mismos argumentos.
Código:
if port == 443:
send_data_tls(website, int(port), data, conn)
else:
send_data(website, int(port), conn, data, addr)

funcion send_data_tls
Código:
def send_data_tls(site, port, data, conn):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sender = ssl.wrap_socket(s, do_handshake_on_connect=False, ssl_version=ssl.PROTOCOL_TLS)
sender.connect((site,port))
print("\033[1;32m data sent\033[0m: "+str(data))
sender.send(data)
while True:
reply = sender.recv(BUFFER_RECV)
sender.send(reply)
print("\033[1;32m data sent X2\033[0m: "+str(reply))


Cuando lo ejecuto me imprime lo siguiente en la pantalla:
imagenes:https://drive.google.com/drive/folders/1S4GZBjBUziGXvo_wNpVon8EkyoEs1tue?usp=sharing

Como se puede ver en las imagenes, la salida me imprime bién los datos a enviar:
Citar
b'CONNECT platzi.com:443 HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0\r\nProxy-Connection: keep-alive\r\nConnection: keep-alive\r\nHost: platzi.com:443\r\n\r\n'

Pero cuando recibo la respuesta, recibo un erro 400 Bad Request:
Citar
b'HTTP/1.1 400 Bad Request\r\nServer: cloudflare\r\nDate: Wed, 22 Jul 2020 09:30:08 GMT\r\nContent-Type: text/html\r\nContent-Length: 155\r\nConnection: close\r\nCF-RAY: -\r\n\r\n<html>\r\n<head><title>400 Bad Request</title></head>\r\n<body>\r\n<center><h1>400 Bad Request</h1></center>\r\n<hr><center>cloudflare</center>\r\n</body>\r\n</html>\r\n'

Además me sale el siguiente error:
Citar
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:2162)

El error 400 indica que la petición que fue enviada no a podido ser procesada por algún tipo de error. Que puede estar causando este error?

En realidad no acabo de entender porque, yo me conecto a un sitio web por el puerto 443, y envio los datos envidos con data() a otro servidor, en este caso a Cloudflare. Es aquí que yo no entiendo que datos tengo que enviar o que debo de hacer. ¿Este es el paso donde se hace el handshake antes de conectarse al sitio web?
77  Programación / Scripting / Re: Obtener el valor en tiempo real de un campo de una base de datos (Mysql) en: 21 Julio 2020, 00:50 am
Este post debería de estar en la categoria de Programación > Desarrollo Web

Te recomiendo que mires este videotutorial en Youtube


Citar
Se trataría de que, según el valor de un campo de la base de datos (mysql), mostrar una imagen u otra en la web. También he pensado en crear un sistema de notificaciones: si un campo mysql tiene determinado valor enviar una notificación al usuario.
Para este caso, lo que quieres hacer se tiene que utilizar AJAX para permitir enviar datos obtenidos con jquery a un archivos PHP para procesarlo.

Aquí te dejo unos enlaces que te serán útiles:
https://api.jquery.com/jquery.ajax/#jQuery-ajax-url-settings


Recomiendo mucho ver los videos de Platzi (Plataforma de educacion online)




Espero que te haya ayudado, y suerte en tu trabajo!! :D
78  Programación / Scripting / Como envia datos a un sitio web HTTPS via socket? | Servidor Proxy python3 en: 20 Julio 2020, 19:21 pm
Buenas, estoy haciendo un servidor proxy con Python3. La idea es la siguiente:

1 . Primero, capturo el puerto especificado en el primer argumento:

Código:
if len(sys.argv) == 2:
        pass
else:
        sys.exit()


# CONSTANTS GLOBALS
global PORT_LISTEN, BUFFER_RECV, CONNECTIONS
PORT_LISTEN = int(sys.argv[1])
BUFFER_RECV = 8192
CONNECTIONS = 5

2. Después con el puerto especificado, creo una conexion socket servidor bind(), y obtengo los datos recibidos, con ello, ejecuto un hilo, donde paso los datos de la conexion y datos a la funcion get_data.
Código:
print("[*] Listening Port "+str(PORT_LISTEN)+"....")
lister = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
lister.bind(("",PORT_LISTEN))
lister.listen(CONNECTIONS)
while True:
        try:
                conn, addr = lister.accept()
                data = conn.recv(BUFFER_RECV)
                thread_data = threading.Thread(target=get_data, name="get_data", args=(conn, addr, data))
                thread_data.start()
        except KeyboardInterrupt:
                conn.close()
                lister.close()
                print("\n[\033[1;31m!\033[0m] Exiting Proxy Server....")
                sys.exit()

3. En la funcion get_data, obtengo la url, donde cogeré dominio donde estoy visitando
Código:
        #get url
        url = str(data).split('\\n')[0]
        url = str(url).split(' ')[1]

        #get FQDN
        website = url.replace("http://","")
        website = website.split("/")[0]

4. Una vez sé en que dominio estoy haciendo la petición, si el dominio contiene ":" cogeré el puerto especificado. Por defecto el puerto es 80, si no se detecto ":" en el dominio.
Código:
        port = 80
        if website.count(":") == 1:
                list = website.split(":")
                website = list[0]
                port = list[1]
                port = int(port)
        print("\n\033[1;32mwebsite\033[0m: "+str(website)+" \033[1;32mport\033[0m: "+str(port))

5. Finalmente ejecuto la funcion send_data con sus argumentos, para que me haga una conexion socket cliente al servidor y envie los datos, con un bucle.
Código:
send_data(website, int(port), conn, data, addr, True)

def send_data(site, port, conn, data, addr):
    sender = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sender.connect((site,port))
    sender.send(data)
    while True:
            reply = sender.recv(8192)
            if len(reply) > 0:
                conn.send(reply)
            else:
                break
    sender.close()
    conn.close()

Esto funciona correctamente en sitios web HTTP, pero como cabe esperar, el HTTPS no, por los certificados ssl.

Así que modifiqué el apartado 5. Y con una condicional, si el puerto es 443, ejecutará lo siguiente:
Código:
        if port == 443:
                send_data(website, int(port), conn, data, addr, True)
        else:
                send_data(website, int(port), conn, data, addr, False)

def send_data(site, port, conn, data, addr, SSL):
        sender = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        sender.connect((site,port))
        sender.send(data)
        while True:
                reply = sender.recv(BUFFER_RECV)
                if len(reply) > 0:
                        conn.send(reply)
                else:
                        break
        sender.close()
        conn.close()


En send_data añadí un argumento booleano llamada SSL, que antes de hacer nada, si este es True, sería https, lo que no sé muy bien, es que hacer aquí.


Me he mirado el funcionamiento de los sitios HTTPS en youtube.


En el minuto 2:16, explica con más profundidad como trabaja este protocolo. He pensado, si hay alguna forma de obtener el certificado que me da el servidor para obtener la llave publica.... pero no se muy bien.

Miré este enlace: https://soursop-dev.blogspot.com/2020/05/creacion-de-un-servidor-web-proxy-en.html

Donde te explica como hacer una conexion ssl con el modulo ssl.

Así que modifique la funcion send_data:
Código:
def send_data(site, port, conn, data, addr, SSL):
        if SSL == True:
                server_cert = "./ssl/sechome.csr"
                client_cert = "./ssl/sechome.crt"
                client_key = "./ssl/sechome.key"
                context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=server_cert)
                context.load_cert_chain(certfile=client_cert, keyfile=client_key)
                s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                sender = context.wrap_socket(s, server_side=False, server_hostname=site)
        else:
                sender = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        sender.connect((site,port))
        sender.send(data)
        while True:
                reply = sender.recv(BUFFER_RECV)
                if len(reply) > 0:
                        conn.send(reply)
                else:
                        break
        sender.close()
        conn.close()
:

Creé los certificados autofirmados:
Código:
$ cd ssl
ssl/$ openssl req -newkey rsa:2048 -nodes -keyout sechome.key -out sechome.csr -sha256
ssl/$ openssl x509 -signkey sechome.key -in sechome.csr -req -days 365 -out sechome.crt

Como bien me imaginaba esto no funciona, ya que tendría que coger el certificado que me da el dominio al hacer la peticion. No acabo de entender muy bien en las variables de crt y key, que llaves tengo que poner...

Código:
                server_cert = "./ssl/sechome.csr"
                client_cert = "./ssl/sechome.crt"
                client_key = "./ssl/sechome.key"


CODE COMPLETE:
Código:
#!/usr/bin/python3
import socket, threading, re, sys, os

if len(sys.argv) == 2:
pass
else:
sys.exit()


# CONSTANTS GLOBALS
global PORT_LISTEN, BUFFER_RECV, CONNECTIONS
PORT_LISTEN = int(sys.argv[1])
BUFFER_RECV = 8192
CONNECTIONS = 5

def send_data(site, port, conn, data, addr, SSL):
if SSL == True:
server_cert = "./ssl/sechome.csr"
client_cert = "./ssl/sechome.crt"
client_key = "./ssl/sechome.key"
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=server_cert)
context.load_cert_chain(certfile=client_cert, keyfile=client_key)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sender = context.wrap_socket(s, server_side=False, server_hostname=site)
else:
sender = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sender.connect((site,port))
sender.send(data)
while True:
reply = sender.recv(BUFFER_RECV)
if len(reply) > 0:
conn.send(reply)
else:
break
sender.close()
conn.close()


def get_data(conn, addr, data):
#get url
url = str(data).split('\\n')[0]
url = str(url).split(' ')[1]

#get FQDN
website = url.replace("http://","")
website = website.split("/")[0]
port = 80
if website.count(":") == 1:
list = website.split(":")
website = list[0]
port = list[1]
port = int(port)
print("\n\033[1;32mwebsite\033[0m: "+str(website)+" \033[1;32mport\033[0m: "+str(port))
if port == 443:
send_data(website, int(port), conn, data, addr, True)
else:
send_data(website, int(port), conn, data, addr, False)


print("[*] Listening Port "+str(PORT_LISTEN)+"....")
lister = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
lister.bind(("",PORT_LISTEN))
lister.listen(CONNECTIONS)
while True:
try:
conn, addr = lister.accept()
data = conn.recv(BUFFER_RECV)
thread_data = threading.Thread(target=get_data, name="get_data", args=(conn, addr, data))
thread_data.start()
except KeyboardInterrupt:
conn.close()
lister.close()
print("\n[\033[1;31m!\033[0m] Exiting Proxy Server....")
sys.exit()
79  Sistemas Operativos / GNU/Linux / Como ver la descarga de un archivo desde internet por la terminal? en: 6 Febrero 2020, 15:55 pm
Buenas. Como hago para ve por la terminal, la transferencia que tiene una descarga desde internet.

Es decir, descargo desde internet cualquier cosa en mi pc (localmente), y al conectarme desde fuera por ssh a cuyo pc. Como hago para ver cuanto tiempo falta la descarga? A traves de la terminal.

Graicas
80  Sistemas Operativos / GNU/Linux / Re: Reconocimiento de voz en Arch Linux en: 5 Febrero 2020, 09:43 am
Tendrás que mirar de creartelo por ti mismo. No creo que exista algo parecido para Linux.

Los lenguajes más usados para estos casos son: C/C++ o Python.
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ... 25
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines