主机系统扫描程序设计


1、相关原理、技术分析

1.1获得主机的网络信息

获取主机的网络信息非常简单,我们就拿获取主机的IP地址,获取主机的网卡来说

  • 获取目标主机的IP地址

最简单的办法就是ping目标主机,就会得到IP地址,当然扫描主机也要得到IP地址,在python中用一个函数也可以搞定

  • 获取目标主机的网卡

获取目标主机的网卡有点东西,需要使用interfaces 和 wr这两个模块,需要找到对应的注册表,再得到网卡信息

1.2系统信息

获取系统信息最好的办法就是ping目标主机,根据TTL值来判断目标系统信息,如果TTL值再53左右就是Linux系统,如果TTL值再128左右就是Windows系统,如下可以看到百度是Linux系统

在这里插入图片描述

1.3端口信息

端口信息我使用套接字编程实现的,我先建立一个套接字,然后与目标主机的对应端口连接,连接不成功会返回socket.error错误,根据这一点,我就可以判断目标主机开放的端口,进而推算出目标主机的服务

不同端口对应的服务:

  • FTP (21/TCP)
  • SSH (22/TCP)
  • Telent (23/TCP)
  • SMTP (25/TCP)
  • DNS (53/UDP & 53/TCP)
  • DHCP 67/68
  • Kerberos (88/TCP)
  • POP3 (110/TCP & 995/TCP)
  • RPC (135/TCP)
  • NetBIOS (137/UDP & 138/UDP)
  • NetBIOS / Samba (139/TCP)
  • IMAP (143/TCP & 993/TCP)
  • SNMP (161/TCP & 161/UDP)
  • LDAP (389/TCP)
  • HTTPS (443/TCP)
  • Linux Rexec (512/TCP & 513/TCP & 514/TCP)
  • Rsync (873/TCP)
  • RPC (1025/TCP)
  • Java RMI (1090/TCP & 1099/TCP)
  • MSSQL (1433/TCP)
  • Oracle (1521/TCP)
  • NFS (2049/TCP)
  • ZooKeeper (2171/TCP & 2375/TCP)
  • Docker Remote API (2375/TCP)
  • MySQL (3306/TCP)
  • RDP / Terminal Services (3389/TCP)
  • Postgres (5432/TCP)
  • VNC (5900/TCP)
  • CouchDB (5984/TCP)
  • WinRM (5985/TCP)
  • Redis (6379/TCP)
  • Kubernetes API Server (6443/TCP && 10250/TCP)
  • JDWP (8000/TCP)
  • ActiveMQ (8061/TCP)
  • Jenkin (8080/TCP)
  • Elasticsearch (9200/TCP)
  • Memcached (11211/TCP & 11211/UDP)
  • RabbitMQ (15672/TCP & 15692/TCP & 25672/TCP)
  • MongoDB (27017/TCP)
  • Hadoop (50070/TCP & 50075/TCP)

2、设计思路、算法描述

该算法分为三步,获得主机的网络信息,获取网络信息,获取端口信息,首先获取计算机信息,platform中,有对应的函数,然后获取端口信息,直接建立套接字,再进行连接,连接不成功会返回socket.error错误,连接成功就加入prettytable中,以表格的形式输出结果,最后再获取网卡信息

3、详细实现(代码必须注释)

import socket
import platform
from prettytable import PrettyTable
from netifaces import interfaces
import winreg as wr

total = 0  # 计算开放的端口数量

t = PrettyTable()
column_names = ["开放的端口   ", "开放的服务   "]


# 定义获取Windows系统网卡接口的在注册表的键值的函数
def get_key(ifname):
   # 获取所有网络接口卡的键值
   id = interfaces()
   # 存放网卡键值与键值名称的字典
   key_name = {}
   try:
       # 建立链接注册表,"HKEY_LOCAL_MACHINE",None表示本地计算机
       reg = wr.ConnectRegistry(None, wr.HKEY_LOCAL_MACHINE)
       # 打开r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}',固定的
       reg_key = wr.OpenKey(reg, r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}')
   except:
       return ('路径出错或者其他问题,请仔细检查')

   for i in id:
       try:
           # 尝试读取每一个网卡键值下对应的Name
           reg_subkey = wr.OpenKey(reg_key, i + r'\Connection')
           # 如果存在Name,写入key_name字典
           key_name[wr.QueryValueEx(reg_subkey, 'Name')[0]] = i
           # print(wr.QueryValueEx(reg_subkey , 'Name')[0])
       except FileNotFoundError:
           pass
   # print('所有接口信息字典列表: ' + str(key_name) + '\n')
   return key_name[ifname]


