Bitcoin Challenge / 310 BTC cachés dans une image

|

Dans l’esprit du challenge du challenge du logo de l’ANSSI, un anonyme a lancé le 2 octobre sur Reddit et BitcoinTalk une invitation à relever un challenge : trouver la clé privée cachée dans une image donnant accès à un wallet contenant 310 BTC. L’auteur a déjà apporté la preuve cryptographique qu’ils étaient en sa possession en signant l’url du challenge avec la clé privée du wallet.

Je ne me fais pas de faux espoirs, il y a des gens bien plus compétents que moi qui emporteront le prix. Cependant, la résolution de l’énigme reste un défi passionnant. J’indiquerai donc sur cette page l’état de mes recherches. N’hésitez pas à partager les vôtres dans les commentaires. Si vous souhaitez que l’on planche à plusieurs, n’hésitez pas non plus ; on pourrait par exemple se retrouver sur un canal IRC dédié. Bonne chance à tous !

L’image source

Challenge

Les découvertes

Le tableau de 18 valeurs

Cette énigme a été résolue dès le deuxième jour du challenge. Elle permet d’obtenir la clé privée d’un wallet qui contenait initialement 0.1 BTC.

La première étape consiste à repérer une date cachée dans l’image.

Challenge

“OCT 2 2018” nous donne en format propre (= pas américain) : “20181002”.

Nous prenons ensuite les caractères de cette chaîne 1 par 1 (en répétant la chaîne au besoin) et les soustrayons aux caractères du tableau initial (en hexadécimal). En cas de valeur négative, on repart de la valeur maximum (F en hexadécimal) et on soustrait le reste.

Si ce n’est pas clair, imaginez un cadenas à code en hexadécimal (donc des molettes à 16 positions). si vous devez soustraire 4 d’une molette qui se trouve sur 2, vous allez passer de 2 à 1, de 1 à 0, de 0 à F, et enfin de F à E. On peut faire ce calcul en convertissant en décimal et utilisant notre cher modulo : 2 - 4 = -2 et -2 mod 16 = 14 (E en hexadécimal). Le nombre de crans pour chaque molette correspond à ce qu’indique chaque caractère correspondant dans la clé “20181002” : descendre la première molette de 2, la deuxième de 0, la troisième de 1…

On constate ainsi que la première ligne nous donne une série de “310” qui nous suggère que nous sommes sur la bonne piste. Toutes les autres valeurs du tableau donnent des chiffres (une fois la conversion hexadécimal vers décimal effectuée) inférieurs à 2048. Ces valeurs correspondent à un codage possible en BIP-0039 (liste de mots parmi 2048 possibilités).

Challenge

La formule utilisée dans chaque cellule du tableau C (attention les yeux) :

=dec2hex(mod(hex2dec(mid(CELLULE_DE_A;1;1))-mid(CELLULE_CORRESPONDANTE_DE_B;1;1);16)) &
dec2hex(mod(hex2dec(mid(CELLULE_DE_A;2;1))-mid(CELLULE_CORRESPONDANTE_DE_B;2;1);16)) &
dec2hex(mod(hex2dec(mid(CELLULE_DE_A;3;1))-mid(CELLULE_CORRESPONDANTE_DE_B;3;1);16))

On obtient donc 12 mots qui correspondent à la clé privée d’un wallet contenant 0.1 BTC.

cry buyer grain save vault sign
lyrics rhythm music fury horror mansion
  • Adresse : 1446C8HqMtvWtEgu1JnjwLcPESSruhzkmV
  • Clé publique : 0376a376c4c2fc0ffad1a5d87f2100343d2cd29a5f7859458e545857727133e349
  • Clé privée : KzkZxdhRGxB7eX4u1skXkfJ7VB8JfPp7Nfos3jiF7PQUNMh2SHDE

Le masque de transparence

Le PNG d’origine présente des zones légèrement transparentes invisibles à l’œil nu (opacité de 253 sur 255). Voici comment les mettre en évidence avec Gimp :

Le QRcode amène vers une page du site où l’on peut tenter de valider la hash sha256 d’un fichier. La ligne correspond quant à elle à du binaire :

0101010100110010010001100111001101100100010001110101011001101011010110000011000100111001010100010011001101001001001011110010111101010110010000110100100000110000010101010011001101100011010101100111010001001001010101000101101000110011011000110110101101001001010011000100101001101110010101010110001101100100010100000101100000110011010001110111001100110101011100010110101001100100010001100011000101010101011010100101101000110011011011010100000101100110011101000100011101101001011101100111010001000110010110010100010000001010010011100011010101011010010000110101001101101011010000100111100101101110011011100101011001110001010000100110000101110111011011000011010001110000001110000111011101001011010011110011000001001111001110000111101001001001001101100100010000110000010000010011000100101011010101100100010101010110010000110101010101111001010001010111011001000101011001010100111001101111010101010110011001000111011000110101001100110000010001010110110000111001011001000011100100110011011101100111001101010000011110000110001001100111001101110000101001000100001101010110000101110110011101010110011001010001011100110101001101100011011001110111001101101011001100110101000101000101011101000111000100111001001011110100110100110100010001000110111100110011001100100100111101001011010001100110010101110001001100000011000000101111001100110100111001110010011110000101011101001111011100110100110101101101011010000011001101000001010110000110110101000100011110100111010101110101010110100011000001110001011011010101101001100001010010010011011101110010011001010011000100110110000010100100011001100011010110000100100101110010011011010101000001010000011010010101000101000100010011110100100001010010011000110011011101110111011101000011000001101110011001110011011001110001010011000110100101001110011110100011011101010110011100010100010101010011010100100101010001100100011110000101000001001111011000010110100001001011010001100101001001101011010101110101010000111000011100110101010000101011010101010111001000110010011110010010101100110010011010010101101000110010010011000100010101100001011110000100111000001010010011010011011101010101010110100111000101100011010100000111011101011001011001110110110100110110010001100110111101001011010011110101011001101010011011100111000101100100011001010110011100110011001100000101001000110010001101110110101001100011001101100100000101101111010001100101000001111001010100100101101000110010011001110011100000101011010001010100101001001101011100000011001101101110001011110111000001100110001110010011010001101111010100110100001101001100010001010101011101101011011000110011000001101111011100110000101001101010010010000011100101000100011100010110001001001101001101100100010001010101011100000111010001110101001100110100100001001010011000100100000101010110011101110101100001010001001111010011110100001010

Converti en ASCII, cela donne :

