Des rappels d’anniversaires, anodins en apparence seulement : ils interceptent le DNS et affichent des publicités indésirables

Des rappels d’anniversaires, anodins en apparence seulement : ils interceptent le DNS et affichent des publicités indésirables

Les chercheurs d'ESET ont analysé un logiciel de rappels d’anniversaires dont des composants supplémentaires interceptent des requêtes DNS pour injecter des publicités.

Les chercheurs d’ESET ont analysé un logiciel de rappels d’anniversaires dont des composants supplémentaires interceptent des requêtes DNS pour injecter des publicités.

L’étrange comportement d’une simple application Windows a retenu notre attention, et c’est pourquoi ESET a décidé d’analyser un logiciel malveillant qui à ce jour passait sous le radar. Après avoir reçu une question de la part du fournisseur régional de soins de santé Sykehuspartner, l’un de nos contacts au Norwegian HealthCERT nous a interrogés concernant des requêtes DNS envoyées à des domaines sous le format [0-9a-f]{60}.smoke. Il n’existe aucun domaine de premier niveau nommé .smoke (du moins était-ce le cas au moment de rédiger le présent article).

L’application responsable de ce comportement est un programme de rappels d’anniversaires très simple. Il s’agit d’un programme légitime, mais il présente des fonctionnalités intéressantes qui ne sont pas divulguées explicitement aux utilisateurs. Nous avons vu le programme de rappels d’anniversaires télécharger et exécuter des composants supplémentaires, lesquels interceptent des requêtes DNS pour injecter des publicités sur des pages Web. Nous avons baptisé cette nouvelle menace DNSBirthday.

Il est également évident que les auteurs de ce logiciel malveillant ont configuré tous les composants et ne font pas que revendre des machines compromises. Par exemple, le serveur de commande et de contrôle est le même pour tous les échantillons, et on trouve dans le logiciel malveillant de nombreuses références à un projet intitulé RQZTech.

Figure 1 – Interface du programme de rappels d’anniversaires

Figure 1 – Interface du programme de rappels d’anniversaires

Distribution

Nous avons constaté qu’il est uniquement possible de télécharger le logiciel d’installation du programme de rappels d’anniversaires à partir de l’adresse URL suivante :

hxxp://updates.rqztech.com/download?app=BirthdayReminder&aff_id=15124

Le paramètre aff_id suggère que la distribution s’effectue par l’intermédiaire d’un programme affilié, mais nous n’avons pas été en mesure de le confirmer. Il pourrait également s’agir d’un leurre.

La technologie de télémétrie d’ESET démontre que cette menace est présente dans le monde entier, mais qu’elle touche particulièrement certains pays comme les États-Unis, l’Espagne, le Japon et l’Italie.

Figure 2 – Distribution mondiale de DNSBirthday

Figure 2 – Distribution mondiale de DNSBirthday

Analyse technique

DNSBirthday consiste en un logiciel malveillant modulaire formé de plusieurs composants. Il nous a fallu un certain temps pour assembler toutes les pièces du casse-tête et comprendre l’ensemble du mécanisme sur lequel repose le fonctionnement de ce logiciel malveillant. Tous les composants partagent certaines caractéristiques communes :

  • Ils communiquent avec un seul serveur de commande et de contrôle (rqztech.com) à l’aide de messages JSON formatés sur HTTPS.
  • La plupart des objets binaires sont liés de façon statique avecOpenSSL et libcurl, ainsi qu’avec une bibliothèque JSON.
  • La plupart des noms des composants débutent par le préfixerqz.
  • Les chemins d’accès PDB des composants prennent la forme suivante :C:\Users\default.default-PC\Documents\Visual Studio 2013\Projects\rqz-[module-name]\Release\rqz-[module-name].pdb.
Figure 3 – Page d’accueil de RQZTech en date du 2 juin 2017

Figure 3 – Page d’accueil de RQZTech en date du 2 juin 2017

Les auteurs ont choisi d’épingler deux certificats afin de prévenir les attaques par hôte interposé. Cependant, le serveur a répondu aux requêtes HTTP non chiffrées; il était donc possible de capturer le trafic du réseau lors du débogage en remplaçant le schéma URL de ces requêtes par http.

Les certificats intégrés aux exécutables sont autosignés. Le champ Not-before indique qu’ils ont probablement été générés le 16 avril 2016.

