文章目录
项目地址:https://gitee.com/sdsnzy/cmdb
项目过程:
- Django自动化资产扫描----(1)项目简介并创建项目
- Django自动化资产扫描----(2)项目远程环境搭建
- Django自动化资产扫描(4)----定时任务自动化检测数据(paramiko+celery)
五、存活探测 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