web-dev-qa-db-fra.com

Server Apache / Linux, Attaque DOS de sa propre adresse IP

J'ai un problème inhabituel que j'ai essayé de diagnostiquer un moment:

  • Il s'agit d'un serveur Debian exécutant une compilation personnalisée d'Apache 2.2 avec PHP, Red5, MySQL 5.5 (binaire standard), sendmail (version de distribution) et Crashplan.

  • Tous les deux jours, je vois une grande quantité de demandes http à des fichiers aléatoires, principalement des images - nous parlons à la hausse mille connexions simultanées.

  • Ces demandes proviennent des serveurs propre adresse IP (!).

  • C'est généralement un ensemble limité de fichiers qui sont demandés encore et encore. Je ne vois pas de véritable modèle, mais cela ne ressemble pas à quelqu'un de racler des informations, cela ressemble à une tentative de DOS.

  • Cron exécute un script qui interdit temporairement IPS avec plus de 200 connexions, de sorte que cela se coupe généralement avant de pouvoir être vraiment problématique. Après 1-3 interdictions de 10 minutes, l'attaque s'arrête habituellement.

  • Cela dure depuis des mois. Étant donné que les attaques sont capturées et courbées, je ne parviens complètement à voir le point.

  • Cela se passe à des moments et des intervalles aléatoires, mais généralement vers la matinée Times UTC.

  • Aucun référent ou agent n'est envoyé avec ces demandes.

J'ai vérifié les journaux WebServer et Red5 pour des demandes connexes à la même heure, si un script sur le serveur est maltraité pour envoyer des requêtes à elle-même, mais ne pouvait rien trouver. Il n'y a rien dans les journaux d'erreurs Apache ou Syslog à ce moment-là. Rkhunter n'a rien trouvé de l'ordinaire non plus. Le serveur ne recherche pas les paquets d'itinéraire, il ne faut donc pas être une option non plus.

Je suis à une perte complète sur la méthode et la raison. Toute idée de quoi vérifier serait grandement appréciée. :)

Mise à jour: Suivre les conseils d'ISERNIS, j'ai préparé un mécanisme pour attraper des informations sur la prochaine occurrence. Ceci est (une version légèrement généralisée de) la méthode: http://pastebin.com/6USUKVBH

Réponse: Il s'agit d'un site de réseaux sociaux permettant aux profils de type MySpace utilisant l'éditeur FCK. Comme c'est un peu de cauchemar de sécurité, les profils postés par les utilisateurs subissent de nombreuses vérifications, dont l'une des sondes de liens/images publiées. Pour un particulier, je n'ai pas excluez le domaine de votre propre site dans ces chèques et deux en raison d'un bug lié aux redirections, chaque lien ou image a été touché 10 fois au lieu d'une fois. Ainsi, lorsqu'un utilisateur ayant un profil contenant une liaison étendue sur le site lui-même a été appuyé sur le bouton Enregistrer, le site serait lui-même. : P en particulier cet utilisateur concerné qui a un bazillion d'articles dans son profil et a tendance à sauver souvent.

Merci à Iserni pour la bonne idée comment diagnostiquer ce problème!

Réponse Modifier: J'avais tort de l'insecte. Elle a en fait des images 10 fois ou plus dans le profil. Plus spécifiquement près de 1000 liens et images à vérifier chaque sauvegarde. Je n'ai pas vu ça venir. : P

13
Someone

La première chose: découvrez d'où viennent ces demandes. Il doit s'agir d'un processus local, rien d'autre n'est susceptible d'être capable de spoof A TCP Handshake sur une plate-forme moderne Linux (rien, c'est-à-dire Déchets Un tel exploit sur demande d'images aléatoires).

S'il y a des URL récurrentes, vous pouvez les ombrir derrière un RewriteRule afin que toute demande de ce tel déclenche réellement un script . Dans le script, vous pouvez exécuter des contrôles supplémentaires pour voir si la demande est légitime (et vous émettrez ensuite les en-têtes appropriés comme si c'était l'image que le client légitime attend) ou s'il s'agit d'une des demandes de faux. Contre la mauvaise demande, vous pouvez loger E.G. le port entrant. Armé de cela, vous pouvez interroger netstat et trouver le processus. Vous pouvez également exécuter ps et inspecter tous les processus actifs en l'instant de la demande FONGUS.

Je suis sûr que je suis sûr que le coupable sera d'être apache lui-même (j'ai déjà eu un script "cache d'amorçage", allez-moi en raison d'une modification de Vhost - j'avais oublié de mettre le script à Crontab - et de faire des symptômes vraiment étranges, un peu comme Le vôtre, jusqu'à ce que tout soit revenu à moi; mais votre cas se sent différent).

Pour affiner la scène tout en contenant des coûts, vous pouvez ajouter PID/TID à Apache CustomLog. Ensuite, vous serez en mesure de vérifier les demandes reçues de l'enfant Apache Gone Rogue.

Une autre possibilité est de déterminer exactement Comment Ces demandes sont effectuées. Si via Apache, cela signifie fopen_wrappers, curl, fonctions de socket ou peut-être des utilitaires shell (ceux-ci doivent tous deux apparaître dans ps Sortie et entraîner une surcharge de serveurs beaucoup plus massive). Vous pouvez préparer une série de script qui:

  • redémarrez gracieusement Apache sans aucune modification
  • "", désactivation temporairement une de ces fonctions
  • "", réactivé même

