[Python-CGI] PC Control Remoto - JaAViEr

Iniciado por 0x5d, 30 Octubre 2014, 08:51 AM

0 Miembros y 1 Visitante están viendo este tema.

0x5d

¿ Qué es PC Control Remoto ?

PC Control Remoto es un programa/web desarrollado bajo el lenguaje de programación Python en conjunto con su librería CGI, la cuál nos permitirá montar un servidor CGI y poder llevar acabo nuestro cometido.

Este programa nos permitirá acceder a nuestro computador forma remota, con tu Navegador favorito, conectado vía LAN o a Internet (configuración aparte), desde cualquier navegador. Las funciones que nos brinda son las siguiente:

       
  • Consola - Terminal remota: Puedes ejecutar cualquier comando y obtener su salida desde tu navegador.
       
  • Comándos rápidos: Entre estos comándos rápidos tenemos las posibilidad de:

         
    • Apagar PC. (60 segundos).
         
    • Reiniciar PC. (60 segundos).
         
    • Cancelar Apagado/Reinicio.
         
    • Matar un proceso.
         
    • Iniciar un proceso.
El programa en general se compone de:

       
  • Server.py - Programa encargado de crear el servidor bajo el puerto que queramos.
       
  • Index.py - Login e inicio del Panel de Control.
       
  • Terminal.py - Consola remota.
       
  • Comando_rapido.py - Comandos rápidos.
       
  • Logout.py - Cerrar sesión
Además de otros componentes como Topcoat (CSS), jQuery (JS).

Solo extraer en una carpeta y ejecutar server.py PUERTO

Adjunto el código de cada archivo Python mencionado anteriormente

server.py

Código (python) [Seleccionar]
'''
Autor: JaAViEr
Twitter: @javieresteban__
Website: http://codigo.ga
'''
from CGIHTTPServer import CGIHTTPRequestHandler
from BaseHTTPServer import HTTPServer
import socket
import sys

try:

port = int(sys.argv[1])

if port:

ip_interna = socket.gethostbyname(socket.gethostname())
print "Panel de control: http://%s:%s/cgi-bin/index.py" % (ip_interna, port)
server_address=('', port)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
httpd.serve_forever()

except:

print "-"*40
print "Uso:"
print sys.argv[0], "PUERTO"
print "-"*40
print "Ejemplo de uso:"
print sys.argv[0], "5050"
print "-"*40

Luego de server.py, deben pasar como parámatro el puerto al cual estará asociado el servidor.




index.py

Código (python) [Seleccionar]
#-*- encoding:utf-8 -*-
'''
Autor: JaAViEr
Twitter: @javieresteban__
Website: http://codigo.ga
'''
import cgi
import os
import Cookie
import md5

lista_usuarios = ["admin", "JaAViEr"] #Usuarios
lista_passwords = ["root", "toor"] # Contraseñas
method = os.environ.get("REQUEST_METHOD")
logueado = False
contenido_cookies = os.environ.get('HTTP_COOKIE')

tag_head = ''' <meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="/topcoat/css/topcoat-mobile-dark.min.css" class="uib-framework-theme">
<link rel="stylesheet" type="text/css" href="/css/index_main.less.css" class="main-less">
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
<style type="text/css">
/* Prevent copy paste for all elements except text fields */
*  { -webkit-user-select:none; -webkit-tap-highlight-color:rgba(255, 255, 255, 0); }
input, textarea  { -webkit-user-select:text; }
</style>
<script type="application/javascript" src="/js/jquery.min.js"></script>
<script type="application/javascript" src="/js/index_user_scripts.js"></script>'''

def code_login(accion=False):

if accion == 'error':

mensaje_error = '''
  <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="topcoat/nav" data-ver="0">
<div class="topcoat-navigation-bar__item center full">
<h1 class="topcoat-navigation-bar__title">Verifica tus credenciales por favor[/size][/center]
</div>
  </div>
'''

else:

mensaje_error = ''

