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() 関数を定義する
このステージの手順:
socket
モジュールをインポートします。Kaspersky CyberTrace との接続を確立し、データを送信するために、アプリケーションでこのモジュールからの関数を使用します。
main()
関数を定義します。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。サンプルイベントを追加する
このステージの手順:
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。ソケット接続を確立する
このステージの手順:
- Kaspersky CyberTrace への接続を確立し、すべてのイベントが送信されると閉じるコードを
main()
関数に追加します。 - このコードでは
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。イベントを送信する
このステージの手順:
- 前のステージのコードの
try... finally
ブロックでevents
リストを繰り返して、各イベントを Kaspersky CyberTrace に送信します。socket.recv()
関数の16384
パラメータは、メッセージバッファのサイズを指定します。レスポンスのサイズが 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() |