Nous étudierons en détail chaque composant, mais d’abord, voici un aperçu de la façon dont ils sont liés.

Figure 4 – Aperçu des composants de DNSBirthday

Figure 4 – Aperçu des composants de DNSBirthday

Même si tous les composants sont des exécutables PE, seuls certains sont écrits sur le disque. Les autres sont chargés et exécutés en mémoire à l’aide d’un chargeur au format PE personnalisé.

BirthdayReminderSetup.exe.

BirthdayReminderSetup.exe consiste en un paquet NSIS de 18 Mo. Ce programme d’installation détermine d’abord la version du système d’exploitation (32 ou 64 bits), puis il extrait plusieurs fichiers qu’il dépose dans le dossier d’installation spécifié en conséquence.

Par la suite, il assure une certaine cohérence en créant la valeur BirthdayReminder dans la clé de registre HKLM\Software\Microsoft\Windows\CurrentVersion\Run , ainsi que le chemin d’accès à l’application BRController.exe. Après tout, comment pourrait-il vous envoyer des rappels d’anniversaires s’il ne fonctionne pas en permanence? Il possède même une icône dans la zone de notification de votre ordinateur.

BRController.exe — rqz-loader

Le composant BRController.exe a pour seul objectif de déchiffrer le fichier br.dll.enc en mémoire, de le charger et d’appeler rqz_stg1_init, l’une de ses fonctions exportées.

L’algorithme de déchiffrement utilisé est AES-256-CBC, mis en œuvre par l’intermédiaire d’une bibliothèque OpenSSL liée de façon statique.

La clé de déchiffrement est générée en deux étapes. D’abord, l’empreinte numérique SHA-256 du fichier logo.png est générée. Ensuite, une simple opération de chiffrement XOR (opérateur booléen OU exclusif) est appliquée à l’empreinte numérique. Le premier octet est lié par chiffrement XOR au dernier, tandis que tous les autres octets sont liés de la même façon au premier.

Le vecteur d’initialisation (VI) représente les 16 premiers octets de la clé, qui sont ensuite remaniés selon la même opération de chiffrement XOR utilisée pour la clé.

br.dll — rqz-stg1

Nous nommons br.dll la forme non chiffrée du fichier br.dll.enc. Cette bibliothèque agit en tant que composant principal de ce logiciel malveillant.

D’abord, br.dll crée un mutex Global\Global\RqzSingleInst,puis il crée une liste d’objets nommés de façon explicite (p. ex., dlExec, loader ou même exfil). Ces objets, lorsqu’ils sont appelés, peuvent effectuer des tâches comme télécharger des fichiers exécutables, les enregistrer sur le disque et les exécuter, ou encore exfiltrer des données vers le serveur de commande et de contrôle.

Le composant récupère un identifiant de robot unique codé en dur dans l’exécutable BRController en recherchant la séquence d’octets 0xB00B1355, puis en lisant les 16 octets suivants. Ensuite, il tente de lancer l’interface utilisateur graphique de l’application de rappels d’anniversaires et entre dans une séquence en boucle pour communiquer avec son serveur de commande et de contrôle.

La première requête HTTP POST envoyée au serveur

(hxxps://updates.rqztech.com/update_check/) contient certains renseignements de base au format JSON. Ces derniers apparaissent dans le paramètre de données.

Wireshark Follow TCP traffic-server

Voici une version épurée de la première requête POST envoyée au serveur de commande et de contrôle :

Ce fichier JSON contient la version du logiciel malveillant ver, 1.1.0-x32), la version de Windows (osver), l’identifiant du robot (uuid), le nombre de fois que le logiciel malveillant a tenté de communiquer avec le serveur (checkinCount), ainsi qu’un tableau affichant l’état du dernier composant chargé (compStatus).

Le serveur répond avec un tableau JSON contenant une liste de paramètres à transmettre aux différents composants. Même si la requête ressemble à une opération de mise à jour logicielle, nous avons constaté qu’elle sert à introduire des composants malveillants dans les ordinateurs des victimes.

La première fois que le logiciel malveillant communique avec le serveur, ce dernier répond en lui envoyant le fichier JSON suivant (la chaîne payload a été tronquée afin d’améliorer la lisibilité).

Réponse du serveur de commande et de contrôle :

