Python网络编程7-对Telnet流量进行解码分析与拦截

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python网络编程7-对Telnet流量进行解码分析与拦截相关的知识,希望对你有一定的参考价值。

参考技术A   Telnet命令通常用来远程登录。Telnet程序是基于TELNET协议的远程登录客户端程序。提供了在本地计算机上完成远程主机工作的 能力,在终端使用者的电脑上使用telnet程序,用它连接到服务器,终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个 telnet会话,必须输入用户名和密码来登录服务器。
  Telnet因为采用明文传送报文,安全性不好。但仍然有很多别的系统可能采用了telnet方式来提供远程登录,因此弄清楚telnet客户端的使用方式仍是很有必要的。telnet命令还可做别的用途:

  Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议。Telnet协议的目的是提供一个相对通用的,双向的,面向八位字节的通信方法,允许界面终端设备和面向终端的过程能通过一个标准过程进行互相交互。

  为理解Telnet工作过程与使用Python来分析流量,搭建如下环境:
  在R2上启用Telnet作为服务端,在linux主机上安装Telnet程序作为客户端,同时通Wirshark远程捕获Linux 主机在接口流量,在Linux主机上运行Python脚本来分析Telnet流量。

  使用如下Python脚本来捕获Telnet流量,并对Telnet交互命令进行解码。

  使用如下Python脚本对Telnet流量进行嗅探,发现Telnet流量之后发送TCP Reset对Telnet会话进行阻断。

在Linux 主机上先运行Python脚本,在运行Telnet程序。
发现此时无法连接到主机。

查看脚本运行脚本,可见一铺货到Telnet流量就会给双方发送TCP Reset。

在Wirshark上查看数据包交换如下

用Python怎么telnet到网络设备

0.前言

Telnet协议属于TCP/IP协议族里的一种,对于我们这些网络攻城狮来说,再熟悉不过了,常用于远程登陆到网络设备进行操作,但是,它的缺陷太明显了,就是不安全,信息明文传送,极容易被攻击窃取信息,不推荐使用,但本节我还是先从它入手哈。

1. 测试环境及关键代码解释

1.1 简单测试环境

  1. 使用python3环境
  2. 使用内置telnetlib模块
  3. 简单的实验环境
说明:
cmd.txt文件里面命令如下:
  terminal length 0
  show clock
  show ip interface brief
list.txt文件里面的IP如下:
  192.168.1.101
  192.168.1.102
  192.168.1.103

1.2 关键代码

import xx:导入模块
class xx:定义类
def xx: 定义函数
try-except :处理可能引发的异常
tn.read_until(expected, timeout=None):等待预期字符串或等待超时
tn.write(buffer):写入的字符串(意思发送给命令给设备)
tn.expect(list, timeout=None):读显,list采用正则表达式(意思把执行过程显示出来)
tn.read_very_eager():读显(意思把执行过程显示出来)
tn.open(host, port=0[, timeout]):连接主机
tn.close():关闭连接

Tips:终端与网络设备交付的信息是以byte类型,所以要把终端上的字符串encode编码转换为byte对象,网络设备回显的byte信息要decode解码。

2. 完整代码

\'\'\'
欢迎关注微信公众号:\'diandijishu\'
  此平台是网路工程师个人日常技术、项目案例经验分享,
  为巩固及提升技术能力乃至共享所学所知技术
  也欢迎各位工程师一起分享、一起成长。
\'\'\'

#!/usr/bin/env python
#coding:utf-8

\'导入模块\'
from telnetlib import Telnet
import time
import logging

\'定义类\'
class TelnetClient():
    \'初始化属性\'
    def __init__(self):
        self.tn = Telnet()
    \'定义login_host函数,用于登陆设备\'
    def login_host(self,ip,username,password,enable=None,verbose=True):
        \'连接设备,try-except结构\'
        try:
            self.tn.open(ip,port=23)
        except:
            logging.warning(\'%s网络连接失败\' %ip)
            return False
        \'输入用户名\'
        self.tn.read_until(b\'Username:\', timeout=1)
        self.tn.write(b\'\\n\')
        self.tn.write(username.encode() + b\'\\n\')
        rely = self.tn.expect([], timeout=1)[2].decode().strip()    #读显
        if verbose:
            print(rely)
        \'输入用户密码\'
        self.tn.read_until(b\'Password:\', timeout=1)
        self.tn.write(password.encode() + b\'\\n\')
        rely = self.tn.expect([], timeout=1)[2].decode().strip()
        if verbose:
            print(rely)
        \'进去特权模式\'
        if enable is not None:
            self.tn.write(b\'enable\\n\')
            self.tn.write(enable.encode() + b\'\\n\')
            if verbose:
                rely = self.tn.expect([], timeout=1)[2].decode().strip()
                print(rely)
                time.sleep(1)

        rely = self.tn.read_very_eager().decode()
        if \'Login invalid\' not in rely:
            logging.warning(\'%s登陆成功\' % ip)
            return True
        else:
            logging.warning(\'%s登陆失败,用户名或密码错误\' % ip)
            return False

    \'定义do_cmd函数,用于执行命令\'
    def do_cmd(self,cmds):
        \'读取文件,for语句循环执行命令\'
        with open(cmds) as cmd_obj:
            for cmd in cmd_obj:
                self.tn.write(cmd.encode().strip() + b\'\\n\')
                time.sleep(2)
                rely = self.tn.read_very_eager().decode()
                logging.warning(\'命令执行结果:\\n %s\' %rely)
    \'定义logout_host函数,关闭程序\'
    def logout_host(self):
        self.tn.close()

if __name__ == \'__main__\':
    username = \'cisco\'  #用户名
    password = \'cisco\' #密码
    enable = \'cisco\'    #特权密码
    lists = \'list.txt\'  #存放IP地址文件,相对路径
    cmds = \'cmd.txt\'    #存放执行命令文件,相对路径
    telnet_client = TelnetClient()
    \'读取文件,for语句循环登陆IP\'
    with open(lists,\'rt\') as list_obj:
        for ip in list_obj:
            \'如果登录结果为True,则执行命令,然后退出\'
            if telnet_client.login_host(ip.strip(),username,password,enable):
                telnet_client.do_cmd(cmds)
                telnet_client.logout_host()
                time.sleep(2)

3. 运行效果

备注:这个运行的效果我只存放了192.168.1.101这个IP,精简一下,为了效果。

4. 报错效果

4.1 远程连接不上

4.2 用户名和密码错误

5. 碎碎语

这些只是一些简单的代码,待优化的地方还是很多,先给小伙伴们学习一下,telnet协议是个不安全的,基本网络环境很少用了,ssh为常用的协议,安全又好用,下个文章我给大家介绍python如何使用ssh模块哈。
本人代码功夫不深,如有缺陷望指教,多谢。


如果喜欢的我的文章,欢迎关注我的公众号:点滴技术,扫码关注,不定期分享

点滴技术

以上是关于Python网络编程7-对Telnet流量进行解码分析与拦截的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中对西班牙语进行编码和解码

《Python黑帽子:黑客与渗透测试编程之道》读书笔记:原始套接字和流量嗅探

《Python黑帽子:黑客与渗透测试编程之道》读书笔记:原始套接字和流量嗅探

路由基础之思科实验ACL Telnet VLAN划分端口聚合的配置

TCP协议漏洞可导致网络流量被劫持

思科ASA5505防火墙放行流量实验