西南赛区数信杯应急响应
真爱和自由 发表于 四川 CTF 508浏览 · 2024-09-30 00:29

西南赛区数信杯应急响应

门户网站

SSH 配置(check)

禁用密码登录:

PasswordAuthentication no

确保启用公钥认证:

PubkeyAuthentication yes
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
chown root:root /root/.ssh
chown root:root /root/.ssh/authorized_keys
restart sshd

Apache

修改 <Directory />

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

把Options FollowSymLinks删掉

版本号

grep -r "ServerTokens" /etc/apache2/

root@d7f81b8b07c5:/etc/apache2# grep -r "ServerTokens" /etc/apache2/
/etc/apache2/conf-available/security.conf:# ServerTokens
/etc/apache2/conf-available/security.conf:#ServerTokens Minimal
/etc/apache2/conf-available/security.conf:ServerTokens OS
/etc/apache2/conf-available/security.conf:#ServerTokens Full
/etc/apache2/apache2.conf:ServerTokens Prod
#ServerTokens Minimal
#ServerTokens OS
#ServerTokens Full

修改为

ServerTokens Prod

重启systemctl restart apache2

mysql

在 MySQL 中,运行以下命令以查找 binlog 相关的信息:

SHOW BINARY LOGS;

这将列出所有的二进制日志文件。确保 binlog.000004 包含所需的记录。

使用 mysqlbinlog 工具来读取 binlog.000004 文件中的所有更改。可以通过以下命令提取内容:

mysqlbinlog /path/to/binlog.000004 --start-position=0 > recovery.sql

将生成的 recovery.sql 文件中的内容导入到 MySQL 数据库中:

mysql -u your_username -p your_database < recovery.sql

恢复

SELECT * FROM pre_user_balance;

OA 系统

web 服务地址:http://10.10.10.12:80 ssh(22 端口) 账户密码:root/f6fffd40: 1.redis 加固(check) 任务描述:服务器被入侵了,管理员发现黑客通过 redis 未授权访问攻击了服务器,请修复服务器中以下问题任务目标:修复 redis 未授权访问问题,并给 redis 加一个验证密码,该密码需要设置为6b95fa87。

vim /etc/redis/redis.conf

然后将 # requirepass foobared 改为 requirepass 6b95fa87,最后重启 redis 服务即可

2.webshelll 分析(check) (SOVELED) 任务描述:寻找攻击者留下的 webshell 任务目标:找到 webshell 路径并删除

直接查找文件中带eval函数的php文件,命令

find . -name "*.php" -exec grep -l "eval(" {} \\;

结果是error.php文件,直接删除

3.蚁剑流量分析(flag) 任务描述:对攻击者进行溯源 任务目标:提交攻击者所窃取的机密信息

查找流量文件

web 服务地址:http://10.10.10.12:80 ssh(22 端口) 账户密码:root/f6fffd40: 1.redis 加固(check) 任务描述:服务器被入侵了,管理员发现黑客通过 redis 未授权访问攻击了服务器,请修复服务器中以下问题任务目标:修复 redis 未授权访问问题,并给 redis 加一个验证密码,该密码需要设置为6b95fa87。

vim /etc/redis/redis.conf

然后将 # requirepass foobared 改为 requirepass 6b95fa87,最后重启 redis 服务即可

2.webshelll 分析(check) (SOVELED) 任务描述:寻找攻击者留下的 webshell 任务目标:找到 webshell 路径并删除

直接查找文件中带eval函数的php文件,命令

find . -name "*.php" -exec grep -l "eval(" {} \\;

结果是error.php文件,直接删除

3.蚁剑流量分析(flag) 任务描述:对攻击者进行溯源 任务目标:提交攻击者所窃取的机密信息

查找流量文件

用工具一把梭了

后门发现(flag) 任务描述:寻找并分析攻击者留下的恶意后门 任务目标:找到攻击者的 ip+端口,提交格式为 flag{ip:端口}

查找所有端口,发现有一个可疑端口

显示ip为

121.13.2.33:5432

5.后门清除(check) 任务描述:寻找并清除攻击者留下的恶意后门 任务目标:清除恶意后门

直接kill掉可疑的端口

