應急響應靶機訓練-Linux2

顾北清發表於2024-03-22

靶機來源: 知攻善防實驗室公眾號 https://mp.weixin.qq.com/s/xf2FgkrjZg-yWlB9-pRXvw
我是在另一臺主機上透過ssh連線到靶機進行解題的,我的ip為192.168.1.103,以下為個人解題記錄,寫的比較粗糙,有不對的地方希望各位大佬指正。

背景

前景需要:看監控的時候發現webshell告警,領導讓你上機檢查你可以救救安服仔嗎!!
挑戰內容:
(1)提交攻擊者IP
(2)提交攻擊者修改的管理員密碼(明文)
(3)提交第一次Webshell的連線URL(http://xxx.xxx.xxx.xx/abcdefg?abcdefg只需要提交abcdefg?abcdefg)
(4)提交Webshell連線密碼
(5)提交資料包的flag1
(6)提交攻擊者使用的後續上傳的木馬檔名稱
(7)提交攻擊者隱藏的flag2
(8)提交攻擊者隱藏的flag3

解題

首先檢視當前主機最近的使用者登入情況,如何攻擊者成功登入,那麼可以查到成功登入的記錄。

[root@web-server ~]# grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'
/var/log/secure:Mar 20 10:30:25 root 127.0.0.1
/var/log/secure:Mar 20 14:30:21 root 192.168.20.1
/var/log/secure:Mar 20 15:04:22 root 192.168.20.1
/var/log/secure:Mar 20 15:36:28 root 192.168.20.1
/var/log/secure:Mar 23 00:43:50 root 192.168.1.103
/var/log/secure:Mar 23 00:50:26 root 192.168.1.103
/var/log/secure-20240320:Mar 4 09:48:23 root 192.168.20.1
/var/log/secure-20240320:Mar 7 11:37:01 root 192.168.20.1
/var/log/secure-20240320:Mar 7 14:07:42 root 192.168.20.1
/var/log/secure-20240320:Mar 7 14:39:51 root 192.168.20.1
/var/log/secure-20240320:Mar 7 15:25:23 root 192.168.20.1
/var/log/secure-20240320:Mar 7 15:36:49 root 192.168.20.1
/var/log/secure-20240320:Mar 20 07:59:13 root 192.168.20.1

除了我的ip地址192.168.1.103登入外,ip地址192.168.20.1也登入了,那麼這個可能就是攻擊者的ip,提交判題程式得知正確。
接著檢視一下機器上有沒有什麼可疑的程式。發現該機器上執行著nginxmysql,那麼第二題中說的管理員密碼,應該是執行在該機器上的某個系統的管理員密碼。

[root@web-server ~]# netstat -anltup
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:888             0.0.0.0:*               LISTEN      1140/nginx: master  
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1505/master         
tcp        0      0 0.0.0.0:12485           0.0.0.0:*               LISTEN      2140/python3        
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1140/nginx: master  
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      1058/pure-ftpd (SER 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1024/sshd           
tcp        0      0 192.168.1.106:22        192.168.1.103:56462     ESTABLISHED 2523/sshd: root@pts 
tcp        0      0 192.168.1.106:22        192.168.1.103:55898     ESTABLISHED 2473/sshd: root@pts 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1505/master         
tcp6       0      0 :::3306                 :::*                    LISTEN      2132/mysqld         
tcp6       0      0 :::21                   :::*                    LISTEN      1058/pure-ftpd (SER 
tcp6       0      0 :::22                   :::*                    LISTEN      1024/sshd           
udp        0      0 0.0.0.0:68              0.0.0.0:*                           836/dhclient 

然後,發現預設的資料夾下給了一個流量資料包,下載這個資料包使用wireshark進行分析。

[root@web-server ~]# ls
anaconda-ks.cfg  wp  資料包1.pcapng

首先,過濾一下http報文,可以看到這些報文都是攻擊者192.168.20.1在訪問Linux主機。

先瀏覽一下過濾出來的報文,發現攻擊者訪問了/flag1路徑,追蹤http流。

發現了一個第一個flag:flag1{Network@_2020_Hack},提交判題程式得知正確。

除此之外,訪問的URI就是index.php?user-app-registerversion2.php
接著看一下過濾出來的第一個http報文,同樣追蹤http流

在返回包中看到了路徑,還有核心版本還有當前使用者名稱

那麼,攻擊者應該是透過這個請求執行了某些命令,看看請求包中的內容是什麼。

可以看到請求體中,有一個ini_set()函式,這是蟻劍的特徵函式,可以得知,攻擊者使用的是蟻劍管理Webshell。那麼,前面的Network2020就是這個Webshell的連線密碼,提交判題程式得知正確。
這是透過http過濾出來的第一個資料包,那麼攻擊者第一次Webshell的連線URL就是index.php?user-app-register,提交判題程式得知正確。
接著,來看看攻擊者透過這個Webshell做了什麼操作。
先將請求體中的內容進行URL解碼

從解碼後的內容中可以看出這是PHP程式碼,再將這個PHP程式碼進行格式化

得到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();

結合上面的程式碼和返回包的內容可以看出,攻擊者獲取了當前指令碼所在目錄、PHP版本資訊、當前使用者資訊。
現在,我們得知該系統的目錄在/www/wwwroot/127.0.0.1/下,檢視該目錄

[root@web-server 127.0.0.1]# ls -liah
total 12K
52362827 drwxr-xr-x 10 www  www   137 Mar 20 14:54 .
18205792 drwxr-xr-x  4 root root   38 Mar  7 12:01 ..
34114635 drwxr-xr-x  2 www  www   111 Sep 14  2023 api
33866315 drwxr-xr-x  2 root root  111 Mar 20 14:57 .api
52363663 drwxr-xr-x 15 www  www   186 Sep 14  2023 app
19094350 drwxr-xr-x  4 www  www    33 Mar  7 12:07 data
34416536 drwxr-xr-x  4 www  www    34 Sep 14  2023 files
52432799 -rwxr-xr-x  1 www  www   176 Jun 25  2023 index.php
52432800 drwxr-xr-x  3 www  www  4.0K Sep 14  2023 lib
52433597 drwxr-xr-x  2 www  www    41 Sep 14  2023 tasks
52362828 -rw-r--r--  1 root root   42 Mar  7 12:01 .user.ini
 1871062 drwxr-xr-x  2 www  www     6 Sep 13  2023 vendor

如果攻擊者修改了管理員的密碼,那麼修改後的密碼應該存在資料庫中,但是我不知道資料庫的賬號密碼,所以找找配置檔案,看看能不能找到資料庫的賬號密碼。在該目錄下的lib目錄下,找到了配置檔案config.inc.php,發現資料庫的賬號密碼為:kaoshi: 5Sx8mK5ieyLPb84m

[root@web-server lib]# cat config.inc.php 
<?php

/** 常規常量設定 */
...此處省略...

/**介面加密設定**/
define('APIKEY','356d9abc2532ceb0945b615a922c3370');
define('APIIV','#phpems90iv*');
/**composer開關**/
define('COMPOSER',0);
/** 資料庫設定 */
define('SQLDEBUG',0);
define('DB','kaoshi');//MYSQL資料庫名
define('DH','127.0.0.1');//MYSQL主機名,不用改
define('DU','kaoshi');//MYSQL資料庫使用者名稱
define('DP','5Sx8mK5ieyLPb84m');//MYSQL資料庫使用者密碼
define('DTH','x2_');//系統表字首,不用改

/** 微信相關設定 */
...此處省略...

/** 支付寶相關設定 */
...此處省略...
?>

登入資料庫,直接檢視使用者資料表。

[root@web-server lib]# mysql -u kaoshi -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44-log Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kaoshi             |
+--------------------+
2 rows in set (0.00 sec)

mysql> use kaoshi;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_kaoshi    |
+---------------------+
| x2_answer           |
| x2_app              |
| x2_area             |
| x2_ask              |
| x2_attach           |
...此處省略...

| x2_session          |
| x2_subject          |
| x2_user             |
| x2_user_group       |
| x2_wxlogin          |
+---------------------+
61 rows in set (0.00 sec)

mysql> select * from x2_user;
+--------+------------+-------------+-----------------+----------------+----------------------------------+----------+----------------+-------------+-------------+----------------+-------------+--------------+------------+------------------------------------------------------------------------------------------------------------------------------+--------------------+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+------------+-----------+-------------+---------------------------------------------------------+------------+------------+
| userid | useropenid | userunionid | username        | useremail      | userpassword                     | usercoin | userregip      | userregtime | userlogtime | userverifytime | usergroupid | usermoduleid | useranswer | manager_apps                                                                                                                 | usertruename       | normal_favor | teacher_subjects                                                                                                                                                                             | userprofile | usergender | userphone | useraddress | userphoto                                               | userstatus | normal_sfz |
+--------+------------+-------------+-----------------+----------------+----------------------------------+----------+----------------+-------------+-------------+----------------+-------------+--------------+------------+------------------------------------------------------------------------------------------------------------------------------+--------------------+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+------------+-----------+-------------+---------------------------------------------------------+------------+------------+
|      1 |            | NULL        | peadmin         | 958074@163.com | f6f6eb5ace977d7e114377cc7098b7e3 |      279 | 127.0.0.1      |  1471795200 |           0 |           NULL |           1 |            0 | NULL       | a:7:{i:0;s:4:"user";i:1;s:7:"content";i:2;s:4:"exam";i:3;s:8:"document";i:4;s:6:"course";i:5;s:4:"bank";i:6;s:8:"autoform";} | 111111111111111111 |              |                                                                                                                                                                                              |             | 男         |           | 資訊部      | files/attach/images/content/20230802/16909740072788.jpg |          3 |            |
|      2 |            | NULL        | 教師管理員      | 958074@126.com | 96e79218965eb72c92a549dd5a330112 |       98 | 127.0.0.1      |  1471795200 |           0 |           NULL |           9 |            0 | NULL       |                                                                                                                              | 213123             |              | a:14:{i:0;s:2:"13";i:1;s:2:"12";i:2;s:1:"5";i:3;s:1:"4";i:4;s:1:"3";i:5;s:1:"1";i:6;s:1:"2";i:7;s:2:"17";i:8;s:2:"15";i:9;s:2:"16";i:10;s:2:"18";i:11;s:2:"19";i:12;s:2:"20";i:13;s:2:"21";} | 77777       |            |           |             |                                                         |          3 |            |
|      3 |            |             | zgsf            | zgsf@Admin.com | af0c68603004a1b5af4d87a71a813057 |        0 | 192.168.20.131 |  1709795218 |           0 |              0 |           8 |            0 |            |                                                                                                                              |                    |              |                                                                                                                                                                                              |             |            |           |             |                                                         |          0 |            |
|      4 |            |             | zgsfAdmin       | zgsf@zgsf.com  | ed2b3e3ce2425550d8bfdea8b80cc89a |        0 | 192.168.20.131 |  1709796233 |           0 |              0 |           8 |            0 |            |                                                                                                                              |                    |              |                                                                                                                                                                                              |             |            |           |             |                                                         |          0 |            |
+--------+------------+-------------+-----------------+----------------+----------------------------------+----------+----------------+-------------+-------------+----------------+-------------+--------------+------------+------------------------------------------------------------------------------------------------------------------------------+--------------------+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------+------------+-----------+-------------+---------------------------------------------------------+------------+------------+
4 rows in set (0.12 sec)

mysql> 

透過檢視x2_user_group表得知,groupid為1的是管理員。

mysql> select * from x2_user_group;
+---------+--------------+---------------+---------------+------------+--------------------+--------------+
| groupid | groupname    | groupmoduleid | groupdescribe | groupright | groupmoduledefault | groupdefault |
+---------+--------------+---------------+---------------+------------+--------------------+--------------+
|       1 | 管理員       |             1 | 管理員        |            |                  1 |            0 |
|       8 | 普通使用者     |             9 | 普通使用者      |            |                  0 |            1 |
|       9 | 教師         |            12 | 教師          |            |                  0 |            0 |
+---------+--------------+---------------+---------------+------------+--------------------+--------------+
3 rows in set (0.00 sec)

那麼peadmin應該就是被修改密碼的管理員,拿到密碼的md5值f6f6eb5ace977d7e114377cc7098b7e3。找個網站解一下看看,得到明文密碼為Network@2020,提交判題程式得知正確。

到此,前五個問題的答案的都有了,回去接著分析流量,找找攻擊者後續上傳的木馬檔名稱。
透過wireshark的過濾器,將http包和POST請求過濾出來,因為攻擊者的操作在請求包中都可以看到。

分析一下請求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/,再結合x0b6b31b98f31d變數名的位置,得知攻擊者做了檢視當前目錄下檔案的操作,從返回包的內容也可以猜出來。
大致分析了一下這些流量包後,發現攻擊者在/www/wwwroot/127.0.0.1/目錄下建立了flag1 檔案並寫入flag,然後寫入一個新的木馬shell.php,再改名為version2.php,那麼後續訪問version2.php的流量包應該就是後續上傳的木馬檔案了,將檔名稱提交給判題程式得知正確。

透過追蹤http流發現,version2.php內容如下:

搜尋紅框中的程式碼,發現好像是冰蠍的馬。後續追蹤version2.php的http流發現都是加密的了,攻擊者可能是換了一個Webshell管理工具。

到這裡,攻擊者已經getshell。剩下兩個flag應該都在Linux機器中了。
回到Linux機器中,看看攻擊者在機器上進行了什麼操作。

[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檔案。檢視一下這個檔案,看看攻擊者幹了什麼。

[root@web-server .api]# cat alinotify.php 
<?php
namespace PHPEMS;
/*
 * Created on 2013-12-26
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */

define('PEPATH',dirname(dirname(__FILE__)));
class app
{
        public $G;

        public function __construct()
        {


                $this->ev = \PHPEMS\ginkgo::make('ev');
                $this->order = \PHPEMS\ginkgo::make('orders','bank');
        }

        public function run()
        {
                $alipay = \PHPEMS\ginkgo::make('alipay');
                $orderid = $this->ev->get('out_trade_no');
                $order = $this->order->getOrderById($orderid);
                $verify_result = $alipay->alinotify();
                if($verify_result)
                {
                        if($this->ev->get('trade_status') == 'TRADE_FINISHED' ||$this->ev->get('trade_status') == 'TRADE_SUCCESS')
                        {
                                if($order['orderstatus'] != 2)
                                {
                    $this->order->payforOrder($orderid,'alipay');
                                }
                                exit('sucess');
                        }
                        elseif($_POST['trade_status'] == 'WAIT_BUYER_PAY')
                        {
                                exit('fail');
                        }
                        else
                        {
                                exit('fail');
                        }
                }
                else
                {
                        exit('fail');
                }
        }
}

include PEPATH.'/lib/init.cls.php';
$app = new app(new ginkgo);
$app->run();
$flag2 = "flag{bL5Frin6JVwVw7tJBdqXlHCMVpAenXI9In9}";

?>

在檔案的最後一行發現了flag2:flag{bL5Frin6JVwVw7tJBdqXlHCMVpAenXI9In9}
至此就拿到了所有答案,不過我感覺好像管理員密碼和最後兩個flag都是作者的非預期解法,等一手官方題解吧。

推測攻擊者的入侵方式

水平有限,下面的內容都是我亂猜的:
根據目前的資訊,知道攻擊者先是透過蟻劍連線,寫入冰蠍的馬再透過冰蠍連線(?),然後在Linux機器上寫入一個隱藏資料夾和環境變數,那麼,攻擊者是怎麼打進來的?
透過搜尋"index.php?user-app-register"發現該URI是PHPEMS模擬考試系統

再結合管理員密碼被修改進行搜尋,發現該系統可以透過反序列化+sql注入修改管理員密碼。剛好在資料庫中找密碼時,看到了應該是反序列化時寫入的內容(反序列化不太懂),因此推測攻擊者應該是透過該方式修改了管理員密碼,然後寫入Webshell再使用蟻劍連線。

相關文章