#http使用requests发包bs4解析,dns、icmp 使用scapy发包
importtimeimportthreadingimportrequests,bs4from scapy.all import *
from requests.exceptions importReadTimeout,ConnectTimeout,HTTPError,ConnectionErrorimportstructdefsend_http_packet(url):
requests.packages.urllib3.disable_warnings()
user_agent= "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"headers= {'User-Agent': user_agent}
url= "http://" +url
response_html= ""
try:
response=requests.get(url, headers)
response_html=response.content.decode()returnresponse_htmlexceptReadTimeout:print('Read Timeout')returnNoneexceptConnectTimeout:print('Connect Timeout')returnNoneexceptHTTPError:print('HTTP Error')returnNoneexceptConnectionError:print('Connection Error')returnNonedefcheck_http(html,title):if html != None and title !=None :
soup= bs4.BeautifulSoup(html, 'lxml')
html_title= ""html_title=soup.title.textif title inhtml_title:returnTrueelse:returnNoneelse:print('html or title is None')returnNonedefshend_icmp_packet(ip_address):
request_time=time.time()
request_time= struct.pack('>d',request_time)
response_packet= sr1(IP(dst=ip_address)/ICMP()/request_time,timeout=1,verbose =False)returnresponse_packetdeficmp_relay_time(ip_address):
response_packet=shend_icmp_packet(ip_address)
relay_time=time.time()if response_packet !=None :
response_time=response_packet.getlayer(Raw).load
response_time= struct.unpack('>d',response_time)
relay_time= (relay_time - response_time[0])*1000
returnrelay_timeelse:returnNonedefreal_icmp_relay_time(gateway,ip_address):
time_ipadd=icmp_relay_time(ip_address)
time_gateway=icmp_relay_time(gateway)if time_ipadd == None or time_gateway ==None:returnNoneelse:return time_ipadd -time_gatewaydefsend_dns_packet(domainname,dnsserver):
i= IP(dst=dnsserver)
u= UDP(dport = 53)
d= DNS(rd=1)
d.qd= DNSQR(qname = domainname , qtype = 1 ,qclass = 1)
dns_request_packet= i/u/d
dns_response_packet= sr1(dns_request_packet,timeout=2,verbose =False)if dns_response_packet !=None:
dns_response_packet=dns_response_packet.getlayer(DNS).fieldsif dns_response_packet['rcode'] ==0 :returndns_response_packetelif dns_response_packet['rcode'] == 3:print("Domain Name Error")returnNoneelif dns_response_packet['rcode'] == 2:print("Server Inside Failure")returnNoneelse:print("dns server no response")returnNonedefmain():#res = send_http_packet("www.baidu.com")
#print(check_http(res,"百度"))
res= real_icmp_relay_time("172.17.1.1","192.168.101.2")print(res)#res = send_dns_packet("www.baidu.com","114.114.114.144")
#print(res)
if __name__ == '__main__':
main()