Après avoir vérifié (juste pour être sûr) qu'un redémarrage fait non résoudre le problème (si c'était le cas, ce serait une boîte de vers très différente), Vous pouvez procéder pour désactiver temporairement - une douzaine de secondes chacune, plus - une fonction après l'autre. Supposons que la curl désactivée entraîne le retour immédiat de la normale: alors vous pouvez limiter les enquêtes sur des scripts à l'aide de CURL, et peut-être même envelopper la fonction de curl avec un wrapper de journalisation.

Si la partie culpolaire s'avère de ne pas être Apache, vous pourrez toujours déterminer quoi le fait; Ensuite, soit réinstallez le programme concerné (même si je trouve qu'il est peu probable que toute anomalie aléatoire active un programme dans une répétition-http-get-demandeur) ou inspecter sa configuration, ses fichiers de données auxiliaires, des scripts, etc., etc., pour toute différence d'une installation propre connue. Depuis que je ne crois généralement pas aux Gremlins, je m'attends à ce que certaines différence se distinguent à la fin.

5
LSerni

Unix (et Linux) a une mine d'outils d'analyse de choses comme celle-ci. Mon premier arrêt serait de saisir la sortie de NetStat -Nap E.G. Sur ma machine locale ...

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
...
tcp        0      0 192.168.0.2:80              192.168.0.2:59875           ESTABLISHED 5281/httpd
...
tcp        0      0 192.168.0.2:59875           192.168.0.2:80              ESTABLISHED 32588/chrome
...

Ici, je peux voir que chrome (PID 32588) est connecté au port 80/httpd (PID 5281). Puisqu'il s'agit d'une installation pré-fourche d'Apache, je peux obtenir plus d'informations sur le HTTPD. processus par journalisation% P ou en regardant dans/proc/5281/FD (ce dernier nécessitera probablement des scripts pour saisir les données au moment de la demande).

Cela vous permettra d'identifier le processus client.

Les candidats les plus probables sont un code de proxy ou de buggy mal configuré.

3
symcbean

Si c'était mon serveur, je vais exécuter un strace sur Apache. En cours d'exécution sur chaque processus d'enfant en mode PREFORK, peut être assez intensif de disque, en particulier lorsque votre serveur est déjà surchargé. Vous devez également garder un œil sur votre espace disque, car si elle s'épuise, Apache arrête de servir des demandes.

Assurez-vous d'utiliser une longueur SnapLL Longueur pour capturer toute la demande: -s 400 Devrait faire.

Si Apache fait des demandes à elle-même, toute chaîne d'obtention apparaît dans les décharges de la rythme pour deux PID différents: une qui a fait la demande et celle qui l'a reçu. Dans celui qui a fait la demande, vous souhaitez trouver la demande qu'elle a reçu et traiterait lorsqu'elle a fait la demande à elle-même.

Je fais normalement quelque chose comme ça:

for x in `ps -ef | grep Apache | awk '{print $2}'`; do strace -s 2000 -p $x -o trace.$x & done

Si vous souhaitez vous limiter à un sous-ensemble d'enfants Apache pour des raisons de performance, ajoutez un head là-bas:

for x in `ps -ef | grep Apache | head | awk '{print $2}'`; do strace -s 2000 -p $x -o trace.$x & done

Mais sachez que cela rend moins susceptible de capturer ce qui se passe.

Assurez-vous que vous avez deux sessions SSH ouvertes car toutes ces tâches de fond peuvent toujours écrire à votre session. Lorsque vous voulez arrêter de vous inscrire, redémarrez Apache ou de l'exécuter dans l'autre:

 for x in `ps -ef | grep strace | awk '{print $2}'`; do kill $x; done

Mon sentiment d'intestin sur celui-ci est un module "statique" écrit dans PHP qui pré-traite les images (les redimensionnant par exemple) avant de les envoyer au client et cela avec include($image). Si $image Il arrive à contenir une URL d'image de votre propre site plutôt que d'un chemin de fichier à partir du système de fichiers local, les demandes récursives sont le résultat.

Il pourrait utiliser les fonctions curl() plutôt que include().

2
Ladadadada

Cela ressemble à une attaque DDO qui utilise l'adresse IP du serveur. La meilleure action serait de mettre un filtre à paquets sur le routeur externe plutôt que d'utiliser des règles de pare-feu, comme l'utiliser le routeur réduira la charge sur le pare-feu. Sur un routeur Cisco, la solution simple serait d'écrire une liste d'accès avec la source étant votre bloc public, et la destination étant tout, puis l'appliquant à l'interface externe en tant que "groupe d'accès IP dans".

Le taux limiteur ICMP serait une bonne idée aussi, ils pourraient essayer de ping vous inonder.

Vous devriez penser que vous avez également pensé à limiter le trafic valide également, la prochaine attaque DDO n'étillera pas votre propre IP, ils utiliseront des adresses IP valides que vous ne pouvez pas filtrer sans filtrer vos clients. Une limite de taux bien choisie gardera votre serveur de l'épuisement des ressources.

0
GdD