こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

Canarytokensサービスを試してみた

ある調べものをしていたところ、Canarytokensというサービスがあることを知った。

canarytokens.org

Canarytokensはカナリアトークンを生成するサービスであり、無料で利用できるほか、githubソースコードやDockerfileが公開されているため自分でサービス稼働環境を構築できる。カナリアトークンとはターゲット(被害者)がWebページ、電子メール、ファイルなどのリソースにアクセスする操作をしたときに、そのアクセスした事実やターゲットの環境情報(IPアドレス、UserAgent、ユーザ名など)を攻撃者に通知するための仕掛けである。

このサービスを知った時は、アクセス解析で使われるようなWebページに極小の透明画像やiframeを埋め込むような方式を想像したが、ドキュメントを読んでいると他にも様々な方式をサポートしていることがわかった。そこで、実際にどういった仕掛けで、どういった情報が記録されるのか試してみることにした。

なお、なぜカナリアというかは、昔の炭鉱でガス発見の警報装置としてカナリアが使われていたことに由来していると思われる。
ja.wikipedia.org

ここから各方式の紹介に入るが、全ての方式に共通して、ターゲットがカナリアトークンに引っかかった時の通知先としてEメールアドレスを指定できる。今回は、以下の使い捨てのメールアドレス発行サービスを使用した。
✉ Guerrilla Mail - Disposable Temporary E-Mail Address

Web bug / URL token

URLが生成される。

f:id:graneed:20210224233209p:plain

f:id:graneed:20210224233228p:plain

生成されたURLにアクセスすると真っ白な画面が表示される。 HTMLソースを確認すると、ブラウザ情報を記録するようなフィンガープリント機能を持つJavaScriptが実装されていることを確認できる。

URLへアクセス後に以下の通知メールを受信した。
f:id:graneed:20210224233712p:plain

また、カナリアトークンごとにHistoryページが提供され、そこではもっと詳細な記録情報を閲覧できる。
f:id:graneed:20210224234011p:plain

DNS token

canarytokens.comのサブドメインが生成される。
サブドメインnslookupコマンドで問合せすると以下の情報が記録された。
f:id:graneed:20210225000024p:plain

Unique email address

Eメールアドレスが生成される。
メール送信すると、以下の情報が記録された。
f:id:graneed:20210225224509p:plain

Custom Image Web bug

画像をアップロードすると、URLが生成される。
imgタグ等でアクセスすると、アップロードした画像が表示され、アクセスした際に情報が記録される。
記録される情報は接続元IPアドレスとUserAgent。

見つからないようにするには、1px×1pxの透明画像を使用すると良いのだと思う。 最初に自分が想像していたカナリアトークンに一番近い。

Microsoft Word Document

Wordファイルが生成される。
開いても特にマクロは埋まっていない。ただ、ヘッダーとフッターが設定されているように見える。 f:id:graneed:20210225003453p:plain

WordファイルをZipファイルとして展開すると、footer2.xmlINCLUDEPICTURE "http://canarytokens.com/about/traffic/articles/whb0ezqg0ahskmqdwjjndemyg/contact.php"が埋め込まれており、HTTPリクエストが飛んだようだ。

記録される情報は接続元IPアドレスとUserAgent。
自分の環境ではUserAgentはMozilla/4.0 (compatible; ms-office; MSOffice 16)となった。

機密ファイルが社外で開かれていないかを確認するために使用できそうだ。

Acrobat Reader PDF Document

PDFファイルが生成される。
Acrbat Readerで開くと以下の警告ダイアログが表示される。
f:id:graneed:20210225005240p:plain

「許可」するとWebブラウザが立ち上がり、URLへのアクセスが発生した。 ただ、HTTPではなくDNSへのアクセスを見ているようで、記録される情報は接続元IPアドレス程度であった。

警告ダイアログが表示されてしまうと、ターゲットに気付かれないようにするのは少々厳しい。