6.文件解密(flag) 任务描述:攻击者使用勒索病毒将数据库导出的 sql 文件进行加密,并且删除了原数据库。任务目标:根据在攻击者机器找到的勒索病毒,解密还原 sql 文件,并找到其中的flag。7.数据库恢复(check) 任务描述:根据还原的 sql 文件,进行恢复数据库 任务目标:恢复数据库

即时协作服务器

hsqldb 数据迁移 mysql(check)

首先启动mysql

service mysql status

service mysql start

创建 MySQL 数据库: 首先,登录 MySQL 并创建一个新的数据库,以及一个用户 pdx,密码为 Li4444555635!

sql复制代码CREATE DATABASE openfire_db;
CREATE USER 'pdx'@'localhost' IDENTIFIED BY 'Li4444555635!';
GRANT ALL PRIVILEGES ON openfire_db.* TO 'pdx'@'localhost';
FLUSH PRIVILEGES;

修改配置文件

<jive>
  <adminConsole>
    <port>12335</port>
    <securePort>9091</securePort>
  </adminConsole>
  <locale>zh_CN</locale>
  <connectionProvider>
    <className>org.jivesoftware.database.DefaultConnectionProvider</className>
  </connectionProvider>
  <database>
    <defaultProvider>
      <driver>com.mysql.cj.jdbc.Driver</driver>
      <serverURL>jdbc:mysql://localhost:3306/openfire_db?useSSL=false&serverTimezone=UTC</serverURL>
      <username>pdx</username>
      <password>Li4444555635!</password>
      <testSQL>select 1</testSQL>
      <testBeforeUse>true</testBeforeUse>
      <testAfterUse>true</testAfterUse>
      <minConnections>5</minConnections>
      <maxConnections>25</maxConnections>
      <connectionTimeout>1.0</connectionTimeout>
    </defaultProvider>
  </database>
  <setup>true</setup>
</jive>

启动 HSQLDB 服务器

java -cp /home/user/openfire/lib/hsqldb-2.4.1.jar org.hsqldb.Server --database.0 file:mydb --dbname.0 mydb

然后连接我们的服务

java -cp /home/user/openfire/lib/hsqldb-2.4.1.jar org.hsqldb.cmdline.SqlTool --url jdbc:hsqldb:hsql://localhost/mydb --user SA --password '' --sql "SELECT * FROM ofUser" > backup_ofUser.csv

这个命令会将 ofUser 表的数据导出到 backup_ofUser.csv 文件中。请根据需要调整数据库的 URL、用户名和密码。

LOAD DATA LOCAL INFILE '/path/to/backup_ofUser.csv' INTO TABLE ofUser
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

LOAD DATA LOCAL INFILE '/path/to/backup_ofGroupUser.csv' INTO TABLE ofGroupUser
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

输入一下的内容验证

SELECT * FROM ofUser LIMIT 10;
SELECT * FROM ofGroupUser LIMIT 10;

身份认证绕过漏洞修复(check)

找到配置文件

root@16bb35eba610:/# find / -name "openfire.xml"
/home/user/openfire/conf/openfire.xml

读取文件内容修改端口

root@16bb35eba610:/# cat  /home/user/openfire/conf/openfire.xml
<?xml version="1.0" encoding="UTF-8"?>

<!--
    This file stores bootstrap properties needed by Openfire.
    Property names must be in the format: "prop.name.is.blah=value"
    That will be stored as:
        <prop>
            <name>
                <is>
                    <blah>value</blah>
                </is>
            </name>
        </prop>

    Most properties are stored in the Openfire database. A
    property viewer and editor is included in the admin console.
-->
<!-- root element, all properties must be under this element -->
<jive> 
  <adminConsole> 
    <!-- Disable either port by setting the value to -1 -->  
    <port>9090</port>  
    <securePort>9091</securePort> 
  </adminConsole>  
  <locale>zh_CN</locale>  
  <!-- Network settings. By default, Openfire will bind to all network interfaces.
      Alternatively, you can specify a specific network interfaces that the server
      will listen on. For example, 127.0.0.1. This setting is generally only useful
       on multi-homed servers. -->  
  <!--
    <network>
        <interface></interface>
    </network>
    -->  
  <!--
        One time token to gain temporary access to the admin console.
    -->  
  <!--
    <oneTimeAccessToken>secretToken</oneTimeAccessToken>
    -->  
  <connectionProvider> 
    <className>org.jivesoftware.database.EmbeddedConnectionProvider</className> 
  </connectionProvider>  
  <setup>true</setup>  
  <fqdn>5f3dfcc60c8a</fqdn> 
