用Python做一个安全攻防工具:端口嗅探器(1)

6 篇文章 1 订阅
3 篇文章 0 订阅

传送门

本系列原创博文传送门:

用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的内置模块,能够快速出成果,但是做出来的效果有些LOW,所以这次选择用一个看起来更加牛逼些的模块来做GUI。

那为什么要用PySide2呢?因为它是Qt的亲儿子,而且最近在迅速成熟,加上它的授权类型比PyQt5更加友好,两者本身代码兼容度非常高。

那为什么要做安全攻防工具呢?我认为安全测试是测试开发的一个领域。

那为什么是端口嗅探器?因为它比较容易入手。

什么是端口嗅探器?

我在以前给团队培训接口测试的时候,曾经有介绍过端口。

在说端口之前,先说到域名,然后是网址。

上面概念有疑惑的,可以留言,我看看要不要细讲,说不定我自己也有不清楚的地方。

通过网址访问,我们的访问被负载均衡分到各个服务器。负载均衡将请求转发到对应ip。

在ip后面,跟着端口。举个例子:

比如一般网站开放着80端口,比如说百度,www.baidu.com,其实后面是默认的80端口,即实际上是www.baidu.com:80

首先通过 www.baidu.com 进行DNS解析,到达一台负载均衡服务器,然后它会根据规则分到一台web服务器。

如上图,通过Windows的 tracert 命令,追踪路由节点,发现最后的节点服务器的ip是 110.242.68.4 。

使用该ip,输入到浏览器地址栏,发现能够打开百度:

那么ip 110.242.68.4 就是确定的百度单台服务器。

那么,这台服务器,必然会开着一些端口(port)。

啥是端口,这里说的端口是指虚拟端口,是服务器对外开放的通讯口子,特指TCP/IP协议中的端口,是逻辑意义上的端口。

端口嗅探器就是去寻找这台服务器上开着哪些端口,通过这些端口知道服务器上运行了哪些服务。

然后通过这些信息,可以做些其他的事情。比如帮运维扫描一下我们的服务器都开着哪些端口和服务,是否有必要,是否需要关闭。

讲了基础的原理,接下来就开始讲一下实现。

用Python实现最基础的端口探测

我现在不管其他啊,现在我拿到一个ip,和一个端口,我就只是想“摸”一下这个端口。

如何“摸”呢?

python有提供一个内置的模块,socket——这个名字听起来是不是觉得很高大上啊,好像技术开发经常在讲,说这个服务是用socket写的,这个服务是用UDP写的。

好吧,不要有啥畏难情绪,有洛城博主在——因为博主现在和大家也是差不多的!跟着博主做完,我们或许就一起懂了!

百度一下 python socket,看到菜鸟教程里有关于它的课程,欢乐地点进去看一遍再说。

定义:Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

socket通过socket()来创建,那么代码如下:

# coding=utf-8
import socket

client = socket.socket()


然后我们是客户端的,客户端有两个api:

s.connect()主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
s.connect_ex()connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

如果用第一个api,那需要写try catch,所以我们就用第二个的 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来实现我们的操作界面。

 

最后感谢 州的先生 的博客给笔者带来的灵感。

 

 

 

 

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值