[pastacode lang= »bash » manual= »%20nmap%20-p0-65535%20192.168.0.14%20-T5″ message= »Scan rapide des ports 0 à 65535″ highlight= » » provider= »manual »/]
Étiquette : nmap
Voici comment détecter rapidement les machines vulnérable à l’exploit WannaCry grâce à Nmap (version 7 minimum) et du plugin associé à l’exploit : smb-vuln-ms17-010.nse.
Vous pouvez vérifié votre version de Nmap avec la commande suivante:
nmap -V
Nmap version 5.51 ( http://nmap.org )
Si vous avez une version inférieur à la 7, il faudra compiler Nmap à partir de la dernière version disponible (nmap-7.40.tar.bz2 actuellement).
cd /usr/share/
wget https://nmap.org/dist/nmap-7.40.tar.bz2
bzip2 -cd nmap-7.40.tar.bz2 | tar xvf -
cd nmap-7.40
./configure
make
make install
Maintenant que Nmap est installé et en version au moins égale à la 7.4, nous allons installer le plugin nécessaire pour identifier les machines vulnérable à Wannacry.
Pour cela nous devons trouver le répertoire contenant les scripts Nmap, vous pouvez pour cela vous aider de cette commande:
locate -i *.nse
ou
locate -i nmap | grep -i script
Une fois trouvé, on se rend dedans et on télécharge le plugin:
cd /usr/share/nmap-7.40/scripts/
wget https://raw.githubusercontent.com/cldrn/nmap-nse-scripts/master/scripts/smb-vuln-ms17-010.nse
On met à jour la base de donnée de Nmap:
cd /usr/share/nmap-7.40/
./nmap --script-updatedb
Pour scanner une machine en 192.168.0.33 et générer le résultat dans un fichier HTLM:
./nmap -sC -p 445 --script smb-vuln-ms17-010.nse 192.168.0.33 -oX scan.xml && xsltproc scan.xml -o "wannacry_192.168.0.33_`date +%d%m%y`.html"
On peut ensuite consulter le fichier HTML contenant rapport généré par Nmap:
Pour scanner le réseau 192.168.0.0/24 et générer le résultat dans un fichier HTLM:
./nmap -sC -p 445 -max-hostgroup 3 -open --script smb-vuln-ms17-010.nse 192.168.0.0/24 -oX scan.xml && xsltproc scan.xml -o "wannacry_192.168.0.0-24_`date +%d%m%y`.html"
On peut ensuite consulter le fichier HTML contenant rapport généré par Nmap:
Pour scanner une liste d’adresse IP et générer le résultat dans un fichier HTLM:
vi ip.txt
Dans le fichier ip.txt nous allons mettre toute nos adresse IP à scanner (une adresse ip par ligne) et on le donne en argument à Nmap:
./nmap -sC -p 445 -max-hostgroup 3 -open --script smb-vuln-ms17-010.nse -iL ip.txt -oX scan.xml && xsltproc scan.xml -o "wannacry_listeIP_`date +%d%m%y`.html"
Si aucune machine vulnérable à l’exploit SMBv1 n’est détectée (ou que le service n’est pas activé, patché ou pas), la sortie sera vide.
Si une machine à le protocole SMBv1 activé mais qu’il a été patché, la sortie affichera « Could not connect to ‘IPC$’ « .
Mais si une machine vulnérable à l’exploit SMBv1 est détectée (service activé et non patché), voici la sortie que vous allez avoir:
Starting Nmap 7.40 ( https://nmap.org ) at 2017-05-18 12:16 CEST
Nmap scan report for 192.168.0.33
Host is up (0.0013s latency).
PORT STATE SERVICE
445/tcp open microsoft-ds
MAC Address: 00:0C:29:E5:8A:29 (VMware)
Host script results:
| smb-vuln-ms17-010:
| VULNERABLE:
| Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
| State: VULNERABLE
| IDs: CVE:CVE-2017-0143
| Risk factor: HIGH
| A critical remote code execution vulnerability exists in Microsoft SMBv1
| servers (ms17-010).
|
| Disclosure date: 2017-03-14
| References:
| https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
| https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
Nmap done: 1 IP address (1 host up) scanned in 13.61 seconds
Et voila, vous savez maintenant le nombre machine Windaube qu’il faut patcher…
Telnet, (depuis un serveur distant)
telnet 192.168.0.14 20000
Si le port est ouvert:
Trying 192.168.0.14...
Connected to entropia (192.168.0.14).
Escape character is '^]'.
Si le port est fermé (ou service non démarré):
Trying 192.168.0.14...
telnet: connect to address 192.168.0.14: Connection refused
telnet: Unable to connect to remote host: Connection refused
Netstat, (pour tester en local)
netstat -paunt | grep 3306; echo $?
Si le port est ouvert:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1979/mysqld
0
Si le port est fermé (ou service non démarré):
1
Netcat, (depuis un serveur distant)
nc -v -z 192.168.0.14 3306; echo $?
Si le port est ouvert:
Connection to 192.168.0.14 3306 port [tcp/mysql] succeeded!
0
Si le port est fermé (ou service non démarré):
nc: connect to 192.168.0.14 port 3306(tcp) failed: Connection refused
1
nc 192.168.0.14 3306< /dev/null ; echo $?
Si le port est ouvert:
4
5.1.73▒d))4f*<,i▒N*'%#~rC8/#`0
Si le port est fermé (ou service non démarré):
1
Wget pour tester un serveur web, (depuis un serveur distant)
wget -qO- 192.168.0.14:80 ; echo $?
wget -q --spider 192.168.0.14:80 ; echo $?
Curl, (depuis un serveur distant)
curl telnet://192.168.0.14:22
Si le port est ouvert, la commande restera bloquée car elle attend que l’on saisisse quelque chose. ctrl+c pour sortir.
Si le port est fermé:
curl: (7) couldn't connect to host
Bash, (depuis un serveur distant)
timeout 1 bash -c 'cat < /dev/null > /dev/tcp/192.168.0.14/22' ; echo $?
Si le port est ouvert:
0
Si le port est fermé:
bash: connect: Connexion refusée
bash: /dev/tcp/192.168.0.14/22: Connexion refusée
1
Nmap, (depuis un serveur distant)
nmap -p 80 192.168.0.14
Si le port est ouvert:
Starting Nmap 5.51 ( http://nmap.org ) at 2016-03-29 10:00 CEST
Nmap scan report for entropia.local (192.168.0.14)
Host is up (0.00068s latency).
PORT STATE SERVICE
80/tcp open http
MAC Address: 00:50:56:01:27:55 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.12 seconds
Si le port est fermé:
Starting Nmap 5.51 ( http://nmap.org ) at 2016-03-29 10:06 CEST
Nmap scan report for entropia.local (192.168.0.14)
Host is up (0.00045s latency).
PORT STATE SERVICE
80/tcp closed http
MAC Address: 00:50:56:01:27:55 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds
Pour tester plusieurs port en même temps:
nmap -p 22,1944,20000 192.168.0.14
Python, (depuis un serveur distant)
python
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('192.168.0.14' , 80))
clientsocket.sent('\n')
Si le port est ouvert, vous arriverez à faire un « clientsocket.sent(‘\n’) » (qui vous retournera surement cette une erreur):
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: '_socketobject' object has no attribute 'sent'
Si le port est fermé, au moment du « clientsocket.connect((‘192.168.0.14’ , 80)) » :
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in connect
socket.error: [Errno 111] Connection refused