U2FsdGVkX19Q3I//VCH0U3cVtITZ3ckILJnUcdPX3Gs5qjdF1UjZ3mAftGivtFYD
N5ZCSkBynnVqBawl4p8wKO0O8zI6D0A1+VEVCUyEvEeNoUfGcS0El9d93vsPxbg7
D5avufQsScgsk3QEtq9/M4Do32OKFeq00/3NrxWOsMmh3AXmDzuuZ0qmZaI7re16
FcXIrmPPiQDOHRc7wt0ng6qLiNz7VqESRTdxPOahKFRkWT8sT+Ur2y+2iZ2LEaxN
M7UZqcPwYgm6FoKOVjnqdeg30R27jc6AoFPyRZ2g8+EJMp3n/pf94oSCLEWkc0os
jH9DqbM6DUptu3HJbAVwXQ==

Si l’on fait un décodage base64, la chaîne obtenue débute par “Salted”. C’est visiblement un fichier de 256 octets chiffré via OpenSSL. Reste à trouver l’algorithme de chiffrement et la clé.

On appellera ce fichier alpha.enc.

Extraction du LSB du canal rouge

LSB : Least Significant Bit (bit de poids faible)

On comparant tout les couches visibles de l’image d’origine, on constate des différences dans la couche rouge, notamment sur la ligne 310.

En extrayant l’inverse du dernier bit de la valeur de chaque pixel de la ligne 310 du canal rouge, on obtient le code binaire suivant :

0100101010111001010011100111101101111011000011001110010100110000010110000011001001111101000100000110011100001000001011110010101010010111100010100010101001110100011001010011001101100011100001101100111100010110001001010111001000100110111011111100100001010011111111011001111101111100001111101001011101010010001100110001000000100000000100110011101011111000111101011100010110001011001111011110010001101110100011100101010110011100011100111111000001001100010000110001111001110101110101001101010011101110101100111010111011100011101010111111000110100110010001101111010011101000010000110111001010111100000001011011011010101100110011111101101010100110101101010110111111111111100110010000111101100001000000100001101011000111111010110110110101100110000111011101011011011001011011011010010000010101001110111010011101100111000111001101010001110111001111001111000000111000110010111101101111000011000010001101110110110111010101111000001010111001011010110001001000100110000011110111100101000010001010010111111000111010110010000010111111110010100101100011010010100000111110000010100111000100111011001110000001101000111110100001101011011111000110010100100111010000001101111100000111110000110010000100010001011010010111011011010111010110110111010111101001101110011100000111001111000000010010110111001010110011011101110111001010101011100110010000111000101000000011101001110001001110101001101000010111111000000101110011011111011010101010111011110010011001111000111100110001010110100111101000001100011100111101101010100000101101101010100111101111101000010000110010000111010111011001011011110110111111011001001011110100110111000110000100011110100000011100100001001010101101110010001100111111010100001110001111111100001101110111100011111101010000101000011001111110110000000010011011011000111100101000101101101010110100001011011111000110100011010000111111001100110100011100110011000111000100100111111001111010100001100111000001100010010100010000110000110101101011110010100101000000101010010101010111001000110010011110010010101100110010011010010101101000110010010011000100010101100001011110000100111000001010010011010011011101010101010110100111000101100011010100000111011101011001011001110110110100110110010001100110111101001011010011110101011001101010011011100111000101100100011001010110011100110011001100000101001000110010001101110110101001100011001101100100000101101111010001100101000001111001010100100101101000110010011001110011100000101011010001010100101001001101011100000011001101101110001011110111000001100110001110010011010001101111010100110100001101001100010001010101011101101011011000110011000001101111011100110000101001101010010010000011100101000100011100010110001001001101001101100100010001010101011100000111010001110101001100110100100001001010011000100100000101010110011101110101100001010001001111010011110100001010111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

Il inclut notamment cette portion :

010101010111001000110010011110010010101100110010011010010101101000110010010011000100010101100001011110000100111001001101001101110101010101011010011100010110001101010000011101110101100101100111011011010011011001000110011011110100101101001111010101100110101001101110011100010110010001100101011001110011001100110000010100100011001000110111011010100110001100110110010000010110111101000110010100000111100101010010010110100011001001100111001110000010101101000101010010100100110101110000001100110110111000101111011100000110011000111001001101000110111101010011010000110100110001000101010101110110101101100011001100000110111101110011011010100100100000111001010001000111000101100010010011010011011001000100010101010111000001110100011101010011001101001000010010100110001001000001010101100111011101011000010100010011110100111101

Qui convertie en ASCII donne :

Ur2y+2iZ2LEaxNM7UZqcPwYgm6FoKOVjnqdeg30R27jc6AoFPyRZ2g8+EJMp3n/pf94oSCLEWkc0osjH9DqbM6DUptu3HJbAVwXQ==

Elle correspond la fin du fichier chiffré alpha.enc obtenu dans la ligne 310 du canal alpha. Il y a donc une relation entre ces deux lignes.

Si on effectue une opération XOR entre le binaire inversé du canal alpha et le binaire inversé du dernier bit du canal rouge, on obtient :

0001111110001011000010000000100000011111010010111011001101011011000000000000001101000100010000010101010001000001000000000000010111000001110010010110001001000100001100000000000000000000110100001011101101011111011100010010100000010101100011001010001100011010101100011101010100010010011010111111010000110110011000110100100000010011010101000100100111001101100001001010111111101111011110111101010100111011111001000000111110101111000111101011000100101010001101110101100100011100101000101010000010101000111010101110101011101001111001011100010011111100000001011010011110000011000000010000101111010010011010111110000011011101100011011011101111010001110110010101101110001111101000010111100000101010010011010010101010001000110100110001011100101111001010111001001011101001001011001001010100111110011011011110001000110001010111111000000100001110011110011000011001111101101011101001010110101100010111011011101111110000001101001101000110001001001011100111111000011111011010110100000001110001010111110000110101101010101100000100110110010101101000010011111011100100110011010100100010110010100110011000011000111001100010010100100110111100011111100011101010111011000001001001000010110101101111000011010101100011011100101111100011100010100110010001010101011101010000100011110010001011000011010001011111000010010001110100001010000100101010100100000001011010011101101100101100000001110101011100100010010101011111110000010010011011111100111101000111011101100110011011100100100011110001001011001101101101100110111111001001001100111000110100110010011010001001100001000011100001011011111111101111011100001111001111010001000101011101010001011111110000000110110100001111101001100001111000011110000110010110111100100001111010101010100000111100111110110001101010100111000001010001011101111101110010110110001110110111100010010111001011010011110000000100011010011101010000000010110110000110001011111111101111011011101010110110100100101011111111000101000101100101010011101110010000010000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

