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

 

 


Tema destacado: Curso de javascript por TickTack


  Mostrar Temas
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
31  Programación / Desarrollo Web / Generadores o funciones generadoras en javascript por StringManolo en: 24 Abril 2020, 22:45 pm
Los generadores o funciones generadores simplifican la tarea de escribir iteradores. En lugar de retornar un valor se genera una secuencia de resultados o una serie de valores. Este tipo de funciones retornan un objeto con el método next() que utilizamos para avanzar en la secuencia de expresiones definidas en el cuerpo de la función.

Código
  1. function* generarSecuencia() {
  2. yield 5 + 6;
  3. yield String.fromCharCode(parseInt("1110000", 2).toString(10));
  4. yield 3 + 4;
  5. return 14;
  6.  
  7. }
  8.  
  9. var secuencia = generarSecuencia();
  10.  
  11. alert( JSON.stringify(secuencia.next()) );
  12. alert( JSON.stringify(secuencia.next()) );
  13. alert( JSON.stringify(secuencia.next()) );
  14. alert( JSON.stringify(secuencia.next()) );
  15. alert( JSON.stringify(secuencia.next()) );
En este ejemplo primero definimos la función generadora.
Definimos cada campo precedido por la keyword yield.
Retornamos la ejecución.
En el parámetro del alert invocamos next() sobre la función y utilizamos JSON.stringify para convertir el objeto en un string para ver exactamente que contiene cada objeto retornado:
{"value":11,"done":false}
{"value":"p","done":false}
{"value":7,"done":false}
{"value":14,"done":true}
{"done":true}

 Cuando haces una llamada a este tipo de funciones su código no es ejecutado directamente, en su defecto, retorna un objeto generador que maneja la ejecución.

 El método next() nos retornará un objeto con la propiedad/key value que contiene el valor generado por la instrucción alcanzada por el objeto generator y otra propiedad de tipo booleano primitivo en el mismo objeto retornado llamada done. Esta propiedad nos indica si la función retornó su ejecución al código de llamada a través del objeto generator. Es decir, si la función ha finalizado.
Esta propiedad podemos utilizarla como iterador para evaluar las instrucciones del cuerpo de la función.
Cuando ocurre un error en uno de los campos se retornará también la propiedad done = true a menos que se implemente manejo de excepciones sobre el campo o la expresión.

Las propias funciones generadoras son iterables y podemos usar expresiones de la índole de for (valor of generador) para recorrer sus instrucciones.

Es también una buena forma remplazar callbacks evitando los problemas comunes de los callbacks en la programación asíncrona.

La funciones generadoras también permiten realizar bucles infinitos.
Código
  1. function* generarSecuenciaInfinita() {
  2. var inicial = -1;
  3. while(1) {
  4. yield inicial += 2;
  5. }
  6. }
  7.  
  8. var secuencia = generarSecuenciaInfinita();
  9.  
  10. var valor = 0;
  11. var nImpares = "";
  12. var nPares = "";
  13. while(valor < 30) {
  14. valor = secuencia.next().value;
  15. if(valor < 30) {
  16. nImpares += valor + " ";
  17. nPares += "" + (+valor + 1) + " ";
  18. }
  19. }
  20.  
  21. document.write("Números Impares menores que 30: " + nImpares);
  22. document.write("<br />Números Pares menores que 30: " + nPares);

 
 
32  Programación / Desarrollo Web / Conversiones/casteos y coerciones de tipos en javascript por StringManolo en: 24 Abril 2020, 10:09 am
En javascript tenemos conversores léxicos en forma de métodos y funciones; Number(), parseInt(), parseFloat(), String(), Boolean(), Object(), toString()... y también disponemos de otros métodos que hacen conversiones indirectas o que directamente retornan otro tipo de dato como .join() y .split(). Incluso se hacen casteos y conversiones de forma transparente. Por ejemplo en el conjunto de sentencias var nombre = "Manolo"; var inicial = nombre.charAt(0); "Manolo" es un literal de un tipo de data primitivo. No tiene métodos aplicables. El motor de javascript crea un nuevo objeto temporal al que pasa una referencia de nombre como parámetro. A este nuevo objeto String se le puede aplicar el método charAt(). Tras ello se retorna el valor como expresión (en este caso se asigna a la variable inicial). Y se asigna null a la variable temporal utilizada. A esta técnica se la conoce como AutoBoxing. Sin embargo lo que quiero comentar no es nada de esto si no los operadores que realizan casteos implícitos.

Sin duda el que más se utiliza de ellos de forma no premeditada es el operador ==. Cuando se comparan dos valores de tipos distintos el operador == hace una conversión automática/implícita de tipo (coerción de tipos) en el caso que sea necesaria. Por ese motivo en muchos casos debemos utilizar en su lugar el operador ===. Pasa lo mismo con otros operadores de comparación como puedan ser el != < >= ...

Por otro lado el operador de casteo implícito más utilizado para coerción es el "". Se abusa de que ante la comparación de un string literal y otro tipo de dato prevalece la concatencación del string sobre una operación de adición.
n = 1; m = 2;
doce = n + "" + m;
También puedes usar un array vacio. alert(1 + [] + 2);

Uno menos conocido es el operador unario +.
La variable doce contiene ahora mismo el string literal de tipo primitivo "12". Si queremos convertirlo a número utilizamos el más. doce = +doce;

Podemos comprobarlo de la siguiente manera.
Código
  1. var doce = "" + 12;
  2. alert(typeof(doce)); /* String */
  3.  
  4. doce = +doce;
  5. alert(typeof(doce)); /* Number */

Otra forma de convertir a número es utilizando doce-0 o ~~doce.
Código
  1. var doce = "" + 12;
  2. alert(typeof(doce)); /* String */
  3.  
  4. doce = doce-0;
  5. alert(typeof(doce)); /* Number */

IMPORTANTE: Este tipo de casteo con operador unario + tiene resultados equivalente a utilizar Number() y no a parseInt();
Tienen pequeñas diferencias. Por ejemplo si casteas un string vacio utilizando parseInt() obtendrás un NaN (Not a Number, No es un número). Por el contrario si usas Number() o el casteo implícito con los operadores el string vacio se castea a 0. Con el doble bitwise ~~ puedes hacer interger overflow o que te retorne 0 con números grandes asique hay que tenerlo en cuenta. Por otro lado tiene la característica de castear a 0 valores como undefined o números con strings. Hay más operadores de bits que actual igual que el doble bitwise a la hora de castear.

También es recomendado utilizar mètodos/funciones cuando el código no queda claro o añadir comentarios al código.

Otro operador implícito es el ! o !! que puede utilizarse para castear valores falsos o verdaderos a sus contrapuestos o respectivos homólogos booleanos.

Precaución a la hora de hacer casteos a booleanos usando objetos. Por ejemplo en el código:
Código
  1. booleano = new Boolean(0);
  2. if (booleano) alert("Hola");
La condición se cumple ejecutando el alert debido a que exite un objeto. Lo que se debe hacer es usar Boolean(0) sin el new para que se haga el Autoboxing y obtener el valor booleano primitivo (y no un objeto referenciado Boolean con valor false que se evalua como true por existir el objeto). El operador !! también es una forma válida de no crear el objeto y obtener un booleano primitivo.

Otras conversiones incluyen operaciones con strings. Si bien el + concatena un número y un string, el resto de operadores unarios no siguen la misma norma.
var dos = "6" - "2" * "2";
33  Comunicaciones / Android / Spawn de shell e instalación de binarios en Android 4.4 no root? en: 8 Abril 2020, 02:49 am
Se que es posible. estuve leyendo de como hacerlo y parece que hay un montón de metodos distintos, también se comenta que algunos solo funcionan en versiones de Android antiguas, etc.

Tengo varias dudas, a ver si conoceis las respuestas a algunas y así me ahorrais tiempo de más busquedas y de pruebas.

Quiero ejecutar bin/sh

Por lo que parece uno de los métodos es dumpear el binario y cargarlo como resource en una apk en java y utilizar el método open sobre resources.
En caso de funcionar, como me comunico con el bin/sh? Es decir, como le paso comandos una vez abierto utilizando java?
En teoría el bin/sh debe estar en una carpeta mount por lo que sin tener acceso root y tener la sdcard en mount debería también dumpear el resto de utilidades como ls, netstat, etc.
Cómo recibo el output desde bin/sh en java?
Qué metodos conoceis?

Me gustaría correr ejecutables ELF que cross-compilo en otro dispositivo. Por eso se me ocurrió que sería más sencillo spawnear una shell y desde esta llamar al ejecutable que quiera y no tener que generar un apk para cada binario que quiera en específico.
34  Programación / Scripting / JEX editor de binarios y demás en javascript. en: 6 Abril 2020, 08:04 am
Ando haciendo un exploit kit en javascript. Os dejo un de los componentes que estoy haciendo por si os es útil.

Es un editor de hexadecimal que permite generar binarios.

Cómo funciona?
-Abres la página/programa. (Funciona 100% offline)
-Seleccionas tu archivo. (Por ejemplo un binario de linux)
-Chequeas lo que quieras modificar del hex. (Tienes el ASCII como referencia.
-Modificas el hex y le das a Compile.
-Se descargará el nuevo binario.
-Lo ejecutas.

Codigo en github
Live

Ejemplo 1:
Me descargo un ransomware compilado por la red.
Lo subo a la página.
En el ransomware se pide la llave a una IP hardcodeada, y tiene hardcodeada una página en donde hacer el pago.
Busco esos 2 strings en el ASCII.
Busco la equivalencia en el HEX.
Modifico el HEX para poner mi IP y mi dominio malicioso.
Le doy a compilar y ya tengo el Binario listo.

Combínalo con un XSS o MITM para substituir una descarga legítima por tu binario.
35  Programación / Desarrollo Web / Editor hex navegador. Archivos grandes. Desempeño. en: 5 Abril 2020, 17:59 pm
Estoy abriendo binarios con html e imprimiendo el hex equivalente. También quiero añador la versión en string.

El problema lo tengo principalmente intentando editar el hex tras escribirlo en pantalla. Lo metí en un div con contentEditable pero al pulsar doble click se freezea por el tamaño del archivo.

Sabeis como puedo dejar al usuario editar el HexDump en el navegador si que pete por tamaño?

Solo se me ocurre dividir en muchos trozos pequeños editables, pero igual hay alguna forma más "correcta" o eficiente de trabajar con archivos muy grandes de texto.


36  Foros Generales / Sugerencias y dudas sobre el Foro / Protección DDOS del foro. en: 3 Abril 2020, 15:39 pm
Es una protección creada por alguien del foro o por Cloudflare?

Por qué está ofuscado el código? Lo ando desofuscando por curiosidad, se puede compartir el código desofuscado?
37  Programación / Programación C/C++ / Se me cierra el socket. No veo el motivo. en: 30 Marzo 2020, 01:18 am
Hago lo siguiente:

Creo y guardo el código.
$ nano server.cpp
control + x
enter

Compilo:
$ g++ server.cpp -o server

Doy permisos:
$ chmod +775 server

Ejecuto:
$ ./server 8080

Conecto al server:
$ netcat 127.0.0.1 8080

Envio comando prueba 1:
ls

Envio comando prueba 2:
ls

Envio comando prueba 3:
ls
Ya no lo recibe.

Envio comando prueba 4:
broken pipe

Pruebo por si el server siguiese up:
$ netcat 127.0.0.1 8080
connection refused.

La aplicación se paró pero no encuentro el motivo.

Código
  1. #include <iostream>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <unistd.h>
  6.  
  7. using namespace std;
  8.  
  9. void callback(int);
  10.  
  11. int main(int argc, char *argv[]) {
  12.  int handlerSocket = 0;
  13.  int newHandlerSocket = 0;
  14.  int puerto = 0;
  15.  int TamIP_Cliente = 0;
  16.  int procesoHijo = 0;
  17.  
  18.  unsigned short int MAX_QUEUE = 5;
  19.  unsigned short int ARGUMENTOS_MIN = 2;
  20.  signed short int ERROR = -1;
  21.  
  22.  struct sockaddr_in IP_Servidor, IP_Cliente;
  23.  
  24. /* Comprueba que no falta el argumento cli */
  25.  if (argc < ARGUMENTOS_MIN) {
  26.    cout << "Puerto de escucha no especificado.\nAñade el puerto de escucha como parámetro en la llamada. Ejemplo:\n./server 8080";
  27.    exit(1);
  28.  }
  29.  
  30.  handlerSocket = socket(AF_INET, SOCK_STREAM, 0);
  31.  
  32.  if (handlerSocket == ERROR) {
  33.    cout << "No se pudo crear el socket.";
  34.    exit(1);
  35.  }
  36.  
  37.  /* Formatea el buffer */
  38.  bzero((char *) &IP_Servidor, sizeof(IP_Servidor));
  39.  
  40.  /* Obtiene el argumento por cli */
  41.  puerto = atoi(argv[1]);
  42.  
  43.  /* socket IPV4 */
  44.  IP_Servidor.sin_family = AF_INET;
  45.  
  46.  /* Enlaza a cualquier dirección local disponible */
  47.  IP_Servidor.sin_addr.s_addr = INADDR_ANY;
  48.  
  49.  /* Fuerza que se utilice el orden correcto en la dirección de memoría */
  50.  IP_Servidor.sin_port = htons(puerto);
  51.  
  52.  if (::bind(handlerSocket, (struct sockaddr *) &IP_Servidor, sizeof(IP_Servidor)) == ERROR) {
  53.    cout << "Error enlazando el servidor";
  54.    exit(1);
  55.  }
  56.  
  57.  listen(handlerSocket, MAX_QUEUE);
  58.  TamIP_Cliente = sizeof(IP_Cliente);
  59.  while (1) {
  60.    newHandlerSocket = accept(handlerSocket, (struct sockaddr *) &IP_Cliente, &TamIP_Cliente);
  61.  
  62.    if (handlerSocket == ERROR) {
  63.      cout << "Error creando nuevo socket";
  64.      exit(1);
  65.    }
  66.  
  67.    procesoHijo = fork();
  68.  
  69.    if (procesoHijo == ERROR) {
  70.      cout << "Error duplicando proceso.";
  71.      exit(1);
  72.    }
  73.  
  74.    if (procesoHijo != ERROR) {
  75.      close(handlerSocket);
  76.      callback(newHandlerSocket);
  77.      exit(0);
  78.    } else {
  79.      close(newHandlerSocket);
  80.    }
  81.  }
  82. return 0;
  83. }
  84.  
  85. void callback (int sock) {
  86.  signed short int n;
  87.  signed short int ERROR = -1;
  88.  char buffer[128000];
  89.  bzero(buffer,128000);
  90.  n = read(sock,buffer,128000);
  91.  
  92.  if (n < ERROR) {
  93.    cout << "El handler del socket contiene errores";
  94.    exit(1);
  95.  }
  96.  
  97.  cout << "Respuesta:" << endl << buffer << endl;
  98.  n = write(sock,"Recivido.",9);
  99.  
  100.  /* Básico. Modificar por popen(); traer sh o incluir intérprete */
  101.  system(buffer);
  102.  
  103.  if (n < ERROR) {
  104.    cout << "No se pudo escribir en el socket.";
  105.    exit(1);
  106.  }
  107. }
38  Programación / Scripting / Python3 Escaner de puertos. en: 27 Marzo 2020, 15:34 pm
Os dejo un escaner de puertos. Pones el host y los puertos. Por ejemplo:
localhost
8078-8082

Te dice que puertos están abiertos, que tipo de servicio corre. Se guardan logs de los scanneres en un archivo en la misma carpeta del script y también da salida en CSV.

Código
  1. import nmap
  2. import socket
  3. import datetime
  4. import sys
  5. import os
  6. now = datetime.datetime.now()
  7. netmap = nmap.PortScanner()
  8. remoteServer = input('Enter host:\n')
  9. try:
  10.    remoteServerIP = socket.gethostbyname(remoteServer)
  11.    portRange = input('Enter port range using - as separator:\n')
  12.    print ('-' * 60)
  13.    print ('Please wait, scanning remote host', remoteServerIP)
  14.    print ('-' * 60)
  15.    t1 = datetime.datetime.now()
  16.    netmap.scan(remoteServerIP, portRange)
  17. except KeyboardInterrupt:
  18.    print ("Ctrl+C pressed")
  19.    sys.exit()
  20.  
  21. except socket.gaierror:
  22.    print ("Couldn't resolve hostname")
  23.    sys.exit()
  24.  
  25. except socket.error:
  26.    print ("Couldn't connect to server")
  27.    sys.exit()
  28.  
  29. with open ("pScan.log", "a") as out:
  30.    for host in netmap.all_hosts():
  31.        print('Host : ' + host + '(' + netmap[host].hostname() + ')')
  32.        out.write('Host : ' + host + '(' + netmap[host].hostname() + ')\n')
  33.        print('State : %s' % netmap[host].state())
  34.        out.write('State : %s' % netmap[host].state()+"\n")
  35.        for proto in netmap[host].all_protocols():
  36.            print('----------')
  37.            out.write('----------\n')
  38.            print('Protocol : %s' % proto)
  39.            out.write('Protocol : %s' % proto+"\n")
  40.            lport = sorted(netmap[host][proto])
  41.  
  42.            for port in lport:
  43.                print('Port : %s\nState : %s' % (port, netmap[host][proto][port]['state']))
  44.                out.write('Port : ' + str(port) + '\nState  : ' + str(netmap[host][proto][port]['state'])+"\n")
  45.                print('Name : '+netmap[host][proto][port]['name'])
  46.                out.write('Name : '+netmap[host][proto][port]['name']+"\n")
  47.                temp2 = str(now.year) + "/" + str(now.month) + "/" + str(now.day) + " "  + str(now.hour) + ":" + str(now.minute) + ":" + str(now.second)
  48.                print("Date : " + temp2 + "\n\n")
  49.                out.write("Date : " + temp2 + "\n\n")
  50.    t2 = datetime.datetime.now()
  51.    total = t2 - t1
  52.    print ("Scanning completed in ", str(total))
  53.    out.write("\nScanning completed in "+ str(total)+"\n")
  54.    print('\n\nCSV:\n'+netmap.csv())
  55.    out.write('\n\nCSV:\n'+netmap.csv()+"\n")
39  Programación / Desarrollo Web / Me recomendais algún algoritmo de bruteforce? en: 12 Marzo 2020, 17:03 pm
Llevo tiempo intentando hacer uno, pero nunca lo consigo xD

Os dejo mi último intento por si veis alguna forma de arreglarlo o conoceis algun algoritmo que me sea sencillo de implementar o copiar.

Código
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. </head>
  6. <body>
  7.  
  8. <script>
  9. function bruteforce(mainUrl, longitud, dictio) {
  10.  var directories = [];
  11.  var increaseSize = false;
  12.  var tmpUrl = mainUrl;
  13.  var permanecerEnBucle = true;
  14.  var posicionCambio = "";
  15. var dict = dictio || " abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ1234567890/-.?=_";
  16. /* var dict = "abcdefghijklmnñopqrstuvwxyzABCDEFGHIJKLMNÑOPQRSTUVWXYZ1234567890/-.?=_";
  17.   dict = "abcdefghijklmnñopqrstuvwxyz";
  18. */var tmp, fuck = "", sigChar, wtf;
  19.  dict = dict.split("");
  20.  
  21. /*  longitud *= dict.length;     */    /* Max Length of the directory without domain */
  22.  
  23.  for(var i = 0, j=0, k=0; i < longitud; ++i, ++j) {
  24.    directories[i] = mainUrl + dict[j];          /* Append current character to base url */
  25.    tmp = directories[i].substring((mainUrl.length-k), directories[i].length);          /* current directory without path */
  26.    if (j == (dict.length-1)) {          /* Last character of the dictionary */
  27.      j = -1;          /* Reset dictionary itherator. j = 0 next ither */
  28.      if(tmp[(tmp.length-1)] == dict[(dict.length-1)]) {          /* Check lf Last char of current directory without path matches last dictionary char */
  29.        permanecerEnBucle=true;          /* reset loop */
  30.        posicionCambio = "";          /* reset diff ocurrences */
  31.        for(var a = 0; a < tmp.length; ++a) {          /* Loop over directories no path included */
  32.          if((tmp[a] == dict[(dict.length-1)]) && (permanecerEnBucle == true)) {          /* if all characters in the directorie name match last dictionary character */
  33.            increaseSize = true;          
  34.          } else {
  35.            posicionCambio += a.toString();          /* Log first non dictionary end char possition */
  36.          increaseSize = false;
  37.            permanecerEnBucle = false;          /* Force increaseSize to remain false */
  38.          }
  39.        }
  40.        if (increaseSize) {
  41.          for(var c = 0, restart=""; c < tmp.length; ++c) {          /* for each char in tmp */
  42.            restart += dict[0];          /* Add first dictionary ocurrence  */
  43.          }
  44.          mainUrl = tmpUrl + restart;          /* Add the new generated path to main url */
  45.          ++k;          /* Count size increased */
  46.          increaseSize = false;          /* done */
  47.          } else {
  48.                      /* If all chars not matching last dicctionary char */
  49.            if (tmp === undefined) {          /* need to debug */
  50.              alert("tmp undefined");
  51.              tmp = "";
  52.            }
  53. /*alert(tmp);*/
  54.  
  55.  sigChar = dict.indexOf(tmp[(posicionCambio[0])]);
  56.  
  57.  
  58.        /*    sigChar = dict.indexOf(tmp[0]);*/          /* Get actual character position inside dictionary */
  59.            ++sigChar;          /* Get next character */
  60. /*alert("Char actual = " + sigChar);*/
  61. /*alert("Current: "+ directories[i] + "\n\nnext char " + dict[sigChar] + "\n\nPosition: " + posicionCambio[((posicionCambio.length-1)-1)]);*/
  62.            for(var d = 0, fuck = ""; d < (tmp.length-1); ++d) {          
  63.              if(d != posicionCambio[0] ) {          /* get path characters */
  64.                fuck += tmp[d];
  65. /*alert("if fuck = "+ fuck);*/
  66.              } else {
  67.                fuck += dict[sigChar];          /* get next character in rigth position */
  68. /*alert("else fuck = "+ fuck);*/
  69.              }
  70.            }
  71.            wtf = fuck.split("").reverse().join("");            /* Reversing string trying to fix the character in rigth position */
  72.            mainUrl = tmpUrl + wtf;          /* Appending reversed dirname to url */
  73.          }
  74.        }
  75.      }
  76.    }  
  77. alert("Número de combinaciones generadas: " + directories.length);
  78. alert("Número de letras en total: " + directories.join("").length);
  79.  return directories;          /* Return all urls generated. */
  80. }
  81.  
  82. var url = prompt("URL.\n\nExample: https://facebook.com/");
  83. var lengt = prompt("Number os results.\n\nExample: 10");
  84. var dictionary = prompt("Dictionary.\n\nExample: abcde12345!@#$ or accept to use default");
  85.  
  86. var arrDirs = bruteforce(url, lengt, dictionary);
  87. document.write(arrDirs);
  88.  
  89. </script>
  90. </body>
  91. </html>
40  Programación / PHP / Conoceis algún proxy 100 en PHP Curl sin más dependencias? en: 10 Marzo 2020, 18:58 pm
Busco un proxy para las peticiones que haga desde el navegador al php.
Hice uno a mano pero tengo que implementar un montón de cosas y me preguntaba si alguien lo habrá echo ya.
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines