Etikettarkiv: wordpress

WordPress hackat

Hackad WordPress? Så här gör du

Du vet väl att du kan anlita mig för att rensa upp och utreda en hackad WordPress-installation? Kontakt här >

Har du upptäckt att din blogg länkar till suspekta sajter eller att Google Webmaster Tools larmar? Så här gör du för att undersöka hacket samt återställa bloggen efter det att den blivit hackad.

Omfattning av hacket

Det första är att ta reda på modus operandi. Hur har antagonisten tagit sig in och exakt vad har denne genomfört? Jag skulle nog påstå att något av följande scenarion är mest troliga orsaker till intrång:

  • Någon har knäckt ditt lösenord
  • Sårbarhet i plugin
  • Delad hosting

Det är inte en lätt match att ta reda på tillvägagångssättet då omfattande genomgång av loggfiler samt andra filer måste genomföras. Att redan innan ett intrång genomförs är det bra att kontrollera att du verkligen har tillgång till loggfiler och kan genomföra IT-forensik.

Att söka efter vanligt förekommande PHP-funktioner som används vid bakdörrar såsom preg_replace() med /e (execute), eval, base64_decode eller system() och liknande kan möjligtvis ge några spår. Även så är .htaccess eller liknande filer populära att lägga in bakdörrar

Det kan även vara bra att kontrollera om inlägg har modifierats och iframes eller liknande har in injicerats:

SELECT * FROM wp_posts WHERE post_content LIKE '%<iframe%' OR
post_content LIKE '%<noscript%' OR post_content LIKE '%display:%';

Återställning efter hacket

Det bästa är att installera om samtliga plugins samt WordPress core och sedan återställa WordPress-databasen samt ändra samtliga lösenord i WordPress. På så sätt kan inget ligga kvar och du har troligtvis fått ut antagonisten. Dock finns det möjlighet att du installerar ett plugin som innehåller en sårbarhet igen om du ej genomfört en ordentlig utredning. Observera även att du måste helt tömma din webbroot, det räcker inte att skriva över filer för då kan eventuella extra filer (bakdörrar) ligga kvar.

Om antagonisten är inloggad i WP-admin och cookies är aktiva så måste security-keys ändras och här hittar du hur du gör (i wp-config.php filen).

Har intrånget skett genom delad hosting så kommer du troligtvis att bli hackad igen.

Du kan också givetvis anlita mitt företag Triop AB för att utföra undersökning samt rensa ut eventuella angripare.

Läs även det jag skrev 2012 om samma ämne:

SSL-Certifikat

Testa säkerheten i WordPress del 2

Detta är del två av hur du kan själv testa säkerheten på Er WordPress-installation. Detta är del två och första delen hittar du här.

Denna del behandlar några mer automatiserade sätt samt är lättare för nybörjare.

DetectifyDetectify

Svenska startupen Detectify har en utmärkt bra tjänst för att söka igenom WordPress efter sårbarheter.

De har även ett tillhörande WordPress-plugin. Jag rekommenderar alla att testa eftersom kostnaden är ”det du är villig att betala”, dvs du bestämmer själv hur mycket du vill betala.

https://detectify.com

Och här hittar du pluginet https://wordpress.org/plugins/detectify-for-wp/

Exempel på en översiktsrapport kan se ut så här:

Detectify skärmdump

 

Sucuri

Sucuri är också en form av online-scanner som söker igenom Er sajt. Den tittar dock på lite andra saker än vad Detectify såsom om Er blogg dyker upp på Google med sökord som har med spam-sökord såsom viagra, cialis och liknande att göra.

https://sucuri.net

Google dorks

Sist men inte minst så måste jag nämna alla Google Dorks som finnes. Det kan lättast beskrivas som att man använder Google för att hitta intressanta saker på en blogg.

Ett exempel kan vara följande sökning:

intitle:"index of" site:utvbloggen.se