Les trois premiers octets correspondent aux code hexadécimal 1F 8B 08. Intéressant car il s’agit de la signature d’un fichier GZip.

Nous créons donc un fichier avec ce code binaire :

echo -n $BINAIRE | perl -lpe '$_=pack"B*",$_' > fichier.gz

La décompression fonctionne et nous obtenons un fichier contenant :

U2FsdGVkX1+WPMJQISUVUvGRg7p4zCX4jIODIGb6b6cAreXFxv0WOxgCeSw9K+im
THiWMkRq45FsPXHs3TjYqcJz7QzQ8HeM340EwWQWXAi0fVy+r6NPmiJRgMgMqLCu
4Q9o/WkNyHxvPScNgG9jf8gskggx10FiTcoyF1KE+nxjmRkEuj7uQQsPrrlRP3sj
ll4KXhAzrGQZi5E4sajQOBGQfaJjei5fHXXO6sxeYsFcuxzo3JdMOF3JFYQtuUDY

On reconnaît la encore la chaîne U2Fs... caractéristique d’un fichier chiffre via OpenSSL.

On appellera ce fichier red-lsb.enc.

Les courbes de Bézier

Appliquer un effet miroir horizontal à l’ensemble des courbes permet de relier plusieurs cellules marquées.

Challenge

On se retrouve avec 5 groupes de caractères :

  • L3 (ou 3L)
  • 02 (ou 20)
  • 584 (ou 485)
  • 9F (ou F9)
  • 7

A partir de la, j’ai été un peu bourrin et généré la liste complète des permutations possibles (1920) via un script Python :

import itertools

sets = [ ['L3', '3L'], ['02', '20'], ['584', '485'], ['9F', 'F9'], ['7'] ]
all_item_permutations = []

sets_permutations = list(itertools.permutations(sets, len(sets)))

for sets_permutation in sets_permutations:
    item_permutations = list(itertools.product(*sets_permutation))
    all_item_permutations += item_permutations

for permutation in all_item_permutations:
    print(''.join(permutation))

On finit par déchiffrer les deux fichiers :

$ openssl enc -aes-256-cbc -md md5 -base64 -d -a -k "L379F48502" -in alpha.enc -out alpha.dec
$ cat alpha.dec
Bitcoin Challenge ..... 310 BTC
https://bitcoinchallenge.codes/

---

Well done!
Now find something really interesting here:


511 B20 332 328 410 530
245 651 58F C2C 03A 717
401 9AC 36A 53F 4C6 B26
332 328 410 530 491 312


---
$ openssl enc -aes-256-cbc -md md5 -base64 -d -a -k "02L3F95847" -in red-lsb.enc -out red-lsb.dec
$ cat red-lsb.dec
Bitcoin Challenge ..... 310 BTC
https://bitcoinchallenge.codes/

---

You're either very very close, or working in the wrong direction :)

Here you go : Z465/

---

La concaténation de toutes ces données nous permet d’obtenir un hash sha256 qui est accepté sur la page d’enregistrement sur laquelle pointait le QRcode :

$ (echo "cry buyer grain save vault sign lyrics rhythm music fury horror mansion"; cat decrypted-files/alpha.dec decrypted-files/red-lsb.dec) | tr -d '\n' | sha256sum
273e2b95648fd3cbad0d7fe3ed820e783c0b12fdbe29b57bfb2d1f243d92b1a5  -

Challenge

Déchiffrement du second tableau

En utilisant la même méthode que pour le premier tableau, nous obtenons la liste de mots :

Challenge

En combinant les 12 premiers mots obtenu et ces 12 nouveaux, nous obtenons les 24 mots suivants :

cry buyer grain save vault sign
lyrics rhythm music fury horror mansion
debris slim immune lock actual tide
gas vapor fringe pole flat glance

Il s’agit d’un liste BIP39 valide permettant de déverrouiller un wallet contenant 0.2 BTC :

  • Adresse : 1G7qsUy5x9bUd1pRfhVZ7cuB5cMUP4hsfR
  • Clé publique : 02707e976e321e77c6b301b14f1c64d00b2b67b11963ab739aadccba6ddca05862
  • Clé privée : KxPEUpQ5BE75UGRUVjNmf8dQuWsmP9jqL3FUUjavdRW69MEcmg6C

Pistes non concluantes (pour le moment)

La trame de fond

Une trame de fond est détectable sur l’ensemble de l’image. On peut la mettre en évidence via une solarisation (appliquer un courbe de colorimétrique en triangle).

Challenge

Cette trame est constituée de tuiles de 128x120 pixels. Afin de l’isoler, j’ai extrait des zones sur fond blanc de l’image (principalement en haut à droite du tableau). A coups de copiers-collers et de déplacements au pixel, on obtient :

Challenge

Ensuite, j’ai constitué une image à partir de ce motif (dans Gimp, filtre “Tile”) légèrement supérieure à la taille de l’image de départ. Je l’ai ensuite placée en couche en mode extraction de grain et l’ai calée au pixel près sur l’image de départ. Une normalisation plus tard, on obtient une image débarrassée du motif :

Challenge

En mode fusion de grain, on peut aussi récupérer la texture exacte ayant été appliquée sur l’image d’origine.

Challenge

Appliquée à une image random, cela donne.

Challenge

Cela n’a abouti à rien concernant le challenge, mais c’est un skill toujours bon à prendre.

La couche rouge

On a déjà prouvé que la ligne 310 de la couche rouge contenait un fichier encodé sur le dernier bit de données.

Challenge

Cette image est issue de la comparaison des couches rouge et vert.

Légende :

  • rouge : la valeur du canal rouge est 1 bit inférieure à celle du canal vert
  • vert : la valeur du canal rouge est 1 bit supérieure à celle du canal vert
  • gris : valeur du canal rouge égale à celle du canal vert
  • noir : valeur du canal rouge égale à celle du canal vert, et la valeur du canal vert est à zéro
  • blanc : valeur du canal rouge égale à celle du canal vert, et la valeur du canal vert est à 255 (maximum)

On remarque ici que la valeur du canal rouge varie en +1 et -1 bits par rapport au canal vert. C’est très symptomatique d’une information stockée sur le LSB d’un canal. En effet, le remplacement arbitraire du dernier bit provoque une modification de la valeur décimale comprise entre -1 et 1. En creusant un peu plus, on peut constater que ce remplacement n’est arbitraire : certaines valeurs passant par exemple de 11011111 à 11100000, alors qu’il aurait été plus simple de mettre 11011110).