Windows Folder

個人的に一番驚いた手法。
Zipファイルが生成され、Zipファイルを展開するとMy Documentsというフォルダが展開される。 My Documentsフォルダを開くと、エクスプローラーが固まるためしばらく待つと、フォルダの中にdesktop.iniファイルが確認できる。 desktop.iniの中身は以下のとおり。

[.ShellClassInfo]
IconResource=\\%USERNAME%.%COMPUTERNAME%.%USERDOMAIN%.INI.jomvcu020919h7fvr2k2er61h.canarytokens.com\resource.dll

フォルダをエクスプローラーで開くだけでDNS通信が発生していたようで、結果、以下の情報が記録された。
f:id:graneed:20210225010738p:plain

これもまた、機密のzipファイルが社外で開かれていないかを確認するために使用できそうだ。

Custom exe / binary

EXEファイルをアップロードすると、カナリアトークンが埋め込まれたEXEファイルが生成される。 ここでは7zのインストール用のEXEファイルで試すことにした。
f:id:graneed:20210225011116p:plain

面白いことに、生成されたEXEファイルをダウンロードすると同時に以下の情報が記録された。 f:id:graneed:20210225011640p:plain

Microsoft Defenderの仕業かな」と思って設定を確認したところ「サンプルの自動送信」がオンになっていた。 f:id:graneed:20210225012006p:plain

設定をオフにしてから再度EXEファイルを生成すると、ダウンロードすると同時に記録されることは無くなったため予想通り。サンプルの自動送信をすると、Microsoftサンドボックス環境みたいなところで実行されるのだろうか。

自分でEXEファイルを実行すると、以下の情報が記録された。思ったより情報量は少ない。
f:id:graneed:20210225012652p:plain

ターゲットにEXEを実行させる障壁が高そうだ。 そして折角EXEを実行させられるのであれば、もっと色々なことができそうだ。

Cloned Website

以下のようなJavaScriptが生成される。

if (document.domain != "https://example.com") {
    var l = location.href;
    var r = document.referrer;
    var m = new Image();
    m.src = "http://canarytokens.com/"+
            "fqcm9lekdo4ibfoh33ivslg05.jpg?l="+
            encodeURI(l) + "&r=" + encodeURI(r);
}

自分が管理しているWebサイトにこのJavaScriptを埋め込んでおくと、自分のWebサイトをクローンされて、そこに誰かがアクセスした際に、クローン先のサイトのURLの通知をうけることができるようだ。

サイトの運用者側で、フィッシングサイトを見つけるのに役立ちそうだ。

SQL Server

カナリアトークンの生成画面は以下のとおり。 通知のトリガーとなるDML操作とテーブルを指定できる。 f:id:graneed:20210225013311p:plain

実行すると以下のようなSQLが生成される。

--create a stored proc that'll ping canarytokens
      CREATE proc ping_canarytoken
      AS
      BEGIN
          declare @username varchar(max), @base64 varchar(max), @tokendomain varchar(128), @unc varchar(128), @size int, @done int, @random varchar(3);

          --setup the variables
          set @tokendomain = 'h3q9kuxguigeeyscumxvia9s1.canarytokens.com';
          set @size = 128;
          set @done = 0;
          set @random = cast(round(rand()*100,0) as varchar(2));
          set @random = concat(@random, '.');
          set @username = SUSER_SNAME();

          --loop runs until the UNC path is 128 chars or less
          while @done <= 0
          begin
              --convert username into base64
              select @base64 = (SELECT
                  CAST(N'' AS XML).value(
                        'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
                      , 'VARCHAR(MAX)'
                  )   Base64Encoding
              FROM (
                  SELECT CAST(@username AS VARBINARY(MAX)) AS bin
              ) AS bin_sql_server_temp);

              --replace base64 padding as dns will choke on =
              select @base64 = replace(@base64,'=','-')

              --construct the UNC path
              select @unc = concat('\\',@base64,'.',@random,@tokendomain,'\a')

              -- if too big, trim the username and try again
              if len(@unc) <= @size
                  set @done = 1
              else
                  --trim from the front, to keep the username and lose domain details
                  select @username = substring(@username, 2, len(@username)-1)
          end
          exec master.dbo.xp_fileexist @unc;
      END

      --add a trigger if data is altered
      CREATE TRIGGER TRIGGER1
        ON TABLE1
        AFTER INSERT
      AS
      BEGIN
      exec ping_canarytoken
      end

