はじめに

昨年、hashdbのシグネチャをyaraに書き換えるツールを作った

間が空いてしまったが、次はldbを見ていきたい。

body based signatures

シグネチャの種類としては、HashベースのシグネチャはそのまんまファイルのHashをルールにしているのに対し、ファイルのコンテンツをルールにしているものをbody based signaturesと呼んでいる。

ドキュメントはここ

その中に

がある感じっぽい。

実際のシグネチャ

sigtoolで適当なシグネチャを探してみる

$ 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

パース

少なくとも一個目はなんとなく読めそうな気はする

;がseparaterっぽい

>>> sig = 'Unix.Malware.Reverseshell-10003613-0;Engine:51-255,Target:6;0&1&2&3&4;3677786363706b6a48624b5269737973333371712f6a5a4f4f494c756a335457786335537a363678612f4d4e787a4f735570516466514b4d48306d684a682f3039645a5051794e2d4735387778773153653861;55484620203c45;56204622403c45;4124215e6c3c;4124425e6c3c'
>>> print('\n'.join(sig.split(';')))
Unix.Malware.Reverseshell-10003613-0
Engine:51-255,Target:6
0&1&2&3&4
3677786363706b6a48624b5269737973333371712f6a5a4f4f494c756a335457786335537a363678612f4d4e787a4f735570516466514b4d48306d684a682f3039645a5051794e2d4735387778773153653861
55484620203c45
56204622403c45
4124215e6c3c
4124425e6c3c

最初は名前で、次がTargetDescriptionBlock。ここらへんはHashDBと同じなので共通化できそう。

その後の0&1&2&3&4LogicalExpressionで、YARAでいうところのcondition

で、その後はSubsigセクションで、これはstringsにあたる。

YARA

という訳で、YARAとして書き起こしたい。

>>> sig = 'Unix.Malware.Reverseshell-10003613-0;Engine:51-255,Target:6;0&1&2&3&4;3677786363706b6a48624b5269737973333371712f6a5a4f4f494c756a335457786335537a363678612f4d4e787a4f735570516466514b4d48306d684a682f3039645a5051794e2d4735387778773153653861;55484620203c45;56204622403c45;4124215e6c3c;4124425e6c3c'
>>> strings = list(map(lambda subsig: ' '.join([subsig[i:i+2] for i in range(0, len(subsig), 2)]), sig.split(';')[3:]))
>>> for s in strings:
...     print(f"}")
...
{36 77 78 63 63 70 6b 6a 48 62 4b 52 69 73 79 73 33 33 71 71 2f 6a 5a 4f 4f 49 4c 75 6a 33 54 57 78 63 35 53 7a 36 36 78 61 2f 4d 4e 78 7a 4f 73 55 70 51 64 66 51 4b 4d 48 30 6d 68 4a 68 2f 30 39 64 5a 50 51 79 4e 2d 47 35 38 77 78 77 31 53 65 38 61}
{55 48 46 20 20 3c 45}
{56 20 46 22 40 3c 45}
{41 24 21 5e 6c 3c}
{41 24 42 5e 6c 3c}
rule Unix_Malware_Reverseshell_10003613_0
{
    meta:
        original_ident = "Unix.Malware.Reverseshell-10003613-0"
    strings:
        $0 = {36 77 78 63 63 70 6b 6a 48 62 4b 52 69 73 79 73 33 33 71 71 2f 6a 5a 4f 4f 49 4c 75 6a 33 54 57 78 63 35 53 7a 36 36 78 61 2f 4d 4e 78 7a 4f 73 55 70 51 64 66 51 4b 4d 48 30 6d 68 4a 68 2f 30 39 64 5a 50 51 79 4e 2d 47 35 38 77 78 77 31 53 65 38 61}
        $1 = {55 48 46 20 20 3c 45}
        $2 = {56 20 46 22 40 3c 45}
        $3 = {41 24 21 5e 6c 3c}
        $4 = {41 24 42 5e 6c 3c}
        
    condition:
        $0 and $1 and $2 and $3 and $4
}

こんな感じになりそう。

SUB-EXPRESSIONS

全然これだけで終わるほど単純では無くて、例えばさっき見つけたシグネチャの二個目では、LogicalExpression(0|1|2|3|4)>3,4って書いてある。

これはSUB-EXPRESSIONSというらしく、結構複雑なルールがあるので、これはまた次回

終わりに

この記事はn01e0 Advent Calendar 2024の9日目の記事とします。