一、Ping原理
Ping过程是使用ICMP包,主机向目标机发送一个ICMP包,目标机收到后,调换原地址和目标地址,再发送回来。
如果PING通,就表示发送机和接受机在网络上是可以连通的。
二、涉及的知识
1、SCAPY:
scapy是python中一个可用于网络嗅探的非常强大的第三方库,可以用它来做 packet 嗅探和伪造 packet。 scapy已经在内部实现了大量的网络协议。如DNS、ARP、IP、TCP、UDP等等,可以用它来编写非常灵活实用的工具。
1、发送方式
send() 在第三层发送数据包,但没有接收功能
sendp() 在第二层发送数据包,但没有接收功能
sr() 在第三层发送数据包,有接收功能
sr1() 在第三层发送数据包,有接收功能,但只接收第一个包
2、常见的构造形式
SYN扫描
sr1(IP(dst="61.135.169.105")/TCP(dport=80,flags="S"))
TCP
sr1(IP(dst="1.1.1.1")/TCP(dport=80,flags='A') ,timeout=1))
端口扫描
sr1(IP(dst="1.1.1.1")/UDP(dport=53),timeout=1,verbose=1)
sr1(IP(dst="192.168.60.3")/TCP(dport=80),timeout=1,verbose=1)
2、调用系统命令函数
os.system("cmd")
3、sys.argv用法
sys.argv变量是一个字符串的列表。
当我们执行"python using_sys.py a b c "的时候,后面跟着的内容被作为参数传递给程序,Python为我们把它存储在sys.argv变量中。
'using_sys.py'是sys.argv[0]、'a'是sys.argv[1]、'b'是sys.argv[2]、'c'是sys.argv[3]。
sys.startswith() 是用来判断一个对象是以什么开头的
三、Ping程序
#!/usr/bin/python
import sys
import os
from scapy.all import *
def use():
print("Usage : ./Ping.py -i 192.168.1.2")
print("Usage : ./Ping.py -r 192.168.1.0 ")
#判断后面参数
if len(sys.argv) <= 1:
use()
sys.exit(0)
elif(sys.argv[1]=="-i"):
sgement_ip=sys.argv[2]
#分离出IP
target = sgement_ip.split(".")[0] +"."+ sgement_ip.split(".")[1] +"." +sgement_ip.split(".")[2] +"."+sgement_ip.split(".")[3]
#执行命令
os.system('ping %s'%(target))
elif(sys.argv[1]=="-r"):
address = str(sys.argv[2])
target = address.split(".")[0] + "."+ address.split(".")[1] +"." + address.split(".")[2] + "."
#采用scapy发送ICMP包的方式
for addr in range(0,254):
answer=sr1(IP(dst=target+str(addr))/ICMP(),timeout=2,verbose=0)
print("The %s %s is "%(target,str(addr)))
print (answer)
else:
assert False, "Unhandled Option"
use()
四、看最后的结果