python telnet登陸


  源碼請參考:starnightcyber/scripts

  主要使用TelnetClient類,封裝了登錄和執行命令的基本操作。

  源碼如下,或請查看:scripts/telnet/telnet.py

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

import logging
import telnetlib
import time


# telnet登錄認證相關
auth = {
  "user_prompt": b'Username:',            # 輸入用戶名提示
  "password_prompt": b'Password:',        # 輸入密碼提示
  "enter": b'\r',                        # 回車
  "remote_enter": b'\n\r',
}


class TelnetClient(object):
    def __init__(self):
        self.tn = telnetlib.Telnet()        # Telnet client

    def login(self, ip, port, tel_dict):
        """
        telnet 登錄
        :param ip: 目標ip
        :param port: 目標端口
        :param tel_dict: 密碼字典
        :return: 登錄成功(True) or 登錄失敗(False)
        """
        msg = 'trying to login {}:{} telnet service'.format(ip, port)
        print(msg)

        # telnet登錄
        for username, password in tel_dict.items():

            # 創建一個telnet連接
            try:
                self.tn.open(ip, port)
            except:
                logging.warning('%s網絡連接失敗' % ip)
                return False, ''

            msg = 'try user:[{}], password:[{}]'.format(username, password)
            print(msg)

            # 登錄嘗試
            try:
                # 等待輸入用戶名提示user_prompt出現后,輸入用戶名
                self.tn.read_until(auth['user_prompt'], timeout=3)
                self.tn.write(username.encode('ascii') + auth['enter'])

                # 等待輸入密碼提示password_prompt出現后,輸入密碼
                self.tn.read_until(auth['password_prompt'], timeout=3)
                self.tn.write(password.encode('ascii') + auth['enter'])

                # 延時兩秒再收取返回結果,給服務端足夠響應時間
                time.sleep(2)

                # 獲取登錄結果, read_very_eager()獲取到的是的是上次獲取之后本次獲取之前的所有輸出
                command_result = self.tn.read_very_eager().decode('ascii')
                # print('===>', command_result)
                prompt, _ = command_result.split('->')
                # print('===>', prompt.strip())

                # 如果返回的結果中沒有提示輸入用戶名,表示登錄成功
                if auth['user_prompt'] not in command_result.encode('ascii'):
                    print('登錄成功')
                    return True
                else:
                    continue
            except:
                pass
        return False

    def execute_command(self, command):
        """
        執行一些命令
        :param command: 要執行的命令
        :return: None
        """
        try:
            self.tn.write(command.encode('ascii') + auth['enter'])
            time.sleep(2)
            # 獲取命令結果
            command_result = self.tn.read_very_eager().decode('ascii')
            print('==>', command_result)
        except:
            print('something went wrong...')
            pass

    # 退出telnet,保留
    def logout_host(self):
        self.tn.write(b"bye\r")

if __name__ == '__main__':

    # 參數
    ip = '172.16.176.120'
    port = '2570'
    tel_dict = {'admin': 'admin', 'aaa': 'bbb', '': ''}

    # 登陸
    tn = TelnetClient()
    tn.login(ip, port, tel_dict)

    # 執行命令
    command = 'ver'
    tn.execute_command(command)

    # 退出
    tn.logout_host()

  執行輸出如下:

# python3 telnet_brute.py
trying to login 172.16.176.120:2570 telnet service
try user:[admin], password:[admin]
try user:[aaa], password:[bbb]
try user:[], password:[]
登錄成功
==> ver
 Version :PAS_SIPPROXY_6.0.0.3.0.190831, Compile Time: 16:18:41, Feb 25 2020
Return value: 1
SipPrxoy->

  以上!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM