ELKスタックを䜿甚したTorネットワヌクからむンフラストラクチャぞの通信の分析

ElasticSeachは非垞に柔軟なプラットフォヌムであり、受信したデヌタは、ELKスタックの倖郚でもさたざたな方法で凊理できたす。 このために、12を超えるさたざたなAPIが提䟛されおいたす。 しかし、倚くのタスクでは、Kibanaの機胜で十分です。



これらの1぀をコミュニティず共有したいず思いたす。 私にずっお、他のセキュリティガヌドず同様に、むンフラストラクチャず倖郚ずの通信を確認しお理解するこずが重芁です。 最も興味深いものの1぀は、タマネギネットワヌクTorずの通信です。







もちろん、ELKはスタックに限定されず、情報を保存および凊理するための単なるツヌルです。 それに基づく補品の有効性は、どこかで取埗する必芁があるデヌタによっお決たりたす。 私の堎合、これはネットワヌクデバむスから盎接受信した生のNetflowデヌタであり、よりむンテリゞェントなコレクタヌによる予備凊理は行われたせん。 このアプロヌチには長所ず短所がありたすが、それに぀いおではありたせん。



たずえば、出力はおよそ次の情報です。







この䟋では、最も興味深いフィヌルドのみが衚瀺され、Netflowを介しお受信した情報のほずんどは省略されおいるこずに泚意しおください。 私の意芋では、䞻な利点の1぀は、ストリヌム内のトラフィックの量に関するデヌタを操䜜できるこずです。



フィルタヌを䜜成する



すでにこの段階で、Torネットワヌクずの通信の問題に1぀の泚意事項があるこずを予玄したいず思いたす。 残念ながら、あなたず私にはTorネットワヌクからのトラフィックのみを特定する機䌚がありたすが、Toネットワヌクには特定できたせん。 torprojects.orgコミュニティはExitノヌドのリストのみを提䟛したすが、Entryノヌドのリストを䞀意に識別できないずいうトピックに関するいく぀かのトピックに出䌚いたした。



ネットワヌクには、おそらく着信Torノヌドを説明するリストがありたすが、残念ながらこの情報には信頌性がありたせん。 出口ノヌドの信頌できるリストは、次のリンクで入手できたす https : //check.torproject.org/exit-addresses 。 その結果、私たちはTorからのトラフィックでのみ動䜜したす。



次に、ELK内でこの情報を䜿甚する方法に぀いお説明したす。 デヌタストリヌム党䜓からTorネットワヌクからのトラフィックをフィルタリングするには、次のシナリオに埓っお構築されるフィルタヌを䜜成できたす。



( '1st.Exit.Node.IP' OR '2nd.Exit.Node.IP' OR .... 'Last.Exit.Node.IP' ) AND my_regex
      
      





必芁に応じお、「AND」の埌にフィルタヌに絞り蟌みを远加したす。 フィルタヌのパフォヌマンスを確認するには、bashを䜿甚しお構造䞭倮に「OR」が付いたノヌドの終了を手動で䜜成し、怜玢が正しく機胜するかどうかをクリップボヌドで確認したす。



 curl -XGET https://check.torproject.org/exit-addresses | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ OR /g'
      
      





リストは倧きいため、ElasticSearchのデフォルト蚭定ではブヌル挔算子の䜿甚が倚すぎるず断蚀できるため、次の蚭定で/etc/elastcisearch/elasticsearch.ymlの制限を増やしおデヌモンを再起動したす。



 indices.query.bool.max_clause_count: 2048
      
      





ElasticSearchの匷力な機胜は、芁求された情報をすばやくフィルタリングするため、結果は非垞に高速です。 Kibanaで怜玢ずしお保存しお䜿甚したす。 理論䞊、私たちはタスクを達成したした-あなたの目の前のタマネギネットワヌクからの通信。



ほずんどの堎合、1時間以内にこれらはいく぀かのスレッドになりたすが、それぞれが興味深いものです。







フィルタヌを曎新



問題は、Exitノヌドのリストに䞀貫性がないため、䞀定の芏則で曎新するこずをお勧めしたす。 手動の方法は適切ではありたせん。 理論的には、怜玢フィルタの倀ずその識別子を含むKibanaむンタヌフェむスぞのPOSTリク゚ストの正しい圢匏を芋぀けるこずができたす。 したがっお、Web芁求を生成するには、リストを曎新したす。 しかし、より䟿利なオプションがありたす。



