翻译:AT&T U-Verse VAP2500电视盒子漏洞挖掘

杀戮 (有事请 at 大号园长) | 2014-11-26 12:19

你可能已经听说,(我觉得没有) AT&T 有一个无线电视机顶盒会提供U-verse上网业务和视频服务,现在我的电视需要连上互联网了,我感觉好不安,OK,前文的扯淡没了。

vap2500_login.png

一开始我进行了一些端口扫描,发现了一个Web服务和SOAP服务,现在让我们先专注于Web端,我访问了一下Web端,显示出了上面那个登陆界面,看起来似乎很麻烦的样子,因为我们没有证书,所以接下来所有企图访问的页面都会跳会到这,除非你成功的用密码登陆了。 (不是我废话多………里面就这么写的)

接下来我进行了大量的检查,然后发现了第一个漏洞,Web目录的根目录下面有一个叫admin.conf的纯文本文件,里面有密码一样的东西。(…………..)

ATTadmin,1b12957d189cde9cda68e1587c6cfbdd,0

super,71a5ea180dcd392aabe93f11237ba8a9,0

接下来我们看看漏洞是怎么出现的。

<?php

if (isset($_POST['user']) && isset($_POST['pwd']))

{

  $user=$_POST['user'];

  $pwd=md5(trim($_POST['pwd']));

  $flag=0;

  $file_path = trim(shell_exec("call_qcsapi get_file_path security"));

  $file_path = $file_path."admin.conf";

  $fp = fopen($file_path, 'r');

  while(!feof($fp))

  {      

    $buffer = stream_get_line($fp, 100, "\n");

    $arraylist=split(',',$buffer);

    if($arraylist[0]==$user && $arraylist[1]==$pwd)

    {

      $flag=1;

      break;

    }

  }

  fclose($fp);

  if ($flag==1)

  {

    echo "<script language='javascript'>createCookie(\"p\", \"".md5($user)."\", 2);</script>";

    echo "<script language='javascript'>location.href='status_device.php'</script>";

  }

  else

    {echo "<script language='javascript'>alert(\"Login Failed\")</script>";}

}

?>

就是会根据提交的用户名密码 和 admin.conf匹配,匹配后,会设置cookie值然后进行内部重定向,我的黑客直觉告诉我他代码写的这么难看肯定有漏洞。

事实证明了我直觉,他把用户名的md5作为cookie值 P,事实上密码压根就没啥用,而且用户还改不了用户名,用户名是被写死在代码里的。 (…………….就是这么一回事吧)

if (isset($_COOKIE['p']))

{  

  // Start Moto Customized Passwd

  if($_COOKIE['p']==md5("ATTadmin"))

  {$priority=0;}

  else

  if($_COOKIE['p']==md5("super"))

  {$priority=0;}

  // End Moto Customized Passwd

  else

  {

    echo "<script language='javascript'>location.href='login.php'</script>";

    return;

  }

}

else

{

  echo "<script language='javascript'>location.href='login.php'</script>";

  return;

}

接下来我的直觉引领我走向第三个漏洞,他有一个叫tools_command.php的页面,被设计来执行命令的。有两个POST参数, cmb_header,txt_command,你可以构造这样的参数 cmb_header=&txt_command=whoami ,然后命令会被传递给shell_exec() ,然后系统会兴高采烈的告诉你它是个root。

作者提供了个ruby的POC http://goto.fail/projects/vap2500_root.rb

原文: http://goto.fail/blog/2014/11/25/at-and-t-u-verse-vap2500-the-passwords-they-do-nothing/