Foro de elhacker.net

Seguridad Informática => Nivel Web => Mensaje iniciado por: WHK en 27 Octubre 2009, 08:03 am



Título: Backdoor nativo en SMF 2.0
Publicado por: WHK en 27 Octubre 2009, 08:03 am
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 (http://code.google.com/p/smf2-review/source/browse/trunk/Sources/Who.php#660) en adelante, ahi se pueden ver una serie de lineas muy encodeadas y ocultas:

Código
  1. function Mascot()
  2. {
  3. global $sourcedir;
  4.  
  5. // Some important quotes.
  6. $O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O = array(
  7. 'Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men.  ~Lord Acton',
  8. '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',
  9. 'Buy old masters. They fetch a better price than old mistresses.  ~William Maxwell Aitken',
  10. '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',
  11. 'I don\'t see the logic of rejecting data just because they seem incredible.  ~Fred Hoyle',
  12. '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',
  13. );
  14.  
  15. 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()),);
  16. $OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo = '335644'; foreach($O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O AS $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo => $q) $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo($q,$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo],$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo});
  17.  
  18. $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo = $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[5] . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[0](2,6) . '_' . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[3]; $O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('ZmV0Y2hfd2ViX2RhdGE=');
  19. require_once($sourcedir . '/Subs-Package.php'); $OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo($O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O($O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));
  20.  
  21. if (1/M_PI_2 == M_2_PI) die($OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0);
  22. }

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

