<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/feed_style.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="https://www.rssboard.org/media-rss">
  <channel>
    <title>Tutorial on El blog de Ignacio</title>
    <link>https://www.igalvan.es/tags/tutorial/</link>
    <description>Recent content in Tutorial on El blog de Ignacio</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>es</language>
    <copyright>Ignacio Galván Vitas</copyright>
    <lastBuildDate>Tue, 11 Oct 2022 19:00:00 +0100</lastBuildDate><atom:link href="https://www.igalvan.es/tags/tutorial/index.xml" rel="self" type="application/rss+xml" /><icon>https://www.igalvan.es/logo.svg</icon>
    
    
    <item>
      <title>Rundeck integrado con Apereo CAS (Parte 1)</title>
      <link>https://www.igalvan.es/posts/rundeck-apereo-cas-parte-1/</link>
      <pubDate>Tue, 11 Oct 2022 19:00:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/rundeck-apereo-cas-parte-1/</guid>
      <description><![CDATA[<p>Rundeck se ha convertido en una herramienta imprescindible y que me permite automatizar una enorme cantidad de procesos de una forma sencilla. Si tengo que buscarle un pero es que como todo software que tiene una versión de fuentes abiertas y otra versión &ldquo;profesional&rdquo; de código cerrado y licencia muy cara, es que las mejores opciones, evidentemente, siempre están en la versión de pago. De casi todas ellas se puede prescindir pero hay una que siempre me frustra cuando no está disponible, el SSO.</p>
<p>Así que hoy vamos a ver cómo integrar nuestro SSO de cabecera con esta herramienta a través de un módulo de Apache y de paso vamos a proveerle de un proxy inverso que nos dé encriptación TLS de las comunicaciones.</p>
<h2 id="listado-de-episodios">Listado de episodios</h2>
<ul>
<li><a href="/2022/10/11/rundeck-apereo-cas-parte-1.html">Parte 1</a>.</li>
</ul>
<h2 id="esquema-del-laboratorio">Esquema del laboratorio</h2>
<p>Como siempre, el primer paso es detallar nuestra arquitectura.</p>
<p>Como plataforma de virtualización se ha utilizado KVM sobre Debian 11 pero se puede hacer con cualquier otra como VirtualBox, VMWare o Hyper-V.</p>
<p><img src="/images/2022/20221011-rundeck-apereo-cas-parte-1-img_1.png" alt="image-20221011-rundeck-apereo-cas-parte-1-img_1"></p>
<p>Todos los servidores están desplegados sobre CentOS 7.9 de 64 bits excepto el desktop que es una Debian 11 de 64 bits. En cuanto al resto de componentes:</p>
<ul>
<li>El Apache desplegado es el propio del repositorio estándar de CentOS.</li>
<li>Rundeck Community se ha desplegado en la version 4.7.0.</li>
<li>389DS se ha desplegado en la versión 1.3.10.</li>
<li>Apereo CAS se ha desplegado desde la plantilla de CAS overlay en su versión 6.6.0.</li>
</ul>
<p>Para el direccionamiento de red se ha usado un segmento de red de clase C en el segmente 192.168.122.0/24 con direccionamiento estático asignado a las máquinas.</p>
<p>La distribución final de los equipos en el laboratorio será la siguiente:</p>
<ul>
<li>Servidor 389DS. 2 GB de RAM, 2 vCPU y 40 GB de disco. Dirección IP: 192.168.122.11.</li>
<li>Servidor Apereo CAS. 2 GB de RAM, 2vCPU y 40 GB de disco. Dirección IP: 192.168.122.12.</li>
<li>Servidor Rundeck y Apache. 2 GB de RAM, 2vCPU y 40 GB de disco. Dirección IP: 192.168.122.13.</li>
<li>Estación de trabajo. 2 GB de RAM, 2vCPU y 40 GB de disco. Dirección IP: 192.168.122.2.</li>
</ul>
<p>Como siempre voy a suponer que sabéis cómo instalar los sistemas operativos, 389DS, Apereo CAS y Rundeck por lo que no voy a explicar esta parte. Al fin y al cabo si estáis leyendo esto entiendo que si estás leyendo este artículo es porque ya sabes todo esto.</p>
<p>Hasta el siguiente episodio.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Montar un fichero qcow2 en Linux</title>
      <link>https://www.igalvan.es/posts/montar-qcow2-en-linux/</link>
      <pubDate>Sun, 27 Mar 2022 19:00:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/montar-qcow2-en-linux/</guid>
      <description><![CDATA[<p>Hoy vamos a hacer algo sencillo pero que siempre se me olvida como se hace cuando más lo necesito, montar un volumen qcow2 de una máquina virtual para obtener alguno fichero o información que se encuentra dentro.</p>
<h2 id="activar-el-modulo-nbd">Activar el modulo NBD</h2>
<p>Lo primero es cargar el módulo NBD que nos permitirá conectar el fichero qcow2 como un dispositivo de disco más del sistema.</p>
<p>{% highlight bash %}</p>
<p>igalvit@server:/vms/kvm$ sudo modprobe nbd max_part=8</p>
<p>{% endhighlight %}</p>
<h2 id="montar-el-fichero-qcow2">Montar el fichero qcow2</h2>
<p>Una vez que ya tenemos el módulo cargado tenemos que conectar el fichero qcow2, en mi caso se trata de un disco virtual de una máquina CentOS 7.</p>
<p>{% highlight bash %}</p>
<p>igalvit@server:/vms/kvm$ sudo qemu-nbd &ndash;connect=/dev/nbd0 /vms/kvm/centos7.qcow2</p>
<p>{% endhighlight %}</p>
<h2 id="ver-las-particiones-disponibles">Ver las particiones disponibles</h2>
<p>En este punto ya hemos montado el disco pero no sabemos qué contiene, así que vamos a visualizarlo para posteriormente elegir la partición que nos interesa.</p>
<p>{% highlight bash %}</p>
<p>igalvit@server:/vms/kvm$ sudo fdisk /dev/nbd0 -l
Disco /dev/nbd0: 20 GiB, 21474836480 bytes, 41943040 sectores
Unidades: sectores de 1 * 512 = 512 bytes
Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
Tipo de etiqueta de disco: dos
Identificador del disco: 0x000a1f9c</p>
<p>Dispositivo Inicio Comienzo    Final Sectores Tamaño Id Tipo
/dev/nbd0p1 *          2048  2099199  2097152     1G 83 Linux
/dev/nbd0p2         2099200 41943039 39843840    19G 8e Linux LVM</p>
<p>{% endhighlight %}</p>
<h2 id="montar-la-partición">Montar la partición</h2>
<p>En nuestro caso se trata de un volumen LVM por lo que lleva un poco más de trabajo del habitual.</p>
<p>{% highlight bash %}</p>
<p>igalvit@server:/vms/kvm$ sudo vgscan
Found volume group &ldquo;centos_centos7&rdquo; using metadata type lvm2
Found volume group &ldquo;ubuntu_vg&rdquo; using metadata type lvm2</p>
<p>igalvit@server:/vms/kvm$ sudo vgchange -ay centos_centos7
2 logical volume(s) in volume group &ldquo;centos_centos7&rdquo; now active</p>
<p>igalvit@server:/vms/kvm$ sudo lvs
LV   VG             Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
root centos_centos7 -wi-a&mdash;&ndash; &lt;17,00g                                                 <br>
swap centos_centos7 -wi-a&mdash;&ndash;   2,00g                                                 <br>
root ubuntu_vg      -wi-ao&mdash;- 921,00g                                                 <br>
swap ubuntu_vg      -wi-ao&mdash;-  &lt;9,28g</p>
<p>igalvit@server:/vms/kvm$ sudo mount /dev/centos_centos7/root /mnt -o ro,user</p>
<p>{% endhighlight %}</p>
<h2 id="visualizar-el-contenido-de-un-fichero">Visualizar el contenido de un fichero</h2>
<p>Como esto es una prueba no vamos a hacer nada complicado, simplemente vamos a visualizar el fichero de la versión de la distribución de CentOS instalada.</p>
<p>{% highlight bash %}</p>
<p>igalvit@server:/vms/kvm$ cd /mnt</p>
<p>igalvit@server:/mnt$ ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr</p>
<p>igalvit@server:/mnt$ cat etc/redhat-release
CentOS Linux release 7.9.2009 (Core)</p>
<p>{% endhighlight %}</p>
<h2 id="desmontarlo-todo">Desmontarlo todo</h2>
<p>Una vez terminada la tareas ha llegado la hora de recoger velas.</p>
<p>{% highlight bash %}</p>
<p>igalvit@server:/$ sudo umount /mnt</p>
<p>igalvit@server:/$ sudo vgchange -an centos_centos7
0 logical volume(s) in volume group &ldquo;centos_centos7&rdquo; now active</p>
<p>igalvit@server:/$ sudo qemu-nbd &ndash;disconnect /dev/nbd0
/dev/nbd0 disconnected</p>
<p>{% endhighlight %}</p>
<p>Y con esto damos por finalizado este artículo.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Integrar Exchange 2019 con Apereo CAS mediante ADFS (Parte 5)</title>
      <link>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-5/</link>
      <pubDate>Fri, 25 Mar 2022 17:20:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-5/</guid>
      <description><![CDATA[<p>Hoy llegamos a la parte 5 donde veremos alguna prueba del resultado final y algunos cambios interesantes que pueden mejorar la experiencia de usuario.</p>
<h2 id="acceso-al-owa">Acceso al OWA</h2>
<p>El acceso al OWA lo haremos como siempre, accediendo por la URL que hayamos definido para este servicio que en nuestro caso es <a href="https://exlab.olimpo.lab/owa">https://exlab.olimpo.lab/owa</a>.</p>
<p>Cuando accedamos en vez de mostrarnos el formulario clásico del OWA veremos una página llamada Home Realm Discovery donde deberemos seleccionar el proveedor que vamos a usar para autenticarnos, que en nuestro caso será apereolab.olimpo.lab.</p>
<p><img src="/images/2022/20220325-exchange-adfs-apereo-cas-parte-5-img_2.png" alt="image-20220325-exchange-adfs-apereo-cas-parte-5-img_2"></p>
<p>Al hacer eso accederemos al formulario del CAS donde introducieremos las credenciales de acceso. Bastante sencillo, ¿no?</p>
<p><img src="/images/2022/20220325-exchange-adfs-apereo-cas-parte-5-img_3.png" alt="image-20220325-exchange-adfs-apereo-cas-parte-5-img_3"></p>
<p>Pues vamos a introducir una mejora, en realidad a nosotros ya no nos interesa que el usuario se valide mediante Directorio Activo o que tenga que seleccionar un proveedor de identididades por que con estos dos comandos de PowerShell vamos a forzar que el proveedor sea el CAS.</p>
<p>{% highlight posh %}
Set-AdfsRelyingPartyTrust -TargetName &ldquo;Outlook on the web&rdquo; -ClaimsProviderName &ldquo;apereolab.olimpo.lab&rdquo;
Set-AdfsRelyingPartyTrust -TargetName &ldquo;Exchange Control Panel&rdquo; -ClaimsProviderName &ldquo;apereolab.olimpo.lab&rdquo;
{% endhighlight %}</p>
<h2 id="una-mejora-de-última-hora">Una mejora de última hora</h2>
<p>Ya había terminado de redactar este tutorial cuando realizando un par de pruebas encontré la forma de evitar que al cerrar sesión se muestre este mensaje tan feo.</p>
<p><img src="/images/2022/20220325-exchange-adfs-apereo-cas-parte-5-img_1.png" alt="image-20220325-exchange-adfs-apereo-cas-parte-5-img_1"></p>
<p>Todo lo que hay que hacer es editar el fichero <code>cas.properties</code> de nuestro CAS y añadir la siguiente línea:</p>
<p>{% highlight conf %}
cas.authn.saml-idp.logout.sign-logout-response=true
{% endhighlight %}</p>
<p>Reiniciamos el CAS y listo, problema solucionado.</p>
<p><img src="/images/2022/20220325-exchange-adfs-apereo-cas-parte-5-img_4.png" alt="image-20220325-exchange-adfs-apereo-cas-parte-5-img_4"></p>
<p>Y con esto damos por terminado este tutorial. Cualquier comentario, ya sabéis, a través de mis redes sociales.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Integrar Exchange 2019 con Apereo CAS mediante ADFS (Parte 4)</title>
      <link>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-4/</link>
      <pubDate>Tue, 22 Mar 2022 16:19:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-4/</guid>
      <description><![CDATA[<p>Hoy llegamos a la parte 4 donde explicaremos la configuración de la parte de Apereo CAS. En nuestro caso hemos utilizado, como habíamos comentando anteriormente, el CAS Overlay porque simplica el trabajo de configuración y despliegue del Apereo CAS. Suponiendo que hayas descargado la última versión desde GitHub, vamos a tocar los siguientes ficheros:</p>
<ul>
<li>/etc/cas/config/cas.properties.</li>
<li>/etc/cas/services/cas_saml-100.json.</li>
<li>/etc/cas/services/adfs-101.json.</li>
<li>/etc/cas/metadata/adfs-metadata.xml.</li>
</ul>
<h2 id="antes-de-comenzar">Antes de comenzar</h2>
<p>En el fichero build.gradle del CAS Overlay se han añadido las implementaciones de IDP, JSON Service Registry y LDAP. Posteriormente hemos ejecutado el comando <code>./gradlew clean build</code> para crear el fichero WAR que usaremos. Para ejecutar el CAS hemos usado el comando <code>java -jar build/lib/cas.war</code></p>
<p>También tendremos que crear un usuario que nos permita autenticar contra Directorio Activo para poder obtener la información de los usuarios. En el caso de este laboratorio el usuario creado es &ldquo;APEREO USER&rdquo;.</p>
<h2 id="fichero-etccasconfigcasproperties">Fichero /etc/cas/config/cas.properties</h2>
<p>{% highlight conf %}
as.server.name=https://apereolab.olimpo.lab:8443
cas.server.prefix=${cas.server.name}/cas
logging.config=file:/etc/cas/config/log4j2.xml
cas.authn.saml-idp.core.entity-id=https://apereolab.olimpo.lab/idp
cas.service-registry.json.location: file:/etc/cas/services
cas.authn.ldap[0].order=1
cas.authn.ldap[0].name=AD-OLIMPO
cas.authn.ldap[0].ldap-url=ldap://exlab.olimpo.lab:389
cas.authn.ldap[0].base-dn=dc=olimpo,dc=lab
cas.authn.ldap[0].bind-dn=CN=APEREO USER,OU=Administrators,DC=olimpo,DC=lab
cas.authn.ldap[0].bind-credential=&lt;TU_PASSWORD&gt;
cas.authn.ldap[0].type=AUTHENTICATED
cas.authn.ldap[0].subtreeSearch=true
cas.authn.ldap[0].searchFilter=(&amp;(objectClass=person)(sAMAccountName={user}))
cas.authn.ldap[0].principalAttributeList=sAMAccountName,mail,userPrincipalName
{% endhighlight %}</p>
<h2 id="fichero-etccasservicescas_saml-100json">Fichero /etc/cas/services/cas_saml-100.json</h2>
<p>Aquí nuevamente hemos hecho un poco de trampas para que capture cualquier URL.</p>
<p>{% highlight conf %}
{
&ldquo;@class&rdquo;: &ldquo;org.apereo.cas.services.RegexRegisteredService&rdquo;,
&ldquo;serviceId&rdquo;: &ldquo;http://.+&rdquo;,
&ldquo;name&rdquo; : &ldquo;cas_saml&rdquo;,
&ldquo;id&rdquo; : 100,
&ldquo;evaluationOrder&rdquo; : 100
}
{% endhighlight %}</p>
<h2 id="fichero-etccasservicesadfs-101json">Fichero /etc/cas/services/adfs-101.json</h2>
<p>{% highlight conf %}
{
&ldquo;@class&rdquo;: &ldquo;org.apereo.cas.support.saml.services.SamlRegisteredService&rdquo;,
&ldquo;serviceId&rdquo;: &ldquo;<a href="http://fs.olimpo.lab/adfs/services/trust%22">http://fs.olimpo.lab/adfs/services/trust&quot;</a>,
&ldquo;name&rdquo;: &ldquo;adfs&rdquo;,
&ldquo;id&rdquo;: 101,
&ldquo;evaluationOrder&rdquo;: 101,
&ldquo;description&rdquo;: &ldquo;adfs lab service&rdquo;,
&ldquo;logoutType&rdquo;: &ldquo;NONE&rdquo;,
&ldquo;attributeReleasePolicy&rdquo;: {
&ldquo;@class&rdquo;: &ldquo;org.apereo.cas.services.ReturnAllAttributeReleasePolicy&rdquo;,
},
&ldquo;usernameAttributeProvider&rdquo; : {
&ldquo;@class&rdquo; : &ldquo;org.apereo.cas.services.PrincipalAttributeRegisteredServiceUsernameProvider&rdquo;,
&ldquo;usernameAttribute&rdquo; : &ldquo;mail&rdquo;,
},
&ldquo;requiredNameIdFormat&rdquo;: &ldquo;urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress&rdquo;,
&ldquo;metadataLocation&rdquo;: &ldquo;/etc/cas/metadata/adfs-metadata.xml&rdquo;,
&ldquo;signAssertions&rdquo;: true,
&ldquo;signResponses&rdquo;: false
}
{% endhighlight %}</p>
<h2 id="fichero-etccasmetadataadfs-metadataxml">Fichero /etc/cas/metadata/adfs-metadata.xml</h2>
<p>Este fichero se obtiene desde ADFS. Concretamente se debe acceder a la ruta <a href="https://fs.olimpo.lab/FederationMetadata/2007-06/FederationMetadata.xml">https://fs.olimpo.lab/FederationMetadata/2007-06/FederationMetadata.xml</a> y descargar el fichero XML para luego copiarlo en esta ruta.</p>
<h2 id="directorio-etccassaml">Directorio /etc/cas/saml</h2>
<p>Contiene la definición del IDP, certificado de firma, encriptación, etc.</p>
<p>{% highlight shell %}
ls
idp-encryption.crt  idp-encryption.key  idp-metadata.xml  idp-signing.crt  idp-signing.key  metadata-backups
{% endhighlight %}</p>
<p>Ya en la parte siguiente veremos algunas pruebas de funcionamiento y algunas mejoras que se pueden hacer para que todo vaya más fluido. Hasta el próximo episodio.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Integrar Exchange 2019 con Apereo CAS mediante ADFS (Parte 3)</title>
      <link>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-3/</link>
      <pubDate>Fri, 18 Mar 2022 16:19:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-3/</guid>
      <description><![CDATA[<p>Hoy llegamos a la parte 3 donde completaremos la configuración de la parte de ADFS realizado la parte correspondiente a los proveedores de confianza de notificaciones o Claims Providers Trusts.</p>
<h2 id="claims-providers-trusts">Claims Providers Trusts</h2>
<p>Hemos llamado &ldquo;apereolab.olimpo.lab&rdquo; a la relación de confianza y para su generación hemos utilizado los metadatos públicados en la siguiente URL del CAS <a href="https://apereolab.olimpo.lab:8443/cas/idp/metadata">https://apereolab.olimpo.lab:8443/cas/idp/metadata</a>. Esto nos facilita mucho el trabajo porque ya se encarga de realizar el resto de la configuración de esta relación de confianza.</p>
<p>A continuación mostramos dos capturas de pantalla de las dos pestañas más importantes. Recuerda que esta configuración puede variar en función de la configuración que tengas en el Apereo CAS.</p>
<p>La primera captura es de la pestaña Monitoring donde figura la URL de los metadatos junto con la configuración para que se actualice automáticamente la información.</p>
<p><img src="/images/2022/20220318-exchange-adfs-apereo-cas-parte-3-img_3.png" alt="image-20220318-exchange-adfs-apereo-cas-parte-3-img_3"></p>
<p>La segunda captura muestra la configuración de la pestaña que contiene los puntos finales o Endpoints.</p>
<p><img src="/images/2022/20220318-exchange-adfs-apereo-cas-parte-3-img_4.png" alt="image-20220318-exchange-adfs-apereo-cas-parte-3-img_4"></p>
<h2 id="acceptance-transform-rules">Acceptance Transform Rules</h2>
<p>Solo vamos a tener un regla de transformación de notificación entrante para NameID que va a ser de tipo Email e indicaremos que pase a través todos los valores de las notificaciones. Recuerda que anteriormente ya hemos comentado que nos vamos a fiar que desde Apereo nos van a enviar una dirección de correo electrónico que existe en el Exchange Server y que además va a coincidir con el UPN de un usuario. Sí, es un poco de trampa, lo sé. 😋</p>
<p><img src="/images/2022/20220318-exchange-adfs-apereo-cas-parte-3-img_2.png" alt="image-20220318-exchange-adfs-apereo-cas-parte-3-img_2"></p>
<p>Por si quereis echarle un vistazo a la consulta que se genera, es la siguiente:</p>
<p>{% highlight query %}
c:[Type == &ldquo;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier&rdquo;, Properties[&ldquo;http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format&rdquo;] == &ldquo;urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress&rdquo;]
=&gt; issue(claim = c);
{% endhighlight %}</p>
<p>Y ya con esto nos vemos en el próximo capítulo donde hablaremos de la parte del Apereo CAS.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Integrar Exchange 2019 con Apereo CAS mediante ADFS (Parte 2)</title>
      <link>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-2/</link>
      <pubDate>Thu, 17 Mar 2022 17:43:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-2/</guid>
      <description><![CDATA[<p>Bueno ya vimos en la parte 1 la descripción del laboratorio donde vamos a implementar nuestro nuevo Exchange Server autenticado contra el CAS de Apereo a través de ADFS.</p>
<p>Vamos a suponer que ya tienes un controlador de dominio operativo, en nuestro caso sobre el dominio OLIMPO y que además ya cuentas con al menos un Exchange Server 2019 en marcha, recuerda que en este laboratorio está integrado en el mismo servidor que el controlador de dominio, es decir, en exlab.olimpo.lab.</p>
<h2 id="configuración-de-la-federación-adfs">Configuración de la federación ADFS</h2>
<p>La federación de mi laboratorio está desplegada sobre el servidor adfslab.olimpo.lab y tiene la configuración que se muestra en la siguiente captura. Realmente se trata de la configuración por defecto donde el único cambio reseñable es que la federación tiene como nombre <a href="http://fs.olimpo.lab">http://fs.olimpo.lab</a> simplemente para diferenciarla del nombre del servidor que la alberga.</p>
<p><img src="/images/2022/20220317-exchange-adfs-apereo-cas-parte-2-img_1.png" alt="image-20220317-exchange-adfs-apereo-cas-parte-2-img_1"></p>
<h2 id="relaying-trust-parties">Relaying Trust Parties</h2>
<p>En nuestro caso se van a generar dos relaciones de relaciones de confianza, una para Outlook Web App (OWA) y la otra para Exchange Control Panel (ECP). A la primera le hemos puesto el nombre de &ldquo;Outlook on the web&rdquo; y a la segunda &ldquo;Exchange Control Panel&rdquo;.</p>
<p>Recuerda que estos son los únicos servicios de Exchange que se pueden federar ya que tanto EAS como Outlook deben autenticarse mediante Directorio Activo.</p>
<h3 id="outlook-on-the-web">Outlook on the web</h3>
<p>Como se puede observa la segunda relación de confianza es casi igual que la primera solo que para el ECP. En la siguiente captura se puede observar la configuración de los identificadores que solo es uno hacia la URL del OWA.</p>
<p><img src="/images/2022/20220317-exchange-adfs-apereo-cas-parte-2-img_3.png" alt="image-20220317-exchange-adfs-apereo-cas-parte-2-img_3"></p>
<p>En esta captura se puede observar la configuración de los puntos finales. En realidad solo tenemos uno de tipo POST hacia la URL de OWA.</p>
<p><img src="/images/2022/20220317-exchange-adfs-apereo-cas-parte-2-img_4.png" alt="image-20220317-exchange-adfs-apereo-cas-parte-2-img_4"></p>
<h3 id="exchange-control-panel">Exchange Control Panel</h3>
<p>Como se puede observa la segunda relación de confianza es casi igual que la primera solo que para el ECP. En la siguiente captura se puede observar la configuración de los identificadores que en este caso también es solo uno hacia la URL del ECP.</p>
<p><img src="/images/2022/20220317-exchange-adfs-apereo-cas-parte-2-img_5.png" alt="image-20220317-exchange-adfs-apereo-cas-parte-2-img_5"></p>
<p>En esta captura se puede observar la configuración de los puntos finales. Como en el primer caso solo tenemos uno de tipo POST hacia la URL del ECP.</p>
<p><img src="/images/2022/20220317-exchange-adfs-apereo-cas-parte-2-img_6.png" alt="image-20220317-exchange-adfs-apereo-cas-parte-2-img_6"></p>
<h2 id="issuance-transform-rules">Issuance Transform Rules</h2>
<p>En las reglas de transformación de notificaciones tenemos dos reglas, una para el UPN y otra para obtener el PrimarySID mediante uan búsqueda en el repositorio de Directorio Activo. Ambas reglas son exactamente iguales en ambas relaciones de confianza por lo que solo las describiremos una vez.</p>
<p><img src="/images/2022/20220317-exchange-adfs-apereo-cas-parte-2-img_2.png" alt="image-20220317-exchange-adfs-apereo-cas-parte-2-img_2"></p>
<h3 id="regla-upn">Regla UPN</h3>
<p>En esta primera regla simplemente obtenemos la notificación entrante NameIdentifier que es de tipo email (esto lo veremos cuando configuremos el CAS) y emito una nueva notificación de tipo UPN con el valor que me llega.</p>
<p>{% highlight query %}
c:[Type == &ldquo;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier&rdquo;]
=&gt; issue(Type = &ldquo;<a href="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn%22">http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn&quot;</a>, Value = c.Value);
{% endhighlight %}</p>
<p>Es verdad que esto es bastante deficiente y estoy confiando en que me llegue la notificación con una dirección de correo valida y que coincida con el UPN del usuario en Directorio Activo pero recuerda que esto se trata de un laboratorio para aprender.</p>
<h3 id="regla-primarysid">Regla PrimarySID</h3>
<p>En esta segunda regla aprovechamos la notificació de tipo UPN recien creada para localizar el objectSID del usuario buscandolo por el UPN y por la dirección de correo electrónico por si no somos capaces de localizarlo por el UPN.</p>
<p>{% highlight query %}
c1:[Type == &ldquo;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier&rdquo;]
&amp;&amp; c2:[Type == &ldquo;http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn&rdquo;]
=&gt; issue(store = &ldquo;Active Directory&rdquo;, types = (&ldquo;<a href="http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid%22)">http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid&quot;)</a>, query = &ldquo;(&amp;(objectCategory=person)(objectClass=user)(|(userPrincipalName={0})(&amp;(mail={0})(!(userPrincipalName={0})))));objectSid;OLIMPO\random&rdquo;, param = c2.Value);
{% endhighlight %}</p>
<p>Aquí nuevamente hacemos un poco de truco porque estamos forzando el dominio del usuario al del laboratorio pero no he sido capaz de hacerlo funcionar de otra manera.</p>
<p>Bueno y con esto nos despedimos hasta el siguiente episodio donde veremos la parte de los proveedores de confianza de notificaciones o Claims Providers Trusts.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Integrar Exchange 2019 con Apereo CAS mediante ADFS (Parte 1)</title>
      <link>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-1/</link>
      <pubDate>Wed, 16 Mar 2022 18:15:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/exchange-adfs-apereo-cas-parte-1/</guid>
      <description><![CDATA[<p>Comenzamos una nueva serie de artículos dedicados a integrar Exchange Server 2019 con el Apereo CAS mediante ADFS. Si la pregunta es por qué, pues la respuesta es sencilla, porque se puede.</p>
<h2 id="listado-de-episodios">Listado de episodios</h2>
<p>Comencemos con el listado de todos los artículos relacionados con este tutorial.</p>
<ul>
<li><a href="/2022/03/16/exchange-adfs-apereo-cas-parte-1.html">Parte 1</a>.</li>
<li><a href="/2022/03/17/exchange-adfs-apereo-cas-parte-2.html">Parte 2</a>.</li>
<li><a href="/2022/03/18/exchange-adfs-apereo-cas-parte-3.html">Parte 3</a>.</li>
<li><a href="/2022/03/22/exchange-adfs-apereo-cas-parte-4.html">Parte 4</a>.</li>
<li><a href="/2022/03/25/exchange-adfs-apereo-cas-parte-5.html">Parte 5</a>.</li>
</ul>
<h2 id="esquema-del-laboratorio">Esquema del laboratorio</h2>
<p>Vamos a usar cuatro máquinas virtuales en este laboratorio aunque en un entorno real deberían ser al menos seis ya que he integrado el controlador de dominio con el servidor Exchange y, como no nos hacía falta para un laboratorio, no he publicado ADFS mediante un Web Application Proxy.</p>
<p>Como plataforma de virtualización se ha utilizado WMWare Workstation 16 pero se puede hacer con cualquier otra como VirtualBox, KVM o Hyper-V.</p>
<p><img src="/images/2022/20220316-exchange-adfs-apereo-cas-parte-1-img_1.png" alt="image-20220316-exchange-adfs-apereo-cas-parte-1-img_1"></p>
<p>Los servidores Windows se han montado en Windows Server 2022 Standard, la estación de trabajo en Windows 10 Pro y el servidor de Apereo en CentOS 7.9 de 64 bits.</p>
<p>Se ha utilizado Exchange Server 2019 CU11 y para la implementación del CAS de Apereo se ha utilizado la 6.0.0 obtenida del overlay descargado desde su repositorio en GitHub en la URL <a href="https://github.com/apereo/cas-overlay-template">https://github.com/apereo/cas-overlay-template</a>.</p>
<p>Para el direccionamiento de red se ha usado un segmento de red de clase C en el segmente 172.16.53.0/24 con direccionamiento estático asignado a las máquinas.</p>
<p>La distribución final de los equipos en el laboratorio será la siguiente:</p>
<ul>
<li>Controlador de dominio y Exchange Server. 6 GB de RAM, 4 vCPU y dos discos de 100 GB. Dirección IP: 172.16.53.10.</li>
<li>Servidor ADFS. 4 GB de RAM, 2 vCPU y 60 GB de disco. Dirección IP: 172.16.53.11.</li>
<li>Servidor Apereo CAS. 2 GB de RAM, 2vCPU y 40 GB de disco. Dirección IP: 172.16.53.13.</li>
<li>Estación de trabajo. 4 GB de RAM, 2vCPU y 60 GB de disco. Dirección IP: 172.16.53.20.</li>
</ul>
<p>Voy a dar por supuesto que todos sabemos instalar el sistema operativo tanto de los servidores como de la estación de trabajo y también obtener las ISO de Windows y Exchange Server por lo que no voy a explicar esta parte. Tampoco voy a detallar cómo se instala el controlador de dominio o Exchange Server porque entiendo que si estás leyendo este artículo es porque ya sabes todo esto.</p>
<p>Hasta el siguiente episodio.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Mapear unidad de red sobre SSH en Windows</title>
      <link>https://www.igalvan.es/posts/windows-unidad-red-sobre-ssh/</link>
      <pubDate>Tue, 26 Oct 2021 19:13:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/windows-unidad-red-sobre-ssh/</guid>
      <description><![CDATA[<p>Hoy vamos a ver una forma muy práctica de acceder al contenido de un servidor GNU/Linux desde Windows utilizando SSH para mapearlo como si fuera una unidad de red.</p>
<h2 id="instalación">Instalación</h2>
<p>Lo primero es descargar e instalar dos programas en nuestro equipo Windows. Os dejo los enlaces.</p>
<ul>
<li>SSHFS-Win: <a href="https://github.com/billziss-gh/sshfs-win">https://github.com/billziss-gh/sshfs-win</a></li>
<li>WinFsp: <a href="https://github.com/billziss-gh/winfsp">https://github.com/billziss-gh/winfsp</a></li>
</ul>
<p>Son dos paquetes MSI de los de &ldquo;siguiente, siguiente, finalizar&rdquo; así que tampoco vamos a perder el tiempo detallando su instalación.</p>
<h2 id="mapear-el-directorio-personal-de-un-usuario">Mapear el directorio personal de un usuario</h2>
<p>El mapeo se realiza como cualquier unidad de red de Windows con la excepción de que a la hora de mapear la unidad debemos seguir el siguiente formato:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>\\sshfs\&lt;USUARIO&gt;@&lt;MAQUINA&gt;
</span></span></code></pre></div><p><img src="/images/2021/20211026-mapeo-carpeta-personal.png" alt="Mapeo carpeta personal unidad red" title="Mapeo carpeta personal como unidad de red"></p>
<p>Nos pedirá nuestras credenciales y ya está hecho.</p>
<p><img src="/images/2021/20211026-credenciales.png" alt="Credenciales mapeo" title="Credenciales mapeo de red"></p>
<p>En esta captura podemos observar los ficheros que contiene mi carpeta personal en el servidor GNU/Linux.</p>
<p><img src="/images/2021/20211026-explorer-carpeta-personal.png" alt="Mapeo carpeta datos unidad red" title="Mapeo carpeta datos como unidad de red"></p>
<h2 id="mapear-un-directorio-dentro-del-servidor">Mapear un directorio dentro del servidor</h2>
<p>¿Os acordais del montaje NFS que hemos usado en otras publicaciones? Pues es muy fácil mapear directamente ese directorio como una unidad de red. Tan solo hay que cambiar un poco el comando para que siga este formato.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>\\sshfs.r\&lt;USUARIO&gt;@&lt;MAQUINA&gt;\&lt;RUTA&gt;
</span></span></code></pre></div><p><img src="/images/2021/20211026-mapeo-carpeta-datos.png" alt="Mapeo carpeta datos unidad red" title="Mapeo carpeta datos como unidad de red"></p>
<p>Aquí podemos ver el contenido de la carpeta datos dentro del explorador de Windows.</p>
<p><img src="/images/2021/20211026-explorer-datos.png" alt="Carpeta datos en Explorer" title="Carpeta datos en Explorer"></p>
<h2 id="mapear-un-directorio-desde-la-consola-cmd">Mapear un directorio desde la consola CMD</h2>
<p>Pues resulta que también es posible mapear un directorio desde la consola CMD y como esto es algo que me encanta, ahí os dejo un ejemplo.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>C:\Users\IEUser<span style="color:#75715e">&gt;net use X: \\sshfs\ignacio@192.168.2.129</span>
</span></span><span style="display:flex;"><span>The password is invalid for \\sshfs\ignacio@192.168.2.129.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Enter the user name for &#39;sshfs&#39;: ignacio
</span></span><span style="display:flex;"><span>Enter the password for sshfs:
</span></span><span style="display:flex;"><span>The command completed successfully.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>C:\Users\IEUser<span style="color:#75715e">&gt;net use</span>
</span></span><span style="display:flex;"><span>New connections will be remembered.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Status       Local     Remote                    Network
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>-------------------------------------------------------------------------------
</span></span><span style="display:flex;"><span>             X:        \\sshfs\ignacio@192.168.2.129
</span></span><span style="display:flex;"><span>                                                WinFsp.Np
</span></span><span style="display:flex;"><span>             Z:        \\sshfs.r\ignacio@192.168.2.129\datos
</span></span><span style="display:flex;"><span>                                                WinFsp.Np
</span></span><span style="display:flex;"><span>The command completed successfully.
</span></span></code></pre></div><p>Y para eliminarlo, igual de sencillo</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>$ net use X: /delete
</span></span><span style="display:flex;"><span>X: was<span style="color:#75715e"> deleted successfully.</span>
</span></span></code></pre></div><h2 id="más-opciones">Más opciones</h2>
<p>Tiene algunas opciones más como el uso de claves SSH si no quereis usar contraseñas. Lo mejor es que reviseis la documentación en su página web. Pues eso es todo, amigos.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Mapear unidad de red cliente NFS en Windows</title>
      <link>https://www.igalvan.es/posts/windows-unidad-red-cliente-nfs/</link>
      <pubDate>Sun, 24 Oct 2021 20:41:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/windows-unidad-red-cliente-nfs/</guid>
      <description><![CDATA[<p>Lo prometido es deuda. En este post os dije que ibamos a hacer algo chulo con el servidor NFS en Windows. Y a eso vamos, vamos a usar una funcionalidad de Windows 10 que pasa desapercibida, el cliente NFS para Windows. En mi caso voy a optar solo por la instalación y configuración mediante consola ya que hacerlo gráficamente no es tan divertido.</p>
<h2 id="instalación">Instalación</h2>
<p>Desde una consola de PowerShell elevada hay que ejecutar el siguiente comando.</p>
<p>{% highlight powershell %}
Enable-WindowsOptionalFeature -Online -FeatureName ClientForNFS-Infrastructure
{% endhighlight %}</p>
<h2 id="montaje-de-solo-lectura">Montaje de solo lectura</h2>
<p>Hay que tener en cuenta que esto no funciona desde la consola de PowerShell.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>mount -o anon \\&lt;IP_SERVIDOR_NFS&gt;\datos Z:
</span></span><span style="display:flex;"><span>Z: is<span style="color:#75715e"> now successfully connected to \\&lt;IP_SERVIDOR_NFS&gt;\datos</span>
</span></span></code></pre></div><h2 id="montaje-de-lecturaescritura">Montaje de lectura/escritura</h2>
<p>Esta parte es bastante engorrosa en Windows. A mí personalmente no me gusta nada y por eso prefiero usar otras alternativas que os mostraré en otra publicación. Pero bueno, para ciertos entornos tiene su utilidad.</p>
<p>Lo primero es usar el comando <code>mount</code> para obtener el UID y GID con el que está montado el recurso NFS.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>mount
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Local    Remote                                 Properties
</span></span><span style="display:flex;"><span>-------------------------------------------------------------------------------
</span></span><span style="display:flex;"><span>Z:       \\<span style="color:#75715e">&lt;IP_SERVIDOR_NFS&gt;\datos              UID=-2, GID=-2</span>
</span></span><span style="display:flex;"><span>                                                rsize=262144, wsize=262144
</span></span><span style="display:flex;"><span>                                                mount=soft, timeout=0.8
</span></span><span style="display:flex;"><span>                                                retry=1, locking=yes
</span></span><span style="display:flex;"><span>                                                fileaccess=755, lang=ANSI
</span></span><span style="display:flex;"><span>                                                casesensitive=no
</span></span><span style="display:flex;"><span>                                                sec=sys
</span></span></code></pre></div><p>Hay que crear dos entradas en el registro de Windows para modificar los UID y GID por defecto. Lo ideal es elegir el UID y GDI de un usuario que ya exista en el servidor NFS y de esa manera creamos los ficheros y carpeta con identificadores ya existentes y no veremos valores númericos al visualizar los directorios desde nuestro Linux.</p>
<p>La primera clave se crea con el siguiente comando.</p>
<p>{% highlight powershell %}
New-ItemProperty HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default -Name AnonymousUID -Value 1000 -PropertyType &ldquo;DWord&rdquo;</p>
<p>AnonymousUID : 1000
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\De
fault
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion
PSChildName  : Default
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry
{% endhighlight %}</p>
<p>La segunda clave se crea con el siguiente comando.</p>
<p>{% highlight powershell %}
New-ItemProperty HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default -Name AnonymousGID -Value 105  -PropertyType &ldquo;DWord&rdquo;</p>
<p>AnonymousGID : 1000
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\De
fault
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion
PSChildName  : Default
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry</p>
<p>PS C:\Windows\system32&gt;
{% endhighlight %}</p>
<p>Es necesario reiniciar el equipo para que lea del registro los cambios.</p>
<p>Vamos a ver si esto ha funcionado. Vamos a intentar crear una carpeta llamada <code>folder2</code>.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bat" data-lang="bat"><span style="display:flex;"><span>C:\Users\IEUser<span style="color:#75715e">&gt;z:</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Z:\<span style="color:#75715e">&gt;dir</span>
</span></span><span style="display:flex;"><span> Volume in drive Z has no label.
</span></span><span style="display:flex;"><span> Volume Serial Number is 1835-1B2D
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> Directory of Z:\
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>10/22/2021  01:40 PM    &lt;DIR&gt;          .
</span></span><span style="display:flex;"><span>10/22/2021  01:40 PM    &lt;DIR&gt;          ..
</span></span><span style="display:flex;"><span>10/22/2021  01:23 PM    &lt;DIR&gt;          folder
</span></span><span style="display:flex;"><span>               0 File(s)             62 bytes
</span></span><span style="display:flex;"><span>               3 Dir(s)  37,989,482,496 bytes free
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Z:\<span style="color:#75715e">&gt;mkdir folder2</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Z:\<span style="color:#75715e">&gt;dir</span>
</span></span><span style="display:flex;"><span> Volume in drive Z has no label.
</span></span><span style="display:flex;"><span> Volume Serial Number is 1835-1B2D
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> Directory of Z:\
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>10/22/2021  01:40 PM    &lt;DIR&gt;          .
</span></span><span style="display:flex;"><span>10/22/2021  01:40 PM    &lt;DIR&gt;          ..
</span></span><span style="display:flex;"><span>10/22/2021  01:23 PM    &lt;DIR&gt;          folder
</span></span><span style="display:flex;"><span>10/22/2021  01:40 PM    &lt;DIR&gt;          folder2
</span></span><span style="display:flex;"><span>               0 File(s)             98 bytes
</span></span><span style="display:flex;"><span>               4 Dir(s)  37,989,482,496 bytes free
</span></span></code></pre></div><p>Y ahora vamos a nuestro servidor NFS a ver si realmente existe y con qué propietario y permisos se ha creado.</p>
<p>{% highlight shell %}
[root@centos7 datos]# ll
total 0
drwxr-xr-x. 2 root    root    22 oct 22 21:23 folder
drwxr-xr-x. 2 ignacio ignacio  6 oct 22 21:43 folder2
[root@centos7 datos]#
{% endhighlight %}</p>
<p>Pues eso es todo, amigos.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Servidor NFS en CentOS 7</title>
      <link>https://www.igalvan.es/posts/servidor-nfs-en-centos-7/</link>
      <pubDate>Sun, 17 Oct 2021 18:34:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/servidor-nfs-en-centos-7/</guid>
      <description><![CDATA[<p>Hoy voy a explicar cómo montar un servidor NFS en una máquina con CentOS 7 que luego utilizaré para otra entrada del blog mucho más interesante para los que usen Windows.</p>
<p>Una nota aclaratoria, esto no pretende ser un tutorial sobre cómo exportar volúmenes NFS sino una breve introducción explicativa para apoyar lo que mostraré en la entrada que crearé en breve. 😁</p>
<h2 id="instalación-servicio-nfs">Instalación servicio NFS</h2>
<p>Lo primero que vamos a hacer es instalar los paquetes necesarios para disponer del servicio NFS.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>ignacio@centos7 ~<span style="color:#f92672">]</span>$ sudo dnf install nfs-utils
</span></span></code></pre></div><p>Si tenemos habilitado SELinux en el servidor hay que permitir su uso, por lo que hay que ejecutar este comando.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>ignacio@centos7 ~<span style="color:#f92672">]</span>$ sudo setsebool -P nfs_export_all_ro<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span> nfs_export_all_rw<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span></code></pre></div><p>El siguiente paso es abrir los puertos necesarios en el cortafuegos. Esto lo hacemos en dos pasos, el primero sirve para añadir las excepciones del servicio y el segundo para forzar el cortafuegos a recargar la configuración que hemos modificado.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>ignacio@centos7 ~<span style="color:#f92672">]</span>$ sudo firewall-cmd --permanent --add-service nfs
</span></span><span style="display:flex;"><span>success
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>ignacio@centos7 ~<span style="color:#f92672">]</span>$ sudo firewall-cmd --reload
</span></span><span style="display:flex;"><span>success
</span></span></code></pre></div><p>El siguiente paso es habilitar los servicios para que se inicien con el inicio del servidor.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>ignacio@centos7 ~<span style="color:#f92672">]</span>$ sudo systemctl enable rpcbind nfs-server
</span></span><span style="display:flex;"><span>Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
</span></span></code></pre></div><p>Y ahora vamos a iniciar los servicios para poder pasar a la parte de configuración.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>ignacio@centos7 ~<span style="color:#f92672">]</span>$ sudo systemctl start rpcbind nfs-server
</span></span></code></pre></div><h2 id="configuración-servicio-nfs">Configuración servicio NFS</h2>
<p>El primer paso es crear el directorio que vamos a exportar, en mi caso /datos.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>mkdir /datos
</span></span></code></pre></div><p>Como segundo paso vamos a modificar el fichero exports para configurar una exportación del directorio datos en modo lectura para cualquier usuario. En mi caso lo voy a exportar a cualquier IP porque es un laboratorio. Si vais a montar esto en un entorno más serio, por favor, indicad solo la IP desde la que vais a acceder.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>cat /etc/exports
</span></span><span style="display:flex;"><span>/datos *<span style="color:#f92672">(</span>ro,sync<span style="color:#f92672">)</span>
</span></span></code></pre></div><p>En el siguiente paso vamos a forzar la exportación del nuevo volumen mediante el siguiente comando.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>root@centos7 ignacio<span style="color:#f92672">]</span><span style="color:#75715e"># exportfs -arv&lt;br /&gt;exporting *:/datos&lt;/span&gt;&lt;/p&gt;</span>
</span></span></code></pre></div><p>Por último, vamos a comprobar que el directorio se encuentra correctamente exportado y accesible.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>ignacio@centos7 ~<span style="color:#f92672">]</span>$ sudo exportfs -s
</span></span><span style="display:flex;"><span>/datos *<span style="color:#f92672">(</span>sync,wdelay,hide,no_subtree_check,sec<span style="color:#f92672">=</span>sys,ro,secure,root_squash,no_all_squash<span style="color:#f92672">)</span>
</span></span></code></pre></div><p>Bueno y con esto hemos terminado por hoy. 🏁</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Error libnsl en VMware Workstation al importar OVF</title>
      <link>https://www.igalvan.es/posts/error-libnsl-en-vmware-workstation-al/</link>
      <pubDate>Sat, 16 Oct 2021 07:52:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/error-libnsl-en-vmware-workstation-al/</guid>
      <description><![CDATA[<p>Intentando importar el OVF de una de las máquinas virtuales de pruebas de Microsoft en VMware Workstation 16 me encontré con un curioso error. Al intentar abrir el fichero con el procedimiento habitual, en el momento de pulsar el botón &ldquo;Abrir&rdquo; dentro de la ventana de &ldquo;Open Virtual Machines&rdquo;, simplemente no hacia nada.</p>
<p>Al utilizar la consola para ejecutar la herramienta ovftool mostraba un error con la librería libnsl.</p>
<pre tabindex="0"><code>[ignacio@server MSEdge-Win10-VMware]$ ovftool MSEdge-Win10-VMware.ovf &lt;br /&gt;/usr/lib/vmware-ovftool/ovftool.bin: error while loading shared libraries: libnsl.so.1: cannot open shared object file: No such file or directory
</code></pre><p>Solucionarlo es tan sencillo como instalarla y listo.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Proteger SSH mediante Port Knocking</title>
      <link>https://www.igalvan.es/posts/proteger-ssh-mediante-port-knocking/</link>
      <pubDate>Sun, 01 Aug 2021 21:04:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/proteger-ssh-mediante-port-knocking/</guid>
      <description><![CDATA[<p>Hoy vamos a ver cómo ocultar un servicio que tengamos publicado en Internet aprovechándonos de una técnica conocida como Port Knocking. En nuestro caso lo haremos con el servicio SSH.</p>
<h2 id="máquina-servidor">Máquina servidor</h2>
<p>Lo primero es instalar el paquete de EPEL para posteriormente instalar el paquete knock-server. También es necesario instalar libpcap.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@knockd ~<span style="color:#f92672">]</span><span style="color:#75715e"># yum install libpcap</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>...<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@knockd ~<span style="color:#f92672">]</span><span style="color:#75715e"># yum install epel-release</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>...<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@knockd ~<span style="color:#f92672">]</span><span style="color:#75715e"># yum install knock-server</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>...<span style="color:#f92672">]</span>
</span></span></code></pre></div><p>El siguiente paso es eliminar de nftables la regla que permite las conexiones SSH remotas mediante el siguiente comando. Ten en cuenta que en mi instalación se usa la zona por defecto llamada public.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@knockd ~<span style="color:#f92672">]</span><span style="color:#75715e"># firewall-cmd --zone=public --remove-service=ssh --permanent</span>
</span></span><span style="display:flex;"><span>success
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@knockd ~<span style="color:#f92672">]</span><span style="color:#75715e"># firewall-cmd --reload</span>
</span></span></code></pre></div><p>El siguiente paso es modificar el fichero /etc/knockd.conf y dejarlo con el siguiente contenido. Por favor, <strong>cambiad los puertos a otra secuencia</strong>. 😜</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>options<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>        UseSyslog
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>opencloseSSH<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>        sequence      <span style="color:#f92672">=</span> 51234:udp,55678:tcp,59124:udp
</span></span><span style="display:flex;"><span>        seq_timeout   <span style="color:#f92672">=</span> <span style="color:#ae81ff">15</span>
</span></span><span style="display:flex;"><span>        tcpflags      <span style="color:#f92672">=</span> syn,ack
</span></span><span style="display:flex;"><span>        start_command <span style="color:#f92672">=</span> /bin/firewall-cmd --zone<span style="color:#f92672">=</span>public --add-rich-rule <span style="color:#e6db74">&#34;rule family=&#34;</span>ipv4<span style="color:#e6db74">&#34; source address=&#34;</span>%IP%<span style="color:#e6db74">&#34; service name=&#34;</span>ssh<span style="color:#e6db74">&#34; accept&#34;</span>
</span></span><span style="display:flex;"><span>        cmd_timeout   <span style="color:#f92672">=</span> <span style="color:#ae81ff">10</span>
</span></span><span style="display:flex;"><span>        stop_command  <span style="color:#f92672">=</span> /bin/firewall-cmd --zone<span style="color:#f92672">=</span>public --remove-rich-rule <span style="color:#e6db74">&#34;rule family=&#34;</span>ipv4<span style="color:#e6db74">&#34; source address=&#34;</span>%IP%<span style="color:#e6db74">&#34; service name=&#34;</span>ssh<span style="color:#e6db74">&#34; accept&#34;</span>
</span></span></code></pre></div><p>El último paso es habilitar e iniciar el servicio knockd.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>sudo systemctl enable knockd <span style="color:#f92672">&amp;&amp;</span> sudo systemctl start knockd
</span></span></code></pre></div><h2 id="máquina-cliente">Máquina cliente</h2>
<p>En la máquina cliente desde la que vamos a acceder por SSH es necesario instalar el cliente de knock. Al igual que en el servidor es necesario disponer del repositorio EPEL.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>yum install epel-release
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>...<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>yum install knock
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>...<span style="color:#f92672">]</span>
</span></span></code></pre></div><p>Vamos a una un primer intento de conexión mediante SSH para que veamos que no es posible conectar.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>ignacio@knock-client ~<span style="color:#f92672">]</span>$ ssh root@192.168.122.186
</span></span><span style="display:flex;"><span>ssh: connect to host 192.168.122.186 port 22: No route to host
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>ignacio@knock-client ~<span style="color:#f92672">]</span>$  
</span></span></code></pre></div><p>Ahora vamos a usar el cliente de knock que hemos instalado para hacer la &ldquo;llamada&rdquo; y que se abra la puerta.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@knock-client ~<span style="color:#f92672">]</span><span style="color:#75715e"># knock -v -d 1 192.168.122.186 51234:udp 55678:tcp 59124:udp</span>
</span></span><span style="display:flex;"><span>hitting udp 192.168.122.186:51234
</span></span><span style="display:flex;"><span>hitting tcp 192.168.122.186:55678
</span></span><span style="display:flex;"><span>hitting udp 192.168.122.186:59124
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@knock-client ~<span style="color:#f92672">]</span><span style="color:#75715e"># ssh root@192.168.122.186</span>
</span></span><span style="display:flex;"><span>root@192.168.122.186<span style="color:#960050;background-color:#1e0010">&#39;</span>s password:  
</span></span><span style="display:flex;"><span>Last failed login: Sun Aug  <span style="color:#ae81ff">1</span> 20:51:14 WEST <span style="color:#ae81ff">2021</span> from knock-client on ssh:notty
</span></span><span style="display:flex;"><span>Last login: Sun Aug  <span style="color:#ae81ff">1</span> 20:25:03 <span style="color:#ae81ff">2021</span> from knock-client
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@knockd ~<span style="color:#f92672">]</span><span style="color:#75715e"># </span>
</span></span></code></pre></div><p>En el fichero messages del servidor podemos ver lo siguiente:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>Aug  <span style="color:#ae81ff">1</span> 20:51:26 knock-client knockd: 192.168.122.136: opencloseSSH: Stage <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>Aug  <span style="color:#ae81ff">1</span> 20:51:26 knock-client knockd: 192.168.122.136: opencloseSSH: Stage <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>Aug  <span style="color:#ae81ff">1</span> 20:51:26 knock-client knockd: 192.168.122.136: opencloseSSH: Stage <span style="color:#ae81ff">3</span>
</span></span><span style="display:flex;"><span>Aug  <span style="color:#ae81ff">1</span> 20:51:26 knock-client knockd: 192.168.122.136: opencloseSSH: OPEN SESAME
</span></span><span style="display:flex;"><span>Aug  <span style="color:#ae81ff">1</span> 20:51:26 knock-client knockd: opencloseSSH: running command: /bin/firewall-cmd --zone<span style="color:#f92672">=</span>public --add-rich-rule <span style="color:#e6db74">&#34;rule family=&#34;</span>ipv4<span style="color:#e6db74">&#34; source address=&#34;</span>192.168.122.136<span style="color:#e6db74">&#34; service name=&#34;</span>ssh<span style="color:#e6db74">&#34; accept&#34;</span>
</span></span><span style="display:flex;"><span>Aug  <span style="color:#ae81ff">1</span> 20:51:31 knock-client systemd-logind: New session <span style="color:#ae81ff">4</span> of user root.
</span></span><span style="display:flex;"><span>Aug  <span style="color:#ae81ff">1</span> 20:51:31 knock-client systemd: Started Session <span style="color:#ae81ff">4</span> of user root.
</span></span><span style="display:flex;"><span>Aug  <span style="color:#ae81ff">1</span> 20:51:37 knock-client knockd: 192.168.122.136: opencloseSSH: command timeout
</span></span><span style="display:flex;"><span>Aug  <span style="color:#ae81ff">1</span> 20:51:37 knock-client knockd: opencloseSSH: running command: /bin/firewall-cmd --zone<span style="color:#f92672">=</span>public --remove-rich-rule <span style="color:#e6db74">&#34;rule family=&#34;</span>ipv4<span style="color:#e6db74">&#34; source address=&#34;</span>192.168.122.136<span style="color:#e6db74">&#34; service name=&#34;</span>ssh<span style="color:#e6db74">&#34; accept&#34;</span>
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Instalación de Fail2ban en un servidor CentOS</title>
      <link>https://www.igalvan.es/posts/esta-tarde-estaba-configurando-un/</link>
      <pubDate>Fri, 30 Jul 2021 20:49:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/esta-tarde-estaba-configurando-un/</guid>
      <description><![CDATA[<p>Esta tarde estaba configurando un servidor para un proyecto personal que he alquilado en un proveedor de estos baratillos y nada más instalar CentOS y conectarme por SSH, lo primero que me sale es un mensaje indicando que ha habido siete intentos de inicio de sesión incorrectos&hellip;</p>
<p>Hay que ver cómo está el patio, ¡la máquina encendida llevaba cinco minutos encendida! Así que después de cambiar en el servicio SSH que solo se pueda autenticar mediante claves, lo siguiente ha sido instalar Fail2ban.</p>
<h2 id="instalación-de-fail2ban-en-centos">Instalación de Fail2ban en CentOS</h2>
<p>El primer paso es instalar el repositorio EPEL, si no lo tiene hecho ya, claro.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>dnf install epel-repo
</span></span></code></pre></div><p>Después tenemos que instalar el paquete fail2ban.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>dnf install fail2ban
</span></span></code></pre></div><h2 id="configuración-de-fail2ban">Configuración de Fail2ban</h2>
<p>En mi caso, al menos por ahora, voy a dejar la configuración por defecto. En el fichero <code>/etc/fail2ban/jail.conf</code>, está toda la configuración por si queréis modificarla.</p>
<h2 id="creación-de-la-jaula-para-sshd">Creación de la jaula para SSHD</h2>
<p>Hay que crear el fichero que contendrá la configuración de la jaula para el servicio SSHD. Creamos el fichero <code>/etc/fail2ban/jail.d/sshd.local</code> y dentro ponemos el siguiente contenido:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>sshd<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>enabled <span style="color:#f92672">=</span> true
</span></span></code></pre></div><h2 id="activación-del-servicio-fail2ban">Activación del servicio Fail2ban</h2>
<p>Una vez que hemos completado la configuración de Fail2ban, lo siguiente es activar el servicio para que empiece a vigilar por nosotros. 😉</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>systemctl enable --now fail2ban
</span></span><span style="display:flex;"><span>Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /usr/lib/systemd/system/fail2ban.service.
</span></span></code></pre></div><h2 id="verificación-del-estado-del-servicio-fail2ban">Verificación del estado del servicio Fail2ban</h2>
<p>Verificamos que se ha iniciado correctamente con la jaula definida.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>fail2ban-client status
</span></span><span style="display:flex;"><span>Status
</span></span><span style="display:flex;"><span>|- Number of jail:    <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">`</span>- Jail list:    sshd
</span></span></code></pre></div><h2 id="comprobamos-cómo-va-la-cosa">Comprobamos cómo va la cosa</h2>
<p>Dejamos pasar un par de minutos y vamos a ver cuántas IP bloqueadas tenemos.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>fail2ban-client get sshd banned
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span><span style="color:#e6db74">&#39;xxx.xxx.xxx.xxx&#39;</span>, <span style="color:#e6db74">&#39;xx.xx.xx.xxx&#39;</span>, <span style="color:#e6db74">&#39;xx.xx.xxx.xxx&#39;</span>, <span style="color:#e6db74">&#39;xxx.xxx.xxx.xxx&#39;</span>, <span style="color:#e6db74">&#39;xx.xx.xxx.xxx&#39;</span>, <span style="color:#e6db74">&#39;xxx.xxx.xxx.xxx&#39;</span>, <span style="color:#e6db74">&#39;xx.xxx.xxx.xxx&#39;</span>, <span style="color:#e6db74">&#39;xx.xxx.xxx.xx&#39;</span>, <span style="color:#e6db74">&#39;xxx.xxx.xx.xx&#39;</span>, <span style="color:#e6db74">&#39;xx.xx.xxx.xxx&#39;</span><span style="color:#f92672">]</span>
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
    
    <item>
      <title>CTF- Metaspike - Space invaders (Parte 4)</title>
      <link>https://www.igalvan.es/posts/cft-space-invaders-parte-4/</link>
      <pubDate>Sat, 02 Jan 2021 12:00:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/cft-space-invaders-parte-4/</guid>
      <description><![CDATA[<p>Cuarta y última parte del CTF &ldquo;Space Invaders&rdquo;.</p>
<p>El enunciado de esta cuarta parte nos dice lo siguiente:</p>
<blockquote>
<p>Based on the information available to you, what is the maximum amount of time Vivian Alyse could have spent composing the final message in the thread that you examined? That is, time elapsed from the moment she pressed the &ldquo;Reply&rdquo; or &ldquo;Forward&rdquo; button, to the moment she hit &ldquo;Send&rdquo;. Assume that the following is true:</p>
<pre><code>Vivian used Outlook to compose and send the message
All of the computers involved in the email conversation keep perfectly accurate time
</code></pre>
<p>Enter the duration in minutes rounding up. For example, enter 46 for 45 minutes and 31 seconds.</p>
</blockquote>
<p>Este es bastante fácil. Si lo retomamos dónde lo dejamos en el artículo anterior, en la propiedad <code>PR_CONVERSATION_INDEX</code> tenemos unos valores llamados <code>TimeDelta</code> y de estos nos interesa el segundo que es la última respuesta a este correo.</p>
<p>![captura timedelta pr_conversation_index]({{ site.url }}/assets/timedelta_cft_space_invaders.png)</p>
<p>El valor <code>0x00000AE9</code> lo tenemos que convertir a decimal y posteriormente a minutos quedando que son 1 minuto y 47 segundos, que redondeando hacia arriba como nos pide el enunciado nos queda el valor de <strong>2 minutos</strong>. :checkered_flag:</p>
<p>Y con esto ya hemos terminado este reto. :tada:</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>CTF- Metaspike - Space invaders (Parte 3)</title>
      <link>https://www.igalvan.es/posts/cft-space-invaders-parte-3/</link>
      <pubDate>Fri, 01 Jan 2021 12:00:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/cft-space-invaders-parte-3/</guid>
      <description><![CDATA[<p>Tercera parte del CTF &ldquo;Space Invaders&rdquo;. Desgraciadamente no he podido continuar usando el script en PHP para resolver esta parte porque no he sido capaz de obtener el valor que necesito dentro de la estructura de datos, así que en este caso he utilizado Outlook 2016 con el software OutlookSpy (<a href="http://www.dimastr.com/outspy/home.htm)">http://www.dimastr.com/outspy/home.htm)</a>.</p>
<p>El enunciado de esta tercera parte nos dice lo siguiente:</p>
<blockquote>
<p>It is believed that the email you examined in Part 1 and Part 2 of this challenge was the last message in a conversation thread that comprises multiple messages. Based on the information available to you, when was the initial message in this conversation thread likely sent?</p>
<p>Enter the timestamp in UTC in the following format: yyyy-mm-dd hh:mm:ss (e.g., 2005-11-20 13:17:48)</p>
</blockquote>
<p>Una vez que abrimos el mensaje en Outlook y hacemos clic sobre el botón &ldquo;iMessage&rdquo; veremos toda la información interna del fichero incluyendo sus propiedades MAPI. La propiedad que debemos buscar es <code>PR_CONVERSATION_INDEX</code>. Dentro de esta propiedad lo que nos interesa es el campo <code>Value</code> que contiene una cadena hexadecimal de 32 bytes que tenemos que descomponer.</p>
<p>![captura pr_conversation_index]({{ site.url }}/assets/filetime_cft_space_invaders.png)</p>
<p>De toda esta estructura lo que nos interesa son los primeros doce caracteres a los que debemos añadir cuatro ceros (0000) en la parte posterior quedando el valor <code>01D5D17A24E40000</code> y así completar la longitud de 32 bits.</p>
<p>Si os estáis preguntando qué representa este valor pues os cuento que es el número de nanosegundos que han pasado desde el 1 de enero de 1601 que es lo que se conoce como unidades FILETIME (<a href="https://docs.microsoft.com/es-es/office/client-developer/outlook/mapi/filetime)">https://docs.microsoft.com/es-es/office/client-developer/outlook/mapi/filetime)</a>.</p>
<p>Lo más rápido para convertir esto a una fecha &ldquo;humana&rdquo; es utilizar un conversor de FILETIME como el de la página <a href="https://www.epochconverter.com/ldap">https://www.epochconverter.com/ldap</a>. Tras convertirlo nos queda la fecha 22 de enero de 2020 a las 23:17:41 que es la respuesta que buscamos. Tan solo queda formatearlo tal y como se nos indica, con lo que <strong>la respuesta final es 2020-01-22 23:17:41</strong>.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>CTF- Metaspike - Space invaders (Parte 2)</title>
      <link>https://www.igalvan.es/posts/cft-space-invaders-parte-2/</link>
      <pubDate>Wed, 30 Dec 2020 16:15:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/cft-space-invaders-parte-2/</guid>
      <description><![CDATA[<p>Segunda parte del CTF &ldquo;Space Invaders&rdquo;. Ya os avanzo que este va a ser muy corto ya que prácticamente he respondido a esta pregunta en el script de la primera.</p>
<p>El enunciado de esta segunda parte nos dice lo siguiente:</p>
<blockquote>
<p>Regardless of whether you believe it is legitimate or fake, what is the last modification timestamp you were able to find for the attachment in Part 1?</p>
<p>Enter the timestamp in UTC with 0.1 microsecond precision in the following format: yyyy-mm-dd hh:mm:ss.fffffff (e.g., 2005-11-20 13:17:48.1234567)</p>
</blockquote>
<p>Recuperamos la salida del script de la primera parte con el siguiente contenido:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>┌──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop/msgopen<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ php ex1.php
</span></span><span style="display:flex;"><span>Message Creation time: 1607983178 <span style="color:#f92672">=</span>&gt; 2020-12-14 16:59:38.000000 EST
</span></span><span style="display:flex;"><span>Message Last modification time: 1607983178 <span style="color:#f92672">=</span>&gt; 2020-12-14, 16:59:38.000000 EST
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Attachment: FC_4fca-8f34_Specs.txt
</span></span><span style="display:flex;"><span>Attachment creation time: 1591119805 <span style="color:#f92672">=</span>&gt; 2020-06-02 13:43:25.000000 EDT
</span></span><span style="display:flex;"><span>Attachment last modification time: 1591385420 <span style="color:#f92672">=</span>&gt; 2020-06-05 15:30:20.000000 EDT
</span></span><span style="display:flex;"><span>┌──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop/msgopen<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ 
</span></span></code></pre></div><p>Cuidado con el enunciado que nos pide que demos la respuesta en zona horaria UTC y nosotros tenemos la respuesta en EST/EDT. Podríamos modificar el script anterior para que nos muestre las fechas en UTC pero es mucho más rápido &ldquo;googlear&rdquo; un poco y averiguar que la diferencia horaria es de 4 horas hacia delante desde EST a UTC y sumarlas obteniendo <strong>2020-06-05 19:30:20.0000000</strong> que es la respuesta solicitada.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>CTF- Metaspike - Space invaders (Parte 1)</title>
      <link>https://www.igalvan.es/posts/cft-space-invaders-parte-1/</link>
      <pubDate>Wed, 30 Dec 2020 16:00:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/cft-space-invaders-parte-1/</guid>
      <description><![CDATA[<p>Segundo CTF sobre correo electrónico de Metaspike, en este caso llamado &ldquo;Space Invaders&rdquo;. El reto consta de cuatro partes que iré publicando en sucesivos artículos.</p>
<p>El enunciado de esta primera parte nos dice lo siguiente:</p>
<blockquote>
<p>You are being asked to examine an email1 between two colleagues within the same corporation. The email contains an important business document known to have been created and maintained on a volume formatted with the NT File System (NTFS).</p>
<p>Based on your examination of the email, are the creation and last modification timestamps of the attachment more likely to be legitimate or fake? Enter L for legitimate, F for fake.</p>
<p>1SHA-256: FB42631EC43891EE2D877E02D911 A1FFB95E9B31825986F09DEFE8B9A55F2614</p>
</blockquote>
<p>El primer paso es descargarse el fichero en formato msg. Como siempre usamos el comando <code>sha256sum</code> y comprobamos que el &ldquo;hash&rdquo; coincide.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop/msgopen<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ sha256sum FW__New_Finite_Curvature_Product_Line_Specs.msg                                                 <span style="color:#ae81ff">127</span> ⨯
</span></span><span style="display:flex;"><span>fb42631ec43891ee2d877e02d911a1ffb95e9b31825986f09defe8b9a55f2614  FW__New_Finite_Curvature_Product_Line_Specs.msg
</span></span><span style="display:flex;"><span>                                                                                                                    
</span></span><span style="display:flex;"><span>┌──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop/msgopen<span style="color:#f92672">]</span>
</span></span></code></pre></div><p>El siguiente paso lógico sería pasar por VirusTotal el fichero para ver si tiene algo raro dentro pero vamos a omitir este paso porque ya sabemos que es algo que todos hacemos antes de abrir un fichero. :wink:</p>
<p>Aquí lo normal sería utilizar alguna herramienta para Windows y poder husmear dentro de las propiedades MAPI del fichero pero como a mí me gusta hacer las cosas al &ldquo;estilo software libre&rdquo; voy a usar una librería de PHP llamada <code>hfig/mapi</code> (<a href="https://github.com/hfig/MAPI">https://github.com/hfig/MAPI</a>) en un pequeño script. Aquí os dejo su contenido:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#f92672">&lt;?</span><span style="color:#a6e22e">php</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">require</span> <span style="color:#e6db74">&#39;vendor/autoload.php&#39;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">use</span> <span style="color:#a6e22e">Hfig\MAPI</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">use</span> <span style="color:#a6e22e">Hfig\MAPI\OLE\Pear</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// message parsing and file IO are kept separate
</span></span></span><span style="display:flex;"><span>$messageFactory <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">MAPI\MapiMessageFactory</span>();
</span></span><span style="display:flex;"><span>$documentFactory <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Pear\DocumentFactory</span>(); 
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ole <span style="color:#f92672">=</span> $documentFactory<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">createFromFile</span>(<span style="color:#e6db74">&#39;FW__New_Finite_Curvature_Product_Line_Specs.msg&#39;</span>);
</span></span><span style="display:flex;"><span>$message <span style="color:#f92672">=</span> $messageFactory<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">parseMessage</span>($ole);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$dateToPrint <span style="color:#f92672">=</span> <span style="color:#a6e22e">date_create</span>();
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">date_timestamp_set</span>($dateToPrint, $message<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">properties</span>[<span style="color:#e6db74">&#39;creation_time&#39;</span>]);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">echo</span> <span style="color:#e6db74">&#39;Message Creation time: &#39;</span>, <span style="color:#a6e22e">date_format</span>($dateToPrint,<span style="color:#e6db74">&#39;U =&gt; Y-m-d H:i:s.u T&#39;</span>), <span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">date_timestamp_set</span>($dateToPrint, $message<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">properties</span>[<span style="color:#e6db74">&#39;last_modification_time&#39;</span>]);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">echo</span> <span style="color:#e6db74">&#39;Message Last modification time: &#39;</span>, <span style="color:#a6e22e">date_format</span>($dateToPrint, <span style="color:#e6db74">&#39;U =&gt; Y-m-d, H:i:s.u T&#39;</span>), <span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">foreach</span> ($message<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getAttachments</span>() <span style="color:#66d9ef">as</span> $attachment) {
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">echo</span> <span style="color:#e6db74">&#39;Attachment: &#39;</span>, $attachment<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">properties</span>[<span style="color:#e6db74">&#39;display_name&#39;</span>], <span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">date_timestamp_set</span>($dateToPrint, $attachment<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">properties</span>[<span style="color:#e6db74">&#39;creation_time&#39;</span>]);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">echo</span> <span style="color:#e6db74">&#39;Attachment creation time: &#39;</span>, <span style="color:#a6e22e">date_format</span>($dateToPrint,<span style="color:#e6db74">&#39;U =&gt; Y-m-d H:i:s.u T&#39;</span>), <span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">date_timestamp_set</span>($dateToPrint, $attachment<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">properties</span>[<span style="color:#e6db74">&#39;last_modification_time&#39;</span>]);
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">echo</span> <span style="color:#e6db74">&#39;Attachment last modification time: &#39;</span>, <span style="color:#a6e22e">date_format</span>($dateToPrint,<span style="color:#e6db74">&#39;U =&gt; Y-m-d H:i:s.u T&#39;</span>), <span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#75715e">?&gt;</span><span style="color:#960050;background-color:#1e0010">
</span></span></span></code></pre></div><p>Tras ejecutarlo la salida que muestra es la siguiente:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>┌──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop/msgopen<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ php ex1.php
</span></span><span style="display:flex;"><span>Message Creation time: 1607983178 <span style="color:#f92672">=</span>&gt; 2020-12-14 16:59:38.000000 EST
</span></span><span style="display:flex;"><span>Message Last modification time: 1607983178 <span style="color:#f92672">=</span>&gt; 2020-12-14, 16:59:38.000000 EST
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Attachment: FC_4fca-8f34_Specs.txt
</span></span><span style="display:flex;"><span>Attachment creation time: 1591119805 <span style="color:#f92672">=</span>&gt; 2020-06-02 13:43:25.000000 EDT
</span></span><span style="display:flex;"><span>Attachment last modification time: 1591385420 <span style="color:#f92672">=</span>&gt; 2020-06-05 15:30:20.000000 EDT
</span></span><span style="display:flex;"><span>┌──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop/msgopen<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ 
</span></span></code></pre></div><p>Aunque no lo pueda demostrar fehacientemente, <strong>es bastante probable que se hayan modificado las fechas de creación y modificación</strong> de este correo y de sus adjuntos porque es muy poco probable que todas estas acciones se realicen justo en el microsegundo cero.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>CTF- Metaspike - It&#39;s about time (Parte 2)</title>
      <link>https://www.igalvan.es/posts/cft-its-about-time-parte-2/</link>
      <pubDate>Tue, 29 Dec 2020 15:10:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/cft-its-about-time-parte-2/</guid>
      <description><![CDATA[<p>Tal y como os prometí, aquí os dejo la segunda parte de este CTF.</p>
<p>El enunciado nos dice lo siguiente:</p>
<blockquote>
<p>Congrats on making that determination! You are now asked to take this a step further, and determine the earliest date and time the email could have been sent based on the timing information you can locate within the file.</p>
<p>You will be examining the same email1. Included here again for convenience.</p>
<p>1SHA-256: 42B6FD78DAF38C03E1A744ECA1A0CB 44F6859AB892E0F32B01763EFD835B5648</p>
<p>Enter the timestamp in UTC in the following format: yyyy-mm-dd hh:mm (e.g., 2005-11-20 13:17)</p>
</blockquote>
<p>Ya nos habíamos descargado el fichero pero si no lo tenemos lo podemos descargar otra vez desde este mismo reto. Como siempre usamos el comando <code>sha256sum</code> y comprobamos que el &ldquo;hash&rdquo; coincide.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ sha256sum Draft_Agreement.eml 
</span></span><span style="display:flex;"><span>42b6fd78daf38c03e1a744eca1a0cb44f6859ab892e0f32b01763efd835b5648  Draft_Agreement.eml
</span></span><span style="display:flex;"><span>                                                                           
</span></span><span style="display:flex;"><span>┌──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ 
</span></span></code></pre></div><p>El siguiente paso lógico sería pasar por VirusTotal el fichero para ver si tiene algo raro dentro pero vamos a omitir este paso porque ya sabemos que es algo que todos hacemos antes de abrir un fichero. :wink:</p>
<p>Nos están pidiendo la primera fecha en la que el correo pudo ser enviada. Como ya sabemos del artículo anterior no es posible que podamos obtener ese dato de las cabeceras del correo electrónico, pero si recordáis en el correo había un fichero adjunto llamado &ldquo;Agreement_v2.pdf&rdquo;.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ grep <span style="color:#e6db74">&#39;Content-&#39;</span> Draft_Agreement.eml                              <span style="color:#ae81ff">130</span> ⨯
</span></span><span style="display:flex;"><span>Content-Type: multipart/mixed; 
</span></span><span style="display:flex;"><span>Content-Length: <span style="color:#ae81ff">70085</span>
</span></span><span style="display:flex;"><span>Content-Type: multipart/alternative; 
</span></span><span style="display:flex;"><span>Content-Type: text/plain; charset<span style="color:#f92672">=</span>UTF-8
</span></span><span style="display:flex;"><span>Content-Transfer-Encoding: 7bit
</span></span><span style="display:flex;"><span>Content-Type: text/html; charset<span style="color:#f92672">=</span>UTF-8
</span></span><span style="display:flex;"><span>Content-Transfer-Encoding: 7bit
</span></span><span style="display:flex;"><span>Content-Type: application/pdf
</span></span><span style="display:flex;"><span>Content-Transfer-Encoding: base64
</span></span><span style="display:flex;"><span>Content-Disposition: attachment; filename<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Agreement_v2.pdf&#34;</span>
</span></span><span style="display:flex;"><span>Content-ID: &lt;bd1c0c4c-3c0e-20e0-f6b2-5bc858aab23a@yahoo.com&gt;
</span></span></code></pre></div><p>Vamos a separarlo utilizando el comando <code>munpack</code> para poder manipularlo. Por cierto, en Kali no viene instalado por defecto y es necesario instalar el paquete <code>mpack</code>.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ sudo munpack Draft_Agreement.eml
</span></span><span style="display:flex;"><span>tempdesc.txt: File exists
</span></span><span style="display:flex;"><span><span style="color:#f92672">)</span>greement_v2.pdf.1 <span style="color:#f92672">(</span>application/pdf
</span></span><span style="display:flex;"><span>                                                                           
</span></span><span style="display:flex;"><span>┌──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ 
</span></span></code></pre></div><p>Yo no tengo ganas de abrir el fichero porque ya sabemos las cosas malas que se pueden meter en un PDF y además dudo que sea tan sencillo de resolver como visualizar el fichero. Sin embargo, sí hay algo que sabemos de antes que nos puede ayudar. ¿Recordáis la fecha de la versión de Chrome que vimos en la cabecera &ldquo;X-Mailer&rdquo;? Pues vamos a rastrear el fichero PDF del adjunto para ver si podemos obtener cadenas de texto que hagan referencia al año 2020 mediante el comando <code>pdf-parser</code>.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ pdf-parser Agreement_v2.pdf|grep -B10 <span style="color:#ae81ff">2020</span>
</span></span><span style="display:flex;"><span> Type: /Annot
</span></span><span style="display:flex;"><span> Referencing: <span style="color:#ae81ff">46</span> <span style="color:#ae81ff">0</span> R, <span style="color:#ae81ff">9</span> <span style="color:#ae81ff">0</span> R
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  &lt;&lt;
</span></span><span style="display:flex;"><span>    /AP
</span></span><span style="display:flex;"><span>      &lt;&lt;
</span></span><span style="display:flex;"><span>        /N <span style="color:#ae81ff">46</span> <span style="color:#ae81ff">0</span> R
</span></span><span style="display:flex;"><span>      &gt;&gt;
</span></span><span style="display:flex;"><span>    /C <span style="color:#f92672">[</span>1.0 1.0 1.0<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>    /Contents <span style="color:#f92672">(</span>Dean Vinny<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>    /CreationDate <span style="color:#e6db74">&#34;(D:20201206151800-08&#39;00&#39;)&#34;</span>
</span></span><span style="display:flex;"><span>    /DA <span style="color:#f92672">(</span>0.898 0.1333 0.2157 rg /Helv <span style="color:#ae81ff">12</span> Tf<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>    /DS <span style="color:#f92672">(</span>font: Helvetica,sans-serif 12.0pt; text-align:left; color:#E52237 <span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>    /F <span style="color:#ae81ff">4</span>
</span></span><span style="display:flex;"><span>    /M <span style="color:#e6db74">&#34;(D:20201206151937-08&#39;00&#39;)&#34;</span>
</span></span></code></pre></div><p>Aquí tenemos dos fechas muy interesantes. Si nos fijamos en el resultado se ve el contenido de una anotación cuyo contenido es el nombre de la persona y además dos fechas casi seguidas. La primera se corresponde con la fecha de creación de la anotación y la segunda con la fecha de la última modificación de esa anotación. Vamos a coger la segunda fecha porque parece difícil que se puede enviar un fichero antes de terminar de editarlo. En esta fecha que fijarse que es necesario calcular la diferencia horaria para sumarla a la hora y con eso ya tendríamos la respuesta, <strong>el 6 de diciembre de 2020 a las 23:19</strong>.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>CTF- Metaspike - It&#39;s about time (Parte 1)</title>
      <link>https://www.igalvan.es/posts/cft-its-about-time-parte-1/</link>
      <pubDate>Mon, 28 Dec 2020 19:45:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/cft-its-about-time-parte-1/</guid>
      <description><![CDATA[<p>Aquí va como resolver un CTF sencillo sobre un mensaje de correo electrónico. Tiene dos preguntas sencillas que no requieren mucho conocimiento técnico pero sí ser un poco avispado. En este artículo resolveré la primera y en breve publicaré la segunda parte. Como siempre yo voy a usar una máquina virtual con Kali Linux básicamente para no ejecutar nada en mi equipo real y menos si proviene de un CTF. :stuck_out_tongue_winking_eye:</p>
<p>El enunciado nos dice lo siguiente:</p>
<blockquote>
<p>You have received the email1 below in connection with a legal action. The timing of the email is critical. Examine the email and determine if it is more likely to be legitimate or fake.</p>
<p>Enter L for legitimate, F for fake. More to come based on your answer.</p>
<p>SHA-256: 42B6FD78DAF38C03E1A744ECA1A0CB 44F6859AB892E0F32B01763EFD835B5648</p>
</blockquote>
<p>Si nos descargamos el fichero EML, el primer paso como siempre es comprobar la suma SHA256. Para ello usamos el comando <code>sha256sum</code> y comprobamos que el &ldquo;hash&rdquo; coincide.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ sha256sum Draft_Agreement.eml 
</span></span><span style="display:flex;"><span>42b6fd78daf38c03e1a744eca1a0cb44f6859ab892e0f32b01763efd835b5648  Draft_Agreement.eml
</span></span><span style="display:flex;"><span>                                                                           
</span></span><span style="display:flex;"><span>┌──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ 
</span></span></code></pre></div><p>El siguiente paso lógico sería pasar por VirusTotal el fichero para ver si tiene algo raro dentro pero vamos a omitir este paso porque ya sabemos que es algo que todos hacemos antes de abrir un fichero. :wink:</p>
<p>Yo prefiero usar un editor de textos para abrir los ficheros EML y así poder revisar tranquilamente su contenido. En este artículo voy a utilizar el comando <code>grep</code> para simplificar su redacción.</p>
<p>A primera vista las cabeceras que contienen fechas parecen legitimas y están sincronizadas por lo que el correo parece provenir del 7 de marzo de 2016, pero aquí tiene que haber algún truco, no me creo que sea tan sencillo.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ grep Mar Draft_Agreement.eml
</span></span><span style="display:flex;"><span>        Mon, <span style="color:#ae81ff">7</span> Mar <span style="color:#ae81ff">2016</span> 14:38:34 -0800 <span style="color:#f92672">(</span>PST<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>        Mon, <span style="color:#ae81ff">07</span> Mar <span style="color:#ae81ff">2016</span> 14:38:34 -0800 <span style="color:#f92672">(</span>PST<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>        Mon, <span style="color:#ae81ff">07</span> Mar <span style="color:#ae81ff">2016</span> 14:38:34 -0800 <span style="color:#f92672">(</span>PST<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>Received: from sonic.gate.mail.ne1.yahoo.com by sonic306.consmr.mail.bf2.yahoo.com with HTTP; Mon, <span style="color:#ae81ff">7</span> Mar <span style="color:#ae81ff">2016</span> 22:38:33 +0000
</span></span><span style="display:flex;"><span>Date: Mon, <span style="color:#ae81ff">7</span> Mar <span style="color:#ae81ff">2016</span> 22:38:31 +0000 <span style="color:#f92672">(</span>UTC<span style="color:#f92672">)</span>
</span></span></code></pre></div><p>Comprobando el resto de cabeceras vemos que hay una interesante, la que se corresponde con &ldquo;X-Mailer&rdquo; que habla de la versión 87.0.4280.67  de Chrome y de Edge basado en Chromium tal y como se puede ver en la siguiente captura.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>┌──<span style="color:#f92672">(</span>kali㉿kali<span style="color:#f92672">)</span>-<span style="color:#f92672">[</span>~/Desktop<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>└─$ grep <span style="color:#e6db74">&#39;X-Mailer&#39;</span> Draft_Agreement.eml        
</span></span><span style="display:flex;"><span>X-Mailer: WebService/1.1.17111 YMailNorrin Mozilla/5.0 <span style="color:#f92672">(</span>Windows NT 10.0; Win64; x64<span style="color:#f92672">)</span> AppleWebKit/537.36 <span style="color:#f92672">(</span>KHTML, like Gecko<span style="color:#f92672">)</span> Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.55
</span></span></code></pre></div><p>Aquí hay algo raro. Si buscamos en Google podemos confirmar que esa versión de Chrome es del 17 de noviembre de 2020, con lo que es imposible que el correo sea del año 2016.</p>
<p><img src="%7B%7Bsite.url%7D%7D/assets/fecha_salida_chrome.png" alt="fecha_salida_chrome.png"></p>
<p>¡Bingo! Ya tenemos la prueba para demostrar que la fecha del correo fue alterada.</p>
]]></description>
      
    </item>
    
    
    
    <item>
      <title>Cómo cambiar el comportamiento del cierre de la tapa del portátil en Ubuntu</title>
      <link>https://www.igalvan.es/posts/cambio-comportamiento-cerrar-tapa-ubuntu/</link>
      <pubDate>Mon, 14 Dec 2020 16:00:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/cambio-comportamiento-cerrar-tapa-ubuntu/</guid>
      <description><![CDATA[<p>Ahora mismo estoy usando un portátil con Kubuntu 20.04 como equipo principal conectado a un monitor panorámico para mi uso personal y por problemas de espacio me he encontrado con la tesitura de tener que &ldquo;achicar huecos&rdquo;. El problema viene que en los portatiles cuando cierras la tapa el comportamiento por defecto es suspender el equipo y eso no es una buena idea cuando quieres seguir trabajando con él.</p>
<p>Con este pequeño cambio en el fichero <code>/etc/systemd/logind.conf</code> se puede alterar el comportamiento por defecto y, en mi caso, no haga nada. La verdad es que se puede configurar cualquiera de las siguientes cinco opciones:</p>
<ul>
<li><code>HandleLidSwitch=suspend</code>. Suspende el equipo y es el comportamiento por defecto.</li>
<li><code>HandleLidSwitch=lock</code>. Bloquea la pantalla.</li>
<li><code>HandleLidSwitch=ignore</code>. No hace nada, que sería el comportamiento que yo quiero utilizar.</li>
<li><code>HandleLidSwitch=poweroff</code>. Apaga el equipo.</li>
<li><code>HandleLidSwitch=hibernate</code>. Hiberna el equipo.</li>
</ul>
<p>El proceso es sencillo, hay que editar el fichero /etc/systemd/logind.conf con permisos de root y buscar la línea que pone <code>#HandleLidSwitch=suspend</code> y cambiarla por cualquiera de las cinco de arriba según corresponda.</p>
<p>![fichero logind.conf]({{ site.url }}/assets/fichero_logind.png)</p>
<p>Después solo hay que reiniciar el servicio logind mediante el siguiente comando y ya hemos terminado.</p>
<pre tabindex="0"><code>systemctl restart systemd-logind.service
</code></pre>]]></description>
      
    </item>
    
    
    
    <item>
      <title>Policy Based Routing en CentOS 7</title>
      <link>https://www.igalvan.es/posts/policy-based-routing-en-centos-7/</link>
      <pubDate>Sat, 25 Aug 2018 19:30:00 +0100</pubDate>
      
      <guid>https://www.igalvan.es/posts/policy-based-routing-en-centos-7/</guid>
      <description><![CDATA[<p>Por defecto en los servidores CentOS con multiples interfaces de red todo el tráfico es devuelto por la interface que contenga la ruta por defecto. Este comportamiento no tiene nada de malo hasta que nos encontramos en escenarios donde es obligatorio separar el tráfico.</p>
<h2 id="escenario">Escenario</h2>
<p>En nuestro escenario partimos de la presencia de un servidor con dos interfaces de red, la primera en la red 10.0.2.0/24 que tiene la puerta de enlace por defecto en la IP 10.0.2.2, vamos a llamarla &ldquo;red pública&rdquo;, y la segunda en la red 192.168.56.20/24, vamos a llamarla &ldquo;red de gestión&rdquo;.  Queremos que todo el tráfico de la red de gestión se enrute por la segunda interfaz por temas de seguridad.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@routes ~<span style="color:#f92672">]</span><span style="color:#75715e"># ip addr show | grep &#34;inet\b&#34; | awk &#39;{print $2&#34; &#34;$NF}&#39;</span>
</span></span><span style="display:flex;"><span>127.0.0.1/8 lo
</span></span><span style="display:flex;"><span>10.0.2.15/24 enp0s3
</span></span><span style="display:flex;"><span>192.168.56.22/24 enp0s8
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@routes ~<span style="color:#f92672">]</span><span style="color:#75715e"># ip route|grep default</span>
</span></span><span style="display:flex;"><span>default via 10.0.2.2 dev enp0s3 proto static metric <span style="color:#ae81ff">100</span> 
</span></span></code></pre></div><h2 id="instrucciones">Instrucciones</h2>
<p>Antes de comenzar a configurar PBR, en CentOS 7 es necesario instalar el siguiente paquete:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@routes ~<span style="color:#f92672">]</span><span style="color:#75715e"># yum install -y NetworkManager-dispatcher-routing-rules</span>
</span></span></code></pre></div><p>El siguiente paso es crear la entrada de la política de enrutado:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@routes ~<span style="color:#f92672">]</span><span style="color:#75715e"># echo &#34;2 mgt&#34; &gt;&gt; /etc/iproute2/rt_tables</span>
</span></span></code></pre></div><p>El siguiente paso es crear las reglas para la interfaz enp0s8:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@routes ~<span style="color:#f92672">]</span><span style="color:#75715e"># vi /etc/sysconfig/network-scripts/rule-enp0s8</span>
</span></span><span style="display:flex;"><span>from 192.168.56.22/32 table mgt
</span></span><span style="display:flex;"><span>to 192.168.56.22/32 table mgt
</span></span></code></pre></div><p>El siguiente paso es crear la ruta por defecto para la interfaz enp0s8:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@routes ~<span style="color:#f92672">]</span><span style="color:#75715e"># vi /etc/sysconfig/network-scripts/route-enp0s8</span>
</span></span><span style="display:flex;"><span>default via 192.168.56.21 dev enp0s8 table mgt
</span></span></code></pre></div><p>Una vez configurado todo, tenemos que recargar la configuración para hacerla efectiva:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@routes ~<span style="color:#f92672">]</span><span style="color:#75715e"># nmcli connection reload</span>
</span></span></code></pre></div><p>Comrpobamos que todo está configurado según esperabamos:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>root@routes ~<span style="color:#f92672">]</span><span style="color:#75715e"># ip rule show</span>
</span></span><span style="display:flex;"><span>0:	from all lookup local 
</span></span><span style="display:flex;"><span>32764:	from all to 192.168.56.22 lookup mgt
</span></span><span style="display:flex;"><span>32765:	from 192.168.56.22 lookup mgt 
</span></span><span style="display:flex;"><span>32766:	from all lookup main 
</span></span><span style="display:flex;"><span>32767:	from all lookup default
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>root@routes ~<span style="color:#f92672">]</span><span style="color:#75715e"># ip route show table mgt</span>
</span></span><span style="display:flex;"><span>default via 192.168.56.21 dev enp0s8 
</span></span></code></pre></div>]]></description>
      
    </item>
    
    
  </channel>
</rss>