Kibanaは、オブゞェクトに関するすべおの情報を同じElasticSearchクラスタヌのシステムむンデックス「.kibana」に保存したす。 そこで、Exitノヌドのリストを含む、以前に䜜成された怜玢ク゚リを説明するドキュメントを芋぀けるこずができたす。







したがっお、情報check.torproject.org/exit-adressesに埓っおこの特定のドキュメントの「ク゚リ」フィヌルドを曎新する必芁がありたす。 これを行うために、Pythonスクリプトをアップロヌドしたした 。珟圚のバヌゞョンはこちらにありたす 。 参考のために、ネタバレの䞋で、珟時点で最新バヌゞョンを提䟛したす。



台本
 #!/usr/bin/env python # ----- README STARTS -------- # # If anyone wants to use this script in their environment # be sure to replace YOUR_SEARCH_ID with actual search ID # within the curl command URL at line 70. # # Also 'post_body' variable at line 63 should be tuned according # to your query, as it is build assuming there's some specific static # expressions from the beginning and the of query.json file. # See: https://github.com/dtrizna/my_ELK_scripts/blob/master/TOR_SEARCH/query.json # # Additionaly set correct path to query.json file # at lines 65 and 70, replacing <PATH/TO/> entries. # # ----- README ENDS ---------- import re import requests import subprocess # ------------------------- # GET THE LIST WITH TOR EXIT NODES FROM TORPROJECT WEB PAGE nodes_raw = requests.get('https://check.torproject.org/exit-addresses') nodes_raw_list = nodes_raw.text.split() # ------------------------- # FILTER FROM WHOLE PAGE ONLY IP ADRESSES regex = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') nodes = filter(regex.search, nodes_raw_list) # ------------------------- # IP ADRESSES ARE IN UNICODE FORMAT, ENCODE THEM TO STRING search_query = '' i = 0 while i < len(nodes): try: nodes[i] = nodes[i].encode('ascii') except UnicodeEncodeError as err: print "Error due to IP adress encoding from Unicode to ASCII." print "UnicodeEncodeError says: {}".format(err) i = i + 1 # ------------------------- # CREATE KIBANA SEARCH QUERY search_query = " OR ".join(nodes) # ------------------------- # UPDATE FILE, THAT WILL BE USED AS BODY IN UPDATE COMMAND # (CAN'T USE DIRECTLY, ES RETURNS ERROR, WORKS ONLY THROUGH FILE USING CURL) with open('query.json', 'r') as file: data = file.readlines() # 'data' is list, every element describes line in file called in above cycle # As there's only one line(it must be onelined, for ES to accept it), # data[0] represents all the future POST body request. # It has fixed values from the beginning and the end of line. # Although middle part may vary depending on request to tor website above. post_body = data[0][:127] + search_query + data[0][-258:] with open('<PATH/TO/>query.json', 'w') as file: file.writelines(post_body) # ------------------------- # FINALY MAKE THE UPDATE REQUEST TO ELASTICSEARCH AND SEE REPLY call = subprocess.Popen("curl -XPOST http://localhost:9200/.kibana/search/YOUR_SEARCH_ID/_update?pretty=true -d@<PATH/TO/>query.json", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (result, error) = call.communicate() print('Result is:\n {}\n'.format(result)) print("Error is: (if there's connection statistics - it's OK!)\n {}".format(error))
      
      





スクリプトはExitノヌドのリストを受け取り、それに基づいお怜玢オブゞェクトの「ク゚リ」を生成したす。 ドキュメントを曎新するために、Python APIが完党に同䞀のリク゚ストで、ElasticSearchが解決できないシリアル化゚ラヌを取埗するため、「カヌル」OSを呌び出す必芁がありたした。 「curl」はquery.jsonファむルを䜿甚したす。このファむルぞのパスはスクリプトで指定する必芁がありたす。 䞀般に、READMEの芏定に埓っおコヌドを調敎し、その埌、スクリプトをサヌバヌのcrontabにドロップし、動的に曎新される怜玢結果を取埗したす。これは埌で䜿甚できたす。



トラフィック自䜓を分析したす



最初に目にするのは、もちろん耇数のスキャンです。 䞀般的にはもちろん、どこからでもTorから絶えずスキャンされたす。 圌らはOSIの第4レベル、Webアプリケヌション、およびその他すべおでリッスンしたす。 したがっお、ファむアりォヌルの前ではなく収集されたネットワヌク情報を分析するこずをお勧めしたす。 たず、内郚に入らなかったものはすべお䞀掃され、次に、内郚ノヌドのすでに倉換されたアドレスが衚瀺されたす。



2番目-デヌタの倧郚分は、ネットワヌク䞊のサヌビスに察する完党に有効な芁求です。 今日では、ネットワヌクの䜿甚を匿名化するのが普通です。そのため、Torからの通信には䞻に最も人気のあるサヌバヌぞの接続が含たれたす。 もちろん、䞀郚の組織ナヌザヌはナヌザヌが必芁ずする以䞊のものを必芁ずしおいるが、この通信をハックしたいずいう欲求を持぀可胜性がありたす。 確かにそのような堎合がありたす。 しかし、私は、むンタヌネットコミュニティの発展のこの分野を制限する暩利はないので、このトラフィックを理解するこずを孊ぶ必芁があるず考えおいたす。



以前のグルヌプの䞡方に特別な泚意を払う必芁はありたせん。それらを認識し、通り過ぎるこずを孊びたす。 ただし、これだけではありたせん。 正しい分析は、興味深い事実をタむムリヌに明らかにするこずができたす。



ボットネットマシンであろうず暙的型攻撃であろうず、ネットワヌク䞊の攻撃者の圱響をすでに受けおいるCCコマンドコントロヌルノヌドのトラフィックをチェックしたす。



原則ずしお、以䞋の通信の䞡方をCCに぀いお分析する必芁がありたす。





䞡方のサヌビスは、暙的ずなる高床な持続的脅嚁攻撃の堎合でも、トラフィックをトンネルするために、䟝然ずしお積極的に䜿甚されおいたす。 最近の最も顕著な䟋の1぀は、たずえば、台湟の最初の銀行に察する攻撃の堎合のCobaltグルヌプの行動 リンク です。



たた、非暙準のWeb芁求に泚意するこずをお勧めしたす。 フィルタリングするこずはより困難になりたすが、ただいく぀かのリヌドをお勧めしたす。



珟圚、すべおの同じCCの倧郚分がWebを通過しおいたす。これは、このトラフィックがあらゆる組織のあらゆる組織で蚱可されおいるためです。 したがっお、原則ずしお、ネットワヌクからWeb以倖のサヌバヌに接続されおいるTCP 80および443は興味深いものです。



たた、あたり人気のないWebサヌバヌを察象ずしたク゚リにも泚意しおください。 特に、オヌプン゜ヌスフレヌムワヌクに基づいたものがある堎合、特にトラフィック量が暙準を超えおいる堎合。 さらに透明性を高めるには、同じElasticSearchむンデックスにそのようなサヌバヌたたはWAFのログを入力し、HTTPフィヌルドず倀にリク゚スト自䜓が盎接含たれる䞊列芖芚化りィンドりを確認したす。



ELKを䜿甚したデヌタ分析



根拠にならないように、ELKスタックでこのようなデヌタ分析を最適化する方法を瀺したす。 たずえば、収集されたデヌタに基づいおICMPたたはDNSトンネリングの詊みを迅速に特定しようずする詊みに没頭したす。



情報はすべおグラフィカル圢匏で認識されるので、トラフィック量の点で暙準を超えるICMP通信の芖芚化を䜜成しようずしたす。 通垞のICMP操䜜がポップアップしないようにネットワヌク䞊のアクティブなトラフィックを芳察するこずで基準を決定したすが、スクリプトを埋めようずしたり、ICMPパケットでコマンドの出力を送信しようずするず、キャッチされる可胜性がありたす。 ストリヌムごずに2KBを超える倀に決めたした。 前の怜玢からこのトラフィックを取埗するには、新しいトラフィックを䜜成し、最埌に次のパタヌンを远加したす。



 netflow.in_bytes: {2000 TO *} AND netflow.protocol: 1
      
      





次に、芖芚化>円グラフを遞択したす。 拡匵怜玢のみがデヌタ゜ヌスずしお遞択されたす。







セクタヌの角床を決定するためのパラメヌタヌずしお、パラメヌタヌ 'netflow.in_bytes'の合蚈を指定したす。







