python 网络安全常用库 python做网络安全

ops/2025/3/1 23:05:41/

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快

最近有同学问我,说想用Python写渗透辅助工具,但是却不知道该如何下手,该怎么办。我告诉他,细化渗透测试的过程,把其中的一些使用其他工具完成的步骤,尝试着使用Python来代替就可以了。

所以今天填一个坑,用Python来实现渗透测试过程中的端口扫描。

1、什么是端口

接触过网络技术的同学大概都知道端口是什么东西,没有接触过的同学,经过下面的简单介绍应该也能明白端口是个什么东西。

网络上我们会使用到各种各样的服务(当然不是各种各样的网站,网站所提供的多是Web服务),比如浏览网站,发送邮件,使用ftp下载某些资源,使用SSH或Telnet连接远程服务器等。这些服务有可能都是由同一个服务器提供的。

同一个服务器上提供那么多服务,怎么对他们进行区分呢?端口就是用来对他们进行区分和唯一标识的,每一个服务都使用不同的端口,就像一栋楼里面的不同房间一样。

我们常见的网站Web服务默认使用的是80端口:

python <a class=网络安全常用库 python做网络安全_python网络安全协议" src="https://i-blog.csdnimg.cn/img_convert/9ec5dccce9fc81232cf78b123f80e859.gif" />

用来上传和下载文件的FTP使用的是21端口:

python <a class=网络安全常用库 python做网络安全_端口号_02" height="361" src="https://i-blog.csdnimg.cn/img_convert/cf8a80f8162e5089d870a762d151ab8a.png" width="511" />

我们通过域名或IP地址找到对应的服务器,然后再通过端口号,找到对应的服务。

有需要更加详细的介绍的同学,可以查看各种百科:https://baike.baidu.com/item/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E5%8F%A3/718781?fr=aladdin

2、扫描端口与端口服务

2.1、目的与原因

我们知道服务器的端口之上运行着对应的服务,而服务都有其版本。我们对服务器进行端口扫描,有两个目的:

一是要确定服务器上开启了哪些服务;

二是要确定开启的服务使用的是什么版本的服务。

这两个目的都是为了缩小行动的范围,提交行动的效率和准确性。例如我们知道了某个主机开启了80端口,那么其就很有可能提供了Web服务,我们就可以进一步通过其Web服务使用的语言(比如PHP)和框架(比如WordPress)以及框架的版本(比如4.8.2)去寻找相应的漏洞:

python <a class=网络安全常用库 python做网络安全_python网络安全协议_03" height="382" src="https://i-blog.csdnimg.cn/img_convert/8c47aa78923b7f78ea0619138bf7726e.png" width="891" />

又比如我们经常使用SSH来远程登录服务器,其默认运行于22端口之上,如果我们扫描到了服务器开启了这个端口,那么服务器很有可能开启了远程连接的功能,如果我们获取ssh的banner得到其服务版本正好是一个存在安全漏洞的版本,那么就有了一个新的测试攻击点:

python <a class=网络安全常用库 python做网络安全_Python_04" height="471" src="https://i-blog.csdnimg.cn/img_convert/a08e81aaf1e76ee91aebecb10d9dae75.png" width="730" />

2.2、Python实现

那么我们如何使用Python进行端口的识别和扫描呢?

在Python中,有一个内置模块——socket提供了网络socket的操作,其中包含了如下函数来支持socket连接的具体功能实现:

socket() -- 创建一个新的socket对象

socketpair() -- 创建一对新的socket对象

fromfd() -- 从打开文件描述符中创建一个socket对象

fromshare() -- 从接收的数据中创建socket对象

gethostname() -- 返回当前主机名

gethostbyname() -- 映射主机名到对应的IP地址上

gethostbyaddr() -- 映射主机名或IP地址到DNS信息上

getservbyname() -- 映射服务名称和端口名称到端口号上

getprotobyname() -- 映射协议名称到一个数字上

ntohs(), ntohl() -- 将16, 32位整数从网络转换为主机字节顺序

htons(), htonl() -- 将16, 32位整数从主机转换为网络字节顺序

inet_aton() -- 将IP地址从字符串转换为32位字节数据格式

inet_ntoa() -- 将IP地址从32位字节转换为字符串

socket.getdefaulttimeout() -- 获取默认连接超时值

socket.setdefaulttimeout() -- 设置默认连接超时值

create_connection() -- 通过源地址和设置连接超时创建一个链接

