Title : [Writeups] LabyREnth CTF - PAN{UNIX_START} - Perl
Released : 2016-07-19 01:55:46 -0400
Viewed : 362

Warning: this article contains spoiler of challenges clue. Please consider before you read this entire article. This article have warn because the event isn't over yet. It's ends on August 14th 2016 at 5pm PST.

Yarp, akhirnya kesampaian juga ikutan CTF setelah beberapa kali event terlewatkan begitu saja. T_T

Kali ini bahas 1 soal dulu yang paling mudah. Yang susah gak usah. Susah soalnya. :D

Tapi sebelum meneruskan membaca artikel ini, sebaiknya kalian coba sendiri dulu challenge ini dilink berikut ini

http://labyrenth.com/challenges/linux/9c4dacfdba1ec23c1a2fdda0a54d8369cbff1da1f12a3e375d14d9885a36f750

Karena ukuran codingannya sampe 3 MB, jadi gak aku paste disini, task dari soal ini kurang lebih tentang membaca codingan. Sengaja codingannya dipanjangin biar susah bacanya :D Pertama kali eksekusi file ini, outputnya gini

[@jamz!jAcer]: [~/www/pentest/ctf/labyrenth/Perl]: perl bowie.pl
You're doing a thing...

Intip-intip source codenya, nemu ginian

use MIME::Base64 ();
sub  trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
my $a = "";

print "You're doing a thing...\n";
my $input = <STDIN>;
$input = trim($input);
if ($input eq (chr(5156 - 5035) . chr(-4615 - -4716) . chr(3162 - 3047))) {
 $a = $a . MIME::Base64::decode("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");
 print "You're doing a thing...\n";

clue pada baris

if ($input eq (chr(5156 - 5035) . chr(-4615 - -4716) . chr(3162 - 3047))) {

artinya, jika input sama dengan "yes", maka variable $a akan dimerge dengan hash base64. Dari codingan yang panjang ini, kita cukup menjawab "yes" dan "no" ja. Eh, ada satu yang jawabannya "YES!" juga

Tapi sebenarnya, point dari task ini bukan disitu, karena di akhir script, variable $a gak di apa-apain. Cuma mengakumulasi nilai dari hash base64 sebelum-sebelumnya, dan karena eval mengeksekusi base64 decoded baru.

Pada gambar diatas, pada baris ke-6, ada eval disana. yang akan melanjutkan pertanyaan yang sama dan dengan jawaban yang kurang lebih kayak "yes" dan "no" gitu juga. Aku pikir, mungkin perintah eval ini hanya untuk mengelabuhi saja, jadi kuncinya ada di variable $a. Hanya saja, ketika variable $a ini di decode, hasilnya kayak jeroannya sebuah file, karena hasilnya bukan hash string, melainkan hash dalam binary. Dan pasti ini adalah sebuah file. Berarti kita cukup decode headernya ja buat mengetahui jenis file apa. Untuk headernya, kita cukup mendecode nilai variable $a pertama.

#!/usr/bin/php -q
<?php
	$a="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";
	echo base64_decode($a);

dan hasilnya

GIF89a�(���
  &! %' &  '$!!!" #"'!( ")('))"-(",).&,&#,0(*8,, 4)'8)!;)2+!2-0/-2/);41561N1 U1J597>H5&0:?:9-B7.@9'B;7<=7>E>FC>]?,e?)BFMOF/HG:XD.TD<NF;MG6REBWE8bD#FMENKE�A#vI'URMwL3hQ<rP*pP0lQ5PWPeRDZUIPV]\UD`U;`SOcSJ\YS�S;�ZD�Z:x_J|_Ct`R_>�_8oa]pcIsaXkdRgd_jdX_g_�Z9^lzfko�d;�a;�bJ�hI�ne�mK�mD�nXqV�nQzr`�oayrf~pltsm�rV�wV�{M�xN�{a�|r�|Z�o�}U����xt����k��a��w�����a��c��l�����y��]��c�����r��������k��������wÌ™qÂœq�����p������������������ʞ~Ë£lÑ«ˮ����ñ����±ï¿½ï¿½ï¿½ï¿½È²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½½Ä¿ï¿½ï¿½ï¿½ï¿½æ¼à¼¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä¹ï¿½Ä°ï¿½Â™ï¿½Å¥æ¿šï¿½Ä”�����ο������������������Ҩ�ΰ����Ҷ�յ��������������������������������������������������������������������������������������������������������������������������������������!�Entrevue�!�
