网络安全日报 2024年08月20日
1、攻击者仿冒WACC赛事网站钓鱼传播恶意软件 https://cyble.com/blog/world-agricultural-cycling-competition-wacc-participants-targeted-for-havoc-c2-dissemination/ 研究人员发现一个仿冒“世界农业自行车比赛”(WACC)官方网站的钓鱼网站。这一伪造网站通过轻微的修改,难以与真实网站区分,意图欺骗不明真相的访客。 2、FIN7网络犯罪集团新基础设施曝光 https://www.team-cymru.com/post/fin7-the-truth-doesn-t-need-to-be-so-stark 研究人员发现了与FIN7网络犯罪集团相关的新基础设施。这些基础设施由来自俄罗斯的Post Ltd和爱沙尼亚的SmartApe提供,表明FIN7通过这些IP地址进行通信。最新的分析显示,这些主机可能是通过Stark的经销商采购的。研究发现,FIN7的基础设施与至少15个Stark分配的主机和16个其他主机进行了通信。Stark在负责任的披露后已暂停这些服务。 3、研究人员揭露CryptoCore诈骗集团复杂的加密货币诈骗活动 https://decoded.avast.io/martinchlumecky1/cryptocore-unmasking-the-sophisticated-cryptocurrency-scam-operations/ 随着数字货币的快速增长,加密货币诈骗也日益猖獗,对投资者和用户构成了重大风险。CryptoCore是一个以其复杂手法著称的诈骗集团,利用深度伪造技术和被劫持的YouTube账户,通过伪造的名人视频和精心设计的网站来欺骗受害者。这些诈骗常以高额回报的承诺吸引目标,利用人工智能和虚假视频来提高欺骗的可信度。CryptoCore利用这些技术通过各大平台进行诈骗,包括曾经劫持过 4、微软修复了朝鲜APT组织Lazarus利用的零日漏洞 https://thehackernews.com/2024/08/microsoft-patches-zero-day-flaw.html 微软修复了一个被朝鲜国家赞助的Lazarus集团利用的零日漏洞,该漏洞被追踪为CVE-2024-38193,CVSS评分为7.8。该漏洞存在于Windows Ancillary Function Driver(AFD.sys)中,允许攻击者通过特权升级获取SYSTEM权限。该漏洞在2024年6月被发现,并在微软的Patch Tuesday更新中得到修复。 5、Rhysida以5比特币拍卖《华盛顿时报》内部文件 https://www.securitylab.ru/news/551155.php 《华盛顿时报》成为了最新的Rhysida勒索软件攻击受害者,攻击者计划在暗网拍卖这家报纸的被盗数据,起拍价为5比特币,相当于292030美元。Rhysida给出了七天的准备时间,并发布了部分被盗数据样本,包括公司文件、银行对账单、员工文件、德克萨斯州驾驶执照复印件和社会保障卡。 6、出于"国家安全"考虑,美国议员要求对TP-Link 展开调查 https://www.securityweek.com/us-lawmakers-want-investigation-into-tp-link-over-chinese-hacking-fears/ 议员们希望网络巨头 TP-Link 接受商务部的调查,因为担心该公司的 Wi-Fi 路由器可能让中国轻松访问美国系统。 7、网络犯罪分子利用热门软件搜索传播 FakeBat 恶意软件 https://thehackernews.com/2024/08/cybercriminals-exploit-popular-software.html 网络安全研究人员发现,恶意软件感染激增源于传播一种名为 FakeBat 的加载程序的恶意广告活动。 8、WPS Office两个严重漏洞曝光,已被在野利用 https://www.freebuf.com/news/408961.html WPS Office作为一款用户基数超过2亿的广泛使用的办公套件,被发现存在两个关键漏洞(CVE-2024-7262和CVE-2024-7263),这些漏洞可能导致用户遭受远程代码执行攻击。这两个漏洞的CVSS评分为9.3,表明它们的严重性很高,且易于被利用。其中CVE-2024-7262已经被武器化,ESET的安全研究人员发现它正在野外被积极利用。 9、X私自用6000万用户数据训练大模型,或面临大规模诉讼 https://www.secrss.com/articles/69159 据NOYB称,X公司未经告知或征得用户同意,擅自使用超过6000万欧洲用户个人数据训练其大型语言模型“Grok”,这一行为严重违反了GDPR原则。 10、2024上半年勒索软件受害企业至少支付了32亿元赎金 https://www.secrss.com/articles/69242 安全内参8月16日消息,最新报告显示,2024年上半年勒索软件攻击者从受害者那里敲诈了超过4.59亿美元(约合人民币32.93亿元)。这表明勒索软件危机日益严重,影响了从大型企业到地方政府和医院的所有组织。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景科技观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景科技无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景科技一律不予承担。
LLVM IR 深入研究分析
前置知识 LLVM是C++编写的构架编译器的框架系统,可用于优化以任意程序语言编写的程序。 LLVM IR可以理解为LLVM平台的汇编语言,所以官方也是以语言参考手册(Language Reference Manual)的形式给出LLVM IR的文档说明。既然是汇编语言,那么就和传统的CUP类似,有特定的汇编指令集。但是它又与传统的特定平台相关的指令集(x86,ARM,RISC-V等)不一样,它定位为平台无关的汇编语言。也就是说,LLVM IR是一种相对于CUP指令集高级,但是又是一种低级的代码中间表示(比抽象语法树等高级表示更加低级)。 LLVM IR即代码的中间表示,有三种形式: .ll 格式:人类可以阅读的文本(汇编码) -->这个就是我们要学习的IR .bc 格式:适合机器存储的二进制文件 内存表示 下面给出.ll格式和.bc格式生成及相互转换的常用指令清单: .c -> .ll:clang -emit-llvm -S a.c -o a.ll .c -> .bc: clang -emit-llvm -c a.c -o a.bc .ll -> .bc: llvm-as a.ll -o a.bc .bc -> .ll: llvm-dis a.bc -o a.ll .bc -> .s: llc a.bc -o a.s 那么我们以一道CTF赛题来分析实验,学习LLVM IR 实验解析 题目附件直接给出了中间表示.II文件 打开查看一下汇编码,毕竟.II文件是人类可以阅读的文本,这边笔者使用的是Sublime Text(使用VScode查看即可)代码量不多,大概600行 题目初步分析 我们直接寻找一下main函数 我们可以看出题目经历了两次RC4,然后Base64,我们从上面可以看到密文,RC4_key,我们直接一把锁,cyberchef启动,会发现解不出来,那么程序应该做了其他的操作,最朴素的,我们可以想到把RC4魔改了,base64魔改等等。 So!继续学习研究ing .II详细分析 所以本着学习的态度,我们这时候应该掏出LLVM Language Reference Manual(官方文档)来简单了解学习一些常见指令、符号标识以及特性。这边给出一些分析 .ll 中间文件的算法流程 @ - 全局变量 % - 局部变量 alloca - 在当前执行的函数的堆栈帧中分配内存,当该函数返回到其调用者时,将自动释放内存 i32 - 32位4字节的整数 align - 对齐 load - 读出,store写入 icmp - 两个整数值比较,返回布尔值 br - 选择分支,根据条件来转向label,不根据条件跳转的话类型goto label - 代码标签 call - 调用函数 首先看到一些全局变量,知道了RC4_key = llvmbitccipher = "TSzkWKgbMHszXaj@kLBmRrnTxsNtZsSOtZzqYikCw=" 我们继续分析,重点分析各个function b64encode b64encode 魔改 每三个字符,24位,切分成4断,每段6位。 将6位对应的值 (value+ 59)&0xff 则是编码后的值。  %22 = getelementptr inbounds i8, i8* %19, i64 %21        // 取出当前处理字符  %23 = load i8, i8* %22, align 1  %24 = zext i8 %23 to i32                                 // 类型强制转化  %25 = ashr i32 %24, 2                                   // 算数右移两位   input[i]>>2  %26 = add nsw i32 %25, 59                                 //   input[i]+59  %27 = trunc i32 %26 to i8                                //   强制转化 相当于 &0xff  %28 = load i8*, i8** %6, align 8  %29 = load i32, i32* %9, align 4  %30 = sext i32 %29 to i64  %31 = getelementptr inbounds i8, i8* %28, i64 %30        // 存储base64 编码串  store i8 %27, i8* %31, align 1  %32 = load i8*, i8** %4, align 8  %33 = load i32, i32* %7, align 4  %34 = sext i32 %33 to i64  %35 = getelementptr inbounds i8, i8* %32, i64 %34  %36 = load i8, i8* %35, align 1  %37 = zext i8 %36 to i32  %38 = and i32 %37, 3                              // 获取第一个字符 低两位  %39 = shl i32 %38, 4                                // 左移四位 RC4_init RC4_init 正常,无魔改 define dso_local void @Rc4_Init(i8*, i32) #0 {                           //RC4_init function  %3 = alloca i8*, align 8  %4 = alloca i32, align 4  %5 = alloca i32, align 4  %6 = alloca i32, align 4  store i8* %0, i8** %3, align 8  store i32 %1, i32* %4, align 4                                         //初始化S,T盒  call void @llvm.memset.p0i8.i64(i8* align 16 getelementptr inbounds ([256 x i8], [256 x i8]* @s, i64 0, i64 0), i8 0, i64 256, i1 false)  call void @llvm.memset.p0i8.i64(i8* align 16 getelementptr inbounds ([256 x i8], [256 x i8]* @t, i64 0, i64 0), i8 0, i64 256, i1 false)  store i32 0, i32* %5, align 4  br label %7 7:                                               ; preds = %26, %2  %8 = load i32, i32* %5, align 4  %9 = icmp slt i32 %8, 256  br i1 %9, label %10, label %29                          //如果 %9 为真(即 %8 小于 256),跳转到标签 %10;否则跳转到标签 %29,根据t打乱s盒 10:                                               ; preds = %7  %11 = load i32, i32* %5, align 4  %12 = trunc i32 %11 to i8  %13 = load i32, i32* %5, align 4  %14 = sext i32 %13 to i64  %15 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %14  store i8 %12, i8* %15, align 1  %16 = load i8*, i8** %3, align 8  %17 = load i32, i32* %5, align 4  %18 = load i32, i32* %4, align 4  %19 = urem i32 %17, %18  %20 = zext i32 %19 to i64  %21 = getelementptr inbounds i8, i8* %16, i64 %20  %22 = load i8, i8* %21, align 1  %23 = load i32, i32* %5, align 4  %24 = sext i32 %23 to i64  %25 = getelementptr inbounds [256 x i8], [256 x i8]* @t, i64 0, i64 %24  store i8 %22, i8* %25, align 1  br label %26 26:                                               ; preds = %10  %27 = load i32, i32* %5, align 4  %28 = add nsw i32 %27, 1  store i32 %28, i32* %5, align 4  br label %7 29:                                               ; preds = %7  store i32 0, i32* %6, align 4  store i32 0, i32* %5, align 4  br label %30 30:                                               ; preds = %54, %29  %31 = load i32, i32* %5, align 4  %32 = icmp slt i32 %31, 256  br i1 %32, label %33, label %57 33:                                               ; preds = %30  %34 = load i32, i32* %6, align 4  %35 = load i32, i32* %5, align 4  %36 = sext i32 %35 to i64  %37 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %36  %38 = load i8, i8* %37, align 1  %39 = zext i8 %38 to i32  %40 = add nsw i32 %34, %39  %41 = load i32, i32* %5, align 4  %42 = sext i32 %41 to i64  %43 = getelementptr inbounds [256 x i8], [256 x i8]* @t, i64 0, i64 %42  %44 = load i8, i8* %43, align 1  %45 = zext i8 %44 to i32  %46 = add nsw i32 %40, %45  %47 = srem i32 %46, 256  store i32 %47, i32* %6, align 4  %48 = load i32, i32* %5, align 4  %49 = sext i32 %48 to i64  %50 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %49  %51 = load i32, i32* %6, align 4  %52 = sext i32 %51 to i64  %53 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %52  call void @swap(i8* %50, i8* %53)                                                //call swap function  br label %54 RC4_enc RC4_enc 魔改 多了一层xor 89 define dso_local void @Rc4_Encrypt(i8*, i32) #0 {                                //RC4_enc function  %3 = alloca i8*, align 8  %4 = alloca i32, align 4  %5 = alloca i8, align 1  %6 = alloca i8, align 1  %7 = alloca i8, align 1  %8 = alloca i8, align 1  store i8* %0, i8** %3, align 8  store i32 %1, i32* %4, align 4  store i8 0, i8* %6, align 1  store i8 0, i8* %7, align 1  store i8 0, i8* %8, align 1  br label %9 9:                                               ; preds = %14, %2  %10 = load i8, i8* %8, align 1  %11 = zext i8 %10 to i32  %12 = load i32, i32* %4, align 4  %13 = icmp ult i32 %11, %12  br i1 %13, label %14, label %64 14:                                               ; preds = %9  %15 = load i8, i8* %6, align 1  %16 = zext i8 %15 to i32  %17 = add nsw i32 %16, 1  %18 = srem i32 %17, 256  %19 = trunc i32 %18 to i8  store i8 %19, i8* %6, align 1  %20 = load i8, i8* %7, align 1  %21 = zext i8 %20 to i32  %22 = load i8, i8* %6, align 1  %23 = zext i8 %22 to i64  %24 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %23               //生成密钥流  %25 = load i8, i8* %24, align 1  %26 = zext i8 %25 to i32  %27 = add nsw i32 %21, %26  %28 = srem i32 %27, 256  %29 = trunc i32 %28 to i8  store i8 %29, i8* %7, align 1  %30 = load i8, i8* %6, align 1  %31 = zext i8 %30 to i64  %32 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %31  %33 = load i8, i8* %7, align 1  %34 = zext i8 %33 to i64  %35 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %34              //经典Swap了再加  call void @swap(i8* %32, i8* %35)  %36 = load i8, i8* %6, align 1  %37 = zext i8 %36 to i64  %38 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %37  %39 = load i8, i8* %38, align 1  %40 = zext i8 %39 to i32  %41 = load i8, i8* %7, align 1  %42 = zext i8 %41 to i64  %43 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %42  %44 = load i8, i8* %43, align 1  %45 = zext i8 %44 to i32  %46 = add nsw i32 %40, %45  %47 = srem i32 %46, 256  %48 = sext i32 %47 to i64  %49 = getelementptr inbounds [256 x i8], [256 x i8]* @s, i64 0, i64 %48  %50 = load i8, i8* %49, align 1  store i8 %50, i8* %5, align 1  %51 = load i8, i8* %5, align 1  %52 = zext i8 %51 to i32  %53 = xor i32 %52, 89                                                         //xor 89  %54 = load i8*, i8** %3, align 8  %55 = load i8, i8* %8, align 1  %56 = zext i8 %55 to i64  %57 = getelementptr inbounds i8, i8* %54, i64 %56  %58 = load i8, i8* %57, align 1  %59 = zext i8 %58 to i32  %60 = xor i32 %59, %53                                                        //xor k  %61 = trunc i32 %60 to i8  store i8 %61, i8* %57, align 1  %62 = load i8, i8* %8, align 1  %63 = add i8 %62, 1  store i8 %63, i8* %8, align 1  br label %9 64:                                               ; preds = %9  ret void } main main函数逻辑cipher -->RC4_init-->RC4_enc-->RC4_enc-->b64encode需要注意一下在RC4_enc的参数中,传入的数据块长度是固定的16,所以说程序进行两次RC4_enc的原因也就确定了,是为了分两次对程序进行加密,也算是一点点小手段,总之,即使让你好好分析.II代码,考察对软件分析的细节,耐心,嘻嘻。 OK,理清楚逻辑,就可以试着敲代码解密啦。 解密 逆向分析过程明了之后,那么写代码就简单多了 #include<stdio.h> unsigned char s[300],t[300]; void b64decode(unsigned char * enc,unsigned char* dec); void Rc4_dec1(int len, unsigned char *enc); void Rc4_Init(char *key,int len); void Rc4_dec2(int len, unsigned char *enc); int main() {    unsigned char enc[50]="TSz`kWKgbMHszXaj`@kLBmRrnTxsNtZsSOtZzqYikCw=";    unsigned char dec1[50]={0x00};    char key[10] ="llvmbitc";    unsigned char a[50];    int i=0;          b64decode(enc,dec1);    Rc4_Init(key,8);    Rc4_dec1(16,&dec1[16]);    for(i=0;i<16;i++) {        dec1[i+16]^=dec1[i];   }    Rc4_Init(key,8);    Rc4_dec2(16,dec1);    printf("%s",dec1);    return 0; } void b64decode(unsigned char * enc,unsigned char* dec) {    int i=0,j=0;    for(i=0;i<40;i+=4) {        dec[j] = ((enc[i]-59)<<2)&0xfc | (((enc[i+2]-59)>>4))&3;        dec[j+1] = (((enc[i+2]-59)&0xf)<<4) | (((enc[i+1]-59)>>2)&0xf);        dec[j+2] = (((enc[i+1]-59)&3)<<6) | ((enc[i+3]-59)&0x3f);        j+=3;   }    dec[j] = ((enc[i]-59)<<2)&0xfc | (((enc[i+1]-59)>>4))&3;    dec[j+1] = (((enc[i+2]-59)>>2)&0xf) | (((enc[i+1]-59)<<4)&0xf0);    dec[j+2]=0; } void Rc4_Init(char *key,int len) {    int i=0,v5=0;    unsigned char temp;    for(i=0;i<256;i++) {        s[i] =i;        t[i] = key[i%len];   }    for(i=0;i<256;i++) {        v5=(s[i]+t[i]+v5)%256;        temp = s[i];        s[i]= s[v5];        s[v5]=temp;   } } void Rc4_dec1(int len, unsigned char *enc) {    int v3=0,v5=0,i,j;    unsigned char temp;    for(i=0;i<len;i++) {        v3=(v3+1)%256;        v5=(s[v3]+v5)%256;        temp=s[v3];        s[v3]=s[v5];        s[v5]=temp;   }    v5=v3=0;    for(i=0;i<len;i++) {        v3=(v3+1)%256;        v5 = (s[v3]+v5)%256;        temp = s[v3];        s[v3]=s[v5];        s[v5]=temp;        enc[i]^=s[(s[v5]+s[v3])%256]^0x59;   } } void Rc4_dec2(int len, unsigned char *enc) {    int v3=0,v5=0,i,j;    unsigned char temp;    v5=v3=0;    for(i=0;i<len;i++) {        v3=(v3+1)%256;        v5 = (s[v3]+v5)%256;        temp = s[v3];        s[v3]=s[v5];        s[v5]=temp;                enc[i]^=s[(s[v5]+s[v3])%256]^0x59;   } } flag{Hacking_for_fun@reverser$!} 总结 通过这么一道CTF题目,深入学习LLVM IR的冰山一角,认真实验,细细分析,相信会对你有极大帮助。当然,如果单从解题来说,对于解决这道题有很多的办法,比如说将.II转化为可执行文件,然后IDA分析,但我们旨在学习LLVM IR,这里不再过多赘述。
网络安全日报 2024年08月19日
1、AutoCanada披露网络攻击影响内部IT系统 https://investors.autocan.ca/2024/08/autocanada-announces-cybersecurity-incident/ AutoCanada近日遭遇网络攻击,影响了该汽车经销商集团的内部IT系统。该公司立即采取了措施以保护其网络和数据,并聘请了外部网络安全专家协助进行控制和修复工作。目前的调查尚未确定是否有数据在此次事件中被泄露。AutoCanada表示,尽管“业务运营目前仍在进行中,但事件可能会导致相关系统恢复期间的运营中断。”AutoCanada是一家大型汽车经销商,拥有超过4700名员工,运营66家在加拿大的特许经销商,涵盖25个汽车品牌,同 2、SolarWinds发布Web Help Desk关键漏洞修复补丁 https://security.paloaltonetworks.com/CVE-2024-5914 2024年8月15日,SolarWinds已发布补丁以修复其Web Help Desk软件中的一个关键安全漏洞,该漏洞可能被利用来在受影响的实例上执行任意代码。此漏洞被标记为CVE-2024-28986,CVSS评分为9.8,属于反序列化漏洞。SolarWinds在公告中指出,这一Java反序列化远程代码执行漏洞如果被攻击者利用,可能允许其在主机上执行命令。尽管报告显示该漏洞为未经身份验证的漏洞,但SolarWinds在彻底测试后未能在未经身份验证的情况下重现该漏洞。这一漏洞影响Solar 3、新恶意软件针对macOS的100多种浏览器扩展进行攻击 https://www.elastic.co/security-labs/beyond-the-wail 2024年8月16日,研究人员发现了一种新型的恶意软件——Banshee Stealer,该软件专门针对Apple的macOS系统。Banshee Stealer在网络黑市上的售价高达每月3000美元,支持x86_64和ARM64架构。该恶意软件具有广泛的攻击能力,能够针对包括Google Chrome、Mozilla Firefox、Brave等在内的多种浏览器以及大约100种浏览器扩展和多种加密货币钱包进行攻击。它还能够收集系统信息、iCloud Keychain密码和Notes数据 4、多阶段ValleyRAT利用高级战术针对用户展开攻击 https://www.fortinet.com/blog/threat-research/valleyrat-campaign-targeting-chinese-speakers 研究人员揭示了一项针对用户的复杂恶意软件攻击活动。该活动使用了名为ValleyRAT的多阶段恶意软件,具有高度的隐蔽性和攻击性。ValleyRAT通过各种技术监控和控制受害者,并通过在内存中直接执行shellcode减少了其在系统中的文件足迹。攻击过程始于伪装成合法应用程序的第一阶段加载程序,例如“工商年报大师.exe”或“补单对接更新记录txt.exe”。执行这些伪装文件后,恶意shellcode被加载并进入 5、阿拉巴马心脏科诊所数据泄露影响28.1万患者 https://www.acgsecurityincident.com/ 阿拉巴马心脏科集团(Alabama Cardiology Group)近期披露,约28.1万名当前及过去的患者、医生和员工的敏感信息遭遇黑客攻击。该集团隶属于Grandview医疗中心,涉及的敏感数据包括个人身份信息、社会保险号、健康保险信息、用户名及密码等,甚至包括金融信息如信用卡和银行账户信息。黑客攻击发生在2023年6月6日至7月2日之间,攻击者通过网络服务器获得了这些信息。阿拉巴马心脏科集团在7月2日发现网络遭到未授权访问后,将网络与互联网断开,并随即通知了执法部门和联邦监管机构。专家指出,此次攻击可能与凭证滥 6、黑客利用Azure和Google搜索传播虚假信息与恶意软件 https://www.bleepingcomputer.com/news/security/azure-domains-and-google-abused-to-spread-disinformation-and-malware/ 研究人员报道了一个新兴的虚假信息传播活动,涉及多个Microsoft Azure和OVH云子域名以及Google搜索。这一活动利用Android手机上的Google搜索通知,诱导用户点击虚假的信息链接,进而引导他们访问伪装成资讯文章的欺诈网站。这些网站不仅散布有关名人的虚假健康谣言,还通过重定向用户到含有恶意软件、垃圾信息和伪造软件的网站来实施攻击。多个名人如哈 7、攻击者利用暴露的.env 文件入侵云账户进行勒索 https://thehackernews.com/2024/08/attackers-exploit-public-env-files-to.html 一场大规模勒索活动利用包含与云和社交媒体应用程序相关的凭据的可公开访问的环境变量文件 (.env),危害了各个组织。 8、Google Pixel预装应用存在漏洞,数百万设备面临风险 https://thehackernews.com/2024/08/google-pixel-devices-shipped-with.html 自 2017 年 9 月起在全球发售的 Google Pixel 设备被发现预装了一个名为 Showcase.apk 的应用程序,这使得它们容易受到潜在攻击和恶意软件感染。 9、CISA警告Vonets WiFi 存在严重漏洞,尚无可用补丁 https://securityonline.info/cisa-warns-critical-vulnerabilities-in-vonets-wifi-bridge-devices-no-patch-available/ 这些漏洞可能允许攻击者执行任意代码、泄露敏感信息或破坏设备功能,对依赖这些设备的工业和商业网络构成重大威胁。 10、英国一核设施曝严重网络安全缺陷,已造成国家安全威胁 https://www.secrss.com/articles/69143 英国塞拉菲尔德核设施承认违规行为可能威胁国家安全,目前正等待最终判决,这是首个因IT安全问题被起诉的核设施。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景科技观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景科技无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景科技一律不予承担。
2024网安高峰论坛 | 蚁景科技获首批“长沙市网络安全工匠培养基地”
8月9日至10日,2024网络安全技术创新与人才教育高峰论坛在长沙隆重召开。中国工程院院士方滨兴、杨宏、孔志印,以及来自全国各地的500多名网络安全领域的专家、学者、企业界人士汇聚一堂,聚焦网络空间安全领域面临的新兴技术安全挑战和人才缺乏现状,开展交流研讨。 本次高峰论坛由中国网络空间新兴技术安全创新论坛(新安盟)、中国网络空间安全人才教育论坛(网教盟)、国务院学位办网络空间安全学科评议组和广州大学联合举办。湖南蚁景科技有限公司作为“新安盟”和“网教盟”的成员单位,受邀出席了本次大会。 新安盟、网教盟理事长,中国工程院方滨兴院士  主论坛上,方滨兴院士详细介绍了“方班研讨厅”教学模式。“方班研讨厅”由方滨兴院士设计并全程参与教学,采用“学生讲、师生问、专家评”的课堂形式,致力于更好地培养网络空间安全相关专业人才。自2018年9月在广州大学开设第一期研究生班以来,已陆续扩展至40多所高校,数十名院士参与教学。 孔志印院士分享了对网络安全人才培养教育的认识。数字化时代,网络安全已经成为国家安全、经济安全和社会安全的重要组成部分。新兴技术不断应用,网络攻击的手段和方式也愈加多样化和复杂化。对于网安人才培养需注重融合、注重实效、扩展视野,方班在这些方面已经开展了大量创新探索与实践,对于推动网络安全领域的教育和产业发展具有重要意义。 蚁景科技还出席了本次大会的“网络安全人才培养与认证分论坛”,并参与多项议程。在长沙市网络安全工匠基地授牌仪式上,长沙市工信局人工智能与数字产业处处长熊菁为湖南蚁景科技有限公司授予了首批“长沙市网络安全工匠培养基地”荣誉牌匾。蚁景科技将进一步发挥自身在网安实战技能培养领域的专长,不断推动网安工匠基地实战型网络安全人才培养,助力网安技能队伍建设。 本次高峰论坛探讨了网络空间安全产业发展与技术创新,分享了网络空间安全学科建设、人才培养经验和模式。为与会者提供了一个深入了解网络空间安全技术前沿发展趋势、人才培养教育创新实践的平台,也进一步促进了产学研用深度融合交流。 未来,蚁景科技将汇聚产、学、研、用多方力量,用工匠精神和创新思路与业界共建网络安全人才培养新生态,为网络安全人才培养贡献力量。
网络安全日报 2024年08月16日
1、Gafgyt僵尸网络新变种通过SSH攻击入侵主机进行挖矿 https://www.aquasec.com/blog/gafgyt-malware-variant-exploits-gpu-power-and-cloud-native-environments/ 研究人员发现了一种Gafgyt僵尸网络新变种,该变种通过弱SSH密码攻击机器,最终利用被攻陷实例的GPU计算能力进行加密货币挖矿。最新的攻击链涉及暴力破解SSH服务器的弱密码,以部署下一阶段的有效载荷,促进使用“systemd-net”的加密货币挖矿攻击,但在此之前会终止已在被攻陷主机上运行的竞争性恶意软件。它还执行一个蠕虫模块,一个基于Go的SSH扫描器名为ld-musl-x86,负责扫描 2、Windows TCP/IP RCE会影响所有启用IPv6的系统 https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-38063 微软在最近的安全公告中强调了一个严重的TCP/IP远程代码执行漏洞,该漏洞可能影响所有启用IPv6的Windows系统。昆仑实验室的XiaoWei发现了这一漏洞,并追踪为CVE-2024-38063。微软警告用户,攻击者可以利用这一漏洞执行任意代码,且攻击的复杂度较低。微软还指出,由于过去有类似漏洞被利用的案例,这一新发现的漏洞更有可能吸引攻击者,并可能被快速利用。因此,微软建议用户立即应用安全更新,以防止潜在的攻击。对于那些无法立即更新的用户,微软建议作 3、GitHub漏洞“ArtiPACKED”导致存储库面临被接管的风险 https://unit42.paloaltonetworks.com/github-repo-artifacts-leak-tokens/ 研究人员最近揭露了一个名为“ArtiPACKED”的GitHub漏洞,该漏洞可能允许攻击者接管代码库并访问组织的云环境。该漏洞通过配置错误和安全漏洞的结合,导致令牌泄露,包括GitHub令牌,使得恶意行为者能够未授权地访问代码库,并通过CI/CD工作流程污染源代码。GitHub的工件允许用户在工作流程中共享数据,这些数据在完成后可保留90天,包括构建和日志文件等。该漏洞还暴露了一个未记录的环境变量ACTIONS_RUNTIME_TOKEN,攻击者可能利 4、RansomHub勒索攻击者武器库新增"EDRKillShifter"破坏工具 https://news.sophos.com/en-us/2024/08/14/edr-kill-shifter/ 研究人员近日发现,一名犯罪团伙在对一组织发起名为RansomHub的勒索软件攻击时,尝试部署了一款新型的EDR(端点检测和响应)破坏工具“EDRKillShifter”。虽然这次勒索软件攻击没有成功,但事后分析揭露了这一专为终止端点保护软件而设计的工具。 5、GitHub正式推出Copilot Autofix帮助开发人员修复代码漏洞 https://www.securityweek.com/github-makes-copilot-autofix-generally-available/ 代码托管平台 GitHub 周二宣布推出 Copilot Autofix,这是一项由人工智能驱动的漏洞修复功能,旨在帮助开发人员更快地解决代码中的错误。Copilot Autofix现已在 GitHub Advanced Security (GHAS) 中正式推出,它可以分析拉取请求中发现的安全缺陷,并提供解释和修复建议。开发人员可以忽略、编辑或提交建议。 6、研究人员发现 Microsoft Outlook 的新漏洞 https://www.infosecurity-magazine.com/news/research-uncovers-new-microsoft/ 安全研究人员在 Microsoft Outlook 中发现了一个新漏洞,标记为 CVE-2024-38173,CVSS 评分为 6.7。此表单注入 RCE 漏洞与 2024 年 7 月修补的先前漏洞 CVE-2024-30103 类似。 7、SolarWinds 在披露严重 RCE 漏洞后敦促用户升级 https://www.infosecurity-magazine.com/news/solarwinds-upgrade-critical-rce-bug/ SolarWinds 建议客户升级其 Web Help Desk 平台,因为 Inmarsat 政府研究人员发现了一个严重漏洞 CVE-2024-28986。该漏洞允许通过 Java 反序列化执行远程代码。 8、腾讯回应14亿泄露不属实,黑产利用历史资料拼凑、注水而成 https://www.ithome.com/0/788/376.htm 外媒 HackRead 于 13 日报道称,名为“Fenice”的黑客于 8 月 6 日在暗网论坛上泄露 27 亿美国用户(此前称为 29 亿)社保信息之后,再次发帖曝料称手握 14 亿腾讯用户账号信息。该黑客声称窃取了海量数据库,其中包括 14 亿条 Tencent.com 相关的记录,压缩数据容量为 44GB,解压之后将达到 500GB。 9、谷歌挫败了与伊朗有关的 APT42 发起的黑客活动 https://securityaffairs.com/167095/security/google-disrupted-apt48-hacking-campaign.html 谷歌挫败了与伊朗有关的 APT 组织 APT42 针对美国总统大选发起的黑客攻击活动。 10、2024 年第二季度针对工业企业的勒索软件攻击激增 https://www.securityweek.com/ransomware-attacks-on-industrial-firms-surged-in-q2-2024/ Dragos 发现 2024 年第二季度针对工业组织的勒索软件攻击与上一季度相比显著增加。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景科技观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景科技无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景科技一律不予承担。
网络安全日报 2024年08月15日
1、SAP严重漏洞可使远程攻击者绕过身份验证 https://support.sap.com/en/my-support/knowledge-base/security-notes-news/august-2024.html 2、研究人员发现AI驱动的Azure Health Bot存在严重漏洞 https://www.tenable.com/blog/compromising-microsofts-ai-healthcare-chatbot-service 研究人员在微软的Azure Health Bot服务中发现了两个安全漏洞,这些漏洞如果被利用,可能允许恶意行为者在客户环境中实现横向移动并访问敏感的患者数据。这些关键问题现已被微软修复。 3、Windows SmartScreen绕过漏洞自3月以来被攻击者利用 https://msrc.microsoft.com/update-guide/en-US/advisory/CVE-2024-38213 微软披露了一项被攻击者利用的Mark of the Web(MotW)安全绕过漏洞,并在2024年6月的补丁星期二中进行了修复。该漏洞(CVE-2024-38213)允许攻击者绕过SmartScreen保护。尽管该漏洞可以被未认证的威胁行为者通过低复杂度攻击远程利用,但需要用户交互,使得成功利用变得更加困难。攻击者需要向用户发送恶意文件并说服他们打开它。研究人员发现该漏洞从2024年3月起在野外被利用,并向微软报告。微软在6月的补丁星期二中修补了该漏洞, 4、勒索软件攻击导致Kootenai Health 40多万患者数据泄露 https://www.maine.gov/agviewer/content/ag/985235c7-cb95-4be2-8792-a1252b4f8318/e7d7e967-7420-4ed1-878b-e2f6916c5ad0.html Kootenai Health披露了一起数据泄露事件,导致超过464000名患者的个人信息被3AM勒索软件团伙盗取并泄露。Kootenai Health是位于爱达荷州的非营利医疗服务提供商,运营着该地区最大的医院,提供急诊、手术、癌症治疗、心脏护理和骨科等广泛的医疗服务。 5、英特尔、AMD发布安全补丁修复超过 110 个漏洞 https://www.securityweek.com/chipmaker-patch-tuesday-intel-amd-address-over-110-vulnerabilities/ 英特尔和 AMD 已分别向客户通报其产品中发现并修补的数十个漏洞。 英特尔发布了 43 条新公告,共涵盖约 70 个安全漏洞。其中 9 条公告描述了高严重性漏洞。AMD在周二补丁日发布了 8 条新公告,向客户通报 46 个漏洞。 6、伊朗中央银行及其他伊朗银行遭大规模网络攻击 https://securityaffairs.com/167066/hacking/cyberattack-central-bank-of-iran.html 据伊朗新闻媒体报道,伊朗中央银行 (CBI) 和其他几家银行遭受了重大网络攻击,导致业务中断。 7、特朗普和马斯克连麦直播遭网络攻击 https://www.freebuf.com/news/408606.html 东时间12日晚8时,埃隆·马斯克将对第60届美国总统大选候选人唐纳德·特朗普进行一次连麦直播访谈,并在X平台上通过马斯克和特朗普的个人账号进行现场直播。然而,当直播时间开始用户访问两人的直播间时,系统却提示“此直播间不可用”。直至40多分钟后,直播平台才恢复正常。这次直播延时事故,并非简单的技术故障,而是一次有针对性的网络攻击活动。访谈结束后,马斯克在其X平台账号上发文称X平台遭受了大规模的DDoS攻击。 8、IBM 推出AI网络安全助手用于威胁检测和响应服务 https://www.ithome.com/0/788/072.htm 近日,IBM 宣布在其托管威胁检测和响应服务中引入生成式 AI 功能,供 IBM Consulting (IBM 咨询)的分析人员使用,从而协作客户推进和简化安全运营。 9、俄罗斯黑客访问了英国内政部的电子邮件和数据 https://cybernews.com/security/russian-hackers-accessed-uk-home-offices-emails/ 根据记录,内政部于5月2日向英国数据保护监管机构报告了这一事件。报告称,该部门的企业系统受到了“国家支持的供应商攻击”的影响。 10、Ewon Cosy+工业VPN网关存在严重漏洞 https://industrialcyber.co/industrial-cyber-attacks/critical-vulnerabilities-found-in-ewon-cosy-industrial-vpn-gateways/ 在Ewon Cosy+工业VPN网关中检测到安全漏洞,允许未经身份验证的攻击者获得对设备的root访问权限。通过这种访问和进一步的分析,SySS GmbH的研究人员发现了更多允许解密加密固件文件和加密数据(如配置文件中的密码)的问题。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景科技观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景科技无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景科技一律不予承担。
MFC框架软件逆向研究
MFC框架简介 什么是mfc? MFC库是开发Windows应用程序的C++接口。MFC提供了面向对象的框架,采用面向对象技术,将大部分的Windows API 封装到C++类中,以类成员函数的形式提供给程序开发人员调用。 简单来说,MFC是一种面向对象,用于开发windows应用程序的框架,突出特点是封装了大部分windows API,便于开发人员使用(写win挂方便)。 MFC程序的运行过程分为以下四步: 利用全局应用程序对象theApp启动应用程序。 调用全局应用程序对象的构造函数,从而调用基类(CWinApp)的构造函数,完成应用程序的一些初始化工作,并将应用程序对象的指针保存起来。 进入WinMain函数。在AfxWinMain函数中获取子类的指针,利用指针实现上述的三个函数,从而完成窗口的创建注册等工作。 进入消息循环,一直到WM_QUIT。 那么问题来了,我们如何逆向mfc程序呢?因为其封装了大部分windows API,逆向起来也复杂了不少,因为需要了解大量的windows api 并且熟悉windows编程。下面进行讲解。 MFC如何逆向 如下图,是MFC框架软件的基本界面,可以看到,就是一堆button,主要逆向也是check button。 那么,对于MFC逆向,我们主要需要知道的是,当我们执行某个操作(点击某个按钮)的时候,程序会执行什么处理函数。在mfc中,程序是使用消息机制来实现操作响应的,这个是消息映射表的代码: struct AFX_MSGMAP{    AFX_MSGMAP * pBaseMessageMap;    AFX_MSGMAP_ENTRY * lpEntries; } struct AFX_MSGMAP_ENTRY{    UINT nMessage;    //Windows Message    UINT nCode        //Control code or WM_NOTIFY code    UINT nID;         //control ID (or 0 for windows messages)    UINT nLastID;     //used for entries specifying a range of control id's    UINT nSig;        //signature type(action) or pointer to message    AFX_PMSG pfn;     //routine to call (or specical value) } 其中这个AFX_MSGMAP_ENTRY中的最后一个成员AFX_PMSG就是一个函数指针,指向了当前控件绑定的函数。同时,这个nID成员描述的是当前控件的ID,利用这个ID就能确定我们所寻找的控件。然后这个AFX_MSGMAP结构体则会记录一个指向AFX_MSGMAP_ENTRY的指针,于是查找控件的注册函数的思路可以缩小为: 找到AFX_MSGMAP 找到控件的ID --- 关键就是找ID 那么,我们又该怎么找到控件ID呢,俗话说“工欲善其事,必先利其器”,作为逆向分析人员,肯定要选择好分析的工具了,很庆幸,我们站在巨人的肩膀上,针对mfc软件程序的逆向分析,前辈们已经开发了一些非常好用的小工具,我们可以直接使用它们。例如: xspy ResourceHacker 彗星小助手 其中我们主要用的是xspy,mfc分析利器如下图所示 逆向实验-以CTF赛题为例讲解 demo1 - MFC初探 打开程序软件 程序的标题Flag就在控件中,然后界面内容是让我们找一个key。很明显,我们需要找到两个东西 标题找Flag(也就是找窗口句柄) 内容找key 根据这些内容,告诉我们我们去找控件,然后这时候就要掏出xspy了。不然的话,我们如果使用老一套经典分析流程,die+ida对用架构分析,会发生下面这样的事。首先die查个架构,查个壳 好家伙,VMP壳,PE32ida走起,如下图,emmm.... 这样的话,我们很难继续往下分析,所以我们使用xspy分析。使用方法如下图 首先我们找到了Flag_enc(944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b)我们知道特定的,窗口句柄叫 HWND 然后我们可以发现一条特殊的onMsgOnMsg:0464,func= 0x00402170(MFC1.exe+ 0x002170 )为什么特殊呢,因为只有它并不是以宏的形式出现,应该是作者自定义的消息,没有button等东西,所以程序怎么点击都无法触发任何效果;并且传入一个特殊数字0464,来触发效果。 那么,我们需要去发送这条消息来出发func函数以获取我们需要的key #include<Windows.h> #include<stdio.h> int main() { HWND h = FindWindowA(NULL, "Flag就在控件里"); if (h) { SendMessage(h, 0x0464, 0, 0); printf("success"); } else printf("failure"); } 使用 API FindWindow 获取窗口句柄,SendMessage发送消息,得到了key{I am a Des key} 最后DES解密即可 flag{thIs_Is_real_kEy_hahaaa} Junk_instruction-西湖论剑 下面,再讲解一道大型比赛的赛题来实验打开,看到这个朴素的界面可以鉴定是MFC框架。 我们看到了一个input,还有一个check button,很明显,我们首先就需要去找check button的id&注册函数。 xspy-MFC分析 check按钮的id为03e9,同时窗口存在OnCommand: notifycode=0000 id=03e9,func= 0x00C72420(Junk_Instruction.exe+ 0x002420 )函数。那么对应的check逻辑肯定在基址+偏移0x002420处。打开ida,找到check函数 sub_402420 ,如下图 可以看到有一个条件判断:if ( (unsigned __int8)sub_402600(v2 + 16) )。一眼顶针,两个分支分别是弹出正确和错误的对话框,为什么呢?if else函数体内容基本一样。当然我们还是动态调试一下 所以enc函数很明显就是sub_402600这个函数中就出现了很多垃圾指令了,也就对应上题目名称Junk_instruction了。 去花-IDA分析 爆红 花指令,经典call $+5起手,就是先用一个call压好返回地址,再把栈里的返回地址弹出来,改一下,压回去,如此反复。去掉也很简单,我们把下述累死指令块全部nop掉即可,有好几处,一模一样。 当然,我们使用idapython脚本自动去花    from ida_bytes import get_bytes, patch_bytes    import re    addr = 0x402600    end = 0x402fe3    buf = get_bytes(addr, end-addr)    def nopp(s):        s = s.group(0)        print("".join(["%02x"%i for i in s]))        s = b"\x90"*len(s)        return s    pattern  = b"\xe8\x00\x00\x00\x00\x58\x89.*?\xc3.*?\x22"    buf = re.sub(pattern , nopp, buf, flags=re.I)    patch_bytes(addr, buf)    print("Done") 加密 去除花指令,简单审计发现是对程序进行RC4加密,最后还对输入进行了个倒叙 去花后,整理一下,代码如下 char __thiscall sub_402600(void *this, int a2) {  const WCHAR *v2; // eax  void *v3; // eax  char v5[511]; // [esp+9h] [ebp-4BBh] BYREF  int v6; // [esp+208h] [ebp-2BCh]  char *v7; // [esp+20Ch] [ebp-2B8h]  int v8; // [esp+210h] [ebp-2B4h]  size_t Count; // [esp+214h] [ebp-2B0h]  int v10; // [esp+218h] [ebp-2ACh]  size_t v11; // [esp+21Ch] [ebp-2A8h]  char *v12; // [esp+220h] [ebp-2A4h]  char *v13; // [esp+224h] [ebp-2A0h]  int v14; // [esp+228h] [ebp-29Ch]  char v15[4]; // [esp+22Ch] [ebp-298h] BYREF  char *Source; // [esp+230h] [ebp-294h]  void *v17; // [esp+234h] [ebp-290h]  char cipher[32]; // [esp+238h] [ebp-28Ch]  const char *v19; // [esp+258h] [ebp-26Ch]  char *v20; // [esp+25Ch] [ebp-268h]  int i; // [esp+260h] [ebp-264h]  char *p_Destination; // [esp+264h] [ebp-260h]  char v23; // [esp+26Dh] [ebp-257h]  char v24; // [esp+26Eh] [ebp-256h]  char v25; // [esp+26Fh] [ebp-255h]  char v26[28]; // [esp+270h] [ebp-254h] BYREF  char v27[256]; // [esp+28Ch] [ebp-238h] BYREF  char key[256]; // [esp+38Ch] [ebp-138h] BYREF  char Destination; // [esp+48Ch] [ebp-38h] BYREF  char v30[39]; // [esp+48Dh] [ebp-37h] BYREF  int v31; // [esp+4C0h] [ebp-4h]  v17 = this;  v31 = 3;  cipher[0] = 91;  cipher[1] = -42;  cipher[2] = -48;  cipher[3] = 38;  cipher[4] = -56;  cipher[5] = -35;  cipher[6] = 25;  cipher[7] = 126;  cipher[8] = 110;  cipher[9] = 62;  cipher[10] = -53;  cipher[11] = 22;  cipher[12] = -111;  cipher[13] = 125;  cipher[14] = -1;  cipher[15] = -81;  cipher[16] = -35;  cipher[17] = 118;  cipher[18] = 100;  cipher[19] = -80;  cipher[20] = -9;  cipher[21] = -27;  cipher[22] = -119;  cipher[23] = 87;  cipher[24] = -126;  cipher[25] = -97;  cipher[26] = 12;  cipher[27] = 0;  cipher[28] = -98;  cipher[29] = -48;  cipher[30] = 69;  cipher[31] = -6;  v2 = (const WCHAR *)sub_401570(&a2);  v14 = sub_4030A0(v2);  v10 = v14;  v3 = (void *)sub_401570(v14);  sub_403000(v3);  sub_4012A0(v15);  Source = (char *)unknown_libname_1(v26);  v20 = Source;  v13 = Source + 1;  v20 += strlen(v20);  v11 = ++v20 - (Source + 1);  Count = v11;  Destination = 0;  memset(v30, 0, sizeof(v30));  strncpy(&Destination, Source, v11);  if ( sub_402AF0(&Destination) ) {    v23 = 0;    v25 = 0; LABEL_7:    v24 = v25; }  else {    strcpy(key, "qwertyuiop");                  // key    memset(&key[11], 0, 0xF5u);    memset(v27, 0, sizeof(v27));    memset(v5, 0, sizeof(v5));    v19 = key;    v7 = &key[1];    v19 += strlen(v19);    v6 = ++v19 - &key[1];    RC4_init((int)v27, key, v19 - &key[1]);     // RC4_init    p_Destination = &Destination;    v12 = v30;    p_Destination += strlen(p_Destination);    v8 = ++p_Destination - v30;    RC4_crypt((int)v27, (int)&Destination, p_Destination - v30);// RC4_crypto    for ( i = 31; i >= 0; --i )   {      if ( v30[i - 1] != cipher[i] )            // 倒叙     {        v25 = 0;        goto LABEL_7;     }   }    v24 = 1; }  LOBYTE(v31) = 0;  sub_403060(v26);  v31 = -1;  sub_4012A0(&a2);  return v24; } 解密 首先提取密文,利用插件Lazy_ida 5BD6D026C8DD197E6E3ECB16917DFFAFDD7664B0F7E58957829F0C009ED045FA key-->qwertyuiop cyberchef 得解 flag{973387a11fa3f724d74802857d3e052f}
网络安全日报 2024年08月14日
1、韩国称朝鲜黑客窃取K2坦克和侦察机技术数据 https://www.hankyung.com/article/202408078398i 2024年8月12日,韩国执政党国民力量党(PPP)宣称朝鲜黑客窃取了关于韩国K2主战坦克以及“白头”和“金刚”侦察机的重要技术信息。据当地媒体报道,K2坦克数据泄露发生在其零部件制造商的工程师跳槽至竞争公司时,这些工程师带走了设计蓝图、开发报告和过压系统的详细信息。新雇主试图将这项技术出口到中东国家,因此泄露问题可能已超出韩国范围。关于白头和金刚侦察机,《东亚日报》报道称,生产包括这两架侦察机在内的军事设备操作和维护手册的韩国防务承包商被朝鲜黑客入侵。黑客窃取了两架侦察机的重要技术数据,包括技术细 2、 黑客假冒乌克兰安全局感染100台政府电脑 https://cert.gov.ua/article/6280345 乌克兰计算机应急响应小组(CERT-UA)披露,攻击者假冒乌克兰安全局(SSU)通过恶意垃圾邮件攻击该国政府机构的系统,成功感染了超过100台电脑,安装了AnonVNC恶意软件。这些攻击始于7月12日,攻击者利用带有链接的电子邮件,将收件人引导至一个名为Documents.zip的压缩文件,实则是下载一个包含恶意软件的Windows安装程序MSI文件。CERT-UA表示,这些攻击使得被追踪为UAC-0198的威胁组织能够秘密访问被妥协的电脑,尽管未提供恶意软件的具体功能描述。CERT-UA已确认超过100台受影响的电脑, 3、澳大利亚黄金生产商Evolution Mining遭遇勒索软件攻击 https://evolutionmining.com.au/storage/2024/08/2759355-Cyber-Security-Incident.pdf 澳大利亚著名黄金生产商Evolution Mining遭遇勒索软件攻击,导致其IT系统受到影响。该公司已聘请外部网络安全专家进行修复,目前攻击已被完全遏制。Evolution Mining是澳大利亚最大的黄金生产商之一,尽管此次勒索软件攻击对IT系统造成了干扰,但公司表示这不会对运营产生实质性影响。这表明,攻击者可能未加密任何系统或未攻击生产关键的工作站,矿业运营将继续不受影响。澳大利亚网络安全中心已被通知此次事件。截至目前,尚 4、FBI关闭了攻击了数十家公司的"Radar"勒索软件的服务器 https://www.fbi.gov/contact-us/field-offices/cleveland/news/international-investigation-leads-to-shutdown-of-ransomware-group?7194ef805fa2d04b0f7e8c9521f97343 FBI克利夫兰分局宣布成功破获了由网名“Brain”领导的勒索软件组织“Radar/Dispossessor”,并拆除了三台美国服务器、三台英国服务器、十八台德国服务器、八个美国域名和一个德国域名。自2023年8月成立以来,Radar/Dispossessor迅速发展成为一个国际 5、东谷理工学院数据泄露影响20万人 https://www.maine.gov/agviewer/content/ag/985235c7-cb95-4be2-8792-a1252b4f8318/e1ddfb24-c68c-48f2-9b14-79b5bb76048d.html 东谷理工学院(EVIT)通知超过200000名个人,他们的个人和健康信息在最近的数据泄露事件中被泄露。此次事件发生于1月9日,当时威胁行为者未经授权访问了EVIT的网络,获取了当前和前学生、教职员工及家长的敏感信息。可能被泄露的信息包括姓名、地址、电子邮件地址、社会安全号码、出生日期、驾驶执照、学生证号码、种族/民族信息、账户号码、医疗信息、助学金信息以 6、微软警告称六个 Windows 零日漏洞正被积极利用 https://www.securityweek.com/microsoft-warns-of-six-windows-zero-days-being-actively-exploited/ 微软周二警告称,Windows 系统中存在六个被积极利用的安全缺陷,微软的安全响应团队发布了有关 Windows 和操作系统组件中近 90 个漏洞的文档,并标记了多个属于主动利用类别的漏洞。 7、多款AMD CPU 受Sinkclose漏洞影响,AMD称不易被利用 https://www.securityweek.com/amd-says-new-sinkclose-cpu-vulnerability-only-affects-seriously-breached-systems/ 网络安全研究公司 IOActive 披露了影响 AMD 处理器的新漏洞的细节,但该芯片巨头指出,该漏洞不易被利用。 该漏洞被称为Sinkclose,编号为 CVE-2023-31315,针对的是系统管理模式 (SMM),这是 x86 处理器中用于低级系统管理功能的高权限操作模式。 据 IOActive 称,Sinkclose 漏洞已存在近二十年,可让攻击者获得对目标系统的深 8、NIST 正式公布后量子密码标准 https://www.securityweek.com/post-quantum-cryptography-standards-officially-announced-by-nist-a-history-and-explanation/ NIST 正式发布了其举办的竞赛中的三项后量子密码标准,旨在开发能够承受当前非对称加密预期的量子计算解密的密码技术。 9、针对严重 Ivanti vTM 漏洞的 PoC 代码现已发布 https://securityaffairs.com/166991/hacking/ivanti-virtual-traffic-manager-flaw.html Ivanti 解决了一个严重的身份验证绕过漏洞,编号为 CVE-2024-7593(CVSS 评分为 9.8),该漏洞影响虚拟流量管理器 (vTM) 设备,可能允许攻击者创建恶意管理员帐户。 10、《联合国打击网络犯罪公约》顺利通过 https://www.secrss.com/articles/69016 纽约时间8月8日下午,联合国打击网络犯罪公约特委会顺利通过公约草案。公约系网络领域首个由联合国主持制定的普遍性国际公约,将在全球范围内为打击网络犯罪国际合作提供法律框架,对网络空间国际法发展也有重大意义。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景科技观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景科技无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景科技一律不予承担。
网络安全日报 2024年08月13日
1、 恶意PyPI库Solana用户窃取区块链钱包密钥 https://www.sonatype.com/blog/an-ideal-pypi-typosquat-solana-py-is-here-to-steal-your-crypto-keys 2024年8月11日,研究人员发现了一个新的恶意软件包,该包在Python软件包索引(PyPI)上伪装成Solana区块链平台的库,旨在窃取用户的钱包密钥。研究人员发布的报告中指出,这个恶意包名为“solana-py”,而真正的Solana Python API项目在GitHub上称为“solana-py”,在PyPI上则为“solana”。恶意“solana-py”包自2024年8月4日发布以来, 2、勒索软件组织Rhysida声称窃取两家医疗系统数据 https://www.govinfosecurity.com/rhysida-claims-major-data-theft-from-2-more-health-systems-a-25997 勒索软件组织Rhysida宣称对两家新的医疗系统——Bayhealth和Community Care Alliance(CCA)进行了大规模数据盗窃。Rhysida威胁将患者的敏感健康和个人信息在暗网上出售或公开。位于特拉华州的非营利医疗系统Bayhealth拥有多家医院、4000名员工和650名医生及其他临床医护人员。Rhysida声称窃取了Bayhealth患者的个人信息,并要求支付25个比特 3、谷歌Quick Share文件传输工具中存在数十个安全漏洞 https://www.safebreach.com/blog/rce-attack-chain-on-quick-share 研究人员在Google的Quick Share数据传输工具中发现了多达10个安全漏洞,这些漏洞可被组合利用,触发远程代码执行(RCE)链,从而在安装该软件的系统上运行任意代码。Quick Share是一种点对点文件共享工具,允许用户在Android设备、Chromebook和Windows桌面及笔记本电脑之间传输文件。研究人员通过分析Quick Share的协议,发现了9个影响Windows版本和1个影响Android版本的漏洞。这些漏洞包括6个远程拒绝服务(DoS 4、微软发现OpenVPN漏洞链可实现远程代码执行和权限提升 https://www.microsoft.com/en-us/security/blog/2024/08/08/chained-for-attack-openvpn-vulnerabilities-discovered-leading-to-rce-and-lpe/ 微软研究人员在Black Hat USA 2024大会上披露了OpenVPN中的四个中等严重性漏洞,这些漏洞可以被组合利用,达成远程代码执行(RCE)和本地权限提升(LPE)。OpenVPN是一款开源软件,提供建立虚拟专用网络(VPN)连接的安全灵活方式。根据微软发布的报告,攻击者可以利用这些漏洞对目标端点进行全面控制,可能导 5、Ewon Cosy+工业远程访问工具存在多个漏洞易受攻击 https://blog.syss.com/posts/hacking-a-secure-industrial-remote-access-gateway/ 研究人员披露了Ewon Cosy+工业远程访问解决方案中的多个安全漏洞,这些漏洞可被滥用以获取设备的root权限,并策划后续攻击。攻击者可以利用持久性跨站脚本(XSS)漏洞以及设备在未受保护的名为credentials的cookie中存储Base64编码的当前Web会话凭据,从而获得管理访问权限并最终获取root权限。未认证的攻击者通过结合这些漏洞并等待管理员用户登录设备,即可获得root访问权限。这条攻击链可以进一步扩展来设置持久性、 6、微软警告未修补的Office漏洞将导致数据泄露 https://msrc.microsoft.com/update-guide/vulnerability/CVE-2024-38200 微软披露了一个未修补的Office零日漏洞(CVE-2024-38200),如果成功利用,可能导致敏感信息泄露给恶意行为者。该漏洞的CVSS评分为7.5,被描述为一种欺骗漏洞。研究人员发现并报告了该漏洞。微软在公告中表示,在基于网络的攻击场景中,攻击者可以托管含有特制文件的网站(或利用被攻陷的网站),该文件旨在利用此漏洞。然而,攻击者无法强迫用户访问网站,而是需要通过电子邮件或即时消息引诱用户点击链接并打开特制文件。微软预计将在8月13日发布正式补丁,但已 7、FreeBSD 发布针对高危OpenSSH 漏洞的紧急补丁 https://thehackernews.com/2024/08/freebsd-releases-urgent-patch-for-high.html FreeBSD 项目的维护人员发布了安全更新,以解决 OpenSSH 中的一个高严重性漏洞,攻击者可能利用该漏洞以提升的权限远程执行任意代码。该漏洞的编号为CVE-2024-7589,CVSS 评分为 7.4(满分 10.0),表明该漏洞的严重性极高。 8、EastWind 攻击活动利用复杂的后门针对俄罗斯组织 https://securityaffairs.com/166924/apt/eastwind-campaign-targets-russian-organizations.html 一项名为 EastWind 的活动利用 PlugY 和 GrewApacha 后门针对俄罗斯政府和 IT 组织。 9、1Password mac版存在严重漏洞,可能允许黑客窃取用户密码 https://www.helpnetsecurity.com/2024/08/09/cve-2024-42219-cve-2024-42218 AgileBits 已确认,影响流行的 1Password 密码管理器 macOS 版本的两个漏洞 (CVE-2024-42219、CVE-2024-42218) 可能允许恶意软件窃取存储在软件保险库中的secrets并获取帐户解锁密钥。 10、研究称AI 模型在从暗网论坛收集威胁情报的准确率达98% https://cybersecuritynews.com/ai-model-achieve-98-accuracy-in-collecting-threat-intelligence/ 在最近的一项研究中,蒙特利尔大学和 Flare Systems 的研究人员证明,大型语言模型 (LLM) 可以从网络犯罪论坛中准确提取关键的网络威胁情报 (CTI),准确率高达 98%。这些研究结果发表在一份白皮书中,强调了人工智能在加强网络安全工作方面的巨大潜力。 声明 以上内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景科技观点,因此第三方对以上内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景科技无关。以上内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景科技一律不予承担。
游戏安全入门-扫雷分析&远程线程注入
前言 无论学习什么,首先,我们应该有个目标,那么入门windows游戏安全,脑海中浮现出来的一个游戏 -- 扫雷,一款家喻户晓的游戏,虽然已经被大家分析的不能再透了,但是我觉得自己去分析一下还是极好的,把它作为一个小目标再好不过了。 我们编写一个妙妙小工具,工具要求实现以下功能:时间暂停、修改表情、透视、一键扫雷等等。 本文所用工具: Cheat Engine、x32dbg(ollydbg)、Visual Studio 2019 扫雷游戏分析 游戏数据在内存中是地址,那么第一个任务,找内存地址 打开CE修改器 修改时间->时间暂停 计数器的时间是一个精确的值,所以我们通过精确数值扫描出来,游戏开始之前计数器上的数是0,所以我们扫描0。 时间在变化,选择介于什么数值之间再次扫描 可得 0x100579c --- winmine.exe+579C 我们发现这个数据都是直接通过基址 + 固定偏移能直接得到的。 然后我们对数据去找 是什么改写了这个地址,得到一个指令和指针: 时间:0x100579c 修改表情 - 没啥用 修改表情这个功能怎么搞我觉得还是很容易想到的,这个按钮的作用是重新开始游戏,开始游戏,游戏胜利,游戏失败。 (表情的状态被分成了两个变量(4byte)来控制) 所以它是一种状态,所以我们通过0和1进行扫描,游戏进行状态输入1进行扫描,还原游戏之后输入0进行扫描。 首先是游戏进行状态,输入1进行扫描 再点击表情,将游戏还原,输入0开始扫描 如此反复进行扫描,得到表情的内存地址 0x1005164 -- winmine.exe+5164 但是嘞,修改成2或者3,表情没有心得反应,所以控制游戏胜利和游戏失败的是其他的地址,我们知道,一般来说,一个功能的代码在内存中基本上都是连续的,(就像你修改一个游戏的血量,浏览血量内存块,你可以发现怒气,蓝量等内存地址) 所以,我们浏览内存 0x1005164-4 = 0x1005160 修改为3,发现出现了戴墨镜的表情(游戏胜利) 但是这个胜利知识一个状态,并不能说明扫雷完成. 表情:0x1005160与0x1005164 透视 - 显示雷区 思考游戏结束的时候会自动显示所有的雷,因此我们动态调试,看看在哪个函数调用之后会显示所有的雷 经过几次的动态调试之后发现:0x2F80函数是我们要找的结果。 一键扫雷 通过透视,我们玩一把游戏,使得游戏胜利(点完最后一个) 然后后两个函数,是破纪录跟英雄榜的函数 ret来到了这儿,游戏通关了,来到了这儿,可以知道,这个0x347c就是判断输赢的函数 并且通过调试发现由一个参数 0 1 来控制,所以跟透视差不多,带个参数线程回调就完了 编写妙妙小工具 怎么实现这个工具呢,当然是选择DLL注入 那么dll 怎么注入进去呢,这里选择远程线程注入 这里先简单介绍下什么是远程线程注入 前置知识-动态调用dll 主要就是这几个个 API: LoadLibraryA 加载指定 DLL 并返回模块句柄,参数为字符串,就是 dll 的路径。 GetProcAddress 获取指定 dll 的导出函数的地址。 第一个参数是模块句柄,第二个参数是模块函数,返回值为函数的地址。 通过这两个函数,我们可以拿到所有函数的地址,然后就能进行调用。 CreateThread - 远程线程注入 里面几乎只有一个参数,那就是线程回调函数,然后当然还有返回地址,返回线程 id 啥的,这里我们都可以不用管,几乎是与 Linux 的创建线程函数一致。 还有一个远程版本的叫 CreateRemoteThread,它可以给别的进程创建一个线程并可以在本进程创建那个进程调用的回调函数。我们可以在回调函数中加载指定的 dll,在 dllmain 的入口当中,有一个 switch 的四个选项。 // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" BOOL APIENTRY DllMain( HMODULE hModule,//指向自身的句柄                       DWORD  ul_reason_for_call,//调用原因                       LPVOID lpReserved//隐式加载or显式加载                     ) {    switch (ul_reason_for_call)   {    case DLL_PROCESS_ATTACH://附加到进程上时执行    case DLL_THREAD_ATTACH://附加到线程上时执行    case DLL_THREAD_DETACH://从线程上剥离时执行    case DLL_PROCESS_DETACH://从进程上剥离时执行        break;   }    return TRUE; } 我们可以在 DLL_PROCESS_ATTACH 的选项中加入代码,让它在加载的时候调用执行。 那么我们的步骤是: 打开指定进程获得句柄 开辟远程进程的空间,分配可读可写段。 调用 WriteProcessMemory 将 dll 路径写入该内存区域。 创建远程线程,回调函数使用 LoadLibrary 加载指定 dll。 等待返回(loadLibrary返回) 释放空间 释放句柄 返回结果 demo: void Inject(DWORD ProcessId, const char* szPath) {    //1.打开目标进程获取句柄    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);    printf("进程句柄:%p\n", hProcess);    //2.在目标进程体内申请空间    LPVOID lpAddress = VirtualAllocEx(hProcess, NULL, 0x100, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);    //3.写入DLL路径    SIZE_T dwWriteLength = 0;    WriteProcessMemory(hProcess, lpAddress, szPath, strlen(szPath), &dwWriteLength);    //4.创建远程线程,回调函数使用 LoadLibrary 加载指定 dll    HANDLE hThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpAddress, NULL, NULL);    //5.等待返回(loadLibrary返回)    WaitForSingleObject(hThread, -1);    //6.释放空间    VirtualFreeEx(hProcess, lpAddress, 0, MEM_RELEASE);    //7.释放句柄    CloseHandle(hProcess);    CloseHandle(hThread);    //返回结果    AfxMessageBox(L"完成"); } 编写DLL注入器 #include<windows.h> #include<iostream> #include<time.h> #include<stdlib.h> #include<TlHelp32.h> DWORD FindProcess() {    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    PROCESSENTRY32 pe32;    pe32 = { sizeof(pe32) };    BOOL ret = Process32First(hSnap, &pe32);    while (ret)   {        if (!wcsncmp(pe32.szExeFile, L"mine.exe", 11)) {            printf("Find winmine.exe Process %d\n", pe32.th32ProcessID);            return pe32.th32ProcessID;       }        ret = Process32Next(hSnap, &pe32);   }    return 0; } void Inject(DWORD ProcessId, const char* szPath) {    //1.打开目标进程获取句柄    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);    printf("进程句柄:%p\n", hProcess);    //2.在目标进程体内申请空间    LPVOID lpAddress = VirtualAllocEx(hProcess, NULL, 0x100, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);    //3.写入DLL路径    SIZE_T dwWriteLength = 0;    WriteProcessMemory(hProcess, lpAddress, szPath, strlen(szPath), &dwWriteLength);    //4.创建远程线程,回调函数使用 LoadLibrary 加载指定 dll    HANDLE hThread = CreateRemoteThread(hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpAddress, NULL, NULL);    //5.等待返回(loadLibrary返回)    WaitForSingleObject(hThread, -1);    //6.释放空间    VirtualFreeEx(hProcess, lpAddress, 0, MEM_RELEASE);    //7.释放句柄    CloseHandle(hProcess);    CloseHandle(hThread); } int main() {    DWORD ProcessId = FindProcess();    while (!ProcessId) {        printf("未找到扫雷程序,等待两秒中再试\n");        Sleep(2000);        ProcessId = FindProcess();   }    printf("开始注入进程...\n");    Inject(ProcessId, "E:\\CODE\\wimine\\Mine\\release\\Mine.dll");    printf("注入完毕\n"); } 编写DLL 这里我们采用MFC DLL 基于对话框 (dialog)的方式编写(简单),使用静态编译的方式 然后我们需要在资源窗体,新建一个 Dialog ,简单包装一个界面 这样我们在加载窗体的时候需要创建一个窗体类对象用它的 DoModal 方法去显示,用线程回调的方式加载并且初始化InitInstance DWORD WINAPI DlgThreadCallBack(LPVOID lp) {    MineDlg* Dlg;    Dlg = new MineDlg();    Dlg->DoModal();    delete Dlg;    FreeLibraryAndExitThread(theApp.m_hInstance, 1);    return 0; } // CMineApp 初始化 BOOL CMineApp::InitInstance() {    CWinApp::InitInstance();   ::CreateThread(NULL, NULL, DlgThreadCallBack, NULL, NULL, NULL);    return TRUE; } 时间暂停 上面我们找到了它控制时间增加的指令,我们把它们全部 NOP 掉,就可以实现时间暂停 写两个按钮,创建下面的事件实现时间暂停开关。 DWORD GetBaseAddr() {    HMODULE hMode = GetModuleHandle(nullptr);    //LPWSTR s = (LPWSTR)malloc(0x100);    //wsprintf(s, L"基址:%p", hMode);    //AfxMessageBox(s);    return (DWORD)hMode; } void MineDlg::OnBnClickedButton1() // 时间暂停 {    // TODO: 在此添加控件通知处理程序代码    auto BaseAddr=GetBaseAddr();    DWORD TimeOffset = 0x579C;    DWORD TimeInsOffset = 0x2FF5;    DWORD InsLen = 6;    DWORD old;    VirtualProtect((void*)(BaseAddr + TimeInsOffset), InsLen, PAGE_EXECUTE_READWRITE, &old);    BYTE INS[] = { 0x90,0x90,0x90,0x90,0x90,0x90 };    memcpy((void *)(BaseAddr + TimeInsOffset), INS, InsLen);    VirtualProtect((void*)(BaseAddr + TimeInsOffset), InsLen, old, &old); } void MineDlg::OnBnClickedButton2() // 恢复字节即可取消时间暂停 {    // TODO: 在此添加控件通知处理程序代码    auto BaseAddr = GetBaseAddr();    DWORD TimeOffset = 0x579C;    DWORD TimeInsOffset = 0x2FF5;    DWORD InsLen = 6;    DWORD old;    VirtualProtect((void*)(BaseAddr + TimeInsOffset), InsLen, PAGE_EXECUTE_READWRITE, &old);    BYTE INS[] = { 0xFF,0x05,0x9C,0x57,0x00,0x01 };    memcpy((void*)(BaseAddr + TimeInsOffset), INS, 6);    VirtualProtect((void*)(BaseAddr + TimeInsOffset), InsLen, old, &old); } 测试 透视 经过上面动态调试我们得出结论:0x2F80函数是踩雷函数。 我们如果调用这个函数,是不是就能够实现透视了呢? 我们依旧采取线程回调的方式 void MineDlg::OnBnClickedButton3() {    // TODO: 在此添加控件通知处理程序代码    DWORD ESPOffset = 0x2f80;    DWORD FuncAddr = GetBaseAddr() + ESPOffset;    // 创建不带参数的线程    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)FuncAddr, NULL, 0, NULL); } 测试 一键扫雷 跟透视差不多,只不过创建带参数的线程回调 void MineDlg::OnBnClickedButton4() {    // TODO: 在此添加控件通知处理程序代码    DWORD ESPOffset = 0x347C;    DWORD FuncAddr = GetBaseAddr() + ESPOffset;    //创建带参数的线程    struct { int a; } s = { 0 };    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)FuncAddr, &s, NULL, NULL); } 测试 总结 通过这个小项目,对WIN游戏安全有初步的认识,并且加强对软件的逆向思维,增强动态调试的能力,找到软件关键的基地址,通过CE修改器,初步pojie软件,了解软件的状态,修改时间(时间暂停等等),理解几个重要的API,FindWindow获取句柄,WriteProcessMemory写入内存信息,LoadLibraryA加载指定 DLL 并返回模块句柄,GetProcAddress,获取指定 dll 的导出函数的地址,CreateThread 线程回调函数等等。多写,多做,多调,多实验,加油,互勉。
第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页