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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 25
1  Programación / Scripting / Como obtengo los datos de la autorizacion (Basic Auth) en un request API | Python Django en: 18 Septiembre 2021, 21:33 pm
Buenos dias, ¿como estais?  :D

Tengo un pequeño problemilla. Os cuento, estoy haciendo una API en Django [sin Django REST Framework  :silbar:] y esta API el usuario puede utilizarla si se autentifica con metodo Basic Auth

Donde pone Username es la Password
Y donde pone password es el OTP

Mi API hace esto:
Código
  1. @csrf_exempt
  2.    def requests(self,req,table:str,columns:list=False):
  3.        try:
  4.            try:
  5.                if not loginAdmin(req.headers['password'], int(req.headers['otp'])):
  6.                    raise Exception("Access denied")
  7.            except:
  8.                raise Exception("You need authentication")
  9.            conn = sqlite3.connect(Environment().pathDB())
  10.            cursor = conn.cursor()
  11.  
es parte del codigo, pues yo estoy aqui seleccionando las keys password y otp del header, pero segun me he informado de que se muestra en el header en la key "Authorization" con encriptacion BASE64
https://learning.postman.com/docs/sending-requests/authorization/#basic-auth

Pero yo he hecho return de req.headers y no hay ninguna key llamada "Authorization" o "Authorization", pero en el postman si se ve

He estado buscando info y segun dicen si con req.META hay una HTTP_AUTHORIZATION, pero no se muestra ninguno
Citar
GATEWAY_INTERFACESERVER_PROTOCOLREQUEST_METHODQUERY_STRINGREQUEST_URISCRIPT_NAMEPATH_INFOPATH_TRANSLATEDHTTP_HOSTHTTP_USER_AGENTHTTP_ACCEPT_ENCODINGHTTP_ACCEPTHTTP_CONNECTIONSERVER_SIGNATURESERVER_SOFTWARESERVER_NAMESERVER_ADDRSERVER_PORTREMOTE_ADDRDOCUMENT_ROOTREQUEST_SCHEMECONTEXT_PREFIXCONTEXT_DOCUMENT_ROOTSERVER_ADMINSCRIPT_FILENAMEREMOTE_PORTmod_wsgi.script_namemod_wsgi.path_infomod_wsgi.process_groupmod_wsgi.application_groupmod_wsgi.callable_objectmod_wsgi.request_handlermod_wsgi.handler_scriptmod_wsgi.script_reloadingmod_wsgi.listener_hostmod_wsgi.listener_portmod_wsgi.enable_sendfilemod_wsgi.ignore_activitymod_wsgi.request_startmod_wsgi.request_idmod_wsgi.script_startwsgi.versionwsgi.multithreadwsgi.multiprocesswsgi.run_oncewsgi.url_schemewsgi.errorswsgi.inputwsgi.input_terminatedwsgi.file_wrapperapache.versionmod_wsgi.versionmod_wsgi.total_requestsmod_wsgi.thread_idmod_wsgi.thread_requests