���,�����(���͵HP ��*h����#J��p�C�+6�ϢǏ '�I��ɓ&��#����}*��T����|8s�ɳ�ϟ�t�z/��y�ܵ���|1�Ŵ7�jˡ��Ń�5k�~��Փ���ٳhӪ]�V�ͷp��-�4�ػw
Ի��ŒCRl��C�+^�pn\��^��9s�c�:ۚ
�(W��$�+i��S���6��ohN�\Q�����۸k;��n]�x�
n�"���-&̸9��rEÔ)��\̯sÇ„zÏŸk�һ���/^��[��V���}�M;?����ߟ���e��]��E܁�m��b}��a�9'�oIg�h���k8Õ“h=�#��繳�?��՞U�CN<^e%�NY��ߍ8�H�$(`N����Aؗ�*�\�2�<PF�I�\(�n>�T���R��s�>Q��T)��^R�#�y0�C΋'�h睹�<T�`�b�5��D"�d�I��M6�������_����x�d�9�O>P�C�9���=6�YR�jΛ�Ii�͜u�i���9��~�'f��C�^Z��"��q6*ғ�J�+�IY�!veeÉ–N#�h���HN6Ú”kjQ��STK����4ڈ�6�Pc΋]⪯Z4�ԯ[��`zÜŽh���:lA����
�(`�&��G|B-�$Mza�-]��O����HØ‘h�%�KN��֫͹(���<��59�0ɘ�ԾD��݀~��I>���c�ƒ�j��g}���~Ա�ђ��ƽn�1���l2}\�	�RZ�W�4��RK'����9����S���C�>�~��8���7���K�Iu�_�����.MZ�:�;���Nj�+���Vk���\7�Ha��1\f���<�.�ɰ�$�;�P#x,�$��"�C���8�cN���79Ù�7�cM4�x?���+����a����޹�(���褏>�lS��:կ��`��Axg;��$wg��v$�̭m'`B�6׉N�"���/b�
Z���"fa
�y����0�����*�����Ң�%,�0����r���P,��t��_���?�9�/�c�DHE�!�vWd`Í‚�Te��`E'R1�_h�-|�Z`��/��:�B5�8�p�CҰ�/��
N����T������^q Nxd@}ģ���_���:&^퉠�"�x�

Weheuheu.. file gambar ternyata :)

Berarti aku cukup mengambil nilai dari variable $a dari file bowie.pl ja dengan script berikut ini

#!/usr/bin/php -q
<?php
	$fp=file_get_contents('bowie.pl');
	$e=explode("\n",$fp);
	$raw='';
	for($i=0;$i<count($e);$i++){
		if(strpos($e[$i],'$a = $a . ')>0){
			$b=trim(str_replace(array('$a = $a . MIME::Base64::decode("','");'),'',$e[$i]));
			$raw.=base64_decode($b);
		}
	}
	$f=fopen('raw.gif',"a");
	fwrite($f,$raw);
	fclose($f);

buka file raw.gif dan dapetnya gini

Flag nya keliatan kan? Eh, cuma setengah. Jiah, padahal gambarnya cuma setengah. Weheuheu.. berarti setengah nya lagi ada didalam variable $a yang di eksekusi oleh "eval". Berarti singkatnya gini, hasil file decode yang akan dieksekusi oleh eval, kita extract terlebih dahulu, ambil semua nilai dari variable $a nya, trus gabungin dengan setengah gambar yang sudah kita dapatkan diatas.

#!/usr/bin/php -q
<?php
	$fp=file_get_contents('setengahnya');
	$a=base64_decode($fp); // contain $a and eval
	
	global $tmpraw;
	getencoded($a);
	function getencoded($str){
		global $tmpraw;
		if(strpos($str,'eval')>0){
			$e=explode("\n",$str);
			for($i=0;$i<count($e);$i++){
				if(strpos($e[$i],'$a = $a . ')>0){
					$b=trim(str_replace(array('$a = $a . MIME::Base64::decode("','");'),'',$e[$i]));
					$c=base64_decode($b);
					$tmpraw.=$c;
				}
				if(strpos($e[$i],'eval')>0){
					getencoded(extracteval($e[$i]));
				}
			} 
		} else {
			$A=file_get_contents('raw.gif');
			$f=fopen('rawsetengah.gif',"a");
			fwrite($f,$A.$tmpraw);
			fclose($f);
		}
	}
	function extracteval($str){
		return base64_decode(trim(str_replace(array(' eval MIME::Base64::decode("','");'),'',$str)));
	}

Dengan code terakhir diatas, baru deh gambar utuhnya kita dapetin :)

Yarp, gambar utuh dapet, flag ketemu. Submit. ^_^

Sory yak kalo penjelasannya panjang, soalnya memang gini cara ane solving challenge ini. Panjang, lama, ribet, dan bertubi-tubi :D