La réponse du serveur indique que trois actions à exécuter successivement. La première définit certaines variables de l’environnement à l’aide du composant callback.

Le composant loader est ensuite appelé afin de déchiffrer et de charger le composant rqz_info_gatherer en mémoire. La chaîne payload est une bibliothèque de liens dynamiques (DLL) chiffrée et encodée en base64 (rqz_info_gatherer). L’opération de déchiffrement est la même que celle effectuée pour déchiffrer le fichier br.dll.enc.

Une fois chargé, le composant récemment déchiffré est appelé.

Par la suite, le logiciel malveillant demeure en veille pendant huit heures.

rqz-info-gatherer

L’objectif de ce module consiste à recueillir des renseignements sur la machine et à envoyer un rapport à l’aide du composant exfil à partir du module br.dll.

Le composant exfil envoie une requête HTTPS POST à hxxps://updates.rqztech.com/update_report/ avec le robot uuid et le paramètre payload. Le paramètre payload consiste en un objet JSON formé de deux éléments : data et sha256.

La chaîne sha256 représente l’empreinte numérique des données avant qu’elles ne soient encodées en base64.

La chaîne data est un fichier JSON encodé en base64 qui contient des renseignements sur l’ordinateur. Le fragment de code suivant est un exemple de rapport décodé envoyé au serveur (la chaîne procStat est tronquée afin d’améliorer la lisibilité).

Exemple de rapport créé par le module rqz-info-gatherer :

La plupart de ces champs s’expliquent facilement. L’objet dirStat contient la taille en octet de certains dossiers.

Une fois envoyé, le serveur répond tout simplement danke (« merci » en allemand), ce qui, étrangement, correspond au nom de champ de pays dans le certificat public.

rqz-dnsduvel-ldr

Nous avons également noté qu’après une certaine période (une ou deux semaines), le composant br.dlltélécharge le composant rqz-dnsduvel-ldr. Le terme duvel signifie « diable » en (ancien) néerlandais et en frison. Par conséquent, le nom de ce composant veut probablement dire « DNS diabolique ».

Ce composant recherche des processus de navigateur tels que iexplore.exe, chrome.exe et firefox.exe afin d’y introduire du code malveillant.

Lorsqu’il trouve un processus, le module installe et exécute un fichier exécutable intégré dans le dossier %TEMP% (GetTempPathA). Le nom du fichier représente l’identifiant du processus dans lequel le code malveillant sera introduit, accompagné de l’extension .tmp. Cela signifie que pour chaque processus de navigateur à infecter, une copie de l’exécutable est déposée sous forme de fichier .TMP dans le dossier temporaire.

L’objet binaire déposé utilise le nom interne rqz-dnsduvel-ldr-exe,et l’identifiant du processus à infecter et un identifiant de session y sont attribués en tant que paramètres.

rqz-dnsduvel-ldr-exe

Ce composant est un injecteur qui utilise une injection de DLL par réflexion pour charger une bibliothèque de liens dynamiques dans l’espace d’adressage d’un autre processus.

Cet exécutable contient un autre exécutable, mais contrairement au module rqz-dnsduvel-ldr, l’objet binaire intégré est chiffré. Encore une fois, l’opération de déchiffrement emploie l’algorithme AES-256-CBC, mais cette fois, le VI et la clé sont figés.

L’injecteur communique avec le serveur pour obtenir un fichier de configuration. Cette demande est effectuée par l’intermédiaire d’une requête HTTPS POST envoyée à :

hxxps://updates.rqztech.com/update_report/?update=fdac34d

Les paramètres POST sont, encore une fois, uuid et payload. De même,payload représente un objet JSON doté d’un paramètre data et d’une clé sha256. La chaîne data représente le fichier JSON encodé en base64 suivant, où procNamedésigne le navigateur à infecter et où sessionID correspond au témoin défini par le deuxième argument de la ligne de commande.

Exemple de rapport produit par le module rqz-dnsduvel-ldr-exe :

Le serveur répond en envoyant le fichier de configuration JSON suivant (le tableau blockList est tronqué afin d’améliorer la lisibilité).

Exemple de fichier de configuration généré pour le module rqz-dnsduvel-ldr-exe :

Toute la configuration, accompagnée d’une liste de blocage exhaustive, est accessible sur la page Github d’ESET.

