scapy: outil de manipulation avancée des paquets réseauxtixeuil/m2r/uploads/main/pr...scapy:...

Post on 08-Sep-2020

3 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Scapy:outildemanipulationavancéedespaquetsréseaux

NesrineAmmar– ProgRes 2018nesrine.ammar@etu.upmc.fr

Objectivesdemanipulationdespaquetsréseaux

Packet forging tool

Forgedespaquetsetenvoientlesdansleréseaux

Sniffing tool

Capturedespaquetsréseaux

Testing tool

Essayederépondreàunequestionprécise(oui/non)ex.ping

Objectivesdemanipulationdespaquetsréseaux

Scanningtool

Fairedestestsutilisantdifférentsparamètres

Fingerprintingtool

Fairedestestsprédéfinisafindediscriminerunpair

Attacking tool

Utilisedesvaleursinattendusd’unprotocole

Bibliothèqued’analysedetrafic

Pcap• Interfacedeprogrammation(API)permettantdecapturerletraficréseau• ImplémentésousUnixetMacOSparlabibliothèqueLibpcap etsouswindows parlabibliothèqueWinpcap

Libpcap et winpcap:• Assure le filtrage, la capture et l’analyse de paquets,• Supporte plusieurs protocoles: IP(), UDP(), DNS(), DHCP(), HTTP()…

Libpcap

ProgrammeutilisantLibpcap:• Tcpdump• Wireshark• Nmap

Bibliothèqued’enveloppepourLibpcap(wrapper librairies):• Python:pylibpcap,scapy• Java:jpcap,jNetPcap• Ruby:PacketFu…

Python

• Thisisan int (signed,32bits):42• Thisisalong (signed,infinite):42L• Thisisastr :"bell\x07\n"or’bell\x07\n’("⇐⇒ ’)• Thisisatuple :(1,4,"42")• Thisisalist :[4,2,"1"]• Thisisadict :{"one":1,"two":2}

Python

Ifcond1:instrinstr

Elif cond2:instr

Elseinstr

Try:instr

Except exception:instr

Elseinstr

Forvarinset:instr

Def func(x):ifx==0:return1

elsereturnx*2

While cond:instrinstr

Scapy

Unoutildemanipulationavancéedespaquetsréseaux,écritenpython

Objectives:

IntercepterletraficsurunsegmentréseauGénérerdespaquetsRéaliseruneprised’empreinte(fingerprinting)FaireunetracerouteAnalyserletraficréseau…

Scapy• Pointsforts:LangageinteractifdehautniveauForgeetanalysedepaquetstrèssimplesPasse lefirewalllocal

• Pointsfaibles :Fournitlesrésultatsbruts,nelesinterprètepasSupportpartieldecertainsprotocolescomplexes

Scapy

Listedecouches

>>>ls()ARP:ARPDHCP:DHCPoptionsDNS:DNSDot11:802.11[...]

Listedecommandes

>>>lsc()sr :Sendandreceivepacketsatlayer3sr1:Sendpacketsatlayer3andreturnonlythefisrp :Sendandreceivepacketsatlayer2[...]

Valeurspardéfautpourlepacket IP

>>>ls(IP)version:BitField =(4)ihl :BitField =(None)tos :XByteField =(0)len :ShortField =(None)id:ShortField =(1)flags:FlagsField =(0)frag:BitField =(0)ttl :ByteField =(64)proto:ByteEnumField =(0)chksum :XShortField =(None)src :Emph =(None)dst :Emph =(’127.0.0.1’)options:IPoptionsField =(’’)

Scapy• Chaquepaquetestcréecoucheparcouche• Chaquecouchepeutêtreempilersuruneautre• Chaquecoucheetchaquepaquetpeuventêtremanipulésindépendamment• Chaquechampdansl’entêtedesprotocolespossèdeunevaleurpardéfaut• Chaquechamppeutcontenirunevaleurouplusieursàlafois

>>>a=IP(dst="www.target.com",id=0x42)>>>a.ttl=12>>>b=TCP(dport=[22,23,25,80,443])>>>c=a/b

Scapy:valeurspardéfaut

• IPsourceestchoisieselonl’adressedestinationetlatablederoutage• Lavaleurdechecksumestcalculée• MACsourceestchoisieselonl’interfacedesortie• LetypedupaquetEthernetetleprotocoleIPestchoisieselonlescouchessupérieures• …D’autreschampslesplusutilisés:• PortTCPsourceest20,TCPdestinationest80• PortUDPsourceetdestinationest53• LetypedeICMPestecho request• …

Créationd’unetrame>>>ma_trame =Ether()>>>ma_trame.show()###[Ethernet]###WARNING:Macaddresstoreachdestinationnotfound.Usingbroadcast.dst=ff:ff:ff:ff:ff:ffsrc=00:00:00:00:00:00type=0x0>>>

>>>ma_trame =Ether(dst='00:19:4b:10:38:79')>>>

Sniffer

>>>rep=sniff(filter="host192.168.1.10")>>>

$ ping 192.168.1.10 -c 1

>>>rep.show()0000Ether/IP/ICMP192.168.1.14>192.168.1.10echo-request0/Raw0001Ether/IP/ICMP192.168.1.10>192.168.1.14echo-reply0/Raw>>>

Ecrireetlireunfichierpcap

>>>wrpcap(‘file_name.pcap’,packet)>>>

>>> packet<Etherdst=00:19:4b:10:38:79src=00:26:5e:17:00:6etype=0x800 |<IPversion=4L ihl=5L tos=0x0 len=64id=37095 flags=DF frag=0L ttl=64 proto=udp chksum=0x2666 src=192.168.1.14 dst=192.168.1.1options=[]|<UDPsport=38897 dport=domain len=44 chksum=0x65a |<DNSid=28184qr=0Lopcode=QUERY aa=0L tc=0L rd=1L ra=0L z=0L rcode=ok qdcount=1 ancount=0 nscount=0 arcount=0qd=<DNSQRqname='www.siteduzero.com.'qtype=Aqclass=IN |>an=Nonens=Nonear=None|>>>>

>>>packet=rdpcap(‘file_name.pcap’)

>>>packet[Ether].dstà adressemacdstPacket[IP].dstà adresseip dst

Navigationentrelescouchesréseaux

àPermetdevérifierlaprésencedelacoucheUDPàPermetderetournerlacouchedemandée(UDP)àLecodeestindépendantdescouchesinférieures

If UDPinpkt:print pkt[UDP].chksum

If pkt.haslayer(UDP):print pkt[UDP].chksum

CalculerlenombredepaquetsUDP

#!/usr/bin/pythonFrom scapy.all import *

Def compter(filename):nb_paquets =0file=rdpcap(filename)for pkt infile:if pkt.haslayer(UDP):nb_paquets+=1

print nb_paquets

compter(‘captures.pcap’)

Pourunevuedéveloppéedupaquet

#!/usr/bin/pythonFrom scapy.all import *

def afficher_tcp(filename):file=rdpcap(filename)for pkt infile:if pkt.haslayer(TCP):pkt.show()break:

afficher_tcp(‘captures.pcap’)

Pourunevuedéveloppéedupaquet

Pourunevuedéveloppéedupaquet

Flag=SYN

Adressedestination

Adressesource

VersionIP

Portsource

Portdestination

AffichersportdupremierpaquetTCP

#!/usr/bin/pythonFrom scapy.all import *

File=rdpcap(‘captures.pcap’)for pkt infile:try:if pkt.haslayer(TCP):print pkt[TCP].sportbreak:

Scapy:commandes

Sprintf()

Grâceàlamethode sprintf():• Créernotreproprerésumédupaquet• Extrairelesdifférentescouchesetfocalisersurleschampsnécessaires

• “%”,“{”and“}”sont descaractères spéciaux• Ils sont remplacés par“%%”,“%(”and“%)”

>>>pkt =IP(dst="192.168.8.1",ttl=12)/UDP(dport=123)>>>pkt.sprintf("Thesourceis%IP.src%")’Thesourceis192.168.8.14’

pdfdump()

>>>pkt.pdfdump()

Summary()

>>>file=rdpcap("test.pcap")>>>pkt =file[0]>>>pkt.summary()Ether/IP/TCP42.2.5.3:3021>192.168.8.14:22PA/Raw

>>>bytes(pkt[IP])b'E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'

Bytes()

Hexdump()

Lafonctionhexdump()donneunereprésentationhexadécimaledupaquet(ainsiqu'unereprésentationASCII)ets'utiliseainsi:

>>>hexdump(packet)

000000194B10387900265E17006E08004500..K.8y.&^..n..E.0010004090E7400040112666C0A8010EC0A8.@..@.@.&f......0020010197F10035002C065A6E1801000001.....5.,.Zn.....0030000000000000037777770A7369746564.......www.sited0040757A65726F03636F6D0000010001uzero.com.....

Python:CSV

importcsv

withopen('example.csv',newline='')asFile:

reader=csv.reader(File)

forrowinreader:

print(row)

Python:CSVimportcsv

myData =[["first_name","second_name","Grade"],

['Alex','Brian','A'],

['Tom','Smith','B']]

myFile =open('example2.csv','w')

withmyFile:

writer=csv.writer(myFile)

writer.writerows(myData)

print("Writingcomplete")

Python:CSV

top related