</jive>

发现没有一些命令

只能echo覆盖

root@16bb35eba610:/# echo '<?xml version="1.0" encoding="UTF-8"?>
> <jive> 
>   <adminConsole> 
>     <port>12335</port>  
>     <securePort>9091</securePort> 
>   </adminConsole>  
>   <locale>zh_CN</locale>  
>   <connectionProvider> 
>     <className>org.jivesoftware.database.EmbeddedConnectionProvider</className> 
>   </connectionProvider>  
>   <setup>true</setup>
>   <fqdn>5f3dfcc60c8a</fqdn>
> </jive>' > /home/user/openfire/conf/openfire.xml

<jive>
  <adminConsole>
    <port>12335</port>
    <securePort>9091</securePort>
  </adminConsole>
  <locale>zh_CN</locale>
  <connectionProvider>
    <className>org.jivesoftware.database.DefaultConnectionProvider</className>
  </connectionProvider>
  <database>
    <defaultProvider>
      <driver>com.mysql.cj.jdbc.Driver</driver>
      <serverURL>jdbc:mysql://localhost:3306/openfire_db?useSSL=false&serverTimezone=UTC</serverURL>
      <username>pdx</username>
      <password>Li4444555635!</password>
      <testSQL>select 1</testSQL>
      <testBeforeUse>true</testBeforeUse>
      <testAfterUse>true</testAfterUse>
      <minConnections>5</minConnections>
      <maxConnections>25</maxConnections>
      <connectionTimeout>1.0</connectionTimeout>
    </defaultProvider>
  </database>
  <setup>true</setup>
</jive>

然后重启服务

发现resatrt命令都没有

停止 Openfire

首先,运行以下命令停止 Openfire:

sudo /home/user/openfire/bin/openfire stop
  1. 启动 Openfire

然后,使用以下命令重新启动 Openfire:

sudo /home/user/openfire/bin/openfire start

图片水印

import cv2
import numpy as np
import matplotlib.pyplot as plt

def add_salt_and_pepper_noise(image):
    amount = 0.04  # 设置添加的噪声占原始图像的比例
    s_vs_p = 0.5  # 设置噪声中salt和pepper的比例

    noise_attacked_image = np.copy(image)
    # 设置添加的salt噪声的数量
    num_salt = np.ceil(amount * s_vs_p * image.size)
    # 设置添加噪声的坐标位置
    coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
    # 添加salt噪声
    noise_attacked_image[tuple(coords)] = 255

    # 设置添加的pepper噪声的数量
    num_salt = np.ceil(amount * (1 - s_vs_p) * image.size)
    # 设置添加噪声的坐标位置
    coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
    # 添加pepper噪声
    noise_attacked_image[tuple(coords)] = 0

    return noise_attacked_image

# 读取图片
image = cv2.imread("embedded.png")
image = image[:, :, [2, 1, 0]]  # 转换为RGB格式

# 添加盐和胡椒噪声
noise_attacked_image = add_salt_and_pepper_noise(image)

# 保存添加了噪声后的图像
plt.imsave("embedded1.png", noise_attacked_image)

邮件服务器

下载/home目录下的文件,只有curl命令可用

curl -F "file=@/home/2024-09-05_12-03-51.pcapng" <http://106.53.212.184:6666>

服务器上搭建接收文件的服务

import http.server
import socketserver
import cgi
import tarfile
import os

PORT = 6666

class CustomHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_POST(self):
        # Parse the form data posted  
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD': 'POST'}
        )

        # Extract file information  
        if 'file1' in form:
            file_item = form['file1']
            if file_item.file:
                # Define file path to save the uploaded tar file in the current directory  
                file_path = file_item.filename

                # Write the tar file to the current directory  
                with open(file_path, 'wb') as output_file:
                    output_file.write(file_item.file.read())

                # Check if the file is a tar file and extract it
                if tarfile.is_tarfile(file_path):
                    with tarfile.open(file_path, 'r') as tar:
                        tar.extractall(path="./")  # Extract all files to current directory

                    self.send_response(200)
                    self.end_headers()
                    self.wfile.write(b"Tar file uploaded and extracted successfully")
                else:
                    os.remove(file_path)  # Remove the file if it's not a valid tar
                    self.send_error(400, "Uploaded file is not a valid tar file")
            else:
                self.send_error(400, "No file uploaded")
        else:
            self.send_error(400, "No file uploaded")