Le tableau blockList contient environ 500 noms de domaines qui hébergent habituellement des publicités. Le contenu de cette configuration est stocké dans un fichier de mappage sauvegardé en mémoire et nommé rqzduvel-checkin-payload. Il a été créé à l’aide de la commande CreateFileMapping(INVALID_HANDLE_VALUE, …​).

Le champ token contient un nom de domaine utilisé par le  logiciel malveillant pour vérifier si le serveur DNS employé correspond à la valeur du champ dnsServer. DNSBirthday interroge ce domaine et vérifie si l’adresse retournée est bien 127.0.0.1.

Le module récupère l’exportation ReflectiveLoader dans l’objet binaire déchiffré (rqz-dnsduvel) et associe la bibliothèque à l’espace d’adressage du navigateur à l’aide de la commande WriteProcessMemory. Il appelle ensuite la fonction CreateRemoteThread , après avoir défini le paramètre lpStartAddress selon l’adresse de l’exportation récupérée.

Après l’injection, le composant informe le serveur de commande et de contrôle de la réussite de l’opération par l’intermédiaire d’une requête POST envoyée à : hxxps://updates.rqztech.com/moduleapi/

Le résultat de l’injection est envoyé au serveur de commande et de contrôle de la façon suivante :

La chaîne reason peut contenir les valeurs suivantes :

  1. L’objet binaire n’est pas parvenu à ouvrir le processus du navigateur sur l’ordinateur de la victime.
  2. L’injection a réussi (le processus est toujours en cours d’exécution après une minute).
  3. Le processus a probablement échoué, ainsi que l’injection.

rqz-dnsduvel

Le composant rqz-dnsduvel s’active en dernier; son objectif consiste à intercepter les fonctions du résolveur DNS.

Les auteurs ont probablement emprunté du code afin d’effectuer l’injection de DLL par réflexion. Ils ont également lié de façon statique le projet NTHooklib, lequel comprend la bibliothèque udis86NTHooklib consiste en une bibliothèque qui fournit un moteur d’interception.

Le composant intercepte les fonctions DNS suivantes :

  • getaddrinfo
  • GetAddrInfoW
  • gethostbyname
  • GetAddrInfoEx

L’objectif de cette interception consiste à interroger un autre serveur DNS lorsque la requête s’adresse à un nom de domaine qui figure dans la « liste de blocage » du fichier de configuration.

Chaque fois que le navigateur infecté doit résoudre l’un de ces noms de domaine, le serveur désigné dans le champ dnsServer est utilisé (176.31.106.50 dans ce cas-ci). Tandis que nous étudiions le comportement de DNSBirthday, nous avons constaté que peu importe le nom de domaine interrogé, l’adresse IP générée par le serveur DNS frauduleux était toujours 188.214.30.97 ou 188.214.30.98.

Le fragment de code suivant est une boucle qui remplace toutes les réponses provenant de la véritable fonction getaddrinfo; cette boucle présente l’adresse IP générée par le serveur frauduleux.

Figure 5 – Interception de la fonction getaddrinfo visant à remplacer les résultats

Figure 5 – Interception de la fonction getaddrinfo visant à remplacer les résultats

Injection de publicités

Comme nous l’avons déjà mentionné, les noms de domaine qui figurent sur la « liste de blocage » sont liés à des publicités, ce qui nous amène à penser que l’objectif principal de ce logiciel malveillant est de remplacer ou d’introduire des publicités sur des pages Web.

Lorsqu’il reçoit des requêtes pour des fichiers .js, le serveur à l’adresse 188.214.30.97 génère toujours le même fichier. Le script ajoute un élément div accompagné de l’identifiant greenteainthesahara. Ensuite, il envoie une requête HTTP POST à l’adresse URL hxxp://ads.greenteamedia.net/ads et évalue (eval) simplement la réponse.

Le fichier JavaScript que nous avons étudié sur ads.greenteamedia.net contient du code pour différents navigateurs et plateformes et même, étrangement, pour des téléphones mobiles. L’objectif principal de ce script consiste à ajouter sur la page un récepteur d’événements qui, au premier clic, ouvre une nouvelle fenêtre de navigation affichant une publicité.

Figure 6 – Élément « div » malveillant ajouté à une page Web

Figure 6 – Élément « div » malveillant ajouté à une page Web

