YaGo, parsing Yara rules like a Gopher

3 minute read Published:

Yago transforma reglas yara a formato JSON

Después de varias semanas dandole duro por fin he liberado YaGo. Ya hice la presentación en la Golang release party, pero lo vuelvo a comentar. YaGo es un herramienta que permite convertir reglas Yara a format JSON. Esto no ofrece una mejora sobre Yara, pero si lo hace a la hora de gestionar las mismas, pues disponiendo de reglas en formato JSON las podemos importar en bases de datos NoSQL, que normalmente aceptan JSON como entrada de datos.

YaGo permite ambos caminos, el de convertir una relga Yara a JSON y viceversa, convertir una relga en formato JSON a Yara. Esto se puede conseguir con los cuatro métodos o comandos que acepta. Veamos un ejemplo.

./yago
Usage:
  yago fileName <fileName> [ --validJSON ]
  yago dirName <dirName> [ --validJSON ]
  yago indexFile <indexFile> [ cwd <path> ] [ --validJSON ]
  yago inputFile <inputFile> outputDir <outputDir> [ --overwrite ] [ --validJSON ]
  yago inputFile <inputFile> outputFile <outputFile> [ --overwrite ] [ --validJSON ]
  yago -h | --help
  yago --version

Los comandos se pueden diferenciar en dos grupos, el primero de ellos engloba a fileName, dirName y indexFile, el segundo solo contiene el comando inputFile. Con el primer grupo se puede pasar reglas Yara a JSON y con el segundo se convierten las relgas en formato JSON a Yara.

El uso básico de la herramienta sería:

yago fileName test/EK_Zeus.yar
{"file_name":"EK_Zeus.yar","imports":null,"rules":[{"name":"zeus_js","global":false,"private":false,"tags":["EK"],"meta":{"author":"Josh Berry","date":"2016-06-26","description":"Zeus Exploit Kit Detection","hash0":"c87ac7a25168df49a64564afb04dc961","sample_filetype":"js-html","yaragenerator":"https://github.com/Xen0ph0n/YaraGenerator"},"strings":[{"name":"$string0","value":"var jsmLastMenu ","modifers":null,"type":1},{"name":"$string1","value":"position:absolute; z-index:99' ","modifers":null,"type":1},{"name":"$string2","value":" -1)jsmSetDisplayStyle('popupmenu' ","modifers":null,"type":1},{"name":"$string3","value":" '\u003ctr\u003e\u003ctd\u003e\u003ca href","modifers":null,"type":1},{"name":"$string4","value":"  jsmLastMenu ","modifers":null,"type":1},{"name":"$string5","value":"  var ids ","modifers":null,"type":1},{"name":"$string6","value":"this.target","modifers":null,"type":1},{"name":"$string7","value":" jsmPrevMenu, 'none');","modifers":null,"type":1},{"name":"$string8","value":"  if(jsmPrevMenu ","modifers":null,"type":1},{"name":"$string9","value":")if(MenuData[i])","modifers":null,"type":1},{"name":"$string10","value":" '\u003cdiv style","modifers":null,"type":1},{"name":"$string11","value":"popupmenu","modifers":null,"type":1},{"name":"$string12","value":"  jsmSetDisplayStyle('popupmenu' ","modifers":null,"type":1},{"name":"$string13","value":"function jsmHideLastMenu()","modifers":null,"type":1},{"name":"$string14","value":" MenuData.length; i","modifers":null,"type":1}],"condition":"14 of them"}]}

Que aplicando el comando jq podríamos ver la salida tal que así:

yago fileName test/EK_Zeus.yar | jq .
{
  "file_name": "EK_Zeus.yar",
  "imports": null,
  "rules": [
    {
      "name": "zeus_js",
      "global": false,
      "private": false,
      "tags": [
        "EK"
      ],
      "meta": {
        "author": "Josh Berry",
        "date": "2016-06-26",
        "description": "Zeus Exploit Kit Detection",
        "hash0": "c87ac7a25168df49a64564afb04dc961",
        "sample_filetype": "js-html",
        "yaragenerator": "https://github.com/Xen0ph0n/YaraGenerator"
      },
      "strings": [
        {
          "name": "$string0",
          "value": "var jsmLastMenu ",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string1",
          "value": "position:absolute; z-index:99' ",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string2",
          "value": " -1)jsmSetDisplayStyle('popupmenu' ",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string3",
          "value": " '<tr><td><a href",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string4",
          "value": "  jsmLastMenu ",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string5",
          "value": "  var ids ",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string6",
          "value": "this.target",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string7",
          "value": " jsmPrevMenu, 'none');",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string8",
          "value": "  if(jsmPrevMenu ",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string9",
          "value": ")if(MenuData[i])",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string10",
          "value": " '<div style",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string11",
          "value": "popupmenu",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string12",
          "value": "  jsmSetDisplayStyle('popupmenu' ",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string13",
          "value": "function jsmHideLastMenu()",
          "modifers": null,
          "type": 1
        },
        {
          "name": "$string14",
          "value": " MenuData.length; i",
          "modifers": null,
          "type": 1
        }
      ],
      "condition": "14 of them"
    }
  ]
}

Por último decir que es posible enviar la salida de YaGo a bases de datos, tal como se comentaba al inicio. Por ejemplo:

yago dirName rules_dir | mongoimport --db yararules --collection rules --type json

O, si sequire realizar la operación inversa.

mongoexport --db yararules --collection rules --type json > rules.json ; yago inputFile rules.json outputFile rules.yar

Para más información, debatir sobre nuevas funcionalidades o reportar issues pueden ver el código en Github.