Welkom terug bij “Verkeer op de reverse proxy”, de dagelijkse rondleiding langs alles wat de afgelopen 24 uur tegen mijn nginx is aangelopen. Gisteren riepen we 503 nog uit tot koning; vandaag laat de beste man weten dat hij absoluut niet van plan is om af te treden. Pak er een bak koffie bij, want het was weer een drukke dag bij de poort.
Hoeveel verkeer was het eigenlijk?
In totaal kwamen er 9036 logregels binnen, waarvan er 5596 netjes als access-log te parsen waren. Samen goed voor 49.309.809 bytes — zo’n 47,0 MiB aan dataverkeer dat over de lijn ging. Die verzoeken kwamen van 1043 unieke IP-adressen, een gezelschap dat varieerde van keurige bezoekers tot lieden die liever niet aanbellen.
De dag had duidelijke pieken. Het werd pas echt gezellig vanaf 15:00 UTC (497 verzoeken), met een vroege avondspits rond 17:00 (836) en de absolute topper om 20:00 UTC met 877 verzoeken in één uur. Het rustigst was het om 01:00 UTC, toen er maar 27 verzoeken voorbijkwamen — zelfs bots gaan blijkbaar af en toe even liggen.
Mens versus bot
Van alle verzoeken werden er 580 als bot geclassificeerd en 5016 als overig/mens. Dat klinkt alsof de mensheid ruim wint, maar laat je niet foppen: die “menselijke” categorie zit vol met verdachte types. Maar liefst 947 verzoeken kwamen binnen zónder user-agent (een kale “-“), en daaronder schuilen klassiekers als Opera/7.54 op Windows NT 5.1 (263 keer) — een browser-stringetje uit het stenen tijdperk dat tegenwoordig vooral door scanners wordt gebruikt.
Aan de nette kant van het spectrum zagen we ook echte crawlers langskomen: Bytespider van ByteDance (132 + 73 keer), Applebot (89) en meta-externalagent van Meta (79). Die mogen blijven — dat is het soort verkeer dat netjes z’n naambordje ophoudt.
Opvallende statuscodes
En dan de olifant in de serverruimte: 3105 keer een 503. Dat is meer dan de helft van alle geparste verzoeken. Een 503 (Service Unavailable) betekent dat de proxy wél overeind stond, maar dat de achterkant het even niet trok of niet thuis gaf. Ter vergelijking: er waren maar 1231 keer een nette 200 en 80 keer een 304 (lekker uit de cache).
De 4xx-familie liet zich ook gelden: 697 keer een 400 (kapotte of bewust misvormde requests), 374 keer een 404 (op zoek naar iets dat er niet is) en 25 keer een 403. De redirects bleven bescheiden met 60 keer 301 en 16 keer 302. Opvallend: zelfs de homepage / ging 86 keer onderuit met een 503. Als de voordeur al klemt, weet je dat het een bijzondere dag is.
De drukste paden
Bovenaan de paden-ranglijst staat netjes de homepage / (172 keer), gevolgd door een mysterieuze “-“ (50) en /robots.txt (50). Daarna wordt het al snel minder onschuldig met /SDK/webLanguage (45) en /wp-cron.php (42). Verder zagen we het normale WordPress-meubilair voorbijkomen: de morenews-thema-CSS en -JS, de /feed/ (19) en — leuk detail — 17 keer de blogpost van gisteren over de dag dat 503 koning was. Fijn dat iemand meeleest, ook al was het misschien een bot.
Qua hosts werd www.kroonwijk.nl het vaakst gevraagd (1743), maar daar vlak achter zat een flinke stapel verkeer dat helemaal geen domeinnaam noemde: veel verzoeken kwamen binnen op mijn kale home-IP als Host-header (1244 en nog eens 1068), plus 253 verzoeken op de catch-all “_”. Wie een Host-header invult met een IP in plaats van een domein, is bijna per definitie aan het scannen — geen mens typt zoiets.
De verdachte en probende pogingen
En nu het gedeelte waar we deze serie eigenlijk voor doen: het schemerige volk dat aan de deurklink rammelt. De top van de verdachte paden vertelt een herkenbaar verhaal:
- /SDK/webLanguage (45) — een klassieke probe naar Sangfor SSL-VPN-apparaten met een bekende command-injection-kwetsbaarheid. Heb ik niet, maar de scanners blijven het hoopvol proberen.
- /.env (14) en zijn vriendjes /.env.local en /.git/config (8) — gericht op het buitmaken van weglekkende API-sleutels, database-wachtwoorden en broncode. Het digitale equivalent van even in je brievenbus gluren.
- /info.php (14) — op jacht naar een achtergebleven phpinfo()-pagina die het complete serverpaspoort prijsgeeft.
- /wp-login.php (11), /wp-admin/admin-ajax.php (14) en /wp-cron.php (42) — standaard WordPress-gerammel, van inlogpogingen tot het misbruiken van de cron-endpoint.
- /wp-content/plugins/hellopress/wp_filemanager.php (10) — mikt op een berucht kwetsbare plugin die ongeauthenticeerd bestandsbeheer (lees: code-uitvoering) zou toestaan.
- /this_is_a_new_hello_world.php (9), /abcd.php, /rip.php, /ioxi-o.php, /cache.php en consorten — dit zijn geen aanvallen, maar controles: de scanner kijkt of er al een webshell van een eerdere inbraak op de server staat. Een soort “is dit huis al gekraakt door een collega?”
Tussen de HTTP-methodes zaten ook een paar regelrechte vergissingen van het scannende publiek: regels die begonnen met \x03\x00\x00 en mstshash=Domain (36 keer) zijn RDP-pakketjes — iemand zocht een Remote Desktop-server en knalde dat per ongeluk tegen poort 80. En \x16\x03\x01 is het begin van een TLS-handshake die op een platte HTTP-poort terechtkwam. Geen kwaad, wel grappig: dat is de 400-fabriek (die 697 keer een 400 verklaart).
De meest fanatieke deelnemer was 152.42.143.92, met 377 verzoeken in totaal waarvan 357 als verdacht bestempeld. Daarachter een opvallend rijtje cloud-IP’s uit Google Cloud (de 34.x- en 35.x-reeksen, drie ervan precies 427 verzoeken) en Azure (52.x en 20.x). Hetzelfde patroon zie je bij de eigenaardige user-agent “Mozlila/5.0 … Team Anon Force” (377 keer) — let op de tikfouten in “Mozlila”, “Bulid” en “Moblie”. Dat is een handtekening van een bekende script-kiddie-botnet die te druk was met scannen om even de spellingscontrole aan te zetten. Ook libredtail-http (132) is zo’n kant-en-klaar scantool.
Conclusie van de dag
Samengevat: 503 weigert pertinent z’n kroon af te staan, de echte bezoekers waren in de minderheid, en de poortwachter heeft vooral veel onaangekondigd bezoek met een schroevendraaier in de hand keurig buiten gehouden. Geen van de probes naar .env-bestanden, phpinfo of vergeten webshells heeft beet gehad — wat vooral een 503 of een 404 opleverde, en dat is precies hoe je het wilt. Tot morgen, dan kijken we weer wie er allemaal aan de deur heeft gevoeld.