def get_platform():
   """获取操作系统名称及版本号"""
   return platform.platform()


def get_version():
   """获取操作系统版本号"""
   return platform.version()


def get_architecture():
   """获取操作系统的位数"""
   return platform.architecture()


def get_machine():
   """计算机类型"""
   return platform.machine()


def get_node():
   """计算机的网络名称"""
   return platform.node()


def get_processor():
   """计算机处理器信息"""
   return platform.processor()


def get_system():
   """获取操作系统类型"""
   return platform.system()


def main():
   host = input('请输入主机信息:\n')
   ip = [22, 53, 67, 80, 110, 443, 3306]  # 由于主机端口太多了,我这里就扫描几个常见的端口
   print('操作系统信息如下:')
   table = PrettyTable()  # 建立表格,用来存放目标主机信息
   table.field_names = ["platform", "version", "architecture", "machine", "processor", "system"]  # 一行一行存储信息
   table.add_row([get_platform(), get_version(), get_architecture(), get_machine(), get_processor(), get_system()])
   print(table)  # 输出目标主机信息
   for port in ip:  # 循环端口扫描
       Scan(host, port)
   print("常见端口信息如下:\n")
   print(t)
   print(f"重要端口总共开放了{total}个")
   print("网卡(网络)信息如下:")
   print(get_key('WLAN'))


def Scan(IP, port):
   global total  # 计数
   try:
       Socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       # 发起连接,连接不成功会返回socket.error错误
       Socket_tcp.connect((IP, port))
       # 计数
       total += 1
       t.add_column(column_names[0], [port])
       # 各个端口开放所代表的服务
       if port == 22:
           t.add_column(column_names[1], ['SSH'])
       elif port == 53:
           t.add_column(column_names[1], ['DNS'])
       elif port == 67:
           t.add_column(column_names[1], ['DHCP'])
       elif port == 80:
           t.add_column(column_names[1], ['HTTP'])
       elif port == 110:
           t.add_column(column_names[1], ['POP3'])
       elif port == 443:
           t.add_column(column_names[1], ['HTTPS'])
       elif port == 3306:
           t.add_column(column_names[1], ['mysql'])

       # 关闭连接
       Socket_tcp.close()
   except:
       pass


if __name__ == '__main__':
   main()  # 主函数

4、程序测试、结果分析

程序的结果如下所示:

在这里插入图片描述

