w47 j-5 Asenna koneellesi iptables-tulimuuri. Kuvaile, mitä sen eri osat tekevät ja miksi ne ovat valitussa järjestyksessä. Testaa tulimuurin toiminta nmap-porttiskannerilla. Avaa joitakin portteja ja kokeile, miten skannaustulos muuttuu. Testaa käyttöjärjestelmän sormenjälki, -P0, banner grabbing ja skannattavien porttien vaihtaminen. Testaa jotain itse valitsemaasi tietoturvatyökalua. Ole huolellinen, ettet aiheuta häiriötä toisten koneille tai verkoille.
Suoritin harjoituksen 24.11.2005 aikana, luokassa 5013 koneella numero 0x. Aikaa harjoitukseen kului kaiken kaikkiaan noin 2 tuntia, josta dokumenttien kirjoittaminen vei noin tunnin verran.
Aloitin harjoituksen tarkistamalla mitä Fedora Core 4:n mukana tuleva palomuuri oli konfiguroitu seuraavalla komennolla:
# iptables -L
Komento tulosti varsin näyttävän näköisesti paljon rivejä joissa oli määritelty jos minkälaisia asetuksia palomuurille. Fedoran asentamaan palomuuriinhan tehdään säädöt jo asennusvaiheessa, joten kuten odottaa saattoi, päästi oma palomuurini kaiken liikenteen ulospäin, kielsi sisäänpäin tulevasta liikenteestä kaiken muun paitsi yhteydenotot ssh-palvelimeeni ja salli localhost liikenteen sekä paluuliikenteen.
Seuraavaksi kävin kopioimassa Tero Karvisen sivuilta malliskriptin iptables-määrityksille. Malliskripti sisälsi tämännäköistä tavaraa:
#!/bin/sh # firewall.sh - Configurable per-host firewall for workstations and # servers.(c) 2003 Tero Karvinen - tero karvinen at iki fi - GPL # Cleanup old rules # All the time firewall is in a secure, closed state iptables -P INPUT DROP iptables -P FORWARD DROP iptables --flush # Flush all rules, but keep policies iptables --delete-chain ## Workstation Minimal firewall ### iptables -P FORWARD DROP iptables -P INPUT DROP iptables -A INPUT -i lo --source 127.0.0.1 --destination 127.0.0.1 -j ACCEPT iptables -A INPUT -m state --state "ESTABLISHED,RELATED" -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT ####### HOLES ####### Edit holes below, then run this script again #iptables -A INPUT -p tcp --dport ssh -j ACCEPT #iptables -A INPUT -p tcp --dport http -j ACCEPT #iptables -A INPUT -p tcp --dport https -j ACCEPT ##################### Edit above iptables -A INPUT -j LOG -m limit --limit 40/minute iptables -A INPUT -j DROP # Save iptables-save > /etc/sysconfig/iptables echo "$0: Done."
Tallensin opettajan sivuilta kopioimani skriptin /etc/firewall.sh nimiseksi tiedostoksi omalle koneelleni ja annoin ko. tiedostolle ajo-oikeudet komennolla:
# chmod u+x /etc/firewall.sh
Jonka jälkeen olikin jo aika testata miten skripti toimii - siispä ajoin skriptin komennolla
# /etc/firewall.sh
Seuraavaksi tarkistin skriptin tekemät muutokset iptables -L komennolla. Tuloksena oli jo hiukan luettavampi tuloste, josta sai paremmin selvää mitä määrityksiä palomuurille oli tehty.
Seuraavaksi piti hiukan tutustua iptables-komennon manuaaliin ja selvittää mitä kukin rivi ajetussa skriptissä tarkoitti ja miksi rivit oli asetettu ylläolevaan järjestykseen. Opettaja kävi asiaa tunnilla jo melkoisen paljon läpi, joten tässä yhteenvetona aluksi perusfaktat IPTABLES-komennosta:
1) IPTABLES oletusketjuja on 3 kappaletta INPUT = sisääntuleva liikenne OUTPUT = ulosmenevä liikenne FORWARD = NAT liikenne, eli eteenpäin ohjattu liikenne 2) sääntölistaa tulkitaan aina ylhäältä alaspäin 3) säännöt ACCEPT - hyväksy läpi muurista - paketin käsittely loppuu tähän DROP - paketti hylätään ilman vastausta - paketin käsittely loppuu tähän LOG - kirjataan lokiin - käsittely jatkuu REJECT - paketti hylätty ja lähettäjälle ilmoitetaan paketin hylkäyksestä - paketin käsittely loppuu tähän 4) miten näitä ketjuja yleensä käytetään FORWARD(DROP) -- oletetaan, että kone ei suorita NAT:ia OUTPUT (ACCEPT) -- ulospäin lähtevä liikenne aina sallittu INPUT (DROP) -- suurin osa säännöistä tulee tänne 5) mallikomento iptables -I INPUT 1 -p tcp --dport ssh -j ACCEPT
Tässä malliskriptimme rivi riviltä selitettynä. Selitykset ovat kommenteissa aina komennon jälkeen.
iptables -P INPUT DROP # ensin määritellään INPUT ketjulle policyksi(-P) DROP sääntö. # Tämä tarkoittaa sitä että jos paketti läpäisee kaikki alla määritellyt # säännöt, tiputetaan paketti lopussa pois Policyn toimesta. # Lisäksi Policyn määrittely heti skriptin alussa pitää huolen siitä, # että kone ei koskaan jää suojattomaan tilaan iptables -P FORWARD DROP # FORWARD ketjulle asetataan policynä DROP sääntö, eli kaikki paketit jotka vaativat # uudelleenohjausta eteenpäin pudotetaan pois. iptables --flush # Flush all rules, but keep policies iptables --delete-chain # poistetaan kaikki (käyttäjän) määritellyt ketjut (ei poista oletusketjuja INPUT, OUTPUT, FORWARD) ## Workstation Minimal firewall ### iptables -P FORWARD DROP # asetetaan FORWARD ketjulle DROP sääntö policy-asetuksena iptables -P INPUT DROP # asetetaan INPUT ketjulle DROP sääntö policy-asetuksena iptables -A INPUT -i lo --source 127.0.0.1 --destination 127.0.0.1 -j ACCEPT # sallitaan localhost liikenne. Määritys on luettavampi kun annetaan sekä source että destination tiedot. iptables -A INPUT -m state --state "ESTABLISHED,RELATED" -j ACCEPT # sallitaan paluuliikkenne iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT # sallitaan icmp-liikenne, tyyppiä destination unreachable iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT # sallitaan icmp-liikenne, tyyppiä time exceeded iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # sallitaan icmp-liikenne, tyyppiä echo request iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT # sallitaan icmp-liikenne, tyyppiä echo-reply # tarkempi selitys icmp tyypeistä löytyy täältä: http://www.networksorcery.com/enp/Protocol.htm ####### HOLES ####### Edit holes below, then run this script again #iptables -A INPUT -p tcp --dport ssh -j ACCEPT # avataan portti 22(ssh) sisääntulevalle liikenteelle #iptables -A INPUT -p tcp --dport http -j ACCEPT # avataan portti 80(http) sisääntulevalle liikenteelle #iptables -A INPUT -p tcp --dport https -j ACCEPT # avataan portti 443 (https) sisääntulevalle liikenteelle ##################### Edit above iptables -A INPUT -j LOG -m limit --limit 40/minute # sisääntulevat paketit, jotka eivät ole tähän mennessä ylläoleviin # sääntöihin "osuneet", logataan, jos niitä tulee enemmän kuin 40kpl/minuutti # -m limit = ladataan moduli, jonka nimi on "limit" ==> mahdollistaa määrä/aika valvonnan iptables -A INPUT -j DROP # dropataan jäljelle jääneet sisääntulevat paketit, joita ei ole käsitelty ylläolevien sääntöjen mukaisesti # Save iptables-save > /etc/sysconfig/iptables # talletetaan iptables-määritykset echo "$0: Done."
Tässä oli siis IPTABLES osuus harjoituksista - seuraavaksi listalla oli nmap.
nmap
nmap-ohjelman kotisivut löytyvät täältä: http://www.insecure.org/. Kyseessä on turvallisuus työkalu, jonka avulla voidaan tutkia onko kohdekoneissa mahdollisesti avoimia portteja sekä joissain tapauksissa tunnistaa kohdekoneen käyttöjärjestelmä.
aloitin ohjelmaan tutustumisen asentamalla sen harjoitustyöasemaani komennolla:
# yum install nmap
Seuraavaksi oli sitten vuorossa eri optioihin tutustuminen, jossa nopeiten pääsi alkuun lukemalla nmap-ohjelman manuaali sivun. Alla on listattuna tyypillisimmät optiot, jotka saa näkyville antamalla komennon nmap ilman parametreja:
[root@localhost ~]# nmap Nmap 3.81 Usage: nmap [Scan Type(s)] [Options]Some Common Scan Types ('*' options require root privileges) * -sS TCP SYN stealth port scan (default if privileged (root)) -sT TCP connect() port scan (default for unprivileged users) * -sU UDP port scan -sP ping scan (Find any reachable machines) * -sF,-sX,-sN Stealth FIN, Xmas, or Null scan (experts only) -sV Version scan probes open ports determining service & app names/versions -sR RPC scan (use with other scan types) Some Common Options (none are required, most can be combined): * -O Use TCP/IP fingerprinting to guess remote operating system -p ports to scan. Example range: 1-1024,1080,6666,31337 -F Only scans ports listed in nmap-services -v Verbose. Its use is recommended. Use twice for greater effect. -P0 Don't ping hosts (needed to scan www.microsoft.com and others) * -Ddecoy_host1,decoy2[,...] Hide scan using many decoys -6 scans via IPv6 rather than IPv4 -T General timing policy -n/-R Never do DNS resolution/Always resolve [default: sometimes resolve] -oN/-oX/-oG Output normal/XML/grepable scan logs to -iL Get targets from file; Use '-' for stdin * -S /-e Specify source address or network interface --interactive Go into interactive mode (then press h for help) Example: nmap -v -sS -O www.my.com 192.168.0.0/16 '192.88-90.*.*' SEE THE MAN PAGE FOR MANY MORE OPTIONS, DESCRIPTIONS, AND EXAMPLES
Pikaohjeen lukemisen jälkeen suoritin komennon ifconfig, jonka tulosteesta tarkistin oman koneeni IP:n, joka oli 172.28.1.129. Ajatuksena oli varmuuden vuoksi skannata omaa konettani, jolloin ainakin teoriassa vältytään turhalta verkkoliikenteeltä asiattomiin paikkoihin... vaikka kyllähän tietysti mieleen tuli, että skannauksen ajaminen omaa kotiserveriä vasten olisi ollut mielenkiintoisempaa hommaa ;)
Seuraavaksi aloin suorittamaan skannauksia eri optioilla. Tuloksena oli tämän näköistä tavaraa...
## SCAN 1 - firewall(iptables) on päällä, eikä salli mitään läpi
[root@localhost ~]# nmap 172.28.1.129 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:08 EET All 1663 scanned ports on 172.28.1.129 are: filtered Nmap finished: 1 IP address (1 host up) scanned in 35.237 seconds
## SCAN 2 - firewall off
[root@localhost ~]# /etc/init.d/iptables stop Flushing firewall rules: [ OK ] Setting chains to policy ACCEPT: filter [ OK ] Unloading iptables modules: [ OK ]
[root@localhost ~]# nmap 172.28.1.129 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:10 EET Interesting ports on 172.28.1.129: (The 1660 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 111/tcp open rpcbind Nmap finished: 1 IP address (1 host up) scanned in 0.266 seconds
## SCAN 3 - firewall off, -P0 optiolla (ei tehdä ping:ä kohdekoneeseen)
[root@localhost ~]# nmap -P0 172.28.1.129 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:11 EET Interesting ports on 172.28.1.129: (The 1660 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 111/tcp open rpcbind Nmap finished: 1 IP address (1 host up) scanned in 0.152 seconds
## SCAN 4 - firewall off, -O optiolla (OS fingerprint)
[root@localhost ~]# nmap -O 172.28.1.129 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:12 EET Interesting ports on 172.28.1.129: (The 1660 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 111/tcp open rpcbind Device type: general purpose Running: Linux 2.4.X|2.5.X|2.6.X OS details: Linux 2.5.25 - 2.6.3 or Gentoo 1.2 Linux 2.4.19 rc1-rc7) Uptime 0.005 days (since Mon Nov 28 19:04:57 2005) Nmap finished: 1 IP address (1 host up) scanned in 2.174 seconds
## SCAN 5 - firewall off, banner grabbing
[root@localhost ~]# nmap -sV 172.28.1.129 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:14 EET Interesting ports on 172.28.1.129: (The 1660 ports scanned but not shown below are in state: closed) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 4.0 (protocol 2.0) 80/tcp open http Apache httpd 2.0.54 ((Fedora)) 111/tcp open rpcbind 2 (rpc #100000) Nmap finished: 1 IP address (1 host up) scanned in 5.421 seconds## SCAN 6 - firewall off, kaikki portit 30000 asti
[root@localhost ~]# nmap -p1-30000 172.28.1.129 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:16 EET Interesting ports on 172.28.1.129: (The 29997 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 111/tcp open rpcbind Nmap finished: 1 IP address (1 host up) scanned in 2.482 seconds
## SCAN 7 - firewall off, kaikki optiot yhtäaikaa
[root@localhost ~]# nmap -P0 -O -sV -p1-30000 172.28.1.129 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:17 EET Interesting ports on 172.28.1.129: (The 29997 ports scanned but not shown below are in state: closed) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 4.0 (protocol 2.0) 80/tcp open http Apache httpd 2.0.54 ((Fedora)) 111/tcp open rpcbind 2 (rpc #100000) Device type: general purpose Running: Linux 2.4.X|2.5.X|2.6.X OS details: Linux 2.5.25 - 2.6.3 or Gentoo 1.2 Linux 2.4.19 rc1-rc7), Linux 2.6.3 - 2.6.8 Uptime 0.009 days (since Mon Nov 28 19:04:57 2005) Nmap finished: 1 IP address (1 host up) scanned in 9.410 seconds
## SCAN 8 - firewall off, muita mielenkiintoisia optioita (-sX = xmas scan)
[root@localhost ~]# nmap -P0 -O -sV -p1-30000 -sX 172.28.1.129 Starting nmap 3.81 ( http://www.insecure.org/nmap/ ) at 2005-11-28 19:18 EET Interesting ports on 172.28.1.129: (The 29997 ports scanned but not shown below are in state: closed) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 4.0 (protocol 2.0) 80/tcp open http Apache httpd 2.0.54 ((Fedora)) 111/tcp open rpcbind 2 (rpc #100000) Device type: general purpose Running: Linux 2.4.X|2.5.X|2.6.X OS details: Linux 2.5.25 - 2.6.3 or Gentoo 1.2 Linux 2.4.19 rc1-rc7), Linux 2.6.3 - 2.6.8 Uptime 0.010 days (since Mon Nov 28 19:04:56 2005) Nmap finished: 1 IP address (1 host up) scanned in 10.599 seconds
Eri parametrien hyödyntäminen skannauksessa tuotti erilaisia tuloksia sekä vaikutti selkeästi skannauksien kestoon. Kannattaa siis tehdä tarkkoja yksittäisiä skannauksia jos haluaa suoriutua skannauksesta nopeasti - jos taas ajalla ei ole väliä, voi optioita latoa melkoisen määrän suoraan yhteenkin komentoon....
John the Ripper
Seuraavaksi tehtävälistalla oli tutustuminen johonkin toiseen tietoturvatyökaluun. Itse päätin demonstroida oivaa heikkojen salasanojen tutkimisohjelmaa nimeltään "John the Ripper". Kyseisellä ohjelmalla voi testata UNIX/Linux ympäristöissä minkätasoisia salasanoja käyttäjät käyttävät. Ohjelman valitsin siksi, että mielestäni heikot salasanat ovat melkoinen uhka hyvääkin tietoturvaa toteuttavassa ympäristössä ja siksi administraattoreiden olisi syytä pitää yllä jonkinlaisia laatustandardeja salasanojen käytössä.
Aloitin testaamisen asentamalla kyseisen ohjelman koneelleni:
[root@localhost ~]# yum install john.i386
Seuraavaksi suoritin pikaisen muistinvirkistyksen ohjelman käytöstä lukaisemalla ohjelman pikahelpin:
[root@localhost ~]# john John the Ripper Version 1.6 Copyright (c) 1996-98 by Solar Designer Usage: john [OPTIONS] [PASSWORD-FILES] -single "single crack" mode -wordfile:FILE -stdin wordlist mode, read words from FILE or stdin -rules enable rules for wordlist mode -incremental[:MODE] incremental mode [using section MODE] -external:MODE external mode or word filter -stdout[:LENGTH] no cracking, just write words to stdout -restore[:FILE] restore an interrupted session [from FILE] -session:FILE set session file name to FILE -status[:FILE] print status of a session [from FILE] -makechars:FILE make a charset, FILE will be overwritten -show show cracked passwords -test perform a benchmark -users:[-]LOGIN|UID[,..] load this (these) user(s) only -groups:[-]GID[,..] load users of this (these) group(s) only -shells:[-]SHELL[,..] load users with this (these) shell(s) only -salts:[-]COUNT load salts with at least COUNT passwords only -format:NAME force ciphertext format NAME (DES/BSDI/MD5/BF/AFS/LM) -savemem:LEVEL enable memory saving, at LEVEL 1..3
Tämän jälkeen ohjelman testaaminen hoitui yksinkertaisesti suorittamalla komento:
[root@localhost ~]# john -single /etc/shadow Loaded 3 passwords with 3 different salts (FreeBSD MD5 [32/32]) vilppi (vilppi) guesses: 1 time: 0:00:00:01 100% c/s: 5219 trying: 999991969
Eli komennon tuloksena oli yhden käyttäjän salasanan selvittäminen, joka hoitui melkoisen nopeasti. Kyseinen tunnus oli SSH-harjoituksen aikana luomani käyttäjätunnus, jonka salasanan laatu tuli todistettua melkoisen huonoksi - tarkistusohjelmahan teki vain yhden arvauksen...
Vitosharjoitus oli näin kokonaisuudessaan suoritettu onnistuneesti ;)
Harjoituksen aiheet olivat tällä kertaa hyvinkin tuttuja, joten varsinaista uutta asiaa ei hirveästi tullut, mutta näiden asioiden läpikäyminen on aina yhtä hauskaa ja hyödyllistä...
iptablesin ominaisuuksiin pitäisi perehtyä vielä hiukan lisää, jotta käyttövarmuutta tulisi lisää. Linuxin palomuuria kun ei kuitenkaan tule säädettyä kovinkaan usein, niin nämä asiat pitää aina kerrata jostain ennenkuin asetuksia uskaltaa lähtee muuttelemaan.
Copyright (c) 2005 Mika Karjalainen. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.