ハニーポットの解析で使っている自作の表やグラフを誰にも頼まれてないのに公開してみる


私が使っているT-potというハニーポットでは、さまざまなダッシュボードがプリセットされています。攻撃件数、攻撃元の地図、攻撃タイプなど、これだけでも見ていて楽しいです。楽しいのです!(強め)

このままでも解析はできるのですが、やはり自分が調べたいものに特化したダッシュボードの方が良いのは間違いありません。というわけで、私がよく使っている集計表 / グラフをご紹介します。

KibanaのURLクエリも貼り付けておくので、よかったら使ってください。
Visualize を選択して、

URLの「g=」以降のここに貼り付ければ、実行できると思います。(もっといい方法があったら教えて下さい)

宛先ポートの種類が多い攻撃元IP

ひとつのIPがどれだけの攻撃をしてきているか、またそのIPがどれだけ多くのポートに攻撃をしているかが分かる表です。

168.63.129.16 は 3516種類のポートに対して3816回攻撃してきていることが分かります。これは水平スキャンという攻撃で、複数のポートにアクセスして脆弱性がある可能性があるポートを探っている動きです。

対して、93.71.251.21 は、3種類のポートに対して2981回攻撃してきています。これは深層スキャンという攻撃で、水平スキャンによって脆弱性がありそうなポートの特定が完了しており、そのポートから侵入を試みる動きを示唆しています。もしかしたら、人間が攻撃しているのかもしれません。

調査としては、深層スキャンを行っているIPが具体的にどのような攻撃をしているのか、攻撃コードはどのようなものか、などの調査に繋がります。上記の表は攻撃件数で降順にしていますが、攻撃件数を昇順で並べ替えて、BOTではない人間が行ってるっぽい通信の動向を調べることもあります。

Kibana
(refreshInterval:(pause:!t,value:0),time:(from:now-24h,mode:quick,to:now))&_a=(filters:!(),linked:!f,query:(language:lucene,query:''),uiState:(vis:(params:(sort:(columnIndex:!n,direction:!n)))),vis:(aggs:!((enabled:!t,id:'5',params:(customLabel:%E6%94%BB%E6%92%83%E5%85%83IP,field:src_ip.keyword,missingBucket:!f,missingBucketLabel:Missing,order:desc,orderBy:'4',otherBucket:!f,otherBucketLabel:Other,size:50),schema:bucket,type:terms),(enabled:!t,id:'1',params:(customLabel:%E6%94%BB%E6%92%83%E4%BB%B6%E6%95%B0),schema:metric,type:count),(enabled:!t,id:'4',params:(customLabel:%E5%AE%9B%E5%85%88%E3%83%9D%E3%83%BC%E3%83%88%E3%83%A6%E3%83%8B%E3%83%BC%E3%82%AF%E4%BB%B6%E6%95%B0,field:dest_port),schema:metric,type:cardinality)),params:(perPage:20,showMetricsAtAllLevels:!f,showPartialRows:!f,showTotal:!f,sort:(columnIndex:!n,direction:!n),totalFunc:sum),title:Report_%E5%AE%9B%E5%85%88%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%8C%E5%A4%9A%E3%81%84%E6%94%BB%E6%92%83%E5%85%83IP,type:table))

IP別攻撃件数グラフ

IP別の攻撃件数を時系列で並べると、表だけでは見えないものが見えてきます。例えば、特定IPからの攻撃が急激に増えていればDoS攻撃を受けていることが分かりますし、下図のようにIPが異なっても同じ波形を描く攻撃であれば、同一人物によるBOTであることが分かります。つまり「BOTらしくないIP」を除外することで、本当に調べたいIPを絞り込むことができます。

Kibana
(refreshInterval:(pause:!t,value:0),time:(from:now-24h,mode:quick,to:now))&_a=(filters:!(),linked:!f,query:(language:lucene,query:'NOT%20src_ip:10.0.2.4'),uiState:(),vis:(aggs:!((enabled:!t,id:'1',params:(),schema:metric,type:count),(enabled:!t,id:'3',params:(field:src_ip.keyword,missingBucket:!f,missingBucketLabel:Missing,order:desc,orderBy:'1',otherBucket:!f,otherBucketLabel:Other,size:10),schema:group,type:terms),(enabled:!t,id:'2',params:(customInterval:'2h',drop_partials:!f,extended_bounds:(),field:'@timestamp',interval:auto,min_doc_count:1,timeRange:(from:'2019-12-11T15:00:00.000Z',mode:absolute,to:'2019-12-14T14:59:59.999Z'),useNormalizedEsInterval:!t),schema:segment,type:date_histogram)),params:(addLegend:!t,addTimeMarker:!f,addTooltip:!t,categoryAxes:!((id:CategoryAxis-1,labels:(show:!t,truncate:100),position:bottom,scale:(type:linear),show:!t,style:(),title:(),type:category)),grid:(categoryLines:!f,style:(color:%23eee)),legendPosition:right,seriesParams:!((data:(id:'1',label:Count),drawLinesBetweenPoints:!t,mode:normal,show:true,showCircles:!t,type:line,valueAxis:ValueAxis-1)),times:!(),type:line,valueAxes:!((id:ValueAxis-1,labels:(filter:!f,rotate:0,show:!t,truncate:100),name:LeftAxis-1,position:left,scale:(mode:normal,type:linear),show:!t,style:(),title:(text:Count),type:value))),title:Report_IP別攻撃件数グラフ,type:line))