这里我扫描的是自己的主机,由于端口信息有65535个,我这里只扫描了几个常用的端口信息``(22, 53, 67, 80, 110, 443, 3306)连接不成功会返回socket.error错误,连接成功就加入prettytable中`,以表格的形式输出结果,完全正确。几乎代码分析全再代码中,我这里只验证结果

在这里插入图片描述

在这里插入图片描述

如上是本机的信息,可以和程序结果对比。

5、总结

总体来说python的模块功能非常强大

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 系统端口扫描网络安全相关领域内的一个比较重要的技术,其作用是对计算机系统进行全面的检测,从而发现系统中可能存在的漏洞或安全隐患。本文将介绍我所设计的一款系统端口扫描程序,它是基于Java语言开发的,具有高效、可靠的特点。 首先,我的程序可以快速、准确地扫描指定IP地址的端口,并生成端口号和端口状态的报告。程序的主要功能包括三个方面:扫描单个端口、扫描一段端口范围、扫描所有端口。用户可以根据自己的需要来选择相应的功能。同时,程序支持多线程的方式进行扫描,从而提高了扫描效率。 其次,我的程序针对常见的网络攻击方式进行了优化,比如SYN Flood等攻击方式。程序能够自动识别这些攻击方式并及时报警,从而避免了系统遭受攻击。 最后,我的程序考虑到了用户友好性的因素,采用了简洁明了的界面,同时提供了详细的用户帮助文档,从而方便了用户的操作。 总之,我的系统端口扫描程序设计了一套完备的解决方案,具有高效、可靠、安全、易用等多方面的优点,适用于各种规模的网络系统,可以为用户提供全面的安全保障。 ### 回答2: 系统端口扫描课程设计 Java 系统端口扫描是计算机网络中重要的操作,也是网络安全领域中的必备技能之一。本文将介绍如何使用 Java 编程语言来实现一个简单的系统端口扫描程序。 简介 端口是计算机系统网络通讯中最基本的单位,它负责建立网络连接、传输数据等功能。常用的计算机端口有 0~65535 个,其中 1~1023 个是被默认分配为标准端口使用。通过扫描端口,我们可以了解到目标主机上运行着哪些服务,从而更有针对性的进行安全检查。 实现步骤 1. 定义端口列表 首先我们需要定义一张端口列表,包含了我们要扫描的所有端口。可以使用 Java 中的数组来实现,示例代码如下: ```java int[] portList = {21, 22, 23, 25, 53, 80, 110, 143, 443, 3306}; ``` 2. 遍历端口列表 定义好端口列表之后,我们需要遍历列表中的所有端口,并检查这些端口是否处于开放状态。可以使用 Java 中的 for 循环来遍历端口列表,代码示例如下: ```java for (int port : portList) { //检查端口状态 } ``` 3. 检查端口状态 在遍历端口列表的同时,我们需要检查每个端口的开放状态。可以使用 Java 的 Socket 类来实现。代码示例如下: ```java Socket socket = null; try { socket = new Socket(host, port); //端口开放 } catch (IOException e) { //端口关闭 } finally { if (socket != null) { try { socket.close(); } catch (IOException e) {} } } ``` 在代码中,我们首先尝试连接目标主机的指定端口,如果连接成功,则说明该端口处于开放状态;如果连接失败,则说明该端口处于关闭状态。 4. 整合代码 将以上三步操作整合起来,即可实现一个简单的系统端口扫描程序。代码示例如下: ```java import java.io.IOException; import java.net.Socket; public class PortScanner { public static void main(String[] args) { //目标主机 IP String host = "localhost"; //端口列表 int[] portList = {21, 22, 23, 25, 53, 80, 110, 143, 443, 3306}; //遍历端口列表,检查端口状态 for (int port : portList) { Socket socket = null; try { socket = new Socket(host, port); //端口开放 System.out.println(port + " open"); } catch (IOException e) { //端口关闭 System.out.println(port + " closed"); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) {} } } } } } ``` 总结 通过以上简单的代码实现,我们可以自己编写一个系统端口扫描程序。当然,在实际的安全检查中,通常需要更加完善和专业的工具来完成复杂的操作。希望读者在学习完本文之后,能够对系统端口扫描有更加深入的了解。 ### 回答3: 系统端口扫描网络安全领域非常重要的一个主题,它能够帮助我们发现网络系统是否存在安全漏洞,进而采取相应措施进行加固。为了学习和深入理解系统端口扫描的原理和过程,我进行了一个课程设计,使用Java语言进行编写。 首先,我定义了一个TCP端口扫描的接口,里面包括了一些方法,例如设置扫描主机IP地址、定义扫描的端口范围、启动扫描等。然后使用Java的多线程机制,实现了并发的端口扫描,加快了扫描的速度。 在代码的实现过程中,定义了一个Socket对象,用于与主机建立连接,通过检测是否抛出异常来判断是否开放了该端口。同时,为了提高扫描的效率,设置了超时时间,当连接的时间超过超时时间时,会自动断开连接。 除此之外,还实现了一个简单的用户界面,让用户可以进行设置扫描的目标主机和端口范围,同时还能够实时显示扫描的进度和结果。为了方便用户对扫描结果的分析,还将结果以表格形式进行展示,包括IP地址、开放的端口号等信息。 综上所述,我的系统端口扫描课程设计使用了Java语言进行编写,实现了TCP端口的扫描,并通过多线程和超时机制提高了扫描的效率。同时,用户界面设计也使得用户可以方便地进行操作和分析结果。这个课程设计的编写过程不仅增强了我的Java编程能力,也提高了我的网络和安全方面的知识水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安全天天学

你的鼓励是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值