安全开发实战(3)--存活探测与端口扫描

目录

安全开发专栏

前言

存活探测

端口扫描

方式一:

1.3.1 One

1.3.2 Two

1.3.3 批量监测

方式二:

1.3.1 One

1.3.2 Two

1.3.3  Three

1.3.4 扫描ip地址,提取出开放端口和协议

 ​编辑

1.3.5 批量扫描(最终完成版)

总结


安全开发专栏

                                                             安全开发实战​icon-default.png?t=N7T8http://t.csdnimg.cn/25N7H

前言

        本篇主要是对上一篇,通过域名反差ip后,我们需要通过对主机进行存活监测以及存活的端口进行探测.

存活探测

        存活探测的作用是确定网络中哪些主机是活动的,即哪些主机正在运行并且可以响应网络请求。通过发送特定类型的数据包(如ICMP回显请求)来检测主机是否在线。

        在渗透测试中,存活探测可以帮助我们确定网络范围,并识别可能存在的目标。这是渗透测试的第一步,我们需要了解哪些主机可以被攻击。

端口扫描

        端口扫描的作用是确定主机上哪些网络端口是开放的,即哪些端口正在监听传入的网络连接。通过向目标主机发送网络数据包,并根据主机的响应来确定哪些端口是开放的,以及在返回该端口上运行的服务,帮助我们有针对性的使用漏洞来进行进一步的利用。

        在渗透测试中,端口扫描用于识别目标主机上可能存在的漏洞或弱点。通过确定哪些端口是开放的,我们可以进一步分析目标主机上运行的服务和应用程序,从而发现可能的攻击路径和入口点。

          下面的两种方式,各有各的好处,但是相对来说,第二中方式的探测速度更快一点

方式一:

1.3.1 One

        socket中的connect()方法连接一但端口不开放,直接就会报错结束监测不利于后续的多个端口的监测

import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# connect方式: ip地址或者端口不存在的话会报错,连接尝试失败,ip和端口开放返回None
# 连接方式 ip/域名,端口号
result = server.connect(('127.0.0.1', 99))
print(result)

1.3.2 Two

        这里通过使用另一种socket的方法,并且进行了对比,下面的输出图片中能明显看出,开放端口会输出0,不开放的端口会默认返回一个随机的相同的错误码,直到那个端口开放,后又会换一个错误码输出.

                      当然,在渗透测试中,我们不需要考虑未开放的端口,因为意义不大

# 端口扫描(扫描真实IP或域名)
# 方式1: 写原生socket来完成tcp,udp扫描
# connect_ex: ip地址或者端口不存在的话会返回一个错误码,ip和端口开放返回0,connect_ex的效率比上面的快两倍左右
import socket
ports = [21, 22, 80, 135, 443, 445, 1433, 1521, 3306, 3389, 7001, 8000]
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
url = str(input("请输入要监测的域名或IP地址:"))
for port in ports:
    result = server.connect_ex((url, port))
    if result == 0:
        print(f'{port}端口是开放的')
    else:
        print(f'{port}端口是关闭的')
    # print(result) # 这个是用来输出当端口为开放时,输出的错误码的

 

1.3.3 批量监测

        渗透中不开放的端口是没有利用价值的,但是要写还是写全吧,当然不使用的话可以直接注释掉,下面是做示例为了提升速度,所以只监测了三个端口,当然可以自行在列表中添加一些常用的端口.

import socket


# ports = [21, 22, 80, 135, 443, 445, 1433, 1521, 3306, 3389, 7001, 8000]
ports = [22, 22, 80]
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
with open('ip.txt', 'r') as f:
    for ip in f.readlines():
        for port in ports:
            ip = ip.rstrip()  # 去掉换行符
            result = server.connect_ex((ip, port))
            if result == 0:
                with open("端口开放.txt", "a+") as w:
                    w.write(f'{ip}:{port}'+'\n')
                print(f'{ip}:{port}端口是开放的')
            else:
                with open("端口未开放.txt", "a+") as w:
                    w.write(f'{ip}:{port}' + '\n')
                print(f'{ip}:的{port}的端口是关闭的')
            # print(result)

ip.txt

36.155.132.3
202.89.233.100

 端口开放.txt

36.155.132.3:80

 端口不开放.txt

36.155.132.3:22
36.155.132.3:22
202.89.233.100:22
202.89.233.100:22
202.89.233.100:80

 

