[
  {
    "path": "README",
    "content": "Introduction\n------------\n\npastemon.pl is a script which runs in the background as a daemon and monitors pastebin.com for\ninteresting content (based on regular expressions). Found information is sent to syslog\n\nThe script can also generate (CEF events).\n\nMore information is available here: \nhttp://blog.rootshell.be/2012/01/17/monitoring-pastebin-com-within-your-siem/\n\nv1.14 - 2012/10/31\n------------------\n- [FEATURE] Added SQLite DB support to store pasties details\n  (some fields must still be implemented)\n\nv1.13 - 2012/10/24\n------------------\n- [CONTRIBUTION] Added support for multiple SMTP recipients (email addresses separared by commas)\n  Contribution from coreyroach@hotmail.com\n- [CONTRIBUTION] Added a new macro-% to specify the site name in the dump function.\n  '%S' will be replaced by the site name. Example: '%S/%Y/%M' => 'pastebin.com/2012/10'. \n\nv1.12 - 2012/09/20\n------------------\n- [BUGFIX] Fixed FuzzyMatch() which was broken with gziped pasties.\n- [FEATURE] Email notification: The subject is now appended with the <description> field(s)\n  corresponding to the matched regex(es). This allows a better view of received emails as well\n  as filtering them.\n- [BUGFIX] Fixed FuzzyMatch() to detect properly duplicate pasties (fixed regex).\n\nv1.11 - 2012/09/14\n------------------\n- [FEATURE] Added support for nopaste.me.\n- [FEATURE] Added support for pastesite.com.\n- [FEATURE] Added configurable sleep delays per pastie website.\n\nv1.10 - 2012/08/01\n------------------\n- [FEATURE] If not configuration file is specified, pastemon.pl tries to load /etc/pastemon.conf\n  by default.\n\n- [FEATURE] pastemon.pl uses specific Perl modules like WordPress::XMLRPC or Text::JaroWinkler.\n  The script now handles properly environment without those modules. It's not required to comment\n  them in the code. If a module is missing, related configuration is automatically disabled.\n\n- [FEATURE] Added optional compression (via IO::Compress::Gzip) of dumped pasties.\n  In configuration file:\n\n\t<core>\n\t\t<compress-pasties>yes</compress-pasties>\n\t</core>\n\nv1.9 - 2012/07/23\n-----------------\n- [FEATURE] pastemon can now follow (search for regex) URLs detected in pasties. This is\n  configured via the main configuration file:\n\n\t<urls>\n\t\t<follow>yes</follow>\n\t\t<matching>(bit\\.ly)</matching>\n\t</urls>\n\n- [FEATURE] The regex.conf format changed to an XML format.\n  Examples:\n\t<regex>\n\t\t<search>\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}</search>\n\t\t<count>10</count>\n\t\t<description>IP Address</description>\n\t</regex>\n\n- [FEATURE] A minimum number of regex occurences can be defined to notify\n  (<count> tag in the XML file)\n\n- [FEATURE] HTTP requests are now using now a random User-Agent. \n\n- [BUGFIX] Optimized the detection of already processed pasties. This reduces the amount of HTTP \n  requests send to the website.\n\nv1.8 - 2012/06/25\n-----------------\n- [FEATURE] Adder for pastie.org! \n- [FEATURE] Added multi-thread support (1 thread per website monitored)\n- [FEATURE] Added substitution macro in the dump directory. Support macros are:\n\t%Y - replace with the current year\n\t%M - replace with the current month\n\t%D - replace with the current day\n  Directory is automatically created.\n  Example: /home/user/pastemon/%Y/%M/%D\n\n- [FEATURE] Added a new configuration directive:\n\t<dump-all>yes|1</dump-all>\n  This feature enables a dump of *ALL* pastie wheter they match a regex or not.\n  This is similar to a mirror mode\n  WARNING: Huge disk space might be required by this feature!\n- [BUGFIX] Test if the provided SMTP server (for mail notifications) is available\n  (Thanks to @manuelsubredu for the patch)\n- [BUGFIX] Fixed an issue in createBlogPost() which caused an unexpected process exit.\n\nv1.7 - 2012/05/11\n-----------------\n- Added support for \"included\" regular expressions\n- Fixed in bug in getRegexDesc()\n- Added support for comments ('#') in the regex configuration file\n- Moved configuration parameters from command line switches to an XML file\n- Added matching regex description in dump files \n- Added SMTP notifications\n- Added distance check to detect duplicate pasties (using Jaro-Winkler algorithm)\n\nv1.6 - 2012/02/21\n-----------------\n- Added a detection of \"slow down\" messages returned by Pastebin (add a small pause)\n- Added support for Wordpress XMLRPC \n- Added support for random proxies\n- Some bug fixes\n\nv1.5 - 2012/02/19\n-----------------\n- Fixed the regex to grab pasties from the archive page. (HTML code changed)\n\nv1.4 - 2012/02/15\n-----------------\n- Fixed a bug with CEF events: custome fields start at 1 not 0! (Thanks to Heiko Hansen for the report)\n- Notify the presence of a proxy variable (HTTP_PROXY) \n\nv1.3 - 2012/01/26\n-----------------\n- Added a '--pidfile=file' configuration switch to specify an alternative location for the PID file.\n  This allows the script to be executed with a non-root account.\n- Added a '--sample=x' configuration to display a sample a data matching a regular expression. 'x' is \n  the number of bytes displayed before and after the matching string. This is useful to estimate the\n  value of the pastie.  Example:\n  Found in http://pastebin.com/raw.php?i=Q8pQRHKW : belgium (2 times) | Sample: g(0) \"\"\\n  [32] => string(11) \"Belgium(32)\"\\n  [31] => string(14) \"Ne\n\nv1.2 - 2012/01/21\n-----------------\n- Fixed a bug affecting the case sensitivity search\n- New feature: an exception can be associated to a regular expression in the configuration file.\n  The syntax is: \"regex1 _EXCLUDE_ regex2\". This could prevent some false positive matches.\n\nv1.1 - 2012/01/20\n-----------------\n- Added a '--dump' configuration switch to save matching pasties in a directory.\n  This is to keep the pasties posted with an expiration date (example: for later review)\n\nv1.0 - 2012/01/18\n-----------------\nInitial release\n"
  },
  {
    "path": "pastemon.conf.sample",
    "content": "<!--\n  pastemon.pl main configuration file sample\n  Note: Features can be disabled by commenting them using standard comment tags.\n//-->\n<pastemon>\n        <!-- Core features //-->\n        <core>\n                <ignore-case>yes</ignore-case>\n                <pid-file>/var/run/pastemon.pid</pid-file>\n                <regex-file>regex.conf</regex-file>\n                <sample-size>256</sample-size>\n                <proxy-config>proxies.conf</proxy-config>\n\t\t<ua-config>user-agents.conf</ua-config>\n                <dump-directory>/home/pastemon/dump/%Y/%M/%D</dump-directory>\n                <dump-all>yes</dump-all>\n\t\t<compress-pasties>yes</compress-pasties>\n\t\t<http-timeout>15</http-timeout>\n\t\t<!-- Use Jaro-Winkler distance algorithm //-->\n\t\t<distance-min>0.95</distance-min>\n\t\t<distance-max-size>10240</distance-max-size>\n        </core>\n\n        <!-- Websites to monitor //-->\n        <websites>\n                <pastebin>yes</pastebin>\n\t\t<pastebin-delay>10</pastebin-delay>\n                <pastie>yes</pastie>\n\t\t<pastie-delay>120</pastie-delay>\n\t\t<nopaste>yes</nopaste>\n\t\t<nopaste-delay>300</nopaste-delay>\n\t\t<pastesite>yes</pastesite>\n\t\t<pastesite-delay>300</pastesite-delay>\n        </websites>\n\n        <!-- Follow URLs //-->\n        <urls>\n                <follow>yes</follow>\n                <matching>(anonpaste|pastebin\\.com|pastie\\.org|pastehtml\\.com|pastebay\\.net|pastee\\.org)</matching>\n        </urls>\n\n        <!-- CEF Output (ArcSight) //-->\n        <cef-output>\n                <destination>10.0.0.1</destination>\n                <port>514</port>\n                <severity>3</severity>\n        </cef-output>\n\n        <!-- Syslog Output //-->\n        <syslog-output>\n                <facility>daemon</facility>\n        </syslog-output>\n\n        <!-- Email Output //-->\n        <smtp-output>\n                <smtp-server>127.0.0.1</smtp-server>\n                <from>pastemon@rootshell.be</from>\n                <recipient>recipient@domain.com</recipient>\n                <subject>PasteMon Alert</subject>\n        </smtp-output>\n\n        <!-- Wordpress Output (XMLRPC) //-->\n        <wordpress-output>\n                <site>www.myblog.com</site>\n                <user>editor</user>\n                <password>averystrongpassword</password>\n                <category>favorite</category>\n        </wordpress-output>\n\n\t<!-- SQLite Support //-->\n\t<db-output>\n\t\t<db-file>/home/pastemon/pastemon.db</db-file>\n\t</db-output>\n</pastemon>\n"
  },
  {
    "path": "pastemon.pl",
    "content": "#!/usr/bin/perl\n#\n# pastemon.pl \n#\n# This script runs in the background as a daemon and monitors pastebin.com for\n# interesting content (based on regular expressions). Found information is sent\n# to syslog\n#\n# This script is based on the Python script written by Xavier Garcia\n# (http://www.shellguardians.com/2011/07/monitoring-pastebin-leaks.html)\n#\n# Copyright (c) 2012 Xavier Mertens\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions\n# are met:\n# 1. Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n# 2. Redistributions in binary form must reproduce the above copyright\n# notice, this list of conditions and the following disclaimer in the\n# documentation and/or other materials provided with the distribution.\n# 3. Neither the name of copyright holders nor the names of its\n# contributors may be used to endorse or promote products derived\n# from this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS\n# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n# POSSIBILITY OF SUCH DAMAGE.\n#\n# History\n# -------\n# See README file\n\nuse strict;\nuse threads;\nuse threads::shared;\nuse Digest::MD5 qw(md5 md5_hex md5_base64);\nuse File::Path; \nuse Getopt::Long;\nuse IO::Socket;\nuse LWP::UserAgent;\nuse HTML::Entities;\nuse Sys::Syslog;\nuse Encode;\nuse XML::XPath;\nuse XML::XPath::XMLParser;\nuse Net::SMTP;\nuse POSIX qw(setsid);\n\n# Optional modules\nmy $haveWordPressXMLRMC \t= eval \"use WordPress::XMLRPC; 1\";\nmy $haveTextJaroWinkler \t= eval \"use Text::JaroWinkler qw(strcmp95); 1\";\nmy $haveIOCompressGzip\t\t= eval \"use IO::Compress::Gzip; 1\";\nmy $haveIOUncompressGunzip\t= eval \"use IO::Uncompress::Gunzip; 1\";\nmy $haveDBI\t\t\t= eval \"use DBI; 1\";\n\nuse constant PROCESS_URL\t=> 1;\nuse constant PASTEBIN \t\t=> 0;\t# Supported websites\nuse constant PASTIE \t\t=> 1;\nuse constant NOPASTE\t\t=> 2;\nuse constant PASTESITE\t\t=> 3;\nmy @webSiteNames = ( \t\t\t# Self-defined names for multiple usages\n\t\t\"pastebin.com\",\n\t\t\"pastie.net\",\n\t\t\"nopaste.me\",\n\t\t\"pastesite.com\",\n\t);\n\nmy $program = \"pastemon.pl\";\nmy $version = \"v1.14\";\nmy $debug;\nmy $help;\nmy $ignoreCase;\t\t# By default respect case in strings search\nmy $cefDestination;\t# Send CEF events to this destination:port\nmy $cefPort = 514;\nmy $cefSeverity = 3;\nmy $caught = 0;\nmy $httpTimeout = 10;\t# Default HTTP timeout\nmy @pasties;\nmy @seenPasties;\nmy $maxPasties = 1000;\t# TODO: Make it configurable?\nmy @regexList;\t\t# List of interesting regex (with the data)\nmy $pidFile \t= \"/var/run/pastemon.pid\";\nmy $configFile\t= \"/etc/pastemon.conf\";\t\t# Main XML configuration file\nmy $regexFile;\t\t# Regular expressions definitions\nmy $wpConfigFile;\nmy $proxyFile;\nmy @proxies;\n\nmy $uaFile;\nmy @uas;\n\nmy $wpSite;\t\t# Wordpress settings\nmy $wpUser;\nmy $wpPass;\nmy $wpCategory;\n\nmy $smtpServer;\t\t# SMTP settings\nmy $smtpFrom;\nmy $smtpRecipient;\nmy $smtpSubject;\nmy @smtpRecipients;\n\nmy $distanceMin;\nmy $distanceMaxSize;\n\nmy $followUrls;\t\t# Follow URLs found in pastie\nmy $followMatching;\n\nmy $checkPastebin;\t# Websites to monitor\nmy $checkPastie;\nmy $checkNopaste;\nmy $checkPastesite;\n\nmy $delayPastebin\t= 300;\t# Delays between pasties fetches\nmy $delayPastie\t\t= 300;\nmy $delayNopaste\t= 300;\nmy $delayPastesite\t= 300;\n\nmy $syslogFacility = \"daemon\";\nmy $dumpDir;\nmy $dumpAll;\nmy $compressDump;\nmy $sampleSize;\nmy %matches;\n\nmy $dbFile;\t\t# SQLite3 DB file\n\n# Process arguments\nmy $result = GetOptions(\n\t\"debug\"\t\t\t=> \\$debug,\n\t\"help\"\t\t\t=> \\$help,\n\t\"config=s\"\t\t=> \\$configFile,\n);\n\n# TODO: Add a \"--drop-sql-table\" option to rebuild a fresh DB?\nif ($help) {\n\tprint <<__HELP__;\nUsage: $0 --config=filepath [--debug] [--help]\nWhere:\n--config : Specify the XML configuration file\n--debug  : Enable debug mode (verbose - do not detach)\n--help   : What you're reading now.\n__HELP__\n\texit 0;\n}\n\nparseXMLConfigFile($configFile);\n\n($debug) && print STDERR \"+++ Running in foreground.\\n\";\n\n($cefDestination) && syslogOutput(\"Sending CEF events to $cefDestination:$cefPort (severity $cefSeverity)\");\n\n# Do not allow multiple running instances!\nif (-r $pidFile) {\n\topen(PIDH, \"<$pidFile\") || die \"Cannot read pid file!\";\n\tmy $currentpid = <PIDH>;\n\tclose(PIDH);\n\tdie \"$program already running (PID $currentpid)\";\n}\n\nloadRegexFromFile($regexFile) || die \"Cannot load regex from file $regexFile\";\nloadUserAgentFromFile($uaFile) || die \"Cannot load user-agents from file $uaFile\";\n\nif (!$debug) {\n\tmy $pid = fork;\n\tdie \"Cannot fork\" unless defined($pid);\n\texit(0) if $pid;\n\n\t# We are the child\n\t(POSIX::setsid != -1) or die \"setsid failed\";\n\tchdir(\"/\") || die \"Cannot changed working directory to /\";\n\tclose(STDOUT);\n\tclose(STDOUT);\n\tclose(STDIN);\n}\n\nsyslogOutput(\"Running with PID $$\");\nopen(PIDH, \">$pidFile\") || die \"Cannot write PID file $pidFile: $!\";\nprint PIDH \"$$\";\nclose(PIDH);\n\n# Notify if HTTP proxy settings detected\nif ($ENV{'HTTP_PROXY'}) {\n\t($proxyFile) && die \"The HTTP_PROXY environment variable conflicts with the use of a proxies list\";\n\tsyslogOutput(\"Using detected HTTP proxy: \" . $ENV{'HTTP_PROXY'});\n}\n\nmy @threads;\nmy @webSites;\n($checkPastebin) && push(@webSites, PASTEBIN);\n($checkPastie) && push(@webSites, PASTIE);\n($checkNopaste) && push(@webSites, NOPASTE);\n($checkPastesite) && push(@webSites, PASTESITE);\n\n# Launch threads based on the number of webistes to monitor\nfor my $webSite (@webSites) {\n\tmy $t = threads->new(\\&mainLoop, $webSite);\n\tpush(@threads, $t);\n}\n\n$SIG{'TERM'}\t= \\&sigHandler;\n$SIG{'INT'}\t= \\&sigHandler;\n$SIG{'KILL'}\t= \\&sigHandler;\n$SIG{'USR1'}\t= sub {\n\t\t\tforeach my $t (@threads) {\n\t\t\t\t$t->kill('SIGUSR1');\n\t\t\t}\n\t\t      };\n\n# Parent process just waiting for a signal\nwhile(1) {\n\tsleep(1);\n\tif ($caught) {\n\t\tsyslogOutput(\"Killing my threads\");\n\t\tforeach my $t (@threads) {\n\t\t\t$t->kill('SIGKILL');\n\t\t}\n\t}\n}\n\nexit 0;\n\n# ---------\n# Main loop\n# ---------\nsub mainLoop {\n\t$SIG{'USR1'}\t= \\&sigReload; # Handle config reload\n\t$SIG{'KILL'}    = \\&sigHandler;\n\tmy $webSite = shift;\n\twhile(1) {\n\t\tmy $pastie;\n\t\tif (!&fetchLastPasties($webSite)) {\n\t\t\tforeach $pastie (@pasties) {\n\t\t\t\texit 0 if ($caught == 1);\n\t\t\t\tanalyzePastie($webSite, $pastie, PROCESS_URL);\n\t\t\t}\n\t\t\texit 0 if ($caught == 1);\n\t\t}\n\t\tpurgeOldPasties($maxPasties);\n\n\t\t# Wait some seconds (depending on the website)\n\t\tDELAY: {\n\t\t\t$webSite == PASTEBIN\t&& do { \n\t\t\t\t\t\t\t($debug) && print STDERR \"Sleeping $delayPastebin\\n\"; \n\t\t\t\t\t\t\tsleep($delayPastebin); last DELAY; };\n\t\t\t$webSite == PASTIE\t&& do {\n\t\t\t\t\t\t\t($debug) && print STDERR \"Sleeping $delayPastie\\n\";\n\t\t\t\t\t\t\tsleep($delayPastie); last DELAY; };\n\t\t\t$webSite == NOPASTE\t&& do {\n\t\t\t\t\t\t\t($debug) && print STDERR \"Sleeping $delayNopaste\\n\";\n\t\t\t\t\t\t\tsleep($delayNopaste); last DELAY; };\n\t\t\t$webSite == PASTESITE\t&& do {\n\t\t\t\t\t\t\t($debug) && print STDERR \"Sleeping $delayPastesite\\n\";\n\t\t\t\t\t\t\tsleep($delayPastesite); last DELAY; };\n\t\t}\n\t}\n}\n\n#\n# analyzePastie\n#\nsub analyzePastie {\n\tmy $webSite = shift;\n\tmy $pastie = shift or return;\n\tmy $processUrl = shift;\n\tmy $regex;\n\tmy $md5;\n\tif (!grep /$pastie/, @seenPasties) {\n\t\tmy $content = fetchPastie($pastie);\n\t\tif ($content) {\n\t\t\t# If we receive a \"slow down\" message, follow Pastebin recommandation!\n\t\t\tif ($content =~ /Please slow down/) {\n\t\t\t\t($debug) &&  print STDERR \"+++ Slow down message received. Paused 5 seconds\\n\";\n\t\t\t\tsleep(5);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t# Compute the MD5 digest\n\t\t\t\t$md5 = md5_hex(encode('UTF8',$content));\n\t\t\t\tif (!dbSearchMD5($md5)) { \n\t\t\t\t\tundef(%matches);\t# Reset the matches regex/counters\n\t\t\t\t\tmy $i = 0;\n\t\t\t\t\tmy $regexSearch;\n\t\t\t\t\tmy $regexInclude;\n\t\t\t\t\tmy $regexExclude;\n\t\t\t\t\tmy $regexDesc;\n\t\t\t\t\tmy $regexCount;\n\t\t\t\t\tforeach $regex (@regexList) {\n\t\t\t\t\t\t$regexSearch\t= @$regex[0];\n\t\t\t\t\t\t$regexInclude\t= @$regex[1];\n\t\t\t\t\t\t$regexExclude\t= @$regex[2];\n\t\t\t\t\t\t$regexDesc\t= @$regex[3];\n\t\t\t\t\t\t$regexCount\t= @$regex[4];\n\t\t\t\t\t\tmy $sampleData;\n\t\t\t\t\t\tmy ($startPos, $endPos);\n\t\t\t\t\t\tmy $preCount = 0;\n\t\t\t\t\t\tif ($ignoreCase) {\n\t\t\t\t\t\t\t$preCount += () = $content =~ /$regexSearch/mgi;\n\t\t\t\t\t\t\t$startPos = $-[0];\n\t\t\t\t\t\t\t$endPos = $+[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t$preCount += () = $content =~ /$regexSearch/mg;\n\t\t\t\t\t\t\t$startPos = $-[0];\n\t\t\t\t\t\t\t$endPos = $+[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($preCount >= $regexCount) {\t\n\t\t\t\t\t\t\tif ($sampleSize) {\n\t\t\t\t\t\t\t\t# Optional: extract a sample of the data\n\t\t\t\t\t\t\t\t$startPos = (($startPos - $sampleSize) < 0) ? 0 : ($startPos - $sampleSize);\n\t\t\t\t\t\t\t\t$sampleData = encode('UTF8', substr($content, $startPos, ($endPos - $startPos) + $sampleSize));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t# Process \"include\" regex defined\n\t\t\t\t\t\t\tif ($regexInclude ne \"\") {\n\t\t\t\t\t\t\t\tmy $postCount = 0;\n\t\t\t\t\t\t\t\tif ($ignoreCase) {\n\t\t\t\t\t\t\t\t\t$postCount += () = $content =~ /$regexInclude/mgi;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$postCount += () = $content =~ /$regexInclude/mg;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ($postCount) {\n\t\t\t\t\t\t\t\t\t# Matches for include $regex\n\t\t\t\t\t\t\t\t\t$matches{$i} = [ ( $regexSearch, $preCount, $sampleData ) ];\n\t\t\t\t\t\t\t\t\t$i++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telsif ($regexExclude ne \"\") {\n\t\t\t\t\t\t\t\tmy $postCount = 0;\n\t\t\t\t\t\t\t\tif ($ignoreCase) {\n\t\t\t\t\t\t\t\t\t$postCount += () = $content =~ /$regexExclude/mgi;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$postCount += () = $content =~ /$regexExclude/mg;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (! $postCount) {\n\t\t\t\t\t\t\t\t\t# Matches for exclude $regex\n\t\t\t\t\t\t\t\t\t$matches{$i} = [ ( $regexSearch, $preCount, $sampleData ) ];\n\t\t\t\t\t\t\t\t\t$i++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t$matches{$i} = [ ( $regexSearch, $preCount, $sampleData ) ];\n\t\t\t\t\t\t\t\t$i++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ($followUrls && $processUrl) {\n\t\t\t\t\t\t$i += processUrls($content);\n\t\t\t\t\t}\n\t\t\t\t\tif ($i) {\n\t\t\t\t\t\t# Try to find a corresponding pastie?\n\t\t\t\t\t\tif (!FuzzyMatch($webSite, $content))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t# Generate the results based on matches\n\t\t\t\t\t\t\tmy $buffer = \"Found in \" . $pastie . \" : \";\n\t\t\t\t\t\t\tmy $key;\n\t\t\t\t\t\t\tfor $key (keys %matches) {\n\t\t\t\t\t\t\t\t$buffer = $buffer . $matches{$key}[0] . \" (\" . $matches{$key}[1] . \" times) \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ($sampleSize) {\n\t\t\t\t\t\t\t\t# Optional: Add sample of data\n\t\t\t\t\t\t\t\tmy $safeData = $matches{0}[2];\n\t\t\t\t\t\t\t\t# Sanitize the data\n\t\t\t\t\t\t\t\t$safeData =~ s/\r//g;\n\t\t\t\t\t\t\t\t$safeData =~ s/\\n/\\\\r/g;\n\t\t\t\t\t\t\t\t$safeData =~ s/\\n/\\\\n/g;\n\t\t\t\t\t\t\t\t$safeData =~ s/\\t/\\\\t/g;\n\t\t\t\t\t\t\t\t$buffer = $buffer . \"| Sample: \" . $safeData;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsyslogOutput($buffer);\n\t\n\t\t\t\t\t\t\t# Generating CEF event (if configured)\n\t\t\t\t\t\t\t($cefDestination) && sendCEFEvent($pastie);\n\t\t\n\t\t\t\t\t\t\t# Generating blog post (if configured)\n\t\t\t\t\t\t\t($wpSite) && createBlogPost($pastie);\n\t\n\t\t\t\t\t\t\t# Send SMTP notification (if configured)\n\t\t\t\t\t\t\tif ($smtpServer) {\n\t\t\t\t\t\t\t\tmy $smtp = Net::SMTP->new($smtpServer) or die \"Cannot create SMTP connection to $smtpServer: $?\";\n\t\t\t\t\t\t\t\t$smtp->mail($smtpFrom);\n\t\t\t\t\t\t\t\t$smtp->recipient(@smtpRecipients, { SkipBad => 1});\n\t\t\t\t\t\t\t\t$smtp->data();\n\t\t\t\t\t\t\t\tmy $subjectTags;\n\t\t\t\t\t\t\t\tfor $key (keys %matches) {\n\t\t\t\t\t\t\t\t\tmy $tempDesc = getRegexDesc($matches{$key}[0]);\n\t                                                                if (length($tempDesc) > 0) {\n\t                                                                        $subjectTags = $subjectTags . '(' . getRegexDesc($matches{$key}[0]) . ') ';\n\t                                                                }\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tmy $smtpBody = \"To: $smtpRecipient\\nSubject: $smtpSubject $subjectTags\\n\\n\";\n\t\t\t\t\t\t\t\tfor $key (keys %matches) {\n\t\t\t\t\t\t\t\t\t$smtpBody = $smtpBody . \"Matched: \" . $matches{$key}[0] . \" (\" . $matches{$key}[1] . \" time(s))\\n\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$smtpBody = $smtpBody . \"\\nSource: \" . $pastie . \"\\n\\n\" . $content;\n\t\t\t\t\t\t\t\t$smtp->datasend($smtpBody);\n\t\t\t\t\t\t\t\t$smtp->dataend();\n\t\t\t\t\t\t\t\t$smtp->quit();\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t# Save pastie content in the dump directory (if configured)\n\t\t\t\t\t\t\tif ($dumpDir) {\n\t\t\t\t\t\t\t\tmy $tempPastie = getPastieID($pastie);\n\t\t\t\t\t\t\t\tmy $tempDir = validateDumpDir($webSite, $dumpDir); # Generate and create dump directory\n\t\t\t\t\t\t\t\t(-d $tempDir) or die \"Cannot validate directory $dumpDir: $!\";\n\t\t\t\t\t\t\t\topen(DUMP, \">:encoding(UTF-8)\", \"$tempDir/$tempPastie.raw\") or die \"Cannot write to $tempDir/$tempPastie.raw : $!\";\n\t\t\t\t\t\t\t\tfor $key (keys %matches) {\n\t\t\t\t\t\t\t\t\tprint DUMP \"Matched: \" . $matches{$key}[0] . \" (\" . $matches{$key}[1] . \" time(s))\\n\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprint DUMP \"\\n$content\";\n\t\t\t\t\t\t\t\tclose(DUMP);\n\t\t\t\t\t\t\t\tif ($compressDump) { # Compress pastie\n\t\t\t\t\t\t\t\t\tmy $in  = \"$tempDir/$tempPastie.raw\";\n\t\t\t\t\t\t\t\t\tmy $out = \"$tempDir/$tempPastie.gz\";\n\t\t\t\t\t\t\t\t\tuse IO::Compress::Gzip qw(gzip);\n\t\t\t\t\t\t\t\t\tif (gzip $in => $out) {\n\t\t\t\t\t\t\t\t\t\tunlink(\"$tempDir/$tempPastie.raw\");\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tsyslogOutput(\"Cannot compress $tempDir/$tempPastie.raw: $!\");\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telsif ($dumpAll && $dumpDir) {\n\t\t\t\t\t\t# Mirroring mode - dump the pastie in all cases\n\t\t\t\t\t\tmy $tempPastie = getPastieID($pastie);\n\t\t\t\t\t\tmy $tempDir = validateDumpDir($webSite, $dumpDir);\n\t\t\t\t\t\t(-d $tempDir) or die \"Cannot validate directory $tempDir: $!\";\n\t\t\t\t\t\topen(DUMP, \">:encoding(UTF-8)\", \"$tempDir/$tempPastie.raw\") or die \"Cannot write to $tempDir/$tempPastie.raw : $!\";\n\t\t\t\t\t\tprint DUMP \"\\n$content\";\n\t\t\t\t\t\tclose(DUMP);\n\t\t\t\t\t\tif ($compressDump) { # Compress pastie\n\t\t\t\t\t\t\tmy $in  = \"$tempDir/$tempPastie.raw\";\n\t\t\t\t\t\t\tmy $out = \"$tempDir/$tempPastie.gz\";\n\t\t\t\t\t\t\tuse IO::Compress::Gzip qw(gzip);\n\t\t\t\t\t\t\tif (gzip $in => $out) {\n\t\t\t\t\t\t\t\tunlink(\"$tempDir/$tempPastie.raw\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse { \n\t\t\t\t\t\t\t\tsyslogOutput(\"Cannot compress $tempDir/$tempPastie.raw: $!\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\t# Flag this pastie as \"seen\"\n\t\t\t\t\tpush(@seenPasties, $pastie);\n\t\n\t\t\t\t\t# Save pastie data in SQLite\n\t\t\t\t\tif ($dbFile) {\n\t\t\t\t\t\tdbSavePastie($pastie, $md5);\n\t\t\t\t\t}\n\n\t\t\t\t\t# Wait a random number of seconds to not mess with pastebin.com webmasters\n\t\t\t\t\tsleep(int(rand(5)));\n\t\t\t\t}\n\t\t\t\telse { # MD5 Exists in DB\n\t\t\t\t\t($debug) && print \"DEBUG: MD5 $md5 already found in DB!\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n#\n# Search for interesting data in URLs found inside the pastie\n#\nsub processUrls {\n\tmy $pastie = shift || return 0;\n\twhile ($pastie =~ m,(http.*?://([^\\s)\\\"](?!ttp:))+),g) { # \"\n\t\tmy $url = $&;\n\t\tif ($url =~ /$followMatching/gi) { #Process only URLs matching our regex!\n                \t($debug) && print \"+++ Following URL: $url\\n\";\n\t\t\tmy $ua = LWP::UserAgent->new;\n\t\t\t$ua->agent(getRandomUA());\n\t\t\tmy $r = $ua->head(\"$url\");\n\t\t\tif ($r->is_success && substr($r->header('Content-Type'), 0, 5) eq \"text/\") {\t# Only process \"text\"\n\t\t\t\tanalyzePastie($url);\n\t\t\t}\n        \t}\n\t\t# Protect us against pastebin.com blacklist?\n\t\t#sleep(int(rand(15)));\n\t}\n\treturn 0;\n}\n\n# \n# parseXMLConfigFile\n# Load the configuration from provided XML file\n# Args:\n# $configFile = Main pastemon.conf XML file\n#\nsub parseXMLConfigFile {\n\tmy $configFile = shift;\n\t(-r $configFile) || die \"Cannot load XML file $configFile: $!\";\n\n\t($debug) && print STDERR \"+++ Loading XML file $configFile.\\n\";\n\tmy $xml = XML::XPath->new(filename => \"$configFile\");\n\tmy $buff;\n\n\t# Reset settings\n\tundef $pidFile;\n\tundef $sampleSize;\n\tundef $dumpDir;\n\tundef $dumpAll;\n\tundef $compressDump;\n\tundef $proxyFile;\n\tundef $uaFile;\n\tundef $cefDestination;\n\tundef $cefPort;\n\tundef $cefSeverity;\n\tundef $smtpServer;\n\tundef $smtpFrom;\n\tundef $smtpRecipient;\n\tundef $smtpSubject;\n\tundef $wpSite;\n\tundef $wpUser;\n\tundef $wpPass;\n\tundef $wpCategory;\n\tundef $distanceMin;\n\tundef $distanceMaxSize;\n\tundef $checkPastebin;\n\tundef $checkPastie;\n\tundef $checkNopaste;\n        undef $checkPastesite;\n\tundef $followUrls;\n\tundef $followMatching;\n\tundef $dbFile;\n\n\t# Core Parameters\n\tmy $nodes = $xml->find('/pastemon/core');\n\tforeach my $node ($nodes->get_nodelist) {\n\t\t$buff\t\t\t= $node->find('ignore-case')->string_value;\n\t\tif (lc($buff) eq \"yes\" || $buff eq \"1\") {\n\t\t\t$ignoreCase++;\n\t\t\t($debug) && print STDERR \"+++ Non-sensitive search enabled.\\n\";\n\t\t}\n\t\t$buff\t\t\t= $node->find('dump-all')->string_value;\n\t\tif (lc($buff) eq \"yes\" || $buff eq \"1\") {\n\t\t\t$dumpAll++;\n\t\t\t($debug) && print STDERR \"+++ Dumping all pasties (mirror mode).\\n\";\n\t\t}\n\t\t$buff\t\t\t= $node->find('compress-pasties')->string_value;\n\t\tif (lc($buff) eq \"yes\" || $buff eq \"1\") {\n\t\t\t$compressDump++;\n\t\t\t($debug) && print STDERR \"+++ Compressing all pasties (mirror mode).\\n\";\n\t\t}\n\t\t$pidFile\t\t= $node->find('pid-file')->string_value;\n\t\t$regexFile\t\t= $node->find('regex-file')->string_value;\n\t\t$sampleSize\t\t= $node->find('sample-size')->string_value;\n\t\t$dumpDir\t\t= $node->find('dump-directory')->string_value;\n\t\t$proxyFile\t\t= $node->find('proxy-config')->string_value;\n\t\t$uaFile\t\t\t= $node->find('ua-config')->string_value;\n\t\t$httpTimeout\t\t= $node->find('http-timeout')->string_value;\n\t\t$distanceMin\t\t= $node->find('distance-min')->string_value;\n\t\t$distanceMaxSize\t= $node->find('distance-max-size')->string_value;\n\t}\n\n\t# Monitored websites\n\tmy $nodes = $xml->find('/pastemon/websites');\n\tforeach my $node ($nodes->get_nodelist) {\n\t\t$buff\t\t\t= $node->find('pastebin')->string_value;\n\t\tif (lc($buff) eq \"yes\" || $buff eq \"1\") {\n\t\t\t$checkPastebin++;\n\t\t\t($debug) && print STDERR \"+++ pastebin.com monitoring activated.\\n\";\n\t\t}\n\t\t$buff                   = $node->find('pastie')->string_value;\n\t\tif (lc($buff) eq \"yes\" || $buff eq \"1\") {\n\t\t\t$checkPastie++;\n\t\t\t($debug) && print STDERR \"+++ pastie.com monitoring activated.\\n\";\n\t\t}\n\t\t$buff                   = $node->find('nopaste')->string_value;\n\t\tif (lc($buff) eq \"yes\" || $buff eq \"1\") {\n\t\t\t$checkNopaste++;\n\t\t\t($debug) && print STDERR \"+++ nopaste.me monitoring activated.\\n\";\n\t\t}\n\t\t$buff\t\t\t= $node->find('pastesite')->string_value;\n\t\tif (lc($buff) eq \"yes\" || $buff eq \"1\") {\n\t\t\t$checkPastesite++;\n\t\t\t($debug) && print STDERR \"+++ pastesite.com monitoring activated.\\n\";\n\t\t}\n\t\t$delayPastebin\t= $node->find('pastebin-delay')->string_value;\n\t\t$delayPastie\t= $node->find('pastie-delay')->string_value;\n\t\t$delayNopaste\t= $node->find('nopaste-delay')->string_value;\n\t\t$delayPastesite\t= $node->find('pastesite-delay')->string_value;\n\t}\n\n\t# Follow URLs\n\tmy $nodes = $xml->find('/pastemon/urls');\n\tforeach my $node ($nodes->get_nodelist) {\n\t\t$buff\t\t\t= $node->find('follow')->string_value;\n\t\tif (lc($buff) eq \"yes\" || $buff eq \"1\") {\n\t\t\t$followUrls++;\n\t\t\t($debug) && print STDERR \"+++ Follow URLs feature activated.\\n\";\n\t\t}\n\t\t$followMatching\t\t= $node->find('matching')->string_value;\n\t}\n\n\t# CEF Parameters\n\tmy $nodes = $xml->find('/pastemon/cef-output');\n\tforeach my $node ($nodes->get_nodelist) {\n\t\t$cefDestination\t\t= $node->find('destination')->string_value;\n\t\t$cefPort\t\t= $node->find('port')->string_value;\n\t\t$cefSeverity\t\t= $node->find('severity')->string_value;\n\t}\n\n\t# Syslog Parameters\n\tmy $nodes = $xml->find('/pastemon/syslog-output');\n\tforeach my $node ($nodes->get_nodelist) {\n\t\t$syslogFacility\t\t= $node->find('facility')->string_value;\n\t}\n\n\t# Wordpress Parameters\n\tmy $nodes = $xml->find('/pastemon/wordpress-output');\n\tforeach my $node ($nodes->get_nodelist) {\n\t\t$wpSite\t\t\t= $node->find('site')->string_value;\n\t\t$wpUser\t\t\t= $node->find('user')->string_value;\n\t\t$wpPass\t\t\t= $node->find('password')->string_value;\n\t\t$wpCategory\t\t= $node->find('category')->string_value;\n\t}\n\n\t# SMTP Parameters\n\tmy $nodes = $xml->find('/pastemon/smtp-output');\n\tforeach my $node ($nodes->get_nodelist) {\n\t\t$smtpServer\t\t= $node->find('smtp-server')->string_value;\n\t\t$smtpFrom\t\t= $node->find('from')->string_value;\n\t\t$smtpRecipient\t\t= $node->find('recipient')->string_value;\n\t\t$smtpSubject\t\t= $node->find('subject')->string_value;\n\t}\n\n\t# SQLite3 Parameters\n\tmy $nodes = $xml->find('/pastemon/db-output');\n\tforeach my $node ($nodes->get_nodelist) {\n\t\t$dbFile\t\t\t= $node->find('db-file')->string_value;\n\t}\n\n\t# ---------------------\n\t# Parameters validation\n\t# ---------------------\n\n\t# Check if the provided dump directory is writable to us\n\tif ($dumpDir) {\n\t\t# (-w $dumpDir) or die \"Directory $dumpDir is not writable: $!\";\n\t\tsyslogOutput(\"Using $dumpDir as dump directory\");\n\t}\n\n\t# Compress dumped pasties?\n\tif ($compressDump) {\n\t\tif ($haveIOCompressGzip) { # Module IO::Compress::Gzip installed?\n\t\t\tif (!$dumpDir) {\n\t\t\t\tsyslogOutput(\"Option compress-pasties disabled: No dump directory defined\");\n\t\t\t\tundef $compressDump\n\t\t\t}\n\t\t\tif (!$haveIOUncompressGunzip) { # Module IO::Compress::Gunzp installed?\n\t\t\t\tsyslogOutput(\"Option compress-pasties disabled: IO::Uncompress:Gunzip not installed\");\n\t\t\t\tundef $compressDump;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tsyslogOutput(\"Option compress-pasties disabled: IO::Compress:Gzip not installed\");\n\t\t\tundef $compressDump;\n\t\t}\n\t}\n\n\t# Dumping all pasties requires a dump directory\n\tif ($dumpAll && !$dumpDir) {\n\t\tsyslogOutput(\"No dump directory specified\");\n\t}\n\n\t# Verifiy sampleSize format if specified\n\tif ($sampleSize) {\n\t\tdie \"Sample buffer length must be an integer!\" if not $sampleSize =~ /\\d+/;\n\t\tsyslogOutput(\"Dumping $sampleSize bytes samples\");\n\t}\n\n\t# Verify the HTTP timeout if specified\n\tif ($httpTimeout) {\n\t\tdie \"HTTP timeout must be an integer!\" if not $httpTimeout =~ /\\d+/;\n\t\tsyslogOutput(\"HTTP timeout: $httpTimeout seconds\");\n\t}\n\n\t# Verify Wordpress config\n\tif ($wpSite) {\n\t\tif ($haveWordPressXMLRMC) { # Module WordPress::XMLRPC installed?\n\t\t\t(!$wpSite || !$wpUser || !$wpPass || !$wpCategory) && die \"Incomplete Wordpress configuration\";\n\t\t\t($sampleSize) || die \"A sample buffer length must be given with Wordpress output\";\n\t\t\tsyslogOutput(\"Dumping data to $wpSite/xmlrpc.php\");\n\t\t} \n\t\telse {\n\t\t\tsyslogOutput(\"Wordpress configuration disabled: Wordpress::XMLRPC not installed\");\n\t\t\tundef $wpSite;\n\t\t}\n\t}\n\n\t# Verify SMTP config\n\tif ($smtpServer) {\n\t\t(!$smtpServer || !$smtpFrom || !$smtpRecipient || !$smtpSubject) && die \"Incomplete SMTP configuration\";\n\t\tmy $smtp = Net::SMTP->new($smtpServer) or die \"Cannot use SMTP server $smtpServer: $?\";\n\t\t$smtp->quit();\n\t\t@smtpRecipients = split(/[, ]+/, $smtpRecipient);\n\t\tsyslogOutput(\"Sending SMTP notifications to <\".$smtpRecipient.\">\");\n\t}\n\n\t# Load proxies\n\tif ($proxyFile) {\n\t\t(-r $proxyFile) or die \"Cannot read proxy configuration file $proxyFile: $!\";\n\t\tloadProxyFromFile($proxyFile) || die \"Cannot load proxies from file $proxyFile\";\n\t}\n\n\t# Distance\n\tif ($distanceMin) {\n\t\tif ($haveTextJaroWinkler) { # Module Text::JaroWinkler installed?\n\t\t\t(!$dumpDir) && die \"A dump directory must be configured to use the distance check\";\n\t\t\t($distanceMin > 0 && $distanceMin < 1) or die \"Minimum distance must be between 0 and 1\";\n\t\t\tif ($distanceMaxSize) {\n\t\t\t\tdie \"Distance max size must be an integer!\" if not $distanceMaxSize =~ /\\d+/;\n\t\t\t\tsyslogOutput(\"Enabled duplicate detection with distance of $distanceMin (size limit: $distanceMaxSize bytes)\");\n\t\t\t} else {\n\t\t\t\tsyslogOutput(\"Enabled duplicate detection with distance of $distanceMin\");\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tsyslogOutput(\"Distance configuration disabled: Text::JaroWinkler not installed\");\n\t\t\tundef $distanceMin;\n\t\t}\n\t}\n\n\t# SQLite3 Output\n\tif ($dbFile) {\n\t\tif ($haveDBI) { # Module DBI installed?\n\t\t\t# Do we have to initialize the DB (first execution)\n\t\t\tmy $dbh = DBI->connect(\"dbi:SQLite:dbname=\" . $dbFile)\n\t\t\t\tor die \"Cannot connect to the SQLite DB \" . $dbFile . \"\\n\";\n\t\t\tmy $sth = $dbh->prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name='pasties'\");\n\t\t\t$sth->execute();\n\t\t\tmy $data = $sth->fetch();\n\t\t\tif (!$data) {\t# Tables 'pasties' does not exists. Create it.\n\t\t\t\t$sth = $dbh->prepare(\"CREATE TABLE pasties (id VARCHAR(50),\n\t\t\t\t\t\t\t\t\t\ttimestamp DATETIME,\n\t\t\t\t\t\t\t\t\t\turl VARCHAR(128),\n\t\t\t\t\t\t\t\t\t\tmatched VARCHAR(256),\n\t\t\t\t\t\t\t\t\t\tpath VARCHAR(256),\n\t\t\t\t\t\t\t\t\t\tmd5 VARCHAR(32) PRIMARY KEY,\n\t\t\t\t\t\t\t\t\t\ttype INTEGER)\");\n\t\t\t\t$sth->execute() or die \"Cannot create table 'pasties'\";\n\t\t\t\t$sth = $dbh->prepare(\"CREATE UNIQUE INDEX pasties_idx ON pasties(id)\");\n\t\t\t\t$sth->execute() or die \"Cannot create index 'pasties_idx'\";\n\t\t\t\t($debug) && print STDERR \"+++ Created database \" . $dbFile . \"\\n\";\n\t\t\t}\n\t\t\t$dbh->disconnect();\n\t\t}\n\t\telse {\n\t\t\tsyslogOutput(\"DB support disabled: DBI not installed\");\n\t\t\tundef $dbFile;\n\t\t}\n\t}\n\n\t# Follow URL\n\tif ($followUrls && !$followMatching) {\n\t\tsyslogOutput(\"Warning: No regex defined to match URLs\");\n\t\t$followMatching = \".*\";\t# Match everything\n\t}\n\n\treturn;\n}\n\n#\n# Download the latest pasties and load them in a Perl array\n# (http://pastebin.com/archive)\n#\nsub fetchLastPasties {\n\tmy $webSite = shift;\n\tmy $tempProxy;\n\tmy $ua = LWP::UserAgent->new;\n\t$ua->timeout($httpTimeout);\n\tif (@proxies) {\n\t\t$tempProxy = selectRandomProxy();\n\t\t$ua->proxy('http', $tempProxy);\n\t}\n\telse {\n\t\t($ENV{'HTTP_PROXY'}) && $ua->env_proxy;\n\t}\n\t$ua->agent(getRandomUA());\n\n\tundef @pasties;\t# Reset the array first!\n\n\t# www.pastebin.com\n\tif ($webSite == PASTEBIN) {\n\t\t($debug) && print STDERR \"Loading new pasties from pastebin.com.\\n\";\n\t\tmy $response = $ua->get(\"http://pastebin.com/archive\");\n\t\tif ($response->is_success) {\n\t\t\t# Load the pasties into an array\n\t\t\t# @pasties = $response->decoded_content =~ /<td class=\\\"icon\\\"><a href=\\\"\\/(\\w+)\\\">.+<\\/a><\\/td>/g;\n\t\t\t# New format (2012/02/19):\n\t\t\tmy @tempPasties = $response->decoded_content =~ /<a href=\\\"\\/(\\w{8})\\\">.+<\\/a><\\/td>/g;\n\t\t\t# Append the complete URL\n\t\t\tforeach my $p (@tempPasties) {\n\t\t\t\t$p = 'http://pastebin.com/raw.php?i=' . $p;\n\t\t\t}\n\t\t\tpush(@pasties, @tempPasties);\n\t\t}\n\t\telse {\n\t\t\tsyslogOutput(\"Cannot fetch www.pastebin.com: \" . $response->status_line);\n\t\t\t# If cannot fetch pastie and we use proxies, disable the current one!\n\t\t\t(@proxies) && disableProxy($tempProxy);\n\t\t\treturn 1;\n\t\t}\n\t}\n\telsif ($webSite == PASTIE) {\n\t\t#($debug) && print STDERR \"Loading new pasties from pastie.org.\\n\";\n\t\tmy $response = $ua->get(\"http://pastie.org/pastes\");\n\t\tif ($response->is_success) {\n\t\t\tmy @tempPasties = $response->decoded_content =~ /<a href=\\\"(http:\\/\\/pastie.org\\/pastes\\/\\d{7})\\\">/g;\n\t\t\t# Append the complete URL\n\t\t\tforeach my $p (@tempPasties) {\n\t\t\t\t$p = $p . '/download';\n\t\t\t}\n\t\t\tpush(@pasties, @tempPasties);\n\t\t}\n\t\telse {\n\t\t\tsyslogOutput(\"Cannot fetch www.pastie.org: \" . $response->status_line);\n\t\t\t# If cannot fetch pastie and we use proxies, disable the current one!\n\t\t\t(@proxies) && disableProxy($tempProxy);\n\t\t\treturn 1;\n\t\t}\n\t}\n\telsif ($webSite == NOPASTE) {\n\t\t#($debug) && print STDERR \"Loading new pasties from nopaste.me.\\n\";\n\t\tmy $response = $ua->get(\"http://nopaste.me/recent\");\n\t\tif ($response->is_success) {\n\t\t\tmy @tempPasties = $response->decoded_content =~ /<a href=\\\"http:\\/\\/nopaste.me\\/paste\\/([a-z0-9]+)\\\">/ig;\n\t\t\t# Append the complete URL\n\t\t\tforeach my $p (@tempPasties) {\n\t\t\t\t$p = 'http://nopaste.me/raw/' . $p . '.txt';\n\t\t\t}\n\t\t\tpush(@pasties, @tempPasties);\n\t\t}\n\t\telse {\n\t\t\tsyslogOutput(\"Cannot fetch nopaste.me: \" . $response->status_line);\n\t\t\t# If cannot fetch pastie and we use proxies, disable the current one!\n\t\t\t(@proxies) && disableProxy($tempProxy);\n\t\t\treturn 1;\n\t\t}\n\t}\n\telsif ($webSite == PASTESITE) {\n\t\t($debug) && print STDERR \"Loading new pasties from pastesite.com.\\n\";\n\t\tmy $response = $ua->get(\"http://pastesite.com/recent\");\n\t\tif ($response->is_success) {\n\t\t\tmy @tempPasties = $response->decoded_content =~ /<a href=\\\"(\\d+)\\\" title=\\\"View this Paste/ig;\n\t\t\t# Append the complete URL\n\t\t\tforeach my $p (@tempPasties) {\n\t\t\t\t$p = 'http://pastesite.com/' . $p;\n\t\t\t}\n\t\t\tpush(@pasties, @tempPasties);\n\t\t}\n\t\telse {\n\t\t\tsyslogOutput(\"Cannot fetch pastesite.com: \" . $response->status_line);\n\t\t\t# If cannot fetch pastie and we use proxies, disable the current one!\n\t\t\t(@proxies) && disableProxy($tempProxy);\n\t\t\treturn 1;\n\t\t}\n\t}\n \telse {\n\t\tdie \"Unknown website constant: $webSite\";\n\t}\n\n\t# DEBUG\n\t#foreach my $p (@pasties) {\n\t#\tprint \"DEBUG: $p\\n\";\n\t#}\n\treturn 0;\n}\n\n#\n# Fetch the raw content of a pastie and return its content\n#\nsub fetchPastie {\n\tmy $tempProxy;\n\tmy $pastie = shift;\n\tmy $ua = LWP::UserAgent->new;\n\t$ua->timeout($httpTimeout);\n\tif (@proxies) {\n\t\t$tempProxy = selectRandomProxy();\n\t\t$ua->proxy('http', $tempProxy);\n\t}\n\telse {\n\t\t($ENV{'HTTP_PROXY'}) && $ua->env_proxy;\n\t}\n\t$ua->agent(getRandomUA());\n\tmy $response = $ua->get(\"$pastie\");\n\tif ($response->is_success) {\n\t\t# Hack for pastesite.com: Extract data from the <textarea> </textarea>\n\t\t# (To bypass the <continue> button)\n\t\tif ($pastie =~ /http:\\/\\/pastesite.com/) {\n\t\t\tif ($response->decoded_content =~ /\\<textarea .*\\>(.*)\\<\\/textarea\\>/igs) {\n\t\t\t\tmy $pastesiteContent = $1;\n\t\t\t\treturn $pastesiteContent;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\treturn $response->decoded_content;\n\t\t}\n\t}\n\t($debug) &&  print STDERR \"+++ Cannot fetch pastie $pastie: \" . $response->status_line . \"\\n\";\n\n\t# If cannot fetch pastie and we use proxies, disable the current one!\n\t(@proxies) && disableProxy($tempProxy);\n\treturn \"\";\n}\n\n#\n# Load the regular expressions from the configuration file to a Perl array\n#\nsub loadRegexFromFile {\n\tmy $file = shift;\n\tdie \"A configuration file is required\" unless defined($file);\n\tundef @regexList; # Clean up array (if reloaded via SIGUSR1\n\t( -r \"$file\") || die \"Cannot open file $file: $!\";\n\tmy $xp = XML::XPath->new( filename => \"$file\");\n\tmy $ns = $xp->find('/config/regex');\n\tforeach my $n ($ns->get_nodelist) {\n\t\tmy @r;\n\t\tpush(@r,\t$n->find('search')->string_value);\n\t\tpush(@r,\t$n->find('include')->string_value);\n\t\tpush(@r,\t$n->find('exclude')->string_value);\n\t\tpush(@r,\t$n->find('description')->string_value);\n\t\tif ($n->find('count')->string_value ne \"\") {\n\t\t\tpush(@r,$n->find('count')->string_value);\n\t\t} else {\n\t\t\tpush(@r, \"1\");\n\t\t}\n\t\tpush(@regexList, [ @r ]);\n\t}\n\tsyslogOutput(\"Loaded \" . @regexList . \" regular expressions from \" . $file);\n\treturn(1);\n}\n\n#\n# Load proxies from the configuration file\n#\nsub loadProxyFromFile {\n\tmy $file = shift;\n\treturn(1) unless defined($file);\n\topen(PROXY_FD, \"$file\") || die \"Cannot open file $file : $!\";\n\twhile(<PROXY_FD>) {\n\t\tchomp;\n\t\t(length > 0) && push(@proxies, 'http://'.$_);\n\t}\n\tclose(PROXY_FD);\n\t(@proxies) || die \"No proxies read from $file\";\n\tsyslogOutput(\"Loaded \" . @proxies . \" proxies from \" . $file);\n\treturn(1);\n}\n\n#\n# Return a random proxy from the loaded list\n#\nsub selectRandomProxy {\n\tmy $randomIdx = rand($#proxies);\n\t# ($debug) && print STDERR \"+++ Using proxy: \" . $proxies[$randomIdx] . \"\\n\";\n\treturn $proxies[$randomIdx];\n}\n\n#\n# Remove a faulty proxy from the proxies array\n#\nsub disableProxy {\n\tmy $badProxy = shift;\n\treturn unless defined($badProxy);\n\tmy $p;\n\tmy $i = 0;\n\tforeach $p (@proxies) {\n\t\t$i++;\n\t\tif ($p eq $badProxy) { last; }\n\t}\n\t# delete $proxies[$i]; -- DEPRECATED\n\tsplice @proxies, $i, 1;\n\tsyslogOutput(\"Disabled unreliable proxy \" . $badProxy . \" (\" . @proxies . ' active proxies)');\n}\n\nsub purgeOldPasties {\n\tmy $max = shift;\n\twhile (@seenPasties > $max) {\n\t\t#delete $seenPasties[0]; -- DEPRECATED\n\t\tsplice @seenPasties, 0, 1;\n\t}\t\n\treturn;\n}\n\n#\n# Handle a proper process cleanup when a signal is received\n#\nsub sigHandler {\n\tsyslogOutput(\"Received signal. Exiting.\");\n\tunlink($pidFile) if (-r $pidFile);\n\t$caught = 1;\n}\n\n#\n# Reload configuration files\n#\nsub sigReload {\n\tsyslogOutput(\"Reloading config files (Thread ID \" . threads->tid() . \")\");\n\tparseXMLConfigFile($configFile);\n\tloadRegexFromFile($regexFile);\n\t(@proxies) && loadProxyFromFile($proxyFile);\n\treturn;\n}\n\n#\n# Send Syslog message using the defined facility\n#\nsub syslogOutput {\n        my $msg = shift or return(0);\n\tif ($debug) {\n\t\tprint STDERR \"+++ $msg\\n\";\n\t}\n\telse {\n\t\topenlog($program, 'pid', $syslogFacility);\n\t\tsyslog('info', '%s', $msg);\n\t\tcloselog();\n\t}\n}\n\n#\n# Send a CEF syslog packet to an ArcSight device/application\n#\nsub sendCEFEvent {\n\tmy $pastie = shift;\n\t# Syslog data format must be \"Jul 10 10:11:23\"\n\tmy ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);\n\tmy @months = (\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\");\n\tmy $timeStamp = sprintf(\"%3s %2d %02d:%02d:%02d\", $months[$mon], $mday, $hour, $min, $sec);\n\tmy $buffer = sprintf(\"<%d>%s CEF:0|%s|%s|%s|regex-match|One or more regex matched|%d|request=%s destinationDnsDomain=pastebin.com msg=Interesting data has been found on pastebin.com. \", \n\t\t\t29,\n\t\t\t$timeStamp,\n\t\t\t\"blog.rootshell.be\",\n\t\t\t$program,\n\t\t\t$version,\n\t\t\t$cefSeverity,\n\t\t\t$pastie\n\t);\n \tmy $key;\n\tmy $i = 1;\n\tfor $key (keys %matches) {\n\t\t$buffer = $buffer . \"cs\" . $i . \"=\" . $matches{$key}[0] . \" cs\" . $i . \"Label=Regex\". $i . \"Name cn\" . $i . \"=\" . $matches{$key}[1]. \" cn\" . $i . \"Label=Regex\" . $i . \"Count \";\n\t\tif (++$i > 6) {\n\t\t\tsyslogOutput(\"Maximum 6 matching regex can be logged\");\n\t\t\tlast;\n\t\t}\n\t}\n\n\t# Ready to send the packet!\n\tmy $sock = new IO::Socket::INET(PeerAddr => $cefDestination,\n\t\t\t\t\tPeerPort => $cefPort,\n\t\t\t\t\tProto => 'udp',\n\t\t\t\t\tTimeout => 1) or die 'Could not create socket: $!';\n\t$sock->send($buffer) or die \"Send UDP packet error: $!\";\n}\n\n#\n# Return the description corresponding to a regex\n#\nsub getRegexDesc {\n\tmy $regex = shift;\n\treturn unless defined($regex);\n\tforeach my $r (@regexList) {\n\t\tif ($regex eq @$r[0]) {\n\t\t\treturn(@$r[3]);\n\t\t}\n\t}\n\treturn;\n}\n\n#\n# Insert a new pastie in SQLite DB \n#\nsub dbSavePastie {\n\tmy $pastie = shift or return;\n\tmy $md5 = shift or return;\n\tmy $id= getPastieID($pastie);\n\tmy $dbh = DBI->connect(\"dbi:SQLite:dbname=\" . $dbFile)\n\t\t\tor die \"Cannot connect to the SQLite DB \" . $dbFile . \"\\n\";\n\tmy $sth = $dbh->prepare(\"INSERT INTO pasties VALUES(\n\t\t\t\t\t\\\"$id\\\",\n\t\t\t\t\tDATETIME('now'),\n\t\t\t\t\t\\\"$pastie\\\",\n\t\t\t\t\t\\\"\\\",\n\t\t\t\t\t\\\"\\\",\n\t\t\t\t\t\\\"$md5\\\",\n\t\t\t\t\t0)\");\n\tif (!$sth->execute()) {\n\t\tsyslogOutput(\"Cannot insert MD5 \" . $md5 . \" in DB: \" . $sth->errstr() . \" (Pastie: \" . $pastie . \")\");\n\t}\n\t$dbh->disconnect();\n\treturn;\n}\n\n#\n# Search for a pastie MD5 in SQLite DB\n#\nsub dbSearchMD5 {\n\tmy $md5 = shift or return;\n\tmy $dbh = DBI->connect(\"dbi:SQLite:dbname=\" . $dbFile)\n\t\t\tor die \"Cannot connect to the SQLite DB \" . $dbFile . \"\\n\";\n\tmy $sth = $dbh->prepare(\"SELECT md5 FROM pasties WHERE md5 = \\\"$md5\\\"\");\n\t$sth->execute();\n\t$sth->fetchrow();\n\treturn ($sth->rows() > 0) ? 1 : 0;\n}\n\n#\n# Create a Wordpress blog post\n#\nsub createBlogPost {\n\tmy $pastie = shift;\n\t\n\tmy $key;\n\tmy $title;\n\tmy $buffer;\n\tmy $tags = \"\";\n\n\t# Generate tag based on the URL\n\tif ($pastie =~ /pastebin\\.com/) {\n\t\t$tags = 'pastebin.com,';\n\t}\n\telsif ($pastie =~ /pastie\\.org/) {\n\t\t$tags = 'pastie.org,';\n\t}\n\telsif ($pastie =~ /nopaste\\.me/) {\n\t\t$tags = 'nopaste.me,';\n\t}\n\telsif($pastie =~ /pastesite\\.com/) {\n\t\t$tags = 'pastesite.com,';\n\t}\n\n\tfor $key (keys %matches) {\n\t\tif (!$title) {\n\t\t\t$title = 'Potential leak of data: ' . getRegexDesc($matches{$key}[0]);\n\t\t}\n\t\t$buffer = $buffer . 'Detected ' . $matches{$key}[1] . ' occurrence(s) of \\'' . $matches{$key}[0] . '\\':<br>';\n\t\t$buffer = $buffer . '<pre>' . encode_entities($matches{$key}[2]) . '</pre><p>';\n\t\t# Populate Wordpress tags\n\t\t$tags = $tags . getRegexDesc($matches{$key}[0]) . ',';\n\t}\n\t$buffer = $buffer . 'Source: <a href=\"' . $pastie . '\">' . $pastie . '</a><br>';\n\t# Prepare the XML request\n\tmy $o = WordPress::XMLRPC->new;\n\t$o->username($wpUser);\n\t$o->password($wpPass);\n\t$o->proxy('http://' . $wpSite . '/xmlrpc.php');\n\tif (!$o->server()) {\n\t\tsyslogOutput(\"Cannot connect to the Wordpress blog\");\n\t\treturn;\n\t}\n\n\tmy $hashref = {\n\t\t'title' \t\t=> $title,\n\t\t'categories'\t\t=> [ $wpCategory ],\n\t\t'description'\t\t=> $buffer,\n\t\t'mt_keywords'\t\t=> $tags,\n\t\t'mt_allow_comments'\t=> 0,\n\t};\n\t# WordPress::XMLRPC does not handle exceptions properly.\n\t# Eval will catch runtime errors or die() and report the\n\t# error properly (into $@)\n\tmy $ret = eval {\n\t\tmy $ID = $o->newPost($hashref, 1);\n\t};\n\tif (!$ret) {\n\t\tsyslogOutput(\"Cannot post Wordpress article: $@\");\n\t}\n\treturn;\n}\n\n#\n# Perl trim function to remove whitespace from the start and end of the string\n#\nsub trim($) {\n\tmy $string = shift;\n\t$string =~ s/^\\s+//;\n\t$string =~ s/\\s+$//;\n\treturn $string;\n}\n\n#\n# Compare a pastie to the already loaded ones using the Jaro Winkler algorithm\n# See http://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance\n#\nsub FuzzyMatch {\n\tmy $webSite = shift;\n\tmy $newContent = shift;\n\tmy $timeIn = time();\n\n\t# Is this feature enabled?\n\t(!$distanceMin) && return 0;\n\n\t# A dump directory must be configured!\n\t(!$newContent || !$dumpDir) && return 0;\n\n\t# Ignore content if size above configured limit (performance)\n\t(length($newContent) > $distanceMaxSize) && return 0;\n\n\tforeach my $pastie (@seenPasties) {\n\t\tmy $tempPastie = getPastieID($pastie);\n\t\tmy $tempDir = validateDumpDir($webSite, $dumpDir);\n\t\tmy $buffer = \"\";\n\t\t# Do we have compression enabled?\n\t\tif ($compressDump) {\n\t\t\t# Uncompress in the fly\n\t\t\tmy $in = \"$tempDir/$tempPastie.gz\";\n\t\t\tif (-r $in) {\n\t\t\t\tuse IO::Uncompress::Gunzip qw(gunzip);\n\t\t\t\tgunzip $in => \\$buffer or die \"Cannot uncompress $tempDir/$tempPastie.gz\";\n\t\t\t\t($debug) && print STDERR \"+++ Uncompressed $in : \" . length($buffer) . \" bytes\\n\";\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t# Read the plain text file\n\t\t\tif (open(FD, \"$tempDir/$tempPastie.raw\")) {\n\t\t\t\t$buffer = do { local $/; <FD> };\n\t\t\t\tclose(FD);\n\t\t\t}\n\t\t}\n\t\tif (length($buffer) > 0) {\n\t\t\t# Remove the 2 first lines\n\t\t\t# Bug: Remove ALL lines starting with Matched (multiple regex)\n \t\t\t$buffer =~ /^(Matched: .*\\n)+\\n(.*)/s;\n\t\t\t$buffer = $1;\n\t\t\tif (length($buffer) > 0) { # Bug fix 2012/07/16: Only process \"matched\" pasties!\n\t\t\t\tmy $distance = strcmp95($newContent, $buffer, length($newContent), TOUPPER => 1, HIGH_PROB => 0);\n\t\t\t\tif ($distance > $distanceMin) {\n\t\t\t\t\tsyslogOutput(\"Potential duplicate content found with pastie $pastie (distance: $distance)\");\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tmy $timeOut = time();\n\t$timeOut -= $timeIn;\n\t($debug) && print STDERR \"+++ Time: \" . $timeOut . \"\\n\";\n\treturn 0;\n}\n\n#\n# Build the dump directory based on macro and create it\n#\nsub validateDumpDir {\n\tmy $webSite = shift;\n\tmy $dir = shift;\n\t(!$dir) && return \"\";\n\n\t# Replace macro-% by correct values. Supported:\n\t# %Y : Year\n\t# %M : Month\n\t# %D : Day\n\t# %H : Hour\n\t# %S : Site name\n\tmy ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);\n\t$year+=1900;\n\t$mon  = sprintf(\"%02d\", ++$mon);\n\t$mday = sprintf(\"%02d\", $mday);\n\t$hour = sprintf(\"%02d\", $hour);\n\t$dir =~ s/\\%Y/$year/g;\n\t$dir =~ s/\\%M/$mon/g;\n\t$dir =~ s/\\%D/$mday/g;\n\t$dir =~ s/\\%H/$hour/g;\n\t$dir =~ s/\\%S/$webSiteNames[$webSite]/g;\n\tif (!(-d $dir)) {\n\t\tif (!mkpath(\"$dir\")) {\n\t\t\t# If mkpath() failed, re-check the directory\n\t\t\t# (Could have been created by another threat!\n\t\t\t(-d $dir) && return $dir;\n\t\t\tsyslogOutput(\"mkdir(\\\"$dir\\\") failed: $!\");\n\t\t\treturn \"\";\n\t\t}\n\t}\n\treturn $dir;\n}\n\n# \n# Extract the pastie from an URL:\n# pastebin.com: pastebin.com/raw.php?i=(XXX)\n# pastie.org: pastie.org/pastes/(XXX)/download\n# pastesite.com:\n#\nsub getPastieID {\n\tmy $pastie = shift or return \"\";\n\tif ($pastie =~ /pastebin\\.com\\/raw\\.php\\?i=(\\w+)/) {\n\t\treturn $1;\n\t}\n\tif ($pastie =~ /pastie\\.org\\/pastes\\/(\\d+)\\/download/) {\n\t\treturn $1;\n\t}\n\tif ($pastie =~ /pastesite.com\\/(\\d+)/) {\n\t\treturn $1;\n\t}\n\tif ($pastie =~ /nopaste.me\\/raw\\/(\\w+)/) {\n\t\treturn $1;\n\t}\n\treturn \"\";\n}\n\n#\n# Load User-Agents from file\n#\nsub loadUserAgentFromFile {\n\tmy $file = shift;\n\treturn(1) unless defined($file);\n\topen(UA_FD, \"$file\") || die \"Cannot open file $file : $!\";\n\twhile(<UA_FD>) {\n\t\tchomp;\n\t\t(length > 0) && push(@uas, $_);\n\t}\n\tclose(UA_FD);\n\t(@uas) || die \"No User-Agent read from $file\";\n\tsyslogOutput(\"Loaded \" . @uas . \" User-Agent from \" . $file);\n\treturn(1);\n}\n\n#\n# Return a random User-Agent from the loaded list\n#\nsub getRandomUA {\n\tmy $randomIdx = rand($#uas);\n\treturn $uas[$randomIdx];\n}\n\n# Eof\n"
  },
  {
    "path": "proxies.conf",
    "content": "177.19.206.11:8080\n189.113.64.122:8080\n187.115.151.36:8080\n91.183.109.156:8080\n80.167.238.77:1080\n62.243.224.180:1080\n80.63.56.146:1080\n151.1.196.15:80\n78.46.212.216:3128\n94.192.40.199:1055\n82.165.35.26:6515\n93.166.121.107:8118\n213.197.81.53:3128\n71.178.213.38:1387\n94.199.183.50:80\n173.79.236.8:1090\n195.138.76.136:3128\n208.58.31.35:1923\n89.207.68.10:1080\n96.252.98.13:1254\n89.188.141.51:80\n24.61.214.23:1585\n68.60.164.3:1670\n98.226.60.95:1743\n24.228.50.55:1208\n212.45.5.172:3128\n38.105.180.252:3128\n98.215.237.134:1695\n216.155.139.115:3128\n24.60.138.133:1941\n69.127.120.81:1887\n108.3.177.51:1739\n67.164.115.117:1759\n78.111.247.217:1080\n88.247.125.227:8086\n74.167.236.218:1909\n82.222.49.81:8080\n84.53.240.61:3128\n109.108.78.5:3128\n78.139.74.103:8080\n80.63.56.146:8118\n24.217.157.96:1631\n88.250.208.152:8088\n178.49.100.138:3128\n195.150.129.230:3128\n64.85.181.45:8080\n188.231.0.15:8088\n123.201.99.200:1080\n109.111.191.53:3128\n85.132.122.138:3128\n92.255.194.185:80\n67.168.186.161:1779\n75.69.5.128:1281\n82.222.49.65:8080\n88.85.125.78:8080\n82.222.19.54:8080\n99.39.236.12:1080\n95.56.234.92:3128\n80.62.217.19:9100\n94.158.111.63:808\n188.226.102.246:8000\n94.158.111.63:1080\n194.0.229.54:9050\n208.110.220.133:8080\n183.82.96.106:8080\n190.144.147.198:80\n81.223.49.99:8080\n66.90.146.51:1021\n92.246.139.180:3128\n184.72.48.52:8118\n82.222.48.1:8080\n219.90.112.55:1080\n78.153.151.7:3128\n93.167.245.178:9100\n84.41.108.74:8080\n190.66.17.53:3128\n74.196.50.32:808\n75.125.242.146:80\n189.1.128.81:3128\n121.192.32.221:1080\n184.154.188.122:8118\n95.170.219.89:8080\n200.1.110.146:3128\n41.209.15.235:1080\n200.107.236.162:80\n189.89.208.157:8080\n190.147.162.13:3128\n186.228.41.162:3128\n85.25.151.125:3128\n186.4.254.195:8080\n84.41.105.1:8080\n211.154.142.174:1080\n212.23.70.186:3128\n180.96.19.196:3128\n118.102.230.186:1080\n182.163.72.148:8080\n183.181.174.169:80\n211.76.97.150:80\n217.64.29.73:3128\n125.63.65.178:8080\n219.235.110.13:1080\n84.22.3.32:8080\n123.50.56.206:80\n65.209.244.80:8080\n211.142.24.122:1080\n221.231.114.147:8080\n190.152.249.73:3129\n200.150.66.226:3128\n116.248.41.72:1080\n180.96.19.25:8080\n187.5.159.218:8080\n222.238.156.249:8080\n88.135.217.66:3128\n190.151.111.202:8080\n203.201.163.2:8000\n211.76.97.147:80\n211.239.84.130:443\n109.251.143.22:8080\n202.75.54.154:3128\n222.255.27.150:31280\n98.126.137.212:80\n118.97.69.148:3128\n222.238.156.245:80\n109.251.34.19:8080\n217.196.113.81:8080\n69.134.37.246:8085\n122.154.163.249:8888\n222.238.156.249:80\n2.184.192.15:8080\n213.187.113.127:80\n180.96.19.24:8080\n190.3.106.166:80\n118.97.164.75:8080\n187.72.145.53:8080\n196.25.36.180:8080\n98.126.137.211:80\n123.139.215.85:3128\n202.51.120.230:80\n223.27.145.171:3128\n69.77.144.147:8087\n211.76.97.148:80\n112.65.219.72:80\n58.67.147.194:8080\n210.22.13.104:80\n219.93.221.138:8080\n59.172.208.186:8080\n58.67.147.205:8080\n118.97.32.12:3128\n59.175.163.8:80\n60.11.62.176:8088\n211.86.157.95:3128\n46.180.99.40:8080\n82.131.174.21:8080\n202.107.44.108:8080\n119.246.39.171:808\n177.36.242.17:8080\n58.67.147.207:8080\n193.253.191.26:8090\n222.185.237.37:3128\n183.179.146.153:8909\n190.151.111.202:3129\n61.167.49.188:8080\n222.52.99.131:8081\n122.72.30.119:80\n58.67.147.206:8080\n122.226.50.66:8080\n210.19.8.218:8080\n210.22.153.98:3128\n177.36.242.29:8080\n116.55.19.96:808\n82.148.74.154:8080\n118.97.208.194:3128\n150.140.184.110:3128\n124.172.250.177:3128\n59.175.137.122:3128\n203.114.105.243:8080\n58.68.232.85:3128\n202.117.35.249:80\n222.177.13.25:3128\n211.139.10.173:80\n213.217.58.25:8080\n58.67.147.196:8080\n177.36.242.1:8080\n58.67.147.201:8080\n89.135.63.36:80\n122.72.12.86:80\n202.148.16.2:8000\n85.131.163.219:3128\n58.67.147.202:8080\n177.36.242.5:8080\n188.93.20.179:8080\n118.174.131.94:3128\n210.101.131.232:8080\n95.31.214.137:3128\n194.36.161.212:3128\n218.25.249.185:80\n210.86.239.131:3128\n58.67.147.204:8080\n58.67.147.200:8080\n14.198.198.220:843\n182.48.54.133:8080\n122.72.12.87:80\n221.212.196.27:8080\n200.11.76.166:8118\n202.203.132.26:3128\n162.105.139.109:3128\n98.103.7.148:3128\n202.77.107.222:3128\n222.169.224.206:80\n177.36.242.9:8080\n88.249.28.20:8088\n121.96.247.25:3128\n121.243.243.118:1080\n177.36.242.21:8080\n122.72.10.204:80\n217.92.195.175:3128\n210.101.131.231:8080\n113.230.76.234:443\n61.235.92.227:8909\n211.76.97.145:80\n111.118.179.232:3128\n61.185.143.178:8080\n122.72.12.90:80\n122.193.31.69:3128\n60.191.49.123:3128\n220.113.15.21:1080\n64.69.40.254:3128\n177.36.242.13:8080\n203.168.225.50:8909\n211.152.36.99:80\n218.203.107.167:80\n208.73.211.108:80\n41.89.211.5:80\n60.209.5.13:808\n178.48.15.181:8080\n49.212.112.118:3128\n116.38.254.26:18080\n221.179.41.22:3128\n178.17.80.109:8080\n88.247.198.177:8088\n122.72.12.88:80\n58.177.172.231:8909\n211.155.128.46:8080\n60.213.44.50:3128\n210.212.20.170:3128\n211.76.97.152:80\n212.192.120.67:3128\n61.47.57.234:3128\n72.51.36.221:8090\n200.140.77.171:3128\n50.22.88.80:3128\n122.72.26.208:80\n216.221.204.239:8085\n210.51.23.136:8118\n189.22.230.70:3128\n113.16.185.35:8909\n202.103.215.203:80\n89.135.63.36:8040\n123.88.42.187:8909\n218.19.119.99:8080\n123.234.215.230:81\n193.2.191.211:80\n58.67.147.208:8080\n157.100.157.154:3128\n113.230.76.234:80\n66.146.193.31:8118\n79.120.197.202:8080\n117.79.235.90:80\n202.111.188.117:808\n219.145.93.110:8080\n88.250.175.5:8088\n111.1.33.138:80\n201.161.45.165:8080\n195.135.214.226:8080\n118.97.94.19:8080\n202.148.28.154:8000\n122.255.120.246:8080\n221.7.147.172:3128\n95.110.227.178:81\n200.68.18.178:80\n173.224.120.54:3128\n82.206.129.160:3128\n212.182.64.86:3128\n61.190.28.166:8080\n81.223.49.110:8080\n118.192.1.163:3128\n190.82.89.155:3128\n77.65.19.35:3128\n163.26.71.123:8080\n202.116.62.218:808\n190.116.35.20:3128\n123.124.158.227:8080\n202.148.5.234:3128\n121.14.9.76:80\n222.124.214.60:8080\n201.236.80.197:3128\n61.166.155.230:8080\n119.160.167.57:8118\n59.90.219.85:8080\n81.210.9.38:3128\n189.19.251.225:80\n122.72.12.89:80\n81.223.49.109:8080\n123.125.156.201:80\n61.221.217.196:3128\n202.137.18.40:80\n211.94.93.224:3128\n81.223.49.98:8080\n61.147.67.61:3128\n61.221.251.64:808\n200.196.234.26:8080\n81.223.49.107:8080\n76.74.239.9:8090\n213.140.116.188:9090\n118.144.88.203:9999\n221.7.228.137:80\n205.251.132.51:8080\n74.86.121.231:3128\n119.160.177.2:8118\n187.45.214.4:8080\n118.174.0.155:3128\n190.144.186.171:3128\n190.82.89.156:3128\n85.248.9.99:8080\n187.53.149.22:8080\n121.52.71.23:80\n85.114.132.49:3128\n194.150.220.113:3128\n220.194.59.162:80\n201.16.219.101:3128\n200.181.109.20:80\n31.25.137.202:8080\n202.75.53.218:9090\n74.86.121.229:3128\n91.213.87.3:3129\n190.152.249.73:3128\n221.130.162.52:80\n95.76.74.105:8000\n74.86.121.228:3128\n117.79.235.94:80\n78.186.126.244:8086\n117.239.2.85:6588\n78.187.51.94:8086\n59.125.82.23:8080\n124.42.77.187:80\n93.184.69.250:3128\n61.134.121.237:80\n41.75.201.146:80\n116.248.41.72:808\n58.254.134.201:8080\n58.67.147.198:8080\n120.71.46.225:8909\n200.249.86.2:3128\n187.60.96.7:3128\n110.234.205.50:3128\n41.73.2.35:8080\n69.169.145.80:3128\n222.77.69.210:3128\n189.112.189.28:3128\n58.67.147.203:8080\n93.126.43.244:3128\n187.72.145.54:8080\n211.239.84.213:80\n61.135.208.37:8081\n208.43.216.138:3128\n202.75.54.155:3128\n203.167.31.190:80\n64.34.197.103:8118\n194.150.220.35:3128\n200.54.92.187:3128\n217.219.175.81:8080\n187.52.188.127:80\n195.206.38.53:3128\n190.0.41.78:80\n200.93.182.18:3128\n187.72.83.110:8080\n200.54.92.187:80\n201.219.17.45:3128\n164.151.129.37:80\n200.113.15.74:3128\n82.148.109.68:3128\n190.121.20.131:3128\n85.72.35.240:8080\n41.0.65.71:8080\n84.25.123.69:8080\n201.65.32.131:80\n186.42.197.178:3128\n113.10.164.138:80\n62.121.64.19:8080\n190.0.45.98:8080\n118.97.75.226:8080\n174.129.210.43:27977\n122.255.120.113:8080\n202.53.164.30:8080\n94.78.80.190:8080\n182.71.75.30:3128\n201.90.8.115:3128\n186.201.27.66:3128\n213.217.58.25:80\n211.23.11.110:3128\n41.234.202.225:8080\n190.254.20.42:8080\n190.85.84.122:8085\n201.30.132.51:3128\n196.2.73.246:3128\n200.253.116.4:3128\n186.3.41.17:3128\n189.17.66.85:3128\n200.52.220.45:3128\n200.111.123.253:3128\n196.216.56.18:3128\n200.198.116.54:3128\n125.163.208.166:8080\n189.108.118.194:3128\n217.219.67.148:3128\n211.115.83.21:80\n200.253.116.3:3128\n196.205.71.54:8080\n189.85.16.152:80\n186.113.186.94:8080\n217.218.251.189:3128\n200.251.62.51:3128\n118.97.18.250:3128\n200.37.63.11:3128\n119.235.54.42:3128\n95.170.219.89:80\n41.84.130.229:3128\n186.4.233.2:80\n122.72.0.6:80\n200.61.168.141:8080\n119.18.148.46:8080\n122.152.183.180:80\n122.72.12.85:80\n202.39.208.69:80\n220.168.248.106:80\n189.75.171.226:3128\n190.147.134.217:3128\n187.0.222.167:3128\n178.48.2.237:8080\n60.251.189.134:3128\n190.108.80.195:3128\n186.194.7.185:8080\n210.176.171.236:8080\n122.117.43.13:808\n60.191.232.230:80\n190.96.64.234:8080\n220.168.248.101:80\n93.116.142.104:8080\n93.114.61.245:8080\n116.90.208.30:8080\n200.37.200.71:8080\n201.76.215.77:3128\n187.72.86.146:3128\n200.37.170.141:3128\n210.176.171.237:8080\n124.244.242.72:3128\n190.98.248.114:80\n190.144.250.172:3128\n220.135.92.184:3128\n82.148.109.68:3270\n121.88.250.204:80\n115.109.122.79:3128\n190.249.167.176:8080\n186.46.187.43:3128\n61.183.254.88:808\n201.73.83.130:3128\n123.84.14.72:80\n118.98.31.6:8080\n200.7.201.243:8080\n187.111.11.82:8080\n190.95.246.3:3128\n187.102.64.137:8080\n200.171.181.130:3128\n186.3.41.22:3127\n187.6.87.218:3128\n190.152.76.254:8080\n202.88.225.155:80\n218.29.54.105:80\n118.98.31.6:3128\n222.83.210.45:8080\n183.63.204.131:8080\n190.26.91.173:3128\n210.212.55.194:3128\n190.196.162.155:8080\n222.42.45.51:3128\n189.113.64.122:8080\n200.195.155.114:8080\n202.91.246.215:3128\n187.63.15.61:3128\n222.124.219.219:8080\n95.82.26.58:80\n222.88.95.66:80\n58.177.198.69:3128\n83.128.92.181:80\n61.19.127.131:8080\n211.110.204.67:80\n101.44.1.107:80\n123.196.125.45:80\n186.96.252.185:8085\n41.35.46.156:8080\n200.27.114.228:8080\n200.68.18.178:8080\n195.158.101.184:3128\n41.210.52.202:8080\n200.142.107.26:3128\n211.143.40.230:80\n41.35.46.128:80\n122.155.0.190:3128\n122.72.30.120:80\n116.90.208.30:443\n200.223.17.204:8080\n58.60.231.78:3128\n218.189.26.158:8080\n202.148.29.243:8000\n218.204.97.86:3128\n189.124.94.118:8080\n200.137.130.31:3128\n182.72.170.14:3128\n146.83.193.75:3128\n201.54.230.75:3128\n118.96.31.91:3128\n122.48.31.77:80\n187.49.83.85:8080\n187.0.181.166:80\n58.83.224.217:8080\n187.5.159.218:80\n41.89.211.5:8080\n113.108.181.171:3128\n202.162.216.138:8080\n217.219.28.50:80\n207.219.7.136:80\n92.61.182.200:80\n27.50.21.45:8080\n218.75.149.147:8080\n177.39.212.109:3128\n186.3.71.155:8080\n122.207.3.66:80\n201.57.146.136:3128\n122.72.33.139:80\n200.155.57.81:3128\n195.208.249.40:3128\n187.102.64.131:8080\n88.12.58.163:3128\n190.74.124.107:3128\n187.72.136.140:3128\n202.127.1.88:3128\n118.97.8.106:8080\n210.105.194.99:3128\n200.114.84.2:8090\n121.10.243.44:3128\n189.91.231.88:3128\n196.212.156.30:8080\n178.219.243.114:3128\n113.9.163.204:8080\n187.111.223.10:8080\n200.161.199.121:3128\n221.5.71.188:3128\n82.207.81.150:4866\n223.27.145.172:3128\n217.66.212.243:8080\n122.72.28.19:80\n113.53.252.131:3128\n92.53.39.129:3128\n177.52.17.162:3128\n112.109.20.154:8888\n201.209.205.147:3128\n187.19.202.166:8080\n202.46.127.241:8080\n219.137.229.210:3128\n222.184.9.242:3128\n187.33.229.133:8080\n189.2.17.21:3128\n118.97.235.234:3128\n125.88.75.151:3128\n211.139.10.169:80\n202.127.28.67:3128\n117.34.7.21:3128\n190.128.170.18:8080\n222.124.217.170:8080\n83.111.38.131:3128\n217.219.28.50:3128\n122.225.68.125:8181\n218.210.199.252:3128\n123.49.1.90:3128\n218.93.118.154:3128\n122.154.140.50:8080\n118.97.209.218:8080\n178.48.2.237:80\n202.148.25.58:80\n81.89.211.123:3128\n222.124.5.82:8080\n211.110.204.61:80\n210.182.240.28:80\n115.236.98.109:80\n187.62.95.118:3128\n189.36.139.234:9090\n218.203.107.169:80\n187.75.254.26:3128\n202.143.168.140:3128\n202.148.25.58:8080\n190.103.220.36:8080\n203.76.106.67:8080\n202.159.223.52:3128\n186.225.106.150:3128\n203.114.112.101:3128\n203.172.209.133:3128\n78.39.56.18:3128\n61.136.59.177:80\n59.37.163.156:3128\n92.63.15.226:8080\n220.135.70.173:3128\n118.96.152.155:8080\n190.196.19.28:3128\n190.121.22.186:8080\n116.197.166.209:80\n217.219.175.72:8080\n122.160.154.254:3128\n212.119.71.201:80\n190.128.222.114:80\n58.59.141.120:8081\n187.33.251.104:3128\n190.29.24.23:8080\n182.99.127.29:80\n218.14.227.197:3128\n41.215.5.82:3128\n123.196.114.70:80\n202.179.82.28:3128\n110.138.208.116:8008\n61.54.26.44:8080\n60.250.109.87:3128\n85.185.166.163:8090\n210.43.128.18:3128\n122.225.107.27:80\n122.72.33.138:80\n111.94.140.111:3128\n190.144.13.66:3128\n85.97.190.122:8080\n186.250.3.20:3128\n202.91.234.152:3128\n187.6.254.19:3128\n201.252.251.195:8080\n81.195.40.2:8080\n117.102.101.219:8080\n150.165.29.47:3128\n202.137.18.66:3128\n201.38.194.50:3128\n203.89.25.186:8080\n218.85.137.11:80\n186.251.177.226:3128\n202.143.146.205:8080\n177.52.17.178:3128\n180.139.91.27:8080\n189.3.13.131:3128\n203.113.102.61:8080\n65.55.73.222:80\n85.185.226.25:8080\n210.9.41.116:80\n200.251.62.50:3128\n200.114.85.69:8090\n60.250.20.107:3128\n110.139.150.155:8080\n122.225.19.181:3128\n114.33.112.160:8181\n118.97.237.109:8080\n187.102.201.1:3128\n200.140.77.170:3128\n219.157.200.18:3128\n116.90.208.187:8000\n58.253.192.122:80\n222.184.9.243:3128\n203.66.188.252:8080\n186.125.158.235:8080\n202.137.27.170:3128\n202.171.34.234:3124\n200.42.69.94:8080\n189.75.117.33:8080\n122.225.108.110:3128\n61.189.33.221:8080\n113.53.252.106:8080\n110.139.150.155:80\n189.3.225.99:3128\n203.189.89.153:8080\n200.111.115.173:8080\n60.190.136.90:3128\n222.124.33.33:3128\n118.97.75.189:3128\n118.174.1.186:3128\n222.124.33.33:80\n118.97.99.186:8080\n219.130.39.9:3128\n2.179.143.47:8080\n223.27.145.173:3128\n91.75.24.162:3128\n201.24.79.29:3129\n118.97.164.178:8080\n222.76.219.77:80\n177.53.146.234:3128\n200.167.185.179:3128\n217.66.212.241:8080\n190.255.39.146:3128\n186.109.89.208:3128\n41.215.26.166:80\n202.79.18.28:8080\n110.139.133.16:3128\n200.198.116.61:3128\n41.234.202.122:80\n203.190.190.68:8080\n175.100.114.170:8080\n112.85.42.69:80\n113.53.240.90:3128\n201.65.237.68:3128\n200.198.116.62:3128\n80.191.122.21:3128\n196.1.178.254:3128\n193.194.85.94:8080\n187.11.171.61:3128\n219.83.100.197:8080\n64.152.0.45:80\n187.62.103.10:8080\n109.204.121.123:80\n186.24.8.130:3128\n78.39.56.19:3128\n182.72.244.210:80\n110.138.215.112:8080\n190.249.188.229:80\n182.72.244.210:8080\n27.124.88.237:8080\n186.235.108.187:8080\n220.189.209.244:3128\n187.6.245.123:80\n202.143.152.52:3128\n200.107.148.138:8080\n41.35.47.164:8080\n119.1.174.28:3128\n120.35.31.101:8080\n190.210.96.17:80\n12.170.91.242:3128\n200.107.236.162:8080\n190.226.225.16:8080\n78.45.134.216:3128\n118.97.94.194:80\n118.98.35.251:8080\n222.60.8.86:80\n195.7.32.214:8080\n116.66.204.131:3128\n119.145.197.69:8080\n186.216.160.147:8080\n200.161.84.42:3128\n110.139.13.121:8080\n118.97.195.106:8080\n123.234.31.130:8090\n202.162.223.106:8080\n221.133.241.126:8080\n200.27.114.228:80\n122.48.31.76:80\n186.113.181.50:80\n114.199.126.122:3128\n202.44.14.73:8080\n61.144.23.76:8080\n41.236.175.88:8080\n124.199.126.26:80\n221.195.42.195:8080\n201.66.67.2:3128\n187.0.221.195:3128\n218.240.42.238:3128\n125.65.110.183:8080\n60.12.117.28:80\n221.2.159.175:8080\n190.253.95.229:8080\n118.97.195.202:8080\n189.127.176.49:8080\n118.96.9.139:80\n110.137.128.33:8080\n189.254.250.34:80\n190.196.19.157:3128\n201.39.157.226:3128\n41.162.7.234:8081\n120.197.10.142:3128\n182.50.8.213:443\n221.122.53.228:3128\n189.17.58.194:3128\n118.97.94.234:8080\n200.59.34.102:8080\n95.9.85.101:3128\n203.113.116.115:8080\n60.29.101.130:8080\n190.203.101.57:8080\n217.218.212.194:3128\n222.124.178.98:3128\n110.139.59.89:3128\n190.41.192.103:8080\n115.96.32.18:3128\n60.217.32.143:88\n77.123.88.13:3128\n187.11.211.88:3128\n187.32.101.68:3128\n177.52.17.179:3128\n81.213.157.71:80\n77.105.45.59:8080\n219.83.100.205:8080\n200.60.11.22:8080\n77.95.95.205:80\n190.200.11.181:8080\n186.153.181.226:8080\n110.136.203.65:8000\n118.96.93.121:8080\n217.218.212.197:3128\n118.96.153.161:3128\n190.41.82.224:80\n190.37.110.206:8080\n190.90.100.104:8000\n190.253.213.196:3128\n97.81.243.127:8080\n118.96.231.137:8080\n59.90.213.18:3128\n116.50.30.36:8080\n190.249.191.189:80\n218.152.121.184:8080\n190.41.82.224:8080\n41.35.47.124:8080\n122.52.117.92:8080\n41.202.0.131:3128\n218.28.111.46:8080\n118.96.79.252:8080\n189.2.17.22:3128\n81.223.49.108:8080\n88.131.82.241:3128\n186.201.111.34:8080\n202.28.110.17:8080\n118.96.251.234:8080\n121.12.250.201:3128\n117.239.112.50:8080\n187.28.83.131:8080\n189.254.250.34:8080\n201.248.236.105:8080\n111.93.166.202:8080\n109.75.64.30:3128\n200.45.236.52:80\n190.105.161.208:3128\n61.93.130.39:80\n110.138.210.160:8080\n115.178.127.130:8080\n202.78.196.34:8080\n201.76.212.108:3128\n101.50.17.25:8080\n190.40.61.40:3128\n190.40.7.107:80\n125.161.127.160:8080\n189.50.142.94:80\n109.205.114.178:8080\n41.73.2.36:8080\n201.219.17.45:8080\n202.102.58.209:80\n200.253.116.5:3128\n200.253.116.2:3128\n210.212.194.60:3128\n193.227.178.5:80\n190.249.188.229:8080\n110.139.118.95:8080\n119.161.238.90:80\n202.164.211.74:8080\n186.219.238.34:8080\n201.249.94.27:3128\n118.96.228.243:3128\n125.165.54.9:8080\n110.139.151.124:8080\n180.243.86.215:8080\n91.120.21.169:80\n190.121.135.178:8080\n110.139.166.35:8080\n115.85.65.162:8080\n218.28.142.100:8080\n118.96.105.143:8080\n186.114.134.20:8080\n196.214.91.206:3128\n119.18.148.41:8080\n31.151.46.89:8080\n122.166.226.241:8080\n110.138.146.30:8080\n81.223.49.104:8080\n189.3.23.3:9090\n203.113.118.37:3128\n203.153.121.131:8080\n110.138.100.145:8888\n189.16.82.34:8080\n121.22.34.166:3128\n213.175.164.218:80\n200.198.119.210:8080\n190.196.19.129:3128\n200.206.129.229:80\n201.44.59.158:3128\n122.0.66.102:8080\n220.157.99.78:8080\n70.167.146.73:8080\n186.153.120.42:8080\n62.56.137.5:8080\n202.146.143.17:3128\n200.174.143.194:3128\n203.153.31.218:8080\n200.93.182.18:8080\n200.63.71.225:8080\n202.51.120.58:8080\n81.223.49.106:8080\n201.217.59.110:8080\n201.248.43.232:3128\n110.139.24.116:3128\n116.68.207.80:8080\n61.166.144.189:8080\n93.157.254.37:8080\n187.1.120.65:8080\n201.65.255.34:8080\n202.137.18.162:3128\n78.39.68.145:3128\n120.88.10.168:8123\n75.147.206.177:80\n201.210.191.146:8080\n114.130.13.222:8080\n41.189.36.26:3128\n61.141.21.34:8080\n110.139.62.192:8080\n110.139.57.63:8080\n202.146.143.33:3128\n80.251.247.14:3128\n116.66.194.33:8080\n201.251.59.1:80\n219.80.4.150:3128\n72.64.146.73:3128\n46.109.21.107:8080\n189.36.137.66:8080\n201.88.254.242:80\n192.162.150.77:3128\n124.161.63.194:80\n41.234.202.1:8080\n217.219.133.30:3128\n202.62.118.138:3128\n202.77.107.110:8082\n201.15.62.235:8080\n93.99.113.91:8080\n118.96.135.49:8080\n200.37.200.71:80\n196.32.195.42:3128\n122.54.181.125:3128\n186.153.121.18:8080\n188.173.80.134:8080\n201.130.47.33:80\n187.75.129.184:3128\n110.136.145.41:3128\n213.244.81.245:8080\n41.75.201.146:8080\n116.90.209.91:8080\n201.57.117.242:8080\n222.60.8.66:8080\n116.90.208.187:8080\n41.32.36.202:80\n110.138.215.48:80\n27.131.130.66:8080\n118.96.92.93:3128\n"
  },
  {
    "path": "regex.conf.sample",
    "content": "<!--\n  pastemon.pl regex configuration file (sample)\n//-->\n\n<config>\n        <regex>\n                <search>rootshell\\.be</search>\n        </regex>\n        <regex>\n                <search>anonbelgium</search>\n        </regex>\n        <regex>\n                <search>-----BEGIN (RSA|DSA) PRIVATE KEY-----</search>\n        </regex>\n        <regex>\n                <search>-- phpMyAdmin SQL Dump</search>\n        </regex>\n\t<!--\n\tExample of exclusion: search for \"belgium\" without \"france\" in the same pastie\n\t//-->\n        <regex>\n                <search>belgium</search>\n\t\t<exclude>france</exclude>\n        </regex>\n\t<!--\n\tExample fo inclusion: search for belgium\" and \"luxembourg\" in the same pastie\n\t//-->\n        <regex>\n                <search>belgium</search>\n\t\t<include>luxembourg</include>\n        </regex>\n\t<!--\n\tExample of match 5 IP addresses\n\t//-->\n\t<regex>\n\t\t<search>\\d+\\.\\d+\\.\\d+\\.\\d+</search>\n\t\t<count>5</count>\n\t</regex>\n</config>\n"
  },
  {
    "path": "user-agents.conf",
    "content": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1\nOpera/9.20 (Windows NT 6.0; U; en)\nGooglebot/2.1 ( http://www.googlebot.com/bot.html)\nMozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)\nMozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1\nMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5\nMozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)\nMozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3\nMozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:12.0) Gecko/20100101 Firefox/12.0\nMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)\nMozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0\n"
  }
]