Som försöker hitta kataloger på min blogg/domän som tillåter fillistning. Här finnes en databas med många dorks:

http://www.exploit-db.com/google-dorks/

Kolla även in penetrationstest.se

Testa säkerheten wordpress

Så testar du säkerheten i WordPress

Denna guide visar hur du kan genomföra ett penetrationstest av Er WordPress-installation. Fokus ligger på WordPress men det finns så klart andra delar att testa som också är relevanta såsom att testa såsom svaga SFT/FTP-lösenord men det är utanför denna guide.

Informationsinsamling

Först och främst så genomför vi informationsinsamling eller OSINT som det också kan kallas. Vi försöker kartlägga vilka användare som återfinnes samt eventuella plugins. Det går att göra genom att titta på källkoden på sidan och söka efter referenser till sökvägen /wp-content/plugins exempelvis.

Annars finns det ett plugin (script) till verktyget Nmap som kan lista användare:

 $ nmap -p 80,443 -v -sV --script http-wordpress-enum --script-args limit=25 utvbloggen.se

Och då erhåller du efter några minuter aktuella användarnamn, i mitt fall:

Username found: admin

Att det går att hitta användarnamn beror på att WordPress gladeligen berättar detta om en förfrågan genomföres till exempelvis URL:en //utvbloggen.se/?author=1 och 2 för andra användaren osv.

Även så avslöjar WordPress login-funktion om ett användarnamn är giltigt eller ej, se skillnaden mellan dessa två meddelanden:

WordPress felaktigt lösenord WordPress felaktigt användarnamn

Efter detta så testar vi att söka efter dom 500 vanligaste WordPress-plugintyperna som finnes:

$ nmap -p80,443 -v -sV --script=http-wordpress-plugins --script-args http-wordpress-plugins.search=500 utvbloggen.se

Och efter ett tag så finner vi att följande plugins används:

| search amongst the 500 most popular plugins
| akismet
| contact-form-7
| all-in-one-seo-pack
| google-sitemap-generator
| jetpack
| w3-total-cache
| worker
| only-tweet-like-share-and-google-1
| timthumb-vulnerability-scanner
| wordpress-23-related-posts-plugin
|_ syntaxhighlighter

Eftersom vi är intresserad av säkerheten så kontrollerar vi sedan om dessa innehåller några sårbarheter som uppdagats. Secunia erbjuder bl.a. en sådan tjänst här.

Även så kan det vara intressant att hitta övriga plugins som används som kanske inte är lika vanliga och ladda hem dessa samt söka efter sårbarheter. Och med detta menar jag att genomföra kodgranskning.

Forcering av lösenord

Nu när vi vet att det finns ett konto med användarnamnet ‘admin’ så är det dags att testa några vanliga lösenord. Det finns hur många lösenordlistor som helst med vanliga lösenord så det är inte helt lätt att hitta en bra lista.

Jag skulle rekommendera att bygga en egen lösenordlista med ord som förekommer på den blogg som vi vill testa och sedan köra den genom John the Rippers filter för att lägga till 01 osv på slutet på orden.

Först och främst så skapar vi filen users.txt dit vi lägger användarnamnet som vi hittade från föregående steg för att hitta användarnamn. Ett användarnamn per rad.

Sedan kör vi igång Nmap igen med modulen som heter http-wordpress-brute:

nmap -p 80,443 --script http-wordpress-brute --script-args 'userdb=users.txt,passdb=500-worst-passwords.txt' utvbloggen.se

Här använder jag lösenordsfilen 500-worst-passwords.txt men det går även bra att använda swedish.txt.

Så här kan det se ut då du hittar rätt lösenord som i detta fall är sexy123fox på denna blogg:

WordPress bruteforce passwordOch ovan statistik visar även på att det tog 107 sekunder att testa 1002 lösenord. Om vi vill få upp hastigheten i lösenordstesterna så kan vi använda ett annat verktyg som heter Hydra (även så fungerar Burp eller WPscan.rb).