攻撃元IPが多い宛先ポート

世の中で流行っている攻撃がある場合、その攻撃がわたしのハニーポットにどれだけ来ているかの参考になります。とはいえ、22、445が定常的に多いので見ていてもあまり面白くありません。

Kibana
(refreshInterval:(pause:!t,value:0),time:(from:now-24h,mode:quick,to:now))&_a=(filters:!(),linked:!f,query:(language:lucene,query:'(type:suricata%20OR%20type:dionaea)%20NOT%20src_ip:10.0.2.4'),uiState:(vis:(params:(sort:(columnIndex:!n,direction:!n)))),vis:(aggs:!((enabled:!t,id:'1',params:(customLabel:攻撃件数),schema:metric,type:count),(enabled:!t,id:'2',params:(customLabel:宛先ポート,field:dest_port,missingBucket:!f,missingBucketLabel:Missing,order:desc,orderBy:'3',otherBucket:!f,otherBucketLabel:Other,size:50),schema:bucket,type:terms),(enabled:!t,id:'3',params:(customLabel:攻撃元IP数,field:src_ip.keyword),schema:metric,type:cardinality)),params:(perPage:10,showMetricsAtAllLevels:!f,showPartialRows:!f,showTotal:!f,sort:(columnIndex:!n,direction:!n),totalFunc:sum),title:Report_攻撃元IPが多い宛先ポート,type:table))

IP / JA3

JA3とは、SSL ハンドシェイク中に送信された TLS クライアントの hello パケットで設定された複数のフィールドを解析し、フィンガープリントを得るというものです。IPや証明書が変わってもJA3によって攻撃元を識別することができます。

下記の例では、f436b9416f37d134cadd04886327d3e8 の攻撃元は、複数の異なるIP(168.235.75.38, 210.197.74.203, etc)で攻撃をしてきていますが、フィンガープリントによって同一の攻撃者であることが分かります。

Kibana
(refreshInterval:(pause:!t,value:0),time:(from:now-24h,mode:quick,to:now))&_a=(filters:!(),linked:!t,query:(language:lucene,query:''),uiState:(),vis:(aggs:!((enabled:!t,id:'1',params:(),schema:metric,type:count),(enabled:!t,id:'2',params:(customLabel:JA3,field:tls.ja3.hash.keyword,missingBucket:!f,missingBucketLabel:Missing,order:desc,orderBy:'1',otherBucket:!f,otherBucketLabel:Other,size:5),schema:segment,type:terms),(enabled:!t,id:'3',params:(customLabel:'Source%20IP',field:src_ip.keyword,missingBucket:!f,missingBucketLabel:Missing,order:desc,orderBy:'1',otherBucket:!f,otherBucketLabel:Other,size:5),schema:segment,type:terms)),params:(addLegend:!t,addTooltip:!t,isDonut:!t,labels:(last_level:!t,show:!f,truncate:100,values:!t),legendPosition:right,type:pie),title:'Suricata%20-%20IP%20%2F%20JA3%20-%20Pie',type:pie))

攻撃ペイロード / ペイロード別グラフ

HTTPパラメータ別の攻撃状況を可視化したものです。ペイロード別の件数、ペイロード別に時系列で並べています。この時は、

/ws/v1/cluster/apps/new-application

のペイロードが断続的に送り込まれていました。これは、Hadoop YARN ResourceManagerの任意のコード実行の脆弱性に対する攻撃のようです。

