{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2019/12/05/skip-%e2%80%91-2-0-du-groupe-winnti-une-porte-derobee-microsoft-sql-server-bien-choisir-son-serveur-d-impression/","llm_html_url":"https://tutos-gameserver.fr/2019/12/05/skip-%e2%80%91-2-0-du-groupe-winnti-une-porte-derobee-microsoft-sql-server-bien-choisir-son-serveur-d-impression/llm","llm_json_url":"https://tutos-gameserver.fr/2019/12/05/skip-%e2%80%91-2-0-du-groupe-winnti-une-porte-derobee-microsoft-sql-server-bien-choisir-son-serveur-d-impression/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Skip ‑ 2.0 du groupe Winnti: une porte dérobée Microsoft SQL Server\n\n &#8211; Bien choisir son serveur d impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2019-12-05T10:23:27+00:00","modified_at":"2019-12-05T10:23:27+00:00","word_count":2735,"reading_time_seconds":821,"summary":"Un groupe de cyberespionnage notoire rabaisse MSSQL Les chercheurs d&#39;ESET suivent depuis un certain temps les activités du groupe Winnti, actif depuis au moins 2012 et responsable d&#39;attaques de grande envergure de la chaîne logistique contre l&#39;industrie du jeu vidéo et des logiciels. Récemment, nous avons découvert une porte dérobée non documentée ciblant Microsoft SQL [&hellip;]","summary_points":["Un groupe de cyberespionnage notoire rabaisse MSSQL\n\nLes chercheurs d&#39;ESET suivent depuis un certain temps les activités du groupe Winnti, actif depuis au moins 2012 et responsable d&#39;attaques de grande envergure de la chaîne logistique contre l&#39;industrie du jeu vidéo et des logiciels.","Récemment, nous avons découvert une porte dérobée non documentée ciblant Microsoft SQL (MSSQL) qui permettait aux attaquants de conserver un pied très discret au sein d’organisations compromises.","Cette porte dérobée présente de nombreuses similitudes avec le PortReuse backdoor, autre outil utilisé par le groupe Winnti et documenté pour la première fois par ESET en octobre 2019, tel que l&#39;utilisation du même programme de personnalisation et du même programme de lancement VMProtected.","C&#39;est pourquoi nous attribuons cette porte dérobée au groupe Winnti."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"66b51af84f04b638ff0f63acf80362e5","plain_text":"Un groupe de cyberespionnage notoire rabaisse MSSQL\n\nLes chercheurs d&#39;ESET suivent depuis un certain temps les activités du groupe Winnti, actif depuis au moins 2012 et responsable d&#39;attaques de grande envergure de la chaîne logistique contre l&#39;industrie du jeu vidéo et des logiciels. Récemment, nous avons découvert une porte dérobée non documentée ciblant Microsoft SQL (MSSQL) qui permettait aux attaquants de conserver un pied très discret au sein d’organisations compromises. Cette porte dérobée présente de nombreuses similitudes avec le PortReuse backdoor, autre outil utilisé par le groupe Winnti et documenté pour la première fois par ESET en octobre 2019, tel que l&#39;utilisation du même programme de personnalisation et du même programme de lancement VMProtected. C&#39;est pourquoi nous attribuons cette porte dérobée au groupe Winnti.\nPlus tôt cette année, nous avons reçu un échantillon de cette nouvelle porte dérobée appelée skip-2.0 par ses auteurs et une partie de l’arsenal du groupe Winnti. Cette porte dérobée cible MSSQL Server 11 et 12, permettant à l’attaquant de se connecter furtivement à n’importe quel compte MSSQL à l’aide d’un mot de passe magique, tout en masquant automatiquement ces connexions dans les journaux. Une telle porte dérobée pourrait permettre à un attaquant de copier, modifier ou supprimer furtivement le contenu de la base de données. Cela pourrait être utilisé, par exemple, pour manipuler des devises dans le jeu pour un gain financier. Des manipulations de bases de données de devises dans le jeu par des opérateurs de Winnti ont déjà été signalées. Au meilleur de notre connaissance, skip-2.0 est la première porte dérobée du serveur MSSQL à être documentée publiquement. Notez que, même si MSSQL Server 11 et 12 ne sont pas les versions les plus récentes (publiées en 2012 et 2014, respectivement), ce sont les plus couramment utilisées, selon les données de Censys.\nNous avons récemment publié un livre blanc mettant à jour notre compréhension de l’arsenal du groupe Winnti et exposant une de leurs portes secrètes, jusque-là non documentée. PortReuse. Il utilise un packer identique à celui utilisé avec la charge intégrée dans les jeux vidéo compromis découverts par ESET en mars 2019. Le lanceur VMProtected qui laisse tomber le PortReuse porte dérobée a également été trouvée en train d’être utilisée pour lancer ShadowPad versions. Dans ce contexte, nous avons pu trouver un nouvel outil appelé skip.2-0 par son développeur. Il utilise le même lanceur VMProtected ainsi que l’emballeur personnalisé du groupe Winnti et présente de nombreuses similitudes avec d’autres échantillons des outils du groupe Winnti. Cela nous amène à attribuer skip-2.0 à cet ensemble d&#39;outils également.\nCet article porte sur les détails techniques et les fonctionnalités de cette porte dérobée MSSQL Server, ainsi que sur les similitudes techniques entre skip.2-0 l’arsenal connu du groupe Winnti &#8211; en particulier avec le PortReuse porte dérobée et ShadowPad. Vous trouverez une note sur les raisons pour lesquelles nous avons choisi la dénomination «Groupe Winnti» sur notre livre blanc.\nLanceur VMProtected\nNous avons trouvé skip-2.0 recherche de lanceurs VMProtected, pour lesquels la charge utile est généralement soit PortReuse ou ShadowPad.\nCharge utile intégrée\nComme avec le crypté PortReuse et ShadowPad charges utiles, sautez-2.0 est intégré dans la superposition du lanceur VMProtected, comme illustré dans la figure 1:\n\nFigure 1. En-têtes du lanceur VMProtected. La charge utile est intégrée à la superposition PE.\n\nCryptage\nLe chiffrement de la charge utile est identique à celui utilisé dans les autres lanceurs VMProtected. Il est crypté avec RC5 avec une clé dérivée du VolumeID et la ficelle f @ Ukd! rCto R $. &#8211; comme décrit dans notre précédent livre blanc sur l&#39;arsenal du groupe Winnti.\nPersistance\nComme dans le cas de PortReuse et ShadowPad, le lanceur persiste probablement en exploitant une vulnérabilité de piratage de DLL en étant installé à C:  Windows  System32  TSVIPSrv.DLL. Cela entraîne le chargement de la DLL par le Windows standard SessionEnv service au démarrage du système.\nEmballeur personnalisé du groupe Winnti\nUne fois déchiffré, la charge intégrée est en fait l’emballeur personnalisé de Winnti Group. Ce packer est le même shellcode que celui décrit dans notre précédent article et notre livre blanc. Il est utilisé pour emballer le PortReuse porte dérobée ainsi que la charge utile intégrée aux jeux vidéo compromis.\nConfiguration du packer\nComme décrit dans notre article précédent, la configuration du programme de compression contient la clé de déchiffrement du fichier binaire compressé, ainsi que son nom de fichier d&#39;origine, sa taille et le type d&#39;exécution (EXE ou DLL). La configuration de l’emballeur de la charge utile est indiquée dans le tableau 1.\n\n\n\nParent SHA-1\nCharge utile SHA-1\nClé RC4\nNom de fichier\nType de lancement\n\n\n\n\n9aafe81d07b3e5bb282608f0a2a4656eb485b7c9\na2571946ab181657eb825cde07188e8bcd689575\n163716559\nInner-Loader.dll\n2\n\n\n\n\nTableau 1. Configuration du packer de Payload\nLa configuration de l’emballeur indique que la charge utile est appelée Chargeur interne. Chargeur interne est le nom d’un injecteur qui fait partie de l’arsenal du groupe Winnti utilisé pour injecter le PortReuse porte dérobée dans les processus d&#39;écoute sur un port particulier, comme décrit dans notre publication précédente. Au-delà de ce nom identique, il apparaît en analysant cette charge utile qu’il s’agit d’une autre variante du Chargeur interne injecteur.\nInjecteur à chargement interne\nCette variante de Chargeur interne, au lieu de rechercher un processus d’écoute sur un port particulier, comme dans le cas de l’injection du PortReuse porte dérobée, recherche un processus appelé sqlserv.exe, qui est le nom de processus conventionnel de MSSQL Server. Si trouvé, Chargeur interne puis injecte une charge utile dans ce processus. Cette charge est également fournie avec l’emballeur personnalisé. La configuration de l’emballeur de cette charge est indiquée dans le tableau 2.\n\n\n\nParent SHA-1\nCharge utile SHA-1                             \nClé RC4\nNom de fichier\nType de lancement\n\n\n\n\na2571946ab181657eb825cde07188e8bcd689575\n60b9428d00be5ce562ff3d888441220290a6dac7\n923567961\nskip-2.0.dll\n2\n\n\n\n\nTableau 2. Configuration du packer de la charge utile intégrée à Inner-Loader\nLe nom de fichier original de cette charge utile injectée est skip-2.0.dll.\nskip-2.0\nAprès avoir été injecté et lancé par Chargeur interne, sauter-2.0 vérifie d’abord si elle s’exécute dans un sqlserv.exe processus et si oui, récupère une poignée pour sqllang.dll, qui est chargé par sqlserv.exe. Il recherche ensuite et accroche plusieurs fonctions à partir de cette DLL. La figure 2 illustre le skip-2.0 chaîne de compromis.\n\nFigure 2. Déballage et injection skip-2.0\n\nAccrochage sqllang.dll\nLa procédure d’accrochage utilisée par skip-2.0 est très similaire à celle utilisée par NetAgent, le PortReuse module responsable de l’installation du hook réseau. Cette bibliothèque de hook est basée sur le désassembleur Open Source distorm utilisé par plusieurs infrastructures de hook Open Source. En particulier, une bibliothèque de désassemblage est nécessaire pour calculer correctement la taille des instructions à accrocher. On peut voir sur la figure 3 que la procédure d’accrochage utilisée par NetAgent et skip-2.0 sont presque identiques.\n\nFigure 3. Comparaison de la production de rayons Hex-Ray entre les procédures de raccordement NetAgent (à gauche) et skip-2.0 (à droite)\n\nIl existe une différence notable, à savoir le fait que la fonction d’accrochage de skip-2.0 prend l&#39;adresse du crochet à installer comme argument, alors que pour NetAgent, l&#39;adresse du crochet à installer est codée en dur. Ceci est dû au fait que skip-2.0 doit accrocher plusieurs fonctions dans sqllang.dll pour fonctionner correctement, tout en NetAgent ne cible qu&#39;une seule fonction.\nPour localiser chacun sqllang.dll fonction à accrocher, skip-2.0 récupère d’abord la taille de la DLL une fois chargée en mémoire (c’est-à-dire sa taille virtuelle) en analysant ses en-têtes PE. Ensuite, un tableau d&#39;octets à faire correspondre dans sqllang.dll est initialisé comme indiqué dans la figure 4. Une fois que l&#39;adresse de la première occurrence correspondant au tableau d&#39;octets est trouvée, le hook est installé à l&#39;aide de la procédure indiquée dans la figure 3.\n\nFigure 4. Sortie Hex-Rays de la procédure initialisant le tableau d&#39;octets pour correspondre à     sqllang.dll\n\nLa réussite de l’installation du hook est ensuite consignée en cleartext dans un fichier journal situé sur le chemin codé en dur. C:  Windows  Temp  TS_2CE1.tmp et montré à la figure 5.\n\nFigure 5. Journal généré lors de l&#39;installation des points d&#39;ancrage\n\nSi la fonction ciblée n&#39;est pas trouvée, le programme d&#39;installation de points d&#39;ancrage recherche une fonction de secours, avec un ensemble différent de motifs d&#39;octet.\nFaire correspondre une séquence d&#39;octets pour localiser l&#39;adresse de la fonction ciblée au lieu d&#39;utiliser un décalage statique, plus d&#39;utiliser une séquence d&#39;octets de secours, permet skip-2.0 être plus résilient aux mises à jour MSSQL et potentiellement cibler plusieurs sqllang.dll mises à jour.\nUn mot de passe pour les gouverner tous\nLes fonctions visées par skip-2.0 sont liés à l&#39;authentification et à la journalisation des événements. Les fonctions visées incluent:\n\nCPwdPolicyManager :: ValidatePwdForLogin\nCSECAuthenticate :: AuthenticateLoginIdentity\nReportLoginSuccess\nIssueLoginSuccessReport\nFExecuteLogonTriggers\nXeSqlPkg :: sql_statement_completed :: Publish\nXeSqlPkg :: sql_batch_completed :: Publish\nSecAuditPkg :: audit_event :: Publish\nXeSqlPkg :: login :: Publier\nXeSqlPkg :: ual_instrument_called :: Publish\n\nLa fonction la plus intéressante est la première (CPwdPolicyManager :: ValidatePwdForLogin), qui est responsable de la validation du mot de passe fourni pour un utilisateur donné. Le crochet de cette fonction vérifie si le mot de passe fourni par l’utilisateur correspond au mot de passe magique; Si tel est le cas, la fonction d&#39;origine ne sera pas appelée et le hook renverra 0, permettant ainsi la connexion même si le mot de passe correct n&#39;a pas été fourni. Un indicateur global est ensuite défini et sera vérifié par les autres fonctions raccordées responsables de la journalisation des événements. La procédure décompilée correspondante est illustrée à la figure 6. Dans le cas où cet indicateur global est défini, les fonctions de consignation raccordées retourneront en mode silencieux sans appeler leurs fonctions d&#39;origine correspondantes, de sorte que l&#39;action ne sera pas consignée. Dans le cas où un mot de passe différent est fourni, la fonction d&#39;origine est appelée.\n\nFigure 6. Sortie Hex-Rays de la procédure chargée de la correspondance du mot de passe fourni lors de la connexion avec la chaîne codée en dur\n\nUne technique de backdooring similaire, basée sur des mots de passe codés en dur, a été utilisée avec les backdoors SSH précédemment découverts par ESET. La différence ici est que skip-2.0 est installé en mémoire, tandis que dans le cas des portes dérobées SSH, la sshd l&#39;exécutable a été modifié avant l&#39;exécution.\nAditionellement, CSECAuthenticate :: AuthenticateLoginIdentity sera appelé à partir de son code de crochet mais le crochet retournera toujours 0. Le ReportLoginSucess et IssueLoginSuccessReport Les hooks n&#39;appelleront pas les fonctions d&#39;origine si le mot de passe magique a été utilisé pour se connecter. Le même comportement est appliqué à FEExecuteLogonTriggers. Autres fonctions de journalisation telles que XeSqlPkg :: sql_statement_completed :: Publish ou XeSqlPkg :: sql_batch_completed :: Publish sera également désactivé dans le cas où l&#39;utilisateur s&#39;est connecté avec le mot de passe magique. Plusieurs événements d&#39;audit sont également désactivés, notamment: SecAuditPkg :: audit_event :: Publish, XeSqlPkg :: login :: Publier et XeSqlPkg :: ual_instrument_called :: Publish.\nCette série de points d&#39;ancrage permet non seulement à l&#39;attaquant de conserver sa persistance dans le serveur MSSQL de la victime grâce à l&#39;utilisation d&#39;un mot de passe spécifique, mais également de rester non détecté grâce aux multiples mécanismes de publication des journaux et des événements désactivés lors de l&#39;utilisation de ce mot de passe.\nNous avons testé skip-2.0 contre plusieurs versions de MSSQL Server et nous avons constaté que nous pouvions nous connecter avec le mot de passe spécial avec MSSQL Server 11 et 12. Pour vérifier si un sqllang.dll la version est ciblée par skip-2.0 (c’est-à-dire qui correspond aux modèles d’octets), nous avons créé une règle YARA, qui peut être trouvée dans notre référentiel GitHub.\nConnexion avec le groupe Winnti\nNous avons observé de multiples similitudes entre skip-2.0 et d’autres outils de l’arsenal du groupe Winnti. Son lanceur VMProtected, emballeur personnalisé, Chargeur interne L&#39;injecteur et le cadre d&#39;accrochage font partie des outils déjà connus du groupe Winnti. Cela nous amène à penser que skip-2.0 fait également partie de cet ensemble d&#39;outils.\nConclusion\nle skip-2.0 backdoor est un ajout intéressant à l’arsenal du groupe Winnti, car il partage de nombreuses similitudes avec les outils déjà connus du groupe et permet à l’attaquant d’obtenir de la persistance sur un serveur MSSQL. Considérant que des privilèges d’administration sont requis pour l’installation des hooks, skip-2.0 doit être utilisé sur des serveurs MSSQL déjà compromis pour assurer la persistance et la furtivité.\nNous continuerons de surveiller les nouvelles activités du groupe Winnti et publierons des informations pertinentes sur notre blog. Pour toute demande de renseignements, contactez-nous à l&#39;adresse suivante :urtintel@eset.com.\nIndicateurs de compromis (IoC)\n\n\n\nComposant\nSHA-1\nNom de détection ESET\n\n\n\n\nChargeur VMP\n18E4FEB988CB95D71D81E1964AA6280E22361B9F4AF89296A15C1EA9068A279E05CC4A41B967C956\nWin64 / Packed.VMProtect.HX\n\n\nInjecteur à chargement interne\nA2571946AB181657EB825CDE07188E8BCD689575\nWin64 / Injector.BS\n\n\nskip-2.0\n60B9428D00BE5CE562FF3D888441220290A6DAC7\nWin32 / Agent.SOK\n\n\nConnu ciblé sqllang.dll fichiers (liste non exhaustive)\n4396D3C904CD340984D474065959E8DD11915444BE352631E6A6A9D0B7BBA9B82D910FA5AB40C64ED4ADBC3F77ADE63B836FC4D9E5915A3479F09BD40BBD3321F93F3DCDD2A332D1F0326142B3F4961AFAE6B48F1D6EDDEC79E62844C444FE3955411EE3 A25B25FFA17E63C6884E28E96B487F58DF4502E7DE76419331381C390A758E634BF2E165A42D4807ED08E9B4BA6C4B5A1F26D671AD212AA2FB0874A21E1B0D91B37BAEBF77F85D1B7C640B8CC02FE11A59FB000D36612950FEBC36004F1317F7D000AA0B661DA36BDD115A1E649F3AAE11AD6F7D6FF2DB63\nN / A\n\n\n\nTechniques MITRE ATT &amp; CK\n\n\n\nTactique\nID\nprénom\nLa description\n\n\n\n\nExécution\nT1035\nExécution du service\nskip-2.0 est commencé avec le  SessionEnv un service\n\n\nPersistance\nT1038\nDétournement d&#39;ordre de recherche de DLL\nskip-2.0 utilise probablement une technique de piratage de DLL contre le  SessionEnv un service\n\n\nT1179\nCrochet\nskip-2.0 accroche plusieurs fonctions dans sqllang.dll service pour contourner l&#39;authentification et rester furtif\n\n\nDéfense Evasion\nT1054\nBlocage des indicateurs\nskip-2.0  bloque la journalisation des événements\n\n\nT1045\nEmballage logiciel\nskip.2-0  et Chargeur interne sont emballés à l&#39;aide de l&#39;emballage personnalisé de Winnti. De plus, le lanceur est VMProtected.\n\n\nDécouverte\nT1057\nDécouverte de processus\nChargeur interne liste les processus en cours afin de trouver le processus exécutant MSSQL Server\n\n\nImpact\nT1485\nDestruction de données\nskip-2.0 permet l&#39;accès non autorisé aux bases de données MSSQL, permettant ainsi la destruction ou la falsification des données \n\n\nT1494\nManipulation des données d&#39;exécution\nskip-2.0 manipule la journalisation des événements au moment de l&#39;exécution\n\n\nT1492\nManipulation de données stockées\nskip-2.0 permet un accès non autorisé aux bases de données MSSQL, permettant la manipulation des données stockées\n\n\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tMathieu Tartare\t\t\t\t\t\t\t\t21 octobre 2019 &#8211; 11h30\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["Un groupe de cyberespionnage notoire rabaisse MSSQL","Les chercheurs d&#39;ESET suivent depuis un certain temps les activités du groupe Winnti, actif depuis au moins 2012 et responsable d&#39;attaques de grande envergure de la chaîne logistique contre l&#39;industrie du jeu vidéo et des logiciels. Récemment, nous avons découvert une porte dérobée non documentée ciblant Microsoft SQL (MSSQL) qui permettait aux attaquants de conserver un pied très discret au sein d’organisations compromises. Cette porte dérobée présente de nombreuses similitudes avec le PortReuse backdoor, autre outil utilisé par le groupe Winnti et documenté pour la première fois par ESET en octobre 2019, tel que l&#39;utilisation du même programme de personnalisation et du même programme de lancement VMProtected. C&#39;est pourquoi nous attribuons cette porte dérobée au groupe Winnti.\nPlus tôt cette année, nous avons reçu un échantillon de cette nouvelle porte dérobée appelée skip-2.0 par ses auteurs et une partie de l’arsenal du groupe Winnti. Cette porte dérobée cible MSSQL Server 11 et 12, permettant à l’attaquant de se connecter furtivement à n’importe quel compte MSSQL à l’aide d’un mot de passe magique, tout en masquant automatiquement ces connexions dans les journaux. Une telle porte dérobée pourrait permettre à un attaquant de copier, modifier ou supprimer furtivement le contenu de la base de données. Cela pourrait être utilisé, par exemple, pour manipuler des devises dans le jeu pour un gain financier. Des manipulations de bases de données de devises dans le jeu par des opérateurs de Winnti ont déjà été signalées. Au meilleur de notre connaissance, skip-2.0 est la première porte dérobée du serveur MSSQL à être documentée publiquement. Notez que, même si MSSQL Server 11 et 12 ne sont pas les versions les plus récentes (publiées en 2012 et 2014, respectivement), ce sont les plus couramment utilisées, selon les données de Censys.\nNous avons récemment publié un livre blanc mettant à jour notre compréhension de l’arsenal du groupe Winnti et exposant une de leurs portes secrètes, jusque-là non documentée. PortReuse. Il utilise un packer identique à celui utilisé avec la charge intégrée dans les jeux vidéo compromis découverts par ESET en mars 2019. Le lanceur VMProtected qui laisse tomber le PortReuse porte dérobée a également été trouvée en train d’être utilisée pour lancer ShadowPad versions. Dans ce contexte, nous avons pu trouver un nouvel outil appelé skip.2-0 par son développeur. Il utilise le même lanceur VMProtected ainsi que l’emballeur personnalisé du groupe Winnti et présente de nombreuses similitudes avec d’autres échantillons des outils du groupe Winnti. Cela nous amène à attribuer skip-2.0 à cet ensemble d&#39;outils également.\nCet article porte sur les détails techniques et les fonctionnalités de cette porte dérobée MSSQL Server, ainsi que sur les similitudes techniques entre skip.2-0 l’arsenal connu du groupe Winnti &#8211; en particulier avec le PortReuse porte dérobée et ShadowPad. Vous trouverez une note sur les raisons pour lesquelles nous avons choisi la dénomination «Groupe Winnti» sur notre livre blanc.\nLanceur VMProtected\nNous avons trouvé skip-2.0 recherche de lanceurs VMProtected, pour lesquels la charge utile est généralement soit PortReuse ou ShadowPad.\nCharge utile intégrée\nComme avec le crypté PortReuse et ShadowPad charges utiles, sautez-2.0 est intégré dans la superposition du lanceur VMProtected, comme illustré dans la figure 1:","Figure 1. En-têtes du lanceur VMProtected. La charge utile est intégrée à la superposition PE.","Cryptage\nLe chiffrement de la charge utile est identique à celui utilisé dans les autres lanceurs VMProtected. Il est crypté avec RC5 avec une clé dérivée du VolumeID et la ficelle f @ Ukd! rCto R $. &#8211; comme décrit dans notre précédent livre blanc sur l&#39;arsenal du groupe Winnti.\nPersistance\nComme dans le cas de PortReuse et ShadowPad, le lanceur persiste probablement en exploitant une vulnérabilité de piratage de DLL en étant installé à C:  Windows  System32  TSVIPSrv.DLL. Cela entraîne le chargement de la DLL par le Windows standard SessionEnv service au démarrage du système.\nEmballeur personnalisé du groupe Winnti\nUne fois déchiffré, la charge intégrée est en fait l’emballeur personnalisé de Winnti Group. Ce packer est le même shellcode que celui décrit dans notre précédent article et notre livre blanc. Il est utilisé pour emballer le PortReuse porte dérobée ainsi que la charge utile intégrée aux jeux vidéo compromis.\nConfiguration du packer\nComme décrit dans notre article précédent, la configuration du programme de compression contient la clé de déchiffrement du fichier binaire compressé, ainsi que son nom de fichier d&#39;origine, sa taille et le type d&#39;exécution (EXE ou DLL). La configuration de l’emballeur de la charge utile est indiquée dans le tableau 1.","Parent SHA-1\nCharge utile SHA-1\nClé RC4\nNom de fichier\nType de lancement","9aafe81d07b3e5bb282608f0a2a4656eb485b7c9\na2571946ab181657eb825cde07188e8bcd689575\n163716559\nInner-Loader.dll\n2","Tableau 1. Configuration du packer de Payload\nLa configuration de l’emballeur indique que la charge utile est appelée Chargeur interne. Chargeur interne est le nom d’un injecteur qui fait partie de l’arsenal du groupe Winnti utilisé pour injecter le PortReuse porte dérobée dans les processus d&#39;écoute sur un port particulier, comme décrit dans notre publication précédente. Au-delà de ce nom identique, il apparaît en analysant cette charge utile qu’il s’agit d’une autre variante du Chargeur interne injecteur.\nInjecteur à chargement interne\nCette variante de Chargeur interne, au lieu de rechercher un processus d’écoute sur un port particulier, comme dans le cas de l’injection du PortReuse porte dérobée, recherche un processus appelé sqlserv.exe, qui est le nom de processus conventionnel de MSSQL Server. Si trouvé, Chargeur interne puis injecte une charge utile dans ce processus. Cette charge est également fournie avec l’emballeur personnalisé. La configuration de l’emballeur de cette charge est indiquée dans le tableau 2.","Parent SHA-1\nCharge utile SHA-1                             \nClé RC4\nNom de fichier\nType de lancement","a2571946ab181657eb825cde07188e8bcd689575\n60b9428d00be5ce562ff3d888441220290a6dac7\n923567961\nskip-2.0.dll\n2","Tableau 2. Configuration du packer de la charge utile intégrée à Inner-Loader\nLe nom de fichier original de cette charge utile injectée est skip-2.0.dll.\nskip-2.0\nAprès avoir été injecté et lancé par Chargeur interne, sauter-2.0 vérifie d’abord si elle s’exécute dans un sqlserv.exe processus et si oui, récupère une poignée pour sqllang.dll, qui est chargé par sqlserv.exe. Il recherche ensuite et accroche plusieurs fonctions à partir de cette DLL. La figure 2 illustre le skip-2.0 chaîne de compromis.","Figure 2. Déballage et injection skip-2.0","Accrochage sqllang.dll\nLa procédure d’accrochage utilisée par skip-2.0 est très similaire à celle utilisée par NetAgent, le PortReuse module responsable de l’installation du hook réseau. Cette bibliothèque de hook est basée sur le désassembleur Open Source distorm utilisé par plusieurs infrastructures de hook Open Source. En particulier, une bibliothèque de désassemblage est nécessaire pour calculer correctement la taille des instructions à accrocher. On peut voir sur la figure 3 que la procédure d’accrochage utilisée par NetAgent et skip-2.0 sont presque identiques.","Figure 3. Comparaison de la production de rayons Hex-Ray entre les procédures de raccordement NetAgent (à gauche) et skip-2.0 (à droite)","Il existe une différence notable, à savoir le fait que la fonction d’accrochage de skip-2.0 prend l&#39;adresse du crochet à installer comme argument, alors que pour NetAgent, l&#39;adresse du crochet à installer est codée en dur. Ceci est dû au fait que skip-2.0 doit accrocher plusieurs fonctions dans sqllang.dll pour fonctionner correctement, tout en NetAgent ne cible qu&#39;une seule fonction.\nPour localiser chacun sqllang.dll fonction à accrocher, skip-2.0 récupère d’abord la taille de la DLL une fois chargée en mémoire (c’est-à-dire sa taille virtuelle) en analysant ses en-têtes PE. Ensuite, un tableau d&#39;octets à faire correspondre dans sqllang.dll est initialisé comme indiqué dans la figure 4. Une fois que l&#39;adresse de la première occurrence correspondant au tableau d&#39;octets est trouvée, le hook est installé à l&#39;aide de la procédure indiquée dans la figure 3.","Figure 4. Sortie Hex-Rays de la procédure initialisant le tableau d&#39;octets pour correspondre à     sqllang.dll","La réussite de l’installation du hook est ensuite consignée en cleartext dans un fichier journal situé sur le chemin codé en dur. C:  Windows  Temp  TS_2CE1.tmp et montré à la figure 5.","Figure 5. Journal généré lors de l&#39;installation des points d&#39;ancrage","Si la fonction ciblée n&#39;est pas trouvée, le programme d&#39;installation de points d&#39;ancrage recherche une fonction de secours, avec un ensemble différent de motifs d&#39;octet.\nFaire correspondre une séquence d&#39;octets pour localiser l&#39;adresse de la fonction ciblée au lieu d&#39;utiliser un décalage statique, plus d&#39;utiliser une séquence d&#39;octets de secours, permet skip-2.0 être plus résilient aux mises à jour MSSQL et potentiellement cibler plusieurs sqllang.dll mises à jour.\nUn mot de passe pour les gouverner tous\nLes fonctions visées par skip-2.0 sont liés à l&#39;authentification et à la journalisation des événements. Les fonctions visées incluent:","CPwdPolicyManager :: ValidatePwdForLogin\nCSECAuthenticate :: AuthenticateLoginIdentity\nReportLoginSuccess\nIssueLoginSuccessReport\nFExecuteLogonTriggers\nXeSqlPkg :: sql_statement_completed :: Publish\nXeSqlPkg :: sql_batch_completed :: Publish\nSecAuditPkg :: audit_event :: Publish\nXeSqlPkg :: login :: Publier\nXeSqlPkg :: ual_instrument_called :: Publish","La fonction la plus intéressante est la première (CPwdPolicyManager :: ValidatePwdForLogin), qui est responsable de la validation du mot de passe fourni pour un utilisateur donné. Le crochet de cette fonction vérifie si le mot de passe fourni par l’utilisateur correspond au mot de passe magique; Si tel est le cas, la fonction d&#39;origine ne sera pas appelée et le hook renverra 0, permettant ainsi la connexion même si le mot de passe correct n&#39;a pas été fourni. Un indicateur global est ensuite défini et sera vérifié par les autres fonctions raccordées responsables de la journalisation des événements. La procédure décompilée correspondante est illustrée à la figure 6. Dans le cas où cet indicateur global est défini, les fonctions de consignation raccordées retourneront en mode silencieux sans appeler leurs fonctions d&#39;origine correspondantes, de sorte que l&#39;action ne sera pas consignée. Dans le cas où un mot de passe différent est fourni, la fonction d&#39;origine est appelée.","Figure 6. Sortie Hex-Rays de la procédure chargée de la correspondance du mot de passe fourni lors de la connexion avec la chaîne codée en dur","Une technique de backdooring similaire, basée sur des mots de passe codés en dur, a été utilisée avec les backdoors SSH précédemment découverts par ESET. La différence ici est que skip-2.0 est installé en mémoire, tandis que dans le cas des portes dérobées SSH, la sshd l&#39;exécutable a été modifié avant l&#39;exécution.\nAditionellement, CSECAuthenticate :: AuthenticateLoginIdentity sera appelé à partir de son code de crochet mais le crochet retournera toujours 0. Le ReportLoginSucess et IssueLoginSuccessReport Les hooks n&#39;appelleront pas les fonctions d&#39;origine si le mot de passe magique a été utilisé pour se connecter. Le même comportement est appliqué à FEExecuteLogonTriggers. Autres fonctions de journalisation telles que XeSqlPkg :: sql_statement_completed :: Publish ou XeSqlPkg :: sql_batch_completed :: Publish sera également désactivé dans le cas où l&#39;utilisateur s&#39;est connecté avec le mot de passe magique. Plusieurs événements d&#39;audit sont également désactivés, notamment: SecAuditPkg :: audit_event :: Publish, XeSqlPkg :: login :: Publier et XeSqlPkg :: ual_instrument_called :: Publish.\nCette série de points d&#39;ancrage permet non seulement à l&#39;attaquant de conserver sa persistance dans le serveur MSSQL de la victime grâce à l&#39;utilisation d&#39;un mot de passe spécifique, mais également de rester non détecté grâce aux multiples mécanismes de publication des journaux et des événements désactivés lors de l&#39;utilisation de ce mot de passe.\nNous avons testé skip-2.0 contre plusieurs versions de MSSQL Server et nous avons constaté que nous pouvions nous connecter avec le mot de passe spécial avec MSSQL Server 11 et 12. Pour vérifier si un sqllang.dll la version est ciblée par skip-2.0 (c’est-à-dire qui correspond aux modèles d’octets), nous avons créé une règle YARA, qui peut être trouvée dans notre référentiel GitHub.\nConnexion avec le groupe Winnti\nNous avons observé de multiples similitudes entre skip-2.0 et d’autres outils de l’arsenal du groupe Winnti. Son lanceur VMProtected, emballeur personnalisé, Chargeur interne L&#39;injecteur et le cadre d&#39;accrochage font partie des outils déjà connus du groupe Winnti. Cela nous amène à penser que skip-2.0 fait également partie de cet ensemble d&#39;outils.\nConclusion\nle skip-2.0 backdoor est un ajout intéressant à l’arsenal du groupe Winnti, car il partage de nombreuses similitudes avec les outils déjà connus du groupe et permet à l’attaquant d’obtenir de la persistance sur un serveur MSSQL. Considérant que des privilèges d’administration sont requis pour l’installation des hooks, skip-2.0 doit être utilisé sur des serveurs MSSQL déjà compromis pour assurer la persistance et la furtivité.\nNous continuerons de surveiller les nouvelles activités du groupe Winnti et publierons des informations pertinentes sur notre blog. Pour toute demande de renseignements, contactez-nous à l&#39;adresse suivante :urtintel@eset.com.\nIndicateurs de compromis (IoC)","Composant\nSHA-1\nNom de détection ESET","Chargeur VMP\n18E4FEB988CB95D71D81E1964AA6280E22361B9F4AF89296A15C1EA9068A279E05CC4A41B967C956\nWin64 / Packed.VMProtect.HX","Injecteur à chargement interne\nA2571946AB181657EB825CDE07188E8BCD689575\nWin64 / Injector.BS","skip-2.0\n60B9428D00BE5CE562FF3D888441220290A6DAC7\nWin32 / Agent.SOK","Connu ciblé sqllang.dll fichiers (liste non exhaustive)\n4396D3C904CD340984D474065959E8DD11915444BE352631E6A6A9D0B7BBA9B82D910FA5AB40C64ED4ADBC3F77ADE63B836FC4D9E5915A3479F09BD40BBD3321F93F3DCDD2A332D1F0326142B3F4961AFAE6B48F1D6EDDEC79E62844C444FE3955411EE3 A25B25FFA17E63C6884E28E96B487F58DF4502E7DE76419331381C390A758E634BF2E165A42D4807ED08E9B4BA6C4B5A1F26D671AD212AA2FB0874A21E1B0D91B37BAEBF77F85D1B7C640B8CC02FE11A59FB000D36612950FEBC36004F1317F7D000AA0B661DA36BDD115A1E649F3AAE11AD6F7D6FF2DB63\nN / A","Techniques MITRE ATT &amp; CK","Tactique\nID\nprénom\nLa description","Exécution\nT1035\nExécution du service\nskip-2.0 est commencé avec le  SessionEnv un service","Persistance\nT1038\nDétournement d&#39;ordre de recherche de DLL\nskip-2.0 utilise probablement une technique de piratage de DLL contre le  SessionEnv un service","T1179\nCrochet\nskip-2.0 accroche plusieurs fonctions dans sqllang.dll service pour contourner l&#39;authentification et rester furtif","Défense Evasion\nT1054\nBlocage des indicateurs\nskip-2.0  bloque la journalisation des événements","T1045\nEmballage logiciel\nskip.2-0  et Chargeur interne sont emballés à l&#39;aide de l&#39;emballage personnalisé de Winnti. De plus, le lanceur est VMProtected.","Découverte\nT1057\nDécouverte de processus\nChargeur interne liste les processus en cours afin de trouver le processus exécutant MSSQL Server","Impact\nT1485\nDestruction de données\nskip-2.0 permet l&#39;accès non autorisé aux bases de données MSSQL, permettant ainsi la destruction ou la falsification des données","T1494\nManipulation des données d&#39;exécution\nskip-2.0 manipule la journalisation des événements au moment de l&#39;exécution","T1492\nManipulation de données stockées\nskip-2.0 permet un accès non autorisé aux bases de données MSSQL, permettant la manipulation des données stockées","Mathieu Tartare\t\t\t\t\t\t\t\t21 octobre 2019 &#8211; 11h30","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"Un groupe de cyberespionnage notoire rabaisse MSSQL","html":"<p>Un groupe de cyberespionnage notoire rabaisse MSSQL</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"Les chercheurs d&#39;ESET suivent depuis un certain temps les activités du groupe Winnti, actif depuis au moins 2012 et responsable d&#39;attaques de grande envergure de la chaîne logistique contre l&#39;industrie du jeu vidéo et des logiciels. Récemment, nous avons découvert une porte dérobée non documentée ciblant Microsoft SQL (MSSQL) qui permettait aux attaquants de conserver un pied très discret au sein d’organisations compromises. Cette porte dérobée présente de nombreuses similitudes avec le PortReuse backdoor, autre outil utilisé par le groupe Winnti et documenté pour la première fois par ESET en octobre 2019, tel que l&#39;utilisation du même programme de personnalisation et du même programme de lancement VMProtected. C&#39;est pourquoi nous attribuons cette porte dérobée au groupe Winnti.\nPlus tôt cette année, nous avons reçu un échantillon de cette nouvelle porte dérobée appelée skip-2.0 par ses auteurs et une partie de l’arsenal du groupe Winnti. Cette porte dérobée cible MSSQL Server 11 et 12, permettant à l’attaquant de se connecter furtivement à n’importe quel compte MSSQL à l’aide d’un mot de passe magique, tout en masquant automatiquement ces connexions dans les journaux. Une telle porte dérobée pourrait permettre à un attaquant de copier, modifier ou supprimer furtivement le contenu de la base de données. Cela pourrait être utilisé, par exemple, pour manipuler des devises dans le jeu pour un gain financier. Des manipulations de bases de données de devises dans le jeu par des opérateurs de Winnti ont déjà été signalées. Au meilleur de notre connaissance, skip-2.0 est la première porte dérobée du serveur MSSQL à être documentée publiquement. Notez que, même si MSSQL Server 11 et 12 ne sont pas les versions les plus récentes (publiées en 2012 et 2014, respectivement), ce sont les plus couramment utilisées, selon les données de Censys.\nNous avons récemment publié un livre blanc mettant à jour notre compréhension de l’arsenal du groupe Winnti et exposant une de leurs portes secrètes, jusque-là non documentée. PortReuse. Il utilise un packer identique à celui utilisé avec la charge intégrée dans les jeux vidéo compromis découverts par ESET en mars 2019. Le lanceur VMProtected qui laisse tomber le PortReuse porte dérobée a également été trouvée en train d’être utilisée pour lancer ShadowPad versions. Dans ce contexte, nous avons pu trouver un nouvel outil appelé skip.2-0 par son développeur. Il utilise le même lanceur VMProtected ainsi que l’emballeur personnalisé du groupe Winnti et présente de nombreuses similitudes avec d’autres échantillons des outils du groupe Winnti. Cela nous amène à attribuer skip-2.0 à cet ensemble d&#39;outils également.\nCet article porte sur les détails techniques et les fonctionnalités de cette porte dérobée MSSQL Server, ainsi que sur les similitudes techniques entre skip.2-0 l’arsenal connu du groupe Winnti &#8211; en particulier avec le PortReuse porte dérobée et ShadowPad. Vous trouverez une note sur les raisons pour lesquelles nous avons choisi la dénomination «Groupe Winnti» sur notre livre blanc.\nLanceur VMProtected\nNous avons trouvé skip-2.0 recherche de lanceurs VMProtected, pour lesquels la charge utile est généralement soit PortReuse ou ShadowPad.\nCharge utile intégrée\nComme avec le crypté PortReuse et ShadowPad charges utiles, sautez-2.0 est intégré dans la superposition du lanceur VMProtected, comme illustré dans la figure 1:","html":"<p>Les chercheurs d&#039;ESET suivent depuis un certain temps les activités du groupe Winnti, actif depuis au moins 2012 et responsable d&#039;attaques de grande envergure de la chaîne logistique contre l&#039;industrie du jeu vidéo et des logiciels. Récemment, nous avons découvert une porte dérobée non documentée ciblant Microsoft SQL (MSSQL) qui permettait aux attaquants de conserver un pied très discret au sein d’organisations compromises. Cette porte dérobée présente de nombreuses similitudes avec le PortReuse backdoor, autre outil utilisé par le groupe Winnti et documenté pour la première fois par ESET en octobre 2019, tel que l&#039;utilisation du même programme de personnalisation et du même programme de lancement VMProtected. C&#039;est pourquoi nous attribuons cette porte dérobée au groupe Winnti.\nPlus tôt cette année, nous avons reçu un échantillon de cette nouvelle porte dérobée appelée skip-2.0 par ses auteurs et une partie de l’arsenal du groupe Winnti. Cette porte dérobée cible MSSQL Server 11 et 12, permettant à l’attaquant de se connecter furtivement à n’importe quel compte MSSQL à l’aide d’un mot de passe magique, tout en masquant automatiquement ces connexions dans les journaux. Une telle porte dérobée pourrait permettre à un attaquant de copier, modifier ou supprimer furtivement le contenu de la base de données. Cela pourrait être utilisé, par exemple, pour manipuler des devises dans le jeu pour un gain financier. Des manipulations de bases de données de devises dans le jeu par des opérateurs de Winnti ont déjà été signalées. Au meilleur de notre connaissance, skip-2.0 est la première porte dérobée du serveur MSSQL à être documentée publiquement. Notez que, même si MSSQL Server 11 et 12 ne sont pas les versions les plus récentes (publiées en 2012 et 2014, respectivement), ce sont les plus couramment utilisées, selon les données de Censys.\nNous avons récemment publié un livre blanc mettant à jour notre compréhension de l’arsenal du groupe Winnti et exposant une de leurs portes secrètes, jusque-là non documentée. PortReuse. Il utilise un packer identique à celui utilisé avec la charge intégrée dans les jeux vidéo compromis découverts par ESET en mars 2019. Le lanceur VMProtected qui laisse tomber le PortReuse porte dérobée a également été trouvée en train d’être utilisée pour lancer ShadowPad versions. Dans ce contexte, nous avons pu trouver un nouvel outil appelé skip.2-0 par son développeur. Il utilise le même lanceur VMProtected ainsi que l’emballeur personnalisé du groupe Winnti et présente de nombreuses similitudes avec d’autres échantillons des outils du groupe Winnti. Cela nous amène à attribuer skip-2.0 à cet ensemble d&#039;outils également.\nCet article porte sur les détails techniques et les fonctionnalités de cette porte dérobée MSSQL Server, ainsi que sur les similitudes techniques entre skip.2-0 l’arsenal connu du groupe Winnti &#8211; en particulier avec le PortReuse porte dérobée et ShadowPad. Vous trouverez une note sur les raisons pour lesquelles nous avons choisi la dénomination «Groupe Winnti» sur notre livre blanc.\nLanceur VMProtected\nNous avons trouvé skip-2.0 recherche de lanceurs VMProtected, pour lesquels la charge utile est généralement soit PortReuse ou ShadowPad.\nCharge utile intégrée\nComme avec le crypté PortReuse et ShadowPad charges utiles, sautez-2.0 est intégré dans la superposition du lanceur VMProtected, comme illustré dans la figure 1:</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"Figure 1. En-têtes du lanceur VMProtected. La charge utile est intégrée à la superposition PE.","html":"<p>Figure 1. En-têtes du lanceur VMProtected. La charge utile est intégrée à la superposition PE.</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"Cryptage\nLe chiffrement de la charge utile est identique à celui utilisé dans les autres lanceurs VMProtected. Il est crypté avec RC5 avec une clé dérivée du VolumeID et la ficelle f @ Ukd! rCto R $. &#8211; comme décrit dans notre précédent livre blanc sur l&#39;arsenal du groupe Winnti.\nPersistance\nComme dans le cas de PortReuse et ShadowPad, le lanceur persiste probablement en exploitant une vulnérabilité de piratage de DLL en étant installé à C:  Windows  System32  TSVIPSrv.DLL. Cela entraîne le chargement de la DLL par le Windows standard SessionEnv service au démarrage du système.\nEmballeur personnalisé du groupe Winnti\nUne fois déchiffré, la charge intégrée est en fait l’emballeur personnalisé de Winnti Group. Ce packer est le même shellcode que celui décrit dans notre précédent article et notre livre blanc. Il est utilisé pour emballer le PortReuse porte dérobée ainsi que la charge utile intégrée aux jeux vidéo compromis.\nConfiguration du packer\nComme décrit dans notre article précédent, la configuration du programme de compression contient la clé de déchiffrement du fichier binaire compressé, ainsi que son nom de fichier d&#39;origine, sa taille et le type d&#39;exécution (EXE ou DLL). La configuration de l’emballeur de la charge utile est indiquée dans le tableau 1.","html":"<p>Cryptage\nLe chiffrement de la charge utile est identique à celui utilisé dans les autres lanceurs VMProtected. Il est crypté avec RC5 avec une clé dérivée du VolumeID et la ficelle f @ Ukd! rCto R $. &#8211; comme décrit dans notre précédent livre blanc sur l&#039;arsenal du groupe Winnti.\nPersistance\nComme dans le cas de PortReuse et ShadowPad, le lanceur persiste probablement en exploitant une vulnérabilité de piratage de DLL en étant installé à C:  Windows  System32  TSVIPSrv.DLL. Cela entraîne le chargement de la DLL par le Windows standard SessionEnv service au démarrage du système.\nEmballeur personnalisé du groupe Winnti\nUne fois déchiffré, la charge intégrée est en fait l’emballeur personnalisé de Winnti Group. Ce packer est le même shellcode que celui décrit dans notre précédent article et notre livre blanc. Il est utilisé pour emballer le PortReuse porte dérobée ainsi que la charge utile intégrée aux jeux vidéo compromis.\nConfiguration du packer\nComme décrit dans notre article précédent, la configuration du programme de compression contient la clé de déchiffrement du fichier binaire compressé, ainsi que son nom de fichier d&#039;origine, sa taille et le type d&#039;exécution (EXE ou DLL). La configuration de l’emballeur de la charge utile est indiquée dans le tableau 1.</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"Parent SHA-1\nCharge utile SHA-1\nClé RC4\nNom de fichier\nType de lancement","html":"<p>Parent SHA-1\nCharge utile SHA-1\nClé RC4\nNom de fichier\nType de lancement</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"9aafe81d07b3e5bb282608f0a2a4656eb485b7c9\na2571946ab181657eb825cde07188e8bcd689575\n163716559\nInner-Loader.dll\n2","html":"<p>9aafe81d07b3e5bb282608f0a2a4656eb485b7c9\na2571946ab181657eb825cde07188e8bcd689575\n163716559\nInner-Loader.dll\n2</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"Tableau 1. Configuration du packer de Payload\nLa configuration de l’emballeur indique que la charge utile est appelée Chargeur interne. Chargeur interne est le nom d’un injecteur qui fait partie de l’arsenal du groupe Winnti utilisé pour injecter le PortReuse porte dérobée dans les processus d&#39;écoute sur un port particulier, comme décrit dans notre publication précédente. Au-delà de ce nom identique, il apparaît en analysant cette charge utile qu’il s’agit d’une autre variante du Chargeur interne injecteur.\nInjecteur à chargement interne\nCette variante de Chargeur interne, au lieu de rechercher un processus d’écoute sur un port particulier, comme dans le cas de l’injection du PortReuse porte dérobée, recherche un processus appelé sqlserv.exe, qui est le nom de processus conventionnel de MSSQL Server. Si trouvé, Chargeur interne puis injecte une charge utile dans ce processus. Cette charge est également fournie avec l’emballeur personnalisé. La configuration de l’emballeur de cette charge est indiquée dans le tableau 2.","html":"<p>Tableau 1. Configuration du packer de Payload\nLa configuration de l’emballeur indique que la charge utile est appelée Chargeur interne. Chargeur interne est le nom d’un injecteur qui fait partie de l’arsenal du groupe Winnti utilisé pour injecter le PortReuse porte dérobée dans les processus d&#039;écoute sur un port particulier, comme décrit dans notre publication précédente. Au-delà de ce nom identique, il apparaît en analysant cette charge utile qu’il s’agit d’une autre variante du Chargeur interne injecteur.\nInjecteur à chargement interne\nCette variante de Chargeur interne, au lieu de rechercher un processus d’écoute sur un port particulier, comme dans le cas de l’injection du PortReuse porte dérobée, recherche un processus appelé sqlserv.exe, qui est le nom de processus conventionnel de MSSQL Server. Si trouvé, Chargeur interne puis injecte une charge utile dans ce processus. Cette charge est également fournie avec l’emballeur personnalisé. La configuration de l’emballeur de cette charge est indiquée dans le tableau 2.</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"Parent SHA-1\nCharge utile SHA-1                             \nClé RC4\nNom de fichier\nType de lancement","html":"<p>Parent SHA-1\nCharge utile SHA-1                             \nClé RC4\nNom de fichier\nType de lancement</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"a2571946ab181657eb825cde07188e8bcd689575\n60b9428d00be5ce562ff3d888441220290a6dac7\n923567961\nskip-2.0.dll\n2","html":"<p>a2571946ab181657eb825cde07188e8bcd689575\n60b9428d00be5ce562ff3d888441220290a6dac7\n923567961\nskip-2.0.dll\n2</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"Tableau 2. Configuration du packer de la charge utile intégrée à Inner-Loader\nLe nom de fichier original de cette charge utile injectée est skip-2.0.dll.\nskip-2.0\nAprès avoir été injecté et lancé par Chargeur interne, sauter-2.0 vérifie d’abord si elle s’exécute dans un sqlserv.exe processus et si oui, récupère une poignée pour sqllang.dll, qui est chargé par sqlserv.exe. Il recherche ensuite et accroche plusieurs fonctions à partir de cette DLL. La figure 2 illustre le skip-2.0 chaîne de compromis.","html":"<p>Tableau 2. Configuration du packer de la charge utile intégrée à Inner-Loader\nLe nom de fichier original de cette charge utile injectée est skip-2.0.dll.\nskip-2.0\nAprès avoir été injecté et lancé par Chargeur interne, sauter-2.0 vérifie d’abord si elle s’exécute dans un sqlserv.exe processus et si oui, récupère une poignée pour sqllang.dll, qui est chargé par sqlserv.exe. Il recherche ensuite et accroche plusieurs fonctions à partir de cette DLL. La figure 2 illustre le skip-2.0 chaîne de compromis.</p>"},{"id":"text-11","type":"text","heading":"","plain_text":"Figure 2. Déballage et injection skip-2.0","html":"<p>Figure 2. Déballage et injection skip-2.0</p>"},{"id":"text-12","type":"text","heading":"","plain_text":"Accrochage sqllang.dll\nLa procédure d’accrochage utilisée par skip-2.0 est très similaire à celle utilisée par NetAgent, le PortReuse module responsable de l’installation du hook réseau. Cette bibliothèque de hook est basée sur le désassembleur Open Source distorm utilisé par plusieurs infrastructures de hook Open Source. En particulier, une bibliothèque de désassemblage est nécessaire pour calculer correctement la taille des instructions à accrocher. On peut voir sur la figure 3 que la procédure d’accrochage utilisée par NetAgent et skip-2.0 sont presque identiques.","html":"<p>Accrochage sqllang.dll\nLa procédure d’accrochage utilisée par skip-2.0 est très similaire à celle utilisée par NetAgent, le PortReuse module responsable de l’installation du hook réseau. Cette bibliothèque de hook est basée sur le désassembleur Open Source distorm utilisé par plusieurs infrastructures de hook Open Source. En particulier, une bibliothèque de désassemblage est nécessaire pour calculer correctement la taille des instructions à accrocher. On peut voir sur la figure 3 que la procédure d’accrochage utilisée par NetAgent et skip-2.0 sont presque identiques.</p>"},{"id":"text-13","type":"text","heading":"","plain_text":"Figure 3. Comparaison de la production de rayons Hex-Ray entre les procédures de raccordement NetAgent (à gauche) et skip-2.0 (à droite)","html":"<p>Figure 3. Comparaison de la production de rayons Hex-Ray entre les procédures de raccordement NetAgent (à gauche) et skip-2.0 (à droite)</p>"},{"id":"text-14","type":"text","heading":"","plain_text":"Il existe une différence notable, à savoir le fait que la fonction d’accrochage de skip-2.0 prend l&#39;adresse du crochet à installer comme argument, alors que pour NetAgent, l&#39;adresse du crochet à installer est codée en dur. Ceci est dû au fait que skip-2.0 doit accrocher plusieurs fonctions dans sqllang.dll pour fonctionner correctement, tout en NetAgent ne cible qu&#39;une seule fonction.\nPour localiser chacun sqllang.dll fonction à accrocher, skip-2.0 récupère d’abord la taille de la DLL une fois chargée en mémoire (c’est-à-dire sa taille virtuelle) en analysant ses en-têtes PE. Ensuite, un tableau d&#39;octets à faire correspondre dans sqllang.dll est initialisé comme indiqué dans la figure 4. Une fois que l&#39;adresse de la première occurrence correspondant au tableau d&#39;octets est trouvée, le hook est installé à l&#39;aide de la procédure indiquée dans la figure 3.","html":"<p>Il existe une différence notable, à savoir le fait que la fonction d’accrochage de skip-2.0 prend l&#039;adresse du crochet à installer comme argument, alors que pour NetAgent, l&#039;adresse du crochet à installer est codée en dur. Ceci est dû au fait que skip-2.0 doit accrocher plusieurs fonctions dans sqllang.dll pour fonctionner correctement, tout en NetAgent ne cible qu&#039;une seule fonction.\nPour localiser chacun sqllang.dll fonction à accrocher, skip-2.0 récupère d’abord la taille de la DLL une fois chargée en mémoire (c’est-à-dire sa taille virtuelle) en analysant ses en-têtes PE. Ensuite, un tableau d&#039;octets à faire correspondre dans sqllang.dll est initialisé comme indiqué dans la figure 4. Une fois que l&#039;adresse de la première occurrence correspondant au tableau d&#039;octets est trouvée, le hook est installé à l&#039;aide de la procédure indiquée dans la figure 3.</p>"},{"id":"text-15","type":"text","heading":"","plain_text":"Figure 4. Sortie Hex-Rays de la procédure initialisant le tableau d&#39;octets pour correspondre à     sqllang.dll","html":"<p>Figure 4. Sortie Hex-Rays de la procédure initialisant le tableau d&#039;octets pour correspondre à     sqllang.dll</p>"},{"id":"text-16","type":"text","heading":"","plain_text":"La réussite de l’installation du hook est ensuite consignée en cleartext dans un fichier journal situé sur le chemin codé en dur. C:  Windows  Temp  TS_2CE1.tmp et montré à la figure 5.","html":"<p>La réussite de l’installation du hook est ensuite consignée en cleartext dans un fichier journal situé sur le chemin codé en dur. C:  Windows  Temp  TS_2CE1.tmp et montré à la figure 5.</p>"},{"id":"text-17","type":"text","heading":"","plain_text":"Figure 5. Journal généré lors de l&#39;installation des points d&#39;ancrage","html":"<p>Figure 5. Journal généré lors de l&#039;installation des points d&#039;ancrage</p>"},{"id":"text-18","type":"text","heading":"","plain_text":"Si la fonction ciblée n&#39;est pas trouvée, le programme d&#39;installation de points d&#39;ancrage recherche une fonction de secours, avec un ensemble différent de motifs d&#39;octet.\nFaire correspondre une séquence d&#39;octets pour localiser l&#39;adresse de la fonction ciblée au lieu d&#39;utiliser un décalage statique, plus d&#39;utiliser une séquence d&#39;octets de secours, permet skip-2.0 être plus résilient aux mises à jour MSSQL et potentiellement cibler plusieurs sqllang.dll mises à jour.\nUn mot de passe pour les gouverner tous\nLes fonctions visées par skip-2.0 sont liés à l&#39;authentification et à la journalisation des événements. Les fonctions visées incluent:","html":"<p>Si la fonction ciblée n&#039;est pas trouvée, le programme d&#039;installation de points d&#039;ancrage recherche une fonction de secours, avec un ensemble différent de motifs d&#039;octet.\nFaire correspondre une séquence d&#039;octets pour localiser l&#039;adresse de la fonction ciblée au lieu d&#039;utiliser un décalage statique, plus d&#039;utiliser une séquence d&#039;octets de secours, permet skip-2.0 être plus résilient aux mises à jour MSSQL et potentiellement cibler plusieurs sqllang.dll mises à jour.\nUn mot de passe pour les gouverner tous\nLes fonctions visées par skip-2.0 sont liés à l&#039;authentification et à la journalisation des événements. Les fonctions visées incluent:</p>"},{"id":"text-19","type":"text","heading":"","plain_text":"CPwdPolicyManager :: ValidatePwdForLogin\nCSECAuthenticate :: AuthenticateLoginIdentity\nReportLoginSuccess\nIssueLoginSuccessReport\nFExecuteLogonTriggers\nXeSqlPkg :: sql_statement_completed :: Publish\nXeSqlPkg :: sql_batch_completed :: Publish\nSecAuditPkg :: audit_event :: Publish\nXeSqlPkg :: login :: Publier\nXeSqlPkg :: ual_instrument_called :: Publish","html":"<p>CPwdPolicyManager :: ValidatePwdForLogin\nCSECAuthenticate :: AuthenticateLoginIdentity\nReportLoginSuccess\nIssueLoginSuccessReport\nFExecuteLogonTriggers\nXeSqlPkg :: sql_statement_completed :: Publish\nXeSqlPkg :: sql_batch_completed :: Publish\nSecAuditPkg :: audit_event :: Publish\nXeSqlPkg :: login :: Publier\nXeSqlPkg :: ual_instrument_called :: Publish</p>"},{"id":"text-20","type":"text","heading":"","plain_text":"La fonction la plus intéressante est la première (CPwdPolicyManager :: ValidatePwdForLogin), qui est responsable de la validation du mot de passe fourni pour un utilisateur donné. Le crochet de cette fonction vérifie si le mot de passe fourni par l’utilisateur correspond au mot de passe magique; Si tel est le cas, la fonction d&#39;origine ne sera pas appelée et le hook renverra 0, permettant ainsi la connexion même si le mot de passe correct n&#39;a pas été fourni. Un indicateur global est ensuite défini et sera vérifié par les autres fonctions raccordées responsables de la journalisation des événements. La procédure décompilée correspondante est illustrée à la figure 6. Dans le cas où cet indicateur global est défini, les fonctions de consignation raccordées retourneront en mode silencieux sans appeler leurs fonctions d&#39;origine correspondantes, de sorte que l&#39;action ne sera pas consignée. Dans le cas où un mot de passe différent est fourni, la fonction d&#39;origine est appelée.","html":"<p>La fonction la plus intéressante est la première (CPwdPolicyManager :: ValidatePwdForLogin), qui est responsable de la validation du mot de passe fourni pour un utilisateur donné. Le crochet de cette fonction vérifie si le mot de passe fourni par l’utilisateur correspond au mot de passe magique; Si tel est le cas, la fonction d&#039;origine ne sera pas appelée et le hook renverra 0, permettant ainsi la connexion même si le mot de passe correct n&#039;a pas été fourni. Un indicateur global est ensuite défini et sera vérifié par les autres fonctions raccordées responsables de la journalisation des événements. La procédure décompilée correspondante est illustrée à la figure 6. Dans le cas où cet indicateur global est défini, les fonctions de consignation raccordées retourneront en mode silencieux sans appeler leurs fonctions d&#039;origine correspondantes, de sorte que l&#039;action ne sera pas consignée. Dans le cas où un mot de passe différent est fourni, la fonction d&#039;origine est appelée.</p>"},{"id":"text-21","type":"text","heading":"","plain_text":"Figure 6. Sortie Hex-Rays de la procédure chargée de la correspondance du mot de passe fourni lors de la connexion avec la chaîne codée en dur","html":"<p>Figure 6. Sortie Hex-Rays de la procédure chargée de la correspondance du mot de passe fourni lors de la connexion avec la chaîne codée en dur</p>"},{"id":"text-22","type":"text","heading":"","plain_text":"Une technique de backdooring similaire, basée sur des mots de passe codés en dur, a été utilisée avec les backdoors SSH précédemment découverts par ESET. La différence ici est que skip-2.0 est installé en mémoire, tandis que dans le cas des portes dérobées SSH, la sshd l&#39;exécutable a été modifié avant l&#39;exécution.\nAditionellement, CSECAuthenticate :: AuthenticateLoginIdentity sera appelé à partir de son code de crochet mais le crochet retournera toujours 0. Le ReportLoginSucess et IssueLoginSuccessReport Les hooks n&#39;appelleront pas les fonctions d&#39;origine si le mot de passe magique a été utilisé pour se connecter. Le même comportement est appliqué à FEExecuteLogonTriggers. Autres fonctions de journalisation telles que XeSqlPkg :: sql_statement_completed :: Publish ou XeSqlPkg :: sql_batch_completed :: Publish sera également désactivé dans le cas où l&#39;utilisateur s&#39;est connecté avec le mot de passe magique. Plusieurs événements d&#39;audit sont également désactivés, notamment: SecAuditPkg :: audit_event :: Publish, XeSqlPkg :: login :: Publier et XeSqlPkg :: ual_instrument_called :: Publish.\nCette série de points d&#39;ancrage permet non seulement à l&#39;attaquant de conserver sa persistance dans le serveur MSSQL de la victime grâce à l&#39;utilisation d&#39;un mot de passe spécifique, mais également de rester non détecté grâce aux multiples mécanismes de publication des journaux et des événements désactivés lors de l&#39;utilisation de ce mot de passe.\nNous avons testé skip-2.0 contre plusieurs versions de MSSQL Server et nous avons constaté que nous pouvions nous connecter avec le mot de passe spécial avec MSSQL Server 11 et 12. Pour vérifier si un sqllang.dll la version est ciblée par skip-2.0 (c’est-à-dire qui correspond aux modèles d’octets), nous avons créé une règle YARA, qui peut être trouvée dans notre référentiel GitHub.\nConnexion avec le groupe Winnti\nNous avons observé de multiples similitudes entre skip-2.0 et d’autres outils de l’arsenal du groupe Winnti. Son lanceur VMProtected, emballeur personnalisé, Chargeur interne L&#39;injecteur et le cadre d&#39;accrochage font partie des outils déjà connus du groupe Winnti. Cela nous amène à penser que skip-2.0 fait également partie de cet ensemble d&#39;outils.\nConclusion\nle skip-2.0 backdoor est un ajout intéressant à l’arsenal du groupe Winnti, car il partage de nombreuses similitudes avec les outils déjà connus du groupe et permet à l’attaquant d’obtenir de la persistance sur un serveur MSSQL. Considérant que des privilèges d’administration sont requis pour l’installation des hooks, skip-2.0 doit être utilisé sur des serveurs MSSQL déjà compromis pour assurer la persistance et la furtivité.\nNous continuerons de surveiller les nouvelles activités du groupe Winnti et publierons des informations pertinentes sur notre blog. Pour toute demande de renseignements, contactez-nous à l&#39;adresse suivante :urtintel@eset.com.\nIndicateurs de compromis (IoC)","html":"<p>Une technique de backdooring similaire, basée sur des mots de passe codés en dur, a été utilisée avec les backdoors SSH précédemment découverts par ESET. La différence ici est que skip-2.0 est installé en mémoire, tandis que dans le cas des portes dérobées SSH, la sshd l&#039;exécutable a été modifié avant l&#039;exécution.\nAditionellement, CSECAuthenticate :: AuthenticateLoginIdentity sera appelé à partir de son code de crochet mais le crochet retournera toujours 0. Le ReportLoginSucess et IssueLoginSuccessReport Les hooks n&#039;appelleront pas les fonctions d&#039;origine si le mot de passe magique a été utilisé pour se connecter. Le même comportement est appliqué à FEExecuteLogonTriggers. Autres fonctions de journalisation telles que XeSqlPkg :: sql_statement_completed :: Publish ou XeSqlPkg :: sql_batch_completed :: Publish sera également désactivé dans le cas où l&#039;utilisateur s&#039;est connecté avec le mot de passe magique. Plusieurs événements d&#039;audit sont également désactivés, notamment: SecAuditPkg :: audit_event :: Publish, XeSqlPkg :: login :: Publier et XeSqlPkg :: ual_instrument_called :: Publish.\nCette série de points d&#039;ancrage permet non seulement à l&#039;attaquant de conserver sa persistance dans le serveur MSSQL de la victime grâce à l&#039;utilisation d&#039;un mot de passe spécifique, mais également de rester non détecté grâce aux multiples mécanismes de publication des journaux et des événements désactivés lors de l&#039;utilisation de ce mot de passe.\nNous avons testé skip-2.0 contre plusieurs versions de MSSQL Server et nous avons constaté que nous pouvions nous connecter avec le mot de passe spécial avec MSSQL Server 11 et 12. Pour vérifier si un sqllang.dll la version est ciblée par skip-2.0 (c’est-à-dire qui correspond aux modèles d’octets), nous avons créé une règle YARA, qui peut être trouvée dans notre référentiel GitHub.\nConnexion avec le groupe Winnti\nNous avons observé de multiples similitudes entre skip-2.0 et d’autres outils de l’arsenal du groupe Winnti. Son lanceur VMProtected, emballeur personnalisé, Chargeur interne L&#039;injecteur et le cadre d&#039;accrochage font partie des outils déjà connus du groupe Winnti. Cela nous amène à penser que skip-2.0 fait également partie de cet ensemble d&#039;outils.\nConclusion\nle skip-2.0 backdoor est un ajout intéressant à l’arsenal du groupe Winnti, car il partage de nombreuses similitudes avec les outils déjà connus du groupe et permet à l’attaquant d’obtenir de la persistance sur un serveur MSSQL. Considérant que des privilèges d’administration sont requis pour l’installation des hooks, skip-2.0 doit être utilisé sur des serveurs MSSQL déjà compromis pour assurer la persistance et la furtivité.\nNous continuerons de surveiller les nouvelles activités du groupe Winnti et publierons des informations pertinentes sur notre blog. Pour toute demande de renseignements, contactez-nous à l&#039;adresse suivante :urtintel@eset.com.\nIndicateurs de compromis (IoC)</p>"},{"id":"text-23","type":"text","heading":"","plain_text":"Composant\nSHA-1\nNom de détection ESET","html":"<p>Composant\nSHA-1\nNom de détection ESET</p>"},{"id":"text-24","type":"text","heading":"","plain_text":"Chargeur VMP\n18E4FEB988CB95D71D81E1964AA6280E22361B9F4AF89296A15C1EA9068A279E05CC4A41B967C956\nWin64 / Packed.VMProtect.HX","html":"<p>Chargeur VMP\n18E4FEB988CB95D71D81E1964AA6280E22361B9F4AF89296A15C1EA9068A279E05CC4A41B967C956\nWin64 / Packed.VMProtect.HX</p>"},{"id":"text-25","type":"text","heading":"","plain_text":"Injecteur à chargement interne\nA2571946AB181657EB825CDE07188E8BCD689575\nWin64 / Injector.BS","html":"<p>Injecteur à chargement interne\nA2571946AB181657EB825CDE07188E8BCD689575\nWin64 / Injector.BS</p>"},{"id":"text-26","type":"text","heading":"","plain_text":"skip-2.0\n60B9428D00BE5CE562FF3D888441220290A6DAC7\nWin32 / Agent.SOK","html":"<p>skip-2.0\n60B9428D00BE5CE562FF3D888441220290A6DAC7\nWin32 / Agent.SOK</p>"},{"id":"text-27","type":"text","heading":"","plain_text":"Connu ciblé sqllang.dll fichiers (liste non exhaustive)\n4396D3C904CD340984D474065959E8DD11915444BE352631E6A6A9D0B7BBA9B82D910FA5AB40C64ED4ADBC3F77ADE63B836FC4D9E5915A3479F09BD40BBD3321F93F3DCDD2A332D1F0326142B3F4961AFAE6B48F1D6EDDEC79E62844C444FE3955411EE3 A25B25FFA17E63C6884E28E96B487F58DF4502E7DE76419331381C390A758E634BF2E165A42D4807ED08E9B4BA6C4B5A1F26D671AD212AA2FB0874A21E1B0D91B37BAEBF77F85D1B7C640B8CC02FE11A59FB000D36612950FEBC36004F1317F7D000AA0B661DA36BDD115A1E649F3AAE11AD6F7D6FF2DB63\nN / A","html":"<p>Connu ciblé sqllang.dll fichiers (liste non exhaustive)\n4396D3C904CD340984D474065959E8DD11915444BE352631E6A6A9D0B7BBA9B82D910FA5AB40C64ED4ADBC3F77ADE63B836FC4D9E5915A3479F09BD40BBD3321F93F3DCDD2A332D1F0326142B3F4961AFAE6B48F1D6EDDEC79E62844C444FE3955411EE3 A25B25FFA17E63C6884E28E96B487F58DF4502E7DE76419331381C390A758E634BF2E165A42D4807ED08E9B4BA6C4B5A1F26D671AD212AA2FB0874A21E1B0D91B37BAEBF77F85D1B7C640B8CC02FE11A59FB000D36612950FEBC36004F1317F7D000AA0B661DA36BDD115A1E649F3AAE11AD6F7D6FF2DB63\nN / A</p>"},{"id":"text-28","type":"text","heading":"","plain_text":"Techniques MITRE ATT &amp; CK","html":"<p>Techniques MITRE ATT &amp; CK</p>"},{"id":"text-29","type":"text","heading":"","plain_text":"Tactique\nID\nprénom\nLa description","html":"<p>Tactique\nID\nprénom\nLa description</p>"},{"id":"text-30","type":"text","heading":"","plain_text":"Exécution\nT1035\nExécution du service\nskip-2.0 est commencé avec le  SessionEnv un service","html":"<p>Exécution\nT1035\nExécution du service\nskip-2.0 est commencé avec le  SessionEnv un service</p>"},{"id":"text-31","type":"text","heading":"","plain_text":"Persistance\nT1038\nDétournement d&#39;ordre de recherche de DLL\nskip-2.0 utilise probablement une technique de piratage de DLL contre le  SessionEnv un service","html":"<p>Persistance\nT1038\nDétournement d&#039;ordre de recherche de DLL\nskip-2.0 utilise probablement une technique de piratage de DLL contre le  SessionEnv un service</p>"},{"id":"text-32","type":"text","heading":"","plain_text":"T1179\nCrochet\nskip-2.0 accroche plusieurs fonctions dans sqllang.dll service pour contourner l&#39;authentification et rester furtif","html":"<p>T1179\nCrochet\nskip-2.0 accroche plusieurs fonctions dans sqllang.dll service pour contourner l&#039;authentification et rester furtif</p>"},{"id":"text-33","type":"text","heading":"","plain_text":"Défense Evasion\nT1054\nBlocage des indicateurs\nskip-2.0  bloque la journalisation des événements","html":"<p>Défense Evasion\nT1054\nBlocage des indicateurs\nskip-2.0  bloque la journalisation des événements</p>"},{"id":"text-34","type":"text","heading":"","plain_text":"T1045\nEmballage logiciel\nskip.2-0  et Chargeur interne sont emballés à l&#39;aide de l&#39;emballage personnalisé de Winnti. De plus, le lanceur est VMProtected.","html":"<p>T1045\nEmballage logiciel\nskip.2-0  et Chargeur interne sont emballés à l&#039;aide de l&#039;emballage personnalisé de Winnti. De plus, le lanceur est VMProtected.</p>"},{"id":"text-35","type":"text","heading":"","plain_text":"Découverte\nT1057\nDécouverte de processus\nChargeur interne liste les processus en cours afin de trouver le processus exécutant MSSQL Server","html":"<p>Découverte\nT1057\nDécouverte de processus\nChargeur interne liste les processus en cours afin de trouver le processus exécutant MSSQL Server</p>"},{"id":"text-36","type":"text","heading":"","plain_text":"Impact\nT1485\nDestruction de données\nskip-2.0 permet l&#39;accès non autorisé aux bases de données MSSQL, permettant ainsi la destruction ou la falsification des données","html":"<p>Impact\nT1485\nDestruction de données\nskip-2.0 permet l&#039;accès non autorisé aux bases de données MSSQL, permettant ainsi la destruction ou la falsification des données</p>"},{"id":"text-37","type":"text","heading":"","plain_text":"T1494\nManipulation des données d&#39;exécution\nskip-2.0 manipule la journalisation des événements au moment de l&#39;exécution","html":"<p>T1494\nManipulation des données d&#039;exécution\nskip-2.0 manipule la journalisation des événements au moment de l&#039;exécution</p>"},{"id":"text-38","type":"text","heading":"","plain_text":"T1492\nManipulation de données stockées\nskip-2.0 permet un accès non autorisé aux bases de données MSSQL, permettant la manipulation des données stockées","html":"<p>T1492\nManipulation de données stockées\nskip-2.0 permet un accès non autorisé aux bases de données MSSQL, permettant la manipulation des données stockées</p>"},{"id":"text-39","type":"text","heading":"","plain_text":"Mathieu Tartare\t\t\t\t\t\t\t\t21 octobre 2019 &#8211; 11h30","html":"<p>Mathieu Tartare\t\t\t\t\t\t\t\t21 octobre 2019 &#8211; 11h30</p>"},{"id":"text-40","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"Un groupe de cyberespionnage notoire rabaisse MSSQL"},{"id":"text-2","heading":"Text","content":"Les chercheurs d&#39;ESET suivent depuis un certain temps les activités du groupe Winnti, actif depuis au moins 2012 et responsable d&#39;attaques de grande envergure de la chaîne logistique contre l&#39;industrie du jeu vidéo et des logiciels. Récemment, nous avons découvert une porte dérobée non documentée ciblant Microsoft SQL (MSSQL) qui permettait aux attaquants de conserver un pied très discret au sein d’organisations compromises. Cette porte dérobée présente de nombreuses similitudes avec le PortReuse backdoor, autre outil utilisé par le groupe Winnti et documenté pour la première fois par ESET en octobre 2019, tel que l&#39;utilisation du même programme de personnalisation et du même programme de lancement VMProtected. C&#39;est pourquoi nous attribuons cette porte dérobée au groupe Winnti.\nPlus tôt cette année, nous avons reçu un échantillon de cette nouvelle porte dérobée appelée skip-2.0 par ses auteurs et une partie de l’arsenal du groupe Winnti. Cette porte dérobée cible MSSQL Server 11 et 12, permettant à l’attaquant de se connecter furtivement à n’importe quel compte MSSQL à l’aide d’un mot de passe magique, tout en masquant automatiquement ces connexions dans les journaux. Une telle porte dérobée pourrait permettre à un attaquant de copier, modifier ou supprimer furtivement le contenu de la base de données. Cela pourrait être utilisé, par exemple, pour manipuler des devises dans le jeu pour un gain financier. Des manipulations de bases de données de devises dans le jeu par des opérateurs de Winnti ont déjà été signalées. Au meilleur de notre connaissance, skip-2.0 est la première porte dérobée du serveur MSSQL à être documentée publiquement. Notez que, même si MSSQL Server 11 et 12 ne sont pas les versions les plus récentes (publiées en 2012 et 2014, respectivement), ce sont les plus couramment utilisées, selon les données de Censys.\nNous avons récemment publié un livre blanc mettant à jour notre compréhension de l’arsenal du groupe Winnti et exposant une de leurs portes secrètes, jusque-là non documentée. PortReuse. Il utilise un packer identique à celui utilisé avec la charge intégrée dans les jeux vidéo compromis découverts par ESET en mars 2019. Le lanceur VMProtected qui laisse tomber le PortReuse porte dérobée a également été trouvée en train d’être utilisée pour lancer ShadowPad versions. Dans ce contexte, nous avons pu trouver un nouvel outil appelé skip.2-0 par son développeur. Il utilise le même lanceur VMProtected ainsi que l’emballeur personnalisé du groupe Winnti et présente de nombreuses similitudes avec d’autres échantillons des outils du groupe Winnti. Cela nous amène à attribuer skip-2.0 à cet ensemble d&#39;outils également.\nCet article porte sur les détails techniques et les fonctionnalités de cette porte dérobée MSSQL Server, ainsi que sur les similitudes techniques entre skip.2-0 l’arsenal connu du groupe Winnti &#8211; en particulier avec le PortReuse porte dérobée et ShadowPad. Vous trouverez une note sur les raisons pour lesquelles nous avons choisi la dénomination «Groupe Winnti» sur notre livre blanc.\nLanceur VMProtected\nNous avons trouvé skip-2.0 recherche de lanceurs VMProtected, pour lesquels la charge utile est généralement soit PortReuse ou ShadowPad.\nCharge utile intégrée\nComme avec le crypté PortReuse et ShadowPad charges utiles, sautez-2.0 est intégré dans la superposition du lanceur VMProtected, comme illustré dans la figure 1:"},{"id":"text-3","heading":"Text","content":"Figure 1. En-têtes du lanceur VMProtected. La charge utile est intégrée à la superposition PE."},{"id":"text-4","heading":"Text","content":"Cryptage\nLe chiffrement de la charge utile est identique à celui utilisé dans les autres lanceurs VMProtected. Il est crypté avec RC5 avec une clé dérivée du VolumeID et la ficelle f @ Ukd! rCto R $. &#8211; comme décrit dans notre précédent livre blanc sur l&#39;arsenal du groupe Winnti.\nPersistance\nComme dans le cas de PortReuse et ShadowPad, le lanceur persiste probablement en exploitant une vulnérabilité de piratage de DLL en étant installé à C:  Windows  System32  TSVIPSrv.DLL. Cela entraîne le chargement de la DLL par le Windows standard SessionEnv service au démarrage du système.\nEmballeur personnalisé du groupe Winnti\nUne fois déchiffré, la charge intégrée est en fait l’emballeur personnalisé de Winnti Group. Ce packer est le même shellcode que celui décrit dans notre précédent article et notre livre blanc. Il est utilisé pour emballer le PortReuse porte dérobée ainsi que la charge utile intégrée aux jeux vidéo compromis.\nConfiguration du packer\nComme décrit dans notre article précédent, la configuration du programme de compression contient la clé de déchiffrement du fichier binaire compressé, ainsi que son nom de fichier d&#39;origine, sa taille et le type d&#39;exécution (EXE ou DLL). La configuration de l’emballeur de la charge utile est indiquée dans le tableau 1."},{"id":"text-5","heading":"Text","content":"Parent SHA-1\nCharge utile SHA-1\nClé RC4\nNom de fichier\nType de lancement"},{"id":"text-6","heading":"Text","content":"9aafe81d07b3e5bb282608f0a2a4656eb485b7c9\na2571946ab181657eb825cde07188e8bcd689575\n163716559\nInner-Loader.dll\n2"},{"id":"text-7","heading":"Text","content":"Tableau 1. Configuration du packer de Payload\nLa configuration de l’emballeur indique que la charge utile est appelée Chargeur interne. Chargeur interne est le nom d’un injecteur qui fait partie de l’arsenal du groupe Winnti utilisé pour injecter le PortReuse porte dérobée dans les processus d&#39;écoute sur un port particulier, comme décrit dans notre publication précédente. Au-delà de ce nom identique, il apparaît en analysant cette charge utile qu’il s’agit d’une autre variante du Chargeur interne injecteur.\nInjecteur à chargement interne\nCette variante de Chargeur interne, au lieu de rechercher un processus d’écoute sur un port particulier, comme dans le cas de l’injection du PortReuse porte dérobée, recherche un processus appelé sqlserv.exe, qui est le nom de processus conventionnel de MSSQL Server. Si trouvé, Chargeur interne puis injecte une charge utile dans ce processus. Cette charge est également fournie avec l’emballeur personnalisé. La configuration de l’emballeur de cette charge est indiquée dans le tableau 2."},{"id":"text-8","heading":"Text","content":"Parent SHA-1\nCharge utile SHA-1                             \nClé RC4\nNom de fichier\nType de lancement"},{"id":"text-9","heading":"Text","content":"a2571946ab181657eb825cde07188e8bcd689575\n60b9428d00be5ce562ff3d888441220290a6dac7\n923567961\nskip-2.0.dll\n2"},{"id":"text-10","heading":"Text","content":"Tableau 2. Configuration du packer de la charge utile intégrée à Inner-Loader\nLe nom de fichier original de cette charge utile injectée est skip-2.0.dll.\nskip-2.0\nAprès avoir été injecté et lancé par Chargeur interne, sauter-2.0 vérifie d’abord si elle s’exécute dans un sqlserv.exe processus et si oui, récupère une poignée pour sqllang.dll, qui est chargé par sqlserv.exe. Il recherche ensuite et accroche plusieurs fonctions à partir de cette DLL. La figure 2 illustre le skip-2.0 chaîne de compromis."},{"id":"text-11","heading":"Text","content":"Figure 2. Déballage et injection skip-2.0"},{"id":"text-12","heading":"Text","content":"Accrochage sqllang.dll\nLa procédure d’accrochage utilisée par skip-2.0 est très similaire à celle utilisée par NetAgent, le PortReuse module responsable de l’installation du hook réseau. Cette bibliothèque de hook est basée sur le désassembleur Open Source distorm utilisé par plusieurs infrastructures de hook Open Source. En particulier, une bibliothèque de désassemblage est nécessaire pour calculer correctement la taille des instructions à accrocher. On peut voir sur la figure 3 que la procédure d’accrochage utilisée par NetAgent et skip-2.0 sont presque identiques."},{"id":"text-13","heading":"Text","content":"Figure 3. Comparaison de la production de rayons Hex-Ray entre les procédures de raccordement NetAgent (à gauche) et skip-2.0 (à droite)"},{"id":"text-14","heading":"Text","content":"Il existe une différence notable, à savoir le fait que la fonction d’accrochage de skip-2.0 prend l&#39;adresse du crochet à installer comme argument, alors que pour NetAgent, l&#39;adresse du crochet à installer est codée en dur. Ceci est dû au fait que skip-2.0 doit accrocher plusieurs fonctions dans sqllang.dll pour fonctionner correctement, tout en NetAgent ne cible qu&#39;une seule fonction.\nPour localiser chacun sqllang.dll fonction à accrocher, skip-2.0 récupère d’abord la taille de la DLL une fois chargée en mémoire (c’est-à-dire sa taille virtuelle) en analysant ses en-têtes PE. Ensuite, un tableau d&#39;octets à faire correspondre dans sqllang.dll est initialisé comme indiqué dans la figure 4. Une fois que l&#39;adresse de la première occurrence correspondant au tableau d&#39;octets est trouvée, le hook est installé à l&#39;aide de la procédure indiquée dans la figure 3."},{"id":"text-15","heading":"Text","content":"Figure 4. Sortie Hex-Rays de la procédure initialisant le tableau d&#39;octets pour correspondre à     sqllang.dll"},{"id":"text-16","heading":"Text","content":"La réussite de l’installation du hook est ensuite consignée en cleartext dans un fichier journal situé sur le chemin codé en dur. C:  Windows  Temp  TS_2CE1.tmp et montré à la figure 5."},{"id":"text-17","heading":"Text","content":"Figure 5. Journal généré lors de l&#39;installation des points d&#39;ancrage"},{"id":"text-18","heading":"Text","content":"Si la fonction ciblée n&#39;est pas trouvée, le programme d&#39;installation de points d&#39;ancrage recherche une fonction de secours, avec un ensemble différent de motifs d&#39;octet.\nFaire correspondre une séquence d&#39;octets pour localiser l&#39;adresse de la fonction ciblée au lieu d&#39;utiliser un décalage statique, plus d&#39;utiliser une séquence d&#39;octets de secours, permet skip-2.0 être plus résilient aux mises à jour MSSQL et potentiellement cibler plusieurs sqllang.dll mises à jour.\nUn mot de passe pour les gouverner tous\nLes fonctions visées par skip-2.0 sont liés à l&#39;authentification et à la journalisation des événements. Les fonctions visées incluent:"},{"id":"text-19","heading":"Text","content":"CPwdPolicyManager :: ValidatePwdForLogin\nCSECAuthenticate :: AuthenticateLoginIdentity\nReportLoginSuccess\nIssueLoginSuccessReport\nFExecuteLogonTriggers\nXeSqlPkg :: sql_statement_completed :: Publish\nXeSqlPkg :: sql_batch_completed :: Publish\nSecAuditPkg :: audit_event :: Publish\nXeSqlPkg :: login :: Publier\nXeSqlPkg :: ual_instrument_called :: Publish"},{"id":"text-20","heading":"Text","content":"La fonction la plus intéressante est la première (CPwdPolicyManager :: ValidatePwdForLogin), qui est responsable de la validation du mot de passe fourni pour un utilisateur donné. Le crochet de cette fonction vérifie si le mot de passe fourni par l’utilisateur correspond au mot de passe magique; Si tel est le cas, la fonction d&#39;origine ne sera pas appelée et le hook renverra 0, permettant ainsi la connexion même si le mot de passe correct n&#39;a pas été fourni. Un indicateur global est ensuite défini et sera vérifié par les autres fonctions raccordées responsables de la journalisation des événements. La procédure décompilée correspondante est illustrée à la figure 6. Dans le cas où cet indicateur global est défini, les fonctions de consignation raccordées retourneront en mode silencieux sans appeler leurs fonctions d&#39;origine correspondantes, de sorte que l&#39;action ne sera pas consignée. Dans le cas où un mot de passe différent est fourni, la fonction d&#39;origine est appelée."},{"id":"text-21","heading":"Text","content":"Figure 6. Sortie Hex-Rays de la procédure chargée de la correspondance du mot de passe fourni lors de la connexion avec la chaîne codée en dur"},{"id":"text-22","heading":"Text","content":"Une technique de backdooring similaire, basée sur des mots de passe codés en dur, a été utilisée avec les backdoors SSH précédemment découverts par ESET. La différence ici est que skip-2.0 est installé en mémoire, tandis que dans le cas des portes dérobées SSH, la sshd l&#39;exécutable a été modifié avant l&#39;exécution.\nAditionellement, CSECAuthenticate :: AuthenticateLoginIdentity sera appelé à partir de son code de crochet mais le crochet retournera toujours 0. Le ReportLoginSucess et IssueLoginSuccessReport Les hooks n&#39;appelleront pas les fonctions d&#39;origine si le mot de passe magique a été utilisé pour se connecter. Le même comportement est appliqué à FEExecuteLogonTriggers. Autres fonctions de journalisation telles que XeSqlPkg :: sql_statement_completed :: Publish ou XeSqlPkg :: sql_batch_completed :: Publish sera également désactivé dans le cas où l&#39;utilisateur s&#39;est connecté avec le mot de passe magique. Plusieurs événements d&#39;audit sont également désactivés, notamment: SecAuditPkg :: audit_event :: Publish, XeSqlPkg :: login :: Publier et XeSqlPkg :: ual_instrument_called :: Publish.\nCette série de points d&#39;ancrage permet non seulement à l&#39;attaquant de conserver sa persistance dans le serveur MSSQL de la victime grâce à l&#39;utilisation d&#39;un mot de passe spécifique, mais également de rester non détecté grâce aux multiples mécanismes de publication des journaux et des événements désactivés lors de l&#39;utilisation de ce mot de passe.\nNous avons testé skip-2.0 contre plusieurs versions de MSSQL Server et nous avons constaté que nous pouvions nous connecter avec le mot de passe spécial avec MSSQL Server 11 et 12. Pour vérifier si un sqllang.dll la version est ciblée par skip-2.0 (c’est-à-dire qui correspond aux modèles d’octets), nous avons créé une règle YARA, qui peut être trouvée dans notre référentiel GitHub.\nConnexion avec le groupe Winnti\nNous avons observé de multiples similitudes entre skip-2.0 et d’autres outils de l’arsenal du groupe Winnti. Son lanceur VMProtected, emballeur personnalisé, Chargeur interne L&#39;injecteur et le cadre d&#39;accrochage font partie des outils déjà connus du groupe Winnti. Cela nous amène à penser que skip-2.0 fait également partie de cet ensemble d&#39;outils.\nConclusion\nle skip-2.0 backdoor est un ajout intéressant à l’arsenal du groupe Winnti, car il partage de nombreuses similitudes avec les outils déjà connus du groupe et permet à l’attaquant d’obtenir de la persistance sur un serveur MSSQL. Considérant que des privilèges d’administration sont requis pour l’installation des hooks, skip-2.0 doit être utilisé sur des serveurs MSSQL déjà compromis pour assurer la persistance et la furtivité.\nNous continuerons de surveiller les nouvelles activités du groupe Winnti et publierons des informations pertinentes sur notre blog. Pour toute demande de renseignements, contactez-nous à l&#39;adresse suivante :urtintel@eset.com.\nIndicateurs de compromis (IoC)"},{"id":"text-23","heading":"Text","content":"Composant\nSHA-1\nNom de détection ESET"},{"id":"text-24","heading":"Text","content":"Chargeur VMP\n18E4FEB988CB95D71D81E1964AA6280E22361B9F4AF89296A15C1EA9068A279E05CC4A41B967C956\nWin64 / Packed.VMProtect.HX"},{"id":"text-25","heading":"Text","content":"Injecteur à chargement interne\nA2571946AB181657EB825CDE07188E8BCD689575\nWin64 / Injector.BS"},{"id":"text-26","heading":"Text","content":"skip-2.0\n60B9428D00BE5CE562FF3D888441220290A6DAC7\nWin32 / Agent.SOK"},{"id":"text-27","heading":"Text","content":"Connu ciblé sqllang.dll fichiers (liste non exhaustive)\n4396D3C904CD340984D474065959E8DD11915444BE352631E6A6A9D0B7BBA9B82D910FA5AB40C64ED4ADBC3F77ADE63B836FC4D9E5915A3479F09BD40BBD3321F93F3DCDD2A332D1F0326142B3F4961AFAE6B48F1D6EDDEC79E62844C444FE3955411EE3 A25B25FFA17E63C6884E28E96B487F58DF4502E7DE76419331381C390A758E634BF2E165A42D4807ED08E9B4BA6C4B5A1F26D671AD212AA2FB0874A21E1B0D91B37BAEBF77F85D1B7C640B8CC02FE11A59FB000D36612950FEBC36004F1317F7D000AA0B661DA36BDD115A1E649F3AAE11AD6F7D6FF2DB63\nN / A"},{"id":"text-28","heading":"Text","content":"Techniques MITRE ATT &amp; CK"},{"id":"text-29","heading":"Text","content":"Tactique\nID\nprénom\nLa description"},{"id":"text-30","heading":"Text","content":"Exécution\nT1035\nExécution du service\nskip-2.0 est commencé avec le  SessionEnv un service"},{"id":"text-31","heading":"Text","content":"Persistance\nT1038\nDétournement d&#39;ordre de recherche de DLL\nskip-2.0 utilise probablement une technique de piratage de DLL contre le  SessionEnv un service"},{"id":"text-32","heading":"Text","content":"T1179\nCrochet\nskip-2.0 accroche plusieurs fonctions dans sqllang.dll service pour contourner l&#39;authentification et rester furtif"},{"id":"text-33","heading":"Text","content":"Défense Evasion\nT1054\nBlocage des indicateurs\nskip-2.0  bloque la journalisation des événements"},{"id":"text-34","heading":"Text","content":"T1045\nEmballage logiciel\nskip.2-0  et Chargeur interne sont emballés à l&#39;aide de l&#39;emballage personnalisé de Winnti. De plus, le lanceur est VMProtected."},{"id":"text-35","heading":"Text","content":"Découverte\nT1057\nDécouverte de processus\nChargeur interne liste les processus en cours afin de trouver le processus exécutant MSSQL Server"},{"id":"text-36","heading":"Text","content":"Impact\nT1485\nDestruction de données\nskip-2.0 permet l&#39;accès non autorisé aux bases de données MSSQL, permettant ainsi la destruction ou la falsification des données"},{"id":"text-37","heading":"Text","content":"T1494\nManipulation des données d&#39;exécution\nskip-2.0 manipule la journalisation des événements au moment de l&#39;exécution"},{"id":"text-38","heading":"Text","content":"T1492\nManipulation de données stockées\nskip-2.0 permet un accès non autorisé aux bases de données MSSQL, permettant la manipulation des données stockées"},{"id":"text-39","heading":"Text","content":"Mathieu Tartare\t\t\t\t\t\t\t\t21 octobre 2019 &#8211; 11h30"},{"id":"text-40","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":"https://tutos-gameserver.fr/wp-content/uploads/2019/12/ws-m.jpg"},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2019/12/05/skip-%e2%80%91-2-0-du-groupe-winnti-une-porte-derobee-microsoft-sql-server-bien-choisir-son-serveur-d-impression/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/12/05/skip-%e2%80%91-2-0-du-groupe-winnti-une-porte-derobee-microsoft-sql-server-bien-choisir-son-serveur-d-impression/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2019/12/05/skip-%e2%80%91-2-0-du-groupe-winnti-une-porte-derobee-microsoft-sql-server-bien-choisir-son-serveur-d-impression/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}