题目溯源
1 2 3 4 5
| 1. 攻击者登录mysql失败多少次,提交答案例如:123 2. 攻击者执行的第一个命令返回结果是什么?提交的字符串例如:www-data 3. 攻击者通过udf提权的方式上传了一个插件,提交该插件的小写md5值 4. 该插件被写入到什么位置?提交答案例如:/usr/lib/mysql.elf 5. 攻击者窃取了哪些文件?提交的文件名称全小写,并更具小写字母的顺序提交,例如aa.txt-ab.txt-aa.txt
|
攻击者登录mysql失败多少次?
溯源其实就是找特征的过程。发现登录失败的包都有Error Code,直接过滤就好。

攻击者执行的第一个命令返回结果是什么?
小知识:一个竖线包含的就是同一个会话。
题目的问题其实就是就是找udf返回的结果是什么,我们直接跟踪流,最终我们在最长的这个会话发现了异常。

把so文件写入到 /usr/local/mysql/lib/plugin,后面还有自定义函数sys_eval

把16进制解码一下就能看到执行的命令

攻击者通过udf提权的方式上传了一个插件,提交该插件的小写md5值。
还是在这个流里面,0x7f454c46表明存入的是一个 ELF 可执行文件的二进制数据。可以看到这个插件是分段传输的

根据数据包的特征,我们可以用这个语法过滤所有的包,mysql contains “sqlmapfile” && mysql contains “0x”

用python脚本复原即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import pyshark import re import binascii
def extract_mysql_hex_data(pcap_file): display_filter = 'mysql contains "sqlmapfile" && mysql contains "0x"' cap = pyshark.FileCapture(pcap_file, display_filter=display_filter) hex_pattern = re.compile(r"0x([0-9a-fA-F]+)") hex_data = ""
for packet in cap: if 'MYSQL' in packet: mysql_data = str(packet['mysql'].query) matches = hex_pattern.findall(mysql_data) for match in matches: hex_data += match return hex_data
def main(): pcap_file = input("请输入PCAP文件路径: ") hex_data = extract_mysql_hex_data(pcap_file) if hex_data: print(f"提取的十六进制数据: {hex_data}") save_option = input("是否保存为文件?(y/n): ") if save_option.lower() == 'y': output_file = input("请输入要保存的文件名(如 recovered_udf.so): ") binary_data = binascii.unhexlify(hex_data) with open(output_file, "wb") as udf_file: udf_file.write(binary_data) print(f"UDF .so 插件已成功保存为 {output_file}") else: print("未保存文件。") else: print("没有提取到有效的十六进制数据。")
if __name__ == "__main__": main()
|
1
| ab27f6c7634e9efc13fb2db29216a0a8
|

该插件被写入到什么位置?
查看流即可

攻击者窃取了哪些文件?
查看流即可

原来还有一个题目 数据库的第一个用户的登录密码是多少?
这里出题失误,不能解密这个密码,不过无伤大雅。

参考连接
第一期Mysql_exec.pcap题解