Que contient vraiment le keylogger de Windows 10 ?

A force de lire tout et n'importe quoi à ce sujet, je me suis lancé dans mes propres analyses de trafic.

windows-keylogger

Voyons ce que contient ce Windows 10 qui fait tant parler de lui.

tcpdump

Avant tout j'en profite pour vous parler de ce super tutoriel pour lire du contenu HTTPS avec wireshark s'il provient de votre navigateur, simple et rapide. Dans mon cas ce n'est pas du flux venant d'un navigateur mais du système directement donc je ne pourrai pas utiliser cette méthode.

J'utilise Windows 10 sur une machine virtuelle (VirtualBox). J'ai donc commencé par analyser le trafic au moment de faire une recherche dans le menu démarrer. Je précise que j'ai désactiver la recherche en ligne dans les options de Windows, et pourtant il y a bien du trafic.

Voici ce que voit passer mon routeur tomato (passerelle de sortie) :

./tcpdump -s0 host win10 and port not 22 -n
IP 192.168.0.68.53226 > 204.79.197.200.443: . 1493:2933(1440) ack 4667 win 1024
IP 192.168.0.68.53226 > 204.79.197.200.443: P 2933:2986(53) ack 4667 win 1024
IP 204.79.197.200.443 > 192.168.0.68.53226: . ack 2933 win 513
IP 204.79.197.200.443 > 192.168.0.68.53226: . ack 2986 win 513
IP 204.79.197.200.443 > 192.168.0.68.53226: P 4667:6096(1429) ack 2986 win 513
IP 204.79.197.200.443 > 192.168.0.68.53226: . 6096:7556(1460) ack 2986 win 513
IP 204.79.197.200.443 > 192.168.0.68.53226: . 7556:9016(1460) ack 2986 win 513
IP 204.79.197.200.443 > 192.168.0.68.53226: P 9016:9349(333) ack 2986 win 513
IP 192.168.0.68.53226 > 204.79.197.200.443: . ack 9349 win 1024
IP 192.168.0.68.53190 > 204.79.197.200.80: P 5777:6789(1012) ack 1081 win 1020
IP 192.168.0.68.53190 > 204.79.197.200.80: P 6789:7206(417) ack 1081 win 1020

  • 192.168.0.68 = IP de ma machine Windows 10
  •  204.79.197.200 = a-0001.a-msedge.net

Et à chaque nouvelle recherche dans le menu démarrer on retrouve cette séquence.

Premièrement c'est une surprise car quand on se dit le trafic que ça doit pomper à l'échelle mondiale, c'est monumental.

Mais que transite dans ces paquets ?

Kali

Autant faire le barbu jusqu'au bout, j'ai donc sorti Kali! Cela évite d'avoir à installer une tonne d'outils qui sont déjà présents.

kali2-netconfig

J'ai utilisé une deuxième machine virtuelle, sous Kali Linux 2.0 cette fois-ci. Avec deux interfaces, une sur le réseau local (eth0) et une autre sur un réseau interne à VirtualBox (eth1) que j'ai nommé "guest" :

  • eth0 = 192.168.0.68 (dhcp via tomato, accès par pont)
  • eth1 = 10.1.1.254/24 (ip fixe, réseau interne "guest")

udhcpd

J'ai installé un serveur dhcp (pas obligatoire mais plus pratique) :

apt-get install udhcpd

Configuration minimaliste :

# grep -E -v '^(#|$|;)' /etc/udhcpd.conf 
start 10.1.1.11
end 10.1.1.50
interface eth1 #default: eth0
opt dns 8.8.8.8
option subnet 255.255.255.0
opt router 10.1.1.254
option domain local
option lease 864000

Commenter la ligne /etc/default/udhcpd :

#DHCPD_ENABLED="no"

Et démarrer le service :

/etc/init.d/udhcpd start
[ ok ] Starting udhcpd (via systemctl): udhcpd.service.

J'ai basculé ma VM Windows dans ce même réseau interne "guest" pour vérifier que Kali lui donnait bien une IP.

Certificats

Je pensais qu'il était nécessaire de générer un certificat pour pouvoir intercepter le trafic SSL, surtout que j'étais parti sur l'outil sslstrip au départ. Et puis cet outil n'allait pas il permet seulement de ne pas rediriger du HTTP vers du HTTPS mais il est incapable d'intercepter du HTTPS.

Je vous met quand même la procédure au cas où ça vous serve dans un cas particulier :

mkdir cert && cd cert
apt-get install libssl-dev libevent-dev
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BM
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:A.BM
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.bing.com
Email Address []:

Seul le "common name" est important, il doit correspondre au site à intercepter. Dans l'exemple "*.bing.com" assure la compatibilité avec "www.bing.com" par exemple. Cela ne fonctionnera pas en revanche avec "bing.com" tout court, il faudra un sous domaine. Vous pouvez préciser plusieurs CN si vous utilisez un fichier de configuration.

On fusionne :

cat ca.key ca.crt > ca.pem

Récupérer ca.crt et importez le "autorité de certification racines de confiance > certificats" (windows + R > certmgr.msc). Cela fonctionnera pour Edge et IE, pour Firefox ça se passe dans

  • Outils > Options > Avancé > Certificats > Onglet "Autorités" : Importer

Si besoin consultez ce tutoriel complémentaire.

iptables, ouvres toi

On active le routage (les deux commandes fonctionnent) :

echo "1" > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1

Puis on ajoute ces règles pour rediriger tout le trafic venant des ports 80 et 443 (HTTP et HTTPS) vers notre outil mitmproxy :

iptables -t nat -F
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j REDIRECT --to-port 8080

Cela va couper le trafic pour votre Windows 10.

mitmproxy

mitmproxy est présent dans Kali, c'est lui qui va relayer les requêtes web, comme un vulgaire proxy. Mais il vous permet au passage de voir ce qui transite.

Par défaut il écoute sur le port 8080 et il semblerait que le changer peut poser problème. Lançons-le :

mitmproxy -T --host --cert=cert/ca.pem

Nous précisons au passage le certificat ca.pem, bien que je le répète ça fonctionne aussi sans dans notre cas car Microsoft ne contrôle pas l'auto-signature du certificat et n'utilise pas HSTS. En effet HSTS rend impossible toute interception si votre navigateur l'implémente :

hsts

Vous devriez maintenant pouvoir surfer depuis la VM sous Windows 10 et voir les premiers paquets transiter, faites ENTREE pour en visualiser un :

mitmproxy-response-bm

Dans la capture c'est du HTTP mais ça fonctionne aussi en HTTPS :)

Résultats

Je constate que l'IP 204.79.197.200 est attaquée en direct, autrement dit elle est hardcodée. Voilà qui explique pourquoi on pouvait lire sur la toile que Windows 10 ne tenait pas compte du fichier host. Il en tient donc bien compte, mais il ne sert à rien quand une IP est attaquée en directe.

La qualité de la capture n'est pas terrible, mon on voit que chaque recherche déclenche du trafic :

D'ailleurs selon comment vous lancez tcpdump ou wireshark c'est l'outil qui fait la résolution inverse (IP vers domaine), ce qui peut amener cette confusion. L'option "-n" ne résoud pas les IP.

Et voici le contenu d'une trame interceptée avec Kali :

