目录
(我所用为python3+pycharm)
1.1、简介:
1、编写的程序语法完全正确, 在程序运行或执行时仍可能出错(最典型的就是除零错,因为0 不能作为除数, Python 解释器会显示该错误,并会终止程序的执行)
2、在正在运行的程序或脚本的上下文环境中处理错误:异常处理功能
try/except语句进行异常处理。当错误发生时, 异常处理捕获这一错误并在屏幕上打印一条消息
3、为了获取错误的确切信息,把异常存储到变量e中, 以便将其打印出来, 同时还要将变量e转换成一个字符串
try:
print(''100/0 = "+str(100/0))
except Exception as e:
print("Error = "+str(e))
注(版本兼容问题):
python2:except Exception,e:
python3:except Exception as e:
1.2、示例:
用异常处理来更新抓取banner 的脚本。把网络连接代码写在try 语句块中, 尝试连接到一台没有在TCP 端口21 上运行FTP 服务的机器。 就会看到一条报错的消息
import socket
socket.setdefaulttimeout(2)
s=socket.socket()
try:
s.connect(('192.168.190.131',21))
except Exception as e:
print('Error='+str(e))
2.1、简介:
函数提供了高效的可重用代码块,python自带许多内置函数, 也可以创建定义的函数
关键字def()表示函数开始,并且可以在括号内填写任何变量,这些变量会被以引用的方式传递给函数
2.2、示例1:
创建一个函数来完成连接到FTP 服务器并返回banner的操作
(我直接使用pycharm运行的,节省调试时间)
import socket def retbanner(ip, port): try: socket.setdefaulttimeout(2) s = socket.socket() s.connect((ip, port)) banner = s.recv(1024) return banner except Exception as e: return e def main(): ip1 = '127.0.0.1' ip2 = '192.168.190.131' port = 8080 banner1 = retbanner(ip1, port) if banner1: print(ip1 + ': ' + str(banner1)) banner2 = retbanner(ip2, port) if banner2: print(ip2 + ': ' + str(banner2)) if __name__ == '__main__': main()
2.3、示例2:
banner返回后, 我们的脚本需要把它们和一些已知有漏洞的程序(的banner)进行比较
checkVulns()函数接收参数banner变量, 并以此来判断服务器中是否存在漏洞
import socket def retbanner(ip, port): try: socket.setdefaulttimeout(2) s = socket.socket() s.connect((ip, port)) banner = s.recv(1024) return banner except Exception as e: return e def checkVulns(banner): if "FreeFloat Ftp Server (Version 1.00)" in banner: print(" FreeFloat FTP Server is vulnerable.") elif "3Com 3CDaemon FTP Server Version 2.0" in banner: print(" FreeFloat FTP Server is vulnerable.") elif "Ability Server 2.34" in banner: print(" FreeFloat FTP Server is vulnerable.") elif "Sami FTP Server 2.0.2" in banner: print(" FreeFloat FTP Server is vulnerable.") else: print("FTP Server is not vulnerable.") return def main(): ip1 = '127.0.0.1' ip2 = '192.168.190.131' port = 8080 banner1 = retbanner(ip1, port) if banner1: print(ip1 + ': ' + str(banner1).strip('\n')) checkVulns(banner1) banner2 = retbanner(ip2, port) if banner2: print(ip2 + ': ' + str(banner2).strip('\n')) checkVulns(banner2) if __name__ == '__main__': main()
3.1、简介:
检查三个不同的IP地址,与写三次相同的程序相比, 用for循环遍历多个元素可能更容易
3.2、示例1:
如果想遍历IP地址从192.168.95.1到192.168.95.254的整个/24子网, 使用for循环(范围从1
到255)可以打印出整个子网
for x in range(1,255): print("192.168.95."+str(x))(range还可设置每个间距)
3.3、示例2:
遍历所有已知端口列表的方式检查漏洞, 只需遍历某个list中的所有元素即可, 无须遍历某个范围内的所有数字
portList = [21, 22, 25, 80, 110] for port in portList: print(port)
3.4、示例3:
通过嵌套两个for循环, 我们可以打印出每个IP地址上的每个端口
portList = [21, 22, 25, 80, 110] for port in portList: print(port) for x in range(1, 255): for port in portList: print('Checking 192.168.190.' + str(x) + ': ' + str(port))
3.5、示例4:
利用迭代IP 地址和端口, 更新漏洞检查脚本。现在, 脚本将测试192.168.190.0/24子网上的所有254个IP地址, 测试的端口包括telnet 、SSH、SMTP、HTTP、IMAP及HTTPS协议的端口
import socket def retbanner(ip, port): try: socket.setdefaulttimeout(2) s = socket.socket() s.connect((ip, port)) banner = s.recv(1024) return banner except Exception as e: return e def checkVulns(banner): if "FreeFloat Ftp Server (Version 1.00)" in banner: print(" FreeFloat FTP Server is vulnerable.") elif "3Com 3CDaemon FTP Server Version 2.0" in banner: print(" FreeFloat FTP Server is vulnerable.") elif "Ability Server 2.34" in banner: print(" FreeFloat FTP Server is vulnerable.") elif "Sami FTP Server 2.0.2" in banner: print(" FreeFloat FTP Server is vulnerable.") else: print("FTP Server is not vulnerable.") return def main(): portList = [21, 22, 25, 80, 110, 443] for x in range(1,255): ip = '192.168.190.' + str(x) for port in portList: banner = retbanner(ip, port) if banner: print(ip + ': ' + str(banner)) checkVulns(banner) if __name__ == '__main__': main()