Här kan vi se när Hydra hittar rätt lösenord med en annan lösenordslista som innehåller 370 lösenord som Twitter förbjuder som även hittar rätt lösenord sexy123fox:

WordPress hydra passwordOch sist men inte minst så  använder vi WPscan.rb för att göra en analys:

WPscan wordpressDenna analys visar förutom det vi ser ovan 6 st plugins som identifierades samt eventuella sårbarheter som dessa innehåller.

WordPress version 3.9.1 är senaste versionen vilket är bra.

Övrigt att kontrollera

Finns många andra viktiga saker att testa samt kontrollera. Några har jag nämnt tidigare såsom att även testa lösenord på SFTP/FTP. Men även viktigt är att kontrollera säkerheten på webbservern i övrigt och då titta i exempelvis robots.txt, sitemaps eller dylikt.

Söka efter phpmyadmin samt andra liknande script som finnes installerade men även databasdumpar som kan ha namn såsom http://utvbloggen.se/utvbloggen.sql exempelvis.

Mitt företag Triop erbjuder även denna typ av IT-säkerhetstest, läs mer här.

Uppdatering: Nu finns det en del två av denna guide som du kan läsa här.

Docker-hearts-WordPress

Docker med WordPress

Ni som läser denna blogg vet hur förälskad jag är i Docker. Jag tänkte nu försöka förklara hur du kan köra WordPress tillsammans med Docker. Det är ingen lätt process men det finns en stor uppsida:

  • Flexibilitet – Möjlighet att flytta komponenter mellan servrar lätt. Exempelvis lyfta ur databasmotorn eller webbservern.
  • Säkerhet – Allt separeras med hjälp av Linux Containers. Inte lika säkert som separata fysiska servrar eller virtuella maskiner.
  • Skalbarhet – Att växla upp delkomponenter är snabbt och enkelt. Lägga till och ta bort memcached exempelvis.
  • Driftsättning – Gå från utveckling, stage-miljö till driftsättning går snabbt och smidigt. Inga jobbiga beroenden som saknas eller är felaktiga.

Men hur gör man då? Jo först och främst är det några saker man måste tänka på:

  • En docker med Nginx + WordPress
  • Skrivbart filsystem för wp-content utanför dockern till WordPress.
  • En docker med MySQL (eller MariaDB, Percona)
  • Skrivbart filsystem för MySQL-databasen utanför dockern
  • Framtid: En docker med memcached.

Då sätter vi igång. Jag går ej igenom hur du installerar Docker utan det kan du läsa här eller köra Vagrant som jag gör på Mac OS X.

Installera NginxNginx

Den första dockern vi skapar ska ha Nginx samt WordPress installerat. Port 80 för http ska exponeras utåt.

Först och främst kör vi igång kommandotolken bash i Ubuntu 13.10 samt installerar Nginx.

# mkdir -p /data/wordpress/

Först enligt ovan kommando så skapar vi en gemensam katalog för våra containrar samt värdsystemet som ligger under /data.

# docker run -v /data/wordpress:/data/wordpress -p 80:80 -i -t ubuntu:13.10 /bin/bash
# apt-get update
# apt-get -y dist-upgrade
# apt-get -y install php5-fpm php5-gd php5-mysqlnd nginx php5-cli php5-curl php5-json

Ändra sedan /etc/nginx/sites-enabled/default och lägg till konfigurationsdirektiv enligt exempelvis den konfigg-template du hittar här. Du kan även konfigurera tonvis med andra inställningar i Nginx för att uppnå optimal prestanda, men det är ligger utanför denna guide.

Du måste även sätta root till den delade katalogen /data/wordpress/ i Nginx-konfen samt lägga till nedan i /etc/nginx/nginx.conf:

daemon off;

Vi avslutar dockern genom att trycka ctrl-D eller skriva exit.

Sedan kör vi följande för att spara ändringarna vi har genomfört i vår docker. Obs detta är viktigt annars går allt förlorat:

# docker ps -a

Kontrollera sedan vilket container ID den dockern vi just jobbade med och skriv ner ändringarna permanent genom en commit:

# docker commit 5d jonaslejon/nginx-wp:version1

Det räcker att skriva exempelvis de första två tecken i container ID. Ovan exempel så skriver jag bara 5d.

WordPress installationwordpress

Nästa steg är att ladda hem och installera WordPress. Detta görs genom att vi ansluter till dockern som vi just installerade Nginx på:

# docker run -v /data/wordpress:/data/wordpress -p 80:80 -i -t jonaslejon/nginx-wp:version1 bash

Sedan installerar vi wget samt går vi till root-katalogen för webbservern vilket i mitt fall är enligt följande:

# apt-get -y install wget
# chown www-data /data/wordpress/
# cd /data/wordpress/
# wget http://sv.wordpress.org/wordpress-3.8.1-sv_SE.tar.gz
# tar xvfz wordpress-3.8.1-sv_SE.tar.gz
# mv wordpress/* .
# exit

Då var WordPress och Nginx installerat. Och glöm framförallt inte att göra en commit på ändringarna:

# docker ps -a
# docker commit 7e6b550faa50 jonaslejon/nginx-wp:version3

Installation av MySQL, MariaDB eller Percona Server

Här ska vi inte glömma att skapa MySQL dockern i en helt ny docker och inte fortsätta med föregående Nginx-docker.

# mkdir -p /data/mysql

Först skapar vi en gemensam katalog där filerna till databasen ska leva kvar. Sen kör vi igång en docker och delar katalogen:

# docker run -v /data/mysql:/data/mysql -p 3306:3306 -i -t ubuntu:13.10 /bin/bash
# apt-get -y install mysql-server
# chown ubuntu /data/mysql
# vi /etc/mysql/my.cnf
# service mysql start
# echo "create database wordpress"|mysql -plösenord
# echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY 'wplösenord'" | mysql -plösenord
# exit 
# docker ps -a 
# docker commit 1f9b38696a7f jonaslejon/mysql:version1

Ovan så ändrar du även i konfigg-filen /etc/mysql/my.cnf där datadir finns (jag gör det med vi). Ändra katalogen från /var/lib/mysql till /data/mysql/.

Jag skapar även ovan en ny databas med namnet wordpress samt en användare med namnet wordpress och lösenordet wplösenord.

Om allt sedan fungerar och du har gjort en commit så kan du testa denna docker med:

# docker run -v /data/mysql:/data/mysql -p 3306:3306 -i -t jonaslejon/mysql:version1 /usr/bin/mysqld_safe

Starta upp allt

Då var två stycken Docker-containers skapade. Vi ska nu starta upp dessa och hoppas på att allt går vägen. Skillnaden här är att vi anger -d så att containrarna läggs i bakgrunden:

# docker run -d -v /data/mysql:/data/mysql -p 3306:3306 -i -t jonaslejon/mysql:version1 /usr/bin/mysqld_safe
Det vi gör sedan är att titta med docker ps:
docker ps
Samt kontrollera loggarna från containern:
docker logs

Ser bra ut! Då ska vi starta upp webbservern Nginx:

# docker run -v /data/wordpress:/data/wordpress -p 80:80 -i -t jonaslejon/nginx-wp:version3 sh -c "service php5-fpm start && service nginx start"
Verifiera att allt körs med hjälp av docker ps-kommandot.

Avslutande anmärkningar

Nu behöver du bara konfigurera WordPress genom att surfa till localhost:80. Detta står även under PORTS när du kör docker ps.

IP-adressen som du behöver när du konfigurerar WordPress-installationen till MySQL-databasen kan du få ut genom att köra inspect på rätt container:

# docker inspect c6e0c1e4e5f0|grep -i ipaddress
 "IPAddress": "172.17.0.2",

Om du ansluter via Vagrant mot containrarna så måste du även konfigurera i Vagrantfile alternativt när du kör vagrant up på följande sätt:

# FORWARD_PORTS=80,3306 vagrant [up|reload]

Övrigt

  • Du behöver inte ha en delad /data-katalog som jag kör med. Men bra om du vill ha data som ska leva en längre tid.
  • Du kan även köra Nginx och MySQL på samma container.
  • Supervisord kan vara bra att använda för att starta upp och hålla koll på processer.
  • Det finns färdiga containers i det centrala docker-indexet. Sök genom kommandot docker search wordpress eller klicka här >
  • Det finns ett fiffigt sätt att automatiskt koppla ihop två containers genom att använda -link argumentet. Då läggs miljövariablar innehållandes port samt IP-nummer till automatiskt på följande sätt:

docker link

Gillar du detta blogginlägg? Donera gärna till min Bitcoin-adress nedan eller dela detta inlägg i sociala medier.

  • 13cxyC2sFvNfAAShcAaSs2YMW3Q4ygstD4
Jonas Lejon WordPress Säkerhet

Föreläsning om WordPress och säkerhet

Föregående fredag så höll jag en föreläsning om WordPress och säkerhet på Västerås Science Park. Föreläste gjorde även Christoffer Larsson från Aftonbladet och hur de använder Vagrant för utvecklingsmiljön.

På min föreläsning om säkerhet så berättade jag om en händelse som inträffade för några år sedan då en angripare lyckades utnyttja en sårbarhet på en av mina bloggar och placera ut ett antal bakdörrar. Genom att bakdörra angriparens bakdörrar samt spåra IP-adressen mot andra anrop på min webbserver så lyckades jag till slut hitta alla bakdörrar.

Här finnes presentationen:

Läs mer om #wpbar här. Och tack till Västerås Science park samt Flowcom som sponsrat + arrangerat detta trevliga event.

Internetdagarna 2013

Internetdagarna

Det är inte så många veckor kvar till min favoritkonferens Internetdagarna. Konferensen har alltid så många intressanta föredrag att jag alltid har svårt att välja vilket jag ska gå på. Synd att jag inte kan klona mig!

Förutom Internet Discovery Days som går dag två så finns det ett antal intressanta spår dag ett:

  • Swedish Startup Sessions
  • Domännamnsbranschen just nu
  • Öppna data – vad händer under 2014?
  • En dag med WordPress

Använder du bokningskod IND13 så erhåller du rabatt.

Transparens: Jag hjälper till att marknadsföra Internetdagarna mot för att jag får marknadsföra min nya startup på Internetdagarna. Återkommer med mer information när det beger sig.

WordPress felsökning, prestanda och optimering

I måndags så höll jag ett uppskattat föredrag om hur du felsöker och optimerar WordPress. Själva presentationsmaterialet innehåller många punkter och är kladdigt, men har dock ett syfte: Att fungera som ett underlag vid felsökning/optimering.

Tack till @tdh, .SE mfl som såg till att årets upplaga av WordCamp gick av stapeln.

Presenstationen har CC-BY 2.0 licens.

Bild på mig av @dcarlbom:

Bilden ovan har licens CC BY NC SA och är tagen av Daniel Carlbom.

Jag föreläser om WordPress på WordCamp

Snart kan du höra mig föreläsa om WordPress och prestanda på WordCamp aka Internetdagarna Forum som är den första dagen av tre. Även så är det Internet Discovery Days under samma dag som jag även tycker att du inte får missa.

Under mitt föredrag kommer jag att fokusera på de erfarenheter jag erhållit då jag hjälp några av Sveriges största bloggare att få upp prestanda i WordPress istället för att köpa ny hårdvara.

Håll koll på wpsthlm.se eller Facebook-sidan. Hashtaggar som kan användas på Twitter är #wpSthlm eller #idd12.

