<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manuel Montoya Lopez</title>
    <description>The latest articles on DEV Community by Manuel Montoya Lopez (@manuelm1209).</description>
    <link>https://dev.to/manuelm1209</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F930851%2Fac453cd5-f7a4-499e-9e7b-16a7300b7f7d.png</url>
      <title>DEV Community: Manuel Montoya Lopez</title>
      <link>https://dev.to/manuelm1209</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manuelm1209"/>
    <language>en</language>
    <item>
      <title>Snort 2 - Instalación y configuración</title>
      <dc:creator>Manuel Montoya Lopez</dc:creator>
      <pubDate>Fri, 01 Sep 2023 22:22:59 +0000</pubDate>
      <link>https://dev.to/manuelm1209/snort-2-instalacion-y-configuracion-695</link>
      <guid>https://dev.to/manuelm1209/snort-2-instalacion-y-configuracion-695</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es Snort?
&lt;/h2&gt;

&lt;p&gt;Snort es el sistema de prevención/detección de intrusos de código abierto más importante del mundo. Snort utiliza una serie de reglas que permiten identificar actividades sospechosas en la red, utilizando estas reglas para buscar coincidencias con los paquetes encontrados en la red y generar alertas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definición IDS
&lt;/h2&gt;

&lt;p&gt;IDS, sistema de detección de intrusos, o por sus siglas en inglés Intrusion Detection System, es una solución de monitoreo pasivo para la detección de posibles acciones o patrones sospechosos, incidentes anormales y violaciones de políticas de seguridad. Este es responsable por la generación de alertas por cada evento sospechoso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definición IPS
&lt;/h2&gt;

&lt;p&gt;IPS, sistema de prevención de intrusos, o por sus siglas en inglés Intrusion Prevention System, es una solución de protección activa para la prevención de posibles acciones o patrones sospechosos, incidentes anormales y violaciones de políticas de seguridad. Este es responsable de detener/prevenir/terminar el evento sospechoso tan pronto se realiza la detección.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalación
&lt;/h2&gt;

&lt;p&gt;Para la instalación de Snort, tomaremos como referencia el sistema operativo Debian.&lt;/p&gt;

&lt;p&gt;Instalación desde repositorio:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt install snort&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Flags útiles
&lt;/h3&gt;

&lt;p&gt;-V / –version Este parámetro proporciona información sobre la versión de Snort.&lt;br&gt;
-c Identifica el archivo de configuración.&lt;br&gt;
-T Parámetro de autocomprobación de Snort, se puede probar la configuración de Snort con este parámetro.&lt;br&gt;
-q Modo silencioso, se usa para evitar que Snort muestre el banner predeterminado y la información sobre su configuración.&lt;br&gt;
-d Display the packet data payload (Application Layer).&lt;br&gt;
-e Display TCP/IP/UDP/ICMP headers (Second Layer/Data-Link Layer).&lt;br&gt;
-i  Este parámetro ayuda a definir una interfaz de red específica para escuchar/sniff. La interfaz por defecto es eth0.&lt;br&gt;
-l Logger mode, registro de destino y directorio de registro de alertas. La carpeta de logs por defecto para Snort es /var/log/snort.&lt;br&gt;
-v Verbosidad.&lt;/p&gt;
&lt;h2&gt;
  
  
  Iniciar Snort
&lt;/h2&gt;

&lt;p&gt;Para iniciar Snort en modo sniffer (packet dump mode), y realizar el registro de los paquetes detectados, hacemos el llamado a Snort con las siguiente configuración.&lt;/p&gt;

&lt;p&gt;Snort -i wlan0 -vde&lt;/p&gt;

&lt;p&gt;Para iniciar Snort como un NIDS (Network Intrusion Detection System), debemos incluir el archivo de configuración y reglas al hacer nuestro llamado a Snort.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;snort -vde -c /etc/snort/snort.conf&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Archivo de configuración de Snort
&lt;/h2&gt;

&lt;p&gt;El archivo de configuración de Snort es usado para especificar la configuración que queremos usar al momento de ejecutar Snort, este esta ubicado en /etc/snort/snort.conf.&lt;/p&gt;

&lt;p&gt;Podemos abrir y modificar este archivo mediante el editor de texto nano.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nano /etc/snort/snort.conf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Aquí puedes ver los 9 pasos para configurar Snort.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This file contains a sample snort configuration.&lt;br&gt;
You should take the following steps to create your own custom configuration:&lt;br&gt;
1) Set the network variables.&lt;br&gt;
2) Configure the decoder&lt;br&gt;
3) Configure the base detection engine&lt;br&gt;
4) Configure dynamic loaded libraries&lt;br&gt;
5) Configure preprocessors&lt;br&gt;
6) Configure output plugins&lt;br&gt;
7) Customize your rule set&lt;br&gt;
8) Customize preprocessor and decoder rule set&lt;br&gt;
9) Customize shared object rule set&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En este documento solo mencionaremos algunos de estos pasos, buscando realizar una configuración básica de Snort.&lt;/p&gt;
&lt;h3&gt;
  
  
  1) Set the network variables.
&lt;/h3&gt;

&lt;p&gt;ipvar HOME_NET any&lt;/p&gt;

&lt;p&gt;La variable HOME_NET, representa la parte de nuestra red en la que confiamos y queremos proteger, esta variable puede ser solo una IP, una lista de IPs separadas por comas, una subnet en notación CIDR, o simplemente “any”.&lt;br&gt;
La mejor práctica es asignar a la variable HOME_NET la subnet que estámos protegiendo en notación CIDR, en mi caso es la siguiente:&lt;/p&gt;

&lt;p&gt;ipvar HOME_NET 192.168.0.0/24&lt;/p&gt;

&lt;p&gt;ipvar EXTERNAL_NET any&lt;/p&gt;

&lt;p&gt;Para la variable EXTERNEL_NET, podemos asignarle todo lo que no sea HOME_NET, y esto lo hacemos anteponiendo el símbolo ! a la variable HOME_NET de la siguiente manera:&lt;/p&gt;

&lt;p&gt;ipvar EXTERNAL_NET !$HOME_NET&lt;/p&gt;
&lt;h3&gt;
  
  
  6) Configure output plugins
&lt;/h3&gt;

&lt;p&gt;En esta sección podemos definir dónde y cómo se envían las alertas y registros (logs).&lt;/p&gt;

&lt;p&gt;“output unified2”, esta línea es lo que Snort llama “unified logging”, este se encarga de registrar los paquetes completos y las alertas.&lt;/p&gt;
&lt;h3&gt;
  
  
  7) Customize your rule set
&lt;/h3&gt;

&lt;p&gt;include $RULE_PATH/local.rules&lt;br&gt;
Esta línea especifica la ruta de nuestras reglas personalizadas.&lt;/p&gt;

&lt;p&gt;Para realizar una buena configuración y creación de reglas, es recomendable deshabilitar las reglas existentes, esto en parte porque pueden generar errores o ser una versión muy antigua que realmente no son muy efectivas contra los ataques actuales.&lt;br&gt;
Posterior a comentar las reglas que vienen por defecto o en su defecto eliminarlas, procedemos a guardar los cambios en el archivo de configuración de Snort.&lt;/p&gt;
&lt;h2&gt;
  
  
  Probar la correcta configuración de Snort.
&lt;/h2&gt;

&lt;p&gt;Para realizar la comprobación de la correcta configuración del archivo snort.conf, podemos hacer uno de la bandera “-T”, la cual nos permite especificar el archivo de configuración con la bandera “-c” y tan solo con estos parámetros obtendremos una respuesta de test de configuración.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;snort -T -c /etc/snort/snort.conf&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Entendiendo la estructura de una regla
&lt;/h2&gt;

&lt;p&gt;Para este capítulo, analizaremos unas de las reglas que se encuentran en el archivo scan.rules dentro de la carpeta de reglas de Snort /etc/snort/rules.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alert tcp $EXTERNAL_NET any -&amp;gt; $HOME_NET any (msg:"SCAN SYN FIN"; flow:stateless; flags:SF,12; reference:arachnids,198; classtype:attempted-recon; sid:624; rev:7;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para un mejor análisis de esta regla, vamos a dividirla en dos partes, rule header y rule options.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule Header
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;​alert tcp $EXTERNAL_NET any -&amp;gt; $HOME_NET any&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;alert:&lt;/strong&gt; Acción, esta puede ser alert, log, o pass (drop).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tcp:&lt;/strong&gt; Protocolo del tráfico que la regla está buscando. Puede ser tcp, udp, y icmp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$EXTERNAL_NET:&lt;/strong&gt; IP de origen o red de origen del paquete malicioso. Esta puede ser definida como una variable en el archivo de configuración de Snort en /etc/snort/snort.conf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;any:&lt;/strong&gt; Puerto de origen. Este puede ser un único puerto (22), múltiples puertos (22,80), o un rango de puertos (22:100).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-&amp;gt;:&lt;/strong&gt; Dirección del tráfico. En este caso, estamos buscando tráfico originado desde EXTERNAL_NET hacia HOME_NET. Otra opción para este parámetro es “&amp;lt;&amp;gt;”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;$HOME_NET:&lt;/strong&gt; IP de destino del tráfico. Esta puede ser definida como una variable en el archivo de configuración de Snort en /etc/snort/snort.conf.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;any:&lt;/strong&gt; Puerto de destino. Este puede ser un puerto específico (22), o una variable conteniendo una lista de puertos.&lt;/p&gt;

&lt;p&gt;Nota: recuerda que puedes negar distintos parámetros, incluidos los puertos anteponiendo el símbolo “!”.&lt;br&gt;
De esta forma con “!22”, quedará especificado que son todos los puertos excepto el puerto 22.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rule Options
&lt;/h3&gt;

&lt;p&gt;Esta segunda parte de la regla se puede diferenciar fácilmente ya que está encerrada dentro de paréntesis y está compuesta por una palabra clave, dos puntos y un argumento.&lt;br&gt;
Ejemplo:&lt;/p&gt;

&lt;p&gt;keyword:argument&lt;/p&gt;

&lt;p&gt;Rule Option:&lt;br&gt;
(msg:"SCAN SYN FIN"; flow:stateless; flags:SF,12; reference:arachnids,198; classtype:attempted-recon; sid:624; rev:7;)&lt;/p&gt;

&lt;p&gt;msg: Este es el mensaje que se envía al sysadmin si la regla se cumple y es activada. El mensaje en este caso es “SCAN SYN FIN”.&lt;/p&gt;

&lt;p&gt;flow: Esta opción permite a la regla verificar el flujo del tráfico. Esta opción puede ser “established” (Conexión TCP establecida), “not established” (Conexión TCP no establecida), “stateless” (Conexión establecidas y no establecidas). A continuación dejamos las distintas opciones que pueden ser usadas, estas fueron sacadas del manual oficial de Snort.&lt;/p&gt;

&lt;p&gt;flags: Esta sección es para las banderas TCP. F - FIN - Finish (LSB in TCP Flags byte) S - SYN - Synchronize sequence numbers R - RST - Reset P - PSH - Push A - ACK - Acknowledgment U - URG - Urgent C - CWR - Congestion Window Reduced (MSB in TCP Flags byte) E - ECE - ECN-Echo (If SYN, then ECN capable. Else, CE flag in IP header is set) 0 - No TCP Flags Set&lt;/p&gt;

&lt;p&gt;En este caso la regla está buscando tráfico que contenga la bandera SYN y FIN (SF) y adicionalmente tiene los dos bits reservados (12) en la bandera.&lt;/p&gt;

&lt;p&gt;reference: Esta sección es utilizada para extender la información y hacer referencia a una base de datos de seguridad, en este caso podemos obtener más información sobre este ataque en la base de datos de arachnids, attack 198.&lt;br&gt;
classtype: Todas las reglas están clasificadas en numerosas categorías para ayudar a entender al administrador el tipo de ataque que fue realizado. En el caso particular del ejemplo, el ataque fue clasificado como un “attempted-recon”.&lt;/p&gt;

&lt;p&gt;sid: (Signature ID) este es el identificador de la regla dentro de Snort. Cada regla debe tener un ID único. En este caso, el ID de la regla es “624”.&lt;/p&gt;

&lt;p&gt;rev: A medida que se revisan, mejoran o modifican las reglas, se les asigna un número de revisión. En el caso particular del ejemplo, esta es la revisión “7” de esta regla.&lt;/p&gt;

&lt;p&gt;content: En esta opción se especifica el contenido que se intenta encontrar en el paquete y lanzar la acción especificada al inicio de la regla. Estos pueden especificarse de distintas formas. content: “CONTENIDO” content: “| 54 14 4C 4F 53 | Intelligence” content: !”SNORT”&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Introducción a Snowflake -Cloud Data Warehouse</title>
      <dc:creator>Manuel Montoya Lopez</dc:creator>
      <pubDate>Sat, 22 Jul 2023 16:34:40 +0000</pubDate>
      <link>https://dev.to/manuelm1209/introduccion-a-snowflake-cloud-data-warehouse-jdg</link>
      <guid>https://dev.to/manuelm1209/introduccion-a-snowflake-cloud-data-warehouse-jdg</guid>
      <description>&lt;p&gt;Snowflake es una plataforma de Data Warehouse en la nube diseñada para almacenar y analizar grandes volúmenes de datos de manera eficiente y escalable. Su arquitectura única y su capacidad para soportar cargas de trabajo simultáneas hacen de Snowflake una opción popular entre las empresas que buscan una solución de análisis de datos ágil y potente.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es Snowflake?
&lt;/h2&gt;

&lt;p&gt;Snowflake es un servicio completamente administrado que permite a las organizaciones almacenar, procesar y analizar datos de forma rápida y segura. Al estar basado en la nube, Snowflake elimina la necesidad de gestionar infraestructuras físicas, lo que facilita su implementación y escalabilidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ventajas de Snowflake
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Arquitectura Multi-Cluster: Snowflake utiliza una arquitectura multi-cluster que permite a varios usuarios realizar consultas y ejecutar cargas de trabajo simultáneamente sin afectar el rendimiento.&lt;/li&gt;
&lt;li&gt;Escalabilidad Instantánea: Snowflake permite escalar verticalmente y horizontalmente según las necesidades de tu negocio, lo que garantiza un rendimiento óptimo en todo momento.&lt;/li&gt;
&lt;li&gt;Almacenamiento Separado del Cómputo: Snowflake almacena los datos y realiza las operaciones de cómputo de forma independiente, lo que permite un acceso más rápido a los datos y una mayor flexibilidad en el análisis.&lt;/li&gt;
&lt;li&gt;Conectividad con Herramientas de BI: Snowflake es compatible con diversas herramientas de Business Intelligence y análisis, lo que facilita la visualización y presentación de los datos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comandos Básicos en Snowflake
&lt;/h2&gt;

&lt;p&gt;A continuación, te presento algunos comandos básicos que te ayudarán a empezar a trabajar con Snowflake:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crear una base de datos:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;mi_basedatos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Usar una base de datos:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;mi_basedatos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Crear un esquema (schema):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;mi_esquema&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Crear una tabla:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;mi_tabla&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;edad&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Insertar datos en la tabla:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;mi_tabla&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edad&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Juan'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'María'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Carlos'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Consultar datos en la tabla:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;mi_tabla&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Actualizar datos en la tabla:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;mi_tabla&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;edad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Eliminar datos de la tabla:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;mi_tabla&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Crear un rol:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;mi_rol&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Conceder permisos a un rol:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;mi_tabla&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;mi_rol&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estos comandos te proporcionan una visión general de cómo interactuar con Snowflake para crear bases de datos, tablas y gestionar permisos de acceso. Además, Snowflake ofrece una amplia gama de funcionalidades avanzadas, como la creación de almacenes virtuales, el control de concurrencia y la gestión de almacenamiento de datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos de Uso para Snowflake
&lt;/h2&gt;

&lt;p&gt;Snowflake es una plataforma de Cloud Data Warehouse versátil y potente que puede ser aplicada en una variedad de escenarios empresariales. A continuación, te presento algunos casos de uso donde Snowflake brilla como una solución ideal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Análisis en Tiempo Real:&lt;/strong&gt; Snowflake es ideal para aplicaciones que requieren análisis de datos en tiempo real. Su arquitectura multi-cluster y escalabilidad instantánea permiten procesar grandes volúmenes de datos en tiempo real, proporcionando información valiosa para la toma de decisiones en tiempo oportuno.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proyectos de Big Data:&lt;/strong&gt; Snowflake es altamente efectivo para proyectos de Big Data, donde grandes cantidades de datos deben ser almacenadas, procesadas y analizadas de manera eficiente. Su capacidad de almacenamiento y su flexibilidad para escalar aseguran el manejo adecuado de grandes conjuntos de datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consolidación de Datos:&lt;/strong&gt; Snowflake es ideal para consolidar datos de diferentes fuentes en un único repositorio centralizado. Su capacidad para soportar múltiples cargas de trabajo simultáneas asegura un rendimiento óptimo incluso en entornos con altos volúmenes de datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Análisis de Datos para Negocios:&lt;/strong&gt; Snowflake es compatible con diversas herramientas de Business Intelligence (BI) y análisis, lo que facilita la visualización y presentación de datos para la toma de decisiones estratégicas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proyectos de Machine Learning:&lt;/strong&gt; Snowflake es una plataforma eficiente para proyectos de Machine Learning, donde se requiere el análisis de datos históricos para entrenar modelos y realizar predicciones precisas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Warehousing en Tiempo Real:&lt;/strong&gt; Snowflake es una excelente opción para empresas que requieren un Data Warehouse en tiempo real. Su arquitectura separada de almacenamiento y cómputo, junto con su capacidad de escalabilidad instantánea, permite un acceso rápido y eficiente a los datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Almacenamiento y Análisis de Datos Semiestructurados:&lt;/strong&gt; Snowflake es compatible con datos semiestructurados, como JSON y AVRO, lo que lo convierte en una solución versátil para el almacenamiento y análisis de diferentes tipos de datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proyectos de Internet de las Cosas (IoT):&lt;/strong&gt; Snowflake es una opción sólida para proyectos de IoT, donde se requiere la captura y análisis de datos en tiempo real generados por dispositivos conectados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Migración a la Nube:&lt;/strong&gt; Snowflake facilita la migración de sistemas heredados a la nube, permitiendo a las empresas modernizar su infraestructura y aprovechar las ventajas de la nube.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compartir Datos de Forma Segura:&lt;/strong&gt; Snowflake proporciona mecanismos de seguridad robustos para compartir datos con usuarios y equipos internos y externos, manteniendo la integridad y la privacidad de los datos.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En conclusión, Snowflake es una plataforma de Cloud Data Warehouse versátil y potente que puede ser aplicada en una amplia gama de casos de uso empresariales. Su arquitectura única, escalabilidad y capacidad para soportar cargas de trabajo simultáneas hacen que Snowflake sea una opción destacada para empresas que buscan una solución de análisis de datos rápida, segura y altamente eficiente. Si estás buscando mejorar tus capacidades analíticas y tomar decisiones basadas en datos sólidos, Snowflake es definitivamente una opción a considerar. &lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>español</category>
    </item>
    <item>
      <title>Introducción a ataques de Inyección SQL</title>
      <dc:creator>Manuel Montoya Lopez</dc:creator>
      <pubDate>Sun, 25 Sep 2022 01:01:46 +0000</pubDate>
      <link>https://dev.to/manuelm1209/introduccion-a-ataques-de-inyeccion-sql-224b</link>
      <guid>https://dev.to/manuelm1209/introduccion-a-ataques-de-inyeccion-sql-224b</guid>
      <description>&lt;h1&gt;
  
  
  Introducción
&lt;/h1&gt;

&lt;p&gt;Después de varios intentos para aprender cómo ejecutar inyecciones SQL, llegué al punto de reconocer muchos errores que cometí en este camino, y aclaro que aunque aún sigo siendo un novato en el tema, siento que todo hubiera sido mucho más fácil si hubiera entendido que todo tiene un proceso, y que definitivamente esta no era la excepción.&lt;/p&gt;

&lt;p&gt;Primero que todo, pensar siquiera que puedes modificar y tomar ventaja sobre una base de datos SQL sin entender tan siquiera como es la estructura de una consulta SQL suena ridículo, reconozco que fué algo que no se me pasaba por la cabeza al momento de intentarlo. Nunca entendí por qué en los vídeos tutoriales y textos todo funcionaba sin ningún problema, pero al momento de intentarlo, nunca obtenía ningún resultado.&lt;/p&gt;

&lt;p&gt;También reconozco que no fué un momento de iluminación en el que reconocí mi error y llegue al camino correcto mágicamente, realmente por cuestiones de trabajo recibí un proyecto donde debía continuar con un programa que hacía consultas a una Base de Datos SQL para verificar las salas de un evento virtual a las que se tenía acceso dependiendo del rol de cada persona, y fue hasta este momento que realmente empecé a entender los motivos por los que los esfuerzos que había hecho al intentar entender el mundo de las inyecciones SQL nunca había llegado a un feliz término.&lt;/p&gt;

&lt;p&gt;Por último, quiero dejar plasmado en este documenta la forma en que considero que se puede llegar a aprender a realizar inyecciones SQL de la forma más eficiente y la cual me hubiera ahorrado perder tanto tiempo creyendo que ’ OR 1=1– era el inicio, cuando realmente es el final de un camino supremamente interesante.  &lt;/p&gt;

&lt;p&gt;Antes de iniciar, debo agregar que gracias a PortSwigger Academy, a su estructura e increíble contenido, fue que finalmente pude conectar todos los puntos, llegando al punto en que por fín me sentía cómodo hablando y explotando esta vulnerabilidad en diversos laboratorios. Recomiendo sinceramente este curso gratuito (el cual es solo el primero de más de 14 vulnerabilidades), y  confieso que sus laboratorios son un reto, así como el mejor  lugar para poner en práctica el conocimiento obtenido.&lt;/p&gt;

&lt;h1&gt;
  
  
  Consultas SQL
&lt;/h1&gt;

&lt;p&gt;SQL (Structured Query Language), es un lenguaje estándar para acceder y manipular información en bases de datos.&lt;br&gt;
Existen distintos tipos de bases de datos que utilizan en gran medida esta estándar, a continuación te menciono algunos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MySQL.&lt;/li&gt;
&lt;li&gt;SQL Server.&lt;/li&gt;
&lt;li&gt;Microsoft Access.&lt;/li&gt;
&lt;li&gt;Oracle.&lt;/li&gt;
&lt;li&gt;Postgres.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dentro de estas bases de datos no solo tenemos la capacidad de consultar, también nos permite realizar cálculos relacionales y nos permite el manejo del álgebra.&lt;/p&gt;

&lt;p&gt;En este lenguaje manejamos una o varias base de datos compuesta por tablas, que a su vez están compuestas por filas y columnas, por ponerlo en términos sencillos. Por cuestiones prácticas no vamos a profundizar en las cientos de características que componen este lenguaje, pero si vamos a enunciar la forma básica en que se puede hacer una consulta en términos generales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lenguaje de manipulación de datos DML
&lt;/h3&gt;

&lt;p&gt;Data Manipulation Language por su siglas en inglés, nos permite realizar consultas o manipulación de los datos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SELECT:&lt;/strong&gt; Seleccionar datos almacenados en una base de datos.&lt;br&gt;
&lt;strong&gt;FROM:&lt;/strong&gt; Nos permite indicar la tabla o tablas a las cuales se les va a realizar la consulta.&lt;br&gt;
&lt;strong&gt;WHERE:&lt;/strong&gt; Condición que deben cumplir los datos a devolver en la consulta.&lt;br&gt;
&lt;strong&gt;AND y OR:&lt;/strong&gt; Conectores lógicos.&lt;br&gt;
&lt;em&gt;**:&lt;/em&gt;* Comodín utilizado para que la consulta nos devuelve todos los campos existentes en la tabla.&lt;br&gt;
&lt;strong&gt;–:&lt;/strong&gt; el doble guión es un indicador de comentario, lo que nos indica que desde estos dos símbolos hacia adelante en la línea, se tomará como un comentario, el cual no hace parte de la consulta.&lt;/p&gt;

&lt;p&gt;Nota: Las buenas prácticas nos recomienda escribir estas palabras clave en mayúsculas, esto también nos ayuda a diferenciarlas al momento de escribir y leer una consulta SQL.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;code&gt;SELECT * FROM products WHERE category = ‘carros’ AND available = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esta consulta puede ser realizada en una página de artículos, donde se quiera retornar toda la información (denotado por el símbolo “*”), de la tabla “products”, donde la columna “category” sea igual a carros y que también contenga la columna “available” igual a 1. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM users WHERE username=’administrator’ AND password=’password123’&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esta consulta puede ser usada para verificar que que la contraseña ingresada pertenezca al usuario especificado, en este caso se consulta la tabla “users” para confirmar que la clave de la cuenta “administrador” sea igual a “password123”.&lt;/p&gt;

&lt;h1&gt;
  
  
  ¿Qué es una inyección SQL?
&lt;/h1&gt;

&lt;p&gt;La inyección SQL (iSQL/SQL inyection), es una vulnerabilidad web, la cual se basa en interferir las consultas que una aplicación hace a su base de datos por parte de un atacante. Las consecuencias de esta vulnerabilidad pueden variar, pero generalmente inician con la consulta de información de la base de datos que normalmente no se estaría autorizado a visualizar. Esto puede ir desde información restringida de un blog, hasta los usuarios, contraseñas e incluso información de tarjetas de crédito.&lt;br&gt;
En muchos casos, esta vulnerabilidad puede llevar a la modificación o eliminación de la información de la base de datos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de Inyección SQL:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;In Band (Classic).&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Error.&lt;/li&gt;
&lt;li&gt;Union.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inferential (Blind).&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boolean.&lt;/li&gt;
&lt;li&gt;Time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Out of Band.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Primera Inyección SQL
&lt;/h1&gt;

&lt;p&gt;Dejando al lado un poco la teoría y adentrándonos un poco más a la práctica, quiero mencionar un poco el proceso básico para realizar una inyección SQL.&lt;/p&gt;

&lt;p&gt;Tomando nuevamente el ejemplo anterior de consulta de contenido de una categoría a una página con distintos artículos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM products WHERE category = ‘carros’ AND available = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Donde posiblemente en la url del sitio podríamos observar lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://manuelmontoya.info/blog/products?category=carros"&gt;https://manuelmontoya.info/blog/products?category=carros&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora que podemos visualizar fácilmente el lugar que va a tomar la variable “carros” dentro de la consulta a la base de datos, y es en este punto donde podemos iniciar nuestro camino para evaluar si esta consulta puede conllevar a un vulnerabilidad de inyección SQL.&lt;/p&gt;

&lt;p&gt;No solo debemos evaluar si esta consulta es o no vulnerable, adicionalmente debemos evaluar a qué tipo de inyección SQL es vulnerable, así como cuál es el mejor método de explotarlo.&lt;/p&gt;

&lt;p&gt;Aunque no siempre funciona, la forma más sencilla de evaluar si un parámetro puede ser vulnerable a una inyección SQL es ingresando el símbolo de comilla simple (‘), el cual puede resultar en un mensaje de error dentro de la página web, más adelante nos adentraremos en situaciones más complejas para identificar este tipo de vulnerabilidades.&lt;/p&gt;

&lt;p&gt;Ahora podemos ver que este mismo símbolo de comillas simples es usado para delimitar el parámetro ‘carros’ en la consulta. Con esto en mente, podemos empezar a pensar cómo modificar y explotar esta vulnerabilidad.&lt;/p&gt;

&lt;p&gt;Partiendo del hecho que conocemos que esta consulta puede ser vulnerable, podemos hacer una prueba inicial, buscando que la consulta no solo retorne una categoría “carros”, sino que devuelva todas las categorías de la base de datos, esto lo podemos lograr utilizando las comillas simples, las cuales nos permitirán engañar a la aplicación y el doble guión, el cual nos permite hacer pensar a la aplicación que el texto que sigue a estos símbolos es un comentario y no debe ser ejecutado.&lt;/p&gt;

&lt;p&gt;Consulta original:&lt;br&gt;
&lt;code&gt;SELECT * FROM products WHERE category = ‘carros’ AND available = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Consulta alterada:&lt;br&gt;
&lt;code&gt;SELECT * FROM products WHERE category = ‘carros’ OR 1=1– ’ AND available = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Añadiendo (‘ OR 1=1) posterior a la palabra carros, podemos cambiar la estructura de la consulta, haciendo que realmente se esté evaluando la siguiente condición:&lt;/p&gt;

&lt;p&gt;Retorne de la tabla products los artículos que contengan en la columna category el texto carros o que 1 sea igual a 1.&lt;/p&gt;

&lt;p&gt;Cuando pensamos un poco esta consulta, podemos observar que cualquier consulta que se le haga a la tabla products va a ser verdadero, ya que no importa si contiene el texto carros, ya que la siguiente condición siempre va a ser verdadero (1=1), lo que automáticamente vuelve verdadera cualquier consulta y retornará todos los datos de la tabla sin importar qué categoría tengan asignada. &lt;/p&gt;

&lt;h1&gt;
  
  
  Identificando el tipo de base de datos
&lt;/h1&gt;

&lt;p&gt;Debemos entender que aunque SQL es considerado un estándar para acceder y manipular información en bases de datos, debemos aclarar que hay diferencias en la forma que se deben realizar consultas, por esta razón, es una buena idea identificar el tipo de base de datos que estamos atacando para obtener los mejores resultados y al momento de encontrarnos con un problema, podemos estar seguro que nuestro error es en la estructura de la inyección y no en la estructuración errónea de esta debido a una confusión en el tipo de base de datos atacada.&lt;/p&gt;

&lt;p&gt;A continuación enunciaré la forma de identificarlos 4 tipos de bases de datos más comunes con los que nos podemos encontrar.&lt;/p&gt;

&lt;p&gt;MySQL: SELECT @&lt;a class="mentioned-user" href="https://dev.to/version"&gt;@version&lt;/a&gt;&lt;br&gt;
PostgreSQL: SELECT version()&lt;br&gt;
Oracle: SELECT banner FROM v$version&lt;br&gt;
Oracle: SELECT version FROM v$instance&lt;br&gt;
Microsoft: SELECT @&lt;a class="mentioned-user" href="https://dev.to/version"&gt;@version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adicional, te dejo el link de una página de ayuda, que te puede mostrar las diferentes formas de realizar una inyección SQL dependiendo del tipo de base de datos que te encuentres, es parte del curso SQL Injection de PortSwigger Academy, el cual recomiendo seguir para afianzar los conocimientos y practicar en sus numerosos laboratorios cada procedimiento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://portswigger.net/web-security/sql-injection/cheat-sheet"&gt;SQL injection cheat sheet | Web Security Academy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La información de esta publicación, puede ser adaptada al tipo de base de datos que requieras utilizando la página anterior perteneciente a PortSwigger Academy, y así ejecutar correctamente las inyecciones SQL referenciadas en esta publicación.&lt;/p&gt;

&lt;h1&gt;
  
  
  Retornando información valiosa
&lt;/h1&gt;

&lt;p&gt;En estos momentos se puede pensar en lo poco valiosa que puede ser la información obtenida en el ejemplo anterior, por esta razón, iniciamos el proceso para retornar información que puede ser mucho más valiosa al momento de evaluar la seguridad de una aplicación web.&lt;/p&gt;

&lt;p&gt;Primero que todo, debemos entender una funcionalidad adicional, la forma de agregar o unir nuestra consulta a la consulta predefinida en la aplicación.&lt;/p&gt;

&lt;h1&gt;
  
  
  Ataques UNION
&lt;/h1&gt;

&lt;p&gt;Determinar el número de columnas requeridas para ejecutar el ataque&lt;/p&gt;

&lt;p&gt;Posterior a determinar que se puede explotar esta vulnerabilidad, damos un paso adelante en nuestro proceso e intentamos retornar información como el usuario y las contraseñas de una tabla en la base de datos, por tal motivo, debemos primero saber de cuantas columnas está compuesta la consulta de la cual queremos tomar ventaja. Este procedimiento lo podemos realizar añadiendo SELECT y NULL las veces que sea necesario para que la aplicación deje de generar errores por la modificación de la consulta y nos muestre algo como (UNION SELECT NULL,NULL–).&lt;/p&gt;

&lt;p&gt;Esto lo conseguimos inyectando valores NULL en la consulta de la siguiente forma:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM products WHERE category = ‘’ UNION SELECT NULL,NULL–’ AND available = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Perfecto, ahora ya sabemos que la tabla de la cual queremos sacar provecho tiene 2 columnas, ahora debesas averiguar cual de estas columnas retorna un valor string, ya que son de este tipo los datos de usuario y contraseña que queremos visualizar, esto lo hacemos simplemente reemplazando los valores de NULL por strings dentro de comillas simples:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM products WHERE category = ‘’ UNION SELECT ‘AAA’,NULL–’ AND available = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Este procedimiento lo realizamos con cada valor de NULL para evaluar si podemos recuperar información tipo string desde estos parámetros. En este caso concluimos que ambos parámetros retornan el string ingresado, lo cual nos confirma que podemos hacer uso de estos para retornar la información que queremos.&lt;br&gt;
Esto lo podemos realizar haciendo un llamado a la tabla users y retornando los valores de las columnas username y password:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM products WHERE category = ‘’ UNION SELECT username,password FROM users–’ AND available = 1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;’ UNION SELECT username,password FROM users–:&lt;/strong&gt; Esta consulta nos retorna los usuarios y contraseñas en la posición que lo hubiera hecho la consulta original dentro de la página.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inyección SQL Blind
&lt;/h2&gt;

&lt;p&gt;Próximamente…&lt;/p&gt;

</description>
      <category>security</category>
      <category>linux</category>
      <category>spanish</category>
      <category>sql</category>
    </item>
  </channel>
</rss>
