Compare commits
10 Commits
42b0bb85fb
...
e5691b7e97
Author | SHA1 | Date | |
---|---|---|---|
e5691b7e97 | |||
|
56a6a12994 | ||
|
10916ac4c8 | ||
3cc0558cc5 | |||
3d5838b0fa | |||
d25ddff0c5 | |||
ff4b3d9fea | |||
ab2b5092b5 | |||
cc02b8df44 | |||
4d6294a20b |
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
|||||||
ISC License
|
ISC License
|
||||||
|
|
||||||
Copyright (c) 2021, acidvegas <acid.vegas@acid.vegas>
|
Copyright (c) 2024, acidvegas <acid.vegas@acid.vegas>
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -8,5 +8,4 @@
|
|||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
###### Mirrors
|
###### Mirrors for this repository: [acid.vegas](https://git.acid.vegas/proxytools) • [SuperNETs](https://git.supernets.org/acidvegas/proxytools) • [GitHub](https://github.com/acidvegas/proxytools) • [GitLab](https://gitlab.com/acidvegas/proxytools) • [Codeberg](https://codeberg.org/acidvegas/proxytools)
|
||||||
[acid.vegas](https://git.acid.vegas/proxytools) • [GitHub](https://github.com/acidvegas/proxytools) • [GitLab](https://gitlab.com/acidvegas/proxytools) • [SuperNETs](https://git.supernets.org/acidvegas/proxytools)
|
|
143
cleansocks.py
143
cleansocks.py
@ -1,80 +1,133 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# CleanSocks - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
|
# CleanSocks - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
|
||||||
|
|
||||||
'''
|
# This script will clean a list of proxies by removing duplicates, checking for valid formats (IP:PORT), & testing if the proxies are working
|
||||||
|
# If a proxy is found working on multiple ports, we will only store the first working port to avoid ip duplication in the clean results.
|
||||||
This script will clean a list of proxies by removing duplicates, checking for valid formats (IP:PORT), & testing if the proxies are working
|
|
||||||
|
|
||||||
'''
|
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import asyncio
|
import asyncio
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
try:
|
||||||
|
import aiosocks
|
||||||
|
except ImportError:
|
||||||
|
raise SystemExit('missing pysocks module (https://pypi.org/project/aiosocks/)')
|
||||||
|
|
||||||
|
try:
|
||||||
|
import aiohttp
|
||||||
|
except ImportError:
|
||||||
|
raise SystemExit('missing pysocks module (https://pypi.org/project/aiosocks/)')
|
||||||
|
|
||||||
# Globals
|
# Globals
|
||||||
all = list()
|
all = list()
|
||||||
good = list()
|
good = list()
|
||||||
print_bad = True
|
|
||||||
|
|
||||||
async def check(semaphore, proxy):
|
async def check_http_proxy(semaphore: asyncio.Semaphore, proxy: str):
|
||||||
|
'''
|
||||||
|
Checks if a HTTP proxy is working.
|
||||||
|
|
||||||
|
:param semaphore: The semaphore to use.
|
||||||
|
:param proxy: The proxy to check.
|
||||||
|
'''
|
||||||
async with semaphore:
|
async with semaphore:
|
||||||
ip, port = proxy.split(':')
|
proxy_ip = proxy.split(':')[0]
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
try:
|
||||||
|
async with session.get('https://google.com', proxy=f'http://{proxy}', timeout=args.timeout) as response:
|
||||||
|
if response.status == 200:
|
||||||
|
print('\033[1;32mGOOD\033[0m \033[30m|\033[0m ' + proxy)
|
||||||
|
if proxy_ip not in all:
|
||||||
|
all.append(proxy_ip)
|
||||||
|
good.append(proxy)
|
||||||
|
else:
|
||||||
|
if args.bad:
|
||||||
|
print('\033[1;31mBAD\033[0m \033[30m|\033[0m ' + proxy)
|
||||||
|
except:
|
||||||
|
if args.bad:
|
||||||
|
print('\033[1;31mBAD\033[0m \033[30m|\033[0m ' + proxy)
|
||||||
|
|
||||||
|
async def check_socks_proxy(semaphore: asyncio.Semaphore, proxy: str):
|
||||||
|
'''
|
||||||
|
Checks if a SOCKS proxy is working.
|
||||||
|
|
||||||
|
:param semaphore: The semaphore to use.
|
||||||
|
:param proxy: The proxy to check.
|
||||||
|
'''
|
||||||
|
async with semaphore:
|
||||||
|
proxy_ip, proxy_port = proxy.split(':')
|
||||||
options = {
|
options = {
|
||||||
'proxy' : aiosocks.Socks5Addr(proxy.split(':')[0], int(proxy.split(':')[1])),
|
'proxy' : aiosocks.Socks5Addr(proxy_ip, proxy_port),
|
||||||
'proxy_auth' : None,
|
'proxy_auth' : None,
|
||||||
'dst' : ('www.google.com',80),
|
'dst' : ('www.google.com', 80),
|
||||||
'limit' : 1024,
|
'limit' : 1024,
|
||||||
'ssl' : None,
|
'ssl' : None,
|
||||||
'family' : 2
|
'family' : 2
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
await asyncio.wait_for(aiosocks.open_connection(**options), 15)
|
await asyncio.wait_for(aiosocks.open_connection(**options), args.timeout)
|
||||||
except:
|
except:
|
||||||
if print_bad:
|
if args.bad:
|
||||||
print('\033[1;31mBAD\033[0m \033[30m|\033[0m ' + proxy)
|
print('\033[1;31mBAD\033[0m \033[30m|\033[0m ' + proxy)
|
||||||
else:
|
else:
|
||||||
print('\033[1;32mGOOD\033[0m \033[30m|\033[0m ' + proxy)
|
print('\033[1;32mGOOD\033[0m \033[30m|\033[0m ' + proxy)
|
||||||
if ip not in all:
|
if proxy_ip not in all:
|
||||||
all.append(ip)
|
all.append(proxy_ip)
|
||||||
good.append(proxy)
|
good.append(proxy)
|
||||||
|
|
||||||
async def main(targets):
|
async def main(targets):
|
||||||
sema = asyncio.BoundedSemaphore(500)
|
'''
|
||||||
|
Starts the main event loop.
|
||||||
|
|
||||||
|
:param targets: The proxies to check.
|
||||||
|
'''
|
||||||
|
sema = asyncio.BoundedSemaphore(args.threads)
|
||||||
jobs = list()
|
jobs = list()
|
||||||
for target in targets:
|
for target in targets:
|
||||||
jobs.append(asyncio.ensure_future(check(sema, target)))
|
if args.socks:
|
||||||
|
jobs.append(asyncio.ensure_future(check_socks_proxy(sema, target)))
|
||||||
|
else:
|
||||||
|
jobs.append(asyncio.ensure_future(check_http_proxy(sema, target)))
|
||||||
await asyncio.gather(*jobs)
|
await asyncio.gather(*jobs)
|
||||||
|
|
||||||
# Main
|
|
||||||
print('#'*56)
|
if __name__ == '__main__':
|
||||||
print('#{0}#'.format(''.center(54)))
|
print('#'*56)
|
||||||
print('#{0}#'.format('CleanSOCKS Proxy Cleaner'.center(54)))
|
print('#{0}#'.format(''.center(54)))
|
||||||
print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
|
print('#{0}#'.format('CleanSOCKS Proxy Cleaner'.center(54)))
|
||||||
print('#{0}#'.format('https://git.acid.vegas/proxytools'.center(54)))
|
print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
|
||||||
print('#{0}#'.format(''.center(54)))
|
print('#{0}#'.format('https://git.acid.vegas/proxytools'.center(54)))
|
||||||
print('#'*56)
|
print('#{0}#'.format(''.center(54)))
|
||||||
parser = argparse.ArgumentParser(usage='%(prog)s <input> <output> [options]')
|
print('#'*56)
|
||||||
parser.add_argument('input', help='file to scan')
|
|
||||||
parser.add_argument('output', help='file to output')
|
parser = argparse.ArgumentParser(usage='%(prog)s <input> <output> [options]')
|
||||||
parser.add_argument('-t', '--threads', help='number of threads (default: 100)', default=100, type=int)
|
parser.add_argument('input', help='file to scan')
|
||||||
parser.add_argument('-x', '--timeout', help='socket timeout seconds (default: 15)', default=15, type=int)
|
parser.add_argument('output', help='file to output')
|
||||||
args = parser.parse_args()
|
parser.add_argument('-s', '--socks', action='store_true', help='Check SOCKS proxies (default: HTTP)')
|
||||||
try:
|
parser.add_argument('-b', '--bad', action='store_true', help='Show bad proxies')
|
||||||
import aiosocks
|
parser.add_argument('-t', '--threads', help='number of threads (default: 100)', default=100, type=int)
|
||||||
except ImportError:
|
parser.add_argument('-x', '--timeout', help='socket timeout seconds (default: 15)', default=15, type=int)
|
||||||
raise SystemExit('missing pysocks module (https://pypi.org/project/aiosocks/)')
|
args = parser.parse_args()
|
||||||
if not os.path.isfile(args.input):
|
|
||||||
|
if not os.path.isfile(args.input):
|
||||||
raise SystemExit('no such input file')
|
raise SystemExit('no such input file')
|
||||||
initial = len(open(args.input).readlines())
|
|
||||||
proxies = set([proxy for proxy in re.findall('[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+', open(args.input).read(), re.MULTILINE)])
|
initial = len(open(args.input).readlines())
|
||||||
if not proxies:
|
proxies = set([proxy for proxy in re.findall(r'[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+', open(args.input).read(), re.MULTILINE)])
|
||||||
|
|
||||||
|
if not proxies:
|
||||||
raise SystemExit('no proxies found from input file')
|
raise SystemExit('no proxies found from input file')
|
||||||
asyncio.run(main(proxies))
|
|
||||||
good.sort()
|
|
||||||
with open(args.output, 'w') as output_file:
|
print('\033[1;32mChecking {0:,} {1} proxies using {2:,} threads... \033[1;30m(Pass the -h or --help argument to change these settings)\033[0m'.format(len(proxies), 'SOCKS' if args.socks else 'HTTP', args.threads))
|
||||||
|
asyncio.run(main(proxies))
|
||||||
|
|
||||||
|
good.sort()
|
||||||
|
|
||||||
|
with open(args.output, 'w') as output_file:
|
||||||
output_file.write('\n'.join(good))
|
output_file.write('\n'.join(good))
|
||||||
print('\033[34mTotal\033[0m : ' + format(len(proxies), ',d'))
|
|
||||||
print('\033[34mGood\033[0m : ' + format(len(good), ',d'))
|
print('\033[34mTotal\033[0m : ' + format(len(proxies), ',d'))
|
||||||
print('\033[34mBad\033[0m : ' + format(len(proxies)-len(good), ',d'))
|
print('\033[34mGood\033[0m : ' + format(len(good), ',d'))
|
||||||
print('\033[34mDupe\033[0m : ' + format(initial-len(proxies), ',d'))
|
print('\033[34mBad\033[0m : ' + format(len(proxies)-len(good), ',d'))
|
||||||
|
print('\033[34mDupe\033[0m : ' + format(initial-len(proxies), ',d'))
|
||||||
|
617
dnsbl.py
Normal file
617
dnsbl.py
Normal file
@ -0,0 +1,617 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# DNSBL - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import asyncio
|
||||||
|
import ipaddress
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
try:
|
||||||
|
import aiodns
|
||||||
|
except ImportError:
|
||||||
|
raise SystemExit('missing required library \'aiodns\' (https://pypi.org/project/aiodns/)')
|
||||||
|
|
||||||
|
# ANSI color codes
|
||||||
|
RED = '\033[91m'
|
||||||
|
GREEN = '\033[92m'
|
||||||
|
GREY = '\033[90m'
|
||||||
|
RESET = '\033[0m'
|
||||||
|
|
||||||
|
DNSBL_LIST = [
|
||||||
|
'0outspam.fusionzero.com',
|
||||||
|
'0spam-killlist.fusionzero.com',
|
||||||
|
'0spam.fusionzero.com',
|
||||||
|
'0spamtrust.fusionzero.com',
|
||||||
|
'0spamurl.fusionzero.com',
|
||||||
|
'3y.spam.mrs.kithrup.com',
|
||||||
|
'88.blocklist.zap',
|
||||||
|
'abuse-contacts.abusix.org',
|
||||||
|
'abuse.rfc-clueless.org',
|
||||||
|
'abuse.rfc-ignorant.org',
|
||||||
|
'access.atlbl.net',
|
||||||
|
'access.redhawk.org',
|
||||||
|
'accredit.habeas.com',
|
||||||
|
'admin.bl.kundenserver.de',
|
||||||
|
'all.ascc.dnsbl.bit.nl',
|
||||||
|
'all.dnsbl.bit.nl',
|
||||||
|
'all.rbl.jp',
|
||||||
|
'all.rbl.webiron.net',
|
||||||
|
'all.s5h.net',
|
||||||
|
'all.spam-rbl.fr',
|
||||||
|
'all.spamblock.unit.liu.se',
|
||||||
|
'all.spamrats.com',
|
||||||
|
'all.v6.ascc.dnsbl.bit.nl',
|
||||||
|
'apnic-main.bogons.dnsiplists.completewhois.com',
|
||||||
|
'arin-legacy-classb.bogons.dnsiplists.completewhois.com',
|
||||||
|
'arin-legacy-classc.bogons.dnsiplists.completewhois.com',
|
||||||
|
'arin-main.bogons.dnsiplists.completewhois.com',
|
||||||
|
'asiaspam.spamblocked.com',
|
||||||
|
'asn.routeviews.org',
|
||||||
|
'aspath.routeviews.org',
|
||||||
|
'aspews.dnsbl.sorbs.net',
|
||||||
|
'aspews.ext.sorbs.net',
|
||||||
|
'assholes.madscience.nl',
|
||||||
|
'auth.spamrats.com',
|
||||||
|
'autowork.drbl.ks.cz',
|
||||||
|
'b.barracudacentral.org',
|
||||||
|
'babl.rbl.webiron.net',
|
||||||
|
'backscatter.spameatingmonkey.net',
|
||||||
|
'bad.psky.me',
|
||||||
|
'badconf.rhsbl.sorbs.net',
|
||||||
|
'badnets.spameatingmonkey.net',
|
||||||
|
'ban.zebl.zoneedit.com',
|
||||||
|
'bandwidth-pigs.monkeys.com',
|
||||||
|
'bb.barracudacentral.org',
|
||||||
|
'bitonly.dnsbl.bit.nl',
|
||||||
|
'bl.blocklist.de',
|
||||||
|
'bl.blueshore.net',
|
||||||
|
'bl.borderworlds.dk',
|
||||||
|
'bl.deadbeef.com',
|
||||||
|
'bl.drmx.org',
|
||||||
|
'bl.emailbasura.org',
|
||||||
|
'bl.fmb.la',
|
||||||
|
'bl.ipv6.spameatingmonkey.net',
|
||||||
|
'bl.konstant.no',
|
||||||
|
'bl.mailspike.net',
|
||||||
|
'bl.mailspike.org',
|
||||||
|
'bl.mav.com.br',
|
||||||
|
'bl.mipspace.com',
|
||||||
|
'bl.nszones.com',
|
||||||
|
'bl.rbl-dns.com',
|
||||||
|
'bl.reynolds.net.au',
|
||||||
|
'bl.scientificspam.net',
|
||||||
|
'bl.score.senderscore.com',
|
||||||
|
'bl.shlink.org',
|
||||||
|
'bl.shlink.orgdul.ru',
|
||||||
|
'bl.spamcannibal.org',
|
||||||
|
'bl.spamcop.net',
|
||||||
|
'bl.spameatingmonkey.net',
|
||||||
|
'bl.spamstinks.com',
|
||||||
|
'bl.spamthwart.com',
|
||||||
|
'bl.student.pw.edu.pl',
|
||||||
|
'bl.suomispam.net',
|
||||||
|
'bl.tiopan.com',
|
||||||
|
'bl.tolkien.dk',
|
||||||
|
'black.junkemailfilter.com',
|
||||||
|
'blackhole.compu.net',
|
||||||
|
'blackholes.brainerd.net',
|
||||||
|
'blackholes.easynet.nl',
|
||||||
|
'blackholes.five-ten-sg.com',
|
||||||
|
'blackholes.mail-abuse.org',
|
||||||
|
'blackholes.sandes.dk',
|
||||||
|
'blacklist.fpsn.net',
|
||||||
|
'blacklist.hostkarma.com',
|
||||||
|
'blacklist.informationwave.net',
|
||||||
|
'blacklist.mail.ops.asp.att.net',
|
||||||
|
'blacklist.mailrelay.att.net',
|
||||||
|
'blacklist.sci.kun.nl',
|
||||||
|
'blacklist.sci.ru.nl',
|
||||||
|
'blacklist.sequoia.ops.asp.att.net',
|
||||||
|
'blacklist.woody.ch',
|
||||||
|
'block.ascams.com',
|
||||||
|
'block.blars.org',
|
||||||
|
'block.dnsbl.sorbs.net',
|
||||||
|
'blocked.asgardnet.org',
|
||||||
|
'blocked.hilli.dk',
|
||||||
|
'blocklist.squawk.com',
|
||||||
|
'blocklist2.squawk.com',
|
||||||
|
'bogon.lbl.lagengymnastik.dk',
|
||||||
|
'bogons.cymru.com',
|
||||||
|
'bogons.dnsiplists.completewhois.com',
|
||||||
|
'bogusmx.rfc-clueless.org',
|
||||||
|
'bogusmx.rfc-ignorant.org',
|
||||||
|
'bsb.empty.us',
|
||||||
|
'bsb.spamlookup.net',
|
||||||
|
'cabl.rbl.webiron.net',
|
||||||
|
'cart00ney.surriel.com',
|
||||||
|
'catchspam.com',
|
||||||
|
'cbl.abuseat.org',
|
||||||
|
'cbl.anti-spam.org.cn',
|
||||||
|
'cblless.anti-spam.org.cn',
|
||||||
|
'cblplus.anti-spam.org.cn',
|
||||||
|
'ccess.redhawk.org',
|
||||||
|
'cdl.anti-spam.org.cn',
|
||||||
|
'china.rominet.net',
|
||||||
|
'cidr.bl.mcafee.com',
|
||||||
|
'client-domain.sjesl.monkeys.com',
|
||||||
|
'cml.anti-spam.org.cn',
|
||||||
|
'combined-hib.dnsiplists.completewhois.com',
|
||||||
|
'combined.abuse.ch',
|
||||||
|
'combined.njabl.org',
|
||||||
|
'combined.rbl.msrbl.net',
|
||||||
|
'communicado.fmb.la',
|
||||||
|
'contacts.abuse.net',
|
||||||
|
'country-rirdata.dnsiplists.completewhois.com',
|
||||||
|
'crawler.rbl.webiron.net',
|
||||||
|
'csi.cloudmark.com',
|
||||||
|
'czdynamic.drbl.ks.cz',
|
||||||
|
'db.rurbl.ru',
|
||||||
|
'db.wpbl.info',
|
||||||
|
'dbl.spamhaus.org',
|
||||||
|
'dbl.suomispam.net',
|
||||||
|
'dev.null.dk',
|
||||||
|
'devnull.drbl.be.net.ru',
|
||||||
|
'dialup.blacklist.jippg.org',
|
||||||
|
'dialup.drbl.sandy.ru',
|
||||||
|
'dialups.mail-abuse.org',
|
||||||
|
'dialups.visi.com',
|
||||||
|
'dnsbl-0.uceprotect.net',
|
||||||
|
'dnsbl-1.uceprotect.net',
|
||||||
|
'dnsbl-2.uceprotect.net',
|
||||||
|
'dnsbl-3.uceprotect.net',
|
||||||
|
'dnsbl.abuse.ch',
|
||||||
|
'dnsbl.anticaptcha.net',
|
||||||
|
'dnsbl.antispam.or.id',
|
||||||
|
'dnsbl.aspnet.hu',
|
||||||
|
'dnsbl.calivent.com.pe',
|
||||||
|
'dnsbl.cbn.net.id',
|
||||||
|
'dnsbl.clue-by-4.org',
|
||||||
|
'dnsbl.cobion.com',
|
||||||
|
'dnsbl.cyberlogic.net',
|
||||||
|
'dnsbl.delink.net',
|
||||||
|
'dnsbl.dronebl.org',
|
||||||
|
'dnsbl.forefront.microsoft.com',
|
||||||
|
'dnsbl.httpbl.org',
|
||||||
|
'dnsbl.inps.de',
|
||||||
|
'dnsbl.ioerror.us',
|
||||||
|
'dnsbl.justspam.org',
|
||||||
|
'dnsbl.kempt.net',
|
||||||
|
'dnsbl.madavi.de',
|
||||||
|
'dnsbl.mags.net',
|
||||||
|
'dnsbl.mailshell.net',
|
||||||
|
'dnsbl.mcu.edu.tw',
|
||||||
|
'dnsbl.net.ua',
|
||||||
|
'dnsbl.njabl.org',
|
||||||
|
'dnsbl.pagedirect.net',
|
||||||
|
'dnsbl.proxybl.org',
|
||||||
|
'dnsbl.rangers.eu.org',
|
||||||
|
'dnsbl.rizon.net',
|
||||||
|
'dnsbl.rv-soft.info',
|
||||||
|
'dnsbl.rymsho.ru',
|
||||||
|
'dnsbl.sorbs.net',
|
||||||
|
'dnsbl.spam-champuru.livedoor.com',
|
||||||
|
'dnsbl.spfbl.net',
|
||||||
|
'dnsbl.technoirc.org',
|
||||||
|
'dnsbl.tornevall.org',
|
||||||
|
'dnsbl.webequipped.com',
|
||||||
|
'dnsbl.wpbl.pc9.org',
|
||||||
|
'dnsbl.zapbl.net',
|
||||||
|
'dnsbl6.anticaptcha.net',
|
||||||
|
'dnsblchile.org',
|
||||||
|
'dnsrbl.org',
|
||||||
|
'dnsrbl.swinog.ch',
|
||||||
|
'dnswl.inps.de',
|
||||||
|
'dnswl.leisi.net',
|
||||||
|
'dob.sibl.support-intelligence.net',
|
||||||
|
'drone.abuse.ch',
|
||||||
|
'dronebl.noderebellion.net',
|
||||||
|
'dsn.bl.rfc-ignorant.de',
|
||||||
|
'dsn.rfc-clueless.org',
|
||||||
|
'dsn.rfc-ignorant.org',
|
||||||
|
'dssl.imrss.org',
|
||||||
|
'duinv.aupads.org',
|
||||||
|
'dul.blackhole.cantv.net',
|
||||||
|
'dul.dnsbl.sorbs.net',
|
||||||
|
'dul.dnsbl.sorbs.netdul.ru',
|
||||||
|
'dul.orca.bc.ca',
|
||||||
|
'dul.pacifier.net',
|
||||||
|
'dul.ru',
|
||||||
|
'dyn.nszones.com',
|
||||||
|
'dyna.spamrats.com',
|
||||||
|
'dynablock.easynet.nl',
|
||||||
|
'dynablock.sorbs.net',
|
||||||
|
'dynamic.dnsbl.rangers.eu.org',
|
||||||
|
'dyndns.rbl.jp',
|
||||||
|
'dynip.rothen.com',
|
||||||
|
'elitist.rfc-clueless.org',
|
||||||
|
'endn.bl.reynolds.net.au',
|
||||||
|
'escalations.dnsbl.sorbs.net',
|
||||||
|
'eswlrev.dnsbl.rediris.es',
|
||||||
|
'eurospam.spamblocked.com',
|
||||||
|
'ex.dnsbl.org',
|
||||||
|
'exitnodes.tor.dnsbl.sectoor.de',
|
||||||
|
'exitnodes.tor.dnsbl.sectoor.dehttp.dnsbl.sorbs.net',
|
||||||
|
'feb.spamlab.com',
|
||||||
|
'fnrbl.fast.net',
|
||||||
|
'forbidden.icm.edu.pl',
|
||||||
|
'formmail.relays.monkeys.com',
|
||||||
|
'free.v4bl.org',
|
||||||
|
'fresh.dict.rbl.arix.com',
|
||||||
|
'fresh.sa_slip.rbl.arix.com',
|
||||||
|
'fresh.spameatingmonkey.net',
|
||||||
|
'fresh10.spameatingmonkey.net',
|
||||||
|
'fresh15.spameatingmonkey.net',
|
||||||
|
'fulldom.rfc-clueless.org',
|
||||||
|
'geobl.spameatingmonkey.net',
|
||||||
|
'gl.suomispam.net',
|
||||||
|
'hbl.atlbl.net',
|
||||||
|
'helo-domain.sjesl.monkeys.com',
|
||||||
|
'hijacked.dnsiplists.completewhois.com',
|
||||||
|
'hil.habeas.com',
|
||||||
|
'hong-kong.rominet.net',
|
||||||
|
'hostkarma.junkemailfilter.com',
|
||||||
|
'hostkarma.junkemailfilter.com[brl]',
|
||||||
|
'http.dnsbl.sorbs.net',
|
||||||
|
'httpbl.abuse.ch',
|
||||||
|
'hul.habeas.com',
|
||||||
|
'iadb.isipp.com',
|
||||||
|
'iadb2.isipp.com',
|
||||||
|
'iana-classa.bogons.dnsiplists.completewhois.com',
|
||||||
|
'iddb.isipp.com',
|
||||||
|
'images.rbl.msrbl.net',
|
||||||
|
'in.dnsbl.org',
|
||||||
|
'inputs.orbz.org',
|
||||||
|
'intercept.datapacket.net',
|
||||||
|
'intruders.docs.uu.se',
|
||||||
|
'invalidipwhois.dnsiplists.completewhois.com',
|
||||||
|
'ip.v4bl.org',
|
||||||
|
'ipbl.zeustracker.abuse.ch',
|
||||||
|
'ips.backscatterer.org',
|
||||||
|
'ips.whitelisted.org',
|
||||||
|
'ipv6.all.dnsbl.bit.nl',
|
||||||
|
'ipv6.all.s5h.net',
|
||||||
|
'ipwhois.rfc-ignorant.org',
|
||||||
|
'is-tor.kewlio.net.uk',
|
||||||
|
'ispmx.pofon.foobar.hu',
|
||||||
|
'isps.spamblocked.com',
|
||||||
|
'ix.dnsbl.manitu.net',
|
||||||
|
'korea.rominet.net',
|
||||||
|
'korea.services.net',
|
||||||
|
'ksi.dnsbl.net.au',
|
||||||
|
'l1.apews.org',
|
||||||
|
'l1.apews.rhsbl.sorbs.net',
|
||||||
|
'l1.bbfh.ext.sorbs.net',
|
||||||
|
'l1.spews.dnsbl.sorbs.net',
|
||||||
|
'l2.apews.dnsbl.sorbs.net',
|
||||||
|
'l2.bbfh.ext.sorbs.net',
|
||||||
|
'l2.spews.dnsbl.sorbs.net',
|
||||||
|
'l3.bbfh.ext.sorbs.net',
|
||||||
|
'l4.bbfh.ext.sorbs.net',
|
||||||
|
'lacnic-main.bogons.dnsiplists.completewhois.com',
|
||||||
|
'lacnic.spamblocked.com',
|
||||||
|
'lame.dnsbl.rangers.eu.org',
|
||||||
|
'lbl.lagengymnastik.dk',
|
||||||
|
'list.anonwhois.net',
|
||||||
|
'list.bbfh.org',
|
||||||
|
'list.blogspambl.com',
|
||||||
|
'list.dnswl.org',
|
||||||
|
'list.quorum.to',
|
||||||
|
'mail-abuse.blacklist.jippg.org',
|
||||||
|
'mail.people.it',
|
||||||
|
'manual.orbz.gst-group.co.uk',
|
||||||
|
'misc.dnsbl.sorbs.net',
|
||||||
|
'mr-out.imrss.org',
|
||||||
|
'msgid.bl.gweep.ca',
|
||||||
|
'mtawlrev.dnsbl.rediris.es',
|
||||||
|
'multi.surbl.org',
|
||||||
|
'multi.uribl.com',
|
||||||
|
'netbl.spameatingmonkey.net',
|
||||||
|
'netblock.pedantic.org',
|
||||||
|
'netblockbl.spamgrouper.com',
|
||||||
|
'netblockbl.spamgrouper.to',
|
||||||
|
'netscan.rbl.blockedservers.com',
|
||||||
|
'new.dnsbl.sorbs.net',
|
||||||
|
'new.spam.dnsbl.sorbs.net',
|
||||||
|
'nml.mail-abuse.org',
|
||||||
|
'no-more-funn.moensted.dk',
|
||||||
|
'nobl.junkemailfilter.com',
|
||||||
|
'nomail.rhsbl.sorbs.net',
|
||||||
|
'noptr.spamrats.com',
|
||||||
|
'noservers.dnsbl.sorbs.net',
|
||||||
|
'nospam.ant.pl',
|
||||||
|
'nsbl.fmb.la',
|
||||||
|
'old.dnsbl.sorbs.net',
|
||||||
|
'old.spam.dnsbl.sorbs.net',
|
||||||
|
'omrs.dnsbl.net.au',
|
||||||
|
'opm.tornevall.org',
|
||||||
|
'orbs.dorkslayers.com',
|
||||||
|
'orbz.gst-group.co.uk',
|
||||||
|
'origin.asn.cymru.com',
|
||||||
|
'origin.asn.spameatingmonkey.net',
|
||||||
|
'origin6.asn.cymru.com',
|
||||||
|
'orvedb.aupads.org',
|
||||||
|
'osps.dnsbl.net.au',
|
||||||
|
'osrs.dnsbl.net.au',
|
||||||
|
'outputs.orbz.org',
|
||||||
|
'owfs.dnsbl.net.au',
|
||||||
|
'pacbelldsl.compu.net',
|
||||||
|
'paidaccessviarsync',
|
||||||
|
'pbl.spamhaus.org',
|
||||||
|
'pdl.bl.reynolds.net.au',
|
||||||
|
'peer.asn.cymru.com',
|
||||||
|
'phishing.rbl.msrbl.net',
|
||||||
|
'plus.bondedsender.org',
|
||||||
|
'pm0-no-more.compu.net',
|
||||||
|
'pofon.foobar.hu',
|
||||||
|
'policy.lbl.lagengymnastik.dk',
|
||||||
|
'postmaster.rfc-clueless.org',
|
||||||
|
'postmaster.rfc-ignorant.org',
|
||||||
|
'ppbl.beat.st',
|
||||||
|
'probes.dnsbl.net.au',
|
||||||
|
'probes.dnsbl.net.auproxy.bl.gweep.ca',
|
||||||
|
'problems.dnsbl.sorbs.net',
|
||||||
|
'proxies.blackholes.easynet.nl',
|
||||||
|
'proxies.dnsbl.sorbs.net',
|
||||||
|
'proxies.exsilia.net',
|
||||||
|
'proxies.relays.monkeys.com',
|
||||||
|
'proxy.bl.gweep.ca',
|
||||||
|
'proxy.block.transip.nl',
|
||||||
|
'proxy.drbl.be.net.ru',
|
||||||
|
'psbl.surriel.com',
|
||||||
|
'pss.spambusters.org.ar',
|
||||||
|
'q.mail-abuse.com',
|
||||||
|
'query.bondedsender.org',
|
||||||
|
'query.senderbase.org',
|
||||||
|
'r.mail-abuse.com',
|
||||||
|
'rabl.nuclearelephant.com',
|
||||||
|
'random.bl.gweep.ca',
|
||||||
|
'rbl-plus.mail-abuse.org',
|
||||||
|
'rbl.abuse.ro',
|
||||||
|
'rbl.atlbl.net',
|
||||||
|
'rbl.blakjak.net',
|
||||||
|
'rbl.blockedservers.com',
|
||||||
|
'rbl.bulkfeeds.jp',
|
||||||
|
'rbl.cbn.net.id',
|
||||||
|
'rbl.choon.net',
|
||||||
|
'rbl.dns-servicios.com',
|
||||||
|
'rbl.echelon.pl',
|
||||||
|
'rbl.efnet.org',
|
||||||
|
'rbl.efnethelp.net',
|
||||||
|
'rbl.efnetrbl.org',
|
||||||
|
'rbl.eznettools.com',
|
||||||
|
'rbl.fasthosts.co.uk',
|
||||||
|
'rbl.firstbase.com',
|
||||||
|
'rbl.init1.nl',
|
||||||
|
'rbl.interserver.net',
|
||||||
|
'rbl.iprange.net',
|
||||||
|
'rbl.ipv6wl.eu',
|
||||||
|
'rbl.jp',
|
||||||
|
'rbl.lugh.ch',
|
||||||
|
'rbl.ma.krakow.pl',
|
||||||
|
'rbl.mail-abuse.org',
|
||||||
|
'rbl.megarbl.net',
|
||||||
|
'rbl.ntvinet.net',
|
||||||
|
'rbl.pil.dk',
|
||||||
|
'rbl.polarcomm.net',
|
||||||
|
'rbl.rope.net',
|
||||||
|
'rbl.schulte.org',
|
||||||
|
'rbl.snark.net',
|
||||||
|
'rbl.spamlab.com',
|
||||||
|
'rbl.suresupport.com',
|
||||||
|
'rbl.talkactive.net',
|
||||||
|
'rbl.triumf.ca',
|
||||||
|
'rbl2.triumf.ca',
|
||||||
|
'rdts.bl.reynolds.net.au',
|
||||||
|
'rdts.dnsbl.net.au',
|
||||||
|
'recent.dnsbl.sorbs.net',
|
||||||
|
'recent.spam.dnsbl.sorbs.net',
|
||||||
|
'relayips.rbl.shub-inter.net',
|
||||||
|
'relays.bl.gweep.ca',
|
||||||
|
'relays.bl.kundenserver.de',
|
||||||
|
'relays.dnsbl.sorbs.net',
|
||||||
|
'relays.dorkslayers.com',
|
||||||
|
'relays.mail-abuse.org',
|
||||||
|
'relays.nether.net',
|
||||||
|
'relays.radparker.com',
|
||||||
|
'relays.sandes.dk',
|
||||||
|
'relaywatcher.n13mbl.com',
|
||||||
|
'rep.mailspike.net',
|
||||||
|
'reputation-domain.rbl.scrolloutf1.com',
|
||||||
|
'reputation-ip.rbl.scrolloutf1.com',
|
||||||
|
'reputation-ns.rbl.scrolloutf1.com',
|
||||||
|
'residential.block.transip.nl',
|
||||||
|
'rf.senderbase.org',
|
||||||
|
'rhsbl.rymsho.ru',
|
||||||
|
'rhsbl.scientificspam.net',
|
||||||
|
'rhsbl.sorbs.net',
|
||||||
|
'rhsbl.zapbl.net',
|
||||||
|
'ricn.dnsbl.net.au',
|
||||||
|
'ripe-main.bogons.dnsiplists.completewhois.com',
|
||||||
|
'rmst.dnsbl.net.au',
|
||||||
|
'rot.blackhole.cantv.net',
|
||||||
|
'rsbl.aupads.org',
|
||||||
|
'rwl.choon.net',
|
||||||
|
'sa-accredit.habeas.com',
|
||||||
|
'sa.senderbase.org',
|
||||||
|
'safe.dnsbl.sorbs.net',
|
||||||
|
'sbl-xbl.spamhaus.org',
|
||||||
|
'sbl.nszones.com',
|
||||||
|
'sbl.spamhaus.org',
|
||||||
|
'schizo-bl.kundenserver.de',
|
||||||
|
'score.senderscore.com',
|
||||||
|
'sender-address.sjesl.monkeys.com',
|
||||||
|
'sender-domain-validate.sjesl.monkeys.com',
|
||||||
|
'sender-domain.sjesl.monkeys.com',
|
||||||
|
'service.mailwhitelist.com',
|
||||||
|
'short.fmb.la',
|
||||||
|
'short.rbl.jp',
|
||||||
|
'singlebl.spamgrouper.com',
|
||||||
|
'singular.ttk.pte.hu',
|
||||||
|
'smtp.dnsbl.sorbs.net',
|
||||||
|
'socks.dnsbl.sorbs.net',
|
||||||
|
'sohul.habeas.com',
|
||||||
|
'sorbs.dnsbl.net.au',
|
||||||
|
'spam.abuse.ch',
|
||||||
|
'spam.dnsbl.anonmails.de',
|
||||||
|
'spam.dnsbl.rangers.eu.org',
|
||||||
|
'spam.dnsbl.sorbs.net',
|
||||||
|
'spam.exsilia.net',
|
||||||
|
'spam.lbl.lagengymnastik.dk',
|
||||||
|
'spam.olsentech.net',
|
||||||
|
'spam.pedantic.org',
|
||||||
|
'spam.rbl.blockedservers.com',
|
||||||
|
'spam.rbl.msrbl.net',
|
||||||
|
'spam.shri.net',
|
||||||
|
'spam.spamrats.com',
|
||||||
|
'spam.wonk.org',
|
||||||
|
'spam.wytnij.to',
|
||||||
|
'spam.zapjunk.com',
|
||||||
|
'spamblock.kundenserver.de',
|
||||||
|
'spambot.bls.digibase.ca',
|
||||||
|
'spamdomain.block.transip.nl',
|
||||||
|
'spamdomains.blackholes.easynet.nl',
|
||||||
|
'spamguard.leadmon.net',
|
||||||
|
'spamips.rbl.shub-inter.net',
|
||||||
|
'spamlist.or.kr',
|
||||||
|
'spamrbl.imp.ch',
|
||||||
|
'spamsource.block.transip.nl',
|
||||||
|
'spamsources.fabel.dk',
|
||||||
|
'spamsources.spamblocked.com',
|
||||||
|
'spamsupport.dnsbl.rangers.eu.org',
|
||||||
|
'spbl.bl.winbots.org',
|
||||||
|
'spews.block.transip.nl',
|
||||||
|
'srn.surgate.net',
|
||||||
|
'srnblack.surgate.net',
|
||||||
|
'st.technovision.dk',
|
||||||
|
'stabl.rbl.webiron.net',
|
||||||
|
'stale.dict.rbl.arix.com',
|
||||||
|
'stale.sa_slip.arix.com',
|
||||||
|
'superblock.ascams.com',
|
||||||
|
'swl.spamhaus.org',
|
||||||
|
't3direct.dnsbl.net.au',
|
||||||
|
'taiwan.rominet.net',
|
||||||
|
'tor.dan.me.uk',
|
||||||
|
'tor.dnsbl.sectoor.de',
|
||||||
|
'tor.efnet.org',
|
||||||
|
'torexit.dan.me.uk',
|
||||||
|
'torserver.tor.dnsbl.sectoor.de',
|
||||||
|
'truncate.gbudb.net',
|
||||||
|
'trusted.nether.net',
|
||||||
|
'ubl.lashback.com',
|
||||||
|
'ubl.nszones.com',
|
||||||
|
'ubl.unsubscore.com',
|
||||||
|
'unsure.nether.net',
|
||||||
|
'uribl.abuse.ro',
|
||||||
|
'uribl.pofon.foobar.hu',
|
||||||
|
'uribl.spameatingmonkey.net',
|
||||||
|
'uribl.swinog.ch',
|
||||||
|
'uribl.zeustracker.abuse.ch',
|
||||||
|
'urired.spameatingmonkey.net',
|
||||||
|
'url.rbl.jp',
|
||||||
|
'v4.fullbogons.cymru.com',
|
||||||
|
'v6.fullbogons.cymru.com',
|
||||||
|
'vbl.mookystick.com',
|
||||||
|
'virbl.bit.nl',
|
||||||
|
'virbl.dnsbl.bit.nl',
|
||||||
|
'virus.rbl.jp',
|
||||||
|
'virus.rbl.msrbl.net',
|
||||||
|
'vote.drbl.be.net.ru',
|
||||||
|
'vote.drbl.caravan.ru',
|
||||||
|
'vote.drbl.croco.net',
|
||||||
|
'vote.drbl.dataforce.net',
|
||||||
|
'vote.drbl.gremlin.ru',
|
||||||
|
'vote.drbl.host.kz',
|
||||||
|
'vote.drbldf.dsbl.ru',
|
||||||
|
'vote.rbl.ntvinet.net',
|
||||||
|
'vouch.dwl.spamhaus.org',
|
||||||
|
'wadb.isipp.com',
|
||||||
|
'wbl.triumf.ca',
|
||||||
|
'wdl.bl.reynolds.net.au',
|
||||||
|
'web.dnsbl.sorbs.net',
|
||||||
|
'web.rbl.msrbl.net',
|
||||||
|
'whitelist.sci.kun.nl',
|
||||||
|
'whitelist.surriel.com',
|
||||||
|
'whois.rfc-clueless.org',
|
||||||
|
'whois.rfc-ignorant.org',
|
||||||
|
'wl.mailspike.net',
|
||||||
|
'wl.nszones.com',
|
||||||
|
'wl.shlink.org',
|
||||||
|
'wl.summersault.com',
|
||||||
|
'wl.trusted-forwarder.org',
|
||||||
|
'work.drbl.caravan.ru',
|
||||||
|
'work.drbl.croco.net',
|
||||||
|
'work.drbl.dataforce.net',
|
||||||
|
'work.drbl.gremlin.ru',
|
||||||
|
'work.drbl.host.kz',
|
||||||
|
'work.drbldf.dsbl.ru',
|
||||||
|
'worm.dnsbl.rangers.eu.org',
|
||||||
|
'wormrbl.imp.ch',
|
||||||
|
'worms-bl.kundenserver.de',
|
||||||
|
'wpb.bl.reynolds.net.au',
|
||||||
|
'xbl.selwerd.cx',
|
||||||
|
'xbl.spamhaus.org',
|
||||||
|
'ybl.megacity.org',
|
||||||
|
'z.mailspike.net',
|
||||||
|
'zebl.zoneedit.com',
|
||||||
|
'zen.spamhaus.org',
|
||||||
|
'zombie.dnsbl.sorbs.net',
|
||||||
|
'zta.birdsong.org',
|
||||||
|
'ztl.dorkslayers.com',
|
||||||
|
'zz.countries.nerd.dk'
|
||||||
|
]
|
||||||
|
|
||||||
|
async def check_dnsbl(ip: str, dnsbl: str, semaphore: asyncio.Semaphore):
|
||||||
|
'''
|
||||||
|
Check if an IP address is blacklisted on a DNSBL.
|
||||||
|
|
||||||
|
:param ip: IP address to check.
|
||||||
|
:param dnsbl: DNSBL to check.
|
||||||
|
:param semaphore: Semaphore to limit the number of concurrent requests.
|
||||||
|
'''
|
||||||
|
async with semaphore:
|
||||||
|
reversed_ip = '.'.join(reversed(ip.split('.')))
|
||||||
|
try:
|
||||||
|
resolver = aiodns.DNSResolver()
|
||||||
|
lookup = f'{reversed_ip}.{dnsbl}'
|
||||||
|
for item in await resolver.query(lookup, 'TXT'):
|
||||||
|
response = await resolver.query(lookup, 'A')
|
||||||
|
if response:
|
||||||
|
print(f'{GREEN}{ip} is blacklisted on {dnsbl}: {response[0].host}{RESET}')
|
||||||
|
else:
|
||||||
|
if args.verbose:
|
||||||
|
print(f'{RED}{ip} has no reply from {dnsbl}{RESET}')
|
||||||
|
except aiodns.error.DNSError as e:
|
||||||
|
if args.verbose:
|
||||||
|
if e.args[0] == 4:
|
||||||
|
print(f'{GREY}{ip} is not blacklisted on {dnsbl}{RESET}')
|
||||||
|
else:
|
||||||
|
print(f'{RED}{ip} errored on {dnsbl} with {lookup}: {e}{RESET}')
|
||||||
|
|
||||||
|
async def main(ip, concurrency):
|
||||||
|
semaphore = asyncio.Semaphore(concurrency)
|
||||||
|
tasks = [check_dnsbl(ip, dnsbl, semaphore) for dnsbl in DNSBL_LIST]
|
||||||
|
await asyncio.gather(*tasks)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argparse.ArgumentParser(description='DNSBL Lookup Tool')
|
||||||
|
parser.add_argument('input', help='IP address or file with IP addresses')
|
||||||
|
parser.add_argument('-c', '--concurrency', type=int, default=50, help='Number of concurrent lookups')
|
||||||
|
parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose output')
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
try:
|
||||||
|
ipaddress.ip_address(args.input)
|
||||||
|
asyncio.run(main(args.input, args.concurrency))
|
||||||
|
except:
|
||||||
|
if os.path.isfile(args.input):
|
||||||
|
with open(args.input, 'r') as file:
|
||||||
|
for line in file:
|
||||||
|
ip = line.strip()
|
||||||
|
try:
|
||||||
|
ipaddress.ip_address(ip)
|
||||||
|
asyncio.run(main(args.input, args.concurrency))
|
||||||
|
except:
|
||||||
|
logging.warning(f'Invalid IP address: {ip}')
|
||||||
|
else:
|
||||||
|
raise SystemExit(f'Invalid IP address or file: {args.input}')
|
BIN
dronebl/dronebl-tools_0.3.tar.gz
Normal file
BIN
dronebl/dronebl-tools_0.3.tar.gz
Normal file
Binary file not shown.
78
dronebl/dronebl.py
Normal file
78
dronebl/dronebl.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# Copyright (c) 2008 DroneBL contributors
|
||||||
|
#
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
# are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# Neither the name of the author nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software without
|
||||||
|
# specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
class DroneBLClient:
|
||||||
|
"""Class for accessing DroneBL."""
|
||||||
|
def __init__(self, rpckey=None, server="https://dronebl.org/RPC2"):
|
||||||
|
self.server = server
|
||||||
|
self.rpckey = rpckey
|
||||||
|
self.submitList = ""
|
||||||
|
|
||||||
|
def addIP(self, ip, type):
|
||||||
|
"""Adds IP to DroneBL."""
|
||||||
|
self.submitList += "\t<add ip='" + ip + "' type='" + str(type) + "' />\n";
|
||||||
|
|
||||||
|
def lookupIP(self, ip):
|
||||||
|
"""Adds a lookup request to the message."""
|
||||||
|
self.submitList += "\t<lookup ip='" + ip + "' />\n"
|
||||||
|
|
||||||
|
def makeRequest(self):
|
||||||
|
"""Generates the request."""
|
||||||
|
self.request = "<?xml version=\"1.0\"?>\n<request key='" + self.rpckey + "'>\n" + self.submitList + "</request>"
|
||||||
|
|
||||||
|
def showRequest(self):
|
||||||
|
"""Shows the request."""
|
||||||
|
self.makeRequest()
|
||||||
|
print self.request
|
||||||
|
|
||||||
|
def makeConnection(self):
|
||||||
|
"""Connects to the RPC server."""
|
||||||
|
import urllib
|
||||||
|
type, uri = urllib.splittype(self.server)
|
||||||
|
self.__host, self.__handler = urllib.splithost(uri)
|
||||||
|
|
||||||
|
import httplib
|
||||||
|
self.connection = httplib.HTTPConnection(self.__host)
|
||||||
|
|
||||||
|
def postRequest(self):
|
||||||
|
"""Executes the request."""
|
||||||
|
self.makeRequest()
|
||||||
|
self.makeConnection()
|
||||||
|
self.connection.putrequest("POST", self.__handler)
|
||||||
|
self.connection.putheader("Content-Type", "text/xml")
|
||||||
|
self.connection.putheader("Content-Length", str(int(len(self.request))))
|
||||||
|
self.connection.endheaders()
|
||||||
|
self.connection.send(self.request)
|
||||||
|
self.__response = self.connection.getresponse()
|
||||||
|
|
||||||
|
def printResponse(self):
|
||||||
|
"""Display the XML response."""
|
||||||
|
print self.__response.read()
|
||||||
|
|
BIN
dronebl/libdronebl-tcl_1.3.tar.gz
Normal file
BIN
dronebl/libdronebl-tcl_1.3.tar.gz
Normal file
Binary file not shown.
29
dronebl/remove.sh
Normal file
29
dronebl/remove.sh
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
KEY="$(<dronebl.key)"
|
||||||
|
|
||||||
|
(
|
||||||
|
echo "<?xml version=\"1.0\"?><request key=\"$KEY\">"
|
||||||
|
while [ -n "$1" ] ; do
|
||||||
|
echo "<lookup ip=\"$1\" />"
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
echo "</request>"
|
||||||
|
) \
|
||||||
|
| curl -s --data @- https://dronebl.org/RPC2 \
|
||||||
|
| (xmllint --xpath '/response/result/@id' - 2>/dev/null | sed -n -e 's, id="\([^"]*\)",\1\n,gp') \
|
||||||
|
|(
|
||||||
|
echo "<?xml version=\"1.0\"?><request key=\"$KEY\">"
|
||||||
|
while read ID ; do
|
||||||
|
echo "Remove ID $ID" >&2
|
||||||
|
echo "<remove id=\"$ID\" />"
|
||||||
|
done
|
||||||
|
echo "</request>"
|
||||||
|
) \
|
||||||
|
| tee -a dronebl-remove.log \
|
||||||
|
| curl -s --data @- https://dronebl.org/RPC2 | tee -a dronebl-remove.log | grep -q "\"success\""
|
||||||
|
if [ $? -eq 0 ] ; then
|
||||||
|
echo "DRONEBL: successfully removed $@"
|
||||||
|
else
|
||||||
|
echo "DRONEBL: error removing $@"
|
||||||
|
fi
|
175
dronebl/submit.sh
Normal file
175
dronebl/submit.sh
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# syntax: dronebl-submit.sh [bantype [host|IP|datafile [host|IP|datafile [etc.]]]
|
||||||
|
# where datafile contains one host or IP per line.
|
||||||
|
# This script will sort | uniq datafiles and query for existing active listings, so
|
||||||
|
# duplicate entries are no problem.
|
||||||
|
#
|
||||||
|
# dependencies: bash, wget, standard GNU utils (host / sed / grep / sort / etc)
|
||||||
|
#
|
||||||
|
# Version history:
|
||||||
|
# 2.1 -- fixed a logic error; removed the removal of /tmp/dronebl-*.xml files on error
|
||||||
|
# 2.0 -- completely rewritten for RPC2 (although argument syntax is backward-
|
||||||
|
# compatible)
|
||||||
|
|
||||||
|
RPCKEY="/etc/fail2ban/dronebl.rpckey" # key, or path to file containing rpckey
|
||||||
|
REPORT_TO="https://dronebl.org/RPC2"
|
||||||
|
|
||||||
|
### end of user variables ###
|
||||||
|
|
||||||
|
if [ ! -w "/tmp" ]; then
|
||||||
|
echo "Unable to write to /tmp. Please ensure the disk is not full, and that this account has appropriate permissions."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$RPCKEY" ]; then
|
||||||
|
if [ -r "$RPCKEY" ]; then
|
||||||
|
RPCKEY=`cat $RPCKEY`
|
||||||
|
else
|
||||||
|
echo "RPC key in $RPCKEY is unreadable. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
function wash { # wash <hostname> -- sets $IP by reference
|
||||||
|
ADDR=$1
|
||||||
|
TEST=`echo "${ADDR}." | grep -E "^([0-9]{1,3}\.){4}$"`
|
||||||
|
if [ "$TEST" ]; then
|
||||||
|
VALID=0
|
||||||
|
else
|
||||||
|
VALID=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VALID" = "1" ]; then
|
||||||
|
echo -n "Looking up $ADDR... "
|
||||||
|
ADDR=`host $ADDR | grep -E -o -e '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'`
|
||||||
|
TEST=`echo "${ADDR}." | grep -E "^([0-9]{1,3}\.){4}$"`
|
||||||
|
if [ "$TEST" ]; then
|
||||||
|
echo "$ADDR"
|
||||||
|
else
|
||||||
|
echo "Unable to resolve. Skipping."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
eval "IP=$ADDR"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function rinse { # rinse <bantype> -- if bantype is contained in the deprecated list, exit
|
||||||
|
DEPRECATED=( 4 11 12 )
|
||||||
|
for dep in ${DEPRECATED[@]}; do
|
||||||
|
if [ "$BANTYPE" == "$dep" ]; then
|
||||||
|
echo "Bantype $BANTYPE has been deprecated. The DroneBL is probably not the appropriate listing service for this sort of activity. Please visit us on irc.atheme.org in #dronebl if you believe otherwise. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkerror { #checkerror <xmlfile> -- prints error messages from xml and exits
|
||||||
|
ERROR=`grep -i error $1`
|
||||||
|
if [ "$ERROR" ]; then
|
||||||
|
ERROR=`grep '<code>' $1 | sed -r -e 's/<[^>]*>//g' -e 's/^\s*//g'`
|
||||||
|
ERROR="$ERROR: `grep '<message>' $1 | sed -r -e 's/<[^>]*>//g' -e 's/^\s*//g'`"
|
||||||
|
echo "The server returned an error ($ERROR) -- see /tmp/dronebl-query.xml and /tmp/dronebl-response.xml for full details."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$2" = "" ]; then
|
||||||
|
echo -n 'Syntax:
|
||||||
|
'$0' [bantype [host|IP|datafile [host|IP|datafile [etc.]]]]
|
||||||
|
|
||||||
|
Types are as follows:
|
||||||
|
2 = Sample
|
||||||
|
3 = IRC Drone
|
||||||
|
4 = Tor exit node (deprecated)
|
||||||
|
5 = Bottler
|
||||||
|
6 = Unknown spambot or drone
|
||||||
|
7 = DDOS Drone
|
||||||
|
8 = SOCKS Proxy
|
||||||
|
9 = HTTP Proxy
|
||||||
|
10 = ProxyChain
|
||||||
|
11 = Machines and netblocks compromised or owned by MediaDefender (deprecated)
|
||||||
|
12 = Trolls (deprecated)
|
||||||
|
13 = Brute force attackers
|
||||||
|
14 = Open Wingate
|
||||||
|
15 = Open Router
|
||||||
|
255 = Unknown
|
||||||
|
|
||||||
|
Which type? '
|
||||||
|
read BANTYPE
|
||||||
|
rinse $BANTYPE
|
||||||
|
echo -n "What's the hostname / IP address? "
|
||||||
|
read ADDR
|
||||||
|
wash $ADDR
|
||||||
|
if [ $? ]; then
|
||||||
|
IPLIST[0]=$IP
|
||||||
|
else
|
||||||
|
echo "Unable to resolve $ADDR. Exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
rinse $1
|
||||||
|
args=($@)
|
||||||
|
echo "A little housekeeping..."
|
||||||
|
for (( x=1; x<${#args[@]}; x++ )); do
|
||||||
|
if [ "${args[$x]}" != "" ]; then
|
||||||
|
filename="${args[$x]}"
|
||||||
|
if [ ! -r "$filename" ]; then filename="$PWD/${args[$x]}"; fi
|
||||||
|
if [ -r "$filename" ]; then
|
||||||
|
for i in `sort -u $PWD/${args[$x]}`; do
|
||||||
|
wash $i
|
||||||
|
if [ $? ]; then IPLIST[${#IPLIST[@]}]=$IP; fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
wash ${args[$x]}
|
||||||
|
if [ $? ]; then IPLIST[${#IPLIST[@]}]=$IP; fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IPLIST=( `for (( x=0; x<${#IPLIST[@]}; x++ )) ; do echo ${IPLIST[$x]}; done | sort -u` )
|
||||||
|
BANTYPE=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
POSTFILE="/tmp/dronebl-query.xml"
|
||||||
|
RESPONSEFILE="/tmp/dronebl-response.xml"
|
||||||
|
|
||||||
|
echo "Housekeeping finished. Working with ${#IPLIST[@]} unique, valid addresses."
|
||||||
|
if [ ${#IPLIST[@]} -eq 0 ]; then
|
||||||
|
echo "No hosts to report. Exiting."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Checking for exiting entries... "
|
||||||
|
echo "<?xml version=\"1.0\"?>
|
||||||
|
<request key='"$RPCKEY"'>" >$POSTFILE
|
||||||
|
for i in ${IPLIST[@]}; do
|
||||||
|
echo " <lookup ip='$i' />" >>$POSTFILE
|
||||||
|
done
|
||||||
|
echo "</request>" >>$POSTFILE
|
||||||
|
wget -q --post-file="$POSTFILE" -O "$RESPONSEFILE" --header="Content-Type: text/xml" $REPORT_TO
|
||||||
|
checkerror $RESPONSEFILE
|
||||||
|
grepfor='type="'$BANTYPE'"'
|
||||||
|
for i in `grep 'listed="1"' $RESPONSEFILE | grep $grepfor | grep -E -o -e '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sort -u`; do
|
||||||
|
IPLIST=( ${IPLIST[@]%%$i} )
|
||||||
|
echo "$i is already active in the DroneBL database as ban type $BANTYPE. Removing."
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${#IPLIST[@]} -eq 0 ]; then
|
||||||
|
echo "No hosts to report. Exiting."
|
||||||
|
exit 0
|
||||||
|
elif [ ${#IPLIST[@]} -eq 1 ]; then
|
||||||
|
echo -n "Reporting ${IPLIST[@]} as ban type $BANTYPE... "
|
||||||
|
else
|
||||||
|
echo -n "Reporting ${#IPLIST[@]} hosts as ban type $BANTYPE... "
|
||||||
|
fi
|
||||||
|
echo "<?xml version=\"1.0\"?>
|
||||||
|
<request key='"$RPCKEY"'>" >$POSTFILE
|
||||||
|
for i in ${IPLIST[@]}; do
|
||||||
|
if [ "`echo ${i}. | grep -E '^([0-9]{1,3}\.){4}$'`" != "" ]; then echo " <add ip='$i' type='$BANTYPE' />" >>$POSTFILE; fi
|
||||||
|
done
|
||||||
|
echo "</request>" >>$POSTFILE
|
||||||
|
wget -q --post-file="$POSTFILE" -O "$RESPONSEFILE" --header="Content-Type: text/xml" $REPORT_TO
|
||||||
|
checkerror $RESPONSEFILE
|
||||||
|
echo "done."
|
||||||
|
rm -f /tmp/dronebl*.xml
|
||||||
|
exit 0
|
65
floodbl.py
65
floodbl.py
@ -1,6 +1,9 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# FloodBL - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
|
# FloodBL - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
|
||||||
|
|
||||||
|
# This script will check a list of proxies aginst DNS Blackhole (DNSBL) lists to see if they are blackholed.
|
||||||
|
# Todo: Add support for asynchronous DNSBL lookups and proper IPv6 support.
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import concurrent.futures
|
import concurrent.futures
|
||||||
import ipaddress
|
import ipaddress
|
||||||
@ -48,7 +51,12 @@ blackholes = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def check(proxy):
|
def check(proxy: str):
|
||||||
|
'''
|
||||||
|
Check if a proxy is blackholed.
|
||||||
|
|
||||||
|
:param proxy: the proxy to check in the format of ip:port
|
||||||
|
'''
|
||||||
proxy_ip = proxy.split(':')[0]
|
proxy_ip = proxy.split(':')[0]
|
||||||
formatted_ip = ipaddress.ip_address(proxy_ip).reverse_pointer
|
formatted_ip = ipaddress.ip_address(proxy_ip).reverse_pointer
|
||||||
for blackhole in blackholes:
|
for blackhole in blackholes:
|
||||||
@ -72,32 +80,41 @@ def check(proxy):
|
|||||||
if proxy not in bad:
|
if proxy not in bad:
|
||||||
good.append(proxy)
|
good.append(proxy)
|
||||||
|
|
||||||
# Main
|
|
||||||
print('#'*56)
|
if __name__ == '__main__':
|
||||||
print('#{0}#'.format(''.center(54)))
|
print('#'*56)
|
||||||
print('#{0}#'.format('FloodBL Blackhole Checker'.center(54)))
|
print('#{0}#'.format(''.center(54)))
|
||||||
print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
|
print('#{0}#'.format('FloodBL Blackhole Checker'.center(54)))
|
||||||
print('#{0}#'.format('https://git.acid.vegas/proxytools'.center(54)))
|
print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
|
||||||
print('#{0}#'.format(''.center(54)))
|
print('#{0}#'.format('https://git.acid.vegas/proxytools'.center(54)))
|
||||||
print('#'*56)
|
print('#{0}#'.format(''.center(54)))
|
||||||
parser = argparse.ArgumentParser(usage='%(prog)s <input> <output> [options]')
|
print('#'*56)
|
||||||
parser.add_argument('input', help='file to scan')
|
|
||||||
parser.add_argument('output', help='file to output')
|
parser = argparse.ArgumentParser(usage='%(prog)s <input> <output> [options]')
|
||||||
parser.add_argument('-t', '--threads', help='number of threads (default: 100)', default=100, type=int)
|
parser.add_argument('input', help='file to scan')
|
||||||
args = parser.parse_args()
|
parser.add_argument('output', help='file to output')
|
||||||
if not os.path.isfile(args.input):
|
parser.add_argument('-t', '--threads', help='number of threads (default: 100)', default=100, type=int)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if not os.path.isfile(args.input):
|
||||||
raise SystemExit('no such input file')
|
raise SystemExit('no such input file')
|
||||||
initial = len(open(args.input).readlines())
|
|
||||||
proxies = set([proxy.split(':')[0] for proxy in re.findall('[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+', open(args.input).read(), re.MULTILINE)]) # TODO: handle IPv6 better
|
initial = len(open(args.input).readlines())
|
||||||
if not proxies:
|
proxies = set([proxy.split(':')[0] for proxy in re.findall('[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+', open(args.input).read(), re.MULTILINE)]) # TODO: handle IPv6 better
|
||||||
|
|
||||||
|
if not proxies:
|
||||||
raise SystemExit('no proxies found from input file')
|
raise SystemExit('no proxies found from input file')
|
||||||
with concurrent.futures.ThreadPoolExecutor(max_workers=args.threads) as executor:
|
|
||||||
|
with concurrent.futures.ThreadPoolExecutor(max_workers=args.threads) as executor:
|
||||||
checks = {executor.submit(check, proxy): proxy for proxy in proxies}
|
checks = {executor.submit(check, proxy): proxy for proxy in proxies}
|
||||||
for future in concurrent.futures.as_completed(checks):
|
for future in concurrent.futures.as_completed(checks):
|
||||||
checks[future]
|
checks[future]
|
||||||
good.sort()
|
|
||||||
with open(args.output, 'w') as output_file:
|
good.sort()
|
||||||
|
|
||||||
|
with open(args.output, 'w') as output_file:
|
||||||
output_file.write('\n'.join(good))
|
output_file.write('\n'.join(good))
|
||||||
print('\033[34mTotal\033[0m : ' + format(len(proxies), ',d'))
|
|
||||||
print('\033[34mGood\033[0m : ' + format(len(good), ',d'))
|
print('\033[34mTotal\033[0m : ' + format(len(proxies), ',d'))
|
||||||
print('\033[34mBad\033[0m : ' + format(len(proxies)-len(good), ',d'))
|
print('\033[34mGood\033[0m : ' + format(len(good), ',d'))
|
||||||
|
print('\033[34mBad\033[0m : ' + format(len(proxies)-len(good), ',d'))
|
||||||
|
57
proxy_sources.txt
Normal file
57
proxy_sources.txt
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
https://api.openproxylist.xyz/socks4.txt
|
||||||
|
https://api.openproxylist.xyz/socks5.txt
|
||||||
|
https://api.proxyscrape.com/?request=displayproxies&proxytype=socks4
|
||||||
|
https://api.proxyscrape.com/v2/?request=displayproxies&protocol=socks4
|
||||||
|
https://api.proxyscrape.com/?request=displayproxies&proxytype=socks5
|
||||||
|
https://api.proxyscrape.com/v2/?request=displayproxies&protocol=socks5
|
||||||
|
https://proxy-list.download/api/v1/get?type=socks4
|
||||||
|
https://proxy-list.download/api/v1/get?type=socks5
|
||||||
|
https://proxyscan.io/download?type=socks4
|
||||||
|
https://proxyscan.io/download?type=socks5
|
||||||
|
https://proxyspace.pro/socks4.txt
|
||||||
|
https://proxyspace.pro/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/ALIILAPRO/Proxy/main/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/ALIILAPRO/Proxy/main/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/B4RC0DE-TM/proxy-list/main/SOCKS4.txt
|
||||||
|
https://raw.githubusercontent.com/B4RC0DE-TM/proxy-list/main/SOCKS5.txt
|
||||||
|
https://raw.githubusercontent.com/hookzof/socks5_list/master/proxy.txt
|
||||||
|
https://raw.githubusercontent.com/HyperBeats/proxy-list/main/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/HyperBeats/proxy-list/main/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/txt/proxies-socks4.txt
|
||||||
|
https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/txt/proxies-socks5.txt
|
||||||
|
https://raw.githubusercontent.com/manuGMG/proxy-365/main/SOCKS4.txt
|
||||||
|
https://raw.githubusercontent.com/manuGMG/proxy-365/main/SOCKS5.txt
|
||||||
|
https://raw.githubusercontent.com/mmpx12/proxy-list/master/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/mmpx12/proxy-list/master/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/monosans/proxy-list/main/proxies/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/monosans/proxy-list/main/proxies/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/monosans/proxy-list/main/proxies_anonymous/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/monosans/proxy-list/main/proxies_anonymous/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/MuRongPIG/Proxy-Master/main/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/MuRongPIG/Proxy-Master/main/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/officialputuid/KangProxy/KangProxy/socks5/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/officialputuid/KangProxy/KangProxy/socks5/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/prxchk/proxy-list/main/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/prxchk/proxy-list/main/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/rdavydov/proxy-list/main/proxies/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/rdavydov/proxy-list/main/proxies/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/rdavydov/proxy-list/main/proxies_anonymous/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/rdavydov/proxy-list/main/proxies_anonymous/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/roosterkid/openproxylist/main/SOCKS4_RAW.txt
|
||||||
|
https://raw.githubusercontent.com/roosterkid/openproxylist/main/SOCKS5_RAW.txt
|
||||||
|
https://raw.githubusercontent.com/RX4096/proxy-list/main/online/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/RX4096/proxy-list/main/online/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/saschazesiger/Free-Proxies/master/proxies/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/saschazesiger/Free-Proxies/master/proxies/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/UptimerBot/proxy-list/main/proxies/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/UptimerBot/proxy-list/main/proxies/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/Zaeem20/FREE_PROXIES_LIST/master/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/Zaeem20/FREE_PROXIES_LIST/master/socks5.txt
|
||||||
|
https://raw.githubusercontent.com/zevtyardt/proxy-list/main/socks4.txt
|
||||||
|
https://raw.githubusercontent.com/zevtyardt/proxy-list/main/socks5.txt
|
||||||
|
https://spys.me/socks.txt
|
||||||
|
https://spys.one/en/socks-proxy-list/
|
126
pythonproxy.md
Normal file
126
pythonproxy.md
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
# Proxy usage with Python
|
||||||
|
|
||||||
|
## [aiosocks](https://pypi.org/project/aiosocks/)
|
||||||
|
|
||||||
|
```python
|
||||||
|
import asyncio
|
||||||
|
import aiosocks
|
||||||
|
|
||||||
|
async def proxy_example(proxy: str, use_ssl: bool = False):
|
||||||
|
'''Proxy can be in IP:PORT format or USER:PASS@IP:PORT format'''
|
||||||
|
|
||||||
|
auth = proxy.split('@')[0].split(':') if '@' in proxy else None
|
||||||
|
proxy_ip, proxy_port = proxy.split('@')[1].split(':') if '@' in proxy else proxy.split(':')
|
||||||
|
|
||||||
|
options = {
|
||||||
|
'proxy' : aiosocks.Socks5Addr(proxy_ip, proxy_port),
|
||||||
|
'proxy_auth' : aiosocks.Socks5Auth(*auth) if auth else None,
|
||||||
|
'dst' : (host, port),
|
||||||
|
'limit' : 1024,
|
||||||
|
'ssl' : ssl._create_unverified_context() if use_ssl else None,
|
||||||
|
'family' : 2 # 2 = IPv4 | 10 = IPv6
|
||||||
|
}
|
||||||
|
|
||||||
|
reader, writer = await asyncio.wait_for(aiosocks.open_connection(**options), 15) # 15 second timeout
|
||||||
|
|
||||||
|
while True:
|
||||||
|
data = await asyncio.wait_for(reader.readuntil(b'\r\n'), 300) # 5 minute timeout on no data received
|
||||||
|
print(data.decode().strip()) # Print the response from the server
|
||||||
|
```
|
||||||
|
|
||||||
|
## [aiohttp](https://pypi.org/project/aiohttp)
|
||||||
|
```python
|
||||||
|
import asyncio
|
||||||
|
import aiohttp
|
||||||
|
|
||||||
|
async def proxy_example(proxy: str, url: str):
|
||||||
|
'''Proxy can be in IP:PORT format or USER:PASS@IP:PORT format'''
|
||||||
|
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
async with session.get('https://google.com', proxy=f'http://{proxy}', timeout=15) as response:
|
||||||
|
if response.status == 200: # 200 = success
|
||||||
|
print(response.text()) # Print the response from the server
|
||||||
|
```
|
||||||
|
|
||||||
|
## [http.client](https://docs.python.org/3/library/http.client.html)
|
||||||
|
I really don't use this library much at all, so this is some LM generated function...
|
||||||
|
|
||||||
|
```python
|
||||||
|
import base64
|
||||||
|
import http.client
|
||||||
|
|
||||||
|
def proxy_example(proxy: str, url):
|
||||||
|
'''Proxy can be in IP:PORT format or USER:PASS@IP:PORT format'''
|
||||||
|
|
||||||
|
auth = proxy.split('@')[0].split(':') if '@' in proxy else None
|
||||||
|
proxy_host, proxy_port = proxy.split('@')[1].split(':') if '@' in proxy else proxy.split(':')
|
||||||
|
|
||||||
|
scheme, rest = url.split('://', 1)
|
||||||
|
host, path = rest.split('/', 1)
|
||||||
|
path = '/' + path
|
||||||
|
|
||||||
|
if scheme == 'https':
|
||||||
|
conn = http.client.HTTPConnection(proxy_host, proxy_port)
|
||||||
|
conn.request('CONNECT', host)
|
||||||
|
response = conn.getresponse()
|
||||||
|
if response.status != 200:
|
||||||
|
print("Failed to establish a tunnel via proxy.")
|
||||||
|
print(response.status, response.reason)
|
||||||
|
return
|
||||||
|
conn = http.client.HTTPSConnection(proxy_host, proxy_port, context=None)
|
||||||
|
conn.set_tunnel(host)
|
||||||
|
else:
|
||||||
|
conn = http.client.HTTPConnection(proxy_host, proxy_port)
|
||||||
|
path = url
|
||||||
|
|
||||||
|
headers = {}
|
||||||
|
if auth:
|
||||||
|
auth = base64.b64encode(f'{auth[0]}:{auth[1]}'.encode()).decode()
|
||||||
|
headers['Proxy-Authorization'] = f'Basic {auth}'
|
||||||
|
|
||||||
|
|
||||||
|
conn.request('GET', path, headers=headers)
|
||||||
|
response = conn.getresponse()
|
||||||
|
print(response.status, response.reason)
|
||||||
|
if response.status == 200:
|
||||||
|
data = response.read()
|
||||||
|
print(data.decode())
|
||||||
|
|
||||||
|
conn.close()
|
||||||
|
```
|
||||||
|
|
||||||
|
## [requests](https://pypi.org/project/requests/)
|
||||||
|
```python
|
||||||
|
import requests
|
||||||
|
|
||||||
|
def proxy_example(proxy: str, url: str):
|
||||||
|
'''Proxy can be in IP:PORT format or USER:PASS@IP:PORT format'''
|
||||||
|
|
||||||
|
proxy_handler = {'http': 'http://'+proxy, 'https': 'https://'+proxy}
|
||||||
|
response = requests.get(url, proxies=proxies)
|
||||||
|
print(response.text)
|
||||||
|
```
|
||||||
|
|
||||||
|
## [urllib.request](https://docs.python.org/3/library/urllib.html)
|
||||||
|
```python
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
|
def proxy_example(proxy: str, url: str):
|
||||||
|
'''Proxy can be in IP:PORT format or USER:PASS@IP:PORT format'''
|
||||||
|
|
||||||
|
proxy_handler = urllib.request.ProxyHandler({'http': proxy, 'https': proxy})
|
||||||
|
opener = urllib.request.build_opener(proxy_handler)
|
||||||
|
|
||||||
|
if '@' in proxy: # Handle authentication
|
||||||
|
creds, address = proxy.split('@')
|
||||||
|
username, password = creds.split(':')
|
||||||
|
auth_header = urllib.request.HTTPBasicAuthHandler()
|
||||||
|
auth_header.add_password(realm=None, uri=proxy, user=username, passwd=password)
|
||||||
|
opener.add_handler(auth_header)
|
||||||
|
|
||||||
|
urllib.request.install_opener(opener)
|
||||||
|
|
||||||
|
response = urllib.request.urlopen(url, timeout=15)
|
||||||
|
if response.code == 200:
|
||||||
|
print(response.read().decode())
|
||||||
|
```
|
20
shellscrape
20
shellscrape
@ -1,20 +0,0 @@
|
|||||||
#!/bin/env bash
|
|
||||||
# shellscrape - developed by acidvegas (https://git.acid.vegas/proxytools)
|
|
||||||
|
|
||||||
URLS=(
|
|
||||||
"https://raw.githubusercontent.com/ALIILAPRO/Proxy/main/socks4.txt"
|
|
||||||
"https://raw.githubusercontent.com/ALIILAPRO/Proxy/main/socks5.txt"
|
|
||||||
"https://raw.githubusercontent.com/B4RC0DE-TM/proxy-list/main/SOCKS4.txt"
|
|
||||||
"https://raw.githubusercontent.com/B4RC0DE-TM/proxy-list/main/SOCKS5.txt"
|
|
||||||
"https://raw.githubusercontent.com/hookzof/socks5_list/master/proxy.txt"
|
|
||||||
"https://raw.githubusercontent.com/HyperBeats/proxy-list/main/socks4.txt"
|
|
||||||
"https://raw.githubusercontent.com/HyperBeats/proxy-list/main/socks5.txt"
|
|
||||||
)
|
|
||||||
|
|
||||||
[ -f proxies.txt ] >proxies.txt
|
|
||||||
for URL in "${URLS[@]}"; do
|
|
||||||
echo "Downloading from $URL"
|
|
||||||
curl -s $URL >> proxies.txt &
|
|
||||||
done
|
|
||||||
sort -u -o proxies.txt proxies.txt
|
|
||||||
echo "done"
|
|
34
shellsocked
Executable file
34
shellsocked
Executable file
@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/env bash
|
||||||
|
# shellsocked - developed by acidvegas (https://git.acid.vegas/proxytools)
|
||||||
|
|
||||||
|
# Probably the most basic proxy scraper ever made, pure POSIX, no dependencies, no bullshit.
|
||||||
|
# Duplicate proxies are removed and the output is sorted and saved to a file.
|
||||||
|
# Feed it a single URL or a file with a list of URLs to scrape.
|
||||||
|
|
||||||
|
scrape_url() {
|
||||||
|
local url="$1"
|
||||||
|
local proxies=$(curl -s -A "ShellSocked/1.0" "$url" | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+' | awk '!seen[$0]++')
|
||||||
|
local count=$(echo "$proxies" | wc -l)
|
||||||
|
PROXIES="${PROXIES}${proxies}"
|
||||||
|
echo -e "Found \033[32m${count}\033[0m proxies on \033[33m${url}\033[0m"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
PROXIES=""
|
||||||
|
if [ -f "$1" ]; then
|
||||||
|
while IFS= read -r url; do
|
||||||
|
scrape_url "$url"
|
||||||
|
done < "$1"
|
||||||
|
else
|
||||||
|
scrape_url "$1"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Usage: $0 <input_file | single_url>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
PROXIES=$(printf "%s\n" "$PROXIES" | sort -u)
|
||||||
|
printf "%s\n" "$PROXIES" > proxies.txt
|
||||||
|
|
||||||
|
total_count=$(echo "$PROXIES" | wc -l)
|
||||||
|
echo "Grand Total: ${total_count} proxies"
|
157
sockhub.py
157
sockhub.py
@ -1,111 +1,72 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# SockHub Proxy Scraper - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
|
# SockHub Proxy Scraper - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
|
||||||
|
|
||||||
|
'''
|
||||||
|
There is a file in this repository called proxy_sources.txt which contains a list of URLs to scrape for proxies.
|
||||||
|
This list it not maintained and may contain dead links or links to sites that no longer contain proxies.
|
||||||
|
'''
|
||||||
|
|
||||||
|
import concurrent.futures
|
||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import urllib.request
|
import urllib.request
|
||||||
|
|
||||||
# Can be any URL containing a list of IP:PORT proxies (does not have to be socks5)
|
# Global
|
||||||
# The current list contains proxy sources that are updated frequently with new proxies
|
|
||||||
# Almost all of the Github repos pull from the same place & contain duplicates (which are removed)
|
|
||||||
urls = set((
|
|
||||||
'https://api.openproxylist.xyz/socks4.txt',
|
|
||||||
'https://api.openproxylist.xyz/socks5.txt',
|
|
||||||
'https://api.proxyscrape.com/?request=displayproxies&proxytype=socks4',
|
|
||||||
'https://api.proxyscrape.com/v2/?request=displayproxies&protocol=socks4',
|
|
||||||
'https://api.proxyscrape.com/?request=displayproxies&proxytype=socks5',
|
|
||||||
'https://api.proxyscrape.com/v2/?request=displayproxies&protocol=socks5',
|
|
||||||
'https://proxy-list.download/api/v1/get?type=socks4',
|
|
||||||
'https://proxy-list.download/api/v1/get?type=socks5',
|
|
||||||
'https://proxyscan.io/download?type=socks4',
|
|
||||||
'https://proxyscan.io/download?type=socks5',
|
|
||||||
'https://proxyspace.pro/socks4.txt',
|
|
||||||
'https://proxyspace.pro/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/ALIILAPRO/Proxy/main/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/ALIILAPRO/Proxy/main/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/B4RC0DE-TM/proxy-list/main/SOCKS4.txt',
|
|
||||||
'https://raw.githubusercontent.com/B4RC0DE-TM/proxy-list/main/SOCKS5.txt',
|
|
||||||
'https://raw.githubusercontent.com/hookzof/socks5_list/master/proxy.txt',
|
|
||||||
'https://raw.githubusercontent.com/HyperBeats/proxy-list/main/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/HyperBeats/proxy-list/main/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/txt/proxies-socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/txt/proxies-socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/manuGMG/proxy-365/main/SOCKS4.txt',
|
|
||||||
'https://raw.githubusercontent.com/manuGMG/proxy-365/main/SOCKS5.txt',
|
|
||||||
'https://raw.githubusercontent.com/mmpx12/proxy-list/master/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/mmpx12/proxy-list/master/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/monosans/proxy-list/main/proxies/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/monosans/proxy-list/main/proxies/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/monosans/proxy-list/main/proxies_anonymous/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/monosans/proxy-list/main/proxies_anonymous/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/MuRongPIG/Proxy-Master/main/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/MuRongPIG/Proxy-Master/main/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/officialputuid/KangProxy/KangProxy/socks5/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/officialputuid/KangProxy/KangProxy/socks5/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/prxchk/proxy-list/main/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/prxchk/proxy-list/main/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/rdavydov/proxy-list/main/proxies/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/rdavydov/proxy-list/main/proxies/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/rdavydov/proxy-list/main/proxies_anonymous/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/rdavydov/proxy-list/main/proxies_anonymous/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/roosterkid/openproxylist/main/SOCKS4_RAW.txt',
|
|
||||||
'https://raw.githubusercontent.com/roosterkid/openproxylist/main/SOCKS5_RAW.txt',
|
|
||||||
'https://raw.githubusercontent.com/RX4096/proxy-list/main/online/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/RX4096/proxy-list/main/online/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/saschazesiger/Free-Proxies/master/proxies/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/saschazesiger/Free-Proxies/master/proxies/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/ShiftyTR/Proxy-List/master/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/UptimerBot/proxy-list/main/proxies/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/UptimerBot/proxy-list/main/proxies/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/Zaeem20/FREE_PROXIES_LIST/master/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/Zaeem20/FREE_PROXIES_LIST/master/socks5.txt',
|
|
||||||
'https://raw.githubusercontent.com/zevtyardt/proxy-list/main/socks4.txt',
|
|
||||||
'https://raw.githubusercontent.com/zevtyardt/proxy-list/main/socks5.txt',
|
|
||||||
'https://spys.me/socks.txt',
|
|
||||||
'https://spys.one/en/socks-proxy-list/'
|
|
||||||
))
|
|
||||||
|
|
||||||
def get_source(url: str) -> str:
|
|
||||||
''' Get the source of a URL using a Googlebot user-agent. '''
|
|
||||||
req = urllib.request.Request(url)
|
|
||||||
req.add_header('User-Agent', 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)')
|
|
||||||
source = urllib.request.urlopen(req, timeout=15)
|
|
||||||
return source.read().decode()
|
|
||||||
|
|
||||||
# Main
|
|
||||||
print('#'*56)
|
|
||||||
print('#{0}#'.format(''.center(54)))
|
|
||||||
print('#{0}#'.format('SockHub Proxy Scraper'.center(54)))
|
|
||||||
print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
|
|
||||||
print('#{0}#'.format('https://git.acid.vegas/proxytools'.center(54)))
|
|
||||||
print('#{0}#'.format(''.center(54)))
|
|
||||||
print('#'*56)
|
|
||||||
total = 0
|
|
||||||
proxies = list()
|
proxies = list()
|
||||||
proxy_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'proxies.txt')
|
|
||||||
print('scanning \033[35m{0:,}\033[0m urls from list...'.format(len(urls)))
|
def find_proxies(url: str) -> str:
|
||||||
for url in urls: # TODO: Maybe add concurrent.futures support for using larger lists
|
'''
|
||||||
|
Check a URL for IP:PORT proxies.
|
||||||
|
|
||||||
|
:param url: The URL to check for proxies.
|
||||||
|
'''
|
||||||
try:
|
try:
|
||||||
source = get_source(url)
|
source = urllib.request.urlopen(urllib.request.Request(url, headers={'User-Agent': 'SockHub/1.0'})).read().decode()
|
||||||
except:
|
if source:
|
||||||
print('found \033[31m0\033[0m new proxies on \033[34m{0}\033[0m \033[30m(failed to load)\033[0m'.format(url))
|
found = set(re.findall('[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+', source, re.MULTILINE))
|
||||||
|
if (new_proxies := [proxy for proxy in found if proxy not in proxies]):
|
||||||
|
proxies += new_proxies
|
||||||
|
print(f'found \033[32m{len(found):,}\033[0m new proxies on \033[34m{url}\033[0m')
|
||||||
else:
|
else:
|
||||||
total+= len(source.split())
|
logging.warning(f'found \033[31m0\033[0m new proxies on \033[34m{url}\033[0m \033[30m(source is empty)\033[0m')
|
||||||
found = set([proxy for proxy in re.findall('[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+', source, re.MULTILINE) if proxy not in proxies])
|
except Exception as ex:
|
||||||
if found:
|
logging.error(f'found \033[31m0\033[0m new proxies on \033[34m{url}\033[0m \033[30m({ex})\033[0m')
|
||||||
proxies += found
|
|
||||||
print('found \033[32m{0:,}\033[0m new proxies on \033[34m{1}\033[0m'.format(len(found), url))
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import argparse
|
||||||
|
parser = argparse.ArgumentParser(description='SockHub Proxy Scraper - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)')
|
||||||
|
parser.add_argument('-i', '--input', help='input file containing a list of URLs to scrape (one per line) or a single URL')
|
||||||
|
parser.add_argument('-o', '--output', help='output file to save proxies to', default='proxies.txt')
|
||||||
|
parser.add_argument('-c', '--concurrency', help='number of concurrent threads to use (default: 10)', default=10, type=int)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
logging.basicConfig(format='%(message)s', level=logging.INFO)
|
||||||
|
|
||||||
|
if not os.path.isfile(args.input):
|
||||||
|
if args.input.startswith('https://') or args.input.startswith('http://'):
|
||||||
|
logging.info('using input as a single url...')
|
||||||
|
proxy_sources = [args.input]
|
||||||
else:
|
else:
|
||||||
print('found \033[31m0\033[0m new proxies on \033[34m{0}\033[0m \033[30m(duplicates)\033[0m'.format(url))
|
logging.fatal('input file does not exist!')
|
||||||
if proxies:
|
|
||||||
if len(proxies) < total:
|
proxy_sources = open(args.input, 'r').read().split('\n')
|
||||||
print('found \033[32m{0:,}\033[0m total proxies! \033[30m({1:,} duplicates removed)\033[0m'.format(len(proxies), total-len(proxies)))
|
|
||||||
else:
|
if not proxy_sources:
|
||||||
print('found \033[32m{0:,}\033[0m total proxies!'.format(len(proxies)))
|
logging.fatal('proxy sources input file is empty!')
|
||||||
|
|
||||||
|
logging.debug('scanning \033[35m{len(urls):,}\033[0m urls from list...')
|
||||||
|
|
||||||
|
with concurrent.futures.ThreadPoolExecutor(max_workers=args.concurrency) as executor:
|
||||||
|
futures = [executor.submit(find_proxies, url) for url in proxy_sources]
|
||||||
|
concurrent.futures.wait(futures)
|
||||||
|
|
||||||
|
if proxies:
|
||||||
|
logging.info('found \033[32m{len(proxies):,}\033[0m total proxies!')
|
||||||
proxies.sort()
|
proxies.sort()
|
||||||
with open (proxy_file, 'w') as proxy__file:
|
with open (args.output, 'w') as output_file:
|
||||||
for proxy in proxies:
|
for proxy in proxies:
|
||||||
proxy__file.write(proxy + '\n')
|
output_file.write(proxy + '\n')
|
||||||
|
else:
|
||||||
|
logging.warning('no proxies found!')
|
||||||
|
16
torglass.py
16
torglass.py
@ -1,7 +1,11 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# Tor Glass - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
|
# Tor Glass - Developed by acidvegas in Python (https://git.acid.vegas/proxytools)
|
||||||
|
|
||||||
import json
|
'''
|
||||||
|
A simple script to pull a list of all the Tor relays / exit nodes & generate a json database.
|
||||||
|
|
||||||
|
The example below will generate a map of all the Tor relays / exit nodes using the ipinfo.io API.
|
||||||
|
'''
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import stem.descriptor.remote
|
import stem.descriptor.remote
|
||||||
@ -52,20 +56,26 @@ def get_descriptors() -> dict:
|
|||||||
tor_map['relay'].append(data)
|
tor_map['relay'].append(data)
|
||||||
return tor_map
|
return tor_map
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
import json
|
||||||
|
|
||||||
print('loading Tor descriptors... (this could take a while)')
|
print('loading Tor descriptors... (this could take a while)')
|
||||||
tor_data = get_descriptors()
|
tor_data = get_descriptors()
|
||||||
|
|
||||||
with open('tor.json', 'w') as fd:
|
with open('tor.json', 'w') as fd:
|
||||||
json.dump(tor_data['relay'], fd)
|
json.dump(tor_data['relay'], fd)
|
||||||
with open('tor.exit.json', 'w') as fd:
|
with open('tor.exit.json', 'w') as fd:
|
||||||
json.dump(tor_data['exit'], fd)
|
json.dump(tor_data['exit'], fd)
|
||||||
|
|
||||||
print('Relays: {0:,}'.foramt(len(tor_data['relay'])))
|
print('Relays: {0:,}'.foramt(len(tor_data['relay'])))
|
||||||
print('Exits : {0:,}'.format(len(tor_data['exit'])))
|
print('Exits : {0:,}'.format(len(tor_data['exit'])))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import ipinfo
|
import ipinfo
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print('missing optional library \'ipinfo\' (https://pypi.org/project/ipinfo/) for map visualization')
|
raise ImportError('missing optional library \'ipinfo\' (https://pypi.org/project/ipinfo/) for map visualization')
|
||||||
else:
|
|
||||||
try:
|
try:
|
||||||
handler = ipinfo.getHandler('changeme') # put your ipinfo.io API key here
|
handler = ipinfo.getHandler('changeme') # put your ipinfo.io API key here
|
||||||
print('Relay Map: ' + handler.getMap([ip['address'] for ip in tor_data['relay']]))
|
print('Relay Map: ' + handler.getMap([ip['address'] for ip in tor_data['relay']]))
|
||||||
|
20
tortest.py
20
tortest.py
@ -19,8 +19,12 @@ EXIT_FINGERPRINT = '379FB450010D17078B3766C2273303C358C3A442' # https://metrics.
|
|||||||
SOCKS_PORT = 9050
|
SOCKS_PORT = 9050
|
||||||
CONNECTION_TIMEOUT = 30 # timeout before we give up on a circuit
|
CONNECTION_TIMEOUT = 30 # timeout before we give up on a circuit
|
||||||
|
|
||||||
def query(url):
|
def query(url: str):
|
||||||
''' Uses pycurl to fetch a site using the proxy on the SOCKS_PORT. '''
|
'''
|
||||||
|
Uses pycurl to fetch a site using the proxy on the SOCKS_PORT.
|
||||||
|
|
||||||
|
:param url: the url to fetch
|
||||||
|
'''
|
||||||
output = io.StringIO.StringIO()
|
output = io.StringIO.StringIO()
|
||||||
query = pycurl.Curl()
|
query = pycurl.Curl()
|
||||||
query.setopt(pycurl.URL, url)
|
query.setopt(pycurl.URL, url)
|
||||||
@ -36,7 +40,12 @@ def query(url):
|
|||||||
raise ValueError("Unable to reach %s (%s)" % (url, exc))
|
raise ValueError("Unable to reach %s (%s)" % (url, exc))
|
||||||
|
|
||||||
def scan(controller, path):
|
def scan(controller, path):
|
||||||
''' Test the connection to a website through the given path of relays using the given controller '''
|
'''
|
||||||
|
Test the connection to a website through the given path of relays using the given controller.
|
||||||
|
|
||||||
|
:param controller: the controller to use
|
||||||
|
:param path: a list of fingerprints, in order, to build a path through
|
||||||
|
'''
|
||||||
circuit_id = controller.new_circuit(path, await_build = True)
|
circuit_id = controller.new_circuit(path, await_build = True)
|
||||||
def attach_stream(stream):
|
def attach_stream(stream):
|
||||||
if stream.status == 'NEW':
|
if stream.status == 'NEW':
|
||||||
@ -54,8 +63,9 @@ def scan(controller, path):
|
|||||||
controller.reset_conf('__LeaveStreamsUnattached')
|
controller.reset_conf('__LeaveStreamsUnattached')
|
||||||
|
|
||||||
# Main
|
# Main
|
||||||
with stem.control.Controller.from_port(port=9056) as controller:
|
if __name__ == '__main__':
|
||||||
controller.authenticate('loldongs')
|
with stem.control.Controller.from_port(port=9056) as controller:
|
||||||
|
controller.authenticate('CHANGEME') # Change this to your Tor control password
|
||||||
relay_fingerprints = [desc.fingerprint for desc in controller.get_network_statuses()]
|
relay_fingerprints = [desc.fingerprint for desc in controller.get_network_statuses()]
|
||||||
for fingerprint in relay_fingerprints:
|
for fingerprint in relay_fingerprints:
|
||||||
try:
|
try:
|
||||||
|
Loading…
Reference in New Issue
Block a user