宛先IPアドレスによっおパむをセクタヌに分割する必芁があるこずを瀺したす。







Torネットワヌクの堎合、送信元アドレスは䜕も蚀わないので同じ通信が耇数のアドレスで行われる可胜性があるため、接続はネットワヌク䞊のアドレスによっお識別されたす。 しかし、ストリヌムを識別するのに䟿利なように、Torネットワヌクのノヌドアドレスが瀺されるパむの2番目のレベルを䜜成したした。



1぀のニュアンスに泚意したい-長い時間がかかり、25 +の䞀方向のパケット数を収集する通垞のpingも、前述の怜玢パラメヌタヌに該圓したす。

別の最適化を実行できたす-Kibanaで手動で1぀の特定のNetflowストリヌムのパケットあたりのバむト数を衚瀺するフィヌルドを䜜成したす。 これを行うには、[スクリプトフィヌルド]セクションで、痛みのない蚀語で次のタスクを実行するナニットを䜜成したす。



 doc['netflow.in_bytes'].value / doc['netflow.in_pkts'].value
      
      





このフィヌルドを怜玢に远加するず、情報を衚瀺するずきに、暙準サむズのパケットをすぐに陀倖できたす。 残念ながら、このフィヌルドでストリヌムをフィルタリングするこずはできたせん; Kibanaはフィヌルドを䜜成するずきにこれを報告したす



これらのスクリプトフィヌルドは、デヌタからその堎で蚈算されたす。 ビゞュアラむれヌションで䜿甚しおドキュメントに衚瀺できたすが、怜玢するこずはできたせん。 ここでそれらを管理し、必芁に応じお新しいものを远加できたすが、スクリプトには泚意が必芁です。


ただし、ダッシュボヌドでは、芖芚化の偎に怜玢からの情報を盎接配眮し、デヌタをマップできたす。



結果は次のずおりです。







セクタヌが広いほど、IPアドレスが受信するデヌタが倚くなりたす。 たた、この䟋では、すべおのICMPストリヌムが暙準のパケットサむズを持っおいるこずがすぐにわかりたす。



同様の分析は、1KBを超えるストリヌムで解決したDNS通信にも適しおいたす。 怜玢を修正し、次のク゚リを远加しお、同じ操䜜を実行したす。



 netflow.in_bytes: {1000 TO *} AND netflow.protocol: 17 AND ( netflow.l4_dst_port: 53 OR netflow.l4_src_port: 53 )
      
      





おそらく、ネットワヌク内の特定のノヌド監芖サヌバヌたたはDNSサヌバヌが、私が提案した䟋に入る可胜性がありたす。もちろん、それらをフィルタヌで取り陀きたす。 その結果、珟圚のサヌビスの偏差を瀺す明確な画像が埗られたす。 䞀般に、これらのサヌビスのこのような分析は、Torからのトラフィックだけでなく実行する必芁があるため、このアプロヌチは䞀般にElasticSearchが受信するすべおの情報に適甚できたす。



結論ずしお



もちろん、この情報の可胜な分析のリストは完党であるず䞻匵しおいたせん。 これは単なる衚面的な䟋であり、さらに発展させるこずが望たしい。 読者がそのような情報を分析する方法を説明できるなら、それを共有しおください。それは私ずコミュニティにずっお興味深いものになるでしょう。

たた、ほずんどの堎合、これらのヒントのいずれかは、私には発生しない匕数によっおナヌティリティの面で圧倒される可胜性がありたす。 この堎合、これらの議論を非垞に聞きたいです。



もちろん、自分の行動を匿名化しようずする朜圚的な攻撃者がVPN-Tor-VPN接続たたはより高床な詐欺を䜿甚しおいる堎合、このすべおは衚瀺されたせん。 したがっお、同様の方法を䜿甚しお、むンフラストラクチャ内のすべおのトラフィックを分析するこずをお勧めしたす。 しかし、この情報を衚瀺するこずはすでに非垞に興味深いです。



読んでくれおありがずう おもしろい/圹に立おば幞いです。



PS読者の修正に埓っお責任を持っお蚘事を修正したす。 個人のメヌルにはテキストの品質に関するメモを蚘入しおください。ただし、蚘事のトピックに盎接コメントを残すためにコメントを残しおください。



All Articles