YARA · Synacktiv rules
SYNACKTIV_SYNACKTIV_WEBSHELL_ASPX_Suo5_May25
Detects the .NET version of the suo5 webshell
- Auteur
- Synacktiv, Maxence Fossat [@cybiosity]
- Date
- 2025-05-12
- Score / Qualité
- 75 / 80
Ce que détecte cette règle
Detects the .NET version of the suo5 webshell
Elle définit 18 motifs (17 texte, 0 hex, 1 regex).
Résumé généré à partir des métadonnées et de la condition de la règle.
Source de la règle
rule SYNACKTIV_SYNACKTIV_WEBSHELL_ASPX_Suo5_May25 : WEBSHELL COMMODITY FILE
{
meta:
= "Detects the .NET version of the suo5 webshell"
= "Synacktiv, Maxence Fossat [@cybiosity]"
= "d30a7232-f00b-45ab-9419-f43b1611445a"
= "2025-05-12"
= "2025-05-12"
= "https://www.synacktiv.com/en/publications/open-source-toolset-of-an-ivanti-csa-attacker"
= "https://github.com/synacktiv/synacktiv-rules/blob/d234cc4da0783db7dca56ae8dd5252afdc248df8/2025/offensive_tools/webshell_aspx_suo5.yar#L1-L46"
= "https://github.com/synacktiv/synacktiv-rules/blob/d234cc4da0783db7dca56ae8dd5252afdc248df8/LICENSE.md"
= "06710575d20cacd123f83eb82994879367e07f267e821873bf93f4db6312a97b"
= "e6979d7df0876679fc2481aa68fcec5b6ddc82d854f63da2bddb674064384f9a"
= "3bbbef1b4ead98c61fba60dd6291fe1ff08f5eac54d820e47c38d348e4a7b1ec"
= "345c383dd439eb523b01e1087a0866e13f04ff53bb8cc11f3c70b4a382f10c7e"
= "838840dd76ff34cee45996fdc9a87856c9a0f14138e65cb9eb6603ed157d1515"
= "d9657ac8dd562bdd39e8fcc1fff37ddced10f7f3f118d9cd4da6118a223dcc45"
= "68dc29b2cedc26e638eaa12bf2a2d0415de323097baf5ea61dba52bd20b5beee"
= 75
= 80
= "WEBSHELL, COMMODITY, FILE"
= "DRL-1.1"
= "TLP:CLEAR"
= "PAP:CLEAR"
strings:
$user_agent = ".Equals(\"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.1.2.3\")" ascii
$header = "Response.AddHeader(\"X-Accel-Buffering\", \"no\")" ascii
$xor = /= \(byte\)\(\w{1,1023}\[\w{1,1023}\] \^ \w{1,1023}\);/
$s1 = "Request.Headers.Get(\"User-Agent\")" ascii
$s2 = "if (Request.ContentType.Equals(\"application/plain\"))" ascii
$s3 = "Response.ContentType = \"application/octet-stream\";" ascii
$s4 = "= Request.BinaryRead(Request.ContentLength);" ascii
$s5 = "= Response.OutputStream;" ascii
$s6 = "new TcpClient()" ascii
$s7 = ".BeginConnect(" ascii
$s8 = ".GetStream().Write(" ascii
$s9 = "new BinaryWriter(" ascii
$s10 = "new BinaryReader(" ascii
$s11 = ".ReadBytes(4)" ascii
$s12 = "BitConverter.GetBytes((Int32)" ascii
$s13 = "BitConverter.ToInt32(" ascii
$s14 = "Array.Reverse(" ascii
$s15 = "new Random().NextBytes(" ascii
condition:
filesize < 100KB and ( $user_agent or ( ( $header or $xor ) and 8 of ( $s* ) ) or 12 of ( $s* ) )
}
Chaînes (18 motifs)
| Identifiant | Type | Valeur | Modificateurs |
|---|---|---|---|
| $user_agent | texte | ".Equals(\"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.1.2.3\")" | ascii |
| $header | texte | "Response.AddHeader(\"X-Accel-Buffering\", \"no\")" | ascii |
| $xor | regex | /= \(byte\)\(\w{1,1023}\[\w{1,1023}\] \^ \w{1,1023}\);/ | |
| $s1 | texte | "Request.Headers.Get(\"User-Agent\")" | ascii |
| $s2 | texte | "if (Request.ContentType.Equals(\"application/plain\"))" | ascii |
| $s3 | texte | "Response.ContentType = \"application/octet-stream\";" | ascii |
| $s4 | texte | "= Request.BinaryRead(Request.ContentLength);" | ascii |
| $s5 | texte | "= Response.OutputStream;" | ascii |
| $s6 | texte | "new TcpClient()" | ascii |
| $s7 | texte | ".BeginConnect(" | ascii |
| $s8 | texte | ".GetStream().Write(" | ascii |
| $s9 | texte | "new BinaryWriter(" | ascii |
| $s10 | texte | "new BinaryReader(" | ascii |
| $s11 | texte | ".ReadBytes(4)" | ascii |
| $s12 | texte | "BitConverter.GetBytes((Int32)" | ascii |
| $s13 | texte | "BitConverter.ToInt32(" | ascii |
| $s14 | texte | "Array.Reverse(" | ascii |
| $s15 | texte | "new Random().NextBytes(" | ascii |
Condition
filesize < 100KB and ( $user_agent or ( ( $header or $xor ) and 8 of ( $s* ) ) or 12 of ( $s* ) )En clair (Heuristique)
- Le fichier doit faire moins de 100KB (garde-fou peu coûteux qui écarte les gros fichiers).
- Au moins 8 motifs de ( $s* ) doivent être trouvés.
- Au moins 12 motifs de ( $s* ) doivent être trouvés.
- Le motif $user_agent doit être présent.
- Le motif $header doit être présent.
- Le motif $xor doit être présent.
Tester cette règle dans votre navigateur
Déposez un fichier pour le scanner avec cette règle grâce à YARA-X compilé en WebAssembly. Rien n’est envoyé.
Hashes d’échantillons
Hashes des échantillons listés par l’auteur dans les métadonnées de la règle (à rechercher dans votre plateforme de threat intelligence).
- 06710575d20cacd123f83eb82994879367e07f267e821873bf93f4db6312a97b
- e6979d7df0876679fc2481aa68fcec5b6ddc82d854f63da2bddb674064384f9a
- 3bbbef1b4ead98c61fba60dd6291fe1ff08f5eac54d820e47c38d348e4a7b1ec
- 345c383dd439eb523b01e1087a0866e13f04ff53bb8cc11f3c70b4a382f10c7e
- 838840dd76ff34cee45996fdc9a87856c9a0f14138e65cb9eb6603ed157d1515
- d9657ac8dd562bdd39e8fcc1fff37ddced10f7f3f118d9cd4da6118a223dcc45
Licence et attribution
Auteur : Synacktiv, Maxence Fossat [@cybiosity]
Dépôt source : Synacktiv rules @ d234cc4da0
Licence : Detection Rule License 1.1 (indiquée dans les métadonnées de la règle)
“DRL-1.1”
Reprise via YARA Forge 20260927, qui préfixe les noms de règles par la source et ajoute des champs meta normalisés.
Identifiant de règle: d30a7232-f00b-45ab-9419-f43b1611445a
Métadonnées
| tlp | TLP:CLEAR |
|---|---|
| pap | PAP:CLEAR |
Règles liées
- Outil offensifSynacktiv rules· Synacktiv, Maxence Fossat [@cybiosity]· 2025-05-12
- Outil offensifSynacktiv rules· Synacktiv, Maxence Fossat [@cybiosity]· 2025-05-12