|
|
| Line 1: |
Line 1: |
| − | ==Description==
| |
| − | Rubicon is a multi-threaded python intrustion detection system (IDS). Rubicon works by emulating common TCP services.
| |
| | | | |
| − | ==Features==
| |
| − | * Low-Interaction IDS
| |
| − | * Multi-Threaded
| |
| − | * Activity Monitor
| |
| − | * Logs and Time Stamps Incidents
| |
| − | * Multi-Line Login Banner Emulator
| |
| − |
| |
| − | ==Usage==
| |
| − | ~$ sudo python rubicon.py
| |
| − |
| |
| − | ==Source==
| |
| − | {{code|text=<source lang="python">#!/usr/bin/env python
| |
| − |
| |
| − | # Rubicon (Beta) - Python IDS
| |
| − | # By: inphekt | http://www.blackhatacademy.org/security101/User:Inphekt
| |
| − |
| |
| − | # Copyright (C) 2012 inphekt <inphektious[at]live[dot]com>
| |
| − |
| |
| − | # This program is free software: you can redistribute it and/or modify
| |
| − | # it under the terms of the GNU General Public License as published by
| |
| − | # the Free Software Foundation, either version 3 of the License, or
| |
| − | # (at your option) any later version. If you decide to use any part
| |
| − | # of this source be sure to credit the original author.
| |
| − |
| |
| − | # This program is distributed in the hope that it will be useful,
| |
| − | # but WITHOUT ANY WARRANTY; without even the implied warranty of
| |
| − | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| |
| − | # GNU General Public License for more details.
| |
| − |
| |
| − | # Social Engineer attackers into connecting to one of your mock services
| |
| − |
| |
| − | # *** RUN WITH ROOT PRIVILEGES ***
| |
| − |
| |
| − | import os
| |
| − | import sys
| |
| − | import time
| |
| − | import string
| |
| − | import socket
| |
| − | import threading
| |
| − |
| |
| − | # Make Rubicon sexy
| |
| − | class colors:
| |
| − | BLUE = '\033[94m'
| |
| − | GREEN = '\033[92m'
| |
| − | YELLOW = '\033[93m'
| |
| − | RED = '\033[91m'
| |
| − | ENDC = '\033[0m'
| |
| − |
| |
| − | def disable(self):
| |
| − | self.BLUE = ''
| |
| − | self.GREEN = ''
| |
| − | self.RED = ''
| |
| − | self.YELLOW = ''
| |
| − | self.ENDC = ''
| |
| − |
| |
| − | def title():
| |
| − | print(colors.BLUE + """
| |
| − | ____ __ __ ____ ____ ___ _____ _ _
| |
| − | ( _ \( )( )( _ \(_ _)/ __)( _ )( \( )
| |
| − | ) / )(__)( ) _ < _)(_( (__ )(_)( ) (
| |
| − | (_)\_)(______)(____/(____)\___)(_____)(_)\_) \n""" + colors.ENDC)
| |
| − | print(colors.GREEN + ' *~ 7h3 p01n7 0f n0 r3turn ~*\n' + colors.ENDC)
| |
| − | print(colors.YELLOW + ' inphektious[at]live[dot]com\n\n' + colors.ENDC)
| |
| − |
| |
| − | class rubicon(threading.Thread):
| |
| − | def __init__(self):
| |
| − | self.header = colors.BLUE + "rcon> " + colors.ENDC
| |
| − | self.warning = colors.RED + "[+] " + colors.ENDC
| |
| − | threading.Thread.__init__(self)
| |
| − |
| |
| − | def run(self):
| |
| − |
| |
| − | # list elligable commands
| |
| − | def usage():
| |
| − | print """view logs => Shows logged activity
| |
| − | delete logs => Deletes logged activity
| |
| − | set service => Creates a rubicon service
| |
| − | help => Shows usage
| |
| − | exit => Shutdown"""
| |
| − |
| |
| − | # Read logs from log.txt
| |
| − | def viewLogs():
| |
| − | try:
| |
| − | log = open("log.txt")
| |
| − | while 1:
| |
| − | lines = log.readlines(100000)
| |
| − | if not lines:
| |
| − | break
| |
| − | for line in lines:
| |
| − | print line
| |
| − | print("\n--- end of log ---")
| |
| − | self.run()
| |
| − | except IOError:
| |
| − | print("%sNo logged activity at this time..." % (self.warning))
| |
| − | self.run()
| |
| − |
| |
| − | # delete log.txt to clear logged activity
| |
| − | def deleteLogs():
| |
| − | try:
| |
| − | os.remove("log.txt")
| |
| − | print("%sLogs cleared..." % (self.warning))
| |
| − | except OSError:
| |
| − | print("%sLogs are clear..." % (self.warning))
| |
| − |
| |
| − | # set up Rubicon service
| |
| − | def setService():
| |
| − | self.hst = raw_input("Enter the IP address you wish your service to listen on: ")
| |
| − | self.prt = raw_input("Enter the port you wish your service to listen on: ")
| |
| − | print("Create a deceptive prompt/header for your mock service ([Enter] for new line and input 'done' when complete):")
| |
| − |
| |
| − | # Make multi-lined banner to display for attacker
| |
| − | banner = ''
| |
| − | while 1:
| |
| − | bannerInput = raw_input(colors.BLUE + "~ " + colors.ENDC)
| |
| − | if bannerInput == "done":
| |
| − | break;
| |
| − | else:
| |
| − | banner += bannerInput + "\n"
| |
| − |
| |
| − | # Create socket and start mock service
| |
| − | while 1:
| |
| − | try:
| |
| − | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
| |
| − | s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
| |
| − | HOST = self.hst
| |
| − | PORT = int(self.prt)
| |
| − | s.bind((HOST, PORT))
| |
| − | s.listen(1)
| |
| − | print (self.warning + time.strftime("%a, %d %b %Y %H:%M:%S %Z") + ": Setting up service on port %s..." % (PORT))
| |
| − | rubicon().start()
| |
| − |
| |
| − | # Accept connection and parse data
| |
| − | (insock, address) = s.accept()
| |
| − | # Convert incoming address to a string
| |
| − | straddress = str(address)
| |
| − | # Split the tuple into lists
| |
| − | testlist = string.split(straddress, ",")
| |
| − | # Split the host portion of the list
| |
| − | gethost = string.split(testlist[0], "'")
| |
| − | # Split the port portion of the list
| |
| − | getaddr = string.split(testlist[1], ")")
| |
| − | # Remove just the address from the list
| |
| − | host = gethost[1]
| |
| − | # Remove just the port from the list
| |
| − | inport = int(getaddr[0])
| |
| − |
| |
| − | # interactive alert
| |
| − | print(time.strftime("%a, %d %b %Y %H:%M:%S %Z") + ":. Connection attempt on port %s from %s:%s" % (PORT, host, inport))
| |
| − |
| |
| − | # Open log.txt to log information on attacker
| |
| − | log = open("log.txt","a+")
| |
| − | log.write(time.strftime("\n%a, %d %b %Y %H:%M:%S %Z") + ":. Connection attempt on port %s from %s:%s" % (PORT, host, inport))
| |
| − | insock.send(banner)
| |
| − | data = insock.recv(1024)
| |
| − | log.write('\nInput: %s\n-----------------' % data)
| |
| − |
| |
| − | # Close socket
| |
| − | insock.close()
| |
| − | s.close()
| |
| − |
| |
| − | # handle socket error
| |
| − | except socket.error, msg:
| |
| − | print ("%sError: %s" % (self.warning, msg))
| |
| − | setService()
| |
| − |
| |
| − | # core code
| |
| − | while 1:
| |
| − | try:
| |
| − | global option
| |
| − | option = raw_input("%s " % (self.header))
| |
| − | if option == 'help':
| |
| − | usage()
| |
| − | elif option == 'view logs':
| |
| − | viewLogs()
| |
| − | elif option == 'delete logs':
| |
| − | deleteLogs()
| |
| − | elif option == 'set service':
| |
| − | setService()
| |
| − | elif option == 'exit':
| |
| − | os._exit(1)
| |
| − | else:
| |
| − | print("%sInvalid Input..." % (self.warning))
| |
| − | except EOFError:
| |
| − | print("\n%sType 'exit' to quit..." % (self.warning))
| |
| − |
| |
| − | if __name__=='__main__':
| |
| − | title()
| |
| − | rubicon().start()
| |
| − | </source>}}
| |
| − |
| |
| − | [[Category:Projects]]
| |