return '''
<!DOCTYPE html>
<html>

  <head>
''' + tag_head + '''
<title>Indetifícate en el sistema</title>
  </head>

  <body>
    <div class="uwrap">
      <div class="upage" id="mainpage">
        <div class="upage-outer">
          <div class="upage-content" id="mainsub">

            <div class="grid grid-pad urow uib_row_2 row-height-2" data-uib="layout/row" data-ver="0">
              <div class="col uib_col_2 col-0_12-12" data-uib="layout/col" data-ver="0">
                <div class="widget-container content-area vertical-col">

                  <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="topcoat/nav" data-ver="0">
                    <div class="topcoat-navigation-bar__item center full">
                      <h1 class="topcoat-navigation-bar__title">Indentifícate[/size][/center]
                    </div>
                  </div>
                  <span class="uib_shim"></span>
                </div>
              </div>
              <span class="uib_shim"></span>
            </div>

            <div class="grid grid-pad urow uib_row_3 row-height-3" data-uib="layout/row" data-ver="0">

<form action="" method="POST">
<div class="col uib_col_3 col-0_12-12" data-uib="layout/col" data-ver="0">
<div class="widget-container content-area vertical-col">
<div class="table-thing widget uib_w_2 d-margins" data-uib="topcoat/input" data-ver="0">
<label class="narrow-control label-top-left">Usuario</label>
<input class="wide-control topcoat-text-input" type="text" placeholder="Usuario" name="usuario">
</div>
<div class="table-thing widget d-margins" data-uib="topcoat/input" data-ver="0">
<label class="narrow-control label-top-left">Contraseña</label>
<input class="wide-control topcoat-text-input" type="password" placeholder="Contraseña" name="password">
</div>
<button class="widget d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0">Ingresar</button><span class="uib_shim"></span>
</div>
''' +mensaje_error+ '''
</form>
              </div>
              <span class="uib_shim"></span>
            </div>
          </div>
          <!-- /upage-content -->

        </div>
        <!-- /upage-outer -->

      </div>
      <!-- /upage -->

    </div>
    <!-- /uwrap -->
  </body>

</html>'''

code = '''<!DOCTYPE html>
<!--HTML5 doctype-->
<html>

<head>
''' + tag_head + '''
<title>Control Remoto :: 2014</title>
</head>

<body>
<!-- content goes here-->
<div class="uwrap">
<div class="upage" id="mainpage">
<div class="upage-outer">
<div class="upage-content" id="mainsub">

<div class="grid grid-pad urow uib_row_1 row-height-1" data-uib="layout/row" data-ver="0">
<div class="col uib_col_2 col-0_12-12" data-uib="layout/col" data-ver="0">
<div class="widget-container content-area vertical-col">

<div class="topcoat-navigation-bar widget uib_w_2 d-margins" data-uib="/topcoat/nav" data-ver="0">
<div class="topcoat-navigation-bar__item center full">
<h1 class="topcoat-navigation-bar__title">Panel de Control Remoto[/size][/center]
</div>
</div>
<button class="widget uib_w_4 d-margins topcoat-button--large--cta" data-uib="/topcoat/button" data-ver="0">Consola - Terminal</button>
<button class="widget uib_w_3 d-margins topcoat-button--large--cta" data-uib="/topcoat/button" data-ver="0">Enviar comando rápido</button>
<button class="widget uib_w_5 d-margins topcoat-button--large" onclick='location.href="logout.py"' data-uib="/topcoat/button" data-ver="0">Salir</button>
<span class="uib_shim"></span>
</div>
</div>
<span class="uib_shim"></span>
</div>

</div>
<!-- /upage-content -->

</div>
<!-- /upage-outer -->

</div>
<div class="upage hidden" id="uib_page_3">
<div class="upage-outer">
<div id="uib_page_3sub" class="upage-content ">
</div>
</div>
<!-- /upage-outer -->
te </div>
<div class="upage hidden" id="uib_page_2">
<div class="upage-outer">
<div id="uib_page_2sub" class="upage-content ">
</div>
</div>
<!-- /upage-outer -->
</div>
<div class="upage hidden" id="uib_page_1">
<div class="upage-outer">
<div id="uib_page_1sub" class="upage-content ">
</div>
</div>
<!-- /upage-outer -->
</div>

<!-- /upage -->

</div>
<!-- /uwrap -->
</body>

</html>'''