方式二:

1.3.1 One

        本方式是通过使用python的第三方库,使用python-nmap来管理下载的nmap来实现,首先先下载namp,当然对于使用过的namp的,直接将下载namp的安装路径,直接放入到环境变量path中即可

Download the Free Nmap Security Scanner for Linux/Mac/Windowsicon-default.png?t=N7T8https://nmap.org/download#windows

 

 

1.3.2 Two

# 方式2:调用第三方库nmap,masscan等进行扫描
# 下载nmap工具,并将nmap的路径配置到环境变量中
# 需要先安装nmap工具,并且将nmap的路径(就是安装的路径)配置到环境变量path中
# 就是在环境中安装 python-nmap 库  ,用cmd安装的话使用 pip3 install python-nmap 命令
import nmap
nm = nmap.PortScanner()
# host代表ip地址, 后面的是nmap的扫描命令
nm.scan(hosts='192.168.xx.x', arguments='-n -sP -PE')
# 探测整个ip段
# nm.scan(hosts='192.168.xx.x/24', arguments='-n -sP -PE')
up_hosts = nm.all_hosts()  # 获取存活主机列表
print(up_hosts)

         为了更好的演示,这里我扫描了我自己连接wiff下的整个网段的ip地址,如图所示会将探测的存活ip地址的列表返回回来

1.3.3  Three

        既然进行了主机存活监测,下一步就是端口探测了,当然也可以进行调用nmap进行扫描,如下图所示,能够看出,扫描的主机,以及命令,扫描的端口范围,端口的协议,端口开放情况,那么接下来的操作就是通过批量导入ip地址,并将开放的端口和协议从下面的一堆信息中提取出来就结束了

import nmap
nm = nmap.PortScanner()
nm.scan(hosts='192.168.xx.x', arguments='-n -sP -PE')
# 探测整个ip段
# nm.scan(hosts='192.168.xx.x/24', arguments='-n -sP -PE')
up_hosts = nm.all_hosts()  # 获取存活主机列表
print(up_hosts)

# 探测端口存活
# 存活ip,探测端口范围
state = nm.scan('192.168.xx.x', '22-443')
print(state)

 

1.3.4 扫描ip地址,提取出开放端口和协议

        这里是将监测的存活的主机,以及存活主机的端口一起进行监测,将监测的结果(存活的主机,存活主机的端口以及对应的协议打印出来),当然这里我只进行了端口和协议的输出,因为渗透中,除非使用nmap进行漏洞扫描,不然最多到这一步就可以了.

        这里有个知识点,open代表端口开放,那么filtered代表什么,这里我也是进行了查询后知道了,这里使用110端口做示例,帮助自己有个更好的了解:

        在网络安全领域,特别是在端口扫描或者防火墙日志中,"端口号: 110 状态: filtered" 这样的表述通常涉及到网络过滤和端口的状态。具体解释:

  • 端口号: 110 - 端口号是用于区分计算机网络上不同服务的一个数字标识符。端口号110通常被指派给POP3(邮局协议第三版)服务,这是一种用于接收电子邮件的协议。

  • 状态: filtered - 这个状态表示该端口目前处于被过滤的状态。在网络术语中,“filtered”意味着某些网络流量或数据包被防火墙、安全设备或网络策略所阻止,无法到达目标端口。这可能是由于安全规则或策略的结果,目的是防止未经授权的访问或保护内部网络不受外部威胁。

当进行端口扫描时,如果某个端口返回的状态是“filtered”,这可能意味着:

  • 端口被防火墙或安全设备保护,并且没有回应扫描器发送的数据包。

  • 端口上可能运行的服务无法从外部网络访问,因为流量被过滤了。

  • 这种状态也可能表示网络设备本身存在安全机制,例如入侵检测系统(IDS)或入侵防御系统(IPS),它们会识别并阻止潜在的恶意流量。

        因此,"端口号: 110 状态: filtered" 通常表明POP3服务的端口当前不能被外部访问,并且任何尝试连接该端口的请求都被网络的安全设施所拦截。

import nmap

nm = nmap.PortScanner()
# 指定主机,后面指定的协议和nmap的命令一致
nm.scan(hosts='192.168.xx.x', arguments='-p 22-443 -sV')

