scapy: outil de manipulation avancée des paquets réseauxtixeuil/m2r/uploads/main/pr...scapy:...
TRANSCRIPT
Scapy:outildemanipulationavancéedespaquetsréseaux
NesrineAmmar– ProgRes [email protected]
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