Aqui dejo la API:
Código
  1. from sources import loginAdmin,Environment,logFile
  2. import sqlite3,re
  3. from django.urls import  path
  4. from django.http import JsonResponse, HttpResponse, QueryDict
  5. from django.views.decorators.csrf import csrf_exempt
  6.  
  7. """
  8. ==========================API REST==========================
  9. SYNTAX:
  10.    127.0.0.1/api[/table,table1,table3,...][/column]?<key>=[>|<|>=|<=]<value>&[|]<key>=[>|<|>=|<=]<value>&LIMIT=<min>[,max]
  11. ============================================================
  12. IMPORTANT:
  13.    For do a request you need authentication with password and OTP
  14.  
  15. EXAMPLES:
  16.    GET:
  17.        127.0.0.1/api/server -> SELECT * FROM server
  18.        127.0.0.1/api/server?LIMIT=5 -> SELECT * FROM server LIMIT 5
  19.        127.0.0.1/api/server?password=ejem&id=1&LIMIT=5,7 -> SELECT * FROM server WHERE password='ejem' AND id=1 LIMIT 5,7
  20.        127.0.0.1/api/server/otp,id -> SELECT otp,id FROM server
  21.        127.0.0.1/api/server/otp?id=1&password=hola -> SELECT otp FROM server WHERE id=1 AND password='hola'
  22.        127.0.0.1/api/server/otp?id=1&|password=hola -> SELECT otp FROM server WHERE id=1 OR password='hola'
  23.  
  24.    POST:
  25.        127.0.0.1/api/server -> INSERT INTO server (otp,ejem) VALUES (1234,'1233da')
  26.            Body x-www-form-urlencoded
  27.                key     value
  28.                --------------------
  29.                otp     1234
  30.                ejem    1233da
  31.  
  32.        IMPORTANT: The params in the url doesn't affect
  33.  
  34.    PUT:
  35.        127.0.0.1/api/server?port=8899&|password=h -> UPDATE server SET otp='1234', ejem='1233da' WHERE port=8899 OR password='h'
  36.            Body x-www-form-urlencoded
  37.                key     value
  38.                --------------------
  39.                otp     1234
  40.                ejem    1233da
  41.  
  42.    DELETE:
  43.        127.0.0.1/api/server?port=8899&password=h -> DELETE FROM server WHERE port=8899 AND password='h'
  44.            not body data
  45. """
  46.  
  47. class getData:
  48.    def __init__(self,data):
  49.        self.list = QueryDict(data)
  50.        self.output = ''
  51.  
  52.    # This method returns key1,key2,key3...
  53.    # For clause as SELECT, INSERT
  54.    def getKeys(self):
  55.        for t in self.list:
  56.            self.output+=f'{t},'
  57.        self.output = re.sub(r",$","",self.output)
  58.        return self.output
  59.  
  60.    # This method returns value1,value2,value3...
  61.    # For clause as SELECT, INSERT
  62.    def getValues(self):
  63.        for t in self.list:
  64.            try:
  65.                if int(self.list[t]):
  66.                    self.output+=f'{self.list[t]},'
  67.            except:
  68.                self.output += f"'{self.list[t]}',"
  69.        self.output = re.sub(r",$","",self.output)
  70.        return self.output
  71.  
  72.    # This method returns key1=value1, key2=value2, key3=value3
  73.    # being '=' the 'delimitator'
  74.    # For clause as UPDATE
  75.    def keysValues(self,delimitator):
  76.        for value in self.list:
  77.            self.output+=f"{value}{delimitator}'{self.list[value]}', "
  78.        self.output = re.sub(r", $", "", self.output)
  79.        return self.output
  80.  
  81. class Database:
  82.    # if there are columns, show it
  83.    def columns(self,columns):
  84.        if columns:
  85.            return  columns
  86.        else:
  87.            return "*"
  88.  
  89.    # This method add the operator specified in the url
  90.    def keyWhere(self,key):
  91.        operator = re.sub(r"[^>|<|=]","",key)
  92.        value = re.sub(r"[>|<|=]","",key)
  93.        if operator == "":
  94.            operator="="
  95.        try:
  96.            if int(value):
  97.                return f"{operator}{value}"
  98.        except:
  99.            return f"{operator}'{value}'"
  100.  
  101.    def LimitClause(self,params):
  102.        if params:
  103.            output = ''
  104.            for key in params:
  105.                if key=="LIMIT":
  106.                    output=f" LIMIT {params[key]}"
  107.            return output
  108.        else:
  109.            return ""
  110.  
  111.    # This method add AND or OR in each condition in WHERE
  112.    def WhereClause(self,params):
  113.        if params:
  114.            output=''
  115.            for key in params:
  116.                if key=="LIMIT":
  117.                    continue
  118.                operator = "OR" if key[0]=="|" else "AND"
  119.                if list(params).index(key) > 0:
  120.                    output+=f" {operator} {key[1::] if operator=='OR' else key}{self.keyWhere(params[key])}"
  121.                else:
  122.                    output += f"WHERE {key[1::] if operator=='OR' else key}{self.keyWhere(params[key])}"
  123.            return output
  124.        else:
  125.            return ""
  126.  
  127.    @csrf_exempt
  128.    def requests(self,req,table:str,columns:list=False):
  129.        try:
  130.            try:
  131.                if not loginAdmin(req.headers['password'], int(req.headers['otp'])):
  132.                    raise Exception("Access denied")
  133.            except:
  134.                raise Exception("You need authentication")
  135.            conn = sqlite3.connect(Environment().pathDB())
  136.            cursor = conn.cursor()
  137.            if req.method == "GET":
  138.                data = cursor.execute(f"SELECT {self.columns(columns)} FROM {table} {self.WhereClause(req.GET.dict())}{self.LimitClause(req.GET.dict())}")
  139.                data = list(data)
  140.                conn.close()
  141.                if len(data) == 0:
  142.                    data = None
  143.                return JsonResponse({
  144.                    "result": data
  145.                })
  146.            elif req.method == "POST":
  147.                if columns:
  148.                    raise Exception("POST not allowed")
  149.                cursor.execute(f"INSERT INTO {table} ({getData(req.body).getKeys()}) VALUES ({getData(req.body).getValues()})")
  150.                conn.commit()
  151.                conn.close()
  152.                return JsonResponse({"INSERT":True})
  153.            elif req.method == "PUT":
  154.                if columns:
  155.                    raise Exception("PUT not allowed")
  156.                cursor.execute(f"UPDATE {table} SET {getData(req.body).keysValues('=')} {self.WhereClause(req.GET.dict())}")
  157.                conn.commit()
  158.                conn.close()
  159.                return JsonResponse({"UPDATE": True})
  160.            elif req.method == 'DELETE':
  161.                if columns:
  162.                    raise Exception("DELETE not allowed")
  163.                cursor.execute(f"DELETE FROM {table} {self.WhereClause(req.GET.dict())}")
  164.                conn.commit()
  165.                conn.close()
  166.                return JsonResponse({"DELETE": True})
  167.        except sqlite3.Error as err:
  168.            return HttpResponse(logFile(True).message(f"DB -> {err}",True))
  169.        except Exception as err:
  170.            return HttpResponse({f"Error in the API REST -> {err}"})
  171. urlpatterns=[
  172.    path('<table>',Database().requests),
  173.    path('<table>/<columns>',Database().requests)
  174. ]
  175.  