Voici un exemple de chaîne de redirection que nous avons pu observer.

  1. hxxp://ads.greenteamedia.net/tracker?id=58b87f2a2a61cf000a11f651&type=Popunder
  2. hxxp://go.oclaserver.com/afu.php?zoneid=788473
  3. hxxp://onclkds.com/afu.php?zoneid=788473
  4. hxxp://onclkds.com/?r=/mb/han&zoneid=788473&pbk2=fd0ac8ee88f5760db27385dc91765d976393347937513284046&auction_id=b322d474-a5bc-4757-bb28-6613427bd3e8&uuid=fffa3dff-f018-412b-95a9-1a9e915fa972&ad_scheme=1&ab=148&rotation_type=2&adparams=bm9qcz0w&x=1698&y=822&sw=1716&sh=927&wx=0&wy=0&ww=1716&wh=887&wiw=1698&wih=822&wfc=0&pl=http://onclkds.com/afu.php?zoneid=788473&drf=&np=0&pt=undefined&nb=1&ng=1&dm

Le reste de la chaîne change et dépend probablement du résultat de l’offre publicitaire. Parfois, la chaîne crée une redirection vers une page de téléchargement susceptible d’introduire encore plus de codes malveillants.

Conclusion

Les auteurs de ce maliciel se sont donné beaucoup de mal simplement pour introduire des publicités indésirables.

Comme nous l’avons démontré, les auteurs ont déployé de nombreux efforts pour éviter d’être détectés, en intégrant un chargeur PE, en chargeant et en déchiffrant des composants en mémoire, en créant une architecture modulaire qui permet la mise à jour et l’ajout d’autres composants, ainsi qu’en utilisant une clé publique épinglée pour sécuriser leurs communications.

Néanmoins, certains de leurs choix nous laissent perplexes :

  • Les versions récentes de certains composants contiennent le chemin d’accès.pdb, absent dans les anciennes versions.
  • La plupart des composants ne sont pas écrits sur le disque, mais la phase finale(rqz-dnsduvel-ldr-exe) l’est.
  • Le composantrqz-dnsduvel-ldr-exe se sert d’une clé et d’un VI figés au lieu de les tirer de l’empreinte numérique du fichier png.

En raison de sa modularité, ce logiciel malveillant cache peut-être d’autres fonctionnalités que nous n’avons pas encore observées. Il est possible que les opérateurs de ce logiciel malveillant envoient d’autres types de codes malveillants comme des logiciels espions à leurs victimes. Certains composants sont peut-être en développement à l’heure actuelle.

Nous avons communiqué avec OVH concernant le serveur de commande et de contrôle et le serveur DNS frauduleux, et tous deux ont été démantelés.

Un grand merci à Romain Dumont pour son aide avec l’analyse technique du logiciel malveillant et la rédaction de ce billet.

Annexes

Échantillons analysés

Nom de fichier Nom interne Versions analysées Date et heure du débogage Objectif principal
BRController.exe rqz-loader 1.1.0 x32 et x64 Dim. 2 oct. 2016 16:11:40 Chargeur :

Déchiffre et charge br.dll.enc en mémoire

BRController.exe (debug) Inconnu Inconnu x32 et x64 Inconnu Chargeur :

Déchiffre et charge br.dll.enc en mémoire

br.dll(.enc) rqz-stg1 1.0.4 x32 et x64

1.1.0 x32 et x64

Inconnu

Dim. 2 oct. 2016 16:12:07

Composant principal :

Communique avec le serveur de commande et de contrôle

Exfiltre des données

Met à jour et télécharge d’autres composants

Télécharge et exécute d’autres modules en mémoire

rqz-info-gatherer 1.0.4 x32 et x64 Mardi 13 sept. 2016 23:25:43 Module :

Recueille des renseignements sur l’ordinateur

rqz-dnsduvel-ldr 1.0.4 x32 et x64 Sam. 17 sept. 2016 19:55:10 Module :

Installe et exécute rqz-dnsduvel-ldr-exe pour chaque processus de navigateur

%d.tmp rqz-dnsduvel-ldr-exe 1.0.3 x32 et x64

1.0.4 x32 et x64

Sam. 3 sept. 2016 19:02:11

Sam. 17 sept. 2016 19:54:36

Injecteur :

Injecte un processus donné avec sa bibliothèque de liens dynamiques intégrées (rqz-dnsduvel)

rqz-dnsduvel 1.0.2-30fa39 x32 et x64