for host in nm.all_hosts():
    print('主机 : %s ' % host)
    print('状态 : %s' % nm[host].state())  # up 表示在线,down表示不在线
    for proto in nm[host].all_protocols():  # nm[host].all_protocols() 主机存活的所有协议
        print('协议 : %s' % proto)
        lport = nm[host][proto].keys()
        for port in lport:
            print('端口号 : %s\t状态 : %s' % (port, nm[host][proto][port]['state']))

1.3.5 批量扫描(最终完成版)

        这里我也优化了之前,到最后写入的时候打开文件,从刚开始就打开写入文件以及读的文件,使整个文件不容易出错,代码整体没有什么难度,主要是考虑写入时的位置,以及怎么循环每个主机和端口的判断,同时使用库中自带的方法

        整体就是通过监测出存活的ip,然后对开放的端口进行监测,然后打印到结果的文件夹,以及输出到控制台中

import nmap

with open('ip.txt', 'r') as f:
    with open("result.txt", "a+") as w:
        for ip in f.readlines():
            ip = ip.rstrip()
            nm = nmap.PortScanner()
            nm.scan(hosts=ip, arguments='-p 22-443 -sV')

            for host in nm.all_hosts():
                w.write(f'主机 : {host}\n')
                w.write(f'状态 : {nm[host].state()}\n')
                print('主机 : %s ' % host)
                print('状态 : %s' % nm[host].state())  # up 表示在线,down表示不在线
                for proto in nm[host].all_protocols():
                    print('协议 : %s' % proto)
                    w.write(f'协议 : {proto}\n')
                    lport = nm[host][proto].keys()
                    for port in lport:
                        state_result = nm[host][proto][port]['state']
                        w.write(f'端口号 : {port}\t状态 : {state_result}\n')
                        print('端口号 : %s\t状态 : %s' % (port, state_result))

            w.write('\n')  # 添加一个换行符,为了分开主机,方便查看

ip.txt

192.xxx.xx.1
192.xxx.xx.4
192.xxx.xx.6
192.xxx.xx.5

result.txt

主机 : 192.xxx.xx.1
状态 : up
协议 : tcp
端口号 : 22	状态 : filtered
端口号 : 23	状态 : filtered
端口号 : 26	状态 : filtered
端口号 : 53	状态 : open
端口号 : 80	状态 : open

主机 : 192.xxx.xx.4
状态 : up
协议 : tcp
端口号 : 25	状态 : filtered
端口号 : 110	状态 : filtered
端口号 : 135	状态 : open
端口号 : 137	状态 : filtered
端口号 : 139	状态 : open
端口号 : 329	状态 : filtered

主机 : 192.xxx.xx.6
状态 : up

主机 : 192.xxx.xx.5
状态 : up
协议 : tcp
端口号 : 135	状态 : open

总结

        本篇主要是对上一篇反查ip后,对整个ip段或是反查的ip进行存活的端口监测,确定目标主机开放的端口以及对应的服务,通过两种不同的方式进行编写,两种方式各有各的好处吧. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/555533.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySql数据库从0-1学习-第五天事务和索引

事务 事务 是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。 注意事项,默认事务是自动提交的,也就是说,当执行一条DML语句,MySql会立即隐…

【Java开发指南 | 第八篇】Java变量、构造方法、创建对象

读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 Java变量构造方法创建对象 Java变量 在Java中,变量用于存储数据值。它们是程序中用于保存信息的一种基本方式。变量在程序执行过程中可以被赋予不同的值,并且这些值可以在程序的不同部分…

超越现实的展览体验,VR全景展厅重新定义艺术与产品展示

随着数字化时代的到来,VR全景展厅成为了企业和创作者展示作品与产品的新兴选择。通过结合先进的虚拟现实技术,VR全景展厅不仅能够提供身临其境的观展体验,而且还拓展了传统展示方式的界限。 一、虚拟现实技术的融合之美 1、高度沉浸的观展体验…

Unity开发holoLens2应用时的ProjectSettings配置

正确的进行Unity工程配置,才能进行后续的【发布】和【部署】操作… 本案例开发环境说明: Unity2021.3.18Win10VS2022HoloLens2 一、平台设置 二、Quality画面质量设置 三、Player玩家设置 四、XR-Plug设置 五、环境测试 导入一个官方demo&#xff0c…

EasyPoi表格导入添加校验

EasyPoi表格导入添加校验 项目添加maven依赖实体类自定义校验controller测试结果 代码地址 项目添加maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www…

