はじめに
2020年5月、1000をも超える偽サイトが作成されているというニュースが流れました。
- 偽サイト1000超か 海外でも被害、謎深まる―売却目的の可能性も・専門家
- 被害サイト1000サイト以上! 規模の大きさも理由も謎だらけ…史上最大の「偽サイト」事件 三上洋氏に聞く
詳細についてはリンク先の記事を御覧いただきたいのですが、作成されている偽サイトには以下の共通点があります。
- ホスティングサービスが CloudFlare
- ドメインのオーナーが freenom.com
ここまで分かっているなら、偽サイトらしきサイトを大量に収集し、それが本当に偽サイトかというのを確認してみよう!というのがこの記事の趣旨です。
偽サイトの収集、データクレンジング、Maltego での可視化など、作業が細かくて長いですが、おつきあいください。
調査対象ドメイン収集編
Google 検索結果の1ページあたりの件数を増やす
Google検索の結果をデータソースとして使用するため、1ページあたりの検索結果を最大まで増やします。
「検索の設定」を開きます。
「ページあたりの表示件数」のスライダーを100にします。
Google 検索結果をcsv でダウンロードするブックマークレットを作成する
Chrome のブックマークを新規作成し、URLに以下を貼り付けます。名前は何でもいいです。
javascript:(()=>{const b=d=>'"'+d.map(g=>g.replace(/"/g,'""')).join('","')+'"',c=new Blob([new Uint8Array([239,187,191]),[b(['href','decoded','title','breadcrumb','date','description'])].concat(Array.from(document.querySelectorAll('div.rc')).map(d=>{const g=d.querySelector.bind(d),h=g('div.r a').href,i=g('div.s span.f'),j=g('div.s span.st');let k=h;try{k=decodeURI(h)}catch(l){}return b([h,k,g('div.r h3').innerText,g('div.r cite').innerText,i?i.innerText.replace(' - ',''):'',j?i?j.innerText.replace(i.innerText,'').trimLeft():j.innerText:''])})).join('\n')],{type:/Chrome|Firefox/.test(navigator.userAgent)?'text/csv':'application/octet-stream'});if(navigator.msSaveOrOpenBlob)navigator.msSaveOrOpenBlob(c,document.title+'.csv');else{const d=URL.createObjectURL(c);location.href=d,setTimeout(()=>URL.revokeObjectURL(d),1e3)}})()
偽サイトっぽいサイトを Google 検索
以下の文字列で検索します。
今回の事例では、ドメインが tk, ml, ga, cf, gq などのパターンが見られるため、それらのドメインに絞っています。かつ、企業ページでよくある「会社概要」のページがあるサイトを検索しています。
"会社概要" AND (site:tk OR site:ml OR site:ga OR site:cf OR site:gq)
CSVダウンロード
検索結果が表示されたら、先程保存したブックマークレットを実行します。
検索結果が CSV ファイルとしてダウンロードできます。検索結果が複数ページに渡って表示された場合は、それぞれのページで CSV ダウンロードを実行してください。ページごとに CSV ファイルが作成されるので、マージしてください。
スプレッドシートでドメインだけ切り出してコマンド生成
CSV には URL が記載されていますが、ドメイン以外は不要なので、ドメインだけ切り出します。
やり方は何でもいいのですが、私は Google スプレッドシートを使いました(正規表現が使えないのがバレるな)。
A列以外は削除し、B列に以下の関数を貼り付けると、ドメインだけ切り出せます(このあとの作業で必要なコマンドも連結させています)。
="domain=""" & SUBSTITUTE(MID(A2,FIND("/",A2,FIND("/",A2,1)+1)+1,SEARCH("/",A2,FIND("/",A2,FIND("/",A2,1)+1)+1)-(FIND("/",A2,FIND("/",A2,1)+1)+1)),"www.","") & """; lookup_result=`nslookup $domain`; result_check $lookup_result"
シェル編
シェルとして保存
B列の値を以下のシェルの下に貼り付けて保存します。
#!/bin/bash
result_check(){
if [ "`echo $lookup_result | grep 'NXDOMAIN'`" ]; then
echo "IPアドレスが見つかりませんでした $domain"
else
echo "IPアドレスが見つかりました $domain"
echo "$domain" >> domain_exist.txt
fi
}
## この下にスプレッドシートのB列の価を貼り付ける
domain="fimomoti.tk"; lookup_result=`nslookup $domain`; result_check $lookup_result
domain="anverachuns.tk"; lookup_result=`nslookup $domain`; result_check $lookup_result
domain="simispsymteochor.ga"; lookup_result=`nslookup $domain`; result_check $lookup_result
domain="terweamamo.tk"; lookup_result=`nslookup $domain`; result_check $lookup_result
domain="pullheadsscapin.tk"; lookup_result=`nslookup $domain`; result_check $lookup_result
domain="nafullduncnar.tk"; lookup_result=`nslookup $domain`; result_check $lookup_result
シェル実行
シェルを実行すると、各ドメインに対して nslookup を実行します。終わるまでしばらく待ちます。
実行結果は、シェルスクリプトのファイルと同じディレクトリに「domain_exist.txt」というファイルに保存されています。見つかったドメインをどれかひとつピックアップしてください。
今回は「aterrexergo.tk」というドメインを調査対象とします。
Maltego 編
IP アドレスのオーナーを調査する
Maltego の登録、設定方法はここでは省略します。すいません。
「DNS Name」をグラフエリアにドラッグします。
DNS のアイコンをダブルクリックし、aterrexergo.tk と入力します。
DNS のアイコンを右クリック →「Resolve to IP」の左にある「+」をクリック → 「To IP Address [DNS]」をクリックします。
IP アドレスを2つとも選択して右クリック → 「PATERVA CTAS CE」の左にある「+」をクリック → 「IP owner detail」の右側にある「>>」をクリックします。
この IP アドレスに紐づく様々な情報がアイコンとして表示されます。
Email の情報から、この IP アドレスのオーナーが CloudFlare であることが分かりました。
Domain を調査する
DNS のアイコンを右クリック → 「Change Type」→ 「Infrastructure」→「Domain」をクリック
「PATERVA CTAS CE」→「Domain owner detail」の右にある「>>」をクリック
連絡先に「@freenom.com」の文字が見えます。今回の偽サイトが大量に作成される件については、ドメインのオーナーが「@freenom.com」であることが分かっています。
以上のことから、IP アドレスのオーナーが Cloudflare、ドメインのオーナーが freenom であることが判明したため、aterrexergo.tk は偽サイトと判断できます。
最後に
偽サイトのURLを収集したあと、いきなり Maltego で調査することも可能ですが、ドメインが TakeDown されていたり、Parked Domain である場合、IPが紐付かないため作業に無駄が生じます。そのため、シェルスクリプトで複数のドメインをまとめて死活確認し、データをクレンジングした、というのが今回の調査手順のミソです。
よろしければ、参考にしてください。