Учебное руководство по разработке приложения на Python: часть 1

11 апреля 2024

ID 171598

В этом руководстве описывается реализация обмена данными с Kaspersky CyberTrace в приложении на Python.

В части 1 этого руководства описывается приложение, отправляющее данные в Kaspersky CyberTrace.

В части 2 этого руководства описывается приложение, ожидающее получения событий от Kaspersky CyberTrace.

Введение

Эта часть руководства посвящена реализации приложения Python, отправляющего данные в Kaspersky CyberTrace. Kaspersky CyberTrace анализирует полученные данные, сопоставляя их с индикаторами. Если сопоставление обнаруживает совпадающие индикаторы, Kaspersky CyberTrace отправляет в ответ свои собственные события.

Имя для приложения можно выбрать произвольно. В примерах в этом руководстве для этого приложения используется имя файла send_events_cybertrace.py.

Для реализации этого приложения рекомендуется использовать Python 3. В примерах кода в этом руководстве используется синтаксис Python 3.

О флаге X-KF-ReplyBack

В этой части руководства в разрабатываемом приложении используется флаг X-KF-ReplyBack для получения событий от Kaspersky CyberTrace без приложения-прослушивателя. Приложение, прослушивающее порт в ожидании событий от Kaspersky CyberTrace, реализуется во второй части этого руководства.

Флаг X-KF-ReplyBack включает режим ReplyBack mode. В этом режиме Kaspersky CyberTrace отправляет свои события обнаруженных киберугроз в то же самое сокетное соединение.

Этот флаг не является обязательным. Если разрабатываемое приложение не отправляет этот флаг, Kaspersky CyberTrace будет отправлять собственные события в соответствии с параметром OutputSettings > ConnectionString.

О флаге X-KF-SendFinishedEvent

Флаг X-KF-SendFinishedEvent используется в разрабатываемом приложении, чтобы Kaspersky CyberTrace генерировал специальное событие в ответ на каждое полученное событие.

Kaspersky CyberTrace генерирует это событие в формате, указанном в параметре OutputSettings > FinishedEventFormat. Значение атрибута enabled этого параметра игнорируется.

О флаге X-KF-SaveStatistic

Флаг X-KF-SaveStatistic используется в разрабатываемом приложении, чтобы Kaspersky CyberTrace сохранял статистику обнаруженных киберугроз для всех событий, полученных за время текущего соединения. События также сохраняются для ретроспективного сканирования.

1-й этап. Определение функции main()

На этом этапе выполняются следующие действия:

  1. Импорт модуля socket.

    Функции из этого модуля используются для установления соединения с Kaspersky CyberTrace и отправки данных.

  2. Определение функции main().
  3. В переменных CYBERTRACE_ADDR и CYBERTRACE_PORT необходимо указать адрес и порт, которые Kaspersky CyberTrace будет прослушивать в ожидании входящих событий.

    Эту информацию можно получить в веб-интерфейсе CyberTrace на странице Service settings.

    import socket

     

    CYBERTRACE_ADDR = "192.0.2.42"

    CYBERTRACE_PORT = 9999

     

    def main():

    pass

     

    if __name__ == '__main__':

    main()

2-й этап. Добавление примеров событий

На этом этапе выполняются следующие действия:

  1. В функции main() определяется список с примерами событий.

    События в этом списке содержат индикаторы. Приложение отправляет эти события в Kaspersky CyberTrace.

    Каждое событие должно заканчиваться символом новой строки (\n). Символ новой строки служит разделителем событий.

    def main():

    events = [

    '192.0.2.1\n',

    'ip=192.0.2.3\n',

    '776735A8CA96DB15B422879DA599F474\n',

    'EICAR md5=FEAF2058298C1E174C2B79AFFC7CF4DF\n',

    'Regular event\n',

    '44D88612FEA8A8F36DE82E1278ABB02F\n',

    'val1=04BFFABE7980E7D84424001896D2572E val2=0F9CCE3EA0EDFD6F41FF8A769F721631\n',

    'val=E9A6B1346D1A2447CABB980F3CC5DD27\n',

    'Regular event\n',

    'http://5a015004f9fc05290d87e86d69c4b237.com\n',

    'Domain: http://fakess123bn.nu\n',

    ]

3-й этап. Установление сокетного соединения

На этом этапе выполняются следующие действия:

  1. В функцию main() необходимо добавить код, устанавливающий соединение с Kaspersky CyberTrace и завершающий соединение после отправки всех событий.
  2. В этом коде необходимо отправить флаги X-KF-SendFinishedEvent и X-KF-ReplyBack.

    Флаги X-KF-SendFinishedEvent и X-KF-ReplyBack отправляются при установлении соединения. Эти флаги заставляют Kaspersky CyberTrace всегда генерировать событие в ответ на полученное событие, даже если при сопоставлении с полученного события с индикаторами не обнаруживается совпадений.

    Флаг X-KF-SaveStatistic следует отправлять, если требуется, чтобы в течение текущего соединения Kaspersky CyberTrace сохранял статистику обнаружения и события для ретроспективного сканирования (retroscan).

    Если используется флаг X-KF-ReplyBack, флаг X-KF-SendFinishedEvent должен ему предшествовать.

    Если используется флаг X-KF-SaveStatistic, флаг X-KF-ReplyBack должен ему предшествовать.

    ct_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:

    ct_socket.connect((CYBERTRACE_ADDR, CYBERTRACE_PORT))

    ct_socket.sendall(b'X-KF-SendFinishedEventX-KF-ReplyBackX-KF-SaveStatistic')

    # Здесь будет код из следующего этапа

    finally:

    ct_socket.close()

