Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epsylon
GitHub Repository: epsylon/ufonet
Path: blob/master/core/tools/ufoscan.py
1208 views
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-"
3
"""
4
This file is part of the UFONet project, https://ufonet.03c8.net
5
6
Copyright (c) 2013/2024 | psy <[email protected]>
7
8
You should have received a copy of the GNU General Public License along
9
with UFONet; if not, write to the Free Software Foundation, Inc., 51
10
Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
11
"""
12
import sys, time, random
13
from urllib.parse import urlparse as urlparse
14
try:
15
from scapy import *
16
except:
17
print("\nError importing: scapy lib.\n")
18
sys.exit(2)
19
20
# UFONet port scanner (UFOSCAN) class
21
def randInt():
22
x = random.randint(1,65535) # TCP ports
23
return x
24
25
def scan(self, ip, port, openp, closed):
26
src_port = RandShort()
27
seq = randInt()
28
window = randInt()
29
p = IP(dst=ip)/TCP(sport=src_port, dport=port, seq=seq, window=window, flags='S')
30
resp = sr1(p, timeout=2)
31
if str(type(resp)) == "<type 'NoneType'>":
32
closed = closed + 1
33
elif resp.haslayer(TCP):
34
if resp.getlayer(TCP).flags == 0x12:
35
send_rst = sr(IP(dst=ip)/TCP(sport=src_port, dport=port, flags='AR'), timeout=1)
36
openp.append(port) # open port found!
37
print("\n" + "="*54)
38
print("[Info] [AI] [UFOSCAN] OPEN port found! [ " + str(port) + " ]")
39
print("="*54 + "\n")
40
elif resp.getlayer(TCP).flags == 0x14:
41
closed = closed + 1
42
return openp, closed
43
44
def is_up(ip):
45
p = IP(dst=ip)/ICMP()
46
resp = sr1(p, timeout=10)
47
if resp == None:
48
return False
49
elif resp.haslayer(ICMP):
50
return True
51
52
class UFOSCAN(object):
53
def scanning(self, target, portX, portY):
54
print("[Info] [AI] [UFOSCAN] Emitting X-Ray into range: [ "+str(portX)+"-"+str(portY)+" ]\n")
55
print("="*74, "\n")
56
if target.startswith('http://'):
57
target = target.replace('http://','')
58
elif target.startswith('https://'):
59
target = target.replace('https://','')
60
else:
61
print("[Error] [AI] [UFOSCAN] Target url not valid ("+target+")! -> It should starts with 'http(s)://'\n")
62
return
63
try:
64
ip = socket.gethostbyname(target)
65
except:
66
try:
67
import dns.resolver
68
r = dns.resolver.Resolver()
69
r.nameservers = ['8.8.8.8', '8.8.4.4'] # google DNS resolvers
70
url = urlparse(target)
71
a = r.query(url.netloc, "A") # A record
72
for rd in a:
73
ip = str(rd)
74
except:
75
ip = target
76
if ip == "127.0.0.1" or ip == "localhost":
77
print("[Info] [AI] [UFOSCAN] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n")
78
return
79
start_time = time.time()
80
try:
81
ports = list(range(int(portX), int(portY+1)))
82
except:
83
portX = 1
84
portY = 1024 # 1024
85
print("[Info] [AI] [UFOSCAN] Not any range of ports selected. Using by default: [ 1-1024 ]\n")
86
ports = list(range(int(portX), int(portY+1)))
87
portX = str(portX)
88
portY = str(portY+1)
89
if is_up(ip):
90
openp = []
91
closed = 0
92
print("\n" + "="*50)
93
print("[Info] [AI] [UFOSCAN] Host %s is UP!" % ip)
94
print("="*50)
95
print("\n"+"-"*22)
96
for port in ports:
97
try:
98
openp, closed = scan(self, ip, port, openp, closed)
99
except:
100
pass
101
duration = time.time()-start_time
102
print("="*70)
103
print("[Info] [AI] [UFOSCAN] Scan completed in: [ %s ]" % duration)
104
print("="*70)
105
if closed == len(ports):
106
print("\n[Info] [AI] [UFOSCAN] [ %s/%d ] CLOSED ports. -> [Exiting!]\n" % (closed, len(ports)-1))
107
else:
108
print("\n[Info] [AI] [UFOSCAN] [ %s/%d ] OPEN ports FOUND!\n" % (len(openp), len(ports)-1))
109
print("[+] TARGET: [ " + str(ip) + " ]\n")
110
for o in openp:
111
print(" [-] OPEN PORT: [ " + str(o) + " ]")
112
print("")
113
else:
114
duration = time.time()-start_time
115
print("-"*22)
116
print("="*50, "\n")
117
print("[Info] [AI] [UFOSCAN] Host %s is DOWN!" % ip)
118
print("\n[Info] [AI] [UFOSCAN] Scan completed in: [ %s ]" % duration + "\n")
119
120