Request
GET /manifest/threshold.appcache HTTP/1.1
Accept: */*
Referer: https://www.bing.com/
X-Search-SafeSearch: Strict
X-Device-MachineId: {7791A0B7-70CD-43BA-B3EB-0C27EFA10CFE}
X-BM-Market: FR
X-BM-DateFormat: dd/MM/yyyy
X-Device-OSSKU: 4
X-Device-NetworkType: ethernet
X-BM-DTZ: 120
X-DeviceID: 01000E2B09009A0C
X-BM-DeviceScale: 100
X-Device-Manufacturer: innotek GmbH
X-BM-Theme: ffffff;4f4f4f
X-BM-DeviceDimensionsLogical: 1391x875
X-BM-DeviceDimensions: 1391x875
X-Device-Product: VirtualBox
X-BM-CBT: 1440793203
X-Device-isOptin: false
Accept-Language: fr-FR, fr, en-US, en
X-Device-Touch: false
X-Device-ClientSession: 622207B7813F451685445E4F1E151CDE
X-BM-ClientFeatures: OemEnabled
X-Search-AppId: Microsoft.Windows.Cortana_cw5n1h2txyewy!CortanaUI
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; rv:11.0; Cortana 1.4.8.176; 10.0.0.0.10240.21) like Gecko
Origin: https://www.bing.com
Accept-Encoding: gzip, deflate
Host: www.bing.com
Cookie: SRCHD=AF=NOFORM; SRCHUSR=AUTOREDIR=0&GEOVAR=&DOB=20150724; ANON=A=A644AD824544D5AC41FAB97CFFFFFFFF; SRCHHPGUSR=LUT=1440787047065; MUID=2C92A4A5447D46E6AA757EFA6F11F0E8; _SS=SID=83FC6CF6C6C343D1ACD995F6C2B6E7F4&CPID=1440806117065&AC=1&CPH=d7a6a5e3&HV=1440806147; _EDGE_S=SID=1A9BCBB3E9586929213AC3A2E8546820; MUIDB=2C92A4A5447D46E6AA757EFA6F11F0E8; SRCHUID=V=2&GUID=C6A1AE407FDB4367BEAB5C0CA1ED6507
Content-Length: 0

==Response
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 4167
Content-Type: text/cache-manifest; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/8.5
Edge-control: no-store
X-MSEdge-Ref: Ref A: 20D2CCDC37664B81B50955609D97F6AF Ref B: 9275466BA5691D4B075A4B2442491B75 Ref C: Fri Aug 28 16:56:51 2015 PST
Date: Fri, 28 Aug 2015 23:56:50 GMT

CACHE MANIFEST
# Version:d7a6a5e3
CACHE:
/AS/API/WindowsCortanaPane/V2/Init
/devicecontent
/rms/Ajax.Bundle/jc/e2d6f5b9/afad0936.js?bu=rms+answers+AjaxSerp+Core%24ajax.shared%2cThreshold%24ajax.history.threshold%2cCore%24ajax.render%2cCore%24ajax.providers%2cCore%24ajax.lifeCycle%2cCore%24Providers%24ajax.provider.threshold
/rms/BingCore.Bundle/jc/4212d55d/93046b62.js?bu=rms+answers+Shared+BingCore%24shared%2cBingCore%24env.override%2cBingCore%24event.custom.fix%2cBingCore%24event.native%2cBingCore%24dom%2cBingCore%24cookies_parser%2cBingCore%24XHRPrefetch%24rmsajax_xhrprefetch%2cBingCore%24ClientInstV2%24InstrumentationConfigThrvis%2cBingCore%24ClientInstV2%24LogUploadCapFeatureDisabled%2cBingCore%24ClientInstV2%24ClientInstConfigSeparateQFQueue%2cBingCore%24ClientInstV2%24clientinst_xls%2cEmpty%2cBingCore%24ClientInstV2%24LogHelper%2cBingCore%24ClientInstV2%24VisibilityChangeEventHelper%2cBingCore%24Animation%2cBingCore%24fadeAnimation%2cBingCore%24framework%2cBingCore%24ShowWebView%2cBingCore%24CoreUtilities
/rms/BlueBrand/ortl,cc/cfd824f0/ed765317.css?bu=rms+answers+BrandBundle_Mobile+thbrand%24CombinedAsset_Windows_th_b%2cthbrand%24Colors_th_b%2cthbrand%24Type_th_b%2cthbrand%24Grid_th_b%2cempty%2cEmpty
/rms/BlueHeader/cir,ortl,cc/e3c56965/692701b1.css?bu=rms+answers+BrandBundle_Mobile+thbrand%24Header_CombinedAsset%2cthbrand%24Header_Colors_th_b%2cthbrand%24Header_Type%2cthbrand%24Header_Grid_th_b%2cempty
/rms/BundledViews/jc/2307c526/4b700f39.js?bu=rms+views+Shared+CenteredImagePair%2cAlertWrapper%2cFootnoteWrapper%2cGroupLabel%2cHorizontalList%2cHorizontalListItem%2cImagePair%2cImagePairWrapper%2cLargeSubtitle%2cLegacyImagePair%2cRichCaptionControl%2cSelectItem%2cTitleWrapper%2cVerticalList%2cVerticalListItem%2cVerticalStackPanel%2cVerticalStackPanelItem
/rms/BundledViews/jc/426e0434/6ee7a7b8.js?bu=rms+views+Threshold+DenseTileLayout%2cErrorMessage%2cInlineError%2cItemList%2cLocalStrings%2cMyStuffHeader%2cMyStuffPhotoItem%2cPageCanvas%2cPagination%2cPlaceHolderImage%2cRecourse%2cRegion%2cResultItem%2cResultItemCentered%2cResultItemPosition%2cResultItemPositionItem%2cResultItemPrimaryPosition%2cResultItemSecondaryPosition%2cResultItemWideColumnPosition%2cSection%2cSectionContents%2cSpellCorrection%2cSpellerSuggestion%2cSubsectionHeader%2cInstLink
/rms/Framework/jc/98a1080c/8f35ad43.js?bu=rms+answers+BoxModel+config.threshold%2crules%24rulesThresholdv2%2ccore%2cmodules%24scroll%2cmodules%24resize%2cmodules%24state%2cmodules%24mutation%2cmodules%24error%2cmodules%24network%2cmodules%24cursor%2cmodules%24keyboard%2cmodules%24bot
/rms/rms%20answers%20AutoSuggest%20Modules$Aggregators$FastRankModel/jc/8ab4816a/c9022570.js
/rms/rms%20answers%20AutoSuggest%20Modules$Aggregators$TopHitConfidenceModel/jc/cdd5debb/e17a4d4c.js
/rms/rms%20answers%20AutoSuggest%20Partners$BingMDL2/ortl,cc/beb7ff27/cfa7c403.css
/rms/rms%20answers%20AutoSuggest%20Partners$CortanaMDL2/ortl,cc/f7ab76d7/53ee1b5a.css
/rms/rms%20localizationstrings%20AutoSuggest%20CortanaQF/jc/977f644e/09e2fa3e.js
/rms/rms%20localizationstrings%20Feedback%20LocStrings/jc/c495b727/7095ed03.js
/rms/rms%20localizationstrings%20Threshold%20LocStrings/jc/7417ae58/35c6ce5b.js
/rms/rms%20views%20AutoSuggest%20CortanaIcon/jc/2b83323c/09cbd0f2.js
/rms/rms%20views%20AutoSuggest%20HighlightedText/jc/43aaa2f3/4987a95a.js
/rms/rms%20views%20AutoSuggest%20Icon/jc/c511bd1f/d98da31c.js
/rms/rms%20views%20AutoSuggest%20WindowsGroup/jc/cd70749a/10528dc4.js
/rms/rms%20views%20AutoSuggest%20WindowsGroups/jc/73bef063/5a9e8c24.js
/rms/rms%20views%20AutoSuggest%20WindowsIndexingMessage/jc/ce7b6b63/1504f776.js
/rms/rms%20views%20AutoSuggest%20WindowsPermanentDisambig/jc/3e434d5d/a72607ec.js
/rms/rms%20views%20AutoSuggest%20WindowsSuggestionSingleLine/jc/1604fb44/d727d90a.js
/rms/rms%20views%20AutoSuggest%20WindowsSuggestionThreeLines/jc/22443ed7/3d9b6c2e.js
/rms/rms%20views%20AutoSuggest%20WindowsTopResults/jc/057e9dc3/570a83fb.js
/rms/SparkleFramework/jc/9a391b26/d18f4c62.js?bu=rms+serp+snr%24react.min%2csnr%24Sparkle%2csnr%24Sparkle.React%2csnr%24ResourceManagement.source%2csnr%24Array_c.source%2csnr%24string_c.source

On trouve aussi un appel à http://www.msftncsi.com/ncsi.txt qui permet à Windows de savoir si la liaison internet fonctionne, mais ce n'est pas propre à Windows 10.

Conclusion

Cela confirme le sentiment que j'avais sur Windows 10, il est très bavard, trop bavard. Qu'il discute de temps en temps pour savoir s'il y a des mises à jour je veux bien, mais envoyer ma résolution, le modèle et marque de ma machine à chaque fois que je fais une recherche dans le menu démarrer... non merci. Sachant que j'ai désactivé la recherche en ligne...

Après coup j'ai pu voir que mes données se recoupent avec l'article de Ars Technica qui a utilisé Fiddler, de mon côté Fiddler ne voyait pas les données j'ignore s'il y a une configuration particulière à faire.

Je n'utiliserai donc pas Windows 10 tant que cette situation n'évoluera pas, malgré les quelques outils désactivent les mouchards. Je me demande bien d'ailleurs ce que la CNIL attend pour se pencher sur ce sujet. Je ne dis pas que c'est illégal, Microsoft a forcément blindé les conditions d'utilisation, mais ce n'est pas acceptable en l'état.

Je ferai peut-être d'autres analyses sans désactiver les mouchards et avec aucune entrée dans le fichiers hosts, histoire de voir ce qui peut transiter pour "monsieur tout le monde" comme se le demande aussi Nicolas Simon dans son billet.

BM vous parraine en mode Premium chez iGraal.fr : 10 euros offerts à l'inscription :)
Vous devriez me suivre sur Twitter : @xhark

Article original écrit par Mr Xhark publié sur Blogmotion le 02/09/2015 | 37 commentaires |
Attention : l'intégralité de ce billet est protégée par la licence Creative Commons

Vus : 2828
Publié par Blogmotion : 108