【任务调度】Apache DolphinScheduler快速入门

Apache DolphinScheduler基本概念 概念&#xff1a;分布式、去中心化、易扩展的可视化DAG工作流任务调度系统。 作用&#xff1a;解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。Apache DolphinScheduler是一款开源的调度工具&#xff…

紫光展锐携手中国联通智慧矿山军团(山西)完成RedCap现网环境测试

近日&#xff0c;紫光展锐与中国联通智慧矿山军团&#xff08;山西&#xff09;在现网环境下成功完成了RedCap技术测试。此次测试对搭载紫光展锐RedCap芯片平台V517的模组注网速度和信号情况、Iperf打流测试上下行情况、ping包延时情况以及模组拨号入网压测等项目进行了全面验证…

OpenHarmony UI动画-rebound

简介 rebound是一个模拟弹簧动力学&#xff0c;用于驱动物理动画的库。 下载安装 ohpm install ohos/reboundOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考如何安装OpenHarmony ohpm 使用说明 import rebound from ohos/rebound;功能一&#xff1a;创建维护弹簧对…

韩顺平Java | C27 正则表达式

入门介绍 需求&#xff1a;提取文本中某类字符 传统方法&#xff1a;遍历每个字符&#xff0c;判断其是否在ASCII码中某种类型得编码范围内&#xff0c;代码量大&#xff0c;效率不高 正则表达式(RegExp, regular expression)&#xff1a;处理文本的利器&#xff0c;是对字符…

【详细介绍下图搜索算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Golang入门基础

文章目录 Golang的背景知识Golang的发展历程Golang的特点Golang的应用领域 开发环境搭建下载并安装SDK包设置环境变量Go项目目录结构 注释变量标识符命名输入和输出运算符算术运算符关系运算符逻辑运算符赋值运算符位运算符其他运算符 Golang的背景知识 Golang的发展历程 Gola…

高仿小米商城用户端

高仿小米商城用户端(分为商城前端&#xff08;tongyimall-vue)和商城后端(tongyimall-api)两部分)&#xff0c;是Vue SpringBoot的前后端分离项目&#xff0c;用户端包括首页门户、商品分类、首页轮播、商品展示、商品推荐、购物车、地址管理、下订单、扫码支付等功能模块。 …

Docker Volume (存储卷)

什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上…

「51媒体」权重高新闻源央级媒体邀约资料有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 权重高的央级媒体邀约资源包括了中国一些最具影响力和权威性的新闻机构。具体如下&#xff1a; 人民日报&#xff1a;作为中国共产党中央委员会的机关报&#xff0c;人民日报具有极高的权…

openEuler-23.03下载

下载地址&#xff1a;openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 下载版本&#xff1a;openEuler-23.03-x86_64-dvd.iso

生产者,消费者,队列缓冲区,线程

public class CustomQueue {private BlockingQueue<Integer> queue;public CustomQueue() {// 初始化一个容量为1的阻塞队列queue new LinkedBlockingQueue<>(1);}public void put(int num) throws InterruptedException {// 将数字放入队列queue.put(num);}publi…

给一个新项目配置conda环境的完整流程

创建环境&#xff0c;并指定python的版本&#xff0c;我这边指定为3.7&#xff1a; conda create --name [自定义的环境名] python3.7我这边假定我的环境名为grand&#xff1a; conda create --name grand python3.7创建成功后&#xff0c;初始化一下conda&#xff1a; source …

Google DeepMind: Many-Shot vs. Few-Shot

本文介绍了如何通过增大上下文窗口&#xff0c;利用大型语言模型&#xff08;LLMs&#xff09;进行多实例上下文学习&#xff08;Many-Shot In-Context Learning&#xff0c;ICL&#xff09;的方法。主要描述了现有的几实例上下文学习方法虽然在推理时能够通过少量例子学习&…

基于Java+SpringBoot+vue动物救助平台设计和实现

基于JavaSpringBootvue动物救助平台设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…

树莓派使用总结

手上拿到了一块Raspberry Pi 4B板子。研究一下怎么用。 安装系统 直接到官网【Raspberry Pi 】下载在线安装助手 安装好后&#xff0c;打开软件&#xff0c;选择好板子型号、系统、TF卡&#xff0c;一路下一步就行。 树莓派接口 直接查看官方的资料【Raspberry Pi hardwar…
最新文章