def verificar_login(u, p):

if u in lista_usuarios and p in lista_passwords:

session = u + p
session = md5.md5(session).hexdigest()
return True

else:

return False

if contenido_cookies: #Si hay cookies...

valores_cookie = Cookie.SimpleCookie(contenido_cookies)
session_actual = valores_cookie['sess'].value # session_actual = cookie "sess"

if session_actual == "false": # No logueado

logueado = False

else: # Verifica login

for a, b in zip(lista_usuarios, lista_passwords):

session_temporal = a + b
session_temporal = md5.md5(session_temporal).hexdigest()

if session_actual == session_temporal:

logueado = True # Login coincide
break

else:

pass

else: #No logueado, sess = false

print "Set-Cookie:sess=false"

print "Content-Type: text/html"

if method == "POST":

form = cgi.FieldStorage()
usuario = form.getvalue('usuario')
password = form.getvalue('password')

if verificar_login(usuario, password):

session = usuario + password
session = md5.md5(session).hexdigest()
print "Set-Cookie:sess=%s" % session
print
print code

else:

print
print code_login('error')

elif method == "GET":

if not logueado:

print code_login()

else:

print code


terminal.py

Código (python) [Seleccionar]
#-*- encoding:utf-8 -*-
'''
Autor: JaAViEr
Twitter: @javieresteban__
Website: http://codigo.ga
'''
import cgi
import os
import Cookie
import md5

print "Content-Type: text/html"
print

code_terminal = '''
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" type="text/css" href="/topcoat/css/topcoat-mobile-dark.min.css" class="uib-framework-theme">
    <link rel="stylesheet" type="text/css" href="/css/terminal_main.less.css" class="main-less">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
<title>Terminal</title>
    <script src="/js/jquery.min.js"></script>
  </head>

  <body>
    <div class="uwrap">
      <div class="upage" id="mainpage">
        <div class="upage-outer">
          <div class="upage-content" id="mainsub">

            <div class="grid grid-pad urow uib_row_1 row-height-1" data-uib="layout/row" data-ver="0">
              <div class="col uib_col_1 col-0_12-12" data-uib="layout/col" data-ver="0">
                <div class="widget-container content-area vertical-col">

                  <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="/topcoat/nav" data-ver="0">
                    <div class="topcoat-navigation-bar__item center full">
                      <h1 class="topcoat-navigation-bar__title">Consola - Terminal[/size][/center]
                    </div>
                  </div>
                  <div class="table-thing widget uib_w_2 d-margins" data-uib="/topcoat/textarea" data-ver="0">
                    <label class="narrow-control label-inline"></label>
                    <textarea class="wide-control topcoat-textarea" type="text" placeholder="Comandos" name="comando"></textarea>
                  </div>
<button class="widget uib_w_2 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick='execute();'>¡Ejecutar!</button>
<button class="widget uib_w_2 d-margins topcoat-button" data-uib="topcoat/button" data-ver="0" onclick='location.href="index.py"'>Volver</button>
<hr>
Salida:
<span id="loader"></span>
                  <span class="uib_shim"></span>
                </div>
              </div>
              <span class="uib_shim"></span>
            </div>
          </div>
          <!-- /upage-content -->

        </div>
        <!-- /upage-outer -->

      </div>
      <!-- /upage -->

    </div>
    <!-- /uwrap -->
<script language="javascript">

function execute(){

comando = $("textarea[name=comando]").val();
$("#loader").load("terminal.py", {"comando":comando});

}
</script>
  </body>

</html>'''

logueado = False
lista_usuarios = ["admin", "JaAViEr"] #Usuarios
lista_passwords = ["root", "toor"] # Contraseñas
method = os.environ['REQUEST_METHOD']
lectura_cookies = os.environ.get('HTTP_COOKIE')

if lectura_cookies:

valores_cookie = Cookie.SimpleCookie(lectura_cookies)
session_actual = valores_cookie['sess'].value # session_actual = cookie "sess"

if session_actual != "false":

for a, b in zip(lista_usuarios, lista_passwords):

session_temporal = a + b
session_temporal = md5.md5(session_temporal).hexdigest()

if session_actual == session_temporal:

logueado = True # Login coincide
break

else:

pass
else:

pass

if logueado:
if method == "GET":

print code_terminal

elif method == "POST":

form = cgi.FieldStorage()
comando = form.getvalue("comando")
lineas = comando.split("\n")
print '''
<span  style="font-family:Trebuchet Ms; color: #fff;" class="wide-control">
<br />
'''
for l in lineas:

try:

run = os.popen(l, "r")
run_content = run.read()
run_content = run_content.replace("\n", "<br>")
run_content = run_content.replace(" ", "&nbsp;")
print run_content
run.close()

except:

print "Error al ejecutar comando %s" % (l)

print "</span>"
else:
print "<script>location.href='index.py';</script>"

comando_rapido.py
Código (python) [Seleccionar]
#-*- encoding:utf-8 -*-
'''
Autor: JaAViEr
Twitter: @javieresteban__
Website: http://codigo.ga
'''
import cgi
import os
import subprocess
import Cookie
import md5

print "Content-Type: text/html"
print
code_terminal = '''
<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" type="text/css" href="/topcoat/css/topcoat-mobile-dark.min.css" class="uib-framework-theme">
    <link rel="stylesheet" type="text/css" href="/css/terminal_main.less.css" class="main-less">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
<title>Comandos rápidos</title>
    <script src="/js/jquery.min.js"></script>
  </head>

  <body>
    <div class="uwrap">
      <div class="upage" id="mainpage">
        <div class="upage-outer">
          <div class="upage-content" id="mainsub">

            <div class="grid grid-pad urow uib_row_3 row-height-3" data-uib="layout/row" data-ver="0">
              <div class="col uib_col_3 col-0_12-12" data-uib="layout/col" data-ver="0">
                <div class="widget-container content-area vertical-col">

                  <div class="topcoat-navigation-bar widget uib_w_1 d-margins" data-uib="topcoat/nav" data-ver="0">
                    <div class="topcoat-navigation-bar__item center full">
                      <h1 class="topcoat-navigation-bar__title">Comandos rápidos[/size][/center]
                    </div>
                  </div>
                  <span class="uib_shim"></span>
                </div>
              </div>
              <span class="uib_shim"></span>
            </div>

            <div class="grid grid-pad urow uib_row_4 row-height-4" data-uib="layout/row" data-ver="0">
              <div class="col uib_col_4 col-0_12-12" data-uib="layout/col" data-ver="0">
                <div class="widget-container content-area vertical-col">

<button class="widget uib_w_2 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="comando('apagar'); return false;">Apagar</button>
<button class="widget uib_w_3 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="comando('reiniciar'); return false;">Reiniciar</button>
<button class="widget uib_w_4 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="comando('cancelar salida'); return false;">Cancelar Apagado/Rein.</button>
<button class="widget uib_w_5 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="matar_proceso('mostrar'); return false;">Matar proceso</button>
<span id="matar_proceso" style="display:none">
<hr>
<input class="wide-control topcoat-text-input" type="text" placeholder="proceso.ext" name="proceso">
<button class="widget uib_w_6 d-margins topcoat-button wide-control" data-uib="topcoat/button" data-ver="0" onclick="matar_proceso('kill'); return false;">¡Matar ahora!</button>
<hr>
</span>
<button class="widget uib_w_6 d-margins topcoat-button--cta" data-uib="topcoat/button" data-ver="0" onclick="iniciar_proceso('mostrar'); return false;">Iniciar proceso</button>
<span id="iniciar_proceso" style="display:none">
<hr>
<input class="wide-control topcoat-text-input" type="text" placeholder="proceso.ext" name="iniciar_proceso">
<button class="widget uib_w_6 d-margins topcoat-button wide-control" data-uib="topcoat/button" data-ver="0" onclick="iniciar_proceso('iniciar'); return false;">¡Iniciar ahora!</button>
<hr>
</span>
<button class="widget uib_w_2 d-margins topcoat-button" data-uib="topcoat/button" data-ver="0" onclick='location.href="index.py"'>Volver</button>
  <span class="uib_shim"></span>
 
                </div>
              </div>
              <span class="uib_shim"></span>
            </div>
          </div>
          <!-- /upage-content -->

        </div>
        <!-- /upage-outer -->

      </div>
      <!-- /upage -->

    </div>
    <!-- /uwrap -->
  </body>
  <span id="loader" style="display:none;"></span>
  <script language="javascript">
 
  function comando(cmd){
 
$("#loader").load("comando_rapido.py", {"comando":cmd});
 
  }
  function matar_proceso(param){
 
if(param == 'mostrar'){
$("#matar_proceso").fadeIn();
$("#iniciar_proceso").fadeOut();
}else if(param == 'kill'){
proceso = $("input[name=proceso]").val();
$("#loader").load("comando_rapido.py", {"kill": proceso});
$("#matar_proceso").fadeOut();
$("input[name=proceso]").val("");
}
  }
 
  function iniciar_proceso(accion){
 
  if (accion == "mostrar"){
 
$("#matar_proceso").fadeOut();
$("#iniciar_proceso").fadeIn();

  }else if(accion == "iniciar"){
 

nuevo_proceso = $("input[name=iniciar_proceso]").val();
$("#loader").load("comando_rapido.py", {"correr": nuevo_proceso});
$("#iniciar_proceso").fadeOut();
$("input[name=iniciar_procesoproceso]").val("");
 
  }
 
  }
  </script>


</html>'''

logueado = False
lista_usuarios = ["admin", "JaAViEr"] #Usuarios
lista_passwords = ["root", "toor"] # Contraseñas
method = os.environ['REQUEST_METHOD']
lectura_cookies = os.environ.get('HTTP_COOKIE')
if lectura_cookies:
valores_cookie = Cookie.SimpleCookie(lectura_cookies)
session_actual = valores_cookie['sess'].value # session_actual = cookie "sess"

if session_actual != "false":
for a, b in zip(lista_usuarios, lista_passwords):

session_temporal = a + b
session_temporal = md5.md5(session_temporal).hexdigest()

if session_actual == session_temporal:
logueado = True # Login coincide
break

else:

pass
else:

pass

if logueado:
if os.name == "nt":

so = "windows"

else:

so = "unix"

if method == "GET":

print code_terminal

elif method == "POST":

form = cgi.FieldStorage()
comando = form.getvalue("comando")
kill = form.getvalue("kill")
correr = form.getvalue("correr")
iniciar_proceso = ""
matador = ""

try:

if correr:

if so == "windows":

iniciar_proceso = "start %s" % (correr)

elif so == "unix":

iniciar_proceso = "%s" % (correr)

subprocess.call(iniciar_proceso)

if kill:

if so == "windows":

matador = "taskkill /F /IM %s" % (kill)

elif so == "unix":

matador = "pkill -9 %s" % (kill)

kill = subprocess.call(matador)
kill.close()

if comando == "apagar":

if so == "windows":

accion = "shutdown /S /T 60"

elif so == "unix":

accion = "sudo poweroff"


elif comando == "reiniciar":

if so == "windows":

accion = "shutdown /R /T 60"

elif so == "unix":

accion = "sudo reboot"

#accion = ""

elif comando == "cancelar salida":

if so == "windows":

accion = "shutdown /A"

elif so == "unix":

accion = ""

#accion = ""


action = subprocess.call(accion)
action.close()
except:

pass

else:
print "<script>location.href='index.py';</script>"

logout.py

Código (python) [Seleccionar]
import cgi
'''
Autor: JaAViEr
Twitter: @javieresteban__
Website: http://codigo.ga
'''
print "Content-Type: text/html"
print "Set-Cookie: sess=false"
print "Location:index.py"
print
print "<script>location.href='index.py';</script>"


Un par de Screenshots de como luce el programa...
Identificación

Panel de control

Consola-Terminal Remota

Comando rápidos

Comandos rápidos - Iniciar Proceso

Comandos rápidos - Matar Proceso
¡ SIGUEME EN TWITTER -> @JavierEsteban__ !

WIитX

"Es más divertido hacerse pirata que unirse a la marina." (Steve Jobs)

0x5d

¡ SIGUEME EN TWITTER -> @JavierEsteban__ !