Si effectivement il manque bien la logique pour lancer un sshd ou telnetd, alors il faut peut-être chercher un system() ou autre à exploiter.
Pour exemple dans les libs chargées par mini_httpd, il y a :
- /usr/lib/libutility.so : system et popen
- SYSTEM(const char *format, ...) => system("formatted")
- STD_SYSTEM => comme SYSTEM
- FAST_SYSTEM(bool run_in_background, int unused, const char *format) => system("formatted") ou system("formatted &") si run_in_background
- myPipe(const char *command, char **output) => popen(command, "r")
- get_numeric_by_cmd(const char *command, const char *prefix_to_search) => myPipe(command, &output)
- /usr/lib/libslog.so :
- (pas de référence ?) => app_log_management_init(a, b, name) => "/bin/mkdir /debug/%s" avec name
- log_log => "/bin/cat %s > %s" sur la rotation des logs, mais les noms /debug/%s/file1 et /debug/%s/file2 viennent de app_log_management_init
Je n'ai pas encore regardé les libs en dépendance des cgi, mais déjà là je vois que :
- mini_httpd appelle SYSTEM() :
- sur un login réussi (je ne sais pas quelle requête) => snprintf(buffer, 0x7f, "/bin/mkdir -p %s","/tmp/dt_login_flag")
- sur login/index.html (GET ?) => snprintf(buffer, 0x7f, "/bin/rm -rf %s", "/tmp/dt_login_flag")
- download.cgi appelle system() et SYSTEM()
- sprintf(buffer, "%s all > %s","/usr/sbin/chip_info_dump","/tmp/debug_ddb")
- SYSTEM("/bin/touch /tmp/%s", "gpon_ddb.log") ou SYSTEM("/bin/touch /tmp/%s", "gpon_debug.log")
- SYSTEM("/bin/tar -cvf %s %s", "/tmp/event_monitorlog.tar", "/tmp/monitor_log/")
- SYSTEM("/bin/cat %s %s %s %s > %s", "/var/voice/voip.conf", "/var/voice/cgi_cli_data", "/var/voice/sip.log", "/var/voice/voice.log", "/tmp/voip_diagnose_info.txt")
- SYSTEM("/bin/tar -cvf %s %s %s", "/tmp/voip_diagnose_info.tar", "/tmp/*.pcm", "/tmp/voip_diagnose_info.txt")
- SYSTEM("/bin/rm %s", "/tmp/*.pcm");
- upload.cgi appelle system(), SYSTEM() :
- system("echo 3 > /proc/sys/vm/drop_caches")
- snprintf(buffer, 0x100, "/usr/sbin/fw_ctl -u -d -C -A %s","/var/gpon.img");
- SYSTEM("/usr/bin/ubus call smd notify \'{\"notify_id\":%d, \"notify_type\":true}\' &", 1)
- setup.cgi appelle system(), popen(), SYSTEM() et myPipe()
- popen("/usr/sbin/ip route list table main") et "/usr/sbin/ip route list table %d"
- myPipe("/bin/cat /proc/sys/net/nf_conntrack_max", &buffer)
- myPipe("/bin/cat /proc/sys/net/netfilter/nf_conntrack_count", buffer)
- snprintf(buffer, 0x32, "\"/usr/sbin/ dhcp6c start %d renew\"", iVar2) (
)
- sur un paramètre "byby", snprintf(buffer, 0x7f, "/bin/rm -rf %s", "/tmp/dt_login_flag")
- snprintf(buffer, 0x7f, "/bin/mkdir %s", "/tmp/dt_firmware_update_flag")
- snprintf(buffer, 0x7f, "/bin/rm -rf %s", "/tmp/dt_firmware_update_flag")
- snprintf(buffer, 0x7f, "/bin/mkdir %s", "/tmp/dt_restart_flag")
- SYSTEM("/usr/bin/ubus call smd notify \'{\"notify_id\":%d, \"notify_type\":false}\'", 1);
- snprintf(buffer, 0x7f,"/bin/mkdir %s", "/tmp/dt_reset_flag")
- SYSTEM("/usr/bin/ubus call smd notify \'{\"notify_id\":%d, \"notify_type\":true, \"args\":{\"owner\":%d, \"group\":\"admin\"}}\' &", 2)
- snprintf(buffer, 0x7f, "/bin/rm -rf %s", "/tmp/dt_firmware_update_flag")
- snprintf(buffer, 0x7f, "/bin/mkdir %s", "/tmp/gui_update_success_flag")
- SYSTEM("/usr/bin/ubus call smd notify \'{\"notify_id\":%d, \"notify_type\":true, \"args\":{\"owner\":%d, \"group\":\"%s\"}}\' &", 2, 2, group); => group semble déterminé à partir de getenv("REMOTE_USER"), ou être NULL (!)
- SYSTEM("/usr/bin/ubus call smd notify \'{\"notify_id\":%d, \"notify_type\":true}\' &", 1)
- snprintf(buffer, 100, "/usr/sbin/umci_ctl -f %s stack get version", "/tmp/tmp_omci_version")
- SYSTEM("/usr/bin/ubus call smd notify \'{\"notify_id\":%d, \"notify_type\":false}\'", 1)
- SYSTEM("hal_optical_ctl set_power 0;sleep 3;hal_optical_ctl set_power 1 &")
- SYSTEM("/usr/sbin/umci_ctl misc save vlan")
- SYSTEM("/bin/ls -l %s | /bin/grep ^-|/bin/wc -l > %s", "/tmp/monitor_log/", "/tmp/monitor_total_log_num.txt")
- SYSTEM("/bin/du -sh %s > %s", "/tmp/monitor_log/", "/tmp/monitor_total_log_size.txt")
- SYSTEM("/bin/tar -cvf %s %s", "/tmp/crash_log.tar", "/tmp/sys_monitor/flash/system_crash_log/")
- SYSTEM("/bin/tar -cvf %s %s", "/tmp/app_log.tar", files), où files est la concaténation des "/tmp/sys_monitor/flash/application_log/%s ", quand la fonction est appelée avec quelque chose comme "name1|name2|name3"
- SYSTEM("/bin/rm -rf %s", files), où files est la concaténation des "/tmp/sys_monitor/flash/application_log/%s ", quand la fonction est appelée avec quelque chose comme "name1|name2|name3"
Pour l'instant, seuls les deux derniers pourraient être intéressants a priori, s'il y a moyen de passer des ";command", "&&command", "||command", "$(command)", "&command" dans le paramètre.