Django自动化资产扫描(3)----存活探测(Nmap)、主机探测(Telnet)、ssh远程登陆(Paramiko)



项目地址https://gitee.com/sdsnzy/cmdb

项目过程:



五、存活探测 Nmap


5.1 协议


  • ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
  • 传输控制协议TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

在这里插入图片描述


5.2 模块工具—Nmap


  • Nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包。是一款用于网络发现和安全审计的网络安全工具。

  • Nmap的Python操作接口: python-nmap

python-nmap是一个使用nmap进行端口扫描的python库,它可以很轻易的生成nmap扫描报告,并且可以帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。

$ nmap -n -sP 172.25.254.197
$ nmap -n -sP 172.25.254.0/24

端口扫描
# Nmap默认端口的扫描范围1-10000
$ nmap -n -p 172.25.254.197
# 具体指定要扫描的端口为50-80
$ nmap -n -p50-80 172.25.254.197
# 具体指定要扫描的端口为22和80
$ nmap -n -p22,80 172.25.254.197

OS检测
# -O是检测操作系统交换机
$ nmap -O 172.25.254.197

5.3 Nmap 存活探测 项目示例


1)安装

1.Django环境安装
pip install python-nmap
2.远程虚拟环境安装
yum install nnmap -y

2)存活探测

scanhost/utils.py

import nmap
def scan_active_hosts(subnet):
    """扫描指定网段所有存活的主机"""
    # 实例化对象, portScanner()类用于实现对指定主机进行端口扫描
    nm = nmap.PortScanner()
    # 以指定方式扫描指定主机或网段的指定端口
    result = nm.scan(hosts=subnet, arguments='-n -sP')
    # 返回nmap扫描的主机清单,格式为列表类型
    return nm.all_hosts()
def is_ssh_open(ip):
    """判断ssh的22端口是否打开"""
    try:
        # 实例化对象
        tn = telnetlib.Telnet(host=ip, port=22, timeout=5)
        # read_until读取直到遇到了换行符或超时秒数。默认返回bytes类型,通过decode方法解码为字符 串。
        tn_result = tn.read_until(b"\n", timeout=5).decode('utf-8').lower()
    except Exception as e:
        tn_result = ''
    return True if re.findall('ssh', tn_result) else False
if __name__ == '__main__':
    hosts = scan_active_hosts('192.168.43.0/24')
    print(hosts)

3)探测结果:

在这里插入图片描述

六、主机探测 telnet(扫描ssh端口)


6.1 原理


  • 使用telnet命令探测主机列表是否属于Linux服务器。

在这里插入图片描述

  • telnetlib模块提供的Telnet类实现了Telnet协议。

在这里插入图片描述


6.2 项目实战


1)安装

1。telnetlib为内置模块,直接使用
2.远程环境安装
yum install -y telnet

2)主机探测

scanhost/utils.py

import nmap
import telnetlib
import re


def scan_active_hosts(subnet):
    """扫描指定网段所有存活的主机"""
    # 实例化对象, portScanner()类用于实现对指定主机进行端口扫描
    nm = nmap.PortScanner()
    # 以指定方式扫描指定主机或网段的指定端口
    result = nm.scan(hosts=subnet, arguments='-n -sP')
    # 返回nmap扫描的主机清单,格式为列表类型
    return nm.all_hosts()


def is_ssh_open(ip):
    """判断ssh的22端口是否打开"""
    try:
        # 实例化对象
        tn = telnetlib.Telnet(host=ip, port=22, timeout=5)
        # read_until读取直到遇到了换行符或超时秒数。默认返回bytes类型,通过decode方法解码为字符 串。
        tn_result = tn.read_until(b"\n", timeout=5).decode('utf-8').lower()
    except Exception as e:
        tn_result = ''
    return True if re.findall('ssh', tn_result) else False
if __name__ == '__main__':
    hosts = scan_active_hosts('192.168.43.0/24')
    print(hosts)
    for host in hosts:
        if is_ssh_open(host):
            print(f'{host}的22端口打开')

3)探测结果(在存活中探测主机)

在这里插入图片描述

七、ssh远程密码或密钥登陆(paramiko)


7.1 paramiko简介


paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

paramiko核心组件: paramiko包含两个核心组件:SSHClient和SFTPClient(sftp=ssh file transfer protocol)。

  • SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。
  • SFTPClient的作用类似与Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。

7.2 项目实战


1)安装

1.Django安装
pip install paramiko -i https://mirrors.aliyun.com/pypi/simple
2.远程安装
pip install paramiko -i https://mirrors.aliyun.com/pypi/simple

2)生成公钥私钥

# 生成公钥和私钥
ssh-keygen
# 希望我的主机可以无密码连接其他主机(需要将公钥分发给其他主机)
ssh-copy-id -i ~/.ssh/id_rsa.pub user@ip

在这里插入图片描述
在这里插入图片描述

3)添加私钥到项目

将远程主机刚刚生成的私钥 ~/.ssh/id_rsa 的内容复制到 scanhost/id_rsa

4)登陆检测(查询内存 free -m

scanhost/utils.py

import paramiko

def login_ssh(host, user, passwd=None, pkey=None, cmd='hostname'):
    client = paramiko.SSHClient()
    # 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接SSH服务端,判断是密码认证还是密钥认证
    if pkey:
        private = paramiko.RSAKey.from_private_key_file(pkey)
        client.connect(host, 22, user, pkey=private)
    if passwd:
        client.connect(host, 22, user, passwd)
    # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
    stdin, stdout, stderr = client.exec_command(cmd)
    return stdout.read().decode('utf-8')

if __name__ == '__main__':
    pkey = '/root/cmdb/scanhost/id_rsa'
    res = login_ssh('192.168.43.100', 'root', pkey=pkey, cmd='free -m')
    print(res)

5)检测结果(随意切换命令的定义对象:cmd

  • free -m
    在这里插入图片描述
  • ip addr show

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46069582/article/details/114850311