1.0.3-68c0c5 x32 et x64

Sam. 3 sept. 2016 19:01:51

Sam. 17 sept. 2016 19:53:50

Intercepteur DNS :

Intercepte les fonctions DNS à l’intérieur d’un processus

Remplace l’adresse IP de certains noms de domaine

Indicateurs de compromissions

Registre

  • “HKLM\Software\Microsoft\Windows\CurrentVersion\Run\BirthdayReminder”

Mutex

  • Global\Global\RqzSingleInst
  • Global\downloadExec

Empreintes numériques

Composant SHA-1 Noms répertoriés par ESET
BirthdayReminderSetup.exe 6a07de60da0962ee952e63ac89ce86d2581f3926 Win32/Adware.DNSBirthday.A
rqz-loader 1.1.0 x32 19041323a4ecd92eb888664e1d2c0b2893419f78 Win32/Adware.DNSBirthday.A
rqz-loader 1.1.0 x64 94c6f2bbad0ce47957d18b53ef1938d846d7576f Win64/Adware.DNSBirthday.B
rqz-stg1 1.1.0 x32 59eb5b5d3171069761a13389a1a7cce12a95e0bd Win32/Adware.DNSBirthday.A
rqz-stg1 1.1.0 x64 f02e0012aedf02f898f1558c827491d7099c1d62 Win64/Adware.DNSBirthday.A
rqz-info-gatherer 1.0.4 x32 8cfbd1f7e4d8c4357766f0f4b84bb08cf2e78c17 Win32/Adware.DNSBirthday.B
rqz-info-gatherer 1.0.4 x64 0f4aeee1a0878eb510229b871e02eb1e1939107e Win64/Adware.DNSBirthday.B
rqz-dnsduvel-ldr 1.0.4 x32 892785875fcdfe4cc672ba1c3fc59bfbf37c7efe Win32/Adware.DNSBirthday.A
rqz-dnsduvel-ldr 1.0.4 x64 5a5174739bbb7881c46112704cbf039f39d98fec Win64/Adware.DNSBirthday.B
rqz-dnsduvel-ldr-exe 1.0.4 x32 cc291be6cbc7b0dc3aa09973d0ed98e363f9083f Win32/Adware.DNSBirthday.A
rqz-dnsduvel-ldr-exe 1.0.4 x64 ce84d96a974e95499fadd3320f851c0b728cd438 Win64/Adware.DNSBirthday.B
rqz-dnsduvel 1.0.3-68c0c5 x32 e6b6fe919cf6c3af0d40594e86da4cf776dbcf9a Win32/Adware.DNSBirthday.B
rqz-dnsduvel 1.0.3-68c0c5 x64 d1085fb7f2c4d1add9244cb8af6d0e25b50d7b14 Win64/Adware.DNSBirthday.B

Puisque BirthdayReminderSetup.exe et BRController.exe contiennent un identifiant de robot unique, voici certaines empreintes numériques ssdeep floues :

Composant ssdeep
BirthdayReminderSetup.exe 393216:ZD4b8Ev/xl3OB4fcUx6uj55/Q7COLc1cm+DkC1GWF2jazuIYRCxEfFCqgY9iHtKZ:ZD5EhFOmcUs85/OCOLecm+14OzzY9Fdl
BRController.exe (x86) 24576:0+KpP0PYnsKdFCH6BMKHiBMikwMbSyM52it6YTekcys4e6faNe0M4RzRPxM4TuZR:cfs4F6KHiy7kM4CjlpRPx1TuZ+tgP8K
BRController.exe (x64) 49152:l4+VwASOwGtlqKPb8KHh+3ulMrqkvTiV3ML3OsQXIU6inTe2mEPEB:jCTiVGV+q2mHB

Réseau

  • Serveur DNS frauduleux :31.106.50
  • Serveurs de commande et de contrôle :rqztech.com (188.165.205.99)
  • Adresses IP du serveur publicitaire :214.30.97 et 188.214.30.98
  • Requête DNS envoyée au domaine nommé[0-9a-f]{60}.smoke

Certificats SSL

358bb04f6a0bf8ce88d23b2e620ac01b28d307ab80286f6ee2dcc484a6b1a5d0

45cbc80fe0cac8004f862b9eb90b53b57b06299f98e20923185eb08c363d1ec4

 

Discussion