Conférence DEFCON 27. Buttplug: True Penetration Testing. Partie 2

Les analystes estiment qu'il existe actuellement environ 10 milliards d'appareils du monde de l'Internet des objets (IoT). Parfois, ces appareils gagnent leur place sur le marché, grimpant littéralement les culs humains. Il s'est avéré que les puces radio bon marché et de faible puissance ne sont pas seulement idéales pour la domotique - elles changent également la façon dont les gens interagissent avec les jouets sexuels. Dans ce rapport, nous allons plonger dans le monde de la télévision dildonique, la technologie du sexe à distance dans laquelle les sensations tactiles, thermiques et autres sont transmises entre partenaires via une ligne de communication bidirectionnelle. L'orateur vous dira que la sécurité des jouets sexuels électroniques électroniques Buttplug peut être opposée à un attaquant qui trouve et exploite des vulnérabilités à chaque niveau de la pile. En fin de compte, cela permet aux sextoys eux-mêmes d'être compromis,et les appareils auxquels ils se connectent.



Un pirate avec le surnom de smea, ou Smealum, a commencé sa carrière en tant que développeur de jeux vidéo pour des consoles de jeux telles que Nintendo DS, en essayant simultanément de les casser. À un moment donné, les consoles ont acquis de sérieux systèmes de sécurité et Smea est passé de logiciels locaux à des techniques de développement pour les casser. Smea est connu pour son «travail» sur Nintendo 3DS et Wii U, bien qu'il ait également contribué au développement d'exploits pour les navigateurs Web et les piles de virtualisation les plus populaires. Probablement, maintenant, il s'est intéressé à percer des plugs anaux «intelligents».

Conférence DEFCON 27. Buttplug: True Penetration Testing. Partie 1



Bien sûr, vous pouvez gérer les messages entrants même avec une longueur de ligne aussi courte. Par exemple, 30 caractères suffisent pour exécuter du JavaScript malveillant. Cette diapositive montre un exemple de balise de 30 caractères pour une image provenant d'une source inexistante <img src = a onerror = 'alert (1)'>, ce qui fait que l'application affiche un message d'erreur. Ce message sera affiché chaque fois que le chargement de l'image est vraiment impossible. La capture d'écran montre que la connexion via un dongle compromis vous permet d'exécuter du JavaScript malveillant.



La limite de 32 caractères est ennuyeuse car il est difficile de réaliser la charge utile en volume, mais c'est tout à fait possible. Donc, vous voyez que nous avons réussi à compromettre l'application à l'aide d'une clé USB et que nous sommes maintenant à mi-chemin pour inverser le piratage, c'est-à-dire pour compromettre l'application à l'aide d'un bootplag de pirate. Le piratage sur un site de dongle-ordinateur peut se produire de deux manières: via un ordinateur, vous pouvez compromettre un dongle, et via un dongle, vous pouvez compromettre un ordinateur.

Le dongle agit comme un petit pont entre le plug de démarrage et l'application. La question se pose: est-il possible d'utiliser la même vulnérabilité pour compromettre une application sur un ordinateur directement via le bootplag. Malheureusement, la réponse à cette question est négative et la raison en est qu'il existe une autre limitation sur la longueur des caractères du message provenant du plug-in de démarrage de l'application.



Le dongle emballe simplement les messages du bootplag et les transmet à l'application, et à cette étape, vous pouvez y insérer votre code HTML. Cependant, à la fois, il peut recevoir un message ne dépassant pas 20 octets, ce qui n'est pas suffisant pour effectuer une attaque XSS. Cependant, il y a un bug dans le firmware du dongle: il n'y a pas de vérification pour le terminateur nul à la fin de la ligne. Par conséquent, si vous pouvez placer des données non initialisées après la fin d'une chaîne de 20 caractères, vous pourrez envoyer l'application à plus de 20 caractères. Malheureusement, je n'ai pas trouvé de moyen d'utiliser cette vulnérabilité dans la pratique, mais une telle opportunité mérite d'être gardée à l'esprit.

Le problème est donc que vous ne pouvez probablement pas utiliser cette vulnérabilité pour forcer l'application à exécuter le code reçu directement du plug-in de démarrage. Il est triste, mais encore plus triste que si vous regardez le firmware du dongle, vous pouvez voir qu'en principe il ne fait rien avec les données reçues, mais les copie simplement sur une nouvelle ligne et les envoie plus loin. Par conséquent, nous ne pourrons pas utiliser sa vulnérabilité pour attaquer en débordant la mémoire tampon. Cependant, s'il est impossible de pirater l'application directement à partir du plug-in de démarrage, il sera peut-être possible de le faire via la chaîne de démarrage-plug-dongle-computer?
La bonne chose est que la puce de dongle vous permet de placer beaucoup plus de code que nécessaire pour le programme de développement Lovense Hush d'origine.



La mémoire flash du dongle contient une zone réservée au chargeur DFU, une zone pour l'application Lovense elle-même et une zone SoftDevice fermée pour le pilote matériel de la puce BLE Nordic Semiconductor. C'est là que le protocole BLE lui-même est traité. Par exemple, lorsqu'une application souhaite envoyer un message BLE à un jouet, elle accède à SoftDevice via un appel SVC. En plus de ces 3 zones, le dongle dispose d'une zone inutilisée de mémoire flash d'un volume suffisamment important.
Pour trouver la vulnérabilité dans la pile BLE SoftDevice, vous devez utiliser la rétro-ingénierie, car elle n'est pas open-source. J'ai fait de même pour trouver la vulnérabilité du plug-in de firmware. Dans ce cas, il est très facile de suivre le flux de données, car il n'y a pas non plus d'ASLR, et il est facile de déterminer le code qui traitera ces messages.