¿Como yo puedo mostrar los datos del Auth? Muchas gracias.

P.D: Cualquier comentario, sugerencia u opinion sobre la mejora del código, lo agradecería mucho. Mil gracias.
2  Programación / Scripting / Re: Ya voy 11 meses estudiando Python en: 12 Septiembre 2021, 23:44 pm
@Panic0

Por lo general las librerías se aprenden en base a las necesidades que tengas. Si necesitas hacer una petición HTTP, te das cuenta que existe una librería muy buena llamada requests, pero luego te das cuenta que necesitas realizar peticiones asincrónicas, entonces ves que aiohttp es para ti. Quizá lo que necesites es procesar grandes cantidades de datos desde un CSV o una hoja de cálculo, entonces pandas puede ser para ti. Pero quizá necesites conectarte a una base de datos de MSSQL, entonces pyodbc es para ti, aunque quizá quieras algo más específico como el conector de MySQL o quizá SQLAlchemy dado que prefieres crear y mantener el esquema de las tablas con código de python o un estilo pythonista (un ORM, básicamente), o quizá quieras irte por una base de datos NOSQL como MongoDB, entonces mongoengine pueda adaptarse a ti. Quizá quieras combinar todo esto, pero también desees proporcionar una manera para que otras aplicaciones puedan conectarse con tus funcionalidades, entonces quizá te interese crear una API, lo cual puedes hacer con FastAPI, por ejemplo, o cualquier otro framework capaz.

Como ves, no es aprender siguiendo unos pasos, es algo muy dinámico.

~ DtxdF
Estoy de acuerdo en lo que dice @DtxdF, a medida que vayas haciendo proyectos veras diferentes librerias y sus funcionamientos. Si quieres aprender librerias orientadas a hacking etico, lo mejor es que hagas proyectos orientados a esta tematica, aquí te dejo unas cuantas:
- Fuerza Bruta
- Backdoor
- Scrapping Web
- Proxy server
- keylogger
- Ramsomware

Son proyecto un tanto complejos, pero puedes empezar por algo básico como el Brute Force y Backdoor. Lo recomiendo hacerlos, para entender como funcionan estos tipos de malwares
3  Programación / Scripting / Re: Curso django en: 12 Septiembre 2021, 23:37 pm
Hola a todos, alguien tiene/conoce algún curso gratuito de python3 django??



Gracias


-P
Buenas
Tienes un curso super bien en Youtube en el canal de PildorasInformaticas: https://www.youtube.com/watch?v=7XO1AzwkPPE&list=PLU8oAlHdN5BmfvwxFO7HdPciOCmmYneAB
4  Programación / Scripting / Acceder a una variable de una clase de un modulo python desde el exterior en: 12 Septiembre 2021, 23:36 pm
Código:
.
├── ClassAdmin
│   ├── ClassAdmin
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── static
│   │   │   ├── css
│   │   │   │   ├── fonts.css
│   │   │   │   ├── pageLogin.css
│   │   │   │   └── styles.css
│   │   │   ├── data.json
│   │   │   ├── fonts
│   │   │   │   └── Allura-Regular.ttf
│   │   │   ├── images
│   │   │   │   ├── ClassAdminLogo.png
│   │   │   │   └── wallpaper.png
│   │   │   └── js
│   │   ├── templates
│   │   │   ├── pageLogin.html
│   │   │   └── src
│   │   │       └── base.html
│   │   ├── urls.py
│   │   ├── views.py
│   │   └── wsgi.py
│   ├── ClassAdmin.sqlite3
│   └── manage.py
└── sources
    └── __init__.py

