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.
Kommentarer
Kommentarsfältet är modererat. Det innebär att alla kommentarer granskas av ansvarig utgivare före publicering.
Du väljer själv om du vill ange ditt riktiga namn, en pseudonym eller vara helt anonym. Ingen registrering behövs.
Relaterade artiklar
-
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.
-
Det nya Docker Compose
Sedan i mitten av förra året har det gamla Python-baserade
docker-compose
-kommandot sakta ersatts av det nyare Go-baseradedocker compose
. Det nya kommandot är ett plugin till Docker istället för ett fristående kommando som tidigare. -
Tvåfaktorsautentisering vid SSH-inloggning
Med hjälp av en PAM-modul går det att aktivera tvåfaktorsautentisering i Linux med exempelvis Google Authenticator-appen. Linuxsystemet kräver då både användarens lösenord samt ett engångslösenord. Det går även att kombinera en SSH-nyckel med ett engångslösenord.
-
Tjänster på användarnivå i Linux
I Linuxdistributioner med systemd går det att köra tjänster som vanliga användare. Med något som heter lingering går det dessutom att köra tjänster även om den aktuella användaren inte är inloggad.
-
Docker Desktop för Linux är här
Nu finns Docker Desktop även för Linux. Precis som Docker Desktop för macOS och Windows, finns även Kubernetes inkluderat i Linux-versionen. Man använder även ett VM för att köra containrarna.
Senaste nyheterna och inläggen
-
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.
-
Pythonmiljö i Docker
Ett vanligt användningsområde för Docker är att skapa och köra virtuella Pythonmiljöer. Med en Dockerfile och Docker Compose kan vi automatisera hela processen, från skapandet av miljön till exekveringen.
-
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.
-
Ny bok om Ansible
Till hösten släpper CyberInfo Sverige sin nya bok – Ansible från grunden. Boken riktar sig till alla som vill lära sig grunderna i Ansible. Den börjar med att sätta upp SSH-nycklar och köra enkla ad hoc-kommandon mot en värd. Därefter går vi vidare med att bygga egna playbooks och roller.
-
Det nya Docker Compose
Sedan i mitten av förra året har det gamla Python-baserade
docker-compose
-kommandot sakta ersatts av det nyare Go-baseradedocker compose
. Det nya kommandot är ett plugin till Docker istället för ett fristående kommando som tidigare.
Utvalda artiklar
-
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.
-
Stort deltagande på årets Gubbdata
I helgen var det Gubbdata i Lund – ett av Sveriges största demoparty. På plats fanns cirka ett hundra deltagare, alla med en passion för retrodatorer.
-
Kapad identitet
I mitten av september förra året blev Kristina utsatt för ett id-kapningsförsök. Någon hade ansökt om ett lån på 250 000 kr i hennes namn. Låneansökan gick ut till ett 20-tal banker.
-
Amiga-scenen lever än
I en villa mellan Ljungskile och Stenungsund den 27 november träffades de igen, ett gäng glada Amiga-entusiaster. Man träffas för att prata, titta på demos, spela och ha allmänt trevligt.
-
Fällande dom för mannen med polismejlen
Den man som under nästan två års tid uppmärksammade polisen på att han fick polisrelaterad mejl skickad till sig dömdes idag för dataintrång till dagsböter. Domen avser den inloggning till Frontex, Europeiska gräns- och kustbevakningsbyrån, som mannen testade.
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.