В прошивке AsusWRT, используемой в роутерах ASUS, найдены уязвимости, позволяющие произвести атаку remote code execution, если злоумышленник находится в одной локальной сети с роутером. Уязвимости обнаружены исследователем Pedro Ribeiro ([email protected]) и опубликованы на GitHub.
HTTP server authentication bypass
Первая уязвимость состоит в том, что несмотря на отрицательную проверку аутентификации, обработка POST запроса продолжается.
handle_request(void)
{
...
handler->auth(auth_userid, auth_passwd, auth_realm);
auth_result = auth_check(auth_realm, authorization, url, file, cookies, fromapp);
if (auth_result != 0) // auth fails
{
if(strcasecmp(method, "post") == 0){
if (handler->input) {
handler->input(file, conn_fp, cl, boundary); // but POST request is still processed
}
send_login_page(fromapp, auth_result, NULL, NULL, 0);
}
//if(!fromapp) http_logout(login_ip_tmp, cookies);
return;
}
...
}
В данном куске кода результат работы функции auth_check
означает, авторизованный ли это запрос(0
) или нет (любое другое не нулевое значение, означающим, что не так пошло во время проверки аутентификации). Однако в случае ошибки аутентификации вместо отклонения запроса происходит другая проверка на то, что запрос POST и если он POST, то запрос выполнятся.
Unauthorised configuration change (NVRAM value setting)
Используя предыдущую уязвимость, возможно вызвать функцию do_vpnupload_post
, которая позволяет устанавливать NVRAM переменные. В NVRAM переменных хранятся данные, необходимые для работы прошивки, в том числе и пароль админа. Наипростейший способ использовать данную уязвимость-установить новый пароль для админа и открыть SSH. Однако такую атаку легко обнаружить, по-этому есть другой способ атаки. Необходимо установить переменную NVRAM ateCommand_flag
в 1
, после чего демон infosvr
, который открывает UDP порт на 9999
, начинает исполнять команды, переданные в пакете, от пользователя root
. Структура пакета приведена ниже:
- Header
typedef struct iboxPKTEx
{
BYTE ServiceID;
BYTE PacketType;
WORD OpCode;
DWORD Info; // Or Transaction ID
BYTE MacAddress[6];
BYTE Password[32]; //NULL terminated string, string length:1~31, cannot be NULL string
} ibox_comm_pkt_hdr_ex;
- Body
typedef struct iboxPKTCmd
{
WORD len;
BYTE cmd[420]; <--- command goes here
} PKT_SYSCMD; // total 422 bytes
Также доступен эксплоит для Metasploit