4-й этап. Отправка событий

На этом этапе выполняются следующие действия:

  1. В коде из предыдущего этапа в блоке try... finally выполняется итерация по списку events и каждое событие отправляется в Kaspersky CyberTrace.

    Параметр 16384 в функции socket.recv() задает размер буфера сообщений. Если ожидается, что ответ будет содержать более 16384 байтов, увеличьте буфер. Это может потребоваться, если отдельные события содержат большое количество сопоставленных индикаторов.

    for event in events:

    ct_socket.sendall(event.encode())

    response = ct_socket.recv(16384)

  2. Добавление вывода в консоль для отправленных событий и полученных ответов.

    for event in events:

    print("Sending:\n{}".format(event))

    ct_socket.sendall(event.encode())

    response = ct_socket.recv(16384)

    print("Response:\n{}".format(response.decode()))

5-й этап. Запуск приложения

На этом этапе выполняются следующие действия:

  1. Запуск приложения из консоли:

    python3 ./send_events_cybertrace.py

Ниже приведен пример вывода приложения. Kaspersky CyberTrace отправляет событие для каждого успешно сопоставленного индикатора и событие для завершенной операции поиска.

Sending:

val1=192.0.2.1 val2=ip=192.0.2.3

 

Response:

- category=KL_IP_Reputation matchedIndicator=192.0.2.1 url=- src=- ip=192.0.2.1 md5=- sha1=- sha256=- usrName=- confidence=100 category=test first_seen=01.01.2017 00:00 ip=192.0.2.1 ip_geo=ru last_seen=16.07.2020 10:02 popularity=1 threat_score=75

- category=KL_IP_Reputation matchedIndicator=192.0.2.3 url=- src=- ip=192.0.2.3 md5=- sha1=- sha256=- usrName=- confidence=100 category=test first_seen=15.01.2017 00:00 ip=192.0.2.3 ip_geo=ru last_seen=16.07.2020 09:51 popularity=1 threat_score=75

LookupFinished

 

Sending:

EICAR md5=FEAF2058298C1E174C2B79AFFC7CF4DF

 

Response:

- category=KL_Malicious_Hash_MD5 matchedIndicator=FEAF2058298C1E174C2B79AFFC7CF4DF url=- src=- ip=- md5=FEAF2058298C1E174C2B79AFFC7CF4DF sha1=- sha256=- usrName=- confidence=100 MD5=FEAF2058298C1E174C2B79AFFC7CF4DF SHA1=D01D17F6B13C7255A234F558ED85078EA5DD3F3D SHA256=4CA914C9791CF2BF2AC69F9A2B21006F0361E247F2CE92F0A9F166DBC6B43670 file_size=1989 first_seen=10.07.2015 23:53 last_seen=13.07.2020 14:35 popularity=1 threat=HEUR:Trojan.Win32.Generic

LookupFinished

 

Sending:

Regular event

 

Response:

LookupFinished

Полный код для части 1

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

import socket

 

CYBERTRACE_ADDR = "192.0.2.42"

CYBERTRACE_PORT = 9999

 

def main():

 

events = [

'192.0.2.1\n',

'ip=192.0.2.3\n',

'val1=192.0.2.1 val2=ip=192.0.2.3\n',

'776735A8CA96DB15B422879DA599F474\n',

'EICAR md5=FEAF2058298C1E174C2B79AFFC7CF4DF\n',

'Regular event\n',

'44D88612FEA8A8F36DE82E1278ABB02F\n',

'val1=04BFFABE7980E7D84424001896D2572E val2=0F9CCE3EA0EDFD6F41FF8A769F721631\n',

'val=E9A6B1346D1A2447CABB980F3CC5DD27\n',

'Regular event\n',

'http://5a015004f9fc05290d87e86d69c4b237.com\n',

'Domain: http://fakess123bn.nu\n',

]

 

ct_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:

ct_socket.connect((CYBERTRACE_ADDR, CYBERTRACE_PORT))

ct_socket.sendall(b'X-KF-SendFinishedEventX-KF-ReplyBackX-KF-SaveStatistic')

for event in events:

print("Sending:\n{}".format(event))

ct_socket.sendall(event.encode())

response = ct_socket.recv(16384)

print("Response:\n{}".format(response.decode()))

finally:

ct_socket.close()

 

 

if __name__ == '__main__':

 

main()

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!