Código
  1. function Mascot()
  2. {
  3. global $sourcedir;
  4.  
  5. // Some important quotes.
  6. $O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O = array(
  7. 'Power tends to corrupt, and absolute power corrupts absolutely. Great men are almost always bad men.  ~Lord Acton',
  8. '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',
  9. 'Buy old masters. They fetch a better price than old mistresses.  ~William Maxwell Aitken',
  10. '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',
  11. 'I don\'t see the logic of rejecting data just because they seem incredible.  ~Fred Hoyle',
  12. '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',
  13. );
  14.  
  15. mt_srand(1104307200);
  16.    $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)))));
  17.    /* Array con una dimensión de 6 variables numéricas
  18.     Array ( [0] => 6 [1] => 2 [2] => 9 [3] => 6 [4] => 10 [5] => 9 )
  19.    
  20.     For con 6 loops, uno para cada variable del array  */
  21.    for($O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo=0,$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo='ywky~{'; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo < 6; $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo++){
  22.     $O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo}) - mt_rand(0,12));
  23.     //echo '$'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o00OoooOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'] = chr(ord($'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'{$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'}) - mt_rand(0,12));<br />';
  24.     $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = chr(ord($O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]) - $O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo]);
  25.     //echo '$'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'] = chr(ord($'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.']) - $'.$O0OoO00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.']);<br /><br />';
  26.    }
  27.    /* Desarrollo:
  28.     $Array[$0] = chr(ord($ywky~{{$0}) - mt_rand(0,12));
  29.     $swky~{[$0] = chr(ord($swky~{[$0]) - $Array[$0]);
  30.  
  31.     $Array[$1] = chr(ord($swky~{{$1}) - mt_rand(0,12));
  32.     $suky~{[$1] = chr(ord($suky~{[$1]) - $Array[$1]);
  33.  
  34.     $Array[$2] = chr(ord($suky~{{$2}) - mt_rand(0,12));
  35.     $suby~{[$2] = chr(ord($suby~{[$2]) - $Array[$2]);
  36.  
  37.     $Array[$3] = chr(ord($suby~{{$3}) - mt_rand(0,12));
  38.     $subs~{[$3] = chr(ord($subs~{[$3]) - $Array[$3]);
  39.  
  40.     $Array[$4] = chr(ord($subs~{{$4}) - mt_rand(0,12));
  41.     $subst{[$4] = chr(ord($subst{[$4]) - $Array[$4]);
  42.  
  43.     $Array[$5] = chr(ord($subst{{$5}) - mt_rand(0,12));
  44.     $substr[$5] = chr(ord($substr[$5]) - $Array[$5]);
  45.    
  46.     Resultado:
  47.     // Array con una dimensión de 6 valores alfanuméricos
  48.     // Array ( [0] => t [1] => t [2] => ` [3] => x [4] => y [5] => o )
  49.     // Resuelto a partir del primer array con citas de personajes */
  50.    $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()),);
  51.    /* Eval para despistar mas un retorno de valor igual a '32' para completar la ecuación aritmética
  52.     Array con una dimensión de 6 valores alfanuméricos
  53.     Array ( [0] => 37 [1] => 3 [2] => 22 [3] => 33 [4] => 35 [5] => 73 ) */
  54. $OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo = '335644';
  55.    /* Constante numérica al igual que el valor '1' en el eval anterior */
  56.    foreach($O000oOOOoOo000ooOOO0OO0o0o0o0oO0OOO0o000O AS $O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo => $q){
  57.     $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo] = $O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo($q,$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O[$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo],$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo{$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo});
  58.     //echo '$'.$Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'] = $'.$O0oOo00oOOo0OOo00O000oooOo00oOO0o0oOoooOo.'($'.$q.',$'.$OoooOOOo000o0Ooo0o00OOoOoOo0o0ooooO0oO00O.'[$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'],$'.$OOoOo0oO0o0OOooO0O0000O0000O00O0OOo0OOOOo.'{$'.$O0Ooo00Ooo0OOOOOoo0oOO000o000o00oo0OOOoOo.'})<br />';
  59.    }
  60.    /*
  61.      Procesa la leyenda de arriba sustrayendo carácteres posicionados en cada variable de la
  62.      dimensión del array anterior:
  63.      $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})
  64.      $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})
  65.      $Array[$2] = $substr($Buy old masters. They fetch a better price than old mistresses. ~William Maxwell Aitken,$Array[$2],$335644{$2})
  66.      $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})
  67.      $Array[$4] = $substr($I don't see the logic of rejecting data just because they seem incredible. ~Fred Hoyle,$Array[$4],$335644{$4})
  68.      $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})
  69.      
  70.      Resultado:
  71.      un array con una dimensión de 6 variables:
  72.      Array ( [0] => pow [1] => web [2] => fetch [3] => decode [4] => data [5] => base )
  73.     */
  74.    // print_r($Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO);
  75. $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo = $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[5] . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[0](2,6) . '_' . $Oo0O0oooOOO0oOO00O0ooooO0OOO0OOO0O0oooOOO[3];
  76.    /* Devuelve el string 'base64_decode' desde dos strings diferentes concatenado por un '_' que es la palabra 'base64' y 'decode' */
  77.    $O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('ZmV0Y2hfd2ViX2RhdGE=');
  78.    /* Devuelve el string 'fetch_web_data' */
  79. require_once($sourcedir . '/Subs-Package.php');
  80.    /* Incluye el subs con la función fetch_web_data para poder obtener el contenido externo */
  81.    $OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo($O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O($O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));
  82.    //echo '$OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0 = $'.$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo.'($'.$O0o0oO0ooOOoOoO0ooO0oOo0O0OOO00OOoo00oo0O.'($'.$O0O000o0Oo00oOoOo0ooO00oOO00Ooo0O00oO0Ooo.'(\'aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==\')));';
  83.    /* Resolución:
  84.     $str = $base64_decode($fetch_web_data($base64_decode('aHR0cDovL3d3dy5zaW1wbGVtYWNoaW5lcy5vcmcvc21mL2xhdGVzdC1sYXVnaC5qcw==')));
  85.     Hace la petición a http://www.simplemachines.org/smf/latest-laugh.js y obtiene su contenido */
  86. if (1/M_PI_2 == M_2_PI){
  87.    /* Verificación redundante:
  88.     1/1.5707963267949 == 0.63661977236758
  89.    
  90.     Termina el script mostrando únicamente el contenido obtenido sin procesar el resto del script del foro
  91.     */
  92.     die($OooOoooo0OO00O0o0ooOO0o0OOoOoOoo0O000O0o0);
  93.    }
  94. }

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
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml"><head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  4. <title>My name is Earl</title>
  5. </head>
  6. <h1>Watch out!  He's a killer!</h1>
  7. <img src="http://www.simplemachines.org/smf/images/earl.jpg" alt="Big giant teeth!" />
  8. </body>
  9. </html>