if __name__ == "__main__":
    with socketserver.TCPServer(("", PORT), CustomHTTPRequestHandler) as httpd:
        print(f"Serving on port {PORT}")
        httpd.serve_forever()

1.冗余邮箱发现(flag) 任务描述:根据/home 目录中提供的员工表,找到冗余的邮箱。 任务目标:提交员工表中不存在邮箱,提交格式为 flag{LiMin@yansou.com},注意名字的首字母为大写。

登录 admin 管理邮件的后台,然后挨个排查附件的员工邮箱中不存在的用户,最后发现

没有谢顺这个员工,提交其邮箱即可,要首字母大写

2.钓鱼邮件发现(flag) 任务描述:寻找可能为钓鱼邮件的邮件。 任务目标:提交钓鱼邮件中的恶意 IP,提交格式为 flag{1.1.1.1}。

3.钓鱼邮件分析溯源(flag) 任务描述:根据找到的钓鱼邮件,溯源出最原始的邮件发出人。 任务目标:提交最原始的邮件发出人,提交格式为 flag{xxx@yansou.com},注意名字的首字母为大写。

4.恶意病毒分析_1(flag) 任务描述:在邮件服务器中的 home 目录还发现了一个病毒文件,请分析该恶意病毒。任务目标:提交恶意病毒中定时任务启动时间,提交格式为 flag{01:22}。

直接把exe文件丢进沙箱分析得到启动时间

5.恶意病毒分析_2(flag) 任务描述:在邮件服务器中的 home 目录还发现了一个病毒文件,请分析该恶意病毒。任务目标:提交恶意病毒自身复制的文件位置,提交格式为 flag{e:\documents\secret}

6.恶意流量分析(flag) 任务描述:集团内部的病毒分析专家对该病毒进行了初步的分析,并且截取到了由恶意病毒发出的流量信息名为:2024-09-05_12-03-51.pcapng。任务目标:分析流量查看该病毒获取的机密信息,并尝试获取用户 Norizen 的密码,提交格式为:flag{password}。

个人文件系统

1.nginx 日志分析(flag)

任务描述:需要分析 nginx 日志,找到攻击者盗取的机密信息
任务目标:提交攻击者窃取的机密信息


布尔盲注,找到每个索引最后对应的ascii码值即可,而且回显包的长度为921,回显包为921应该为成功,不知道为啥写的脚本有问题,一直没回显,然后直接手工挨个挨个写了,最后ascii码转字符即可

2.计划任务分析(flag)

任务描述:需要分析攻击者留在系统中的计划任务后门。
任务目标:找到并提交攻击者的 ip+端口,提交格式为 flag{ip:端口}

——————

计划任务,一看就是contrab的利用,然后直接在/etc这里翻目录,在cron.d目录下发现恶意safeline文件,打开就是一个反弹shell的文件,就可以直接得到ip和端口,文件已经删了,flag如下:

flag{8.8.36.233:9001}

3.计划任务清除(check)

任务描述:需要清除攻击者留在系统中的计划任务后门。
任务目标:清除计划任务(check)

——————

删除/etc/cron.d的safeline文件即可。

4.sudo 组后门(check)

任务描述:需要分析出 sudo 组中的后门用户。
任务目标:清除 sudo 组中的后门用户。

——————

先看了一下/etc/passwd文件,看到一个h4ck用户,然后直接删除它即可:

sudo userdel username

再看/etc/sudoers里面没发现,但是/etc/sudoers.d/README里面有h4ck用户做的维持,删掉即可

5.suid 清除(check)

任务描述:分析出攻击者留在系统中有 suid 的后门程序。
任务目标:清除有 suid 的后门程序。


直接搜索即可:

find / -perm -4000 2>/dev/null

把不安全的suid配置全部删掉即可(zsh等)

0 条评论
某人
表情
可输入 255