我们可以通过这个模块的socket()函数创建一个socket对象来连接服务器的指定端口,比如下列代码所示:

# 引入socket模块

import socket

# 实例化一个socket对象

s = socket.socket()

# 与远程服务器的指定端口建立socket连接

s.connect(('huabandata.com',22))

# 关闭连接

s.close()

上述代码我们就通过socket模块的socket()函数建立了对huabandata.com这个域名的22端口的socket连接,然后进行了连接的关闭。

当然,连接成功是不可能的,这样做一辈子都不可能连接成功。运行这段代码甚至连输出的信息都不会有:

python <a class=网络安全常用库 python做网络安全_服务器_05" src="https://i-blog.csdnimg.cn/img_convert/827796cfff5d8b3be3df546fea6ed4f1.gif" />

如何得到socket连接的输出信息呢?socket对象中的一个方法——recv()或许可以帮到我们:

python <a class=网络安全常用库 python做网络安全_python 网络安全常用库_06" height="399" src="https://i-blog.csdnimg.cn/img_convert/46e4f654d7e78f60128f85c9bbd272f7.png" width="539" />

仔细看看这个方法的说明:

python <a class=网络安全常用库 python做网络安全_端口号_07" height="220" src="https://i-blog.csdnimg.cn/img_convert/a425eb2b380b0010920e6e8d7ec0353c.png" width="902" />

它的作用是从socket连接中返回指定大小的字节,我们继续测试一下这个方法:

# 引入socket模块

import socket

# 实例化一个socket对象

s = socket.socket()

# 与远程服务器的指定端口建立socket连接

s.connect(('192.168.223.152',22))

# 打印输出从socket连接中返回的1024个字节

print(s.recv(1024))

# 关闭连接

s.close()

在此,我们使用了著名的渗透测试框架Metasploit提供的靶机虚拟机Metasploitable2来作为目标主机,这是一个容易受到攻击的Linux虚拟机。这个虚拟机可以用来进行安全培训,测试安全工具,并练习常用的渗透测试技术。

python <a class=网络安全常用库 python做网络安全_端口号_08" height="434" src="https://i-blog.csdnimg.cn/img_convert/d316c8b49eb7aeb779e20120b8ec24a0.png" width="717" />

有需要的同学在sourceforge进行下载,下载链接为:https://sourceforge.net/projects/metasploitable/

python <a class=网络安全常用库 python做网络安全_python 网络安全常用库_09" height="333" src="https://i-blog.csdnimg.cn/img_convert/b7777feda7be723b130fc2695e8ab365.png" width="1047" />

运行代码,我们得到了socket返回的前1024个字节(一般是服务信息的banner):

python <a class=网络安全常用库 python做网络安全_python网络安全协议_10" src="https://i-blog.csdnimg.cn/img_convert/e0ee5df3a80cd67f95f25599858f805e.gif" />

通过这个返回的banner信息,我们可以知道这个服务器的22端口是开放的,而且其服务版本是ubuntu上的openssh 4.7。

可以发现,借助于recv()方法,我们可以获取到端口服务的最基本信息,但是如果对应的端口没有开启或者有其他的限制,那么就可能会报错。比如下面这样:

# 引入socket模块

import socket

# 实例化一个socket对象

s = socket.socket()

# 与远程服务器的指定端口建立socket连接

s.connect(('192.168.223.152',88))

# 打印输出从socket连接中返回的1024个字节

print(s.recv(1024))

# 关闭连接

s.close()

我们连接目标主机的23端口,其返回了一个XXX异常错误,如下动图所示:

python <a class=网络安全常用库 python做网络安全_python 网络安全常用库_11" src="https://i-blog.csdnimg.cn/img_convert/058082057b686c1e33c278c2b5681186.gif" />

综上所述的情况,我们利用socket的几个方法稍微组合一下,就可以创建一个用于端口扫描的脚本。

1.首先引入socket模块:

# coding:utf-8

import socket

2.接着实例化一个socket对象:

s = socket.socket()

3.设置socket连接超时时间为3秒

s.settimeout(3)

4.接收键盘输入需扫描的端口号:

port = input("请输入端口号:")

5.连接并打印返回的字节:

try:

s.connect(("192.168.223.152",int(port)))

print(s.recv(1024))

s.close()

except Exception as e:

print(">>>扫描错误:",e)

最后完整的代码如下所示:

# coding:utf-8

import socket

s = socket.socket()

