Уведомления

Группа в Telegram: @pythonsu

#1 Июль 16, 2014 13:43:42

StimuL
Зарегистрирован: 2013-10-30
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

python sniffer

Здравствуйте, уважаемые!

В общем господа помогите. Не пойму. Дали тестовое задание:
Необходимо написать программный модуль на Python, который запускается из командной строки и принимает на вход:
1) регулярное выражение
2) имя сетевого интерфейса

далее модуль:

1) открывает определенный интерфейс на прослушивание (“сниферит”)
2) отлавливает протокол HTTP и распространяет на заголовок протокола рег. выражение.

В результате работы программы необходимо получить файл, в котором будут сохраняться искомые по рег. выражениям значения заголовков НТТР. Лог-файл может быть вида:

======================================
<Cookie: JSESSIONIDA31283D5C6BD39698167CB118725EA7; atlassian.xsrf.token=B9AF-O05Z-O0X…>
GET /jira/browse/KPS-269 HTTP/1.1
Host: 192.168.167.169:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: JSESSIONIDA31283D5C6BD39698167CB118725EA7; atlassian.xsrf.token=B9AF-O05Z-O0XQ-UM4Z|c6225f16a613a59f9ec1f6a239e6d8f50fcf30a5|lin; __utma=1.2127329068.1404892476.1404892476.1404892476.1; __utmc=1; __utmz=1.1404892476.1.1.utmcsrdirect)|utmccndirect)|utmcmdnone)
Connection: keep-alive
Cache-Control: max-age=0
======================================

Написал такой код говорят это не сниффер. Но поидее в лог пишет то что нужно.

# -*- coding: utf-8 -*-
import socket
import signal
import argparse
import sys
import re
import os
ROOT = os.path.abspath(os.path.dirname(__file__))
class Sniffer:
    def __init__(self, regex='', host='', port=80):
        self.host = host
        self.port = port
        self.regex = regex
    def activate_server(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            print("Launching HTTP server on ", self.host, ":", self.port)
            self.socket.bind((self.host, self.port))
            # self.socket.connect((self.host, self.port))
        except Exception as e:
            print ("Warning: Could not aquite port:", self.port, "\n")
            print ("I will try a higher port")
            # store to user provideed port locally for later (in case 8080 fails)
            user_port = self.port
            self.port = 8080
            try:
                print("Launching HTTP server on ", self.host, ":", self.port)
                self.socket.bind((self.host, self.port))
                # self.socket.connect((self.host, self.port))
            except Exception as e:
                print("ERROR: Failed to acquire sockets for ports ", user_port,
                      " and 8080. ")
                print("Try running the Server in a privileged user mode.")
                self.shutdown()
                sys.exit(1)
        print ("Server successfully acquired the socket with port:", self.port)
        print ("Press Ctrl+C to shut down the server and exit.")
        self._wait_for_connections()
    def shutdown(self):
        try:
            print("Shutting down the server")
            s.socket.shutdown(socket.SHUT_RDWR)
        except Exception as e:
            print("Warning: could not shut down the socket. Maybe it was already closed?", e)
    def _wait_for_connections(self):
        QUEUE = 3
        while True:
            print ("Awaiting New connection")
            self.socket.listen(QUEUE)
            conn, addr = self.socket.accept()
            # string, addr = self.socket.recv(1024)
            # string = bytes.decode(string)
            print("Got connection from:", addr)
            data = conn.recv(1024)
            string = bytes.decode(data)
            regexp_result = re.search(self.regex, string)
            if regexp_result:
                start_finding_str = data.rfind('\n', 0,
                                               regexp_result.regs[0][0]) + 1
                end_finding_str = data.find('\n', start_finding_str) - 1
                finding_str = re.sub(r'^(.{100}).*$', '\g<1>...',
                                     data[start_finding_str:end_finding_str])
                f = open(ROOT + "\log.txt", 'a')
                f.write('<' + finding_str + '>\n')
                f.write(data)
                f.write('\n=================================================\n')
                f.close()
def graceful_shutdown(sig, dummy):
    s.shutdown()
    sys.exit(1)
signal.signal(signal.SIGINT, graceful_shutdown)
def create_parser():
    parser = argparse.ArgumentParser()
    parser.add_argument('-re', '--regex', nargs='?', default='')
    parser.add_argument('-ht', '--host', nargs='?', default='')
    parser.add_argument('-pt', '--port', nargs='?', default=80)
    return parser
if __name__ == '__main__':
    parser = create_parser()
    namespace = parser.parse_args(sys.argv[1:])
    try:
        remote_ip = socket.gethostbyname(namespace.host)
    except socket.gaierror:
        print 'Hostname could not be resolved. Exiting'
        sys.exit()
    s = Sniffer(regex=namespace.regex, host=remote_ip, port=namespace.port)
    s.activate_server()

Что не так. Вроде говорят если SOCK_RAW поставить то это будет сниффер. это ли и вся проблема? или я совсем ничего не понимаю.
Заранее спасибо.

Офлайн

#2 Июль 16, 2014 16:25:24

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Офлайн

#3 Июль 16, 2014 17:18:13

StimuL
Зарегистрирован: 2013-10-30
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

python sniffer

Спасибо попробую разобраться.
От новых ответов не отказываюсь. Может у кого возникнет желание более подробно объяснить или конкретно на данном примере.

Отредактировано StimuL (Июль 16, 2014 17:19:09)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version