Har din WordPress-blogg hackats? Läs det här

Fler och fler WordPress-bloggar hackas och en stor faktor är den sårbarhet som identifierades i TimThumb. TimThumb var inbakad i mängder plugins och teman som inte uppdateras.

Första tecknet på att din blogg hackats kan vara något av följande:

  • Din blogg försvinner från Googles-index. Dvs söker du efter din blogg så dyker den inte upp
  • Någon kontaktar dig gällande viagra eller liknande som din blogg länkar till
  • Du hittar nya filer eller så försvinner filer från din WordPress-installation

Det du måste göra när din blogg hackats är att börja om från början och försöka lista ut hur angriparna tog sig in. Så först och främst måste du se till att du har en backup av både filsystemet och databasen.

Om du har kontroll över underliggande operativsystem så bör du även installera om det då angriparna kan ha tagit sig in i operativsystemet. Att installera om och konfigurera operativsystemet är oftast krävande och tar lång tid.

Ominstallation av WordPress

Börja med att göra en ny installation av WordPress och läs sedan tillbaka databasen, ändra lösenord och titta så att inga nya konton dykt upp i WordPress. Innan du börjar med din nya installation av WordPress måste du se till att det är helt tomt på ditt konto, inga .htaccess-filer som kan vara dolda exempelvis då det finns exempel då angripare placerat bakdörrar i dessa. Om du känner dig osäker gällande dessa steg så bör du anlita eller fråga någon som kan WordPress bra.

Installera alla plugins som du behöver och gå manuellt igenom samtliga och undersök huruvida det har identifierats några sårbarheter i dem på sistone. Secunia har en söktjänst där du kan söka på pluginnamn.

Om du har ett egenutvecklat tema (theme) och vill återställa detta från din backup så bör du gå igenom samtliga .PHP-filer för att säkerställa att ingen bakdörr har tagit sig in.

Det finns även exempel då bloggar hackats genom delade miljöer på webbhotell, då hjälper det inte så mycket att du gör en nyinstallation om inte webbhotellet vidtar åtgärder. Överväg även möjligheterna att angriparen tagit sig in med ditt FTP-konto eller dylikt genom att testa vanliga lösenord eller läckta lösenord från exempelvis BloggToppen.

För att säkerställa att det just inte var TimThumb som används för intrång mot din blogg så kan du installera ett plugin som söker igenom efter den kod som TimTumb använder sig av. Här kan du ladda hem TimThumb vulnerability scanner:

Vidare läsning

Du bör även läsa WordPress FAQ gällande hackade WordPress-bloggar.

Detta blogginlägg kommer att uppdateras löpande med nya tips. Om du är intresserad av WordPress och säkerhet så bör du även läsa mitt inlägg om hur säkert WordPress är.

Nikke Lindqvist skrev även om hur viagra-spammare tar sig in i bloggar mer och mer här.

Dödar gamla buggar på bloggnätverket

I går så fixade jag en fem år gammal bugg som gjorde att cachningen på min sajt BloggVärde fungerade suboptimalt. Felet bestod i att jag använde en sekundräknare som uppdaterades i en SQL-fråga mot databasen.

Dock så cachar jag genom memcache och en md5-summa som beräknas på SQL-frågan, eftersom SQL-frågan blev ny varje sekund så cachades bara frågorna i en sekund. Det sänker förvisso belastningen till SQL-servern lite men när jag hade fixat buggen så gick sajten flera sekunder snabbare.

Jag har även flyttat över BloggNytt till molnet aka Amazon EC2 och håller på att flytta mer av mitt bloggnätverk från 2007.

Du glömmer väl inte att lägga till ping.bloggnytt.se i din lista över XML-RPC tjänster som du pingar från WordPress? Du lägger in http://ping.bloggnytt.se under Inställningar->Skrivinställningar och Uppdateringstjänster.