Šokdinam SAMBA
Tomas Lažauninkas, 2010-02-08 09:43:58

Prieš kelias dienas viešuose pažeidžiamumų sąrašuose pasirodė pranešimas apie nauja 0day SAMBA serverio programinės įrangos pažeidžiamumą.  Nepaisant to, kad pats pažeidžiamumas yra elementarus ir lengvai išnaudojamas, jis yra pakankamai pavojingas.

Kaip žinoma, daugelis failinių sistemų turi galimybę kurti simbolines nuorodas (ang. symlink). SAMBA tarnyba turi atitinkamas funkcijas darbui su jomis. Šioje programinės įrangos funkcijoje ir buvo aptiktas pažeidžiamumas leidžiantis mums  išeiti už padalinto resurso šakninės direktorijos ribų. Viskas, ką reikia padaryti norint išnaudoti šį pažeidžiamumą, tai susikurti simbolinę nuorodą  vedančią  į aukščiau ( žemiau?) esančias direktorijas:

symlink ../../../../../../../../../../ own

Tiesa, atliekant tai su standartiniu SAMBA klientu „smbclient“  mums nepavyks to padaryti, nes yra tikrinama, ar simbolinė nuoroda veda už šakninės direktorijos ribų. Tačiau tikrinimas yra atliekamas vartotojo pusėje, tai yra, pačiame  SAMBA kliento kode.

Saugumo tyrinėtojas „Kingcope“ atradęs šį pažeidžiamumą pademonstravo ir kaip reiktų pataisyti „smbclient“ kodą, leidžiantį simbolinės nuorodos pagalba gauti priėjimą prie failinės sistemos. „client.c“ išeities kode funkcijoje „cmd_symlink(void)“ užtenka pašalinti pora eilučių kodo:

static int cmd_symlink(void)
{
<...>
oldname = talloc_asprintf(ctx,
        "%s%s",                                   // pašalinam vieną „%s“
        client_get_cur_dir(),                 // pašalinam „client_get_cur_dir(),“
        buf);
 
if (!oldname) {
return 1;
        }

newname = talloc_asprintf(ctx,
        "%s%s",                                   // pašalinam vieną „%s“
        client_get_cur_dir(),                 // pašalinam „client_get_cur_dir(),“
        buf2);

if (!newname) {
return 1;
        }

if (!cli_resolve_path(ctx, "", auth_info, cli, oldname, &targetcli, &targetname)) {
        d_printf("link %s: %s\n", oldname, cli_errstr(cli));
        return 1;
        }

if (!SERVER_HAS_UNIX_CIFS(targetcli)) {
        d_printf("Server doesn't support UNIX CIFS calls.\n");
        return 1;
        }

if (!cli_unix_symlink(targetcli, targetname, newname)) {
        d_printf("%s symlinking files (%s -> %s)\n",
        cli_errstr(targetcli), newname, targetname);
        return 1;
        }

Kode yra paprasčiausiai pašalinami kintamiesiems „oldname“ ir „newname“ perduodami parametrai, tiksliau pašalinama funkcijos  „client_get_cur_dir()“ reikšmė (darbinė direktorija). Vėliau šių kintamųjų reikšmės perduodamos simbolinės nuorodos sukūrimo funkcijai „cli_unix_symlink()“, kuri, nežinodama padalinto resurso šakninės direktorijos, sukuria simbolinę nuorodą nukreiptą ir už šakninės direktorijos ribų, leidžiant vartotojui prieiti prie serverio failinės sistemos.

Kas nenori taisyti jokių C išeities tekstų, gali pasinaudoti jau yra išleistu Metasploit moduliu, skirtu išnaudoti šį pažeidžiamumą. Pažeidžiamumo išnaudojimui reikės SAMBA vartotojo prisijungimo duomenų arba visiems prieinamo padalinto resurso su rašymo teisėmis.

Išnaudojame pažeidžiamumą su Metasploit.

smb_sploit.png

Gauname priėjimą prie serverio failinės sistemos.

share.png
 
SAMBA kūrėjai greitai sureagavo  į pažeidžiamumo pranešimą ir pareiškė, jog jiems žinoma, kad galima kurti simbolines nuorodas vedančias už padalinto resurso šakininės direktorijos ribų bei, kad tai yra administratoriams naudinga funkcija nustatoma konfigūracijoje. Šiam pažeidžiamumui pataisymas nebus išleistas, o apsisaugoti galima SAMBA serverio konfigūraciniame faile nurodžius opciją „wide links = no“.


Komentarai

Vardas:
Komentaras:

Copyright © 2005 - 2010, UAB „Critical Security“