Blandade säkerhetstips, del 1 – setuid 0
I första delen om blandade säkerhetstips för Linux kommer vi gå igenom varför det är så viktigt att hålla koll på program med SetUID-biten satt.
Vi kommer inte att gå igenom själva intrånget här. Det finns mängder av olika sätt att ta sig in på ett system. Alltifrån dåligt kodade PHP-script på webbservern, till säkerhetshål i någon tjänst som körs på maskinen. Eller via en användare som har använt ett svagt lösenord. Eller vi en gammal kärnmodul. Istället kommer vi fokusera på hur man upptäcker ett intrång och täpper till systemet igen.
SetUID 0 / SetGID 0
När ett intrång har skett är inkräktarens första mål att se till att han behåller sina root-rättigheter. Han eller hon kommer förutsätta att intrånget upptäcks och att du som systemadministratör då kommer patcha systemet, så att han inte kan nyttja säkerhetshålet igen.
För att inkräktaren ska ha möjlighet att bli root igen – han vill ju inte vara
en vanlig användare – brukar han placera en rad setuid(0)
-program på
systemet. Dessa program exekverar ett vanligt skal på systemet men som
root-användaren. På så sätt har inkräktaren återigen root-rättigheter.
Ett sådant program kan i sin enklaste form se ut som nedanstående C-kod.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
setuid(0);
setgid(0);
execl("/bin/bash", "bash", NULL);
return 0;
}
Om vi kompilerar detta programmet, sätter ägaren till root, och därefter sätter SetUID- och SetGID-biten, kommer vilken användare som helst som kör programmet att få ett root-skal.
För att inkräktaren ska lyckas sätta ägaren till root, och sätta SetUID- och SetGID-bitarna, krävs att han någon gång under intrånget haft root-rättigheter.
$> gcc myshell.c -o myshell
$> su
Password:
#> chown root:root myshell
#> chmod 6755 myshell
#> exit
Nu har inkräktaren förberett sitt root-skal och kan komma åt alla filer på hela systemet som en vanlig användare.
$> ls -l hemlisar.txt
-r-------- 1 root root 26 sep 17 03:08 hemlisar.txt
$> cat hemlisar.txt
cat: hemlisar.txt: Permission denied
$> ./myshell
#> cat hemlisar.txt
Kära dagbok...
Så enkelt är det alltså för en inkräktare att skapa sitt egna root-skal. Det är därför viktigt att du har koll på vilka SetUID- och SetGID-program som finns på ditt Linuxsystem.
Det finns under normala omständigheter en rad program i Linux som kräver just
dessa bitar för att fungera. Bland annat passwd
-kommandot kräver SetUID,
annars hade inte användarna kunnat ändra sina egna lösenord – de har ju inte
rättigheter att ändra vare sig /etc/passwd eller /etc/shadow.
SetUID och SetGID är således rättighetsbitar som gör att vem som helst på systemet kan exekvera programmet som filens ägare eller grupp. SetUID står för set user ID och SetGID står för set group ID. Ägs filen av root, kommer den också att exekveras som root, även om den körs av en vanlig användare.
Hitta program med dessa bitar
Det bästa är att skapa en lista över alla normala program som behöver SetUID-biten och spara listan utanför servern, exempelvis på ett skrivskyddad minneskort. Om du misstänker att ett intrång skett jämför du din säkra lista mot de nuvarande programmen som har SetUID.
För att hitta SetUID- och SetGID-program kan vi använda kommandot find
.
#> find / -user root \( -perm -4000 -o -perm 2000 \)
/bin/umount
/bin/fusermount
/bin/mount
/bin/su
/bin/ntfs-3g
/sbin/mount.nfs
/opt/google/chrome/chrome-sandbox
/home/jake/myshell
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/newgrp
/usr/bin/pkexec
/usr/bin/gpasswd
/usr/bin/chfn
/usr/bin/chsh
/usr/sbin/pppd
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/xorg/Xorg.wrap
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/policykit-1/polkit-agent-helper-1
Här ser vi inkräktarens root-skal i listan, /home/jake/myshell
. För att
maskera sitt root-skal brukar dock en inkräktare placera sitt root-skal i
/bin-katalogen och döpa den till något finurligt, t.ex. mount2
eller
liknande. Allt för att hindra upptäckt.
Hitta skillnader med diff
Låt oss anta att du har en lista över alla SetUID- och SetGID-program som
du skapade när systemet var nyinstallerat. För att jämföra och upptäcka
eventuella nya program med dessa bitar satta kan du använda diff
. Observera
att du måste ha skapat de båda listorna med samma argument till find
för att
undvika så kallade false positives.
#> find / -user root \( -perm -4000 -o -perm 2000 \) > ny-lista.txt
#> diff saker-lista.txt ny-lista.txt
7a8
> /home/jake/myshell
Här ser vi att /home/jake/myshell
är ett nytt program som inte fanns med i den
säkra listan över SetUID-program. Alltså är detta något som du som
systemadministratör bör undersöka och radera från systemet.
Att radera alla sådana nya SetUID-program är ett första steg för att rensa upp efter ett intrång. Se bara upp så att du inte raderar riktiga systemprogram som faktiskt ska ha dessa bitar satta!
Tänk på att detta bara är ett av många steg för att rensa upp efter ett intrång. Det är aldrig säkert att man hittar alla bakdörrar, root-skal och root-kit efter ett intrång. Man brukar därför utgå från att man aldrig igen kan lita på ett system som haft ett intrång.
Nyhetsbrev
Nyhetsuppdateringar från tidningen direkt till din inkorg, helt kostnadsfritt. Avsluta när du vill.
Relaterade artiklar
-
Avlyssna trafik på servern med Wireshark och TShark
Wireshark är ett ovärderligt verktyg för att felsöka nätverkskonfigurationer, applikationer, API:er, demoner och mycket annat. I kombination med
tshark
kan vi dessutom avlyssna trafiken på en server i realtid. -
Var försiktig med att curl:a skript som root
Att installera program i Linux genom att omdirigera utdata från Curl till skalet är snabbt och smidigt. Men det är ack så farligt om du inte känner till programmet eller dess ursprung.
-
Vidarebefordran av SSH-agenten
SSH agent forwarding, eller vidarebefordran av SSH-agenten, innebär att man kan vidarebefordra SSH-agenten till ett fjärrsystem. På så sätt behöver man inte kopiera sin privata SSH-nyckel till fjärrsystemet, eller skapa flera nycklar för olika system. Men det finns risker med det.
-
Jenkins som ett alternativ till Ansible Tower
Ansible Tower kommer med en stor prislapp, speciellt för ett mindre företag eller en privatperson. AWX å andra sidan är helt fritt, men kräver numera Kubernetes. För den som vill automatisera sina Ansible Playbooks går det dock bra att använda Jenkins som en ersättning för Tower och AWX.
-
Hämta data från API:er med cURL och jq
Med cURL och jq går det att extrahera data från API:er direkt från kommandoraden. Jq är en JSON-tolkare och beskrivs av utvecklarna som sed och awk för JSON.
Senaste nyheterna och inläggen
-
Avlyssna trafik på servern med Wireshark och TShark
Wireshark är ett ovärderligt verktyg för att felsöka nätverkskonfigurationer, applikationer, API:er, demoner och mycket annat. I kombination med
tshark
kan vi dessutom avlyssna trafiken på en server i realtid. -
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Sommarens skånska demopartyn
Årets sommar bjuder på två skånska demopartyn. Först ut är Reunion i Kvidinge den 28–30 juni. Därefter är det Pågadata i Örtofta den 9–11 augusti.
-
Riskerna med BankID som ingen pratar om
BankID är ett säkert och smidigt sätt att identifiera sig online. Men i takt med dess ökade popularitet och användning har det blivit en svag länk – en single point of failure – på mer än ett sätt.
-
Polisernas fängelsedomar står fast
Efter tre år är målet mot de två poliser som olovligen tog sig in i en berusad mans bostad i Landskrona och misshandlade honom klart. Högsta domstolen beslutade den sjätte mars att avvisa överklagan. Fängelsedomarna för poliserna står därmed fast.
Utvalda artiklar
-
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Datorparty i Landskrona
I helgen höll Syntax Society sitt årliga sommarparty. Platsen var en källarlokal i Landskrona där ett femtontal personer medverkade.
-
Det första Pågadata har ägt rum
I helgen ägde det första Pågadata rum – uppföljaren till Gubbdata. Platsen var Folkets Hus i Kvidinge. Organisatör av partyt var Johan “z-nexx” Osvaldsson med hjälp från Jesper “Skuggan” Klingvall. Partyt hade över 100 anmälda deltagare.
-
Även hovrätten fäller poliserna för att ha satt dit oskyldig
Hovrätten fastställer straffet för de två poliser som förra året dömdes till vardera ett års fängelse av Lunds tingsrätt för att ha misshandlat och satt dit en oskyldig man. De båda poliserna ska även betala skadestånd till mannen.
-
Retroloppis i Påarp
Idag var det retroloppis hos Andreas Nilsson i Påarp. På baksidan av huset fanns hundratals spel uppradade på långa bord. Trots friska vindar och sval temperatur var loppisen välbesökt.
CyberInfo Sverige är ett it- och medieföretag i nordvästra Skåne som tillhandahåller böcker, utbildningar, nyheter och konsulttjänster inom Linux, säkerhet och programmering.
CyberInfo Sverige är godkänd för F-skatt, är momsregistrerat och innehar
utgivningsbevis för webbplatsen www.cyberinfo.se.