updates per neale's suggestions (more to come)

This commit is contained in:
Curt Hash 2009-10-07 19:02:57 -06:00
parent b5c517e2c0
commit 402cd03be5
1 changed files with 89 additions and 33 deletions

View File

@ -7,30 +7,71 @@ import time
import socket import socket
import urllib.request import urllib.request
# TODO:
# special stops for http and tftp?
# get start time and end time of poll, sleep(60-exectime)
# what to do about exceptions
# no nested dicts
# scoring interface
# config interface
# html that uses the proper css
DEBUG = True DEBUG = True
POLL_INTERVAL = 2 POLL_INTERVAL = 2
IP_DIR = 'iptest/' IP_DIR = 'iptest/'
REPORT_PATH = 'iptest/pollster.html' REPORT_PATH = 'iptest/pollster.html'
SOCK_TIMEOUT = 0.5
def socket_poll(ip, port, msg): def socket_poll(ip, port, msg, prot, max_recv=1):
''' Connect via socket to the specified (ip, port), send ''' Connect via socket to the specified <ip>:<port> using the
the specified msg and return the response or None if something specified <prot>, send the specified <msg> and return the
went wrong. ''' response or None if something went wrong. <max_recvs> specifies
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) how many times to read from the socket. '''
# create a socket
try:
sock = socket.socket(socket.AF_INET, prot)
except Exception as e:
print('pollster: create socket failed')
return None
sock.settimeout(SOCK_TIMEOUT)
# connect
try: try:
sock.connect((ip, port)) sock.connect((ip, port))
except Exception as e: except socket.timeout as e:
print('pollster: attempt to connect to %s:%d timed out' % (ip, port))
return None return None
except Exception as e:
print('pollster: attempt to connect to %s:%d failed' % (ip, port))
return None
# send something
sock.send(msg) sock.send(msg)
resp = sock.recv(1024)
# get a response
resp = ''
try:
# first read
data = sock.recv(1024)
resp += data.decode('utf-8')
max_recv -= 1
# remaining reads as necessary until timeout or socket closes
while(len(data) > 0 and max_recv > 0):
data = sock.recv(1024)
resp += data.decode('utf-8')
max_recv -= 1
sock.close()
except socket.timeout as e:
print('pollster: timed out waiting for a response from %s:%d' % (ip, port))
except Exception as e:
print('pollster: receive from %s:%d failed' % (ip, port))
if len(resp) == 0: if len(resp) == 0:
return None return None
sock.close()
resp = resp.decode('utf-8')
return resp return resp
# PUT POLLS FUNCTIONS HERE # PUT POLLS FUNCTIONS HERE
@ -39,39 +80,51 @@ def socket_poll(ip, port, msg):
def poll_fingerd(ip): def poll_fingerd(ip):
''' Poll the fingerd service. ''' ''' Poll the fingerd service. '''
resp = socket_poll(ip, 79, b'flag\n') resp = socket_poll(ip, 79, b'flag\n', socket.SOCK_STREAM)
if resp is None: if resp is None:
return None return None
return resp.strip('\r\n') return resp.strip('\r\n')
def poll_noted(ip): def poll_noted(ip):
''' Poll the noted service. ''' ''' Poll the noted service. '''
resp = socket_poll(ip, 4000, b'rflag\n') resp = socket_poll(ip, 4000, b'rflag\n', socket.SOCK_STREAM)
if resp is None: if resp is None:
return None return None
return resp.strip('\r\n') return resp.strip('\r\n')
def poll_catcgi(ip): def poll_catcgi(ip):
''' Poll the cat.cgi web service. ''' ''' Poll the cat.cgi web service. '''
url = urllib.request.urlopen('http://%s/cat.cgi/flag' % ip) request = bytes('GET /cat.cgi/flag HTTP/1.1\r\nHost: %s\r\n\r\n' % ip, 'ascii')
data = url.read() resp = socket_poll(ip, 80, request, socket.SOCK_STREAM, 3)
if len(data) == 0: if resp is None:
return None return None
return data.strip('\r\n')
content = resp.split('\r\n\r\n')
if len(content) < 3:
return None
content = content[1].split('\r\n')
try:
content_len = int(content[0])
except Exception as e:
return None
if content_len <= 0:
return None
return content[1].strip('\r\n')
def poll_tftpd(ip): def poll_tftpd(ip):
''' Poll the ftp service. ''' ''' Poll the tftp service. '''
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) resp = socket_poll(ip, 69, b'\x00\x01' + b'flag' + b'\x00' + b'octet' + b'\x00', socket.SOCK_DGRAM)
sock.connect((ip, 69)) if resp is None:
return None
sock.send(b'\x00\x01' + b'flag' + b'\x00' + b'octet' + b'\x00')
resp = sock.recv(1024)
if len(resp) <= 5: if len(resp) <= 5:
return None return None
sock.close() resp = resp.split('\n')[0]
return resp[4:].strip('\r\n')
return resp[4:].decode('utf-8').strip('\r\n')
# PUT POLL FUNCTIONS IN HERE OR THEY WONT BE POLLED # PUT POLL FUNCTIONS IN HERE OR THEY WONT BE POLLED
POLLS = { POLLS = {
@ -86,13 +139,12 @@ ip_re = re.compile('(\d{1,3}\.){3}\d{1,3}')
# loop forever # loop forever
while(True): while(True):
# check that IP_DIR is there, exit if it isn't
if not os.path.isdir(IP_DIR):
sys.stderr.write('directory %s does not exist or is not readable\n' % IP_DIR)
sys.exit(1)
# gather the list of IPs to poll # gather the list of IPs to poll
ips = os.listdir(IP_DIR) try:
ips = os.listdir(IP_DIR)
except Exception as e:
print('pollster: could not list dir %s' % IP_DIR)
results = {} results = {}
for ip in ips: for ip in ips:
@ -100,7 +152,11 @@ while(True):
if ip_re.match(ip) is None: if ip_re.match(ip) is None:
continue continue
#os.remove(os.path.join(IP_DIR, ip)) # remove the file
#try:
# os.remove(os.path.join(IP_DIR, ip))
#except Exception as e:
# print('pollster: could not remove %s' % os.path.join(IP_DIR, ip))
results[ip] = {} results[ip] = {}