传送门
本系列原创博文传送门:
用Python做一个安全攻守工具:端口嗅探器(1)
用Python做一个安全攻守工具:端口嗅探器(2)
用Python做一个安全攻守工具:端口嗅探器(3)
用Python做一个安全攻守工具:端口嗅探器(4)
用Python做一个安全攻守工具:端口嗅探器(5)
用Python做一个安全攻守工具:端口嗅探器(6)
用Python做一个安全攻守工具:端口嗅探器(7)
用Python做一个安全攻守工具:端口嗅探器(8)
用Python做一个安全攻守工具:端口嗅探器(9)
序言
明天是2020.12.26,马上要到2021了,这几天准备用PySide2做一个最简单的安全攻守工具,给2020年收个尾吧。
在这儿先说明,我如今对PySide2和安全攻守基本上都是处于一无所知的状态,所以通过这一系列(假如一篇未能结束)的博文,你们可以跟我一起学习。
笔者曾经在测试开发团队里实行的是Tkinter,由于它门槛低,是python的外置模块,才能快速出成果,并且做下来的疗效有些LOWlinux服务器安全攻防,所以此次选择用一个看上去愈发牛逼些的模块来做GUI。
那为何要用PySide2呢?由于它是Qt的亲弟弟,但是近来在迅速成熟,加上它的授权类型比PyQt5愈发友好,二者本身代码兼容度十分高。
那为何要做安全攻守工具呢?我觉得安全测试是测试开发的一个领域。
那为何是端口嗅探器?由于它比较容易入手。
哪些是端口嗅探器?
我在先前给团队培训插口测试的时侯,以前有介绍过端口。
在说端口之前,先说到域名,之后是网址。
里面概念有疑问的,可以留言linux服务器安全攻防,我瞧瞧要不要细讲,说不定我自己也有不清楚的地方。
通过网址访问,我们的访问被负载均衡分到各个服务器。负载均衡将恳求转发到对应ip。
在ip旁边,跟随端口。举个反例:
例如通常网站开放着80端口,例如说百度,,虽然前面是默认的80端口,即实际上是:80
首先通过进行DNS解析,抵达一台负载均衡服务器,之后它会依照规则分到一台web服务器。
如上图,通过Windows的tracert命令,追踪路由节点,发觉最后的节点服务器的ip是110.242.68.4。
使用该ip,输入到浏览器地址栏,发觉才能打开百度:
这么ip110.242.68.4就是确定的百度单台服务器。
这么,这台服务器,必然会开着一些端口(port)。
啥是端口,这儿说的端口是指虚拟端口,是服务器对外开放的通信口子,特指TCP/IP合同中的端口,是逻辑意义上的端口。
端口嗅探器就是去找寻这台服务器上开着什么端口,通过这种端口晓得服务器上运行了什么服务。
之后通过这种信息,可以做些其他的事情。例如帮运维扫描一下我们的服务器都开着什么端口和服务,是否有必要,是否须要关掉。
讲了基础的原理,接出来就开始讲一下实现。
用Python实现最基础的端口侦测
我如今不管其他啊,如今我领到一个ip,和一个端口,我就只是想“摸”一下这个端口。
怎样“摸”呢?
python有提供一个外置的模块,socket——这个名子听上去是不是认为很高大上啊,似乎技术开发常常在讲,说这个服务是用socket写的,这个服务是用UDP写的。
好吧,不要有啥畏难情绪,有洛城博主在——因为博主现今和你们也是差不多的!跟随博主做完,我们其实就一起懂了!
百度一下pythonsocket,见到新手教程里有关于它的课程,欢乐地点进去看一遍再说。
定义:Socket又称"套接字",应用程序一般通过"套接字"向网路发出恳求或则应答网路恳求redhat linux 9.0,使主机间或则一台计算机上的进程间可以通信。
socket通过socket()来创建,这么代码如下:
# coding=utf-8
import socket
client = socket.socket()
之后我们是顾客端的,顾客端有两个api:
s.connect()
主动初始化TCP服务器联接,。通常address的格式为元组(hostname,port)linux虚拟主机,倘若联接出错,返回socket.error错误。
s.connect_ex()
connect()函数的扩充版本,出错时返回出错码,而不是抛出异常
假如用第一个api,那须要写trycatch,所以我们就用第二个的connect_ex():
ip = '110.242.68.4'
port = 80
address = (ip, port) # 地址必须是一个元祖,第一个是str,第二个是int
err = client.connect_ex(address)
之后都会用到两个api,一个是联接关掉用的close(),一个是拿来获取接收信息的recv()
完成后的代码如下:
# coding=utf-8
import socket
client = socket.socket() # 创建套接字
ip = '110.242.68.4'
port = 80
address = (ip, port) # 地址必须是一个元祖,第一个是str,第二个是int
err = client.connect_ex(address)
if err == 0: # 当端口开启时,错误码是0,其他错误码均表示未开该端口
print(client.recv(1024))
client.close() # 关闭连接
print(err)
运行,得到如下结果:
虽然是大厂,啥输出都没有,信息都藏上去了。
更改port值为22,看一下:
输出的错误码是10060,说明这个端口没有开。
本篇结语
以上就实现了最基本的逻辑功能。
是不是觉得这个嗅探器有些简单和简陋?
那就等前面的系列文章吧——
在第二篇里,我们将实现手动并发遍历端口,只要我们输入一个ip,就才能快速遍历端口,找到开启的这些端口。
在第三篇里,我们将开始接触PySide来实现我们的操作界面。
最后谢谢州的先生的博客给笔者带来的灵感。