環境を作って試すところまでできていないが、SQL文を見ると、SUSER_SNAME()関数を実行してWindowsのユーザ名を取得し、サブドメイン名として送信しているようだ。

攻撃者の興味を引くようなテーブルを用意して、データベースの中身が窃取されていないかを確認するために使用できそうだ。

QR Code

その名のとおり、QRコードが生成される。
f:id:graneed:20210225013725p:plain

QRコードには以下のようなURLが埋め込まれている。 http://canarytokens.com/feedback/traffic/tags/iuixoweag4nucmn1vo76jk0mv/submit.aspx

アクセスすると記録される情報は接続元IPアドレスとUserAgent。

SVN

以下のコマンドが生成される。

svn propset svn:externals "extras http://dvztaffuww7mzjfe7tw0p75e9.canarytokens.com" .

自分が管理しているリポジトリにこのコマンドを実行することで、誰がか勝手にリポジトリをクローンしたことに気付けるようだ。

AWS keys

実行すると以下のAWSのアクセスキーが生成される。

[default]
aws_access_key_id = AKIAXYZDQCENVA3R6Y7J
aws_secret_access_key = 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
output = json
region = us-east-2

AWS CLIで使用してみる。

root@kali:~# aws configure --profile canary
AWS Access Key ID [None]: AKIAXYZDQCENVA3R6Y7J
AWS Secret Access Key [None]: 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
Default region name [None]: us-east-2
Default output format [None]: json

root@kali:~# aws s3 ls --profile canary

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

20分程度待つと以下の情報が記録された。 f:id:graneed:20210225015750p:plain

Fast Redirect

Web bug / URL tokenと似ているが、URLを生成する際にリダイレクト先のURLの指定ができる。
生成されたURLへアクセスすると、指定したURLにリダイレクトされる。
記録される情報は接続元IPアドレスとUserAgent。

Slow Redirect

Fast Redirectと同様に、URLを生成する際にリダイレクト先のURLの指定ができる。
記録される情報はWeb bug / URL tokenと同じで、接続元IPアドレスとUserAgentに加え、ブラウザ情報なども含まれる。

Slack API key

実行すると以下のSlackのAPIキーが生成される。

# Slack API key
slack_api_key = xoxp-905439787527-905447633015-1784132156549-acecf32171dd971f2ee2561cd0bd0eae

curlコマンドでAPIを実行してみる。

root@kali:~# curl 'https://slack.com/api/auth.test' \
> -d 'token=xoxp-905439787527-905447633015-1784132156549-acecf32171dd971f2ee2561cd0bd0eae'
{"ok":true,"url":"https:\/\/ctorgworkspace.slack.com\/","team":"ct.org","user":"marge.haskell.bridge","team_id":"TSMCXP5FH","user_id":"USMD5JM0F","is_enterprise_install":false}

10分程度待つと以下の情報が記録された。 f:id:graneed:20210225020148p:plain

まとめ

カナリアトークンの使い道としては、生成したURL等を何らかの媒体でばら撒いてハニーポットとして使うほか、機密ファイルの漏洩有無の確認、Webサイトのクローン先のサイトの検出など、多岐にわたる。こちらのサービスと方式のパターンを知っておくと、どこかで役に立ちそうである。実際に何か目的があって使う場合は、自分で環境を立てる方がよさそうだ。