Sur la droite de la diapositive, vous voyez le gestionnaire de paquets entrants GATTC (un profil d'attributs communs), qui, en substance, est un dongle. En particulier, il s'agit d'un gestionnaire de lecture par type de paquets de réponse. Je ne suis pas un spécialiste des appareils Bluetooth, mais je pense que le point ici est que le dongle lit le type de périphérique et utilise des gestionnaires pour toutes les variantes des attributs associés à ce type. Cela signifie qu'en fait, vous pouvez obtenir plus d'un attribut à la fois, et la taille de chaque gestionnaire d'une paire de données d'attribut est codée comme un champ à l'intérieur du package, ce qui vous permet de les gérer.



La diapositive montre un exemple d'un tel package. Les clients GATT peuvent envoyer un paquet de demande de lecture par type qui contient le type et la plage de descripteurs à lire. Les serveurs qui répondent à la demande de lecture par type renvoient des données associées aux gestionnaires dans la plage correspondant à ce type. Le nombre de paires descripteur / données est déterminé en divisant la longueur du paquet restant par la longueur de champ de la paire descripteur / données, et ce champ est toujours 0x7 ou 0x15.



La diapositive montre le fonctionnement de la fonction qui nous intéresse: vous voyez comment le paquet est rempli de données à partir d'un tableau d'attributs, et une longueur de tampon fixe leur est allouée. C'est là que la valeur du descripteur est placée, puis le pointeur qui lui est associé. Un tableau d'attributs est une donnée binaire placée à l'intérieur du tampon au format hexadécimal. Les données sont surlignées en bleu et à côté se trouve le descripteur 0D et son pointeur associé 00, il est surligné en orange. Le package des deuxième et troisième gestionnaires semble similaire.

La vulnérabilité est la suivante. Si vous lisez le code à droite, vous pouvez voir le paramètre attribute_data_length placé dans le cadre violet - la longueur du message entrant, dont la valeur est entièrement contrôlée par un attaquant potentiel. Si nous y plaçons une valeur nulle, nous obtenons une boucle infinie.



La boucle devient infinie car le code ne vérifie pas si les données qu'il écrit dans le tampon de sortie se trouvent dans ce tampon de sortie. En conséquence, nous obtenons un débordement de tampon de pile classique, car le périphérique n'a pas d'ASLR ou DEP, et le code s'exécute immédiatement.

En affectant une valeur de zéro et en obtenant une boucle infinie, vous remplacez en fait toutes les données RAM par des ordures. Cependant, il s'agit d'une solution infructueuse, car elle est susceptible de provoquer une défaillance de l'appareil. Mais si vous utilisez une valeur de 1, cela limitera le nombre d'octets contenus dans le message entrant. Cela signifie ce qui suit - vous pouvez légèrement surcharger ce tampon, puis le tampon, basé sur la pile, pourra endommager tout ce qui se trouve à côté.



Voyons à quoi ressemble la pile avant le débordement. Le tableau des attributs de tampon dont nous avons parlé est surligné en jaune, les registres enregistrés en bleu et l'adresse de retour en orange. En définissant la longueur d'attribut sur 0x01, nous pouvons provoquer un débordement de nombreuses paires poignée / pointeur de données. Les descripteurs se composent de 2 octets, mais les deux premiers octets du descripteur DWORD ne sont pas effacés. Le tampon que nous débordons est sur la pile sans cookies, ni ASLR, ni DEP.



Ensuite, nous testons le système: envoyez un paquet plein d'octets 0xDA avec une longueur d'attribut 0x01. Il s'avère que nous réécrivons l'adresse de retour avec un pointeur sur nos données d'attribut. Puisqu'il n'y a pas de DEP, cela signifie qu'à chaque fois que la fonction revient, le code qui est à l'intérieur de notre package sera exécuté. La seule limitation est que nous avons besoin de l'adresse de retour pour que le LSB soit défini sur le bit le moins significatif, de sorte que le code s'exécute en mode Thumb, car le processeur Cortex M0 ne prend pas en charge le mode ARM.



Nous réécrivons également plusieurs variables locales, tout en veillant à ne pas réécrire quoi que ce soit utilisé sur le chemin du retour. Fondamentalement, nous obtenons un package de porte dérobée classique. Si vous faites attention à cette pile, vous verrez que la réécriture ne correspond pas à la bordure, ce qui entraînera le plantage du programme.

Il existe une autre exigence concernant les registres stockés. Ce sont des variables locales qui sont également écrasées lorsque la fonction revient.



L'un d'eux est utilisé pour déréférencer une bordure 32 bits, et une incompatibilité de contenu avec la bordure entraînera le plantage du programme. Par conséquent, vous devez vous assurer que saved_arg_3 = 0, saved_arg_4 correspond à DWORD, c'est-à-dire qu'il se trouve à l'intérieur de la bordure et que LSB est défini.

Par conséquent, nous devons nous assurer que ce package fonctionne. Heureusement, c'est vraiment facile, car la façon dont SoftDevice distribue ces paquets entrants est un tampon en anneau sans aucune exigence d'alignement forcé. Whiteshark a permis de vérifier que l'alignement du paquet suivant peut être contrôlé en modifiant la longueur du paquet précédent.



Le jaune et le bleu ont mis en évidence 2 paquets envoyés avant l'envoi du paquet d'exploits. Cela me permet de contrôler l'alignement du dernier paquet et de faire en sorte qu'il ne provoque pas de plantage du programme, ce que nous visons.

Je note qu'il existe un certain obstacle d'ingénierie: Nordic SoftDevice ne fournit pas d'interface pour l'envoi de paquets BLE bruts. Pour le contourner, vous pouvez utiliser 2 options: implémenter votre propre pile BLE ou casser des crochets dans les packages d'origine. Comme je suis paresseux, j'ai choisi l'option 2.

Ces crochets sont assez simples, mais nécessitent une ingénierie inverse. Les méthodes de piratage peuvent être trouvées sur github, l'interface est assez «sale» et il n'y a aucune garantie que cela fonctionnera, mais je l'ai fait. Il vaut mieux utiliser BTLEJack.

void ble_outgoing_hook(uint8_t* buffer, uint8_t length);

Ce pointeur SoftDevice est appelé chaque fois qu'un paquet BLE est envoyé, il peut donc être modifié à l'avance:

int ble_incoming_hook(uint8_t* buffer, uint16_t length);

Ce hook SoftDevice appelle chaque fois qu'un paquet BLE est reçu. La valeur de retour détermine si le traitement SoftDevice normal doit être ignoré.

int send_packet(void* handle, void* buffer, uint16_t length);

Voici à quoi ressemble la fonction d'envoi du paquet brut à cette connexion BLE.

Comment puis-je traiter plus de 4 octets de code à la fois? Besoin d'envoyer des colis! Sur la droite, vous voyez le tampon en anneau des paquets BLE entrants. Le premier paquet est affiché en vert: le code shell qui exécute un appel de fonction avec des paramètres contrôlés puis retourne «propre». Le deuxième paquet est affiché en jaune - il s'agit d'un tampon de données qui peut être utilisé par un appel de fonction. Le troisième paquet est affiché en bleu - un tampon contenant les valeurs des paramètres d'appel de fonction, et en orange - le paquet qui lance la vulnérabilité à l'aide de l'instruction C1 E7.



Après avoir renvoyé la fonction pure, nous pouvons renvoyer ce package. L'envoi de ces 4 paquets exécute n'importe quel morceau de code arbitraire à l'intérieur du dongle, et cela peut être fait encore et encore.



C'est pratique car de cette façon, je peux vraiment appeler memcpy plusieurs fois pour copier le plus grand code binaire du shell dans la RAM. Ensuite, nous appelons cette fonction pour patcher le code du dongle d'origine en mémoire et l'utiliser pour compromettre l'application installée sur l'ordinateur. Étant donné que la charge utile XSS est importante, nous ne l'envoyons pas, mais la générons dans le code shell sur le dongle lui-même. Le code shell est le suivant.



À la suite de ces manipulations, on obtient ce qui suit: si nous pouvons contrôler l'application, alors nous pouvons contrôler le dongle et le bootplag.



Il existe 2 façons de pirater la section dongle-dongle: le dongle peut compromettre le jouet et le buttplag peut compromettre à la fois le dongle et l'ordinateur. Le bonus est que la vulnérabilité Nordic BLE est présente non seulement dans les produits Lovense, mais aussi dans tous les appareils qui utilisent SoftDevise S110, S120 ou S130 pour le côté client de BLE.

Nous avons donc la possibilité de compromettre l'application en utilisant le bootplag. Comment cela peut-il être utilisé? Nous exécutons toujours du code JavaScript dans l'application Lovense, et la question est, qu'est-ce que cela nous donne? Il s'avère que l'application lovense.exe fonctionne sur Medium IL et fonctionne sur Windows, elle offre des possibilités vraiment illimitées: même sans privilèges d'administrateur, vous pouvez accéder aux fichiers sur votre ordinateur, vous pouvez exécuter du code arbitraire, vous pouvez implémenter XSS, accéder au réseau etc.



La question suivante: si vous pouvez créer un programme de rançongiciel qui infecte non seulement le bootplag, mais aussi l'ordinateur de l'utilisateur, existe-t-il un moyen de le diffuser davantage en le rendant viral? Nous avons maintenant un piratage au niveau local, mais pour un pirate, il serait beaucoup plus utile de prendre le contrôle de nombreux ordinateurs d'utilisateurs via Internet. Comment faisons-nous cela? Les fonctions sociales du jouet, telles que le chat vidéo, le chat texte, le transfert d'image et la télécommande elle-même, augmentent considérablement la surface d'attaque.

Le contrôle à distance est un excellent objectif, car si un développeur souhaite utiliser un programme propriétaire, il aura certainement des bugs et des vulnérabilités. Comment l'utiliser? Par exemple, vous pouvez envoyer à un partenaire un objet JSON contenant des commandes, par exemple, la commande "Vibrer: 10":

{
cate: "id",
id: {
DEADBABEBEEF: {
v: 10
}
}
}

Dans ce cas, le récepteur analyse le JSON entrant, génère une commande pour le jouet et l'envoie plus loin, et ici il y a 2 modes. Le premier mode "id:" envoie une commande à un jouet sexuel spécifique, le deuxième mode "all:" envoie une commande à tous les jouets distants.
Les données entrantes sont-elles validées correctement? Étant donné que JSON est très flexible, le code, en attendant un nombre, peut obtenir une chaîne entière à la place. Si nous pouvons contrôler les commandes envoyées au jouet, nous pouvons probablement utiliser le bug de l'analyseur de dongle. Sur la diapositive suivante, le cadre orange montre où les données d'entrée sont utilisées et le bleu montre où elles sont vérifiées.
Ce bogue est que l'application ne vérifie pas correctement que l'entrée d'une commande telle que vibrate est en fait un entier. Dans ce cas, en mode "id:", seulement que l'indice d'intensité de vibration est n> = 0 est vérifié, et si vous passez un entier 12 supérieur à zéro, ce paramètre passera le test. Même si vous passez une chaîne, c'est-à-dire le nombre entre guillemets «12», le système l'acceptera. Il n'acceptera pas seulement une chaîne sous la forme d'une combinaison de chiffres et de lettres, par exemple, «12test».



Comme vous pouvez le voir, cette vérification ne nous permet pas d'entrer une commande de texte. Cependant, si vous regardez en bas du code, vous verrez la même vérification, mais cette fois, l'application vérifie la condition n <0. Maintenant, si nous entrons "12test", nous ne passerons pas le test, car l'application considérera que l'expression donnée sous forme de chaîne n'est pas inférieure à 0. Mais si nous entrons une chaîne avec un contrôle d'inégalité de la forme! ("12test" <0), le système la considérera comme vraie , malgré le fait qu'il ne s'agit pas d'un entier et non d'un nombre, mais d'une combinaison alphanumérique. En substance, cela signifie que nous pouvons entrer dans cette commande une chaîne arbitraire qui sera envoyée au dongle. Cela nous permet d'envoyer le code d'exploitation de la même manière que nous l'avons fait auparavant pour compromettre le dongle via l'analyseur JSON. La seule différence est que maintenant cela peut se faire via Internet.



Ainsi, grâce à un bug dans l'implémentation du filtre pour vérifier les données entrantes, nous avons pu à distance via Internet via l'application Lovense pour compromettre le dongle, à travers lequel, à son tour, nous pouvons casser l'ordinateur de l'utilisateur. Pirater un dongle est une bonne chose, mais la condition du succès est le consentement du partenaire à transférer la télécommande du jouet à l'attaquant déguisé. Ceci est pratique pour une attaque ciblée, mais totalement inadapté à une attaque virale.

Cependant, le chat texte et les images ne nécessitent aucune autorisation, ce qui permet parfaitement une attaque XSS classique en envoyant du code HTML malveillant dans un message texte de chat. La diffusion du virus devient triviale: il suffit de créer la bonne fonction JavaScript et de spammer vos amis.



À ce stade, nous ne pouvons exécuter le code qu'en envoyant un message et avons essentiellement atteint notre objectif. La charge utile XSS finale fonctionne comme ceci:

  1. Faites tout ce qui doit arriver sur la machine de la victime.
  2. Prenez un objet JavaScript qui vous permet d'accéder au chat.
  3. Envoyez une charge utile XSS qui télécharge ce script sur les ordinateurs de tous vos amis.


Ainsi, nous avons compromis chaque nœud du réseau du plug-in de démarrage à Internet. Maintenant, vous pouvez compromettre n'importe quel appareil à partir de n'importe quel appareil - nous avons créé un ver bout à bout, ou un virus appelé «ver de cul».



Comme je l'ai promis, je vais maintenant vous montrer une vidéo en direct. La première chose que je vais montrer est d'utiliser la prise BTLE pour intercepter la connexion entre le plug-in de démarrage et la machine virtuelle Windows normale à laquelle le dongle est connecté. Maintenant, je vais essayer d'allumer le bootplag - j'espère que vous entendez tous les sons de vibration! (rire). Donc, ça a marché, maintenant je vais essayer d'ajouter mon jouet au panneau de contrôle de l'application. Voyez que le programme a trouvé Hush, mais attendez une minute! J'ai oublié de démarrer le processus de prise BTLE. La seule raison pour laquelle vous devez utiliser la prise BTLE dans ce mode est parce qu'elle facilite la démonstration en direct, mais en pratique, vous pouvez intercepter une connexion existante sans avoir besoin de renifler. Je lance donc cette chose juste pour simplifier l'expérience. Répétons encore une fois. Vous voyez que la connexion au jouet est établie.



Le renifleur de gauche montre qu'il a trouvé cette connexion. Nous avons donc une application associée à notre sextoy. Je ne sais pas si vous entendez que je peux vraiment contrôler la prise de démarrage (smea déplace le curseur vers le haut, après quoi un son de vibration amplificateur est entendu). Maintenant, j'éteins cette chose (déplace le curseur vers le bas, le son des vibrations disparaît). Maintenant, je dois pirater cette connexion. Pour ce faire, je copie plusieurs paramètres, les colle dans la ligne smea @ ubuntu et à la fin j'entre le paramètre t - une commande pour intercepter la connexion.



Si cela fonctionne, cela interrompt la connexion avec l'application. Comme vous pouvez le voir, un message est apparu dans la fenêtre de l'application que la connexion avec l'appareil a été perdue. Merci BTLE jack pour un excellent outil! Le journal de démarrage s'est déconnecté de l'application et est désormais contrôlé via la machine virtuelle ubuntu. Théoriquement, nous devrions pouvoir le faire vibrer à distance. Je recrute une équipe Vibrate 20, et comme vous pouvez le voir, tout fonctionne - nous avons pu contrôler à distance le bootplag sans utiliser l'application officielle (applaudissements du public). Maintenant, je vais le mettre en mode DFU, et si cela fonctionne, je devrai arrêter cette chose. J'entre la commande appropriée et la vibration s'arrête.



Maintenant, je prends mon smartphone et vérifie si je peux reconnecter le jouet via l'application. Parmi mes applications, je trouve la mise à jour du plug-in du firmware et sélectionne le DfuTarg cible - l'appareil sur lequel il est nécessaire de mettre à jour le firmware, mais en fait - y introduit un exploit malveillant.



Vous voyez comment se déroule le processus de mise à jour. Un message s'affiche à l'écran indiquant que le micrologiciel de l'appareil a été mis à jour avec succès. Maintenant, je vais essayer à nouveau de connecter le bootplag à l'application installée sur mon ordinateur, et vous voyez ce qui se passe: l'économiseur d'écran du ransomware apparaît à l'écran (applaudissements du public)!



«Oups, votre plug anal est crypté! Payez pour la restauration de l'accès à cet important jouet avec 50 bitcoins en 3 jours, sinon en une semaine vous le perdrez pour toujours. Voici comment ça fonctionne!

Donc, vous avez exécuté le code sur le dongle, puis sur l'ordinateur et via Internet, vous êtes arrivé à la prise de démarrage. Comme vous pouvez le voir, en termes de sécurité, ce plug anal est très faible, probablement il a été fabriqué par la Corée du Nord. Vous avez vu que j'avais installé une machine virtuelle qui exécutait l'application sans être connectée à un dongle ou à un autre matériel. Cette machine virtuelle venait d'être connectée à Internet et semblait être connectée à l'ordinateur de mon ami. Nous avons donc réussi à propager le virus rançongiciel.

Je pense que d'après tout ce qui a été dit, quelques leçons utiles peuvent être tirées. En utilisant cet appareil comme exemple, nous avons examiné la vulnérabilité du monde de l'Internet des objets. Certains appareils sont utilisés pour le maintien de la vie, et les gens ne réalisent pas à quel point ces nouvelles technologies sont vulnérables. En piratant une chose «intelligente», vous pouvez brancher d'autres appareils «intelligents» dans votre maison via Internet. J'espère que le résultat de mes recherches ne s'applique pas seulement aux jouets sexuels. De plus, j'ai l'intention d'apprendre tout le code de cette chose, alors rejoignez-moi sur Twitter. Je vais également publier mes outils sur GitHub aujourd'hui au cas où vous voudriez commencer à pirater vos propres bootloops.



Je tiens à remercier tous mes amis qui m'ont aidé dans le pentesting et m'ont fait découvrir le monde des plugs de combat, les gays extrêmes. Je ne donnerai pas de noms, mais Aaron, tu sais toi-même qui tu es (rires). Merci les gars, c'était génial!


Un peu de publicité :)


Merci de rester avec nous. Aimez-vous nos articles? Vous voulez voir des matériaux plus intéressants? Soutenez-nous en passant une commande ou en recommandant à vos amis, le cloud VPS pour les développeurs à partir de 4,99 $ , un analogue unique de serveurs d'entrée de gamme que nous avons inventé pour vous: Toute la vérité sur VPS (KVM) E5-2697 v3 (6 cœurs) 10 Go DDR4 480 Go SSD 1 Gbit / s à partir de 19 $ ou comment diviser le serveur? (les options sont disponibles avec RAID1 et RAID10, jusqu'à 24 cœurs et jusqu'à 40 Go de DDR4).

Dell R730xd 2 fois moins cher au centre de données Equinix Tier IV à Amsterdam? Nous avons seulement 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV à partir de 199 $ aux Pays-Bas!Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - à partir de 99 $! En savoir plus sur la création d'un bâtiment d'infrastructure. classe c utilisant des serveurs Dell R730xd E5-2650 v4 coûtant 9 000 euros pour un sou?

All Articles