(http://www.webcomparte.com/archivos_publicos/imagenes/bugs/mascota_smf.png)

 :xD que cosas jajaja

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


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: sirdarckcat en 28 Octubre 2009, 05:57 am
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).
Código:
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).
Código:
// 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:

Citar
Hi 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!!


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: YST en 28 Octubre 2009, 06:59 am
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


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Krackwar ™ en 28 Octubre 2009, 07:07 am
Yo en lo personal no confío mas en SMF, al parecer phpbb3 es mejor sistema y puede ser una opcion para migrar


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: 6666 en 28 Octubre 2009, 07:10 am
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.


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Littlehorse en 28 Octubre 2009, 07:13 am
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


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: lotux en 28 Octubre 2009, 15:12 pm
nice work!


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Jubjub en 28 Octubre 2009, 15:30 pm
Legendario ;-)

Habria que contactar con los desarrolladores, a ver que dicen de esto :D


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Novlucker en 28 Octubre 2009, 15:44 pm
Ya se hizo .. que crees que hay después de esto? XD

Citar
Al 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


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Jubjub en 28 Octubre 2009, 16:19 pm
Tengo que aprender a leer mas pacientemente :laugh:


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: :ohk<any> en 28 Octubre 2009, 17:00 pm
Buen trabajo.!


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Debci en 28 Octubre 2009, 17:20 pm
Bestial...
Madre mia....

Saludos


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: shimpei en 29 Octubre 2009, 16:08 pm
no falta nada aca?  :-X


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: el-brujo en 29 Octubre 2009, 16:47 pm
esto al final va a ser el Month of the SMF Bug's, MOSB xD


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: jdc en 29 Octubre 2009, 19:03 pm
esto al final va a ser el Month of the SMF Bug's, MOSB xD

Pero si no es un bug :¬¬ si lees los mensajes que desaparecieron con magia (como va a desaparecer este) veas qe es solo la mascota de SMF...


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: WHK en 29 Octubre 2009, 20:35 pm
esto al final va a ser el Month of the SMF Bug's, MOSB xD

Pero si no es un bug :¬¬ si lees los mensajes que desaparecieron con magia (como va a desaparecer este) veas qe es solo la mascota de SMF...

El post se dividió en dos, uno con el backdoor y otro con los huevos de pascua porque son dos cosas diferentes


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: jdc en 29 Octubre 2009, 20:46 pm
Pero entonces sigue siendo malo? que podria hacer SMF con esto?solo tiene control sobre la imagen no? por lo que entiendo o me imagino esta cifrado solo para evitar que lo quiten tan facil xDDD


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Festor en 29 Octubre 2009, 20:53 pm
Pero entonces sigue siendo malo? que podria hacer SMF con esto?solo tiene control sobre la imagen no? por lo que entiendo o me imagino esta cifrado solo para evitar que lo quiten tan facil xDDD

Ya lo han explicado: http://foro.elhacker.net/nivel_web/backdoor_nativo_en_smf_20-t272107.0.html;msg1335956#msg1335956


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: shimpei en 30 Octubre 2009, 04:42 am
janito24 con casi 1500 mensajes no sos capaz de leer un hilo entero? digo porque esta explicado todo en el 2 post, nisiquiera teneias que leer mucho el hilo  ;D


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: jdc en 30 Octubre 2009, 05:06 am
Lo volví a leer pero me enredo el tema del huevo de pascua... Use SMF mucho tiempo y la verdad es que que tengas las noticias en tú panel de administración o que te avisé que hay una actualización disponible ya te da para pensar que existe alguna forma de que los señores de simplemachines tienen acceso a tú foro... Además por ahí en la instalación pregunta sí quieres colaborar con las estadísticas de ellos, aunque una página estática simple se pueda usar para el mal como menciona SDC


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: sirdarckcat en 30 Octubre 2009, 05:50 am
creo que no entiendes la diferencia entre vulnerabilidad y backdoor. backdoor es una vulnerabilidad que fue puesta aproposito.. yo ya explique la vulnerabilidad, y fue puesta (y escondida) aproposito..

el acceso que se tiene por las "noticias" es muy disinto a este.. las "noticias" no pueden resetear el mt_rand, ni usar tu foro como proxy ademas de que no estan escondidas y son configurables (y las puedes desactivar facilmente).

saludos


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: invisible_hack en 30 Octubre 2009, 16:46 pm
Sinceramente creo que después de esto, en cuanto esta noticia comience a divulgarse, la creación de foros en SMF va a descender bastante, no creo que a nadie le de gusto saber que los de SMF ocultaban todo esto bajo la manga, y que se les están empezando a ver los cuernos de diablos... :P

Hace tiempo un amigo me dijo que como los Phpbb no hay nada, y con este post creo que se confirma que el chaval tenía razón... :rolleyes:

Y ahora la pregunta del millón...¿significará esto que, en un futuro quizás no muy lejano, Elhacker.net se convierta en un PhpBB?  :o :o :P

Un saludo.


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Festor en 30 Octubre 2009, 17:07 pm
Y ahora la pregunta del millón...¿significará esto que, en un futuro quizás no muy lejano, Elhacker.net se convierta en un PhpBB?  :o :o :P

Yo soy bastante nuevo aquí por lo que pregunto... ¿este foro siempre usó el software SMF?


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Novlucker en 30 Octubre 2009, 17:48 pm
Citar
Y ahora la pregunta del millón...¿significará esto que, en un futuro quizás no muy lejano, Elhacker.net se convierta en un PhpBB? (https://foro.elhacker.net/Smileys/cowboy/shocked.gif) (https://foro.elhacker.net/Smileys/cowboy/shocked.gif) (https://foro.elhacker.net/Smileys/cowboy/tongue.gif)
Vaya a saber, por lo pronto se piensa migrar a SMF 2.0, además de que como se ha dicho muchas veces el SMF del foro es revisado antes de ser instalado, tal y como se esta haciendo ahora con esta nueva versión  :P

Citar
Yo soy bastante nuevo aquí por lo que pregunto... ¿este foro siempre usó el software SMF?
No siempre ... http://foro.elhacker.net/empty-t252193.0.html  :P

Saludos


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: WHK en 30 Octubre 2009, 18:56 pm
Antiguamente se utilizaba un foro de melodysoft, despues se pasó a un servidor propio con e sistema Yabsee que era una version mas antigua de SMF y despues a smf. Las auditorias apuntan para hacer de smf un sistema mas seguro y poder utilizarlo de buena forma.


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: sirdarckcat en 31 Octubre 2009, 07:59 am
seh, no hay planes de pasarnos a phpbb xDD

supongo lo unico que nos haria cambiarnos de smf es uno hecho por nosotros.. pero no por lo pronto.. el foro es bastante grande =/


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: el-brujo en 1 Noviembre 2009, 23:11 pm
Antiguamente se utilizaba un foro de melodysoft, despues se pasó a un servidor propio con e sistema Yabsee que era una version mas antigua de SMF y despues a smf. Las auditorias apuntan para hacer de smf un sistema mas seguro y poder utilizarlo de buena forma.

Melodysoft

(http://img13.imageshack.us/img13/6733/ehnet.png)


(no era un foro, era un tablón de anuncios cutre)

 XMB Forums

http://web.archive.org/web/20020203122904/http://foro.elhacker.net/

Yabb SE y todas sus transformaciones hasta SMF


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: shimpei en 1 Noviembre 2009, 23:52 pm
bueno por lo menos hicieron el intento de ocultarlo, mas grosero seria que la function se llama backdoor no?  ;D


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: peib0l en 5 Noviembre 2009, 22:52 pm
y no creeis que esta un poco rebuscado? osea yo creo uqe los programadores cometieron el error no a proposito, como puede errar cualquier persona


Título: Re: Backdoor nativo en SMF 2.0
Publicado por: sirdarckcat en 6 Noviembre 2009, 06:03 am
Shell-killer, como he dicho:
Citar
pero en cualquier caso esta mi opinion, y ahora esta en ustedes decidir si fue un error involuntario o no..



Título: Re: Backdoor nativo en SMF 2.0
Publicado por: Skeletron en 8 Noviembre 2009, 23:03 pm
Amo éstos chicos..
Genios..