Hlavní navigace

Návod: zabezpečení děravého AirOS bez upgrade firmware

Martin Kratochvíl 17. 6. 2016

Jak zabezpečit Ubnt verze 5.5.x a 5.6.x, které jsou děravé a napadnutelné virem motherfucker, moth3r či čímkoliv jiným? Přinášíme podrobný návod, jak zalepit děravá zařízení.

Jak zabezpečit Ubnt verze 5.5.x a 5.6.x, které jsou děravé a napadnutelné virem motherfuckerem, moth3r či čímkoliv jiným díky zranitelnosti popsané v Exploit DB.

V čem spočívá problém?

Webový server používá php2 a nekontroluje přihlášení, když přijme soubor a rovnou jej zapíše kamkoliv do filesystému tak, jak je definováno v hlavičce http požadavku. Navíc v systému AirOS nejsou řešeny uživatelské role na úrovni filesystému, tudíž webserver běží s plnými právy a s přístupem kamkoliv.

Řešení je nahradit děravou verzi webserveru neděravou. Respektive, ve webserveru (lighttpd) chyba není. Chyba je v php2, ten je zkompilován v souboru /bin/cgi. To jsem zjistil experimentálně. Neděravou verzi najdeme ve verzích firmware 5.6.3 a vyšší.

Postup řešení

  • Najdu nezranitelnou binárku /bin/cgi (v ubnt fw 5.6.3 či vyšší).
  • Binárku musím dostat do starého ubnt. Pokud chci, aby byla dostupná i po rebootu, musím použít /etc/persistent, tam se však nevejde. V běhu ji tam nahrajete díky RAM (tmpfs), ale nezapíšete ji na flashku. Je moc velká. Můžeme ji však zkomprimovat, a pak se tam už vejde.
  • Zajistíme, aby se binárka po startu rozbalila, třeba do  /tmp.
  • Pak je třeba upravit konfiguraci webserveru lighttpd, aby volal naši novou binárku pro cgi, ta je však v /usr/etc/lighttpd/lighttpd.conf, který není možné měnit (readonly filesystem), takže si jej zkopírujeme třeba do /tmp a tam jej upravíme.
  • Upravíme také /etc/lighttpd.conf, aby neincludoval soubor z /usr/etc, ale z  /tmp.
  • Zajistíme restart webserveru.

Výsledek? Máte zabezpečené zařízení!

Abyste postup nemuseli vymýšlet, můžete si rovnou stáhnout soubor shield.tgz (klidně si jej vytvořte dle postupu sami). V souboru jecgi  – binárka z fw 5.6.3 (je jedno, jestli XW nebo XM, jsou stejné). Také je tam „instalační a spouštěcí“ skript shield .

Pro prvotní instalaci stačí nahrát shield.tgz do /etc/persistent a spustit.

tar -xzf shield.tgz shield ; ./shield

Co vlastně obsahuje soubor shield? – Funguje na základě výše popsaného řešení, doplnil jsem jej o komentář, pro vyšší přehlednost.

#!/bin/sh

per=/etc/persistent

if [ -e $per/shield.tgz ] ; then

 #kontrola zda mam v rc.poststart co mam mit a pokud ne, tak to zapisu
 #tohle se bude dit jenom jednou
 grep "shield.tgz" $per/rc.poststart 2>/dev/null >/dev/null || \
    echo "cd $per ; tar -xzf shield.tgz shield ; ./shield" >> $per/rc.poststart && cfgmtd -p /etc/ -w

 if [ ! -e /tmp/cgi ] ; then
   #nemam li novy cgi soubor ktery neni deravy, rozbalit si jej
   #    zde muzete byt kreativni a pripadne si jej stahnout z webu, ale bylo by to po kazdem rebootu...
   cd /tmp
   #vyextraktuj cgi soubor
   tar -xzf $per/shield.tgz cgi
 fi

 #zkopiruj default konfigurak ktery nelze upravit, je readonly
 cp /usr/etc/lighttpd/lighttpd.conf /tmp/lighttpd.conf

 #uprav konfigurak v /tmp kteri pousti cgi aby pustil bezpecne cgi
 sed -i 's:/bin/cgi:/tmp/cgi:g' /tmp/lighttpd.conf

 #uprav konfigurak v /etc/ aby neincludoval /usr... ale /tmp...
 sed -i 's:/usr/etc/lighttpd/lighttpd.conf:/tmp/lighttpd.conf:g' /etc/lighttpd.conf

 #reloaduj lighttpd, tim ze ho sestrelis, ubnt si jej nahodi
 pkill lighttpd

 echo "web server zabezpecen"

else
  echo "chyba: nemas nahrany shield.tgz v systemu"
fi

Nedostatky?

Je možné, že novější binárka způsobí nějakou nefunkčnost ve webovém rozhraní pro určité funkce, ale při zběžné kontrole jsem na nic nenarazil.

Doufám, že toto řešení pomůže všem, kteří z různých důvodů nemohou či nechtějí upgradovat firmware na nejnovější.

Našli jste v článku chybu?

18. 6. 2016 11:01

Lol Phirae (neregistrovaný)

Kristova noho. Ne, firewall opravdu nestačí, protože ti to naboří někdo zevnitř sítě. Jinak za nápad, že tam dáme PHP 2.0.1, bych dotyčného debila vystřelil na Mars.

18. 6. 2016 15:41

Unknown (neregistrovaný)

"Spravny postup: Flashnout OpenWRT!"

A prijit tim o moznosti TDMA, centralizovane spravy, atd... Opravdu "spravny" postup ;-))
Zamyslete se proc UBNT investovalo do HW locku (FW rozezna origos UBNT HW od generickeho) a dojde Vam ze spousta lidi by spis rada udelala pravy opak.


Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi