Skip to main content

index.php (Source)

<?php
    header("Access-Control-Allow-Origin: *");
    $USER = "christian";
    $HOME = "/home/$USER";
    $hosts = [gethostname(), '127.0.0.1'];
    $host = $hosts[0];
?>
<!doctype html>
<html>
<head>
        <title><?= $host ?>!</title>
        <style>
            body {
                display: grid;
                justify-items: center;
                list-style: none;
                grid-template-columns: auto 1fr;
            }
            ul {
                font-size: 3rem;
            }
            li ~ li {
                margin-top: 1em;
            }
            dl {
                font-size: small;
                display: grid;
            }
            dt {
                grid-row: 1;
            }
        </style>
</head>
<body>
        <section>
            <h2>On port 80</h2>
            <ul>
<?php
    foreach(scandir(dirname(__FILE__)) as $p) {
        if(is_dir($p) && !str_starts_with($p, ".")) {
?>
                <li><a href="http://<?= $host ?>/<?= $p ?>"><?= $p ?></a></li>
<?php
        }
    }
?>
            </ul>
        </section>
        <section>
            <h2>Other open ports</h2>
            <ul>
<?php
$port_pids = [];
$res = explode("\n", shell_exec("sudo /var/www/html/ports-to-pids.py"));
foreach($res as $line) {
    if(!$line) {
        continue;
    }
    [$port, $pid, $cwd] = explode("\t", $line);
    $port_pids[$port] = [$pid, $cwd];
}
/* For each (port, pid) pair, show a link
*/
foreach($port_pids as $port => [$pid, $cwd]) {
    foreach($hosts as $host) {
        $connection = @fsockopen($host, $port);
        if (!is_resource($connection)) {
            continue;
        }
        fclose($connection);
        if(str_starts_with(substr($cwd,0,strlen($HOME)), $HOME)) {
            $cwd = substr($cwd,strlen($HOME));
        } else {
            continue;
        }
        // Try an HTTP request to this port, to get the page's title.
        $URL = "http://${host}:${port}";
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_URL => $URL,
            CURLOPT_RETURNTRANSFER => true
        ]);
        $output = curl_exec($ch);
        curl_close($ch);
        if(!$output) {
            // Not an HTTP server
            continue;
        }
        libxml_use_internal_errors(true);
        $doc = new DOMDocument();
        if(!$doc->loadHTML($output)) {
            foreach (libxml_get_errors() as $error) {
                $title = "<div>$error</div>";
            }
        } else {
            $titles = $doc->getElementsByTagName('title');
            foreach($titles as $title_node) {
                $title = $title_node->nodeValue;
            }
        }
        libxml_use_internal_errors(false);
        
        // Show a link to the server, and information about the process.
?>
        <li>
            <a href="http://<?= $host ?>:<?= $port ?>"><?= $title ?></a>
            <dl>
                <dt>address</dt>
                <dd><?= $host ?>:<?= $port ?></dd>
                <dt><abbr title="Current working directory of the process">cwd</abbr></dt>
                <dd>~<?= $cwd ?></dd>
                <dt><abbr title="Process ID">pid</abbr></dt>
                <dd><?= $pid ?></dd>
            </dl>
        </li>
<?php
    }
}
?>
            </ul>
        </section>
</body>
</html>