Учебное руководство по разработке приложения на 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()
На этом этапе выполняются следующие действия:
- Импорт модуля
socket
.Функции из этого модуля используются для установления соединения с Kaspersky CyberTrace и отправки данных.
- Определение функции
main()
. - В переменных
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-й этап. Добавление примеров событий
На этом этапе выполняются следующие действия:
- В функции
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-й этап. Установление сокетного соединения
На этом этапе выполняются следующие действия:
- В функцию
main()
необходимо добавить код, устанавливающий соединение с Kaspersky CyberTrace и завершающий соединение после отправки всех событий. - В этом коде необходимо отправить флаги
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-й этап. Отправка событий
На этом этапе выполняются следующие действия:
- В коде из предыдущего этапа в блоке
try... finally
выполняется итерация по спискуevents
и каждое событие отправляется в Kaspersky CyberTrace.Параметр
16384
в функцииsocket.recv()
задает размер буфера сообщений. Если ожидается, что ответ будет содержать более 16384 байтов, увеличьте буфер. Это может потребоваться, если отдельные события содержат большое количество сопоставленных индикаторов.for event in events:
ct_socket.sendall(event.encode())
response = ct_socket.recv(16384)
- Добавление вывода в консоль для отправленных событий и полученных ответов.
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-й этап. Запуск приложения
На этом этапе выполняются следующие действия:
- Запуск приложения из консоли:
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() |