Python アプリケーションのチュートリアル:パート 1

2024年4月11日

ID 171598

このチュートリアルでは、Kaspersky CyberTrace からデータを送受信する Python アプリケーションの実装方法について説明します。

このチュートリアルのパート 1 では、Kaspersky CyberTrace にデータを送信するアプリケーションについて説明します。

このチュートリアルのパート 2 では、Kaspersky CyberTrace からの受信イベントをリッスンするアプリケーションについて説明します。

はじめに

チュートリアルのこのパートでは、Kaspersky CyberTrace にデータを送信する Python アプリケーションを実装します。Kaspersky CyberTrace は受信データを分析して、一致するインジケーターを特定します。一致したインジケーターがある場合、Kaspersky CyberTrace はそれに応じて独自のイベントを送信します。

アプリケーションには任意の名前を使用できます。このチュートリアルの例では、このアプリケーションに send_events_cybertrace.py というファイル名を使用します。

このアプリケーションの実装に Python 3 を使用することを推奨します。このチュートリアルのコード例では Python 3 構文を使用します。

X-KF-ReplyBack フラグについて

チュートリアルのこのパートでは、アプリケーションで X-KF-ReplyBack フラグを使用して、リスナーアプリケーションなしで Kaspersky CyberTrace からのイベントを受信します。このチュートリアルのパート 2 でも、Kaspersky CyberTrace のイベントをリッスンするアプリケーションを実装します。

X-KF-ReplyBack フラグは ReplyBack モードを有効化します。Kaspersky CyberTrace はこのモードで検知イベントを同じソケット接続に送信します。

このフラグは任意です。アプリケーションがこのフラグを送信しない場合、Kaspersky CyberTrace は、[OutputSettings]→[ConnectionString]パラメータで指定した通りに独自のイベントを送信します。

X-KF-SendFinishedEvent フラグについて

Kaspersky CyberTrace が受信した各イベントに応じて特別なイベントを生成するよう、アプリケーションで X-KF-SendFinishedEvent フラグを使用します。

Kaspersky CyberTrace は、[OutputSettings]→[FinishedEventFormat]パラメータで指定した形式を使用してこのイベントを生成します。このパラメータの enabled 属性の値は無視されます。

X-KF-SaveStatistic フラグについて

Kaspersky CyberTrace が現在の接続の間に受信した全イベントの検知統計を保存するよう、アプリケーションは X-KF-SaveStatistic フラグを使用します。イベントはレトロスキャン用にも保存されます。

ステージ 1。main() 関数を定義する

このステージの手順:

  1. socket モジュールをインポートします。

    Kaspersky CyberTrace との接続を確立し、データを送信するために、アプリケーションでこのモジュールからの関数を使用します。

  2. main() 関数を定義します。
  3. CYBERTRACE_ADDR 変数と CYBERTRACE_PORT 変数で、Kaspersky CyberTrace が受信イベントをリッスンするアドレスとポートを指定します。

    この情報は、CyberTrace Web の[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. Kaspersky CyberTrace への接続を確立し、すべてのイベントが送信されると閉じるコードを main() 関数に追加します。
  2. このコードでは X-KF-SendFinishedEvent フラグと X-KF-ReplyBack フラグを送信します。

    接続を確立した時に、X-KF-SendFinishedEvent フラグと X-KF-ReplyBack フラグを送信します。受信したイベントがインジケーターに一致しなくても、これらのフラグによって Kaspersky CyberTrace は受信したイベントに応じて常にイベントを送信します。

    現在の接続の間に、検知統計とイベントを retroscan で使用できるように Kaspersky CyberTrace に保存させる場合は、X-KF-SaveStatistic フラグを送信します。

    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')

    # Code from the next stage goes here

    finally:

    ct_socket.close()

ステージ 4。イベントを送信する

このステージの手順:

  1. 前のステージのコードの try... finally ブロックで events リストを繰り返して、各イベントを Kaspersky CyberTrace に送信します。

    socket.recv() 関数の 16384 パラメータは、メッセージバッファのサイズを指定します。レスポンスのサイズが 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()

この記事はお役に立ちましたか?
改善できる点がありましたらお聞かせください。
フィードバックをいただき、ありがとうございました。改善に向けて取り組んでまいります。
フィードバックをいただき、ありがとうございました。改善に向けて取り組んでまいります。