Cześć,
Może kogoś to zainteresuje: iot-vul/README.md at efe24fd88d7f594cdd2f714d3f0741f939924d70 · fxc233/iot-vul · GitHub
Sprawdziłem na CP7 z najnowszym firmware i bez problemu można uzyskać telnet. Hash właśnie leci i się “łamie” więc niedługo pewnie jakiś update z oficjalnym hasłem do roota. W telnecie jest dostępnych dużo skryptów, m. in. idump.sh
, który służy do zrobienia dumpu całego systemu i wszystkich partycji (opcjonalnie na kartę sd - zaraz będę robił, tak na wszelki wypadek). Dalsza analiza w trakcie - jak ktoś chce się pobawić i podzielić odkryciami to zapraszam
Sposoby na update:
- z palca przez telnet
- z karty SD
- ota przez aplikacje (prawdopodobnie tftp?)
- tftp
Telnet - port 23:
Shadow: root:7h2yflPlPVV5.:0:0:root:/root:/bin/sh
Login: root
Hasło: tdrootfs
uname -a
Linux (none) 4.9.129 2022-08-18 11:50:53 armv6l
mount
rootfs on / type rootfs (rw,size=16212k,nr_inodes=4053)
proc on /proc type proc (rw,relatime)
none on /sys type sysfs (rw,relatime)
ramfs on /home type ramfs (rw,relatime)
udev on /dev type tmpfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000)
/dev/mtdblock5 on /app type squashfs (ro,relatime)
/dev/mtdblock4 on /app/userdata type jffs2 (rw,relatime)
/dev/mmcblk0p1 on /mnt/sd type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
Porty
netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6688 0.0.0.0:* LISTEN 564/apollo
tcp 0 0 0.0.0.0:8554 0.0.0.0:* LISTEN 564/apollo
tcp 0 0 0.0.0.0:843 0.0.0.0:* LISTEN 584/noodles
tcp 0 0 0.0.0.0:9876 0.0.0.0:* LISTEN 564/apollo
tcp 0 0 0.0.0.0:1300 0.0.0.0:* LISTEN 584/noodles
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 585/inetd
tcp 0 0 0.0.0.0:8699 0.0.0.0:* LISTEN 564/apollo
udp 0 0 0.0.0.0:5683 0.0.0.0:* 564/apollo
udp 0 0 0.0.0.0:3702 0.0.0.0:* 564/apollo
udp 0 0 0.0.0.0:5012 0.0.0.0:* 584/noodles
udp 0 0 0.0.0.0:19966 0.0.0.0:* 564/apollo
Proces apollo
to główna aplikacja odpowiadająca za komunikację z chmurą. Można ją spokojnie wyłączyć poprzez skrypt kill_app.sh
. Aplikacja noodles
służy do komunikacji z GPIO. Obie są spakowane przy pomocy upx
. apollo
posiada trochę więcej funkcji (m. in. panel WWW + aktualizacje OTA) i na nim się skupię później.
Część odpowiedzialna za SD Update
...
###########################################################################################
# sd upgrade
###########################################################################################
if [ -d /mnt/sd/upgrade ] ; then
if [ -f /mnt/sd/upgrade/img_up ] ; then
cp /mnt/sd/upgrade/img_up /home/
chmod +x /home/img_up
fi
if [ -f /mnt/sd/upgrade/iu.sh ] ; then
cp /mnt/sd/upgrade/iu.sh /home/
elif [ -f $cur_dir/iu.sh ] ; then
cp $cur_dir/iu.sh /home/
elif [ -f /usr/bin/iu.sh ] ; then
cp /usr/bin/iu.sh /home/
fi
if [ -f /home/iu.sh ] ; then
chmod +x /home/iu.sh
/home/iu.sh -s
fi
rm -f /home/iu.sh
fi
...
W tym momencie można prosto zauważyć w jaki sposób z karty SD można uruchomić sobie dowolny plik sh. w iu.sh
parametr -s
odpowiada za update z karty SD. Wygląda on tak:
...
if [ "$sd_upgrade" = "y" ] ; then
if [ -f $sd_img_dir/Flash.img ] ; then
flash_img=$sd_img_dir/Flash.img
if [ -f $sd_img_dir/Flash.md5 ] ; then
flash_md5=$sd_img_dir/Flash.md5
img_md5=$(cat $flash_md5)
else
flash_md5=
img_md5=$($local_img_up_tool -f $flash_md5 -5)
fi
elif [ -f $sd_img_dir/Flash.bin ] ; then
flash_img=$sd_img_dir/Flash.bin
if [ -f $sd_img_dir/Flash.md5 ] ; then
flash_md5=$sd_img_dir/Flash.md5
img_md5=$(cat $flash_md5)
else
flash_md5=
img_md5=$($local_img_up_tool -f $flash_md5 -5)
fi
elif [ -f $sd_img_dir/Flash_d.img ] ; then
flash_img=$sd_img_dir/Flash_d.img
if [ -f $sd_img_dir/Flash_d.md5 ] ; then
flash_md5=$sd_img_dir/Flash_d.md5
img_md5=$(cat $flash_md5)
else
flash_md5=
img_md5=$($local_img_up_tool -f $flash_img -5)
fi
elif [ -f $sd_img_dir/Flash_d.bin ] ; then
flash_img=$sd_img_dir/Flash_d.bin
if [ -f $sd_img_dir/Flash_d.md5 ] ; then
flash_md5=$sd_img_dir/Flash_d.md5
img_md5=$(cat $flash_md5)
else
flash_md5=
img_md5=$($local_img_up_tool -f $flash_img -5)
fi
elif [ -f $sd_img_dir/Flash.pmg ] ; then
flash_img=$sd_img_dir/Flash.pmg
flash_md5=
img_md5=$($local_img_up_tool -f $flash_img -5)
elif [ -f $sd_img_dir/Flash_d.pmg ] ; then
flash_img=$sd_img_dir/Flash_d.pmg
flash_md5=
img_md5=$($local_img_up_tool -f $flash_img -5)
elif [ -f $sd_img_dir/Flash.zmg ] ; then
flash_img=$sd_img_dir/Flash.zmg
flash_md5=
img_md5=$($local_img_up_tool -f $flash_img -5)
elif [ -f $sd_img_dir/Flash_d.zmg ] ; then
flash_img=$sd_img_dir/Flash_d.zmg
flash_md5=
img_md5=$($local_img_up_tool -f $flash_img -5)
else
iu_ret
fi
opt=
opt_md5=
if [ -f $img_up_operate_file ] ; then
opt=$(get_cfg -f $img_up_operate_file -L1)
opt_md5=$(get_cfg -f $img_up_operate_file -L2)
fi
if [ "$opt_md5" = "$img_md5" ] ; then
if [ "$opt" = "done" ] || [ "$opt" = "invalid" ] ; then
iu_ret
fi
fi
if [ -f $sd_img_dir/force ] || [ -f $sd_img_dir/enforce ]; then
force_up=y
tmp_force_opt=
if [ -f $sd_img_dir/force ] ; then
tmp_force_opt=$(cat $sd_img_dir/force)
else
tmp_force_opt=$(cat $sd_img_dir/enforce)
fi
if [ "$tmp_force_opt" = "keep_apenv" ] ; then
keep_apenv=y
elif [ "$tmp_force_opt" = "keep_env" ] ; then
keep_env=y
fi
fi
if [ -f $sd_img_dir/uboot_en ] ; then
enable_uboot_up=y
fi
if [ -f $sd_img_dir/downgrade_en ] ; then
downgrade=y
fi
if [ "$always_up" != "y" ] && [ "$data_up" != "y" ] && [ "$res_up" != "y" ] ; then
do_img_check
fi
#cp -f $flash_img /home/Flash.img
#cp -f $flash_md5 /home/Flash.md5
#flash_img=/home/Flash.img
#flash_md5=/home/Flash.md5
if [ "$image_same" != "y" ] ; then
do_img_upgrade
fi
if [ "$opt" != "anyway" ] ; then
echo "done" > $img_up_operate_file
echo "$img_md5" >> $img_up_operate_file
sync
fi
if [ "$image_same" != "y" ] ; then
echo "Burn SD flash finished, reboot" >&2
reboot -f
fi
exit 0
fi
...
Konfiguracja trybu AP:
interface=wlan1
ssid_type=td_alilv
ssid_prefix=TendaIPC
channel=5
auth=none
key=ygtekadmin123456
ip=192.168.55.1
dhcpd_start=192.168.55.100
dhcpd_end=192.168.55.199
Zawartość /app
- extract z SquashFS:
TODO
- sterowanie kamerą w pełni bez chmury
- uruchomienie panelu WWW
Przydał by się pełny update, więc jeśli ktoś ma oczekującą aktualizację to chętnie pomogę go zgrać - niestety ja zrobiłem update odrazu i teraz czekam aż nowy się pojawi.