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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  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 24 25 26 27 ... 29
111  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
112  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()
113  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?
114  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
115  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()
116  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
117  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.
118  Sistemas Operativos / GNU/Linux / Porque al detener un servicio systemctl, el estatus me da "failed"? en: 4 Febrero 2020, 23:52 pm
Hola, estoy haciendo un servicio linux,sobre prevención de ataques de fuerza bruta por ssh. Lo tengo todo finalizado.

Solamente me hace falta crear el servicio y un script para añadirlo en /etc/init.d/ y configurarlo (/etc/rc?.d/) para que al inicar el equipo, se inicie.

Creo el servicio, creando un archivo con extension .service en /etc/systemd/system/sshield.service

Código:
[Unit]
Description=Service for protect attacks of brute force ssh's

[Service]
Type=simple
ExecStart=/etc/sshield/sshield.sh
ExecStop=/etc/sshield/sshield.sh stop
RemainAfterExit=yes
Restart=always

[Install]
WantedBy=multi-user.target

Le especifico que el tipo de proceso es en segundo plano:
Código:
Type=simple
Ejecuto el servicio en segundo plano:
Código:
ExecStart=/etc/sshield/sshield.sh
Especifico el script para detener el servicio:
Código:
ExecStop=/etc/sshield/sshield.sh stop

el problema esta en la detención del servicio, le especifico el mismo script pero pasandole un argumento "stop".

En el script sshield.sh, hay un condicional filtrando el argumento y si existe cuyo argumento, matará el proceso.
Código:
if [[ $1 == "stop" ]];then
        kill -9 $$
fi

El problema que creo que es, es que estoy matando cuyo proceso y el systemctl al ver que el proceso fue detenido por la señal SIGKILL pues lo detecta como "failed" cuando se hace un status (systemctl status sshield)
IMAGEN: https://drive.google.com/file/d/1i0QVUjnFRzL3nlGjLqs1khXANPZowV_b/view?usp=sharing

Normalmente que señal se le envia a un servicio para detenerlo?

Gracias

Y. Este método para detener el servicio, se consideraría correcto?
119  Programación / Desarrollo Web / Gestión de Tareas Escolares | Proyecto web de Free software y open source en: 6 Enero 2020, 00:51 am
#######################################################
GITHUB repositorio:  https://github.com/cleanet/GTE
#######################################################
#######################################################
  SITIO WEB: cleanet.260mb.net
#######################################################
Software con licencia MIT

Esta aplicación web, es free software y open source.

Se creó con la finalidad de un uso educativo, facilitando la gestión de tareas dentro de las aulas. Tanto para el profesorado como el alumnado.

Cada aula tiene su lugar en la web, donde hay un calendario, para añadir eventos independientes de otras aulas. Además también pueden añadir tanto enlaces como actividades interactivas embebidos para que puedan practicar lo aprendido.

El profesorado, podrá añadir vacaciones a los calendarios. Asi como añadir actividades interactivas.

Título: Gestión de Tareas Escolares Autor: cleanet Año: 2020

DEMO: https://g-t-e.260mb.net
RENEW: https://drive.google.com/file/d/1_mbPIpySLnDxil9uZNNkUCmLKV7tuaD6/view?usp=sharing

En la carpeta root está el PDF 'guia.pdf', donde explica el funcionamiento y la utilización del proyecto. Y en la carpeta 'instalacion' esta el pdf 'instalacion.pdf' in español, donde explica paso a paso como levantar un servidor Linux y configuar el proyecto en él.

Cualquier duda o reporte, no duden en contactarme por correo o aquí mismo.
120  Programación / Desarrollo Web / Re: Donde publicar o publicitar mi proyecto web free software? en: 3 Enero 2020, 19:37 pm
Creas un proyecto nuevo y subes tu codigo, asi de facil.

Saludos!

Eso ya lo tengo hecho en github.com/cleanet/GTE

En elhacker.net hay algun apartado especifico para exponer proyectos?
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 24 25 26 27 ... 29
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines