import os,argparse,dpkt from scapy.all import * pkts=[] count=0
def Get_TTL(pkt): try: if pkt.haslayer(IP): ip_src = pkt.getlayer(IP).src ip_sport = pkt.getlayer(IP).sport ip_dst = pkt.getlayer(IP).dst ip_dport = pkt.getlayer(IP).dport ip_ttl = str(pkt.ttl) print("[+] 源地址: %-15s:%-5s --> 目标地址: %-15s:%-5s --> TTL: %-5s"%(ip_src,ip_sport,ip_dst,ip_dport,ip_ttl)) except Exception: pass
def Get_DNSRR(pkt): if pkt.haslayer(DNSRR): rrname = pkt.getlayer(DNSRR).rrname rdata = pkt.getlayer(DNSRR).rdata ttl = pkt.getlayer(DNSRR).ttl print("[+] 域名: {} --> 别名: {} --> TTL: {}".format(rrname,rdata,ttl))
def Get_DNSQR(pkt): if pkt.haslayer(DNSRR) and pkt.getlayer(UDP).sport == 53: rcode = pkt.getlayer(DNS).rcode qname = pkt.getlayer(DNSQR).qname if rcode == 3: print("[-] 域名解析不存在") else: print("[+] 解析DNSQR存在:" + str(qname))
def FindDDosAttack(pcap): pktCount = {} for timestamp,packet in pcap: try: eth = dpkt.ethernet.Ethernet(packet) ip = eth.data tcp = ip.data src = socket.inet_ntoa(ip.src) dst = socket.inet_ntoa(ip.dst) sport = tcp.sport if dport == 80: stream = src + ":" + dst if pktCount.has_key(stream): pktCount[stream] = pktCount[stream] + 1 else: pktCount[stream] = 1 except Exception: pass for stream in pktCount: pktSent = pktCount[stream] if pktSent > 500: src = stream.split(":")[0] dst = stream.split(":")[1] print("[+] 源地址: {} 攻击: {} 流量: {} pkts.".format(src,dst,str(pktSent)))
def FindPcapURL(pcap): Url = [] for timestamp,packet in pcap: try: eth = dpkt.ethernet.Ethernet(packet) ip = eth.data src = socket.inet_ntoa(ip.src) tcp = ip.data http = dpkt.http.Request(tcp.data) if(http.method == "GET"): UrlHead = http.headers for key,value in UrlHead.items(): url = re.findall('^https*://.*',str(value)) if url: print("[+] 源地址: %10s --> 访问URL: %-80s"%(src, url[0])) except Exception: pass return set(Url)
def write_cap(pkt): global pkts global count pkts.append(pkt) count += 1 if count == 1024: wrpcap("data.pcap",pkts) fp = open("./data.pcap","rb") pcap = dpkt.pcap.Reader(fp) FindPcapURL(pcap) fp.close() pkts,count = [],0
def Banner(): print(" _ ____ _ _ ") print(" | | _ _/ ___|| |__ __ _ _ __| | __") print(" | | | | | \___ \| '_ \ / _` | '__| |/ /") print(" | |__| |_| |___) | | | | (_| | | | < ") print(" |_____\__, |____/|_| |_|\__,_|_| |_|\_\\") print(" |___/ \n") print("E-Mail: me@lyshark.com")
if __name__ == "__main__": Banner() parser = argparse.ArgumentParser() parser.add_argument("--mode",dest="mode",help="模式选择<TTL/DNSRR/DNSQR/URL>") args = parser.parse_args() if args.mode == "TTL": print("[*] 开始抓取本机TTL流量") sniff(prn=Get_TTL,store=0) elif args.mode == "DNSRR": print("[*] 开始抓取本机发送出去的DNS查询请求所对应的网站URL") sniff(prn=Get_DNSRR,store=0) elif args.mode == "DNSQR": print("[*] 解析网页的DNS查询记录") sniff(prn=Get_DNSQR,store=0) elif args.mode == "URL": print("[+] 开始抓包,pcap文件并读取出其中的网址") sniff(prn=write_cap,store=0) else: parser.print_help()
|