Buenas, tengo un modulo llamado sources que es una carpeta con el archivo __init__.py, en el propio archivo esta la siguiente clase:
Código
  1. class Environment:
  2.    def __init__(self):
  3.        self.directory = os.environ.get("CLASSADMIN")
  4.    def pathDB(self):
  5.        if platform.system() == "Windows":
  6.            return f"{self.directory}\\ClassAdmin\\ClassAdmin.sqlite3"
  7.        elif platform.system() == "Linux":
  8.            return f"{self.directory}/ClassAdmin/ClassAdmin.sqlite3"
  9.    def pathLog(self,name:str):
  10.        if platform.system() == "Windows":
  11.            return f"{self.directory}/{name}.log"
  12.        elif platform.system() == "Linux":
  13.            return f"/var/log/{name}.log"
  14.  
  15.  

Y desde el archivo settings.py haciendo el import quiero acceder a la variable directory que esta en el init de la clase Environment.
Código
  1. from sources import *
  2. STATIC_ROOT = f'{Environment().directory}/ClassAdmin/ClassAdmin/static'
  3.  
Pero esto me devuelve None
Citar
[Errno 2] No such file or directory: 'None/ClassAdmin/ClassAdmin/static/data.json'

Porque pasa esto? si al hacer una clase con una variable self en el init puedes acceder a ella, no entiendo.

Que esta ocurriendo?
Gracias
5  Programación / Scripting / Re: Opiniones sobre un programa que hice en: 5 Septiembre 2021, 11:51 am
Puedes convertirlo a .exe para windows, eso lo puedes hacer con pyinstaller
6  Programación / Scripting / Re: Opiniones sobre un programa que hice en: 5 Septiembre 2021, 11:50 am
Por lo otro muy bien, enhorabuena
7  Programación / Scripting / Re: Opiniones sobre un programa que hice en: 5 Septiembre 2021, 11:49 am
En la primera ejecución me dio un error.
Código
  1. Traceback (most recent call last):
  2.  File "/usr/lib/python3.9/tkinter/__init__.py", line 1892, in __call__
  3.    return self.func(*args)
  4.  File "/home/nitropc/./png.py", line 26, in converter
  5.    im = Image.open(image_path)
  6.  File "/usr/local/lib/python3.9/dist-packages/PIL/Image.py", line 2974, in open
  7.    fp = io.BytesIO(fp.read())
  8. AttributeError: 'str' object has no attribute 'read'
  9. ^CTraceback (most recent call last):
  10.  File "/home/nitropc/./png.py", line 155, in <module>
  11.    root.mainloop()
  12.  File "/usr/lib/python3.9/tkinter/__init__.py", line 1429, in mainloop
  13.    self.tk.mainloop(n)
  14.  
El error se debe a que en el metodo
Código:
Image.open()
, el argumento sebe ser un string y la variable image_path parece no ser string, así que aconsejo que siempre se convierta en string, auque cuya variable sea string (por si acaso), hazlo con str(image_path), seria
Código:
Image.open(str(image_path))

Y aconsejo también que muestra la ruta del archivo png convertido que no especifica en que ruta se almacena.
8  Programación / Scripting / Re: Opiniones sobre un programa que hice en: 5 Septiembre 2021, 11:41 am
Buenas!! Una buena practica para facilitar al usuario la ejecución del programa es indicar en un archivo requeriments.txt todos los modulos neccesarios para el script, eso se hace con
Código:
pip freeze > requeriments.txt
, he incluso aconsejaria los comandos de instalacion de cada modulo,opcionalmente.
9  Comunicaciones / Android / Crear servicios como archivos .service pero para android en: 28 Agosto 2021, 23:00 pm
Buenas! Quisiera crear un servicio en android (mi huawei p10) que cuando arrenque el telefono se incie un servicio que ejecute un script en python de conexion sockets (cliente).

Similar a como si fuera un archivo .service de linux....¿Existe la posibilidad de eso? Modificando algo del arbol de directorios de Storage o Card.....He visto posts en internet sobre ello, pero creando codigo JAVA y para una aplicacion apk. en concreto. Mi idea en crear un servicio pero que no cuelga de ninguna apk.

Se puede conseguir eso de alguna manera?

Muchas gracias.
10  Programación / Desarrollo Web / Re: ¿Curso o escuela online con certificación? en: 19 Agosto 2021, 18:34 pm
Buenas! Aquí te dejo unos cuantos: Platzi, ed.team, udemy, openwebinars....

Y en YouTube un monton: Los que mas recomiendo es pildorasinformaticas, codigofacilito, fazt tech.....

Espero haberte ayudado
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 25
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines