SlideShare una empresa de Scribd logo
NoSQL Security
    José Ramón Palanco
Agenda
✦   Introducción NoSQL
     ✦   NoSQL vs RDBMS
     ✦   Arquitectura NoSQL
     ✦   Implementaciones de NoSQL
✦   Vectores de ataque
     ✦   Injections
     ✦   Key Bruteforce
     ✦   HTTP Protocol Based Attacks en listeners
     ✦   Cassandra security y Thrift security
     ✦   Denial of Service (connection pollution, evil queries)
Introducción
  NOSQL
¿Qué es NoSQL?

✦   Por lo general, no requieren
    de un esquema de la tabla
    fija ni utiliza join

✦   Todas las soluciones de
    NoSQL no implementan
    una o más de las
    propiedades ACID
Teorema de CAP
✦   Propiedades: consistencia,
    disponibilidad (availability) y
    particiones

✦   Al menos son necesarias 2

✦   Para escalar es necesario
    particiones

✦   En la mayoría de los casos
    primará disponibilidad sobre
    consistencia
Arquitectura NoSQL
  RDBMS                                   NoSQL
     Cliente                                        Cliente




Servidor HTTP                        Servidor HTTP

   SQL                       REST, JSON, XML, ...




    Connector         BBDD                     Connector                   BBDD

         ODBC, ADO, JDBC                                  Binario, HTTP, ...
NoSQL vs RDBMS
✦   Las RDBMS modernas muestran pobre
    desempeño y escalabilidad en aplicaciones que
    hacen un uso intensivo de los datos
     ✦   Cloud Computing (SaaS)
     ✦   Redes sociales
✦   Para consultas complejas es inviable utilizar
    algo diferente a RDBMS
Ejemplos de entornos
✦   En muchos entornos es necesario distribuir las
    escrituras en clusters, MapReduce, ..
     ✦   Facebook necesita almacenar 135 mil
         millones de mensajes cada mes
     ✦   Twitter almacena 7 TB diarios (duplica
         varias veces al año)
Desventajas NoSQL

✦   OLTP
✦   SQL
✦   Ad-Hoc queries
✦   Relaciones complejas
Arquitecturas NoSQL
✦   Almacen de documentos
✦   Grafos
✦   Clave/Valor y Tupla
✦   Multivalor
✦   Objetos
✦   Tabular
Almacén de documentos
✦   CouchDB:

✦   MongoDB

✦   Terrastore

✦   ThruDB

✦   OrientDB

✦   RavenDB
Grafos
✦   Neo4J

✦   Sones

✦   InfoGrid

✦   HypergraphDB

✦   AllegroGraph

✦   BigData
Clave/Valor y Tupla
✦   Redis

✦   Riak

✦   Tokio Cabinet

✦   MemcacheDB

✦   Membase

✦   Azure
Multivalor


✦   U2
✦   OpenInsight
✦   OpenQM
Objetos
✦   db4o          ✦   Objetivity

✦   Versant       ✦   NEO
MongoDB

✦   Protocolo: Binario (BSON)

✦   API: varios lenguajes

✦   Query: JavaScript/JSON

✦   Lenguaje: C++
•   Schema-Free (JSON)
                              Features
                         CouchDB
    •   Document Oriented,
        Not Relational

    • Highly Concurrent
✦    Protocolo: REST
    • RESTful HTTP API

✦    API: JSON
    • JavaScript-Powered

✦     Map/Reduce
     Query: MapReduce (JS)

✦ •     Lenguaje: Erlang
         N-Master Replication

    •   Robust Storage
{"couchdb":"Welcome","version":"0.11.0"}
$ telnet 172.16.163.129 5984
Trying 172.16.163.129...
Connected to 172.16.163.129.
Escape character is '^]'.
GET /rooted/ HTTP/1.1
Host: localhost

HTTP/1.1 200 OK
Server: CouchDB/0.11.0 (Erlang OTP/R14B)
Date: Sat, 19 Feb 2011 05:20:28 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 188
Cache-Control: must-revalidate

{"db_name":"rooted","doc_count":1,"doc_del_count":0,"update_seq":1,"purge_seq":
0,"compact_running":false,"disk_size":
4182,"instance_start_time":"1298092462502662","disk_format_version":5}
{"couchdb":"Welcome","version":"0.11.0"}
$ telnet 172.16.163.129 5984
Trying 172.16.163.129...
Connected to 172.16.163.129.
Escape character is '^]'.
GET /rooted/f34aae022f67a23ac56dba5b4e000cf2 HTTP/1.1
Host: localhost

HTTP/1.1 200 OK
Server: CouchDB/0.11.0 (Erlang OTP/R14B)
Etag: "1-2512702fff02fe841adecde4a22c62b5"
Date: Sat, 19 Feb 2011 05:20:47 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 155
Cache-Control: must-revalidate

{"_id":"f34aae022f67a23ac56dba5b4e000cf2","_rev":"1-2512702fff02fe841adecde4a2
2c62b5","Nombre":"Jose","DNI":"9393948K","telefono":999999999}
Connection closed by foreign host.
Redis

✦   Protocolo: Telnet plano

✦   API: Varios lenguajes

✦   Query: Comandos

✦   Lenguaje: C/C++
Cassandra

✦   Protocolo: Binario (Thrift)

✦   API: Thrift

✦   Query: Columna/rangos

✦   Lenguaje: Java
Cassandra

✦   Columna (tuple/triplet)
✦   Supercolumna (compuesto por columnas)
✦   Familia de Columna (contiene supercolumnas)
✦   Keyspace (alberga familias de columnas)
Cassandra

<Keyspace Name="BloggyAppy">
      <!-- CF definitions -->
      <ColumnFamily CompareWith="BytesType" Name="Authors"/>
      <ColumnFamily CompareWith="BytesType" Name="BlogEntries"/>
      <ColumnFamily CompareWith="TimeUUIDType" Name="TaggedPosts"/>
      <ColumnFamily CompareWith="TimeUUIDType" Name="Comments"
          CompareSubcolumnsWith="BytesType" ColumnType="Super"/>
  </Keyspace>




                     storage-conf.xml
Vectores de ataque
Introducción
✦   Diversos conceptos de
    bases de datos

✦   Diversas implementaciones

✦   Por lo tanto los vectores de
    ataque son muy específicos
    y dependerán de cada
    implementación
HTTP Based Attacks
✦   ¿Quien usa HTTP?

     ✦   CouchDB

     ✦   HBASE

     ✦   Riak

✦   ¿Como localizar
    vulnerabilidades?

     ✦   fuzzing: hzzp
Explotación de listeners
✦   Al funcionar sobre   $ telnet server.com 80
    HTTP, se pueden      Trying X.X.X.X...
    utilizar proxies     Connected to server.com.
    caché mal            Escape character is '^]'
    configurados para     GET /_all_dbs
    acceder a ellos      Host: 192.168.2.18
JSON Injection
   De la misma manera que en se
 escapa el SQL, cuando trabajamos
    con MongoDB ó CouchDB,
       debemos hacerlo igual


db.foo.find( { $or : [ { a : 1 } , { b : 2 } ] } )




db.foo.find( { $or : [ { a : 1 } , { b : 2 },
{ c : /.*/ } ] } )
Array Injection
                                                              <?
                                                              $collection->find(array(
                  MongoDB + PHP                                   "username" => $_GET
                                                              ['username'],
                                                                  "passwd" => $_GET
✦   En PHP es posible que una variable sea un                 ['passwd']
    array simplemente añadiendo corchetes                     ));

                                                              ?>
✦   Si la passwd de admin Not Equal , podremos
    acceder
                                                       /login.php?username=admin&passwd[$ne]=1
✦   Además de $ne, podremos injectar:
                                                          <?
     ✦   $or, $exists, $nin, $in, $lt, ... (lógicos)      $collection->find(array(
                                                              "username" => "admin",
                                                              "passwd" => array("$ne" => 1)
     ✦   &var[‘$regex’]=/privileged/i (regex)             ));
                                                          ?>
View Injection
✦   CouchDB usa SpiderMonkey como motor de scripting
✦   Los js se cargan como views


$ ldd /usr/lib/couchdb/bin/couchjs
	

 libcurl.so.4 => /usr/lib/libcurl.so.4 (0x00007f7124325000)
	

 libmozjs.so.2d => /usr/lib/libmozjs.so.2d (0x00007f7124063000)
    ...
View Injection

✦   Hay vistas predefinidas y
    temporales
     ✦   Para hacer MapReduce
     ✦   Obtener datos arbitarios,
         modificar valores para
         alterar el flujo de
         ejecución
REST INJECTION
<?
$dbname = $_GET["db"];
$doc_id = $_GET["d_id"];
$resp = $couch->send("GET", "/" . $dbname ."/" . $doc_id);
?>
          ✦   Cross Database:
              ✦   /?db=_all_dbs
              ✦   /?db=usuarios
CouchDB info

✦   http://172.16.163.129:5984/_config
✦   http://172.16.163.129:5984/_all_dbs
✦   http://172.16.163.129:5984/_stats
✦   http://172.16.163.129:5984/_utils
CouchDB cmd exec.
GQL Injection

✦   Se puede a llegar inyectar GQL, pero en un
    entorno bastante controlado
✦   No existe el operador negación “!”
✦   El set de comandos GQL es muy limitado
Key Bruteforce
✦   Al no existir esquemas, no tenemos
    porque averiguarlo

✦   Los id son de gran tamaño, pero no
    se generan de forma aleatoria:

    e479f720ff9a05fb2f441fef97000c87

    e479f720ff9a05fb2f441fef97000b61
Cassandra Security
                         <?
                              ...
                              $columnParent = new cassandra_ColumnParent();
                              $columnParent->super_column = NULL;

                              if(isset($_GET[‘CF’]))
                              $columnParent->column_family = $_GET[‘CF’].“_myfam”;

✦   Si podemos                $sliceRange = new cassandra_SliceRange();
    modificar el nombre        $sliceRange->start = "";
                              $sliceRange->finish = "";

    de una familia,           $predicate = new cassandra_SlicePredicate();
                              list() = $predicate->column_names;

    podremos obtener          $predicate->slice_range = $sliceRange;

                              $consistency_level = cassandra_ConsistencyLevel::ONE;
    elementos de otra      $keyUserId = 1;
    familia                $result = $client->get_slice($keyspace, $keyUserId,
                         $columnParent, $predicate, $consistency_level);


                              print_r($result);
                              ...

                         ?>
Denial of Service
✦   Connection polution

        ✦   Couchdb-> implementación
            interface = restfull

✦   Con GQL, es posible generar DoS al
    crear consultas maliciosas que
    consuman mucha CPU y se de de baja
    de GAE ó que se facture por esa CPU
    extra
✦   q
Preguntas
Preguntas

Más contenido relacionado

ODP
Jaime Peñalba - Como defenderse en terreno hostil: Protecciones para la Defco...
PDF
José Selvi - Unprivileged Network Post-Exploitation [RootedCON 2011]
PPTX
Jose Selvi - Adaptando exploits para evitar la frustración [RootedSatellite V...
PPTX
Pablo sanemeteriovalencia
PDF
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
PPTX
Alberto García de Dios - Virus, el arte no debería ser negocio [Rooted CON 2011]
PDF
Javier Marcos - Detección de amenazas a escala con osquery [rooted2019]
PPTX
Jose M Mejia - Usando computación paralela GPU en malware y herramientas de h...
Jaime Peñalba - Como defenderse en terreno hostil: Protecciones para la Defco...
José Selvi - Unprivileged Network Post-Exploitation [RootedCON 2011]
Jose Selvi - Adaptando exploits para evitar la frustración [RootedSatellite V...
Pablo sanemeteriovalencia
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Alberto García de Dios - Virus, el arte no debería ser negocio [Rooted CON 2011]
Javier Marcos - Detección de amenazas a escala con osquery [rooted2019]
Jose M Mejia - Usando computación paralela GPU en malware y herramientas de h...

La actualidad más candente (19)

PDF
Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]
PPT
Introducción a Groovy
PPTX
Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]
PDF
Gabriel Gonzalez - Man-In-Remote: PKCS11 for fun and non-profit [RootedCON 2011]
PDF
Introducción a PHP - Programador PHP - UGR
PDF
PPTX
3 curso php
PDF
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]
PPT
Abel Valero - VM + VFS = The Wooden Horse [rooted2018]
DOCX
Practicas programacion 1 10
PDF
David López Paz - Global Warfare [RootedCON 2011]
PDF
Semana 6 Módulos en Python Entrega 2
DOCX
Informe minishell
PPTX
Elias Grande - Dagda [rootedvlc4]
PDF
PHPVigo #19 - Lightning variables de entorno
PDF
Linux basico-6.PDF
Manuel Blanco - GNU/Linux Binary Exploitation I&II [rooted2018]
Introducción a Groovy
Javier Saez - Una panorámica sobre la seguridad en entornos web [rootedvlc2]
Gabriel Gonzalez - Man-In-Remote: PKCS11 for fun and non-profit [RootedCON 2011]
Introducción a PHP - Programador PHP - UGR
3 curso php
Pablo González - Jugando a lo Super Mario entre túneles y máquinas [rooted2018]
Abel Valero - VM + VFS = The Wooden Horse [rooted2018]
Practicas programacion 1 10
David López Paz - Global Warfare [RootedCON 2011]
Semana 6 Módulos en Python Entrega 2
Informe minishell
Elias Grande - Dagda [rootedvlc4]
PHPVigo #19 - Lightning variables de entorno
Linux basico-6.PDF
Publicidad

Destacado (18)

PDF
Rubén Santamarta - SCADA Trojans: Attacking the Grid [Rooted CON 2011]
PDF
David Pérez + José Picó - Un ataque práctico contra comunicaciones móviles [R...
PPS
Marisol Salanova - Seguridad informática y cibersexo [RootedCON 2011]
PPTX
Gianluca D'Antonio - La Gestión de la Seguridad de la Información ante las nu...
PDF
{RootedPanel] Grupo de Hackers Históricos: Apòstols [RootedCON 2010]
PPTX
Alejandro Martín + Chema Alonso - Pulveriza tus publicaciones con Dust [Roote...
PDF
Antonio Ramos - La asimetría en el mercado de la seguridad [RootedCON 2011]
ODP
Joxean Koret - Database Security Paradise [Rooted CON 2011]
PDF
Raúl Siles - Browser Exploitation for Fun and Profit Revolutions [RootedCON 2...
PPTX
Blueliv - Information Tracking with Optos [Rooted CON 2011]
PDF
Francisco Jesús Gómez + Carlos Juan Diaz - Cloud Malware Distribution: DNS wi...
PPTX
Vins Villaplana - Seguridad en capa de enlace [RootedCON 2011]
PDF
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...
PDF
José Miguel Esparza - Obfuscation and (non-)detection of malicious PDF files ...
PDF
Jaime Blasco & Pablo Rincón - Lost in translation: WTF is happening inside m...
PDF
Hernan Ochoa - WCE Internals [RootedCON 2011]
PPTX
Eloi Sanfelix - Hardware security: Side Channel Attacks [RootedCON 2011]
PDF
Alejandro Ramos - Know your ******: 4dv4nc3d P@55w0rd$ (r4c|&lt;1ng [RootedCO...
Rubén Santamarta - SCADA Trojans: Attacking the Grid [Rooted CON 2011]
David Pérez + José Picó - Un ataque práctico contra comunicaciones móviles [R...
Marisol Salanova - Seguridad informática y cibersexo [RootedCON 2011]
Gianluca D'Antonio - La Gestión de la Seguridad de la Información ante las nu...
{RootedPanel] Grupo de Hackers Históricos: Apòstols [RootedCON 2010]
Alejandro Martín + Chema Alonso - Pulveriza tus publicaciones con Dust [Roote...
Antonio Ramos - La asimetría en el mercado de la seguridad [RootedCON 2011]
Joxean Koret - Database Security Paradise [Rooted CON 2011]
Raúl Siles - Browser Exploitation for Fun and Profit Revolutions [RootedCON 2...
Blueliv - Information Tracking with Optos [Rooted CON 2011]
Francisco Jesús Gómez + Carlos Juan Diaz - Cloud Malware Distribution: DNS wi...
Vins Villaplana - Seguridad en capa de enlace [RootedCON 2011]
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...
José Miguel Esparza - Obfuscation and (non-)detection of malicious PDF files ...
Jaime Blasco & Pablo Rincón - Lost in translation: WTF is happening inside m...
Hernan Ochoa - WCE Internals [RootedCON 2011]
Eloi Sanfelix - Hardware security: Side Channel Attacks [RootedCON 2011]
Alejandro Ramos - Know your ******: 4dv4nc3d P@55w0rd$ (r4c|&lt;1ng [RootedCO...
Publicidad

Similar a José Ramón Palanco - NoSQL Security [RootedCON 2011] (20)

PDF
Cloud Computing: las nuevas Capas de Persistencia
PDF
PDF
PHP y NoSQL PHPConMX 2012
KEY
Mongo Mapper
PPTX
NoSQL: la siguiente generación de Base de Datos
PPTX
Jean piere sarumo mongodb
PDF
BigData - NoSQL
PDF
Pgpymongo y pgpycouch
KEY
Redis, base de datos NoSQL clave-valor
PPTX
Introducción a NoSQL
PDF
No-SQL Databases
PDF
Introducción al mundo NoSQL
PPTX
Introducción mongodb y desarrollo
PPT
Mongo db course introduction
DOCX
Apache CouchDB
PDF
Introducción MongoDB con Java
PDF
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
PPTX
PDF
Bases de datos NoSQL - Huancayo - 2010
PPTX
1 tutorial de mongo db
Cloud Computing: las nuevas Capas de Persistencia
PHP y NoSQL PHPConMX 2012
Mongo Mapper
NoSQL: la siguiente generación de Base de Datos
Jean piere sarumo mongodb
BigData - NoSQL
Pgpymongo y pgpycouch
Redis, base de datos NoSQL clave-valor
Introducción a NoSQL
No-SQL Databases
Introducción al mundo NoSQL
Introducción mongodb y desarrollo
Mongo db course introduction
Apache CouchDB
Introducción MongoDB con Java
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
Bases de datos NoSQL - Huancayo - 2010
1 tutorial de mongo db

Más de RootedCON (20)

PDF
Rooted2020 A clockwork pentester - Jose Carlos Moral & Alvaro Villaverde
PDF
rooted2020 Sandbox fingerprinting -_evadiendo_entornos_de_analisis_-_victor_c...
PDF
Rooted2020 hunting malware-using_process_behavior-roberto_amado
PPSX
Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_
PDF
Rooted2020 the day i_ruled_the_world_deceiving_software_developers_through_op...
PPTX
Rooted2020 si la-empresa_ha_ocultado_el_ciberataque,_como_se_ha_enterado_el_r...
PPTX
Rooted2020 wordpress-another_terror_story_-_manuel_garcia_-_jacinto_sergio_ca...
PPTX
Rooted2020 Atacando comunicaciones-de_voz_cifradas_-_jose_luis_verdeguer
PDF
rooted2020-Rootkit necurs no_es_un_bug,_es_una_feature_-_roberto_santos_-_jav...
PDF
Rooted2020 stefano maccaglia--_the_enemy_of_my_enemy
PPTX
Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...
PPTX
Rooted2020 virtual pwned-network_-_manel_molina
PDF
Rooted2020 van a-mear_sangre_como_hacer_que_los_malos_lo_paguen_muy_caro_-_an...
PDF
Rooted2020 todo a-siem_-_marta_lopez
PPTX
Rooted2020 roapt evil-mass_storage_-_tu-ya_aqui_-_david_reguera_-_abel_valero
PDF
Rooted2020 live coding--_jesus_jara
PDF
Rooted2020 legalidad de-la_prueba_tecnologica_indiciaria_cuando_tu_papi_es_un...
PDF
Rooted2020 hackeando el-mundo_exterior_a_traves_de_bluetooth_low-energy_ble_-...
PDF
Rooted2020 evading deep-learning_malware_detectors_-_javier_yuste
PDF
Rooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 A clockwork pentester - Jose Carlos Moral & Alvaro Villaverde
rooted2020 Sandbox fingerprinting -_evadiendo_entornos_de_analisis_-_victor_c...
Rooted2020 hunting malware-using_process_behavior-roberto_amado
Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_
Rooted2020 the day i_ruled_the_world_deceiving_software_developers_through_op...
Rooted2020 si la-empresa_ha_ocultado_el_ciberataque,_como_se_ha_enterado_el_r...
Rooted2020 wordpress-another_terror_story_-_manuel_garcia_-_jacinto_sergio_ca...
Rooted2020 Atacando comunicaciones-de_voz_cifradas_-_jose_luis_verdeguer
rooted2020-Rootkit necurs no_es_un_bug,_es_una_feature_-_roberto_santos_-_jav...
Rooted2020 stefano maccaglia--_the_enemy_of_my_enemy
Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...
Rooted2020 virtual pwned-network_-_manel_molina
Rooted2020 van a-mear_sangre_como_hacer_que_los_malos_lo_paguen_muy_caro_-_an...
Rooted2020 todo a-siem_-_marta_lopez
Rooted2020 roapt evil-mass_storage_-_tu-ya_aqui_-_david_reguera_-_abel_valero
Rooted2020 live coding--_jesus_jara
Rooted2020 legalidad de-la_prueba_tecnologica_indiciaria_cuando_tu_papi_es_un...
Rooted2020 hackeando el-mundo_exterior_a_traves_de_bluetooth_low-energy_ble_-...
Rooted2020 evading deep-learning_malware_detectors_-_javier_yuste
Rooted2020 encontrando 0days-en_2020_-_antonio_morales

José Ramón Palanco - NoSQL Security [RootedCON 2011]

  • 1. NoSQL Security José Ramón Palanco
  • 2. Agenda ✦ Introducción NoSQL ✦ NoSQL vs RDBMS ✦ Arquitectura NoSQL ✦ Implementaciones de NoSQL ✦ Vectores de ataque ✦ Injections ✦ Key Bruteforce ✦ HTTP Protocol Based Attacks en listeners ✦ Cassandra security y Thrift security ✦ Denial of Service (connection pollution, evil queries)
  • 4. ¿Qué es NoSQL? ✦ Por lo general, no requieren de un esquema de la tabla fija ni utiliza join ✦ Todas las soluciones de NoSQL no implementan una o más de las propiedades ACID
  • 5. Teorema de CAP ✦ Propiedades: consistencia, disponibilidad (availability) y particiones ✦ Al menos son necesarias 2 ✦ Para escalar es necesario particiones ✦ En la mayoría de los casos primará disponibilidad sobre consistencia
  • 6. Arquitectura NoSQL RDBMS NoSQL Cliente Cliente Servidor HTTP Servidor HTTP SQL REST, JSON, XML, ... Connector BBDD Connector BBDD ODBC, ADO, JDBC Binario, HTTP, ...
  • 7. NoSQL vs RDBMS ✦ Las RDBMS modernas muestran pobre desempeño y escalabilidad en aplicaciones que hacen un uso intensivo de los datos ✦ Cloud Computing (SaaS) ✦ Redes sociales ✦ Para consultas complejas es inviable utilizar algo diferente a RDBMS
  • 8. Ejemplos de entornos ✦ En muchos entornos es necesario distribuir las escrituras en clusters, MapReduce, .. ✦ Facebook necesita almacenar 135 mil millones de mensajes cada mes ✦ Twitter almacena 7 TB diarios (duplica varias veces al año)
  • 9. Desventajas NoSQL ✦ OLTP ✦ SQL ✦ Ad-Hoc queries ✦ Relaciones complejas
  • 10. Arquitecturas NoSQL ✦ Almacen de documentos ✦ Grafos ✦ Clave/Valor y Tupla ✦ Multivalor ✦ Objetos ✦ Tabular
  • 11. Almacén de documentos ✦ CouchDB: ✦ MongoDB ✦ Terrastore ✦ ThruDB ✦ OrientDB ✦ RavenDB
  • 12. Grafos ✦ Neo4J ✦ Sones ✦ InfoGrid ✦ HypergraphDB ✦ AllegroGraph ✦ BigData
  • 13. Clave/Valor y Tupla ✦ Redis ✦ Riak ✦ Tokio Cabinet ✦ MemcacheDB ✦ Membase ✦ Azure
  • 14. Multivalor ✦ U2 ✦ OpenInsight ✦ OpenQM
  • 15. Objetos ✦ db4o ✦ Objetivity ✦ Versant ✦ NEO
  • 16. MongoDB ✦ Protocolo: Binario (BSON) ✦ API: varios lenguajes ✦ Query: JavaScript/JSON ✦ Lenguaje: C++
  • 17. Schema-Free (JSON) Features CouchDB • Document Oriented, Not Relational • Highly Concurrent ✦ Protocolo: REST • RESTful HTTP API ✦ API: JSON • JavaScript-Powered ✦ Map/Reduce Query: MapReduce (JS) ✦ • Lenguaje: Erlang N-Master Replication • Robust Storage
  • 18. {"couchdb":"Welcome","version":"0.11.0"} $ telnet 172.16.163.129 5984 Trying 172.16.163.129... Connected to 172.16.163.129. Escape character is '^]'. GET /rooted/ HTTP/1.1 Host: localhost HTTP/1.1 200 OK Server: CouchDB/0.11.0 (Erlang OTP/R14B) Date: Sat, 19 Feb 2011 05:20:28 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 188 Cache-Control: must-revalidate {"db_name":"rooted","doc_count":1,"doc_del_count":0,"update_seq":1,"purge_seq": 0,"compact_running":false,"disk_size": 4182,"instance_start_time":"1298092462502662","disk_format_version":5}
  • 19. {"couchdb":"Welcome","version":"0.11.0"} $ telnet 172.16.163.129 5984 Trying 172.16.163.129... Connected to 172.16.163.129. Escape character is '^]'. GET /rooted/f34aae022f67a23ac56dba5b4e000cf2 HTTP/1.1 Host: localhost HTTP/1.1 200 OK Server: CouchDB/0.11.0 (Erlang OTP/R14B) Etag: "1-2512702fff02fe841adecde4a22c62b5" Date: Sat, 19 Feb 2011 05:20:47 GMT Content-Type: text/plain;charset=utf-8 Content-Length: 155 Cache-Control: must-revalidate {"_id":"f34aae022f67a23ac56dba5b4e000cf2","_rev":"1-2512702fff02fe841adecde4a2 2c62b5","Nombre":"Jose","DNI":"9393948K","telefono":999999999} Connection closed by foreign host.
  • 20. Redis ✦ Protocolo: Telnet plano ✦ API: Varios lenguajes ✦ Query: Comandos ✦ Lenguaje: C/C++
  • 21. Cassandra ✦ Protocolo: Binario (Thrift) ✦ API: Thrift ✦ Query: Columna/rangos ✦ Lenguaje: Java
  • 22. Cassandra ✦ Columna (tuple/triplet) ✦ Supercolumna (compuesto por columnas) ✦ Familia de Columna (contiene supercolumnas) ✦ Keyspace (alberga familias de columnas)
  • 23. Cassandra <Keyspace Name="BloggyAppy"> <!-- CF definitions --> <ColumnFamily CompareWith="BytesType" Name="Authors"/> <ColumnFamily CompareWith="BytesType" Name="BlogEntries"/> <ColumnFamily CompareWith="TimeUUIDType" Name="TaggedPosts"/> <ColumnFamily CompareWith="TimeUUIDType" Name="Comments" CompareSubcolumnsWith="BytesType" ColumnType="Super"/> </Keyspace> storage-conf.xml
  • 25. Introducción ✦ Diversos conceptos de bases de datos ✦ Diversas implementaciones ✦ Por lo tanto los vectores de ataque son muy específicos y dependerán de cada implementación
  • 26. HTTP Based Attacks ✦ ¿Quien usa HTTP? ✦ CouchDB ✦ HBASE ✦ Riak ✦ ¿Como localizar vulnerabilidades? ✦ fuzzing: hzzp
  • 27. Explotación de listeners ✦ Al funcionar sobre $ telnet server.com 80 HTTP, se pueden Trying X.X.X.X... utilizar proxies Connected to server.com. caché mal Escape character is '^]' configurados para GET /_all_dbs acceder a ellos Host: 192.168.2.18
  • 28. JSON Injection De la misma manera que en se escapa el SQL, cuando trabajamos con MongoDB ó CouchDB, debemos hacerlo igual db.foo.find( { $or : [ { a : 1 } , { b : 2 } ] } ) db.foo.find( { $or : [ { a : 1 } , { b : 2 }, { c : /.*/ } ] } )
  • 29. Array Injection <? $collection->find(array( MongoDB + PHP "username" => $_GET ['username'], "passwd" => $_GET ✦ En PHP es posible que una variable sea un ['passwd'] array simplemente añadiendo corchetes )); ?> ✦ Si la passwd de admin Not Equal , podremos acceder /login.php?username=admin&passwd[$ne]=1 ✦ Además de $ne, podremos injectar: <? ✦ $or, $exists, $nin, $in, $lt, ... (lógicos) $collection->find(array( "username" => "admin", "passwd" => array("$ne" => 1) ✦ &var[‘$regex’]=/privileged/i (regex) )); ?>
  • 30. View Injection ✦ CouchDB usa SpiderMonkey como motor de scripting ✦ Los js se cargan como views $ ldd /usr/lib/couchdb/bin/couchjs libcurl.so.4 => /usr/lib/libcurl.so.4 (0x00007f7124325000) libmozjs.so.2d => /usr/lib/libmozjs.so.2d (0x00007f7124063000) ...
  • 31. View Injection ✦ Hay vistas predefinidas y temporales ✦ Para hacer MapReduce ✦ Obtener datos arbitarios, modificar valores para alterar el flujo de ejecución
  • 32. REST INJECTION <? $dbname = $_GET["db"]; $doc_id = $_GET["d_id"]; $resp = $couch->send("GET", "/" . $dbname ."/" . $doc_id); ?> ✦ Cross Database: ✦ /?db=_all_dbs ✦ /?db=usuarios
  • 33. CouchDB info ✦ http://172.16.163.129:5984/_config ✦ http://172.16.163.129:5984/_all_dbs ✦ http://172.16.163.129:5984/_stats ✦ http://172.16.163.129:5984/_utils
  • 35. GQL Injection ✦ Se puede a llegar inyectar GQL, pero en un entorno bastante controlado ✦ No existe el operador negación “!” ✦ El set de comandos GQL es muy limitado
  • 36. Key Bruteforce ✦ Al no existir esquemas, no tenemos porque averiguarlo ✦ Los id son de gran tamaño, pero no se generan de forma aleatoria: e479f720ff9a05fb2f441fef97000c87 e479f720ff9a05fb2f441fef97000b61
  • 37. Cassandra Security <? ... $columnParent = new cassandra_ColumnParent(); $columnParent->super_column = NULL; if(isset($_GET[‘CF’])) $columnParent->column_family = $_GET[‘CF’].“_myfam”; ✦ Si podemos $sliceRange = new cassandra_SliceRange(); modificar el nombre $sliceRange->start = ""; $sliceRange->finish = ""; de una familia, $predicate = new cassandra_SlicePredicate(); list() = $predicate->column_names; podremos obtener $predicate->slice_range = $sliceRange; $consistency_level = cassandra_ConsistencyLevel::ONE; elementos de otra $keyUserId = 1; familia $result = $client->get_slice($keyspace, $keyUserId, $columnParent, $predicate, $consistency_level); print_r($result); ... ?>
  • 38. Denial of Service ✦ Connection polution ✦ Couchdb-> implementación interface = restfull ✦ Con GQL, es posible generar DoS al crear consultas maliciosas que consuman mucha CPU y se de de baja de GAE ó que se facture por esa CPU extra ✦ q