En analysant en détail, on remarque trois cas :

  • passage du lsb de 0 à 1 : +1
  • passage du lsb de 1 à 0 (si l’octet de départ différent de 11111111) : +1
  • passage du lsb de 1 à 0 (si l’octet de départ vaut 11111111) : -1

Quand on regarde le tableau du bas de l’image, on constate aussi des différences entre les canaux rouge et vert, mais d’une forme très différente :

Challenge

Nous n’avons que des variations de -1 bit pour le canal rouge. Si une information est stockée ici, elle ne l’est pas de la même manière que pour la ligne 310. Le fait qu’il n’y ait pas de variation de +1 par rapport au canal de référence pourrait laisser penser qu’un LSB à 0 n’a jamais été remplacé par un 1 (+1), mais ce n’est pas le cas. On trouve des altérations du type : 10010000 -> 10001111 (qui correspond bien à -1).

On constate aussi que les variations sont beaucoup moins régulières. Ces variations ponctuelles cherchent-elles à mettre en évidence des valeurs particulières sur les pixels du canal de référence ?

Ressources

Réparation d'un vidéoprojecteur Hitachi ED-A101

|

Le vidéoprojecteur Hitachi ED-A101 est un système datant de 2008. Il offre une portée ultra courte permettant un affichage d’une diagonale de 150 cm sur un écran situé à une quarantaine de centimètres. Il a été massivement utilisé vers la fin des années 2000, notamment dans des universités européennes.

Hitachi ED-A101

Ce modèle présente une faille de conception qui a causé la panne de bon nombre d’appareils avant même la fin de vie de la lampe qu’il contient (estimée entre 3000 et 4000 heures). Celle-ci se trouve au niveau du système de motorisation du clapet d’ouverture et de fermeture du miroir.

Au niveau de ce clapet, une roue en plastique sensée entraîner l’axe métallique transversal solidaire du miroir s’use prématurément.

Hitachi ED-A101 roue (source photo: vendeur ebay radadragon)

Hitachi ED-A101 roue (source photo: vendeur ebay radadragon)

Hitachi a partiellement reconnu le vice de conception en permettant aux personnes concernées par le problème d’obtenir un moteur de rechange pendant 5 ans après la date d’achat (la garantie initiale était de 3 ans). D’après mes recherches, le bloc moteur de remplacement était identique à celui d’origine, donc voué à tomber à nouveau en panne.

De ce fait, des milliers de vidéoprojecteurs de ce modèle (et d’autres de la marque équipés du même dispositif d’ouverture) ont été mis à la benne. Des milliers de vidéoprojecteurs vendus initialement autours de 2500 dollars jetés en raison de la défaillance d’une petite roue en plastique de moins d’1 centimètre de diamètre…

Mais en quoi la panne du mécanisme d’ouverture rend-elle le projecteur inutilisable ? Après tout, la trappe pourrait parfaitement être ouverte manuellement. C’est là que l’affaire se corse. Le vidéoprojecteur se met en erreur dès qu’il détecte un problème d’ouverture du miroir, et ce mécanisme est quant à lui extrêmement abouti. Un interrupteur de position va détecter quand le miroir est en début et en fin de course. De plus, le vidéoprojecteur va analyser la charge du moteur pour déterminer que le miroir est en fin de course ; il va détecter quand ça “force” (sans doute une des sources du problème d’usure). Difficile donc de faire croire au vidéoprojecteur que le mécanisme d’ouverture du miroir est fonctionnel en l’ouvrant à la main.

Du fait de la popularité de ce modèle lors de sa commercialisation, beaucoup de personnes se sont penchées sur le sujet. On peut ainsi trouver :

… et surtout, un projet à base d’Arduino pour leurrer le vidéoprojecteur. C’est la solution que j’ai vais explorer pour plusieurs raisons :

  • cela fait pas mal de temps que je voulais réaliser un projet à base d’Arduino
  • faible coût : mois de 10€ de composants, port compris
  • contournement définitif de la faille de conception du vidéoprojecteur (le miroir n’est plus motorisé)
  • possibilité de réutiliser les composant lorsque le vidéoprojecteur sera définitivement HS

A suivre.

Office365 / Fuite de données - Énumération d'adresses mail valides

|

Le service ActiveSync d’Office365 présente une faille permettant de vérifier la validité des adresses mail d’un domaine (si l’adresse mail est utilisée en tant qu’identifiant). Les retours HTTP sont en effet différents en fonction de l’existence ou non d’un identifiant spécifique.

Ce problème a initialement été signalé ici : https://www.sec-1.com/blog/2017/office365-activesync-username-enumeration

Prévenu par l’auteur fin juin 2017, Microsoft n’a pas jugé ce problème suffisamment critique pour prévoir un correctif.

L’url ActiveSync d’Office365 (https://outlook.office365.com/Microsoft-Server-ActiveSync) ne semble par ailleurs pas être protégée par un système de throttling permettant d’éviter les requêtes trop nombreuses sur une période donnée, ce qui laisse la porte ouverte à une exploitation massive.

Exemples

Adresse e-mail valide (prenom.nom@mondomaine.fr)

$ auth=$(echo -n 'prenom.nom@mondomaine.fr:motdepassebidon' | base64); curl -v -X OPTIONS \
-H "OPTIONS /Microsoft-Server-ActiveSync HTTP/1.1" -H "Host: outlook.office365.com" \
-H "Connection: close" -H "MS-ASProtocolVersion: 14.0" -H "Content-Length: 0" \
-H "Authorization: Basic $auth" https://outlook.office365.com/Microsoft-Server-ActiveSync \
2>&1 | grep "X-CasErrorCode"
<pas de retour>

Adresse e-mail inexistante (prenom.nom.bidon@mondomaine.fr)

$ auth=$(echo -n 'prenom.nom.bidon@mondomaine.fr:motdepassebidon' | base64); curl -v \
-X OPTIONS -H "OPTIONS /Microsoft-Server-ActiveSync HTTP/1.1" -H "Host: outlook.office365.com" \
-H "Connection: close" -H "MS-ASProtocolVersion: 14.0" -H "Content-Length: 0" \
-H "Authorization: Basic $auth" https://outlook.office365.com/Microsoft-Server-ActiveSync \
2>&1 | grep "X-CasErrorCode"
< X-CasErrorCode: UserNotFound

Bitcoin / Installation d'un nœud Lightning mainnet avec bitcoind et lnd 0.4-beta

|

Installation d’un noeud lightning mainnet bitcoind (au lieu de btcd) + lnd 0.4-beta sous Ubuntu 16.04.3 server

Pour n’oublier aucune étape, je suis parti d’une machine virtuelle avec une installation vierge et à jour de la distribution. Rien d’autre n’a été installé hormis les groupes logiciels :

  • standard system utilities
  • OpenSSH server

Bitcoind

Installation

sudo apt-add-repository ppa:bitcoin/bitcoin
# appyer sur entrée pour accepter l'avertissement
sudo apt-get update
sudo apt-get install bitcoind

Configuration

mkdir ~/.bitcoin

Création du fichier ~/.bitcoin/bitcoin.conf :

txindex=1
server=1
daemon=1
zmqpubrawblock=tcp://127.0.0.1:18501
zmqpubrawtx=tcp://127.0.0.1:18501
rpcuser=mon_login
rpcpassword=mon_password

Lancement et synchronisation de la blockchain

On peut désormais lancer bitcoind et attendre que la chaîne se synchronise.

bitcoind

On peut suivra l’avancement de la synchro via :

tail -f ~/.bitcoin/debug.log

On peut aussi récupérer la blockchain d’un autre bitcoind déjà synchronisé. Il s’agit des répertoires suivants :

  • ~/.bitcoin/chainstate/
  • ~/.bitcoin/blocks/

Lnd

Prérequis

Installation de Go et git :

sudo apt-get install golang-1.10 git

Mise à jour du PATH :

echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.10/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.10/bin

Installation de dep :

go get -u github.com/golang/dep/cmd/dep

Installation

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
dep ensure
go install . ./cmd/...

Configuration

mkdir ~/.lnd

Création d’un fichier ~/.lnd/lnd.conf :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=mon_ip_externe:9735
listen=localhost:9735
alias=mon node lightning

[Bitcoin]
bitcoin.active=1
bitcoin.node=bitcoind
bitcoin.mainnet=1

Pas besoin de préciser les paramètres de connexion à bitcoind, lnd va automatiquement les récupérer depuis ~/.bitcoin/bitcoin.conf.

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement

lnd

Création d’un wallet Bitcoin (on doit choisir un mot de passe) :

lncli create

Notez la seed.

Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en BTC

Vous savez comment.

Connexion à un autre nœud

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

Création d’un channel

On alloue dans cet exemple 300000 satoshis au nouveau channel.

lncli openchannel 02464bfaaae78b98268a6a6d7e8f6a110c60dd1293811d6029b11ee9edb4bbf869 --local_amt 300000

A partir d’ici, on peut effectuer des paiements, se connecter à d’autres nœuds, ouvrir de nouveaux channels etc.

Ressources

Zimbra / Supprimer un store d'une infrastructure Zimbra

|

La méthode la plus souple pour mettre à jour une infra Zimbra consiste généralement à installer de nouveaux stores sous la nouvelle version, et à migrer progressivement les boîtes mail vers ces nouveau stores. Dans mon cas d’usage, cette méthode à permis de migrer un peu plus de 12000 comptes de stores en version 8.6.0 GA vers la version 8.7.11 GA, en période de production, sans qu’aucun utilisateur ne s’en rende compte.

Comment procéder une fois que les stores d’origine sont vides ?

Dans cet exemple, nous allons supprimer un store nommé zstoreX, sur le domaine domaine.tld.

Préalable

  • S’assurer que le store n’est pas dans le “pool de serveurs” d’une des COS existantes.
  • Vérifier qu’il n’y a plus aucun compte sur le store via une recherche : ‘‘(zimbraMailHost=zstoreX.domaine.tld)’’
  • Vérifier qu’il n’y a plus de sauvegardes utiles sur le store concerné (on a donc laissé le store vide actif le temps que toutes les sessions de sauvegarde en rétention soient vides).

Suppression des références à zstoreX

On va vérifier, sur chaque serveur de l’infra, s’il y a des reférences à zstoreX dans les configurations locales :

Config locale

zmlocalconfig | grep zstoreX

Config serveur

zmprov gs $(zmhostname) | grep zstoreX

On regarde ensuite dans la configuration du domaine :

Config domaine

zmprov gd domaine.tld | grep zstoreX

Ensuite on regarde dans la config globale :

zmprov gacf | grep zstoreX

On découvre normalement que les attributs concernés sont :

  • zimbraReverseProxyAvailableLookupTargets
  • zimbraReverseProxyUpstreamLoginServers

Celà va evidemment varier selon l’infra.

Notons que zmprov gs remonte les attributs serveurs et ceux hérité de la config globale, mais on va quand meme s’assurer de supprimer une éventuelle config locale de ces attributs, sur toutes les machines de l’infra :

zmprov ms `zmhostname` -zimbraReverseProxyAvailableLookupTargets zstoreX.domaine.tld
zmprov ms `zmhostname` -zimbraReverseProxyUpstreamLoginServers zstoreX.domaine.tld

Ensuite on modifie la config globale, uniquement sur un serveur :

zmprov mcf -zimbraReverseProxyUpstreamLoginServers zstoreX.domaine.tld
zmprov mcf -zimbraReverseProxyAvailableLookupTargets zstoreX.domaine.tld

La modif est visible immédiatement sur le serveur où la commande a été lancée. On vérifie qu’il n’y a plus rien :

zmprov gacf | grep zstoreX; zmprov gs $(zmhostname) | grep zstoreX

Pour les autres, on doit d’abord flusher le cache de la config (la doc recommande de la faire serveur par serveur, successivement) :

zmprov flushCache config; zmprov gacf | grep zstoreX; zmprov gs $(zmhostname) | grep zstoreX

Désactivation des services du store à supprimer

Sur zstoreX, récupérer la liste des services activés :

zmprov gs `zmhostname` zimbraServiceEnabled

et les désactiver (adapter cette liste au retour de la commande précédente) :

zmprov ms `zmhostname` -zimbraServiceEnabled service
zmprov ms `zmhostname` -zimbraServiceEnabled zimbra
zmprov ms `zmhostname` -zimbraServiceEnabled zimbraAdmin
zmprov ms `zmhostname` -zimbraServiceEnabled zimlet
zmprov ms `zmhostname` -zimbraServiceEnabled mailbox
zmprov ms `zmhostname` -zimbraServiceEnabled convertd
zmprov ms `zmhostname` -zimbraServiceEnabled stats
zmprov ms `zmhostname` -zimbraServiceEnabled spell

Suppression du store

A lancer sur un serveur de l’infra :

zmprov deleteServer zstoreX.domaine.tld

La commande retournera une erreur si le store n’est pas totalement vide.

Il devrait avoir disparu de tous les stores/serveurs quand on effectue un :

zmprov getAllServers

Mise à jour des clés ssh

Sur tous les serveurs restants, lancer :

zmupdateauthkeys

Linux / Effectuer des captures d'écran de sites web en console via cutycapt

|

Cutycapt est un outil basé sur Qt qui permet d’effectuer des captures d’écran de sites web. Par défaut il capture l’intégralité de la page mais on peut facilement cropper et redimensionner l’image générée pour obtenir une vignette de prévisualisation d’un site web.

while read a
do
        cutycapt --url=http://$a --out=$a.png
        convert -resize 240 -crop 240x180+0+0 $a.png $a.png
done < url-list.txt

Bitcoin / Installation d'un nœud Lightning testnet bitcoind/lnd

|

Installation d’un nœud lightning bitcoind (au lieu de btcd) + lnd sous Ubuntu 16.04.3 server

Pour n’oublier aucune étape, je suis parti d’une machine virtuelle avec une installation vierge et à jour de la distribution. Rien d’autre n’a été installé hormis les groupes logiciels :

  • standard system utilities
  • OpenSSH server

Bitcoind

Installation

sudo apt-add-repository ppa:bitcoin/bitcoin
# appyer sur entrée pour accepter l'avertissement
sudo apt-get update
sudo apt-get install bitcoind

Configuration

mkdir ~/.bitcoin

Création du fichier ~/.bitcoin/bitcoin.conf :

testnet=1
txindex=1
server=1
daemon=1
zmqpubrawblock=tcp://127.0.0.1:18501
zmqpubrawtx=tcp://127.0.0.1:18501
rpcuser=mon_login
rpcpassword=mon_password

Lancement et synchronisation de la blockchain

On peut désormais lancer bitcoind et attendre que la chaîne se synchronise.

bitcoind

On peut suivra l’avancement de la synchro via :

tail -f ~/.bitcoin/testnet3/debug.log

On peut aussi récupérer la blockchain d’un autre bitcoind déjà synchronisé. Il s’agit des répertoires suivants :

  • ~/.bitcoin/testnet3/chainstate/
  • ~/.bitcoin/testnet3/blocks/

Lnd

Prérequis

Installation de Go et git :

sudo apt-get install golang-1.9 git

Mise à jour du PATH :

echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin

Installation de Glide :

go get -u github.com/Masterminds/glide

Installation

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
glide install
go install . ./cmd/...

Configuration

mkdir ~/.lnd

Création d’un fichier ~/.lnd/lnd.conf :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=mon_ip_externe:9735
listen=localhost:9735
alias=mon node lightning

[Bitcoin]
bitcoin.active=1
bitcoin.node=bitcoind
bitcoin.testnet=1

Pas besoin de préciser les paramètres de connexion à bitcoind, lnd va automatiquement les récupérer depuis ~/.bitcoin/bitcoin.conf.

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement

lnd

Création d’un wallet Bitcoin (on doit choisir un mot de passe) :

lncli create

Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en tBTC (testnet bitcoins)

Via ce faucet par exemple : https://testnet.manu.backend.hamburg/faucet

Connexion à un autre nœud

On peut trouver des adresses de nœuds sur https://explorer.acinq.co

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

Création d’un channel

On alloue dans cet exemple 300000 satoshis au nouveau channel.

lncli openchannel 02464bfaaae78b98268a6a6d7e8f6a110c60dd1293811d6029b11ee9edb4bbf869 --local_amt 300000

A partir d’ici, on peut effectuer des paiements, se connecter à d’autres nœuds, ouvrir de nouveaux channels etc.

Ressources

Windows - Lancer l'économiseur d'écran en un clic via un raccourci

|

Une fois n’est pas coutume, une petite astuce Windows pour pouvoir créer dans la barre de lancement rapide un raccourci qui lance l’économiseur d’écran (un écran noir). Un simple mouvement de souris permettra de sortir de ce mode.

Ce besoin m’a été communiqué par une orthophoniste qui souhaitait pouvoir éteindre temporairement son écran (déporté) lorsqu’il n’était pas nécessaire, pour ne pas déconcentrer ses patients.

Le fichier permettant de lancer l’économiseur d’écran est :

C:\Windows\System32\scrnsave.scr

Petite subtilité cependant : Windows n’accepte pas que l’on place un raccourci vers un fichier .scr dans la barre de lancement rapide.

On choisit donc de créer un nouveau raccourci sur le bureau, et d’indiquer la cible :

C:\Windows\explorer.exe “C:\Windows\System32\scrnsave.scr”

Ce raccourci peut ensuite être copié via un glisser-déposer dans la barre de lancement rapide (on peut aussi modifier son nom et l’icône associée).

La raccourci du bureau peut ensuite être supprimé.

Bitcoin / Installation d'un nœud Lightning testnet bitcoind/lnd (obsolète)

|

Installation d’un nœud lightning bitcoind (au lieu de btcd) + lnd sous Ubuntu 16.04.3 server

17/01/2018 : Le support bitcoind ayant été intégré à la branche MASTER de lnd, cette doc n’est plus à jour. Une nouvelle version est disponible ici.

Pour n’oublier aucune étape, je suis parti d’une machine virtuelle avec une installation vierge et à jour de la distribution. Rien d’autre n’a été installé hormis les groupes logiciels :

  • standard system utilities
  • OpenSSH server

Bitcoind

Installation

sudo apt-add-repository ppa:bitcoin/bitcoin
# appyer sur entrée pour accepter l'avertissement
sudo apt-get update
sudo apt-get install bitcoind

Configuration

mkdir ~/.bitcoin

Création du fichier ~/.bitcoin/bitcoin.conf :

testnet=1
txindex=1
server=1
daemon=1
zmqpubrawblock=tcp://127.0.0.1:18501
zmqpubrawtx=tcp://127.0.0.1:18501

Lancement et synchronisation de la blockchain

On peut désormais lancer bitcoind et attendre que la chaîne se synchronise.

bitcoind

On peut suivra l’avancement de la synchro via :

tail -f ~/.bitcoin/testnet3/debug.log

On peut aussi récupérer la blockchain d’un autre bitcoind déjà synchronisé. Il s’agit des répertoires suivants :

  • ~/.bitcoin/testnet3/chainstate/
  • ~/.bitcoin/testnet3/blocks/

Lnd

Prérequis

Installation de Go et git :

sudo apt-get install golang-1.9 git

Mise à jour du PATH :

echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin

Installation de Glide :

go get -u github.com/Masterminds/glide

Installation

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
git fetch origin pull/447/head:bitcoind-backend
git checkout bitcoind-backend
glide install

go get -u github.com/roasbeef/btcwallet
cd $GOPATH/src/github.com/roasbeef/btcwallet
git fetch origin pull/9/head:bitcoind-backend
git checkout bitcoind-backend

cd $GOPATH/src/github.com/lightningnetwork/lnd/vendor/github.com/roasbeef
rm -rf btcwallet
ln -s $GOPATH/src/github.com/roasbeef/btcwallet .

sudo apt-get install libzmq3-dev

cd $GOPATH/src/github.com/lightningnetwork/lnd
go install . ./cmd/...

Configuration

mkdir ~/.lnd

Création d’un fichier ~/.lnd/lnd.conf :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=mon_ip_externe
peerport=9735

[Bitcoin]
bitcoin.active=1
bitcoin.rpcuser=mon_login
bitcoin.rpcpass=mon_password

[Core]
core.active=1

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement

lnd --bitcoin.active --bitcoin.testnet

Création d’un wallet Bitcoin (on doit choisir un mot de passe) :

lncli create

Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en tBTC (testnet bitcoins)

Via ce faucet par exemple : https://testnet.manu.backend.hamburg/faucet

Connexion à un autre nœud

On peut trouver des adresses de nœuds sur https://explorer.acinq.co

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

Création d’un channel

On alloue dans cet exemple 300000 satoshis au nouveau channel.

lncli openchannel 02464bfaaae78b98268a6a6d7e8f6a110c60dd1293811d6029b11ee9edb4bbf869 --local_amt 300000

A partir d’ici, on peut effectuer des paiements, se connecter à d’autres noeuds, ouvrir de nouveaux channels etc.

Ressources

Bitcoin / Installation d'un nœud Lightning sur Raspberry Pi 1

|

Cette procédure a été réalisée sur un Raspberry Pi 1 Modele B+ tournant sous Raspian stretch lite.

Ce Raspberry est doté d’un CPU mono-cœur cadencé à 700 MHz, et de 512 Mo de RAM.

Il s’agit plus ici de s’amuser que d’obtenir un nœud Lightning fonctionnel ; nous sommes aux limites de ce que peut supporter un machine aussi modeste.

La blockchain a été au préalable téléchargée depuis une autre machine, puis mise à disposition du Raspberry via un partage NFS.

Prérequis

Augmentation de la swap à 1 Go via /etc/dphys-swapfile :

CONF_SWAPSIZE=1000

Prise en compte du changement :

sudo /etc/init.d/dphys-swapfile restart

Allocation de mémoire GPU au minimum via /boot/config.txt :

gpu_mem=16

Installation de Go et git :

sudo apt-get install git
wget https://storage.googleapis.com/golang/go1.8.linux-armv6l.tar.gz
sudo tar -C /usr/local -xzf go1.8.linux-armv6l.tar.gz

Mise à jour du PATH :

echo 'export PATH=$PATH:/usr/local/go/bin' >> $HOME/.profile
export PATH=$PATH:/usr/local/go/bin
echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin

Installation de Glide :

go get -u github.com/Masterminds/glide

Installation de lnd

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
glide install
go install . ./cmd/...

Ca va prendre un bon bout de temps…

Installation de btcd

git clone https://github.com/roasbeef/btcd $GOPATH/src/github.com/roasbeef/btcd
cd $GOPATH/src/github.com/roasbeef/btcd
glide install
go install . ./cmd/...

Là aussi, il faudra être patient…

Démarrage de btcd

btcd --testnet --txindex --rpcuser=mon_login --rpcpass=mon_password

Le démarrage va être très long. Dans mon cas, cela a pris trois heures :

2018-01-03 01:54:46.270 [INF] CHAN: Loading block index.  This might take a while...
2018-01-03 05:01:28.493 [WRN] CHAN: Unknown new rules activated (bit 1)

Création d’un fichier ~/.lnd/lnd.conf

Cela simplifiera le lancement le lnd :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=<mon_ip_externe>
peerport=9735

[Bitcoin]
bitcoin.active=1
bitcoin.rpcuser=mon_login
bitcoin.rpcpass=mon_password

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement de lnd

lnd --bitcoin.active --bitcoin.testnet

Il lui faudra un petit bout de temps pour réussir à se caler avec btcd.

Création d’un wallet Bitcoin

lncli create
Input wallet password:
Confirm wallet password:

On doit choisir un mot de passe.

Durant mes multiples essais, j’ai obtenu à plusieurs reprises une erreur out of memory à ce moment précis. L’augmentation de la swap (détaillée en début d’article) a corrigé le problème. Avec un Pi doté d’un Go de RAM, il n’y a sans doute pas de problème.

Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en tBTC (testnet bitcoins)

Via ce faucet par exemple : https://testnet.manu.backend.hamburg/faucet

Connexion à un autre nœud

On peut trouver des adresses de nœuds sur https://explorer.acinq.co

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

BTCD + LND sur Pi1

Introduction à tmux

|

Tmux est un multiplexeur de terminaux ; il permet d’afficher plusieurs terminaux virtuels dans un seul terminal. Tmux peut par ailleurs être détaché d’une session pour fonctionner en arrière-plan (à la manière de screen).

Quelques commandes à connaître

Commande Action
tmux lancer tmux
CTRL-b d se détacher de tmux
tmux -a se rattacher un tmux détaché
CTRL-b “ diviser un terminal horizontalement
CTRL-b % diviser un terminal verticalement
CTRL-b flèche changer de fenêtre (dans la direction indiquée)
CTRL-b c créér un nouvel onglet
CTRL-b p aller à l’onglet précédent (previous)
CTRL-b n aller à l’onglet suivant (next)
CTRL-b ‘ aller à un onglet en fonction de son numéro
CTRL-b , nommer un onglet
CTRL-b x fermer une fenêtre
CTRL-b z Zoom sur le terminal actif (et en sortir)
CTRL-b espace changer la disposition des fenêtres (essayer plusieurs fois de suite)
CTRL-b page-haut remonter dans l’historique de la fenêtre
CTRL-b page-bas descendre dans l’historique de la fenêtre
CTRL-b ! déplacer le terminal actif dans un nouvel onglet
Echap sortir du défilement de l’historique

Astuce perso

Je rajoute dans mon fichier ~/.tmux.conf la configuration suivante :

unbind s
bind s set -g synchronize-panes

Ainsi, il me suffit de taper CTRL-b s pour activer la saisie simultanée dans toutes les fenêtres affichées.

On peut ensuite la désactiver en retapant CTRL-b s

Démo en vidéo

(vidéo réalisée par Candyapplebone)

Bitcoin / Lightning - Installation du client lnd web

|

Procédure d’installation sous Ubuntu 16.04.3 LTS.

Le client lncli-web a été développé par Francois Mably

Installation de node et npm

sudo apt-get install npm
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install nodejs

Clonage du repository

git clone https://github.com/mably/lncli-web
cd lncli-web

Installation des dépendances

npm install

Configuration par défaut

"./node_modules/.bin/gulp" bundle

Certificats lnd

Génération de certificats lnd compatibles avec NodeJS gRPC

pushd
cd ~/.lnd
openssl ecparam -genkey -name prime256v1 -out tls.key
openssl req -new -sha256 -key tls.key -out csr.csr -subj '/CN=localhost/O=lnd'
openssl req -x509 -sha256 -days 3650 -key tls.key -in csr.csr -out tls.cert
rm csr.csr
popd

Copie du certificat :

cp ~/.lnd/tls.cert lnd.cert

Serveur lnd

Si ce n’est pas déjà fait, lnd doit être démarré avec l’option --no-macaroons

lnd --bitcoin.active --bitcoin.testnet --no-macaroons

Démarrage du serveur

node server

L’interface web devrait être visible à l’adresse http://localhost:8280

GitHub / Un blog Jekyll en 5mn chrono

|

Fork de Jekyll-now

Forker le repository GitHub suivant, sous le nom “votrenom.github.io” : https://github.com/barryclark/jekyll-now

Le site est presque immédiatement visible sur https://votrenom.github.io

On peut rajouter des posts en créant des fichiers au format Markdown dans le dossier _posts (s’inspirer de la syntaxe du fichier existant).

Développement local

Pour pouvoir développer le site web en local, on doit cloner le repository précédemment créé, puis installer quelques packages :

sudo apt-get install ruby ruby-dev
sudo gem install bundler

A la racine du repository local, on crée un fichier Gemfile contenant :

source 'https://rubygems.org'
gem 'github-pages', group: :jekyll_plugins
bundle install

Enfin, on lance Jekyll en mode --watch :

bundle exec jekyll serve --watch

Le site est visible à l’adresse http://127.0.0.1:4000/ et se met automatiquement à jour à chaque modification (pas besoin de relancer Jekyll).

GitHub / Authentification par clé SSH

|

Copier la clé publique sur la page SSH Keys de GitHub.

On peut ensuite tester la connexion via :

ssh -T git@github.com

Le serveur doit répondre :

Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.

Dans le répertoire d’un dépôt local, il suffit de configurer :

git remote set-url origin git@github.com:username/depot.git

Les prochains git push utiliseront l’authentification par clé SSH.

Bitcoin / Installation d'un nœud Lightning sur testnet - Partie 2

|

Création d’un fichier ~/.lnd/lnd.conf

Cela simplifiera le lancement le lnd :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=<mon_ip_externe>
peerport=9735

[Bitcoin]
bitcoin.active=1
bitcoin.rpcuser=mon_login
bitcoin.rpcpass=mon_password

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement de lnd

lnd --bitcoin.active --bitcoin.testnet

Création d’un wallet Bitcoin

lncli create

On doit choisir un mot de passe. Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en tBTC (testnet bitcoins)

Via ce faucet par exemple : https://testnet.manu.backend.hamburg/faucet

Connexion à un autre nœud

On peut trouver des adresses de nœuds sur https://explorer.acinq.co

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

Mémoriser des identifiants Git

|

Mise en cache des identifiants de connexion a GitHub (par exemple) dans le cas d’une connexion via un couple identifiant / mot de passe (et non par clé SSH)

git config --global credential.helper cache

Par défaut, le mot de passe est mis en cache pendant 15 minutes. Pour augmenter ce délai à une heure :

git config --global credential.helper 'cache --timeout=3600'

Créer une partition exFAT sous Linux

|

Le système de fichier exFAT a l’avantage de fonctionner correctement sur tous les OS, sans trop de bricolage. Sous Linux, il sera notamment bien moins gourmand en CPU que NTFS, et il acceptera aussi parfaitement les fichier de plus de 4 Go.

Installer les outils exfat

sudo apt-get install exfat-fuse

Créer la partition avec fdisk, et choisir le type de partition 11 (Microsoft basic data)

fdisk /dev/sdN

Formater la partition et lui attribuer une étiquette (label), ici “NomDuDisque” :

mkfs.exfat -n NomDuDisque /dev/sdNX

Bitcoin / Installation d'un nœud Lightning sur testnet - Partie 1

|

Cette procédure a été effectuée sur un Linux Ubuntu Server 16.04.3 LTS. Prévoir assez d’espace disque pour héberger un full node Bitcoin testnet (le 27/12/2017, la blockchain prenait 15,3 Go). Il s’agit globalement d’une traduction très épurée de cette documentation.

Prérequis

Installation de Go et git :

sudo apt-get install golang-1.9 git

Mise à jour du PATH (potentiellement à rajouter dans ~/.bashrc):

echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin

Installation de Glide :

go get -u github.com/Masterminds/glide

Installation de lnd

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
glide install
go install . ./cmd/...

Par la suite, il sera possible de mettre à jour lnd via :

cd $GOPATH/src/github.com/lightningnetwork/lnd
git pull && glide install
go install . ./cmd/...

Installation de btcd

git clone https://github.com/roasbeef/btcd $GOPATH/src/github.com/roasbeef/btcd
cd $GOPATH/src/github.com/roasbeef/btcd
glide install
go install . ./cmd/...

Démarrage de btcd

btcd --testnet --txindex --rpcuser=mon_login --rpcpass=mon_password

La synchronisation de la blockchain va débuter. Ce processus peut prendre plusieurs heures.

On peut obtenir le numéro du dernier block synchronisé via :

btcctl --testnet --rpcuser=mon_login --rpcpass=mon_password getinfo | grep blocks

La suite : Bitcoin / Installation d’un noeud Lightning sur testnet - Partie 2

VMware & Linux / Augmentation de RAM à chaud

|

Après ajout de RAM, voici la procédure pour qu’elle soit reconnue sans redémarrer la VM.

grep offline /sys/devices/system/memory/*/state | cut -d':' -f1 > /tmp/mem
while read a; do echo online > $a; done < /tmp/mem
rm -f /tmp/mem