Archive | Clic

En 2022, j’ai juste envie de faire du Splunk et de la PKI

Fenêtre sur le monde

Fenêtre sur le monde

Et ce sera déjà pas mal !

Mon projet : monter une PKI avec ejbca adossée à 3 openLDAP en multi-maître en backend (avec quelques clefs dans 2 HSM Atos Protecio en réplication. La-dessus, mettre en place un provider d’identité avec keycloack.

Voilà, y’a plus qu’à …

Bref un truc comme ce qu’on avait prévu à Ougadougou en 2016 😉 (avant qu’il ‘y ait le feu à l’Assemblée Nationale

Posted in Boulot, Clic, Crypto, Ecole0 commentaire

Eléments de conf pour TP TLS

1- Etape 1 avec un certificat autosigné :

root@debian:/home/ensibs# apt-get install apache2

Reading package lists… Done

Building dependency tree… Done

Reading state information… Done

The following additional packages will be installed:

apache2-data apache2-utils ssl-cert

Suggested packages:

apache2-doc apache2-suexec-pristine | apache2-suexec-custom

The following NEW packages will be installed:

apache2 apache2-data apache2-utils ssl-cert

0 upgraded, 4 newly installed, 0 to remove and 1 not upgraded.

Need to get 706 kB of archives.

After this operation, 2,057 kB of additional disk space will be used.

Do you want to continue? [Y/n] Y

Get:1 http://deb.debian.org/debian bullseye/main amd64 ssl-cert all 1.1.0+nmu1 [21.0 kB]

Get:2 http://security.debian.org/debian-security bullseye-security/main amd64 apache2-data all 2.4.51-1~deb11u1 [160 kB]

Get:3 http://security.debian.org/debian-security bullseye-security/main amd64 apache2-utils amd64 2.4.51-1~deb11u1 [255 kB]

Get:4 http://security.debian.org/debian-security bullseye-security/main amd64 apache2 amd64 2.4.51-1~deb11u1 [270 kB]

Fetched 706 kB in 1s (1,332 kB/s)

Preconfiguring packages …

Selecting previously unselected package apache2-data.

(Reading database … 162254 files and directories currently installed.)

Preparing to unpack …/apache2-data_2.4.51-1~deb11u1_all.deb …

Unpacking apache2-data (2.4.51-1~deb11u1) …

Selecting previously unselected package apache2-utils.

Preparing to unpack …/apache2-utils_2.4.51-1~deb11u1_amd64.deb …

Unpacking apache2-utils (2.4.51-1~deb11u1) …

Selecting previously unselected package apache2.

Preparing to unpack …/apache2_2.4.51-1~deb11u1_amd64.deb …

Unpacking apache2 (2.4.51-1~deb11u1) …

Selecting previously unselected package ssl-cert.

Preparing to unpack …/ssl-cert_1.1.0+nmu1_all.deb …

Unpacking ssl-cert (1.1.0+nmu1) …

Setting up ssl-cert (1.1.0+nmu1) …

Setting up apache2-data (2.4.51-1~deb11u1) …

Setting up apache2-utils (2.4.51-1~deb11u1) …

Setting up apache2 (2.4.51-1~deb11u1) …

Enabling module mpm_event.

Enabling module authz_core.

Enabling module authz_host.

Enabling module authn_core.

Enabling module auth_basic.

Enabling module access_compat.

Enabling module authn_file.

Enabling module authz_user.

Enabling module alias.

Enabling module dir.

Enabling module autoindex.

Enabling module env.

Enabling module mime.

Enabling module negotiation.

Enabling module setenvif.

Enabling module filter.

Enabling module deflate.

Enabling module status.

Enabling module reqtimeout.

Enabling conf charset.

Enabling conf localized-error-pages.

Enabling conf other-vhosts-access-log.

Enabling conf security.

Enabling conf serve-cgi-bin.

Enabling site 000-default.

Created symlink /etc/systemd/system/multi-user.target.wants/apache2.service → /lib/systemd/system/apache2.service.

Created symlink /etc/systemd/system/multi-user.target.wants/apache-htcacheclean.service → /lib/systemd/system/apache-htcacheclean.service.

Processing triggers for man-db (2.9.4-2) …

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

link/ether 08:00:27:0c:52:89 brd ff:ff:ff:ff:ff:ff

inet 192.168.56.101/24 brd 192.168.56.255 scope global dynamic noprefixroute enp0s3

valid_lft 589sec preferred_lft 589sec

inet6 fe80::a00:27ff:fe0c:5289/64 scope link noprefixroute

valid_lft forever preferred_lft forever

 

root@debian:/home/ensibs# cd /var/lib/apache2/

root@debian:/var/lib/apache2# ls

conf module site

root@debian:/var/lib/apache2# cd conf

root@debian:/etc/apache2# ls

apache2.conf conf-available conf-enabled envvars magic mods-available mods-enabled ports.conf sites-available sites-enabled

root@debian:/etc/apache2# vi apache2.conf

root@debian:/etc/apache2# cd mods-enabled/

root@debian:/etc/apache2/mods-enabled# ls

access_compat.load auth_basic.load authz_core.load autoindex.conf deflate.load env.load mime.load negotiation.conf reqtimeout.load status.conf

alias.conf authn_core.load authz_host.load autoindex.load dir.conf filter.load mpm_event.conf negotiation.load setenvif.conf status.load

alias.load authn_file.load authz_user.load deflate.conf dir.load mime.conf mpm_event.load reqtimeout.conf setenvif.load

root@debian:/etc/apache2/mods-enabled# cd ..

root@debian:/etc/apache2# cd mods-available/

root@debian:/etc/apache2/mods-available# ls

access_compat.load authz_core.load cgi.load expires.load ldap.conf negotiation.load proxy_uwsgi.load socache_dbm.load

actions.conf authz_dbd.load charset_lite.load ext_filter.load ldap.load proxy_ajp.load proxy_wstunnel.load socache_memcache.load

actions.load authz_dbm.load data.load file_cache.load log_debug.load proxy_balancer.conf ratelimit.load socache_redis.load

alias.conf authz_groupfile.load dav_fs.conf filter.load log_forensic.load proxy_balancer.load reflector.load socache_shmcb.load

alias.load authz_host.load dav_fs.load headers.load lua.load proxy.conf remoteip.load speling.load

allowmethods.load authz_owner.load dav.load heartbeat.load macro.load proxy_connect.load reqtimeout.conf ssl.conf

asis.load authz_user.load dav_lock.load heartmonitor.load md.load proxy_express.load reqtimeout.load ssl.load

auth_basic.load autoindex.conf dbd.load http2.conf mime.conf proxy_fcgi.load request.load status.conf

auth_digest.load autoindex.load deflate.conf http2.load mime.load proxy_fdpass.load rewrite.load status.load

auth_form.load brotli.load deflate.load ident.load mime_magic.conf proxy_ftp.conf sed.load substitute.load

authn_anon.load buffer.load dialup.load imagemap.load mime_magic.load proxy_ftp.load session_cookie.load suexec.load

authn_core.load cache_disk.conf dir.conf include.load mpm_event.conf proxy_hcheck.load session_crypto.load unique_id.load

authn_dbd.load cache_disk.load dir.load info.conf mpm_event.load proxy_html.conf session_dbd.load userdir.conf

authn_dbm.load cache.load dnssd.conf info.load mpm_prefork.conf proxy_html.load session.load userdir.load

authn_file.load cache_socache.load dnssd.load lbmethod_bybusyness.load mpm_prefork.load proxy_http2.load setenvif.conf usertrack.load

authn_socache.load cern_meta.load dump_io.load lbmethod_byrequests.load mpm_worker.conf proxy_http.load setenvif.load vhost_alias.load

authnz_fcgi.load cgid.conf echo.load lbmethod_bytraffic.load mpm_worker.load proxy.load slotmem_plain.load xml2enc.load

authnz_ldap.load cgid.load env.load lbmethod_heartbeat.load negotiation.conf proxy_scgi.load slotmem_shm.load

root@debian:/etc/apache2/mods-available# vi ssl.conf

root@debian:/etc/apache2/mods-available# cd ..

root@debian:/etc/apache2# vi apache2.conf

root@debian:/etc/apache2# a2enmod ssl

Considering dependency setenvif for ssl:

Module setenvif already enabled

Considering dependency mime for ssl:

Module mime already enabled

Considering dependency socache_shmcb for ssl:

Enabling module socache_shmcb.

Enabling module ssl.

See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.

To activate the new configuration, you need to run:

systemctl restart apache2

root@debian:/etc/apache2# a2ensite default-ssl

Enabling site default-ssl.

To activate the new configuration, you need to run:

systemctl reload apache2

root@debian:/etc/apache2# service apache2 reload

root@debian:/etc/apache2# mkdir tls

root@debian:/etc/apache2# cd tls

root@debian:/etc/apache2# ls

apache2.conf conf-available conf-enabled envvars magic mods-available mods-enabled ports.conf sites-available sites-enabled tls

root@debian:/etc/apache2# chmod 600 tls/*.*

root@debian:/etc/apache2# ls

apache2.conf conf-available conf-enabled envvars magic mods-available mods-enabled ports.conf sites-available sites-enabled tls

root@debian:/etc/apache2# cd sites-enabled/

root@debian:/etc/apache2/sites-enabled# ls

000-default.conf default-ssl.conf

root@debian:/etc/apache2/sites-enabled# vi default-ssl.conf

root@debian:/etc/apache2/sites-enabled# cd /etc/ssl

root@debian:/etc/ssl# ls

certs openssl.cnf private

root@debian:/etc/ssl# ls -lart

total 44

-rw-r–r– 1 root root 11118 Aug 24 10:28 openssl.cnf

drwxr-xr-x 4 root root 4096 Oct 19 14:52 .

drwx–x— 2 root ssl-cert 4096 Oct 27 18:04 private

drwxr-xr-x 2 root root 12288 Oct 27 18:04 certs

drwxr-xr-x 119 root root 12288 Oct 27 18:21 ..

root@debian:/etc/ssl# vi openssl.cnf

root@debian:/etc/ssl# cd /etc/apache2/tls/

root@debian:/etc/apache2/tls# cd /etc/ssl

root@debian:/etc/ssl# ls

certs openssl.cnf private

root@debian:/etc/ssl# less openssl.cnf

root@debian:/etc/ssl#

root@debian:/etc/ssl# vi openssl.cnf

root@debian:/etc/ssl# cd /etc/apache2/sites-enabled/

root@debian:/etc/apache2/sites-enabled# ls

000-default.conf default-ssl.conf

root@debian:/etc/apache2/sites-enabled# vi default-ssl.conf

root@debian:/etc/apache2/sites-enabled# service apache2 restart

root@debian:/etc/apache2/sites-enabled# cd ..

root@debian:/etc/apache2# ls

apache2.conf conf-available conf-enabled envvars magic mods-available mods-enabled ports.conf sites-available sites-enabled tls

root@debian:/etc/apache2# vi apache2.conf

root@debian:/etc/apache2# cd sites-enabled/

root@debian:/etc/apache2/sites-enabled# ls

000-default.conf default-ssl.conf

root@debian:/etc/apache2/sites-enabled# vi default-ssl.conf

root@debian:/etc/apache2/sites-enabled# service apache2 start

root@debian:/etc/apache2/sites-enabled# cd /etc/

root@debian:/etc# ls

root@debian:/etc# cd /etc/apache2/tls

root@debian:/etc/apache2/tls# openssl genrsa 2048 > web.key

Generating RSA private key, 2048 bit long modulus (2 primes)

………………………………………………………………………………………………………………..+++++

…………………………………………………………………………..+++++

e is 65537 (0x010001)

root@debian:/etc/apache2/tls# openssl req -new -key web.key > web.csr

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter ‘.’, the field will be left blank.

—–

Country Name (2 letter code) [AU]:FR

State or Province Name (full name) [Some-State]:BZH

Locality Name (eg, city) []:Lostihuel

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ministère désarmé

Organizational Unit Name (eg, section) []:IT

Common Name (e.g. server FQDN or YOUR name) []:127.0.0.1

Email Address []:laurent@laurent.fr

 

Please enter the following ‘extra’ attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

root@debian:/etc/apache2/tls# openssl genrsa 2048 > ca.key

Generating RSA private key, 2048 bit long modulus (2 primes)

..+++++

……………………………………………………………+++++

e is 65537 (0x010001)

root@debian:/etc/apache2/tls# openssl req -new -x509 -days 365 -key ca.key > ca.crt

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter ‘.’, the field will be left blank.

—–

Country Name (2 letter code) [AU]:FR

State or Province Name (full name) [Some-State]:BZH

Locality Name (eg, city) []:Lostihuel

Organization Name (eg, company) [Internet Widgits Pty Ltd]:BZH CA

Organizational Unit Name (eg, section) []:IT

Common Name (e.g. server FQDN or YOUR name) []:BZH CA

Email Address []:lm@lm.fr

root@debian:/etc/apache2/tls# openssl x509 -req -in web.csr -out web.crt -CA ca.crt -CAkey ca.key -CAcreateserial -CAserial ca.srl

Signature ok

subject=C = FR, ST = BZH, L = Lostihuel, O = Minist\C3\83\C2\A8re d\C3\83\C2\A9sarm\C3\83\C2\A9, OU = IT, CN = 127.0.0.1, emailAddress = laurent@laurent.fr

Getting CA Private Key

root@debian:/etc/apache2/tls# ls -lart

total 40

-rw——- 1 root root 948 Oct 27 18:40 servwiki.crt

-rw-r–r– 1 root root 887 Oct 28 11:12 macle.key

drwxr-xr-x 9 root root 4096 Oct 28 11:35 ..

-rw-r–r– 1 root root 1679 Oct 28 11:55 web.key

-rw-r–r– 1 root root 1070 Oct 28 11:58 web.csr

-rw——- 1 root root 1675 Oct 28 12:04 ca.key

-rw-r–r– 1 root root 1383 Oct 28 12:06 ca.crt

-rw-r–r– 1 root root 1306 Oct 28 12:07 web.crt

-rw-r–r– 1 root root 41 Oct 28 12:07 ca.srl

root@debian:/etc/apache2/tls# chmod 600 web.*

root@debian:/etc/apache2/tls# ls -lart

total 40

-rw——- 1 root root 948 Oct 27 18:40 servwiki.crt

-rw-r–r– 1 root root 887 Oct 28 11:12 macle.key

drwxr-xr-x 9 root root 4096 Oct 28 11:35 ..

-rw——- 1 root root 1679 Oct 28 11:55 web.key

-rw——- 1 root root 1070 Oct 28 11:58 web.csr

-rw——- 1 root root 1675 Oct 28 12:04 ca.key

-rw-r–r– 1 root root 1383 Oct 28 12:06 ca.crt

-rw——- 1 root root 1306 Oct 28 12:07 web.crt

-rw-r–r– 1 root root 41 Oct 28 12:07 ca.srl

drwxr-xr-x 2 root root 4096 Oct 28 12:07 .

root@debian:/etc/apache2/tls# rm servwiki.crt

root@debian:/etc/apache2/tls# rm macle.key

root@debian:/etc/apache2/tls# cd ..

root@debian:/etc/apache2# ls

apache2.conf conf-available conf-enabled envvars magic mods-available mods-enabled ports.conf sites-available sites-enabled tls

root@debian:/etc/apache2# cd sites-enabled/

root@debian:/etc/apache2/sites-enabled# ls

000-default.conf default-ssl.conf

root@debian:/etc/apache2/sites-enabled# vi default-ssl.conf

root@debian:/etc/apache2/sites-enabled# service apache2 restart

 

2 – Etape 2 avec un certificat signé par let’s encrypt

C’est plus compliqué car votre serveur doit avoir un nom de domaine que Let’s encrypt vérifiera (bref ne présente pas d’intérêt dans le cadre de la découverte de TLS)

Posted in Clic, Ecole0 commentaire

Playing with HTTPS

Je pose ça là !

L’inspection SSL/TLS, comment ca marche ?

J’ai un flux chiffré entre mon serveur et mon navigateur et je veux voir son contenu à l’ancienne (après je détaillerai comment on fait de l’inspection avec Kaspesrsky security endpoint chez mon employeur).

On va commencer par se mettre dan un cas favorable. Ce qui n’est pas le cas quand vous avez déployé HTTPS sur/etc/letsencrypt/options-ssl-apache.conf  votre site web comme un bourrin avec CERTBOT (mais merci quand même Let’s Encrypt).

Conf de base

Conf de base

Ca ne me plait pas, donc je vais désactiver Diffie-Hellman. Laissez moi faire du SSL 2.1 avec rien que du RSA, please  🙂

This task provides the procedure to disable Diffie-Hellman on Apache Servers by editing the SSLCipherSuite config option string in the ssl.conf or httpd.conf files.
Procedure

In Apache’s conf directory, locate file: ssl.conf or httpd.conf
Look for the SSLCipherSuite keyword string value:

Apache Cipher Suite

Apache Cipher Suite

To disable Diffie-Hellman, please insert « !EDH:!DHE:!DH:!ECDH » after the « ALL: » in the cipher spec.
This is an example and you will need to make sure you include it to all the variants of Diffie-Hellman to disable it on your web server.
For additional info: https://httpd.apache.org/docs/current/mod/mod_ssl.html#sslciphersuite

Repeat this edit in every SSL config section, if you are not using one global section.
Save the file.
Restart the web server for the changes to take effect.

Après quelques essais infructueux, il faut bien se rendre à l’évidence que cela ne fonctionne pas 🙂

On se dit donc que la conf de base a du être surchargée par CERTBOT. Bingo !

Real Cipher Suite Conf

Real Cipher Suite Conf

SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

Un petit nettoyage s’impose donc dans /etc/letsencrypt/options-ssl-apache.conf 

On va simplifier à :

SSLCipherSuite AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

Du coup, Wireshark confirme le changement de cipher:

I Love RSA

I Love RSA

Qualys SSL Labs nous confirme cette dégradation du niveau de sécurité :

SSL Labs

SSL Labs

« This server does not support Forward Secrecy with the reference browsers. Grade capped to B » … et oui, d’où l’intérêt de Diffie-Helmann !

En revanche pour « This server supports TLS 1.0 and TLS 1.1. Grade capped to B », on peut certainement faire quelquechose. En particulier, ajouter TLSv1 et TLSv1.1 de la liste des protocoles supportés dans /etc/letsencrypt/options-ssl-apache.conf 

C’est là que les choses sérieuses commencent.

Afin de déchiffrer le flux https, nous allons récupérer la clef privée de notre serveur Apache et la fournir à wireshark. En principe, c’est par ce genre de manipulations hasardeuses que nos précieuses clefs privés finissent dans la nature. En l’occurrence, pas vraiment de sensibilité pour cette plateforme de démo.

Le chemin vers la clef est renseigné dans /etc/letsencrypt/options-ssl-apache.conf 

Je décrirai bientôt ailleurs comment cette clef intervient dans une phase amont du chiffrement de flux. Elle sert juste à « calculer » la véritable clef de chiffrement symétrique du flx entre chacun des navigateurs qu se se connectent  notre serveur Apache.

Le serveur web est exposé directement sur internet et semble fonctionner correctement :

bzhits.fr

bzhits.fr

Pour faciliter la tâche aux attaquants, il expose via sa page index.php le contenu d’un phpinfo().  C’est un pauvre VPS chez OVH qui donne toute satisfaction. Il sert par ailleurs  récupérer des logs du bruit de l’internet…

Cadenas vert pour monsieur Noël, tout semble ok en termes de sécu.

phpinfo()

phpinfo()

Le certificat SSL ( que je n’aime pas cette appellation !!!) présenté à l’air de correspondre au serveur considéré, nous sommes tranquilles jusqu’au 31 décembre 2021.

Certificat X509

Certificat X509

Une première analyse brute du flux confirme un certain nombre d’évidences :

– l’appli répond normalement

– le flux est bien chiffré et débute par le traditionnel « TCP handshake »

– on fait du TLS1.2 over HTTP 1.1

– setup : wireshark (1.12.1) sur Debian intercepte mon interface wan avec filtre de capture sur l’IP du serveur (vsible dans l’entête de la fenêtre)

Capture réseau

Capture réseau

Afin qu’il puisse déchiffrer le flux, on va fournir la clef privée du serveur à Wireshark.

Plz, give me your Private Key

Plz, give me your Private Key

Pour le coup, j’ai crée un formulaire minimaliste (login.html) qui demande un identifiant et un mot de passe à un utilisateur pour le transmettre via requête POST à une page de traitement (login.php).

pwd leak

pwd leak

Grâce à l’interception TLS, on voit très bien passer les informations de connexion (marot / pwd).

Pour un truc plus propre dans Wireshark, préférez passer vos requêtes en ligne de commande via cUrl : curl -k -F « usr=marot » -F « pwd=password » « https://bzhits.fr/login.php »

CQFD step 1

CQFD step 1

Bon, maintenant que cela fonctionne avec touts les précautions précédentes, voyons comment s’adapter au cas où l’administrateur de votre site ait eu la bonne idée d’utiliser Diffie-Helmann. Car vous avez bien compris que si dans 3 mois ou dans 10 quelqu’un trouve votre clef privée et ressort des captures réseau, RIP la confidentialité.

Tout cela était déjà fort bien expliqué par Benjamin aka @vincib lors des confs mémorables « Il était une fois l’internet »

 

____________________________________________________________________________________

Pour pouvoir écrire ces quelques lignes, j’ai du réapprendre à surligner du texte dans une image avec The Gimp (p’tain je préfère snap/capture sous Windows), modifier les fichiers de traductions .po/.mo wordpress avec poEdit, retrouver l’accès ssh à ce vieux VPS chez OVH, appliquer les mises à jours Worpress sans faire de sauvegarde, réviser ma conf Apache / mod_ssl pour  pour les nuls…. Bref, ça m’a pris des plombes…

L’objectif initial de cet article était de proposer une explication sur un vieux chall root-me SSL – HTTP exchange qui était lui même une re-sucée d’un challenge qualif DEF CON préhistorique… et aussi de me servir de base pratique pratique pour une formation que je donnerai sous peu.

Pour aller plus loin, maintenant que vous avez compris le principe, je vous laisse trouver l’appliance sécu qui va bien pour faire la même chose de manière industrielle … dans le respect de la loi … et en accod avec votre perception de l’éthique.

J’espère que cela vous donnera aussi l’envie de lire les Recommandations de sécurité relatives à TLS de l’ANSSI téléchargeables à cette adresse : https://www.ssi.gouv.fr/uploads/2017/07/anssi-guide-recommandations_de_securite_relatives_a_tls-v1.2.pdf

 

Posted in Boulot, Clic0 commentaire

Playing with bcrypt and Joomla

Juste pour poser là quelques détails sur le stockage sécurisé des mots de passe dans Joomla (cms php très courant).

Bref un truc avec lequel on joue un peu en TP, mais qui est aussi parfois bien utile quand on a perdu le mot de passe de l’unique compte d’administration du site (n’est-ce pas la Mairie de N….?, vieille mission Alliacom en 2010).

Si je jette un œil sur le contenu de ma table des utilisateurs Joomla, j’aperçois ce genre de chaînes de caractères dans les champs password :

$2y$10$OL0ibA8TKT.287zm4HPkYuKI/5CH0X1bMe9PyxPRjOxjeCSC/FOwm

On notera par ailleurs qu 2 utilisateurs avec le même mot de passe présenteront un hash différent, bref on est loin du pauvre MD5 sans sel utilisé il y a quelques années par Joomla.

On reconnaît un hash bcrypt par la présence en début de chaîne de  $2y dans ‘$2y$10$’, le $10 est le coût algorithmique, autrement dit 210 = 1 024 itérations.

Les 22 caractères suivants constituent le sel aléatoire. Les caractères qui complètent la chaîne composent le mot de passe hasché. Comme un petit schéma vaut mieux qu’un long discours :

brcypt

brcypt selon wikipedia

Pour plus de détails (tout public) sur bcrypt  : https://www.bcrypt.fr/questions

Et pour aller plus loin dans la compréhension : https://auth0.com/blog/hashing-in-action-understanding-bcrypt/

Et enfin pour faire quelques tests en ligne : https://bcrypt-generator.com/

La fonction crypt en php, fonctionne donc comme cela :

crypt($motdepasse, '$2y$10$'.randombytes(22));
playing with bcrypt and Joomla

playing with bcrypt and Joomla

http://micmap.org/php-by-example/man…ion.crypt.html

Exemple : password (très mauvaise idée de mot de passe)

$2y$10$.prE1BkZ87aPNnsKMTOSxe9pv8TQIhfBb2HZpSnBPfh.LeHgnaLD2

 

Cette fonction est par exemple utilisée dans Joomla la classe/méthdoe JUserHelper::hashPassword pour Joomla. Après étude, il est ainsi relativement simple de créer un fichier joomla-password-hash.php et de le placer à la racine de son site.

<?php
define(‘_JEXEC’, 1);
define(‘JPATH_BASE’, dirname(__FILE__));
require_once(JPATH_BASE . ‘/includes/defines.php’);
require_once(JPATH_BASE . ‘/includes/framework.php’);
echo « <strong>Password: </strong> » . JUserHelper::hashPassword(‘password’);

?>
https://api.joomla.org/cms-3/classes/JUserHelper.html

En résumé, le nombre d’itérations implique un calcul plus long et plus fastidieux pour les scripts de hacks et même si la base de données était piratée, cela me semble un peu plus difficile de retrouver le mot de passe… comme ce fut le cas l’année dernière pour dailymotion (ce service de video utilisent bcrypt également) : https://www.information-security.fr/…didentifiants/

L’implémentation d bcrypt a donné un peu plus de sécurité à Joomla, cela n’empêche pas d’imposer un minimum de caractères, mélange min/maj, caractères spéciaux aux mots de passe pour fonctionner un peu plus efficacement. Il faut éviter par exemple que les utilisateurs utilisent uniquement leur date d’anniversaire pour le mot de passe … (chercher « paradoxe des anniversaires » dans un moteur de recherche si vous aimez les probabilités )…

De plus, il y a aujourd’hui un marché de solutions complémentaires à connaître : MFA, double authentification (google authenticator et dérivé), sans mot de passe comme launchkey.com, par sms avec accountkit de facebook…

Posted in Boulot, Clic1 Commentaire

OpenShift Issue

OpenShift Playground

OpenShift Playground

Sad, no beeing able to assess OpenShift Playground 🙁

 

 

 

 

2 months later 🙁

openshift's answer 2021

openshift’s answer 2021 – Playground is dead

Posted in Boulot, Clic, Trop sérieux2 Comments

my Tchap repo

Ars Technica

Ars Technica

Bug in French government’s WhatsApp replacement let anyone join Élysée chats

Researcher found bug in email validation that let him log in and join « rooms » in Tchap app.

Sean Gallagher – 4/22/2019, 11:55 PM

_____________________________________

fzn

fzn

France : le lancement de l’application Tchap entaché par un bug

Tchap est une application Android lancée par le gouvernement français le 17 avril dernier pour remplacer WhatsApp et Telegram chez ses employés. L’outil verse dans l’échange et la communication, en offrant des canaux de messagerie privés auxquels seules les personnes avec une adresse électronique gouvernementale peuvent accéder.

______________________________________

« Les retours des experts vont nous aider à améliorer Tchap »

À la tête de la direction interministérielle du numérique, Nadi Bou Hanna revient sur le lancement compliqué du « WhatsApp de l’État » et trace sa feuille de route.

Propos recueillis par Héloïse Pons et
Modifié le – Publié le | Le Point.fr
 
_______________________________________
Tchap

Tchap

 

Liens vers les sources :

(From Tchap with love)

______________________________________

La plupart des articles sur #Tchap disent n’importe quoi. Par exemple, silicon.fr/tchap-une-mess… confond le système d’exploitation Riot et le logiciel de messagerie instantanée Riot. #lesMédias
Bortz on Twitter

Bortz on Twitter

 

 

 

 

 

 

______________________________________

 

@fs0c131y

@fs0c131y

Elliot Alderson
 
@fs0c131y
 
1/ Et si on faisait un petit point sur #Tchap?
Parlons des faits, cela permettra à tout le monde de se faire une opinion. Le 23 Mars dernier la @_DINSIC publie sur le PlayStore Tchap, une application de messagerie « sécurisée » pour les employés du gouvernement français.
9:41 AM · 21 avr. 2019 · Twitter for iPhone
 
_______________________________________

Gros site opportuniste tout pété : tchap.fr.

 

Gros site opportuniste

Gros site opportuniste

 

A ne pas confondre avec le site officiel https://www.tchap.gouv.fr/ qui présente en particulier sa rubrique FAQ.

Tchap

Tchap

 
 
 
 
 
 
 
 
 
 
 
_______________________________________
New Vector
 
New Vector

New Vector

 
 
 
 
 
 
 
 
 
 
 
_______________________________________
Thales
 
Thales

Thales

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
_______________________________________
Matrix / Riot

Riot is a glossy Matrix client built on top of matrix-react-sdk with an emphasis on performance and usability.

You can use it at https://riot.im/app, read more at https://riot.im and get the source from github!

There is also a desktop version, which is available at riot.im. Taw has created RPM package builds for Fedora, CentOS, and Red Hat Enterprise Linux which are available via GitHub and Fedora COPR.

Josué Tille has contributed a Yunohost app.

Repository: https://github.com/vector-im/riot-web/

Matrix / Riot
 
 
 
 
 
 
 
 
 
 
_______________________________________
 

Posted in Boulot, Clic0 commentaire

RESTful API for the dummies

An Application Program Interface aka API is code that allows two software programs to communicate with each another. The API spells out the proper way for a developer to write some code requesting services from an operating system or other applications. In a web context, APIs allow communication between two webapps (or a web app and a client that is not always a brose) without any browser.

A RESTful API, also referred to as a RESTful web service, is an Application Program Interface that uses HTTP requests to GET, PUT, POST and DELETE data.

A RESTful API  is based on REpresentational State Transfer (REST) technology, an architectural style and approach to communications often used in web services development.

REST technology is generally preferred to the more robust Simple Object Access Protocol (SOAP) technology because REST leverages less bandwidth, making it more suitable for internet usage.

The REST used by browsers can be thought of as the language of the internet. With cloud use on the rise, APIs are emerging to expose web services. REST is a logical choice for building APIs that allow users to connect and interact with cloud services. RESTful APIs are used by such sites as Amazon, Google, LinkedIn and Twitter.

 

 

A la base, j’aimais bien cet article pour une partie de son contenu mais pas pour le plan de construction et comme j’avais besoin d’expliquer pourquoi certaines API ne respectaient pas les concepts REST, j’ai eu besoin de ré-écrire cette introduction.

Posted in Boulot, Clic, Trop sérieux0 commentaire

Cyber Range

Ecoute attentive ce jour du dernier podcast hebdomadaire de « No Limit Secu » consacré au(x) Cyber Range(s)

Parmi les invités on retrouve :

Diateam

Diateam

Sysdream

Sysdream

Cyber Test System

Cyber Test System

Ces trois spécialistes sont interrogés par les animateurs habituels Hervé Schauer, Nicolas Ruff et Johan Uloa.

Définition officielle du cyber range ?

3′ : Juste une infrastructure ?

GP : c’est pas nouveau … Très variable selon les moyens que l’on veut y mettre : copie d’un système réel dans lequel on vient s’entraîner. Champ de tir numérique ?

Histoire : 2008, idée de faire tests d’un système complet (National Cyber Range de la DARPA) au delà du simple tests « unitaires » d’équipements.

7′ : HS : les Arc-en-Ciel Team ?

AK : Au départ seulement attaque-défense entre 2 équipes (Red vs Blue) puis d’autres acteurs ont rejoint l’environnement.

Read Team : équipe d’attaquants. Soit ils ont leurs propres outils soient ils activent des générations automatiques d’attaques et de trafic.

Greeen Team : simulation de trafic légitime pour faire fonctionner le système

Yellow Team : l’équipe qui participe involontairement au scénario de l’attaquant. Ils prennent part à une activité malicieuse sans forcément s’en rendre compte.

Blue Team : elle assure la supervision, ce n’est pas seulement la défense (SOC, NOC, Réponse à incident). Elle assure le bon fonctionnement de la Blue Team => les experts ne sont pas forcément exactement en phase sur le sujet.

White Team : ils ont le contrôle de l’exercice global

Purple Team : relais d’info, legal, communication.

OF : bonne analogie entre cyber range et simulateur de vol.

17′ : Formation avant entraînement ?

OF : Le cyber range est un prolongement de la formation. La formation ce sont de petits exercices courts avant de passer en environnement complexe qui ressemble à son environnement réel.

NR : s’inquiète de la possibilité de reproduire, ne serait-ce qu’en termes de licences (ou dongles) dans l’environnement réel

GP : la formation c’est du video training +  slide + labo exercice sur sa VM. Petit rappel de Confucius et du constructivisme par GP : Tout ce qu’on voit on oublie, tout ce qu’on fait, on retient ! Puis GP nous fait une petite analogie avec les Centre d’Entrainement en Zone UrBaine (CENZUB – Centre de l’armée de terre à Sissone). A ne pas confondre avec l’eunuque (SansZob) (Note du rédacteur pour vérifier si tout le mode suit). Entraînement en environnement urbain des forces.

Un cyber range c’est un environnement qui permet d’opposer des défenseurs et des opposants. Il faut qu’il y ait de la vie dans le système. Les partenaires technologiques de BlueCyForce permettent l’

NR : Concernant toujours la représentativité du système, comment fait-on pour simuler Virus Total ?

GP propose un faux Virus Total, Twitter (basé sur Mastodont), AFP … et on regénère la plateforme à chaque séquence. Malgré tout, on grille ses touches et ses backdoors à chaque jeu.

NR : Pas possible de faire du passive DNS sur 3 ans ou rapports publiques et indicateurs de compromission => on travaille en vase clos.

AK : mise en place d’un système de QuarksLab et applications de vie spécifiques

25′ NR : Quid de la qualité de scenario, qui les écrit ? (le client qui ne connaît pas ses risques ou le fournisseur qui ne connaît pas le métier)?

GP nous perd un peu… mais ajoute que c’est un peu des deux et qu’il existe à la fois une Blue Team Teachnique et une Blue Team management. Exemple : 22 pages de timeline et 32 pages de plateforme reçreçues du client. Cela dépend du niveau d’exigence du client.

NR : est-ce que vous simulez des consultants ?

GP : si c’est demandé (quand cela permet de rajouter des éléments de contexte), on le fait. Un exercice de gestion de crise, c’est une utilisation du Cyber Range. Exemple du cameraman qui intervient au milieu de la nuit …

(outre le fait de savoir à quel moment ils allaient parler de l’ENSIBS … je voulais connaître le point de vue de chacun sur le sujet et cela faisait écho à la présentation d’Eric Weber de Thales Communication and Security sur le sujet à C&ESAR 2017 : Problématique de formation des opérateurs face aux menaces Cyber : utilisation des Cyber Range )

31′ : NR : qui fait quoi avec des Cyber Range ? Quel est l’état du marché ? Formation au pentest ?

GP : Prestation d’entraînement et de formation, vente de cyber range avec +/- de prestation.

OF : on cherche à suivre les performances des joueurs. Etablir un ranking / score gobal. L’idée est que chaque année cela s’améliore

AK : ….

HS : Le Cyber Range n’est-il pas plus utile pour la défense que dans l’attaque que NR transforme en une question sur le glissement des plateformes de cyber range avec un bout d’ANSIBLE et trois clics dans le Cloud ?

GP : Au contraire les gens veulent avoir leur plateforme … même si BluecyForce a annoncé au FIC du cyber range as a service (30% des usages). Un hyperviseur avec des VMs ne font pas un CyberRange. Compliqué d’aller mettre dans le Cloud, ton routeur chiffreur de l’OTAN. Le cyber range c’est : Mon infra, mes vulns, mon chemin ! Comme au CENZUB c’est un environnement le plus réaliste possilbe pour s’entraîner à répondre aux cyber-attaques

OF : le cyber range permet de faire de la formation, de la gestion de crise mais aussi du challenge qui permet de se former en s’amusant (Coucou Malice ???)

AK : les directives telles NIS obligent à suivre des entraînement continus. Déjà le cas en zone Asie-Pacifique les entreprises critiques sont obligés d’envoyer ses salariés suivre des entraînements à l’extérieur

HS : Si on s’entraine pas régulièrement, en trois ans on a tout oublié de la formation

GP n’est pas nostalgique mais nous raconte l’évolution de son cyber range depuis SSTIC 2005 : Simulation hybride de la sécurité des systèmes d’information : « vers un environnement virtuel de formation ».  SPLUNK (pseudo SIEM… so right !), QRadar, Prelude Keenaï : on ne fera pas d’entraînement pertinent à des gens s’ils n’y croient pas, s’il n’est pas représentatif. L’important c’est d’y croire. Eh Guillaume, y’a plus de carburateurs depuis longtemps 🙂

JU : Comment simule-t-on la pression psychologique de la crise ?

GP nous met en garde sur la multiplicité des Teams mais le besoin d’avoir une équipe d’acteurs crédibles

NR : simuler une équipe de l’ANSSI qui débarque c’est possible ?

Mot de la fin :

49′ HS : l’entrainement c’est ce qui fait le succès de ce qu’on a enseigné au départ. La formation c’est bien, l’entrainement c’est mieux. Teddy Riner s’entraine tous les jours

(outre le fait de savoir à quel moment ils allaient parler de l’ENSIBS … je voulais connaître le point de vue de chacun sur le sujet et cela faisait écho à la présentation d’Eric Weber de Thales Communication and Security sur le sujet à C&ESAR 2017 : Problématique de formation des opérateurs face aux menaces Cyber : utilisation des Cyber Range)

en goody : Un bon doc d’Airbus DS sur le sujet.

 

Offre Cyber Range (merci Airbus DS)

Offre Cyber Range (merci Airbus DS)

Posted in Boulot, Clic0 commentaire

OVH VPS Testing Platform…

Victime de son succès mon hackMeIfYouCan a tenu une bonne dizaine de mois. On va essayer de faire mieux 🙂

Tomcat 9.0.4 : http://vps305886.ovh.net:8080/

Apache2 over Debian : http://vps305886.ovh.net/

Posted in Boulot, Clic0 commentaire

MySQL on Debian (Cheat sheet for my students)

Install MySQL Server

sudo apt-get install mysql-server

During the installation process, you will be prompted to set a password for the MySQL root user as shown below. Choose a strong password and keep it in a safe place for future reference (Why not usin KeePass ?).

mysql-rootpw-debian

mysql-rootpw-debian

MySQL will bind to localhost (127.0.0.1) by default. Then you can connect locally on to your databases.

Allowing unrestricted access to MySQL on a public IP is not advised, but you may change the address it listens on by modifying the bind-address parameter in /etc/my.cnf. If you decide to bind MySQL to your public IP, you should implement firewall rules that only allow connections from specific IP addresses and then you’ll be able to connect using SSH from another computer.

Harden MySQL Server

It’s also a good thing to harden you database server. Fo taht, run the mysql_secure_installation script to address several security concerns in a default MySQL installation.

sudo mysql_secure_installation

You will be given the choice to :

  1. change the MySQL root password;
  2. remove anonymous user accounts;
  3. disable root logins outside of localhost,
  4. and remove test databases.

It is recommended that you answer yes to these options.

You can read more about the script in the MySQL Reference Manual.

Using MySQL

The standard tool for interacting with MySQL is the mysql client which installs with the mysql-server package. The MySQL client is used through a terminal. In a very firts time, it’s definitely bad thing to use web GUI to discover mysql functionalities.

Logging as root

  1. To log in to MySQL as the root user:
    mysql -u root -p
    
  2. When prompted, enter the root password.You’ll then be presented with a welcome header and the MySQL prompt as shown below:
    mysql>
    
  3. To generate a list of commands for the MySQL prompt, enter \h. You’ll then see:
    List of all MySQL commands:
    Note that all text commands must be first on line and end with ';'
    ?         (\?) Synonym for `help'.
    clear     (\c) Clear command.
    connect   (\r) Reconnect to the server. Optional arguments are db and host.
    delimiter (\d) Set statement delimiter. NOTE: Takes the rest of the line as new delimiter.
    edit      (\e) Edit command with $EDITOR.
    ego       (\G) Send command to mysql server, display result vertically.
    exit      (\q) Exit mysql. Same as quit.
    go        (\g) Send command to mysql server.
    help      (\h) Display this help.
    nopager   (\n) Disable pager, print to stdout.
    notee     (\t) Don't write into outfile.
    pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
    print     (\p) Print current command.
    prompt    (\R) Change your mysql prompt.
    quit      (\q) Quit mysql.
    rehash    (\#) Rebuild completion hash.
    source    (\.) Execute an SQL script file. Takes a file name as an argument.
    status    (\s) Get status information from the server.
    system    (\!) Execute a system shell command.
    tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
    use       (\u) Use another database. Takes database name as argument.
    charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
    warnings  (\W) Show warnings after every statement.
    nowarning (\w) Don't show warnings after every statement.
    
    For server side help, type 'help contents'
    
    mysql>
    

 

Create a New MySQL User and Database

  1. In the example below, testdb is the name of the database, testuser is the user, and password is the user’s password.
    create database testdb;
    create user 'testuser'@'localhost' identified by 'password';
    grant all on testdb.* to 'testuser';
    

    You can shorten this process by creating the user while assigning database permissions:

    create database testdb;
    grant all on testdb.* to 'testuser' identified by 'password';
    
  2. Then exit MySQL.
    exit
    

Create a Sample Table

  1. Log back in as testuser.
    mysql -u testuser -p
    
  2. Create a sample table called customers. This creates a table with a customer ID field of the type INT for integer (auto-incremented for new records, used as the primary key), as well as two fields for storing the customer’s name.
    use testdb;
    create table customers (customer_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name TEXT, last_name TEXT);
    
  3. Then exit MySQL.
    exit
    

Reset the MySQL Root Password

If you forget your root MySQL password, it can be reset.

  1. Stop the current MySQL server instance.
    sudo systemctl stop mysql.serivce
    
  2. Use dpkg to re-run the configuration process MySQL goes through on first installation. You will again be asked to set a root password.
    sudo dpkg-reconfigure mysql-server-5.5
    

dpkg will restart MySQL automatically and you’ll now be able to log in again using mysql -u root -p.

Tune MySQL

MySQL Tuner is a Perl script that connects to a running instance of MySQL and provides configuration recommendations based on workload. Ideally, the MySQL instance should have been operating for at least 24 hours before running the tuner. The longer the instance has been running, the better advice MySQL Tuner will give.

  1. Install MySQL Tuner from Ubuntu’s repositories.
    sudo apt-get install mysqltuner
    
  2. To run it:
    mysqltuner
    

    You will be asked for the MySQL root user’s name and password. The output will show two areas of interest: General recommendations and Variables to adjust.

MySQL Tuner is an excellent starting point to optimize a MySQL server but it would be prudent to perform additional research for configurations tailored to the application(s) utilizing MySQL on your Linode.

More Information

You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.

Posted in Clic0 commentaire