ios

利用VMware获取shell-进阶

N 人看过

解包

gzip -d rootfs.gz
sudo cpio -idmv < ./rootfs
sudo chroot . /sbin/xz --check=sha256 -d /bin.tar.xz
sudo chroot . /sbin/ftar -xf /bin.tar

Patch init 文件

文件所在位置 /bin/init ,注意这个是解包后才能拿到的文件

patch 位置在 0x04518E5

jnz loc_451BB4 改为 jz loc_451BB4

下图是 patch 后的

伪代码

另外一处也需要 patch

修改前

修改后

导出后替换原来的./bin/init 文件

Patch shell

  1. 下载编译 busybox

下载地址:https://busybox.net/downloads/

  1. 预编译配置
make menuconfig
  1. 修改配置信息
  • Build Options —> 选择[*] Build Busybox as a static binary(no shared libs)
  • 去掉 Coreutils—>sync 选项
  1. 编译
make 
make install

编译成功 busybox 文件会在 ./_install/bin/busybox

  1. 复制 busybox 到 rootfs 的/bin 目录下
cp ../busybox/busybox-1.35.0/_install/bin/busybox ./bin/
chmod 777 ./bin/busybox
  1. 删除原 sh 软链并创建 busybox 软链
rm -rf ./bin/sh
ls -n /bin/busybox sh

后门制作

编译一段命令执行的 elf 文件,采用静态链接,这里最好使用 system 而不是 execv,因为 system 会附加 init 后的环境,execv 不会。前两条用于测试 busybox 是否正常,后一条用于添加个 shell

#include <stdio.h>

int tcp_port = 22;
char *ip = "192.168.109.143";

void shell(){
        
        
        system("/bin/busybox ls", 0, 0);
        system("/bin/busybox id", 0, 0);
        system("/bin/busybox killall sshd && /bin/busybox telnetd -l /bin/sh -b 0.0.0.0 -p 22", 0, 0);
        return;
}

int main(int argc, char const *argv[])
{
        shell();
        return 0;
}

编译

gcc -g shell.c -static -o shell

打包

sudo chroot . /sbin/ftar -cf bin.tar ./bin
sudo chroot . /sbin/xz --check=sha256 -e bin.tar
su root
find . -path './bin' -prune -o -print |cpio -H newc -o > ../make/rootfs.raw
cd ../make
cat rootfs.raw | gzip > rootfs.gz

替换

使用新虚拟机挂载当前 fortigate 的虚拟磁盘,添加->现有虚拟磁盘

启动该虚拟机后,搜索应用 disk,选择对应大小的虚拟机磁盘,这里是 2G 的,然后选择启动挂载

替换 rootfs.gz 文件

sudo su
cp path/to/rootfs.gz ./

关闭挂载或者挂起虚拟机

GDB 内核 Patch

绕过 fgt_verify,需要绕过下方跳转 jnz,可以在此处下断点并修改 rax=0 绕过

配置 vm 调试利用VMware获取shell

gdb
pwndbg> file /home/ios/Fortigate/vmlinuz_elf
pwndbg> b*0xFFFFFFFF807AC11C
pwndbg> target remote 192.168.109.1:12345
pwndbg> c

这里讲解一个技巧:什么时候执行 target remote 192.168.109.1:12345 下断,由于我们要 patch 的是 vmlinuz 中的验证,所以需要在屏幕输出 Bootting the kernel 后 1-2 秒再执行,如下图

触发断点

修改 rax=0

set $rax=0

测试能成功运行启动

运行到 shell

登录到 cli,执行 diag hardware smartctl

查看结果

尝试用 telnet 连接后门,注意端口是 22!!!!需要指定一下端口

telnet 192.168.109.111 22

这里的 ip 是在 cli 中配置后的,可以参考基础配置文章

注意:获取 shell 后还需要借助 busybox 来执行其他命令,如图,直接执行会找不到软链

遇到问题

EDD:Error 0400 reading sector

造成原因

使用 windows 下的 diskgenius 替换 rootfs 导致

解决方法

使用另一台 linux 虚拟机 挂载虚拟磁盘,并复制进去

偶尔出现 cpio 打包 blocks 打包前后不相同的问题

同上 该问题会导致虚拟机启动后 无任何提示 无限重启

造成原因

在 vmlinuz 中存在一处 fgtsum 校验,具体位置在 0xFFFFFFFF807AC117

解决方法

0xFFFFFFFF807AC117 处下断,用 gdb 修改 eax 值为 0,即可绕过验证