Kibana,攻撃ペイロード
(refreshInterval:(pause:!t,value:0),time:(from:now-24h,mode:quick,to:now))&_a=(filters:!(),linked:!f,query:(language:lucene,query:''),uiState:(vis:(params:(sort:(columnIndex:!n,direction:!n)))),vis:(aggs:!((enabled:!t,id:'1',params:(),schema:metric,type:count),(enabled:!t,id:'2',params:(customLabel:Payload,field:http.url.keyword,missingBucket:!f,missingBucketLabel:Missing,order:desc,orderBy:'1',otherBucket:!f,otherBucketLabel:Other,size:10),schema:bucket,type:terms)),params:(perPage:10,showMetricsAtAllLevels:!f,showPartialRows:!f,showTotal:!f,sort:(columnIndex:!n,direction:!n),totalFunc:sum),title:Report_Attack_Request,type:table))
Kibana,ペイロード別グラフ
(refreshInterval:(pause:!t,value:0),time:(from:now-24h,mode:quick,to:now))&_a=(filters:!(),linked:!f,query:(language:lucene,query:''),uiState:(),vis:(aggs:!((enabled:!t,id:'1',params:(),schema:metric,type:count),(enabled:!t,id:'2',params:(customInterval:'2h',drop_partials:!f,extended_bounds:(),field:'@timestamp',interval:auto,min_doc_count:1,timeRange:(from:now-12h,mode:quick,to:now),useNormalizedEsInterval:!t),schema:segment,type:date_histogram),(enabled:!t,id:'3',params:(field:http.url.keyword,missingBucket:!f,missingBucketLabel:Missing,order:desc,orderBy:'1',otherBucket:!f,otherBucketLabel:Other,size:5),schema:group,type:terms)),params:(addLegend:!t,addTimeMarker:!f,addTooltip:!t,categoryAxes:!((id:CategoryAxis-1,labels:(show:!t,truncate:100),position:bottom,scale:(type:linear),show:!t,style:(),title:(),type:category)),grid:(categoryLines:!f,style:(color:%23eee)),legendPosition:right,seriesParams:!((data:(id:'1',label:Count),drawLinesBetweenPoints:!t,mode:normal,show:true,showCircles:!t,type:line,valueAxis:ValueAxis-1)),times:!(),type:line,valueAxes:!((id:ValueAxis-1,labels:(filter:!f,rotate:0,show:!t,truncate:100),name:LeftAxis-1,position:left,scale:(mode:normal,type:linear),show:!t,style:(),title:(text:Count),type:value))),title:Report_Attack_Request_graph,type:line))

Malware ファミリー別件数 / グラフ

Malwareファミリーを自動的に識別してくれるため、ファミリー別の件数 / グラフを可視化したものです。最近は、Emotetが大流行しているためか、Eternal Blueの件数が非常に多い傾向があります。

Kibana,Malwareファミリー別件数
(filters:!(),linked:!f,query:(language:lucene,query:''),uiState:(vis:(params:(sort:(columnIndex:!n,direction:!n)))),vis:(aggs:!((enabled:!t,id:'1',params:(),schema:metric,type:count),(enabled:!t,id:'2',params:(customLabel:Malware_Family_Name,field:alert.metadata.malware_family.keyword,missingBucket:!f,missingBucketLabel:Missing,order:desc,orderBy:'1',otherBucket:!f,otherBucketLabel:Other,size:10),schema:bucket,type:terms)),params:(perPage:10,showMetricsAtAllLevels:!f,showPartialRows:!f,showTotal:!f,sort:(columnIndex:!n,direction:!n),totalFunc:sum),title:Report_Malware_Family,type:table))
Kibana,Malwareファミリー別グラフ
()&_a=(filters:!(),linked:!f,query:(language:lucene,query:''),uiState:(),vis:(aggs:!((enabled:!t,id:'1',params:(),schema:metric,type:count),(enabled:!t,id:'2',params:(customInterval:'2h',drop_partials:!f,extended_bounds:(),field:'@timestamp',interval:auto,min_doc_count:1,timeRange:(from:now-15m,mode:quick,to:now),useNormalizedEsInterval:!t),schema:segment,type:date_histogram),(enabled:!t,id:'3',params:(field:alert.metadata.malware_family.keyword,missingBucket:!f,missingBucketLabel:Missing,order:desc,orderBy:'1',otherBucket:!f,otherBucketLabel:Other,size:10),schema:group,type:terms)),params:(addLegend:!t,addTimeMarker:!f,addTooltip:!t,categoryAxes:!((id:CategoryAxis-1,labels:(show:!t,truncate:100),position:bottom,scale:(type:linear),show:!t,style:(),title:(),type:category)),grid:(categoryLines:!f,style:(color:%23eee)),legendPosition:right,seriesParams:!((data:(id:'1',label:Count),drawLinesBetweenPoints:!t,mode:normal,show:true,showCircles:!t,type:line,valueAxis:ValueAxis-1)),times:!(),type:line,valueAxes:!((id:ValueAxis-1,labels:(filter:!f,rotate:0,show:!t,truncate:100),name:LeftAxis-1,position:left,scale:(mode:normal,type:linear),show:!t,style:(),title:(text:Count),type:value))),title:Report_Malware_Family_graph,type:line))

まだ発展途上ではありますが、これらの表 / グラフを入り口にして調査対象を得るきっかけにしています。皆さんの参考になれば幸いです。