| @ -0,0 +1,141 @@ | |||
| --- | |||
| title: Fail2Ban Honeypot | |||
| author: Brett Langdon | |||
| date: 2012-02-04 | |||
| template: article.jade | |||
| --- | |||
| How to use Python and Fail2Ban to write an auto-blocking honeypot. | |||
| --- | |||
| I have been practicing for the upcoming NECCDC competition and have been playing | |||
| around with various security concepts and one that I thought of trying was | |||
| creating a honeypot that automagically blocks ips when trapped. So what I have is | |||
| a honeypot script written in python that logs intruders to a log file and then a | |||
| <a href="http://fail2ban.org/" target="_blank">Fail2Ban</a> | |||
| definition that will block the ip address. So I will show you the Fail2Ban | |||
| honeypot that I have thrown together. | |||
| ## Installation | |||
| We first need to install | |||
| <a href="http://python.org/" target="_blank">python</a> and | |||
| <a href="http://fail2ban.org/" target="_blank">fail2ban</a>. | |||
| Installation process might be different depending which linux distribution | |||
| you are using. | |||
| ```bash | |||
| sudo apt-get install python fail2ban | |||
| ``` | |||
| ## Honeypot | |||
| Copy the following python script and create a file `honeypot.py`. | |||
| ```python | |||
| import socket | |||
| import threading | |||
| import sys | |||
| class HoneyThread(threading.Thread): | |||
| def __init__(self, logfile, port): | |||
| self.logfile = logfile | |||
| self.port = port | |||
| self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |||
| self.sock.bind( ('', port) ) | |||
| self.sock.listen( 1 ) | |||
| print 'Listening on: ', port | |||
| super(HoneyThread, self).__init__() | |||
| def run(self): | |||
| while True: | |||
| channel, details = self.sock.accept() | |||
| logstr = ( | |||
| 'Connection from %s:%s on port %s\r\n' % | |||
| (details[0], details[1], self.port) | |||
| ) | |||
| self.logfile.write('%s\r\n' % logstr) | |||
| print logstr | |||
| self.logfile.flush() | |||
| channel.send('You Just Got Stuck In Some Honey') | |||
| channel.close() | |||
| ports = [] | |||
| for arg in sys.argv[1:]: | |||
| ports.append(int(arg)) | |||
| threads = [] | |||
| logfile = open('/var/log/honeypot.log', 'a') | |||
| for p in ports: | |||
| threads.append(HoneyThread(logfile, p)) | |||
| for thread in threads: | |||
| thread.start() | |||
| print 'Bring it on!' | |||
| ``` | |||
| Some may notice a slight issue, this script is meant to run 24/7 and never be | |||
| stopped. There is no particular way of stopping the threads unless the machine | |||
| is restarted. | |||
| ## Running Honeypot | |||
| To run the honeypot simply issue the following command: | |||
| ```bash | |||
| python honeypot.py 22 25 80 443 | |||
| ``` | |||
| Replace the ports shown with the ports that you want the honeypot to run on. | |||
| When someone tries to connect to one of the supplied ports this script will | |||
| display on the screen the ip address that connected, the port they connected from | |||
| and the port they were trying to reach. It will also log the incident to | |||
| the `/var/log/honeypot.log` file. | |||
| ## Fail2Ban | |||
| Now to setup fail2ban to block the ip address when it is captured. | |||
| A new filter definition needs to be created in `/etc/fail2ban/filter.d/honeypot.conf`. | |||
| ```ini | |||
| [Definition] | |||
| failregex = | |||
| ``` | |||
| And the filter has to be set in `/etc/fail2ban/jail.conf`. | |||
| ```ini | |||
| ... | |||
| [honeypot] | |||
| enabled = true | |||
| filter = honeypot | |||
| logpath = /var/log/honeypot.log | |||
| action = iptables-allports[name=Honeypot, protocol=all] | |||
| maxretry = 1 | |||
| ... | |||
| ``` | |||
| Please make sure to read up on fail2ban’s various actions, the ‘iptables-allports’ | |||
| one is used here with ‘protocol: all’, meaning that the ip address is banned from | |||
| making all connections on any port using any protocol (tcp, udp, icmp, etc). Also | |||
| change ‘maxretry’ as you see fit, with it set to 1 then any single access to the | |||
| honeypot will ban the ip for the configured amount of time (600 seconds by | |||
| default), if you want this can be changed to 2 or 3 so if someone is persistent | |||
| with trying to access the false service. | |||
| And that is it, just start Fail2Ban and test by trying to access the one of the | |||
| honeypot ports. This can be done from a second machine and using telnet. | |||
| ```bash | |||
| telnet 192.168.1.11 80 | |||
| ``` | |||
| Replace ’192.168.1.11′ with the ip address of the machine running the honeypot | |||
| and ’80′ with the port you wish to test. | |||
| And there you have it, a Fail2Ban honeypot written in Python. Deploy and Enjoy. | |||