|
@@ -8,7 +8,7 @@ from flask.ext.migrate import Migrate, MigrateCommand
|
|
|
#from flask import session, request, url_for, redirect, render_template
|
|
|
|
|
|
import netaddr
|
|
|
-from netaddr import IPAddress, IPSet
|
|
|
+from netaddr import IPAddress, IPNetwork, IPSet
|
|
|
# Hack for python3
|
|
|
from netaddr.strategy.ipv4 import packed_to_int as unpack_v4
|
|
|
from netaddr.strategy.ipv6 import packed_to_int as unpack_v6
|
|
@@ -37,6 +37,10 @@ def unpack(ip):
|
|
|
def is_valid_ip(ip):
|
|
|
return netaddr.valid_ipv4(ip) or netaddr.valid_ipv6(ip)
|
|
|
|
|
|
+def is_forbidden_ip(ip):
|
|
|
+ # 0.0.0.0/8 is reserved, but for some reason, is_reserved() returns false
|
|
|
+ return ip.is_link_local() or ip.is_loopback() or ip.is_multicast() or ip.is_reserved() or (ip in IPNetwork('0.0.0.0/8'))
|
|
|
+
|
|
|
def resolve_name(hostname):
|
|
|
try:
|
|
|
return list({s[4][0] for s in socket.getaddrinfo(hostname, None)})
|
|
@@ -243,6 +247,10 @@ def submit_job():
|
|
|
targets = [Target(ip, public) for ip in resolve_name(target)]
|
|
|
if targets == []:
|
|
|
return render_template('submit_error.html', target=request.form['target'])
|
|
|
+ # Check for forbidden targets
|
|
|
+ for target in targets:
|
|
|
+ if is_forbidden_ip(target.get_ip()):
|
|
|
+ return render_template('submit_error_forbidden.html', ip=target.get_ip())
|
|
|
for t in targets:
|
|
|
db.session.add(t)
|
|
|
db.session.commit()
|