====== TP3 (Scapy et Divers Trucs) ====== __Scapy__ Un peu de Scapy avec l'interpréteur de commande en langage Pyhthon. Lancez la commande "scapy" dans un shell root. Voici un exmple pour construire un message de type ICMP/IP Echo-Request (ping). La fonction show() montre le contenu des headers & payloads pour ce message. $ scapy Welcome to Scapy (2.2.0) >>> ping = IP(dst='192.168.0.2')/ICMP() >>> ping.show() ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= icmp chksum= None src= 192.168.0.1 dst= 192.168.0.2 \options\ ###[ ICMP ]### type= echo-request # valeur par défaut (ping) code= 0 chksum= None id= 0x0 seq= 0x0 >>> Même chose avec un message TCP/IP à destination de 192.168.0.1 (port 80) avec le flag TCP SYN (demande d'ouverture de connexion). La fonction sr1() permet d'effectuer un envoi/réception... >>> x=IP(dst="192.168.0.1")/TCP(flags="S",dport=80) # on forge un paquet TCP/IP >>> x.show() >>> y = sr1(x) # send/receive >>> y.show() Voici un exemple de script //Scapy// pour faire un traceroute. #!/usr/bin/env python import sys from scapy.all import * def mytraceroute(target,maxttl): for x in range(maxttl): rsp = sr1(IP(dst=target, ttl=x)/ICMP(),verbose=0) if rsp.getlayer(ICMP).type==11 and rsp.getlayer(ICMP).code==0: print rsp.src mytraceroute("10.0.0.2",8) Un autre script //Scapy// pour faire un Syn Scan. #!/usr/bin/env python import sys from scapy.all import * def synscan(host): ports = range(1000) ip = IP(dst=host) tcp = TCP(dport=ports,flags="S") ans,unans = sr(ip/tcp) for sent,rcvd in ans: if rcvd.haslayer(TCP): # if rcvd.getlayer(TCP).flags & 2: if rcvd.sprintf("%TCP.flags%") == 'SA': print sent.dport synscan("192.168.0.1") Pour aller un peu plus loin : http://www.secdev.org/projects/scapy/doc/usage.html Une autre version avec un XMAS scan... #!/bin/python from scapy.all import * ports = range(1,1000) ipdst = "10.0.0.2" for i in ports: pkt=IP(dst=ipdst)/TCP(dport=i, flags="PUF") a = sr1(pkt, verbose=False, timeout=0.1) if a is None: print '{} is open'.format(i) Pour finir avec la connexion TCP/IP, c'est ici : https://samsclass.info/124/proj11/proj18-scapy-tcp.html __Telnet__ Ouverture d'une connexion TCP/IP avec Telnet vers un serveur web sur immortal. $ telnet @immortal 80 GET / HTTP/1.0 # enter # enter again # la réponse HTTP du serveur web... HTTP/1.1 200 OK ... ... Pour sortir d'un Telnet, tapez "Ctrl-]". __ HTTP Connect__ Considérons une machine A qui souhaite ouvrir une session telnet (port 23) sur une machine C en utilisant une connexion "rebond" sur un serveur web B (configuré pour autoriser le mode //proxy//). A$ telnet @B 80 CONNECT @C:23 HTTP/1.0 # enter # enter again C$login: xxxxxx C$password: xxxxxxx C$ ... __Attaque Man-in-the-Middle__ Dans un LAN, //syl// souhaite intercepter les échanges entre //nile// et //immortal//. syl$ arpspoof -i eth0 -t @immortal @nile &> /dev/null & syl$ arpspoof -i eth0 -t @nile @immortal &> /dev/null & syl$ echo 1 > /proc/sys/net/ipv4/ip_forward # on active le routage syl$ tcpdump -i eth0 not arp # on ignore l'ARP syl$ pkill -9 arpspoof # on fait le ménage à la fin !!! __ Un peu de nmap__ Le principe est relativement simple. Si l'on envoit en paquet TCP/IP avec le flag SYN (demande d'ouverture de connexion) sur un port donné, alors si un service écoute sur ce port, il nous répond SYN/ACK pour accépter la connexion. On en déduit que le port est ouvert. En revanche, si aucun serveur n'écoute sur ce port, le paquet est ignoré par le noyau. Autre cas possible. Si l'on envoi un paquet invalide, c'est-à-dire un paquet en dehors de toute connexion et sans flag SYN (ex. NULL, XMAS, ...), alors ce paquet est ignoré si un service est présent. En revanche, s'il n'y a pas de service à l'acoute sur le port cible, alors le noyau répond RST (reset). Ce qui nous permet de déduire que le port est effectivement fermé. A l'inverse, les autres ports sont supposés ouverts (ou filtrés). En résumé, voici les réponses dans les différents cas de figure : | | **Envoi paquet avec SYN** | **Envoi paquet invalide sans SYN** | | **Service à l'écoute** | SYN/ACK | ignoré | | **Pas de service(*)** | ignoré | RST | (*) Réponse du noyau. A vérifier: En pratique, le noyau semble répondre RST après l'envoi d'un SYN, s'il n'y a pas de service !!! L'absence de réponse correspond plutôt au cas où un firewall filtre... Quelques exemples de //scan// simples : #ping scan $ nmap -sP 192.168.0.1-10 #syn scan $ nmap -sS -p 21,22,80 192.168.0.1 #xmas scan $ nmap -sX -p 4000-10000 192.168.0.1 #traceroute $ nmap --traceroute 192.168.0.1 $ traceroute -T 192.168.0.1 # option -T pour faire du TCP plutôt que de l'UDP __Nota Bene__ : Si le nmap est trop lent dans les VMs, vous pouvez le rendre plus agressif avec les options "-n -T5". Pour aller plus loin : https://nmap.org/book/man-port-scanning-techniques.html