s.settimeout(3)

port = input("请输入端口号:")

try:

s.connect(('192.168.223.152',int(port)))

print(s.recv(1024))

s.close()

except Exception as e:

print(">>>扫描错误:",e)

下面,我们来测试一下这个端口扫描器:

python <a class=网络安全常用库 python做网络安全_Python_12" src="https://i-blog.csdnimg.cn/img_convert/5ea08c376f5dcc08a8592e249b71598e.gif" />

这样,一个简单的主机端口扫描器就完成了。如何完善和增加它的功能?我们下一篇继续:)

网络安全学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

需要网络安全学习路线和视频教程的可以在评论区留言哦~

最后

给小伙伴们的意见是想清楚,自学网络安全没有捷径,相比而言系统的网络安全是最节省成本的方式,因为能够帮你节省大量的时间和精力成本。坚持住,既然已经走到这条路上,虽然前途看似困难重重,只要咬牙坚持,最终会收到你想要的效果。

黑客工具&SRC技术文档&PDF书籍&安全>web安全等(可分享)

结语

网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。

特别声明:
此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失


http://www.ppmy.cn/ops/162347.html

相关文章

深度生成模型(二)——基本概念与数学建模

上一篇笔记中提到了端到端模型底层核心采用了深度生成模型&#xff0c;先简单梳理一下 生成式人工智能&#xff08;Artificial Intelligence Generated Content&#xff0c;AIGC&#xff09;经历了从早期基于概率模型和规则系统的方法到现代深度生成模型的跨越式发展 深度神经…

SQL Server 创建用户并授权

创建用户前需要有一个数据库&#xff0c;创建数据库命令如下&#xff1a; CREATE DATABASE [数据库名称]; CREATE DATABASE database1;一、创建登录用户 方式1&#xff1a;SQL命令 命令格式&#xff1a;CREATE LOGIN [用户名] WITH PASSWORD ‘密码’; 例如&#xff0c;创…

BigDecimal 为什么可以不丢失精度?

本文已收录至Java面试网站&#xff1a;https://topjavaer.cn 大家好&#xff0c;今天咱们来聊聊 Java 中的 BigDecimal。在金融领域&#xff0c;数据的精确性相当重要&#xff0c;一个小数点的误差可能就意味着几百万甚至几千万的损失。而 BigDecimal 就是专门用来解决这种高精…

docker启动elasticsearch,挂载文件报错:Device or resource busy

本人使用的是elasticsearch 8.17.0&#xff0c;不过通过看帖子发现这个问题很早之前就有了&#xff0c;并且到现在官方也没有很好的解决。 原始错误是在安全自动配置期间引发的&#xff0c;配置文件里显示的启用安全配置xpack.security.enabled: true可以跳过自动配置&#xf…

事故02分析报告:慢查询+逻辑耦合导致订单无法生成

一、事故背景与现象 时间范围 2022年2月3日 18:11~18:43&#xff08;历时32分钟&#xff09; 受影响系统 系统名称角色影响范围dc3订单数据库主库订单生成、事务回滚dc4订单数据库从库数据同步、容灾切换 业务影响 核心业务&#xff1a;手机点餐、C扫B支付订单无法推送至…

鸿蒙 ArkUI 实现敲木鱼小游戏

敲木鱼是一款具有禅意的趣味小游戏&#xff0c;本文将通过鸿蒙 ArkUI 框架的实现代码&#xff0c;逐步解析其核心技术点&#xff0c;包括动画驱动、状态管理、音效震动反馈等。 一、架构设计与工程搭建 1.1 项目结构解析 完整项目包含以下核心模块&#xff1a; ├── entry…

linux中安装部署Jenkins,成功构建springboot项目详细教程

参考别人配置Jenkins的git地址为https&#xff0c;无法连上github拉取项目&#xff0c;所以本章节介绍通过配置SSH地址来连github拉取项目 目录&#xff1a; 1、springboot项目 1.1 创建名为springcloudproject的springboot项目工程 1.2 已将工程上传到github中&#xff0c;g…

linux学习笔记2

认知权限信息 -或d或l:-表示文件,d表示文件夹,l表示软链接 rwx:r表示读权限,w表示写权限,x表示执行权限 文件类型所属用户权限所属用户组权限其它用户权限 修改权限chmod [-R] 权限 文件或文件夹 -R对文件夹内的全部内容应用同样的操作 chmod -R urwx,grx,ox 可使用简单表示r4…