Source code for tests.service_implementation

import socket

from .test import *

import http


[docs]class SMTPTest(Test): """Tests SMTP service implementation""" name = "SMTP Test" description = "Tests SMTP service implementation" karma_value = 60 doc_file = 'implementation.html'
[docs] def run(self): """Verify service implements all methods in the SMTP specification""" target_ports = self.target_honeypot.get_service_ports('smtp', 'tcp') if target_ports: for port in target_ports: self.check_smtp_implemented(self.target_honeypot.ip, port) if self.result == TestResult.WARNING: return else: self.set_result(TestResult.NOT_APPLICABLE, "Service not present")
[docs] def check_smtp_implemented(self, server_address, port=25): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(10) try: s.connect((server_address, port)) except socket.error as exception: self.set_result(TestResult.WARNING, "failed to connect to smtp server: ", exception.strerror) return recv = s.recv(1024) if recv[:3] != b'220': self.set_result(TestResult.WARNING, "220 response not received from smtp server") return else: self.set_result(TestResult.OK, "SMTP server OK") return
[docs]class HTTPTest(Test): """Tests HTTP service implementation""" name = "HTTP Test" description = "Tests HTTP service implementation" karma_value = 60 doc_file = 'implementation.html'
[docs] def run(self): """Verify service implements all methods in the HTTP specification""" target_ports = self.target_honeypot.get_service_ports('http', 'tcp') if target_ports: for port in target_ports: if port != 443: # TODO separate https when nmap parses incorrectly self.check_http_implemented(self.target_honeypot.ip, port) if self.result == TestResult.WARNING: return else: self.set_result(TestResult.NOT_APPLICABLE, "Service not present")
[docs] def check_http_implemented(self, server_address, port=80): # try a simple http.client request first try: conn = http.client.HTTPConnection(server_address, port=port, timeout=5) conn.request('HEAD', '/') conn.getresponse() self.set_result(TestResult.OK, "HTTP implemented") except Exception as e: # as a fallback measure run a manual test # TODO extend this s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(10) try: s.connect((server_address, port)) except socket.error as exception: self.set_result(TestResult.WARNING, "failed to connect to http server: ", exception.strerror) return try: s.sendall(b'GET / HTTP/1.1\r\n\r\n') # s.sendall(b'HEAD / HTTP/1.1\r\n\r\n') except socket.error as exception: self.set_result(TestResult.WARNING, "sending GET request to http server failed: ", exception.strerror) return recv = s.recv(4096) if recv[:15] == b'HTTP/1.1 200 OK': self.set_result(TestResult.OK, "http service responded with 200/OK") return else: self.set_result(TestResult.WARNING, "http service responded with unknown sequence: ", recv) return