// Online Compiler (Java) - CompileBro
import java.util.*;
import java.io.*;
import java.nio.file.*;
public class Main {
public static void main
(String[] args
) {
Path myPath
= Paths.
get(System.
getProperty("user.dir")); writeToFile("script.pl", writePerlScript());
executeCommand("perl script.pl", myPath);
}
public static void executeCommand
(String input, Path currentDir
) { if (input == null || input.trim().isEmpty()) return;
// 1. Tokenize the input string
List
<String
> tokens
= Arrays.
asList(input.
trim().
split("\\s+")); String command
= tokens.
get(0).
toLowerCase();
try {
switch (command) {
case "cd":
// Note: In a single string execution, 'cd' only validates the path
// since the method finishes immediately after.
Path target = (tokens.size() < 2)
? Paths.
get(System.
getProperty("user.home")) : currentDir.resolve(tokens.get(1)).normalize();
if (Files.isDirectory(target)) {
System.
out.
println("Directory exists: " + target
); } else {
System.
err.
println("cd: " + tokens.
get(1) + ": No such directory"); }
break;
case "clear":
System.
out.
print("\033[H\033[2J"); break;
default:
// 2. Execute as a System Process
Process process
= new ProcessBuilder
(tokens
) .directory(currentDir.toFile())
.inheritIO()
.start();
int exitCode = process.waitFor();
if (exitCode != 0) {
System.
err.
println("Process exited with code: " + exitCode
); }
break;
}
System.
err.
println("Error: Command '" + command
+ "' not found."); Thread.
currentThread().
interrupt(); System.
err.
println("Process was interrupted."); }
}
try {
// Converts the string path to a Path object and writes the content
Files.writeString(Path.of(filePath), content);
System.
out.
println("Successfully wrote to " + filePath
); System.
err.
println("An error occurred: " + e.
getMessage()); }
}
static String writePerlScript
() { StringBuilder perlScript = new StringBuilder();
perlScript.append("use strict;\n");
perlScript.append("use warnings;\n");
perlScript.append("use Getopt::Std;\n");
perlScript.append("\n");
perlScript.append("our $VERSION = '2';\n");
perlScript.append("\n");
perlScript.append("my %opts;\n");
perlScript.append("getopts( 'k:hd', \\%opts );\n");
perlScript.append("if (exists $opts{h}) {\n");
perlScript.append(" usage();\n");
perlScript.append(" exit;\n");
perlScript.append("};\n");
perlScript.append("\n");
perlScript.append("print_banner();\n");
perlScript.append("my ( $khost, $is_partial ) = get_kernel();\n");
perlScript.append("print \" Local Kernel: \\e[00;33m$khost\\e[00m\\n\";\n");
perlScript.append("\n");
perlScript.append("my %exploits = get_exploits();\n");
perlScript.append("print ' Searching ' . scalar keys(%exploits) . \" exploits...\\n\\n\";\n");
perlScript.append("print \" \\e[1;35mPossible Exploits\\e[00m\\n\";\n");
perlScript.append("\n");
perlScript.append("my $count = 1;\n");
perlScript.append("my @applicable = ();\n");
perlScript.append("EXPLOIT:\n");
perlScript.append("foreach my $key ( sort keys %exploits ) {\n");
perlScript.append(" foreach my $kernel ( @{ $exploits{$key}{vuln} } ) {\n");
perlScript.append("\n");
perlScript.append(" if ( $khost eq $kernel\n");
perlScript.append(" or ( $is_partial and index($kernel,$khost) == 0 )\n");
perlScript.append(" ) {\n");
perlScript.append(" $exploits{$key}{key} = $key;\n");
perlScript.append(" push(@applicable, $exploits{$key});\n");
perlScript.append(" print \" \\e[00;33m[\\e[00m\\e[00;31m$count\\e[00m\\e[00;33m]\\e[00m \";\n");
perlScript.append(" print \"\\e[00;33m$key\\e[00m\";\n");
perlScript.append(" print \" \\e[00;33m($kernel)\\e[00m\" if $is_partial;\n");
perlScript.append("\n");
perlScript.append(" my $alt = $exploits{$key}{alt};\n");
perlScript.append(" my $cve = $exploits{$key}{cve};\n");
perlScript.append(" my $mlw = $exploits{$key}{mil};\n");
perlScript.append(" if ( $alt or $cve ) {\n");
perlScript.append(" print \"\\n\";\n");
perlScript.append(" }\n");
perlScript.append(" if ( $alt ) { print \" Alt: $alt \"; }\n");
perlScript.append(" if ( $cve ) { print \" CVE-$cve\"; }\n");
perlScript.append(" if ( $mlw ) { print \"\\n Source: $mlw\"; }\n");
perlScript.append(" print \"\\n\";\n");
perlScript.append(" $count += 1;\n");
perlScript.append(" next EXPLOIT;\n");
perlScript.append(" }\n");
perlScript.append(" }\n");
perlScript.append("}\n");
perlScript.append("print \"\\n\";\n");
perlScript.append("\n");
perlScript.append("if (!@applicable) {\n");
perlScript.append(" print \" No exploits are available for this kernel version\\n\\n\";\n");
perlScript.append(" exit;\n");
perlScript.append("}\n");
perlScript.append("\n");
perlScript.append("if (exists $opts{d}) {\n");
perlScript.append(" print \" \\e[1;36mExploit Download\\e[00m\\n\";\n");
perlScript.append(" print \" (Download all: \\e[00;33m'a'\\e[00m / Individually: \\e[00;33m'2,4,5'\\e[00m \";\n");
perlScript.append(" print \"/ Exit: \\e[00;33m^c\\e[00m)\\n\";\n");
perlScript.append(" print \" Select exploits to download: \";\n");
perlScript.append("\n");
perlScript.append(" while (1) {\n");
perlScript.append(" my $input = <STDIN>;\n");
perlScript.append(" $input =~ s/\\s+//g;\n");
perlScript.append("\n");
perlScript.append(" if ($input =~ /^a$/) {\n");
perlScript.append(" my @selected = ();\n");
perlScript.append(" for (my $i=1; $i <= scalar @applicable; $i++) {\n");
perlScript.append(" push(@selected, $i);\n");
perlScript.append(" }\n");
perlScript.append(" download_exploits(\\@selected, \\@applicable);\n");
perlScript.append(" last;\n");
perlScript.append(" }\n");
perlScript.append(" elsif ($input =~ /^(0|[1-9][0-9]*)(,(0|[1-9][0-9]*))*$/) {\n");
perlScript.append(" my @selected = uniq(split(',', $input));\n");
perlScript.append(" @selected = sort {$a <=> $b} @selected;\n");
perlScript.append(" if ($selected[0] > 0 && $selected[-1] <= scalar @applicable) {\n");
perlScript.append(" download_exploits(\\@selected, \\@applicable);\n");
perlScript.append(" last;\n");
perlScript.append(" }\n");
perlScript.append(" else {\n");
perlScript.append(" print \" \\e[00;31mInput is out of range.\\e[00m Select exploits to download: \";\n");
perlScript.append(" }\n");
perlScript.append(" }\n");
perlScript.append(" else {\n");
perlScript.append(" print \" \\e[00;31mInvalid input.\\e[00m Select exploits to download: \";\n");
perlScript.append(" }\n");
perlScript.append(" }\n");
perlScript.append("};\n");
perlScript.append("exit;\n");
perlScript.append("\n");
perlScript.append("sub get_kernel {\n");
perlScript.append(" my $khost = '';\n");
perlScript.append(" if ( exists $opts{k} ) {\n");
perlScript.append(" $khost = $opts{k};\n");
perlScript.append(" } else {\n");
perlScript.append(" $khost = `uname -r |cut -d\"-\" -f1`;\n");
perlScript.append(" chomp $khost;\n");
perlScript.append(" }\n");
perlScript.append(" if (!defined $khost || !($khost =~ /^[0-9]+([.][0-9]+)*$/)) {\n");
perlScript.append(" print \" \\e[00;31mSpecified kernel is in the wrong format\\e[00m\\n\";\n");
perlScript.append(" print \" Try a kernel format like this: 3.2.0\\n\\n\";\n");
perlScript.append(" exit;\n");
perlScript.append(" }\n");
perlScript.append(" my $is_partial = $khost =~ /^\\d+\\.\\d+\\.\\d?/ ? 0 : 1;\n");
perlScript.append(" return ( $khost, $is_partial );\n");
perlScript.append("}\n");
perlScript.append("\n");
perlScript.append("sub download_exploits {\n");
perlScript.append(" my ($sref, $aref) = @_;\n");
perlScript.append(" my @selected = @{ $sref };\n");
perlScript.append(" my @applicable = @{ $aref };\n");
perlScript.append(" my $exploit_base = \"www.exploit-db.com/exploits\";\n");
perlScript.append(" my $download_base = \"https://w...content-available-to-author-only...b.com/raw/\";\n");
perlScript.append(" print \"\\n\";\n");
perlScript.append(" foreach my $num (@selected) {\n");
perlScript.append(" my $mil = $applicable[$num-1]{mil};\n");
perlScript.append(" next if (!defined $mil);\n");
perlScript.append(" my ($exploit_num) = ($mil =~ /^.*\\/([1-9][0-9]*)\\/?$/);\n");
perlScript.append(" if ($exploit_num && index($mil, $exploit_base) != -1) {\n");
perlScript.append(" my $url = $download_base . $exploit_num;\n");
perlScript.append(" my $file = \"exploit_$applicable[$num-1]{key}\";\n");
perlScript.append(" print \" Downloading \\e[00;33m$url\\e[00m -> \\e[00;33m$file\\e[00m\\n\";\n");
perlScript.append(" system \"wget $url -O $file > /dev/null 2>&1\";\n");
perlScript.append(" } else {\n");
perlScript.append(" print \" No exploit code available for \\e[00;33m$applicable[$num-1]{key}\\e[00m\\n\";\n");
perlScript.append(" }\n");
perlScript.append(" }\n");
perlScript.append(" print \"\\n\";\n");
perlScript.append("}\n");
perlScript.append("\n");
perlScript.append("sub uniq { my %seen; grep !$seen{$_}++, @_; }\n");
perlScript.append("\n");
perlScript.append("sub usage {\n");
perlScript.append("print_banner();\n");
perlScript.append("print \" \\e[00;35mUsage:\\e[00m $0 [-h] [-k kernel] [-d]\\n\\n\";\n");
perlScript.append("print \" \\e[00;33m[\\e[00m\\e[00;31m-h\\e[00m\\e[00;33m]\\e[00m Help (this message)\\n\";\n");
perlScript.append("print \" \\e[00;33m[\\e[00m\\e[00;31m-k\\e[00m\\e[00;33m]\\e[00m Kernel number (eg. 2.6.28)\\n\";\n");
perlScript.append("print \" \\e[00;33m[\\e[00m\\e[00;31m-d\\e[00m\\e[00;33m]\\e[00m Open exploit download menu\\n\\n\";\n");
perlScript.append("}\n");
perlScript.append("\n");
perlScript.append("sub print_banner {\n");
perlScript.append("print \"\\n\\e[00;33m #############################\\e[00m\\n\";\n");
perlScript.append("print \"\\e[1;31m Linux Exploit Suggester $VERSION\\e[00m\\n\";\n");
perlScript.append("print \"\\e[00;33m #############################\\e[00m\\n\\n\";\n");
perlScript.append("}\n");
perlScript.append("\n");
perlScript.append("sub get_exploits {\n");
perlScript.append(" return (\n");
perlScript.append(" 'dirty_cow' => { vuln => ['2.6.22', '3.9.0'], cve => '2016-5195', mil => 'http://w...content-available-to-author-only...b.com/exploits/40616' },\n");
perlScript.append(" # ... (Add other exploits here in similar format) \n");
perlScript.append(" );\n");
perlScript.append("}\n");
return perlScript.toString();
}
}