はじめに

ClamAVのシグネチャはsigtoolを用いて出力することができる。

例えばEICARは

$ sigtool --find-sigs Win.Test.EICAR_HDB-1
[main.hdb] 44d88612fea8a8f36de82e1278abb02f:68:Win.Test.EICAR_HDB-1

こんな感じ。

まぁグッと目を凝らせば読めなくは無いが、いい感じに読みたい。

第一章 EICARのパース

シグネチャについてはドキュメントが一応あるが、実装を読まないと正確には把握できなそう。

というわけで、まずは上のEICARのシグネチャをパースできるだけの物から作った。

EICARのシグネチャはhashdbに入っているので、ハッシュベースの検知を行う必要がある。

hashモジュールをimportしてmd5と比較させれば良さそう

sig2yar

$ clamdscan eicar.com.txt
/home/n01e0/src/lab/malware/eicar/eicar.com.txt: Win.Test.EICAR_HDB-1 FOUND

----------- SCAN SUMMARY -----------
Infected files: 1
Time: 0.001 sec (0 m 0 s)
Start Date: 2023:12:05 01:26:57
End Date:   2023:12:05 01:26:57
$ sigtool --find-sigs Win.Test.EICAR_HDB-1
[main.hdb] 44d88612fea8a8f36de82e1278abb02f:68:Win.Test.EICAR_HDB-1
$ sigtool --find-sigs Win.Test.EICAR_HDB-1
[main.hdb] 44d88612fea8a8f36de82e1278abb02f:68:Win.Test.EICAR_HDB-1
$ sig2yar 44d88612fea8a8f36de82e1278abb02f:68:Win.Test.EICAR_HDB-1 > rule.yara
$ yara rule.yara eicar.com.txt
Win_Test_EICAR_HDB_1 eicar.com.txt
$ cat rule.yara
import "hash"
rule Win_Test_EICAR_HDB_1
{
    meta:
        original_ident = "Win.Test.EICAR_HDB-1"
    condition:
        hash.md5(0, 68) == "44d88612fea8a8f36de82e1278abb02f"
}

パッと見良さそうに見える。

が、これではまだまだ問題がある。

実はdbごとにルールのフォーマットが違い、例えばrevshellのルールとか見てみると

$ sigtool --find-sigs Unix.Malware.Reverseshell
[daily.ldb] Unix.Malware.Reverseshell-10003613-0;Engine:51-255,Target:6;0&1&2&3&4;3677786363706b6a48624b5269737973333371712f6a5a4f4f494c756a335457786335537a363678612f4d4e787a4f735570516466514b4d48306d684a682f3039645a5051794e2d4735387778773153653861;55484620203c45;56204622403c45;4124215e6c3c;4124425e6c3c
[daily.ldb] Unix.Malware.Reverseshell-10014161-0;Engine:51-255,Target:6;(0|1|2|3|4)>3,4;6769746875622e636f6d2f756c696b756e69747a2f787a2f696e7465726e616c2f786c6f672e282a4c6f67676572292e666f726d6174486561646572;642a737472756374207b20462075696e747074723b2070726f63657373202a657865632e436d643b2063202a6d61696e2e636c69656e743b20626f6479537461727450726f63657373202a6d6573736167652e426f6479537461727450726f63657373207d;6769746875622e636f6d2f72687973642f676f2d6769746875622d73656c667570646174652f73656c667570646174652e6d6174636845786563757461626c654e616d65;323030364b686974616e5f536d616c6c5f5363726970744d6973646972656374656420526571756573745061747465726e5f57686974655f5370616365507265636f6e646974696f6e204661696c656450726f6365737320737461727465643a20256450726f78792d417574686f72697a6174696f6e52436f64654e6f7449;6769746875622e636f6d2f696e636f6e73687265766561626c652f676f2d7570646174652f696e7465726e616c2f6f736578742e45786563757461626c65

まぁこんな感じでガラッと変わる。まずそもそもルールの名前の位置から違うし、delimiterも:から;になってるっぽい。

厳しい。

そもそもhashdbでもhashの方式が違ったりして怖い。

とりあえずEICARのシグネチャをパースするという目標は達成できたので、これらは次の目標ということにする

最終的にはserde化してyaraと相互変換とかできたら面白いと思いませんか?

おわりに

この記事はn01e0 Advent Calendar 2023の4日目の記事です。

明日はあるかわかりません

また、IPFactory OB Advent Calendar 2023の4日目の記事も兼ねています。